From 96a67434f6702c889a904d464403b1929bb62ef2 Mon Sep 17 00:00:00 2001 From: Joshua Snyder Date: Wed, 8 Oct 2025 10:26:55 +0100 Subject: [PATCH] feat(mcp): move mcp server into monorepo (#39217) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- .github/workflows/ci-mcp.yml | 133 + .github/workflows/mcp-publish.yml | 86 + frontend/jest.config.ts | 4 +- pnpm-lock.yaml | 3186 ++- pnpm-workspace.yaml | 1 + products/mcp/.gitignore | 27 + products/mcp/.husky/pre-commit | 2 + products/mcp/.oxlintrc.json | 12 + products/mcp/.prettierignore | 5 + products/mcp/.prettierrc | 7 + products/mcp/Dockerfile | 15 + products/mcp/LICENSE | 21 + products/mcp/README.md | 191 + products/mcp/examples/ai-sdk/README.md | 29 + .../mcp/examples/ai-sdk/package-lock.json | 1714 ++ products/mcp/examples/ai-sdk/package.json | 21 + products/mcp/examples/ai-sdk/src/index.ts | 51 + products/mcp/examples/ai-sdk/tsconfig.json | 17 + products/mcp/examples/langchain-js/.gitignore | 5 + products/mcp/examples/langchain-js/README.md | 30 + .../examples/langchain-js/package-lock.json | 1181 ++ .../mcp/examples/langchain-js/package.json | 22 + .../mcp/examples/langchain-js/src/index.ts | 61 + .../mcp/examples/langchain-js/tsconfig.json | 19 + products/mcp/examples/langchain/README.md | 47 + .../langchain/posthog_agent_example.py | 103 + .../mcp/examples/langchain/pyproject.toml | 21 + products/mcp/examples/langchain/uv.lock | 1218 ++ products/mcp/package.json | 33 + products/mcp/pnpm-lock.yaml | 525 + products/mcp/python/README.md | 57 + .../python/posthog_agent_toolkit/__init__.py | 3 + .../integrations/__init__.py | 1 + .../integrations/langchain/__init__.py | 5 + .../integrations/langchain/toolkit.py | 61 + products/mcp/python/pyproject.toml | 73 + products/mcp/python/pytest.ini | 10 + products/mcp/python/schema/tool_inputs.py | 2246 ++ .../scripts/generate-pydantic-models.sh | 78 + products/mcp/python/uv.lock | 1584 ++ products/mcp/schema/tool-definitions.json | 618 + products/mcp/schema/tool-inputs.json | 4052 ++++ products/mcp/typescript/README.md | 72 + products/mcp/typescript/package.json | 87 + products/mcp/typescript/pnpm-lock.yaml | 6132 ++++++ .../scripts/generate-tool-schema.ts | 58 + .../scripts/update-openapi-client.ts | 68 + products/mcp/typescript/src/api/client.ts | 1312 ++ products/mcp/typescript/src/api/fetcher.ts | 52 + products/mcp/typescript/src/api/generated.ts | 17115 ++++++++++++++++ products/mcp/typescript/src/index.ts | 2 + products/mcp/typescript/src/inkeepApi.ts | 44 + .../src/integrations/ai-sdk/index.ts | 77 + .../src/integrations/langchain/index.ts | 81 + .../typescript/src/integrations/mcp/index.ts | 320 + .../src/integrations/mcp/utils/client.ts | 15 + .../integrations/mcp/utils/handleToolError.ts | 83 + products/mcp/typescript/src/lib/analytics.ts | 1 + products/mcp/typescript/src/lib/constants.ts | 7 + products/mcp/typescript/src/lib/errors.ts | 3 + products/mcp/typescript/src/lib/types.ts | 1 + .../src/lib/utils/SessionManager.ts | 48 + .../typescript/src/lib/utils/StateManager.ts | 145 + products/mcp/typescript/src/lib/utils/api.ts | 54 + .../src/lib/utils/cache/DurableObjectCache.ts | 52 + .../src/lib/utils/cache/MemoryCache.ts | 30 + .../src/lib/utils/cache/ScopedCache.ts | 8 + .../src/lib/utils/helper-functions.ts | 22 + products/mcp/typescript/src/schema/api.ts | 71 + .../mcp/typescript/src/schema/dashboards.ts | 93 + products/mcp/typescript/src/schema/errors.ts | 40 + .../mcp/typescript/src/schema/experiments.ts | 560 + products/mcp/typescript/src/schema/flags.ts | 126 + .../mcp/typescript/src/schema/insights.ts | 97 + products/mcp/typescript/src/schema/orgs.ts | 8 + .../mcp/typescript/src/schema/projects.ts | 9 + .../mcp/typescript/src/schema/properties.ts | 21 + products/mcp/typescript/src/schema/query.ts | 251 + products/mcp/typescript/src/schema/surveys.ts | 675 + .../mcp/typescript/src/schema/tool-inputs.ts | 409 + products/mcp/typescript/src/tools/README.md | 253 + .../src/tools/dashboards/addInsight.ts | 50 + .../typescript/src/tools/dashboards/create.ts | 32 + .../typescript/src/tools/dashboards/delete.ts | 27 + .../typescript/src/tools/dashboards/get.ts | 27 + .../typescript/src/tools/dashboards/getAll.ts | 29 + .../typescript/src/tools/dashboards/update.ts | 34 + .../src/tools/documentation/searchDocs.ts | 34 + .../src/tools/errorTracking/errorDetails.ts | 39 + .../src/tools/errorTracking/listErrors.ts | 42 + .../src/tools/experiments/create.ts | 44 + .../src/tools/experiments/delete.ts | 31 + .../typescript/src/tools/experiments/get.ts | 29 + .../src/tools/experiments/getAll.ts | 27 + .../src/tools/experiments/getResults.ts | 53 + .../src/tools/experiments/update.ts | 54 + .../src/tools/featureFlags/create.ts | 37 + .../src/tools/featureFlags/delete.ts | 42 + .../src/tools/featureFlags/getAll.ts | 27 + .../src/tools/featureFlags/getDefinition.ts | 72 + .../src/tools/featureFlags/update.ts | 38 + products/mcp/typescript/src/tools/index.ts | 221 + .../typescript/src/tools/insights/create.ts | 31 + .../typescript/src/tools/insights/delete.ts | 30 + .../mcp/typescript/src/tools/insights/get.ts | 31 + .../typescript/src/tools/insights/getAll.ts | 32 + .../typescript/src/tools/insights/query.ts | 45 + .../typescript/src/tools/insights/update.ts | 39 + .../typescript/src/tools/insights/utils.ts | 28 + .../src/tools/llmAnalytics/getLLMCosts.ts | 51 + .../src/tools/organizations/getDetails.ts | 35 + .../tools/organizations/getOrganizations.ts | 26 + .../src/tools/organizations/setActive.ts | 24 + .../src/tools/projects/eventDefinitions.ts | 34 + .../src/tools/projects/getProjects.ts | 35 + .../src/tools/projects/propertyDefinitions.ts | 46 + .../src/tools/projects/setActive.ts | 25 + .../tools/query/generateHogQLFromQuestion.ts | 38 + .../mcp/typescript/src/tools/query/run.ts | 31 + .../typescript/src/tools/surveys/create.ts | 52 + .../typescript/src/tools/surveys/delete.ts | 31 + .../mcp/typescript/src/tools/surveys/get.ts | 34 + .../typescript/src/tools/surveys/getAll.ts | 35 + .../src/tools/surveys/global-stats.ts | 28 + .../mcp/typescript/src/tools/surveys/stats.ts | 32 + .../typescript/src/tools/surveys/update.ts | 54 + .../src/tools/surveys/utils/survey-utils.ts | 52 + .../typescript/src/tools/toolDefinitions.ts | 54 + products/mcp/typescript/src/tools/types.ts | 54 + products/mcp/typescript/tests/README.md | 23 + .../tests/api/client.integration.test.ts | 1651 ++ .../tests/integration/feature-routing.test.ts | 69 + products/mcp/typescript/tests/setup.ts | 13 + .../mcp/typescript/tests/shared/test-utils.ts | 477 + .../tools/dashboards.integration.test.ts | 224 + .../tools/documentation.integration.test.ts | 93 + .../tools/errorTracking.integration.test.ts | 142 + .../tools/experiments.integration.test.ts | 1251 ++ .../tools/featureFlags.integration.test.ts | 375 + .../tests/tools/insights.integration.test.ts | 317 + .../tools/llmAnalytics.integration.test.ts | 88 + .../tools/organizations.integration.test.ts | 138 + .../tests/tools/projects.integration.test.ts | 215 + .../tests/tools/query.integration.test.ts | 282 + .../tests/tools/surveys.integration.test.ts | 993 + .../tests/unit/SessionManager.test.ts | 215 + .../tests/unit/StateManager.test.ts | 268 + .../typescript/tests/unit/api-client.test.ts | 37 + .../tests/unit/tool-filtering.test.ts | 192 + .../typescript/tests/unit/url-routing.test.ts | 59 + products/mcp/typescript/tsconfig.json | 29 + products/mcp/typescript/tsup.config.ts | 15 + products/mcp/typescript/vitest.config.mts | 14 + .../typescript/vitest.integration.config.mts | 14 + .../mcp/typescript/worker-configuration.d.ts | 6581 ++++++ products/mcp/typescript/wrangler.jsonc | 62 + 156 files changed, 61759 insertions(+), 151 deletions(-) create mode 100644 .github/workflows/ci-mcp.yml create mode 100644 .github/workflows/mcp-publish.yml create mode 100644 products/mcp/.gitignore create mode 100644 products/mcp/.husky/pre-commit create mode 100644 products/mcp/.oxlintrc.json create mode 100644 products/mcp/.prettierignore create mode 100644 products/mcp/.prettierrc create mode 100644 products/mcp/Dockerfile create mode 100644 products/mcp/LICENSE create mode 100644 products/mcp/README.md create mode 100644 products/mcp/examples/ai-sdk/README.md create mode 100644 products/mcp/examples/ai-sdk/package-lock.json create mode 100644 products/mcp/examples/ai-sdk/package.json create mode 100644 products/mcp/examples/ai-sdk/src/index.ts create mode 100644 products/mcp/examples/ai-sdk/tsconfig.json create mode 100644 products/mcp/examples/langchain-js/.gitignore create mode 100644 products/mcp/examples/langchain-js/README.md create mode 100644 products/mcp/examples/langchain-js/package-lock.json create mode 100644 products/mcp/examples/langchain-js/package.json create mode 100644 products/mcp/examples/langchain-js/src/index.ts create mode 100644 products/mcp/examples/langchain-js/tsconfig.json create mode 100644 products/mcp/examples/langchain/README.md create mode 100644 products/mcp/examples/langchain/posthog_agent_example.py create mode 100644 products/mcp/examples/langchain/pyproject.toml create mode 100644 products/mcp/examples/langchain/uv.lock create mode 100644 products/mcp/package.json create mode 100644 products/mcp/pnpm-lock.yaml create mode 100644 products/mcp/python/README.md create mode 100644 products/mcp/python/posthog_agent_toolkit/__init__.py create mode 100644 products/mcp/python/posthog_agent_toolkit/integrations/__init__.py create mode 100644 products/mcp/python/posthog_agent_toolkit/integrations/langchain/__init__.py create mode 100644 products/mcp/python/posthog_agent_toolkit/integrations/langchain/toolkit.py create mode 100644 products/mcp/python/pyproject.toml create mode 100644 products/mcp/python/pytest.ini create mode 100644 products/mcp/python/schema/tool_inputs.py create mode 100755 products/mcp/python/scripts/generate-pydantic-models.sh create mode 100644 products/mcp/python/uv.lock create mode 100644 products/mcp/schema/tool-definitions.json create mode 100644 products/mcp/schema/tool-inputs.json create mode 100644 products/mcp/typescript/README.md create mode 100644 products/mcp/typescript/package.json create mode 100644 products/mcp/typescript/pnpm-lock.yaml create mode 100755 products/mcp/typescript/scripts/generate-tool-schema.ts create mode 100644 products/mcp/typescript/scripts/update-openapi-client.ts create mode 100644 products/mcp/typescript/src/api/client.ts create mode 100644 products/mcp/typescript/src/api/fetcher.ts create mode 100644 products/mcp/typescript/src/api/generated.ts create mode 100644 products/mcp/typescript/src/index.ts create mode 100644 products/mcp/typescript/src/inkeepApi.ts create mode 100644 products/mcp/typescript/src/integrations/ai-sdk/index.ts create mode 100644 products/mcp/typescript/src/integrations/langchain/index.ts create mode 100644 products/mcp/typescript/src/integrations/mcp/index.ts create mode 100644 products/mcp/typescript/src/integrations/mcp/utils/client.ts create mode 100644 products/mcp/typescript/src/integrations/mcp/utils/handleToolError.ts create mode 100644 products/mcp/typescript/src/lib/analytics.ts create mode 100644 products/mcp/typescript/src/lib/constants.ts create mode 100644 products/mcp/typescript/src/lib/errors.ts create mode 100644 products/mcp/typescript/src/lib/types.ts create mode 100644 products/mcp/typescript/src/lib/utils/SessionManager.ts create mode 100644 products/mcp/typescript/src/lib/utils/StateManager.ts create mode 100644 products/mcp/typescript/src/lib/utils/api.ts create mode 100644 products/mcp/typescript/src/lib/utils/cache/DurableObjectCache.ts create mode 100644 products/mcp/typescript/src/lib/utils/cache/MemoryCache.ts create mode 100644 products/mcp/typescript/src/lib/utils/cache/ScopedCache.ts create mode 100644 products/mcp/typescript/src/lib/utils/helper-functions.ts create mode 100644 products/mcp/typescript/src/schema/api.ts create mode 100644 products/mcp/typescript/src/schema/dashboards.ts create mode 100644 products/mcp/typescript/src/schema/errors.ts create mode 100644 products/mcp/typescript/src/schema/experiments.ts create mode 100644 products/mcp/typescript/src/schema/flags.ts create mode 100644 products/mcp/typescript/src/schema/insights.ts create mode 100644 products/mcp/typescript/src/schema/orgs.ts create mode 100644 products/mcp/typescript/src/schema/projects.ts create mode 100644 products/mcp/typescript/src/schema/properties.ts create mode 100644 products/mcp/typescript/src/schema/query.ts create mode 100644 products/mcp/typescript/src/schema/surveys.ts create mode 100644 products/mcp/typescript/src/schema/tool-inputs.ts create mode 100644 products/mcp/typescript/src/tools/README.md create mode 100644 products/mcp/typescript/src/tools/dashboards/addInsight.ts create mode 100644 products/mcp/typescript/src/tools/dashboards/create.ts create mode 100644 products/mcp/typescript/src/tools/dashboards/delete.ts create mode 100644 products/mcp/typescript/src/tools/dashboards/get.ts create mode 100644 products/mcp/typescript/src/tools/dashboards/getAll.ts create mode 100644 products/mcp/typescript/src/tools/dashboards/update.ts create mode 100644 products/mcp/typescript/src/tools/documentation/searchDocs.ts create mode 100644 products/mcp/typescript/src/tools/errorTracking/errorDetails.ts create mode 100644 products/mcp/typescript/src/tools/errorTracking/listErrors.ts create mode 100644 products/mcp/typescript/src/tools/experiments/create.ts create mode 100644 products/mcp/typescript/src/tools/experiments/delete.ts create mode 100644 products/mcp/typescript/src/tools/experiments/get.ts create mode 100644 products/mcp/typescript/src/tools/experiments/getAll.ts create mode 100644 products/mcp/typescript/src/tools/experiments/getResults.ts create mode 100644 products/mcp/typescript/src/tools/experiments/update.ts create mode 100644 products/mcp/typescript/src/tools/featureFlags/create.ts create mode 100644 products/mcp/typescript/src/tools/featureFlags/delete.ts create mode 100644 products/mcp/typescript/src/tools/featureFlags/getAll.ts create mode 100644 products/mcp/typescript/src/tools/featureFlags/getDefinition.ts create mode 100644 products/mcp/typescript/src/tools/featureFlags/update.ts create mode 100644 products/mcp/typescript/src/tools/index.ts create mode 100644 products/mcp/typescript/src/tools/insights/create.ts create mode 100644 products/mcp/typescript/src/tools/insights/delete.ts create mode 100644 products/mcp/typescript/src/tools/insights/get.ts create mode 100644 products/mcp/typescript/src/tools/insights/getAll.ts create mode 100644 products/mcp/typescript/src/tools/insights/query.ts create mode 100644 products/mcp/typescript/src/tools/insights/update.ts create mode 100644 products/mcp/typescript/src/tools/insights/utils.ts create mode 100644 products/mcp/typescript/src/tools/llmAnalytics/getLLMCosts.ts create mode 100644 products/mcp/typescript/src/tools/organizations/getDetails.ts create mode 100644 products/mcp/typescript/src/tools/organizations/getOrganizations.ts create mode 100644 products/mcp/typescript/src/tools/organizations/setActive.ts create mode 100644 products/mcp/typescript/src/tools/projects/eventDefinitions.ts create mode 100644 products/mcp/typescript/src/tools/projects/getProjects.ts create mode 100644 products/mcp/typescript/src/tools/projects/propertyDefinitions.ts create mode 100644 products/mcp/typescript/src/tools/projects/setActive.ts create mode 100644 products/mcp/typescript/src/tools/query/generateHogQLFromQuestion.ts create mode 100644 products/mcp/typescript/src/tools/query/run.ts create mode 100644 products/mcp/typescript/src/tools/surveys/create.ts create mode 100644 products/mcp/typescript/src/tools/surveys/delete.ts create mode 100644 products/mcp/typescript/src/tools/surveys/get.ts create mode 100644 products/mcp/typescript/src/tools/surveys/getAll.ts create mode 100644 products/mcp/typescript/src/tools/surveys/global-stats.ts create mode 100644 products/mcp/typescript/src/tools/surveys/stats.ts create mode 100644 products/mcp/typescript/src/tools/surveys/update.ts create mode 100644 products/mcp/typescript/src/tools/surveys/utils/survey-utils.ts create mode 100644 products/mcp/typescript/src/tools/toolDefinitions.ts create mode 100644 products/mcp/typescript/src/tools/types.ts create mode 100644 products/mcp/typescript/tests/README.md create mode 100644 products/mcp/typescript/tests/api/client.integration.test.ts create mode 100644 products/mcp/typescript/tests/integration/feature-routing.test.ts create mode 100644 products/mcp/typescript/tests/setup.ts create mode 100644 products/mcp/typescript/tests/shared/test-utils.ts create mode 100644 products/mcp/typescript/tests/tools/dashboards.integration.test.ts create mode 100644 products/mcp/typescript/tests/tools/documentation.integration.test.ts create mode 100644 products/mcp/typescript/tests/tools/errorTracking.integration.test.ts create mode 100644 products/mcp/typescript/tests/tools/experiments.integration.test.ts create mode 100644 products/mcp/typescript/tests/tools/featureFlags.integration.test.ts create mode 100644 products/mcp/typescript/tests/tools/insights.integration.test.ts create mode 100644 products/mcp/typescript/tests/tools/llmAnalytics.integration.test.ts create mode 100644 products/mcp/typescript/tests/tools/organizations.integration.test.ts create mode 100644 products/mcp/typescript/tests/tools/projects.integration.test.ts create mode 100644 products/mcp/typescript/tests/tools/query.integration.test.ts create mode 100644 products/mcp/typescript/tests/tools/surveys.integration.test.ts create mode 100644 products/mcp/typescript/tests/unit/SessionManager.test.ts create mode 100644 products/mcp/typescript/tests/unit/StateManager.test.ts create mode 100644 products/mcp/typescript/tests/unit/api-client.test.ts create mode 100644 products/mcp/typescript/tests/unit/tool-filtering.test.ts create mode 100644 products/mcp/typescript/tests/unit/url-routing.test.ts create mode 100644 products/mcp/typescript/tsconfig.json create mode 100644 products/mcp/typescript/tsup.config.ts create mode 100644 products/mcp/typescript/vitest.config.mts create mode 100644 products/mcp/typescript/vitest.integration.config.mts create mode 100644 products/mcp/typescript/worker-configuration.d.ts create mode 100644 products/mcp/typescript/wrangler.jsonc diff --git a/.github/workflows/ci-mcp.yml b/.github/workflows/ci-mcp.yml new file mode 100644 index 0000000000..0f1de07621 --- /dev/null +++ b/.github/workflows/ci-mcp.yml @@ -0,0 +1,133 @@ +name: MCP CI + +on: + push: + branches: [master] + pull_request: + +jobs: + changes: + permissions: + contents: read + runs-on: ubuntu-24.04 + timeout-minutes: 5 + name: Determine need to run MCP checks + outputs: + mcp: ${{ steps.filter.outputs.mcp }} + steps: + - uses: actions/checkout@v4 + + - uses: dorny/paths-filter@4512585405083f25c027a35db413c2b3b9006d50 # v2 + id: filter + with: + filters: | + mcp: + - 'products/mcp/**' + - '.github/workflows/mcp-ci.yml' + - '.github/workflows/mcp-publish.yml' + + lint-and-format: + name: Lint, Format, and Type Check + runs-on: ubuntu-latest + needs: changes + if: needs.changes.outputs.mcp == 'true' + permissions: + contents: read + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Run linter + run: cd products/mcp && pnpm run lint + + - name: Run formatter + run: cd products/mcp && pnpm run format + + - name: Run type check + run: cd products/mcp && pnpm run typecheck + + - name: Check for changes + run: | + if [ -n "$(git status --porcelain)" ]; then + echo "Code formatting or linting changes detected!" + git diff + exit 1 + fi + + unit-tests: + name: Unit Tests + runs-on: ubuntu-latest + needs: changes + permissions: + contents: read + if: needs.changes.outputs.mcp == 'true' + concurrency: + group: ${{ github.workflow }}-unit-${{ github.head_ref || github.ref }} + cancel-in-progress: true + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Run unit tests + run: cd products/mcp && pnpm run test + + integration-tests: + name: Integration Tests + runs-on: ubuntu-latest + needs: [changes, unit-tests] + if: needs.changes.outputs.mcp == 'true' + permissions: + contents: read + concurrency: + group: ${{ github.workflow }}-integration-${{ github.head_ref || github.ref }} + cancel-in-progress: true + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Run integration tests + run: cd products/mcp && pnpm run test:integration + env: + TEST_POSTHOG_API_BASE_URL: ${{ secrets.MCP_TEST_API_BASE_URL }} + TEST_POSTHOG_PERSONAL_API_KEY: ${{ secrets.MCP_TEST_PERSONAL_API_KEY }} + TEST_ORG_ID: ${{ secrets.MCP_TEST_ORG_ID }} + TEST_PROJECT_ID: ${{ secrets.MCP_TEST_PROJECT_ID }} diff --git a/.github/workflows/mcp-publish.yml b/.github/workflows/mcp-publish.yml new file mode 100644 index 0000000000..12838db033 --- /dev/null +++ b/.github/workflows/mcp-publish.yml @@ -0,0 +1,86 @@ +name: 'MCP Publish' + +on: + push: + branches: + - master + workflow_dispatch: +permissions: + contents: read + +jobs: + changes: + runs-on: ubuntu-24.04 + timeout-minutes: 5 + name: Determine need to run MCP publish + outputs: + mcp: ${{ steps.filter.outputs.mcp }} + steps: + - uses: actions/checkout@v4 + + - uses: dorny/paths-filter@4512585405083f25c027a35db413c2b3b9006d50 # v2 + id: filter + with: + filters: | + mcp: + - 'mcp/**' + - '.github/workflows/mcp-ci.yml' + - '.github/workflows/mcp-publish.yml' + + check-package-version: + name: Check package version and detect an update + runs-on: ubuntu-24.04 + needs: changes + permissions: + contents: read + if: needs.changes.outputs.mcp == 'true' || github.event_name == 'workflow_dispatch' + outputs: + committed-version: ${{ steps.check-package-version.outputs.committed-version }} + published-version: ${{ steps.check-package-version.outputs.published-version }} + is-new-version: ${{ steps.check-package-version.outputs.is-new-version }} + steps: + - name: Checkout the repository + uses: actions/checkout@v4 + + - name: Check package version and detect an update + id: check-package-version + uses: PostHog/check-package-version@v2 + with: + path: mcp/typescript/ + + release: + name: Publish release if new version + runs-on: ubuntu-24.04 + needs: check-package-version + if: needs.check-package-version.outputs.is-new-version == 'true' + permissions: + contents: read + env: + COMMITTED_VERSION: ${{ needs.check-package-version.outputs.committed-version }} + PUBLISHED_VERSION: ${{ needs.check-package-version.outputs.published-version }} + steps: + - name: Checkout the repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.POSTHOG_BOT_GITHUB_TOKEN }} + + - name: Set up Node 22 + uses: actions/setup-node@v4 + with: + node-version: 22 + registry-url: https://registry.npmjs.org + + - name: Install pnpm + run: npm install -g pnpm + + - name: Install package.json dependencies with pnpm + run: pnpm install + + - name: Build the package + run: cd products/mcp/typescript && pnpm build + + - name: Publish the package in the npm registry + run: cd products/mcp/typescript && pnpm publish --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/frontend/jest.config.ts b/frontend/jest.config.ts index 7fb2f78c7a..5fa1792f57 100644 --- a/frontend/jest.config.ts +++ b/frontend/jest.config.ts @@ -186,9 +186,7 @@ const config: Config = { // ], // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], + testPathIgnorePatterns: ['/node_modules/', '/products/mcp/'], // The regexp pattern or array of patterns that Jest uses to detect test files // testRegex: [], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ed77aabfa..15c4a362f5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -632,7 +632,7 @@ importers: version: 9.21.26 '@vitejs/plugin-react': specifier: ^4.7.0 - version: 4.7.0(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(less@3.13.1)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.7.0)) + version: 4.7.0(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(less@3.13.1)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.8.1)) '@xyflow/react': specifier: ^12.6.0 version: 12.6.0(@types/react@17.0.52)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -818,7 +818,7 @@ importers: version: 3.0.2 openai: specifier: ^4.81.0 - version: 4.82.0(encoding@0.1.13)(zod@3.24.1) + version: 4.82.0(encoding@0.1.13)(ws@8.18.0)(zod@3.25.76) papaparse: specifier: ^5.4.1 version: 5.4.1 @@ -932,7 +932,7 @@ importers: version: 8.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(less@3.13.1)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.7.0) + version: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(less@3.13.1)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.8.1) zxcvbn: specifier: ^4.4.2 version: 4.4.2 @@ -2040,7 +2040,7 @@ importers: version: 3.1.3 jest: specifier: '*' - version: 29.7.0(@types/node@22.15.17)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)) + version: 29.7.0(@types/node@22.18.8)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2)) kea: specifier: ^3.1.7 version: 3.1.7(react@18.2.0) @@ -2093,6 +2093,88 @@ importers: specifier: '*' version: 18.2.0 + products/mcp: + devDependencies: + husky: + specifier: ^9.1.7 + version: 9.1.7 + oxlint: + specifier: ^1.8.0 + version: 1.9.0 + prettier: + specifier: ^3.4.2 + version: 3.6.2 + tsx: + specifier: ^4.20.3 + version: 4.20.5 + + products/mcp/typescript: + dependencies: + '@modelcontextprotocol/sdk': + specifier: ^1.17.3 + version: 1.19.1 + agents: + specifier: ^0.0.113 + version: 0.0.113(@cloudflare/workers-types@4.20251004.0)(react@18.2.0) + ai: + specifier: ^5.0.18 + version: 5.0.60(zod@3.25.76) + posthog-node: + specifier: ^4.18.0 + version: 4.18.0 + uuid: + specifier: ^11.1.0 + version: 11.1.0 + zod: + specifier: ^3.24.4 + version: 3.25.76 + devDependencies: + '@langchain/core': + specifier: ^0.3.72 + version: 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.0)(zod@3.25.76)) + '@langchain/openai': + specifier: ^0.6.9 + version: 0.6.14(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.0)(zod@3.25.76)))(ws@8.18.0) + '@types/dotenv': + specifier: ^6.1.1 + version: 6.1.1 + '@types/node': + specifier: ^22.15.34 + version: 22.18.8 + dotenv: + specifier: ^16.4.7 + version: 16.4.7 + langchain: + specifier: ^0.3.31 + version: 0.3.35(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.0)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(axios@1.9.0)(cheerio@1.0.0)(handlebars@4.7.8)(openai@5.12.2(ws@8.18.0)(zod@3.25.76))(ws@8.18.0) + tsup: + specifier: ^8.5.0 + version: 8.5.0(@swc/core@1.11.4(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.5)(typescript@5.2.2)(yaml@2.8.1) + tsx: + specifier: ^4.20.5 + version: 4.20.5 + typed-openapi: + specifier: ^2.2.2 + version: 2.2.2(openapi-types@12.1.3)(react@18.2.0) + typescript: + specifier: 5.2.2 + version: 5.2.2 + vite: + specifier: ^5.0.0 + version: 5.4.20(@types/node@22.18.8)(less@4.2.2)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1) + vite-tsconfig-paths: + specifier: ^5.1.4 + version: 5.1.4(typescript@5.2.2)(vite@5.4.20(@types/node@22.18.8)(less@4.2.2)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)) + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@22.18.8)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.2)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.8.1) + wrangler: + specifier: ^4.14.4 + version: 4.42.0(@cloudflare/workers-types@4.20251004.0) + zod-to-json-schema: + specifier: ^3.24.6 + version: 3.24.6(zod@3.25.76) + products/messaging: dependencies: '@posthog/icons': @@ -2433,6 +2515,48 @@ packages: '@adobe/css-tools@4.0.1': resolution: {integrity: sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==} + '@ai-sdk/gateway@1.0.33': + resolution: {integrity: sha512-v9i3GPEo4t3fGcSkQkc07xM6KJN75VUv7C1Mqmmsu2xD8lQwnQfsrgAXyNuWe20yGY0eHuheSPDZhiqsGKtH1g==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@2.2.8': + resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + + '@ai-sdk/provider-utils@3.0.10': + resolution: {integrity: sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider@1.1.3': + resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} + engines: {node: '>=18'} + + '@ai-sdk/provider@2.0.0': + resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} + engines: {node: '>=18'} + + '@ai-sdk/react@1.2.12': + resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.23.8 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/ui-utils@1.2.11': + resolution: {integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + '@algolia/cache-browser-local-storage@4.22.1': resolution: {integrity: sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==} @@ -2519,6 +2643,28 @@ packages: peerDependencies: react: '>=16.9.0' + '@apidevtools/json-schema-ref-parser@11.7.2': + resolution: {integrity: sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==} + engines: {node: '>= 16'} + + '@apidevtools/openapi-schemas@2.1.0': + resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} + engines: {node: '>=10'} + + '@apidevtools/swagger-methods@3.0.2': + resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} + + '@apidevtools/swagger-parser@10.1.1': + resolution: {integrity: sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA==} + peerDependencies: + openapi-types: '>=7' + + '@ark/schema@0.46.0': + resolution: {integrity: sha512-c2UQdKgP2eqqDArfBqQIJppxJHvNNXuQPeuSPlDML4rjw+f1cu0qAlzOG4b8ujgm9ctIDWwhpyw6gjG5ledIVQ==} + + '@ark/util@0.46.0': + resolution: {integrity: sha512-JPy/NGWn/lvf1WmGCPw2VGpBg5utZraE84I7wli18EDF3p3zc/e9WolT35tINeZO3l7C77SjqRJeAUoT0CvMRg==} + '@aw-web-design/x-default-browser@1.4.126': resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==} hasBin: true @@ -3550,6 +3696,10 @@ packages: '@babel/regjsgen@0.8.0': resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + '@babel/runtime-corejs3@7.28.4': + resolution: {integrity: sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==} + engines: {node: '>=6.9.0'} + '@babel/runtime@7.24.0': resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} engines: {node: '>=6.9.0'} @@ -3602,6 +3752,9 @@ packages: '@bufbuild/protobuf@2.3.0': resolution: {integrity: sha512-WK6zH4MtBp/uesX8KGCnwDDRVnEVHUvwjsigKXcSR57Oo8Oyv1vRS9qyUlSP+6KWRl5z8tNAU5qpf3QodeVYxA==} + '@cfworker/json-schema@4.1.1': + resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} + '@clickhouse/client-common@1.12.0': resolution: {integrity: sha512-cyI4n7u9jK30d9q1q0ceQ7IwJ/MtTs5HxoQfc8yHpN+ok5wqaU2jAtq5hpa1z7C7sS1pDy/ZOFmOzg1v1F683g==} @@ -3609,6 +3762,52 @@ packages: resolution: {integrity: sha512-vJUSX8THhTzlVn0WxPukVjOgNRaSoY02ubQkB0LpqNoHFxXuF5jQZZAYvGZWpBGbYQ/4gfPrqu8g4TX5UKeNxA==} engines: {node: '>=16'} + '@cloudflare/kv-asset-handler@0.4.0': + resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} + engines: {node: '>=18.0.0'} + + '@cloudflare/unenv-preset@2.7.6': + resolution: {integrity: sha512-ykG2nd3trk6jbknRCH69xL3RpGLLbKCrbTbWSOvKEq7s4jH06yLrQlRr/q9IU+dK9p1JY1EXqhFK7VG5KqhzmQ==} + peerDependencies: + unenv: 2.0.0-rc.21 + workerd: ^1.20250927.0 + peerDependenciesMeta: + workerd: + optional: true + + '@cloudflare/workerd-darwin-64@1.20251001.0': + resolution: {integrity: sha512-y1ST/cCscaRewWRnsHZdWbgiLJbki5UMGd0hMo/FLqjlztwPeDgQ5CGm5jMiCDdw/IBCpWxEukftPYR34rWNog==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + + '@cloudflare/workerd-darwin-arm64@1.20251001.0': + resolution: {integrity: sha512-+z4QHHZ/Yix82zLFYS+ZS2UV09IENFPwDCEKUWfnrM9Km2jOOW3Ua4hJNob1EgQUYs8fFZo7k5O/tpwxMsSbbQ==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + + '@cloudflare/workerd-linux-64@1.20251001.0': + resolution: {integrity: sha512-hGS+O2V9Mm2XjJUaB9ZHMA5asDUaDjKko42e+accbew0PQR7zrAl1afdII6hMqCLV4tk4GAjvhv281pN4g48rg==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + + '@cloudflare/workerd-linux-arm64@1.20251001.0': + resolution: {integrity: sha512-QYaMK+pRgt28N7CX1JlJ+ToegJF9LxzqdT7MjWqPgVj9D2WTyIhBVYl3wYjJRcgOlnn+DRt42+li4T64CPEeuA==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + + '@cloudflare/workerd-windows-64@1.20251001.0': + resolution: {integrity: sha512-ospnDR/FlyRvrv9DSHuxDAXmzEBLDUiAHQrQHda1iUH9HqxnNQ8giz9VlPfq7NIRc7bQ1ZdIYPGLJOY4Q366Ng==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@cloudflare/workers-types@4.20251004.0': + resolution: {integrity: sha512-FkTBHEyOBwphbW4SLQ2XLCgNntD2wz0v1Si7NwJeN0JAPW/39/w6zhsKy3rsh+203tuSfBgsoP34+Os4RaySOw==} + '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -3960,240 +4159,480 @@ packages: peerDependencies: react: '>=16.8.0' + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.25.10': resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.4': + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.18.20': resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.10': resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.4': + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.18.20': resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.10': resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.4': + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.18.20': resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.10': resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.4': + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.18.20': resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.10': resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.4': + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.18.20': resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.10': resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.4': + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.10': resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.4': + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.10': resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.4': + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.18.20': resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.10': resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.4': + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.18.20': resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.10': resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.4': + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.18.20': resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.10': resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.4': + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.18.20': resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.10': resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.4': + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.18.20': resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.10': resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.4': + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.18.20': resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.10': resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.4': + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.18.20': resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.10': resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.4': + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.18.20': resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.10': resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.4': + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.18.20': resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.10': resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.4': + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.10': resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.25.4': + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.18.20': resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.10': resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.4': + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.10': resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.25.4': + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.10': resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.4': + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.25.10': resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} engines: {node: '>=18'} @@ -4206,48 +4645,96 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.10': resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.4': + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.18.20': resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.10': resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.4': + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.18.20': resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.10': resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.4': + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.18.20': resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.10': resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.4': + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4357,6 +4844,111 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -4549,6 +5141,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.4': resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -4561,6 +5156,9 @@ packages: '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + '@jspm/core@2.0.1': resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==} @@ -4570,6 +5168,22 @@ packages: '@kurkle/color@0.3.2': resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==} + '@langchain/core@0.3.78': + resolution: {integrity: sha512-Nn0x9erQlK3zgtRU1Z8NUjLuyW0gzdclMsvLQ6wwLeDqV91pE+YKl6uQb+L2NUDs4F0N7c2Zncgz46HxrvPzuA==} + engines: {node: '>=18'} + + '@langchain/openai@0.6.14': + resolution: {integrity: sha512-SM/xJOFDxT9NN/07fvhNB5dgAsIOQaLhmANxrRlSQ7Qs1zImMrzOvq+/5JP/ifpC/YxcgEnt4dblKVqvNU/C5A==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.3.68 <0.4.0' + + '@langchain/textsplitters@0.1.0': + resolution: {integrity: sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.2.21 <0.4.0' + '@lezer/common@1.2.3': resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} @@ -4672,6 +5286,10 @@ packages: resolution: {integrity: sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==} engines: {node: '>=12.0.0'} + '@modelcontextprotocol/sdk@1.19.1': + resolution: {integrity: sha512-3Y2h3MZKjec1eAqSTBclATlX+AbC6n1LgfVzRMJLt3v6w0RCYgwLrjbxPDbhsYHt6Wdqc/aCceNJYgj448ELQQ==} + engines: {node: '>=18'} + '@monaco-editor/loader@1.4.0': resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} peerDependencies: @@ -5763,6 +6381,15 @@ packages: webpack-plugin-serve: optional: true + '@poppinss/colors@4.1.5': + resolution: {integrity: sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==} + + '@poppinss/dumper@0.6.4': + resolution: {integrity: sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==} + + '@poppinss/exception@1.2.2': + resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} + '@posthog/core@1.2.2': resolution: {integrity: sha512-f16Ozx6LIigRG+HsJdt+7kgSxZTHeX5f1JlCGKI1lXcvlZgfsCR338FuMI2QRYXGl+jg/vYFzGOTQBxl90lnBg==} @@ -7117,12 +7744,22 @@ packages: '@sideway/pinpoint@2.0.0': resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@sinclair/typebox-codegen@0.11.1': + resolution: {integrity: sha512-Bckbrf1sJFTIVD88PvI0vWUfE3Sh/6pwu6Jov+6xyMrEqnabOxEFAmPSDWjB1FGPL5C1/HfdScwa1imwAtGi9w==} + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sinclair/typebox@0.33.22': + resolution: {integrity: sha512-auUj4k+f4pyrIVf4GW5UKquSZFHJWri06QgARy9C0t9ZTjJLIuNIrr1yl9bWcJWJ1Gz1vOvYN1D+QPaIlNMVkQ==} + '@sinclair/typebox@0.34.38': resolution: {integrity: sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==} + '@sindresorhus/is@7.1.0': + resolution: {integrity: sha512-7F/yz2IphV39hiS2zB4QYVkivrptHHh0K8qJJd9HhuWSdvf8AN7NpebW3CcDZDBQsUPMoDKWsY2WWgW7bqOcfA==} + engines: {node: '>=18'} + '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} @@ -7495,6 +8132,9 @@ packages: resolution: {integrity: sha512-PpjSboaDUE6yl+1qlg3Si57++e84oXdWGbuFUSAciXsVfEZJJJupR2Nb0QuXHiunt2vGR+1PTizOMvnUPaG2Qg==} engines: {node: '>=16.0.0'} + '@speed-highlight/core@1.2.7': + resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} + '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} @@ -8311,6 +8951,9 @@ packages: '@types/caseless@0.12.5': resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/chance@1.1.7': resolution: {integrity: sha512-40you9610GTQPJyvjMBgmj9wiDO6qXhbfjizNYod/fmvLSfUUxURAJMTD8tjmbcZSsyYE5iEUox61AAcCjW/wQ==} @@ -8461,9 +9104,15 @@ packages: '@types/debug@4.1.7': resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/detect-port@1.3.3': resolution: {integrity: sha512-bV/jQlAJ/nPY3XqSatkGpu+nGzou+uSwrH1cROhn+jBFg47yaNH+blW4C7p9KhopC7QxCv/6M86s37k8dMk0Yg==} + '@types/diff-match-patch@1.0.36': + resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} + '@types/doctrine@0.0.3': resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} @@ -8476,6 +9125,9 @@ packages: '@types/dompurify@3.0.3': resolution: {integrity: sha512-odiGr/9/qMqjcBOe5UhcNLOFHSYmKFOyr+bJ/Xu3Qp4k1pNPAlNLUVNNLcLfjQI7+W7ObX58EdD3H+3p3voOvA==} + '@types/dotenv@6.1.1': + resolution: {integrity: sha512-ftQl3DtBvqHl9L16tpqqzA4YzCSXZfi7g8cQceTz5rOlYtk/IZbFjAv3mLOQlNIgOaylCQWQoBdDQHPgEBJPHg==} + '@types/ejs@3.1.2': resolution: {integrity: sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g==} @@ -8696,6 +9348,9 @@ packages: '@types/node@22.15.17': resolution: {integrity: sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==} + '@types/node@22.18.8': + resolution: {integrity: sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==} + '@types/nodemailer@6.4.17': resolution: {integrity: sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww==} @@ -8791,6 +9446,9 @@ packages: '@types/resolve@1.20.6': resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + '@types/scheduler@0.16.2': resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} @@ -9031,12 +9689,45 @@ packages: cpu: [x64] os: [win32] + '@vercel/oidc@3.0.1': + resolution: {integrity: sha512-V/YRVrJDqM6VaMBjRUrd6qRMrTKvZjHdVdEmdXsOZMulTa3iK98ijKTc3wldBmst6W5rHpqMoKllKcBAHgN7GQ==} + engines: {node: '>= 20'} + '@vitejs/plugin-react@4.7.0': resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@webassemblyjs/ast@1.11.6': resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} @@ -9174,6 +9865,10 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} @@ -9201,6 +9896,10 @@ packages: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} @@ -9216,6 +9915,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} @@ -9241,10 +9945,39 @@ packages: resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} engines: {node: '>= 8.0.0'} + agents@0.0.113: + resolution: {integrity: sha512-PnUjSwFGYMcOWTcewo4NJZqN8gU2u1LFD17OhOzc83LZHa01P2o/qjLOVT338jWPzkPalXTj0RO19s0Lgyl6Ig==} + peerDependencies: + react: '*' + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} + ai@4.3.19: + resolution: {integrity: sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.23.8 + peerDependenciesMeta: + react: + optional: true + + ai@5.0.60: + resolution: {integrity: sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -9269,6 +10002,9 @@ packages: ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + algoliasearch-helper@3.16.2: resolution: {integrity: sha512-Yl/Gu5Cq4Z5s/AJ0jR37OPI1H3+z7PHz657ibyaXgMOaWvPlZ3OACN13N+7HCLPUlB0BN+8BtmrG/CqTilowBA==} peerDependencies: @@ -9322,10 +10058,6 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} @@ -9369,6 +10101,9 @@ packages: aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + arktype@2.1.20: + resolution: {integrity: sha512-IZCEEXaJ8g+Ijd59WtSYwtjnqXiwM8sWQ5EjGamcto7+HVN9eK0C4p0zDlCuAwWhpqr6fIBkxPuYDl4/Mcj/+Q==} + arr-union@3.1.0: resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} engines: {node: '>=0.10.0'} @@ -9430,6 +10165,10 @@ packages: assert@2.1.0: resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + assign-symbols@1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} @@ -9491,9 +10230,6 @@ packages: resolution: {integrity: sha512-1exVbW0X1O/HSr/WMwnaweyqcWOgZgLiVxdLG34pvSQk4NlYQr9OUy0JLwuhFfuVNQzzqgH57eYzkFBCb3bIsQ==} engines: {node: '>=4'} - axios@1.7.9: - resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} - axios@1.9.0: resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} @@ -9649,6 +10385,9 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + blake3-wasm@2.1.5: + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + bn.js@4.12.1: resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} @@ -9659,6 +10398,10 @@ packages: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -9763,6 +10506,12 @@ packages: resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} engines: {node: '>=10.0.0'} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} @@ -9777,6 +10526,10 @@ packages: bytewise@1.1.0: resolution: {integrity: sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + cacache@18.0.4: resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} engines: {node: ^16.14.0 || >=18.0.0} @@ -9808,6 +10561,9 @@ packages: resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -9844,6 +10600,10 @@ packages: ccount@1.1.0: resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + chalk-template@1.1.0: resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} engines: {node: '>=14.16'} @@ -9940,6 +10700,10 @@ packages: chartjs-plugin-trendline@2.1.2: resolution: {integrity: sha512-8XmGSI4I1tS3Balm0SsYWQjy4eNtY9aDSpErlD/Z+Zqlhfzir/p8U9zn3ahHsNolfVL/s35MgZ5jM+BCbCGP7A==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} @@ -9951,6 +10715,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -10091,6 +10859,10 @@ packages: color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} @@ -10197,10 +10969,20 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + configstore@5.0.1: resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} engines: {node: '>=8'} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + console-table-printer@2.14.6: + resolution: {integrity: sha512-MCBl5HNVaFuuHW6FGbL/4fB7N/ormCy+tQ+sxTrF6QtSbSNETvPuOVbkJBhzDgYhvjWGrTma4eYJa37ZuoQsPw==} + constants-browserify@1.0.0: resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} @@ -10208,6 +10990,10 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -10233,6 +11019,10 @@ packages: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + cookie@1.0.2: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} @@ -10252,6 +11042,9 @@ packages: core-js-pure@3.32.0: resolution: {integrity: sha512-qsev1H+dTNYpDUEURRuOXMvpdtAnNEvQWS/FMJ2Vb5AY8ZP4rAPQldkE27joykZPJTe0+IVgHZYh1P5Xu1/i1g==} + core-js-pure@3.45.1: + resolution: {integrity: sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==} + core-js@3.40.0: resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} @@ -10321,6 +11114,10 @@ packages: resolution: {integrity: sha512-jbokKWGcyU4gl6jAfX97E1gDpY12DJ1cLJZmoDzaAln/shZ+S3KBFBuA2Q6WeUN4gJf/8klnV1EfvhA2lK5IRQ==} engines: {node: '>=12.0.0'} + cron-schedule@5.0.4: + resolution: {integrity: sha512-nH0a49E/kSVk6BeFgKZy4uUsy6D2A16p120h5bYD9ILBhQu7o2sJFH+WI4R731TSBQ0dB1Ik7inB/dRAB4C8QQ==} + engines: {node: '>=18'} + cross-fetch@3.2.0: resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} @@ -10328,6 +11125,10 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} @@ -10651,6 +11452,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -10688,6 +11498,10 @@ packages: babel-plugin-macros: optional: true + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-equal@2.1.0: resolution: {integrity: sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==} @@ -10725,8 +11539,8 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - defu@6.1.2: - resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} del@6.1.1: resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} @@ -10795,6 +11609,9 @@ packages: dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11026,6 +11843,9 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} @@ -11047,6 +11867,9 @@ packages: es-module-lexer@1.4.1: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -11102,11 +11925,21 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.25.10: resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} engines: {node: '>=18'} hasBin: true + esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -11266,6 +12099,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -11274,10 +12110,16 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + event-target-polyfill@0.0.4: + resolution: {integrity: sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==} + event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -11293,6 +12135,14 @@ packages: resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} engines: {node: '>=18.0.0'} + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} @@ -11307,6 +12157,10 @@ packages: exenv@1.2.2: resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==} + exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + exit-x@0.2.2: resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} engines: {node: '>= 0.8.0'} @@ -11322,6 +12176,10 @@ packages: expect-playwright@0.8.0: resolution: {integrity: sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11336,10 +12194,23 @@ packages: expr-eval@2.0.2: resolution: {integrity: sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==} + express-rate-limit@7.5.1: + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -11413,6 +12284,9 @@ packages: fast-text-encoding@1.0.6: resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-xml-parser@4.4.1: resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true @@ -11497,6 +12371,10 @@ packages: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + find-cache-dir@2.1.0: resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} engines: {node: '>=6'} @@ -11537,6 +12415,9 @@ packages: resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -11615,6 +12496,10 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + frimousse@0.3.0: resolution: {integrity: sha512-kO6LMoKY/cLAYEhXXtqLRaLIE6L/DagpFPrUZaLv3LsUa1/8Iza3HhwZcgN8eZ+weXnhv69eoclNUPohcCa/IQ==} peerDependencies: @@ -11857,6 +12742,9 @@ packages: globjoin@0.1.4: resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + glur@1.1.2: resolution: {integrity: sha512-l+8esYHTKOx2G/Aao4lEQ0bnHWg4fWtJbVoZZT9Knxi01pB8C80BR85nONLFwkkQoFRCmXY+BUcGZN3yZ2QsRA==} @@ -12179,6 +13067,11 @@ packages: engines: {node: '>=12'} hasBin: true + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -12187,6 +13080,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + icss-utils@4.1.1: resolution: {integrity: sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==} engines: {node: '>= 6'} @@ -12530,6 +13427,9 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -13005,6 +13905,9 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} + js-big-decimal@2.2.0: resolution: {integrity: sha512-qJFDTcgBGvuPzsck0jNm1puKvJQ3AL8J3bIyrvF1KfsbljOVj8N/o9Kbr8RXlBx1J8aapcRpMCiG6h1l6QgYhQ==} @@ -13012,9 +13915,15 @@ packages: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} engines: {node: '>=0.10.0'} + js-tiktoken@1.0.21: + resolution: {integrity: sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -13095,9 +14004,18 @@ packages: jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jsondiffpatch@0.6.0: + resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -13195,6 +14113,10 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + klona@2.0.5: resolution: {integrity: sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==} engines: {node: '>= 8'} @@ -13202,6 +14124,81 @@ packages: known-css-properties@0.29.0: resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==} + langchain@0.3.35: + resolution: {integrity: sha512-OkPstP43L3rgaAk72UAVcXy4BzJSiyzXfJsHRBTx9xD3rRtgrAu/jsWpMcsbFAoNO3iGerK+ULzkTzaBJBz6kg==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/anthropic': '*' + '@langchain/aws': '*' + '@langchain/cerebras': '*' + '@langchain/cohere': '*' + '@langchain/core': '>=0.3.58 <0.4.0' + '@langchain/deepseek': '*' + '@langchain/google-genai': '*' + '@langchain/google-vertexai': '*' + '@langchain/google-vertexai-web': '*' + '@langchain/groq': '*' + '@langchain/mistralai': '*' + '@langchain/ollama': '*' + '@langchain/xai': '*' + axios: '*' + cheerio: '*' + handlebars: ^4.7.8 + peggy: ^3.0.2 + typeorm: '*' + peerDependenciesMeta: + '@langchain/anthropic': + optional: true + '@langchain/aws': + optional: true + '@langchain/cerebras': + optional: true + '@langchain/cohere': + optional: true + '@langchain/deepseek': + optional: true + '@langchain/google-genai': + optional: true + '@langchain/google-vertexai': + optional: true + '@langchain/google-vertexai-web': + optional: true + '@langchain/groq': + optional: true + '@langchain/mistralai': + optional: true + '@langchain/ollama': + optional: true + '@langchain/xai': + optional: true + axios: + optional: true + cheerio: + optional: true + handlebars: + optional: true + peggy: + optional: true + typeorm: + optional: true + + langsmith@0.3.72: + resolution: {integrity: sha512-XjTonMq2fIebzV0BRlPx8mi+Ih/NsQT6W484hrW/pJYuq0aT5kpLtzQthVVmsXH8ZYYkgkbQ5Gh5Mz1qoCrAwg==} + peerDependencies: + '@opentelemetry/api': '*' + '@opentelemetry/exporter-trace-otlp-proto': '*' + '@opentelemetry/sdk-trace-base': '*' + openai: '*' + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@opentelemetry/exporter-trace-otlp-proto': + optional: true + '@opentelemetry/sdk-trace-base': + optional: true + openai: + optional: true + lazy-universal-dotenv@4.0.0: resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} engines: {node: '>=14.0.0'} @@ -13390,6 +14387,10 @@ packages: resolution: {integrity: sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==} hasBin: true + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -13522,6 +14523,9 @@ packages: lottie-web@5.9.6: resolution: {integrity: sha512-JFs7KsHwflugH5qIXBpB4905yC1Sub2MZWtl/elvO/QC6qj1ApqbUZJyjzJseJUtVpgiDaXQLjBlIJGS7UUUXA==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -13561,6 +14565,9 @@ packages: resolution: {integrity: sha512-KSZcJU49QZOlJSItaeIU3p8WoAvkTmD9fJqeahQXNu1iQ/kR0/mQLdbrK8JY9MY8f6AhJoMrihp1nu1xDbscSQ==} engines: {node: '>= 0.10'} + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magic-string@0.30.5: resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} @@ -13724,6 +14731,10 @@ packages: merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -13877,6 +14888,9 @@ packages: engines: {node: '>=10.0.0'} hasBin: true + mimetext@3.0.27: + resolution: {integrity: sha512-mUhWAsZD1N/K6dbN4+a5Yq78OPnYQw1ubOSMasBntsLQ2S7KVNlvDEA8dwpr4a7PszWMzeslKahAprtwYMgaBA==} + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -13893,6 +14907,11 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} + miniflare@4.20251001.0: + resolution: {integrity: sha512-OHd31D2LT8JH+85nVXClV0Z18jxirCohzKNAcZs/fgt4mIkUDtidX3VqR3ovAM0jWooNxrFhB9NSs3iDbiJF7Q==} + engines: {node: '>=18.0.0'} + hasBin: true + minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -13996,6 +15015,9 @@ packages: engines: {node: '>=10'} hasBin: true + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + mmdb-lib@2.0.2: resolution: {integrity: sha512-shi1I+fCPQonhTi7qyb6hr7hi87R7YS69FlfJiMFuJ12+grx0JyL56gLNzGTYXPU7EhAPkMLliGeyHer0K+AVA==} engines: {node: '>=10', npm: '>=6'} @@ -14051,6 +15073,10 @@ packages: murmurhash-js@1.0.0: resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -14077,6 +15103,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} + engines: {node: ^18 || >=20} + hasBin: true + napi-postinstall@0.3.2: resolution: {integrity: sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -14302,6 +15333,9 @@ packages: objectorarray@1.0.5: resolution: {integrity: sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==} + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + on-exit-leak-free@2.1.0: resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} @@ -14344,6 +15378,24 @@ packages: zod: optional: true + openai@5.12.2: + resolution: {integrity: sha512-xqzHHQch5Tws5PcKR2xsZGX9xtch+JQFz5zb14dGqlshmmDAFBFEWmeIpf7wVqWV+w7Emj7jRgkNJakyKE0tYQ==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + + openapi3-ts@4.5.0: + resolution: {integrity: sha512-jaL+HgTq2Gj5jRcfdutgRGLosCy/hT8sQf6VOy+P+g36cZOjI1iukdPnijC+4CmeRzg/jEllJUboEic2FhxhtQ==} + optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -14385,6 +15437,10 @@ packages: resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} engines: {node: '>=8'} + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -14429,6 +15485,18 @@ packages: resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} engines: {node: '>=18'} + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -14500,9 +15568,29 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + partyserver@0.0.72: + resolution: {integrity: sha512-mYkCQ6Q4KBIy4lFFuA6upmvNeD/FC+CQVTd4V3DYU6nsitKVI3NXxBrNNvmIxJLSwk3JQzYcEOPBkebB7ITVpQ==} + peerDependencies: + '@cloudflare/workers-types': ^4.20240729.0 + + partysocket@1.1.5: + resolution: {integrity: sha512-8uw9foq9bij4sKLCtTSHvyqMrMTQ5FJjrHc7BjoM2s95Vu7xYCN63ABpI7OZHC7ZMP5xaom/A+SsoFPXmTV6ZQ==} + pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + pastable@2.2.1: + resolution: {integrity: sha512-K4ClMxRKpgN4sXj6VIPPrvor/TMp2yPNCGtfhvV106C73SwefQ3FuegURsH7AQHpqu0WwbvKXRl1HQxF6qax9w==} + engines: {node: '>=14.x'} + peerDependencies: + react: '>=17' + xstate: '>=4.32.1' + peerDependenciesMeta: + react: + optional: true + xstate: + optional: true + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -14547,6 +15635,12 @@ packages: path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -14558,6 +15652,13 @@ packages: pathe@1.1.1: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + pbf@3.2.1: resolution: {integrity: sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==} hasBin: true @@ -14662,6 +15763,10 @@ packages: resolution: {integrity: sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==} hasBin: true + pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + engines: {node: '>=16.20.0'} + pkg-dir@3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} @@ -14678,6 +15783,9 @@ packages: resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} engines: {node: '>=14.16'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + playwright-core@1.45.0: resolution: {integrity: sha512-lZmHlFQ0VYSpAs43dRq1/nJ9G/6SiTI7VPqidld9TDefL9tX87bTKExWZZUF5PeRyqtXqd8fQi2qmfIedkwsNQ==} engines: {node: '>=18'} @@ -14848,6 +15956,24 @@ packages: peerDependencies: postcss: ^8.4 + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + postcss-loader@4.3.0: resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} engines: {node: '>= 10.13.0'} @@ -15160,6 +16286,10 @@ packages: resolution: {integrity: sha512-PitSiuxGiVFl0ItuhIfi3Sq1tcaMU4vlbPu1wv0qufTJGDjWthOOr4vYfFIs1xkbJFOQcfGczMXkr44kX5TDDg==} engines: {node: '>=15.0.0'} + posthog-node@4.18.0: + resolution: {integrity: sha512-XROs1h+DNatgKh/AlIlCtDxWzwrKdYDb2mOs58n4yN8BkGN9ewqeQwG5ApS4/IzwCb7HPttUkOVulkYatd2PIw==} + engines: {node: '>=15.0.0'} + posthtml-parser@0.11.0: resolution: {integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==} engines: {node: '>=12'} @@ -15196,6 +16326,11 @@ packages: engines: {node: '>=14'} hasBin: true + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + prettier@3.6.2: resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} @@ -15463,6 +16598,10 @@ packages: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} + raw-body@3.0.1: + resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + engines: {node: '>= 0.10'} + raw-loader@4.0.2: resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} engines: {node: '>= 10.13.0'} @@ -15974,6 +17113,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} @@ -16188,6 +17331,10 @@ packages: rope-sequence@1.3.3: resolution: {integrity: sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==} + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + rrweb-snapshot@2.0.0-alpha.18: resolution: {integrity: sha512-hBHZL/NfgQX6wO1D9mpwqFu1NJPpim+moIcKhFEjVTZVRUfCln+LOugRc4teVTCISYHN8Cw5e2iNTWCSm+SkoA==} @@ -16426,6 +17573,10 @@ packages: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + serialize-javascript@6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} @@ -16433,6 +17584,10 @@ packages: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -16473,6 +17628,10 @@ packages: shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -16497,6 +17656,9 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -16514,6 +17676,9 @@ packages: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} + simple-wcswidth@1.1.2: + resolution: {integrity: sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -16600,6 +17765,11 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions + space-separated-tokens@1.1.5: resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} @@ -16670,6 +17840,9 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} @@ -16683,10 +17856,17 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + stdin-discarder@0.2.2: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} + stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + store2@2.14.4: resolution: {integrity: sha512-srTItn1GOvyvOycgxjAnPA63FZNwy0PTyUBFMHRM+hVFltAeoh0LmNBz9SZqUS9mMqGk8rfyWyXn3GH5ReJ8Zw==} @@ -16813,6 +17993,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} @@ -16908,6 +18091,11 @@ packages: engines: {node: '>=8'} hasBin: true + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + superagent@9.0.2: resolution: {integrity: sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==} engines: {node: '>=14.18.0'} @@ -16921,6 +18109,10 @@ packages: engines: {node: '>=14.18.0'} deprecated: Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -16959,6 +18151,11 @@ packages: '@swc/core': ^1.2.147 webpack: '>=2' + swr@2.3.6: + resolution: {integrity: sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -17088,6 +18285,10 @@ packages: resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} engines: {node: '>=12.22'} + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -17111,13 +18312,31 @@ packages: resolution: {integrity: sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==} engines: {node: '>=12'} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + tinyqueue@2.0.3: resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + tldts-core@6.1.57: resolution: {integrity: sha512-lXnRhuQpx3zU9EONF9F7HfcRLvN1uRYUBIiKL+C/gehC/77XTU+Jye6ui86GA3rU6FjlJ0triD1Tkjt2F/2lEg==} @@ -17153,6 +18372,9 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} @@ -17252,6 +18474,9 @@ packages: ts-pattern@4.3.0: resolution: {integrity: sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==} + ts-pattern@5.8.0: + resolution: {integrity: sha512-kIjN2qmWiHnhgr5DAkAafF9fwb0T5OhMVSWrm8XEdTFnX6+wfXwYOFjeF86UZ54vduqiR7BfqScFmXSzSaH8oA==} + ts-toolbelt@9.6.0: resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} @@ -17260,6 +18485,16 @@ packages: engines: {node: '>=16.20.2'} hasBin: true + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: 5.2.2 + peerDependenciesMeta: + typescript: + optional: true + tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} @@ -17276,6 +18511,25 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsup@8.5.0: + resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: 5.2.2 + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + tsx@4.20.5: resolution: {integrity: sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==} engines: {node: '>=18.0.0'} @@ -17385,6 +18639,10 @@ packages: typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + typed-openapi@2.2.2: + resolution: {integrity: sha512-ONZDYZ2NvL4f2RXwvpf83pfaSiHpffIvQZurw0KyCUZ5EqZmCEjwoU5K7moRqnwKeQD9adWRHTRrVUMLOXajSA==} + hasBin: true + typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} @@ -17409,6 +18667,9 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} @@ -17431,10 +18692,17 @@ packages: resolution: {integrity: sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==} engines: {node: '>=18.17'} + undici@7.14.0: + resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} + engines: {node: '>=20.18.1'} + undici@7.8.0: resolution: {integrity: sha512-vFv1GA99b7eKO1HG/4RPu2Is3FBTWBrmzqzO0mz+rLxN3yXkE4mqRcb8g8fHxzX4blEysrNZLqg5RbJLqX5buA==} engines: {node: '>=20.18.1'} + unenv@2.0.0-rc.21: + resolution: {integrity: sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==} + unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -17642,6 +18910,10 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + uuid@8.0.0: resolution: {integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==} hasBin: true @@ -17685,6 +18957,50 @@ packages: vfile@4.2.1: resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite-tsconfig-paths@5.1.4: + resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@5.4.20: + resolution: {integrity: sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + vite@6.3.5: resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -17725,6 +19041,34 @@ packages: yaml: optional: true + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vm2@3.9.18: resolution: {integrity: sha512-iM7PchOElv6Uv6Q+0Hq7dcgDtWWT6SizYqVcvol+1WQc+E9HlgTCnPozbQNSP3yDV9oXHQOEQu530w2q/BCVZg==} engines: {node: '>=6.0'} @@ -17780,6 +19124,9 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -17863,6 +19210,9 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -17904,6 +19254,11 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + wicked-good-xpath@1.3.0: resolution: {integrity: sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==} @@ -17913,6 +19268,21 @@ packages: wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + workerd@1.20251001.0: + resolution: {integrity: sha512-oT/K4YWNhmwpVmGeaHNmF7mLRfgjszlVr7lJtpS4jx5khmxmMzWZEEQRrJEpgzeHP6DOq9qWLPNT0bjMK7TchQ==} + engines: {node: '>=16'} + hasBin: true + + wrangler@4.42.0: + resolution: {integrity: sha512-OZXiUSfGD66OVkncDbjZtqrsH6bWPRQMYc6RmMbkzYm/lEvJ8lvARKcqDgEyq8zDAgJAivlMQLyPtKQoVjQ/4g==} + engines: {node: '>=18.0.0'} + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^4.20251001.0 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + wrap-ansi@5.1.0: resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} engines: {node: '>=6'} @@ -17973,6 +19343,18 @@ packages: utf-8-validate: optional: true + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xdg-basedir@4.0.0: resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} engines: {node: '>=8'} @@ -18032,6 +19414,11 @@ packages: engines: {node: '>= 14'} hasBin: true + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@13.1.2: resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} @@ -18081,9 +19468,26 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} + youch-core@0.3.3: + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} + + youch@4.1.0-beta.10: + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} + + zod-to-json-schema@3.24.6: + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} + peerDependencies: + zod: ^3.24.1 + + zod@3.22.3: + resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + zod@3.24.1: resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zustand@4.5.6: resolution: {integrity: sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==} engines: {node: '>=12.7.0'} @@ -18111,6 +19515,52 @@ snapshots: '@adobe/css-tools@4.0.1': {} + '@ai-sdk/gateway@1.0.33(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.10(zod@3.25.76) + '@vercel/oidc': 3.0.1 + zod: 3.25.76 + + '@ai-sdk/provider-utils@2.2.8(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + nanoid: 3.3.11 + secure-json-parse: 2.7.0 + zod: 3.25.76 + + '@ai-sdk/provider-utils@3.0.10(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.6 + zod: 3.25.76 + + '@ai-sdk/provider@1.1.3': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@2.0.0': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/react@1.2.12(react@18.2.0)(zod@3.25.76)': + dependencies: + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + react: 18.2.0 + swr: 2.3.6(react@18.2.0) + throttleit: 2.1.0 + optionalDependencies: + zod: 3.25.76 + + '@ai-sdk/ui-utils@1.2.11(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + '@algolia/cache-browser-local-storage@4.22.1': dependencies: '@algolia/cache-common': 4.22.1 @@ -18231,6 +19681,33 @@ snapshots: resize-observer-polyfill: 1.5.1 throttle-debounce: 5.0.2 + '@apidevtools/json-schema-ref-parser@11.7.2': + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + js-yaml: 4.1.0 + + '@apidevtools/openapi-schemas@2.1.0': {} + + '@apidevtools/swagger-methods@3.0.2': {} + + '@apidevtools/swagger-parser@10.1.1(openapi-types@12.1.3)': + dependencies: + '@apidevtools/json-schema-ref-parser': 11.7.2 + '@apidevtools/openapi-schemas': 2.1.0 + '@apidevtools/swagger-methods': 3.0.2 + '@jsdevtools/ono': 7.1.3 + ajv: 8.17.1 + ajv-draft-04: 1.0.0(ajv@8.17.1) + call-me-maybe: 1.0.2 + openapi-types: 12.1.3 + + '@ark/schema@0.46.0': + dependencies: + '@ark/util': 0.46.0 + + '@ark/util@0.46.0': {} + '@aw-web-design/x-default-browser@1.4.126': dependencies: default-browser-id: 3.0.0 @@ -19267,7 +20744,7 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.24.7 - debug: 4.4.0 + debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -19278,7 +20755,7 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.24.7 - debug: 4.4.0 + debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -19289,7 +20766,7 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.24.7 - debug: 4.4.0 + debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -19300,7 +20777,7 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.24.7 - debug: 4.4.0 + debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -19311,7 +20788,7 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.24.7 - debug: 4.4.0 + debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -19322,7 +20799,7 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.24.7 - debug: 4.4.0 + debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -20741,11 +22218,15 @@ snapshots: clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 - pirates: 4.0.6 + pirates: 4.0.7 source-map-support: 0.5.21 '@babel/regjsgen@0.8.0': {} + '@babel/runtime-corejs3@7.28.4': + dependencies: + core-js-pure: 3.45.1 + '@babel/runtime@7.24.0': dependencies: regenerator-runtime: 0.14.1 @@ -20810,12 +22291,41 @@ snapshots: '@bufbuild/protobuf@2.3.0': {} + '@cfworker/json-schema@4.1.1': {} + '@clickhouse/client-common@1.12.0': {} '@clickhouse/client@1.12.0': dependencies: '@clickhouse/client-common': 1.12.0 + '@cloudflare/kv-asset-handler@0.4.0': + dependencies: + mime: 3.0.0 + + '@cloudflare/unenv-preset@2.7.6(unenv@2.0.0-rc.21)(workerd@1.20251001.0)': + dependencies: + unenv: 2.0.0-rc.21 + optionalDependencies: + workerd: 1.20251001.0 + + '@cloudflare/workerd-darwin-64@1.20251001.0': + optional: true + + '@cloudflare/workerd-darwin-arm64@1.20251001.0': + optional: true + + '@cloudflare/workerd-linux-64@1.20251001.0': + optional: true + + '@cloudflare/workerd-linux-arm64@1.20251001.0': + optional: true + + '@cloudflare/workerd-windows-64@1.20251001.0': + optional: true + + '@cloudflare/workers-types@4.20251004.0': {} + '@colors/colors@1.5.0': optional: true @@ -21170,150 +22680,294 @@ snapshots: dependencies: react: 18.2.0 + '@esbuild/aix-ppc64@0.21.5': + optional: true + '@esbuild/aix-ppc64@0.25.10': optional: true + '@esbuild/aix-ppc64@0.25.4': + optional: true + '@esbuild/android-arm64@0.18.20': optional: true + '@esbuild/android-arm64@0.21.5': + optional: true + '@esbuild/android-arm64@0.25.10': optional: true + '@esbuild/android-arm64@0.25.4': + optional: true + '@esbuild/android-arm@0.18.20': optional: true + '@esbuild/android-arm@0.21.5': + optional: true + '@esbuild/android-arm@0.25.10': optional: true + '@esbuild/android-arm@0.25.4': + optional: true + '@esbuild/android-x64@0.18.20': optional: true + '@esbuild/android-x64@0.21.5': + optional: true + '@esbuild/android-x64@0.25.10': optional: true + '@esbuild/android-x64@0.25.4': + optional: true + '@esbuild/darwin-arm64@0.18.20': optional: true + '@esbuild/darwin-arm64@0.21.5': + optional: true + '@esbuild/darwin-arm64@0.25.10': optional: true + '@esbuild/darwin-arm64@0.25.4': + optional: true + '@esbuild/darwin-x64@0.18.20': optional: true + '@esbuild/darwin-x64@0.21.5': + optional: true + '@esbuild/darwin-x64@0.25.10': optional: true + '@esbuild/darwin-x64@0.25.4': + optional: true + '@esbuild/freebsd-arm64@0.18.20': optional: true + '@esbuild/freebsd-arm64@0.21.5': + optional: true + '@esbuild/freebsd-arm64@0.25.10': optional: true + '@esbuild/freebsd-arm64@0.25.4': + optional: true + '@esbuild/freebsd-x64@0.18.20': optional: true + '@esbuild/freebsd-x64@0.21.5': + optional: true + '@esbuild/freebsd-x64@0.25.10': optional: true + '@esbuild/freebsd-x64@0.25.4': + optional: true + '@esbuild/linux-arm64@0.18.20': optional: true + '@esbuild/linux-arm64@0.21.5': + optional: true + '@esbuild/linux-arm64@0.25.10': optional: true + '@esbuild/linux-arm64@0.25.4': + optional: true + '@esbuild/linux-arm@0.18.20': optional: true + '@esbuild/linux-arm@0.21.5': + optional: true + '@esbuild/linux-arm@0.25.10': optional: true + '@esbuild/linux-arm@0.25.4': + optional: true + '@esbuild/linux-ia32@0.18.20': optional: true + '@esbuild/linux-ia32@0.21.5': + optional: true + '@esbuild/linux-ia32@0.25.10': optional: true + '@esbuild/linux-ia32@0.25.4': + optional: true + '@esbuild/linux-loong64@0.18.20': optional: true + '@esbuild/linux-loong64@0.21.5': + optional: true + '@esbuild/linux-loong64@0.25.10': optional: true + '@esbuild/linux-loong64@0.25.4': + optional: true + '@esbuild/linux-mips64el@0.18.20': optional: true + '@esbuild/linux-mips64el@0.21.5': + optional: true + '@esbuild/linux-mips64el@0.25.10': optional: true + '@esbuild/linux-mips64el@0.25.4': + optional: true + '@esbuild/linux-ppc64@0.18.20': optional: true + '@esbuild/linux-ppc64@0.21.5': + optional: true + '@esbuild/linux-ppc64@0.25.10': optional: true + '@esbuild/linux-ppc64@0.25.4': + optional: true + '@esbuild/linux-riscv64@0.18.20': optional: true + '@esbuild/linux-riscv64@0.21.5': + optional: true + '@esbuild/linux-riscv64@0.25.10': optional: true + '@esbuild/linux-riscv64@0.25.4': + optional: true + '@esbuild/linux-s390x@0.18.20': optional: true + '@esbuild/linux-s390x@0.21.5': + optional: true + '@esbuild/linux-s390x@0.25.10': optional: true + '@esbuild/linux-s390x@0.25.4': + optional: true + '@esbuild/linux-x64@0.18.20': optional: true + '@esbuild/linux-x64@0.21.5': + optional: true + '@esbuild/linux-x64@0.25.10': optional: true + '@esbuild/linux-x64@0.25.4': + optional: true + '@esbuild/netbsd-arm64@0.25.10': optional: true + '@esbuild/netbsd-arm64@0.25.4': + optional: true + '@esbuild/netbsd-x64@0.18.20': optional: true + '@esbuild/netbsd-x64@0.21.5': + optional: true + '@esbuild/netbsd-x64@0.25.10': optional: true + '@esbuild/netbsd-x64@0.25.4': + optional: true + '@esbuild/openbsd-arm64@0.25.10': optional: true + '@esbuild/openbsd-arm64@0.25.4': + optional: true + '@esbuild/openbsd-x64@0.18.20': optional: true + '@esbuild/openbsd-x64@0.21.5': + optional: true + '@esbuild/openbsd-x64@0.25.10': optional: true + '@esbuild/openbsd-x64@0.25.4': + optional: true + '@esbuild/openharmony-arm64@0.25.10': optional: true '@esbuild/sunos-x64@0.18.20': optional: true + '@esbuild/sunos-x64@0.21.5': + optional: true + '@esbuild/sunos-x64@0.25.10': optional: true + '@esbuild/sunos-x64@0.25.4': + optional: true + '@esbuild/win32-arm64@0.18.20': optional: true + '@esbuild/win32-arm64@0.21.5': + optional: true + '@esbuild/win32-arm64@0.25.10': optional: true + '@esbuild/win32-arm64@0.25.4': + optional: true + '@esbuild/win32-ia32@0.18.20': optional: true + '@esbuild/win32-ia32@0.21.5': + optional: true + '@esbuild/win32-ia32@0.25.10': optional: true + '@esbuild/win32-ia32@0.25.4': + optional: true + '@esbuild/win32-x64@0.18.20': optional: true + '@esbuild/win32-x64@0.21.5': + optional: true + '@esbuild/win32-x64@0.25.10': optional: true + '@esbuild/win32-x64@0.25.4': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 @@ -21465,6 +23119,81 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.4.5 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -21491,7 +23220,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.18.8 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -21500,7 +23229,7 @@ snapshots: '@jest/console@30.0.5': dependencies: '@jest/types': 30.0.5 - '@types/node': 22.15.17 + '@types/node': 22.18.8 chalk: 4.1.2 jest-message-util: 30.0.5 jest-util: 30.0.5 @@ -21513,14 +23242,49 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.18.8 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.15.17)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)) + jest-config: 29.7.0(@types/node@22.18.8)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/core@29.7.0(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.18.8 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@22.18.8)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -21549,14 +23313,14 @@ snapshots: '@jest/test-result': 30.0.5 '@jest/transform': 30.0.5 '@jest/types': 30.0.5 - '@types/node': 22.15.17 + '@types/node': 22.18.8 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.3.0 exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.0.5 - jest-config: 30.0.5(@types/node@22.15.17)(esbuild-register@3.5.0(esbuild@0.25.10))(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)) + jest-config: 30.0.5(@types/node@22.18.8)(esbuild-register@3.5.0(esbuild@0.25.10))(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)) jest-haste-map: 30.0.5 jest-message-util: 30.0.5 jest-regex-util: 30.0.1 @@ -21587,14 +23351,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.18.8 jest-mock: 29.7.0 '@jest/environment@30.0.5': dependencies: '@jest/fake-timers': 30.0.5 '@jest/types': 30.0.5 - '@types/node': 22.15.17 + '@types/node': 22.18.8 jest-mock: 30.0.5 '@jest/expect-utils@29.7.0': @@ -21623,7 +23387,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.15.17 + '@types/node': 22.18.8 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -21632,7 +23396,7 @@ snapshots: dependencies: '@jest/types': 30.0.5 '@sinonjs/fake-timers': 13.0.5 - '@types/node': 22.15.17 + '@types/node': 22.18.8 jest-message-util: 30.0.5 jest-mock: 30.0.5 jest-util: 30.0.5 @@ -21659,7 +23423,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 jest-regex-util: 30.0.1 '@jest/reporters@29.7.0': @@ -21670,7 +23434,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.15.17 + '@types/node': 22.18.8 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -21699,7 +23463,7 @@ snapshots: '@jest/transform': 30.0.5 '@jest/types': 30.0.5 '@jridgewell/trace-mapping': 0.3.29 - '@types/node': 22.15.17 + '@types/node': 22.18.8 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit-x: 0.2.2 @@ -21819,7 +23583,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/yargs': 17.0.16 chalk: 4.1.2 @@ -21829,7 +23593,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -21857,6 +23621,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.4': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.1 @@ -21870,16 +23636,52 @@ snapshots: '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.5 '@js-sdsl/ordered-map@4.4.2': {} + '@jsdevtools/ono@7.1.3': {} + '@jspm/core@2.0.1': {} '@juggle/resize-observer@3.4.0': {} '@kurkle/color@0.3.2': {} + '@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.0)(zod@3.25.76))': + dependencies: + '@cfworker/json-schema': 4.1.1 + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.21 + langsmith: 0.3.72(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.0)(zod@3.25.76)) + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + + '@langchain/openai@0.6.14(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.0)(zod@3.25.76)))(ws@8.18.0)': + dependencies: + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.0)(zod@3.25.76)) + js-tiktoken: 1.0.21 + openai: 5.12.2(ws@8.18.0)(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - ws + + '@langchain/textsplitters@0.1.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.0)(zod@3.25.76)))': + dependencies: + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.0)(zod@3.25.76)) + js-tiktoken: 1.0.21 + '@lezer/common@1.2.3': {} '@lezer/lr@1.4.2': @@ -21975,6 +23777,23 @@ snapshots: '@lezer/lr': 1.4.2 json5: 2.2.3 + '@modelcontextprotocol/sdk@1.19.1': + dependencies: + ajv: 6.12.6 + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.1.0 + express-rate-limit: 7.5.1(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.1 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - supports-color + '@monaco-editor/loader@1.4.0(monaco-editor@0.49.0)': dependencies: monaco-editor: 0.49.0 @@ -22015,7 +23834,7 @@ snapshots: '@open-draft/until': 1.0.3 '@types/debug': 4.1.7 '@xmldom/xmldom': 0.8.6 - debug: 4.4.0 + debug: 4.4.3 headers-polyfill: 3.2.5 outvariant: 1.4.0 strict-event-emitter: 0.2.8 @@ -23617,6 +25436,18 @@ snapshots: type-fest: 4.41.0 webpack-hot-middleware: 2.25.4 + '@poppinss/colors@4.1.5': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.6.4': + dependencies: + '@poppinss/colors': 4.1.5 + '@sindresorhus/is': 7.1.0 + supports-color: 10.2.2 + + '@poppinss/exception@1.2.2': {} + '@posthog/core@1.2.2': {} '@posthog/icons@0.33.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -24873,7 +26704,7 @@ snapshots: '@segment/a1-notation': 2.1.4 '@segment/actions-core': 3.153.0(encoding@0.1.13) '@segment/actions-shared': 1.134.0(encoding@0.1.13) - '@types/node': 22.15.17 + '@types/node': 22.18.8 ajv-formats: 2.1.1(ajv@8.12.0) aws4: 1.13.2 cheerio: 1.0.0 @@ -24900,7 +26731,7 @@ snapshots: '@segment/action-emitters': 1.3.6 '@segment/ajv-human-errors': 2.15.0(ajv@8.12.0) '@segment/destination-subscriptions': 3.37.0 - '@types/node': 22.15.17 + '@types/node': 22.18.8 aggregate-error: 3.1.0 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) @@ -24941,10 +26772,20 @@ snapshots: '@sideway/pinpoint@2.0.0': {} + '@sinclair/typebox-codegen@0.11.1': + dependencies: + '@sinclair/typebox': 0.33.22 + prettier: 2.8.8 + typescript: 5.2.2 + '@sinclair/typebox@0.27.8': {} + '@sinclair/typebox@0.33.22': {} + '@sinclair/typebox@0.34.38': {} + '@sindresorhus/is@7.1.0': {} + '@sindresorhus/merge-streams@2.3.0': {} '@sinonjs/commons@3.0.1': @@ -25543,6 +27384,8 @@ snapshots: '@smithy/types': 3.7.2 tslib: 2.8.1 + '@speed-highlight/core@1.2.7': {} + '@standard-schema/spec@1.0.0': {} '@storybook/addon-a11y@7.6.4': @@ -25871,7 +27714,7 @@ snapshots: '@storybook/node-logger': 7.6.4 '@storybook/types': 7.6.4 '@types/cross-spawn': 6.0.2 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 globby: 11.1.0 jscodeshift: 0.15.1(@babel/preset-env@7.23.5(@babel/core@7.26.0)) lodash: 4.17.21 @@ -26167,7 +28010,7 @@ snapshots: '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.2.2)(webpack@5.88.2)': dependencies: - debug: 4.4.0 + debug: 4.4.3 endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 @@ -26292,7 +28135,7 @@ snapshots: commander: 9.4.1 expect-playwright: 0.8.0 glob: 10.4.5 - jest: 29.7.0(@types/node@22.15.17)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)) + jest: 29.7.0(@types/node@22.18.8)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2)) jest-circus: 29.7.0 jest-environment-node: 29.7.0 jest-junit: 16.0.0 @@ -26860,7 +28703,7 @@ snapshots: '@types/adm-zip@0.4.34': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/aria-query@4.2.2': {} @@ -26921,14 +28764,18 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/bunyan@1.8.11': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/caseless@0.12.5': {} + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + '@types/chance@1.1.7': {} '@types/chart.js@2.9.37': @@ -26947,7 +28794,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/cookie@0.4.1': {} @@ -26955,11 +28802,11 @@ snapshots: '@types/cors@2.8.19': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/cross-spawn@6.0.2': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/css-font-loading-module@0.0.7': {} @@ -27109,8 +28956,12 @@ snapshots: dependencies: '@types/ms': 0.7.31 + '@types/deep-eql@4.0.2': {} + '@types/detect-port@1.3.3': {} + '@types/diff-match-patch@1.0.36': {} + '@types/doctrine@0.0.3': {} '@types/doctrine@0.0.9': {} @@ -27121,6 +28972,10 @@ snapshots: dependencies: '@types/trusted-types': 2.0.4 + '@types/dotenv@6.1.1': + dependencies: + '@types/node': 22.18.8 + '@types/ejs@3.1.2': {} '@types/emscripten@1.39.7': {} @@ -27145,7 +29000,7 @@ snapshots: '@types/express-serve-static-core@4.17.43': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -27171,7 +29026,7 @@ snapshots: '@types/graceful-fs@4.1.6': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/hast@2.3.4': dependencies: @@ -27193,7 +29048,7 @@ snapshots: '@types/ioredis@4.28.10': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/istanbul-lib-coverage@2.0.4': {} @@ -27231,7 +29086,7 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/tough-cookie': 4.0.2 parse5: 7.1.2 @@ -27242,11 +29097,11 @@ snapshots: '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 0.7.31 - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/kafkajs-snappy@1.0.0': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/katex@0.16.7': {} @@ -27325,7 +29180,7 @@ snapshots: '@types/memcached@2.2.10': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/methods@1.1.4': {} @@ -27341,16 +29196,16 @@ snapshots: '@types/mysql@2.15.27': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/node-fetch@2.6.4': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 form-data: 3.0.1 '@types/node-schedule@2.1.0': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/node@18.18.4': {} @@ -27358,15 +29213,19 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/node@22.18.8': + dependencies: + undici-types: 6.21.0 + '@types/nodemailer@6.4.17': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/normalize-package-data@2.4.1': {} '@types/oracledb@6.5.2': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/papaparse@5.3.8': dependencies: @@ -27382,13 +29241,13 @@ snapshots: '@types/pg@8.15.4': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 pg-protocol: 1.6.0 pg-types: 2.2.0 '@types/pg@8.6.6': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 pg-protocol: 1.6.0 pg-types: 2.2.0 @@ -27455,7 +29314,7 @@ snapshots: '@types/redis@2.8.32': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/redlock@4.0.4': dependencies: @@ -27466,12 +29325,14 @@ snapshots: '@types/request@2.48.13': dependencies: '@types/caseless': 0.12.5 - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/tough-cookie': 4.0.2 form-data: 2.5.5 '@types/resolve@1.20.6': {} + '@types/retry@0.12.0': {} + '@types/scheduler@0.16.2': {} '@types/semver@7.5.5': {} @@ -27479,21 +29340,21 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/serve-static@1.15.5': dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/set-cookie-parser@2.4.2': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/snowflake-sdk@1.6.12': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 generic-pool: 3.9.0 '@types/stack-utils@2.0.1': {} @@ -27504,7 +29365,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 22.15.17 + '@types/node': 22.18.8 form-data: 4.0.1 '@types/supercluster@7.1.2': @@ -27520,11 +29381,11 @@ snapshots: '@types/tar-stream@2.2.2': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/tedious@4.0.14': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/testing-library__jest-dom@5.14.5': dependencies: @@ -27549,7 +29410,7 @@ snapshots: '@types/wait-on@5.3.1': dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@types/yargs-parser@21.0.0': {} @@ -27605,7 +29466,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.1.1(typescript@5.2.2) '@typescript-eslint/utils': 7.1.1(eslint@8.57.0)(typescript@5.2.2) - debug: 4.4.0 + debug: 4.4.3 eslint: 8.57.0 ts-api-utils: 1.0.2(typescript@5.2.2) optionalDependencies: @@ -27619,7 +29480,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.1.1 '@typescript-eslint/visitor-keys': 7.1.1 - debug: 4.4.0 + debug: 4.4.3 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -27710,7 +29571,9 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-react@4.7.0(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(less@3.13.1)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.7.0))': + '@vercel/oidc@3.0.1': {} + + '@vitejs/plugin-react@4.7.0(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(less@3.13.1)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) @@ -27718,10 +29581,52 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(less@3.13.1)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.7.0) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(less@3.13.1)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - supports-color + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@22.18.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.19 + optionalDependencies: + vite: 6.3.5(@types/node@22.18.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.8.1) + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.1.0 + + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.19 + pathe: 2.0.3 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.4 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + '@webassemblyjs/ast@1.11.6': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 @@ -27879,10 +29784,15 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + acorn-globals@7.0.1: dependencies: - acorn: 8.11.2 - acorn-walk: 8.2.0 + acorn: 8.15.0 + acorn-walk: 8.3.2 acorn-import-assertions@1.9.0(acorn@8.11.2): dependencies: @@ -27904,12 +29814,16 @@ snapshots: acorn-walk@8.2.0: {} + acorn-walk@8.3.2: {} + acorn@7.4.1: {} acorn@8.10.0: {} acorn@8.11.2: {} + acorn@8.14.0: {} + acorn@8.15.0: {} address@1.2.2: {} @@ -27918,7 +29832,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -27926,28 +29840,71 @@ snapshots: agentkeepalive@4.3.0: dependencies: - debug: 4.4.0 + debug: 4.4.3 depd: 2.0.0 humanize-ms: 1.2.1 transitivePeerDependencies: - supports-color + agents@0.0.113(@cloudflare/workers-types@4.20251004.0)(react@18.2.0): + dependencies: + '@modelcontextprotocol/sdk': 1.19.1 + ai: 4.3.19(react@18.2.0)(zod@3.25.76) + cron-schedule: 5.0.4 + mimetext: 3.0.27 + nanoid: 5.1.6 + partyserver: 0.0.72(@cloudflare/workers-types@4.20251004.0) + partysocket: 1.1.5 + react: 18.2.0 + zod: 3.25.76 + transitivePeerDependencies: + - '@cloudflare/workers-types' + - supports-color + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 + ai@4.3.19(react@18.2.0)(zod@3.25.76): + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/react': 1.2.12(react@18.2.0)(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + jsondiffpatch: 0.6.0 + zod: 3.25.76 + optionalDependencies: + react: 18.2.0 + + ai@5.0.60(zod@3.25.76): + dependencies: + '@ai-sdk/gateway': 1.0.33(zod@3.25.76) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.10(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + zod: 3.25.76 + + ajv-draft-04@1.0.0(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + ajv-formats@2.1.1(ajv@8.12.0): optionalDependencies: ajv: 8.12.0 + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - ajv-keywords@5.1.0(ajv@8.12.0): + ajv-keywords@5.1.0(ajv@8.17.1): dependencies: - ajv: 8.12.0 + ajv: 8.17.1 fast-deep-equal: 3.1.3 ajv@6.12.6: @@ -27964,6 +29921,13 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + algoliasearch-helper@3.16.2(algoliasearch@4.22.1): dependencies: '@algolia/events': 4.0.1 @@ -28018,8 +29982,6 @@ snapshots: ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} - ansi-styles@6.2.3: {} antd@5.26.0(date-fns@2.29.3)(luxon@3.5.0)(moment@2.29.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): @@ -28111,6 +30073,11 @@ snapshots: dependencies: deep-equal: 2.1.0 + arktype@2.1.20: + dependencies: + '@ark/schema': 0.46.0 + '@ark/util': 0.46.0 + arr-union@3.1.0: {} array-buffer-byte-length@1.0.0: @@ -28195,6 +30162,8 @@ snapshots: object.assign: 4.1.7 util: 0.12.5 + assertion-error@2.0.1: {} + assign-symbols@1.0.0: {} ast-types@0.16.1: @@ -28258,14 +30227,6 @@ snapshots: axe-core@4.5.1: {} - axios@1.7.9: - dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.1 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - axios@1.9.0: dependencies: follow-redirects: 1.15.9 @@ -28561,6 +30522,8 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + blake3-wasm@2.1.5: {} + bn.js@4.12.1: {} bn.js@5.2.1: {} @@ -28582,6 +30545,20 @@ snapshots: transitivePeerDependencies: - supports-color + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.1 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + boolbase@1.0.0: {} bowser@2.11.0: {} @@ -28715,6 +30692,11 @@ snapshots: buildcheck@0.0.6: optional: true + bundle-require@5.1.0(esbuild@0.25.10): + dependencies: + esbuild: 0.25.10 + load-tsconfig: 0.2.5 + bytes@3.0.0: {} bytes@3.1.2: {} @@ -28728,6 +30710,8 @@ snapshots: bytewise-core: 1.2.3 typewise: 1.0.3 + cac@6.7.14: {} + cacache@18.0.4: dependencies: '@npmcli/fs': 3.1.0 @@ -28796,6 +30780,8 @@ snapshots: call-bind-apply-helpers: 1.0.1 get-intrinsic: 1.2.7 + call-me-maybe@1.0.2: {} + callsites@3.1.0: {} camel-case@4.1.2: @@ -28829,6 +30815,14 @@ snapshots: ccount@1.1.0: {} + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + chalk-template@1.1.0: dependencies: chalk: 5.4.1 @@ -28907,6 +30901,8 @@ snapshots: chartjs-plugin-trendline@2.1.2: {} + check-error@2.1.1: {} + cheerio-select@2.1.0: dependencies: boolbase: 1.0.0 @@ -28942,6 +30938,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + chownr@1.1.4: {} chownr@2.0.0: {} @@ -29069,6 +31069,11 @@ snapshots: color-convert: 1.9.3 color-string: 1.9.1 + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + colord@2.9.3: {} colorette@2.0.19: {} @@ -29165,6 +31170,8 @@ snapshots: tree-kill: 1.2.2 yargs: 13.3.2 + confbox@0.1.8: {} + configstore@5.0.1: dependencies: dot-prop: 5.3.0 @@ -29174,12 +31181,22 @@ snapshots: write-file-atomic: 3.0.3 xdg-basedir: 4.0.0 + consola@3.4.2: {} + + console-table-printer@2.14.6: + dependencies: + simple-wcswidth: 1.1.2 + constants-browserify@1.0.0: {} content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + content-type@1.0.5: {} convert-source-map@1.9.0: {} @@ -29194,6 +31211,8 @@ snapshots: cookie@0.5.0: {} + cookie@0.7.2: {} + cookie@1.0.2: {} cookiejar@2.1.4: {} @@ -29212,6 +31231,8 @@ snapshots: core-js-pure@3.32.0: {} + core-js-pure@3.45.1: {} + core-js@3.40.0: {} core-js@3.45.1: {} @@ -29296,6 +31317,21 @@ snapshots: - supports-color - ts-node + create-jest@29.7.0(@types/node@22.18.8)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@22.18.8)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + create-require@1.1.1: {} crelt@1.0.5: {} @@ -29304,6 +31340,8 @@ snapshots: dependencies: luxon: 3.5.0 + cron-schedule@5.0.4: {} + cross-fetch@3.2.0(encoding@0.1.13): dependencies: node-fetch: 2.7.0(encoding@0.1.13) @@ -29316,6 +31354,12 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + crypt@0.0.2: {} crypto-browserify@3.12.1: @@ -29742,6 +31786,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 @@ -29763,6 +31811,8 @@ snapshots: dedent@1.6.0: {} + deep-eql@5.0.2: {} + deep-equal@2.1.0: dependencies: call-bind: 1.0.8 @@ -29818,7 +31868,7 @@ snapshots: has-property-descriptors: 1.0.1 object-keys: 1.1.1 - defu@6.1.2: {} + defu@6.1.4: {} del@6.1.1: dependencies: @@ -29869,7 +31919,7 @@ snapshots: detect-port@1.5.1: dependencies: address: 1.2.2 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -29882,6 +31932,8 @@ snapshots: asap: 2.0.6 wrappy: 1.0.2 + diff-match-patch@1.0.5: {} + diff-sequences@29.6.3: {} diff@4.0.2: {} @@ -30127,6 +32179,8 @@ snapshots: dependencies: is-arrayish: 0.2.1 + error-stack-parser-es@1.0.5: {} + error-stack-parser@2.1.4: dependencies: stackframe: 1.3.4 @@ -30190,6 +32244,8 @@ snapshots: es-module-lexer@1.4.1: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -30235,14 +32291,14 @@ snapshots: esbuild-register@3.5.0(esbuild@0.18.20): dependencies: - debug: 4.4.0 + debug: 4.4.3 esbuild: 0.18.20 transitivePeerDependencies: - supports-color esbuild-register@3.5.0(esbuild@0.25.10): dependencies: - debug: 4.4.0 + debug: 4.4.3 esbuild: 0.25.10 transitivePeerDependencies: - supports-color @@ -30285,6 +32341,32 @@ snapshots: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + esbuild@0.25.10: optionalDependencies: '@esbuild/aix-ppc64': 0.25.10 @@ -30314,6 +32396,34 @@ snapshots: '@esbuild/win32-ia32': 0.25.10 '@esbuild/win32-x64': 0.25.10 + esbuild@0.25.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 + escalade@3.1.1: {} escalade@3.2.0: {} @@ -30498,12 +32608,20 @@ snapshots: estraverse@5.3.0: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + esutils@2.0.3: {} etag@1.8.1: {} + event-target-polyfill@0.0.4: {} + event-target-shim@5.0.1: {} + eventemitter3@4.0.7: {} + eventemitter3@5.0.1: {} events@1.1.1: {} @@ -30512,6 +32630,12 @@ snapshots: eventsource-parser@3.0.0: {} + eventsource-parser@3.0.6: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.6 + evp_bytestokey@1.0.3: dependencies: md5.js: 1.3.5 @@ -30519,7 +32643,7 @@ snapshots: execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -30543,6 +32667,8 @@ snapshots: exenv@1.2.2: {} + exit-hook@2.2.1: {} + exit-x@0.2.2: {} exit@0.1.2: {} @@ -30553,6 +32679,8 @@ snapshots: expect-playwright@0.8.0: {} + expect-type@1.2.2: {} + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 @@ -30574,6 +32702,10 @@ snapshots: expr-eval@2.0.2: {} + express-rate-limit@7.5.1(express@5.1.0): + dependencies: + express: 5.1.0 + express@4.18.2: dependencies: accepts: 1.3.8 @@ -30610,6 +32742,40 @@ snapshots: transitivePeerDependencies: - supports-color + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.1 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + exsolve@1.0.7: {} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -30684,6 +32850,8 @@ snapshots: fast-text-encoding@1.0.6: {} + fast-uri@3.1.0: {} + fast-xml-parser@4.4.1: dependencies: strnum: 1.0.5 @@ -30769,6 +32937,17 @@ snapshots: transitivePeerDependencies: - supports-color + finalhandler@2.1.0: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + find-cache-dir@2.1.0: dependencies: commondir: 1.0.1 @@ -30799,7 +32978,7 @@ snapshots: dependencies: chalk: 4.1.2 commander: 5.1.0 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -30822,6 +33001,12 @@ snapshots: locate-path: 7.2.0 path-exists: 5.0.0 + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.19 + mlly: 1.8.0 + rollup: 4.45.1 + flat-cache@3.2.0: dependencies: flatted: 3.2.9 @@ -30840,12 +33025,12 @@ snapshots: foreground-child@2.0.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 3.0.7 foreground-child@3.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 fork-ts-checker-webpack-plugin@8.0.0(typescript@5.2.2)(webpack@5.88.2): @@ -30909,6 +33094,8 @@ snapshots: fresh@0.5.2: {} + fresh@2.0.0: {} + frimousse@0.3.0(react@18.2.0)(typescript@5.2.2): dependencies: react: 18.2.0 @@ -31070,7 +33257,7 @@ snapshots: giget@1.1.2: dependencies: colorette: 2.0.20 - defu: 6.1.2 + defu: 6.1.4 https-proxy-agent: 5.0.1 mri: 1.2.0 node-fetch-native: 1.2.0 @@ -31191,6 +33378,8 @@ snapshots: globjoin@0.1.4: {} + globrex@0.1.2: {} + glur@1.1.2: {} google-auth-library@7.14.1(encoding@0.1.13): @@ -31528,35 +33717,35 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color https-proxy-agent@4.0.0: dependencies: agent-base: 5.1.1 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -31572,6 +33761,8 @@ snapshots: husky@7.0.4: {} + husky@9.1.7: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -31580,6 +33771,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + icss-utils@4.1.1: dependencies: postcss: 7.0.39 @@ -31892,6 +34087,8 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-promise@4.0.0: {} + is-regex@1.1.4: dependencies: call-bind: 1.0.5 @@ -32026,7 +34223,7 @@ snapshots: istanbul-lib-processinfo@2.0.3: dependencies: archy: 1.0.0 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 istanbul-lib-coverage: 3.2.0 p-map: 3.0.0 rimraf: 3.0.2 @@ -32040,7 +34237,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.4.0 + debug: 4.4.3 istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: @@ -32049,7 +34246,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.29 - debug: 4.4.0 + debug: 4.4.3 istanbul-lib-coverage: 3.2.0 transitivePeerDependencies: - supports-color @@ -32101,7 +34298,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.18.8 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -32127,7 +34324,7 @@ snapshots: '@jest/expect': 30.0.5 '@jest/test-result': 30.0.5 '@jest/types': 30.0.5 - '@types/node': 22.15.17 + '@types/node': 22.18.8 chalk: 4.1.2 co: 4.6.0 dedent: 1.6.0 @@ -32166,6 +34363,25 @@ snapshots: - supports-color - ts-node + jest-cli@29.7.0(@types/node@22.18.8)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@22.18.8)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2)) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@22.18.8)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + jest-cli@30.0.5(@types/node@22.15.17)(esbuild-register@3.5.0(esbuild@0.25.10))(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)): dependencies: '@jest/core': 30.0.5(esbuild-register@3.5.0(esbuild@0.25.10))(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)) @@ -32216,6 +34432,68 @@ snapshots: - babel-plugin-macros - supports-color + jest-config@29.7.0(@types/node@22.18.8)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)): + dependencies: + '@babel/core': 7.28.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.0) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.18.8 + ts-node: 10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@22.18.8)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2)): + dependencies: + '@babel/core': 7.28.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.0) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.18.8 + ts-node: 10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + jest-config@30.0.5(@types/node@22.15.17)(esbuild-register@3.5.0(esbuild@0.25.10))(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)): dependencies: '@babel/core': 7.28.0 @@ -32250,6 +34528,40 @@ snapshots: - babel-plugin-macros - supports-color + jest-config@30.0.5(@types/node@22.18.8)(esbuild-register@3.5.0(esbuild@0.25.10))(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)): + dependencies: + '@babel/core': 7.28.0 + '@jest/get-type': 30.0.1 + '@jest/pattern': 30.0.1 + '@jest/test-sequencer': 30.0.5 + '@jest/types': 30.0.5 + babel-jest: 30.0.5(@babel/core@7.28.0) + chalk: 4.1.2 + ci-info: 4.3.0 + deepmerge: 4.3.1 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-circus: 30.0.5 + jest-docblock: 30.0.1 + jest-environment-node: 30.0.5 + jest-regex-util: 30.0.1 + jest-resolve: 30.0.5 + jest-runner: 30.0.5 + jest-util: 30.0.5 + jest-validate: 30.0.5 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 30.0.5 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.18.8 + esbuild-register: 3.5.0(esbuild@0.25.10) + ts-node: 10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + jest-diff@29.7.0: dependencies: chalk: 4.1.2 @@ -32308,7 +34620,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.18.8 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -32317,7 +34629,7 @@ snapshots: '@jest/environment': 30.0.5 '@jest/fake-timers': 30.0.5 '@jest/types': 30.0.5 - '@types/node': 22.15.17 + '@types/node': 22.18.8 jest-mock: 30.0.5 jest-util: 30.0.5 jest-validate: 30.0.5 @@ -32328,7 +34640,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.6 - '@types/node': 22.15.17 + '@types/node': 22.18.8 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -32343,7 +34655,7 @@ snapshots: jest-haste-map@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 22.15.17 + '@types/node': 22.18.8 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -32426,19 +34738,19 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.18.8 jest-util: 29.7.0 jest-mock@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 22.15.17 + '@types/node': 22.18.8 jest-util: 30.0.5 jest-playwright-preset@4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0): dependencies: expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@22.15.17)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)) + jest: 29.7.0(@types/node@22.18.8)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2)) jest-circus: 29.7.0 jest-environment-node: 29.7.0 jest-process-manager: 0.4.0 @@ -32523,7 +34835,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.18.8 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -32549,7 +34861,7 @@ snapshots: '@jest/test-result': 30.0.5 '@jest/transform': 30.0.5 '@jest/types': 30.0.5 - '@types/node': 22.15.17 + '@types/node': 22.18.8 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -32578,7 +34890,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.18.8 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.1 @@ -32605,7 +34917,7 @@ snapshots: '@jest/test-result': 30.0.5 '@jest/transform': 30.0.5 '@jest/types': 30.0.5 - '@types/node': 22.15.17 + '@types/node': 22.18.8 chalk: 4.1.2 cjs-module-lexer: 2.1.0 collect-v8-coverage: 1.0.2 @@ -32681,7 +34993,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.18.8 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -32690,7 +35002,7 @@ snapshots: jest-util@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 22.15.17 + '@types/node': 22.18.8 chalk: 4.1.2 ci-info: 4.3.0 graceful-fs: 4.2.11 @@ -32718,7 +35030,7 @@ snapshots: dependencies: ansi-escapes: 6.0.0 chalk: 5.4.1 - jest: 29.7.0(@types/node@22.15.17)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)) + jest: 29.7.0(@types/node@22.18.8)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2)) jest-regex-util: 29.6.3 jest-watcher: 29.7.0 slash: 5.1.0 @@ -32729,7 +35041,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.17 + '@types/node': 22.18.8 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -32740,7 +35052,7 @@ snapshots: dependencies: '@jest/test-result': 30.0.5 '@jest/types': 30.0.5 - '@types/node': 22.15.17 + '@types/node': 22.18.8 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -32749,20 +35061,20 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@30.0.5: dependencies: - '@types/node': 22.15.17 + '@types/node': 22.18.8 '@ungap/structured-clone': 1.3.0 jest-util: 30.0.5 merge-stream: 2.0.0 @@ -32780,6 +35092,18 @@ snapshots: - supports-color - ts-node + jest@29.7.0(@types/node@22.18.8)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2)) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@22.18.8)(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + jest@30.0.5(@types/node@22.15.17)(esbuild-register@3.5.0(esbuild@0.25.10))(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)): dependencies: '@jest/core': 30.0.5(esbuild-register@3.5.0(esbuild@0.25.10))(ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.15.17)(typescript@5.2.2)) @@ -32807,12 +35131,20 @@ snapshots: joycon@3.1.1: {} + js-base64@3.7.8: {} + js-big-decimal@2.2.0: {} js-levenshtein@1.1.6: {} + js-tiktoken@1.0.21: + dependencies: + base64-js: 1.5.1 + js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -32920,12 +35252,20 @@ snapshots: jsonc-parser@3.3.1: {} + jsondiffpatch@0.6.0: + dependencies: + '@types/diff-match-patch': 1.0.36 + chalk: 5.4.1 + diff-match-patch: 1.0.5 + jsonfile@6.1.0: dependencies: universalify: 2.0.0 optionalDependencies: graceful-fs: 4.2.11 + jsonpointer@5.0.1: {} + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 @@ -33042,10 +35382,52 @@ snapshots: kleur@3.0.3: {} + kleur@4.1.5: {} + klona@2.0.5: {} known-css-properties@0.29.0: {} + langchain@0.3.35(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.0)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(axios@1.9.0)(cheerio@1.0.0)(handlebars@4.7.8)(openai@5.12.2(ws@8.18.0)(zod@3.25.76))(ws@8.18.0): + dependencies: + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.0)(zod@3.25.76)) + '@langchain/openai': 0.6.14(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.0)(zod@3.25.76)))(ws@8.18.0) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.0)(zod@3.25.76))) + js-tiktoken: 1.0.21 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langsmith: 0.3.72(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.0)(zod@3.25.76)) + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 10.0.0 + yaml: 2.8.1 + zod: 3.25.76 + optionalDependencies: + axios: 1.9.0 + cheerio: 1.0.0 + handlebars: 4.7.8 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + - ws + + langsmith@0.3.72(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.0)(zod@3.25.76)): + dependencies: + '@types/uuid': 10.0.0 + chalk: 4.1.2 + console-table-printer: 2.14.6 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.7.2 + uuid: 10.0.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/exporter-trace-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + openai: 5.12.2(ws@8.18.0)(zod@3.25.76) + lazy-universal-dotenv@4.0.0: dependencies: app-root-dir: 1.0.2 @@ -33237,6 +35619,8 @@ snapshots: '@lmdb/lmdb-linux-x64': 2.8.5 '@lmdb/lmdb-win32-x64': 2.8.5 + load-tsconfig@0.2.5: {} + loader-runner@4.3.0: {} loader-utils@1.4.2: @@ -33348,6 +35732,8 @@ snapshots: lottie-web@5.9.6: {} + loupe@3.2.1: {} + lower-case@2.0.2: dependencies: tslib: 2.8.1 @@ -33386,6 +35772,10 @@ snapshots: nan: 2.22.0 xxhashjs: 0.2.2 + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.5: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -33658,6 +36048,8 @@ snapshots: merge-descriptors@1.0.1: {} + merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -33855,7 +36247,7 @@ snapshots: micromark@2.11.4: dependencies: - debug: 4.4.0 + debug: 4.4.3 parse-entities: 2.0.0 transitivePeerDependencies: - supports-color @@ -33863,7 +36255,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.7 - debug: 4.4.0 + debug: 4.4.3 decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -33915,6 +36307,13 @@ snapshots: mime@3.0.0: {} + mimetext@3.0.27: + dependencies: + '@babel/runtime': 7.28.3 + '@babel/runtime-corejs3': 7.28.4 + js-base64: 3.7.8 + mime-types: 2.1.35 + mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -33923,6 +36322,24 @@ snapshots: min-indent@1.0.1: {} + miniflare@4.20251001.0: + dependencies: + '@cspotcode/source-map-support': 0.8.1 + acorn: 8.14.0 + acorn-walk: 8.3.2 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + sharp: 0.33.5 + stoppable: 1.1.0 + undici: 7.14.0 + workerd: 1.20251001.0 + ws: 8.18.0 + youch: 4.1.0-beta.10 + zod: 3.22.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} @@ -34020,6 +36437,13 @@ snapshots: mkdirp@3.0.1: {} + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + mmdb-lib@2.0.2: {} mockdate@3.0.5: {} @@ -34092,6 +36516,8 @@ snapshots: murmurhash-js@1.0.0: {} + mustache@4.2.0: {} + mute-stream@0.0.8: {} mylas@2.1.13: {} @@ -34110,6 +36536,8 @@ snapshots: nanoid@3.3.8: {} + nanoid@5.1.6: {} + napi-postinstall@0.3.2: {} native-request@1.1.2: @@ -34367,6 +36795,8 @@ snapshots: objectorarray@1.0.5: {} + ohash@2.0.11: {} + on-exit-leak-free@2.1.0: {} on-finished@2.4.1: @@ -34397,7 +36827,7 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openai@4.82.0(encoding@0.1.13)(zod@3.24.1): + openai@4.82.0(encoding@0.1.13)(ws@8.18.0)(zod@3.25.76): dependencies: '@types/node': 18.18.4 '@types/node-fetch': 2.6.4 @@ -34407,11 +36837,23 @@ snapshots: formdata-node: 4.4.1 node-fetch: 2.6.9(encoding@0.1.13) optionalDependencies: - zod: 3.24.1 + ws: 8.18.0 + zod: 3.25.76 transitivePeerDependencies: - encoding - supports-color + openai@5.12.2(ws@8.18.0)(zod@3.25.76): + optionalDependencies: + ws: 8.18.0 + zod: 3.25.76 + + openapi-types@12.1.3: {} + + openapi3-ts@4.5.0: + dependencies: + yaml: 2.8.1 + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 @@ -34482,6 +36924,8 @@ snapshots: p-defer@3.0.0: {} + p-finally@1.0.0: {} + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -34522,6 +36966,20 @@ snapshots: p-map@7.0.3: {} + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + + p-retry@4.6.2: + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + p-try@2.2.0: {} package-hash@4.0.0: @@ -34636,11 +37094,30 @@ snapshots: parseurl@1.3.3: {} + partyserver@0.0.72(@cloudflare/workers-types@4.20251004.0): + dependencies: + '@cloudflare/workers-types': 4.20251004.0 + nanoid: 5.1.6 + + partysocket@1.1.5: + dependencies: + event-target-polyfill: 0.0.4 + pascal-case@3.1.2: dependencies: no-case: 3.0.4 tslib: 2.8.1 + pastable@2.2.1(react@18.2.0): + dependencies: + '@babel/core': 7.28.0 + ts-toolbelt: 9.6.0 + type-fest: 3.5.3 + optionalDependencies: + react: 18.2.0 + transitivePeerDependencies: + - supports-color + path-browserify@1.0.1: {} path-exists@3.0.0: {} @@ -34671,12 +37148,20 @@ snapshots: path-to-regexp@6.2.1: {} + path-to-regexp@6.3.0: {} + + path-to-regexp@8.3.0: {} + path-type@4.0.0: {} path-type@6.0.0: {} pathe@1.1.1: {} + pathe@2.0.3: {} + + pathval@2.0.1: {} + pbf@3.2.1: dependencies: ieee754: 1.2.1 @@ -34799,6 +37284,8 @@ snapshots: dependencies: pngjs: 6.0.0 + pkce-challenge@5.0.0: {} + pkg-dir@3.0.0: dependencies: find-up: 3.0.0 @@ -34815,6 +37302,12 @@ snapshots: dependencies: find-up: 6.3.0 + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + playwright-core@1.45.0: {} playwright@1.45.0: @@ -35023,6 +37516,15 @@ snapshots: '@csstools/utilities': 2.0.0(postcss@8.5.2) postcss: 8.5.2 + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.5)(yaml@2.8.1): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 2.4.2 + postcss: 8.5.6 + tsx: 4.20.5 + yaml: 2.8.1 + postcss-loader@4.3.0(postcss@8.5.6)(webpack@5.88.2): dependencies: cosmiconfig: 7.1.0 @@ -35522,6 +38024,12 @@ snapshots: transitivePeerDependencies: - debug + posthog-node@4.18.0: + dependencies: + axios: 1.9.0 + transitivePeerDependencies: + - debug + posthtml-parser@0.11.0: dependencies: htmlparser2: 7.2.0 @@ -35549,6 +38057,8 @@ snapshots: prettier@3.4.2: {} + prettier@3.5.3: {} + prettier@3.6.2: {} pretty-bytes@5.6.0: {} @@ -35741,7 +38251,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.15.17 + '@types/node': 22.18.8 long: 5.2.4 protocol-buffers-schema@3.6.0: {} @@ -35802,7 +38312,7 @@ snapshots: puppeteer-core@2.1.1: dependencies: '@types/mime-types': 2.1.1 - debug: 4.4.0 + debug: 4.4.3 extract-zip: 1.7.0 https-proxy-agent: 4.0.0 mime: 2.6.0 @@ -35870,6 +38380,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + raw-body@3.0.1: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.7.0 + unpipe: 1.0.0 + raw-loader@4.0.2(webpack@5.88.2): dependencies: loader-utils: 2.0.4 @@ -36570,6 +39087,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.1.2: {} + real-require@0.2.0: {} recast@0.23.4: @@ -36712,7 +39231,7 @@ snapshots: require-in-the-middle@7.5.2: dependencies: - debug: 4.4.0 + debug: 4.4.3 module-details-from-path: 1.0.4 resolve: 1.22.8 transitivePeerDependencies: @@ -36765,7 +39284,7 @@ snapshots: retry-request@4.2.2: dependencies: - debug: 4.4.0 + debug: 4.4.3 extend: 3.0.2 transitivePeerDependencies: - supports-color @@ -36834,6 +39353,16 @@ snapshots: rope-sequence@1.3.3: {} + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.3.0 + transitivePeerDependencies: + - supports-color + rrweb-snapshot@2.0.0-alpha.18: dependencies: postcss: 8.5.6 @@ -37000,9 +39529,9 @@ snapshots: schema-utils@4.2.0: dependencies: '@types/json-schema': 7.0.15 - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - ajv-keywords: 5.1.0(ajv@8.12.0) + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) scroll-into-view-if-needed@3.1.0: dependencies: @@ -37042,6 +39571,22 @@ snapshots: transitivePeerDependencies: - supports-color + send@1.2.0: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + serialize-javascript@6.0.1: dependencies: randombytes: 2.1.0 @@ -37055,6 +39600,15 @@ snapshots: transitivePeerDependencies: - supports-color + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + set-blocking@2.0.0: {} set-cookie-parser@2.5.1: {} @@ -37108,6 +39662,32 @@ snapshots: shallowequal@1.1.0: {} + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -37142,6 +39722,8 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -37156,6 +39738,8 @@ snapshots: dependencies: semver: 7.7.2 + simple-wcswidth@1.1.2: {} + sisteransi@1.0.5: {} slash@2.0.0: {} @@ -37203,7 +39787,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3 socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -37250,6 +39834,10 @@ snapshots: source-map@0.7.4: {} + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + space-separated-tokens@1.1.5: {} spawn-command@0.0.2-1: {} @@ -37332,6 +39920,8 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stackback@0.0.2: {} + stackframe@1.3.4: {} standard-as-callback@2.1.0: {} @@ -37340,8 +39930,12 @@ snapshots: statuses@2.0.1: {} + std-env@3.9.0: {} + stdin-discarder@0.2.2: {} + stoppable@1.1.0: {} + store2@2.14.4: {} storybook-addon-pseudo-states@2.1.2(@storybook/components@7.6.4(@types/react-dom@18.3.7(@types/react@17.0.52))(@types/react@17.0.52)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@storybook/core-events@7.6.20)(@storybook/manager-api@7.6.20(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@storybook/preview-api@7.6.20)(@storybook/theming@7.6.20(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): @@ -37477,6 +40071,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + strnum@1.0.5: {} stubs@3.0.0: {} @@ -37638,11 +40236,21 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + superagent@9.0.2: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 - debug: 4.4.0 + debug: 4.4.3 fast-safe-stringify: 2.1.1 form-data: 4.0.1 formidable: 3.5.1 @@ -37663,6 +40271,8 @@ snapshots: transitivePeerDependencies: - supports-color + supports-color@10.2.2: {} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -37703,6 +40313,12 @@ snapshots: '@swc/core': 1.11.4(@swc/helpers@0.5.15) webpack: 5.88.2(@swc/core@1.11.4(@swc/helpers@0.5.15))(esbuild@0.18.20)(webpack-cli@5.1.4) + swr@2.3.6(react@18.2.0): + dependencies: + dequal: 2.0.3 + react: 18.2.0 + use-sync-external-store: 1.5.0(react@18.2.0) + symbol-tree@3.2.4: {} synchronous-promise@2.0.17: {} @@ -37877,6 +40493,8 @@ snapshots: throttle-debounce@5.0.2: {} + throttleit@2.1.0: {} + through2@2.0.5: dependencies: readable-stream: 2.3.8 @@ -37894,13 +40512,23 @@ snapshots: tiny-lru@11.0.1: {} + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + tinyglobby@0.2.14: dependencies: fdir: 6.4.6(picomatch@4.0.3) picomatch: 4.0.3 + tinypool@1.1.1: {} + tinyqueue@2.0.3: {} + tinyrainbow@2.0.0: {} + + tinyspy@4.0.4: {} + tldts-core@6.1.57: {} tldts@6.1.57: @@ -37932,6 +40560,10 @@ snapshots: tr46@0.0.3: {} + tr46@1.0.1: + dependencies: + punycode: 2.3.0 + tr46@3.0.0: dependencies: punycode: 2.3.0 @@ -38018,8 +40650,31 @@ snapshots: optionalDependencies: '@swc/core': 1.11.4(@swc/helpers@0.5.15) + ts-node@10.9.1(@swc/core@1.11.4(@swc/helpers@0.5.15))(@types/node@22.18.8)(typescript@5.2.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 22.18.8 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.2.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.11.4(@swc/helpers@0.5.15) + optional: true + ts-pattern@4.3.0: {} + ts-pattern@5.8.0: {} + ts-toolbelt@9.6.0: {} tsc-alias@1.8.16: @@ -38032,6 +40687,10 @@ snapshots: normalize-path: 3.0.0 plimit-lit: 1.6.1 + tsconfck@3.1.6(typescript@5.2.2): + optionalDependencies: + typescript: 5.2.2 + tsconfig-paths@3.14.2: dependencies: '@types/json5': 0.0.29 @@ -38051,6 +40710,35 @@ snapshots: tslib@2.8.1: {} + tsup@8.5.0(@swc/core@1.11.4(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.5)(typescript@5.2.2)(yaml@2.8.1): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.10) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.25.10 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.5)(yaml@2.8.1) + resolve-from: 5.0.0 + rollup: 4.45.1 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tree-kill: 1.2.2 + optionalDependencies: + '@swc/core': 1.11.4(@swc/helpers@0.5.15) + postcss: 8.5.6 + typescript: 5.2.2 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + tsx@4.20.5: dependencies: esbuild: 0.25.10 @@ -38149,6 +40837,23 @@ snapshots: for-each: 0.3.3 is-typed-array: 1.1.12 + typed-openapi@2.2.2(openapi-types@12.1.3)(react@18.2.0): + dependencies: + '@apidevtools/swagger-parser': 10.1.1(openapi-types@12.1.3) + '@sinclair/typebox-codegen': 0.11.1 + arktype: 2.1.20 + cac: 6.7.14 + openapi3-ts: 4.5.0 + pastable: 2.2.1(react@18.2.0) + pathe: 2.0.3 + prettier: 3.5.3 + ts-pattern: 5.8.0 + transitivePeerDependencies: + - openapi-types + - react + - supports-color + - xstate + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 @@ -38167,6 +40872,8 @@ snapshots: uc.micro@2.1.0: {} + ufo@1.6.1: {} + uglify-js@3.19.3: optional: true @@ -38207,8 +40914,18 @@ snapshots: undici@6.21.2: {} + undici@7.14.0: {} + undici@7.8.0: {} + unenv@2.0.0-rc.21: + dependencies: + defu: 6.1.4 + exsolve: 1.0.7 + ohash: 2.0.11 + pathe: 2.0.3 + ufo: 1.6.1 + unicode-canonical-property-names-ecmascript@2.0.0: {} unicode-match-property-ecmascript@2.0.0: @@ -38435,6 +41152,8 @@ snapshots: uuid@10.0.0: {} + uuid@11.1.0: {} + uuid@8.0.0: {} uuid@8.3.2: {} @@ -38478,7 +41197,53 @@ snapshots: unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 - vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(less@3.13.1)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.7.0): + vite-node@3.2.4(@types/node@22.18.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.8.1): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 6.3.5(@types/node@22.18.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite-tsconfig-paths@5.1.4(typescript@5.2.2)(vite@5.4.20(@types/node@22.18.8)(less@4.2.2)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)): + dependencies: + debug: 4.4.3 + globrex: 0.1.2 + tsconfck: 3.1.6(typescript@5.2.2) + optionalDependencies: + vite: 5.4.20(@types/node@22.18.8)(less@4.2.2)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1) + transitivePeerDependencies: + - supports-color + - typescript + + vite@5.4.20(@types/node@22.18.8)(less@4.2.2)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.45.1 + optionalDependencies: + '@types/node': 22.18.8 + fsevents: 2.3.3 + less: 4.2.2 + lightningcss: 1.29.2 + sass: 1.56.0 + sass-embedded: 1.70.0 + terser: 5.19.1 + + vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(less@3.13.1)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.8.1): dependencies: esbuild: 0.25.10 fdir: 6.4.6(picomatch@4.0.3) @@ -38496,7 +41261,69 @@ snapshots: sass-embedded: 1.70.0 terser: 5.19.1 tsx: 4.20.5 - yaml: 2.7.0 + yaml: 2.8.1 + + vite@6.3.5(@types/node@22.18.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.8.1): + dependencies: + esbuild: 0.25.10 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.45.1 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 22.18.8 + fsevents: 2.3.3 + jiti: 2.4.2 + less: 4.2.2 + lightningcss: 1.29.2 + sass: 1.56.0 + sass-embedded: 1.70.0 + terser: 5.19.1 + tsx: 4.20.5 + yaml: 2.8.1 + + vitest@3.2.4(@types/node@22.18.8)(jiti@2.4.2)(jsdom@20.0.3)(less@4.2.2)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.8.1): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@22.18.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.8.1)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.2.2 + magic-string: 0.30.19 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 6.3.5(@types/node@22.18.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.18.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass-embedded@1.70.0)(sass@1.56.0)(terser@5.19.1)(tsx@4.20.5)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.18.8 + jsdom: 20.0.3 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml vm2@3.9.18: dependencies: @@ -38517,7 +41344,7 @@ snapshots: wait-on@7.2.0: dependencies: - axios: 1.7.9 + axios: 1.9.0 joi: 17.11.0 lodash: 4.17.21 minimist: 1.2.8 @@ -38529,7 +41356,7 @@ snapshots: dependencies: chalk: 2.4.2 commander: 3.0.2 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -38564,6 +41391,8 @@ snapshots: webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + webidl-conversions@7.0.0: {} webpack-cli@5.1.4(webpack@5.88.2): @@ -38667,6 +41496,12 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -38725,12 +41560,42 @@ snapshots: dependencies: isexe: 3.1.1 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + wicked-good-xpath@1.3.0: {} wildcard@2.0.0: {} wordwrap@1.0.0: {} + workerd@1.20251001.0: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20251001.0 + '@cloudflare/workerd-darwin-arm64': 1.20251001.0 + '@cloudflare/workerd-linux-64': 1.20251001.0 + '@cloudflare/workerd-linux-arm64': 1.20251001.0 + '@cloudflare/workerd-windows-64': 1.20251001.0 + + wrangler@4.42.0(@cloudflare/workers-types@4.20251004.0): + dependencies: + '@cloudflare/kv-asset-handler': 0.4.0 + '@cloudflare/unenv-preset': 2.7.6(unenv@2.0.0-rc.21)(workerd@1.20251001.0) + blake3-wasm: 2.1.5 + esbuild: 0.25.4 + miniflare: 4.20251001.0 + path-to-regexp: 6.3.0 + unenv: 2.0.0-rc.21 + workerd: 1.20251001.0 + optionalDependencies: + '@cloudflare/workers-types': 4.20251004.0 + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + wrap-ansi@5.1.0: dependencies: ansi-styles: 3.2.1 @@ -38751,7 +41616,7 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 strip-ansi: 7.1.0 @@ -38792,6 +41657,8 @@ snapshots: ws@8.11.0: {} + ws@8.18.0: {} + xdg-basedir@4.0.0: {} xml-js@1.6.11: @@ -38831,6 +41698,8 @@ snapshots: yaml@2.7.0: {} + yaml@2.8.1: {} + yargs-parser@13.1.2: dependencies: camelcase: 5.3.1 @@ -38913,8 +41782,29 @@ snapshots: yocto-queue@1.0.0: {} + youch-core@0.3.3: + dependencies: + '@poppinss/exception': 1.2.2 + error-stack-parser-es: 1.0.5 + + youch@4.1.0-beta.10: + dependencies: + '@poppinss/colors': 4.1.5 + '@poppinss/dumper': 0.6.4 + '@speed-highlight/core': 1.2.7 + cookie: 1.0.2 + youch-core: 0.3.3 + + zod-to-json-schema@3.24.6(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod@3.22.3: {} + zod@3.24.1: {} + zod@3.25.76: {} + zustand@4.5.6(@types/react@17.0.52)(react@18.2.0): dependencies: use-sync-external-store: 1.5.0(react@18.2.0) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 4e513a17ac..98f20d3ccd 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,4 +10,5 @@ packages: - playwright - plugin-server - products/* + - products/mcp/typescript - rust/cyclotron-node diff --git a/products/mcp/.gitignore b/products/mcp/.gitignore new file mode 100644 index 0000000000..b2fd8230ff --- /dev/null +++ b/products/mcp/.gitignore @@ -0,0 +1,27 @@ +node_modules + +# wrangler files +.wrangler +.dev.vars* +.mcp.json +.env.test + +# Editor-specific files +.cursor/ +.claude/ +.vscode/ + +# Python +python/venv/ +__pycache__/ +.mypy_cache/.ruff_cache/ +.pytest_cache/ +.ruff_cache/ + +.env + +dist/ + +.venv/ + +.husy/ diff --git a/products/mcp/.husky/pre-commit b/products/mcp/.husky/pre-commit new file mode 100644 index 0000000000..910961fdc2 --- /dev/null +++ b/products/mcp/.husky/pre-commit @@ -0,0 +1,2 @@ +pnpm run lint +pnpm run format diff --git a/products/mcp/.oxlintrc.json b/products/mcp/.oxlintrc.json new file mode 100644 index 0000000000..749789b4d2 --- /dev/null +++ b/products/mcp/.oxlintrc.json @@ -0,0 +1,12 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "files": { + "ignore": ["**/generated.ts", "schema/tool-inputs.json", "python/**", ".mypy_cache/**"] + }, + "rules": { + "no-debugger": "off", + "no-console": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "jest/no-restricted-matchers": "off" + } +} diff --git a/products/mcp/.prettierignore b/products/mcp/.prettierignore new file mode 100644 index 0000000000..ec4a4d6a47 --- /dev/null +++ b/products/mcp/.prettierignore @@ -0,0 +1,5 @@ +schema/tool-inputs.json +python/** +**/generated.ts +node_modules/ +.mypy_cache/ diff --git a/products/mcp/.prettierrc b/products/mcp/.prettierrc new file mode 100644 index 0000000000..932ed3ef04 --- /dev/null +++ b/products/mcp/.prettierrc @@ -0,0 +1,7 @@ +{ + "trailingComma": "es5", + "tabWidth": 4, + "semi": false, + "singleQuote": true, + "printWidth": 100 +} diff --git a/products/mcp/Dockerfile b/products/mcp/Dockerfile new file mode 100644 index 0000000000..f1a5247cae --- /dev/null +++ b/products/mcp/Dockerfile @@ -0,0 +1,15 @@ +# Use a lightweight Node.js image +FROM node:20-slim + +# Set the working directory inside the container +WORKDIR /usr/src/app + +# Install mcp-remote globally to avoid npx overhead on each run +RUN npm install -g mcp-remote@latest + +# Set default environment variable for POSTHOG_REMOTE_MCP_URL +ENV POSTHOG_REMOTE_MCP_URL=https://mcp.posthog.com/mcp + +# The entrypoint will run mcp-remote with proper stdio handling +# POSTHOG_AUTH_HEADER should be just the token (e.g., phx_...), we'll add "Bearer " prefix +ENTRYPOINT ["sh", "-c", "mcp-remote \"${POSTHOG_REMOTE_MCP_URL}\" --header \"Authorization:Bearer ${POSTHOG_AUTH_HEADER}\""] diff --git a/products/mcp/LICENSE b/products/mcp/LICENSE new file mode 100644 index 0000000000..a9844e3afc --- /dev/null +++ b/products/mcp/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 PostHog + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/products/mcp/README.md b/products/mcp/README.md new file mode 100644 index 0000000000..3950eff558 --- /dev/null +++ b/products/mcp/README.md @@ -0,0 +1,191 @@ +# PostHog MCP + +Documentation: https://posthog.com/docs/model-context-protocol + +## Use the MCP Server + +### Quick install + +You can install the MCP server automatically into Cursor, Claude, Claude Code, VS Code and Zed by running the following command: + +```bash +npx @posthog/wizard@latest mcp add +``` + +### Manual install + +1. Obtain a personal API key using the [MCP Server preset](https://app.posthog.com/settings/user-api-keys?preset=mcp_server). + +2. Add the MCP configuration to your desktop client (e.g. Cursor, Windsurf, Claude Desktop) and add your personal API key + +```json +{ + "mcpServers": { + "posthog": { + "command": "npx", + "args": [ + "-y", + "mcp-remote@latest", + "https://mcp.posthog.com/mcp", // You can replace this with https://mcp.posthog.com/sse if your client does not support Streamable HTTP + "--header", + "Authorization:${POSTHOG_AUTH_HEADER}" + ], + "env": { + "POSTHOG_AUTH_HEADER": "Bearer {INSERT_YOUR_PERSONAL_API_KEY_HERE}" + } + } + } +} +``` + +### Docker install + +If you prefer to use Docker instead of running npx directly: + +1. Build the Docker image: + +```bash +pnpm docker:build +# or +docker build -t posthog-mcp . +``` + +2. Configure your MCP client with Docker: + +```json +{ + "mcpServers": { + "posthog": { + "type": "stdio", + "command": "docker", + "args": [ + "run", + "-i", + "--rm", + "--env", + "POSTHOG_AUTH_HEADER=${POSTHOG_AUTH_HEADER}", + "--env", + "POSTHOG_REMOTE_MCP_URL=${POSTHOG_REMOTE_MCP_URL:-https://mcp.posthog.com/mcp}", + "posthog-mcp" + ], + "env": { + "POSTHOG_AUTH_HEADER": "Bearer {INSERT_YOUR_PERSONAL_API_KEY_HERE}", + "POSTHOG_REMOTE_MCP_URL": "https://mcp.posthog.com/mcp" + } + } + } +} +``` + +3. Test Docker with MCP Inspector: + +```bash +pnpm docker:inspector +# or +npx @modelcontextprotocol/inspector docker run -i --rm --env POSTHOG_AUTH_HEADER=${POSTHOG_AUTH_HEADER} posthog-mcp +``` + +**Environment Variables:** + +- `POSTHOG_AUTH_HEADER`: Your PostHog API token (required) +- `POSTHOG_REMOTE_MCP_URL`: The MCP server URL (optional, defaults to `https://mcp.posthog.com/mcp`) + +This approach allows you to use the PostHog MCP server without needing Node.js or npm installed locally. + +### Example Prompts + +- What feature flags do I have active? +- Add a new feature flag for our homepage redesign +- What are my most common errors? +- Show me my LLM costs this week + +### Feature Filtering + +You can limit which tools are available by adding query parameters to the MCP URL: + +```text +https://mcp.posthog.com/mcp?features=flags,workspace +``` + +Available features: + +- `workspace` - Organization and project management +- `error-tracking` - [Error monitoring and debugging](https://posthog.com/docs/errors) +- `dashboards` - [Dashboard creation and management](https://posthog.com/docs/product-analytics/dashboards) +- `insights` - [Analytics insights and SQL queries](https://posthog.com/docs/product-analytics/insights) +- `experiments` - [A/B testing experiments](https://posthog.com/docs/experiments) +- `flags` - [Feature flag management](https://posthog.com/docs/feature-flags) +- `llm-analytics` - [LLM usage and cost tracking](https://posthog.com/docs/llm-analytics) +- `docs` - PostHog documentation search + +To view which tools are available per feature, see our [documentation](https://posthog.com/docs/model-context-protocol) or alternatively check out `schema/tool-definitions.json`, + +### Data processing + +The MCP server is hosted on a Cloudflare worker which can be located outside of the EU / US, for this reason the MCP server does not store any sensitive data outside of your cloud region. + +### Using self-hosted instances + +If you're using a self-hosted instance of PostHog, you can specify a custom base URL by adding the `POSTHOG_BASE_URL` [environment variable](https://developers.cloudflare.com/workers/configuration/environment-variables) when running the MCP server locally or on your own infrastructure, e.g. `POSTHOG_BASE_URL=https://posthog.example.com` + +# Development + +To run the MCP server locally, run the following command: + +```bash +pnpm run dev +``` + +And replace `https://mcp.posthog.com/mcp` with `http://localhost:8787/mcp` in the MCP configuration. + +## Project Structure + +This repository is organized to support multiple language implementations: + +- `typescript/` - TypeScript implementation of the MCP server & tools +- `schema/` - Shared schema files generated from TypeScript + +### Development Commands + +- `pnpm run dev` - Start development server +- `pnpm run schema:build:json` - Generate JSON schema for other language implementations +- `pnpm run lint && pnpm run format` - Format and lint code + +### Adding New Tools + +See the [tools documentation](typescript/src/tools/README.md) for a guide on adding new tools to the MCP server. + +### Environment variables + +- Create `.dev.vars` in the root +- Add Inkeep API key to enable `docs-search` tool (see `Inkeep API key - mcp`) + +```bash +INKEEP_API_KEY="..." +``` + +### Configuring the Model Context Protocol Inspector + +During development you can directly inspect the MCP tool call results using the [MCP Inspector](https://modelcontextprotocol.io/docs/tools/inspector). + +You can run it using the following command: + +```bash +npx @modelcontextprotocol/inspector npx -y mcp-remote@latest http://localhost:8787/mcp --header "\"Authorization: Bearer {INSERT_YOUR_PERSONAL_API_KEY_HERE}\"" +``` + +Alternatively, you can use the following configuration in the MCP Inspector: + +Use transport type `STDIO`. + +**Command:** + +```bash +npx +``` + +**Arguments:** + +```bash +-y mcp-remote@latest http://localhost:8787/mcp --header "Authorization: Bearer {INSERT_YOUR_PERSONAL_API_KEY_HERE}" +``` diff --git a/products/mcp/examples/ai-sdk/README.md b/products/mcp/examples/ai-sdk/README.md new file mode 100644 index 0000000000..811694bc3d --- /dev/null +++ b/products/mcp/examples/ai-sdk/README.md @@ -0,0 +1,29 @@ +# PostHog AI SDK Integration Example + +This example demonstrates how to use PostHog tools with the AI SDK using the `@posthog/agent-toolkit` package. + +## Features + +- Uses the `tool()` helper function from AI SDK for type-safe tool integration +- Automatically infers tool input types from Zod schemas +- Provides access to all PostHog MCP tools (feature flags, insights, dashboards, etc.) + +## Setup + +1. Install dependencies: + +```bash +npm install +``` + +2. Copy the environment file and fill in your credentials: + +```bash +cp .env.example .env +``` + +3. Run the example: + +```bash +npm run dev +``` diff --git a/products/mcp/examples/ai-sdk/package-lock.json b/products/mcp/examples/ai-sdk/package-lock.json new file mode 100644 index 0000000000..4059b9c0a3 --- /dev/null +++ b/products/mcp/examples/ai-sdk/package-lock.json @@ -0,0 +1,1714 @@ +{ + "name": "posthog-ai-sdk-example", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "posthog-ai-sdk-example", + "version": "1.0.0", + "dependencies": { + "@ai-sdk/openai": "^2.0.28", + "@posthog/agent-toolkit": "^0.2.1", + "ai": "^5.0.40", + "dotenv": "^16.4.7", + "zod": "^3.24.4" + }, + "devDependencies": { + "@types/node": "^22.15.34", + "tsx": "^4.20.3", + "typescript": "^5.8.3" + } + }, + "../../typescript": { + "name": "@posthog/agent-toolkit", + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.17.3", + "agents": "^0.0.113", + "ai": "^5.0.18", + "posthog-node": "^4.18.0", + "zod": "^3.24.4" + }, + "devDependencies": { + "@langchain/core": "^0.3.72", + "@langchain/openai": "^0.6.9", + "@types/dotenv": "^6.1.1", + "@types/node": "^22.15.34", + "dotenv": "^16.4.7", + "langchain": "^0.3.31", + "tsup": "^8.5.0", + "typescript": "^5.8.3", + "uuid": "^11.1.0", + "vite": "^5.0.0", + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^3.2.4", + "wrangler": "^4.14.4", + "zod-to-json-schema": "^3.24.6" + }, + "peerDependencies": { + "@langchain/core": "^0.3.72", + "@langchain/openai": "^0.6.9", + "ai": "^5.0.0", + "langchain": "^0.3.31" + } + }, + "../../typescript/node_modules/@ai-sdk/gateway": { + "version": "1.0.9", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "../../typescript/node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "../../typescript/node_modules/@ai-sdk/provider-utils": { + "version": "3.0.4", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.3", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "../../typescript/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "../../typescript/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../typescript/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "../../typescript/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "../../typescript/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.30", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "../../typescript/node_modules/@opentelemetry/api": { + "version": "1.9.0", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "../../typescript/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "../../typescript/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.46.4", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "../../typescript/node_modules/@standard-schema/spec": { + "version": "1.0.0", + "license": "MIT" + }, + "../../typescript/node_modules/@types/estree": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/@types/node": { + "version": "22.17.2", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "../../typescript/node_modules/acorn": { + "version": "8.15.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../typescript/node_modules/ai": { + "version": "5.0.18", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "1.0.9", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.4", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "../../typescript/node_modules/ansi-regex": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../typescript/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../../typescript/node_modules/any-promise": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "../../typescript/node_modules/axios": { + "version": "1.11.0", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "../../typescript/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "../../typescript/node_modules/bundle-require": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.18" + } + }, + "../../typescript/node_modules/cac": { + "version": "6.7.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../typescript/node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../typescript/node_modules/chokidar": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "../../typescript/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "../../typescript/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../../typescript/node_modules/commander": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "../../typescript/node_modules/confbox": { + "version": "0.1.8", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/consola": { + "version": "3.4.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "../../typescript/node_modules/cross-spawn": { + "version": "7.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "../../typescript/node_modules/debug": { + "version": "4.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "../../typescript/node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../typescript/node_modules/dunder-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../typescript/node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "../../typescript/node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "../../typescript/node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../typescript/node_modules/es-set-tostringtag": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../typescript/node_modules/esbuild": { + "version": "0.25.9", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "../../typescript/node_modules/eventsource-parser": { + "version": "3.0.5", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "../../typescript/node_modules/fdir": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "../../typescript/node_modules/fix-dts-default-cjs-exports": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "rollup": "^4.34.8" + } + }, + "../../typescript/node_modules/follow-redirects": { + "version": "1.15.11", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "../../typescript/node_modules/foreground-child": { + "version": "3.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../typescript/node_modules/form-data": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "../../typescript/node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../typescript/node_modules/get-intrinsic": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../typescript/node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../typescript/node_modules/glob": { + "version": "10.4.5", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../typescript/node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../typescript/node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../typescript/node_modules/has-tostringtag": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../typescript/node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../typescript/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../typescript/node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "../../typescript/node_modules/jackspeak": { + "version": "3.4.3", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "../../typescript/node_modules/joycon": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "../../typescript/node_modules/json-schema": { + "version": "0.4.0", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "../../typescript/node_modules/lilconfig": { + "version": "3.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "../../typescript/node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/load-tsconfig": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "../../typescript/node_modules/lodash.sortby": { + "version": "4.7.0", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "../../typescript/node_modules/magic-string": { + "version": "0.30.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "../../typescript/node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "../../typescript/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../typescript/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../../typescript/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../typescript/node_modules/minipass": { + "version": "7.1.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "../../typescript/node_modules/mlly": { + "version": "1.7.4", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", + "ufo": "^1.5.4" + } + }, + "../../typescript/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/mz": { + "version": "2.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "../../typescript/node_modules/object-assign": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../typescript/node_modules/package-json-from-dist": { + "version": "1.0.1", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "../../typescript/node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../typescript/node_modules/path-scurry": { + "version": "1.11.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../typescript/node_modules/pathe": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/picocolors": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "../../typescript/node_modules/picomatch": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "../../typescript/node_modules/pirates": { + "version": "4.0.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "../../typescript/node_modules/pkg-types": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "../../typescript/node_modules/postcss-load-config": { + "version": "6.0.1", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "../../typescript/node_modules/posthog-node": { + "version": "4.18.0", + "license": "MIT", + "dependencies": { + "axios": "^1.8.2" + }, + "engines": { + "node": ">=15.0.0" + } + }, + "../../typescript/node_modules/proxy-from-env": { + "version": "1.1.0", + "license": "MIT" + }, + "../../typescript/node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../typescript/node_modules/readdirp": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "../../typescript/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../typescript/node_modules/rollup": { + "version": "4.46.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.46.4", + "@rollup/rollup-android-arm64": "4.46.4", + "@rollup/rollup-darwin-arm64": "4.46.4", + "@rollup/rollup-darwin-x64": "4.46.4", + "@rollup/rollup-freebsd-arm64": "4.46.4", + "@rollup/rollup-freebsd-x64": "4.46.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.46.4", + "@rollup/rollup-linux-arm-musleabihf": "4.46.4", + "@rollup/rollup-linux-arm64-gnu": "4.46.4", + "@rollup/rollup-linux-arm64-musl": "4.46.4", + "@rollup/rollup-linux-loongarch64-gnu": "4.46.4", + "@rollup/rollup-linux-ppc64-gnu": "4.46.4", + "@rollup/rollup-linux-riscv64-gnu": "4.46.4", + "@rollup/rollup-linux-riscv64-musl": "4.46.4", + "@rollup/rollup-linux-s390x-gnu": "4.46.4", + "@rollup/rollup-linux-x64-gnu": "4.46.4", + "@rollup/rollup-linux-x64-musl": "4.46.4", + "@rollup/rollup-win32-arm64-msvc": "4.46.4", + "@rollup/rollup-win32-ia32-msvc": "4.46.4", + "@rollup/rollup-win32-x64-msvc": "4.46.4", + "fsevents": "~2.3.2" + } + }, + "../../typescript/node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../typescript/node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../typescript/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../typescript/node_modules/source-map": { + "version": "0.8.0-beta.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "../../typescript/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../typescript/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../typescript/node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../typescript/node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../typescript/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../typescript/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../typescript/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../typescript/node_modules/sucrase": { + "version": "3.35.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "../../typescript/node_modules/thenify": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "../../typescript/node_modules/thenify-all": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../typescript/node_modules/tinyexec": { + "version": "0.3.2", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/tinyglobby": { + "version": "0.2.14", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "../../typescript/node_modules/tr46": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "../../typescript/node_modules/tree-kill": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "../../typescript/node_modules/ts-interface-checker": { + "version": "0.1.13", + "dev": true, + "license": "Apache-2.0" + }, + "../../typescript/node_modules/tsup": { + "version": "8.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-require": "^5.1.0", + "cac": "^6.7.14", + "chokidar": "^4.0.3", + "consola": "^3.4.0", + "debug": "^4.4.0", + "esbuild": "^0.25.0", + "fix-dts-default-cjs-exports": "^1.0.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.34.8", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.11", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "../../typescript/node_modules/typescript": { + "version": "5.9.2", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "../../typescript/node_modules/ufo": { + "version": "1.6.1", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/webidl-conversions": { + "version": "4.0.2", + "dev": true, + "license": "BSD-2-Clause" + }, + "../../typescript/node_modules/whatwg-url": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "../../typescript/node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "../../typescript/node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../../typescript/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../../typescript/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../typescript/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../../typescript/node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../../typescript/node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../typescript/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../typescript/node_modules/zod": { + "version": "3.25.76", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "../../typescript/node_modules/zod-to-json-schema": { + "version": "3.24.6", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, + "node_modules/@ai-sdk/gateway": { + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-1.0.21.tgz", + "integrity": "sha512-yQPrMb1v0P8GwmmpcCT2DGPfgJVRkJ9QaRRJGO0+Em+wI+Xv3lvHHIc3ImVR3jjVfJPih/cNWWALUgRERfQaxQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/@ai-sdk/openai": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.28.tgz", + "integrity": "sha512-Z2mG7PjUKbpT8fMexE6yrorxXVzGHSl3jKF293w2i6s9Dc6X81Gf6Z0OGNnkrftLtW4PXr7RZ/9xoyusBZW4uA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.8.tgz", + "integrity": "sha512-cDj1iigu7MW2tgAQeBzOiLhjHOUM9vENsgh4oAVitek0d//WdgfPCsKO3euP7m7LyO/j9a1vr/So+BGNdpFXYw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@posthog/agent-toolkit": { + "resolved": "../../typescript", + "link": true + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.17.2", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/ai": { + "version": "5.0.40", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.40.tgz", + "integrity": "sha512-AEKVjVQjnzomEz39f1axnCLtmNRU/BrP12Ou6ztinGhv5u1VxrrRk5qbXugVI0ijeaVwxKQ/SWs0dicUC0qLEA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "1.0.21", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.8", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/esbuild": { + "version": "0.25.9", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.5.tgz", + "integrity": "sha512-bSRG85ZrMdmWtm7qkF9He9TNRzc/Bm99gEJMaQoHJ9E6Kv9QBbsldh2oMj7iXmYNEAVvNgvv5vPorG6W+XtBhQ==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/tsx": { + "version": "4.20.4", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, + "node_modules/zod": { + "version": "3.25.76", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/products/mcp/examples/ai-sdk/package.json b/products/mcp/examples/ai-sdk/package.json new file mode 100644 index 0000000000..1cf72423b1 --- /dev/null +++ b/products/mcp/examples/ai-sdk/package.json @@ -0,0 +1,21 @@ +{ + "name": "posthog-ai-sdk-example", + "version": "1.0.0", + "description": "Example using PostHog tools with the AI SDK", + "type": "module", + "scripts": { + "dev": "tsx src/index.ts" + }, + "dependencies": { + "@ai-sdk/openai": "^2.0.28", + "@posthog/agent-toolkit": "^0.2.1", + "ai": "^5.0.40", + "dotenv": "^16.4.7", + "zod": "^3.24.4" + }, + "devDependencies": { + "@types/node": "^22.15.34", + "tsx": "^4.20.3", + "typescript": "^5.8.3" + } +} diff --git a/products/mcp/examples/ai-sdk/src/index.ts b/products/mcp/examples/ai-sdk/src/index.ts new file mode 100644 index 0000000000..26c4cb7525 --- /dev/null +++ b/products/mcp/examples/ai-sdk/src/index.ts @@ -0,0 +1,51 @@ +import { openai } from '@ai-sdk/openai' +import { PostHogAgentToolkit } from '@posthog/agent-toolkit/integrations/ai-sdk' +import { generateText, stepCountIs } from 'ai' +import 'dotenv/config' + +async function analyzeProductUsage() { + const agentToolkit = new PostHogAgentToolkit({ + posthogPersonalApiKey: process.env.POSTHOG_PERSONAL_API_KEY!, + posthogApiBaseUrl: process.env.POSTHOG_API_BASE_URL || 'https://us.posthog.com', + }) + + const result = await generateText({ + model: openai('gpt-5-mini'), + tools: await agentToolkit.getTools(), + stopWhen: stepCountIs(30), + system: `You are a data analyst. Your task is to do a deep dive into what's happening in our product.`, + prompt: `Please analyze our product usage: + + 1. Get all available insights (limit 100) and pick the 5 most relevant ones + 2. For each insight, query its data + 3. Summarize the key findings in a brief report + + Keep your response focused and data-driven.`, + }) + + // Show tool usage summary + const toolCalls = result.steps.flatMap((step) => step.toolCalls ?? []) + if (toolCalls.length > 0) { + const toolUsage = toolCalls.reduce( + (acc, call) => { + acc[call.toolName] = (acc[call.toolName] || 0) + 1 + return acc + }, + {} as Record + ) + + for (const [tool, count] of Object.entries(toolUsage)) { + } + } +} + +async function main() { + try { + await analyzeProductUsage() + } catch (error) { + console.error('Error:', error) + process.exit(1) + } +} + +main().catch(console.error) diff --git a/products/mcp/examples/ai-sdk/tsconfig.json b/products/mcp/examples/ai-sdk/tsconfig.json new file mode 100644 index 0000000000..35377067a8 --- /dev/null +++ b/products/mcp/examples/ai-sdk/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022"], + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true + }, + "include": ["src/**/*"] +} diff --git a/products/mcp/examples/langchain-js/.gitignore b/products/mcp/examples/langchain-js/.gitignore new file mode 100644 index 0000000000..b3d8324167 --- /dev/null +++ b/products/mcp/examples/langchain-js/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +.env +.env.local +*.log \ No newline at end of file diff --git a/products/mcp/examples/langchain-js/README.md b/products/mcp/examples/langchain-js/README.md new file mode 100644 index 0000000000..b754bf2a15 --- /dev/null +++ b/products/mcp/examples/langchain-js/README.md @@ -0,0 +1,30 @@ +# PostHog Langchain JS Integration Example + +This example demonstrates how to use PostHog tools with Langchain JS using the `@posthog/agent-toolkit` package. + +## Features + +- Uses the `DynamicStructuredTool` class from Langchain for type-safe tool integration +- Automatically infers tool input types from Zod schemas +- Provides access to all PostHog MCP tools (feature flags, insights, dashboards, etc.) +- Works with any Langchain-compatible LLM + +## Setup + +1. Install dependencies: + +```bash +npm install +``` + +2. Copy the environment file and fill in your credentials: + +```bash +cp .env.example .env +``` + +3. Run the example: + +```bash +npm run dev +``` diff --git a/products/mcp/examples/langchain-js/package-lock.json b/products/mcp/examples/langchain-js/package-lock.json new file mode 100644 index 0000000000..66a023d4d1 --- /dev/null +++ b/products/mcp/examples/langchain-js/package-lock.json @@ -0,0 +1,1181 @@ +{ + "name": "posthog-langchain-js-example", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "posthog-langchain-js-example", + "version": "1.0.0", + "dependencies": { + "@langchain/core": "^0.3.72", + "@langchain/openai": "^0.6.9", + "@posthog/agent-toolkit": "^0.2.1", + "dotenv": "^16.4.7", + "langchain": "^0.3.31", + "zod": "^3.24.4" + }, + "devDependencies": { + "@types/node": "^22.15.34", + "tsx": "^4.20.3", + "typescript": "^5.8.3" + } + }, + "../../typescript": { + "name": "@posthog/agent-toolkit", + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.17.3", + "agents": "^0.0.113", + "ai": "^5.0.18", + "posthog-node": "^4.18.0", + "zod": "^3.24.4" + }, + "devDependencies": { + "@langchain/core": "^0.3.72", + "@langchain/openai": "^0.6.9", + "@types/dotenv": "^6.1.1", + "@types/node": "^22.15.34", + "dotenv": "^16.4.7", + "langchain": "^0.3.31", + "tsup": "^8.5.0", + "typescript": "^5.8.3", + "uuid": "^11.1.0", + "vite": "^5.0.0", + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^3.2.4", + "wrangler": "^4.14.4", + "zod-to-json-schema": "^3.24.6" + }, + "peerDependencies": { + "@langchain/core": "^0.3.72", + "@langchain/openai": "^0.6.9", + "ai": "^5.0.0", + "langchain": "^0.3.31" + } + }, + "node_modules/@cfworker/json-schema": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.1.tgz", + "integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/core": { + "version": "0.3.72", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.3.72.tgz", + "integrity": "sha512-WsGWVZYnlKffj2eEfDocPNiaTRoxyYiLSQdQ7oxZvxGZBqo/90vpjbC33UGK1uPNBM4kT+pkdaol/MnvKUh8TQ==", + "license": "MIT", + "dependencies": { + "@cfworker/json-schema": "^4.0.2", + "ansi-styles": "^5.0.0", + "camelcase": "6", + "decamelize": "1.2.0", + "js-tiktoken": "^1.0.12", + "langsmith": "^0.3.46", + "mustache": "^4.2.0", + "p-queue": "^6.6.2", + "p-retry": "4", + "uuid": "^10.0.0", + "zod": "^3.25.32", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/openai": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.6.9.tgz", + "integrity": "sha512-Dl+YVBTFia7WE4/jFemQEVchPbsahy/dD97jo6A9gLnYfTkWa/jh8Q78UjHQ3lobif84j2ebjHPcDHG1L0NUWg==", + "license": "MIT", + "dependencies": { + "js-tiktoken": "^1.0.12", + "openai": "5.12.2", + "zod": "^3.25.32" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": ">=0.3.68 <0.4.0" + } + }, + "node_modules/@langchain/textsplitters": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@langchain/textsplitters/-/textsplitters-0.1.0.tgz", + "integrity": "sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==", + "license": "MIT", + "dependencies": { + "js-tiktoken": "^1.0.12" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": ">=0.2.21 <0.4.0" + } + }, + "node_modules/@posthog/agent-toolkit": { + "resolved": "../../typescript", + "link": true + }, + "node_modules/@types/node": { + "version": "22.17.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.17.2.tgz", + "integrity": "sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "license": "MIT" + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/console-table-printer": { + "version": "2.14.6", + "resolved": "https://registry.npmjs.org/console-table-printer/-/console-table-printer-2.14.6.tgz", + "integrity": "sha512-MCBl5HNVaFuuHW6FGbL/4fB7N/ormCy+tQ+sxTrF6QtSbSNETvPuOVbkJBhzDgYhvjWGrTma4eYJa37ZuoQsPw==", + "license": "MIT", + "dependencies": { + "simple-wcswidth": "^1.0.1" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tiktoken": { + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.21.tgz", + "integrity": "sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.5.1" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/langchain": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/langchain/-/langchain-0.3.31.tgz", + "integrity": "sha512-C7n7WGa44RytsuxEtGcArVcXidRqzjl6UWQxaG3NdIw4gIqErWoOlNC1qADAa04H5JAOARxuE6S99+WNXB/rzA==", + "license": "MIT", + "dependencies": { + "@langchain/openai": ">=0.1.0 <0.7.0", + "@langchain/textsplitters": ">=0.0.0 <0.2.0", + "js-tiktoken": "^1.0.12", + "js-yaml": "^4.1.0", + "jsonpointer": "^5.0.1", + "langsmith": "^0.3.46", + "openapi-types": "^12.1.3", + "p-retry": "4", + "uuid": "^10.0.0", + "yaml": "^2.2.1", + "zod": "^3.25.32" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/anthropic": "*", + "@langchain/aws": "*", + "@langchain/cerebras": "*", + "@langchain/cohere": "*", + "@langchain/core": ">=0.3.58 <0.4.0", + "@langchain/deepseek": "*", + "@langchain/google-genai": "*", + "@langchain/google-vertexai": "*", + "@langchain/google-vertexai-web": "*", + "@langchain/groq": "*", + "@langchain/mistralai": "*", + "@langchain/ollama": "*", + "@langchain/xai": "*", + "axios": "*", + "cheerio": "*", + "handlebars": "^4.7.8", + "peggy": "^3.0.2", + "typeorm": "*" + }, + "peerDependenciesMeta": { + "@langchain/anthropic": { + "optional": true + }, + "@langchain/aws": { + "optional": true + }, + "@langchain/cerebras": { + "optional": true + }, + "@langchain/cohere": { + "optional": true + }, + "@langchain/deepseek": { + "optional": true + }, + "@langchain/google-genai": { + "optional": true + }, + "@langchain/google-vertexai": { + "optional": true + }, + "@langchain/google-vertexai-web": { + "optional": true + }, + "@langchain/groq": { + "optional": true + }, + "@langchain/mistralai": { + "optional": true + }, + "@langchain/ollama": { + "optional": true + }, + "@langchain/xai": { + "optional": true + }, + "axios": { + "optional": true + }, + "cheerio": { + "optional": true + }, + "handlebars": { + "optional": true + }, + "peggy": { + "optional": true + }, + "typeorm": { + "optional": true + } + } + }, + "node_modules/langsmith": { + "version": "0.3.62", + "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.3.62.tgz", + "integrity": "sha512-ApoGLs28cJCxL91l1PDDkjsA4oLrbeNlE1pyTvyopqXq9bNJrP8JPUNWZm/tpU0DzZpvZFctRzru4gNAr/bkxg==", + "license": "MIT", + "dependencies": { + "@types/uuid": "^10.0.0", + "chalk": "^4.1.2", + "console-table-printer": "^2.12.1", + "p-queue": "^6.6.2", + "p-retry": "4", + "semver": "^7.6.3", + "uuid": "^10.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "*", + "@opentelemetry/exporter-trace-otlp-proto": "*", + "@opentelemetry/sdk-trace-base": "*", + "openai": "*" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@opentelemetry/exporter-trace-otlp-proto": { + "optional": true + }, + "@opentelemetry/sdk-trace-base": { + "optional": true + }, + "openai": { + "optional": true + } + } + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/openai": { + "version": "5.12.2", + "resolved": "https://registry.npmjs.org/openai/-/openai-5.12.2.tgz", + "integrity": "sha512-xqzHHQch5Tws5PcKR2xsZGX9xtch+JQFz5zb14dGqlshmmDAFBFEWmeIpf7wVqWV+w7Emj7jRgkNJakyKE0tYQ==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT" + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-wcswidth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz", + "integrity": "sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tsx": { + "version": "4.20.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.4.tgz", + "integrity": "sha512-yyxBKfORQ7LuRt/BQKBXrpcq59ZvSW0XxwfjAt3w2/8PmdxaFzijtMhTawprSHhpzeM5BgU2hXHG3lklIERZXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + } + } +} diff --git a/products/mcp/examples/langchain-js/package.json b/products/mcp/examples/langchain-js/package.json new file mode 100644 index 0000000000..d2ef2b352a --- /dev/null +++ b/products/mcp/examples/langchain-js/package.json @@ -0,0 +1,22 @@ +{ + "name": "posthog-langchain-js-example", + "version": "1.0.0", + "description": "Example using PostHog tools with Langchain JS", + "type": "module", + "scripts": { + "dev": "tsx src/index.ts" + }, + "dependencies": { + "@langchain/core": "^0.3.72", + "@langchain/openai": "^0.6.9", + "@posthog/agent-toolkit": "^0.2.1", + "dotenv": "^16.4.7", + "langchain": "^0.3.31", + "zod": "^3.24.4" + }, + "devDependencies": { + "@types/node": "^22.15.34", + "tsx": "^4.20.3", + "typescript": "^5.8.3" + } +} diff --git a/products/mcp/examples/langchain-js/src/index.ts b/products/mcp/examples/langchain-js/src/index.ts new file mode 100644 index 0000000000..8fa1b143c4 --- /dev/null +++ b/products/mcp/examples/langchain-js/src/index.ts @@ -0,0 +1,61 @@ +import { ChatPromptTemplate, MessagesPlaceholder } from '@langchain/core/prompts' +import { ChatOpenAI } from '@langchain/openai' +import { PostHogAgentToolkit } from '@posthog/agent-toolkit/integrations/langchain' +import { AgentExecutor, createToolCallingAgent } from 'langchain/agents' +import 'dotenv/config' + +async function analyzeProductUsage() { + const agentToolkit = new PostHogAgentToolkit({ + posthogPersonalApiKey: process.env.POSTHOG_PERSONAL_API_KEY!, + posthogApiBaseUrl: process.env.POSTHOG_API_BASE_URL || 'https://us.posthog.com', + }) + + const tools = await agentToolkit.getTools() + + const llm = new ChatOpenAI({ + model: 'gpt-5-mini', + }) + + const prompt = ChatPromptTemplate.fromMessages([ + [ + 'system', + "You are a data analyst. Your task is to do a deep dive into what's happening in our product. Be concise and data-driven in your responses.", + ], + ['human', '{input}'], + new MessagesPlaceholder('agent_scratchpad'), + ]) + + const agent = createToolCallingAgent({ + llm, + tools, + prompt, + }) + + const agentExecutor = new AgentExecutor({ + agent, + tools, + verbose: false, + maxIterations: 5, + }) + + const result = await agentExecutor.invoke({ + input: `Please analyze our product usage: + + 1. Get all available insights (limit 100) and pick the 5 most relevant ones + 2. For each insight, query its data + 3. Summarize the key findings in a brief report + + Keep your response focused and data-driven.`, + }) +} + +async function main() { + try { + await analyzeProductUsage() + } catch (error) { + console.error('Error:', error) + process.exit(1) + } +} + +main().catch(console.error) diff --git a/products/mcp/examples/langchain-js/tsconfig.json b/products/mcp/examples/langchain-js/tsconfig.json new file mode 100644 index 0000000000..d72ae7b939 --- /dev/null +++ b/products/mcp/examples/langchain-js/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "lib": ["ES2022"], + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "allowJs": true, + "types": ["node"] + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/products/mcp/examples/langchain/README.md b/products/mcp/examples/langchain/README.md new file mode 100644 index 0000000000..a162c9bc7b --- /dev/null +++ b/products/mcp/examples/langchain/README.md @@ -0,0 +1,47 @@ +# PostHog LangChain Python Integration Example + +This example demonstrates how to use PostHog tools with LangChain using the `posthog_agent_toolkit` package, which provides a wrapper around the PostHog MCP (Model Context Protocol) server. + +## Setup + +1. Install dependencies: + +```bash +pip install posthog-agent-toolkit +# Or if using uv: +uv sync +``` + +2. Copy the environment file and fill in your credentials: + +```bash +cp .env.example .env +``` + +3. Update your `.env` file with: + - `POSTHOG_PERSONAL_API_KEY`: Your PostHog personal API key + - `OPENAI_API_KEY`: Your OpenAI API key + +## Usage + +Run the example: + +```bash +python posthog_agent_example.py +# Or if using uv: +uv run python posthog_agent_example.py +``` + +The example will: + +1. Connect to the PostHog MCP server using your personal API key +2. Load all available PostHog tools from the MCP server +3. Create a LangChain agent with access to PostHog data +4. Analyze product usage by: + - Getting available insights + - Querying data for the most relevant ones + - Summarizing key findings + +## Available Tools + +For a complete list of all available tools and their capabilities, see the [PostHog MCP documentation](https://posthog.com/docs/model-context-protocol). diff --git a/products/mcp/examples/langchain/posthog_agent_example.py b/products/mcp/examples/langchain/posthog_agent_example.py new file mode 100644 index 0000000000..e6a8463593 --- /dev/null +++ b/products/mcp/examples/langchain/posthog_agent_example.py @@ -0,0 +1,103 @@ +""" +PostHog LangChain Integration Example + +This example demonstrates how to use PostHog tools with LangChain using +the local posthog_agent_toolkit package. It shows how to analyze product +usage data similar to the TypeScript example. +""" + +import asyncio +import os +import sys + +from dotenv import load_dotenv +from langchain_openai import ChatOpenAI +from langchain.agents import AgentExecutor, create_tool_calling_agent +from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder +from posthog_agent_toolkit.integrations.langchain.toolkit import PostHogAgentToolkit + + +async def analyze_product_usage(): + """Analyze product usage using PostHog data.""" + + print("🚀 PostHog LangChain Agent - Product Usage Analysis\n") + + # Initialize the PostHog toolkit with credentials + toolkit = PostHogAgentToolkit( + personal_api_key=os.getenv("POSTHOG_PERSONAL_API_KEY"), + url=os.getenv("POSTHOG_MCP_URL", "https://mcp.posthog.com/mcp"), + ) + + # Get the tools + tools = await toolkit.get_tools() + + # Initialize the LLM + llm = ChatOpenAI(model="gpt-5-mini", temperature=0, api_key=os.getenv("OPENAI_API_KEY")) + + # Create a system prompt for the agent + prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + "You are a data analyst. Your task is to do a deep dive into what's happening in our product. " + "Be concise and data-driven in your responses.", + ), + ("human", "{input}"), + MessagesPlaceholder("agent_scratchpad"), + ] + ) + + agent = create_tool_calling_agent( + llm=llm, + tools=tools, + prompt=prompt, + ) + + agent_executor = AgentExecutor( + agent=agent, + tools=tools, + verbose=False, + max_iterations=30, + ) + + # Invoke the agent with an analysis request + result = await agent_executor.ainvoke( + { + "input": """Please analyze our product usage: + + 1. Get all available insights (limit 100) + 2. Pick the 5 MOST INTERESTING and VALUABLE insights - prioritize: + - User behavior and engagement metrics + - Conversion funnels + - Retention and growth metrics + - Product adoption insights + - Revenue or business KPIs + AVOID picking feature flag insights unless they show significant business impact + 3. For each selected insight, query its data and explain why it's important + 4. Summarize the key findings in a brief report with actionable recommendations + + Focus on insights that tell a story about user behavior and business performance.""" + } + ) + + print("\n📊 Analysis Complete!\n") + print("=" * 50) + print(result["output"]) + print("=" * 50) + + +async def main(): + """Main function to run the product usage analysis.""" + try: + # Load environment variables + load_dotenv() + + # Run the analysis + await analyze_product_usage() + except Exception as error: + print(f"Error: {error}") + sys.exit(1) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/products/mcp/examples/langchain/pyproject.toml b/products/mcp/examples/langchain/pyproject.toml new file mode 100644 index 0000000000..71f2b2adc4 --- /dev/null +++ b/products/mcp/examples/langchain/pyproject.toml @@ -0,0 +1,21 @@ +[project] +name = "posthog-langchain-example" +version = "0.1.0" +description = "PostHog LangChain integration example" +readme = "README.md" +requires-python = ">=3.11" +dependencies = [ + "langchain>=0.3.0", + "langchain-openai>=0.2.0", + "langchain-core>=0.3.0", + "python-dotenv>=1.0.0", + "posthog-agent-toolkit>=0.1.0", +] + +[tool.ruff] +line-length = 120 +target-version = "py311" + +[tool.black] +line-length = 120 +target-version = ['py311'] diff --git a/products/mcp/examples/langchain/uv.lock b/products/mcp/examples/langchain/uv.lock new file mode 100644 index 0000000000..dc21e9d28d --- /dev/null +++ b/products/mcp/examples/langchain/uv.lock @@ -0,0 +1,1218 @@ +version = 1 +revision = 2 +requires-python = ">=3.11" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/b4/636b3b65173d3ce9a38ef5f0522789614e590dab6a8d505340a4efe4c567/anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6", size = 213252, upload-time = "2025-08-04T08:54:26.451Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, +] + +[[package]] +name = "certifi" +version = "2025.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/b5/991245018615474a60965a7c9cd2b4efbaabd16d582a5547c47ee1c7730b/charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b", size = 204483, upload-time = "2025-08-09T07:55:53.12Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2a/ae245c41c06299ec18262825c1569c5d3298fc920e4ddf56ab011b417efd/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64", size = 145520, upload-time = "2025-08-09T07:55:54.712Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a4/b3b6c76e7a635748c4421d2b92c7b8f90a432f98bda5082049af37ffc8e3/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91", size = 158876, upload-time = "2025-08-09T07:55:56.024Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e6/63bb0e10f90a8243c5def74b5b105b3bbbfb3e7bb753915fe333fb0c11ea/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f", size = 156083, upload-time = "2025-08-09T07:55:57.582Z" }, + { url = "https://files.pythonhosted.org/packages/87/df/b7737ff046c974b183ea9aa111b74185ac8c3a326c6262d413bd5a1b8c69/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07", size = 150295, upload-time = "2025-08-09T07:55:59.147Z" }, + { url = "https://files.pythonhosted.org/packages/61/f1/190d9977e0084d3f1dc169acd060d479bbbc71b90bf3e7bf7b9927dec3eb/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30", size = 148379, upload-time = "2025-08-09T07:56:00.364Z" }, + { url = "https://files.pythonhosted.org/packages/4c/92/27dbe365d34c68cfe0ca76f1edd70e8705d82b378cb54ebbaeabc2e3029d/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14", size = 160018, upload-time = "2025-08-09T07:56:01.678Z" }, + { url = "https://files.pythonhosted.org/packages/99/04/baae2a1ea1893a01635d475b9261c889a18fd48393634b6270827869fa34/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c", size = 157430, upload-time = "2025-08-09T07:56:02.87Z" }, + { url = "https://files.pythonhosted.org/packages/2f/36/77da9c6a328c54d17b960c89eccacfab8271fdaaa228305330915b88afa9/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae", size = 151600, upload-time = "2025-08-09T07:56:04.089Z" }, + { url = "https://files.pythonhosted.org/packages/64/d4/9eb4ff2c167edbbf08cdd28e19078bf195762e9bd63371689cab5ecd3d0d/charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849", size = 99616, upload-time = "2025-08-09T07:56:05.658Z" }, + { url = "https://files.pythonhosted.org/packages/f4/9c/996a4a028222e7761a96634d1820de8a744ff4327a00ada9c8942033089b/charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c", size = 107108, upload-time = "2025-08-09T07:56:07.176Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5e/14c94999e418d9b87682734589404a25854d5f5d0408df68bc15b6ff54bb/charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", size = 205655, upload-time = "2025-08-09T07:56:08.475Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a8/c6ec5d389672521f644505a257f50544c074cf5fc292d5390331cd6fc9c3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", size = 146223, upload-time = "2025-08-09T07:56:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/fc/eb/a2ffb08547f4e1e5415fb69eb7db25932c52a52bed371429648db4d84fb1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", size = 159366, upload-time = "2025-08-09T07:56:11.326Z" }, + { url = "https://files.pythonhosted.org/packages/82/10/0fd19f20c624b278dddaf83b8464dcddc2456cb4b02bb902a6da126b87a1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", size = 157104, upload-time = "2025-08-09T07:56:13.014Z" }, + { url = "https://files.pythonhosted.org/packages/16/ab/0233c3231af734f5dfcf0844aa9582d5a1466c985bbed6cedab85af9bfe3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", size = 151830, upload-time = "2025-08-09T07:56:14.428Z" }, + { url = "https://files.pythonhosted.org/packages/ae/02/e29e22b4e02839a0e4a06557b1999d0a47db3567e82989b5bb21f3fbbd9f/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", size = 148854, upload-time = "2025-08-09T07:56:16.051Z" }, + { url = "https://files.pythonhosted.org/packages/05/6b/e2539a0a4be302b481e8cafb5af8792da8093b486885a1ae4d15d452bcec/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", size = 160670, upload-time = "2025-08-09T07:56:17.314Z" }, + { url = "https://files.pythonhosted.org/packages/31/e7/883ee5676a2ef217a40ce0bffcc3d0dfbf9e64cbcfbdf822c52981c3304b/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", size = 158501, upload-time = "2025-08-09T07:56:18.641Z" }, + { url = "https://files.pythonhosted.org/packages/c1/35/6525b21aa0db614cf8b5792d232021dca3df7f90a1944db934efa5d20bb1/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", size = 153173, upload-time = "2025-08-09T07:56:20.289Z" }, + { url = "https://files.pythonhosted.org/packages/50/ee/f4704bad8201de513fdc8aac1cabc87e38c5818c93857140e06e772b5892/charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", size = 99822, upload-time = "2025-08-09T07:56:21.551Z" }, + { url = "https://files.pythonhosted.org/packages/39/f5/3b3836ca6064d0992c58c7561c6b6eee1b3892e9665d650c803bd5614522/charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", size = 107543, upload-time = "2025-08-09T07:56:23.115Z" }, + { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload-time = "2025-08-09T07:56:24.721Z" }, + { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload-time = "2025-08-09T07:56:26.004Z" }, + { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload-time = "2025-08-09T07:56:27.25Z" }, + { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload-time = "2025-08-09T07:56:28.515Z" }, + { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload-time = "2025-08-09T07:56:29.716Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload-time = "2025-08-09T07:56:30.984Z" }, + { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload-time = "2025-08-09T07:56:32.252Z" }, + { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload-time = "2025-08-09T07:56:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload-time = "2025-08-09T07:56:34.739Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580, upload-time = "2025-08-09T07:56:35.981Z" }, + { url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366, upload-time = "2025-08-09T07:56:37.339Z" }, + { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" }, + { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" }, + { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" }, + { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload-time = "2025-08-09T07:56:52.722Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload-time = "2025-08-09T07:56:55.172Z" }, + { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, +] + +[[package]] +name = "click" +version = "8.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, +] + +[[package]] +name = "greenlet" +version = "3.2.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/b8/704d753a5a45507a7aab61f18db9509302ed3d0a27ac7e0359ec2905b1a6/greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d", size = 188260, upload-time = "2025-08-07T13:24:33.51Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/de/f28ced0a67749cac23fecb02b694f6473f47686dff6afaa211d186e2ef9c/greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2", size = 272305, upload-time = "2025-08-07T13:15:41.288Z" }, + { url = "https://files.pythonhosted.org/packages/09/16/2c3792cba130000bf2a31c5272999113f4764fd9d874fb257ff588ac779a/greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246", size = 632472, upload-time = "2025-08-07T13:42:55.044Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/95d48d7e3d433e6dae5b1682e4292242a53f22df82e6d3dda81b1701a960/greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3", size = 644646, upload-time = "2025-08-07T13:45:26.523Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5e/405965351aef8c76b8ef7ad370e5da58d57ef6068df197548b015464001a/greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633", size = 640519, upload-time = "2025-08-07T13:53:13.928Z" }, + { url = "https://files.pythonhosted.org/packages/25/5d/382753b52006ce0218297ec1b628e048c4e64b155379331f25a7316eb749/greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079", size = 639707, upload-time = "2025-08-07T13:18:27.146Z" }, + { url = "https://files.pythonhosted.org/packages/1f/8e/abdd3f14d735b2929290a018ecf133c901be4874b858dd1c604b9319f064/greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8", size = 587684, upload-time = "2025-08-07T13:18:25.164Z" }, + { url = "https://files.pythonhosted.org/packages/5d/65/deb2a69c3e5996439b0176f6651e0052542bb6c8f8ec2e3fba97c9768805/greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52", size = 1116647, upload-time = "2025-08-07T13:42:38.655Z" }, + { url = "https://files.pythonhosted.org/packages/3f/cc/b07000438a29ac5cfb2194bfc128151d52f333cee74dd7dfe3fb733fc16c/greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa", size = 1142073, upload-time = "2025-08-07T13:18:21.737Z" }, + { url = "https://files.pythonhosted.org/packages/d8/0f/30aef242fcab550b0b3520b8e3561156857c94288f0332a79928c31a52cf/greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9", size = 299100, upload-time = "2025-08-07T13:44:12.287Z" }, + { url = "https://files.pythonhosted.org/packages/44/69/9b804adb5fd0671f367781560eb5eb586c4d495277c93bde4307b9e28068/greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd", size = 274079, upload-time = "2025-08-07T13:15:45.033Z" }, + { url = "https://files.pythonhosted.org/packages/46/e9/d2a80c99f19a153eff70bc451ab78615583b8dac0754cfb942223d2c1a0d/greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb", size = 640997, upload-time = "2025-08-07T13:42:56.234Z" }, + { url = "https://files.pythonhosted.org/packages/3b/16/035dcfcc48715ccd345f3a93183267167cdd162ad123cd93067d86f27ce4/greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968", size = 655185, upload-time = "2025-08-07T13:45:27.624Z" }, + { url = "https://files.pythonhosted.org/packages/31/da/0386695eef69ffae1ad726881571dfe28b41970173947e7c558d9998de0f/greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9", size = 649926, upload-time = "2025-08-07T13:53:15.251Z" }, + { url = "https://files.pythonhosted.org/packages/68/88/69bf19fd4dc19981928ceacbc5fd4bb6bc2215d53199e367832e98d1d8fe/greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6", size = 651839, upload-time = "2025-08-07T13:18:30.281Z" }, + { url = "https://files.pythonhosted.org/packages/19/0d/6660d55f7373b2ff8152401a83e02084956da23ae58cddbfb0b330978fe9/greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", size = 607586, upload-time = "2025-08-07T13:18:28.544Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1a/c953fdedd22d81ee4629afbb38d2f9d71e37d23caace44775a3a969147d4/greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", size = 1123281, upload-time = "2025-08-07T13:42:39.858Z" }, + { url = "https://files.pythonhosted.org/packages/3f/c7/12381b18e21aef2c6bd3a636da1088b888b97b7a0362fac2e4de92405f97/greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f", size = 1151142, upload-time = "2025-08-07T13:18:22.981Z" }, + { url = "https://files.pythonhosted.org/packages/e9/08/b0814846b79399e585f974bbeebf5580fbe59e258ea7be64d9dfb253c84f/greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02", size = 299899, upload-time = "2025-08-07T13:38:53.448Z" }, + { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" }, + { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" }, + { url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191, upload-time = "2025-08-07T13:45:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/f2/d6/6adde57d1345a8d0f14d31e4ab9c23cfe8e2cd39c3baf7674b4b0338d266/greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", size = 649516, upload-time = "2025-08-07T13:53:16.314Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169, upload-time = "2025-08-07T13:18:32.861Z" }, + { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" }, + { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" }, + { url = "https://files.pythonhosted.org/packages/a2/15/0d5e4e1a66fab130d98168fe984c509249c833c1a3c16806b90f253ce7b9/greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae", size = 1149210, upload-time = "2025-08-07T13:18:24.072Z" }, + { url = "https://files.pythonhosted.org/packages/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b", size = 299685, upload-time = "2025-08-07T13:24:38.824Z" }, + { url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload-time = "2025-08-07T13:16:08.004Z" }, + { url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload-time = "2025-08-07T13:42:59.944Z" }, + { url = "https://files.pythonhosted.org/packages/c0/aa/687d6b12ffb505a4447567d1f3abea23bd20e73a5bed63871178e0831b7a/greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", size = 699218, upload-time = "2025-08-07T13:45:30.969Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659, upload-time = "2025-08-07T13:53:17.759Z" }, + { url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload-time = "2025-08-07T13:18:34.517Z" }, + { url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload-time = "2025-08-07T13:18:33.969Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a5/6ddab2b4c112be95601c13428db1d8b6608a8b6039816f2ba09c346c08fc/greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01", size = 303425, upload-time = "2025-08-07T13:32:27.59Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "httpx-sse" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fa/66bd985dd0b7c109a3bcb89272ee0bfb7e2b4d06309ad7b38ff866734b2a/httpx_sse-0.4.1.tar.gz", hash = "sha256:8f44d34414bc7b21bf3602713005c5df4917884f76072479b21f68befa4ea26e", size = 12998, upload-time = "2025-06-24T13:21:05.71Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/0a/6269e3473b09aed2dab8aa1a600c70f31f00ae1349bee30658f7e358a159/httpx_sse-0.4.1-py3-none-any.whl", hash = "sha256:cba42174344c3a5b06f255ce65b350880f962d99ead85e776f23c6618a377a37", size = 8054, upload-time = "2025-06-24T13:21:04.772Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "jiter" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/9d/ae7ddb4b8ab3fb1b51faf4deb36cb48a4fbbd7cb36bad6a5fca4741306f7/jiter-0.10.0.tar.gz", hash = "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500", size = 162759, upload-time = "2025-05-18T19:04:59.73Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/dd/6cefc6bd68b1c3c979cecfa7029ab582b57690a31cd2f346c4d0ce7951b6/jiter-0.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3bebe0c558e19902c96e99217e0b8e8b17d570906e72ed8a87170bc290b1e978", size = 317473, upload-time = "2025-05-18T19:03:25.942Z" }, + { url = "https://files.pythonhosted.org/packages/be/cf/fc33f5159ce132be1d8dd57251a1ec7a631c7df4bd11e1cd198308c6ae32/jiter-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:558cc7e44fd8e507a236bee6a02fa17199ba752874400a0ca6cd6e2196cdb7dc", size = 321971, upload-time = "2025-05-18T19:03:27.255Z" }, + { url = "https://files.pythonhosted.org/packages/68/a4/da3f150cf1d51f6c472616fb7650429c7ce053e0c962b41b68557fdf6379/jiter-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d613e4b379a07d7c8453c5712ce7014e86c6ac93d990a0b8e7377e18505e98d", size = 345574, upload-time = "2025-05-18T19:03:28.63Z" }, + { url = "https://files.pythonhosted.org/packages/84/34/6e8d412e60ff06b186040e77da5f83bc158e9735759fcae65b37d681f28b/jiter-0.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f62cf8ba0618eda841b9bf61797f21c5ebd15a7a1e19daab76e4e4b498d515b2", size = 371028, upload-time = "2025-05-18T19:03:30.292Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d9/9ee86173aae4576c35a2f50ae930d2ccb4c4c236f6cb9353267aa1d626b7/jiter-0.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:919d139cdfa8ae8945112398511cb7fca58a77382617d279556b344867a37e61", size = 491083, upload-time = "2025-05-18T19:03:31.654Z" }, + { url = "https://files.pythonhosted.org/packages/d9/2c/f955de55e74771493ac9e188b0f731524c6a995dffdcb8c255b89c6fb74b/jiter-0.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13ddbc6ae311175a3b03bd8994881bc4635c923754932918e18da841632349db", size = 388821, upload-time = "2025-05-18T19:03:33.184Z" }, + { url = "https://files.pythonhosted.org/packages/81/5a/0e73541b6edd3f4aada586c24e50626c7815c561a7ba337d6a7eb0a915b4/jiter-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c440ea003ad10927a30521a9062ce10b5479592e8a70da27f21eeb457b4a9c5", size = 352174, upload-time = "2025-05-18T19:03:34.965Z" }, + { url = "https://files.pythonhosted.org/packages/1c/c0/61eeec33b8c75b31cae42be14d44f9e6fe3ac15a4e58010256ac3abf3638/jiter-0.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc347c87944983481e138dea467c0551080c86b9d21de6ea9306efb12ca8f606", size = 391869, upload-time = "2025-05-18T19:03:36.436Z" }, + { url = "https://files.pythonhosted.org/packages/41/22/5beb5ee4ad4ef7d86f5ea5b4509f680a20706c4a7659e74344777efb7739/jiter-0.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:13252b58c1f4d8c5b63ab103c03d909e8e1e7842d302473f482915d95fefd605", size = 523741, upload-time = "2025-05-18T19:03:38.168Z" }, + { url = "https://files.pythonhosted.org/packages/ea/10/768e8818538e5817c637b0df52e54366ec4cebc3346108a4457ea7a98f32/jiter-0.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7d1bbf3c465de4a24ab12fb7766a0003f6f9bce48b8b6a886158c4d569452dc5", size = 514527, upload-time = "2025-05-18T19:03:39.577Z" }, + { url = "https://files.pythonhosted.org/packages/73/6d/29b7c2dc76ce93cbedabfd842fc9096d01a0550c52692dfc33d3cc889815/jiter-0.10.0-cp311-cp311-win32.whl", hash = "sha256:db16e4848b7e826edca4ccdd5b145939758dadf0dc06e7007ad0e9cfb5928ae7", size = 210765, upload-time = "2025-05-18T19:03:41.271Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c9/d394706deb4c660137caf13e33d05a031d734eb99c051142e039d8ceb794/jiter-0.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c9c1d5f10e18909e993f9641f12fe1c77b3e9b533ee94ffa970acc14ded3812", size = 209234, upload-time = "2025-05-18T19:03:42.918Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b5/348b3313c58f5fbfb2194eb4d07e46a35748ba6e5b3b3046143f3040bafa/jiter-0.10.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1e274728e4a5345a6dde2d343c8da018b9d4bd4350f5a472fa91f66fda44911b", size = 312262, upload-time = "2025-05-18T19:03:44.637Z" }, + { url = "https://files.pythonhosted.org/packages/9c/4a/6a2397096162b21645162825f058d1709a02965606e537e3304b02742e9b/jiter-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7202ae396446c988cb2a5feb33a543ab2165b786ac97f53b59aafb803fef0744", size = 320124, upload-time = "2025-05-18T19:03:46.341Z" }, + { url = "https://files.pythonhosted.org/packages/2a/85/1ce02cade7516b726dd88f59a4ee46914bf79d1676d1228ef2002ed2f1c9/jiter-0.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ba7722d6748b6920ed02a8f1726fb4b33e0fd2f3f621816a8b486c66410ab2", size = 345330, upload-time = "2025-05-18T19:03:47.596Z" }, + { url = "https://files.pythonhosted.org/packages/75/d0/bb6b4f209a77190ce10ea8d7e50bf3725fc16d3372d0a9f11985a2b23eff/jiter-0.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:371eab43c0a288537d30e1f0b193bc4eca90439fc08a022dd83e5e07500ed026", size = 369670, upload-time = "2025-05-18T19:03:49.334Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f5/a61787da9b8847a601e6827fbc42ecb12be2c925ced3252c8ffcb56afcaf/jiter-0.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c675736059020365cebc845a820214765162728b51ab1e03a1b7b3abb70f74c", size = 489057, upload-time = "2025-05-18T19:03:50.66Z" }, + { url = "https://files.pythonhosted.org/packages/12/e4/6f906272810a7b21406c760a53aadbe52e99ee070fc5c0cb191e316de30b/jiter-0.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c5867d40ab716e4684858e4887489685968a47e3ba222e44cde6e4a2154f959", size = 389372, upload-time = "2025-05-18T19:03:51.98Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ba/77013b0b8ba904bf3762f11e0129b8928bff7f978a81838dfcc958ad5728/jiter-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395bb9a26111b60141757d874d27fdea01b17e8fac958b91c20128ba8f4acc8a", size = 352038, upload-time = "2025-05-18T19:03:53.703Z" }, + { url = "https://files.pythonhosted.org/packages/67/27/c62568e3ccb03368dbcc44a1ef3a423cb86778a4389e995125d3d1aaa0a4/jiter-0.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6842184aed5cdb07e0c7e20e5bdcfafe33515ee1741a6835353bb45fe5d1bd95", size = 391538, upload-time = "2025-05-18T19:03:55.046Z" }, + { url = "https://files.pythonhosted.org/packages/c0/72/0d6b7e31fc17a8fdce76164884edef0698ba556b8eb0af9546ae1a06b91d/jiter-0.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62755d1bcea9876770d4df713d82606c8c1a3dca88ff39046b85a048566d56ea", size = 523557, upload-time = "2025-05-18T19:03:56.386Z" }, + { url = "https://files.pythonhosted.org/packages/2f/09/bc1661fbbcbeb6244bd2904ff3a06f340aa77a2b94e5a7373fd165960ea3/jiter-0.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533efbce2cacec78d5ba73a41756beff8431dfa1694b6346ce7af3a12c42202b", size = 514202, upload-time = "2025-05-18T19:03:57.675Z" }, + { url = "https://files.pythonhosted.org/packages/1b/84/5a5d5400e9d4d54b8004c9673bbe4403928a00d28529ff35b19e9d176b19/jiter-0.10.0-cp312-cp312-win32.whl", hash = "sha256:8be921f0cadd245e981b964dfbcd6fd4bc4e254cdc069490416dd7a2632ecc01", size = 211781, upload-time = "2025-05-18T19:03:59.025Z" }, + { url = "https://files.pythonhosted.org/packages/9b/52/7ec47455e26f2d6e5f2ea4951a0652c06e5b995c291f723973ae9e724a65/jiter-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:a7c7d785ae9dda68c2678532a5a1581347e9c15362ae9f6e68f3fdbfb64f2e49", size = 206176, upload-time = "2025-05-18T19:04:00.305Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b0/279597e7a270e8d22623fea6c5d4eeac328e7d95c236ed51a2b884c54f70/jiter-0.10.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e0588107ec8e11b6f5ef0e0d656fb2803ac6cf94a96b2b9fc675c0e3ab5e8644", size = 311617, upload-time = "2025-05-18T19:04:02.078Z" }, + { url = "https://files.pythonhosted.org/packages/91/e3/0916334936f356d605f54cc164af4060e3e7094364add445a3bc79335d46/jiter-0.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cafc4628b616dc32530c20ee53d71589816cf385dd9449633e910d596b1f5c8a", size = 318947, upload-time = "2025-05-18T19:04:03.347Z" }, + { url = "https://files.pythonhosted.org/packages/6a/8e/fd94e8c02d0e94539b7d669a7ebbd2776e51f329bb2c84d4385e8063a2ad/jiter-0.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:520ef6d981172693786a49ff5b09eda72a42e539f14788124a07530f785c3ad6", size = 344618, upload-time = "2025-05-18T19:04:04.709Z" }, + { url = "https://files.pythonhosted.org/packages/6f/b0/f9f0a2ec42c6e9c2e61c327824687f1e2415b767e1089c1d9135f43816bd/jiter-0.10.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:554dedfd05937f8fc45d17ebdf298fe7e0c77458232bcb73d9fbbf4c6455f5b3", size = 368829, upload-time = "2025-05-18T19:04:06.912Z" }, + { url = "https://files.pythonhosted.org/packages/e8/57/5bbcd5331910595ad53b9fd0c610392ac68692176f05ae48d6ce5c852967/jiter-0.10.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bc299da7789deacf95f64052d97f75c16d4fc8c4c214a22bf8d859a4288a1c2", size = 491034, upload-time = "2025-05-18T19:04:08.222Z" }, + { url = "https://files.pythonhosted.org/packages/9b/be/c393df00e6e6e9e623a73551774449f2f23b6ec6a502a3297aeeece2c65a/jiter-0.10.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5161e201172de298a8a1baad95eb85db4fb90e902353b1f6a41d64ea64644e25", size = 388529, upload-time = "2025-05-18T19:04:09.566Z" }, + { url = "https://files.pythonhosted.org/packages/42/3e/df2235c54d365434c7f150b986a6e35f41ebdc2f95acea3036d99613025d/jiter-0.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2227db6ba93cb3e2bf67c87e594adde0609f146344e8207e8730364db27041", size = 350671, upload-time = "2025-05-18T19:04:10.98Z" }, + { url = "https://files.pythonhosted.org/packages/c6/77/71b0b24cbcc28f55ab4dbfe029f9a5b73aeadaba677843fc6dc9ed2b1d0a/jiter-0.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15acb267ea5e2c64515574b06a8bf393fbfee6a50eb1673614aa45f4613c0cca", size = 390864, upload-time = "2025-05-18T19:04:12.722Z" }, + { url = "https://files.pythonhosted.org/packages/6a/d3/ef774b6969b9b6178e1d1e7a89a3bd37d241f3d3ec5f8deb37bbd203714a/jiter-0.10.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:901b92f2e2947dc6dfcb52fd624453862e16665ea909a08398dde19c0731b7f4", size = 522989, upload-time = "2025-05-18T19:04:14.261Z" }, + { url = "https://files.pythonhosted.org/packages/0c/41/9becdb1d8dd5d854142f45a9d71949ed7e87a8e312b0bede2de849388cb9/jiter-0.10.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d0cb9a125d5a3ec971a094a845eadde2db0de85b33c9f13eb94a0c63d463879e", size = 513495, upload-time = "2025-05-18T19:04:15.603Z" }, + { url = "https://files.pythonhosted.org/packages/9c/36/3468e5a18238bdedae7c4d19461265b5e9b8e288d3f86cd89d00cbb48686/jiter-0.10.0-cp313-cp313-win32.whl", hash = "sha256:48a403277ad1ee208fb930bdf91745e4d2d6e47253eedc96e2559d1e6527006d", size = 211289, upload-time = "2025-05-18T19:04:17.541Z" }, + { url = "https://files.pythonhosted.org/packages/7e/07/1c96b623128bcb913706e294adb5f768fb7baf8db5e1338ce7b4ee8c78ef/jiter-0.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:75f9eb72ecb640619c29bf714e78c9c46c9c4eaafd644bf78577ede459f330d4", size = 205074, upload-time = "2025-05-18T19:04:19.21Z" }, + { url = "https://files.pythonhosted.org/packages/54/46/caa2c1342655f57d8f0f2519774c6d67132205909c65e9aa8255e1d7b4f4/jiter-0.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:28ed2a4c05a1f32ef0e1d24c2611330219fed727dae01789f4a335617634b1ca", size = 318225, upload-time = "2025-05-18T19:04:20.583Z" }, + { url = "https://files.pythonhosted.org/packages/43/84/c7d44c75767e18946219ba2d703a5a32ab37b0bc21886a97bc6062e4da42/jiter-0.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a4c418b1ec86a195f1ca69da8b23e8926c752b685af665ce30777233dfe070", size = 350235, upload-time = "2025-05-18T19:04:22.363Z" }, + { url = "https://files.pythonhosted.org/packages/01/16/f5a0135ccd968b480daad0e6ab34b0c7c5ba3bc447e5088152696140dcb3/jiter-0.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d7bfed2fe1fe0e4dda6ef682cee888ba444b21e7a6553e03252e4feb6cf0adca", size = 207278, upload-time = "2025-05-18T19:04:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9b/1d646da42c3de6c2188fdaa15bce8ecb22b635904fc68be025e21249ba44/jiter-0.10.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:5e9251a5e83fab8d87799d3e1a46cb4b7f2919b895c6f4483629ed2446f66522", size = 310866, upload-time = "2025-05-18T19:04:24.891Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0e/26538b158e8a7c7987e94e7aeb2999e2e82b1f9d2e1f6e9874ddf71ebda0/jiter-0.10.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:023aa0204126fe5b87ccbcd75c8a0d0261b9abdbbf46d55e7ae9f8e22424eeb8", size = 318772, upload-time = "2025-05-18T19:04:26.161Z" }, + { url = "https://files.pythonhosted.org/packages/7b/fb/d302893151caa1c2636d6574d213e4b34e31fd077af6050a9c5cbb42f6fb/jiter-0.10.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c189c4f1779c05f75fc17c0c1267594ed918996a231593a21a5ca5438445216", size = 344534, upload-time = "2025-05-18T19:04:27.495Z" }, + { url = "https://files.pythonhosted.org/packages/01/d8/5780b64a149d74e347c5128d82176eb1e3241b1391ac07935693466d6219/jiter-0.10.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15720084d90d1098ca0229352607cd68256c76991f6b374af96f36920eae13c4", size = 369087, upload-time = "2025-05-18T19:04:28.896Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5b/f235a1437445160e777544f3ade57544daf96ba7e96c1a5b24a6f7ac7004/jiter-0.10.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4f2fb68e5f1cfee30e2b2a09549a00683e0fde4c6a2ab88c94072fc33cb7426", size = 490694, upload-time = "2025-05-18T19:04:30.183Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/9c3d4617caa2ff89cf61b41e83820c27ebb3f7b5fae8a72901e8cd6ff9be/jiter-0.10.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce541693355fc6da424c08b7edf39a2895f58d6ea17d92cc2b168d20907dee12", size = 388992, upload-time = "2025-05-18T19:04:32.028Z" }, + { url = "https://files.pythonhosted.org/packages/68/b1/344fd14049ba5c94526540af7eb661871f9c54d5f5601ff41a959b9a0bbd/jiter-0.10.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31c50c40272e189d50006ad5c73883caabb73d4e9748a688b216e85a9a9ca3b9", size = 351723, upload-time = "2025-05-18T19:04:33.467Z" }, + { url = "https://files.pythonhosted.org/packages/41/89/4c0e345041186f82a31aee7b9d4219a910df672b9fef26f129f0cda07a29/jiter-0.10.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa3402a2ff9815960e0372a47b75c76979d74402448509ccd49a275fa983ef8a", size = 392215, upload-time = "2025-05-18T19:04:34.827Z" }, + { url = "https://files.pythonhosted.org/packages/55/58/ee607863e18d3f895feb802154a2177d7e823a7103f000df182e0f718b38/jiter-0.10.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:1956f934dca32d7bb647ea21d06d93ca40868b505c228556d3373cbd255ce853", size = 522762, upload-time = "2025-05-18T19:04:36.19Z" }, + { url = "https://files.pythonhosted.org/packages/15/d0/9123fb41825490d16929e73c212de9a42913d68324a8ce3c8476cae7ac9d/jiter-0.10.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:fcedb049bdfc555e261d6f65a6abe1d5ad68825b7202ccb9692636c70fcced86", size = 513427, upload-time = "2025-05-18T19:04:37.544Z" }, + { url = "https://files.pythonhosted.org/packages/d8/b3/2bd02071c5a2430d0b70403a34411fc519c2f227da7b03da9ba6a956f931/jiter-0.10.0-cp314-cp314-win32.whl", hash = "sha256:ac509f7eccca54b2a29daeb516fb95b6f0bd0d0d8084efaf8ed5dfc7b9f0b357", size = 210127, upload-time = "2025-05-18T19:04:38.837Z" }, + { url = "https://files.pythonhosted.org/packages/03/0c/5fe86614ea050c3ecd728ab4035534387cd41e7c1855ef6c031f1ca93e3f/jiter-0.10.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5ed975b83a2b8639356151cef5c0d597c68376fc4922b45d0eb384ac058cfa00", size = 318527, upload-time = "2025-05-18T19:04:40.612Z" }, + { url = "https://files.pythonhosted.org/packages/b3/4a/4175a563579e884192ba6e81725fc0448b042024419be8d83aa8a80a3f44/jiter-0.10.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa96f2abba33dc77f79b4cf791840230375f9534e5fac927ccceb58c5e604a5", size = 354213, upload-time = "2025-05-18T19:04:41.894Z" }, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpointer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699, upload-time = "2023-06-26T12:07:29.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898, upload-time = "2023-06-16T21:01:28.466Z" }, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114, upload-time = "2024-06-10T19:24:42.462Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.25.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "langchain" +version = "0.3.27" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "langchain-text-splitters" }, + { name = "langsmith" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "sqlalchemy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/f6/f4f7f3a56626fe07e2bb330feb61254dbdf06c506e6b59a536a337da51cf/langchain-0.3.27.tar.gz", hash = "sha256:aa6f1e6274ff055d0fd36254176770f356ed0a8994297d1df47df341953cec62", size = 10233809, upload-time = "2025-07-24T14:42:32.959Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/d5/4861816a95b2f6993f1360cfb605aacb015506ee2090433a71de9cca8477/langchain-0.3.27-py3-none-any.whl", hash = "sha256:7b20c4f338826acb148d885b20a73a16e410ede9ee4f19bb02011852d5f98798", size = 1018194, upload-time = "2025-07-24T14:42:30.23Z" }, +] + +[[package]] +name = "langchain-core" +version = "0.3.75" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpatch" }, + { name = "langsmith" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "tenacity" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/63/270b71a23e849984505ddc7c5c9fd3f4bd9cb14b1a484ee44c4e51c33cc2/langchain_core-0.3.75.tar.gz", hash = "sha256:ab0eb95a06ed6043f76162e6086b45037690cb70b7f090bd83b5ebb8a05b70ed", size = 570876, upload-time = "2025-08-26T15:24:12.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/42/0d0221cce6f168f644d7d96cb6c87c4e42fc55d2941da7a36e970e3ab8ab/langchain_core-0.3.75-py3-none-any.whl", hash = "sha256:03ca1fadf955ee3c7d5806a841f4b3a37b816acea5e61a7e6ba1298c05eea7f5", size = 443986, upload-time = "2025-08-26T15:24:10.883Z" }, +] + +[[package]] +name = "langchain-mcp-adapters" +version = "0.1.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "mcp" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/74/e36003a43136f9095a5f968c730fbfe894f94284ebe6d2b50bb17d41b8b5/langchain_mcp_adapters-0.1.9.tar.gz", hash = "sha256:0018cf7b5f7bc4c044e05ec20fcb9ebe345311c8d1060c61d411188001ab3aab", size = 22101, upload-time = "2025-07-09T15:56:14.455Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/eb/9e98822d3db22beff44449a8f61fca208d4f59d592a7ce67ce4c400b8f8f/langchain_mcp_adapters-0.1.9-py3-none-any.whl", hash = "sha256:fd131009c60c9e5a864f96576bbe757fc1809abd604891cb2e5d6e8aebd6975c", size = 15300, upload-time = "2025-07-09T15:56:13.316Z" }, +] + +[[package]] +name = "langchain-openai" +version = "0.3.32" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "openai" }, + { name = "tiktoken" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7e/19/167d9ad1b6bb75406c4acceda01ef0dc1101c7f629f74441fe8a787fb190/langchain_openai-0.3.32.tar.gz", hash = "sha256:782ad669bd1bdb964456d8882c5178717adcfceecb482cc20005f770e43d346d", size = 782982, upload-time = "2025-08-26T14:25:27.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/3d/e22ee65fff79afe7bdfbd67844243eb279b440c882dad9e4262dcc87131f/langchain_openai-0.3.32-py3-none-any.whl", hash = "sha256:3354f76822f7cc76d8069831fe2a77f9bc7ff3b4f13af788bd94e4c6e853b400", size = 74531, upload-time = "2025-08-26T14:25:26.542Z" }, +] + +[[package]] +name = "langchain-text-splitters" +version = "0.3.11" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/11/43/dcda8fd25f0b19cb2835f2f6bb67f26ad58634f04ac2d8eae00526b0fa55/langchain_text_splitters-0.3.11.tar.gz", hash = "sha256:7a50a04ada9a133bbabb80731df7f6ddac51bc9f1b9cab7fa09304d71d38a6cc", size = 46458, upload-time = "2025-08-31T23:02:58.316Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/0d/41a51b40d24ff0384ec4f7ab8dd3dcea8353c05c973836b5e289f1465d4f/langchain_text_splitters-0.3.11-py3-none-any.whl", hash = "sha256:cf079131166a487f1372c8ab5d0bfaa6c0a4291733d9c43a34a16ac9bcd6a393", size = 33845, upload-time = "2025-08-31T23:02:57.195Z" }, +] + +[[package]] +name = "langsmith" +version = "0.4.21" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "requests-toolbelt" }, + { name = "zstandard" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/ad/2c89c128b575d89ba7c7af05de6d715703fe9648110f2ec3c90255956681/langsmith-0.4.21.tar.gz", hash = "sha256:eabfb66970d50964918acba524b407e8cfe585448013e3135ca92388c858d009", size = 938666, upload-time = "2025-08-29T21:46:27.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/79/5ccad558563861f7ae6a77aeba259578c35192e9c109b0142fcf490b3c50/langsmith-0.4.21-py3-none-any.whl", hash = "sha256:15b189e2e7a3337a07cf250d91e158efcd0b39458735dc9e583c56dd0f21e4e0", size = 378494, upload-time = "2025-08-29T21:46:24.714Z" }, +] + +[[package]] +name = "mcp" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "httpx" }, + { name = "httpx-sse" }, + { name = "jsonschema" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "python-multipart" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "sse-starlette" }, + { name = "starlette" }, + { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/fd/d6e941a52446198b73e5e4a953441f667f1469aeb06fb382d9f6729d6168/mcp-1.14.0.tar.gz", hash = "sha256:2e7d98b195e08b2abc1dc6191f6f3dc0059604ac13ee6a40f88676274787fac4", size = 454855, upload-time = "2025-09-11T17:40:48.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/7b/84b0dd4c2c5a499d2c5d63fb7a1224c25fc4c8b6c24623fa7a566471480d/mcp-1.14.0-py3-none-any.whl", hash = "sha256:b2d27feba27b4c53d41b58aa7f4d090ae0cb740cbc4e339af10f8cbe54c4e19d", size = 163805, upload-time = "2025-09-11T17:40:46.891Z" }, +] + +[[package]] +name = "openai" +version = "1.102.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/55/da5598ed5c6bdd9939633854049cddc5cbac0da938dfcfcb3c6b119c16c0/openai-1.102.0.tar.gz", hash = "sha256:2e0153bcd64a6523071e90211cbfca1f2bbc5ceedd0993ba932a5869f93b7fc9", size = 519027, upload-time = "2025-08-26T20:50:29.397Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/0d/c9e7016d82c53c5b5e23e2bad36daebb8921ed44f69c0a985c6529a35106/openai-1.102.0-py3-none-any.whl", hash = "sha256:d751a7e95e222b5325306362ad02a7aa96e1fab3ed05b5888ce1c7ca63451345", size = 812015, upload-time = "2025-08-26T20:50:27.219Z" }, +] + +[[package]] +name = "orjson" +version = "3.11.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/4d/8df5f83256a809c22c4d6792ce8d43bb503be0fb7a8e4da9025754b09658/orjson-3.11.3.tar.gz", hash = "sha256:1c0603b1d2ffcd43a411d64797a19556ef76958aef1c182f22dc30860152a98a", size = 5482394, upload-time = "2025-08-26T17:46:43.171Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/8b/360674cd817faef32e49276187922a946468579fcaf37afdfb6c07046e92/orjson-3.11.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9d2ae0cc6aeb669633e0124531f342a17d8e97ea999e42f12a5ad4adaa304c5f", size = 238238, upload-time = "2025-08-26T17:44:54.214Z" }, + { url = "https://files.pythonhosted.org/packages/05/3d/5fa9ea4b34c1a13be7d9046ba98d06e6feb1d8853718992954ab59d16625/orjson-3.11.3-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:ba21dbb2493e9c653eaffdc38819b004b7b1b246fb77bfc93dc016fe664eac91", size = 127713, upload-time = "2025-08-26T17:44:55.596Z" }, + { url = "https://files.pythonhosted.org/packages/e5/5f/e18367823925e00b1feec867ff5f040055892fc474bf5f7875649ecfa586/orjson-3.11.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00f1a271e56d511d1569937c0447d7dce5a99a33ea0dec76673706360a051904", size = 123241, upload-time = "2025-08-26T17:44:57.185Z" }, + { url = "https://files.pythonhosted.org/packages/0f/bd/3c66b91c4564759cf9f473251ac1650e446c7ba92a7c0f9f56ed54f9f0e6/orjson-3.11.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b67e71e47caa6680d1b6f075a396d04fa6ca8ca09aafb428731da9b3ea32a5a6", size = 127895, upload-time = "2025-08-26T17:44:58.349Z" }, + { url = "https://files.pythonhosted.org/packages/82/b5/dc8dcd609db4766e2967a85f63296c59d4722b39503e5b0bf7fd340d387f/orjson-3.11.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7d012ebddffcce8c85734a6d9e5f08180cd3857c5f5a3ac70185b43775d043d", size = 130303, upload-time = "2025-08-26T17:44:59.491Z" }, + { url = "https://files.pythonhosted.org/packages/48/c2/d58ec5fd1270b2aa44c862171891adc2e1241bd7dab26c8f46eb97c6c6f1/orjson-3.11.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd759f75d6b8d1b62012b7f5ef9461d03c804f94d539a5515b454ba3a6588038", size = 132366, upload-time = "2025-08-26T17:45:00.654Z" }, + { url = "https://files.pythonhosted.org/packages/73/87/0ef7e22eb8dd1ef940bfe3b9e441db519e692d62ed1aae365406a16d23d0/orjson-3.11.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6890ace0809627b0dff19cfad92d69d0fa3f089d3e359a2a532507bb6ba34efb", size = 135180, upload-time = "2025-08-26T17:45:02.424Z" }, + { url = "https://files.pythonhosted.org/packages/bb/6a/e5bf7b70883f374710ad74faf99bacfc4b5b5a7797c1d5e130350e0e28a3/orjson-3.11.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d4a5e041ae435b815e568537755773d05dac031fee6a57b4ba70897a44d9d2", size = 132741, upload-time = "2025-08-26T17:45:03.663Z" }, + { url = "https://files.pythonhosted.org/packages/bd/0c/4577fd860b6386ffaa56440e792af01c7882b56d2766f55384b5b0e9d39b/orjson-3.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d68bf97a771836687107abfca089743885fb664b90138d8761cce61d5625d55", size = 131104, upload-time = "2025-08-26T17:45:04.939Z" }, + { url = "https://files.pythonhosted.org/packages/66/4b/83e92b2d67e86d1c33f2ea9411742a714a26de63641b082bdbf3d8e481af/orjson-3.11.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bfc27516ec46f4520b18ef645864cee168d2a027dbf32c5537cb1f3e3c22dac1", size = 403887, upload-time = "2025-08-26T17:45:06.228Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e5/9eea6a14e9b5ceb4a271a1fd2e1dec5f2f686755c0fab6673dc6ff3433f4/orjson-3.11.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f66b001332a017d7945e177e282a40b6997056394e3ed7ddb41fb1813b83e824", size = 145855, upload-time = "2025-08-26T17:45:08.338Z" }, + { url = "https://files.pythonhosted.org/packages/45/78/8d4f5ad0c80ba9bf8ac4d0fc71f93a7d0dc0844989e645e2074af376c307/orjson-3.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:212e67806525d2561efbfe9e799633b17eb668b8964abed6b5319b2f1cfbae1f", size = 135361, upload-time = "2025-08-26T17:45:09.625Z" }, + { url = "https://files.pythonhosted.org/packages/0b/5f/16386970370178d7a9b438517ea3d704efcf163d286422bae3b37b88dbb5/orjson-3.11.3-cp311-cp311-win32.whl", hash = "sha256:6e8e0c3b85575a32f2ffa59de455f85ce002b8bdc0662d6b9c2ed6d80ab5d204", size = 136190, upload-time = "2025-08-26T17:45:10.962Z" }, + { url = "https://files.pythonhosted.org/packages/09/60/db16c6f7a41dd8ac9fb651f66701ff2aeb499ad9ebc15853a26c7c152448/orjson-3.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:6be2f1b5d3dc99a5ce5ce162fc741c22ba9f3443d3dd586e6a1211b7bc87bc7b", size = 131389, upload-time = "2025-08-26T17:45:12.285Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2a/bb811ad336667041dea9b8565c7c9faf2f59b47eb5ab680315eea612ef2e/orjson-3.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:fafb1a99d740523d964b15c8db4eabbfc86ff29f84898262bf6e3e4c9e97e43e", size = 126120, upload-time = "2025-08-26T17:45:13.515Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b0/a7edab2a00cdcb2688e1c943401cb3236323e7bfd2839815c6131a3742f4/orjson-3.11.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8c752089db84333e36d754c4baf19c0e1437012242048439c7e80eb0e6426e3b", size = 238259, upload-time = "2025-08-26T17:45:15.093Z" }, + { url = "https://files.pythonhosted.org/packages/e1/c6/ff4865a9cc398a07a83342713b5932e4dc3cb4bf4bc04e8f83dedfc0d736/orjson-3.11.3-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:9b8761b6cf04a856eb544acdd82fc594b978f12ac3602d6374a7edb9d86fd2c2", size = 127633, upload-time = "2025-08-26T17:45:16.417Z" }, + { url = "https://files.pythonhosted.org/packages/6e/e6/e00bea2d9472f44fe8794f523e548ce0ad51eb9693cf538a753a27b8bda4/orjson-3.11.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b13974dc8ac6ba22feaa867fc19135a3e01a134b4f7c9c28162fed4d615008a", size = 123061, upload-time = "2025-08-26T17:45:17.673Z" }, + { url = "https://files.pythonhosted.org/packages/54/31/9fbb78b8e1eb3ac605467cb846e1c08d0588506028b37f4ee21f978a51d4/orjson-3.11.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f83abab5bacb76d9c821fd5c07728ff224ed0e52d7a71b7b3de822f3df04e15c", size = 127956, upload-time = "2025-08-26T17:45:19.172Z" }, + { url = "https://files.pythonhosted.org/packages/36/88/b0604c22af1eed9f98d709a96302006915cfd724a7ebd27d6dd11c22d80b/orjson-3.11.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6fbaf48a744b94091a56c62897b27c31ee2da93d826aa5b207131a1e13d4064", size = 130790, upload-time = "2025-08-26T17:45:20.586Z" }, + { url = "https://files.pythonhosted.org/packages/0e/9d/1c1238ae9fffbfed51ba1e507731b3faaf6b846126a47e9649222b0fd06f/orjson-3.11.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc779b4f4bba2847d0d2940081a7b6f7b5877e05408ffbb74fa1faf4a136c424", size = 132385, upload-time = "2025-08-26T17:45:22.036Z" }, + { url = "https://files.pythonhosted.org/packages/a3/b5/c06f1b090a1c875f337e21dd71943bc9d84087f7cdf8c6e9086902c34e42/orjson-3.11.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd4b909ce4c50faa2192da6bb684d9848d4510b736b0611b6ab4020ea6fd2d23", size = 135305, upload-time = "2025-08-26T17:45:23.4Z" }, + { url = "https://files.pythonhosted.org/packages/a0/26/5f028c7d81ad2ebbf84414ba6d6c9cac03f22f5cd0d01eb40fb2d6a06b07/orjson-3.11.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:524b765ad888dc5518bbce12c77c2e83dee1ed6b0992c1790cc5fb49bb4b6667", size = 132875, upload-time = "2025-08-26T17:45:25.182Z" }, + { url = "https://files.pythonhosted.org/packages/fe/d4/b8df70d9cfb56e385bf39b4e915298f9ae6c61454c8154a0f5fd7efcd42e/orjson-3.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:84fd82870b97ae3cdcea9d8746e592b6d40e1e4d4527835fc520c588d2ded04f", size = 130940, upload-time = "2025-08-26T17:45:27.209Z" }, + { url = "https://files.pythonhosted.org/packages/da/5e/afe6a052ebc1a4741c792dd96e9f65bf3939d2094e8b356503b68d48f9f5/orjson-3.11.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fbecb9709111be913ae6879b07bafd4b0785b44c1eb5cac8ac76da048b3885a1", size = 403852, upload-time = "2025-08-26T17:45:28.478Z" }, + { url = "https://files.pythonhosted.org/packages/f8/90/7bbabafeb2ce65915e9247f14a56b29c9334003536009ef5b122783fe67e/orjson-3.11.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9dba358d55aee552bd868de348f4736ca5a4086d9a62e2bfbbeeb5629fe8b0cc", size = 146293, upload-time = "2025-08-26T17:45:29.86Z" }, + { url = "https://files.pythonhosted.org/packages/27/b3/2d703946447da8b093350570644a663df69448c9d9330e5f1d9cce997f20/orjson-3.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eabcf2e84f1d7105f84580e03012270c7e97ecb1fb1618bda395061b2a84a049", size = 135470, upload-time = "2025-08-26T17:45:31.243Z" }, + { url = "https://files.pythonhosted.org/packages/38/70/b14dcfae7aff0e379b0119c8a812f8396678919c431efccc8e8a0263e4d9/orjson-3.11.3-cp312-cp312-win32.whl", hash = "sha256:3782d2c60b8116772aea8d9b7905221437fdf53e7277282e8d8b07c220f96cca", size = 136248, upload-time = "2025-08-26T17:45:32.567Z" }, + { url = "https://files.pythonhosted.org/packages/35/b8/9e3127d65de7fff243f7f3e53f59a531bf6bb295ebe5db024c2503cc0726/orjson-3.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:79b44319268af2eaa3e315b92298de9a0067ade6e6003ddaef72f8e0bedb94f1", size = 131437, upload-time = "2025-08-26T17:45:34.949Z" }, + { url = "https://files.pythonhosted.org/packages/51/92/a946e737d4d8a7fd84a606aba96220043dcc7d6988b9e7551f7f6d5ba5ad/orjson-3.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:0e92a4e83341ef79d835ca21b8bd13e27c859e4e9e4d7b63defc6e58462a3710", size = 125978, upload-time = "2025-08-26T17:45:36.422Z" }, + { url = "https://files.pythonhosted.org/packages/fc/79/8932b27293ad35919571f77cb3693b5906cf14f206ef17546052a241fdf6/orjson-3.11.3-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:af40c6612fd2a4b00de648aa26d18186cd1322330bd3a3cc52f87c699e995810", size = 238127, upload-time = "2025-08-26T17:45:38.146Z" }, + { url = "https://files.pythonhosted.org/packages/1c/82/cb93cd8cf132cd7643b30b6c5a56a26c4e780c7a145db6f83de977b540ce/orjson-3.11.3-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:9f1587f26c235894c09e8b5b7636a38091a9e6e7fe4531937534749c04face43", size = 127494, upload-time = "2025-08-26T17:45:39.57Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b8/2d9eb181a9b6bb71463a78882bcac1027fd29cf62c38a40cc02fc11d3495/orjson-3.11.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61dcdad16da5bb486d7227a37a2e789c429397793a6955227cedbd7252eb5a27", size = 123017, upload-time = "2025-08-26T17:45:40.876Z" }, + { url = "https://files.pythonhosted.org/packages/b4/14/a0e971e72d03b509190232356d54c0f34507a05050bd026b8db2bf2c192c/orjson-3.11.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:11c6d71478e2cbea0a709e8a06365fa63da81da6498a53e4c4f065881d21ae8f", size = 127898, upload-time = "2025-08-26T17:45:42.188Z" }, + { url = "https://files.pythonhosted.org/packages/8e/af/dc74536722b03d65e17042cc30ae586161093e5b1f29bccda24765a6ae47/orjson-3.11.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff94112e0098470b665cb0ed06efb187154b63649403b8d5e9aedeb482b4548c", size = 130742, upload-time = "2025-08-26T17:45:43.511Z" }, + { url = "https://files.pythonhosted.org/packages/62/e6/7a3b63b6677bce089fe939353cda24a7679825c43a24e49f757805fc0d8a/orjson-3.11.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae8b756575aaa2a855a75192f356bbda11a89169830e1439cfb1a3e1a6dde7be", size = 132377, upload-time = "2025-08-26T17:45:45.525Z" }, + { url = "https://files.pythonhosted.org/packages/fc/cd/ce2ab93e2e7eaf518f0fd15e3068b8c43216c8a44ed82ac2b79ce5cef72d/orjson-3.11.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9416cc19a349c167ef76135b2fe40d03cea93680428efee8771f3e9fb66079d", size = 135313, upload-time = "2025-08-26T17:45:46.821Z" }, + { url = "https://files.pythonhosted.org/packages/d0/b4/f98355eff0bd1a38454209bbc73372ce351ba29933cb3e2eba16c04b9448/orjson-3.11.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b822caf5b9752bc6f246eb08124c3d12bf2175b66ab74bac2ef3bbf9221ce1b2", size = 132908, upload-time = "2025-08-26T17:45:48.126Z" }, + { url = "https://files.pythonhosted.org/packages/eb/92/8f5182d7bc2a1bed46ed960b61a39af8389f0ad476120cd99e67182bfb6d/orjson-3.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:414f71e3bdd5573893bf5ecdf35c32b213ed20aa15536fe2f588f946c318824f", size = 130905, upload-time = "2025-08-26T17:45:49.414Z" }, + { url = "https://files.pythonhosted.org/packages/1a/60/c41ca753ce9ffe3d0f67b9b4c093bdd6e5fdb1bc53064f992f66bb99954d/orjson-3.11.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:828e3149ad8815dc14468f36ab2a4b819237c155ee1370341b91ea4c8672d2ee", size = 403812, upload-time = "2025-08-26T17:45:51.085Z" }, + { url = "https://files.pythonhosted.org/packages/dd/13/e4a4f16d71ce1868860db59092e78782c67082a8f1dc06a3788aef2b41bc/orjson-3.11.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ac9e05f25627ffc714c21f8dfe3a579445a5c392a9c8ae7ba1d0e9fb5333f56e", size = 146277, upload-time = "2025-08-26T17:45:52.851Z" }, + { url = "https://files.pythonhosted.org/packages/8d/8b/bafb7f0afef9344754a3a0597a12442f1b85a048b82108ef2c956f53babd/orjson-3.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e44fbe4000bd321d9f3b648ae46e0196d21577cf66ae684a96ff90b1f7c93633", size = 135418, upload-time = "2025-08-26T17:45:54.806Z" }, + { url = "https://files.pythonhosted.org/packages/60/d4/bae8e4f26afb2c23bea69d2f6d566132584d1c3a5fe89ee8c17b718cab67/orjson-3.11.3-cp313-cp313-win32.whl", hash = "sha256:2039b7847ba3eec1f5886e75e6763a16e18c68a63efc4b029ddf994821e2e66b", size = 136216, upload-time = "2025-08-26T17:45:57.182Z" }, + { url = "https://files.pythonhosted.org/packages/88/76/224985d9f127e121c8cad882cea55f0ebe39f97925de040b75ccd4b33999/orjson-3.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:29be5ac4164aa8bdcba5fa0700a3c9c316b411d8ed9d39ef8a882541bd452fae", size = 131362, upload-time = "2025-08-26T17:45:58.56Z" }, + { url = "https://files.pythonhosted.org/packages/e2/cf/0dce7a0be94bd36d1346be5067ed65ded6adb795fdbe3abd234c8d576d01/orjson-3.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:18bd1435cb1f2857ceb59cfb7de6f92593ef7b831ccd1b9bfb28ca530e539dce", size = 125989, upload-time = "2025-08-26T17:45:59.95Z" }, + { url = "https://files.pythonhosted.org/packages/ef/77/d3b1fef1fc6aaeed4cbf3be2b480114035f4df8fa1a99d2dac1d40d6e924/orjson-3.11.3-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cf4b81227ec86935568c7edd78352a92e97af8da7bd70bdfdaa0d2e0011a1ab4", size = 238115, upload-time = "2025-08-26T17:46:01.669Z" }, + { url = "https://files.pythonhosted.org/packages/e4/6d/468d21d49bb12f900052edcfbf52c292022d0a323d7828dc6376e6319703/orjson-3.11.3-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:bc8bc85b81b6ac9fc4dae393a8c159b817f4c2c9dee5d12b773bddb3b95fc07e", size = 127493, upload-time = "2025-08-26T17:46:03.466Z" }, + { url = "https://files.pythonhosted.org/packages/67/46/1e2588700d354aacdf9e12cc2d98131fb8ac6f31ca65997bef3863edb8ff/orjson-3.11.3-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:88dcfc514cfd1b0de038443c7b3e6a9797ffb1b3674ef1fd14f701a13397f82d", size = 122998, upload-time = "2025-08-26T17:46:04.803Z" }, + { url = "https://files.pythonhosted.org/packages/3b/94/11137c9b6adb3779f1b34fd98be51608a14b430dbc02c6d41134fbba484c/orjson-3.11.3-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:d61cd543d69715d5fc0a690c7c6f8dcc307bc23abef9738957981885f5f38229", size = 132915, upload-time = "2025-08-26T17:46:06.237Z" }, + { url = "https://files.pythonhosted.org/packages/10/61/dccedcf9e9bcaac09fdabe9eaee0311ca92115699500efbd31950d878833/orjson-3.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2b7b153ed90ababadbef5c3eb39549f9476890d339cf47af563aea7e07db2451", size = 130907, upload-time = "2025-08-26T17:46:07.581Z" }, + { url = "https://files.pythonhosted.org/packages/0e/fd/0e935539aa7b08b3ca0f817d73034f7eb506792aae5ecc3b7c6e679cdf5f/orjson-3.11.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7909ae2460f5f494fecbcd10613beafe40381fd0316e35d6acb5f3a05bfda167", size = 403852, upload-time = "2025-08-26T17:46:08.982Z" }, + { url = "https://files.pythonhosted.org/packages/4a/2b/50ae1a5505cd1043379132fdb2adb8a05f37b3e1ebffe94a5073321966fd/orjson-3.11.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2030c01cbf77bc67bee7eef1e7e31ecf28649353987775e3583062c752da0077", size = 146309, upload-time = "2025-08-26T17:46:10.576Z" }, + { url = "https://files.pythonhosted.org/packages/cd/1d/a473c158e380ef6f32753b5f39a69028b25ec5be331c2049a2201bde2e19/orjson-3.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a0169ebd1cbd94b26c7a7ad282cf5c2744fce054133f959e02eb5265deae1872", size = 135424, upload-time = "2025-08-26T17:46:12.386Z" }, + { url = "https://files.pythonhosted.org/packages/da/09/17d9d2b60592890ff7382e591aa1d9afb202a266b180c3d4049b1ec70e4a/orjson-3.11.3-cp314-cp314-win32.whl", hash = "sha256:0c6d7328c200c349e3a4c6d8c83e0a5ad029bdc2d417f234152bf34842d0fc8d", size = 136266, upload-time = "2025-08-26T17:46:13.853Z" }, + { url = "https://files.pythonhosted.org/packages/15/58/358f6846410a6b4958b74734727e582ed971e13d335d6c7ce3e47730493e/orjson-3.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:317bbe2c069bbc757b1a2e4105b64aacd3bc78279b66a6b9e51e846e4809f804", size = 131351, upload-time = "2025-08-26T17:46:15.27Z" }, + { url = "https://files.pythonhosted.org/packages/28/01/d6b274a0635be0468d4dbd9cafe80c47105937a0d42434e805e67cd2ed8b/orjson-3.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:e8f6a7a27d7b7bec81bd5924163e9af03d49bbb63013f107b48eb5d16db711bc", size = 125985, upload-time = "2025-08-26T17:46:16.67Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "posthog-agent-toolkit" +version = "0.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "langchain-core" }, + { name = "langchain-mcp-adapters" }, + { name = "pydantic" }, + { name = "python-dateutil" }, + { name = "python-dotenv" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/f9/38403ede0ffce124aa68502b60c74b53072de4fbea387d8ab7b562959394/posthog_agent_toolkit-0.1.0.tar.gz", hash = "sha256:3d4c1303445ad140eae0f54fe47fb118bcf005db3895fc80eb4ffb91e09aee0d", size = 81954, upload-time = "2025-09-12T10:14:08.12Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/86/ba0140e406183809f84ad062a7de4b9ddd216e746abaad061334ba46ace7/posthog_agent_toolkit-0.1.0-py3-none-any.whl", hash = "sha256:127dd2b17baafae0782cfc17a02a83b151d6e4636eacd6bb8a1059e2e5e71eca", size = 3491, upload-time = "2025-09-12T10:14:06.865Z" }, +] + +[[package]] +name = "posthog-langchain-example" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "langchain" }, + { name = "langchain-core" }, + { name = "langchain-openai" }, + { name = "posthog-agent-toolkit" }, + { name = "python-dotenv" }, +] + +[package.metadata] +requires-dist = [ + { name = "langchain", specifier = ">=0.3.0" }, + { name = "langchain-core", specifier = ">=0.3.0" }, + { name = "langchain-openai", specifier = ">=0.2.0" }, + { name = "posthog-agent-toolkit", specifier = ">=0.1.0" }, + { name = "python-dotenv", specifier = ">=1.0.0" }, +] + +[[package]] +name = "pydantic" +version = "2.11.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload-time = "2025-06-14T08:33:17.137Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload-time = "2025-06-14T08:33:14.905Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584, upload-time = "2025-04-23T18:31:03.106Z" }, + { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071, upload-time = "2025-04-23T18:31:04.621Z" }, + { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823, upload-time = "2025-04-23T18:31:06.377Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792, upload-time = "2025-04-23T18:31:07.93Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338, upload-time = "2025-04-23T18:31:09.283Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998, upload-time = "2025-04-23T18:31:11.7Z" }, + { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200, upload-time = "2025-04-23T18:31:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890, upload-time = "2025-04-23T18:31:15.011Z" }, + { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359, upload-time = "2025-04-23T18:31:16.393Z" }, + { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883, upload-time = "2025-04-23T18:31:17.892Z" }, + { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074, upload-time = "2025-04-23T18:31:19.205Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538, upload-time = "2025-04-23T18:31:20.541Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909, upload-time = "2025-04-23T18:31:22.371Z" }, + { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786, upload-time = "2025-04-23T18:31:24.161Z" }, + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, + { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200, upload-time = "2025-04-23T18:33:14.199Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123, upload-time = "2025-04-23T18:33:16.555Z" }, + { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852, upload-time = "2025-04-23T18:33:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484, upload-time = "2025-04-23T18:33:20.475Z" }, + { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896, upload-time = "2025-04-23T18:33:22.501Z" }, + { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475, upload-time = "2025-04-23T18:33:24.528Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013, upload-time = "2025-04-23T18:33:26.621Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715, upload-time = "2025-04-23T18:33:28.656Z" }, + { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/85/1ea668bbab3c50071ca613c6ab30047fb36ab0da1b92fa8f17bbc38fd36c/pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", size = 172583, upload-time = "2025-06-24T13:26:46.841Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/f0/427018098906416f580e3cf1366d3b1abfb408a0652e9f31600c24a1903c/pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796", size = 45235, upload-time = "2025-06-24T13:26:45.485Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" }, +] + +[[package]] +name = "python-multipart" +version = "0.0.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload-time = "2024-12-16T19:45:46.972Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" }, +] + +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" }, + { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" }, + { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload-time = "2024-08-06T20:32:03.408Z" }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload-time = "2024-08-06T20:32:04.926Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload-time = "2024-08-06T20:32:06.459Z" }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload-time = "2024-08-06T20:32:08.338Z" }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload-time = "2024-08-06T20:32:14.124Z" }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload-time = "2024-08-06T20:32:16.17Z" }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload-time = "2024-08-06T20:32:18.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload-time = "2024-08-06T20:32:19.889Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload-time = "2024-08-06T20:32:21.273Z" }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, +] + +[[package]] +name = "referencing" +version = "0.36.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, +] + +[[package]] +name = "regex" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/5a/4c63457fbcaf19d138d72b2e9b39405954f98c0349b31c601bfcb151582c/regex-2025.9.1.tar.gz", hash = "sha256:88ac07b38d20b54d79e704e38aa3bd2c0f8027432164226bdee201a1c0c9c9ff", size = 400852, upload-time = "2025-09-01T22:10:10.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/4d/f741543c0c59f96c6625bc6c11fea1da2e378b7d293ffff6f318edc0ce14/regex-2025.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e5bcf112b09bfd3646e4db6bf2e598534a17d502b0c01ea6550ba4eca780c5e6", size = 484811, upload-time = "2025-09-01T22:08:12.834Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bd/27e73e92635b6fbd51afc26a414a3133243c662949cd1cda677fe7bb09bd/regex-2025.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:67a0295a3c31d675a9ee0238d20238ff10a9a2fdb7a1323c798fc7029578b15c", size = 288977, upload-time = "2025-09-01T22:08:14.499Z" }, + { url = "https://files.pythonhosted.org/packages/eb/7d/7dc0c6efc8bc93cd6e9b947581f5fde8a5dbaa0af7c4ec818c5729fdc807/regex-2025.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea8267fbadc7d4bd7c1301a50e85c2ff0de293ff9452a1a9f8d82c6cafe38179", size = 286606, upload-time = "2025-09-01T22:08:15.881Z" }, + { url = "https://files.pythonhosted.org/packages/d1/01/9b5c6dd394f97c8f2c12f6e8f96879c9ac27292a718903faf2e27a0c09f6/regex-2025.9.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6aeff21de7214d15e928fb5ce757f9495214367ba62875100d4c18d293750cc1", size = 792436, upload-time = "2025-09-01T22:08:17.38Z" }, + { url = "https://files.pythonhosted.org/packages/fc/24/b7430cfc6ee34bbb3db6ff933beb5e7692e5cc81e8f6f4da63d353566fb0/regex-2025.9.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d89f1bbbbbc0885e1c230f7770d5e98f4f00b0ee85688c871d10df8b184a6323", size = 858705, upload-time = "2025-09-01T22:08:19.037Z" }, + { url = "https://files.pythonhosted.org/packages/d6/98/155f914b4ea6ae012663188545c4f5216c11926d09b817127639d618b003/regex-2025.9.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca3affe8ddea498ba9d294ab05f5f2d3b5ad5d515bc0d4a9016dd592a03afe52", size = 905881, upload-time = "2025-09-01T22:08:20.377Z" }, + { url = "https://files.pythonhosted.org/packages/8a/a7/a470e7bc8259c40429afb6d6a517b40c03f2f3e455c44a01abc483a1c512/regex-2025.9.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91892a7a9f0a980e4c2c85dd19bc14de2b219a3a8867c4b5664b9f972dcc0c78", size = 798968, upload-time = "2025-09-01T22:08:22.081Z" }, + { url = "https://files.pythonhosted.org/packages/1d/fa/33f6fec4d41449fea5f62fdf5e46d668a1c046730a7f4ed9f478331a8e3a/regex-2025.9.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e1cb40406f4ae862710615f9f636c1e030fd6e6abe0e0f65f6a695a2721440c6", size = 781884, upload-time = "2025-09-01T22:08:23.832Z" }, + { url = "https://files.pythonhosted.org/packages/42/de/2b45f36ab20da14eedddf5009d370625bc5942d9953fa7e5037a32d66843/regex-2025.9.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:94f6cff6f7e2149c7e6499a6ecd4695379eeda8ccbccb9726e8149f2fe382e92", size = 852935, upload-time = "2025-09-01T22:08:25.536Z" }, + { url = "https://files.pythonhosted.org/packages/1e/f9/878f4fc92c87e125e27aed0f8ee0d1eced9b541f404b048f66f79914475a/regex-2025.9.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6c0226fb322b82709e78c49cc33484206647f8a39954d7e9de1567f5399becd0", size = 844340, upload-time = "2025-09-01T22:08:27.141Z" }, + { url = "https://files.pythonhosted.org/packages/90/c2/5b6f2bce6ece5f8427c718c085eca0de4bbb4db59f54db77aa6557aef3e9/regex-2025.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a12f59c7c380b4fcf7516e9cbb126f95b7a9518902bcf4a852423ff1dcd03e6a", size = 787238, upload-time = "2025-09-01T22:08:28.75Z" }, + { url = "https://files.pythonhosted.org/packages/47/66/1ef1081c831c5b611f6f55f6302166cfa1bc9574017410ba5595353f846a/regex-2025.9.1-cp311-cp311-win32.whl", hash = "sha256:49865e78d147a7a4f143064488da5d549be6bfc3f2579e5044cac61f5c92edd4", size = 264118, upload-time = "2025-09-01T22:08:30.388Z" }, + { url = "https://files.pythonhosted.org/packages/ad/e0/8adc550d7169df1d6b9be8ff6019cda5291054a0107760c2f30788b6195f/regex-2025.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:d34b901f6f2f02ef60f4ad3855d3a02378c65b094efc4b80388a3aeb700a5de7", size = 276151, upload-time = "2025-09-01T22:08:32.073Z" }, + { url = "https://files.pythonhosted.org/packages/cb/bd/46fef29341396d955066e55384fb93b0be7d64693842bf4a9a398db6e555/regex-2025.9.1-cp311-cp311-win_arm64.whl", hash = "sha256:47d7c2dab7e0b95b95fd580087b6ae196039d62306a592fa4e162e49004b6299", size = 268460, upload-time = "2025-09-01T22:08:33.281Z" }, + { url = "https://files.pythonhosted.org/packages/39/ef/a0372febc5a1d44c1be75f35d7e5aff40c659ecde864d7fa10e138f75e74/regex-2025.9.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:84a25164bd8dcfa9f11c53f561ae9766e506e580b70279d05a7946510bdd6f6a", size = 486317, upload-time = "2025-09-01T22:08:34.529Z" }, + { url = "https://files.pythonhosted.org/packages/b5/25/d64543fb7eb41a1024786d518cc57faf1ce64aa6e9ddba097675a0c2f1d2/regex-2025.9.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:645e88a73861c64c1af558dd12294fb4e67b5c1eae0096a60d7d8a2143a611c7", size = 289698, upload-time = "2025-09-01T22:08:36.162Z" }, + { url = "https://files.pythonhosted.org/packages/d8/dc/fbf31fc60be317bd9f6f87daa40a8a9669b3b392aa8fe4313df0a39d0722/regex-2025.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10a450cba5cd5409526ee1d4449f42aad38dd83ac6948cbd6d7f71ca7018f7db", size = 287242, upload-time = "2025-09-01T22:08:37.794Z" }, + { url = "https://files.pythonhosted.org/packages/0f/74/f933a607a538f785da5021acf5323961b4620972e2c2f1f39b6af4b71db7/regex-2025.9.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9dc5991592933a4192c166eeb67b29d9234f9c86344481173d1bc52f73a7104", size = 797441, upload-time = "2025-09-01T22:08:39.108Z" }, + { url = "https://files.pythonhosted.org/packages/89/d0/71fc49b4f20e31e97f199348b8c4d6e613e7b6a54a90eb1b090c2b8496d7/regex-2025.9.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a32291add816961aab472f4fad344c92871a2ee33c6c219b6598e98c1f0108f2", size = 862654, upload-time = "2025-09-01T22:08:40.586Z" }, + { url = "https://files.pythonhosted.org/packages/59/05/984edce1411a5685ba9abbe10d42cdd9450aab4a022271f9585539788150/regex-2025.9.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:588c161a68a383478e27442a678e3b197b13c5ba51dbba40c1ccb8c4c7bee9e9", size = 910862, upload-time = "2025-09-01T22:08:42.416Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/5c891bb5fe0691cc1bad336e3a94b9097fbcf9707ec8ddc1dce9f0397289/regex-2025.9.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47829ffaf652f30d579534da9085fe30c171fa2a6744a93d52ef7195dc38218b", size = 801991, upload-time = "2025-09-01T22:08:44.072Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ae/fd10d6ad179910f7a1b3e0a7fde1ef8bb65e738e8ac4fd6ecff3f52252e4/regex-2025.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e978e5a35b293ea43f140c92a3269b6ab13fe0a2bf8a881f7ac740f5a6ade85", size = 786651, upload-time = "2025-09-01T22:08:46.079Z" }, + { url = "https://files.pythonhosted.org/packages/30/cf/9d686b07bbc5bf94c879cc168db92542d6bc9fb67088d03479fef09ba9d3/regex-2025.9.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4cf09903e72411f4bf3ac1eddd624ecfd423f14b2e4bf1c8b547b72f248b7bf7", size = 856556, upload-time = "2025-09-01T22:08:48.376Z" }, + { url = "https://files.pythonhosted.org/packages/91/9d/302f8a29bb8a49528abbab2d357a793e2a59b645c54deae0050f8474785b/regex-2025.9.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d016b0f77be63e49613c9e26aaf4a242f196cd3d7a4f15898f5f0ab55c9b24d2", size = 849001, upload-time = "2025-09-01T22:08:50.067Z" }, + { url = "https://files.pythonhosted.org/packages/93/fa/b4c6dbdedc85ef4caec54c817cd5f4418dbfa2453214119f2538082bf666/regex-2025.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:656563e620de6908cd1c9d4f7b9e0777e3341ca7db9d4383bcaa44709c90281e", size = 788138, upload-time = "2025-09-01T22:08:51.933Z" }, + { url = "https://files.pythonhosted.org/packages/4a/1b/91ee17a3cbf87f81e8c110399279d0e57f33405468f6e70809100f2ff7d8/regex-2025.9.1-cp312-cp312-win32.whl", hash = "sha256:df33f4ef07b68f7ab637b1dbd70accbf42ef0021c201660656601e8a9835de45", size = 264524, upload-time = "2025-09-01T22:08:53.75Z" }, + { url = "https://files.pythonhosted.org/packages/92/28/6ba31cce05b0f1ec6b787921903f83bd0acf8efde55219435572af83c350/regex-2025.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:5aba22dfbc60cda7c0853516104724dc904caa2db55f2c3e6e984eb858d3edf3", size = 275489, upload-time = "2025-09-01T22:08:55.037Z" }, + { url = "https://files.pythonhosted.org/packages/bd/ed/ea49f324db00196e9ef7fe00dd13c6164d5173dd0f1bbe495e61bb1fb09d/regex-2025.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:ec1efb4c25e1849c2685fa95da44bfde1b28c62d356f9c8d861d4dad89ed56e9", size = 268589, upload-time = "2025-09-01T22:08:56.369Z" }, + { url = "https://files.pythonhosted.org/packages/98/25/b2959ce90c6138c5142fe5264ee1f9b71a0c502ca4c7959302a749407c79/regex-2025.9.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bc6834727d1b98d710a63e6c823edf6ffbf5792eba35d3fa119531349d4142ef", size = 485932, upload-time = "2025-09-01T22:08:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/49/2e/6507a2a85f3f2be6643438b7bd976e67ad73223692d6988eb1ff444106d3/regex-2025.9.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c3dc05b6d579875719bccc5f3037b4dc80433d64e94681a0061845bd8863c025", size = 289568, upload-time = "2025-09-01T22:08:59.258Z" }, + { url = "https://files.pythonhosted.org/packages/c7/d8/de4a4b57215d99868f1640e062a7907e185ec7476b4b689e2345487c1ff4/regex-2025.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22213527df4c985ec4a729b055a8306272d41d2f45908d7bacb79be0fa7a75ad", size = 286984, upload-time = "2025-09-01T22:09:00.835Z" }, + { url = "https://files.pythonhosted.org/packages/03/15/e8cb403403a57ed316e80661db0e54d7aa2efcd85cb6156f33cc18746922/regex-2025.9.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8e3f6e3c5a5a1adc3f7ea1b5aec89abfc2f4fbfba55dafb4343cd1d084f715b2", size = 797514, upload-time = "2025-09-01T22:09:02.538Z" }, + { url = "https://files.pythonhosted.org/packages/e4/26/2446f2b9585fed61faaa7e2bbce3aca7dd8df6554c32addee4c4caecf24a/regex-2025.9.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcb89c02a0d6c2bec9b0bb2d8c78782699afe8434493bfa6b4021cc51503f249", size = 862586, upload-time = "2025-09-01T22:09:04.322Z" }, + { url = "https://files.pythonhosted.org/packages/fd/b8/82ffbe9c0992c31bbe6ae1c4b4e21269a5df2559102b90543c9b56724c3c/regex-2025.9.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0e2f95413eb0c651cd1516a670036315b91b71767af83bc8525350d4375ccba", size = 910815, upload-time = "2025-09-01T22:09:05.978Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d8/7303ea38911759c1ee30cc5bc623ee85d3196b733c51fd6703c34290a8d9/regex-2025.9.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a41dc039e1c97d3c2ed3e26523f748e58c4de3ea7a31f95e1cf9ff973fff5a", size = 802042, upload-time = "2025-09-01T22:09:07.865Z" }, + { url = "https://files.pythonhosted.org/packages/fc/0e/6ad51a55ed4b5af512bb3299a05d33309bda1c1d1e1808fa869a0bed31bc/regex-2025.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f0b4258b161094f66857a26ee938d3fe7b8a5063861e44571215c44fbf0e5df", size = 786764, upload-time = "2025-09-01T22:09:09.362Z" }, + { url = "https://files.pythonhosted.org/packages/8d/d5/394e3ffae6baa5a9217bbd14d96e0e5da47bb069d0dbb8278e2681a2b938/regex-2025.9.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bf70e18ac390e6977ea7e56f921768002cb0fa359c4199606c7219854ae332e0", size = 856557, upload-time = "2025-09-01T22:09:11.129Z" }, + { url = "https://files.pythonhosted.org/packages/cd/80/b288d3910c41194ad081b9fb4b371b76b0bbfdce93e7709fc98df27b37dc/regex-2025.9.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b84036511e1d2bb0a4ff1aec26951caa2dea8772b223c9e8a19ed8885b32dbac", size = 849108, upload-time = "2025-09-01T22:09:12.877Z" }, + { url = "https://files.pythonhosted.org/packages/d1/cd/5ec76bf626d0d5abdc277b7a1734696f5f3d14fbb4a3e2540665bc305d85/regex-2025.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c2e05dcdfe224047f2a59e70408274c325d019aad96227ab959403ba7d58d2d7", size = 788201, upload-time = "2025-09-01T22:09:14.561Z" }, + { url = "https://files.pythonhosted.org/packages/b5/36/674672f3fdead107565a2499f3007788b878188acec6d42bc141c5366c2c/regex-2025.9.1-cp313-cp313-win32.whl", hash = "sha256:3b9a62107a7441b81ca98261808fed30ae36ba06c8b7ee435308806bd53c1ed8", size = 264508, upload-time = "2025-09-01T22:09:16.193Z" }, + { url = "https://files.pythonhosted.org/packages/83/ad/931134539515eb64ce36c24457a98b83c1b2e2d45adf3254b94df3735a76/regex-2025.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:b38afecc10c177eb34cfae68d669d5161880849ba70c05cbfbe409f08cc939d7", size = 275469, upload-time = "2025-09-01T22:09:17.462Z" }, + { url = "https://files.pythonhosted.org/packages/24/8c/96d34e61c0e4e9248836bf86d69cb224fd222f270fa9045b24e218b65604/regex-2025.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:ec329890ad5e7ed9fc292858554d28d58d56bf62cf964faf0aa57964b21155a0", size = 268586, upload-time = "2025-09-01T22:09:18.948Z" }, + { url = "https://files.pythonhosted.org/packages/21/b1/453cbea5323b049181ec6344a803777914074b9726c9c5dc76749966d12d/regex-2025.9.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:72fb7a016467d364546f22b5ae86c45680a4e0de6b2a6f67441d22172ff641f1", size = 486111, upload-time = "2025-09-01T22:09:20.734Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0e/92577f197bd2f7652c5e2857f399936c1876978474ecc5b068c6d8a79c86/regex-2025.9.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c9527fa74eba53f98ad86be2ba003b3ebe97e94b6eb2b916b31b5f055622ef03", size = 289520, upload-time = "2025-09-01T22:09:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/af/c6/b472398116cca7ea5a6c4d5ccd0fc543f7fd2492cb0c48d2852a11972f73/regex-2025.9.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c905d925d194c83a63f92422af7544ec188301451b292c8b487f0543726107ca", size = 287215, upload-time = "2025-09-01T22:09:23.657Z" }, + { url = "https://files.pythonhosted.org/packages/cf/11/f12ecb0cf9ca792a32bb92f758589a84149017467a544f2f6bfb45c0356d/regex-2025.9.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74df7c74a63adcad314426b1f4ea6054a5ab25d05b0244f0c07ff9ce640fa597", size = 797855, upload-time = "2025-09-01T22:09:25.197Z" }, + { url = "https://files.pythonhosted.org/packages/46/88/bbb848f719a540fb5997e71310f16f0b33a92c5d4b4d72d4311487fff2a3/regex-2025.9.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4f6e935e98ea48c7a2e8be44494de337b57a204470e7f9c9c42f912c414cd6f5", size = 863363, upload-time = "2025-09-01T22:09:26.705Z" }, + { url = "https://files.pythonhosted.org/packages/54/a9/2321eb3e2838f575a78d48e03c1e83ea61bd08b74b7ebbdeca8abc50fc25/regex-2025.9.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4a62d033cd9ebefc7c5e466731a508dfabee827d80b13f455de68a50d3c2543d", size = 910202, upload-time = "2025-09-01T22:09:28.906Z" }, + { url = "https://files.pythonhosted.org/packages/33/07/d1d70835d7d11b7e126181f316f7213c4572ecf5c5c97bdbb969fb1f38a2/regex-2025.9.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef971ebf2b93bdc88d8337238be4dfb851cc97ed6808eb04870ef67589415171", size = 801808, upload-time = "2025-09-01T22:09:30.733Z" }, + { url = "https://files.pythonhosted.org/packages/13/d1/29e4d1bed514ef2bf3a4ead3cb8bb88ca8af94130239a4e68aa765c35b1c/regex-2025.9.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d936a1db208bdca0eca1f2bb2c1ba1d8370b226785c1e6db76e32a228ffd0ad5", size = 786824, upload-time = "2025-09-01T22:09:32.61Z" }, + { url = "https://files.pythonhosted.org/packages/33/27/20d8ccb1bee460faaa851e6e7cc4cfe852a42b70caa1dca22721ba19f02f/regex-2025.9.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:7e786d9e4469698fc63815b8de08a89165a0aa851720eb99f5e0ea9d51dd2b6a", size = 857406, upload-time = "2025-09-01T22:09:34.117Z" }, + { url = "https://files.pythonhosted.org/packages/74/fe/60c6132262dc36430d51e0c46c49927d113d3a38c1aba6a26c7744c84cf3/regex-2025.9.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6b81d7dbc5466ad2c57ce3a0ddb717858fe1a29535c8866f8514d785fdb9fc5b", size = 848593, upload-time = "2025-09-01T22:09:35.598Z" }, + { url = "https://files.pythonhosted.org/packages/cc/ae/2d4ff915622fabbef1af28387bf71e7f2f4944a348b8460d061e85e29bf0/regex-2025.9.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cd4890e184a6feb0ef195338a6ce68906a8903a0f2eb7e0ab727dbc0a3156273", size = 787951, upload-time = "2025-09-01T22:09:37.139Z" }, + { url = "https://files.pythonhosted.org/packages/85/37/dc127703a9e715a284cc2f7dbdd8a9776fd813c85c126eddbcbdd1ca5fec/regex-2025.9.1-cp314-cp314-win32.whl", hash = "sha256:34679a86230e46164c9e0396b56cab13c0505972343880b9e705083cc5b8ec86", size = 269833, upload-time = "2025-09-01T22:09:39.245Z" }, + { url = "https://files.pythonhosted.org/packages/83/bf/4bed4d3d0570e16771defd5f8f15f7ea2311edcbe91077436d6908956c4a/regex-2025.9.1-cp314-cp314-win_amd64.whl", hash = "sha256:a1196e530a6bfa5f4bde029ac5b0295a6ecfaaffbfffede4bbaf4061d9455b70", size = 278742, upload-time = "2025-09-01T22:09:40.651Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3e/7d7ac6fd085023312421e0d69dfabdfb28e116e513fadbe9afe710c01893/regex-2025.9.1-cp314-cp314-win_arm64.whl", hash = "sha256:f46d525934871ea772930e997d577d48c6983e50f206ff7b66d4ac5f8941e993", size = 271860, upload-time = "2025-09-01T22:09:42.413Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.27.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479, upload-time = "2025-08-27T12:16:36.024Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/c1/7907329fbef97cbd49db6f7303893bd1dd5a4a3eae415839ffdfb0762cae/rpds_py-0.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:be898f271f851f68b318872ce6ebebbc62f303b654e43bf72683dbdc25b7c881", size = 371063, upload-time = "2025-08-27T12:12:47.856Z" }, + { url = "https://files.pythonhosted.org/packages/11/94/2aab4bc86228bcf7c48760990273653a4900de89c7537ffe1b0d6097ed39/rpds_py-0.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62ac3d4e3e07b58ee0ddecd71d6ce3b1637de2d373501412df395a0ec5f9beb5", size = 353210, upload-time = "2025-08-27T12:12:49.187Z" }, + { url = "https://files.pythonhosted.org/packages/3a/57/f5eb3ecf434342f4f1a46009530e93fd201a0b5b83379034ebdb1d7c1a58/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4708c5c0ceb2d034f9991623631d3d23cb16e65c83736ea020cdbe28d57c0a0e", size = 381636, upload-time = "2025-08-27T12:12:50.492Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f4/ef95c5945e2ceb5119571b184dd5a1cc4b8541bbdf67461998cfeac9cb1e/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:abfa1171a9952d2e0002aba2ad3780820b00cc3d9c98c6630f2e93271501f66c", size = 394341, upload-time = "2025-08-27T12:12:52.024Z" }, + { url = "https://files.pythonhosted.org/packages/5a/7e/4bd610754bf492d398b61725eb9598ddd5eb86b07d7d9483dbcd810e20bc/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b507d19f817ebaca79574b16eb2ae412e5c0835542c93fe9983f1e432aca195", size = 523428, upload-time = "2025-08-27T12:12:53.779Z" }, + { url = "https://files.pythonhosted.org/packages/9f/e5/059b9f65a8c9149361a8b75094864ab83b94718344db511fd6117936ed2a/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168b025f8fd8d8d10957405f3fdcef3dc20f5982d398f90851f4abc58c566c52", size = 402923, upload-time = "2025-08-27T12:12:55.15Z" }, + { url = "https://files.pythonhosted.org/packages/f5/48/64cabb7daced2968dd08e8a1b7988bf358d7bd5bcd5dc89a652f4668543c/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c6210ef77caa58e16e8c17d35c63fe3f5b60fd9ba9d424470c3400bcf9ed", size = 384094, upload-time = "2025-08-27T12:12:57.194Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e1/dc9094d6ff566bff87add8a510c89b9e158ad2ecd97ee26e677da29a9e1b/rpds_py-0.27.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:d252f2d8ca0195faa707f8eb9368955760880b2b42a8ee16d382bf5dd807f89a", size = 401093, upload-time = "2025-08-27T12:12:58.985Z" }, + { url = "https://files.pythonhosted.org/packages/37/8e/ac8577e3ecdd5593e283d46907d7011618994e1d7ab992711ae0f78b9937/rpds_py-0.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6e5e54da1e74b91dbc7996b56640f79b195d5925c2b78efaa8c5d53e1d88edde", size = 417969, upload-time = "2025-08-27T12:13:00.367Z" }, + { url = "https://files.pythonhosted.org/packages/66/6d/87507430a8f74a93556fe55c6485ba9c259949a853ce407b1e23fea5ba31/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ffce0481cc6e95e5b3f0a47ee17ffbd234399e6d532f394c8dce320c3b089c21", size = 558302, upload-time = "2025-08-27T12:13:01.737Z" }, + { url = "https://files.pythonhosted.org/packages/3a/bb/1db4781ce1dda3eecc735e3152659a27b90a02ca62bfeea17aee45cc0fbc/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a205fdfe55c90c2cd8e540ca9ceba65cbe6629b443bc05db1f590a3db8189ff9", size = 589259, upload-time = "2025-08-27T12:13:03.127Z" }, + { url = "https://files.pythonhosted.org/packages/7b/0e/ae1c8943d11a814d01b482e1f8da903f88047a962dff9bbdadf3bd6e6fd1/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:689fb5200a749db0415b092972e8eba85847c23885c8543a8b0f5c009b1a5948", size = 554983, upload-time = "2025-08-27T12:13:04.516Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d5/0b2a55415931db4f112bdab072443ff76131b5ac4f4dc98d10d2d357eb03/rpds_py-0.27.1-cp311-cp311-win32.whl", hash = "sha256:3182af66048c00a075010bc7f4860f33913528a4b6fc09094a6e7598e462fe39", size = 217154, upload-time = "2025-08-27T12:13:06.278Z" }, + { url = "https://files.pythonhosted.org/packages/24/75/3b7ffe0d50dc86a6a964af0d1cc3a4a2cdf437cb7b099a4747bbb96d1819/rpds_py-0.27.1-cp311-cp311-win_amd64.whl", hash = "sha256:b4938466c6b257b2f5c4ff98acd8128ec36b5059e5c8f8372d79316b1c36bb15", size = 228627, upload-time = "2025-08-27T12:13:07.625Z" }, + { url = "https://files.pythonhosted.org/packages/8d/3f/4fd04c32abc02c710f09a72a30c9a55ea3cc154ef8099078fd50a0596f8e/rpds_py-0.27.1-cp311-cp311-win_arm64.whl", hash = "sha256:2f57af9b4d0793e53266ee4325535a31ba48e2f875da81a9177c9926dfa60746", size = 220998, upload-time = "2025-08-27T12:13:08.972Z" }, + { url = "https://files.pythonhosted.org/packages/bd/fe/38de28dee5df58b8198c743fe2bea0c785c6d40941b9950bac4cdb71a014/rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90", size = 361887, upload-time = "2025-08-27T12:13:10.233Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/4b6c7eedc7dd90986bf0fab6ea2a091ec11c01b15f8ba0a14d3f80450468/rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5", size = 345795, upload-time = "2025-08-27T12:13:11.65Z" }, + { url = "https://files.pythonhosted.org/packages/6f/0e/e650e1b81922847a09cca820237b0edee69416a01268b7754d506ade11ad/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e", size = 385121, upload-time = "2025-08-27T12:13:13.008Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ea/b306067a712988e2bff00dcc7c8f31d26c29b6d5931b461aa4b60a013e33/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881", size = 398976, upload-time = "2025-08-27T12:13:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0a/26dc43c8840cb8fe239fe12dbc8d8de40f2365e838f3d395835dde72f0e5/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec", size = 525953, upload-time = "2025-08-27T12:13:15.774Z" }, + { url = "https://files.pythonhosted.org/packages/22/14/c85e8127b573aaf3a0cbd7fbb8c9c99e735a4a02180c84da2a463b766e9e/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb", size = 407915, upload-time = "2025-08-27T12:13:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/ed/7b/8f4fee9ba1fb5ec856eb22d725a4efa3deb47f769597c809e03578b0f9d9/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5", size = 386883, upload-time = "2025-08-27T12:13:18.704Z" }, + { url = "https://files.pythonhosted.org/packages/86/47/28fa6d60f8b74fcdceba81b272f8d9836ac0340570f68f5df6b41838547b/rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a", size = 405699, upload-time = "2025-08-27T12:13:20.089Z" }, + { url = "https://files.pythonhosted.org/packages/d0/fd/c5987b5e054548df56953a21fe2ebed51fc1ec7c8f24fd41c067b68c4a0a/rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444", size = 423713, upload-time = "2025-08-27T12:13:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ba/3c4978b54a73ed19a7d74531be37a8bcc542d917c770e14d372b8daea186/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a", size = 562324, upload-time = "2025-08-27T12:13:22.789Z" }, + { url = "https://files.pythonhosted.org/packages/b5/6c/6943a91768fec16db09a42b08644b960cff540c66aab89b74be6d4a144ba/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1", size = 593646, upload-time = "2025-08-27T12:13:24.122Z" }, + { url = "https://files.pythonhosted.org/packages/11/73/9d7a8f4be5f4396f011a6bb7a19fe26303a0dac9064462f5651ced2f572f/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998", size = 558137, upload-time = "2025-08-27T12:13:25.557Z" }, + { url = "https://files.pythonhosted.org/packages/6e/96/6772cbfa0e2485bcceef8071de7821f81aeac8bb45fbfd5542a3e8108165/rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39", size = 221343, upload-time = "2025-08-27T12:13:26.967Z" }, + { url = "https://files.pythonhosted.org/packages/67/b6/c82f0faa9af1c6a64669f73a17ee0eeef25aff30bb9a1c318509efe45d84/rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594", size = 232497, upload-time = "2025-08-27T12:13:28.326Z" }, + { url = "https://files.pythonhosted.org/packages/e1/96/2817b44bd2ed11aebacc9251da03689d56109b9aba5e311297b6902136e2/rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502", size = 222790, upload-time = "2025-08-27T12:13:29.71Z" }, + { url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741, upload-time = "2025-08-27T12:13:31.039Z" }, + { url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574, upload-time = "2025-08-27T12:13:32.902Z" }, + { url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051, upload-time = "2025-08-27T12:13:34.228Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395, upload-time = "2025-08-27T12:13:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334, upload-time = "2025-08-27T12:13:37.562Z" }, + { url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691, upload-time = "2025-08-27T12:13:38.94Z" }, + { url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868, upload-time = "2025-08-27T12:13:40.192Z" }, + { url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469, upload-time = "2025-08-27T12:13:41.496Z" }, + { url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125, upload-time = "2025-08-27T12:13:42.802Z" }, + { url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341, upload-time = "2025-08-27T12:13:44.472Z" }, + { url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511, upload-time = "2025-08-27T12:13:45.898Z" }, + { url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736, upload-time = "2025-08-27T12:13:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/00/95/3c863973d409210da7fb41958172c6b7dbe7fc34e04d3cc1f10bb85e979f/rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3", size = 221462, upload-time = "2025-08-27T12:13:48.742Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2c/5867b14a81dc217b56d95a9f2a40fdbc56a1ab0181b80132beeecbd4b2d6/rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83", size = 232034, upload-time = "2025-08-27T12:13:50.11Z" }, + { url = "https://files.pythonhosted.org/packages/c7/78/3958f3f018c01923823f1e47f1cc338e398814b92d83cd278364446fac66/rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d", size = 222392, upload-time = "2025-08-27T12:13:52.587Z" }, + { url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355, upload-time = "2025-08-27T12:13:54.012Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138, upload-time = "2025-08-27T12:13:55.791Z" }, + { url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247, upload-time = "2025-08-27T12:13:57.683Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699, upload-time = "2025-08-27T12:13:59.137Z" }, + { url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852, upload-time = "2025-08-27T12:14:00.583Z" }, + { url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582, upload-time = "2025-08-27T12:14:02.034Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126, upload-time = "2025-08-27T12:14:03.437Z" }, + { url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486, upload-time = "2025-08-27T12:14:05.443Z" }, + { url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832, upload-time = "2025-08-27T12:14:06.902Z" }, + { url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249, upload-time = "2025-08-27T12:14:08.37Z" }, + { url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356, upload-time = "2025-08-27T12:14:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300, upload-time = "2025-08-27T12:14:11.783Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ee/375469849e6b429b3516206b4580a79e9ef3eb12920ddbd4492b56eaacbe/rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688", size = 216714, upload-time = "2025-08-27T12:14:13.629Z" }, + { url = "https://files.pythonhosted.org/packages/21/87/3fc94e47c9bd0742660e84706c311a860dcae4374cf4a03c477e23ce605a/rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797", size = 228943, upload-time = "2025-08-27T12:14:14.937Z" }, + { url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472, upload-time = "2025-08-27T12:14:16.333Z" }, + { url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676, upload-time = "2025-08-27T12:14:17.764Z" }, + { url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313, upload-time = "2025-08-27T12:14:19.829Z" }, + { url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080, upload-time = "2025-08-27T12:14:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868, upload-time = "2025-08-27T12:14:23.485Z" }, + { url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750, upload-time = "2025-08-27T12:14:24.924Z" }, + { url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688, upload-time = "2025-08-27T12:14:27.537Z" }, + { url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225, upload-time = "2025-08-27T12:14:28.981Z" }, + { url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361, upload-time = "2025-08-27T12:14:30.469Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493, upload-time = "2025-08-27T12:14:31.987Z" }, + { url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623, upload-time = "2025-08-27T12:14:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800, upload-time = "2025-08-27T12:14:35.436Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d6/99228e6bbcf4baa764b18258f519a9035131d91b538d4e0e294313462a98/rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3", size = 221943, upload-time = "2025-08-27T12:14:36.898Z" }, + { url = "https://files.pythonhosted.org/packages/be/07/c802bc6b8e95be83b79bdf23d1aa61d68324cb1006e245d6c58e959e314d/rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456", size = 233739, upload-time = "2025-08-27T12:14:38.386Z" }, + { url = "https://files.pythonhosted.org/packages/c8/89/3e1b1c16d4c2d547c5717377a8df99aee8099ff050f87c45cb4d5fa70891/rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3", size = 223120, upload-time = "2025-08-27T12:14:39.82Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944, upload-time = "2025-08-27T12:14:41.199Z" }, + { url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283, upload-time = "2025-08-27T12:14:42.699Z" }, + { url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320, upload-time = "2025-08-27T12:14:44.157Z" }, + { url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760, upload-time = "2025-08-27T12:14:45.845Z" }, + { url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476, upload-time = "2025-08-27T12:14:47.364Z" }, + { url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418, upload-time = "2025-08-27T12:14:49.991Z" }, + { url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771, upload-time = "2025-08-27T12:14:52.159Z" }, + { url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022, upload-time = "2025-08-27T12:14:53.859Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787, upload-time = "2025-08-27T12:14:55.673Z" }, + { url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538, upload-time = "2025-08-27T12:14:57.245Z" }, + { url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512, upload-time = "2025-08-27T12:14:58.728Z" }, + { url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813, upload-time = "2025-08-27T12:15:00.334Z" }, + { url = "https://files.pythonhosted.org/packages/04/2e/30b5ea18c01379da6272a92825dd7e53dc9d15c88a19e97932d35d430ef7/rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a", size = 217385, upload-time = "2025-08-27T12:15:01.937Z" }, + { url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097, upload-time = "2025-08-27T12:15:03.961Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ed/e1fba02de17f4f76318b834425257c8ea297e415e12c68b4361f63e8ae92/rpds_py-0.27.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdfe4bb2f9fe7458b7453ad3c33e726d6d1c7c0a72960bcc23800d77384e42df", size = 371402, upload-time = "2025-08-27T12:15:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/af/7c/e16b959b316048b55585a697e94add55a4ae0d984434d279ea83442e460d/rpds_py-0.27.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8fabb8fd848a5f75a2324e4a84501ee3a5e3c78d8603f83475441866e60b94a3", size = 354084, upload-time = "2025-08-27T12:15:53.219Z" }, + { url = "https://files.pythonhosted.org/packages/de/c1/ade645f55de76799fdd08682d51ae6724cb46f318573f18be49b1e040428/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda8719d598f2f7f3e0f885cba8646644b55a187762bec091fa14a2b819746a9", size = 383090, upload-time = "2025-08-27T12:15:55.158Z" }, + { url = "https://files.pythonhosted.org/packages/1f/27/89070ca9b856e52960da1472efcb6c20ba27cfe902f4f23ed095b9cfc61d/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c64d07e95606ec402a0a1c511fe003873fa6af630bda59bac77fac8b4318ebc", size = 394519, upload-time = "2025-08-27T12:15:57.238Z" }, + { url = "https://files.pythonhosted.org/packages/b3/28/be120586874ef906aa5aeeae95ae8df4184bc757e5b6bd1c729ccff45ed5/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93a2ed40de81bcff59aabebb626562d48332f3d028ca2036f1d23cbb52750be4", size = 523817, upload-time = "2025-08-27T12:15:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/70cc197bc11cfcde02a86f36ac1eed15c56667c2ebddbdb76a47e90306da/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:387ce8c44ae94e0ec50532d9cb0edce17311024c9794eb196b90e1058aadeb66", size = 403240, upload-time = "2025-08-27T12:16:00.923Z" }, + { url = "https://files.pythonhosted.org/packages/cf/35/46936cca449f7f518f2f4996e0e8344db4b57e2081e752441154089d2a5f/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf94f812c95b5e60ebaf8bfb1898a7d7cb9c1af5744d4a67fa47796e0465d4e", size = 385194, upload-time = "2025-08-27T12:16:02.802Z" }, + { url = "https://files.pythonhosted.org/packages/e1/62/29c0d3e5125c3270b51415af7cbff1ec587379c84f55a5761cc9efa8cd06/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:4848ca84d6ded9b58e474dfdbad4b8bfb450344c0551ddc8d958bf4b36aa837c", size = 402086, upload-time = "2025-08-27T12:16:04.806Z" }, + { url = "https://files.pythonhosted.org/packages/8f/66/03e1087679227785474466fdd04157fb793b3b76e3fcf01cbf4c693c1949/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bde09cbcf2248b73c7c323be49b280180ff39fadcfe04e7b6f54a678d02a7cf", size = 419272, upload-time = "2025-08-27T12:16:06.471Z" }, + { url = "https://files.pythonhosted.org/packages/6a/24/e3e72d265121e00b063aef3e3501e5b2473cf1b23511d56e529531acf01e/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:94c44ee01fd21c9058f124d2d4f0c9dc7634bec93cd4b38eefc385dabe71acbf", size = 560003, upload-time = "2025-08-27T12:16:08.06Z" }, + { url = "https://files.pythonhosted.org/packages/26/ca/f5a344c534214cc2d41118c0699fffbdc2c1bc7046f2a2b9609765ab9c92/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:df8b74962e35c9249425d90144e721eed198e6555a0e22a563d29fe4486b51f6", size = 590482, upload-time = "2025-08-27T12:16:10.137Z" }, + { url = "https://files.pythonhosted.org/packages/ce/08/4349bdd5c64d9d193c360aa9db89adeee6f6682ab8825dca0a3f535f434f/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dc23e6820e3b40847e2f4a7726462ba0cf53089512abe9ee16318c366494c17a", size = 556523, upload-time = "2025-08-27T12:16:12.188Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/bc/d59b5d97d27229b0e009bd9098cd81af71c2fa5549c580a0a67b9bed0496/sqlalchemy-2.0.43.tar.gz", hash = "sha256:788bfcef6787a7764169cfe9859fe425bf44559619e1d9f56f5bddf2ebf6f417", size = 9762949, upload-time = "2025-08-11T14:24:58.438Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/77/fa7189fe44114658002566c6fe443d3ed0ec1fa782feb72af6ef7fbe98e7/sqlalchemy-2.0.43-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:52d9b73b8fb3e9da34c2b31e6d99d60f5f99fd8c1225c9dad24aeb74a91e1d29", size = 2136472, upload-time = "2025-08-11T15:52:21.789Z" }, + { url = "https://files.pythonhosted.org/packages/99/ea/92ac27f2fbc2e6c1766bb807084ca455265707e041ba027c09c17d697867/sqlalchemy-2.0.43-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f42f23e152e4545157fa367b2435a1ace7571cab016ca26038867eb7df2c3631", size = 2126535, upload-time = "2025-08-11T15:52:23.109Z" }, + { url = "https://files.pythonhosted.org/packages/94/12/536ede80163e295dc57fff69724caf68f91bb40578b6ac6583a293534849/sqlalchemy-2.0.43-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fb1a8c5438e0c5ea51afe9c6564f951525795cf432bed0c028c1cb081276685", size = 3297521, upload-time = "2025-08-11T15:50:33.536Z" }, + { url = "https://files.pythonhosted.org/packages/03/b5/cacf432e6f1fc9d156eca0560ac61d4355d2181e751ba8c0cd9cb232c8c1/sqlalchemy-2.0.43-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db691fa174e8f7036afefe3061bc40ac2b770718be2862bfb03aabae09051aca", size = 3297343, upload-time = "2025-08-11T15:57:51.186Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ba/d4c9b526f18457667de4c024ffbc3a0920c34237b9e9dd298e44c7c00ee5/sqlalchemy-2.0.43-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2b3b4927d0bc03d02ad883f402d5de201dbc8894ac87d2e981e7d87430e60d", size = 3232113, upload-time = "2025-08-11T15:50:34.949Z" }, + { url = "https://files.pythonhosted.org/packages/aa/79/c0121b12b1b114e2c8a10ea297a8a6d5367bc59081b2be896815154b1163/sqlalchemy-2.0.43-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d3d9b904ad4a6b175a2de0738248822f5ac410f52c2fd389ada0b5262d6a1e3", size = 3258240, upload-time = "2025-08-11T15:57:52.983Z" }, + { url = "https://files.pythonhosted.org/packages/79/99/a2f9be96fb382f3ba027ad42f00dbe30fdb6ba28cda5f11412eee346bec5/sqlalchemy-2.0.43-cp311-cp311-win32.whl", hash = "sha256:5cda6b51faff2639296e276591808c1726c4a77929cfaa0f514f30a5f6156921", size = 2101248, upload-time = "2025-08-11T15:55:01.855Z" }, + { url = "https://files.pythonhosted.org/packages/ee/13/744a32ebe3b4a7a9c7ea4e57babae7aa22070d47acf330d8e5a1359607f1/sqlalchemy-2.0.43-cp311-cp311-win_amd64.whl", hash = "sha256:c5d1730b25d9a07727d20ad74bc1039bbbb0a6ca24e6769861c1aa5bf2c4c4a8", size = 2126109, upload-time = "2025-08-11T15:55:04.092Z" }, + { url = "https://files.pythonhosted.org/packages/61/db/20c78f1081446095450bdc6ee6cc10045fce67a8e003a5876b6eaafc5cc4/sqlalchemy-2.0.43-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:20d81fc2736509d7a2bd33292e489b056cbae543661bb7de7ce9f1c0cd6e7f24", size = 2134891, upload-time = "2025-08-11T15:51:13.019Z" }, + { url = "https://files.pythonhosted.org/packages/45/0a/3d89034ae62b200b4396f0f95319f7d86e9945ee64d2343dcad857150fa2/sqlalchemy-2.0.43-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b9fc27650ff5a2c9d490c13c14906b918b0de1f8fcbb4c992712d8caf40e83", size = 2123061, upload-time = "2025-08-11T15:51:14.319Z" }, + { url = "https://files.pythonhosted.org/packages/cb/10/2711f7ff1805919221ad5bee205971254845c069ee2e7036847103ca1e4c/sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6772e3ca8a43a65a37c88e2f3e2adfd511b0b1da37ef11ed78dea16aeae85bd9", size = 3320384, upload-time = "2025-08-11T15:52:35.088Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0e/3d155e264d2ed2778484006ef04647bc63f55b3e2d12e6a4f787747b5900/sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a113da919c25f7f641ffbd07fbc9077abd4b3b75097c888ab818f962707eb48", size = 3329648, upload-time = "2025-08-11T15:56:34.153Z" }, + { url = "https://files.pythonhosted.org/packages/5b/81/635100fb19725c931622c673900da5efb1595c96ff5b441e07e3dd61f2be/sqlalchemy-2.0.43-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4286a1139f14b7d70141c67a8ae1582fc2b69105f1b09d9573494eb4bb4b2687", size = 3258030, upload-time = "2025-08-11T15:52:36.933Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ed/a99302716d62b4965fded12520c1cbb189f99b17a6d8cf77611d21442e47/sqlalchemy-2.0.43-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:529064085be2f4d8a6e5fab12d36ad44f1909a18848fcfbdb59cc6d4bbe48efe", size = 3294469, upload-time = "2025-08-11T15:56:35.553Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a2/3a11b06715149bf3310b55a98b5c1e84a42cfb949a7b800bc75cb4e33abc/sqlalchemy-2.0.43-cp312-cp312-win32.whl", hash = "sha256:b535d35dea8bbb8195e7e2b40059e2253acb2b7579b73c1b432a35363694641d", size = 2098906, upload-time = "2025-08-11T15:55:00.645Z" }, + { url = "https://files.pythonhosted.org/packages/bc/09/405c915a974814b90aa591280623adc6ad6b322f61fd5cff80aeaef216c9/sqlalchemy-2.0.43-cp312-cp312-win_amd64.whl", hash = "sha256:1c6d85327ca688dbae7e2b06d7d84cfe4f3fffa5b5f9e21bb6ce9d0e1a0e0e0a", size = 2126260, upload-time = "2025-08-11T15:55:02.965Z" }, + { url = "https://files.pythonhosted.org/packages/41/1c/a7260bd47a6fae7e03768bf66451437b36451143f36b285522b865987ced/sqlalchemy-2.0.43-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e7c08f57f75a2bb62d7ee80a89686a5e5669f199235c6d1dac75cd59374091c3", size = 2130598, upload-time = "2025-08-11T15:51:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/8e/84/8a337454e82388283830b3586ad7847aa9c76fdd4f1df09cdd1f94591873/sqlalchemy-2.0.43-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:14111d22c29efad445cd5021a70a8b42f7d9152d8ba7f73304c4d82460946aaa", size = 2118415, upload-time = "2025-08-11T15:51:17.256Z" }, + { url = "https://files.pythonhosted.org/packages/cf/ff/22ab2328148492c4d71899d62a0e65370ea66c877aea017a244a35733685/sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21b27b56eb2f82653168cefe6cb8e970cdaf4f3a6cb2c5e3c3c1cf3158968ff9", size = 3248707, upload-time = "2025-08-11T15:52:38.444Z" }, + { url = "https://files.pythonhosted.org/packages/dc/29/11ae2c2b981de60187f7cbc84277d9d21f101093d1b2e945c63774477aba/sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c5a9da957c56e43d72126a3f5845603da00e0293720b03bde0aacffcf2dc04f", size = 3253602, upload-time = "2025-08-11T15:56:37.348Z" }, + { url = "https://files.pythonhosted.org/packages/b8/61/987b6c23b12c56d2be451bc70900f67dd7d989d52b1ee64f239cf19aec69/sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d79f9fdc9584ec83d1b3c75e9f4595c49017f5594fee1a2217117647225d738", size = 3183248, upload-time = "2025-08-11T15:52:39.865Z" }, + { url = "https://files.pythonhosted.org/packages/86/85/29d216002d4593c2ce1c0ec2cec46dda77bfbcd221e24caa6e85eff53d89/sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9df7126fd9db49e3a5a3999442cc67e9ee8971f3cb9644250107d7296cb2a164", size = 3219363, upload-time = "2025-08-11T15:56:39.11Z" }, + { url = "https://files.pythonhosted.org/packages/b6/e4/bd78b01919c524f190b4905d47e7630bf4130b9f48fd971ae1c6225b6f6a/sqlalchemy-2.0.43-cp313-cp313-win32.whl", hash = "sha256:7f1ac7828857fcedb0361b48b9ac4821469f7694089d15550bbcf9ab22564a1d", size = 2096718, upload-time = "2025-08-11T15:55:05.349Z" }, + { url = "https://files.pythonhosted.org/packages/ac/a5/ca2f07a2a201f9497de1928f787926613db6307992fe5cda97624eb07c2f/sqlalchemy-2.0.43-cp313-cp313-win_amd64.whl", hash = "sha256:971ba928fcde01869361f504fcff3b7143b47d30de188b11c6357c0505824197", size = 2123200, upload-time = "2025-08-11T15:55:07.932Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d9/13bdde6521f322861fab67473cec4b1cc8999f3871953531cf61945fad92/sqlalchemy-2.0.43-py3-none-any.whl", hash = "sha256:1681c21dd2ccee222c2fe0bef671d1aef7c504087c9c4e800371cfcc8ac966fc", size = 1924759, upload-time = "2025-08-11T15:39:53.024Z" }, +] + +[[package]] +name = "sse-starlette" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/6f/22ed6e33f8a9e76ca0a412405f31abb844b779d52c5f96660766edcd737c/sse_starlette-3.0.2.tar.gz", hash = "sha256:ccd60b5765ebb3584d0de2d7a6e4f745672581de4f5005ab31c3a25d10b52b3a", size = 20985, upload-time = "2025-07-27T09:07:44.565Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/10/c78f463b4ef22eef8491f218f692be838282cd65480f6e423d7730dfd1fb/sse_starlette-3.0.2-py3-none-any.whl", hash = "sha256:16b7cbfddbcd4eaca11f7b586f3b8a080f1afe952c15813455b162edea619e5a", size = 11297, upload-time = "2025-07-27T09:07:43.268Z" }, +] + +[[package]] +name = "starlette" +version = "0.47.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/15/b9/cc3017f9a9c9b6e27c5106cc10cc7904653c3eec0729793aec10479dd669/starlette-0.47.3.tar.gz", hash = "sha256:6bc94f839cc176c4858894f1f8908f0ab79dfec1a6b8402f6da9be26ebea52e9", size = 2584144, upload-time = "2025-08-24T13:36:42.122Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/fd/901cfa59aaa5b30a99e16876f11abe38b59a1a2c51ffb3d7142bb6089069/starlette-0.47.3-py3-none-any.whl", hash = "sha256:89c0778ca62a76b826101e7c709e70680a1699ca7da6b44d38eb0a7e61fe4b51", size = 72991, upload-time = "2025-08-24T13:36:40.887Z" }, +] + +[[package]] +name = "tenacity" +version = "9.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload-time = "2025-04-02T08:25:09.966Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" }, +] + +[[package]] +name = "tiktoken" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "regex" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/86/ad0155a37c4f310935d5ac0b1ccf9bdb635dcb906e0a9a26b616dd55825a/tiktoken-0.11.0.tar.gz", hash = "sha256:3c518641aee1c52247c2b97e74d8d07d780092af79d5911a6ab5e79359d9b06a", size = 37648, upload-time = "2025-08-08T23:58:08.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/91/912b459799a025d2842566fe1e902f7f50d54a1ce8a0f236ab36b5bd5846/tiktoken-0.11.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4ae374c46afadad0f501046db3da1b36cd4dfbfa52af23c998773682446097cf", size = 1059743, upload-time = "2025-08-08T23:57:37.516Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e9/6faa6870489ce64f5f75dcf91512bf35af5864583aee8fcb0dcb593121f5/tiktoken-0.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:25a512ff25dc6c85b58f5dd4f3d8c674dc05f96b02d66cdacf628d26a4e4866b", size = 999334, upload-time = "2025-08-08T23:57:38.595Z" }, + { url = "https://files.pythonhosted.org/packages/a1/3e/a05d1547cf7db9dc75d1461cfa7b556a3b48e0516ec29dfc81d984a145f6/tiktoken-0.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2130127471e293d385179c1f3f9cd445070c0772be73cdafb7cec9a3684c0458", size = 1129402, upload-time = "2025-08-08T23:57:39.627Z" }, + { url = "https://files.pythonhosted.org/packages/34/9a/db7a86b829e05a01fd4daa492086f708e0a8b53952e1dbc9d380d2b03677/tiktoken-0.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21e43022bf2c33f733ea9b54f6a3f6b4354b909f5a73388fb1b9347ca54a069c", size = 1184046, upload-time = "2025-08-08T23:57:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/9d/bb/52edc8e078cf062ed749248f1454e9e5cfd09979baadb830b3940e522015/tiktoken-0.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:adb4e308eb64380dc70fa30493e21c93475eaa11669dea313b6bbf8210bfd013", size = 1244691, upload-time = "2025-08-08T23:57:42.251Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/884b6cd7ae2570ecdcaffa02b528522b18fef1cbbfdbcaa73799807d0d3b/tiktoken-0.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:ece6b76bfeeb61a125c44bbefdfccc279b5288e6007fbedc0d32bfec602df2f2", size = 884392, upload-time = "2025-08-08T23:57:43.628Z" }, + { url = "https://files.pythonhosted.org/packages/e7/9e/eceddeffc169fc75fe0fd4f38471309f11cb1906f9b8aa39be4f5817df65/tiktoken-0.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fd9e6b23e860973cf9526544e220b223c60badf5b62e80a33509d6d40e6c8f5d", size = 1055199, upload-time = "2025-08-08T23:57:45.076Z" }, + { url = "https://files.pythonhosted.org/packages/4f/cf/5f02bfefffdc6b54e5094d2897bc80efd43050e5b09b576fd85936ee54bf/tiktoken-0.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6a76d53cee2da71ee2731c9caa747398762bda19d7f92665e882fef229cb0b5b", size = 996655, upload-time = "2025-08-08T23:57:46.304Z" }, + { url = "https://files.pythonhosted.org/packages/65/8e/c769b45ef379bc360c9978c4f6914c79fd432400a6733a8afc7ed7b0726a/tiktoken-0.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ef72aab3ea240646e642413cb363b73869fed4e604dcfd69eec63dc54d603e8", size = 1128867, upload-time = "2025-08-08T23:57:47.438Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2d/4d77f6feb9292bfdd23d5813e442b3bba883f42d0ac78ef5fdc56873f756/tiktoken-0.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f929255c705efec7a28bf515e29dc74220b2f07544a8c81b8d69e8efc4578bd", size = 1183308, upload-time = "2025-08-08T23:57:48.566Z" }, + { url = "https://files.pythonhosted.org/packages/7a/65/7ff0a65d3bb0fc5a1fb6cc71b03e0f6e71a68c5eea230d1ff1ba3fd6df49/tiktoken-0.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61f1d15822e4404953d499fd1dcc62817a12ae9fb1e4898033ec8fe3915fdf8e", size = 1244301, upload-time = "2025-08-08T23:57:49.642Z" }, + { url = "https://files.pythonhosted.org/packages/f5/6e/5b71578799b72e5bdcef206a214c3ce860d999d579a3b56e74a6c8989ee2/tiktoken-0.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:45927a71ab6643dfd3ef57d515a5db3d199137adf551f66453be098502838b0f", size = 884282, upload-time = "2025-08-08T23:57:50.759Z" }, + { url = "https://files.pythonhosted.org/packages/cc/cd/a9034bcee638716d9310443818d73c6387a6a96db93cbcb0819b77f5b206/tiktoken-0.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a5f3f25ffb152ee7fec78e90a5e5ea5b03b4ea240beed03305615847f7a6ace2", size = 1055339, upload-time = "2025-08-08T23:57:51.802Z" }, + { url = "https://files.pythonhosted.org/packages/f1/91/9922b345f611b4e92581f234e64e9661e1c524875c8eadd513c4b2088472/tiktoken-0.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7dc6e9ad16a2a75b4c4be7208055a1f707c9510541d94d9cc31f7fbdc8db41d8", size = 997080, upload-time = "2025-08-08T23:57:53.442Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9d/49cd047c71336bc4b4af460ac213ec1c457da67712bde59b892e84f1859f/tiktoken-0.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a0517634d67a8a48fd4a4ad73930c3022629a85a217d256a6e9b8b47439d1e4", size = 1128501, upload-time = "2025-08-08T23:57:54.808Z" }, + { url = "https://files.pythonhosted.org/packages/52/d5/a0dcdb40dd2ea357e83cb36258967f0ae96f5dd40c722d6e382ceee6bba9/tiktoken-0.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fb4effe60574675118b73c6fbfd3b5868e5d7a1f570d6cc0d18724b09ecf318", size = 1182743, upload-time = "2025-08-08T23:57:56.307Z" }, + { url = "https://files.pythonhosted.org/packages/3b/17/a0fc51aefb66b7b5261ca1314afa83df0106b033f783f9a7bcbe8e741494/tiktoken-0.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94f984c9831fd32688aef4348803b0905d4ae9c432303087bae370dc1381a2b8", size = 1244057, upload-time = "2025-08-08T23:57:57.628Z" }, + { url = "https://files.pythonhosted.org/packages/50/79/bcf350609f3a10f09fe4fc207f132085e497fdd3612f3925ab24d86a0ca0/tiktoken-0.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:2177ffda31dec4023356a441793fed82f7af5291120751dee4d696414f54db0c", size = 883901, upload-time = "2025-08-08T23:57:59.359Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.35.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/42/e0e305207bb88c6b8d3061399c6a961ffe5fbb7e2aa63c9234df7259e9cd/uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01", size = 78473, upload-time = "2025-06-28T16:15:46.058Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406, upload-time = "2025-06-28T16:15:44.816Z" }, +] + +[[package]] +name = "zstandard" +version = "0.24.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/1b/c20b2ef1d987627765dcd5bf1dadb8ef6564f00a87972635099bb76b7a05/zstandard-0.24.0.tar.gz", hash = "sha256:fe3198b81c00032326342d973e526803f183f97aa9e9a98e3f897ebafe21178f", size = 905681, upload-time = "2025-08-17T18:36:36.352Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/1f/5c72806f76043c0ef9191a2b65281dacdf3b65b0828eb13bb2c987c4fb90/zstandard-0.24.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:addfc23e3bd5f4b6787b9ca95b2d09a1a67ad5a3c318daaa783ff90b2d3a366e", size = 795228, upload-time = "2025-08-17T18:21:46.978Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ba/3059bd5cd834666a789251d14417621b5c61233bd46e7d9023ea8bc1043a/zstandard-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b005bcee4be9c3984b355336283afe77b2defa76ed6b89332eced7b6fa68b68", size = 640520, upload-time = "2025-08-17T18:21:48.162Z" }, + { url = "https://files.pythonhosted.org/packages/57/07/f0e632bf783f915c1fdd0bf68614c4764cae9dd46ba32cbae4dd659592c3/zstandard-0.24.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:3f96a9130171e01dbb6c3d4d9925d604e2131a97f540e223b88ba45daf56d6fb", size = 5347682, upload-time = "2025-08-17T18:21:50.266Z" }, + { url = "https://files.pythonhosted.org/packages/a6/4c/63523169fe84773a7462cd090b0989cb7c7a7f2a8b0a5fbf00009ba7d74d/zstandard-0.24.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd0d3d16e63873253bad22b413ec679cf6586e51b5772eb10733899832efec42", size = 5057650, upload-time = "2025-08-17T18:21:52.634Z" }, + { url = "https://files.pythonhosted.org/packages/c6/16/49013f7ef80293f5cebf4c4229535a9f4c9416bbfd238560edc579815dbe/zstandard-0.24.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:b7a8c30d9bf4bd5e4dcfe26900bef0fcd9749acde45cdf0b3c89e2052fda9a13", size = 5404893, upload-time = "2025-08-17T18:21:54.54Z" }, + { url = "https://files.pythonhosted.org/packages/4d/38/78e8bcb5fc32a63b055f2b99e0be49b506f2351d0180173674f516cf8a7a/zstandard-0.24.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:52cd7d9fa0a115c9446abb79b06a47171b7d916c35c10e0c3aa6f01d57561382", size = 5452389, upload-time = "2025-08-17T18:21:56.822Z" }, + { url = "https://files.pythonhosted.org/packages/55/8a/81671f05619edbacd49bd84ce6899a09fc8299be20c09ae92f6618ccb92d/zstandard-0.24.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0f6fc2ea6e07e20df48752e7700e02e1892c61f9a6bfbacaf2c5b24d5ad504b", size = 5558888, upload-time = "2025-08-17T18:21:58.68Z" }, + { url = "https://files.pythonhosted.org/packages/49/cc/e83feb2d7d22d1f88434defbaeb6e5e91f42a4f607b5d4d2d58912b69d67/zstandard-0.24.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e46eb6702691b24ddb3e31e88b4a499e31506991db3d3724a85bd1c5fc3cfe4e", size = 5048038, upload-time = "2025-08-17T18:22:00.642Z" }, + { url = "https://files.pythonhosted.org/packages/08/c3/7a5c57ff49ef8943877f85c23368c104c2aea510abb339a2dc31ad0a27c3/zstandard-0.24.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5e3b9310fd7f0d12edc75532cd9a56da6293840c84da90070d692e0bb15f186", size = 5573833, upload-time = "2025-08-17T18:22:02.402Z" }, + { url = "https://files.pythonhosted.org/packages/f9/00/64519983cd92535ba4bdd4ac26ac52db00040a52d6c4efb8d1764abcc343/zstandard-0.24.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76cdfe7f920738ea871f035568f82bad3328cbc8d98f1f6988264096b5264efd", size = 4961072, upload-time = "2025-08-17T18:22:04.384Z" }, + { url = "https://files.pythonhosted.org/packages/72/ab/3a08a43067387d22994fc87c3113636aa34ccd2914a4d2d188ce365c5d85/zstandard-0.24.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3f2fe35ec84908dddf0fbf66b35d7c2878dbe349552dd52e005c755d3493d61c", size = 5268462, upload-time = "2025-08-17T18:22:06.095Z" }, + { url = "https://files.pythonhosted.org/packages/49/cf/2abb3a1ad85aebe18c53e7eca73223f1546ddfa3bf4d2fb83fc5a064c5ca/zstandard-0.24.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:aa705beb74ab116563f4ce784fa94771f230c05d09ab5de9c397793e725bb1db", size = 5443319, upload-time = "2025-08-17T18:22:08.572Z" }, + { url = "https://files.pythonhosted.org/packages/40/42/0dd59fc2f68f1664cda11c3b26abdf987f4e57cb6b6b0f329520cd074552/zstandard-0.24.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:aadf32c389bb7f02b8ec5c243c38302b92c006da565e120dfcb7bf0378f4f848", size = 5822355, upload-time = "2025-08-17T18:22:10.537Z" }, + { url = "https://files.pythonhosted.org/packages/99/c0/ea4e640fd4f7d58d6f87a1e7aca11fb886ac24db277fbbb879336c912f63/zstandard-0.24.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e40cd0fc734aa1d4bd0e7ad102fd2a1aefa50ce9ef570005ffc2273c5442ddc3", size = 5365257, upload-time = "2025-08-17T18:22:13.159Z" }, + { url = "https://files.pythonhosted.org/packages/27/a9/92da42a5c4e7e4003271f2e1f0efd1f37cfd565d763ad3604e9597980a1c/zstandard-0.24.0-cp311-cp311-win32.whl", hash = "sha256:cda61c46343809ecda43dc620d1333dd7433a25d0a252f2dcc7667f6331c7b61", size = 435559, upload-time = "2025-08-17T18:22:17.29Z" }, + { url = "https://files.pythonhosted.org/packages/e2/8e/2c8e5c681ae4937c007938f954a060fa7c74f36273b289cabdb5ef0e9a7e/zstandard-0.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:3b95fc06489aa9388400d1aab01a83652bc040c9c087bd732eb214909d7fb0dd", size = 505070, upload-time = "2025-08-17T18:22:14.808Z" }, + { url = "https://files.pythonhosted.org/packages/52/10/a2f27a66bec75e236b575c9f7b0d7d37004a03aa2dcde8e2decbe9ed7b4d/zstandard-0.24.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad9fd176ff6800a0cf52bcf59c71e5de4fa25bf3ba62b58800e0f84885344d34", size = 461507, upload-time = "2025-08-17T18:22:15.964Z" }, + { url = "https://files.pythonhosted.org/packages/26/e9/0bd281d9154bba7fc421a291e263911e1d69d6951aa80955b992a48289f6/zstandard-0.24.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a2bda8f2790add22773ee7a4e43c90ea05598bffc94c21c40ae0a9000b0133c3", size = 795710, upload-time = "2025-08-17T18:22:19.189Z" }, + { url = "https://files.pythonhosted.org/packages/36/26/b250a2eef515caf492e2d86732e75240cdac9d92b04383722b9753590c36/zstandard-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cc76de75300f65b8eb574d855c12518dc25a075dadb41dd18f6322bda3fe15d5", size = 640336, upload-time = "2025-08-17T18:22:20.466Z" }, + { url = "https://files.pythonhosted.org/packages/79/bf/3ba6b522306d9bf097aac8547556b98a4f753dc807a170becaf30dcd6f01/zstandard-0.24.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:d2b3b4bda1a025b10fe0269369475f420177f2cb06e0f9d32c95b4873c9f80b8", size = 5342533, upload-time = "2025-08-17T18:22:22.326Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ec/22bc75bf054e25accdf8e928bc68ab36b4466809729c554ff3a1c1c8bce6/zstandard-0.24.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b84c6c210684286e504022d11ec294d2b7922d66c823e87575d8b23eba7c81f", size = 5062837, upload-time = "2025-08-17T18:22:24.416Z" }, + { url = "https://files.pythonhosted.org/packages/48/cc/33edfc9d286e517fb5b51d9c3210e5bcfce578d02a675f994308ca587ae1/zstandard-0.24.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c59740682a686bf835a1a4d8d0ed1eefe31ac07f1c5a7ed5f2e72cf577692b00", size = 5393855, upload-time = "2025-08-17T18:22:26.786Z" }, + { url = "https://files.pythonhosted.org/packages/73/36/59254e9b29da6215fb3a717812bf87192d89f190f23817d88cb8868c47ac/zstandard-0.24.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6324fde5cf5120fbf6541d5ff3c86011ec056e8d0f915d8e7822926a5377193a", size = 5451058, upload-time = "2025-08-17T18:22:28.885Z" }, + { url = "https://files.pythonhosted.org/packages/9a/c7/31674cb2168b741bbbe71ce37dd397c9c671e73349d88ad3bca9e9fae25b/zstandard-0.24.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51a86bd963de3f36688553926a84e550d45d7f9745bd1947d79472eca27fcc75", size = 5546619, upload-time = "2025-08-17T18:22:31.115Z" }, + { url = "https://files.pythonhosted.org/packages/e6/01/1a9f22239f08c00c156f2266db857545ece66a6fc0303d45c298564bc20b/zstandard-0.24.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d82ac87017b734f2fb70ff93818c66f0ad2c3810f61040f077ed38d924e19980", size = 5046676, upload-time = "2025-08-17T18:22:33.077Z" }, + { url = "https://files.pythonhosted.org/packages/a7/91/6c0cf8fa143a4988a0361380ac2ef0d7cb98a374704b389fbc38b5891712/zstandard-0.24.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92ea7855d5bcfb386c34557516c73753435fb2d4a014e2c9343b5f5ba148b5d8", size = 5576381, upload-time = "2025-08-17T18:22:35.391Z" }, + { url = "https://files.pythonhosted.org/packages/e2/77/1526080e22e78871e786ccf3c84bf5cec9ed25110a9585507d3c551da3d6/zstandard-0.24.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3adb4b5414febf074800d264ddf69ecade8c658837a83a19e8ab820e924c9933", size = 4953403, upload-time = "2025-08-17T18:22:37.266Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d0/a3a833930bff01eab697eb8abeafb0ab068438771fa066558d96d7dafbf9/zstandard-0.24.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6374feaf347e6b83ec13cc5dcfa70076f06d8f7ecd46cc71d58fac798ff08b76", size = 5267396, upload-time = "2025-08-17T18:22:39.757Z" }, + { url = "https://files.pythonhosted.org/packages/f3/5e/90a0db9a61cd4769c06374297ecfcbbf66654f74cec89392519deba64d76/zstandard-0.24.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:13fc548e214df08d896ee5f29e1f91ee35db14f733fef8eabea8dca6e451d1e2", size = 5433269, upload-time = "2025-08-17T18:22:42.131Z" }, + { url = "https://files.pythonhosted.org/packages/ce/58/fc6a71060dd67c26a9c5566e0d7c99248cbe5abfda6b3b65b8f1a28d59f7/zstandard-0.24.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0a416814608610abf5488889c74e43ffa0343ca6cf43957c6b6ec526212422da", size = 5814203, upload-time = "2025-08-17T18:22:44.017Z" }, + { url = "https://files.pythonhosted.org/packages/5c/6a/89573d4393e3ecbfa425d9a4e391027f58d7810dec5cdb13a26e4cdeef5c/zstandard-0.24.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0d66da2649bb0af4471699aeb7a83d6f59ae30236fb9f6b5d20fb618ef6c6777", size = 5359622, upload-time = "2025-08-17T18:22:45.802Z" }, + { url = "https://files.pythonhosted.org/packages/60/ff/2cbab815d6f02a53a9d8d8703bc727d8408a2e508143ca9af6c3cca2054b/zstandard-0.24.0-cp312-cp312-win32.whl", hash = "sha256:ff19efaa33e7f136fe95f9bbcc90ab7fb60648453b03f95d1de3ab6997de0f32", size = 435968, upload-time = "2025-08-17T18:22:49.493Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a3/8f96b8ddb7ad12344218fbd0fd2805702dafd126ae9f8a1fb91eef7b33da/zstandard-0.24.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc05f8a875eb651d1cc62e12a4a0e6afa5cd0cc231381adb830d2e9c196ea895", size = 505195, upload-time = "2025-08-17T18:22:47.193Z" }, + { url = "https://files.pythonhosted.org/packages/a3/4a/bfca20679da63bfc236634ef2e4b1b4254203098b0170e3511fee781351f/zstandard-0.24.0-cp312-cp312-win_arm64.whl", hash = "sha256:b04c94718f7a8ed7cdd01b162b6caa1954b3c9d486f00ecbbd300f149d2b2606", size = 461605, upload-time = "2025-08-17T18:22:48.317Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ef/db949de3bf81ed122b8ee4db6a8d147a136fe070e1015f5a60d8a3966748/zstandard-0.24.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e4ebb000c0fe24a6d0f3534b6256844d9dbf042fdf003efe5cf40690cf4e0f3e", size = 795700, upload-time = "2025-08-17T18:22:50.851Z" }, + { url = "https://files.pythonhosted.org/packages/99/56/fc04395d6f5eabd2fe6d86c0800d198969f3038385cb918bfbe94f2b0c62/zstandard-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:498f88f5109666c19531f0243a90d2fdd2252839cd6c8cc6e9213a3446670fa8", size = 640343, upload-time = "2025-08-17T18:22:51.999Z" }, + { url = "https://files.pythonhosted.org/packages/9b/0f/0b0e0d55f2f051d5117a0d62f4f9a8741b3647440c0ee1806b7bd47ed5ae/zstandard-0.24.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0a9e95ceb180ccd12a8b3437bac7e8a8a089c9094e39522900a8917745542184", size = 5342571, upload-time = "2025-08-17T18:22:53.734Z" }, + { url = "https://files.pythonhosted.org/packages/5d/43/d74e49f04fbd62d4b5d89aeb7a29d693fc637c60238f820cd5afe6ca8180/zstandard-0.24.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bcf69e0bcddbf2adcfafc1a7e864edcc204dd8171756d3a8f3340f6f6cc87b7b", size = 5062723, upload-time = "2025-08-17T18:22:55.624Z" }, + { url = "https://files.pythonhosted.org/packages/8e/97/df14384d4d6a004388e6ed07ded02933b5c7e0833a9150c57d0abc9545b7/zstandard-0.24.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:10e284748a7e7fbe2815ca62a9d6e84497d34cfdd0143fa9e8e208efa808d7c4", size = 5393282, upload-time = "2025-08-17T18:22:57.655Z" }, + { url = "https://files.pythonhosted.org/packages/7e/09/8f5c520e59a4d41591b30b7568595eda6fd71c08701bb316d15b7ed0613a/zstandard-0.24.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1bda8a85e5b9d5e73af2e61b23609a8cc1598c1b3b2473969912979205a1ff25", size = 5450895, upload-time = "2025-08-17T18:22:59.749Z" }, + { url = "https://files.pythonhosted.org/packages/d9/3d/02aba892327a67ead8cba160ee835cfa1fc292a9dcb763639e30c07da58b/zstandard-0.24.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1b14bc92af065d0534856bf1b30fc48753163ea673da98857ea4932be62079b1", size = 5546353, upload-time = "2025-08-17T18:23:01.457Z" }, + { url = "https://files.pythonhosted.org/packages/6a/6e/96c52afcde44da6a5313a1f6c356349792079808f12d8b69a7d1d98ef353/zstandard-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:b4f20417a4f511c656762b001ec827500cbee54d1810253c6ca2df2c0a307a5f", size = 5046404, upload-time = "2025-08-17T18:23:03.418Z" }, + { url = "https://files.pythonhosted.org/packages/da/b6/eefee6b92d341a7db7cd1b3885d42d30476a093720fb5c181e35b236d695/zstandard-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:337572a7340e1d92fd7fb5248c8300d0e91071002d92e0b8cabe8d9ae7b58159", size = 5576095, upload-time = "2025-08-17T18:23:05.331Z" }, + { url = "https://files.pythonhosted.org/packages/a3/29/743de3131f6239ba6611e17199581e6b5e0f03f268924d42468e29468ca0/zstandard-0.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:df4be1cf6e8f0f2bbe2a3eabfff163ef592c84a40e1a20a8d7db7f27cfe08fc2", size = 4953448, upload-time = "2025-08-17T18:23:07.225Z" }, + { url = "https://files.pythonhosted.org/packages/c9/11/bd36ef49fba82e307d69d93b5abbdcdc47d6a0bcbc7ffbbfe0ef74c2fec5/zstandard-0.24.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6885ae4b33aee8835dbdb4249d3dfec09af55e705d74d9b660bfb9da51baaa8b", size = 5267388, upload-time = "2025-08-17T18:23:09.127Z" }, + { url = "https://files.pythonhosted.org/packages/c0/23/a4cfe1b871d3f1ce1f88f5c68d7e922e94be0043f3ae5ed58c11578d1e21/zstandard-0.24.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:663848a8bac4fdbba27feea2926049fdf7b55ec545d5b9aea096ef21e7f0b079", size = 5433383, upload-time = "2025-08-17T18:23:11.343Z" }, + { url = "https://files.pythonhosted.org/packages/77/26/f3fb85f00e732cca617d4b9cd1ffa6484f613ea07fad872a8bdc3a0ce753/zstandard-0.24.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:05d27c953f2e0a3ecc8edbe91d6827736acc4c04d0479672e0400ccdb23d818c", size = 5813988, upload-time = "2025-08-17T18:23:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/3d/8c/d7e3b424b73f3ce66e754595cbcb6d94ff49790c9ac37d50e40e8145cd44/zstandard-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77b8b7b98893eaf47da03d262816f01f251c2aa059c063ed8a45c50eada123a5", size = 5359756, upload-time = "2025-08-17T18:23:15.021Z" }, + { url = "https://files.pythonhosted.org/packages/90/6c/f1f0e11f1b295138f9da7e7ae22dcd9a1bb96a9544fa3b31507e431288f5/zstandard-0.24.0-cp313-cp313-win32.whl", hash = "sha256:cf7fbb4e54136e9a03c7ed7691843c4df6d2ecc854a2541f840665f4f2bb2edd", size = 435957, upload-time = "2025-08-17T18:23:18.835Z" }, + { url = "https://files.pythonhosted.org/packages/9f/03/ab8b82ae5eb49eca4d3662705399c44442666cc1ce45f44f2d263bb1ae31/zstandard-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:d64899cc0f33a8f446f1e60bffc21fa88b99f0e8208750d9144ea717610a80ce", size = 505171, upload-time = "2025-08-17T18:23:16.44Z" }, + { url = "https://files.pythonhosted.org/packages/db/12/89a2ecdea4bc73a934a30b66a7cfac5af352beac94d46cf289e103b65c34/zstandard-0.24.0-cp313-cp313-win_arm64.whl", hash = "sha256:57be3abb4313e0dd625596376bbb607f40059d801d51c1a1da94d7477e63b255", size = 461596, upload-time = "2025-08-17T18:23:17.603Z" }, + { url = "https://files.pythonhosted.org/packages/c9/56/f3d2c4d64aacee4aab89e788783636884786b6f8334c819f09bff1aa207b/zstandard-0.24.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b7fa260dd2731afd0dfa47881c30239f422d00faee4b8b341d3e597cface1483", size = 795747, upload-time = "2025-08-17T18:23:19.968Z" }, + { url = "https://files.pythonhosted.org/packages/32/2d/9d3e5f6627e4cb5e511803788be1feee2f0c3b94594591e92b81db324253/zstandard-0.24.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e05d66239d14a04b4717998b736a25494372b1b2409339b04bf42aa4663bf251", size = 640475, upload-time = "2025-08-17T18:23:21.5Z" }, + { url = "https://files.pythonhosted.org/packages/be/5d/48e66abf8c146d95330e5385633a8cfdd556fa8bd14856fe721590cbab2b/zstandard-0.24.0-cp314-cp314-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:622e1e04bd8a085994e02313ba06fbcf4f9ed9a488c6a77a8dbc0692abab6a38", size = 5343866, upload-time = "2025-08-17T18:23:23.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/6c/65fe7ba71220a551e082e4a52790487f1d6bb8dfc2156883e088f975ad6d/zstandard-0.24.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:55872e818598319f065e8192ebefecd6ac05f62a43f055ed71884b0a26218f41", size = 5062719, upload-time = "2025-08-17T18:23:25.192Z" }, + { url = "https://files.pythonhosted.org/packages/cb/68/15ed0a813ff91be80cc2a610ac42e0fc8d29daa737de247bbf4bab9429a1/zstandard-0.24.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bb2446a55b3a0fd8aa02aa7194bd64740015464a2daaf160d2025204e1d7c282", size = 5393090, upload-time = "2025-08-17T18:23:27.145Z" }, + { url = "https://files.pythonhosted.org/packages/d4/89/e560427b74fa2da6a12b8f3af8ee29104fe2bb069a25e7d314c35eec7732/zstandard-0.24.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2825a3951f945fb2613ded0f517d402b1e5a68e87e0ee65f5bd224a8333a9a46", size = 5450383, upload-time = "2025-08-17T18:23:29.044Z" }, + { url = "https://files.pythonhosted.org/packages/a3/95/0498328cbb1693885509f2fc145402b108b750a87a3af65b7250b10bd896/zstandard-0.24.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:09887301001e7a81a3618156bc1759e48588de24bddfdd5b7a4364da9a8fbc20", size = 5546142, upload-time = "2025-08-17T18:23:31.281Z" }, + { url = "https://files.pythonhosted.org/packages/8a/8a/64aa15a726594df3bf5d8decfec14fe20cd788c60890f44fcfc74d98c2cc/zstandard-0.24.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:98ca91dc9602cf351497d5600aa66e6d011a38c085a8237b370433fcb53e3409", size = 4953456, upload-time = "2025-08-17T18:23:33.234Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b6/e94879c5cd6017af57bcba08519ed1228b1ebb15681efd949f4a00199449/zstandard-0.24.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:e69f8e534b4e254f523e2f9d4732cf9c169c327ca1ce0922682aac9a5ee01155", size = 5268287, upload-time = "2025-08-17T18:23:35.145Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e5/1a3b3a93f953dbe9e77e2a19be146e9cd2af31b67b1419d6cc8e8898d409/zstandard-0.24.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:444633b487a711e34f4bccc46a0c5dfbe1aee82c1a511e58cdc16f6bd66f187c", size = 5433197, upload-time = "2025-08-17T18:23:36.969Z" }, + { url = "https://files.pythonhosted.org/packages/39/83/b6eb1e1181de994b29804e1e0d2dc677bece4177f588c71653093cb4f6d5/zstandard-0.24.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f7d3fe9e1483171e9183ffdb1fab07c5fef80a9c3840374a38ec2ab869ebae20", size = 5813161, upload-time = "2025-08-17T18:23:38.812Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d3/2fb4166561591e9d75e8e35c79182aa9456644e2f4536f29e51216d1c513/zstandard-0.24.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:27b6fa72b57824a3f7901fc9cc4ce1c1c834b28f3a43d1d4254c64c8f11149d4", size = 5359831, upload-time = "2025-08-17T18:23:41.162Z" }, + { url = "https://files.pythonhosted.org/packages/11/94/6a9227315b774f64a67445f62152c69b4e5e49a52a3c7c4dad8520a55e20/zstandard-0.24.0-cp314-cp314-win32.whl", hash = "sha256:fdc7a52a4cdaf7293e10813fd6a3abc0c7753660db12a3b864ab1fb5a0c60c16", size = 444448, upload-time = "2025-08-17T18:23:45.151Z" }, + { url = "https://files.pythonhosted.org/packages/fc/de/67acaba311013e0798cb96d1a2685cb6edcdfc1cae378b297ea7b02c319f/zstandard-0.24.0-cp314-cp314-win_amd64.whl", hash = "sha256:656ed895b28c7e42dd5b40dfcea3217cfc166b6b7eef88c3da2f5fc62484035b", size = 516075, upload-time = "2025-08-17T18:23:42.8Z" }, + { url = "https://files.pythonhosted.org/packages/10/ae/45fd8921263cea0228b20aa31bce47cc66016b2aba1afae1c6adcc3dbb1f/zstandard-0.24.0-cp314-cp314-win_arm64.whl", hash = "sha256:0101f835da7de08375f380192ff75135527e46e3f79bef224e3c49cb640fef6a", size = 476847, upload-time = "2025-08-17T18:23:43.892Z" }, +] diff --git a/products/mcp/package.json b/products/mcp/package.json new file mode 100644 index 0000000000..a24e7fff55 --- /dev/null +++ b/products/mcp/package.json @@ -0,0 +1,33 @@ +{ + "name": "posthog-mcp-monorepo", + "version": "0.0.0", + "private": true, + "scripts": { + "prepare": "husky", + "dev": "cd typescript && pnpm dev", + "build": "cd typescript && pnpm build", + "inspector": "cd typescript && pnpm inspector", + "schema:build:json": "tsx typescript/scripts/generate-tool-schema.ts", + "test": "cd typescript && pnpm test", + "test:integration": "cd typescript && pnpm test:integration", + "schema:build:python": "bash python/scripts/generate-pydantic-models.sh", + "schema:build": "pnpm run schema:build:json && pnpm run schema:build:python", + "format": "prettier --write . && oxlint --fix --fix-suggestions --quiet .", + "lint": "prettier --check . && oxlint .", + "format:python": "cd python && uv run ruff format .", + "lint:python": "cd python && uv run ruff check --fix .", + "test:python": "cd python && uv run pytest tests/ -v", + "typecheck": "cd typescript && pnpm typecheck", + "typecheck:python": "cd python && uvx ty check", + "docker:build": "docker build -t posthog-mcp .", + "docker:run": "docker run -i --rm --env POSTHOG_AUTH_HEADER=${POSTHOG_AUTH_HEADER} --env POSTHOG_REMOTE_MCP_URL=${POSTHOG_REMOTE_MCP_URL:-https://mcp.posthog.com/mcp} posthog-mcp", + "docker:inspector": "npx @modelcontextprotocol/inspector docker run -i --rm --env POSTHOG_AUTH_HEADER=${POSTHOG_AUTH_HEADER} --env POSTHOG_REMOTE_MCP_URL=${POSTHOG_REMOTE_MCP_URL:-https://mcp.posthog.com/mcp} posthog-mcp" + }, + "devDependencies": { + "husky": "^9.1.7", + "oxlint": "^1.8.0", + "prettier": "^3.4.2", + "tsx": "^4.20.3" + }, + "packageManager": "pnpm@9.15.5+sha256.8472168c3e1fd0bff287e694b053fccbbf20579a3ff9526b6333beab8df65a8d" +} diff --git a/products/mcp/pnpm-lock.yaml b/products/mcp/pnpm-lock.yaml new file mode 100644 index 0000000000..c7390add2b --- /dev/null +++ b/products/mcp/pnpm-lock.yaml @@ -0,0 +1,525 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + .: + devDependencies: + '@biomejs/biome': + specifier: 1.9.4 + version: 1.9.4 + husky: + specifier: ^9.1.7 + version: 9.1.7 + tsx: + specifier: ^4.20.3 + version: 4.20.3 + +packages: + '@biomejs/biome@1.9.4': + resolution: + { + integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==, + } + engines: { node: '>=14.21.3' } + hasBin: true + + '@biomejs/cli-darwin-arm64@1.9.4': + resolution: + { + integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==, + } + engines: { node: '>=14.21.3' } + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.9.4': + resolution: + { + integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==, + } + engines: { node: '>=14.21.3' } + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.9.4': + resolution: + { + integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==, + } + engines: { node: '>=14.21.3' } + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.9.4': + resolution: + { + integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==, + } + engines: { node: '>=14.21.3' } + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.9.4': + resolution: + { + integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==, + } + engines: { node: '>=14.21.3' } + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.9.4': + resolution: + { + integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==, + } + engines: { node: '>=14.21.3' } + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.9.4': + resolution: + { + integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==, + } + engines: { node: '>=14.21.3' } + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.9.4': + resolution: + { + integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==, + } + engines: { node: '>=14.21.3' } + cpu: [x64] + os: [win32] + + '@esbuild/aix-ppc64@0.25.4': + resolution: + { + integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==, + } + engines: { node: '>=18' } + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.4': + resolution: + { + integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.4': + resolution: + { + integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==, + } + engines: { node: '>=18' } + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.4': + resolution: + { + integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.4': + resolution: + { + integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.4': + resolution: + { + integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.4': + resolution: + { + integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.4': + resolution: + { + integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.4': + resolution: + { + integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.4': + resolution: + { + integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==, + } + engines: { node: '>=18' } + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.4': + resolution: + { + integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==, + } + engines: { node: '>=18' } + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.4': + resolution: + { + integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==, + } + engines: { node: '>=18' } + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.4': + resolution: + { + integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==, + } + engines: { node: '>=18' } + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.4': + resolution: + { + integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==, + } + engines: { node: '>=18' } + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.4': + resolution: + { + integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==, + } + engines: { node: '>=18' } + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.4': + resolution: + { + integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==, + } + engines: { node: '>=18' } + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.4': + resolution: + { + integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.4': + resolution: + { + integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.4': + resolution: + { + integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.4': + resolution: + { + integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.4': + resolution: + { + integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.4': + resolution: + { + integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.4': + resolution: + { + integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.4': + resolution: + { + integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==, + } + engines: { node: '>=18' } + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.4': + resolution: + { + integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [win32] + + esbuild@0.25.4: + resolution: + { + integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==, + } + engines: { node: '>=18' } + hasBin: true + + fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + + get-tsconfig@4.10.1: + resolution: + { + integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==, + } + + husky@9.1.7: + resolution: + { + integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==, + } + engines: { node: '>=18' } + hasBin: true + + resolve-pkg-maps@1.0.0: + resolution: + { + integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, + } + + tsx@4.20.3: + resolution: + { + integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==, + } + engines: { node: '>=18.0.0' } + hasBin: true + +snapshots: + '@biomejs/biome@1.9.4': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.9.4 + '@biomejs/cli-darwin-x64': 1.9.4 + '@biomejs/cli-linux-arm64': 1.9.4 + '@biomejs/cli-linux-arm64-musl': 1.9.4 + '@biomejs/cli-linux-x64': 1.9.4 + '@biomejs/cli-linux-x64-musl': 1.9.4 + '@biomejs/cli-win32-arm64': 1.9.4 + '@biomejs/cli-win32-x64': 1.9.4 + + '@biomejs/cli-darwin-arm64@1.9.4': + optional: true + + '@biomejs/cli-darwin-x64@1.9.4': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.9.4': + optional: true + + '@biomejs/cli-linux-arm64@1.9.4': + optional: true + + '@biomejs/cli-linux-x64-musl@1.9.4': + optional: true + + '@biomejs/cli-linux-x64@1.9.4': + optional: true + + '@biomejs/cli-win32-arm64@1.9.4': + optional: true + + '@biomejs/cli-win32-x64@1.9.4': + optional: true + + '@esbuild/aix-ppc64@0.25.4': + optional: true + + '@esbuild/android-arm64@0.25.4': + optional: true + + '@esbuild/android-arm@0.25.4': + optional: true + + '@esbuild/android-x64@0.25.4': + optional: true + + '@esbuild/darwin-arm64@0.25.4': + optional: true + + '@esbuild/darwin-x64@0.25.4': + optional: true + + '@esbuild/freebsd-arm64@0.25.4': + optional: true + + '@esbuild/freebsd-x64@0.25.4': + optional: true + + '@esbuild/linux-arm64@0.25.4': + optional: true + + '@esbuild/linux-arm@0.25.4': + optional: true + + '@esbuild/linux-ia32@0.25.4': + optional: true + + '@esbuild/linux-loong64@0.25.4': + optional: true + + '@esbuild/linux-mips64el@0.25.4': + optional: true + + '@esbuild/linux-ppc64@0.25.4': + optional: true + + '@esbuild/linux-riscv64@0.25.4': + optional: true + + '@esbuild/linux-s390x@0.25.4': + optional: true + + '@esbuild/linux-x64@0.25.4': + optional: true + + '@esbuild/netbsd-arm64@0.25.4': + optional: true + + '@esbuild/netbsd-x64@0.25.4': + optional: true + + '@esbuild/openbsd-arm64@0.25.4': + optional: true + + '@esbuild/openbsd-x64@0.25.4': + optional: true + + '@esbuild/sunos-x64@0.25.4': + optional: true + + '@esbuild/win32-arm64@0.25.4': + optional: true + + '@esbuild/win32-ia32@0.25.4': + optional: true + + '@esbuild/win32-x64@0.25.4': + optional: true + + esbuild@0.25.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 + + fsevents@2.3.3: + optional: true + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + husky@9.1.7: {} + + resolve-pkg-maps@1.0.0: {} + + tsx@4.20.3: + dependencies: + esbuild: 0.25.4 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 diff --git a/products/mcp/python/README.md b/products/mcp/python/README.md new file mode 100644 index 0000000000..8e18df5d40 --- /dev/null +++ b/products/mcp/python/README.md @@ -0,0 +1,57 @@ +# posthog-agent-toolkit + +Tools to give agents access to your PostHog data, manage feature flags, create insights, and more. + +This is a Python wrapper around the PostHog MCP (Model Context Protocol) server, providing easy integration with AI frameworks like LangChain. + +## Installation + +```bash +pip install posthog-agent-toolkit +``` + +## Quick Start + +The toolkit provides integrations for popular AI frameworks: + +### Using with LangChain + +```python +from langchain_openai import ChatOpenAI +from langchain.agents import AgentExecutor, create_tool_calling_agent +from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder +from posthog_agent_toolkit.integrations.langchain.toolkit import PostHogAgentToolkit + +# Initialize the PostHog toolkit +toolkit = PostHogAgentToolkit( + personal_api_key="your_posthog_personal_api_key", + url="https://mcp.posthog.com/mcp" # or your own, if you are self hosting the MCP server +) + +# Get the tools +tools = await toolkit.get_tools() + +# Initialize the LLM +llm = ChatOpenAI(model="gpt-5-mini") + +# Create a prompt +prompt = ChatPromptTemplate.from_messages([ + ("system", "You are a data analyst with access to PostHog analytics"), + ("human", "{input}"), + MessagesPlaceholder("agent_scratchpad"), +]) + +# Create and run the agent +agent = create_tool_calling_agent(llm=llm, tools=tools, prompt=prompt) +executor = AgentExecutor(agent=agent, tools=tools) + +result = await executor.ainvoke({ + "input": "Analyze our product usage by getting the top 5 most interesting insights and summarising the data from them." +}) +``` + +**[→ See full LangChain example](https://github.com/posthog/mcp/tree/main/examples/langchain)** + +## Available Tools + +For a list of all available tools, please see the [docs](https://posthog.com/docs/model-context-protocol). diff --git a/products/mcp/python/posthog_agent_toolkit/__init__.py b/products/mcp/python/posthog_agent_toolkit/__init__.py new file mode 100644 index 0000000000..89ffde1375 --- /dev/null +++ b/products/mcp/python/posthog_agent_toolkit/__init__.py @@ -0,0 +1,3 @@ +"""PostHog Agent Toolkit for Python.""" + +__version__ = "0.1.0" diff --git a/products/mcp/python/posthog_agent_toolkit/integrations/__init__.py b/products/mcp/python/posthog_agent_toolkit/integrations/__init__.py new file mode 100644 index 0000000000..057739d24b --- /dev/null +++ b/products/mcp/python/posthog_agent_toolkit/integrations/__init__.py @@ -0,0 +1 @@ +"""PostHog Agent Toolkit Integrations.""" diff --git a/products/mcp/python/posthog_agent_toolkit/integrations/langchain/__init__.py b/products/mcp/python/posthog_agent_toolkit/integrations/langchain/__init__.py new file mode 100644 index 0000000000..17885d001c --- /dev/null +++ b/products/mcp/python/posthog_agent_toolkit/integrations/langchain/__init__.py @@ -0,0 +1,5 @@ +"""PostHog LangChain Integration.""" + +from .toolkit import PostHogAgentToolkit + +__all__ = ["PostHogAgentToolkit"] diff --git a/products/mcp/python/posthog_agent_toolkit/integrations/langchain/toolkit.py b/products/mcp/python/posthog_agent_toolkit/integrations/langchain/toolkit.py new file mode 100644 index 0000000000..3b6760f4f9 --- /dev/null +++ b/products/mcp/python/posthog_agent_toolkit/integrations/langchain/toolkit.py @@ -0,0 +1,61 @@ +"""PostHog Agent Toolkit for LangChain using MCP.""" + +from typing import Any + +from langchain_core.tools import BaseTool +from langchain_mcp_adapters.client import MultiServerMCPClient + + +class PostHogAgentToolkit: + """ + A toolkit for interacting with PostHog tools via the MCP server. + """ + + _tools: list[BaseTool] | None + client: MultiServerMCPClient + + def __init__( + self, + url: str = "https://mcp.posthog.com/mcp", + personal_api_key: str | None = None, + ): + """ + Initialize the PostHog Agent Toolkit. + + Args: + url: The URL of the PostHog MCP server (default: https://mcp.posthog.com/mcp/) + personal_api_key: PostHog API key for authentication + """ + + if not personal_api_key: + raise ValueError("A personal API key is required.") + + config = self._get_config(url, personal_api_key) + + self.client = MultiServerMCPClient(config) + + self._tools: list[BaseTool] | None = None + + @staticmethod + def _get_config(url: str, personal_api_key: str) -> dict[str, dict[str, Any]]: + return { + "posthog": { + "url": url, + "transport": "streamable_http", + "headers": { + "Authorization": f"Bearer {personal_api_key}", + "X-Client-Package": "posthog-agent-toolkit", + }, + } + } + + async def get_tools(self) -> list[BaseTool]: + """ + Get all available PostHog tools as LangChain compatible tools. + + Returns: + List of BaseTool instances that can be used with LangChain agents + """ + if self._tools is None: + self._tools = await self.client.get_tools() + return self._tools diff --git a/products/mcp/python/pyproject.toml b/products/mcp/python/pyproject.toml new file mode 100644 index 0000000000..06c1801a4a --- /dev/null +++ b/products/mcp/python/pyproject.toml @@ -0,0 +1,73 @@ +[project] +name = "posthog-agent-toolkit" +version = "0.1.2" +description = "PostHog Agent Toolkit for LangChain and other AI frameworks" +readme = "README.md" +requires-python = ">=3.11" +authors = [ + { name = "PostHog", email = "hey@posthog.com" }, +] +dependencies = [ + "pydantic>=2.5.0", + "httpx>=0.25.0", + "typing-extensions>=4.8.0", + "python-dateutil>=2.8.2", + "python-dotenv>=1.0.0", + "langchain-mcp-adapters>=0.1.0", + "langchain-core>=0.1.0", +] + +[dependency-groups] +dev = [ + "datamodel-code-generator[http]>=0.25.0", + "ruff>=0.1.0", + "pytest>=7.0.0", + "pytest-asyncio>=0.21.0", + "build>=1.3.0", + "twine>=6.2.0", +] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["posthog_agent_toolkit"] + +[tool.hatch.build.targets.sdist] +exclude = [ + ".venv/", + "dist/", + "*.egg-info/", +] + +[tool.ruff] +target-version = "py311" +line-length = 160 +indent-width = 4 +exclude = [ + "schema/tool_inputs.py", # Auto-generated file +] + +[tool.ruff.lint] +select = [ + "E", # pycodestyle errors + "W", # pycodestyle warnings + "F", # pyflakes + "I", # isort + "B", # flake8-bugbear + "C4", # flake8-comprehensions + "UP", # pyupgrade +] +ignore = [ + "E501", # line too long +] + +[tool.ruff.format] +quote-style = "double" +indent-style = "space" +skip-magic-trailing-comma = false +line-ending = "auto" + +[tool.uv] +dev-dependencies = [] diff --git a/products/mcp/python/pytest.ini b/products/mcp/python/pytest.ini new file mode 100644 index 0000000000..dfffd732b5 --- /dev/null +++ b/products/mcp/python/pytest.ini @@ -0,0 +1,10 @@ +[tool:pytest] +asyncio_mode = auto +testpaths = tests +python_files = test_*.py *_test.py +python_classes = Test* +python_functions = test_* +addopts = -v --tb=short +env = + PYTHONPATH = . +filterwarnings = ignore::DeprecationWarning \ No newline at end of file diff --git a/products/mcp/python/schema/tool_inputs.py b/products/mcp/python/schema/tool_inputs.py new file mode 100644 index 0000000000..964febf245 --- /dev/null +++ b/products/mcp/python/schema/tool_inputs.py @@ -0,0 +1,2246 @@ +# mypy: disable-error-code="assignment" + +from __future__ import annotations + +from datetime import datetime +from enum import Enum, StrEnum +from typing import Annotated, Any, Literal +from uuid import UUID + +from pydantic import AnyUrl, BaseModel, ConfigDict, Field, RootModel + + +class ToolInputs(RootModel[Any]): + root: Any + + +class Data(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + insightId: str + dashboardId: Annotated[int, Field(gt=0)] + + +class DashboardAddInsightSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + data: Data + + +class Data1(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: Annotated[str, Field(min_length=1)] + description: str | None = None + pinned: bool | None = None + tags: list[str] | None = None + + +class DashboardCreateSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + data: Data1 + + +class DashboardDeleteSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + dashboardId: float + + +class Data2(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + limit: Annotated[int | None, Field(gt=0)] = None + offset: Annotated[int | None, Field(ge=0)] = None + search: str | None = None + pinned: bool | None = None + + +class DashboardGetAllSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + data: Data2 | None = None + + +class DashboardGetSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + dashboardId: float + + +class Data3(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: str | None = None + description: str | None = None + pinned: bool | None = None + tags: list[str] | None = None + + +class DashboardUpdateSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + dashboardId: float + data: Data3 + + +class DocumentationSearchSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + query: str + + +class ErrorTrackingDetailsSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + issueId: UUID + dateFrom: datetime | None = None + dateTo: datetime | None = None + + +class OrderBy(StrEnum): + OCCURRENCES = "occurrences" + FIRST_SEEN = "first_seen" + LAST_SEEN = "last_seen" + USERS = "users" + SESSIONS = "sessions" + + +class OrderDirection(StrEnum): + ASC = "ASC" + DESC = "DESC" + + +class Status(StrEnum): + ACTIVE = "active" + RESOLVED = "resolved" + ALL = "all" + SUPPRESSED = "suppressed" + + +class ErrorTrackingListSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + orderBy: OrderBy | None = None + dateFrom: datetime | None = None + dateTo: datetime | None = None + orderDirection: OrderDirection | None = None + filterTestAccounts: bool | None = None + status: Status | None = None + + +class Type(StrEnum): + """ + Experiment type: 'product' for backend/API changes, 'web' for frontend UI changes + """ + + PRODUCT = "product" + WEB = "web" + + +class MetricType(StrEnum): + """ + Metric type: 'mean' for average values (revenue, time spent), 'funnel' for conversion flows, 'ratio' for comparing two metrics + """ + + MEAN = "mean" + FUNNEL = "funnel" + RATIO = "ratio" + + +class PrimaryMetric(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: str | None = None + """ + Human-readable metric name + """ + metric_type: MetricType + """ + Metric type: 'mean' for average values (revenue, time spent), 'funnel' for conversion flows, 'ratio' for comparing two metrics + """ + event_name: str + """ + REQUIRED for metrics to work: PostHog event name (e.g., '$pageview', 'add_to_cart', 'purchase'). For funnels, this is the first step. Use '$pageview' if unsure. Search project-property-definitions tool for available events. + """ + funnel_steps: list[str] | None = None + """ + For funnel metrics only: Array of event names for each funnel step (e.g., ['product_view', 'add_to_cart', 'checkout', 'purchase']) + """ + properties: dict[str, Any] | None = None + """ + Event properties to filter on + """ + description: str | None = None + """ + What this metric measures and why it's important for the experiment + """ + + +class MetricType1(StrEnum): + """ + Metric type: 'mean' for average values, 'funnel' for conversion flows, 'ratio' for comparing two metrics + """ + + MEAN = "mean" + FUNNEL = "funnel" + RATIO = "ratio" + + +class SecondaryMetric(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: str | None = None + """ + Human-readable metric name + """ + metric_type: MetricType1 + """ + Metric type: 'mean' for average values, 'funnel' for conversion flows, 'ratio' for comparing two metrics + """ + event_name: str + """ + REQUIRED: PostHog event name. Use '$pageview' if unsure. + """ + funnel_steps: list[str] | None = None + """ + For funnel metrics only: Array of event names for each funnel step + """ + properties: dict[str, Any] | None = None + """ + Event properties to filter on + """ + description: str | None = None + """ + What this secondary metric measures + """ + + +class Variant(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + key: str + """ + Variant key (e.g., 'control', 'variant_a', 'new_design') + """ + name: str | None = None + """ + Human-readable variant name + """ + rollout_percentage: Annotated[float, Field(ge=0.0, le=100.0)] + """ + Percentage of users to show this variant + """ + + +class ExperimentCreateSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: Annotated[str, Field(min_length=1)] + """ + Experiment name - should clearly describe what is being tested + """ + description: str | None = None + """ + Detailed description of the experiment hypothesis, what changes are being tested, and expected outcomes + """ + feature_flag_key: str + """ + Feature flag key (letters, numbers, hyphens, underscores only). IMPORTANT: First search for existing feature flags that might be suitable using the feature-flags-get-all tool, then suggest reusing existing ones or creating a new key based on the experiment name + """ + type: Type | None = Type.PRODUCT + """ + Experiment type: 'product' for backend/API changes, 'web' for frontend UI changes + """ + primary_metrics: list[PrimaryMetric] | None = None + """ + Primary metrics to measure experiment success. IMPORTANT: Each metric needs event_name to track data. For funnels, provide funnel_steps array with event names for each step. Ask user what events they track, or use project-property-definitions to find available events. + """ + secondary_metrics: list[SecondaryMetric] | None = None + """ + Secondary metrics to monitor for potential side effects or additional insights. Each metric needs event_name. + """ + variants: list[Variant] | None = None + """ + Experiment variants. If not specified, defaults to 50/50 control/test split. Ask user how many variants they need and what each tests + """ + minimum_detectable_effect: float | None = 30 + """ + Minimum detectable effect in percentage. Lower values require more users but detect smaller changes. Suggest 20-30% for most experiments + """ + filter_test_accounts: bool | None = True + """ + Whether to filter out internal test accounts + """ + target_properties: dict[str, Any] | None = None + """ + Properties to target specific user segments (e.g., country, subscription type) + """ + draft: bool | None = True + """ + Create as draft (true) or launch immediately (false). Recommend draft for review first + """ + holdout_id: float | None = None + """ + Holdout group ID if this experiment should exclude users from other experiments + """ + + +class ExperimentDeleteSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + experimentId: float + """ + The ID of the experiment to delete + """ + + +class ExperimentGetAllSchema(BaseModel): + pass + model_config = ConfigDict( + extra="forbid", + ) + + +class ExperimentGetSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + experimentId: float + """ + The ID of the experiment to retrieve + """ + + +class ExperimentResultsGetSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + experimentId: float + """ + The ID of the experiment to get comprehensive results for + """ + refresh: bool + """ + Force refresh of results instead of using cached values + """ + + +class PrimaryMetric1(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: str | None = None + """ + Human-readable metric name + """ + metric_type: MetricType1 + """ + Metric type: 'mean' for average values, 'funnel' for conversion flows, 'ratio' for comparing two metrics + """ + event_name: str + """ + PostHog event name (e.g., '$pageview', 'add_to_cart', 'purchase') + """ + funnel_steps: list[str] | None = None + """ + For funnel metrics only: Array of event names for each funnel step + """ + properties: dict[str, Any] | None = None + """ + Event properties to filter on + """ + description: str | None = None + """ + What this metric measures + """ + + +class MetricType3(StrEnum): + """ + Metric type + """ + + MEAN = "mean" + FUNNEL = "funnel" + RATIO = "ratio" + + +class SecondaryMetric1(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: str | None = None + """ + Human-readable metric name + """ + metric_type: MetricType3 + """ + Metric type + """ + event_name: str + """ + PostHog event name + """ + funnel_steps: list[str] | None = None + """ + For funnel metrics only: Array of event names + """ + properties: dict[str, Any] | None = None + """ + Event properties to filter on + """ + description: str | None = None + """ + What this metric measures + """ + + +class Conclude(StrEnum): + """ + Conclude experiment with result + """ + + WON = "won" + LOST = "lost" + INCONCLUSIVE = "inconclusive" + STOPPED_EARLY = "stopped_early" + INVALID = "invalid" + + +class ExperimentUpdateInputSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: str | None = None + """ + Update experiment name + """ + description: str | None = None + """ + Update experiment description + """ + primary_metrics: list[PrimaryMetric1] | None = None + """ + Update primary metrics + """ + secondary_metrics: list[SecondaryMetric1] | None = None + """ + Update secondary metrics + """ + minimum_detectable_effect: float | None = None + """ + Update minimum detectable effect in percentage + """ + launch: bool | None = None + """ + Launch experiment (set start_date) or keep as draft + """ + conclude: Conclude | None = None + """ + Conclude experiment with result + """ + conclusion_comment: str | None = None + """ + Comment about experiment conclusion + """ + restart: bool | None = None + """ + Restart concluded experiment (clears end_date and conclusion) + """ + archive: bool | None = None + """ + Archive or unarchive experiment + """ + + +class MetricType4(StrEnum): + """ + Metric type: 'mean' for average values, 'funnel' for conversion flows, 'ratio' for comparing two metrics + """ + + MEAN = "mean" + FUNNEL = "funnel" + RATIO = "ratio" + + +class PrimaryMetric2(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: str | None = None + """ + Human-readable metric name + """ + metric_type: MetricType4 + """ + Metric type: 'mean' for average values, 'funnel' for conversion flows, 'ratio' for comparing two metrics + """ + event_name: str + """ + PostHog event name (e.g., '$pageview', 'add_to_cart', 'purchase') + """ + funnel_steps: list[str] | None = None + """ + For funnel metrics only: Array of event names for each funnel step + """ + properties: dict[str, Any] | None = None + """ + Event properties to filter on + """ + description: str | None = None + """ + What this metric measures + """ + + +class MetricType5(StrEnum): + """ + Metric type + """ + + MEAN = "mean" + FUNNEL = "funnel" + RATIO = "ratio" + + +class SecondaryMetric2(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: str | None = None + """ + Human-readable metric name + """ + metric_type: MetricType5 + """ + Metric type + """ + event_name: str + """ + PostHog event name + """ + funnel_steps: list[str] | None = None + """ + For funnel metrics only: Array of event names + """ + properties: dict[str, Any] | None = None + """ + Event properties to filter on + """ + description: str | None = None + """ + What this metric measures + """ + + +class Data4(BaseModel): + """ + The experiment data to update using user-friendly format + """ + + model_config = ConfigDict( + extra="forbid", + ) + name: str | None = None + """ + Update experiment name + """ + description: str | None = None + """ + Update experiment description + """ + primary_metrics: list[PrimaryMetric2] | None = None + """ + Update primary metrics + """ + secondary_metrics: list[SecondaryMetric2] | None = None + """ + Update secondary metrics + """ + minimum_detectable_effect: float | None = None + """ + Update minimum detectable effect in percentage + """ + launch: bool | None = None + """ + Launch experiment (set start_date) or keep as draft + """ + conclude: Conclude | None = None + """ + Conclude experiment with result + """ + conclusion_comment: str | None = None + """ + Comment about experiment conclusion + """ + restart: bool | None = None + """ + Restart concluded experiment (clears end_date and conclusion) + """ + archive: bool | None = None + """ + Archive or unarchive experiment + """ + + +class ExperimentUpdateSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + experimentId: float + """ + The ID of the experiment to update + """ + data: Data4 + """ + The experiment data to update using user-friendly format + """ + + +class Operator(StrEnum): + EXACT = "exact" + IS_NOT = "is_not" + IS_SET = "is_set" + IS_NOT_SET = "is_not_set" + ICONTAINS = "icontains" + NOT_ICONTAINS = "not_icontains" + REGEX = "regex" + NOT_REGEX = "not_regex" + IS_CLEANED_PATH_EXACT = "is_cleaned_path_exact" + exact_1 = "exact" + is_not_1 = "is_not" + is_set_1 = "is_set" + is_not_set_1 = "is_not_set" + GT = "gt" + GTE = "gte" + LT = "lt" + LTE = "lte" + MIN = "min" + MAX = "max" + exact_2 = "exact" + is_not_2 = "is_not" + is_set_2 = "is_set" + is_not_set_2 = "is_not_set" + IN_ = "in" + NOT_IN = "not_in" + + +class Property(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + key: str + value: str | float | bool | list[str] | list[float] + operator: Operator | None = None + + +class Group(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + properties: list[Property] + rollout_percentage: float + + +class Filters(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + groups: list[Group] + + +class FeatureFlagCreateSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: str + key: str + description: str + filters: Filters + active: bool + tags: list[str] | None = None + + +class FeatureFlagDeleteSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + flagKey: str + + +class FeatureFlagGetAllSchema(BaseModel): + pass + model_config = ConfigDict( + extra="forbid", + ) + + +class FeatureFlagGetDefinitionSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + flagId: Annotated[int | None, Field(gt=0)] = None + flagKey: str | None = None + + +class Property1(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + key: str + value: str | float | bool | list[str] | list[float] + operator: Operator | None = None + + +class Group1(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + properties: list[Property1] + rollout_percentage: float + + +class Filters1(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + groups: list[Group1] + + +class Data5(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: str | None = None + description: str | None = None + filters: Filters1 | None = None + active: bool | None = None + tags: list[str] | None = None + + +class FeatureFlagUpdateSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + flagKey: str + data: Data5 + + +class Kind(StrEnum): + INSIGHT_VIZ_NODE = "InsightVizNode" + DATA_VISUALIZATION_NODE = "DataVisualizationNode" + + +class Query(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + kind: Kind + source: Any | None = None + """ + For new insights, use the query from your successful query-run tool call. For updates, the existing query can optionally be reused. + """ + + +class Data6(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: str + query: Query + description: str | None = None + favorited: bool + tags: list[str] | None = None + + +class InsightCreateSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + data: Data6 + + +class InsightDeleteSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + insightId: str + + +class InsightGenerateHogQLFromQuestionSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + question: Annotated[str, Field(max_length=1000)] + """ + Your natural language query describing the SQL insight (max 1000 characters). + """ + + +class Data7(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + limit: float | None = None + offset: float | None = None + favorited: bool | None = None + search: str | None = None + + +class InsightGetAllSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + data: Data7 | None = None + + +class InsightGetSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + insightId: str + + +class InsightQueryInputSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + insightId: str + + +class Query1(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + kind: Kind + source: Any | None = None + """ + For new insights, use the query from your successful query-run tool call. For updates, the existing query can optionally be reused + """ + + +class Data8(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: str | None = None + description: str | None = None + filters: dict[str, Any] | None = None + query: Query1 + favorited: bool | None = None + dashboard: float | None = None + tags: list[str] | None = None + + +class InsightUpdateSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + insightId: str + data: Data8 + + +class LLMAnalyticsGetCostsSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + projectId: Annotated[int, Field(gt=0)] + days: float | None = None + + +class OrganizationGetAllSchema(BaseModel): + pass + model_config = ConfigDict( + extra="forbid", + ) + + +class OrganizationGetDetailsSchema(BaseModel): + pass + model_config = ConfigDict( + extra="forbid", + ) + + +class OrganizationSetActiveSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + orgId: UUID + + +class ProjectEventDefinitionsSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + q: str | None = None + """ + Search query to filter event names. Only use if there are lots of events. + """ + + +class ProjectGetAllSchema(BaseModel): + pass + model_config = ConfigDict( + extra="forbid", + ) + + +class Type1(StrEnum): + """ + Type of properties to get + """ + + EVENT = "event" + PERSON = "person" + + +class ProjectPropertyDefinitionsInputSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Type1 + """ + Type of properties to get + """ + eventName: str | None = None + """ + Event name to filter properties by, required for event type + """ + includePredefinedProperties: bool | None = None + """ + Whether to include predefined properties + """ + + +class ProjectSetActiveSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + projectId: Annotated[int, Field(gt=0)] + + +class DateRange(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + date_from: str | None = None + date_to: str | None = None + explicitDate: bool | None = None + + +class Properties(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + key: str + value: str | float | list[str] | list[float] | None = None + operator: str | None = None + type: str | None = None + + +class Type2(StrEnum): + AND_ = "AND" + OR_ = "OR" + + +class Value(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + key: str + value: str | float | list[str] | list[float] | None = None + operator: str | None = None + type: str | None = None + + +class Properties1(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Type2 + values: list[Value] + + +class Properties2(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Type2 + values: list[Value] + + +class Interval(StrEnum): + HOUR = "hour" + DAY = "day" + WEEK = "week" + MONTH = "month" + + +class Math(StrEnum): + TOTAL = "total" + DAU = "dau" + WEEKLY_ACTIVE = "weekly_active" + MONTHLY_ACTIVE = "monthly_active" + UNIQUE_SESSION = "unique_session" + FIRST_TIME_FOR_USER = "first_time_for_user" + FIRST_MATCHING_EVENT_FOR_USER = "first_matching_event_for_user" + AVG = "avg" + SUM = "sum" + MIN = "min" + MAX = "max" + MEDIAN = "median" + P75 = "p75" + P90 = "p90" + P95 = "p95" + P99 = "p99" + + +class Properties3(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + key: str + value: str | float | list[str] | list[float] | None = None + operator: str | None = None + type: str | None = None + + +class Properties4(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Type2 + values: list[Value] + + +class Properties5(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Type2 + values: list[Value] + + +class Series(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + custom_name: str + """ + A display name + """ + math: Math | None = None + math_property: str | None = None + properties: list[Properties3 | Properties4] | Properties5 | None = None + kind: Literal["EventsNode"] = "EventsNode" + event: str | None = None + limit: float | None = None + + +class Display(StrEnum): + ACTIONS_LINE_GRAPH = "ActionsLineGraph" + ACTIONS_TABLE = "ActionsTable" + ACTIONS_PIE = "ActionsPie" + ACTIONS_BAR = "ActionsBar" + ACTIONS_BAR_VALUE = "ActionsBarValue" + WORLD_MAP = "WorldMap" + BOLD_NUMBER = "BoldNumber" + + +class TrendsFilter(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + display: Display | None = Display.ACTIONS_LINE_GRAPH + showLegend: bool | None = False + + +class BreakdownType(StrEnum): + PERSON = "person" + EVENT = "event" + + +class BreakdownFilter(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + breakdown_type: BreakdownType | None = BreakdownType.EVENT + breakdown_limit: float | None = None + breakdown: str | float | list[str | float] | None = None + + +class CompareFilter(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + compare: bool | None = False + compare_to: str | None = None + + +class Source(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + dateRange: DateRange | None = None + filterTestAccounts: bool | None = False + properties: list[Properties | Properties1] | Properties2 | None = [] + kind: Literal["TrendsQuery"] = "TrendsQuery" + interval: Interval | None = Interval.DAY + series: list[Series] + trendsFilter: TrendsFilter | None = None + breakdownFilter: BreakdownFilter | None = None + compareFilter: CompareFilter | None = None + conversionGoal: Any = None + + +class Properties6(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + key: str + value: str | float | list[str] | list[float] | None = None + operator: str | None = None + type: str | None = None + + +class Properties7(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Type2 + values: list[Value] + + +class Properties8(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Type2 + values: list[Value] + + +class Properties9(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + key: str + value: str | float | list[str] | list[float] | None = None + operator: str | None = None + type: str | None = None + + +class Properties10(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Type2 + values: list[Value] + + +class Properties11(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Type2 + values: list[Value] + + +class Series1(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + custom_name: str + """ + A display name + """ + math: Math | None = None + math_property: str | None = None + properties: list[Properties9 | Properties10] | Properties11 | None = None + kind: Literal["EventsNode"] = "EventsNode" + event: str | None = None + limit: float | None = None + + +class Layout(StrEnum): + HORIZONTAL = "horizontal" + VERTICAL = "vertical" + + +class BreakdownAttributionType(StrEnum): + FIRST_TOUCH = "first_touch" + LAST_TOUCH = "last_touch" + ALL_EVENTS = "all_events" + + +class FunnelOrderType(StrEnum): + ORDERED = "ordered" + UNORDERED = "unordered" + STRICT = "strict" + + +class FunnelVizType(StrEnum): + STEPS = "steps" + TIME_TO_CONVERT = "time_to_convert" + TRENDS = "trends" + + +class FunnelWindowIntervalUnit(StrEnum): + MINUTE = "minute" + HOUR = "hour" + DAY = "day" + WEEK = "week" + MONTH = "month" + + +class FunnelStepReference(StrEnum): + TOTAL = "total" + PREVIOUS = "previous" + + +class FunnelsFilter(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + layout: Layout | None = None + breakdownAttributionType: BreakdownAttributionType | None = None + breakdownAttributionValue: float | None = None + funnelToStep: float | None = None + funnelFromStep: float | None = None + funnelOrderType: FunnelOrderType | None = None + funnelVizType: FunnelVizType | None = None + funnelWindowInterval: float | None = 14 + funnelWindowIntervalUnit: FunnelWindowIntervalUnit | None = FunnelWindowIntervalUnit.DAY + funnelStepReference: FunnelStepReference | None = None + + +class BreakdownFilter1(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + breakdown_type: BreakdownType | None = BreakdownType.EVENT + breakdown_limit: float | None = None + breakdown: str | float | list[str | float] | None = None + + +class Source1(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + dateRange: DateRange | None = None + filterTestAccounts: bool | None = False + properties: list[Properties6 | Properties7] | Properties8 | None = [] + kind: Literal["FunnelsQuery"] = "FunnelsQuery" + interval: Interval | None = Interval.DAY + series: Annotated[list[Series1], Field(min_length=2)] + funnelsFilter: FunnelsFilter | None = None + breakdownFilter: BreakdownFilter1 | None = None + + +class Query2(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + kind: Literal["InsightVizNode"] = "InsightVizNode" + source: Source | Source1 + + +class Properties12(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + key: str + value: str | float | list[str] | list[float] | None = None + operator: str | None = None + type: str | None = None + + +class Properties13(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Type2 + values: list[Value] + + +class Filters2(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + properties: list[Properties12 | Properties13] | None = None + dateRange: DateRange | None = None + filterTestAccounts: bool | None = None + + +class Source2(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + kind: Literal["HogQLQuery"] = "HogQLQuery" + query: str + filters: Filters2 | None = None + + +class Query3(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + kind: Literal["DataVisualizationNode"] = "DataVisualizationNode" + source: Source2 + + +class QueryRunInputSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + query: Query2 | Query3 + + +class Type11(StrEnum): + POPOVER = "popover" + API = "api" + WIDGET = "widget" + EXTERNAL_SURVEY = "external_survey" + + +class DescriptionContentType(StrEnum): + HTML = "html" + TEXT = "text" + + +class Questions(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + question: str + description: str | None = None + descriptionContentType: DescriptionContentType | None = None + optional: bool | None = None + buttonText: str | None = None + type: Literal["open"] = "open" + + +class Questions1(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + question: str + description: str | None = None + descriptionContentType: DescriptionContentType | None = None + optional: bool | None = None + buttonText: str | None = None + type: Literal["link"] = "link" + link: AnyUrl + + +class Display1(StrEnum): + """ + Display format: 'number' shows numeric scale, 'emoji' shows emoji scale + """ + + NUMBER = "number" + EMOJI = "emoji" + + +class Scale(float, Enum): + """ + Rating scale can be one of 3, 5, or 7 + """ + + NUMBER_3 = 3 + NUMBER_5 = 5 + NUMBER_7 = 7 + + +class Branching(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["next_question"] = "next_question" + + +class Branching1(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["end"] = "end" + + +class Branching2(BaseModel): + """ + For rating questions: use sentiment keys based on scale thirds - negative (lower third), neutral (middle third), positive (upper third) + """ + + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["response_based"] = "response_based" + responseValues: dict[str, float | str] + """ + Only include keys for responses that should branch to a specific question or 'end'. Omit keys for responses that should proceed to the next question (default behavior). + """ + + +class Branching3(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["specific_question"] = "specific_question" + index: float + + +class Questions2(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + question: str + description: str | None = None + descriptionContentType: DescriptionContentType | None = None + optional: bool | None = None + buttonText: str | None = None + type: Literal["rating"] = "rating" + display: Display1 | None = None + """ + Display format: 'number' shows numeric scale, 'emoji' shows emoji scale + """ + scale: Scale | None = None + """ + Rating scale can be one of 3, 5, or 7 + """ + lowerBoundLabel: str | None = None + """ + Label for the lowest rating (e.g., 'Very Poor') + """ + upperBoundLabel: str | None = None + """ + Label for the highest rating (e.g., 'Excellent') + """ + branching: Branching | Branching1 | Branching2 | Branching3 | None = None + + +class Branching4(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["next_question"] = "next_question" + + +class Branching5(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["end"] = "end" + + +class Branching6(BaseModel): + """ + For NPS rating questions: use sentiment keys based on score ranges - detractors (0-6), passives (7-8), promoters (9-10) + """ + + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["response_based"] = "response_based" + responseValues: dict[str, float | str] + """ + Only include keys for responses that should branch to a specific question or 'end'. Omit keys for responses that should proceed to the next question (default behavior). + """ + + +class Branching7(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["specific_question"] = "specific_question" + index: float + + +class Questions3(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + question: str + description: str | None = None + descriptionContentType: DescriptionContentType | None = None + optional: bool | None = None + buttonText: str | None = None + type: Literal["rating"] = "rating" + display: Literal["number"] = "number" + """ + NPS questions always use numeric scale + """ + scale: Literal[10] = 10 + """ + NPS questions always use 0-10 scale + """ + lowerBoundLabel: str | None = None + """ + Label for 0 rating (typically 'Not at all likely') + """ + upperBoundLabel: str | None = None + """ + Label for 10 rating (typically 'Extremely likely') + """ + branching: Branching4 | Branching5 | Branching6 | Branching7 | None = None + + +class Choice(RootModel[str]): + root: Annotated[str, Field(min_length=1)] + + +class Branching8(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["next_question"] = "next_question" + + +class Branching9(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["end"] = "end" + + +class Branching10(BaseModel): + """ + For single choice questions: use choice indices as string keys ("0", "1", "2", etc.) + """ + + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["response_based"] = "response_based" + responseValues: dict[str, float | str] + """ + Only include keys for responses that should branch to a specific question or 'end'. Omit keys for responses that should proceed to the next question (default behavior). + """ + + +class Branching11(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["specific_question"] = "specific_question" + index: float + + +class Questions4(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + question: str + description: str | None = None + descriptionContentType: DescriptionContentType | None = None + optional: bool | None = None + buttonText: str | None = None + type: Literal["single_choice"] = "single_choice" + choices: Annotated[list[Choice], Field(max_length=20, min_length=2)] + """ + Array of choice options. Choice indices (0, 1, 2, etc.) are used for branching logic + """ + shuffleOptions: bool | None = None + """ + Whether to randomize the order of choices for each respondent + """ + hasOpenChoice: bool | None = None + """ + Whether the last choice (typically 'Other', is an open text input question + """ + branching: Branching8 | Branching9 | Branching10 | Branching11 | None = None + + +class Questions5(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + question: str + description: str | None = None + descriptionContentType: DescriptionContentType | None = None + optional: bool | None = None + buttonText: str | None = None + type: Literal["multiple_choice"] = "multiple_choice" + choices: Annotated[list[Choice], Field(max_length=20, min_length=2)] + """ + Array of choice options. Multiple selections allowed. No branching logic supported. + """ + shuffleOptions: bool | None = None + """ + Whether to randomize the order of choices for each respondent + """ + hasOpenChoice: bool | None = None + """ + Whether the last choice (typically 'Other', is an open text input question + """ + + +class ThankYouMessageDescriptionContentType(StrEnum): + HTML = "html" + TEXT = "text" + + +class WidgetType(StrEnum): + BUTTON = "button" + TAB = "tab" + SELECTOR = "selector" + + +class Appearance(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + backgroundColor: str | None = None + submitButtonColor: str | None = None + textColor: str | None = None + submitButtonText: str | None = None + submitButtonTextColor: str | None = None + descriptionTextColor: str | None = None + ratingButtonColor: str | None = None + ratingButtonActiveColor: str | None = None + ratingButtonHoverColor: str | None = None + whiteLabel: bool | None = None + autoDisappear: bool | None = None + displayThankYouMessage: bool | None = None + thankYouMessageHeader: str | None = None + thankYouMessageDescription: str | None = None + thankYouMessageDescriptionContentType: ThankYouMessageDescriptionContentType | None = None + thankYouMessageCloseButtonText: str | None = None + borderColor: str | None = None + placeholder: str | None = None + shuffleQuestions: bool | None = None + surveyPopupDelaySeconds: float | None = None + widgetType: WidgetType | None = None + widgetSelector: str | None = None + widgetLabel: str | None = None + widgetColor: str | None = None + fontFamily: str | None = None + maxWidth: str | None = None + zIndex: str | None = None + disabledButtonOpacity: str | None = None + boxPadding: str | None = None + + +class ResponsesLimit(RootModel[float]): + root: Annotated[float, Field(gt=0.0)] + """ + The maximum number of responses before automatically stopping the survey. + """ + + +class IterationCount(RootModel[float]): + root: Annotated[float, Field(gt=0.0)] + """ + For a recurring schedule, this field specifies the number of times the survey should be shown to the user. Use 1 for 'once every X days', higher numbers for multiple repetitions. Works together with iteration_frequency_days to determine the overall survey schedule. + """ + + +class IterationFrequencyDays(RootModel[float]): + root: Annotated[float, Field(gt=0.0, le=365.0)] + """ + For a recurring schedule, this field specifies the interval in days between each survey instance shown to the user, used alongside iteration_count for precise scheduling. + """ + + +class Property2(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + key: str + value: str | float | bool | list[str] | list[float] + operator: Operator | None = None + + +class Group2(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + properties: list[Property2] + rollout_percentage: float + + +class TargetingFlagFilters(BaseModel): + """ + Target specific users based on their properties. Example: {groups: [{properties: [{key: 'email', value: ['@company.com'], operator: 'icontains'}], rollout_percentage: 100}]} + """ + + model_config = ConfigDict( + extra="forbid", + ) + groups: list[Group2] + + +class SurveyCreateSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: Annotated[str, Field(min_length=1)] + description: str | None = None + type: Type11 | None = None + questions: Annotated[ + list[Questions | Questions1 | Questions2 | Questions3 | Questions4 | Questions5], + Field(min_length=1), + ] + appearance: Appearance | None = None + start_date: datetime | None = None + """ + Setting this will launch the survey immediately. Don't add a start_date unless explicitly requested to do so. + """ + responses_limit: ResponsesLimit | None = None + """ + The maximum number of responses before automatically stopping the survey. + """ + iteration_count: IterationCount | None = None + """ + For a recurring schedule, this field specifies the number of times the survey should be shown to the user. Use 1 for 'once every X days', higher numbers for multiple repetitions. Works together with iteration_frequency_days to determine the overall survey schedule. + """ + iteration_frequency_days: IterationFrequencyDays | None = None + """ + For a recurring schedule, this field specifies the interval in days between each survey instance shown to the user, used alongside iteration_count for precise scheduling. + """ + enable_partial_responses: bool | None = None + """ + When at least one question is answered, the response is stored (true). The response is stored when all questions are answered (false). + """ + linked_flag_id: float | None = None + """ + The feature flag linked to this survey + """ + targeting_flag_filters: TargetingFlagFilters | None = None + """ + Target specific users based on their properties. Example: {groups: [{properties: [{key: 'email', value: ['@company.com'], operator: 'icontains'}], rollout_percentage: 100}]} + """ + + +class SurveyDeleteSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + surveyId: str + + +class SurveyGetAllSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + limit: float | None = None + offset: float | None = None + search: str | None = None + + +class SurveyGetSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + surveyId: str + + +class SurveyGlobalStatsSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + date_from: datetime | None = None + """ + Optional ISO timestamp for start date (e.g. 2024-01-01T00:00:00Z) + """ + date_to: datetime | None = None + """ + Optional ISO timestamp for end date (e.g. 2024-01-31T23:59:59Z) + """ + + +class SurveyResponseCountsSchema(BaseModel): + pass + model_config = ConfigDict( + extra="forbid", + ) + + +class SurveyStatsSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + survey_id: str + date_from: datetime | None = None + """ + Optional ISO timestamp for start date (e.g. 2024-01-01T00:00:00Z) + """ + date_to: datetime | None = None + """ + Optional ISO timestamp for end date (e.g. 2024-01-31T23:59:59Z) + """ + + +class Questions6(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + question: str + description: str | None = None + descriptionContentType: DescriptionContentType | None = None + optional: bool | None = None + buttonText: str | None = None + type: Literal["open"] = "open" + + +class Questions7(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + question: str + description: str | None = None + descriptionContentType: DescriptionContentType | None = None + optional: bool | None = None + buttonText: str | None = None + type: Literal["link"] = "link" + link: AnyUrl + + +class Branching12(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["next_question"] = "next_question" + + +class Branching13(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["end"] = "end" + + +class Branching14(BaseModel): + """ + For rating questions: use sentiment keys based on scale thirds - negative (lower third), neutral (middle third), positive (upper third) + """ + + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["response_based"] = "response_based" + responseValues: dict[str, float | str] + """ + Only include keys for responses that should branch to a specific question or 'end'. Omit keys for responses that should proceed to the next question (default behavior). + """ + + +class Branching15(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["specific_question"] = "specific_question" + index: float + + +class Questions8(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + question: str + description: str | None = None + descriptionContentType: DescriptionContentType | None = None + optional: bool | None = None + buttonText: str | None = None + type: Literal["rating"] = "rating" + display: Display1 | None = None + """ + Display format: 'number' shows numeric scale, 'emoji' shows emoji scale + """ + scale: Scale | None = None + """ + Rating scale can be one of 3, 5, or 7 + """ + lowerBoundLabel: str | None = None + """ + Label for the lowest rating (e.g., 'Very Poor') + """ + upperBoundLabel: str | None = None + """ + Label for the highest rating (e.g., 'Excellent') + """ + branching: Branching12 | Branching13 | Branching14 | Branching15 | None = None + + +class Branching16(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["next_question"] = "next_question" + + +class Branching17(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["end"] = "end" + + +class Branching18(BaseModel): + """ + For NPS rating questions: use sentiment keys based on score ranges - detractors (0-6), passives (7-8), promoters (9-10) + """ + + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["response_based"] = "response_based" + responseValues: dict[str, float | str] + """ + Only include keys for responses that should branch to a specific question or 'end'. Omit keys for responses that should proceed to the next question (default behavior). + """ + + +class Branching19(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["specific_question"] = "specific_question" + index: float + + +class Questions9(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + question: str + description: str | None = None + descriptionContentType: DescriptionContentType | None = None + optional: bool | None = None + buttonText: str | None = None + type: Literal["rating"] = "rating" + display: Literal["number"] = "number" + """ + NPS questions always use numeric scale + """ + scale: Literal[10] = 10 + """ + NPS questions always use 0-10 scale + """ + lowerBoundLabel: str | None = None + """ + Label for 0 rating (typically 'Not at all likely') + """ + upperBoundLabel: str | None = None + """ + Label for 10 rating (typically 'Extremely likely') + """ + branching: Branching16 | Branching17 | Branching18 | Branching19 | None = None + + +class Branching20(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["next_question"] = "next_question" + + +class Branching21(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["end"] = "end" + + +class Branching22(BaseModel): + """ + For single choice questions: use choice indices as string keys ("0", "1", "2", etc.) + """ + + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["response_based"] = "response_based" + responseValues: dict[str, float | str] + """ + Only include keys for responses that should branch to a specific question or 'end'. Omit keys for responses that should proceed to the next question (default behavior). + """ + + +class Branching23(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + type: Literal["specific_question"] = "specific_question" + index: float + + +class Questions10(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + question: str + description: str | None = None + descriptionContentType: DescriptionContentType | None = None + optional: bool | None = None + buttonText: str | None = None + type: Literal["single_choice"] = "single_choice" + choices: Annotated[list[Choice], Field(max_length=20, min_length=2)] + """ + Array of choice options. Choice indices (0, 1, 2, etc.) are used for branching logic + """ + shuffleOptions: bool | None = None + """ + Whether to randomize the order of choices for each respondent + """ + hasOpenChoice: bool | None = None + """ + Whether the last choice (typically 'Other', is an open text input question + """ + branching: Branching20 | Branching21 | Branching22 | Branching23 | None = None + + +class Questions11(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + question: str + description: str | None = None + descriptionContentType: DescriptionContentType | None = None + optional: bool | None = None + buttonText: str | None = None + type: Literal["multiple_choice"] = "multiple_choice" + choices: Annotated[list[Choice], Field(max_length=20, min_length=2)] + """ + Array of choice options. Multiple selections allowed. No branching logic supported. + """ + shuffleOptions: bool | None = None + """ + Whether to randomize the order of choices for each respondent + """ + hasOpenChoice: bool | None = None + """ + Whether the last choice (typically 'Other', is an open text input question + """ + + +class UrlMatchType(StrEnum): + """ + URL/device matching types: 'regex' (matches regex pattern), 'not_regex' (does not match regex pattern), 'exact' (exact string match), 'is_not' (not exact match), 'icontains' (case-insensitive contains), 'not_icontains' (case-insensitive does not contain) + """ + + REGEX = "regex" + NOT_REGEX = "not_regex" + EXACT = "exact" + IS_NOT = "is_not" + ICONTAINS = "icontains" + NOT_ICONTAINS = "not_icontains" + + +class Value9(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: str + + +class Events(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + repeatedActivation: bool | None = None + """ + Whether to show the survey every time one of the events is triggered (true), or just once (false) + """ + values: list[Value9] | None = None + """ + Array of event names that trigger the survey + """ + + +class DeviceType(StrEnum): + DESKTOP = "Desktop" + MOBILE = "Mobile" + TABLET = "Tablet" + + +class DeviceTypesMatchType(StrEnum): + """ + URL/device matching types: 'regex' (matches regex pattern), 'not_regex' (does not match regex pattern), 'exact' (exact string match), 'is_not' (not exact match), 'icontains' (case-insensitive contains), 'not_icontains' (case-insensitive does not contain) + """ + + REGEX = "regex" + NOT_REGEX = "not_regex" + EXACT = "exact" + IS_NOT = "is_not" + ICONTAINS = "icontains" + NOT_ICONTAINS = "not_icontains" + + +class Conditions(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + url: str | None = None + selector: str | None = None + seenSurveyWaitPeriodInDays: float | None = None + """ + Don't show this survey to users who saw any survey in the last x days. + """ + urlMatchType: UrlMatchType | None = None + """ + URL/device matching types: 'regex' (matches regex pattern), 'not_regex' (does not match regex pattern), 'exact' (exact string match), 'is_not' (not exact match), 'icontains' (case-insensitive contains), 'not_icontains' (case-insensitive does not contain) + """ + events: Events | None = None + deviceTypes: list[DeviceType] | None = None + deviceTypesMatchType: DeviceTypesMatchType | None = None + """ + URL/device matching types: 'regex' (matches regex pattern), 'not_regex' (does not match regex pattern), 'exact' (exact string match), 'is_not' (not exact match), 'icontains' (case-insensitive contains), 'not_icontains' (case-insensitive does not contain) + """ + linkedFlagVariant: str | None = None + """ + The variant of the feature flag linked to this survey + """ + + +class Appearance1(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + backgroundColor: str | None = None + submitButtonColor: str | None = None + textColor: str | None = None + submitButtonText: str | None = None + submitButtonTextColor: str | None = None + descriptionTextColor: str | None = None + ratingButtonColor: str | None = None + ratingButtonActiveColor: str | None = None + ratingButtonHoverColor: str | None = None + whiteLabel: bool | None = None + autoDisappear: bool | None = None + displayThankYouMessage: bool | None = None + thankYouMessageHeader: str | None = None + thankYouMessageDescription: str | None = None + thankYouMessageDescriptionContentType: ThankYouMessageDescriptionContentType | None = None + thankYouMessageCloseButtonText: str | None = None + borderColor: str | None = None + placeholder: str | None = None + shuffleQuestions: bool | None = None + surveyPopupDelaySeconds: float | None = None + widgetType: WidgetType | None = None + widgetSelector: str | None = None + widgetLabel: str | None = None + widgetColor: str | None = None + fontFamily: str | None = None + maxWidth: str | None = None + zIndex: str | None = None + disabledButtonOpacity: str | None = None + boxPadding: str | None = None + + +class Schedule(StrEnum): + """ + Survey scheduling behavior: 'once' = show once per user (default), 'recurring' = repeat based on iteration_count and iteration_frequency_days settings, 'always' = show every time conditions are met (mainly for widget surveys) + """ + + ONCE = "once" + RECURRING = "recurring" + ALWAYS = "always" + + +class Property3(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + key: str + value: str | float | bool | list[str] | list[float] + operator: Operator | None = None + + +class Group3(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + properties: list[Property3] + rollout_percentage: float + + +class TargetingFlagFilters1(BaseModel): + """ + Target specific users based on their properties. Example: {groups: [{properties: [{key: 'email', value: ['@company.com'], operator: 'icontains'}], rollout_percentage: 50}]} + """ + + model_config = ConfigDict( + extra="forbid", + ) + groups: list[Group3] + + +class SurveyUpdateSchema(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + name: Annotated[str | None, Field(min_length=1)] = None + description: str | None = None + type: Type11 | None = None + questions: Annotated[ + list[Questions6 | Questions7 | Questions8 | Questions9 | Questions10 | Questions11] | None, + Field(min_length=1), + ] = None + conditions: Conditions | None = None + appearance: Appearance1 | None = None + schedule: Schedule | None = None + """ + Survey scheduling behavior: 'once' = show once per user (default), 'recurring' = repeat based on iteration_count and iteration_frequency_days settings, 'always' = show every time conditions are met (mainly for widget surveys) + """ + start_date: datetime | None = None + """ + When the survey should start being shown to users. Setting this will launch the survey + """ + end_date: datetime | None = None + """ + When the survey stopped being shown to users. Setting this will complete the survey. + """ + archived: bool | None = None + responses_limit: ResponsesLimit | None = None + """ + The maximum number of responses before automatically stopping the survey. + """ + iteration_count: IterationCount | None = None + """ + For a recurring schedule, this field specifies the number of times the survey should be shown to the user. Use 1 for 'once every X days', higher numbers for multiple repetitions. Works together with iteration_frequency_days to determine the overall survey schedule. + """ + iteration_frequency_days: IterationFrequencyDays | None = None + """ + For a recurring schedule, this field specifies the interval in days between each survey instance shown to the user, used alongside iteration_count for precise scheduling. + """ + enable_partial_responses: bool | None = None + """ + When at least one question is answered, the response is stored (true). The response is stored when all questions are answered (false). + """ + linked_flag_id: float | None = None + """ + The feature flag to link to this survey + """ + targeting_flag_id: float | None = None + """ + An existing targeting flag to use for this survey + """ + targeting_flag_filters: TargetingFlagFilters1 | None = None + """ + Target specific users based on their properties. Example: {groups: [{properties: [{key: 'email', value: ['@company.com'], operator: 'icontains'}], rollout_percentage: 50}]} + """ + remove_targeting_flag: bool | None = None + """ + Set to true to completely remove all targeting filters from the survey, making it visible to all users (subject to other display conditions like URL matching). + """ + surveyId: str diff --git a/products/mcp/python/scripts/generate-pydantic-models.sh b/products/mcp/python/scripts/generate-pydantic-models.sh new file mode 100755 index 0000000000..085c2b362f --- /dev/null +++ b/products/mcp/python/scripts/generate-pydantic-models.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash + +set -e + +# Get the directory of this script +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" +PYTHON_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +# Input and output paths +INPUT_PATH="$PROJECT_ROOT/schema/tool-inputs.json" +OUTPUT_PATH="$PYTHON_ROOT/schema/tool_inputs.py" + +# Ensure output directory exists +mkdir -p "$(dirname "$OUTPUT_PATH")" + +# Check if input file exists +if [ ! -f "$INPUT_PATH" ]; then + echo "❌ Error: JSON schema not found at $INPUT_PATH" + echo "Please run 'pnpm run schema:build:json' first to generate the JSON schema" + exit 1 +fi + +echo "🔧 Generating Pydantic models from $INPUT_PATH" + +# Ensure uv environment is synced with dev dependencies +echo "🐍 Setting up uv environment..." +cd "$PYTHON_ROOT" +uv sync --dev + +# Generate schema.py from schema.json +uv run datamodel-codegen \ + --class-name='ToolInputs' \ + --collapse-root-models \ + --target-python-version 3.11 \ + --disable-timestamp \ + --use-one-literal-as-default \ + --use-default \ + --use-default-kwarg \ + --use-subclass-enum \ + --input "$INPUT_PATH" \ + --input-file-type jsonschema \ + --output "$OUTPUT_PATH" \ + --output-model-type pydantic_v2.BaseModel \ + --custom-file-header "# mypy: disable-error-code=\"assignment\"" \ + --set-default-enum-member \ + --capitalise-enum-members \ + --wrap-string-literal \ + --use-field-description \ + --use-schema-description \ + --field-constraints \ + --use-annotated + +echo "✅ Generated Pydantic models at $OUTPUT_PATH" + +# Format with ruff +echo "📝 Formatting with ruff..." +uv run ruff format "$OUTPUT_PATH" + +# Check and autofix with ruff +echo "🔍 Checking with ruff..." +uv run ruff check --fix "$OUTPUT_PATH" + +# Replace class Foo(str, Enum) with class Foo(StrEnum) for proper handling in format strings in python 3.11 +# Remove this when https://github.com/koxudaxi/datamodel-code-generator/issues/1313 is resolved +echo "🔄 Updating enum imports for Python 3.11+..." +if sed --version 2>&1 | grep -q GNU; then + # GNU sed + sed -i -e 's/str, Enum/StrEnum/g' "$OUTPUT_PATH" + sed -i 's/from enum import Enum/from enum import Enum, StrEnum/g' "$OUTPUT_PATH" +else + # BSD/macOS sed + sed -i '' -e 's/str, Enum/StrEnum/g' "$OUTPUT_PATH" + sed -i '' 's/from enum import Enum/from enum import Enum, StrEnum/g' "$OUTPUT_PATH" +fi + +echo "🎉 Successfully generated Pydantic models!" +echo "📋 Output file: $OUTPUT_PATH" diff --git a/products/mcp/python/uv.lock b/products/mcp/python/uv.lock new file mode 100644 index 0000000000..9286c185bb --- /dev/null +++ b/products/mcp/python/uv.lock @@ -0,0 +1,1584 @@ +version = 1 +revision = 2 +requires-python = ">=3.11" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" }, +] + +[[package]] +name = "argcomplete" +version = "3.6.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/0f/861e168fc813c56a78b35f3c30d91c6757d1fd185af1110f1aec784b35d0/argcomplete-3.6.2.tar.gz", hash = "sha256:d0519b1bc867f5f4f4713c41ad0aba73a4a5f007449716b16f385f2166dc6adf", size = 73403, upload-time = "2025-04-03T04:57:03.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/da/e42d7a9d8dd33fa775f467e4028a47936da2f01e4b0e561f9ba0d74cb0ca/argcomplete-3.6.2-py3-none-any.whl", hash = "sha256:65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591", size = 43708, upload-time = "2025-04-03T04:57:01.591Z" }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, +] + +[[package]] +name = "backports-tarfile" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406, upload-time = "2024-05-28T17:01:54.731Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, +] + +[[package]] +name = "black" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449, upload-time = "2025-01-29T04:15:40.373Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/4f/87f596aca05c3ce5b94b8663dbfe242a12843caaa82dd3f85f1ffdc3f177/black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", size = 1614372, upload-time = "2025-01-29T05:37:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/e7/d0/2c34c36190b741c59c901e56ab7f6e54dad8df05a6272a9747ecef7c6036/black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", size = 1442865, upload-time = "2025-01-29T05:37:14.309Z" }, + { url = "https://files.pythonhosted.org/packages/21/d4/7518c72262468430ead45cf22bd86c883a6448b9eb43672765d69a8f1248/black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", size = 1749699, upload-time = "2025-01-29T04:18:17.688Z" }, + { url = "https://files.pythonhosted.org/packages/58/db/4f5beb989b547f79096e035c4981ceb36ac2b552d0ac5f2620e941501c99/black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", size = 1428028, upload-time = "2025-01-29T04:18:51.711Z" }, + { url = "https://files.pythonhosted.org/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988, upload-time = "2025-01-29T05:37:16.707Z" }, + { url = "https://files.pythonhosted.org/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985, upload-time = "2025-01-29T05:37:18.273Z" }, + { url = "https://files.pythonhosted.org/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816, upload-time = "2025-01-29T04:18:33.823Z" }, + { url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860, upload-time = "2025-01-29T04:19:12.944Z" }, + { url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673, upload-time = "2025-01-29T05:37:20.574Z" }, + { url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190, upload-time = "2025-01-29T05:37:22.106Z" }, + { url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926, upload-time = "2025-01-29T04:18:58.564Z" }, + { url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613, upload-time = "2025-01-29T04:19:27.63Z" }, + { url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646, upload-time = "2025-01-29T04:15:38.082Z" }, +] + +[[package]] +name = "build" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/1c/23e33405a7c9eac261dff640926b8b5adaed6a6eb3e1767d441ed611d0c0/build-1.3.0.tar.gz", hash = "sha256:698edd0ea270bde950f53aed21f3a0135672206f3911e0176261a31e0e07b397", size = 48544, upload-time = "2025-08-01T21:27:09.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl", hash = "sha256:7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4", size = 23382, upload-time = "2025-08-01T21:27:07.844Z" }, +] + +[[package]] +name = "certifi" +version = "2025.7.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/76/52c535bcebe74590f296d6c77c86dabf761c41980e1347a2422e4aa2ae41/certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995", size = 163981, upload-time = "2025-07-14T03:29:28.449Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/52/34c6cf5bb9285074dc3531c437b3919e825d976fde097a7a73f79e726d03/certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", size = 162722, upload-time = "2025-07-14T03:29:26.863Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/b5/991245018615474a60965a7c9cd2b4efbaabd16d582a5547c47ee1c7730b/charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b", size = 204483, upload-time = "2025-08-09T07:55:53.12Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2a/ae245c41c06299ec18262825c1569c5d3298fc920e4ddf56ab011b417efd/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64", size = 145520, upload-time = "2025-08-09T07:55:54.712Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a4/b3b6c76e7a635748c4421d2b92c7b8f90a432f98bda5082049af37ffc8e3/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91", size = 158876, upload-time = "2025-08-09T07:55:56.024Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e6/63bb0e10f90a8243c5def74b5b105b3bbbfb3e7bb753915fe333fb0c11ea/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f", size = 156083, upload-time = "2025-08-09T07:55:57.582Z" }, + { url = "https://files.pythonhosted.org/packages/87/df/b7737ff046c974b183ea9aa111b74185ac8c3a326c6262d413bd5a1b8c69/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07", size = 150295, upload-time = "2025-08-09T07:55:59.147Z" }, + { url = "https://files.pythonhosted.org/packages/61/f1/190d9977e0084d3f1dc169acd060d479bbbc71b90bf3e7bf7b9927dec3eb/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30", size = 148379, upload-time = "2025-08-09T07:56:00.364Z" }, + { url = "https://files.pythonhosted.org/packages/4c/92/27dbe365d34c68cfe0ca76f1edd70e8705d82b378cb54ebbaeabc2e3029d/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14", size = 160018, upload-time = "2025-08-09T07:56:01.678Z" }, + { url = "https://files.pythonhosted.org/packages/99/04/baae2a1ea1893a01635d475b9261c889a18fd48393634b6270827869fa34/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c", size = 157430, upload-time = "2025-08-09T07:56:02.87Z" }, + { url = "https://files.pythonhosted.org/packages/2f/36/77da9c6a328c54d17b960c89eccacfab8271fdaaa228305330915b88afa9/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae", size = 151600, upload-time = "2025-08-09T07:56:04.089Z" }, + { url = "https://files.pythonhosted.org/packages/64/d4/9eb4ff2c167edbbf08cdd28e19078bf195762e9bd63371689cab5ecd3d0d/charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849", size = 99616, upload-time = "2025-08-09T07:56:05.658Z" }, + { url = "https://files.pythonhosted.org/packages/f4/9c/996a4a028222e7761a96634d1820de8a744ff4327a00ada9c8942033089b/charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c", size = 107108, upload-time = "2025-08-09T07:56:07.176Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5e/14c94999e418d9b87682734589404a25854d5f5d0408df68bc15b6ff54bb/charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", size = 205655, upload-time = "2025-08-09T07:56:08.475Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a8/c6ec5d389672521f644505a257f50544c074cf5fc292d5390331cd6fc9c3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", size = 146223, upload-time = "2025-08-09T07:56:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/fc/eb/a2ffb08547f4e1e5415fb69eb7db25932c52a52bed371429648db4d84fb1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", size = 159366, upload-time = "2025-08-09T07:56:11.326Z" }, + { url = "https://files.pythonhosted.org/packages/82/10/0fd19f20c624b278dddaf83b8464dcddc2456cb4b02bb902a6da126b87a1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", size = 157104, upload-time = "2025-08-09T07:56:13.014Z" }, + { url = "https://files.pythonhosted.org/packages/16/ab/0233c3231af734f5dfcf0844aa9582d5a1466c985bbed6cedab85af9bfe3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", size = 151830, upload-time = "2025-08-09T07:56:14.428Z" }, + { url = "https://files.pythonhosted.org/packages/ae/02/e29e22b4e02839a0e4a06557b1999d0a47db3567e82989b5bb21f3fbbd9f/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", size = 148854, upload-time = "2025-08-09T07:56:16.051Z" }, + { url = "https://files.pythonhosted.org/packages/05/6b/e2539a0a4be302b481e8cafb5af8792da8093b486885a1ae4d15d452bcec/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", size = 160670, upload-time = "2025-08-09T07:56:17.314Z" }, + { url = "https://files.pythonhosted.org/packages/31/e7/883ee5676a2ef217a40ce0bffcc3d0dfbf9e64cbcfbdf822c52981c3304b/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", size = 158501, upload-time = "2025-08-09T07:56:18.641Z" }, + { url = "https://files.pythonhosted.org/packages/c1/35/6525b21aa0db614cf8b5792d232021dca3df7f90a1944db934efa5d20bb1/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", size = 153173, upload-time = "2025-08-09T07:56:20.289Z" }, + { url = "https://files.pythonhosted.org/packages/50/ee/f4704bad8201de513fdc8aac1cabc87e38c5818c93857140e06e772b5892/charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", size = 99822, upload-time = "2025-08-09T07:56:21.551Z" }, + { url = "https://files.pythonhosted.org/packages/39/f5/3b3836ca6064d0992c58c7561c6b6eee1b3892e9665d650c803bd5614522/charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", size = 107543, upload-time = "2025-08-09T07:56:23.115Z" }, + { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload-time = "2025-08-09T07:56:24.721Z" }, + { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload-time = "2025-08-09T07:56:26.004Z" }, + { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload-time = "2025-08-09T07:56:27.25Z" }, + { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload-time = "2025-08-09T07:56:28.515Z" }, + { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload-time = "2025-08-09T07:56:29.716Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload-time = "2025-08-09T07:56:30.984Z" }, + { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload-time = "2025-08-09T07:56:32.252Z" }, + { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload-time = "2025-08-09T07:56:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload-time = "2025-08-09T07:56:34.739Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580, upload-time = "2025-08-09T07:56:35.981Z" }, + { url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366, upload-time = "2025-08-09T07:56:37.339Z" }, + { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" }, + { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" }, + { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" }, + { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload-time = "2025-08-09T07:56:52.722Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload-time = "2025-08-09T07:56:55.172Z" }, + { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, +] + +[[package]] +name = "click" +version = "8.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "cryptography" +version = "45.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/35/c495bffc2056f2dadb32434f1feedd79abde2a7f8363e1974afa9c33c7e2/cryptography-45.0.7.tar.gz", hash = "sha256:4b1654dfc64ea479c242508eb8c724044f1e964a47d1d1cacc5132292d851971", size = 744980, upload-time = "2025-09-01T11:15:03.146Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/63/43641c5acce3a6105cf8bd5baeceeb1846bb63067d26dae3e5db59f1513a/cryptography-45.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:67285f8a611b0ebc0857ced2081e30302909f571a46bfa7a3cc0ad303fe015c6", size = 4205799, upload-time = "2025-09-01T11:14:02.517Z" }, + { url = "https://files.pythonhosted.org/packages/bc/29/c238dd9107f10bfde09a4d1c52fd38828b1aa353ced11f358b5dd2507d24/cryptography-45.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:577470e39e60a6cd7780793202e63536026d9b8641de011ed9d8174da9ca5339", size = 4430504, upload-time = "2025-09-01T11:14:04.522Z" }, + { url = "https://files.pythonhosted.org/packages/62/62/24203e7cbcc9bd7c94739428cd30680b18ae6b18377ae66075c8e4771b1b/cryptography-45.0.7-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4bd3e5c4b9682bc112d634f2c6ccc6736ed3635fc3319ac2bb11d768cc5a00d8", size = 4209542, upload-time = "2025-09-01T11:14:06.309Z" }, + { url = "https://files.pythonhosted.org/packages/cd/e3/e7de4771a08620eef2389b86cd87a2c50326827dea5528feb70595439ce4/cryptography-45.0.7-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:465ccac9d70115cd4de7186e60cfe989de73f7bb23e8a7aa45af18f7412e75bf", size = 3889244, upload-time = "2025-09-01T11:14:08.152Z" }, + { url = "https://files.pythonhosted.org/packages/96/b8/bca71059e79a0bb2f8e4ec61d9c205fbe97876318566cde3b5092529faa9/cryptography-45.0.7-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:16ede8a4f7929b4b7ff3642eba2bf79aa1d71f24ab6ee443935c0d269b6bc513", size = 4461975, upload-time = "2025-09-01T11:14:09.755Z" }, + { url = "https://files.pythonhosted.org/packages/58/67/3f5b26937fe1218c40e95ef4ff8d23c8dc05aa950d54200cc7ea5fb58d28/cryptography-45.0.7-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8978132287a9d3ad6b54fcd1e08548033cc09dc6aacacb6c004c73c3eb5d3ac3", size = 4209082, upload-time = "2025-09-01T11:14:11.229Z" }, + { url = "https://files.pythonhosted.org/packages/0e/e4/b3e68a4ac363406a56cf7b741eeb80d05284d8c60ee1a55cdc7587e2a553/cryptography-45.0.7-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b6a0e535baec27b528cb07a119f321ac024592388c5681a5ced167ae98e9fff3", size = 4460397, upload-time = "2025-09-01T11:14:12.924Z" }, + { url = "https://files.pythonhosted.org/packages/22/49/2c93f3cd4e3efc8cb22b02678c1fad691cff9dd71bb889e030d100acbfe0/cryptography-45.0.7-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a24ee598d10befaec178efdff6054bc4d7e883f615bfbcd08126a0f4931c83a6", size = 4337244, upload-time = "2025-09-01T11:14:14.431Z" }, + { url = "https://files.pythonhosted.org/packages/04/19/030f400de0bccccc09aa262706d90f2ec23d56bc4eb4f4e8268d0ddf3fb8/cryptography-45.0.7-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:fa26fa54c0a9384c27fcdc905a2fb7d60ac6e47d14bc2692145f2b3b1e2cfdbd", size = 4568862, upload-time = "2025-09-01T11:14:16.185Z" }, + { url = "https://files.pythonhosted.org/packages/bc/4c/8f57f2500d0ccd2675c5d0cc462095adf3faa8c52294ba085c036befb901/cryptography-45.0.7-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:81823935e2f8d476707e85a78a405953a03ef7b7b4f55f93f7c2d9680e5e0691", size = 4202233, upload-time = "2025-09-01T11:14:22.454Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ac/59b7790b4ccaed739fc44775ce4645c9b8ce54cbec53edf16c74fd80cb2b/cryptography-45.0.7-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3994c809c17fc570c2af12c9b840d7cea85a9fd3e5c0e0491f4fa3c029216d59", size = 4423075, upload-time = "2025-09-01T11:14:24.287Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/d4f07ea21434bf891faa088a6ac15d6d98093a66e75e30ad08e88aa2b9ba/cryptography-45.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dad43797959a74103cb59c5dac71409f9c27d34c8a05921341fb64ea8ccb1dd4", size = 4204517, upload-time = "2025-09-01T11:14:25.679Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ac/924a723299848b4c741c1059752c7cfe09473b6fd77d2920398fc26bfb53/cryptography-45.0.7-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ce7a453385e4c4693985b4a4a3533e041558851eae061a58a5405363b098fcd3", size = 3882893, upload-time = "2025-09-01T11:14:27.1Z" }, + { url = "https://files.pythonhosted.org/packages/83/dc/4dab2ff0a871cc2d81d3ae6d780991c0192b259c35e4d83fe1de18b20c70/cryptography-45.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b04f85ac3a90c227b6e5890acb0edbaf3140938dbecf07bff618bf3638578cf1", size = 4450132, upload-time = "2025-09-01T11:14:28.58Z" }, + { url = "https://files.pythonhosted.org/packages/12/dd/b2882b65db8fc944585d7fb00d67cf84a9cef4e77d9ba8f69082e911d0de/cryptography-45.0.7-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:48c41a44ef8b8c2e80ca4527ee81daa4c527df3ecbc9423c41a420a9559d0e27", size = 4204086, upload-time = "2025-09-01T11:14:30.572Z" }, + { url = "https://files.pythonhosted.org/packages/5d/fa/1d5745d878048699b8eb87c984d4ccc5da4f5008dfd3ad7a94040caca23a/cryptography-45.0.7-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f3df7b3d0f91b88b2106031fd995802a2e9ae13e02c36c1fc075b43f420f3a17", size = 4449383, upload-time = "2025-09-01T11:14:32.046Z" }, + { url = "https://files.pythonhosted.org/packages/36/8b/fc61f87931bc030598e1876c45b936867bb72777eac693e905ab89832670/cryptography-45.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dd342f085542f6eb894ca00ef70236ea46070c8a13824c6bde0dfdcd36065b9b", size = 4332186, upload-time = "2025-09-01T11:14:33.95Z" }, + { url = "https://files.pythonhosted.org/packages/0b/11/09700ddad7443ccb11d674efdbe9a832b4455dc1f16566d9bd3834922ce5/cryptography-45.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1993a1bb7e4eccfb922b6cd414f072e08ff5816702a0bdb8941c247a6b1b287c", size = 4561639, upload-time = "2025-09-01T11:14:35.343Z" }, + { url = "https://files.pythonhosted.org/packages/16/ce/5f6ff59ea9c7779dba51b84871c19962529bdcc12e1a6ea172664916c550/cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:06ce84dc14df0bf6ea84666f958e6080cdb6fe1231be2a51f3fc1267d9f3fb34", size = 4149533, upload-time = "2025-09-01T11:14:52.091Z" }, + { url = "https://files.pythonhosted.org/packages/ce/13/b3cfbd257ac96da4b88b46372e662009b7a16833bfc5da33bb97dd5631ae/cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d0c5c6bac22b177bf8da7435d9d27a6834ee130309749d162b26c3105c0795a9", size = 4385557, upload-time = "2025-09-01T11:14:53.551Z" }, + { url = "https://files.pythonhosted.org/packages/1c/c5/8c59d6b7c7b439ba4fc8d0cab868027fd095f215031bc123c3a070962912/cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:2f641b64acc00811da98df63df7d59fd4706c0df449da71cb7ac39a0732b40ae", size = 4149023, upload-time = "2025-09-01T11:14:55.022Z" }, + { url = "https://files.pythonhosted.org/packages/55/32/05385c86d6ca9ab0b4d5bb442d2e3d85e727939a11f3e163fc776ce5eb40/cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:f5414a788ecc6ee6bc58560e85ca624258a55ca434884445440a810796ea0e0b", size = 4385722, upload-time = "2025-09-01T11:14:57.319Z" }, +] + +[[package]] +name = "datamodel-code-generator" +version = "0.31.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argcomplete" }, + { name = "black" }, + { name = "genson" }, + { name = "inflect" }, + { name = "isort" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "tomli", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/40/26399980314bedb3a8ec6a31da646d190cd945192410ad3ab6eabe0a1c73/datamodel_code_generator-0.31.2.tar.gz", hash = "sha256:47887b8aa6fd69865e07e2893c1e76e34dae753b9a97f1020357af8337bc4cdb", size = 453381, upload-time = "2025-06-22T17:40:56.491Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/82/9bda726b117967b8056315e51125633ec7a0d2f862c202aed01c3fde2e9f/datamodel_code_generator-0.31.2-py3-none-any.whl", hash = "sha256:78f200a9e673ee4d041e96e82a835273baf4ce15e446d46501c0433d82af3ef5", size = 119369, upload-time = "2025-06-22T17:40:54.615Z" }, +] + +[package.optional-dependencies] +http = [ + { name = "httpx" }, +] + +[[package]] +name = "docutils" +version = "0.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/86/5b41c32ecedcfdb4c77b28b6cb14234f252075f8cdb254531727a35547dd/docutils-0.22.tar.gz", hash = "sha256:ba9d57750e92331ebe7c08a1bbf7a7f8143b86c476acd51528b042216a6aad0f", size = 2277984, upload-time = "2025-07-29T15:20:31.06Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/57/8db39bc5f98f042e0153b1de9fb88e1a409a33cda4dd7f723c2ed71e01f6/docutils-0.22-py3-none-any.whl", hash = "sha256:4ed966a0e96a0477d852f7af31bdcb3adc049fbb35ccba358c2ea8a03287615e", size = 630709, upload-time = "2025-07-29T15:20:28.335Z" }, +] + +[[package]] +name = "genson" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/cf/2303c8ad276dcf5ee2ad6cf69c4338fd86ef0f471a5207b069adf7a393cf/genson-1.3.0.tar.gz", hash = "sha256:e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37", size = 34919, upload-time = "2024-05-15T22:08:49.123Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/5c/e226de133afd8bb267ec27eead9ae3d784b95b39a287ed404caab39a5f50/genson-1.3.0-py3-none-any.whl", hash = "sha256:468feccd00274cc7e4c09e84b08704270ba8d95232aa280f65b986139cec67f7", size = 21470, upload-time = "2024-05-15T22:08:47.056Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "httpx-sse" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fa/66bd985dd0b7c109a3bcb89272ee0bfb7e2b4d06309ad7b38ff866734b2a/httpx_sse-0.4.1.tar.gz", hash = "sha256:8f44d34414bc7b21bf3602713005c5df4917884f76072479b21f68befa4ea26e", size = 12998, upload-time = "2025-06-24T13:21:05.71Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/0a/6269e3473b09aed2dab8aa1a600c70f31f00ae1349bee30658f7e358a159/httpx_sse-0.4.1-py3-none-any.whl", hash = "sha256:cba42174344c3a5b06f255ce65b350880f962d99ead85e776f23c6618a377a37", size = 8054, upload-time = "2025-06-24T13:21:04.772Z" }, +] + +[[package]] +name = "id" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/11/102da08f88412d875fa2f1a9a469ff7ad4c874b0ca6fed0048fe385bdb3d/id-1.5.0.tar.gz", hash = "sha256:292cb8a49eacbbdbce97244f47a97b4c62540169c976552e497fd57df0734c1d", size = 15237, upload-time = "2024-12-04T19:53:05.575Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/cb/18326d2d89ad3b0dd143da971e77afd1e6ca6674f1b1c3df4b6bec6279fc/id-1.5.0-py3-none-any.whl", hash = "sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658", size = 13611, upload-time = "2024-12-04T19:53:03.02Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, +] + +[[package]] +name = "inflect" +version = "7.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, + { name = "typeguard" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/c6/943357d44a21fd995723d07ccaddd78023eace03c1846049a2645d4324a3/inflect-7.5.0.tar.gz", hash = "sha256:faf19801c3742ed5a05a8ce388e0d8fe1a07f8d095c82201eb904f5d27ad571f", size = 73751, upload-time = "2024-12-28T17:11:18.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/eb/427ed2b20a38a4ee29f24dbe4ae2dafab198674fe9a85e3d6adf9e5f5f41/inflect-7.5.0-py3-none-any.whl", hash = "sha256:2aea70e5e70c35d8350b8097396ec155ffd68def678c7ff97f51aa69c1d92344", size = 35197, upload-time = "2024-12-28T17:11:15.931Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "isort" +version = "6.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b8/21/1e2a441f74a653a144224d7d21afe8f4169e6c7c20bb13aec3a2dc3815e0/isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450", size = 821955, upload-time = "2025-02-26T21:13:16.955Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/11/114d0a5f4dabbdcedc1125dee0888514c3c3b16d3e9facad87ed96fad97c/isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615", size = 94186, upload-time = "2025-02-26T21:13:14.911Z" }, +] + +[[package]] +name = "jaraco-classes" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777, upload-time = "2024-03-31T07:27:34.792Z" }, +] + +[[package]] +name = "jaraco-context" +version = "6.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "backports-tarfile", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", size = 13912, upload-time = "2024-08-20T03:39:27.358Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", size = 6825, upload-time = "2024-08-20T03:39:25.966Z" }, +] + +[[package]] +name = "jaraco-functools" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f7/ed/1aa2d585304ec07262e1a83a9889880701079dde796ac7b1d1826f40c63d/jaraco_functools-4.3.0.tar.gz", hash = "sha256:cfd13ad0dd2c47a3600b439ef72d8615d482cedcff1632930d6f28924d92f294", size = 19755, upload-time = "2025-08-18T20:05:09.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/09/726f168acad366b11e420df31bf1c702a54d373a83f968d94141a8c3fde0/jaraco_functools-4.3.0-py3-none-any.whl", hash = "sha256:227ff8ed6f7b8f62c56deff101545fa7543cf2c8e7b82a7c2116e672f29c26e8", size = 10408, upload-time = "2025-08-18T20:05:08.69Z" }, +] + +[[package]] +name = "jeepney" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpointer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699, upload-time = "2023-06-26T12:07:29.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898, upload-time = "2023-06-16T21:01:28.466Z" }, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114, upload-time = "2024-06-10T19:24:42.462Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.25.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513, upload-time = "2025-04-23T12:34:07.418Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload-time = "2025-04-23T12:34:05.422Z" }, +] + +[[package]] +name = "keyring" +version = "25.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.12'" }, + { name = "jaraco-classes" }, + { name = "jaraco-context" }, + { name = "jaraco-functools" }, + { name = "jeepney", marker = "sys_platform == 'linux'" }, + { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, + { name = "secretstorage", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/09/d904a6e96f76ff214be59e7aa6ef7190008f52a0ab6689760a98de0bf37d/keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66", size = 62750, upload-time = "2024-12-25T15:26:45.782Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/32/da7f44bcb1105d3e88a0b74ebdca50c59121d2ddf71c9e34ba47df7f3a56/keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd", size = 39085, upload-time = "2024-12-25T15:26:44.377Z" }, +] + +[[package]] +name = "langchain-core" +version = "0.3.75" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpatch" }, + { name = "langsmith" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "tenacity" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/63/270b71a23e849984505ddc7c5c9fd3f4bd9cb14b1a484ee44c4e51c33cc2/langchain_core-0.3.75.tar.gz", hash = "sha256:ab0eb95a06ed6043f76162e6086b45037690cb70b7f090bd83b5ebb8a05b70ed", size = 570876, upload-time = "2025-08-26T15:24:12.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/42/0d0221cce6f168f644d7d96cb6c87c4e42fc55d2941da7a36e970e3ab8ab/langchain_core-0.3.75-py3-none-any.whl", hash = "sha256:03ca1fadf955ee3c7d5806a841f4b3a37b816acea5e61a7e6ba1298c05eea7f5", size = 443986, upload-time = "2025-08-26T15:24:10.883Z" }, +] + +[[package]] +name = "langchain-mcp-adapters" +version = "0.1.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "mcp" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/74/e36003a43136f9095a5f968c730fbfe894f94284ebe6d2b50bb17d41b8b5/langchain_mcp_adapters-0.1.9.tar.gz", hash = "sha256:0018cf7b5f7bc4c044e05ec20fcb9ebe345311c8d1060c61d411188001ab3aab", size = 22101, upload-time = "2025-07-09T15:56:14.455Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/eb/9e98822d3db22beff44449a8f61fca208d4f59d592a7ce67ce4c400b8f8f/langchain_mcp_adapters-0.1.9-py3-none-any.whl", hash = "sha256:fd131009c60c9e5a864f96576bbe757fc1809abd604891cb2e5d6e8aebd6975c", size = 15300, upload-time = "2025-07-09T15:56:13.316Z" }, +] + +[[package]] +name = "langsmith" +version = "0.4.21" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "requests-toolbelt" }, + { name = "zstandard" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/ad/2c89c128b575d89ba7c7af05de6d715703fe9648110f2ec3c90255956681/langsmith-0.4.21.tar.gz", hash = "sha256:eabfb66970d50964918acba524b407e8cfe585448013e3135ca92388c858d009", size = 938666, upload-time = "2025-08-29T21:46:27.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/79/5ccad558563861f7ae6a77aeba259578c35192e9c109b0142fcf490b3c50/langsmith-0.4.21-py3-none-any.whl", hash = "sha256:15b189e2e7a3337a07cf250d91e158efcd0b39458735dc9e583c56dd0f21e4e0", size = 378494, upload-time = "2025-08-29T21:46:24.714Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload-time = "2024-10-18T15:21:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload-time = "2024-10-18T15:21:02.941Z" }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload-time = "2024-10-18T15:21:03.953Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload-time = "2024-10-18T15:21:06.495Z" }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload-time = "2024-10-18T15:21:07.295Z" }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload-time = "2024-10-18T15:21:08.073Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload-time = "2024-10-18T15:21:09.318Z" }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload-time = "2024-10-18T15:21:10.185Z" }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload-time = "2024-10-18T15:21:11.005Z" }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload-time = "2024-10-18T15:21:12.911Z" }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload-time = "2024-10-18T15:21:13.777Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload-time = "2024-10-18T15:21:14.822Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload-time = "2024-10-18T15:21:15.642Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload-time = "2024-10-18T15:21:17.133Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload-time = "2024-10-18T15:21:18.064Z" }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload-time = "2024-10-18T15:21:18.859Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload-time = "2024-10-18T15:21:19.671Z" }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload-time = "2024-10-18T15:21:20.971Z" }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload-time = "2024-10-18T15:21:22.646Z" }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload-time = "2024-10-18T15:21:23.499Z" }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, +] + +[[package]] +name = "mcp" +version = "1.13.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "httpx" }, + { name = "httpx-sse" }, + { name = "jsonschema" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "python-multipart" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "sse-starlette" }, + { name = "starlette" }, + { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/3c/82c400c2d50afdac4fbefb5b4031fd327e2ad1f23ccef8eee13c5909aa48/mcp-1.13.1.tar.gz", hash = "sha256:165306a8fd7991dc80334edd2de07798175a56461043b7ae907b279794a834c5", size = 438198, upload-time = "2025-08-22T09:22:16.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/3f/d085c7f49ade6d273b185d61ec9405e672b6433f710ea64a90135a8dd445/mcp-1.13.1-py3-none-any.whl", hash = "sha256:c314e7c8bd477a23ba3ef472ee5a32880316c42d03e06dcfa31a1cc7a73b65df", size = 161494, upload-time = "2025-08-22T09:22:14.705Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "more-itertools" +version = "10.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/a0/834b0cebabbfc7e311f30b46c8188790a37f89fc8d756660346fe5abfd09/more_itertools-10.7.0.tar.gz", hash = "sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3", size = 127671, upload-time = "2025-04-22T14:17:41.838Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/9f/7ba6f94fc1e9ac3d2b853fdff3035fb2fa5afbed898c4a72b8a020610594/more_itertools-10.7.0-py3-none-any.whl", hash = "sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e", size = 65278, upload-time = "2025-04-22T14:17:40.49Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "nh3" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/a4/96cff0977357f60f06ec4368c4c7a7a26cccfe7c9fcd54f5378bf0428fd3/nh3-0.3.0.tar.gz", hash = "sha256:d8ba24cb31525492ea71b6aac11a4adac91d828aadeff7c4586541bf5dc34d2f", size = 19655, upload-time = "2025-07-17T14:43:37.05Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/11/340b7a551916a4b2b68c54799d710f86cf3838a4abaad8e74d35360343bb/nh3-0.3.0-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:a537ece1bf513e5a88d8cff8a872e12fe8d0f42ef71dd15a5e7520fecd191bbb", size = 1427992, upload-time = "2025-07-17T14:43:06.848Z" }, + { url = "https://files.pythonhosted.org/packages/ad/7f/7c6b8358cf1222921747844ab0eef81129e9970b952fcb814df417159fb9/nh3-0.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c915060a2c8131bef6a29f78debc29ba40859b6dbe2362ef9e5fd44f11487c2", size = 798194, upload-time = "2025-07-17T14:43:08.263Z" }, + { url = "https://files.pythonhosted.org/packages/63/da/c5fd472b700ba37d2df630a9e0d8cc156033551ceb8b4c49cc8a5f606b68/nh3-0.3.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba0caa8aa184196daa6e574d997a33867d6d10234018012d35f86d46024a2a95", size = 837884, upload-time = "2025-07-17T14:43:09.233Z" }, + { url = "https://files.pythonhosted.org/packages/4c/3c/cba7b26ccc0ef150c81646478aa32f9c9535234f54845603c838a1dc955c/nh3-0.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:80fe20171c6da69c7978ecba33b638e951b85fb92059259edd285ff108b82a6d", size = 996365, upload-time = "2025-07-17T14:43:10.243Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ba/59e204d90727c25b253856e456ea61265ca810cda8ee802c35f3fadaab00/nh3-0.3.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e90883f9f85288f423c77b3f5a6f4486375636f25f793165112679a7b6363b35", size = 1071042, upload-time = "2025-07-17T14:43:11.57Z" }, + { url = "https://files.pythonhosted.org/packages/10/71/2fb1834c10fab6d9291d62c95192ea2f4c7518bd32ad6c46aab5d095cb87/nh3-0.3.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0649464ac8eee018644aacbc103874ccbfac80e3035643c3acaab4287e36e7f5", size = 995737, upload-time = "2025-07-17T14:43:12.659Z" }, + { url = "https://files.pythonhosted.org/packages/33/c1/8f8ccc2492a000b6156dce68a43253fcff8b4ce70ab4216d08f90a2ac998/nh3-0.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1adeb1062a1c2974bc75b8d1ecb014c5fd4daf2df646bbe2831f7c23659793f9", size = 980552, upload-time = "2025-07-17T14:43:13.763Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d6/f1c6e091cbe8700401c736c2bc3980c46dca770a2cf6a3b48a175114058e/nh3-0.3.0-cp313-cp313t-win32.whl", hash = "sha256:7275fdffaab10cc5801bf026e3c089d8de40a997afc9e41b981f7ac48c5aa7d5", size = 593618, upload-time = "2025-07-17T14:43:15.098Z" }, + { url = "https://files.pythonhosted.org/packages/23/1e/80a8c517655dd40bb13363fc4d9e66b2f13245763faab1a20f1df67165a7/nh3-0.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:423201bbdf3164a9e09aa01e540adbb94c9962cc177d5b1cbb385f5e1e79216e", size = 598948, upload-time = "2025-07-17T14:43:16.064Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e0/af86d2a974c87a4ba7f19bc3b44a8eaa3da480de264138fec82fe17b340b/nh3-0.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:16f8670201f7e8e0e05ed1a590eb84bfa51b01a69dd5caf1d3ea57733de6a52f", size = 580479, upload-time = "2025-07-17T14:43:17.038Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e0/cf1543e798ba86d838952e8be4cb8d18e22999be2a24b112a671f1c04fd6/nh3-0.3.0-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:ec6cfdd2e0399cb79ba4dcffb2332b94d9696c52272ff9d48a630c5dca5e325a", size = 1442218, upload-time = "2025-07-17T14:43:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/5c/86/a96b1453c107b815f9ab8fac5412407c33cc5c7580a4daf57aabeb41b774/nh3-0.3.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5e7185599f89b0e391e2f29cc12dc2e206167380cea49b33beda4891be2fe1", size = 823791, upload-time = "2025-07-17T14:43:19.721Z" }, + { url = "https://files.pythonhosted.org/packages/97/33/11e7273b663839626f714cb68f6eb49899da5a0d9b6bc47b41fe870259c2/nh3-0.3.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:389d93d59b8214d51c400fb5b07866c2a4f79e4e14b071ad66c92184fec3a392", size = 811143, upload-time = "2025-07-17T14:43:20.779Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1b/b15bd1ce201a1a610aeb44afd478d55ac018b4475920a3118ffd806e2483/nh3-0.3.0-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:e9e6a7e4d38f7e8dda9edd1433af5170c597336c1a74b4693c5cb75ab2b30f2a", size = 1064661, upload-time = "2025-07-17T14:43:21.839Z" }, + { url = "https://files.pythonhosted.org/packages/8f/14/079670fb2e848c4ba2476c5a7a2d1319826053f4f0368f61fca9bb4227ae/nh3-0.3.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7852f038a054e0096dac12b8141191e02e93e0b4608c4b993ec7d4ffafea4e49", size = 997061, upload-time = "2025-07-17T14:43:23.179Z" }, + { url = "https://files.pythonhosted.org/packages/a3/e5/ac7fc565f5d8bce7f979d1afd68e8cb415020d62fa6507133281c7d49f91/nh3-0.3.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af5aa8127f62bbf03d68f67a956627b1bd0469703a35b3dad28d0c1195e6c7fb", size = 924761, upload-time = "2025-07-17T14:43:24.23Z" }, + { url = "https://files.pythonhosted.org/packages/39/2c/6394301428b2017a9d5644af25f487fa557d06bc8a491769accec7524d9a/nh3-0.3.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f416c35efee3e6a6c9ab7716d9e57aa0a49981be915963a82697952cba1353e1", size = 803959, upload-time = "2025-07-17T14:43:26.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/9a/344b9f9c4bd1c2413a397f38ee6a3d5db30f1a507d4976e046226f12b297/nh3-0.3.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:37d3003d98dedca6cd762bf88f2e70b67f05100f6b949ffe540e189cc06887f9", size = 844073, upload-time = "2025-07-17T14:43:27.375Z" }, + { url = "https://files.pythonhosted.org/packages/66/3f/cd37f76c8ca277b02a84aa20d7bd60fbac85b4e2cbdae77cb759b22de58b/nh3-0.3.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:634e34e6162e0408e14fb61d5e69dbaea32f59e847cfcfa41b66100a6b796f62", size = 1000680, upload-time = "2025-07-17T14:43:28.452Z" }, + { url = "https://files.pythonhosted.org/packages/ee/db/7aa11b44bae4e7474feb1201d8dee04fabe5651c7cb51409ebda94a4ed67/nh3-0.3.0-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:b0612ccf5de8a480cf08f047b08f9d3fecc12e63d2ee91769cb19d7290614c23", size = 1076613, upload-time = "2025-07-17T14:43:30.031Z" }, + { url = "https://files.pythonhosted.org/packages/97/03/03f79f7e5178eb1ad5083af84faff471e866801beb980cc72943a4397368/nh3-0.3.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c7a32a7f0d89f7d30cb8f4a84bdbd56d1eb88b78a2434534f62c71dac538c450", size = 1001418, upload-time = "2025-07-17T14:43:31.429Z" }, + { url = "https://files.pythonhosted.org/packages/ce/55/1974bcc16884a397ee699cebd3914e1f59be64ab305533347ca2d983756f/nh3-0.3.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3f1b4f8a264a0c86ea01da0d0c390fe295ea0bcacc52c2103aca286f6884f518", size = 986499, upload-time = "2025-07-17T14:43:32.459Z" }, + { url = "https://files.pythonhosted.org/packages/c9/50/76936ec021fe1f3270c03278b8af5f2079038116b5d0bfe8538ffe699d69/nh3-0.3.0-cp38-abi3-win32.whl", hash = "sha256:6d68fa277b4a3cf04e5c4b84dd0c6149ff7d56c12b3e3fab304c525b850f613d", size = 599000, upload-time = "2025-07-17T14:43:33.852Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ae/324b165d904dc1672eee5f5661c0a68d4bab5b59fbb07afb6d8d19a30b45/nh3-0.3.0-cp38-abi3-win_amd64.whl", hash = "sha256:bae63772408fd63ad836ec569a7c8f444dd32863d0c67f6e0b25ebbd606afa95", size = 604530, upload-time = "2025-07-17T14:43:34.95Z" }, + { url = "https://files.pythonhosted.org/packages/5b/76/3165e84e5266d146d967a6cc784ff2fbf6ddd00985a55ec006b72bc39d5d/nh3-0.3.0-cp38-abi3-win_arm64.whl", hash = "sha256:d97d3efd61404af7e5721a0e74d81cdbfc6e5f97e11e731bb6d090e30a7b62b2", size = 585971, upload-time = "2025-07-17T14:43:35.936Z" }, +] + +[[package]] +name = "orjson" +version = "3.11.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/4d/8df5f83256a809c22c4d6792ce8d43bb503be0fb7a8e4da9025754b09658/orjson-3.11.3.tar.gz", hash = "sha256:1c0603b1d2ffcd43a411d64797a19556ef76958aef1c182f22dc30860152a98a", size = 5482394, upload-time = "2025-08-26T17:46:43.171Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/8b/360674cd817faef32e49276187922a946468579fcaf37afdfb6c07046e92/orjson-3.11.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9d2ae0cc6aeb669633e0124531f342a17d8e97ea999e42f12a5ad4adaa304c5f", size = 238238, upload-time = "2025-08-26T17:44:54.214Z" }, + { url = "https://files.pythonhosted.org/packages/05/3d/5fa9ea4b34c1a13be7d9046ba98d06e6feb1d8853718992954ab59d16625/orjson-3.11.3-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:ba21dbb2493e9c653eaffdc38819b004b7b1b246fb77bfc93dc016fe664eac91", size = 127713, upload-time = "2025-08-26T17:44:55.596Z" }, + { url = "https://files.pythonhosted.org/packages/e5/5f/e18367823925e00b1feec867ff5f040055892fc474bf5f7875649ecfa586/orjson-3.11.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00f1a271e56d511d1569937c0447d7dce5a99a33ea0dec76673706360a051904", size = 123241, upload-time = "2025-08-26T17:44:57.185Z" }, + { url = "https://files.pythonhosted.org/packages/0f/bd/3c66b91c4564759cf9f473251ac1650e446c7ba92a7c0f9f56ed54f9f0e6/orjson-3.11.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b67e71e47caa6680d1b6f075a396d04fa6ca8ca09aafb428731da9b3ea32a5a6", size = 127895, upload-time = "2025-08-26T17:44:58.349Z" }, + { url = "https://files.pythonhosted.org/packages/82/b5/dc8dcd609db4766e2967a85f63296c59d4722b39503e5b0bf7fd340d387f/orjson-3.11.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7d012ebddffcce8c85734a6d9e5f08180cd3857c5f5a3ac70185b43775d043d", size = 130303, upload-time = "2025-08-26T17:44:59.491Z" }, + { url = "https://files.pythonhosted.org/packages/48/c2/d58ec5fd1270b2aa44c862171891adc2e1241bd7dab26c8f46eb97c6c6f1/orjson-3.11.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd759f75d6b8d1b62012b7f5ef9461d03c804f94d539a5515b454ba3a6588038", size = 132366, upload-time = "2025-08-26T17:45:00.654Z" }, + { url = "https://files.pythonhosted.org/packages/73/87/0ef7e22eb8dd1ef940bfe3b9e441db519e692d62ed1aae365406a16d23d0/orjson-3.11.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6890ace0809627b0dff19cfad92d69d0fa3f089d3e359a2a532507bb6ba34efb", size = 135180, upload-time = "2025-08-26T17:45:02.424Z" }, + { url = "https://files.pythonhosted.org/packages/bb/6a/e5bf7b70883f374710ad74faf99bacfc4b5b5a7797c1d5e130350e0e28a3/orjson-3.11.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d4a5e041ae435b815e568537755773d05dac031fee6a57b4ba70897a44d9d2", size = 132741, upload-time = "2025-08-26T17:45:03.663Z" }, + { url = "https://files.pythonhosted.org/packages/bd/0c/4577fd860b6386ffaa56440e792af01c7882b56d2766f55384b5b0e9d39b/orjson-3.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d68bf97a771836687107abfca089743885fb664b90138d8761cce61d5625d55", size = 131104, upload-time = "2025-08-26T17:45:04.939Z" }, + { url = "https://files.pythonhosted.org/packages/66/4b/83e92b2d67e86d1c33f2ea9411742a714a26de63641b082bdbf3d8e481af/orjson-3.11.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bfc27516ec46f4520b18ef645864cee168d2a027dbf32c5537cb1f3e3c22dac1", size = 403887, upload-time = "2025-08-26T17:45:06.228Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e5/9eea6a14e9b5ceb4a271a1fd2e1dec5f2f686755c0fab6673dc6ff3433f4/orjson-3.11.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f66b001332a017d7945e177e282a40b6997056394e3ed7ddb41fb1813b83e824", size = 145855, upload-time = "2025-08-26T17:45:08.338Z" }, + { url = "https://files.pythonhosted.org/packages/45/78/8d4f5ad0c80ba9bf8ac4d0fc71f93a7d0dc0844989e645e2074af376c307/orjson-3.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:212e67806525d2561efbfe9e799633b17eb668b8964abed6b5319b2f1cfbae1f", size = 135361, upload-time = "2025-08-26T17:45:09.625Z" }, + { url = "https://files.pythonhosted.org/packages/0b/5f/16386970370178d7a9b438517ea3d704efcf163d286422bae3b37b88dbb5/orjson-3.11.3-cp311-cp311-win32.whl", hash = "sha256:6e8e0c3b85575a32f2ffa59de455f85ce002b8bdc0662d6b9c2ed6d80ab5d204", size = 136190, upload-time = "2025-08-26T17:45:10.962Z" }, + { url = "https://files.pythonhosted.org/packages/09/60/db16c6f7a41dd8ac9fb651f66701ff2aeb499ad9ebc15853a26c7c152448/orjson-3.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:6be2f1b5d3dc99a5ce5ce162fc741c22ba9f3443d3dd586e6a1211b7bc87bc7b", size = 131389, upload-time = "2025-08-26T17:45:12.285Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2a/bb811ad336667041dea9b8565c7c9faf2f59b47eb5ab680315eea612ef2e/orjson-3.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:fafb1a99d740523d964b15c8db4eabbfc86ff29f84898262bf6e3e4c9e97e43e", size = 126120, upload-time = "2025-08-26T17:45:13.515Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b0/a7edab2a00cdcb2688e1c943401cb3236323e7bfd2839815c6131a3742f4/orjson-3.11.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8c752089db84333e36d754c4baf19c0e1437012242048439c7e80eb0e6426e3b", size = 238259, upload-time = "2025-08-26T17:45:15.093Z" }, + { url = "https://files.pythonhosted.org/packages/e1/c6/ff4865a9cc398a07a83342713b5932e4dc3cb4bf4bc04e8f83dedfc0d736/orjson-3.11.3-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:9b8761b6cf04a856eb544acdd82fc594b978f12ac3602d6374a7edb9d86fd2c2", size = 127633, upload-time = "2025-08-26T17:45:16.417Z" }, + { url = "https://files.pythonhosted.org/packages/6e/e6/e00bea2d9472f44fe8794f523e548ce0ad51eb9693cf538a753a27b8bda4/orjson-3.11.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b13974dc8ac6ba22feaa867fc19135a3e01a134b4f7c9c28162fed4d615008a", size = 123061, upload-time = "2025-08-26T17:45:17.673Z" }, + { url = "https://files.pythonhosted.org/packages/54/31/9fbb78b8e1eb3ac605467cb846e1c08d0588506028b37f4ee21f978a51d4/orjson-3.11.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f83abab5bacb76d9c821fd5c07728ff224ed0e52d7a71b7b3de822f3df04e15c", size = 127956, upload-time = "2025-08-26T17:45:19.172Z" }, + { url = "https://files.pythonhosted.org/packages/36/88/b0604c22af1eed9f98d709a96302006915cfd724a7ebd27d6dd11c22d80b/orjson-3.11.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6fbaf48a744b94091a56c62897b27c31ee2da93d826aa5b207131a1e13d4064", size = 130790, upload-time = "2025-08-26T17:45:20.586Z" }, + { url = "https://files.pythonhosted.org/packages/0e/9d/1c1238ae9fffbfed51ba1e507731b3faaf6b846126a47e9649222b0fd06f/orjson-3.11.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc779b4f4bba2847d0d2940081a7b6f7b5877e05408ffbb74fa1faf4a136c424", size = 132385, upload-time = "2025-08-26T17:45:22.036Z" }, + { url = "https://files.pythonhosted.org/packages/a3/b5/c06f1b090a1c875f337e21dd71943bc9d84087f7cdf8c6e9086902c34e42/orjson-3.11.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd4b909ce4c50faa2192da6bb684d9848d4510b736b0611b6ab4020ea6fd2d23", size = 135305, upload-time = "2025-08-26T17:45:23.4Z" }, + { url = "https://files.pythonhosted.org/packages/a0/26/5f028c7d81ad2ebbf84414ba6d6c9cac03f22f5cd0d01eb40fb2d6a06b07/orjson-3.11.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:524b765ad888dc5518bbce12c77c2e83dee1ed6b0992c1790cc5fb49bb4b6667", size = 132875, upload-time = "2025-08-26T17:45:25.182Z" }, + { url = "https://files.pythonhosted.org/packages/fe/d4/b8df70d9cfb56e385bf39b4e915298f9ae6c61454c8154a0f5fd7efcd42e/orjson-3.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:84fd82870b97ae3cdcea9d8746e592b6d40e1e4d4527835fc520c588d2ded04f", size = 130940, upload-time = "2025-08-26T17:45:27.209Z" }, + { url = "https://files.pythonhosted.org/packages/da/5e/afe6a052ebc1a4741c792dd96e9f65bf3939d2094e8b356503b68d48f9f5/orjson-3.11.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fbecb9709111be913ae6879b07bafd4b0785b44c1eb5cac8ac76da048b3885a1", size = 403852, upload-time = "2025-08-26T17:45:28.478Z" }, + { url = "https://files.pythonhosted.org/packages/f8/90/7bbabafeb2ce65915e9247f14a56b29c9334003536009ef5b122783fe67e/orjson-3.11.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9dba358d55aee552bd868de348f4736ca5a4086d9a62e2bfbbeeb5629fe8b0cc", size = 146293, upload-time = "2025-08-26T17:45:29.86Z" }, + { url = "https://files.pythonhosted.org/packages/27/b3/2d703946447da8b093350570644a663df69448c9d9330e5f1d9cce997f20/orjson-3.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eabcf2e84f1d7105f84580e03012270c7e97ecb1fb1618bda395061b2a84a049", size = 135470, upload-time = "2025-08-26T17:45:31.243Z" }, + { url = "https://files.pythonhosted.org/packages/38/70/b14dcfae7aff0e379b0119c8a812f8396678919c431efccc8e8a0263e4d9/orjson-3.11.3-cp312-cp312-win32.whl", hash = "sha256:3782d2c60b8116772aea8d9b7905221437fdf53e7277282e8d8b07c220f96cca", size = 136248, upload-time = "2025-08-26T17:45:32.567Z" }, + { url = "https://files.pythonhosted.org/packages/35/b8/9e3127d65de7fff243f7f3e53f59a531bf6bb295ebe5db024c2503cc0726/orjson-3.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:79b44319268af2eaa3e315b92298de9a0067ade6e6003ddaef72f8e0bedb94f1", size = 131437, upload-time = "2025-08-26T17:45:34.949Z" }, + { url = "https://files.pythonhosted.org/packages/51/92/a946e737d4d8a7fd84a606aba96220043dcc7d6988b9e7551f7f6d5ba5ad/orjson-3.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:0e92a4e83341ef79d835ca21b8bd13e27c859e4e9e4d7b63defc6e58462a3710", size = 125978, upload-time = "2025-08-26T17:45:36.422Z" }, + { url = "https://files.pythonhosted.org/packages/fc/79/8932b27293ad35919571f77cb3693b5906cf14f206ef17546052a241fdf6/orjson-3.11.3-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:af40c6612fd2a4b00de648aa26d18186cd1322330bd3a3cc52f87c699e995810", size = 238127, upload-time = "2025-08-26T17:45:38.146Z" }, + { url = "https://files.pythonhosted.org/packages/1c/82/cb93cd8cf132cd7643b30b6c5a56a26c4e780c7a145db6f83de977b540ce/orjson-3.11.3-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:9f1587f26c235894c09e8b5b7636a38091a9e6e7fe4531937534749c04face43", size = 127494, upload-time = "2025-08-26T17:45:39.57Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b8/2d9eb181a9b6bb71463a78882bcac1027fd29cf62c38a40cc02fc11d3495/orjson-3.11.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61dcdad16da5bb486d7227a37a2e789c429397793a6955227cedbd7252eb5a27", size = 123017, upload-time = "2025-08-26T17:45:40.876Z" }, + { url = "https://files.pythonhosted.org/packages/b4/14/a0e971e72d03b509190232356d54c0f34507a05050bd026b8db2bf2c192c/orjson-3.11.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:11c6d71478e2cbea0a709e8a06365fa63da81da6498a53e4c4f065881d21ae8f", size = 127898, upload-time = "2025-08-26T17:45:42.188Z" }, + { url = "https://files.pythonhosted.org/packages/8e/af/dc74536722b03d65e17042cc30ae586161093e5b1f29bccda24765a6ae47/orjson-3.11.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff94112e0098470b665cb0ed06efb187154b63649403b8d5e9aedeb482b4548c", size = 130742, upload-time = "2025-08-26T17:45:43.511Z" }, + { url = "https://files.pythonhosted.org/packages/62/e6/7a3b63b6677bce089fe939353cda24a7679825c43a24e49f757805fc0d8a/orjson-3.11.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae8b756575aaa2a855a75192f356bbda11a89169830e1439cfb1a3e1a6dde7be", size = 132377, upload-time = "2025-08-26T17:45:45.525Z" }, + { url = "https://files.pythonhosted.org/packages/fc/cd/ce2ab93e2e7eaf518f0fd15e3068b8c43216c8a44ed82ac2b79ce5cef72d/orjson-3.11.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9416cc19a349c167ef76135b2fe40d03cea93680428efee8771f3e9fb66079d", size = 135313, upload-time = "2025-08-26T17:45:46.821Z" }, + { url = "https://files.pythonhosted.org/packages/d0/b4/f98355eff0bd1a38454209bbc73372ce351ba29933cb3e2eba16c04b9448/orjson-3.11.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b822caf5b9752bc6f246eb08124c3d12bf2175b66ab74bac2ef3bbf9221ce1b2", size = 132908, upload-time = "2025-08-26T17:45:48.126Z" }, + { url = "https://files.pythonhosted.org/packages/eb/92/8f5182d7bc2a1bed46ed960b61a39af8389f0ad476120cd99e67182bfb6d/orjson-3.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:414f71e3bdd5573893bf5ecdf35c32b213ed20aa15536fe2f588f946c318824f", size = 130905, upload-time = "2025-08-26T17:45:49.414Z" }, + { url = "https://files.pythonhosted.org/packages/1a/60/c41ca753ce9ffe3d0f67b9b4c093bdd6e5fdb1bc53064f992f66bb99954d/orjson-3.11.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:828e3149ad8815dc14468f36ab2a4b819237c155ee1370341b91ea4c8672d2ee", size = 403812, upload-time = "2025-08-26T17:45:51.085Z" }, + { url = "https://files.pythonhosted.org/packages/dd/13/e4a4f16d71ce1868860db59092e78782c67082a8f1dc06a3788aef2b41bc/orjson-3.11.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ac9e05f25627ffc714c21f8dfe3a579445a5c392a9c8ae7ba1d0e9fb5333f56e", size = 146277, upload-time = "2025-08-26T17:45:52.851Z" }, + { url = "https://files.pythonhosted.org/packages/8d/8b/bafb7f0afef9344754a3a0597a12442f1b85a048b82108ef2c956f53babd/orjson-3.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e44fbe4000bd321d9f3b648ae46e0196d21577cf66ae684a96ff90b1f7c93633", size = 135418, upload-time = "2025-08-26T17:45:54.806Z" }, + { url = "https://files.pythonhosted.org/packages/60/d4/bae8e4f26afb2c23bea69d2f6d566132584d1c3a5fe89ee8c17b718cab67/orjson-3.11.3-cp313-cp313-win32.whl", hash = "sha256:2039b7847ba3eec1f5886e75e6763a16e18c68a63efc4b029ddf994821e2e66b", size = 136216, upload-time = "2025-08-26T17:45:57.182Z" }, + { url = "https://files.pythonhosted.org/packages/88/76/224985d9f127e121c8cad882cea55f0ebe39f97925de040b75ccd4b33999/orjson-3.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:29be5ac4164aa8bdcba5fa0700a3c9c316b411d8ed9d39ef8a882541bd452fae", size = 131362, upload-time = "2025-08-26T17:45:58.56Z" }, + { url = "https://files.pythonhosted.org/packages/e2/cf/0dce7a0be94bd36d1346be5067ed65ded6adb795fdbe3abd234c8d576d01/orjson-3.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:18bd1435cb1f2857ceb59cfb7de6f92593ef7b831ccd1b9bfb28ca530e539dce", size = 125989, upload-time = "2025-08-26T17:45:59.95Z" }, + { url = "https://files.pythonhosted.org/packages/ef/77/d3b1fef1fc6aaeed4cbf3be2b480114035f4df8fa1a99d2dac1d40d6e924/orjson-3.11.3-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cf4b81227ec86935568c7edd78352a92e97af8da7bd70bdfdaa0d2e0011a1ab4", size = 238115, upload-time = "2025-08-26T17:46:01.669Z" }, + { url = "https://files.pythonhosted.org/packages/e4/6d/468d21d49bb12f900052edcfbf52c292022d0a323d7828dc6376e6319703/orjson-3.11.3-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:bc8bc85b81b6ac9fc4dae393a8c159b817f4c2c9dee5d12b773bddb3b95fc07e", size = 127493, upload-time = "2025-08-26T17:46:03.466Z" }, + { url = "https://files.pythonhosted.org/packages/67/46/1e2588700d354aacdf9e12cc2d98131fb8ac6f31ca65997bef3863edb8ff/orjson-3.11.3-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:88dcfc514cfd1b0de038443c7b3e6a9797ffb1b3674ef1fd14f701a13397f82d", size = 122998, upload-time = "2025-08-26T17:46:04.803Z" }, + { url = "https://files.pythonhosted.org/packages/3b/94/11137c9b6adb3779f1b34fd98be51608a14b430dbc02c6d41134fbba484c/orjson-3.11.3-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:d61cd543d69715d5fc0a690c7c6f8dcc307bc23abef9738957981885f5f38229", size = 132915, upload-time = "2025-08-26T17:46:06.237Z" }, + { url = "https://files.pythonhosted.org/packages/10/61/dccedcf9e9bcaac09fdabe9eaee0311ca92115699500efbd31950d878833/orjson-3.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2b7b153ed90ababadbef5c3eb39549f9476890d339cf47af563aea7e07db2451", size = 130907, upload-time = "2025-08-26T17:46:07.581Z" }, + { url = "https://files.pythonhosted.org/packages/0e/fd/0e935539aa7b08b3ca0f817d73034f7eb506792aae5ecc3b7c6e679cdf5f/orjson-3.11.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7909ae2460f5f494fecbcd10613beafe40381fd0316e35d6acb5f3a05bfda167", size = 403852, upload-time = "2025-08-26T17:46:08.982Z" }, + { url = "https://files.pythonhosted.org/packages/4a/2b/50ae1a5505cd1043379132fdb2adb8a05f37b3e1ebffe94a5073321966fd/orjson-3.11.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2030c01cbf77bc67bee7eef1e7e31ecf28649353987775e3583062c752da0077", size = 146309, upload-time = "2025-08-26T17:46:10.576Z" }, + { url = "https://files.pythonhosted.org/packages/cd/1d/a473c158e380ef6f32753b5f39a69028b25ec5be331c2049a2201bde2e19/orjson-3.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a0169ebd1cbd94b26c7a7ad282cf5c2744fce054133f959e02eb5265deae1872", size = 135424, upload-time = "2025-08-26T17:46:12.386Z" }, + { url = "https://files.pythonhosted.org/packages/da/09/17d9d2b60592890ff7382e591aa1d9afb202a266b180c3d4049b1ec70e4a/orjson-3.11.3-cp314-cp314-win32.whl", hash = "sha256:0c6d7328c200c349e3a4c6d8c83e0a5ad029bdc2d417f234152bf34842d0fc8d", size = 136266, upload-time = "2025-08-26T17:46:13.853Z" }, + { url = "https://files.pythonhosted.org/packages/15/58/358f6846410a6b4958b74734727e582ed971e13d335d6c7ce3e47730493e/orjson-3.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:317bbe2c069bbc757b1a2e4105b64aacd3bc78279b66a6b9e51e846e4809f804", size = 131351, upload-time = "2025-08-26T17:46:15.27Z" }, + { url = "https://files.pythonhosted.org/packages/28/01/d6b274a0635be0468d4dbd9cafe80c47105937a0d42434e805e67cd2ed8b/orjson-3.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:e8f6a7a27d7b7bec81bd5924163e9af03d49bbb63013f107b48eb5d16db711bc", size = 125985, upload-time = "2025-08-26T17:46:16.67Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "posthog-agent-toolkit" +version = "0.1.2" +source = { editable = "." } +dependencies = [ + { name = "httpx" }, + { name = "langchain-core" }, + { name = "langchain-mcp-adapters" }, + { name = "pydantic" }, + { name = "python-dateutil" }, + { name = "python-dotenv" }, + { name = "typing-extensions" }, +] + +[package.dev-dependencies] +dev = [ + { name = "build" }, + { name = "datamodel-code-generator", extra = ["http"] }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "ruff" }, + { name = "twine" }, +] + +[package.metadata] +requires-dist = [ + { name = "httpx", specifier = ">=0.25.0" }, + { name = "langchain-core", specifier = ">=0.1.0" }, + { name = "langchain-mcp-adapters", specifier = ">=0.1.0" }, + { name = "pydantic", specifier = ">=2.5.0" }, + { name = "python-dateutil", specifier = ">=2.8.2" }, + { name = "python-dotenv", specifier = ">=1.0.0" }, + { name = "typing-extensions", specifier = ">=4.8.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "build", specifier = ">=1.3.0" }, + { name = "datamodel-code-generator", extras = ["http"], specifier = ">=0.25.0" }, + { name = "pytest", specifier = ">=7.0.0" }, + { name = "pytest-asyncio", specifier = ">=0.21.0" }, + { name = "ruff", specifier = ">=0.1.0" }, + { name = "twine", specifier = ">=6.2.0" }, +] + +[[package]] +name = "pycparser" +version = "2.23" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, +] + +[[package]] +name = "pydantic" +version = "2.11.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload-time = "2025-06-14T08:33:17.137Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload-time = "2025-06-14T08:33:14.905Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584, upload-time = "2025-04-23T18:31:03.106Z" }, + { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071, upload-time = "2025-04-23T18:31:04.621Z" }, + { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823, upload-time = "2025-04-23T18:31:06.377Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792, upload-time = "2025-04-23T18:31:07.93Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338, upload-time = "2025-04-23T18:31:09.283Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998, upload-time = "2025-04-23T18:31:11.7Z" }, + { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200, upload-time = "2025-04-23T18:31:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890, upload-time = "2025-04-23T18:31:15.011Z" }, + { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359, upload-time = "2025-04-23T18:31:16.393Z" }, + { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883, upload-time = "2025-04-23T18:31:17.892Z" }, + { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074, upload-time = "2025-04-23T18:31:19.205Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538, upload-time = "2025-04-23T18:31:20.541Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909, upload-time = "2025-04-23T18:31:22.371Z" }, + { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786, upload-time = "2025-04-23T18:31:24.161Z" }, + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, + { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200, upload-time = "2025-04-23T18:33:14.199Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123, upload-time = "2025-04-23T18:33:16.555Z" }, + { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852, upload-time = "2025-04-23T18:33:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484, upload-time = "2025-04-23T18:33:20.475Z" }, + { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896, upload-time = "2025-04-23T18:33:22.501Z" }, + { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475, upload-time = "2025-04-23T18:33:24.528Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013, upload-time = "2025-04-23T18:33:26.621Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715, upload-time = "2025-04-23T18:33:28.656Z" }, + { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/85/1ea668bbab3c50071ca613c6ab30047fb36ab0da1b92fa8f17bbc38fd36c/pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", size = 172583, upload-time = "2025-06-24T13:26:46.841Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/f0/427018098906416f580e3cf1366d3b1abfb408a0652e9f31600c24a1903c/pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796", size = 45235, upload-time = "2025-06-24T13:26:45.485Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "pytest" +version = "8.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714, upload-time = "2025-06-18T05:48:06.109Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474, upload-time = "2025-06-18T05:48:03.955Z" }, +] + +[[package]] +name = "pytest-asyncio" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/51/f8794af39eeb870e87a8c8068642fc07bce0c854d6865d7dd0f2a9d338c2/pytest_asyncio-1.1.0.tar.gz", hash = "sha256:796aa822981e01b68c12e4827b8697108f7205020f24b5793b3c41555dab68ea", size = 46652, upload-time = "2025-07-16T04:29:26.393Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/9d/bf86eddabf8c6c9cb1ea9a869d6873b46f105a5d292d3a6f7071f5b07935/pytest_asyncio-1.1.0-py3-none-any.whl", hash = "sha256:5fe2d69607b0bd75c656d1211f969cadba035030156745ee09e7d71740e58ecf", size = 15157, upload-time = "2025-07-16T04:29:24.929Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" }, +] + +[[package]] +name = "python-multipart" +version = "0.0.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload-time = "2024-12-16T19:45:46.972Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" }, +] + +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" }, + { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" }, + { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, +] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471, upload-time = "2024-08-14T10:15:34.626Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload-time = "2024-08-06T20:32:03.408Z" }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload-time = "2024-08-06T20:32:04.926Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload-time = "2024-08-06T20:32:06.459Z" }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload-time = "2024-08-06T20:32:08.338Z" }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload-time = "2024-08-06T20:32:14.124Z" }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload-time = "2024-08-06T20:32:16.17Z" }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload-time = "2024-08-06T20:32:18.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload-time = "2024-08-06T20:32:19.889Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload-time = "2024-08-06T20:32:21.273Z" }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, +] + +[[package]] +name = "readme-renderer" +version = "44.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "nh3" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/a9/104ec9234c8448c4379768221ea6df01260cd6c2ce13182d4eac531c8342/readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1", size = 32056, upload-time = "2024-07-08T15:00:57.805Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", size = 13310, upload-time = "2024-07-08T15:00:56.577Z" }, +] + +[[package]] +name = "referencing" +version = "0.36.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" }, +] + +[[package]] +name = "rfc3986" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026, upload-time = "2022-01-10T00:52:30.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326, upload-time = "2022-01-10T00:52:29.594Z" }, +] + +[[package]] +name = "rich" +version = "14.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/75/af448d8e52bf1d8fa6a9d089ca6c07ff4453d86c65c145d0a300bb073b9b/rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8", size = 224441, upload-time = "2025-07-25T07:32:58.125Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", size = 243368, upload-time = "2025-07-25T07:32:56.73Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.27.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479, upload-time = "2025-08-27T12:16:36.024Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/c1/7907329fbef97cbd49db6f7303893bd1dd5a4a3eae415839ffdfb0762cae/rpds_py-0.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:be898f271f851f68b318872ce6ebebbc62f303b654e43bf72683dbdc25b7c881", size = 371063, upload-time = "2025-08-27T12:12:47.856Z" }, + { url = "https://files.pythonhosted.org/packages/11/94/2aab4bc86228bcf7c48760990273653a4900de89c7537ffe1b0d6097ed39/rpds_py-0.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62ac3d4e3e07b58ee0ddecd71d6ce3b1637de2d373501412df395a0ec5f9beb5", size = 353210, upload-time = "2025-08-27T12:12:49.187Z" }, + { url = "https://files.pythonhosted.org/packages/3a/57/f5eb3ecf434342f4f1a46009530e93fd201a0b5b83379034ebdb1d7c1a58/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4708c5c0ceb2d034f9991623631d3d23cb16e65c83736ea020cdbe28d57c0a0e", size = 381636, upload-time = "2025-08-27T12:12:50.492Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f4/ef95c5945e2ceb5119571b184dd5a1cc4b8541bbdf67461998cfeac9cb1e/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:abfa1171a9952d2e0002aba2ad3780820b00cc3d9c98c6630f2e93271501f66c", size = 394341, upload-time = "2025-08-27T12:12:52.024Z" }, + { url = "https://files.pythonhosted.org/packages/5a/7e/4bd610754bf492d398b61725eb9598ddd5eb86b07d7d9483dbcd810e20bc/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b507d19f817ebaca79574b16eb2ae412e5c0835542c93fe9983f1e432aca195", size = 523428, upload-time = "2025-08-27T12:12:53.779Z" }, + { url = "https://files.pythonhosted.org/packages/9f/e5/059b9f65a8c9149361a8b75094864ab83b94718344db511fd6117936ed2a/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168b025f8fd8d8d10957405f3fdcef3dc20f5982d398f90851f4abc58c566c52", size = 402923, upload-time = "2025-08-27T12:12:55.15Z" }, + { url = "https://files.pythonhosted.org/packages/f5/48/64cabb7daced2968dd08e8a1b7988bf358d7bd5bcd5dc89a652f4668543c/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c6210ef77caa58e16e8c17d35c63fe3f5b60fd9ba9d424470c3400bcf9ed", size = 384094, upload-time = "2025-08-27T12:12:57.194Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e1/dc9094d6ff566bff87add8a510c89b9e158ad2ecd97ee26e677da29a9e1b/rpds_py-0.27.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:d252f2d8ca0195faa707f8eb9368955760880b2b42a8ee16d382bf5dd807f89a", size = 401093, upload-time = "2025-08-27T12:12:58.985Z" }, + { url = "https://files.pythonhosted.org/packages/37/8e/ac8577e3ecdd5593e283d46907d7011618994e1d7ab992711ae0f78b9937/rpds_py-0.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6e5e54da1e74b91dbc7996b56640f79b195d5925c2b78efaa8c5d53e1d88edde", size = 417969, upload-time = "2025-08-27T12:13:00.367Z" }, + { url = "https://files.pythonhosted.org/packages/66/6d/87507430a8f74a93556fe55c6485ba9c259949a853ce407b1e23fea5ba31/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ffce0481cc6e95e5b3f0a47ee17ffbd234399e6d532f394c8dce320c3b089c21", size = 558302, upload-time = "2025-08-27T12:13:01.737Z" }, + { url = "https://files.pythonhosted.org/packages/3a/bb/1db4781ce1dda3eecc735e3152659a27b90a02ca62bfeea17aee45cc0fbc/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a205fdfe55c90c2cd8e540ca9ceba65cbe6629b443bc05db1f590a3db8189ff9", size = 589259, upload-time = "2025-08-27T12:13:03.127Z" }, + { url = "https://files.pythonhosted.org/packages/7b/0e/ae1c8943d11a814d01b482e1f8da903f88047a962dff9bbdadf3bd6e6fd1/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:689fb5200a749db0415b092972e8eba85847c23885c8543a8b0f5c009b1a5948", size = 554983, upload-time = "2025-08-27T12:13:04.516Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d5/0b2a55415931db4f112bdab072443ff76131b5ac4f4dc98d10d2d357eb03/rpds_py-0.27.1-cp311-cp311-win32.whl", hash = "sha256:3182af66048c00a075010bc7f4860f33913528a4b6fc09094a6e7598e462fe39", size = 217154, upload-time = "2025-08-27T12:13:06.278Z" }, + { url = "https://files.pythonhosted.org/packages/24/75/3b7ffe0d50dc86a6a964af0d1cc3a4a2cdf437cb7b099a4747bbb96d1819/rpds_py-0.27.1-cp311-cp311-win_amd64.whl", hash = "sha256:b4938466c6b257b2f5c4ff98acd8128ec36b5059e5c8f8372d79316b1c36bb15", size = 228627, upload-time = "2025-08-27T12:13:07.625Z" }, + { url = "https://files.pythonhosted.org/packages/8d/3f/4fd04c32abc02c710f09a72a30c9a55ea3cc154ef8099078fd50a0596f8e/rpds_py-0.27.1-cp311-cp311-win_arm64.whl", hash = "sha256:2f57af9b4d0793e53266ee4325535a31ba48e2f875da81a9177c9926dfa60746", size = 220998, upload-time = "2025-08-27T12:13:08.972Z" }, + { url = "https://files.pythonhosted.org/packages/bd/fe/38de28dee5df58b8198c743fe2bea0c785c6d40941b9950bac4cdb71a014/rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90", size = 361887, upload-time = "2025-08-27T12:13:10.233Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/4b6c7eedc7dd90986bf0fab6ea2a091ec11c01b15f8ba0a14d3f80450468/rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5", size = 345795, upload-time = "2025-08-27T12:13:11.65Z" }, + { url = "https://files.pythonhosted.org/packages/6f/0e/e650e1b81922847a09cca820237b0edee69416a01268b7754d506ade11ad/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e", size = 385121, upload-time = "2025-08-27T12:13:13.008Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ea/b306067a712988e2bff00dcc7c8f31d26c29b6d5931b461aa4b60a013e33/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881", size = 398976, upload-time = "2025-08-27T12:13:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0a/26dc43c8840cb8fe239fe12dbc8d8de40f2365e838f3d395835dde72f0e5/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec", size = 525953, upload-time = "2025-08-27T12:13:15.774Z" }, + { url = "https://files.pythonhosted.org/packages/22/14/c85e8127b573aaf3a0cbd7fbb8c9c99e735a4a02180c84da2a463b766e9e/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb", size = 407915, upload-time = "2025-08-27T12:13:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/ed/7b/8f4fee9ba1fb5ec856eb22d725a4efa3deb47f769597c809e03578b0f9d9/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5", size = 386883, upload-time = "2025-08-27T12:13:18.704Z" }, + { url = "https://files.pythonhosted.org/packages/86/47/28fa6d60f8b74fcdceba81b272f8d9836ac0340570f68f5df6b41838547b/rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a", size = 405699, upload-time = "2025-08-27T12:13:20.089Z" }, + { url = "https://files.pythonhosted.org/packages/d0/fd/c5987b5e054548df56953a21fe2ebed51fc1ec7c8f24fd41c067b68c4a0a/rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444", size = 423713, upload-time = "2025-08-27T12:13:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ba/3c4978b54a73ed19a7d74531be37a8bcc542d917c770e14d372b8daea186/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a", size = 562324, upload-time = "2025-08-27T12:13:22.789Z" }, + { url = "https://files.pythonhosted.org/packages/b5/6c/6943a91768fec16db09a42b08644b960cff540c66aab89b74be6d4a144ba/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1", size = 593646, upload-time = "2025-08-27T12:13:24.122Z" }, + { url = "https://files.pythonhosted.org/packages/11/73/9d7a8f4be5f4396f011a6bb7a19fe26303a0dac9064462f5651ced2f572f/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998", size = 558137, upload-time = "2025-08-27T12:13:25.557Z" }, + { url = "https://files.pythonhosted.org/packages/6e/96/6772cbfa0e2485bcceef8071de7821f81aeac8bb45fbfd5542a3e8108165/rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39", size = 221343, upload-time = "2025-08-27T12:13:26.967Z" }, + { url = "https://files.pythonhosted.org/packages/67/b6/c82f0faa9af1c6a64669f73a17ee0eeef25aff30bb9a1c318509efe45d84/rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594", size = 232497, upload-time = "2025-08-27T12:13:28.326Z" }, + { url = "https://files.pythonhosted.org/packages/e1/96/2817b44bd2ed11aebacc9251da03689d56109b9aba5e311297b6902136e2/rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502", size = 222790, upload-time = "2025-08-27T12:13:29.71Z" }, + { url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741, upload-time = "2025-08-27T12:13:31.039Z" }, + { url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574, upload-time = "2025-08-27T12:13:32.902Z" }, + { url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051, upload-time = "2025-08-27T12:13:34.228Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395, upload-time = "2025-08-27T12:13:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334, upload-time = "2025-08-27T12:13:37.562Z" }, + { url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691, upload-time = "2025-08-27T12:13:38.94Z" }, + { url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868, upload-time = "2025-08-27T12:13:40.192Z" }, + { url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469, upload-time = "2025-08-27T12:13:41.496Z" }, + { url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125, upload-time = "2025-08-27T12:13:42.802Z" }, + { url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341, upload-time = "2025-08-27T12:13:44.472Z" }, + { url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511, upload-time = "2025-08-27T12:13:45.898Z" }, + { url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736, upload-time = "2025-08-27T12:13:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/00/95/3c863973d409210da7fb41958172c6b7dbe7fc34e04d3cc1f10bb85e979f/rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3", size = 221462, upload-time = "2025-08-27T12:13:48.742Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2c/5867b14a81dc217b56d95a9f2a40fdbc56a1ab0181b80132beeecbd4b2d6/rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83", size = 232034, upload-time = "2025-08-27T12:13:50.11Z" }, + { url = "https://files.pythonhosted.org/packages/c7/78/3958f3f018c01923823f1e47f1cc338e398814b92d83cd278364446fac66/rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d", size = 222392, upload-time = "2025-08-27T12:13:52.587Z" }, + { url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355, upload-time = "2025-08-27T12:13:54.012Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138, upload-time = "2025-08-27T12:13:55.791Z" }, + { url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247, upload-time = "2025-08-27T12:13:57.683Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699, upload-time = "2025-08-27T12:13:59.137Z" }, + { url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852, upload-time = "2025-08-27T12:14:00.583Z" }, + { url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582, upload-time = "2025-08-27T12:14:02.034Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126, upload-time = "2025-08-27T12:14:03.437Z" }, + { url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486, upload-time = "2025-08-27T12:14:05.443Z" }, + { url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832, upload-time = "2025-08-27T12:14:06.902Z" }, + { url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249, upload-time = "2025-08-27T12:14:08.37Z" }, + { url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356, upload-time = "2025-08-27T12:14:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300, upload-time = "2025-08-27T12:14:11.783Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ee/375469849e6b429b3516206b4580a79e9ef3eb12920ddbd4492b56eaacbe/rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688", size = 216714, upload-time = "2025-08-27T12:14:13.629Z" }, + { url = "https://files.pythonhosted.org/packages/21/87/3fc94e47c9bd0742660e84706c311a860dcae4374cf4a03c477e23ce605a/rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797", size = 228943, upload-time = "2025-08-27T12:14:14.937Z" }, + { url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472, upload-time = "2025-08-27T12:14:16.333Z" }, + { url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676, upload-time = "2025-08-27T12:14:17.764Z" }, + { url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313, upload-time = "2025-08-27T12:14:19.829Z" }, + { url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080, upload-time = "2025-08-27T12:14:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868, upload-time = "2025-08-27T12:14:23.485Z" }, + { url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750, upload-time = "2025-08-27T12:14:24.924Z" }, + { url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688, upload-time = "2025-08-27T12:14:27.537Z" }, + { url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225, upload-time = "2025-08-27T12:14:28.981Z" }, + { url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361, upload-time = "2025-08-27T12:14:30.469Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493, upload-time = "2025-08-27T12:14:31.987Z" }, + { url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623, upload-time = "2025-08-27T12:14:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800, upload-time = "2025-08-27T12:14:35.436Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d6/99228e6bbcf4baa764b18258f519a9035131d91b538d4e0e294313462a98/rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3", size = 221943, upload-time = "2025-08-27T12:14:36.898Z" }, + { url = "https://files.pythonhosted.org/packages/be/07/c802bc6b8e95be83b79bdf23d1aa61d68324cb1006e245d6c58e959e314d/rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456", size = 233739, upload-time = "2025-08-27T12:14:38.386Z" }, + { url = "https://files.pythonhosted.org/packages/c8/89/3e1b1c16d4c2d547c5717377a8df99aee8099ff050f87c45cb4d5fa70891/rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3", size = 223120, upload-time = "2025-08-27T12:14:39.82Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944, upload-time = "2025-08-27T12:14:41.199Z" }, + { url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283, upload-time = "2025-08-27T12:14:42.699Z" }, + { url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320, upload-time = "2025-08-27T12:14:44.157Z" }, + { url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760, upload-time = "2025-08-27T12:14:45.845Z" }, + { url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476, upload-time = "2025-08-27T12:14:47.364Z" }, + { url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418, upload-time = "2025-08-27T12:14:49.991Z" }, + { url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771, upload-time = "2025-08-27T12:14:52.159Z" }, + { url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022, upload-time = "2025-08-27T12:14:53.859Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787, upload-time = "2025-08-27T12:14:55.673Z" }, + { url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538, upload-time = "2025-08-27T12:14:57.245Z" }, + { url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512, upload-time = "2025-08-27T12:14:58.728Z" }, + { url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813, upload-time = "2025-08-27T12:15:00.334Z" }, + { url = "https://files.pythonhosted.org/packages/04/2e/30b5ea18c01379da6272a92825dd7e53dc9d15c88a19e97932d35d430ef7/rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a", size = 217385, upload-time = "2025-08-27T12:15:01.937Z" }, + { url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097, upload-time = "2025-08-27T12:15:03.961Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ed/e1fba02de17f4f76318b834425257c8ea297e415e12c68b4361f63e8ae92/rpds_py-0.27.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdfe4bb2f9fe7458b7453ad3c33e726d6d1c7c0a72960bcc23800d77384e42df", size = 371402, upload-time = "2025-08-27T12:15:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/af/7c/e16b959b316048b55585a697e94add55a4ae0d984434d279ea83442e460d/rpds_py-0.27.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8fabb8fd848a5f75a2324e4a84501ee3a5e3c78d8603f83475441866e60b94a3", size = 354084, upload-time = "2025-08-27T12:15:53.219Z" }, + { url = "https://files.pythonhosted.org/packages/de/c1/ade645f55de76799fdd08682d51ae6724cb46f318573f18be49b1e040428/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda8719d598f2f7f3e0f885cba8646644b55a187762bec091fa14a2b819746a9", size = 383090, upload-time = "2025-08-27T12:15:55.158Z" }, + { url = "https://files.pythonhosted.org/packages/1f/27/89070ca9b856e52960da1472efcb6c20ba27cfe902f4f23ed095b9cfc61d/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c64d07e95606ec402a0a1c511fe003873fa6af630bda59bac77fac8b4318ebc", size = 394519, upload-time = "2025-08-27T12:15:57.238Z" }, + { url = "https://files.pythonhosted.org/packages/b3/28/be120586874ef906aa5aeeae95ae8df4184bc757e5b6bd1c729ccff45ed5/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93a2ed40de81bcff59aabebb626562d48332f3d028ca2036f1d23cbb52750be4", size = 523817, upload-time = "2025-08-27T12:15:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/70cc197bc11cfcde02a86f36ac1eed15c56667c2ebddbdb76a47e90306da/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:387ce8c44ae94e0ec50532d9cb0edce17311024c9794eb196b90e1058aadeb66", size = 403240, upload-time = "2025-08-27T12:16:00.923Z" }, + { url = "https://files.pythonhosted.org/packages/cf/35/46936cca449f7f518f2f4996e0e8344db4b57e2081e752441154089d2a5f/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf94f812c95b5e60ebaf8bfb1898a7d7cb9c1af5744d4a67fa47796e0465d4e", size = 385194, upload-time = "2025-08-27T12:16:02.802Z" }, + { url = "https://files.pythonhosted.org/packages/e1/62/29c0d3e5125c3270b51415af7cbff1ec587379c84f55a5761cc9efa8cd06/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:4848ca84d6ded9b58e474dfdbad4b8bfb450344c0551ddc8d958bf4b36aa837c", size = 402086, upload-time = "2025-08-27T12:16:04.806Z" }, + { url = "https://files.pythonhosted.org/packages/8f/66/03e1087679227785474466fdd04157fb793b3b76e3fcf01cbf4c693c1949/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bde09cbcf2248b73c7c323be49b280180ff39fadcfe04e7b6f54a678d02a7cf", size = 419272, upload-time = "2025-08-27T12:16:06.471Z" }, + { url = "https://files.pythonhosted.org/packages/6a/24/e3e72d265121e00b063aef3e3501e5b2473cf1b23511d56e529531acf01e/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:94c44ee01fd21c9058f124d2d4f0c9dc7634bec93cd4b38eefc385dabe71acbf", size = 560003, upload-time = "2025-08-27T12:16:08.06Z" }, + { url = "https://files.pythonhosted.org/packages/26/ca/f5a344c534214cc2d41118c0699fffbdc2c1bc7046f2a2b9609765ab9c92/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:df8b74962e35c9249425d90144e721eed198e6555a0e22a563d29fe4486b51f6", size = 590482, upload-time = "2025-08-27T12:16:10.137Z" }, + { url = "https://files.pythonhosted.org/packages/ce/08/4349bdd5c64d9d193c360aa9db89adeee6f6682ab8825dca0a3f535f434f/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dc23e6820e3b40847e2f4a7726462ba0cf53089512abe9ee16318c366494c17a", size = 556523, upload-time = "2025-08-27T12:16:12.188Z" }, +] + +[[package]] +name = "ruff" +version = "0.12.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/ce/8d7dbedede481245b489b769d27e2934730791a9a82765cb94566c6e6abd/ruff-0.12.4.tar.gz", hash = "sha256:13efa16df6c6eeb7d0f091abae50f58e9522f3843edb40d56ad52a5a4a4b6873", size = 5131435, upload-time = "2025-07-17T17:27:19.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/9f/517bc5f61bad205b7f36684ffa5415c013862dee02f55f38a217bdbe7aa4/ruff-0.12.4-py3-none-linux_armv6l.whl", hash = "sha256:cb0d261dac457ab939aeb247e804125a5d521b21adf27e721895b0d3f83a0d0a", size = 10188824, upload-time = "2025-07-17T17:26:31.412Z" }, + { url = "https://files.pythonhosted.org/packages/28/83/691baae5a11fbbde91df01c565c650fd17b0eabed259e8b7563de17c6529/ruff-0.12.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:55c0f4ca9769408d9b9bac530c30d3e66490bd2beb2d3dae3e4128a1f05c7442", size = 10884521, upload-time = "2025-07-17T17:26:35.084Z" }, + { url = "https://files.pythonhosted.org/packages/d6/8d/756d780ff4076e6dd035d058fa220345f8c458391f7edfb1c10731eedc75/ruff-0.12.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a8224cc3722c9ad9044da7f89c4c1ec452aef2cfe3904365025dd2f51daeae0e", size = 10277653, upload-time = "2025-07-17T17:26:37.897Z" }, + { url = "https://files.pythonhosted.org/packages/8d/97/8eeee0f48ece153206dce730fc9e0e0ca54fd7f261bb3d99c0a4343a1892/ruff-0.12.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9949d01d64fa3672449a51ddb5d7548b33e130240ad418884ee6efa7a229586", size = 10485993, upload-time = "2025-07-17T17:26:40.68Z" }, + { url = "https://files.pythonhosted.org/packages/49/b8/22a43d23a1f68df9b88f952616c8508ea6ce4ed4f15353b8168c48b2d7e7/ruff-0.12.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:be0593c69df9ad1465e8a2d10e3defd111fdb62dcd5be23ae2c06da77e8fcffb", size = 10022824, upload-time = "2025-07-17T17:26:43.564Z" }, + { url = "https://files.pythonhosted.org/packages/cd/70/37c234c220366993e8cffcbd6cadbf332bfc848cbd6f45b02bade17e0149/ruff-0.12.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7dea966bcb55d4ecc4cc3270bccb6f87a337326c9dcd3c07d5b97000dbff41c", size = 11524414, upload-time = "2025-07-17T17:26:46.219Z" }, + { url = "https://files.pythonhosted.org/packages/14/77/c30f9964f481b5e0e29dd6a1fae1f769ac3fd468eb76fdd5661936edd262/ruff-0.12.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:afcfa3ab5ab5dd0e1c39bf286d829e042a15e966b3726eea79528e2e24d8371a", size = 12419216, upload-time = "2025-07-17T17:26:48.883Z" }, + { url = "https://files.pythonhosted.org/packages/6e/79/af7fe0a4202dce4ef62c5e33fecbed07f0178f5b4dd9c0d2fcff5ab4a47c/ruff-0.12.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c057ce464b1413c926cdb203a0f858cd52f3e73dcb3270a3318d1630f6395bb3", size = 11976756, upload-time = "2025-07-17T17:26:51.754Z" }, + { url = "https://files.pythonhosted.org/packages/09/d1/33fb1fc00e20a939c305dbe2f80df7c28ba9193f7a85470b982815a2dc6a/ruff-0.12.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64b90d1122dc2713330350626b10d60818930819623abbb56535c6466cce045", size = 11020019, upload-time = "2025-07-17T17:26:54.265Z" }, + { url = "https://files.pythonhosted.org/packages/64/f4/e3cd7f7bda646526f09693e2e02bd83d85fff8a8222c52cf9681c0d30843/ruff-0.12.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2abc48f3d9667fdc74022380b5c745873499ff827393a636f7a59da1515e7c57", size = 11277890, upload-time = "2025-07-17T17:26:56.914Z" }, + { url = "https://files.pythonhosted.org/packages/5e/d0/69a85fb8b94501ff1a4f95b7591505e8983f38823da6941eb5b6badb1e3a/ruff-0.12.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2b2449dc0c138d877d629bea151bee8c0ae3b8e9c43f5fcaafcd0c0d0726b184", size = 10348539, upload-time = "2025-07-17T17:26:59.381Z" }, + { url = "https://files.pythonhosted.org/packages/16/a0/91372d1cb1678f7d42d4893b88c252b01ff1dffcad09ae0c51aa2542275f/ruff-0.12.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:56e45bb11f625db55f9b70477062e6a1a04d53628eda7784dce6e0f55fd549eb", size = 10009579, upload-time = "2025-07-17T17:27:02.462Z" }, + { url = "https://files.pythonhosted.org/packages/23/1b/c4a833e3114d2cc0f677e58f1df6c3b20f62328dbfa710b87a1636a5e8eb/ruff-0.12.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:478fccdb82ca148a98a9ff43658944f7ab5ec41c3c49d77cd99d44da019371a1", size = 10942982, upload-time = "2025-07-17T17:27:05.343Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ce/ce85e445cf0a5dd8842f2f0c6f0018eedb164a92bdf3eda51984ffd4d989/ruff-0.12.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0fc426bec2e4e5f4c4f182b9d2ce6a75c85ba9bcdbe5c6f2a74fcb8df437df4b", size = 11343331, upload-time = "2025-07-17T17:27:08.652Z" }, + { url = "https://files.pythonhosted.org/packages/35/cf/441b7fc58368455233cfb5b77206c849b6dfb48b23de532adcc2e50ccc06/ruff-0.12.4-py3-none-win32.whl", hash = "sha256:4de27977827893cdfb1211d42d84bc180fceb7b72471104671c59be37041cf93", size = 10267904, upload-time = "2025-07-17T17:27:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/ce/7e/20af4a0df5e1299e7368d5ea4350412226afb03d95507faae94c80f00afd/ruff-0.12.4-py3-none-win_amd64.whl", hash = "sha256:fe0b9e9eb23736b453143d72d2ceca5db323963330d5b7859d60d101147d461a", size = 11209038, upload-time = "2025-07-17T17:27:14.417Z" }, + { url = "https://files.pythonhosted.org/packages/11/02/8857d0dfb8f44ef299a5dfd898f673edefb71e3b533b3b9d2db4c832dd13/ruff-0.12.4-py3-none-win_arm64.whl", hash = "sha256:0618ec4442a83ab545e5b71202a5c0ed7791e8471435b94e655b570a5031a98e", size = 10469336, upload-time = "2025-07-17T17:27:16.913Z" }, +] + +[[package]] +name = "secretstorage" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "jeepney" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/9f/11ef35cf1027c1339552ea7bfe6aaa74a8516d8b5caf6e7d338daf54fd80/secretstorage-3.4.0.tar.gz", hash = "sha256:c46e216d6815aff8a8a18706a2fbfd8d53fcbb0dce99301881687a1b0289ef7c", size = 19748, upload-time = "2025-09-09T16:42:13.859Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/ff/2e2eed29e02c14a5cb6c57f09b2d5b40e65d6cc71f45b52e0be295ccbc2f/secretstorage-3.4.0-py3-none-any.whl", hash = "sha256:0e3b6265c2c63509fb7415717607e4b2c9ab767b7f344a57473b779ca13bd02e", size = 15272, upload-time = "2025-09-09T16:42:12.744Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "sse-starlette" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/6f/22ed6e33f8a9e76ca0a412405f31abb844b779d52c5f96660766edcd737c/sse_starlette-3.0.2.tar.gz", hash = "sha256:ccd60b5765ebb3584d0de2d7a6e4f745672581de4f5005ab31c3a25d10b52b3a", size = 20985, upload-time = "2025-07-27T09:07:44.565Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/10/c78f463b4ef22eef8491f218f692be838282cd65480f6e423d7730dfd1fb/sse_starlette-3.0.2-py3-none-any.whl", hash = "sha256:16b7cbfddbcd4eaca11f7b586f3b8a080f1afe952c15813455b162edea619e5a", size = 11297, upload-time = "2025-07-27T09:07:43.268Z" }, +] + +[[package]] +name = "starlette" +version = "0.47.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/15/b9/cc3017f9a9c9b6e27c5106cc10cc7904653c3eec0729793aec10479dd669/starlette-0.47.3.tar.gz", hash = "sha256:6bc94f839cc176c4858894f1f8908f0ab79dfec1a6b8402f6da9be26ebea52e9", size = 2584144, upload-time = "2025-08-24T13:36:42.122Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/fd/901cfa59aaa5b30a99e16876f11abe38b59a1a2c51ffb3d7142bb6089069/starlette-0.47.3-py3-none-any.whl", hash = "sha256:89c0778ca62a76b826101e7c709e70680a1699ca7da6b44d38eb0a7e61fe4b51", size = 72991, upload-time = "2025-08-24T13:36:40.887Z" }, +] + +[[package]] +name = "tenacity" +version = "9.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload-time = "2025-04-02T08:25:09.966Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" }, +] + +[[package]] +name = "tomli" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload-time = "2024-11-27T22:38:36.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload-time = "2024-11-27T22:37:54.956Z" }, + { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload-time = "2024-11-27T22:37:56.698Z" }, + { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload-time = "2024-11-27T22:37:57.63Z" }, + { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload-time = "2024-11-27T22:37:59.344Z" }, + { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload-time = "2024-11-27T22:38:00.429Z" }, + { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload-time = "2024-11-27T22:38:02.094Z" }, + { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload-time = "2024-11-27T22:38:03.206Z" }, + { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload-time = "2024-11-27T22:38:04.217Z" }, + { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload-time = "2024-11-27T22:38:05.908Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload-time = "2024-11-27T22:38:06.812Z" }, + { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload-time = "2024-11-27T22:38:07.731Z" }, + { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload-time = "2024-11-27T22:38:09.384Z" }, + { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload-time = "2024-11-27T22:38:10.329Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload-time = "2024-11-27T22:38:11.443Z" }, + { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload-time = "2024-11-27T22:38:13.099Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload-time = "2024-11-27T22:38:14.766Z" }, + { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload-time = "2024-11-27T22:38:15.843Z" }, + { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload-time = "2024-11-27T22:38:17.645Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload-time = "2024-11-27T22:38:19.159Z" }, + { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload-time = "2024-11-27T22:38:20.064Z" }, + { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload-time = "2024-11-27T22:38:21.659Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload-time = "2024-11-27T22:38:22.693Z" }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload-time = "2024-11-27T22:38:24.367Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload-time = "2024-11-27T22:38:26.081Z" }, + { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload-time = "2024-11-27T22:38:27.921Z" }, + { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload-time = "2024-11-27T22:38:29.591Z" }, + { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload-time = "2024-11-27T22:38:30.639Z" }, + { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload-time = "2024-11-27T22:38:31.702Z" }, + { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload-time = "2024-11-27T22:38:32.837Z" }, + { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload-time = "2024-11-27T22:38:34.455Z" }, + { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, +] + +[[package]] +name = "twine" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "id" }, + { name = "keyring", marker = "platform_machine != 'ppc64le' and platform_machine != 's390x'" }, + { name = "packaging" }, + { name = "readme-renderer" }, + { name = "requests" }, + { name = "requests-toolbelt" }, + { name = "rfc3986" }, + { name = "rich" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/a8/949edebe3a82774c1ec34f637f5dd82d1cf22c25e963b7d63771083bbee5/twine-6.2.0.tar.gz", hash = "sha256:e5ed0d2fd70c9959770dce51c8f39c8945c574e18173a7b81802dab51b4b75cf", size = 172262, upload-time = "2025-09-04T15:43:17.255Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/7a/882d99539b19b1490cac5d77c67338d126e4122c8276bf640e411650c830/twine-6.2.0-py3-none-any.whl", hash = "sha256:418ebf08ccda9a8caaebe414433b0ba5e25eb5e4a927667122fbe8f829f985d8", size = 42727, upload-time = "2025-09-04T15:43:15.994Z" }, +] + +[[package]] +name = "typeguard" +version = "4.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/68/71c1a15b5f65f40e91b65da23b8224dad41349894535a97f63a52e462196/typeguard-4.4.4.tar.gz", hash = "sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74", size = 75203, upload-time = "2025-06-18T09:56:07.624Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/a9/e3aee762739c1d7528da1c3e06d518503f8b6c439c35549b53735ba52ead/typeguard-4.4.4-py3-none-any.whl", hash = "sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e", size = 34874, upload-time = "2025-06-18T09:56:05.999Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.35.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/42/e0e305207bb88c6b8d3061399c6a961ffe5fbb7e2aa63c9234df7259e9cd/uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01", size = 78473, upload-time = "2025-06-28T16:15:46.058Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406, upload-time = "2025-06-28T16:15:44.816Z" }, +] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +] + +[[package]] +name = "zstandard" +version = "0.24.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/1b/c20b2ef1d987627765dcd5bf1dadb8ef6564f00a87972635099bb76b7a05/zstandard-0.24.0.tar.gz", hash = "sha256:fe3198b81c00032326342d973e526803f183f97aa9e9a98e3f897ebafe21178f", size = 905681, upload-time = "2025-08-17T18:36:36.352Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/1f/5c72806f76043c0ef9191a2b65281dacdf3b65b0828eb13bb2c987c4fb90/zstandard-0.24.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:addfc23e3bd5f4b6787b9ca95b2d09a1a67ad5a3c318daaa783ff90b2d3a366e", size = 795228, upload-time = "2025-08-17T18:21:46.978Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ba/3059bd5cd834666a789251d14417621b5c61233bd46e7d9023ea8bc1043a/zstandard-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b005bcee4be9c3984b355336283afe77b2defa76ed6b89332eced7b6fa68b68", size = 640520, upload-time = "2025-08-17T18:21:48.162Z" }, + { url = "https://files.pythonhosted.org/packages/57/07/f0e632bf783f915c1fdd0bf68614c4764cae9dd46ba32cbae4dd659592c3/zstandard-0.24.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:3f96a9130171e01dbb6c3d4d9925d604e2131a97f540e223b88ba45daf56d6fb", size = 5347682, upload-time = "2025-08-17T18:21:50.266Z" }, + { url = "https://files.pythonhosted.org/packages/a6/4c/63523169fe84773a7462cd090b0989cb7c7a7f2a8b0a5fbf00009ba7d74d/zstandard-0.24.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd0d3d16e63873253bad22b413ec679cf6586e51b5772eb10733899832efec42", size = 5057650, upload-time = "2025-08-17T18:21:52.634Z" }, + { url = "https://files.pythonhosted.org/packages/c6/16/49013f7ef80293f5cebf4c4229535a9f4c9416bbfd238560edc579815dbe/zstandard-0.24.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:b7a8c30d9bf4bd5e4dcfe26900bef0fcd9749acde45cdf0b3c89e2052fda9a13", size = 5404893, upload-time = "2025-08-17T18:21:54.54Z" }, + { url = "https://files.pythonhosted.org/packages/4d/38/78e8bcb5fc32a63b055f2b99e0be49b506f2351d0180173674f516cf8a7a/zstandard-0.24.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:52cd7d9fa0a115c9446abb79b06a47171b7d916c35c10e0c3aa6f01d57561382", size = 5452389, upload-time = "2025-08-17T18:21:56.822Z" }, + { url = "https://files.pythonhosted.org/packages/55/8a/81671f05619edbacd49bd84ce6899a09fc8299be20c09ae92f6618ccb92d/zstandard-0.24.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0f6fc2ea6e07e20df48752e7700e02e1892c61f9a6bfbacaf2c5b24d5ad504b", size = 5558888, upload-time = "2025-08-17T18:21:58.68Z" }, + { url = "https://files.pythonhosted.org/packages/49/cc/e83feb2d7d22d1f88434defbaeb6e5e91f42a4f607b5d4d2d58912b69d67/zstandard-0.24.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e46eb6702691b24ddb3e31e88b4a499e31506991db3d3724a85bd1c5fc3cfe4e", size = 5048038, upload-time = "2025-08-17T18:22:00.642Z" }, + { url = "https://files.pythonhosted.org/packages/08/c3/7a5c57ff49ef8943877f85c23368c104c2aea510abb339a2dc31ad0a27c3/zstandard-0.24.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5e3b9310fd7f0d12edc75532cd9a56da6293840c84da90070d692e0bb15f186", size = 5573833, upload-time = "2025-08-17T18:22:02.402Z" }, + { url = "https://files.pythonhosted.org/packages/f9/00/64519983cd92535ba4bdd4ac26ac52db00040a52d6c4efb8d1764abcc343/zstandard-0.24.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76cdfe7f920738ea871f035568f82bad3328cbc8d98f1f6988264096b5264efd", size = 4961072, upload-time = "2025-08-17T18:22:04.384Z" }, + { url = "https://files.pythonhosted.org/packages/72/ab/3a08a43067387d22994fc87c3113636aa34ccd2914a4d2d188ce365c5d85/zstandard-0.24.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3f2fe35ec84908dddf0fbf66b35d7c2878dbe349552dd52e005c755d3493d61c", size = 5268462, upload-time = "2025-08-17T18:22:06.095Z" }, + { url = "https://files.pythonhosted.org/packages/49/cf/2abb3a1ad85aebe18c53e7eca73223f1546ddfa3bf4d2fb83fc5a064c5ca/zstandard-0.24.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:aa705beb74ab116563f4ce784fa94771f230c05d09ab5de9c397793e725bb1db", size = 5443319, upload-time = "2025-08-17T18:22:08.572Z" }, + { url = "https://files.pythonhosted.org/packages/40/42/0dd59fc2f68f1664cda11c3b26abdf987f4e57cb6b6b0f329520cd074552/zstandard-0.24.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:aadf32c389bb7f02b8ec5c243c38302b92c006da565e120dfcb7bf0378f4f848", size = 5822355, upload-time = "2025-08-17T18:22:10.537Z" }, + { url = "https://files.pythonhosted.org/packages/99/c0/ea4e640fd4f7d58d6f87a1e7aca11fb886ac24db277fbbb879336c912f63/zstandard-0.24.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e40cd0fc734aa1d4bd0e7ad102fd2a1aefa50ce9ef570005ffc2273c5442ddc3", size = 5365257, upload-time = "2025-08-17T18:22:13.159Z" }, + { url = "https://files.pythonhosted.org/packages/27/a9/92da42a5c4e7e4003271f2e1f0efd1f37cfd565d763ad3604e9597980a1c/zstandard-0.24.0-cp311-cp311-win32.whl", hash = "sha256:cda61c46343809ecda43dc620d1333dd7433a25d0a252f2dcc7667f6331c7b61", size = 435559, upload-time = "2025-08-17T18:22:17.29Z" }, + { url = "https://files.pythonhosted.org/packages/e2/8e/2c8e5c681ae4937c007938f954a060fa7c74f36273b289cabdb5ef0e9a7e/zstandard-0.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:3b95fc06489aa9388400d1aab01a83652bc040c9c087bd732eb214909d7fb0dd", size = 505070, upload-time = "2025-08-17T18:22:14.808Z" }, + { url = "https://files.pythonhosted.org/packages/52/10/a2f27a66bec75e236b575c9f7b0d7d37004a03aa2dcde8e2decbe9ed7b4d/zstandard-0.24.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad9fd176ff6800a0cf52bcf59c71e5de4fa25bf3ba62b58800e0f84885344d34", size = 461507, upload-time = "2025-08-17T18:22:15.964Z" }, + { url = "https://files.pythonhosted.org/packages/26/e9/0bd281d9154bba7fc421a291e263911e1d69d6951aa80955b992a48289f6/zstandard-0.24.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a2bda8f2790add22773ee7a4e43c90ea05598bffc94c21c40ae0a9000b0133c3", size = 795710, upload-time = "2025-08-17T18:22:19.189Z" }, + { url = "https://files.pythonhosted.org/packages/36/26/b250a2eef515caf492e2d86732e75240cdac9d92b04383722b9753590c36/zstandard-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cc76de75300f65b8eb574d855c12518dc25a075dadb41dd18f6322bda3fe15d5", size = 640336, upload-time = "2025-08-17T18:22:20.466Z" }, + { url = "https://files.pythonhosted.org/packages/79/bf/3ba6b522306d9bf097aac8547556b98a4f753dc807a170becaf30dcd6f01/zstandard-0.24.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:d2b3b4bda1a025b10fe0269369475f420177f2cb06e0f9d32c95b4873c9f80b8", size = 5342533, upload-time = "2025-08-17T18:22:22.326Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ec/22bc75bf054e25accdf8e928bc68ab36b4466809729c554ff3a1c1c8bce6/zstandard-0.24.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b84c6c210684286e504022d11ec294d2b7922d66c823e87575d8b23eba7c81f", size = 5062837, upload-time = "2025-08-17T18:22:24.416Z" }, + { url = "https://files.pythonhosted.org/packages/48/cc/33edfc9d286e517fb5b51d9c3210e5bcfce578d02a675f994308ca587ae1/zstandard-0.24.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c59740682a686bf835a1a4d8d0ed1eefe31ac07f1c5a7ed5f2e72cf577692b00", size = 5393855, upload-time = "2025-08-17T18:22:26.786Z" }, + { url = "https://files.pythonhosted.org/packages/73/36/59254e9b29da6215fb3a717812bf87192d89f190f23817d88cb8868c47ac/zstandard-0.24.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6324fde5cf5120fbf6541d5ff3c86011ec056e8d0f915d8e7822926a5377193a", size = 5451058, upload-time = "2025-08-17T18:22:28.885Z" }, + { url = "https://files.pythonhosted.org/packages/9a/c7/31674cb2168b741bbbe71ce37dd397c9c671e73349d88ad3bca9e9fae25b/zstandard-0.24.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51a86bd963de3f36688553926a84e550d45d7f9745bd1947d79472eca27fcc75", size = 5546619, upload-time = "2025-08-17T18:22:31.115Z" }, + { url = "https://files.pythonhosted.org/packages/e6/01/1a9f22239f08c00c156f2266db857545ece66a6fc0303d45c298564bc20b/zstandard-0.24.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d82ac87017b734f2fb70ff93818c66f0ad2c3810f61040f077ed38d924e19980", size = 5046676, upload-time = "2025-08-17T18:22:33.077Z" }, + { url = "https://files.pythonhosted.org/packages/a7/91/6c0cf8fa143a4988a0361380ac2ef0d7cb98a374704b389fbc38b5891712/zstandard-0.24.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92ea7855d5bcfb386c34557516c73753435fb2d4a014e2c9343b5f5ba148b5d8", size = 5576381, upload-time = "2025-08-17T18:22:35.391Z" }, + { url = "https://files.pythonhosted.org/packages/e2/77/1526080e22e78871e786ccf3c84bf5cec9ed25110a9585507d3c551da3d6/zstandard-0.24.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3adb4b5414febf074800d264ddf69ecade8c658837a83a19e8ab820e924c9933", size = 4953403, upload-time = "2025-08-17T18:22:37.266Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d0/a3a833930bff01eab697eb8abeafb0ab068438771fa066558d96d7dafbf9/zstandard-0.24.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6374feaf347e6b83ec13cc5dcfa70076f06d8f7ecd46cc71d58fac798ff08b76", size = 5267396, upload-time = "2025-08-17T18:22:39.757Z" }, + { url = "https://files.pythonhosted.org/packages/f3/5e/90a0db9a61cd4769c06374297ecfcbbf66654f74cec89392519deba64d76/zstandard-0.24.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:13fc548e214df08d896ee5f29e1f91ee35db14f733fef8eabea8dca6e451d1e2", size = 5433269, upload-time = "2025-08-17T18:22:42.131Z" }, + { url = "https://files.pythonhosted.org/packages/ce/58/fc6a71060dd67c26a9c5566e0d7c99248cbe5abfda6b3b65b8f1a28d59f7/zstandard-0.24.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0a416814608610abf5488889c74e43ffa0343ca6cf43957c6b6ec526212422da", size = 5814203, upload-time = "2025-08-17T18:22:44.017Z" }, + { url = "https://files.pythonhosted.org/packages/5c/6a/89573d4393e3ecbfa425d9a4e391027f58d7810dec5cdb13a26e4cdeef5c/zstandard-0.24.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0d66da2649bb0af4471699aeb7a83d6f59ae30236fb9f6b5d20fb618ef6c6777", size = 5359622, upload-time = "2025-08-17T18:22:45.802Z" }, + { url = "https://files.pythonhosted.org/packages/60/ff/2cbab815d6f02a53a9d8d8703bc727d8408a2e508143ca9af6c3cca2054b/zstandard-0.24.0-cp312-cp312-win32.whl", hash = "sha256:ff19efaa33e7f136fe95f9bbcc90ab7fb60648453b03f95d1de3ab6997de0f32", size = 435968, upload-time = "2025-08-17T18:22:49.493Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a3/8f96b8ddb7ad12344218fbd0fd2805702dafd126ae9f8a1fb91eef7b33da/zstandard-0.24.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc05f8a875eb651d1cc62e12a4a0e6afa5cd0cc231381adb830d2e9c196ea895", size = 505195, upload-time = "2025-08-17T18:22:47.193Z" }, + { url = "https://files.pythonhosted.org/packages/a3/4a/bfca20679da63bfc236634ef2e4b1b4254203098b0170e3511fee781351f/zstandard-0.24.0-cp312-cp312-win_arm64.whl", hash = "sha256:b04c94718f7a8ed7cdd01b162b6caa1954b3c9d486f00ecbbd300f149d2b2606", size = 461605, upload-time = "2025-08-17T18:22:48.317Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ef/db949de3bf81ed122b8ee4db6a8d147a136fe070e1015f5a60d8a3966748/zstandard-0.24.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e4ebb000c0fe24a6d0f3534b6256844d9dbf042fdf003efe5cf40690cf4e0f3e", size = 795700, upload-time = "2025-08-17T18:22:50.851Z" }, + { url = "https://files.pythonhosted.org/packages/99/56/fc04395d6f5eabd2fe6d86c0800d198969f3038385cb918bfbe94f2b0c62/zstandard-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:498f88f5109666c19531f0243a90d2fdd2252839cd6c8cc6e9213a3446670fa8", size = 640343, upload-time = "2025-08-17T18:22:51.999Z" }, + { url = "https://files.pythonhosted.org/packages/9b/0f/0b0e0d55f2f051d5117a0d62f4f9a8741b3647440c0ee1806b7bd47ed5ae/zstandard-0.24.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0a9e95ceb180ccd12a8b3437bac7e8a8a089c9094e39522900a8917745542184", size = 5342571, upload-time = "2025-08-17T18:22:53.734Z" }, + { url = "https://files.pythonhosted.org/packages/5d/43/d74e49f04fbd62d4b5d89aeb7a29d693fc637c60238f820cd5afe6ca8180/zstandard-0.24.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bcf69e0bcddbf2adcfafc1a7e864edcc204dd8171756d3a8f3340f6f6cc87b7b", size = 5062723, upload-time = "2025-08-17T18:22:55.624Z" }, + { url = "https://files.pythonhosted.org/packages/8e/97/df14384d4d6a004388e6ed07ded02933b5c7e0833a9150c57d0abc9545b7/zstandard-0.24.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:10e284748a7e7fbe2815ca62a9d6e84497d34cfdd0143fa9e8e208efa808d7c4", size = 5393282, upload-time = "2025-08-17T18:22:57.655Z" }, + { url = "https://files.pythonhosted.org/packages/7e/09/8f5c520e59a4d41591b30b7568595eda6fd71c08701bb316d15b7ed0613a/zstandard-0.24.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1bda8a85e5b9d5e73af2e61b23609a8cc1598c1b3b2473969912979205a1ff25", size = 5450895, upload-time = "2025-08-17T18:22:59.749Z" }, + { url = "https://files.pythonhosted.org/packages/d9/3d/02aba892327a67ead8cba160ee835cfa1fc292a9dcb763639e30c07da58b/zstandard-0.24.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1b14bc92af065d0534856bf1b30fc48753163ea673da98857ea4932be62079b1", size = 5546353, upload-time = "2025-08-17T18:23:01.457Z" }, + { url = "https://files.pythonhosted.org/packages/6a/6e/96c52afcde44da6a5313a1f6c356349792079808f12d8b69a7d1d98ef353/zstandard-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:b4f20417a4f511c656762b001ec827500cbee54d1810253c6ca2df2c0a307a5f", size = 5046404, upload-time = "2025-08-17T18:23:03.418Z" }, + { url = "https://files.pythonhosted.org/packages/da/b6/eefee6b92d341a7db7cd1b3885d42d30476a093720fb5c181e35b236d695/zstandard-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:337572a7340e1d92fd7fb5248c8300d0e91071002d92e0b8cabe8d9ae7b58159", size = 5576095, upload-time = "2025-08-17T18:23:05.331Z" }, + { url = "https://files.pythonhosted.org/packages/a3/29/743de3131f6239ba6611e17199581e6b5e0f03f268924d42468e29468ca0/zstandard-0.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:df4be1cf6e8f0f2bbe2a3eabfff163ef592c84a40e1a20a8d7db7f27cfe08fc2", size = 4953448, upload-time = "2025-08-17T18:23:07.225Z" }, + { url = "https://files.pythonhosted.org/packages/c9/11/bd36ef49fba82e307d69d93b5abbdcdc47d6a0bcbc7ffbbfe0ef74c2fec5/zstandard-0.24.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6885ae4b33aee8835dbdb4249d3dfec09af55e705d74d9b660bfb9da51baaa8b", size = 5267388, upload-time = "2025-08-17T18:23:09.127Z" }, + { url = "https://files.pythonhosted.org/packages/c0/23/a4cfe1b871d3f1ce1f88f5c68d7e922e94be0043f3ae5ed58c11578d1e21/zstandard-0.24.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:663848a8bac4fdbba27feea2926049fdf7b55ec545d5b9aea096ef21e7f0b079", size = 5433383, upload-time = "2025-08-17T18:23:11.343Z" }, + { url = "https://files.pythonhosted.org/packages/77/26/f3fb85f00e732cca617d4b9cd1ffa6484f613ea07fad872a8bdc3a0ce753/zstandard-0.24.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:05d27c953f2e0a3ecc8edbe91d6827736acc4c04d0479672e0400ccdb23d818c", size = 5813988, upload-time = "2025-08-17T18:23:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/3d/8c/d7e3b424b73f3ce66e754595cbcb6d94ff49790c9ac37d50e40e8145cd44/zstandard-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77b8b7b98893eaf47da03d262816f01f251c2aa059c063ed8a45c50eada123a5", size = 5359756, upload-time = "2025-08-17T18:23:15.021Z" }, + { url = "https://files.pythonhosted.org/packages/90/6c/f1f0e11f1b295138f9da7e7ae22dcd9a1bb96a9544fa3b31507e431288f5/zstandard-0.24.0-cp313-cp313-win32.whl", hash = "sha256:cf7fbb4e54136e9a03c7ed7691843c4df6d2ecc854a2541f840665f4f2bb2edd", size = 435957, upload-time = "2025-08-17T18:23:18.835Z" }, + { url = "https://files.pythonhosted.org/packages/9f/03/ab8b82ae5eb49eca4d3662705399c44442666cc1ce45f44f2d263bb1ae31/zstandard-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:d64899cc0f33a8f446f1e60bffc21fa88b99f0e8208750d9144ea717610a80ce", size = 505171, upload-time = "2025-08-17T18:23:16.44Z" }, + { url = "https://files.pythonhosted.org/packages/db/12/89a2ecdea4bc73a934a30b66a7cfac5af352beac94d46cf289e103b65c34/zstandard-0.24.0-cp313-cp313-win_arm64.whl", hash = "sha256:57be3abb4313e0dd625596376bbb607f40059d801d51c1a1da94d7477e63b255", size = 461596, upload-time = "2025-08-17T18:23:17.603Z" }, + { url = "https://files.pythonhosted.org/packages/c9/56/f3d2c4d64aacee4aab89e788783636884786b6f8334c819f09bff1aa207b/zstandard-0.24.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b7fa260dd2731afd0dfa47881c30239f422d00faee4b8b341d3e597cface1483", size = 795747, upload-time = "2025-08-17T18:23:19.968Z" }, + { url = "https://files.pythonhosted.org/packages/32/2d/9d3e5f6627e4cb5e511803788be1feee2f0c3b94594591e92b81db324253/zstandard-0.24.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e05d66239d14a04b4717998b736a25494372b1b2409339b04bf42aa4663bf251", size = 640475, upload-time = "2025-08-17T18:23:21.5Z" }, + { url = "https://files.pythonhosted.org/packages/be/5d/48e66abf8c146d95330e5385633a8cfdd556fa8bd14856fe721590cbab2b/zstandard-0.24.0-cp314-cp314-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:622e1e04bd8a085994e02313ba06fbcf4f9ed9a488c6a77a8dbc0692abab6a38", size = 5343866, upload-time = "2025-08-17T18:23:23.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/6c/65fe7ba71220a551e082e4a52790487f1d6bb8dfc2156883e088f975ad6d/zstandard-0.24.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:55872e818598319f065e8192ebefecd6ac05f62a43f055ed71884b0a26218f41", size = 5062719, upload-time = "2025-08-17T18:23:25.192Z" }, + { url = "https://files.pythonhosted.org/packages/cb/68/15ed0a813ff91be80cc2a610ac42e0fc8d29daa737de247bbf4bab9429a1/zstandard-0.24.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bb2446a55b3a0fd8aa02aa7194bd64740015464a2daaf160d2025204e1d7c282", size = 5393090, upload-time = "2025-08-17T18:23:27.145Z" }, + { url = "https://files.pythonhosted.org/packages/d4/89/e560427b74fa2da6a12b8f3af8ee29104fe2bb069a25e7d314c35eec7732/zstandard-0.24.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2825a3951f945fb2613ded0f517d402b1e5a68e87e0ee65f5bd224a8333a9a46", size = 5450383, upload-time = "2025-08-17T18:23:29.044Z" }, + { url = "https://files.pythonhosted.org/packages/a3/95/0498328cbb1693885509f2fc145402b108b750a87a3af65b7250b10bd896/zstandard-0.24.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:09887301001e7a81a3618156bc1759e48588de24bddfdd5b7a4364da9a8fbc20", size = 5546142, upload-time = "2025-08-17T18:23:31.281Z" }, + { url = "https://files.pythonhosted.org/packages/8a/8a/64aa15a726594df3bf5d8decfec14fe20cd788c60890f44fcfc74d98c2cc/zstandard-0.24.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:98ca91dc9602cf351497d5600aa66e6d011a38c085a8237b370433fcb53e3409", size = 4953456, upload-time = "2025-08-17T18:23:33.234Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b6/e94879c5cd6017af57bcba08519ed1228b1ebb15681efd949f4a00199449/zstandard-0.24.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:e69f8e534b4e254f523e2f9d4732cf9c169c327ca1ce0922682aac9a5ee01155", size = 5268287, upload-time = "2025-08-17T18:23:35.145Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e5/1a3b3a93f953dbe9e77e2a19be146e9cd2af31b67b1419d6cc8e8898d409/zstandard-0.24.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:444633b487a711e34f4bccc46a0c5dfbe1aee82c1a511e58cdc16f6bd66f187c", size = 5433197, upload-time = "2025-08-17T18:23:36.969Z" }, + { url = "https://files.pythonhosted.org/packages/39/83/b6eb1e1181de994b29804e1e0d2dc677bece4177f588c71653093cb4f6d5/zstandard-0.24.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f7d3fe9e1483171e9183ffdb1fab07c5fef80a9c3840374a38ec2ab869ebae20", size = 5813161, upload-time = "2025-08-17T18:23:38.812Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d3/2fb4166561591e9d75e8e35c79182aa9456644e2f4536f29e51216d1c513/zstandard-0.24.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:27b6fa72b57824a3f7901fc9cc4ce1c1c834b28f3a43d1d4254c64c8f11149d4", size = 5359831, upload-time = "2025-08-17T18:23:41.162Z" }, + { url = "https://files.pythonhosted.org/packages/11/94/6a9227315b774f64a67445f62152c69b4e5e49a52a3c7c4dad8520a55e20/zstandard-0.24.0-cp314-cp314-win32.whl", hash = "sha256:fdc7a52a4cdaf7293e10813fd6a3abc0c7753660db12a3b864ab1fb5a0c60c16", size = 444448, upload-time = "2025-08-17T18:23:45.151Z" }, + { url = "https://files.pythonhosted.org/packages/fc/de/67acaba311013e0798cb96d1a2685cb6edcdfc1cae378b297ea7b02c319f/zstandard-0.24.0-cp314-cp314-win_amd64.whl", hash = "sha256:656ed895b28c7e42dd5b40dfcea3217cfc166b6b7eef88c3da2f5fc62484035b", size = 516075, upload-time = "2025-08-17T18:23:42.8Z" }, + { url = "https://files.pythonhosted.org/packages/10/ae/45fd8921263cea0228b20aa31bce47cc66016b2aba1afae1c6adcc3dbb1f/zstandard-0.24.0-cp314-cp314-win_arm64.whl", hash = "sha256:0101f835da7de08375f380192ff75135527e46e3f79bef224e3c49cb640fef6a", size = 476847, upload-time = "2025-08-17T18:23:43.892Z" }, +] diff --git a/products/mcp/schema/tool-definitions.json b/products/mcp/schema/tool-definitions.json new file mode 100644 index 0000000000..195def3c49 --- /dev/null +++ b/products/mcp/schema/tool-definitions.json @@ -0,0 +1,618 @@ +{ + "add-insight-to-dashboard": { + "description": "Add an existing insight to a dashboard. Requires insight ID and dashboard ID. Optionally supports layout and color customization.", + "category": "Dashboards", + "feature": "dashboards", + "summary": "Add an existing insight to a dashboard.", + "title": "Add insight to dashboard", + "required_scopes": ["dashboard:write"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "dashboard-create": { + "description": "Create a new dashboard in the project. Requires name and optional description, tags, and other properties.", + "category": "Dashboards", + "feature": "dashboards", + "summary": "Create a new dashboard in the project.", + "title": "Create dashboard", + "required_scopes": ["dashboard:write"], + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "dashboard-delete": { + "description": "Delete a dashboard by ID (soft delete - marks as deleted).", + "category": "Dashboards", + "feature": "dashboards", + "summary": "Delete a dashboard by ID.", + "title": "Delete dashboard", + "required_scopes": ["dashboard:write"], + "annotations": { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "dashboard-get": { + "description": "Get a specific dashboard by ID. The response will include insights / tiles that are on the dashboard.", + "category": "Dashboards", + "feature": "dashboards", + "summary": "Get a specific dashboard by ID, including insights that are on the dashboard.", + "title": "Get dashboard", + "required_scopes": ["dashboard:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "dashboards-get-all": { + "description": "Get all dashboards in the project with optional filtering. Can filter by pinned status, search term, or pagination.", + "category": "Dashboards", + "feature": "dashboards", + "summary": "Get all dashboards in the project with optional filtering.", + "title": "Get all dashboards", + "required_scopes": ["dashboard:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "dashboard-update": { + "description": "Update an existing dashboard by ID. Can update name, description, pinned status or tags.", + "category": "Dashboards", + "feature": "dashboards", + "summary": "Update an existing dashboard by ID.", + "title": "Update dashboard", + "required_scopes": ["dashboard:write"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "docs-search": { + "description": "Use this tool to search the PostHog documentation for information that can help the user with their request. Use it as a fallback when you cannot answer the user's request using other tools in this MCP. Only use this tool for PostHog related questions.", + "category": "Documentation", + "feature": "docs", + "summary": "Search the PostHog documentation for information.", + "title": "Search docs", + "required_scopes": [], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "error-details": { + "description": "Use this tool to get the details of an error in the project.", + "category": "Error tracking", + "feature": "error-tracking", + "summary": "Get the details of an error in the project.", + "title": "Get error details", + "required_scopes": ["error_tracking:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "list-errors": { + "description": "Use this tool to list errors in the project.", + "category": "Error tracking", + "feature": "error-tracking", + "summary": "List errors in the project.", + "title": "List errors", + "required_scopes": ["error_tracking:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "create-feature-flag": { + "description": "Creates a new feature flag in the project. Once you have created a feature flag, you should: Ask the user if they want to add it to their codebase, Use the \"search-docs\" tool to find documentation on how to add feature flags to the codebase (search for the right language / framework), Clarify where it should be added and then add it.", + "category": "Feature flags", + "feature": "flags", + "summary": "Creates a new feature flag in the project.", + "title": "Create feature flag", + "required_scopes": ["feature_flag:write"], + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "delete-feature-flag": { + "description": "Delete a feature flag in the project.", + "category": "Feature flags", + "feature": "flags", + "summary": "Delete a feature flag in the project.", + "title": "Delete feature flag", + "required_scopes": ["feature_flag:write"], + "annotations": { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "feature-flag-get-all": { + "description": "Get all feature flags in the project.", + "category": "Feature flags", + "feature": "flags", + "summary": "Get all feature flags in the project.", + "title": "Get all feature flags", + "required_scopes": ["feature_flag:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "feature-flag-get-definition": { + "description": "Get the definition of a feature flag. You can provide either the flagId or the flagKey. If you provide both, the flagId will be used.", + "category": "Feature flags", + "feature": "flags", + "summary": "Get the definition of a feature flag.", + "title": "Get feature flag definition", + "required_scopes": ["feature_flag:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "update-feature-flag": { + "description": "Update a new feature flag in the project. To enable a feature flag, you should make sure it is active and the rollout percentage is set to 100 for the group you want to target. To disable a feature flag, you should make sure it is inactive, you can keep the rollout percentage as it is.", + "category": "Feature flags", + "feature": "flags", + "summary": "Update a feature flag in the project.", + "title": "Update feature flag", + "required_scopes": ["feature_flag:write"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "experiment-get-all": { + "description": "Get all experiments in the project.", + "category": "Experiments", + "feature": "experiments", + "summary": "Get all experiments in the project.", + "title": "Get all experiments", + "required_scopes": ["experiment:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "experiment-create": { + "description": "Create a comprehensive A/B test experiment. PROCESS: 1) Understand experiment goal and hypothesis 2) Search existing feature flags with 'feature-flags-get-all' tool first and suggest reuse or new key 3) Help user define success metrics by asking what they want to optimize 4) MOST IMPORTANT: Use 'event-definitions-list' tool to find available events in their project 5) For funnel metrics, ask for specific event sequence (e.g., ['product_view', 'add_to_cart', 'purchase']) and use funnel_steps parameter 6) Configure variants (default 50/50 control/test unless they specify otherwise) 7) Set targeting criteria if needed.", + "category": "Experiments", + "feature": "experiments", + "summary": "Create A/B test experiment with guided metric and feature flag setup", + "title": "Create experiment", + "required_scopes": ["experiment:write"], + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "experiment-delete": { + "description": "Delete an experiment by ID.", + "category": "Experiments", + "feature": "experiments", + "summary": "Delete an experiment by ID.", + "title": "Delete experiment", + "required_scopes": ["experiment:write"], + "annotations": { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "experiment-update": { + "description": "Update an existing experiment by ID. Can update name, description, lifecycle state, variants, metrics, and other properties. RESTART WORKFLOW: To restart a concluded experiment, set end_date=null, conclusion=null, conclusion_comment=null, and optionally set a new start_date. To make it draft again, also set start_date=null. COMMON PATTERNS: Launch draft (set start_date), stop running (set end_date + conclusion), archive (set archived=true), modify variants (update parameters.feature_flag_variants). NOTE: feature_flag_key cannot be changed after creation.", + "category": "Experiments", + "feature": "experiments", + "summary": "Update an existing experiment with lifecycle management and restart capability.", + "title": "Update experiment", + "required_scopes": ["experiment:write"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "experiment-get": { + "description": "Get details of a specific experiment by ID.", + "category": "Experiments", + "feature": "experiments", + "summary": "Get details of a specific experiment.", + "title": "Get experiment details", + "required_scopes": ["experiment:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "experiment-results-get": { + "description": "Get comprehensive experiment results including all metrics data (primary and secondary) and exposure data. This tool fetches the experiment details and executes the necessary queries to get complete experiment results. Only works with new experiments (not legacy experiments).", + "category": "Experiments", + "feature": "experiments", + "summary": "Get comprehensive experiment results including metrics and exposure data.", + "title": "Get experiment results", + "required_scopes": ["experiment:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "insight-create-from-query": { + "description": "Create an insight from a query that you have previously tested with 'query-run'. You should check the query runs, before creating an insight. Do not create an insight before running the query, unless you know already that it is correct (e.g. you are making a minor modification to an existing query you have seen).", + "category": "Insights & analytics", + "feature": "insights", + "summary": "Save a query as an insight.", + "title": "Create insight from query", + "required_scopes": ["insight:write"], + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "insight-delete": { + "description": "Delete an insight by ID (soft delete - marks as deleted).", + "category": "Insights & analytics", + "feature": "insights", + "summary": "Delete an insight by ID.", + "title": "Delete insight", + "required_scopes": ["insight:write"], + "annotations": { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "insight-get": { + "description": "Get a specific insight by ID.", + "category": "Insights & analytics", + "feature": "insights", + "summary": "Get a specific insight by ID.", + "title": "Get insight", + "required_scopes": ["insight:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "insight-query": { + "description": "Execute a query on an existing insight to get its results/data. Provide the insight ID to retrieve the current query results.", + "category": "Insights & analytics", + "feature": "insights", + "summary": "Execute a query on an existing insight to get its results/data.", + "title": "Query insight", + "required_scopes": ["query:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "insights-get-all": { + "description": "Get all insights in the project with optional filtering. Can filter by saved status, favorited status, or search term.", + "category": "Insights & analytics", + "feature": "insights", + "summary": "Get all insights in the project with optional filtering.", + "title": "Get all insights", + "required_scopes": ["insight:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "insight-update": { + "description": "Update an existing insight by ID. Can update name, description, filters, and other properties. You should get the insight before update it to see it's current query structure, and only modify the parts needed to answer the user's request.", + "category": "Insights & analytics", + "feature": "insights", + "summary": "Update an existing insight by ID.", + "title": "Update insight", + "required_scopes": ["insight:write"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "query-run": { + "description": "You should use this to answer questions that a user has about their data and for when you want to create a new insight. You can use 'event-definitions-list' to get events to use in the query, and 'event-properties-list' to get properties for those events. It can run a trend, funnel or HogQL query. Where possible, use a trend or funnel rather than a HogQL query, unless you know the HogQL is correct (e.g. it came from a previous insight.).", + "category": "Insights & analytics", + "summary": "Run a trend, funnel or HogQL query.", + "feature": "insights", + "title": "Run query", + "required_scopes": ["query:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "query-generate-hogql-from-question": { + "description": "This is a slow tool, and you should only use it once you have tried to create a query using the 'query-run' tool, or the query is too complicated to create a trend / funnel. Queries project's PostHog data based on a provided natural language question - don't provide SQL query as input but describe the output you want. When giving the results back to the user, first show the SQL query that was used, then provide results in reasily readable format. You should also offer to save the query as an insight if the user wants to.", + "category": "Insights & analytics", + "summary": "Queries project's PostHog data based on a provided natural language question.", + "feature": "insights", + "title": "Generate SQL", + "required_scopes": ["query:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "get-llm-total-costs-for-project": { + "description": "Fetches the total LLM daily costs for each model for a project over a given number of days. If no number of days is provided, it defaults to 7. The results are sorted by model name. The total cost is rounded to 4 decimal places. The query is executed against the project's data warehouse. Show the results as a Markdown formatted table with the following information for each model: Model name, Total cost in USD, Each day's date, Each day's cost in USD. Write in bold the model name with the highest total cost. Properly render the markdown table in the response.", + "category": "LLM analytics", + "feature": "llm-analytics", + "summary": "Fetches the total LLM daily costs for each model for a project over a given number of days.", + "title": "Get LLM costs", + "required_scopes": ["warehouse_table:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "organization-details-get": { + "description": "Get the details of the active organization.", + "category": "Organization & project management", + "feature": "workspace", + "summary": "Get the details of the active organization.", + "title": "Get organization details", + "required_scopes": ["organization:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "organizations-get": { + "description": "Get the organizations the user has access to.", + "category": "Organization & project management", + "feature": "workspace", + "summary": "Get the organizations the user has access to.", + "title": "Get organizations", + "required_scopes": ["user:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "switch-organization": { + "description": "Change the active organization from the default organization. You should only use this tool if the user asks you to change the organization - otherwise, the default organization will be used.", + "category": "Organization & project management", + "feature": "workspace", + "summary": "Change the active organization from the default organization.", + "title": "Switch active organization", + "required_scopes": ["organization:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "projects-get": { + "description": "Fetches projects that the user has access to in the current organization.", + "category": "Organization & project management", + "feature": "workspace", + "summary": "Fetches projects that the user has access to in the current organization.", + "title": "Get projects", + "required_scopes": ["organization:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "event-definitions-list": { + "description": "List all event definitions in the project with optional filtering. Can filter by search term.", + "category": "Events & properties", + "feature": "events", + "summary": "List all event definitions in the project with optional filtering.", + "title": "List all events", + "required_scopes": ["event_definition:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "properties-list": { + "description": "List properties for events or persons. If fetching event properties, you must provide an event name.", + "category": "Events & properties", + "feature": "events", + "summary": "Get properties for events or persons.", + "title": "Get properties", + "required_scopes": ["property_definition:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "property-definitions": { + "description": "Get event and property definitions for the project.", + "category": "Organization & project management", + "feature": "workspace", + "summary": "Get event and property definitions for the project.", + "title": "Get property definitions", + "required_scopes": ["property_definition:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "switch-project": { + "description": "Change the active project from the default project. You should only use this tool if the user asks you to change the project - otherwise, the default project will be used.", + "category": "Organization & project management", + "feature": "workspace", + "summary": "Change the active project from the default project.", + "title": "Switch active project", + "required_scopes": ["project:read"], + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "survey-create": { + "description": "Creates a new survey in the project. Surveys can be popover or API-based and support various question types including open-ended, multiple choice, rating, and link questions. Once created, you should ask the user if they want to add the survey to their application code.", + "category": "Surveys", + "summary": "Creates a new survey in the project.", + "required_scopes": ["survey:write"], + "feature": "surveys", + "title": "Create survey", + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "survey-get": { + "description": "Get a specific survey by ID. Returns the survey configuration including questions, targeting, and scheduling details.", + "category": "Surveys", + "summary": "Get a specific survey by ID.", + "required_scopes": ["survey:read"], + "feature": "surveys", + "title": "Get survey", + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "surveys-get-all": { + "description": "Get all surveys in the project with optional filtering. Can filter by search term or use pagination.", + "category": "Surveys", + "summary": "Get all surveys in the project with optional filtering.", + "required_scopes": ["survey:read"], + "feature": "surveys", + "title": "Get all surveys", + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "survey-update": { + "description": "Update an existing survey by ID. Can update name, description, questions, scheduling, and other survey properties.", + "category": "Surveys", + "summary": "Update an existing survey by ID.", + "required_scopes": ["survey:write"], + "feature": "surveys", + "title": "Update survey", + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "survey-delete": { + "description": "Delete a survey by ID (soft delete - marks as archived).", + "category": "Surveys", + "summary": "Delete a survey by ID.", + "required_scopes": ["survey:write"], + "feature": "surveys", + "title": "Delete survey", + "annotations": { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false + } + }, + "surveys-global-stats": { + "description": "Get aggregated response statistics across all surveys in the project. Includes event counts (shown, dismissed, sent), unique respondents, conversion rates, and timing data. Supports optional date filtering.", + "category": "Surveys", + "summary": "Get aggregated response statistics across all surveys.", + "required_scopes": ["survey:read"], + "feature": "surveys", + "title": "Get all survey response stats", + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + "survey-stats": { + "description": "Get response statistics for a specific survey. Includes detailed event counts (shown, dismissed, sent), unique respondents, conversion rates, and timing data. Supports optional date filtering.", + "category": "Surveys", + "summary": "Get response statistics for a specific survey.", + "required_scopes": ["survey:read"], + "feature": "surveys", + "title": "Get survey response stats", + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + } +} diff --git a/products/mcp/schema/tool-inputs.json b/products/mcp/schema/tool-inputs.json new file mode 100644 index 0000000000..9369f6c2af --- /dev/null +++ b/products/mcp/schema/tool-inputs.json @@ -0,0 +1,4052 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "DashboardAddInsightSchema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "insightId": { + "type": "string" + }, + "dashboardId": { + "type": "integer", + "exclusiveMinimum": 0 + } + }, + "required": ["insightId", "dashboardId"], + "additionalProperties": false + } + }, + "required": ["data"], + "additionalProperties": false + }, + "DashboardCreateSchema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "pinned": { + "type": "boolean" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["name"], + "additionalProperties": false + } + }, + "required": ["data"], + "additionalProperties": false + }, + "DashboardDeleteSchema": { + "type": "object", + "properties": { + "dashboardId": { + "type": "number" + } + }, + "required": ["dashboardId"], + "additionalProperties": false + }, + "DashboardGetAllSchema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "limit": { + "type": "integer", + "exclusiveMinimum": 0 + }, + "offset": { + "type": "integer", + "minimum": 0 + }, + "search": { + "type": "string" + }, + "pinned": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "DashboardGetSchema": { + "type": "object", + "properties": { + "dashboardId": { + "type": "number" + } + }, + "required": ["dashboardId"], + "additionalProperties": false + }, + "DashboardUpdateSchema": { + "type": "object", + "properties": { + "dashboardId": { + "type": "number" + }, + "data": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "pinned": { + "type": "boolean" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "required": ["dashboardId", "data"], + "additionalProperties": false + }, + "DocumentationSearchSchema": { + "type": "object", + "properties": { + "query": { + "type": "string" + } + }, + "required": ["query"], + "additionalProperties": false + }, + "ErrorTrackingDetailsSchema": { + "type": "object", + "properties": { + "issueId": { + "type": "string", + "format": "uuid" + }, + "dateFrom": { + "type": "string", + "format": "date-time" + }, + "dateTo": { + "type": "string", + "format": "date-time" + } + }, + "required": ["issueId"], + "additionalProperties": false + }, + "ErrorTrackingListSchema": { + "type": "object", + "properties": { + "orderBy": { + "type": "string", + "enum": ["occurrences", "first_seen", "last_seen", "users", "sessions"] + }, + "dateFrom": { + "type": "string", + "format": "date-time" + }, + "dateTo": { + "type": "string", + "format": "date-time" + }, + "orderDirection": { + "type": "string", + "enum": ["ASC", "DESC"] + }, + "filterTestAccounts": { + "type": "boolean" + }, + "status": { + "type": "string", + "enum": ["active", "resolved", "all", "suppressed"] + } + }, + "additionalProperties": false + }, + "ExperimentCreateSchema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "description": "Experiment name - should clearly describe what is being tested" + }, + "description": { + "type": "string", + "description": "Detailed description of the experiment hypothesis, what changes are being tested, and expected outcomes" + }, + "feature_flag_key": { + "type": "string", + "description": "Feature flag key (letters, numbers, hyphens, underscores only). IMPORTANT: First search for existing feature flags that might be suitable using the feature-flags-get-all tool, then suggest reusing existing ones or creating a new key based on the experiment name" + }, + "type": { + "type": "string", + "enum": ["product", "web"], + "default": "product", + "description": "Experiment type: 'product' for backend/API changes, 'web' for frontend UI changes" + }, + "primary_metrics": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Human-readable metric name" + }, + "metric_type": { + "type": "string", + "enum": ["mean", "funnel", "ratio"], + "description": "Metric type: 'mean' for average values (revenue, time spent), 'funnel' for conversion flows, 'ratio' for comparing two metrics" + }, + "event_name": { + "type": "string", + "description": "REQUIRED for metrics to work: PostHog event name (e.g., '$pageview', 'add_to_cart', 'purchase'). For funnels, this is the first step. Use '$pageview' if unsure. Search project-property-definitions tool for available events." + }, + "funnel_steps": { + "type": "array", + "items": { + "type": "string" + }, + "description": "For funnel metrics only: Array of event names for each funnel step (e.g., ['product_view', 'add_to_cart', 'checkout', 'purchase'])" + }, + "properties": { + "type": "object", + "additionalProperties": {}, + "description": "Event properties to filter on" + }, + "description": { + "type": "string", + "description": "What this metric measures and why it's important for the experiment" + } + }, + "required": ["metric_type", "event_name"], + "additionalProperties": false + }, + "description": "Primary metrics to measure experiment success. IMPORTANT: Each metric needs event_name to track data. For funnels, provide funnel_steps array with event names for each step. Ask user what events they track, or use project-property-definitions to find available events." + }, + "secondary_metrics": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Human-readable metric name" + }, + "metric_type": { + "type": "string", + "enum": ["mean", "funnel", "ratio"], + "description": "Metric type: 'mean' for average values, 'funnel' for conversion flows, 'ratio' for comparing two metrics" + }, + "event_name": { + "type": "string", + "description": "REQUIRED: PostHog event name. Use '$pageview' if unsure." + }, + "funnel_steps": { + "type": "array", + "items": { + "type": "string" + }, + "description": "For funnel metrics only: Array of event names for each funnel step" + }, + "properties": { + "type": "object", + "additionalProperties": {}, + "description": "Event properties to filter on" + }, + "description": { + "type": "string", + "description": "What this secondary metric measures" + } + }, + "required": ["metric_type", "event_name"], + "additionalProperties": false + }, + "description": "Secondary metrics to monitor for potential side effects or additional insights. Each metric needs event_name." + }, + "variants": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "Variant key (e.g., 'control', 'variant_a', 'new_design')" + }, + "name": { + "type": "string", + "description": "Human-readable variant name" + }, + "rollout_percentage": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Percentage of users to show this variant" + } + }, + "required": ["key", "rollout_percentage"], + "additionalProperties": false + }, + "description": "Experiment variants. If not specified, defaults to 50/50 control/test split. Ask user how many variants they need and what each tests" + }, + "minimum_detectable_effect": { + "type": "number", + "default": 30, + "description": "Minimum detectable effect in percentage. Lower values require more users but detect smaller changes. Suggest 20-30% for most experiments" + }, + "filter_test_accounts": { + "type": "boolean", + "default": true, + "description": "Whether to filter out internal test accounts" + }, + "target_properties": { + "type": "object", + "additionalProperties": {}, + "description": "Properties to target specific user segments (e.g., country, subscription type)" + }, + "draft": { + "type": "boolean", + "default": true, + "description": "Create as draft (true) or launch immediately (false). Recommend draft for review first" + }, + "holdout_id": { + "type": "number", + "description": "Holdout group ID if this experiment should exclude users from other experiments" + } + }, + "required": ["name", "feature_flag_key"], + "additionalProperties": false + }, + "ExperimentDeleteSchema": { + "type": "object", + "properties": { + "experimentId": { + "type": "number", + "description": "The ID of the experiment to delete" + } + }, + "required": ["experimentId"], + "additionalProperties": false + }, + "ExperimentGetAllSchema": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "ExperimentGetSchema": { + "type": "object", + "properties": { + "experimentId": { + "type": "number", + "description": "The ID of the experiment to retrieve" + } + }, + "required": ["experimentId"], + "additionalProperties": false + }, + "ExperimentResultsGetSchema": { + "type": "object", + "properties": { + "experimentId": { + "type": "number", + "description": "The ID of the experiment to get comprehensive results for" + }, + "refresh": { + "type": "boolean", + "description": "Force refresh of results instead of using cached values" + } + }, + "required": ["experimentId", "refresh"], + "additionalProperties": false + }, + "ExperimentUpdateInputSchema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Update experiment name" + }, + "description": { + "type": "string", + "description": "Update experiment description" + }, + "primary_metrics": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Human-readable metric name" + }, + "metric_type": { + "type": "string", + "enum": ["mean", "funnel", "ratio"], + "description": "Metric type: 'mean' for average values, 'funnel' for conversion flows, 'ratio' for comparing two metrics" + }, + "event_name": { + "type": "string", + "description": "PostHog event name (e.g., '$pageview', 'add_to_cart', 'purchase')" + }, + "funnel_steps": { + "type": "array", + "items": { + "type": "string" + }, + "description": "For funnel metrics only: Array of event names for each funnel step" + }, + "properties": { + "type": "object", + "additionalProperties": {}, + "description": "Event properties to filter on" + }, + "description": { + "type": "string", + "description": "What this metric measures" + } + }, + "required": ["metric_type", "event_name"], + "additionalProperties": false + }, + "description": "Update primary metrics" + }, + "secondary_metrics": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Human-readable metric name" + }, + "metric_type": { + "type": "string", + "enum": ["mean", "funnel", "ratio"], + "description": "Metric type" + }, + "event_name": { + "type": "string", + "description": "PostHog event name" + }, + "funnel_steps": { + "type": "array", + "items": { + "type": "string" + }, + "description": "For funnel metrics only: Array of event names" + }, + "properties": { + "type": "object", + "additionalProperties": {}, + "description": "Event properties to filter on" + }, + "description": { + "type": "string", + "description": "What this metric measures" + } + }, + "required": ["metric_type", "event_name"], + "additionalProperties": false + }, + "description": "Update secondary metrics" + }, + "minimum_detectable_effect": { + "type": "number", + "description": "Update minimum detectable effect in percentage" + }, + "launch": { + "type": "boolean", + "description": "Launch experiment (set start_date) or keep as draft" + }, + "conclude": { + "type": "string", + "enum": ["won", "lost", "inconclusive", "stopped_early", "invalid"], + "description": "Conclude experiment with result" + }, + "conclusion_comment": { + "type": "string", + "description": "Comment about experiment conclusion" + }, + "restart": { + "type": "boolean", + "description": "Restart concluded experiment (clears end_date and conclusion)" + }, + "archive": { + "type": "boolean", + "description": "Archive or unarchive experiment" + } + }, + "additionalProperties": false + }, + "ExperimentUpdateSchema": { + "type": "object", + "properties": { + "experimentId": { + "type": "number", + "description": "The ID of the experiment to update" + }, + "data": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Update experiment name" + }, + "description": { + "type": "string", + "description": "Update experiment description" + }, + "primary_metrics": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Human-readable metric name" + }, + "metric_type": { + "type": "string", + "enum": ["mean", "funnel", "ratio"], + "description": "Metric type: 'mean' for average values, 'funnel' for conversion flows, 'ratio' for comparing two metrics" + }, + "event_name": { + "type": "string", + "description": "PostHog event name (e.g., '$pageview', 'add_to_cart', 'purchase')" + }, + "funnel_steps": { + "type": "array", + "items": { + "type": "string" + }, + "description": "For funnel metrics only: Array of event names for each funnel step" + }, + "properties": { + "type": "object", + "additionalProperties": {}, + "description": "Event properties to filter on" + }, + "description": { + "type": "string", + "description": "What this metric measures" + } + }, + "required": ["metric_type", "event_name"], + "additionalProperties": false + }, + "description": "Update primary metrics" + }, + "secondary_metrics": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Human-readable metric name" + }, + "metric_type": { + "type": "string", + "enum": ["mean", "funnel", "ratio"], + "description": "Metric type" + }, + "event_name": { + "type": "string", + "description": "PostHog event name" + }, + "funnel_steps": { + "type": "array", + "items": { + "type": "string" + }, + "description": "For funnel metrics only: Array of event names" + }, + "properties": { + "type": "object", + "additionalProperties": {}, + "description": "Event properties to filter on" + }, + "description": { + "type": "string", + "description": "What this metric measures" + } + }, + "required": ["metric_type", "event_name"], + "additionalProperties": false + }, + "description": "Update secondary metrics" + }, + "minimum_detectable_effect": { + "type": "number", + "description": "Update minimum detectable effect in percentage" + }, + "launch": { + "type": "boolean", + "description": "Launch experiment (set start_date) or keep as draft" + }, + "conclude": { + "type": "string", + "enum": ["won", "lost", "inconclusive", "stopped_early", "invalid"], + "description": "Conclude experiment with result" + }, + "conclusion_comment": { + "type": "string", + "description": "Comment about experiment conclusion" + }, + "restart": { + "type": "boolean", + "description": "Restart concluded experiment (clears end_date and conclusion)" + }, + "archive": { + "type": "boolean", + "description": "Archive or unarchive experiment" + } + }, + "additionalProperties": false, + "description": "The experiment data to update using user-friendly format" + } + }, + "required": ["experimentId", "data"], + "additionalProperties": false + }, + "FeatureFlagCreateSchema": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "key": { + "type": "string" + }, + "description": { + "type": "string" + }, + "filters": { + "type": "object", + "properties": { + "groups": { + "type": "array", + "items": { + "type": "object", + "properties": { + "properties": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + "operator": { + "type": "string", + "enum": [ + "exact", + "is_not", + "is_set", + "is_not_set", + "icontains", + "not_icontains", + "regex", + "not_regex", + "is_cleaned_path_exact", + "exact", + "is_not", + "is_set", + "is_not_set", + "gt", + "gte", + "lt", + "lte", + "min", + "max", + "exact", + "is_not", + "is_set", + "is_not_set", + "in", + "not_in" + ] + } + }, + "required": ["key", "value"], + "additionalProperties": false + } + }, + "rollout_percentage": { + "type": "number" + } + }, + "required": ["properties", "rollout_percentage"], + "additionalProperties": false + } + } + }, + "required": ["groups"], + "additionalProperties": false + }, + "active": { + "type": "boolean" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["name", "key", "description", "filters", "active"], + "additionalProperties": false + }, + "FeatureFlagDeleteSchema": { + "type": "object", + "properties": { + "flagKey": { + "type": "string" + } + }, + "required": ["flagKey"], + "additionalProperties": false + }, + "FeatureFlagGetAllSchema": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "FeatureFlagGetDefinitionSchema": { + "type": "object", + "properties": { + "flagId": { + "type": "integer", + "exclusiveMinimum": 0 + }, + "flagKey": { + "type": "string" + } + }, + "additionalProperties": false + }, + "FeatureFlagUpdateSchema": { + "type": "object", + "properties": { + "flagKey": { + "type": "string" + }, + "data": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "filters": { + "type": "object", + "properties": { + "groups": { + "type": "array", + "items": { + "type": "object", + "properties": { + "properties": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + "operator": { + "type": "string", + "enum": [ + "exact", + "is_not", + "is_set", + "is_not_set", + "icontains", + "not_icontains", + "regex", + "not_regex", + "is_cleaned_path_exact", + "exact", + "is_not", + "is_set", + "is_not_set", + "gt", + "gte", + "lt", + "lte", + "min", + "max", + "exact", + "is_not", + "is_set", + "is_not_set", + "in", + "not_in" + ] + } + }, + "required": ["key", "value"], + "additionalProperties": false + } + }, + "rollout_percentage": { + "type": "number" + } + }, + "required": ["properties", "rollout_percentage"], + "additionalProperties": false + } + } + }, + "required": ["groups"], + "additionalProperties": false + }, + "active": { + "type": "boolean" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "required": ["flagKey", "data"], + "additionalProperties": false + }, + "InsightCreateSchema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "query": { + "type": "object", + "properties": { + "kind": { + "type": "string", + "enum": ["InsightVizNode", "DataVisualizationNode"] + }, + "source": { + "description": "For new insights, use the query from your successful query-run tool call. For updates, the existing query can optionally be reused." + } + }, + "required": ["kind"], + "additionalProperties": false + }, + "description": { + "type": "string" + }, + "favorited": { + "type": "boolean" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["name", "query", "favorited"], + "additionalProperties": false + } + }, + "required": ["data"], + "additionalProperties": false + }, + "InsightDeleteSchema": { + "type": "object", + "properties": { + "insightId": { + "type": "string" + } + }, + "required": ["insightId"], + "additionalProperties": false + }, + "InsightGenerateHogQLFromQuestionSchema": { + "type": "object", + "properties": { + "question": { + "type": "string", + "maxLength": 1000, + "description": "Your natural language query describing the SQL insight (max 1000 characters)." + } + }, + "required": ["question"], + "additionalProperties": false + }, + "InsightGetAllSchema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "limit": { + "type": "number" + }, + "offset": { + "type": "number" + }, + "favorited": { + "type": "boolean" + }, + "search": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "InsightGetSchema": { + "type": "object", + "properties": { + "insightId": { + "type": "string" + } + }, + "required": ["insightId"], + "additionalProperties": false + }, + "InsightQueryInputSchema": { + "type": "object", + "properties": { + "insightId": { + "type": "string" + } + }, + "required": ["insightId"], + "additionalProperties": false + }, + "InsightUpdateSchema": { + "type": "object", + "properties": { + "insightId": { + "type": "string" + }, + "data": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "filters": { + "type": "object", + "additionalProperties": {} + }, + "query": { + "type": "object", + "properties": { + "kind": { + "type": "string", + "enum": ["InsightVizNode", "DataVisualizationNode"] + }, + "source": { + "description": "For new insights, use the query from your successful query-run tool call. For updates, the existing query can optionally be reused" + } + }, + "required": ["kind"], + "additionalProperties": false + }, + "favorited": { + "type": "boolean" + }, + "dashboard": { + "type": "number" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["query"], + "additionalProperties": false + } + }, + "required": ["insightId", "data"], + "additionalProperties": false + }, + "LLMAnalyticsGetCostsSchema": { + "type": "object", + "properties": { + "projectId": { + "type": "integer", + "exclusiveMinimum": 0 + }, + "days": { + "type": "number" + } + }, + "required": ["projectId"], + "additionalProperties": false + }, + "OrganizationGetAllSchema": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "OrganizationGetDetailsSchema": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "OrganizationSetActiveSchema": { + "type": "object", + "properties": { + "orgId": { + "type": "string", + "format": "uuid" + } + }, + "required": ["orgId"], + "additionalProperties": false + }, + "ProjectEventDefinitionsSchema": { + "type": "object", + "properties": { + "q": { + "type": "string", + "description": "Search query to filter event names. Only use if there are lots of events." + } + }, + "additionalProperties": false + }, + "ProjectGetAllSchema": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "ProjectPropertyDefinitionsInputSchema": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["event", "person"], + "description": "Type of properties to get" + }, + "eventName": { + "type": "string", + "description": "Event name to filter properties by, required for event type" + }, + "includePredefinedProperties": { + "type": "boolean", + "description": "Whether to include predefined properties" + } + }, + "required": ["type"], + "additionalProperties": false + }, + "ProjectSetActiveSchema": { + "type": "object", + "properties": { + "projectId": { + "type": "integer", + "exclusiveMinimum": 0 + } + }, + "required": ["projectId"], + "additionalProperties": false + }, + "QueryRunInputSchema": { + "type": "object", + "properties": { + "query": { + "anyOf": [ + { + "type": "object", + "properties": { + "kind": { + "type": "string", + "const": "InsightVizNode" + }, + "source": { + "anyOf": [ + { + "type": "object", + "properties": { + "dateRange": { + "type": "object", + "properties": { + "date_from": { + "type": ["string", "null"] + }, + "date_to": { + "type": ["string", "null"] + }, + "explicitDate": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "filterTestAccounts": { + "type": "boolean", + "default": false + }, + "properties": { + "anyOf": [ + { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + { + "type": "null" + } + ] + }, + "operator": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": ["key"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AND", + "OR" + ] + }, + "values": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + { + "type": "null" + } + ] + }, + "operator": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "key" + ], + "additionalProperties": false + } + } + }, + "required": [ + "type", + "values" + ], + "additionalProperties": false + } + ] + } + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["AND", "OR"] + }, + "values": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + { + "type": "null" + } + ] + }, + "operator": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": ["key"], + "additionalProperties": false + } + } + }, + "required": ["type", "values"], + "additionalProperties": false + } + ], + "default": [] + }, + "kind": { + "type": "string", + "const": "TrendsQuery" + }, + "interval": { + "type": "string", + "enum": ["hour", "day", "week", "month"], + "default": "day" + }, + "series": { + "type": "array", + "items": { + "type": "object", + "properties": { + "custom_name": { + "type": "string", + "description": "A display name" + }, + "math": { + "type": "string", + "enum": [ + "total", + "dau", + "weekly_active", + "monthly_active", + "unique_session", + "first_time_for_user", + "first_matching_event_for_user", + "avg", + "sum", + "min", + "max", + "median", + "p75", + "p90", + "p95", + "p99" + ] + }, + "math_property": { + "type": "string" + }, + "properties": { + "anyOf": [ + { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + { + "type": "null" + } + ] + }, + "operator": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "key" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AND", + "OR" + ] + }, + "values": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + { + "type": "null" + } + ] + }, + "operator": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "key" + ], + "additionalProperties": false + } + } + }, + "required": [ + "type", + "values" + ], + "additionalProperties": false + } + ] + } + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AND", + "OR" + ] + }, + "values": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + { + "type": "null" + } + ] + }, + "operator": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "key" + ], + "additionalProperties": false + } + } + }, + "required": [ + "type", + "values" + ], + "additionalProperties": false + } + ] + }, + "kind": { + "type": "string", + "const": "EventsNode" + }, + "event": { + "type": "string" + }, + "limit": { + "type": "number" + } + }, + "required": ["custom_name", "kind"], + "additionalProperties": false + } + }, + "trendsFilter": { + "type": "object", + "properties": { + "display": { + "type": "string", + "enum": [ + "ActionsLineGraph", + "ActionsTable", + "ActionsPie", + "ActionsBar", + "ActionsBarValue", + "WorldMap", + "BoldNumber" + ], + "default": "ActionsLineGraph" + }, + "showLegend": { + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "breakdownFilter": { + "type": "object", + "properties": { + "breakdown_type": { + "anyOf": [ + { + "type": "string", + "enum": ["person", "event"] + }, + { + "type": "null" + } + ], + "default": "event" + }, + "breakdown_limit": { + "type": "number" + }, + "breakdown": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": [ + "string", + "number" + ] + } + } + ] + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false + }, + "compareFilter": { + "type": "object", + "properties": { + "compare": { + "type": "boolean", + "default": false + }, + "compare_to": { + "type": "string" + } + }, + "additionalProperties": false + }, + "conversionGoal": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + } + }, + "required": ["kind", "series"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "dateRange": { + "type": "object", + "properties": { + "date_from": { + "type": ["string", "null"] + }, + "date_to": { + "type": ["string", "null"] + }, + "explicitDate": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "filterTestAccounts": { + "type": "boolean", + "default": false + }, + "properties": { + "anyOf": [ + { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + { + "type": "null" + } + ] + }, + "operator": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": ["key"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AND", + "OR" + ] + }, + "values": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + { + "type": "null" + } + ] + }, + "operator": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "key" + ], + "additionalProperties": false + } + } + }, + "required": [ + "type", + "values" + ], + "additionalProperties": false + } + ] + } + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["AND", "OR"] + }, + "values": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + { + "type": "null" + } + ] + }, + "operator": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": ["key"], + "additionalProperties": false + } + } + }, + "required": ["type", "values"], + "additionalProperties": false + } + ], + "default": [] + }, + "kind": { + "type": "string", + "const": "FunnelsQuery" + }, + "interval": { + "type": "string", + "enum": ["hour", "day", "week", "month"] + }, + "series": { + "type": "array", + "items": { + "type": "object", + "properties": { + "custom_name": { + "type": "string", + "description": "A display name" + }, + "math": { + "type": "string", + "enum": [ + "total", + "dau", + "weekly_active", + "monthly_active", + "unique_session", + "first_time_for_user", + "first_matching_event_for_user", + "avg", + "sum", + "min", + "max", + "median", + "p75", + "p90", + "p95", + "p99" + ] + }, + "math_property": { + "type": "string" + }, + "properties": { + "anyOf": [ + { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + { + "type": "null" + } + ] + }, + "operator": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "key" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AND", + "OR" + ] + }, + "values": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + { + "type": "null" + } + ] + }, + "operator": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "key" + ], + "additionalProperties": false + } + } + }, + "required": [ + "type", + "values" + ], + "additionalProperties": false + } + ] + } + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "AND", + "OR" + ] + }, + "values": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + { + "type": "null" + } + ] + }, + "operator": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "key" + ], + "additionalProperties": false + } + } + }, + "required": [ + "type", + "values" + ], + "additionalProperties": false + } + ] + }, + "kind": { + "type": "string", + "const": "EventsNode" + }, + "event": { + "type": "string" + }, + "limit": { + "type": "number" + } + }, + "required": ["custom_name", "kind"], + "additionalProperties": false + }, + "minItems": 2 + }, + "funnelsFilter": { + "type": "object", + "properties": { + "layout": { + "type": "string", + "enum": ["horizontal", "vertical"] + }, + "breakdownAttributionType": { + "type": "string", + "enum": [ + "first_touch", + "last_touch", + "all_events" + ] + }, + "breakdownAttributionValue": { + "type": "number" + }, + "funnelToStep": { + "type": "number" + }, + "funnelFromStep": { + "type": "number" + }, + "funnelOrderType": { + "type": "string", + "enum": [ + "ordered", + "unordered", + "strict" + ] + }, + "funnelVizType": { + "type": "string", + "enum": [ + "steps", + "time_to_convert", + "trends" + ] + }, + "funnelWindowInterval": { + "type": "number", + "default": 14 + }, + "funnelWindowIntervalUnit": { + "type": "string", + "enum": [ + "minute", + "hour", + "day", + "week", + "month" + ], + "default": "day" + }, + "funnelStepReference": { + "type": "string", + "enum": ["total", "previous"] + } + }, + "additionalProperties": false + }, + "breakdownFilter": { + "type": "object", + "properties": { + "breakdown_type": { + "anyOf": [ + { + "type": "string", + "enum": ["person", "event"] + }, + { + "type": "null" + } + ], + "default": "event" + }, + "breakdown_limit": { + "type": "number" + }, + "breakdown": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": [ + "string", + "number" + ] + } + } + ] + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false + } + }, + "required": ["kind", "series"], + "additionalProperties": false + } + ] + } + }, + "required": ["kind", "source"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "type": "string", + "const": "DataVisualizationNode" + }, + "source": { + "type": "object", + "properties": { + "kind": { + "type": "string", + "const": "HogQLQuery" + }, + "query": { + "type": "string" + }, + "filters": { + "type": "object", + "properties": { + "properties": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + { + "type": "null" + } + ] + }, + "operator": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": ["key"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["AND", "OR"] + }, + "values": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + { + "type": "null" + } + ] + }, + "operator": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": ["key"], + "additionalProperties": false + } + } + }, + "required": ["type", "values"], + "additionalProperties": false + } + ] + } + }, + "dateRange": { + "type": "object", + "properties": { + "date_from": { + "type": ["string", "null"] + }, + "date_to": { + "type": ["string", "null"] + }, + "explicitDate": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "filterTestAccounts": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "required": ["kind", "query"], + "additionalProperties": false + } + }, + "required": ["kind", "source"], + "additionalProperties": false + } + ] + } + }, + "required": ["query"], + "additionalProperties": false + }, + "SurveyCreateSchema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["popover", "api", "widget", "external_survey"] + }, + "questions": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "properties": { + "question": { + "type": "string" + }, + "description": { + "type": "string" + }, + "descriptionContentType": { + "type": "string", + "enum": ["html", "text"] + }, + "optional": { + "type": "boolean" + }, + "buttonText": { + "type": "string" + }, + "type": { + "type": "string", + "const": "open" + } + }, + "required": ["question", "type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "question": { + "type": "string" + }, + "description": { + "type": "string" + }, + "descriptionContentType": { + "type": "string", + "enum": ["html", "text"] + }, + "optional": { + "type": "boolean" + }, + "buttonText": { + "type": "string" + }, + "type": { + "type": "string", + "const": "link" + }, + "link": { + "type": "string", + "format": "uri" + } + }, + "required": ["question", "type", "link"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "question": { + "type": "string" + }, + "description": { + "type": "string" + }, + "descriptionContentType": { + "type": "string", + "enum": ["html", "text"] + }, + "optional": { + "type": "boolean" + }, + "buttonText": { + "type": "string" + }, + "type": { + "type": "string", + "const": "rating" + }, + "display": { + "type": "string", + "enum": ["number", "emoji"], + "description": "Display format: 'number' shows numeric scale, 'emoji' shows emoji scale" + }, + "scale": { + "type": "number", + "enum": [3, 5, 7], + "description": "Rating scale can be one of 3, 5, or 7" + }, + "lowerBoundLabel": { + "type": "string", + "description": "Label for the lowest rating (e.g., 'Very Poor')" + }, + "upperBoundLabel": { + "type": "string", + "description": "Label for the highest rating (e.g., 'Excellent')" + }, + "branching": { + "anyOf": [ + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "next_question" + } + }, + "required": ["type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "end" + } + }, + "required": ["type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "response_based" + }, + "responseValues": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "const": "end" + } + ] + }, + "propertyNames": { + "enum": [ + "negative", + "neutral", + "positive" + ] + }, + "description": "Only include keys for responses that should branch to a specific question or 'end'. Omit keys for responses that should proceed to the next question (default behavior)." + } + }, + "required": ["type", "responseValues"], + "additionalProperties": false, + "description": "For rating questions: use sentiment keys based on scale thirds - negative (lower third), neutral (middle third), positive (upper third)" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "specific_question" + }, + "index": { + "type": "number" + } + }, + "required": ["type", "index"], + "additionalProperties": false + } + ] + } + }, + "required": ["question", "type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "question": { + "type": "string" + }, + "description": { + "type": "string" + }, + "descriptionContentType": { + "type": "string", + "enum": ["html", "text"] + }, + "optional": { + "type": "boolean" + }, + "buttonText": { + "type": "string" + }, + "type": { + "type": "string", + "const": "rating" + }, + "display": { + "type": "string", + "const": "number", + "description": "NPS questions always use numeric scale" + }, + "scale": { + "type": "number", + "const": 10, + "description": "NPS questions always use 0-10 scale" + }, + "lowerBoundLabel": { + "type": "string", + "description": "Label for 0 rating (typically 'Not at all likely')" + }, + "upperBoundLabel": { + "type": "string", + "description": "Label for 10 rating (typically 'Extremely likely')" + }, + "branching": { + "anyOf": [ + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "next_question" + } + }, + "required": ["type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "end" + } + }, + "required": ["type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "response_based" + }, + "responseValues": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "const": "end" + } + ] + }, + "propertyNames": { + "enum": [ + "detractors", + "passives", + "promoters" + ] + }, + "description": "Only include keys for responses that should branch to a specific question or 'end'. Omit keys for responses that should proceed to the next question (default behavior)." + } + }, + "required": ["type", "responseValues"], + "additionalProperties": false, + "description": "For NPS rating questions: use sentiment keys based on score ranges - detractors (0-6), passives (7-8), promoters (9-10)" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "specific_question" + }, + "index": { + "type": "number" + } + }, + "required": ["type", "index"], + "additionalProperties": false + } + ] + } + }, + "required": ["question", "type", "display", "scale"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "question": { + "type": "string" + }, + "description": { + "type": "string" + }, + "descriptionContentType": { + "type": "string", + "enum": ["html", "text"] + }, + "optional": { + "type": "boolean" + }, + "buttonText": { + "type": "string" + }, + "type": { + "type": "string", + "const": "single_choice" + }, + "choices": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "minItems": 2, + "maxItems": 20, + "description": "Array of choice options. Choice indices (0, 1, 2, etc.) are used for branching logic" + }, + "shuffleOptions": { + "type": "boolean", + "description": "Whether to randomize the order of choices for each respondent" + }, + "hasOpenChoice": { + "type": "boolean", + "description": "Whether the last choice (typically 'Other', is an open text input question" + }, + "branching": { + "anyOf": [ + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "next_question" + } + }, + "required": ["type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "end" + } + }, + "required": ["type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "response_based" + }, + "responseValues": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "const": "end" + } + ] + }, + "description": "Only include keys for responses that should branch to a specific question or 'end'. Omit keys for responses that should proceed to the next question (default behavior)." + } + }, + "required": ["type", "responseValues"], + "additionalProperties": false, + "description": "For single choice questions: use choice indices as string keys (\"0\", \"1\", \"2\", etc.)" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "specific_question" + }, + "index": { + "type": "number" + } + }, + "required": ["type", "index"], + "additionalProperties": false + } + ] + } + }, + "required": ["question", "type", "choices"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "question": { + "type": "string" + }, + "description": { + "type": "string" + }, + "descriptionContentType": { + "type": "string", + "enum": ["html", "text"] + }, + "optional": { + "type": "boolean" + }, + "buttonText": { + "type": "string" + }, + "type": { + "type": "string", + "const": "multiple_choice" + }, + "choices": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "minItems": 2, + "maxItems": 20, + "description": "Array of choice options. Multiple selections allowed. No branching logic supported." + }, + "shuffleOptions": { + "type": "boolean", + "description": "Whether to randomize the order of choices for each respondent" + }, + "hasOpenChoice": { + "type": "boolean", + "description": "Whether the last choice (typically 'Other', is an open text input question" + } + }, + "required": ["question", "type", "choices"], + "additionalProperties": false + } + ] + }, + "minItems": 1 + }, + "appearance": { + "type": "object", + "properties": { + "backgroundColor": { + "type": "string" + }, + "submitButtonColor": { + "type": "string" + }, + "textColor": { + "type": "string" + }, + "submitButtonText": { + "type": "string" + }, + "submitButtonTextColor": { + "type": "string" + }, + "descriptionTextColor": { + "type": "string" + }, + "ratingButtonColor": { + "type": "string" + }, + "ratingButtonActiveColor": { + "type": "string" + }, + "ratingButtonHoverColor": { + "type": "string" + }, + "whiteLabel": { + "type": "boolean" + }, + "autoDisappear": { + "type": "boolean" + }, + "displayThankYouMessage": { + "type": "boolean" + }, + "thankYouMessageHeader": { + "type": "string" + }, + "thankYouMessageDescription": { + "type": "string" + }, + "thankYouMessageDescriptionContentType": { + "type": "string", + "enum": ["html", "text"] + }, + "thankYouMessageCloseButtonText": { + "type": "string" + }, + "borderColor": { + "type": "string" + }, + "placeholder": { + "type": "string" + }, + "shuffleQuestions": { + "type": "boolean" + }, + "surveyPopupDelaySeconds": { + "type": "number" + }, + "widgetType": { + "type": "string", + "enum": ["button", "tab", "selector"] + }, + "widgetSelector": { + "type": "string" + }, + "widgetLabel": { + "type": "string" + }, + "widgetColor": { + "type": "string" + }, + "fontFamily": { + "type": "string" + }, + "maxWidth": { + "type": "string" + }, + "zIndex": { + "type": "string" + }, + "disabledButtonOpacity": { + "type": "string" + }, + "boxPadding": { + "type": "string" + } + }, + "additionalProperties": false + }, + "start_date": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Setting this will launch the survey immediately. Don't add a start_date unless explicitly requested to do so." + }, + "responses_limit": { + "anyOf": [ + { + "type": "number", + "exclusiveMinimum": 0 + }, + { + "type": "null" + } + ], + "description": "The maximum number of responses before automatically stopping the survey." + }, + "iteration_count": { + "anyOf": [ + { + "type": "number", + "exclusiveMinimum": 0 + }, + { + "type": "null" + } + ], + "description": "For a recurring schedule, this field specifies the number of times the survey should be shown to the user. Use 1 for 'once every X days', higher numbers for multiple repetitions. Works together with iteration_frequency_days to determine the overall survey schedule." + }, + "iteration_frequency_days": { + "anyOf": [ + { + "type": "number", + "exclusiveMinimum": 0, + "maximum": 365 + }, + { + "type": "null" + } + ], + "description": "For a recurring schedule, this field specifies the interval in days between each survey instance shown to the user, used alongside iteration_count for precise scheduling." + }, + "enable_partial_responses": { + "type": "boolean", + "description": "When at least one question is answered, the response is stored (true). The response is stored when all questions are answered (false)." + }, + "linked_flag_id": { + "type": ["number", "null"], + "description": "The feature flag linked to this survey" + }, + "targeting_flag_filters": { + "type": "object", + "properties": { + "groups": { + "type": "array", + "items": { + "type": "object", + "properties": { + "properties": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + "operator": { + "type": "string", + "enum": [ + "exact", + "is_not", + "is_set", + "is_not_set", + "icontains", + "not_icontains", + "regex", + "not_regex", + "is_cleaned_path_exact", + "exact", + "is_not", + "is_set", + "is_not_set", + "gt", + "gte", + "lt", + "lte", + "min", + "max", + "exact", + "is_not", + "is_set", + "is_not_set", + "in", + "not_in" + ] + } + }, + "required": ["key", "value"], + "additionalProperties": false + } + }, + "rollout_percentage": { + "type": "number" + } + }, + "required": ["properties", "rollout_percentage"], + "additionalProperties": false + } + } + }, + "required": ["groups"], + "additionalProperties": false, + "description": "Target specific users based on their properties. Example: {groups: [{properties: [{key: 'email', value: ['@company.com'], operator: 'icontains'}], rollout_percentage: 100}]}" + } + }, + "required": ["name", "questions"], + "additionalProperties": false + }, + "SurveyDeleteSchema": { + "type": "object", + "properties": { + "surveyId": { + "type": "string" + } + }, + "required": ["surveyId"], + "additionalProperties": false + }, + "SurveyGetAllSchema": { + "type": "object", + "properties": { + "limit": { + "type": "number" + }, + "offset": { + "type": "number" + }, + "search": { + "type": "string" + } + }, + "additionalProperties": false + }, + "SurveyGetSchema": { + "type": "object", + "properties": { + "surveyId": { + "type": "string" + } + }, + "required": ["surveyId"], + "additionalProperties": false + }, + "SurveyGlobalStatsSchema": { + "type": "object", + "properties": { + "date_from": { + "type": "string", + "format": "date-time", + "description": "Optional ISO timestamp for start date (e.g. 2024-01-01T00:00:00Z)" + }, + "date_to": { + "type": "string", + "format": "date-time", + "description": "Optional ISO timestamp for end date (e.g. 2024-01-31T23:59:59Z)" + } + }, + "additionalProperties": false + }, + "SurveyResponseCountsSchema": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "SurveyStatsSchema": { + "type": "object", + "properties": { + "survey_id": { + "type": "string" + }, + "date_from": { + "type": "string", + "format": "date-time", + "description": "Optional ISO timestamp for start date (e.g. 2024-01-01T00:00:00Z)" + }, + "date_to": { + "type": "string", + "format": "date-time", + "description": "Optional ISO timestamp for end date (e.g. 2024-01-31T23:59:59Z)" + } + }, + "required": ["survey_id"], + "additionalProperties": false + }, + "SurveyUpdateSchema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["popover", "api", "widget", "external_survey"] + }, + "questions": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "properties": { + "question": { + "type": "string" + }, + "description": { + "type": "string" + }, + "descriptionContentType": { + "type": "string", + "enum": ["html", "text"] + }, + "optional": { + "type": "boolean" + }, + "buttonText": { + "type": "string" + }, + "type": { + "type": "string", + "const": "open" + } + }, + "required": ["question", "type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "question": { + "type": "string" + }, + "description": { + "type": "string" + }, + "descriptionContentType": { + "type": "string", + "enum": ["html", "text"] + }, + "optional": { + "type": "boolean" + }, + "buttonText": { + "type": "string" + }, + "type": { + "type": "string", + "const": "link" + }, + "link": { + "type": "string", + "format": "uri" + } + }, + "required": ["question", "type", "link"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "question": { + "type": "string" + }, + "description": { + "type": "string" + }, + "descriptionContentType": { + "type": "string", + "enum": ["html", "text"] + }, + "optional": { + "type": "boolean" + }, + "buttonText": { + "type": "string" + }, + "type": { + "type": "string", + "const": "rating" + }, + "display": { + "type": "string", + "enum": ["number", "emoji"], + "description": "Display format: 'number' shows numeric scale, 'emoji' shows emoji scale" + }, + "scale": { + "type": "number", + "enum": [3, 5, 7], + "description": "Rating scale can be one of 3, 5, or 7" + }, + "lowerBoundLabel": { + "type": "string", + "description": "Label for the lowest rating (e.g., 'Very Poor')" + }, + "upperBoundLabel": { + "type": "string", + "description": "Label for the highest rating (e.g., 'Excellent')" + }, + "branching": { + "anyOf": [ + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "next_question" + } + }, + "required": ["type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "end" + } + }, + "required": ["type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "response_based" + }, + "responseValues": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "const": "end" + } + ] + }, + "propertyNames": { + "enum": [ + "negative", + "neutral", + "positive" + ] + }, + "description": "Only include keys for responses that should branch to a specific question or 'end'. Omit keys for responses that should proceed to the next question (default behavior)." + } + }, + "required": ["type", "responseValues"], + "additionalProperties": false, + "description": "For rating questions: use sentiment keys based on scale thirds - negative (lower third), neutral (middle third), positive (upper third)" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "specific_question" + }, + "index": { + "type": "number" + } + }, + "required": ["type", "index"], + "additionalProperties": false + } + ] + } + }, + "required": ["question", "type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "question": { + "type": "string" + }, + "description": { + "type": "string" + }, + "descriptionContentType": { + "type": "string", + "enum": ["html", "text"] + }, + "optional": { + "type": "boolean" + }, + "buttonText": { + "type": "string" + }, + "type": { + "type": "string", + "const": "rating" + }, + "display": { + "type": "string", + "const": "number", + "description": "NPS questions always use numeric scale" + }, + "scale": { + "type": "number", + "const": 10, + "description": "NPS questions always use 0-10 scale" + }, + "lowerBoundLabel": { + "type": "string", + "description": "Label for 0 rating (typically 'Not at all likely')" + }, + "upperBoundLabel": { + "type": "string", + "description": "Label for 10 rating (typically 'Extremely likely')" + }, + "branching": { + "anyOf": [ + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "next_question" + } + }, + "required": ["type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "end" + } + }, + "required": ["type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "response_based" + }, + "responseValues": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "const": "end" + } + ] + }, + "propertyNames": { + "enum": [ + "detractors", + "passives", + "promoters" + ] + }, + "description": "Only include keys for responses that should branch to a specific question or 'end'. Omit keys for responses that should proceed to the next question (default behavior)." + } + }, + "required": ["type", "responseValues"], + "additionalProperties": false, + "description": "For NPS rating questions: use sentiment keys based on score ranges - detractors (0-6), passives (7-8), promoters (9-10)" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "specific_question" + }, + "index": { + "type": "number" + } + }, + "required": ["type", "index"], + "additionalProperties": false + } + ] + } + }, + "required": ["question", "type", "display", "scale"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "question": { + "type": "string" + }, + "description": { + "type": "string" + }, + "descriptionContentType": { + "type": "string", + "enum": ["html", "text"] + }, + "optional": { + "type": "boolean" + }, + "buttonText": { + "type": "string" + }, + "type": { + "type": "string", + "const": "single_choice" + }, + "choices": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "minItems": 2, + "maxItems": 20, + "description": "Array of choice options. Choice indices (0, 1, 2, etc.) are used for branching logic" + }, + "shuffleOptions": { + "type": "boolean", + "description": "Whether to randomize the order of choices for each respondent" + }, + "hasOpenChoice": { + "type": "boolean", + "description": "Whether the last choice (typically 'Other', is an open text input question" + }, + "branching": { + "anyOf": [ + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "next_question" + } + }, + "required": ["type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "end" + } + }, + "required": ["type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "response_based" + }, + "responseValues": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "const": "end" + } + ] + }, + "description": "Only include keys for responses that should branch to a specific question or 'end'. Omit keys for responses that should proceed to the next question (default behavior)." + } + }, + "required": ["type", "responseValues"], + "additionalProperties": false, + "description": "For single choice questions: use choice indices as string keys (\"0\", \"1\", \"2\", etc.)" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "specific_question" + }, + "index": { + "type": "number" + } + }, + "required": ["type", "index"], + "additionalProperties": false + } + ] + } + }, + "required": ["question", "type", "choices"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "question": { + "type": "string" + }, + "description": { + "type": "string" + }, + "descriptionContentType": { + "type": "string", + "enum": ["html", "text"] + }, + "optional": { + "type": "boolean" + }, + "buttonText": { + "type": "string" + }, + "type": { + "type": "string", + "const": "multiple_choice" + }, + "choices": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "minItems": 2, + "maxItems": 20, + "description": "Array of choice options. Multiple selections allowed. No branching logic supported." + }, + "shuffleOptions": { + "type": "boolean", + "description": "Whether to randomize the order of choices for each respondent" + }, + "hasOpenChoice": { + "type": "boolean", + "description": "Whether the last choice (typically 'Other', is an open text input question" + } + }, + "required": ["question", "type", "choices"], + "additionalProperties": false + } + ] + }, + "minItems": 1 + }, + "conditions": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "seenSurveyWaitPeriodInDays": { + "type": "number", + "description": "Don't show this survey to users who saw any survey in the last x days." + }, + "urlMatchType": { + "type": "string", + "enum": [ + "regex", + "not_regex", + "exact", + "is_not", + "icontains", + "not_icontains" + ], + "description": "URL/device matching types: 'regex' (matches regex pattern), 'not_regex' (does not match regex pattern), 'exact' (exact string match), 'is_not' (not exact match), 'icontains' (case-insensitive contains), 'not_icontains' (case-insensitive does not contain)" + }, + "events": { + "type": "object", + "properties": { + "repeatedActivation": { + "type": "boolean", + "description": "Whether to show the survey every time one of the events is triggered (true), or just once (false)" + }, + "values": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": ["name"], + "additionalProperties": false + }, + "description": "Array of event names that trigger the survey" + } + }, + "additionalProperties": false + }, + "deviceTypes": { + "type": "array", + "items": { + "type": "string", + "enum": ["Desktop", "Mobile", "Tablet"] + } + }, + "deviceTypesMatchType": { + "type": "string", + "enum": [ + "regex", + "not_regex", + "exact", + "is_not", + "icontains", + "not_icontains" + ], + "description": "URL/device matching types: 'regex' (matches regex pattern), 'not_regex' (does not match regex pattern), 'exact' (exact string match), 'is_not' (not exact match), 'icontains' (case-insensitive contains), 'not_icontains' (case-insensitive does not contain)" + }, + "linkedFlagVariant": { + "type": "string", + "description": "The variant of the feature flag linked to this survey" + } + }, + "additionalProperties": false + }, + "appearance": { + "type": "object", + "properties": { + "backgroundColor": { + "type": "string" + }, + "submitButtonColor": { + "type": "string" + }, + "textColor": { + "type": "string" + }, + "submitButtonText": { + "type": "string" + }, + "submitButtonTextColor": { + "type": "string" + }, + "descriptionTextColor": { + "type": "string" + }, + "ratingButtonColor": { + "type": "string" + }, + "ratingButtonActiveColor": { + "type": "string" + }, + "ratingButtonHoverColor": { + "type": "string" + }, + "whiteLabel": { + "type": "boolean" + }, + "autoDisappear": { + "type": "boolean" + }, + "displayThankYouMessage": { + "type": "boolean" + }, + "thankYouMessageHeader": { + "type": "string" + }, + "thankYouMessageDescription": { + "type": "string" + }, + "thankYouMessageDescriptionContentType": { + "type": "string", + "enum": ["html", "text"] + }, + "thankYouMessageCloseButtonText": { + "type": "string" + }, + "borderColor": { + "type": "string" + }, + "placeholder": { + "type": "string" + }, + "shuffleQuestions": { + "type": "boolean" + }, + "surveyPopupDelaySeconds": { + "type": "number" + }, + "widgetType": { + "type": "string", + "enum": ["button", "tab", "selector"] + }, + "widgetSelector": { + "type": "string" + }, + "widgetLabel": { + "type": "string" + }, + "widgetColor": { + "type": "string" + }, + "fontFamily": { + "type": "string" + }, + "maxWidth": { + "type": "string" + }, + "zIndex": { + "type": "string" + }, + "disabledButtonOpacity": { + "type": "string" + }, + "boxPadding": { + "type": "string" + } + }, + "additionalProperties": false + }, + "schedule": { + "type": "string", + "enum": ["once", "recurring", "always"], + "description": "Survey scheduling behavior: 'once' = show once per user (default), 'recurring' = repeat based on iteration_count and iteration_frequency_days settings, 'always' = show every time conditions are met (mainly for widget surveys)" + }, + "start_date": { + "type": "string", + "format": "date-time", + "description": "When the survey should start being shown to users. Setting this will launch the survey" + }, + "end_date": { + "type": "string", + "format": "date-time", + "description": "When the survey stopped being shown to users. Setting this will complete the survey." + }, + "archived": { + "type": "boolean" + }, + "responses_limit": { + "anyOf": [ + { + "type": "number", + "exclusiveMinimum": 0 + }, + { + "type": "null" + } + ], + "description": "The maximum number of responses before automatically stopping the survey." + }, + "iteration_count": { + "anyOf": [ + { + "type": "number", + "exclusiveMinimum": 0 + }, + { + "type": "null" + } + ], + "description": "For a recurring schedule, this field specifies the number of times the survey should be shown to the user. Use 1 for 'once every X days', higher numbers for multiple repetitions. Works together with iteration_frequency_days to determine the overall survey schedule." + }, + "iteration_frequency_days": { + "anyOf": [ + { + "type": "number", + "exclusiveMinimum": 0, + "maximum": 365 + }, + { + "type": "null" + } + ], + "description": "For a recurring schedule, this field specifies the interval in days between each survey instance shown to the user, used alongside iteration_count for precise scheduling." + }, + "enable_partial_responses": { + "type": "boolean", + "description": "When at least one question is answered, the response is stored (true). The response is stored when all questions are answered (false)." + }, + "linked_flag_id": { + "type": ["number", "null"], + "description": "The feature flag to link to this survey" + }, + "targeting_flag_id": { + "type": "number", + "description": "An existing targeting flag to use for this survey" + }, + "targeting_flag_filters": { + "type": "object", + "properties": { + "groups": { + "type": "array", + "items": { + "type": "object", + "properties": { + "properties": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + "operator": { + "type": "string", + "enum": [ + "exact", + "is_not", + "is_set", + "is_not_set", + "icontains", + "not_icontains", + "regex", + "not_regex", + "is_cleaned_path_exact", + "exact", + "is_not", + "is_set", + "is_not_set", + "gt", + "gte", + "lt", + "lte", + "min", + "max", + "exact", + "is_not", + "is_set", + "is_not_set", + "in", + "not_in" + ] + } + }, + "required": ["key", "value"], + "additionalProperties": false + } + }, + "rollout_percentage": { + "type": "number" + } + }, + "required": ["properties", "rollout_percentage"], + "additionalProperties": false + } + } + }, + "required": ["groups"], + "additionalProperties": false, + "description": "Target specific users based on their properties. Example: {groups: [{properties: [{key: 'email', value: ['@company.com'], operator: 'icontains'}], rollout_percentage: 50}]}" + }, + "remove_targeting_flag": { + "type": "boolean", + "description": "Set to true to completely remove all targeting filters from the survey, making it visible to all users (subject to other display conditions like URL matching)." + }, + "surveyId": { + "type": "string" + } + }, + "required": ["surveyId"], + "additionalProperties": false + } + } +} diff --git a/products/mcp/typescript/README.md b/products/mcp/typescript/README.md new file mode 100644 index 0000000000..1064168cb2 --- /dev/null +++ b/products/mcp/typescript/README.md @@ -0,0 +1,72 @@ +# @posthog/agent-toolkit + +Tools to give agents access to your PostHog data, manage feature flags, create insights, and more. + +## Installation + +```bash +npm install @posthog/agent-toolkit +``` + +## Quick Start + +The toolkit provides integrations for popular AI frameworks: + +### Using with Vercel AI SDK + +```typescript +import { openai } from '@ai-sdk/openai' +import { generateText } from 'ai' + +import { PostHogAgentToolkit } from '@posthog/agent-toolkit/integrations/ai-sdk' + +const toolkit = new PostHogAgentToolkit({ + posthogPersonalApiKey: process.env.POSTHOG_PERSONAL_API_KEY!, + posthogApiBaseUrl: 'https://us.posthog.com', // or https://eu.posthog.com if you are hosting in the EU +}) + +const result = await generateText({ + model: openai('gpt-4'), + tools: await toolkit.getTools(), + prompt: 'Analyze our product usage by getting the top 5 most interesting insights and summarising the data from them.', +}) +``` + +**[→ See full Vercel AI SDK example](https://github.com/posthog/mcp/tree/main/examples/ai-sdk)** + +### Using with LangChain.js + +```typescript +import { ChatPromptTemplate, MessagesPlaceholder } from '@langchain/core/prompts' +import { ChatOpenAI } from '@langchain/openai' +import { AgentExecutor, createToolCallingAgent } from 'langchain/agents' + +import { PostHogAgentToolkit } from '@posthog/agent-toolkit/integrations/langchain' + +const toolkit = new PostHogAgentToolkit({ + posthogPersonalApiKey: process.env.POSTHOG_PERSONAL_API_KEY!, + posthogApiBaseUrl: 'https://us.posthog.com', // or https://eu.posthog.com if you are hosting in the EU +}) + +const tools = await toolkit.getTools() +const llm = new ChatOpenAI({ model: 'gpt-4' }) + +const prompt = ChatPromptTemplate.fromMessages([ + ['system', 'You are a data analyst with access to PostHog analytics'], + ['human', '{input}'], + new MessagesPlaceholder('agent_scratchpad'), +]) + +const agent = createToolCallingAgent({ llm, tools, prompt }) +const executor = new AgentExecutor({ agent, tools }) + +const result = await executor.invoke({ + input: 'Analyze our product usage by getting the top 5 most interesting insights and summarising the data from them.', +}) +``` + +**[→ See full LangChain.js example](https://github.com/posthog/mcp/tree/main/examples/langchain-js)** + +## Available Tools + +For a list of all available tools, please see the [docs](https://posthog.com/docs/model-context-protocol). diff --git a/products/mcp/typescript/package.json b/products/mcp/typescript/package.json new file mode 100644 index 0000000000..6c730262e6 --- /dev/null +++ b/products/mcp/typescript/package.json @@ -0,0 +1,87 @@ +{ + "name": "@posthog/agent-toolkit", + "version": "0.2.2", + "description": "PostHog tools for AI agents", + "main": "dist/index.js", + "module": "dist/index.mjs", + "types": "dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.js" + }, + "./tools": { + "types": "./dist/tools.d.ts", + "import": "./dist/tools.mjs", + "require": "./dist/tools.js" + }, + "./integrations/ai-sdk": { + "types": "./dist/ai-sdk.d.ts", + "import": "./dist/ai-sdk.mjs", + "require": "./dist/ai-sdk.js" + }, + "./integrations/langchain": { + "types": "./dist/langchain.d.ts", + "import": "./dist/langchain.mjs", + "require": "./dist/langchain.js" + } + }, + "scripts": { + "build": "tsup", + "dev": "wrangler dev", + "deploy": "wrangler deploy", + "cf-typegen": "wrangler types", + "inspector": "npx @modelcontextprotocol/inspector npx -y mcp-remote@latest http://localhost:8787/mcp", + "test": "vitest", + "test:integration": "vitest run --config vitest.integration.config.mts", + "test:watch": "vitest watch", + "typecheck": "tsc --noEmit", + "generate-client": "tsx scripts/update-openapi-client.ts" + }, + "keywords": [ + "posthog", + "mcp", + "ai", + "agents", + "analytics", + "feature-flags" + ], + "author": "PostHog Inc.", + "license": "MIT", + "peerDependencies": { + "@langchain/core": "^0.3.72", + "@langchain/openai": "^0.6.9", + "ai": "^5.0.0", + "langchain": "^0.3.31" + }, + "dependencies": { + "@modelcontextprotocol/sdk": "^1.17.3", + "agents": "^0.0.113", + "ai": "^5.0.18", + "posthog-node": "^4.18.0", + "uuid": "^11.1.0", + "zod": "^3.24.4" + }, + "devDependencies": { + "@langchain/core": "^0.3.72", + "@langchain/openai": "^0.6.9", + "@types/dotenv": "^6.1.1", + "@types/node": "^22.15.34", + "dotenv": "^16.4.7", + "langchain": "^0.3.31", + "tsup": "^8.5.0", + "tsx": "^4.20.5", + "typed-openapi": "^2.2.2", + "typescript": "^5.8.3", + "vite": "^5.0.0", + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^3.2.4", + "wrangler": "^4.14.4", + "zod-to-json-schema": "^3.24.6" + }, + "files": [ + "dist", + "README.md" + ] +} diff --git a/products/mcp/typescript/pnpm-lock.yaml b/products/mcp/typescript/pnpm-lock.yaml new file mode 100644 index 0000000000..5b86343348 --- /dev/null +++ b/products/mcp/typescript/pnpm-lock.yaml @@ -0,0 +1,6132 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + .: + dependencies: + '@modelcontextprotocol/sdk': + specifier: ^1.17.3 + version: 1.17.3 + agents: + specifier: ^0.0.113 + version: 0.0.113(@cloudflare/workers-types@4.20250821.0)(react@19.1.1) + ai: + specifier: ^5.0.18 + version: 5.0.20(zod@3.25.76) + posthog-node: + specifier: ^4.18.0 + version: 4.18.0 + uuid: + specifier: ^11.1.0 + version: 11.1.0 + zod: + specifier: ^3.24.4 + version: 3.25.76 + devDependencies: + '@langchain/core': + specifier: ^0.3.72 + version: 0.3.72(@opentelemetry/api@1.9.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76)) + '@langchain/openai': + specifier: ^0.6.9 + version: 0.6.9(@langchain/core@0.3.72(@opentelemetry/api@1.9.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76)))(ws@8.18.0) + '@types/dotenv': + specifier: ^6.1.1 + version: 6.1.1 + '@types/node': + specifier: ^22.15.34 + version: 22.17.2 + dotenv: + specifier: ^16.4.7 + version: 16.6.1 + langchain: + specifier: ^0.3.31 + version: 0.3.31(@langchain/core@0.3.72(@opentelemetry/api@1.9.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(axios@1.11.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76))(ws@8.18.0) + tsup: + specifier: ^8.5.0 + version: 8.5.0(postcss@8.5.6)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1) + tsx: + specifier: ^4.20.5 + version: 4.20.5 + typed-openapi: + specifier: ^2.2.2 + version: 2.2.2(openapi-types@12.1.3)(react@19.1.1) + typescript: + specifier: ^5.8.3 + version: 5.9.2 + vite: + specifier: ^5.0.0 + version: 5.4.19(@types/node@22.17.2) + vite-tsconfig-paths: + specifier: ^5.1.4 + version: 5.1.4(typescript@5.9.2)(vite@5.4.19(@types/node@22.17.2)) + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@22.17.2) + wrangler: + specifier: ^4.14.4 + version: 4.32.0(@cloudflare/workers-types@4.20250821.0) + zod-to-json-schema: + specifier: ^3.24.6 + version: 3.24.6(zod@3.25.76) + +packages: + '@ai-sdk/gateway@1.0.9': + resolution: + { + integrity: sha512-kIfwunyUUwyBLg2KQcaRtjRQ1bDuJYPNIs4CNWaWPpMZ4SV5cRL1hLGMuX4bhfCJYDXHMGvJGLtUK6+iAJH2ZQ==, + } + engines: { node: '>=18' } + peerDependencies: + zod: ^3.25.76 || ^4 + + '@ai-sdk/provider-utils@2.2.8': + resolution: + { + integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==, + } + engines: { node: '>=18' } + peerDependencies: + zod: ^3.23.8 + + '@ai-sdk/provider-utils@3.0.4': + resolution: + { + integrity: sha512-/3Z6lfUp8r+ewFd9yzHkCmPlMOJUXup2Sx3aoUyrdXLhOmAfHRl6Z4lDbIdV0uvw/QYoBcVLJnvXN7ncYeS3uQ==, + } + engines: { node: '>=18' } + peerDependencies: + zod: ^3.25.76 || ^4 + + '@ai-sdk/provider@1.1.3': + resolution: + { + integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==, + } + engines: { node: '>=18' } + + '@ai-sdk/provider@2.0.0': + resolution: + { + integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==, + } + engines: { node: '>=18' } + + '@ai-sdk/react@1.2.12': + resolution: + { + integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==, + } + engines: { node: '>=18' } + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.23.8 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/ui-utils@1.2.11': + resolution: + { + integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==, + } + engines: { node: '>=18' } + peerDependencies: + zod: ^3.23.8 + + '@apidevtools/json-schema-ref-parser@11.7.2': + resolution: + { + integrity: sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==, + } + engines: { node: '>= 16' } + + '@apidevtools/openapi-schemas@2.1.0': + resolution: + { + integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==, + } + engines: { node: '>=10' } + + '@apidevtools/swagger-methods@3.0.2': + resolution: + { + integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==, + } + + '@apidevtools/swagger-parser@10.1.1': + resolution: + { + integrity: sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA==, + } + peerDependencies: + openapi-types: '>=7' + + '@ark/schema@0.46.0': + resolution: + { + integrity: sha512-c2UQdKgP2eqqDArfBqQIJppxJHvNNXuQPeuSPlDML4rjw+f1cu0qAlzOG4b8ujgm9ctIDWwhpyw6gjG5ledIVQ==, + } + + '@ark/util@0.46.0': + resolution: + { + integrity: sha512-JPy/NGWn/lvf1WmGCPw2VGpBg5utZraE84I7wli18EDF3p3zc/e9WolT35tINeZO3l7C77SjqRJeAUoT0CvMRg==, + } + + '@babel/code-frame@7.27.1': + resolution: + { + integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==, + } + engines: { node: '>=6.9.0' } + + '@babel/compat-data@7.28.4': + resolution: + { + integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==, + } + engines: { node: '>=6.9.0' } + + '@babel/core@7.28.4': + resolution: + { + integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==, + } + engines: { node: '>=6.9.0' } + + '@babel/generator@7.28.3': + resolution: + { + integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==, + } + engines: { node: '>=6.9.0' } + + '@babel/helper-compilation-targets@7.27.2': + resolution: + { + integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==, + } + engines: { node: '>=6.9.0' } + + '@babel/helper-globals@7.28.0': + resolution: + { + integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==, + } + engines: { node: '>=6.9.0' } + + '@babel/helper-module-imports@7.27.1': + resolution: + { + integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==, + } + engines: { node: '>=6.9.0' } + + '@babel/helper-module-transforms@7.28.3': + resolution: + { + integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.27.1': + resolution: + { + integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==, + } + engines: { node: '>=6.9.0' } + + '@babel/helper-validator-identifier@7.27.1': + resolution: + { + integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==, + } + engines: { node: '>=6.9.0' } + + '@babel/helper-validator-option@7.27.1': + resolution: + { + integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==, + } + engines: { node: '>=6.9.0' } + + '@babel/helpers@7.28.4': + resolution: + { + integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==, + } + engines: { node: '>=6.9.0' } + + '@babel/parser@7.28.4': + resolution: + { + integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==, + } + engines: { node: '>=6.0.0' } + hasBin: true + + '@babel/runtime-corejs3@7.28.3': + resolution: + { + integrity: sha512-LKYxD2CIfocUFNREQ1yk+dW+8OH8CRqmgatBZYXb+XhuObO8wsDpEoCNri5bKld9cnj8xukqZjxSX8p1YiRF8Q==, + } + engines: { node: '>=6.9.0' } + + '@babel/runtime@7.28.3': + resolution: + { + integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==, + } + engines: { node: '>=6.9.0' } + + '@babel/template@7.27.2': + resolution: + { + integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==, + } + engines: { node: '>=6.9.0' } + + '@babel/traverse@7.28.4': + resolution: + { + integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==, + } + engines: { node: '>=6.9.0' } + + '@babel/types@7.28.4': + resolution: + { + integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==, + } + engines: { node: '>=6.9.0' } + + '@cfworker/json-schema@4.1.1': + resolution: + { + integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==, + } + + '@cloudflare/kv-asset-handler@0.4.0': + resolution: + { + integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==, + } + engines: { node: '>=18.0.0' } + + '@cloudflare/unenv-preset@2.6.2': + resolution: + { + integrity: sha512-C7/tW7Qy+wGOCmHXu7xpP1TF3uIhRoi7zVY7dmu/SOSGjPilK+lSQ2lIRILulZsT467ZJNlI0jBxMbd8LzkGRg==, + } + peerDependencies: + unenv: 2.0.0-rc.19 + workerd: ^1.20250802.0 + peerDependenciesMeta: + workerd: + optional: true + + '@cloudflare/workerd-darwin-64@1.20250816.0': + resolution: + { + integrity: sha512-yN1Rga4ufTdrJPCP4gEqfB47i1lWi3teY5IoeQbUuKnjnCtm4pZvXur526JzCmaw60Jx+AEWf5tizdwRd5hHBQ==, + } + engines: { node: '>=16' } + cpu: [x64] + os: [darwin] + + '@cloudflare/workerd-darwin-arm64@1.20250816.0': + resolution: + { + integrity: sha512-WyKPMQhbU+TTf4uDz3SA7ZObspg7WzyJMv/7J4grSddpdx2A4Y4SfPu3wsZleAOIMOAEVi0A1sYDhdltKM7Mxg==, + } + engines: { node: '>=16' } + cpu: [arm64] + os: [darwin] + + '@cloudflare/workerd-linux-64@1.20250816.0': + resolution: + { + integrity: sha512-NWHOuFnVBaPRhLHw8kjPO9GJmc2P/CTYbnNlNm0EThyi57o/oDx0ldWLJqEHlrdEPOw7zEVGBqM/6M+V9agC6w==, + } + engines: { node: '>=16' } + cpu: [x64] + os: [linux] + + '@cloudflare/workerd-linux-arm64@1.20250816.0': + resolution: + { + integrity: sha512-FR+/yhaWs7FhfC3GKsM3+usQVrGEweJ9qyh7p+R6HNwnobgKr/h5ATWvJ4obGJF6ZHHodgSe+gOSYR7fkJ1xAQ==, + } + engines: { node: '>=16' } + cpu: [arm64] + os: [linux] + + '@cloudflare/workerd-windows-64@1.20250816.0': + resolution: + { + integrity: sha512-0lqClj2UMhFa8tCBiiX7Zhd5Bjp0V+X8oNBG6V6WsR9p9/HlIHAGgwRAM7aYkyG+8KC8xlbC89O2AXUXLpHx0g==, + } + engines: { node: '>=16' } + cpu: [x64] + os: [win32] + + '@cloudflare/workers-types@4.20250821.0': + resolution: + { + integrity: sha512-dbmorEqYnTMhSWh3lW3uBiufbzjvhrHsBD4SVNvhdhE1EdkkvAqhBzOyKRJxnQX04Afxm/txhdFe66eZrPPPkQ==, + } + + '@cspotcode/source-map-support@0.8.1': + resolution: + { + integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, + } + engines: { node: '>=12' } + + '@emnapi/runtime@1.4.5': + resolution: + { + integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==, + } + + '@esbuild/aix-ppc64@0.21.5': + resolution: + { + integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==, + } + engines: { node: '>=12' } + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.4': + resolution: + { + integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==, + } + engines: { node: '>=18' } + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.9': + resolution: + { + integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==, + } + engines: { node: '>=18' } + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: + { + integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==, + } + engines: { node: '>=12' } + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.4': + resolution: + { + integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.9': + resolution: + { + integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: + { + integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==, + } + engines: { node: '>=12' } + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.4': + resolution: + { + integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==, + } + engines: { node: '>=18' } + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.9': + resolution: + { + integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==, + } + engines: { node: '>=18' } + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: + { + integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.4': + resolution: + { + integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.9': + resolution: + { + integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: + { + integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==, + } + engines: { node: '>=12' } + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.4': + resolution: + { + integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.9': + resolution: + { + integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: + { + integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.4': + resolution: + { + integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.9': + resolution: + { + integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: + { + integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==, + } + engines: { node: '>=12' } + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.4': + resolution: + { + integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.9': + resolution: + { + integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: + { + integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.4': + resolution: + { + integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.9': + resolution: + { + integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: + { + integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==, + } + engines: { node: '>=12' } + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.4': + resolution: + { + integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.9': + resolution: + { + integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: + { + integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==, + } + engines: { node: '>=12' } + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.4': + resolution: + { + integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==, + } + engines: { node: '>=18' } + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.9': + resolution: + { + integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==, + } + engines: { node: '>=18' } + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: + { + integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==, + } + engines: { node: '>=12' } + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.4': + resolution: + { + integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==, + } + engines: { node: '>=18' } + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.9': + resolution: + { + integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==, + } + engines: { node: '>=18' } + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: + { + integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==, + } + engines: { node: '>=12' } + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.4': + resolution: + { + integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==, + } + engines: { node: '>=18' } + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.9': + resolution: + { + integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==, + } + engines: { node: '>=18' } + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: + { + integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==, + } + engines: { node: '>=12' } + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.4': + resolution: + { + integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==, + } + engines: { node: '>=18' } + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.9': + resolution: + { + integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==, + } + engines: { node: '>=18' } + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: + { + integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==, + } + engines: { node: '>=12' } + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.4': + resolution: + { + integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==, + } + engines: { node: '>=18' } + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.9': + resolution: + { + integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==, + } + engines: { node: '>=18' } + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: + { + integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==, + } + engines: { node: '>=12' } + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.4': + resolution: + { + integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==, + } + engines: { node: '>=18' } + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.9': + resolution: + { + integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==, + } + engines: { node: '>=18' } + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: + { + integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==, + } + engines: { node: '>=12' } + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.4': + resolution: + { + integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==, + } + engines: { node: '>=18' } + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.9': + resolution: + { + integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==, + } + engines: { node: '>=18' } + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: + { + integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.4': + resolution: + { + integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.9': + resolution: + { + integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.4': + resolution: + { + integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.25.9': + resolution: + { + integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: + { + integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.4': + resolution: + { + integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.9': + resolution: + { + integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.4': + resolution: + { + integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.25.9': + resolution: + { + integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: + { + integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.4': + resolution: + { + integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.9': + resolution: + { + integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.9': + resolution: + { + integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.21.5': + resolution: + { + integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.4': + resolution: + { + integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.9': + resolution: + { + integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: + { + integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==, + } + engines: { node: '>=12' } + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.4': + resolution: + { + integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.9': + resolution: + { + integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: + { + integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==, + } + engines: { node: '>=12' } + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.4': + resolution: + { + integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==, + } + engines: { node: '>=18' } + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.9': + resolution: + { + integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==, + } + engines: { node: '>=18' } + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: + { + integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==, + } + engines: { node: '>=12' } + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.4': + resolution: + { + integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.9': + resolution: + { + integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==, + } + engines: { node: '>=18' } + cpu: [x64] + os: [win32] + + '@img/sharp-darwin-arm64@0.33.5': + resolution: + { + integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: + { + integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: + { + integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==, + } + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: + { + integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==, + } + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: + { + integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==, + } + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: + { + integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==, + } + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: + { + integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==, + } + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: + { + integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==, + } + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: + { + integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==, + } + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: + { + integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==, + } + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: + { + integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: + { + integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: + { + integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: + { + integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: + { + integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: + { + integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: + { + integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: + { + integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: + { + integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + } + engines: { node: '>=12' } + + '@jridgewell/gen-mapping@0.3.13': + resolution: + { + integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==, + } + + '@jridgewell/remapping@2.3.5': + resolution: + { + integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==, + } + + '@jridgewell/resolve-uri@3.1.2': + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: '>=6.0.0' } + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: + { + integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==, + } + + '@jridgewell/trace-mapping@0.3.30': + resolution: + { + integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==, + } + + '@jridgewell/trace-mapping@0.3.9': + resolution: + { + integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, + } + + '@jsdevtools/ono@7.1.3': + resolution: + { + integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==, + } + + '@langchain/core@0.3.72': + resolution: + { + integrity: sha512-WsGWVZYnlKffj2eEfDocPNiaTRoxyYiLSQdQ7oxZvxGZBqo/90vpjbC33UGK1uPNBM4kT+pkdaol/MnvKUh8TQ==, + } + engines: { node: '>=18' } + + '@langchain/openai@0.6.9': + resolution: + { + integrity: sha512-Dl+YVBTFia7WE4/jFemQEVchPbsahy/dD97jo6A9gLnYfTkWa/jh8Q78UjHQ3lobif84j2ebjHPcDHG1L0NUWg==, + } + engines: { node: '>=18' } + peerDependencies: + '@langchain/core': '>=0.3.68 <0.4.0' + + '@langchain/textsplitters@0.1.0': + resolution: + { + integrity: sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==, + } + engines: { node: '>=18' } + peerDependencies: + '@langchain/core': '>=0.2.21 <0.4.0' + + '@modelcontextprotocol/sdk@1.17.3': + resolution: + { + integrity: sha512-JPwUKWSsbzx+DLFznf/QZ32Qa+ptfbUlHhRLrBQBAFu9iI1iYvizM4p+zhhRDceSsPutXp4z+R/HPVphlIiclg==, + } + engines: { node: '>=18' } + + '@opentelemetry/api@1.9.0': + resolution: + { + integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==, + } + engines: { node: '>=8.0.0' } + + '@pkgjs/parseargs@0.11.0': + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: '>=14' } + + '@poppinss/colors@4.1.5': + resolution: + { + integrity: sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==, + } + + '@poppinss/dumper@0.6.4': + resolution: + { + integrity: sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==, + } + + '@poppinss/exception@1.2.2': + resolution: + { + integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==, + } + + '@rollup/rollup-android-arm-eabi@4.47.1': + resolution: + { + integrity: sha512-lTahKRJip0knffA/GTNFJMrToD+CM+JJ+Qt5kjzBK/sFQ0EWqfKW3AYQSlZXN98tX0lx66083U9JYIMioMMK7g==, + } + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.47.1': + resolution: + { + integrity: sha512-uqxkb3RJLzlBbh/bbNQ4r7YpSZnjgMgyoEOY7Fy6GCbelkDSAzeiogxMG9TfLsBbqmGsdDObo3mzGqa8hps4MA==, + } + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.47.1': + resolution: + { + integrity: sha512-tV6reObmxBDS4DDyLzTDIpymthNlxrLBGAoQx6m2a7eifSNEZdkXQl1PE4ZjCkEDPVgNXSzND/k9AQ3mC4IOEQ==, + } + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.47.1': + resolution: + { + integrity: sha512-XuJRPTnMk1lwsSnS3vYyVMu4x/+WIw1MMSiqj5C4j3QOWsMzbJEK90zG+SWV1h0B1ABGCQ0UZUjti+TQK35uHQ==, + } + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.47.1': + resolution: + { + integrity: sha512-79BAm8Ag/tmJ5asCqgOXsb3WY28Rdd5Lxj8ONiQzWzy9LvWORd5qVuOnjlqiWWZJw+dWewEktZb5yiM1DLLaHw==, + } + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.47.1': + resolution: + { + integrity: sha512-OQ2/ZDGzdOOlyfqBiip0ZX/jVFekzYrGtUsqAfLDbWy0jh1PUU18+jYp8UMpqhly5ltEqotc2miLngf9FPSWIA==, + } + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.47.1': + resolution: + { + integrity: sha512-HZZBXJL1udxlCVvoVadstgiU26seKkHbbAMLg7680gAcMnRNP9SAwTMVet02ANA94kXEI2VhBnXs4e5nf7KG2A==, + } + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.47.1': + resolution: + { + integrity: sha512-sZ5p2I9UA7T950JmuZ3pgdKA6+RTBr+0FpK427ExW0t7n+QwYOcmDTK/aRlzoBrWyTpJNlS3kacgSlSTUg6P/Q==, + } + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.47.1': + resolution: + { + integrity: sha512-3hBFoqPyU89Dyf1mQRXCdpc6qC6At3LV6jbbIOZd72jcx7xNk3aAp+EjzAtN6sDlmHFzsDJN5yeUySvorWeRXA==, + } + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.47.1': + resolution: + { + integrity: sha512-49J4FnMHfGodJWPw73Ve+/hsPjZgcXQGkmqBGZFvltzBKRS+cvMiWNLadOMXKGnYRhs1ToTGM0sItKISoSGUNA==, + } + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.47.1': + resolution: + { + integrity: sha512-4yYU8p7AneEpQkRX03pbpLmE21z5JNys16F1BZBZg5fP9rIlb0TkeQjn5du5w4agConCCEoYIG57sNxjryHEGg==, + } + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.47.1': + resolution: + { + integrity: sha512-fAiq+J28l2YMWgC39jz/zPi2jqc0y3GSRo1yyxlBHt6UN0yYgnegHSRPa3pnHS5amT/efXQrm0ug5+aNEu9UuQ==, + } + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.47.1': + resolution: + { + integrity: sha512-daoT0PMENNdjVYYU9xec30Y2prb1AbEIbb64sqkcQcSaR0zYuKkoPuhIztfxuqN82KYCKKrj+tQe4Gi7OSm1ow==, + } + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.47.1': + resolution: + { + integrity: sha512-JNyXaAhWtdzfXu5pUcHAuNwGQKevR+6z/poYQKVW+pLaYOj9G1meYc57/1Xv2u4uTxfu9qEWmNTjv/H/EpAisw==, + } + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.47.1': + resolution: + { + integrity: sha512-U/CHbqKSwEQyZXjCpY43/GLYcTVKEXeRHw0rMBJP7fP3x6WpYG4LTJWR3ic6TeYKX6ZK7mrhltP4ppolyVhLVQ==, + } + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.47.1': + resolution: + { + integrity: sha512-uTLEakjxOTElfeZIGWkC34u2auLHB1AYS6wBjPGI00bWdxdLcCzK5awjs25YXpqB9lS8S0vbO0t9ZcBeNibA7g==, + } + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.47.1': + resolution: + { + integrity: sha512-Ft+d/9DXs30BK7CHCTX11FtQGHUdpNDLJW0HHLign4lgMgBcPFN3NkdIXhC5r9iwsMwYreBBc4Rho5ieOmKNVQ==, + } + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.47.1': + resolution: + { + integrity: sha512-N9X5WqGYzZnjGAFsKSfYFtAShYjwOmFJoWbLg3dYixZOZqU7hdMq+/xyS14zKLhFhZDhP9VfkzQnsdk0ZDS9IA==, + } + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.47.1': + resolution: + { + integrity: sha512-O+KcfeCORZADEY8oQJk4HK8wtEOCRE4MdOkb8qGZQNun3jzmj2nmhV/B/ZaaZOkPmJyvm/gW9n0gsB4eRa1eiQ==, + } + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.47.1': + resolution: + { + integrity: sha512-CpKnYa8eHthJa3c+C38v/E+/KZyF1Jdh2Cz3DyKZqEWYgrM1IHFArXNWvBLPQCKUEsAqqKX27tTqVEFbDNUcOA==, + } + cpu: [x64] + os: [win32] + + '@sinclair/typebox-codegen@0.11.1': + resolution: + { + integrity: sha512-Bckbrf1sJFTIVD88PvI0vWUfE3Sh/6pwu6Jov+6xyMrEqnabOxEFAmPSDWjB1FGPL5C1/HfdScwa1imwAtGi9w==, + } + + '@sinclair/typebox@0.33.22': + resolution: + { + integrity: sha512-auUj4k+f4pyrIVf4GW5UKquSZFHJWri06QgARy9C0t9ZTjJLIuNIrr1yl9bWcJWJ1Gz1vOvYN1D+QPaIlNMVkQ==, + } + + '@sindresorhus/is@7.0.2': + resolution: + { + integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==, + } + engines: { node: '>=18' } + + '@speed-highlight/core@1.2.7': + resolution: + { + integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==, + } + + '@standard-schema/spec@1.0.0': + resolution: + { + integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==, + } + + '@types/chai@5.2.2': + resolution: + { + integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==, + } + + '@types/deep-eql@4.0.2': + resolution: + { + integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==, + } + + '@types/diff-match-patch@1.0.36': + resolution: + { + integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==, + } + + '@types/dotenv@6.1.1': + resolution: + { + integrity: sha512-ftQl3DtBvqHl9L16tpqqzA4YzCSXZfi7g8cQceTz5rOlYtk/IZbFjAv3mLOQlNIgOaylCQWQoBdDQHPgEBJPHg==, + } + + '@types/estree@1.0.8': + resolution: + { + integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, + } + + '@types/json-schema@7.0.15': + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } + + '@types/node@22.17.2': + resolution: + { + integrity: sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w==, + } + + '@types/retry@0.12.0': + resolution: + { + integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==, + } + + '@types/uuid@10.0.0': + resolution: + { + integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==, + } + + '@vitest/expect@3.2.4': + resolution: + { + integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==, + } + + '@vitest/mocker@3.2.4': + resolution: + { + integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==, + } + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.4': + resolution: + { + integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==, + } + + '@vitest/runner@3.2.4': + resolution: + { + integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==, + } + + '@vitest/snapshot@3.2.4': + resolution: + { + integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==, + } + + '@vitest/spy@3.2.4': + resolution: + { + integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==, + } + + '@vitest/utils@3.2.4': + resolution: + { + integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==, + } + + accepts@2.0.0: + resolution: + { + integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==, + } + engines: { node: '>= 0.6' } + + acorn-walk@8.3.2: + resolution: + { + integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==, + } + engines: { node: '>=0.4.0' } + + acorn@8.14.0: + resolution: + { + integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==, + } + engines: { node: '>=0.4.0' } + hasBin: true + + acorn@8.15.0: + resolution: + { + integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, + } + engines: { node: '>=0.4.0' } + hasBin: true + + agents@0.0.113: + resolution: + { + integrity: sha512-PnUjSwFGYMcOWTcewo4NJZqN8gU2u1LFD17OhOzc83LZHa01P2o/qjLOVT338jWPzkPalXTj0RO19s0Lgyl6Ig==, + } + peerDependencies: + react: '*' + + ai@4.3.19: + resolution: + { + integrity: sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q==, + } + engines: { node: '>=18' } + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.23.8 + peerDependenciesMeta: + react: + optional: true + + ai@5.0.20: + resolution: + { + integrity: sha512-zesSsm03ELeiqwU63IP8grTWuWtywil+XqA+64/8ALUVbsuCt/4fj7Sdk0G/k4f7oSo31lIVAdlj6rzx7d0GhQ==, + } + engines: { node: '>=18' } + peerDependencies: + zod: ^3.25.76 || ^4 + + ajv-draft-04@1.0.0: + resolution: + { + integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==, + } + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + + ajv@8.17.1: + resolution: + { + integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==, + } + + ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: '>=8' } + + ansi-regex@6.2.0: + resolution: + { + integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==, + } + engines: { node: '>=12' } + + ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: '>=8' } + + ansi-styles@5.2.0: + resolution: + { + integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, + } + engines: { node: '>=10' } + + ansi-styles@6.2.1: + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: '>=12' } + + any-promise@1.3.0: + resolution: + { + integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, + } + + argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + arktype@2.1.20: + resolution: + { + integrity: sha512-IZCEEXaJ8g+Ijd59WtSYwtjnqXiwM8sWQ5EjGamcto7+HVN9eK0C4p0zDlCuAwWhpqr6fIBkxPuYDl4/Mcj/+Q==, + } + + assertion-error@2.0.1: + resolution: + { + integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, + } + engines: { node: '>=12' } + + asynckit@0.4.0: + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } + + axios@1.11.0: + resolution: + { + integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==, + } + + balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + + baseline-browser-mapping@2.8.4: + resolution: + { + integrity: sha512-L+YvJwGAgwJBV1p6ffpSTa2KRc69EeeYGYjRVWKs0GKrK+LON0GC0gV+rKSNtALEDvMDqkvCFq9r1r94/Gjwxw==, + } + hasBin: true + + blake3-wasm@2.1.5: + resolution: + { + integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==, + } + + body-parser@2.2.0: + resolution: + { + integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==, + } + engines: { node: '>=18' } + + brace-expansion@2.0.2: + resolution: + { + integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==, + } + + browserslist@4.26.0: + resolution: + { + integrity: sha512-P9go2WrP9FiPwLv3zqRD/Uoxo0RSHjzFCiQz7d4vbmwNqQFo9T9WCeP/Qn5EbcKQY6DBbkxEXNcpJOmncNrb7A==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + + bundle-require@5.1.0: + resolution: + { + integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + peerDependencies: + esbuild: '>=0.18' + + bytes@3.1.2: + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, + } + engines: { node: '>= 0.8' } + + cac@6.7.14: + resolution: + { + integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, + } + engines: { node: '>=8' } + + call-bind-apply-helpers@1.0.2: + resolution: + { + integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, + } + engines: { node: '>= 0.4' } + + call-bound@1.0.4: + resolution: + { + integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==, + } + engines: { node: '>= 0.4' } + + call-me-maybe@1.0.2: + resolution: + { + integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==, + } + + camelcase@6.3.0: + resolution: + { + integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, + } + engines: { node: '>=10' } + + caniuse-lite@1.0.30001741: + resolution: + { + integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==, + } + + chai@5.3.1: + resolution: + { + integrity: sha512-48af6xm9gQK8rhIcOxWwdGzIervm8BVTin+yRp9HEvU20BtVZ2lBywlIJBzwaDtvo0FvjeL7QdCADoUoqIbV3A==, + } + engines: { node: '>=18' } + + chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: '>=10' } + + chalk@5.6.0: + resolution: + { + integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + + check-error@2.1.1: + resolution: + { + integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==, + } + engines: { node: '>= 16' } + + chokidar@4.0.3: + resolution: + { + integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==, + } + engines: { node: '>= 14.16.0' } + + color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: '>=7.0.0' } + + color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + color-string@1.9.1: + resolution: + { + integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, + } + + color@4.2.3: + resolution: + { + integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==, + } + engines: { node: '>=12.5.0' } + + combined-stream@1.0.8: + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: '>= 0.8' } + + commander@4.1.1: + resolution: + { + integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, + } + engines: { node: '>= 6' } + + confbox@0.1.8: + resolution: + { + integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==, + } + + consola@3.4.2: + resolution: + { + integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==, + } + engines: { node: ^14.18.0 || >=16.10.0 } + + console-table-printer@2.14.6: + resolution: + { + integrity: sha512-MCBl5HNVaFuuHW6FGbL/4fB7N/ormCy+tQ+sxTrF6QtSbSNETvPuOVbkJBhzDgYhvjWGrTma4eYJa37ZuoQsPw==, + } + + content-disposition@1.0.0: + resolution: + { + integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==, + } + engines: { node: '>= 0.6' } + + content-type@1.0.5: + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: '>= 0.6' } + + convert-source-map@2.0.0: + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } + + cookie-signature@1.2.2: + resolution: + { + integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==, + } + engines: { node: '>=6.6.0' } + + cookie@0.7.2: + resolution: + { + integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==, + } + engines: { node: '>= 0.6' } + + cookie@1.0.2: + resolution: + { + integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==, + } + engines: { node: '>=18' } + + core-js-pure@3.45.1: + resolution: + { + integrity: sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==, + } + + cors@2.8.5: + resolution: + { + integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==, + } + engines: { node: '>= 0.10' } + + cron-schedule@5.0.4: + resolution: + { + integrity: sha512-nH0a49E/kSVk6BeFgKZy4uUsy6D2A16p120h5bYD9ILBhQu7o2sJFH+WI4R731TSBQ0dB1Ik7inB/dRAB4C8QQ==, + } + engines: { node: '>=18' } + + cross-spawn@7.0.6: + resolution: + { + integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, + } + engines: { node: '>= 8' } + + debug@4.4.1: + resolution: + { + integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==, + } + engines: { node: '>=6.0' } + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: + { + integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, + } + engines: { node: '>=0.10.0' } + + deep-eql@5.0.2: + resolution: + { + integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==, + } + engines: { node: '>=6' } + + defu@6.1.4: + resolution: + { + integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==, + } + + delayed-stream@1.0.0: + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: '>=0.4.0' } + + depd@2.0.0: + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: '>= 0.8' } + + dequal@2.0.3: + resolution: + { + integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, + } + engines: { node: '>=6' } + + detect-libc@2.0.4: + resolution: + { + integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==, + } + engines: { node: '>=8' } + + diff-match-patch@1.0.5: + resolution: + { + integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==, + } + + dotenv@16.6.1: + resolution: + { + integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==, + } + engines: { node: '>=12' } + + dunder-proto@1.0.1: + resolution: + { + integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, + } + engines: { node: '>= 0.4' } + + eastasianwidth@0.2.0: + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } + + ee-first@1.1.1: + resolution: + { + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, + } + + electron-to-chromium@1.5.218: + resolution: + { + integrity: sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg==, + } + + emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + + emoji-regex@9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } + + encodeurl@2.0.0: + resolution: + { + integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, + } + engines: { node: '>= 0.8' } + + error-stack-parser-es@1.0.5: + resolution: + { + integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==, + } + + es-define-property@1.0.1: + resolution: + { + integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, + } + engines: { node: '>= 0.4' } + + es-errors@1.3.0: + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: '>= 0.4' } + + es-module-lexer@1.7.0: + resolution: + { + integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==, + } + + es-object-atoms@1.1.1: + resolution: + { + integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, + } + engines: { node: '>= 0.4' } + + es-set-tostringtag@2.1.0: + resolution: + { + integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, + } + engines: { node: '>= 0.4' } + + esbuild@0.21.5: + resolution: + { + integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==, + } + engines: { node: '>=12' } + hasBin: true + + esbuild@0.25.4: + resolution: + { + integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==, + } + engines: { node: '>=18' } + hasBin: true + + esbuild@0.25.9: + resolution: + { + integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==, + } + engines: { node: '>=18' } + hasBin: true + + escalade@3.2.0: + resolution: + { + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, + } + engines: { node: '>=6' } + + escape-html@1.0.3: + resolution: + { + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, + } + + estree-walker@3.0.3: + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } + + etag@1.8.1: + resolution: + { + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, + } + engines: { node: '>= 0.6' } + + event-target-polyfill@0.0.4: + resolution: + { + integrity: sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==, + } + + eventemitter3@4.0.7: + resolution: + { + integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, + } + + eventsource-parser@3.0.5: + resolution: + { + integrity: sha512-bSRG85ZrMdmWtm7qkF9He9TNRzc/Bm99gEJMaQoHJ9E6Kv9QBbsldh2oMj7iXmYNEAVvNgvv5vPorG6W+XtBhQ==, + } + engines: { node: '>=20.0.0' } + + eventsource@3.0.7: + resolution: + { + integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==, + } + engines: { node: '>=18.0.0' } + + exit-hook@2.2.1: + resolution: + { + integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, + } + engines: { node: '>=6' } + + expect-type@1.2.2: + resolution: + { + integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==, + } + engines: { node: '>=12.0.0' } + + express-rate-limit@7.5.1: + resolution: + { + integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==, + } + engines: { node: '>= 16' } + peerDependencies: + express: '>= 4.11' + + express@5.1.0: + resolution: + { + integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==, + } + engines: { node: '>= 18' } + + exsolve@1.0.7: + resolution: + { + integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==, + } + + fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + + fast-uri@3.1.0: + resolution: + { + integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==, + } + + fdir@6.5.0: + resolution: + { + integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, + } + engines: { node: '>=12.0.0' } + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + finalhandler@2.1.0: + resolution: + { + integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==, + } + engines: { node: '>= 0.8' } + + fix-dts-default-cjs-exports@1.0.1: + resolution: + { + integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==, + } + + follow-redirects@1.15.11: + resolution: + { + integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==, + } + engines: { node: '>=4.0' } + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.1: + resolution: + { + integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, + } + engines: { node: '>=14' } + + form-data@4.0.4: + resolution: + { + integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==, + } + engines: { node: '>= 6' } + + forwarded@0.2.0: + resolution: + { + integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, + } + engines: { node: '>= 0.6' } + + fresh@2.0.0: + resolution: + { + integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==, + } + engines: { node: '>= 0.8' } + + fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + + function-bind@1.1.2: + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } + + gensync@1.0.0-beta.2: + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: '>=6.9.0' } + + get-intrinsic@1.3.0: + resolution: + { + integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, + } + engines: { node: '>= 0.4' } + + get-proto@1.0.1: + resolution: + { + integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, + } + engines: { node: '>= 0.4' } + + get-tsconfig@4.10.1: + resolution: + { + integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==, + } + + glob-to-regexp@0.4.1: + resolution: + { + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + } + + glob@10.4.5: + resolution: + { + integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, + } + hasBin: true + + globrex@0.1.2: + resolution: + { + integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==, + } + + gopd@1.2.0: + resolution: + { + integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, + } + engines: { node: '>= 0.4' } + + has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: '>=8' } + + has-symbols@1.1.0: + resolution: + { + integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, + } + engines: { node: '>= 0.4' } + + has-tostringtag@1.0.2: + resolution: + { + integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, + } + engines: { node: '>= 0.4' } + + hasown@2.0.2: + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: '>= 0.4' } + + http-errors@2.0.0: + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, + } + engines: { node: '>= 0.8' } + + iconv-lite@0.6.3: + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + engines: { node: '>=0.10.0' } + + inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + ipaddr.js@1.9.1: + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, + } + engines: { node: '>= 0.10' } + + is-arrayish@0.3.2: + resolution: + { + integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, + } + + is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: '>=8' } + + is-promise@4.0.0: + resolution: + { + integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==, + } + + isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + jackspeak@3.4.3: + resolution: + { + integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, + } + + joycon@3.1.1: + resolution: + { + integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, + } + engines: { node: '>=10' } + + js-base64@3.7.8: + resolution: + { + integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==, + } + + js-tiktoken@1.0.21: + resolution: + { + integrity: sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==, + } + + js-tokens@4.0.0: + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } + + js-tokens@9.0.1: + resolution: + { + integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==, + } + + js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + + jsesc@3.1.0: + resolution: + { + integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, + } + engines: { node: '>=6' } + hasBin: true + + json-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + + json-schema-traverse@1.0.0: + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } + + json-schema@0.4.0: + resolution: + { + integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, + } + + json5@2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: '>=6' } + hasBin: true + + jsondiffpatch@0.6.0: + resolution: + { + integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + + jsonpointer@5.0.1: + resolution: + { + integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==, + } + engines: { node: '>=0.10.0' } + + kleur@4.1.5: + resolution: + { + integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, + } + engines: { node: '>=6' } + + langchain@0.3.31: + resolution: + { + integrity: sha512-C7n7WGa44RytsuxEtGcArVcXidRqzjl6UWQxaG3NdIw4gIqErWoOlNC1qADAa04H5JAOARxuE6S99+WNXB/rzA==, + } + engines: { node: '>=18' } + peerDependencies: + '@langchain/anthropic': '*' + '@langchain/aws': '*' + '@langchain/cerebras': '*' + '@langchain/cohere': '*' + '@langchain/core': '>=0.3.58 <0.4.0' + '@langchain/deepseek': '*' + '@langchain/google-genai': '*' + '@langchain/google-vertexai': '*' + '@langchain/google-vertexai-web': '*' + '@langchain/groq': '*' + '@langchain/mistralai': '*' + '@langchain/ollama': '*' + '@langchain/xai': '*' + axios: '*' + cheerio: '*' + handlebars: ^4.7.8 + peggy: ^3.0.2 + typeorm: '*' + peerDependenciesMeta: + '@langchain/anthropic': + optional: true + '@langchain/aws': + optional: true + '@langchain/cerebras': + optional: true + '@langchain/cohere': + optional: true + '@langchain/deepseek': + optional: true + '@langchain/google-genai': + optional: true + '@langchain/google-vertexai': + optional: true + '@langchain/google-vertexai-web': + optional: true + '@langchain/groq': + optional: true + '@langchain/mistralai': + optional: true + '@langchain/ollama': + optional: true + '@langchain/xai': + optional: true + axios: + optional: true + cheerio: + optional: true + handlebars: + optional: true + peggy: + optional: true + typeorm: + optional: true + + langsmith@0.3.62: + resolution: + { + integrity: sha512-ApoGLs28cJCxL91l1PDDkjsA4oLrbeNlE1pyTvyopqXq9bNJrP8JPUNWZm/tpU0DzZpvZFctRzru4gNAr/bkxg==, + } + peerDependencies: + '@opentelemetry/api': '*' + '@opentelemetry/exporter-trace-otlp-proto': '*' + '@opentelemetry/sdk-trace-base': '*' + openai: '*' + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@opentelemetry/exporter-trace-otlp-proto': + optional: true + '@opentelemetry/sdk-trace-base': + optional: true + openai: + optional: true + + lilconfig@3.1.3: + resolution: + { + integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==, + } + engines: { node: '>=14' } + + lines-and-columns@1.2.4: + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } + + load-tsconfig@0.2.5: + resolution: + { + integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + lodash.sortby@4.7.0: + resolution: + { + integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, + } + + loupe@3.2.0: + resolution: + { + integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==, + } + + lru-cache@10.4.3: + resolution: + { + integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, + } + + lru-cache@5.1.1: + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } + + magic-string@0.30.17: + resolution: + { + integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==, + } + + math-intrinsics@1.1.0: + resolution: + { + integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, + } + engines: { node: '>= 0.4' } + + media-typer@1.1.0: + resolution: + { + integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==, + } + engines: { node: '>= 0.8' } + + merge-descriptors@2.0.0: + resolution: + { + integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==, + } + engines: { node: '>=18' } + + mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: '>= 0.6' } + + mime-db@1.54.0: + resolution: + { + integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==, + } + engines: { node: '>= 0.6' } + + mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: '>= 0.6' } + + mime-types@3.0.1: + resolution: + { + integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==, + } + engines: { node: '>= 0.6' } + + mime@3.0.0: + resolution: + { + integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, + } + engines: { node: '>=10.0.0' } + hasBin: true + + mimetext@3.0.27: + resolution: + { + integrity: sha512-mUhWAsZD1N/K6dbN4+a5Yq78OPnYQw1ubOSMasBntsLQ2S7KVNlvDEA8dwpr4a7PszWMzeslKahAprtwYMgaBA==, + } + + miniflare@4.20250816.1: + resolution: + { + integrity: sha512-2X8yMy5wWw0dF1pNU4kztzZgp0jWv2KMqAOOb2FeQ/b11yck4aczmYHi7UYD3uyOgtj8WFhwG/KdRWAaATTtRA==, + } + engines: { node: '>=18.0.0' } + hasBin: true + + minimatch@9.0.5: + resolution: + { + integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, + } + engines: { node: '>=16 || 14 >=14.17' } + + minipass@7.1.2: + resolution: + { + integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, + } + engines: { node: '>=16 || 14 >=14.17' } + + mlly@1.7.4: + resolution: + { + integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==, + } + + ms@2.1.3: + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } + + mustache@4.2.0: + resolution: + { + integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==, + } + hasBin: true + + mz@2.7.0: + resolution: + { + integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, + } + + nanoid@3.3.11: + resolution: + { + integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + + nanoid@5.1.5: + resolution: + { + integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==, + } + engines: { node: ^18 || >=20 } + hasBin: true + + negotiator@1.0.0: + resolution: + { + integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==, + } + engines: { node: '>= 0.6' } + + node-releases@2.0.21: + resolution: + { + integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==, + } + + object-assign@4.1.1: + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: '>=0.10.0' } + + object-inspect@1.13.4: + resolution: + { + integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, + } + engines: { node: '>= 0.4' } + + ohash@2.0.11: + resolution: + { + integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==, + } + + on-finished@2.4.1: + resolution: + { + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, + } + engines: { node: '>= 0.8' } + + once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + + openai@5.12.2: + resolution: + { + integrity: sha512-xqzHHQch5Tws5PcKR2xsZGX9xtch+JQFz5zb14dGqlshmmDAFBFEWmeIpf7wVqWV+w7Emj7jRgkNJakyKE0tYQ==, + } + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + openapi-types@12.1.3: + resolution: + { + integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==, + } + + openapi3-ts@4.5.0: + resolution: + { + integrity: sha512-jaL+HgTq2Gj5jRcfdutgRGLosCy/hT8sQf6VOy+P+g36cZOjI1iukdPnijC+4CmeRzg/jEllJUboEic2FhxhtQ==, + } + + p-finally@1.0.0: + resolution: + { + integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==, + } + engines: { node: '>=4' } + + p-queue@6.6.2: + resolution: + { + integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==, + } + engines: { node: '>=8' } + + p-retry@4.6.2: + resolution: + { + integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==, + } + engines: { node: '>=8' } + + p-timeout@3.2.0: + resolution: + { + integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==, + } + engines: { node: '>=8' } + + package-json-from-dist@1.0.1: + resolution: + { + integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, + } + + parseurl@1.3.3: + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, + } + engines: { node: '>= 0.8' } + + partyserver@0.0.72: + resolution: + { + integrity: sha512-mYkCQ6Q4KBIy4lFFuA6upmvNeD/FC+CQVTd4V3DYU6nsitKVI3NXxBrNNvmIxJLSwk3JQzYcEOPBkebB7ITVpQ==, + } + peerDependencies: + '@cloudflare/workers-types': ^4.20240729.0 + + partysocket@1.1.5: + resolution: + { + integrity: sha512-8uw9foq9bij4sKLCtTSHvyqMrMTQ5FJjrHc7BjoM2s95Vu7xYCN63ABpI7OZHC7ZMP5xaom/A+SsoFPXmTV6ZQ==, + } + + pastable@2.2.1: + resolution: + { + integrity: sha512-K4ClMxRKpgN4sXj6VIPPrvor/TMp2yPNCGtfhvV106C73SwefQ3FuegURsH7AQHpqu0WwbvKXRl1HQxF6qax9w==, + } + engines: { node: '>=14.x' } + peerDependencies: + react: '>=17' + xstate: '>=4.32.1' + peerDependenciesMeta: + react: + optional: true + xstate: + optional: true + + path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: '>=8' } + + path-scurry@1.11.1: + resolution: + { + integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, + } + engines: { node: '>=16 || 14 >=14.18' } + + path-to-regexp@6.3.0: + resolution: + { + integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==, + } + + path-to-regexp@8.2.0: + resolution: + { + integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==, + } + engines: { node: '>=16' } + + pathe@2.0.3: + resolution: + { + integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, + } + + pathval@2.0.1: + resolution: + { + integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==, + } + engines: { node: '>= 14.16' } + + picocolors@1.1.1: + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } + + picomatch@4.0.3: + resolution: + { + integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==, + } + engines: { node: '>=12' } + + pirates@4.0.7: + resolution: + { + integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==, + } + engines: { node: '>= 6' } + + pkce-challenge@5.0.0: + resolution: + { + integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==, + } + engines: { node: '>=16.20.0' } + + pkg-types@1.3.1: + resolution: + { + integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==, + } + + postcss-load-config@6.0.1: + resolution: + { + integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==, + } + engines: { node: '>= 18' } + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss@8.5.6: + resolution: + { + integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==, + } + engines: { node: ^10 || ^12 || >=14 } + + posthog-node@4.18.0: + resolution: + { + integrity: sha512-XROs1h+DNatgKh/AlIlCtDxWzwrKdYDb2mOs58n4yN8BkGN9ewqeQwG5ApS4/IzwCb7HPttUkOVulkYatd2PIw==, + } + engines: { node: '>=15.0.0' } + + prettier@2.8.8: + resolution: + { + integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==, + } + engines: { node: '>=10.13.0' } + hasBin: true + + prettier@3.5.3: + resolution: + { + integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==, + } + engines: { node: '>=14' } + hasBin: true + + proxy-addr@2.0.7: + resolution: + { + integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, + } + engines: { node: '>= 0.10' } + + proxy-from-env@1.1.0: + resolution: + { + integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, + } + + punycode@2.3.1: + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: '>=6' } + + qs@6.14.0: + resolution: + { + integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==, + } + engines: { node: '>=0.6' } + + range-parser@1.2.1: + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: '>= 0.6' } + + raw-body@3.0.0: + resolution: + { + integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==, + } + engines: { node: '>= 0.8' } + + react@19.1.1: + resolution: + { + integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==, + } + engines: { node: '>=0.10.0' } + + readdirp@4.1.2: + resolution: + { + integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==, + } + engines: { node: '>= 14.18.0' } + + require-from-string@2.0.2: + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: '>=0.10.0' } + + resolve-from@5.0.0: + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + } + engines: { node: '>=8' } + + resolve-pkg-maps@1.0.0: + resolution: + { + integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, + } + + retry@0.13.1: + resolution: + { + integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, + } + engines: { node: '>= 4' } + + rollup@4.47.1: + resolution: + { + integrity: sha512-iasGAQoZ5dWDzULEUX3jiW0oB1qyFOepSyDyoU6S/OhVlDIwj5knI5QBa5RRQ0sK7OE0v+8VIi2JuV+G+3tfNg==, + } + engines: { node: '>=18.0.0', npm: '>=8.0.0' } + hasBin: true + + router@2.2.0: + resolution: + { + integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==, + } + engines: { node: '>= 18' } + + safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + + safer-buffer@2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + + secure-json-parse@2.7.0: + resolution: + { + integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==, + } + + semver@6.3.1: + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } + hasBin: true + + semver@7.7.2: + resolution: + { + integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==, + } + engines: { node: '>=10' } + hasBin: true + + send@1.2.0: + resolution: + { + integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==, + } + engines: { node: '>= 18' } + + serve-static@2.2.0: + resolution: + { + integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==, + } + engines: { node: '>= 18' } + + setprototypeof@1.2.0: + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + } + + sharp@0.33.5: + resolution: + { + integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + + shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: '>=8' } + + shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: '>=8' } + + side-channel-list@1.0.0: + resolution: + { + integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, + } + engines: { node: '>= 0.4' } + + side-channel-map@1.0.1: + resolution: + { + integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, + } + engines: { node: '>= 0.4' } + + side-channel-weakmap@1.0.2: + resolution: + { + integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, + } + engines: { node: '>= 0.4' } + + side-channel@1.1.0: + resolution: + { + integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, + } + engines: { node: '>= 0.4' } + + siginfo@2.0.0: + resolution: + { + integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, + } + + signal-exit@4.1.0: + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: '>=14' } + + simple-swizzle@0.2.2: + resolution: + { + integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, + } + + simple-wcswidth@1.1.2: + resolution: + { + integrity: sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==, + } + + source-map-js@1.2.1: + resolution: + { + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + } + engines: { node: '>=0.10.0' } + + source-map@0.8.0-beta.0: + resolution: + { + integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==, + } + engines: { node: '>= 8' } + + stackback@0.0.2: + resolution: + { + integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, + } + + statuses@2.0.1: + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + } + engines: { node: '>= 0.8' } + + statuses@2.0.2: + resolution: + { + integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==, + } + engines: { node: '>= 0.8' } + + std-env@3.9.0: + resolution: + { + integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==, + } + + stoppable@1.1.0: + resolution: + { + integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, + } + engines: { node: '>=4', npm: '>=6' } + + string-width@4.2.3: + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: '>=8' } + + string-width@5.1.2: + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: '>=12' } + + strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: '>=8' } + + strip-ansi@7.1.0: + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: '>=12' } + + strip-literal@3.0.0: + resolution: + { + integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==, + } + + sucrase@3.35.0: + resolution: + { + integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, + } + engines: { node: '>=16 || 14 >=14.17' } + hasBin: true + + supports-color@10.2.0: + resolution: + { + integrity: sha512-5eG9FQjEjDbAlI5+kdpdyPIBMRH4GfTVDGREVupaZHmVoppknhM29b/S9BkQz7cathp85BVgRi/As3Siln7e0Q==, + } + engines: { node: '>=18' } + + supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: '>=8' } + + swr@2.3.6: + resolution: + { + integrity: sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==, + } + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + thenify-all@1.6.0: + resolution: + { + integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, + } + engines: { node: '>=0.8' } + + thenify@3.3.1: + resolution: + { + integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, + } + + throttleit@2.1.0: + resolution: + { + integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==, + } + engines: { node: '>=18' } + + tinybench@2.9.0: + resolution: + { + integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, + } + + tinyexec@0.3.2: + resolution: + { + integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, + } + + tinyglobby@0.2.14: + resolution: + { + integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==, + } + engines: { node: '>=12.0.0' } + + tinypool@1.1.1: + resolution: + { + integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + + tinyrainbow@2.0.0: + resolution: + { + integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==, + } + engines: { node: '>=14.0.0' } + + tinyspy@4.0.3: + resolution: + { + integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==, + } + engines: { node: '>=14.0.0' } + + toidentifier@1.0.1: + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: '>=0.6' } + + tr46@1.0.1: + resolution: + { + integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==, + } + + tree-kill@1.2.2: + resolution: + { + integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==, + } + hasBin: true + + ts-interface-checker@0.1.13: + resolution: + { + integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, + } + + ts-pattern@5.8.0: + resolution: + { + integrity: sha512-kIjN2qmWiHnhgr5DAkAafF9fwb0T5OhMVSWrm8XEdTFnX6+wfXwYOFjeF86UZ54vduqiR7BfqScFmXSzSaH8oA==, + } + + ts-toolbelt@9.6.0: + resolution: + { + integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==, + } + + tsconfck@3.1.6: + resolution: + { + integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==, + } + engines: { node: ^18 || >=20 } + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@2.8.1: + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } + + tsup@8.5.0: + resolution: + { + integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==, + } + engines: { node: '>=18' } + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tsx@4.20.5: + resolution: + { + integrity: sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==, + } + engines: { node: '>=18.0.0' } + hasBin: true + + type-fest@3.13.1: + resolution: + { + integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==, + } + engines: { node: '>=14.16' } + + type-is@2.0.1: + resolution: + { + integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==, + } + engines: { node: '>= 0.6' } + + typed-openapi@2.2.2: + resolution: + { + integrity: sha512-ONZDYZ2NvL4f2RXwvpf83pfaSiHpffIvQZurw0KyCUZ5EqZmCEjwoU5K7moRqnwKeQD9adWRHTRrVUMLOXajSA==, + } + hasBin: true + + typescript@5.9.2: + resolution: + { + integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==, + } + engines: { node: '>=14.17' } + hasBin: true + + ufo@1.6.1: + resolution: + { + integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==, + } + + undici-types@6.21.0: + resolution: + { + integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==, + } + + undici@7.14.0: + resolution: + { + integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==, + } + engines: { node: '>=20.18.1' } + + unenv@2.0.0-rc.19: + resolution: + { + integrity: sha512-t/OMHBNAkknVCI7bVB9OWjUUAwhVv9vsPIAGnNUxnu3FxPQN11rjh0sksLMzc3g7IlTgvHmOTl4JM7JHpcv5wA==, + } + + unpipe@1.0.0: + resolution: + { + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, + } + engines: { node: '>= 0.8' } + + update-browserslist-db@1.1.3: + resolution: + { + integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==, + } + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + + use-sync-external-store@1.5.0: + resolution: + { + integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==, + } + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + uuid@10.0.0: + resolution: + { + integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==, + } + hasBin: true + + uuid@11.1.0: + resolution: + { + integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==, + } + hasBin: true + + vary@1.1.2: + resolution: + { + integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, + } + engines: { node: '>= 0.8' } + + vite-node@3.2.4: + resolution: + { + integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true + + vite-tsconfig-paths@5.1.4: + resolution: + { + integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==, + } + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@5.4.19: + resolution: + { + integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@3.2.4: + resolution: + { + integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + webidl-conversions@4.0.2: + resolution: + { + integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==, + } + + whatwg-url@7.1.0: + resolution: + { + integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==, + } + + which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: '>= 8' } + hasBin: true + + why-is-node-running@2.3.0: + resolution: + { + integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==, + } + engines: { node: '>=8' } + hasBin: true + + workerd@1.20250816.0: + resolution: + { + integrity: sha512-5gIvHPE/3QVlQR1Sc1NdBkWmqWj/TSgIbY/f/qs9lhiLBw/Da+HbNBTVYGjvwYqEb3NQ+XQM4gAm5b2+JJaUJg==, + } + engines: { node: '>=16' } + hasBin: true + + wrangler@4.32.0: + resolution: + { + integrity: sha512-q7TRSavBW3Eg3pp4rxqKJwSK+u/ieFOBdNvUsq1P1EMmyj3//tN/iXDokFak+dkW0vDYjsVG3PfOfHxU92OS6w==, + } + engines: { node: '>=18.0.0' } + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^4.20250816.0 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + + wrap-ansi@7.0.0: + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: '>=10' } + + wrap-ansi@8.1.0: + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: '>=12' } + + wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + ws@8.18.0: + resolution: + { + integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==, + } + engines: { node: '>=10.0.0' } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + yallist@3.1.1: + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } + + yaml@2.8.1: + resolution: + { + integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==, + } + engines: { node: '>= 14.6' } + hasBin: true + + youch-core@0.3.3: + resolution: + { + integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==, + } + + youch@4.1.0-beta.10: + resolution: + { + integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==, + } + + zod-to-json-schema@3.24.6: + resolution: + { + integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==, + } + peerDependencies: + zod: ^3.24.1 + + zod@3.22.3: + resolution: + { + integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==, + } + + zod@3.25.76: + resolution: + { + integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==, + } + +snapshots: + '@ai-sdk/gateway@1.0.9(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.4(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/provider-utils@2.2.8(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + nanoid: 3.3.11 + secure-json-parse: 2.7.0 + zod: 3.25.76 + + '@ai-sdk/provider-utils@3.0.4(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.5 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + + '@ai-sdk/provider@1.1.3': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@2.0.0': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/react@1.2.12(react@19.1.1)(zod@3.25.76)': + dependencies: + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + react: 19.1.1 + swr: 2.3.6(react@19.1.1) + throttleit: 2.1.0 + optionalDependencies: + zod: 3.25.76 + + '@ai-sdk/ui-utils@1.2.11(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + + '@apidevtools/json-schema-ref-parser@11.7.2': + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + js-yaml: 4.1.0 + + '@apidevtools/openapi-schemas@2.1.0': {} + + '@apidevtools/swagger-methods@3.0.2': {} + + '@apidevtools/swagger-parser@10.1.1(openapi-types@12.1.3)': + dependencies: + '@apidevtools/json-schema-ref-parser': 11.7.2 + '@apidevtools/openapi-schemas': 2.1.0 + '@apidevtools/swagger-methods': 3.0.2 + '@jsdevtools/ono': 7.1.3 + ajv: 8.17.1 + ajv-draft-04: 1.0.0(ajv@8.17.1) + call-me-maybe: 1.0.2 + openapi-types: 12.1.3 + + '@ark/schema@0.46.0': + dependencies: + '@ark/util': 0.46.0 + + '@ark/util@0.46.0': {} + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.4': {} + + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.4 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.26.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/runtime-corejs3@7.28.3': + dependencies: + core-js-pure: 3.45.1 + + '@babel/runtime@7.28.3': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@babel/traverse@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@cfworker/json-schema@4.1.1': {} + + '@cloudflare/kv-asset-handler@0.4.0': + dependencies: + mime: 3.0.0 + + '@cloudflare/unenv-preset@2.6.2(unenv@2.0.0-rc.19)(workerd@1.20250816.0)': + dependencies: + unenv: 2.0.0-rc.19 + optionalDependencies: + workerd: 1.20250816.0 + + '@cloudflare/workerd-darwin-64@1.20250816.0': + optional: true + + '@cloudflare/workerd-darwin-arm64@1.20250816.0': + optional: true + + '@cloudflare/workerd-linux-64@1.20250816.0': + optional: true + + '@cloudflare/workerd-linux-arm64@1.20250816.0': + optional: true + + '@cloudflare/workerd-windows-64@1.20250816.0': + optional: true + + '@cloudflare/workers-types@4.20250821.0': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@emnapi/runtime@1.4.5': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.25.4': + optional: true + + '@esbuild/aix-ppc64@0.25.9': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.25.4': + optional: true + + '@esbuild/android-arm64@0.25.9': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.4': + optional: true + + '@esbuild/android-arm@0.25.9': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.4': + optional: true + + '@esbuild/android-x64@0.25.9': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.25.4': + optional: true + + '@esbuild/darwin-arm64@0.25.9': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.25.4': + optional: true + + '@esbuild/darwin-x64@0.25.9': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.4': + optional: true + + '@esbuild/freebsd-arm64@0.25.9': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.25.4': + optional: true + + '@esbuild/freebsd-x64@0.25.9': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.25.4': + optional: true + + '@esbuild/linux-arm64@0.25.9': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.25.4': + optional: true + + '@esbuild/linux-arm@0.25.9': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.25.4': + optional: true + + '@esbuild/linux-ia32@0.25.9': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.4': + optional: true + + '@esbuild/linux-loong64@0.25.9': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.4': + optional: true + + '@esbuild/linux-mips64el@0.25.9': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.4': + optional: true + + '@esbuild/linux-ppc64@0.25.9': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.4': + optional: true + + '@esbuild/linux-riscv64@0.25.9': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.4': + optional: true + + '@esbuild/linux-s390x@0.25.9': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.25.4': + optional: true + + '@esbuild/linux-x64@0.25.9': + optional: true + + '@esbuild/netbsd-arm64@0.25.4': + optional: true + + '@esbuild/netbsd-arm64@0.25.9': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.4': + optional: true + + '@esbuild/netbsd-x64@0.25.9': + optional: true + + '@esbuild/openbsd-arm64@0.25.4': + optional: true + + '@esbuild/openbsd-arm64@0.25.9': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.25.4': + optional: true + + '@esbuild/openbsd-x64@0.25.9': + optional: true + + '@esbuild/openharmony-arm64@0.25.9': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.4': + optional: true + + '@esbuild/sunos-x64@0.25.9': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.4': + optional: true + + '@esbuild/win32-arm64@0.25.9': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.4': + optional: true + + '@esbuild/win32-ia32@0.25.9': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.25.4': + optional: true + + '@esbuild/win32-x64@0.25.9': + optional: true + + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.4.5 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.30': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jsdevtools/ono@7.1.3': {} + + '@langchain/core@0.3.72(@opentelemetry/api@1.9.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76))': + dependencies: + '@cfworker/json-schema': 4.1.1 + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.21 + langsmith: 0.3.62(@opentelemetry/api@1.9.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76)) + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + + '@langchain/openai@0.6.9(@langchain/core@0.3.72(@opentelemetry/api@1.9.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76)))(ws@8.18.0)': + dependencies: + '@langchain/core': 0.3.72(@opentelemetry/api@1.9.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76)) + js-tiktoken: 1.0.21 + openai: 5.12.2(ws@8.18.0)(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - ws + + '@langchain/textsplitters@0.1.0(@langchain/core@0.3.72(@opentelemetry/api@1.9.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76)))': + dependencies: + '@langchain/core': 0.3.72(@opentelemetry/api@1.9.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76)) + js-tiktoken: 1.0.21 + + '@modelcontextprotocol/sdk@1.17.3': + dependencies: + ajv: 6.12.6 + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.5 + express: 5.1.0 + express-rate-limit: 7.5.1(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.0 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/api@1.9.0': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@poppinss/colors@4.1.5': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.6.4': + dependencies: + '@poppinss/colors': 4.1.5 + '@sindresorhus/is': 7.0.2 + supports-color: 10.2.0 + + '@poppinss/exception@1.2.2': {} + + '@rollup/rollup-android-arm-eabi@4.47.1': + optional: true + + '@rollup/rollup-android-arm64@4.47.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.47.1': + optional: true + + '@rollup/rollup-darwin-x64@4.47.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.47.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.47.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.47.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.47.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.47.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.47.1': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.47.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.47.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.47.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.47.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.47.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.47.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.47.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.47.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.47.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.47.1': + optional: true + + '@sinclair/typebox-codegen@0.11.1': + dependencies: + '@sinclair/typebox': 0.33.22 + prettier: 2.8.8 + typescript: 5.9.2 + + '@sinclair/typebox@0.33.22': {} + + '@sindresorhus/is@7.0.2': {} + + '@speed-highlight/core@1.2.7': {} + + '@standard-schema/spec@1.0.0': {} + + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + + '@types/deep-eql@4.0.2': {} + + '@types/diff-match-patch@1.0.36': {} + + '@types/dotenv@6.1.1': + dependencies: + '@types/node': 22.17.2 + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@22.17.2': + dependencies: + undici-types: 6.21.0 + + '@types/retry@0.12.0': {} + + '@types/uuid@10.0.0': {} + + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.1 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.4(vite@5.4.19(@types/node@22.17.2))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 5.4.19(@types/node@22.17.2) + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.0.0 + + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.17 + pathe: 2.0.3 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.3 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.0 + tinyrainbow: 2.0.0 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + + acorn-walk@8.3.2: {} + + acorn@8.14.0: {} + + acorn@8.15.0: {} + + agents@0.0.113(@cloudflare/workers-types@4.20250821.0)(react@19.1.1): + dependencies: + '@modelcontextprotocol/sdk': 1.17.3 + ai: 4.3.19(react@19.1.1)(zod@3.25.76) + cron-schedule: 5.0.4 + mimetext: 3.0.27 + nanoid: 5.1.5 + partyserver: 0.0.72(@cloudflare/workers-types@4.20250821.0) + partysocket: 1.1.5 + react: 19.1.1 + zod: 3.25.76 + transitivePeerDependencies: + - '@cloudflare/workers-types' + - supports-color + + ai@4.3.19(react@19.1.1)(zod@3.25.76): + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/react': 1.2.12(react@19.1.1)(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + jsondiffpatch: 0.6.0 + zod: 3.25.76 + optionalDependencies: + react: 19.1.1 + + ai@5.0.20(zod@3.25.76): + dependencies: + '@ai-sdk/gateway': 1.0.9(zod@3.25.76) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.4(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + zod: 3.25.76 + + ajv-draft-04@1.0.0(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + argparse@2.0.1: {} + + arktype@2.1.20: + dependencies: + '@ark/schema': 0.46.0 + '@ark/util': 0.46.0 + + assertion-error@2.0.1: {} + + asynckit@0.4.0: {} + + axios@1.11.0: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + baseline-browser-mapping@2.8.4: {} + + blake3-wasm@2.1.5: {} + + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.1 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + browserslist@4.26.0: + dependencies: + baseline-browser-mapping: 2.8.4 + caniuse-lite: 1.0.30001741 + electron-to-chromium: 1.5.218 + node-releases: 2.0.21 + update-browserslist-db: 1.1.3(browserslist@4.26.0) + + bundle-require@5.1.0(esbuild@0.25.9): + dependencies: + esbuild: 0.25.9 + load-tsconfig: 0.2.5 + + bytes@3.1.2: {} + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + call-me-maybe@1.0.2: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001741: {} + + chai@5.3.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.0 + pathval: 2.0.1 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.0: {} + + check-error@2.1.1: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@4.1.1: {} + + confbox@0.1.8: {} + + consola@3.4.2: {} + + console-table-printer@2.14.6: + dependencies: + simple-wcswidth: 1.1.2 + + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + cookie@1.0.2: {} + + core-js-pure@3.45.1: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cron-schedule@5.0.4: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decamelize@1.2.0: {} + + deep-eql@5.0.2: {} + + defu@6.1.4: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + detect-libc@2.0.4: {} + + diff-match-patch@1.0.5: {} + + dotenv@16.6.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.218: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@2.0.0: {} + + error-stack-parser-es@1.0.5: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.25.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 + + esbuild@0.25.9: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + etag@1.8.1: {} + + event-target-polyfill@0.0.4: {} + + eventemitter3@4.0.7: {} + + eventsource-parser@3.0.5: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.5 + + exit-hook@2.2.1: {} + + expect-type@1.2.2: {} + + express-rate-limit@7.5.1(express@5.1.0): + dependencies: + express: 5.1.0 + + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + exsolve@1.0.7: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-uri@3.1.0: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + finalhandler@2.1.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.17 + mlly: 1.7.4 + rollup: 4.47.1 + + follow-redirects@1.15.11: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-to-regexp@0.4.1: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globrex@0.1.2: {} + + gopd@1.2.0: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + inherits@2.0.4: {} + + ipaddr.js@1.9.1: {} + + is-arrayish@0.3.2: {} + + is-fullwidth-code-point@3.0.0: {} + + is-promise@4.0.0: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + joycon@3.1.1: {} + + js-base64@3.7.8: {} + + js-tiktoken@1.0.21: + dependencies: + base64-js: 1.5.1 + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + + json5@2.2.3: {} + + jsondiffpatch@0.6.0: + dependencies: + '@types/diff-match-patch': 1.0.36 + chalk: 5.6.0 + diff-match-patch: 1.0.5 + + jsonpointer@5.0.1: {} + + kleur@4.1.5: {} + + langchain@0.3.31(@langchain/core@0.3.72(@opentelemetry/api@1.9.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(axios@1.11.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76))(ws@8.18.0): + dependencies: + '@langchain/core': 0.3.72(@opentelemetry/api@1.9.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76)) + '@langchain/openai': 0.6.9(@langchain/core@0.3.72(@opentelemetry/api@1.9.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76)))(ws@8.18.0) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.72(@opentelemetry/api@1.9.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76))) + js-tiktoken: 1.0.21 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langsmith: 0.3.62(@opentelemetry/api@1.9.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76)) + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 10.0.0 + yaml: 2.8.1 + zod: 3.25.76 + optionalDependencies: + axios: 1.11.0 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + - ws + + langsmith@0.3.62(@opentelemetry/api@1.9.0)(openai@5.12.2(ws@8.18.0)(zod@3.25.76)): + dependencies: + '@types/uuid': 10.0.0 + chalk: 4.1.2 + console-table-printer: 2.14.6 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.7.2 + uuid: 10.0.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + openai: 5.12.2(ws@8.18.0)(zod@3.25.76) + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} + + lodash.sortby@4.7.0: {} + + loupe@3.2.0: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + math-intrinsics@1.1.0: {} + + media-typer@1.1.0: {} + + merge-descriptors@2.0.0: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + + mime@3.0.0: {} + + mimetext@3.0.27: + dependencies: + '@babel/runtime': 7.28.3 + '@babel/runtime-corejs3': 7.28.3 + js-base64: 3.7.8 + mime-types: 2.1.35 + + miniflare@4.20250816.1: + dependencies: + '@cspotcode/source-map-support': 0.8.1 + acorn: 8.14.0 + acorn-walk: 8.3.2 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + sharp: 0.33.5 + stoppable: 1.1.0 + undici: 7.14.0 + workerd: 1.20250816.0 + ws: 8.18.0 + youch: 4.1.0-beta.10 + zod: 3.22.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass@7.1.2: {} + + mlly@1.7.4: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + ms@2.1.3: {} + + mustache@4.2.0: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.11: {} + + nanoid@5.1.5: {} + + negotiator@1.0.0: {} + + node-releases@2.0.21: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + ohash@2.0.11: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + openai@5.12.2(ws@8.18.0)(zod@3.25.76): + optionalDependencies: + ws: 8.18.0 + zod: 3.25.76 + + openapi-types@12.1.3: {} + + openapi3-ts@4.5.0: + dependencies: + yaml: 2.8.1 + + p-finally@1.0.0: {} + + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + + p-retry@4.6.2: + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + + package-json-from-dist@1.0.1: {} + + parseurl@1.3.3: {} + + partyserver@0.0.72(@cloudflare/workers-types@4.20250821.0): + dependencies: + '@cloudflare/workers-types': 4.20250821.0 + nanoid: 5.1.5 + + partysocket@1.1.5: + dependencies: + event-target-polyfill: 0.0.4 + + pastable@2.2.1(react@19.1.1): + dependencies: + '@babel/core': 7.28.4 + ts-toolbelt: 9.6.0 + type-fest: 3.13.1 + optionalDependencies: + react: 19.1.1 + transitivePeerDependencies: + - supports-color + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@6.3.0: {} + + path-to-regexp@8.2.0: {} + + pathe@2.0.3: {} + + pathval@2.0.1: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + pirates@4.0.7: {} + + pkce-challenge@5.0.0: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + postcss-load-config@6.0.1(postcss@8.5.6)(tsx@4.20.5)(yaml@2.8.1): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + postcss: 8.5.6 + tsx: 4.20.5 + yaml: 2.8.1 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + posthog-node@4.18.0: + dependencies: + axios: 1.11.0 + transitivePeerDependencies: + - debug + + prettier@2.8.8: {} + + prettier@3.5.3: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@1.1.0: {} + + punycode@2.3.1: {} + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + range-parser@1.2.1: {} + + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + + react@19.1.1: {} + + readdirp@4.1.2: {} + + require-from-string@2.0.2: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + retry@0.13.1: {} + + rollup@4.47.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.47.1 + '@rollup/rollup-android-arm64': 4.47.1 + '@rollup/rollup-darwin-arm64': 4.47.1 + '@rollup/rollup-darwin-x64': 4.47.1 + '@rollup/rollup-freebsd-arm64': 4.47.1 + '@rollup/rollup-freebsd-x64': 4.47.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.47.1 + '@rollup/rollup-linux-arm-musleabihf': 4.47.1 + '@rollup/rollup-linux-arm64-gnu': 4.47.1 + '@rollup/rollup-linux-arm64-musl': 4.47.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.47.1 + '@rollup/rollup-linux-ppc64-gnu': 4.47.1 + '@rollup/rollup-linux-riscv64-gnu': 4.47.1 + '@rollup/rollup-linux-riscv64-musl': 4.47.1 + '@rollup/rollup-linux-s390x-gnu': 4.47.1 + '@rollup/rollup-linux-x64-gnu': 4.47.1 + '@rollup/rollup-linux-x64-musl': 4.47.1 + '@rollup/rollup-win32-arm64-msvc': 4.47.1 + '@rollup/rollup-win32-ia32-msvc': 4.47.1 + '@rollup/rollup-win32-x64-msvc': 4.47.1 + fsevents: 2.3.3 + + router@2.2.0: + dependencies: + debug: 4.4.1 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + secure-json-parse@2.7.0: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + send@1.2.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.4 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + simple-wcswidth@1.1.2: {} + + source-map-js@1.2.1: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + stackback@0.0.2: {} + + statuses@2.0.1: {} + + statuses@2.0.2: {} + + std-env@3.9.0: {} + + stoppable@1.1.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.2.0 + + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + + supports-color@10.2.0: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + swr@2.3.6(react@19.1.1): + dependencies: + dequal: 2.0.3 + react: 19.1.1 + use-sync-external-store: 1.5.0(react@19.1.1) + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + throttleit@2.1.0: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.14: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.3: {} + + toidentifier@1.0.1: {} + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + ts-interface-checker@0.1.13: {} + + ts-pattern@5.8.0: {} + + ts-toolbelt@9.6.0: {} + + tsconfck@3.1.6(typescript@5.9.2): + optionalDependencies: + typescript: 5.9.2 + + tslib@2.8.1: + optional: true + + tsup@8.5.0(postcss@8.5.6)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.9) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.1 + esbuild: 0.25.9 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.5.6)(tsx@4.20.5)(yaml@2.8.1) + resolve-from: 5.0.0 + rollup: 4.47.1 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.6 + typescript: 5.9.2 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + tsx@4.20.5: + dependencies: + esbuild: 0.25.9 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 + + type-fest@3.13.1: {} + + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + + typed-openapi@2.2.2(openapi-types@12.1.3)(react@19.1.1): + dependencies: + '@apidevtools/swagger-parser': 10.1.1(openapi-types@12.1.3) + '@sinclair/typebox-codegen': 0.11.1 + arktype: 2.1.20 + cac: 6.7.14 + openapi3-ts: 4.5.0 + pastable: 2.2.1(react@19.1.1) + pathe: 2.0.3 + prettier: 3.5.3 + ts-pattern: 5.8.0 + transitivePeerDependencies: + - openapi-types + - react + - supports-color + - xstate + + typescript@5.9.2: {} + + ufo@1.6.1: {} + + undici-types@6.21.0: {} + + undici@7.14.0: {} + + unenv@2.0.0-rc.19: + dependencies: + defu: 6.1.4 + exsolve: 1.0.7 + ohash: 2.0.11 + pathe: 2.0.3 + ufo: 1.6.1 + + unpipe@1.0.0: {} + + update-browserslist-db@1.1.3(browserslist@4.26.0): + dependencies: + browserslist: 4.26.0 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-sync-external-store@1.5.0(react@19.1.1): + dependencies: + react: 19.1.1 + + uuid@10.0.0: {} + + uuid@11.1.0: {} + + vary@1.1.2: {} + + vite-node@3.2.4(@types/node@22.17.2): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 5.4.19(@types/node@22.17.2) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@5.4.19(@types/node@22.17.2)): + dependencies: + debug: 4.4.1 + globrex: 0.1.2 + tsconfck: 3.1.6(typescript@5.9.2) + optionalDependencies: + vite: 5.4.19(@types/node@22.17.2) + transitivePeerDependencies: + - supports-color + - typescript + + vite@5.4.19(@types/node@22.17.2): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.47.1 + optionalDependencies: + '@types/node': 22.17.2 + fsevents: 2.3.3 + + vitest@3.2.4(@types/node@22.17.2): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@5.4.19(@types/node@22.17.2)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.1 + debug: 4.4.1 + expect-type: 1.2.2 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 5.4.19(@types/node@22.17.2) + vite-node: 3.2.4(@types/node@22.17.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.17.2 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + webidl-conversions@4.0.2: {} + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + workerd@1.20250816.0: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20250816.0 + '@cloudflare/workerd-darwin-arm64': 1.20250816.0 + '@cloudflare/workerd-linux-64': 1.20250816.0 + '@cloudflare/workerd-linux-arm64': 1.20250816.0 + '@cloudflare/workerd-windows-64': 1.20250816.0 + + wrangler@4.32.0(@cloudflare/workers-types@4.20250821.0): + dependencies: + '@cloudflare/kv-asset-handler': 0.4.0 + '@cloudflare/unenv-preset': 2.6.2(unenv@2.0.0-rc.19)(workerd@1.20250816.0) + blake3-wasm: 2.1.5 + esbuild: 0.25.4 + miniflare: 4.20250816.1 + path-to-regexp: 6.3.0 + unenv: 2.0.0-rc.19 + workerd: 1.20250816.0 + optionalDependencies: + '@cloudflare/workers-types': 4.20250821.0 + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + ws@8.18.0: {} + + yallist@3.1.1: {} + + yaml@2.8.1: {} + + youch-core@0.3.3: + dependencies: + '@poppinss/exception': 1.2.2 + error-stack-parser-es: 1.0.5 + + youch@4.1.0-beta.10: + dependencies: + '@poppinss/colors': 4.1.5 + '@poppinss/dumper': 0.6.4 + '@speed-highlight/core': 1.2.7 + cookie: 1.0.2 + youch-core: 0.3.3 + + zod-to-json-schema@3.24.6(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod@3.22.3: {} + + zod@3.25.76: {} diff --git a/products/mcp/typescript/scripts/generate-tool-schema.ts b/products/mcp/typescript/scripts/generate-tool-schema.ts new file mode 100755 index 0000000000..3433f02cb0 --- /dev/null +++ b/products/mcp/typescript/scripts/generate-tool-schema.ts @@ -0,0 +1,58 @@ +#!/usr/bin/env tsx + +// Generates JSON schema from Zod tool-inputs schemas for Python Pydantic schema generation + +import * as fs from 'node:fs' +import * as path from 'node:path' +import { zodToJsonSchema } from 'zod-to-json-schema' +import * as schemas from '../src/schema/tool-inputs' + +const outputPath = path.join(__dirname, '../../schema/tool-inputs.json') + +try { + // Convert all Zod schemas to JSON Schema + const jsonSchemas = { + $schema: 'http://json-schema.org/draft-07/schema#', + definitions: {} as Record, + } + + // Add each schema to the definitions + for (const [schemaName, zodSchema] of Object.entries(schemas)) { + if (schemaName.endsWith('Schema')) { + const jsonSchema = zodToJsonSchema(zodSchema, { + name: schemaName, + $refStrategy: 'none', + }) + + // Remove the top-level $schema to avoid conflicts + jsonSchema.$schema = undefined + + // Extract the actual schema from nested definitions if present + let actualSchema = jsonSchema + const schemaObj = jsonSchema as any + + // If there's nested definitions with the schema name, use that + if (schemaObj.definitions?.[schemaName]) { + actualSchema = schemaObj.definitions[schemaName] + } + // If there's a $ref pointing to itself, and definitions exist, extract the definition + else if (schemaObj.$ref?.includes(schemaName) && schemaObj.definitions) { + actualSchema = schemaObj.definitions[schemaName] || schemaObj + } + + // Clean up any remaining $schema references + if (actualSchema.$schema) { + actualSchema.$schema = undefined + } + + jsonSchemas.definitions[schemaName] = actualSchema + } + } + + // Write the combined schema + const schemaString = JSON.stringify(jsonSchemas, null, 2) + fs.writeFileSync(outputPath, schemaString) +} catch (err) { + console.error('❌ Error generating schema:', err) + process.exit(1) +} diff --git a/products/mcp/typescript/scripts/update-openapi-client.ts b/products/mcp/typescript/scripts/update-openapi-client.ts new file mode 100644 index 0000000000..fff5611490 --- /dev/null +++ b/products/mcp/typescript/scripts/update-openapi-client.ts @@ -0,0 +1,68 @@ +#!/usr/bin/env tsx + +import { execSync } from 'node:child_process' +import * as fs from 'node:fs' + +const SCHEMA_URL = 'https://app.posthog.com/api/schema/' +const TEMP_SCHEMA_PATH = 'temp-openapi.yaml' +const OUTPUT_PATH = 'src/api/generated.ts' + +async function fetchSchema() { + try { + const response = await fetch(SCHEMA_URL) + if (!response.ok) { + throw new Error(`Failed to fetch schema: ${response.status} ${response.statusText}`) + } + + const schema = await response.text() + fs.writeFileSync(TEMP_SCHEMA_PATH, schema, 'utf-8') + + return true + } catch (error) { + console.error('Error fetching schema:', error) + return false + } +} + +function generateClient() { + try { + execSync(`pnpm typed-openapi ${TEMP_SCHEMA_PATH} --output ${OUTPUT_PATH}`, { + stdio: 'inherit', + }) + + return true + } catch (error) { + console.error('Error generating client:', error) + return false + } +} + +function cleanup() { + try { + if (fs.existsSync(TEMP_SCHEMA_PATH)) { + fs.unlinkSync(TEMP_SCHEMA_PATH) + } + } catch (error) { + console.error('Warning: Could not clean up temporary file:', error) + } +} + +async function main() { + const schemaFetched = await fetchSchema() + if (!schemaFetched) { + process.exit(1) + } + + const clientGenerated = generateClient() + + cleanup() + + if (!clientGenerated) { + process.exit(1) + } +} + +main().catch((error) => { + console.error('Unexpected error:', error) + process.exit(1) +}) diff --git a/products/mcp/typescript/src/api/client.ts b/products/mcp/typescript/src/api/client.ts new file mode 100644 index 0000000000..c6a607cff8 --- /dev/null +++ b/products/mcp/typescript/src/api/client.ts @@ -0,0 +1,1312 @@ +import { ErrorCode } from '@/lib/errors' +import { withPagination } from '@/lib/utils/api' +import { getSearchParamsFromRecord } from '@/lib/utils/helper-functions' +import { + type ApiEventDefinition, + ApiEventDefinitionSchema, + type ApiPropertyDefinition, + ApiPropertyDefinitionSchema, + type ApiRedactedPersonalApiKey, + ApiRedactedPersonalApiKeySchema, + type ApiUser, + ApiUserSchema, +} from '@/schema/api' +import { + type CreateDashboardInput, + CreateDashboardInputSchema, + type ListDashboardsData, + ListDashboardsSchema, + type SimpleDashboard, + SimpleDashboardSchema, +} from '@/schema/dashboards' +import type { + Experiment, + ExperimentExposureQuery, + ExperimentExposureQueryResponse, + ExperimentUpdateApiPayload, +} from '@/schema/experiments' +import { + ExperimentCreatePayloadSchema, + ExperimentExposureQueryResponseSchema, + ExperimentExposureQuerySchema, + ExperimentSchema, + ExperimentUpdateApiPayloadSchema, +} from '@/schema/experiments' +import { + type CreateFeatureFlagInput, + CreateFeatureFlagInputSchema, + type FeatureFlag, + FeatureFlagSchema, + type UpdateFeatureFlagInput, + UpdateFeatureFlagInputSchema, +} from '@/schema/flags' +import { + type CreateInsightInput, + CreateInsightInputSchema, + type ListInsightsData, + ListInsightsSchema, + type SimpleInsight, + SimpleInsightSchema, +} from '@/schema/insights' +import { type Organization, OrganizationSchema } from '@/schema/orgs' +import { type Project, ProjectSchema } from '@/schema/projects' +import type { ExperimentCreateSchema } from '@/schema/tool-inputs' +import { isShortId } from '@/tools/insights/utils' +import { z } from 'zod' +import type { + CreateSurveyInput, + GetSurveySpecificStatsInput, + GetSurveyStatsInput, + ListSurveysInput, + SurveyListItemOutput, + SurveyOutput, + SurveyResponseStatsOutput, + UpdateSurveyInput, +} from '../schema/surveys.js' +import { + CreateSurveyInputSchema, + GetSurveySpecificStatsInputSchema, + GetSurveyStatsInputSchema, + ListSurveysInputSchema, + SurveyListItemOutputSchema, + SurveyOutputSchema, + SurveyResponseStatsOutputSchema, + UpdateSurveyInputSchema, +} from '../schema/surveys.js' +import { buildApiFetcher } from './fetcher' +import { type Schemas, createApiClient } from './generated' + +export type Result = { success: true; data: T } | { success: false; error: E } + +export interface ApiConfig { + apiToken: string + baseUrl: string +} +export class ApiClient { + private config: ApiConfig + private baseUrl: string + // NOTE: The OpenAPI schema for the generated client is not always accurate + public generated: ReturnType + + constructor(config: ApiConfig) { + this.config = config + this.baseUrl = config.baseUrl + + this.generated = createApiClient(buildApiFetcher(this.config), this.baseUrl) + } + private buildHeaders() { + return { + Authorization: `Bearer ${this.config.apiToken}`, + 'Content-Type': 'application/json', + } + } + + getProjectBaseUrl(projectId: string) { + if (projectId === '@current') { + return this.baseUrl + } + + return `${this.baseUrl}/project/${projectId}` + } + + private async fetchWithSchema( + url: string, + schema: z.ZodType, + options?: RequestInit + ): Promise> { + try { + const response = await fetch(url, { + ...options, + headers: { + ...this.buildHeaders(), + ...options?.headers, + }, + }) + + if (!response.ok) { + if (response.status === 401) { + throw new Error(ErrorCode.INVALID_API_KEY) + } + + const errorText = await response.text() + + let errorData: any + try { + errorData = JSON.parse(errorText) + } catch { + errorData = { detail: errorText } + } + + if (errorData.type === 'validation_error' && errorData.code) { + throw new Error(`Validation error: ${errorData.code}`) + } + + throw new Error( + `Request failed:\nStatus Code: ${response.status} (${response.statusText})\nError Message: ${errorText}` + ) + } + + const rawData = await response.json() + const parseResult = schema.safeParse(rawData) + + if (!parseResult.success) { + throw new Error(`Response validation failed: ${parseResult.error.message}`) + } + + return { success: true, data: parseResult.data } + } catch (error) { + return { success: false, error: error as Error } + } + } + + organizations() { + return { + list: async (): Promise> => { + const responseSchema = z.object({ + results: z.array(OrganizationSchema), + }) + + const result = await this.fetchWithSchema( + `${this.baseUrl}/api/organizations/`, + responseSchema + ) + + if (result.success) { + return { success: true, data: result.data.results } + } + return result + }, + + get: async ({ orgId }: { orgId: string }): Promise> => { + return this.fetchWithSchema( + `${this.baseUrl}/api/organizations/${orgId}/`, + OrganizationSchema + ) + }, + + projects: ({ orgId }: { orgId: string }) => { + return { + list: async (): Promise> => { + const responseSchema = z.object({ + results: z.array(ProjectSchema), + }) + + const result = await this.fetchWithSchema( + `${this.baseUrl}/api/organizations/${orgId}/projects/`, + responseSchema + ) + + if (result.success) { + return { success: true, data: result.data.results } + } + return result + }, + } + }, + } + } + + apiKeys() { + return { + current: async (): Promise> => { + return this.fetchWithSchema( + `${this.baseUrl}/api/personal_api_keys/@current`, + ApiRedactedPersonalApiKeySchema + ) + }, + } + } + + projects() { + return { + get: async ({ projectId }: { projectId: string }): Promise> => { + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/`, + ProjectSchema + ) + }, + + propertyDefinitions: async ({ + projectId, + eventNames, + excludeCoreProperties, + filterByEventNames, + isFeatureFlag, + limit, + offset, + type, + }: { + projectId: string + eventNames?: string[] | undefined + excludeCoreProperties?: boolean + filterByEventNames?: boolean + isFeatureFlag?: boolean + limit?: number + offset?: number + type?: 'event' | 'person' + }): Promise> => { + try { + const params = { + event_names: eventNames?.length ? JSON.stringify(eventNames) : undefined, + exclude_core_properties: excludeCoreProperties, + filter_by_event_names: filterByEventNames, + is_feature_flag: isFeatureFlag, + limit: limit ?? 100, + offset: offset ?? 0, + type: type ?? 'event', + exclude_hidden: true, + } + + const searchParams = getSearchParamsFromRecord(params) + + const url = `${this.baseUrl}/api/projects/${projectId}/property_definitions/${ + searchParams.toString() ? `?${searchParams}` : '' + }` + + const propertyDefinitions = await withPagination( + url, + this.config.apiToken, + ApiPropertyDefinitionSchema + ) + + const propertyDefinitionsWithoutHidden = propertyDefinitions.filter( + (def) => !def.hidden + ) + + return { success: true, data: propertyDefinitionsWithoutHidden } + } catch (error) { + return { success: false, error: error as Error } + } + }, + + eventDefinitions: async ({ + projectId, + search, + }: { + projectId: string + search?: string | undefined + }): Promise> => { + try { + const searchParams = getSearchParamsFromRecord({ search }) + + const requestUrl = `${this.baseUrl}/api/projects/${projectId}/event_definitions/${searchParams.toString() ? `?${searchParams}` : ''}` + + const eventDefinitions = await withPagination( + requestUrl, + this.config.apiToken, + ApiEventDefinitionSchema + ) + + return { success: true, data: eventDefinitions } + } catch (error) { + return { success: false, error: error as Error } + } + }, + } + } + + experiments({ projectId }: { projectId: string }) { + return { + list: async (): Promise> => { + try { + const response = await withPagination( + `${this.baseUrl}/api/projects/${projectId}/experiments/`, + this.config.apiToken, + ExperimentSchema + ) + + return { success: true, data: response } + } catch (error) { + return { success: false, error: error as Error } + } + }, + + get: async ({ + experimentId, + }: { + experimentId: number + }): Promise> => { + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/experiments/${experimentId}/`, + ExperimentSchema + ) + }, + + getExposures: async ({ + experimentId, + refresh = false, + }: { + experimentId: number + refresh: boolean + }): Promise< + Result<{ + exposures: ExperimentExposureQueryResponse + }> + > => { + /** + * we have to get the experiment details first. There's no guarantee + * that the user has queried for the experiment details before. + */ + const experimentDetails = await this.experiments({ projectId }).get({ + experimentId, + }) + if (!experimentDetails.success) { + return experimentDetails + } + + const experiment = experimentDetails.data + + /** + * Validate that the experiment has started + */ + if (!experiment.start_date) { + return { + success: false, + error: new Error( + `Experiment "${experiment.name}" has not started yet. Exposure data is only available for started experiments.` + ), + } + } + + /** + * create the exposure query + */ + const exposureQuery: ExperimentExposureQuery = { + kind: 'ExperimentExposureQuery', + experiment_id: experimentId, + experiment_name: experiment.name, + exposure_criteria: experiment.exposure_criteria, + feature_flag: experiment.feature_flag as FeatureFlag, + start_date: experiment.start_date, + end_date: experiment.end_date, + holdout: experiment.holdout, + } + + // Validate against existing ExperimentExposureQuerySchema + const validated = ExperimentExposureQuerySchema.parse(exposureQuery) + + // The API expects a QueryRequest object with the query wrapped + const queryRequest: any = { + query: validated, + ...(refresh ? { refresh: 'blocking' } : {}), + } + + const result = await this.fetchWithSchema( + `${this.baseUrl}/api/environments/${projectId}/query/`, + ExperimentExposureQueryResponseSchema, + { + method: 'POST', + body: JSON.stringify(queryRequest), + } + ) + + if (!result.success) { + return result + } + + return { + success: true, + data: { + exposures: result.data, + }, + } + }, + + getMetricResults: async ({ + experimentId, + refresh = false, + }: { + experimentId: number + refresh?: boolean + }): Promise< + Result<{ + experiment: Experiment + primaryMetricsResults: any[] + secondaryMetricsResults: any[] + exposures: ExperimentExposureQueryResponse + }> + > => { + /** + * we have to get the experiment details first. There's no guarantee + * that the user has queried for the experiment details before. + */ + const experimentDetails = await this.experiments({ projectId }).get({ + experimentId, + }) + + if (!experimentDetails.success) { + return experimentDetails + } + + const experiment = experimentDetails.data + + /** + * Validate that the experiment has started + */ + if (!experiment.start_date) { + return { + success: false, + error: new Error( + `Experiment "${experiment.name}" has not started yet. Results are only available for started experiments.` + ), + } + } + + /** + * let's get the experiment exposure details to get the full + * picture of the resutls. + */ + const experimentExposure = await this.experiments({ projectId }).getExposures({ + experimentId, + refresh, + }) + if (!experimentExposure.success) { + return experimentExposure + } + + const { exposures } = experimentExposure.data + + // Prepare metrics queries + const sharedPrimaryMetrics = (experiment.saved_metrics || []) + .filter(({ metadata }) => metadata.type === 'primary') + .map(({ query }) => query) + const allPrimaryMetrics = [...(experiment.metrics || []), ...sharedPrimaryMetrics] + + const sharedSecondaryMetrics = (experiment.saved_metrics || []) + .filter(({ metadata }) => metadata.type === 'secondary') + .map(({ query }) => query) + const allSecondaryMetrics = [ + ...(experiment.metrics_secondary || []), + ...sharedSecondaryMetrics, + ] + + // Execute queries for primary metrics + const primaryResults = await Promise.all( + allPrimaryMetrics.map(async (metric) => { + try { + const queryBody = { + kind: 'ExperimentQuery', + metric, + experiment_id: experimentId, + } + + const queryRequest = { + query: queryBody, + ...(refresh ? { refresh: 'blocking' } : {}), + } + + const result = await this.fetchWithSchema( + `${this.baseUrl}/api/environments/${projectId}/query/`, + z.any(), + { + method: 'POST', + body: JSON.stringify(queryRequest), + } + ) + + return result.success ? result.data : null + } catch (error) { + return null + } + }) + ) + + // Execute queries for secondary metrics + const secondaryResults = await Promise.all( + allSecondaryMetrics.map(async (metric) => { + try { + const queryBody = { + kind: 'ExperimentQuery', + metric, + experiment_id: experimentId, + } + + const queryRequest = { + query: queryBody, + ...(refresh ? { refresh: 'blocking' } : {}), + } + + const result = await this.fetchWithSchema( + `${this.baseUrl}/api/environments/${projectId}/query/`, + z.any(), + { + method: 'POST', + body: JSON.stringify(queryRequest), + } + ) + + return result.success ? result.data : null + } catch (error) { + return null + } + }) + ) + + return { + success: true, + data: { + experiment, + primaryMetricsResults: primaryResults, + secondaryMetricsResults: secondaryResults, + exposures, + }, + } + }, + + create: async ( + experimentData: z.infer + ): Promise> => { + // Transform agent input to API payload + const createBody = ExperimentCreatePayloadSchema.parse(experimentData) + + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/experiments/`, + ExperimentSchema, + { + method: 'POST', + body: JSON.stringify(createBody), + } + ) + }, + + update: async ({ + experimentId, + updateData, + }: { + experimentId: number + updateData: ExperimentUpdateApiPayload + }): Promise> => { + try { + const updateBody = ExperimentUpdateApiPayloadSchema.parse(updateData) + + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/experiments/${experimentId}/`, + ExperimentSchema, + { + method: 'PATCH', + body: JSON.stringify(updateBody), + } + ) + } catch (error) { + return { success: false, error: new Error(`Update failed: ${error}`) } + } + }, + + delete: async ({ + experimentId, + }: { + experimentId: number + }): Promise> => { + try { + const deleteResponse = await fetch( + `${this.baseUrl}/api/projects/${projectId}/experiments/${experimentId}/`, + { + method: 'PATCH', + headers: this.buildHeaders(), + body: JSON.stringify({ deleted: true }), + } + ) + + if (deleteResponse.ok) { + return { + success: true, + data: { success: true, message: 'Experiment deleted successfully' }, + } + } + + return { + success: false, + error: new Error(`Delete failed with status: ${deleteResponse.status}`), + } + } catch (error) { + return { success: false, error: new Error(`Delete failed: ${error}`) } + } + }, + } + } + + featureFlags({ projectId }: { projectId: string }) { + return { + list: async (): Promise< + Result> + > => { + try { + const schema = FeatureFlagSchema.pick({ + id: true, + key: true, + name: true, + active: true, + }) + + const response = await withPagination( + `${this.baseUrl}/api/projects/${projectId}/feature_flags/`, + this.config.apiToken, + schema + ) + + return { + success: true, + data: response as Array<{ + id: number + key: string + name: string + active: boolean + }>, + } + } catch (error) { + return { success: false, error: error as Error } + } + }, + + get: async ({ + flagId, + }: { + flagId: string | number + }): Promise< + Result<{ + id: number + key: string + name: string + active: boolean + description?: string | null | undefined + }> + > => { + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/feature_flags/${flagId}/`, + FeatureFlagSchema + ) + }, + + findByKey: async ({ + key, + }: { + key: string + }): Promise< + Result<{ id: number; key: string; name: string; active: boolean } | undefined> + > => { + const listResult = await this.featureFlags({ projectId }).list() + + if (!listResult.success) { + return { success: false, error: listResult.error } + } + + const found = listResult.data.find((f) => f.key === key) + + if (!found) { + return { success: true, data: undefined } + } + + const flagResult = await this.featureFlags({ projectId }).get({ flagId: found.id }) + + if (!flagResult.success) { + return { success: false, error: flagResult.error } + } + + return { success: true, data: flagResult.data } + }, + + create: async ({ + data, + }: { + data: CreateFeatureFlagInput + }): Promise> => { + const validatedInput = CreateFeatureFlagInputSchema.parse(data) + + const body = { + key: validatedInput.key, + name: validatedInput.name, + description: validatedInput.description, + active: validatedInput.active, + filters: validatedInput.filters, + } + + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/feature_flags/`, + FeatureFlagSchema, + { + method: 'POST', + body: JSON.stringify(body), + } + ) + }, + + update: async ({ + key, + data, + }: { + key: string + data: UpdateFeatureFlagInput + }): Promise> => { + const validatedInput = UpdateFeatureFlagInputSchema.parse(data) + const findResult = await this.featureFlags({ projectId }).findByKey({ key }) + + if (!findResult.success) { + return findResult + } + + if (!findResult.data) { + return { + success: false, + error: new Error(`Feature flag not found: ${key}`), + } + } + + const body = { + key: key, + name: validatedInput.name, + description: validatedInput.description, + active: validatedInput.active, + filters: validatedInput.filters, + } + + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/feature_flags/${findResult.data.id}/`, + FeatureFlagSchema, + { + method: 'PATCH', + body: JSON.stringify(body), + } + ) + }, + + delete: async ({ + flagId, + }: { + flagId: number + }): Promise> => { + try { + const response = await fetch( + `${this.baseUrl}/api/projects/${projectId}/feature_flags/${flagId}/`, + { + method: 'PATCH', + headers: this.buildHeaders(), + body: JSON.stringify({ deleted: true }), + } + ) + + if (!response.ok) { + throw new Error(`Failed to delete feature flag: ${response.statusText}`) + } + + return { + success: true, + data: { + success: true, + message: 'Feature flag deleted successfully', + }, + } + } catch (error) { + return { success: false, error: error as Error } + } + }, + } + } + + insights({ projectId }: { projectId: string }) { + return { + list: async ({ params }: { params?: ListInsightsData } = {}): Promise< + Result> + > => { + try { + const response = await this.generated.get( + '/api/projects/{project_id}/insights/', + { + path: { project_id: projectId }, + query: params + ? { + limit: params.limit, + offset: params.offset, + //@ts-expect-error search is not implemented as a query parameter + search: params.search, + } + : {}, + } + ) + + return { success: true, data: response.results } + } catch (error) { + return { success: false, error: error as Error } + } + }, + + create: async ({ + data, + }: { + data: CreateInsightInput + }): Promise> => { + const validatedInput = CreateInsightInputSchema.parse(data) + + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/insights/`, + SimpleInsightSchema, + { + method: 'POST', + body: JSON.stringify(validatedInput), + } + ) + }, + + get: async ({ insightId }: { insightId: string }): Promise> => { + // Check if insightId is a short_id (8 character alphanumeric string) + // Note: This won't work when we start creating insight id's with 8 digits. (We're at 7 currently) + if (isShortId(insightId)) { + const searchParams = new URLSearchParams({ short_id: insightId }) + const url = `${this.baseUrl}/api/projects/${projectId}/insights/?${searchParams}` + + const responseSchema = z.object({ + results: z.array(SimpleInsightSchema), + }) + + const result = await this.fetchWithSchema(url, responseSchema) + + if (!result.success) { + return result + } + + const insights = result.data.results + const insight = insights[0] + + if (insights.length === 0 || !insight) { + return { + success: false, + error: new Error(`No insight found with short_id: ${insightId}`), + } + } + + return { success: true, data: insight } + } + + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/insights/${insightId}/`, + SimpleInsightSchema + ) + }, + + update: async ({ + insightId, + data, + }: { + insightId: number + data: any + }): Promise> => { + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/insights/${insightId}/`, + SimpleInsightSchema, + { + method: 'PATCH', + body: JSON.stringify(data), + } + ) + }, + + delete: async ({ + insightId, + }: { + insightId: number + }): Promise> => { + try { + const response = await fetch( + `${this.baseUrl}/api/projects/${projectId}/insights/${insightId}/`, + { + method: 'PATCH', + headers: this.buildHeaders(), + body: JSON.stringify({ deleted: true }), + } + ) + + if (!response.ok) { + throw new Error(`Failed to delete insight: ${response.statusText}`) + } + + return { + success: true, + data: { + success: true, + message: 'Insight deleted successfully', + }, + } + } catch (error) { + return { success: false, error: error as Error } + } + }, + + query: async ({ query }: { query: Record }): Promise> => { + const url = `${this.baseUrl}/api/environments/${projectId}/query/` + + const queryResponseSchema = z.object({ + results: z.any(), + }) + + return this.fetchWithSchema(url, queryResponseSchema, { + method: 'POST', + body: JSON.stringify({ query }), + }) + }, + + sqlInsight: async ({ query }: { query: string }): Promise> => { + const requestBody = { + query: query, + insight_type: 'sql', + } + + const sqlResponseSchema = z.array(z.any()) + + const result = await this.fetchWithSchema( + `${this.baseUrl}/api/environments/${projectId}/max_tools/create_and_query_insight/`, + sqlResponseSchema, + { + method: 'POST', + body: JSON.stringify(requestBody), + } + ) + + if (result.success) { + // Ack messages don't add anything useful so let's just keep them out + const filteredData = result.data.filter( + (item: any) => !(item?.type === 'message' && item?.data?.type === 'ack') + ) + + return { + success: true, + data: filteredData, + } + } + + return result + }, + } + } + + dashboards({ projectId }: { projectId: string }) { + return { + list: async ({ params }: { params?: ListDashboardsData } = {}): Promise< + Result< + Array<{ + id: number + name: string + description?: string | null | undefined + }> + > + > => { + const validatedParams = params ? ListDashboardsSchema.parse(params) : undefined + const searchParams = new URLSearchParams() + + if (validatedParams?.limit) { + searchParams.append('limit', String(validatedParams.limit)) + } + if (validatedParams?.offset) { + searchParams.append('offset', String(validatedParams.offset)) + } + if (validatedParams?.search) { + searchParams.append('search', validatedParams.search) + } + + const url = `${this.baseUrl}/api/projects/${projectId}/dashboards/${searchParams.toString() ? `?${searchParams}` : ''}` + + const simpleDashboardSchema = z.object({ + id: z.number(), + name: z.string(), + description: z.string().nullish(), + }) + + const responseSchema = z.object({ + results: z.array(simpleDashboardSchema), + }) + + const result = await this.fetchWithSchema(url, responseSchema) + + if (result.success) { + return { success: true, data: result.data.results } + } + + return result + }, + + get: async ({ + dashboardId, + }: { + dashboardId: number + }): Promise> => { + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/dashboards/${dashboardId}/`, + SimpleDashboardSchema + ) + }, + + create: async ({ + data, + }: { + data: CreateDashboardInput + }): Promise> => { + const validatedInput = CreateDashboardInputSchema.parse(data) + + const createResponseSchema = z.object({ + id: z.number(), + name: z.string(), + }) + + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/dashboards/`, + createResponseSchema, + { + method: 'POST', + body: JSON.stringify(validatedInput), + } + ) + }, + + update: async ({ + dashboardId, + data, + }: { + dashboardId: number + data: any + }): Promise> => { + const updateResponseSchema = z.object({ + id: z.number(), + name: z.string(), + }) + + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/dashboards/${dashboardId}/`, + updateResponseSchema, + { + method: 'PATCH', + body: JSON.stringify(data), + } + ) + }, + + delete: async ({ + dashboardId, + }: { + dashboardId: number + }): Promise> => { + try { + const response = await fetch( + `${this.baseUrl}/api/projects/${projectId}/dashboards/${dashboardId}/`, + { + method: 'PATCH', + headers: this.buildHeaders(), + body: JSON.stringify({ deleted: true }), + } + ) + + if (!response.ok) { + throw new Error(`Failed to delete dashboard: ${response.statusText}`) + } + + return { + success: true, + data: { + success: true, + message: 'Dashboard deleted successfully', + }, + } + } catch (error) { + return { success: false, error: error as Error } + } + }, + + addInsight: async ({ + data, + }: { + data: { insightId: number; dashboardId: number } + }): Promise> => { + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/insights/${data.insightId}/`, + z.any(), + { + method: 'PATCH', + body: JSON.stringify({ dashboards: [data.dashboardId] }), + } + ) + }, + } + } + + query({ projectId }: { projectId: string }) { + return { + execute: async ({ + queryBody, + }: { + queryBody: any + }): Promise> => { + const responseSchema = z.object({ + results: z.array(z.any()), + }) + + return this.fetchWithSchema( + `${this.baseUrl}/api/environments/${projectId}/query/`, + responseSchema, + { + method: 'POST', + body: JSON.stringify({ query: queryBody }), + } + ) + }, + } + } + + users() { + return { + me: async (): Promise> => { + const result = await this.fetchWithSchema( + `${this.baseUrl}/api/users/@me/`, + ApiUserSchema + ) + + if (!result.success) { + return result + } + + return { + success: true, + data: result.data, + } + }, + } + } + + surveys({ projectId }: { projectId: string }) { + return { + list: async ({ params }: { params?: ListSurveysInput } = {}): Promise< + Result> + > => { + const validatedParams = params ? ListSurveysInputSchema.parse(params) : undefined + const searchParams = new URLSearchParams() + + if (validatedParams?.limit) { + searchParams.append('limit', String(validatedParams.limit)) + } + if (validatedParams?.offset) { + searchParams.append('offset', String(validatedParams.offset)) + } + if (validatedParams?.search) { + searchParams.append('search', validatedParams.search) + } + + const url = `${this.baseUrl}/api/projects/${projectId}/surveys/${searchParams.toString() ? `?${searchParams}` : ''}` + + const responseSchema = z.object({ + results: z.array(SurveyListItemOutputSchema), + }) + + const result = await this.fetchWithSchema(url, responseSchema) + + if (result.success) { + return { success: true, data: result.data.results } + } + + return result + }, + + get: async ({ surveyId }: { surveyId: string }): Promise> => { + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/surveys/${surveyId}/`, + SurveyOutputSchema + ) + }, + + create: async ({ + data, + }: { + data: CreateSurveyInput + }): Promise> => { + const validatedInput = CreateSurveyInputSchema.parse(data) + + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/surveys/`, + SurveyOutputSchema, + { + method: 'POST', + body: JSON.stringify(validatedInput), + } + ) + }, + + update: async ({ + surveyId, + data, + }: { + surveyId: string + data: UpdateSurveyInput + }): Promise> => { + const validatedInput = UpdateSurveyInputSchema.parse(data) + + return this.fetchWithSchema( + `${this.baseUrl}/api/projects/${projectId}/surveys/${surveyId}/`, + SurveyOutputSchema, + { + method: 'PATCH', + body: JSON.stringify(validatedInput), + } + ) + }, + + delete: async ({ + surveyId, + softDelete = true, + }: { + surveyId: string + softDelete?: boolean + }): Promise> => { + try { + const fetchOptions: RequestInit = { + method: softDelete ? 'PATCH' : 'DELETE', + headers: this.buildHeaders(), + } + + if (softDelete) { + fetchOptions.body = JSON.stringify({ archived: true }) + } + + const response = await fetch( + `${this.baseUrl}/api/projects/${projectId}/surveys/${surveyId}/`, + fetchOptions + ) + + if (!response.ok) { + throw new Error( + `Failed to ${softDelete ? 'archive' : 'delete'} survey: ${response.statusText}` + ) + } + + return { + success: true, + data: { + success: true, + message: `Survey ${softDelete ? 'archived' : 'deleted'} successfully`, + }, + } + } catch (error) { + return { success: false, error: error as Error } + } + }, + + globalStats: async ({ params }: { params?: GetSurveyStatsInput } = {}): Promise< + Result + > => { + const validatedParams = GetSurveyStatsInputSchema.parse(params) + + const searchParams = getSearchParamsFromRecord(validatedParams) + + const url = `${this.baseUrl}/api/projects/${projectId}/surveys/stats/${searchParams.toString() ? `?${searchParams}` : ''}` + + return this.fetchWithSchema(url, SurveyResponseStatsOutputSchema) + }, + + stats: async ( + params: GetSurveySpecificStatsInput + ): Promise> => { + const validatedParams = GetSurveySpecificStatsInputSchema.parse(params) + + const searchParams = getSearchParamsFromRecord(validatedParams) + + const url = `${this.baseUrl}/api/projects/${projectId}/surveys/${validatedParams.survey_id}/stats/${searchParams.toString() ? `?${searchParams}` : ''}` + + return this.fetchWithSchema(url, SurveyResponseStatsOutputSchema) + }, + } + } +} diff --git a/products/mcp/typescript/src/api/fetcher.ts b/products/mcp/typescript/src/api/fetcher.ts new file mode 100644 index 0000000000..93c1fb61e3 --- /dev/null +++ b/products/mcp/typescript/src/api/fetcher.ts @@ -0,0 +1,52 @@ +import type { ApiConfig } from './client' +import type { createApiClient } from './generated' + +export const buildApiFetcher: (config: ApiConfig) => Parameters[0] = ( + config +) => { + return { + fetch: async (input) => { + const headers = new Headers() + headers.set('Authorization', `Bearer ${config.apiToken}`) + + // Handle query parameters + if (input.urlSearchParams) { + input.url.search = input.urlSearchParams.toString() + } + + // Handle request body for mutation methods + const body = ['post', 'put', 'patch', 'delete'].includes(input.method.toLowerCase()) + ? JSON.stringify(input.parameters?.body) + : undefined + + if (body) { + headers.set('Content-Type', 'application/json') + } + + // Add custom headers + if (input.parameters?.header) { + for (const [key, value] of Object.entries(input.parameters.header)) { + if (value != null) { + headers.set(key, String(value)) + } + } + } + + const response = await fetch(input.url, { + method: input.method.toUpperCase(), + ...(body && { body }), + headers, + ...input.overrides, + }) + + if (!response.ok) { + const errorResponse = await response.json() + throw new Error( + `Failed request: [${response.status}] ${JSON.stringify(errorResponse)}` + ) + } + + return response + }, + } +} diff --git a/products/mcp/typescript/src/api/generated.ts b/products/mcp/typescript/src/api/generated.ts new file mode 100644 index 0000000000..95e09a75f8 --- /dev/null +++ b/products/mcp/typescript/src/api/generated.ts @@ -0,0 +1,17115 @@ +export namespace Schemas { + // + export type AIEventType = + | '$ai_generation' + | '$ai_embedding' + | '$ai_span' + | '$ai_trace' + | '$ai_metric' + | '$ai_feedback' + export type UrlMatchingEnum = 'contains' | 'regex' | 'exact' + export type NullEnum = null + export type ActionStepJSON = Partial<{ + event: string | null + properties: Array> | null + selector: string | null + tag_name: string | null + text: string | null + text_matching: (UrlMatchingEnum | NullEnum) | null + href: string | null + href_matching: (UrlMatchingEnum | NullEnum) | null + url: string | null + url_matching: (UrlMatchingEnum | NullEnum) | null + }> + export type RoleAtOrganizationEnum = + | 'engineering' + | 'data' + | 'product' + | 'founder' + | 'leadership' + | 'marketing' + | 'sales' + | 'other' + export type BlankEnum = '' + export type UserBasic = { + id: number + uuid: string + distinct_id?: (string | null) | undefined + first_name?: string | undefined + last_name?: string | undefined + email: string + is_email_verified?: (boolean | null) | undefined + hedgehog_config: Record | null + role_at_organization?: ((RoleAtOrganizationEnum | BlankEnum | NullEnum) | null) | undefined + } + export type Action = { + id: number + name?: (string | null) | undefined + description?: string | undefined + tags?: Array | undefined + post_to_slack?: boolean | undefined + slack_message_format?: string | undefined + steps?: Array | undefined + created_at: string + created_by: UserBasic & unknown + deleted?: boolean | undefined + is_calculating: boolean + last_calculated_at?: string | undefined + team_id: number + is_action: boolean + bytecode_error: string | null + pinned_at?: (string | null) | undefined + creation_context: string + _create_in_folder?: string | undefined + } + export type ActionConversionGoal = { actionId: number } + export type PropertyOperator = + | 'exact' + | 'is_not' + | 'icontains' + | 'not_icontains' + | 'regex' + | 'not_regex' + | 'gt' + | 'gte' + | 'lt' + | 'lte' + | 'is_set' + | 'is_not_set' + | 'is_date_exact' + | 'is_date_before' + | 'is_date_after' + | 'between' + | 'not_between' + | 'min' + | 'max' + | 'in' + | 'not_in' + | 'is_cleaned_path_exact' + | 'flag_evaluates_to' + export type EventPropertyFilter = { + key: string + label?: (string | null) | undefined + operator?: (PropertyOperator | null) | undefined + type?: string | undefined + value?: (Array | string | number | boolean | null) | undefined + } + export type PersonPropertyFilter = { + key: string + label?: (string | null) | undefined + operator: PropertyOperator + type?: string | undefined + value?: (Array | string | number | boolean | null) | undefined + } + export type Key = 'tag_name' | 'text' | 'href' | 'selector' + export type ElementPropertyFilter = { + key: Key + label?: (string | null) | undefined + operator: PropertyOperator + type?: string | undefined + value?: (Array | string | number | boolean | null) | undefined + } + export type EventMetadataPropertyFilter = { + key: string + label?: (string | null) | undefined + operator: PropertyOperator + type?: string | undefined + value?: (Array | string | number | boolean | null) | undefined + } + export type SessionPropertyFilter = { + key: string + label?: (string | null) | undefined + operator: PropertyOperator + type?: string | undefined + value?: (Array | string | number | boolean | null) | undefined + } + export type CohortPropertyFilter = { + cohort_name?: (string | null) | undefined + key?: string | undefined + label?: (string | null) | undefined + operator?: (PropertyOperator | null) | undefined + type?: string | undefined + value: number + } + export type DurationType = 'duration' | 'active_seconds' | 'inactive_seconds' + export type RecordingPropertyFilter = { + key: DurationType | string + label?: (string | null) | undefined + operator: PropertyOperator + type?: string | undefined + value?: (Array | string | number | boolean | null) | undefined + } + export type LogEntryPropertyFilter = { + key: string + label?: (string | null) | undefined + operator: PropertyOperator + type?: string | undefined + value?: (Array | string | number | boolean | null) | undefined + } + export type GroupPropertyFilter = { + group_type_index?: (number | null) | undefined + key: string + label?: (string | null) | undefined + operator: PropertyOperator + type?: string | undefined + value?: (Array | string | number | boolean | null) | undefined + } + export type FeaturePropertyFilter = { + key: string + label?: (string | null) | undefined + operator: PropertyOperator + type?: string | undefined + value?: (Array | string | number | boolean | null) | undefined + } + export type FlagPropertyFilter = { + key: string + label?: (string | null) | undefined + operator?: string | undefined + type?: string | undefined + value: boolean | string + } + export type HogQLPropertyFilter = { + key: string + label?: (string | null) | undefined + type?: string | undefined + value?: (Array | string | number | boolean | null) | undefined + } + export type EmptyPropertyFilter = Partial<{}> + export type DataWarehousePropertyFilter = { + key: string + label?: (string | null) | undefined + operator: PropertyOperator + type?: string | undefined + value?: (Array | string | number | boolean | null) | undefined + } + export type DataWarehousePersonPropertyFilter = { + key: string + label?: (string | null) | undefined + operator: PropertyOperator + type?: string | undefined + value?: (Array | string | number | boolean | null) | undefined + } + export type ErrorTrackingIssueFilter = { + key: string + label?: (string | null) | undefined + operator: PropertyOperator + type?: string | undefined + value?: (Array | string | number | boolean | null) | undefined + } + export type LogPropertyFilter = { + key: string + label?: (string | null) | undefined + operator: PropertyOperator + type?: string | undefined + value?: (Array | string | number | boolean | null) | undefined + } + export type RevenueAnalyticsPropertyFilter = { + key: string + label?: (string | null) | undefined + operator: PropertyOperator + type?: string | undefined + value?: (Array | string | number | boolean | null) | undefined + } + export type BaseMathType = + | 'total' + | 'dau' + | 'weekly_active' + | 'monthly_active' + | 'unique_session' + | 'first_time_for_user' + | 'first_matching_event_for_user' + export type FunnelMathType = + | 'total' + | 'first_time_for_user' + | 'first_time_for_user_with_filters' + export type PropertyMathType = + | 'avg' + | 'sum' + | 'min' + | 'max' + | 'median' + | 'p75' + | 'p90' + | 'p95' + | 'p99' + export type CountPerActorMathType = + | 'avg_count_per_actor' + | 'min_count_per_actor' + | 'max_count_per_actor' + | 'median_count_per_actor' + | 'p75_count_per_actor' + | 'p90_count_per_actor' + | 'p95_count_per_actor' + | 'p99_count_per_actor' + export type ExperimentMetricMathType = + | 'total' + | 'sum' + | 'unique_session' + | 'min' + | 'max' + | 'avg' + | 'dau' + | 'unique_group' + | 'hogql' + export type CalendarHeatmapMathType = 'total' | 'dau' + export type MathGroupTypeIndex = 0 | 1 | 2 | 3 | 4 + export type CurrencyCode = + | 'AED' + | 'AFN' + | 'ALL' + | 'AMD' + | 'ANG' + | 'AOA' + | 'ARS' + | 'AUD' + | 'AWG' + | 'AZN' + | 'BAM' + | 'BBD' + | 'BDT' + | 'BGN' + | 'BHD' + | 'BIF' + | 'BMD' + | 'BND' + | 'BOB' + | 'BRL' + | 'BSD' + | 'BTC' + | 'BTN' + | 'BWP' + | 'BYN' + | 'BZD' + | 'CAD' + | 'CDF' + | 'CHF' + | 'CLP' + | 'CNY' + | 'COP' + | 'CRC' + | 'CVE' + | 'CZK' + | 'DJF' + | 'DKK' + | 'DOP' + | 'DZD' + | 'EGP' + | 'ERN' + | 'ETB' + | 'EUR' + | 'FJD' + | 'GBP' + | 'GEL' + | 'GHS' + | 'GIP' + | 'GMD' + | 'GNF' + | 'GTQ' + | 'GYD' + | 'HKD' + | 'HNL' + | 'HRK' + | 'HTG' + | 'HUF' + | 'IDR' + | 'ILS' + | 'INR' + | 'IQD' + | 'IRR' + | 'ISK' + | 'JMD' + | 'JOD' + | 'JPY' + | 'KES' + | 'KGS' + | 'KHR' + | 'KMF' + | 'KRW' + | 'KWD' + | 'KYD' + | 'KZT' + | 'LAK' + | 'LBP' + | 'LKR' + | 'LRD' + | 'LTL' + | 'LVL' + | 'LSL' + | 'LYD' + | 'MAD' + | 'MDL' + | 'MGA' + | 'MKD' + | 'MMK' + | 'MNT' + | 'MOP' + | 'MRU' + | 'MTL' + | 'MUR' + | 'MVR' + | 'MWK' + | 'MXN' + | 'MYR' + | 'MZN' + | 'NAD' + | 'NGN' + | 'NIO' + | 'NOK' + | 'NPR' + | 'NZD' + | 'OMR' + | 'PAB' + | 'PEN' + | 'PGK' + | 'PHP' + | 'PKR' + | 'PLN' + | 'PYG' + | 'QAR' + | 'RON' + | 'RSD' + | 'RUB' + | 'RWF' + | 'SAR' + | 'SBD' + | 'SCR' + | 'SDG' + | 'SEK' + | 'SGD' + | 'SRD' + | 'SSP' + | 'STN' + | 'SYP' + | 'SZL' + | 'THB' + | 'TJS' + | 'TMT' + | 'TND' + | 'TOP' + | 'TRY' + | 'TTD' + | 'TWD' + | 'TZS' + | 'UAH' + | 'UGX' + | 'USD' + | 'UYU' + | 'UZS' + | 'VES' + | 'VND' + | 'VUV' + | 'WST' + | 'XAF' + | 'XCD' + | 'XOF' + | 'XPF' + | 'YER' + | 'ZAR' + | 'ZMW' + export type RevenueCurrencyPropertyConfig = Partial<{ + property: string | null + static: CurrencyCode | null + }> + export type ActionsNode = { + custom_name?: (string | null) | undefined + fixedProperties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + id: number + kind?: string | undefined + math?: + | ( + | BaseMathType + | FunnelMathType + | PropertyMathType + | CountPerActorMathType + | ExperimentMetricMathType + | CalendarHeatmapMathType + | string + | string + | null + ) + | undefined + math_group_type_index?: (MathGroupTypeIndex | null) | undefined + math_hogql?: (string | null) | undefined + math_multiplier?: (number | null) | undefined + math_property?: (string | null) | undefined + math_property_revenue_currency?: (RevenueCurrencyPropertyConfig | null) | undefined + math_property_type?: (string | null) | undefined + name?: (string | null) | undefined + properties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + response?: (Record | null) | undefined + version?: (number | null) | undefined + } + export type ActionsPie = Partial<{ + disableHoverOffset: boolean | null + hideAggregation: boolean | null + }> + export type ActivityLog = { + id: string + user: UserBasic + unread: boolean + organization_id?: (string | null) | undefined + was_impersonated?: (boolean | null) | undefined + is_system?: (boolean | null) | undefined + activity: string + item_id?: (string | null) | undefined + scope: string + detail?: (unknown | null) | undefined + created_at?: string | undefined + } + export type BounceRatePageViewMode = + | 'count_pageviews' + | 'uniq_urls' + | 'uniq_page_screen_autocaptures' + export type FilterLogicalOperator = 'AND' | 'OR' + export type CustomChannelField = + | 'utm_source' + | 'utm_medium' + | 'utm_campaign' + | 'referring_domain' + | 'url' + | 'pathname' + | 'hostname' + export type CustomChannelOperator = + | 'exact' + | 'is_not' + | 'is_set' + | 'is_not_set' + | 'icontains' + | 'not_icontains' + | 'regex' + | 'not_regex' + export type CustomChannelCondition = { + id: string + key: CustomChannelField + op: CustomChannelOperator + value?: (string | Array | null) | undefined + } + export type CustomChannelRule = { + channel_type: string + combiner: FilterLogicalOperator + id: string + items: Array + } + export type DataWarehouseEventsModifier = { + distinct_id_field: string + id_field: string + table_name: string + timestamp_field: string + } + export type InCohortVia = 'auto' | 'leftjoin' | 'subquery' | 'leftjoin_conjoined' + export type MaterializationMode = + | 'auto' + | 'legacy_null_as_string' + | 'legacy_null_as_null' + | 'disabled' + export type PersonsArgMaxVersion = 'auto' | 'v1' | 'v2' + export type PersonsJoinMode = 'inner' | 'left' + export type PersonsOnEventsMode = + | 'disabled' + | 'person_id_no_override_properties_on_events' + | 'person_id_override_properties_on_events' + | 'person_id_override_properties_joined' + export type PropertyGroupsMode = 'enabled' | 'disabled' | 'optimized' + export type SessionTableVersion = 'auto' | 'v1' | 'v2' + export type SessionsV2JoinMode = 'string' | 'uuid' + export type HogQLQueryModifiers = Partial<{ + bounceRateDurationSeconds: number | null + bounceRatePageViewMode: BounceRatePageViewMode | null + convertToProjectTimezone: boolean | null + customChannelTypeRules: Array | null + dataWarehouseEventsModifiers: Array | null + debug: boolean | null + formatCsvAllowDoubleQuotes: boolean | null + inCohortVia: InCohortVia | null + materializationMode: MaterializationMode | null + optimizeJoinedFilters: boolean | null + personsArgMaxVersion: PersonsArgMaxVersion | null + personsJoinMode: PersonsJoinMode | null + personsOnEventsMode: PersonsOnEventsMode | null + propertyGroupsMode: PropertyGroupsMode | null + s3TableUseInvalidColumns: boolean | null + sessionTableVersion: SessionTableVersion | null + sessionsV2JoinMode: SessionsV2JoinMode | null + timings: boolean | null + useMaterializedViews: boolean | null + usePreaggregatedTableTransforms: boolean | null + usePresortedEventsTable: boolean | null + useWebAnalyticsPreAggregatedTables: boolean | null + }> + export type ClickhouseQueryProgress = { + active_cpu_time: number + bytes_read: number + estimated_rows_total: number + rows_read: number + time_elapsed: number + } + export type QueryStatus = { + complete?: (boolean | null) | undefined + dashboard_id?: (number | null) | undefined + end_time?: (string | null) | undefined + error?: (boolean | null) | undefined + error_message?: (string | null) | undefined + expiration_time?: (string | null) | undefined + id: string + insight_id?: (number | null) | undefined + labels?: (Array | null) | undefined + pickup_time?: (string | null) | undefined + query_async?: boolean | undefined + query_progress?: (ClickhouseQueryProgress | null) | undefined + results?: (unknown | null) | undefined + start_time?: (string | null) | undefined + task_id?: (string | null) | undefined + team_id: number + } + export type ResolvedDateRangeResponse = { date_from: string; date_to: string } + export type ActorsPropertyTaxonomyResponse = { + sample_count: number + sample_values: Array + } + export type QueryTiming = { k: string; t: number } + export type ActorsPropertyTaxonomyQueryResponse = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: ActorsPropertyTaxonomyResponse | Array + timings?: (Array | null) | undefined + } + export type QueryLogTags = Partial<{ productKey: string | null; scene: string | null }> + export type ActorsPropertyTaxonomyQuery = { + groupTypeIndex?: (number | null) | undefined + kind?: string | undefined + maxPropertyValues?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + properties: Array + response?: (ActorsPropertyTaxonomyQueryResponse | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type PropertyGroupFilterValue = { + type: FilterLogicalOperator + values: Array< + | PropertyGroupFilterValue + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > + } + export type ActorsQueryResponse = { + columns: Array + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql: string + limit: number + missing_actors_count?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset: number + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type Compare = 'current' | 'previous' + export type BreakdownType = + | 'cohort' + | 'person' + | 'event' + | 'event_metadata' + | 'group' + | 'session' + | 'hogql' + | 'data_warehouse' + | 'data_warehouse_person_property' + | 'revenue_analytics' + export type MultipleBreakdownType = + | 'cohort' + | 'person' + | 'event' + | 'event_metadata' + | 'group' + | 'session' + | 'hogql' + | 'revenue_analytics' + export type Breakdown = { + group_type_index?: (number | null) | undefined + histogram_bin_count?: (number | null) | undefined + normalize_url?: (boolean | null) | undefined + property: string | number + type?: (MultipleBreakdownType | null) | undefined + } + export type BreakdownFilter = Partial<{ + breakdown: string | Array | number | null + breakdown_group_type_index: number | null + breakdown_hide_other_aggregation: boolean | null + breakdown_histogram_bin_count: number | null + breakdown_limit: number | null + breakdown_normalize_url: boolean | null + breakdown_type: BreakdownType | null + breakdowns: Array | null + }> + export type CompareFilter = Partial<{ compare: boolean | null; compare_to: string | null }> + export type CustomEventConversionGoal = { customEventName: string } + export type DateRange = Partial<{ + date_from: string | null + date_to: string | null + explicitDate: boolean | null + }> + export type IntervalType = 'minute' | 'hour' | 'day' | 'week' | 'month' + export type PropertyGroupFilter = { + type: FilterLogicalOperator + values: Array + } + export type TrendsQueryResponse = { + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + } + export type EventsNode = Partial<{ + custom_name: string | null + event: string | null + fixedProperties: Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null + kind: string + limit: number | null + math: + | BaseMathType + | FunnelMathType + | PropertyMathType + | CountPerActorMathType + | ExperimentMetricMathType + | CalendarHeatmapMathType + | string + | string + | null + math_group_type_index: MathGroupTypeIndex | null + math_hogql: string | null + math_multiplier: number | null + math_property: string | null + math_property_revenue_currency: RevenueCurrencyPropertyConfig | null + math_property_type: string | null + name: string | null + orderBy: Array | null + properties: Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null + response: Record | null + version: number | null + }> + export type DataWarehouseNode = { + custom_name?: (string | null) | undefined + distinct_id_field: string + dw_source_type?: (string | null) | undefined + fixedProperties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + id: string + id_field: string + kind?: string | undefined + math?: + | ( + | BaseMathType + | FunnelMathType + | PropertyMathType + | CountPerActorMathType + | ExperimentMetricMathType + | CalendarHeatmapMathType + | string + | string + | null + ) + | undefined + math_group_type_index?: (MathGroupTypeIndex | null) | undefined + math_hogql?: (string | null) | undefined + math_multiplier?: (number | null) | undefined + math_property?: (string | null) | undefined + math_property_revenue_currency?: (RevenueCurrencyPropertyConfig | null) | undefined + math_property_type?: (string | null) | undefined + name?: (string | null) | undefined + properties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + response?: (Record | null) | undefined + table_name: string + timestamp_field: string + version?: (number | null) | undefined + } + export type AggregationAxisFormat = + | 'numeric' + | 'duration' + | 'duration_ms' + | 'percentage' + | 'percentage_scaled' + export type ChartDisplayType = + | 'ActionsLineGraph' + | 'ActionsBar' + | 'ActionsStackedBar' + | 'ActionsAreaGraph' + | 'ActionsLineGraphCumulative' + | 'BoldNumber' + | 'ActionsPie' + | 'ActionsBarValue' + | 'ActionsTable' + | 'WorldMap' + | 'CalendarHeatmap' + export type TrendsFormulaNode = { custom_name?: (string | null) | undefined; formula: string } + export type GoalLine = { + borderColor?: (string | null) | undefined + displayIfCrossed?: (boolean | null) | undefined + displayLabel?: (boolean | null) | undefined + label: string + value: number + } + export type ResultCustomizationBy = 'value' | 'position' + export type DataColorToken = + | 'preset-1' + | 'preset-2' + | 'preset-3' + | 'preset-4' + | 'preset-5' + | 'preset-6' + | 'preset-7' + | 'preset-8' + | 'preset-9' + | 'preset-10' + | 'preset-11' + | 'preset-12' + | 'preset-13' + | 'preset-14' + | 'preset-15' + export type ResultCustomizationByValue = Partial<{ + assignmentBy: string + color: DataColorToken | null + hidden: boolean | null + }> + export type ResultCustomizationByPosition = Partial<{ + assignmentBy: string + color: DataColorToken | null + hidden: boolean | null + }> + export type YAxisScaleType = 'log10' | 'linear' + export type TrendsFilter = Partial<{ + aggregationAxisFormat: AggregationAxisFormat | null + aggregationAxisPostfix: string | null + aggregationAxisPrefix: string | null + breakdown_histogram_bin_count: number | null + confidenceLevel: number | null + decimalPlaces: number | null + display: ChartDisplayType | null + formula: string | null + formulaNodes: Array | null + formulas: Array | null + goalLines: Array | null + hiddenLegendIndexes: Array | null + minDecimalPlaces: number | null + movingAverageIntervals: number | null + resultCustomizationBy: ResultCustomizationBy | null + resultCustomizations: Record | Record | null + showAlertThresholdLines: boolean | null + showConfidenceIntervals: boolean | null + showLabelsOnSeries: boolean | null + showLegend: boolean | null + showMovingAverage: boolean | null + showMultipleYAxes: boolean | null + showPercentStackView: boolean | null + showTrendLines: boolean | null + showValuesOnSeries: boolean | null + smoothingIntervals: number | null + yAxisScaleType: YAxisScaleType | null + }> + export type TrendsQuery = { + aggregation_group_type_index?: (number | null) | undefined + breakdownFilter?: (BreakdownFilter | null) | undefined + compareFilter?: (CompareFilter | null) | undefined + conversionGoal?: (ActionConversionGoal | CustomEventConversionGoal | null) | undefined + dataColorTheme?: (number | null) | undefined + dateRange?: (DateRange | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + interval?: (IntervalType | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + properties?: + | ( + | Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > + | PropertyGroupFilter + | null + ) + | undefined + response?: (TrendsQueryResponse | null) | undefined + samplingFactor?: (number | null) | undefined + series: Array + tags?: (QueryLogTags | null) | undefined + trendsFilter?: (TrendsFilter | null) | undefined + version?: (number | null) | undefined + } + export type BreakdownAttributionType = 'first_touch' | 'last_touch' | 'all_events' | 'step' + export type FunnelExclusionEventsNode = { + custom_name?: (string | null) | undefined + event?: (string | null) | undefined + fixedProperties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + funnelFromStep: number + funnelToStep: number + kind?: string | undefined + limit?: (number | null) | undefined + math?: + | ( + | BaseMathType + | FunnelMathType + | PropertyMathType + | CountPerActorMathType + | ExperimentMetricMathType + | CalendarHeatmapMathType + | string + | string + | null + ) + | undefined + math_group_type_index?: (MathGroupTypeIndex | null) | undefined + math_hogql?: (string | null) | undefined + math_multiplier?: (number | null) | undefined + math_property?: (string | null) | undefined + math_property_revenue_currency?: (RevenueCurrencyPropertyConfig | null) | undefined + math_property_type?: (string | null) | undefined + name?: (string | null) | undefined + orderBy?: (Array | null) | undefined + properties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + response?: (Record | null) | undefined + version?: (number | null) | undefined + } + export type FunnelExclusionActionsNode = { + custom_name?: (string | null) | undefined + fixedProperties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + funnelFromStep: number + funnelToStep: number + id: number + kind?: string | undefined + math?: + | ( + | BaseMathType + | FunnelMathType + | PropertyMathType + | CountPerActorMathType + | ExperimentMetricMathType + | CalendarHeatmapMathType + | string + | string + | null + ) + | undefined + math_group_type_index?: (MathGroupTypeIndex | null) | undefined + math_hogql?: (string | null) | undefined + math_multiplier?: (number | null) | undefined + math_property?: (string | null) | undefined + math_property_revenue_currency?: (RevenueCurrencyPropertyConfig | null) | undefined + math_property_type?: (string | null) | undefined + name?: (string | null) | undefined + properties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + response?: (Record | null) | undefined + version?: (number | null) | undefined + } + export type StepOrderValue = 'strict' | 'unordered' | 'ordered' + export type FunnelStepReference = 'total' | 'previous' + export type FunnelVizType = 'steps' | 'time_to_convert' | 'trends' + export type FunnelConversionWindowTimeUnit = + | 'second' + | 'minute' + | 'hour' + | 'day' + | 'week' + | 'month' + export type FunnelLayout = 'horizontal' | 'vertical' + export type FunnelsFilter = Partial<{ + binCount: number | null + breakdownAttributionType: BreakdownAttributionType | null + breakdownAttributionValue: number | null + exclusions: Array | null + funnelAggregateByHogQL: string | null + funnelFromStep: number | null + funnelOrderType: StepOrderValue | null + funnelStepReference: FunnelStepReference | null + funnelToStep: number | null + funnelVizType: FunnelVizType | null + funnelWindowInterval: number | null + funnelWindowIntervalUnit: FunnelConversionWindowTimeUnit | null + goalLines: Array | null + hiddenLegendBreakdowns: Array | null + layout: FunnelLayout | null + resultCustomizations: Record | null + showValuesOnSeries: boolean | null + useUdf: boolean | null + }> + export type FunnelsQueryResponse = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + isUdf?: (boolean | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + } + export type FunnelsQuery = { + aggregation_group_type_index?: (number | null) | undefined + breakdownFilter?: (BreakdownFilter | null) | undefined + dataColorTheme?: (number | null) | undefined + dateRange?: (DateRange | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + funnelsFilter?: (FunnelsFilter | null) | undefined + interval?: (IntervalType | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + properties?: + | ( + | Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > + | PropertyGroupFilter + | null + ) + | undefined + response?: (FunnelsQueryResponse | null) | undefined + samplingFactor?: (number | null) | undefined + series: Array + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type RetentionValue = { count: number; label?: (string | null) | undefined } + export type RetentionResult = { + breakdown_value?: (string | number | null) | undefined + date: string + label: string + values: Array + } + export type RetentionQueryResponse = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type RetentionDashboardDisplayType = 'table_only' | 'graph_only' | 'all' + export type MeanRetentionCalculation = 'simple' | 'weighted' | 'none' + export type RetentionPeriod = 'Hour' | 'Day' | 'Week' | 'Month' + export type RetentionReference = 'total' | 'previous' + export type RetentionType = + | 'retention_recurring' + | 'retention_first_time' + | 'retention_first_ever_occurrence' + export type RetentionEntityKind = 'ActionsNode' | 'EventsNode' + export type EntityType = 'actions' | 'events' | 'data_warehouse' | 'new_entity' + export type RetentionEntity = Partial<{ + custom_name: string | null + id: string | number | null + kind: RetentionEntityKind | null + name: string | null + order: number | null + properties: Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null + type: EntityType | null + uuid: string | null + }> + export type RetentionFilter = Partial<{ + cumulative: boolean | null + dashboardDisplay: RetentionDashboardDisplayType | null + display: ChartDisplayType | null + meanRetentionCalculation: MeanRetentionCalculation | null + minimumOccurrences: number | null + period: RetentionPeriod | null + retentionReference: RetentionReference | null + retentionType: RetentionType | null + returningEntity: RetentionEntity | null + showTrendLines: boolean | null + targetEntity: RetentionEntity | null + totalIntervals: number | null + }> + export type RetentionQuery = { + aggregation_group_type_index?: (number | null) | undefined + breakdownFilter?: (BreakdownFilter | null) | undefined + dataColorTheme?: (number | null) | undefined + dateRange?: (DateRange | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + properties?: + | ( + | Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > + | PropertyGroupFilter + | null + ) + | undefined + response?: (RetentionQueryResponse | null) | undefined + retentionFilter: RetentionFilter + samplingFactor?: (number | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type FunnelPathType = + | 'funnel_path_before_step' + | 'funnel_path_between_steps' + | 'funnel_path_after_step' + export type FunnelPathsFilter = { + funnelPathType?: (FunnelPathType | null) | undefined + funnelSource: FunnelsQuery + funnelStep?: (number | null) | undefined + } + export type PathType = '$pageview' | '$screen' | 'custom_event' | 'hogql' + export type PathCleaningFilter = Partial<{ + alias: string | null + order: number | null + regex: string | null + }> + export type PathsFilter = Partial<{ + edgeLimit: number | null + endPoint: string | null + excludeEvents: Array | null + includeEventTypes: Array | null + localPathCleaningFilters: Array | null + maxEdgeWeight: number | null + minEdgeWeight: number | null + pathDropoffKey: string | null + pathEndKey: string | null + pathGroupings: Array | null + pathReplacements: boolean | null + pathStartKey: string | null + pathsHogQLExpression: string | null + startPoint: string | null + stepLimit: number | null + }> + export type PathsLink = { + average_conversion_time: number + source: string + target: string + value: number + } + export type PathsQueryResponse = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type PathsQuery = { + aggregation_group_type_index?: (number | null) | undefined + dataColorTheme?: (number | null) | undefined + dateRange?: (DateRange | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + funnelPathsFilter?: (FunnelPathsFilter | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + pathsFilter: PathsFilter + properties?: + | ( + | Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > + | PropertyGroupFilter + | null + ) + | undefined + response?: (PathsQueryResponse | null) | undefined + samplingFactor?: (number | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type StickinessQueryResponse = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + } + export type StickinessComputationMode = 'non_cumulative' | 'cumulative' + export type StickinessOperator = 'gte' | 'lte' | 'exact' + export type StickinessCriteria = { operator: StickinessOperator; value: number } + export type StickinessFilter = Partial<{ + computedAs: StickinessComputationMode | null + display: ChartDisplayType | null + hiddenLegendIndexes: Array | null + resultCustomizationBy: ResultCustomizationBy | null + resultCustomizations: Record | Record | null + showLegend: boolean | null + showMultipleYAxes: boolean | null + showValuesOnSeries: boolean | null + stickinessCriteria: StickinessCriteria | null + }> + export type StickinessQuery = { + compareFilter?: (CompareFilter | null) | undefined + dataColorTheme?: (number | null) | undefined + dateRange?: (DateRange | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + interval?: (IntervalType | null) | undefined + intervalCount?: (number | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + properties?: + | ( + | Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > + | PropertyGroupFilter + | null + ) + | undefined + response?: (StickinessQueryResponse | null) | undefined + samplingFactor?: (number | null) | undefined + series: Array + stickinessFilter?: (StickinessFilter | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type LifecycleToggle = 'new' | 'resurrecting' | 'returning' | 'dormant' + export type LifecycleFilter = Partial<{ + showLegend: boolean | null + showValuesOnSeries: boolean | null + stacked: boolean | null + toggledLifecycles: Array | null + }> + export type LifecycleQueryResponse = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + } + export type LifecycleQuery = { + aggregation_group_type_index?: (number | null) | undefined + dataColorTheme?: (number | null) | undefined + dateRange?: (DateRange | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + interval?: (IntervalType | null) | undefined + kind?: string | undefined + lifecycleFilter?: (LifecycleFilter | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + properties?: + | ( + | Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > + | PropertyGroupFilter + | null + ) + | undefined + response?: (LifecycleQueryResponse | null) | undefined + samplingFactor?: (number | null) | undefined + series: Array + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type InsightActorsQuery = { + breakdown?: (string | Array | number | null) | undefined + compare?: (Compare | null) | undefined + day?: (string | number | null) | undefined + includeRecordings?: (boolean | null) | undefined + interval?: (number | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + response?: (ActorsQueryResponse | null) | undefined + series?: (number | null) | undefined + source: + | TrendsQuery + | FunnelsQuery + | RetentionQuery + | PathsQuery + | StickinessQuery + | LifecycleQuery + status?: (string | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type FunnelsActorsQuery = { + funnelCustomSteps?: (Array | null) | undefined + funnelStep?: (number | null) | undefined + funnelStepBreakdown?: + | (number | string | number | Array | null) + | undefined + funnelTrendsDropOff?: (boolean | null) | undefined + funnelTrendsEntrancePeriodStart?: (string | null) | undefined + includeRecordings?: (boolean | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + response?: (ActorsQueryResponse | null) | undefined + source: FunnelsQuery + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type FunnelCorrelationResultsType = 'events' | 'properties' | 'event_with_properties' + export type CorrelationType = 'success' | 'failure' + export type EventDefinition = { + elements: Array + event: string + properties: Record + } + export type EventOddsRatioSerialized = { + correlation_type: CorrelationType + event: EventDefinition + failure_count: number + odds_ratio: number + success_count: number + } + export type FunnelCorrelationResult = { + events: Array + skewed: boolean + } + export type FunnelCorrelationResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: FunnelCorrelationResult + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type FunnelCorrelationQuery = { + funnelCorrelationEventExcludePropertyNames?: (Array | null) | undefined + funnelCorrelationEventNames?: (Array | null) | undefined + funnelCorrelationExcludeEventNames?: (Array | null) | undefined + funnelCorrelationExcludeNames?: (Array | null) | undefined + funnelCorrelationNames?: (Array | null) | undefined + funnelCorrelationType: FunnelCorrelationResultsType + kind?: string | undefined + response?: (FunnelCorrelationResponse | null) | undefined + source: FunnelsActorsQuery + version?: (number | null) | undefined + } + export type FunnelCorrelationActorsQuery = { + funnelCorrelationPersonConverted?: (boolean | null) | undefined + funnelCorrelationPersonEntity?: + | (EventsNode | ActionsNode | DataWarehouseNode | null) + | undefined + funnelCorrelationPropertyValues?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + includeRecordings?: (boolean | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + response?: (ActorsQueryResponse | null) | undefined + source: FunnelCorrelationQuery + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type StickinessActorsQuery = { + compare?: (Compare | null) | undefined + day?: (string | number | null) | undefined + includeRecordings?: (boolean | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + operator?: (StickinessOperator | null) | undefined + response?: (ActorsQueryResponse | null) | undefined + series?: (number | null) | undefined + source: StickinessQuery + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type HogQLFilters = Partial<{ + dateRange: DateRange | null + filterTestAccounts: boolean | null + properties: Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null + }> + export type HogQLNotice = { + end?: (number | null) | undefined + fix?: (string | null) | undefined + message: string + start?: (number | null) | undefined + } + export type QueryIndexUsage = 'undecisive' | 'no' | 'partial' | 'yes' + export type HogQLMetadataResponse = { + errors: Array + isUsingIndices?: (QueryIndexUsage | null) | undefined + isValid?: (boolean | null) | undefined + notices: Array + query?: (string | null) | undefined + table_names?: (Array | null) | undefined + warnings: Array + } + export type HogQLQueryResponse = { + clickhouse?: (string | null) | undefined + columns?: (Array | null) | undefined + error?: (string | null) | undefined + explain?: (Array | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + metadata?: (HogQLMetadataResponse | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query?: (string | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type HogQLVariable = { + code_name: string + isNull?: (boolean | null) | undefined + value?: (unknown | null) | undefined + variableId: string + } + export type HogQLQuery = { + explain?: (boolean | null) | undefined + filters?: (HogQLFilters | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + name?: (string | null) | undefined + query: string + response?: (HogQLQueryResponse | null) | undefined + tags?: (QueryLogTags | null) | undefined + values?: (Record | null) | undefined + variables?: (Record | null) | undefined + version?: (number | null) | undefined + } + export type ActorsQuery = Partial<{ + fixedProperties: Array< + PersonPropertyFilter | CohortPropertyFilter | HogQLPropertyFilter | EmptyPropertyFilter + > | null + kind: string + limit: number | null + modifiers: HogQLQueryModifiers | null + offset: number | null + orderBy: Array | null + properties: + | Array< + | PersonPropertyFilter + | CohortPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + > + | PropertyGroupFilterValue + | null + response: ActorsQueryResponse | null + search: string | null + select: Array | null + source: + | InsightActorsQuery + | FunnelsActorsQuery + | FunnelCorrelationActorsQuery + | StickinessActorsQuery + | HogQLQuery + | null + tags: QueryLogTags | null + version: number | null + }> + export type CreationTypeEnum = 'USR' | 'GIT' + export type AnnotationScopeEnum = + | 'dashboard_item' + | 'dashboard' + | 'project' + | 'organization' + | 'recording' + export type Annotation = { + id: number + content?: (string | null) | undefined + date_marker?: (string | null) | undefined + creation_type?: CreationTypeEnum | undefined + dashboard_item?: (number | null) | undefined + dashboard_id: number | null + dashboard_name: string | null + insight_short_id: string | null + insight_name: string | null + insight_derived_name: string | null + created_by: UserBasic & unknown + created_at: string | null + updated_at: string + deleted?: boolean | undefined + scope?: AnnotationScopeEnum | undefined + } + export type AutocompleteCompletionItemKind = + | 'Method' + | 'Function' + | 'Constructor' + | 'Field' + | 'Variable' + | 'Class' + | 'Struct' + | 'Interface' + | 'Module' + | 'Property' + | 'Event' + | 'Operator' + | 'Unit' + | 'Value' + | 'Constant' + | 'Enum' + | 'EnumMember' + | 'Keyword' + | 'Text' + | 'Color' + | 'File' + | 'Reference' + | 'Customcolor' + | 'Folder' + | 'TypeParameter' + | 'User' + | 'Issue' + | 'Snippet' + export type AutocompleteCompletionItem = { + detail?: (string | null) | undefined + documentation?: (string | null) | undefined + insertText: string + kind: AutocompleteCompletionItemKind + label: string + } + export type BaseCurrencyEnum = + | 'AED' + | 'AFN' + | 'ALL' + | 'AMD' + | 'ANG' + | 'AOA' + | 'ARS' + | 'AUD' + | 'AWG' + | 'AZN' + | 'BAM' + | 'BBD' + | 'BDT' + | 'BGN' + | 'BHD' + | 'BIF' + | 'BMD' + | 'BND' + | 'BOB' + | 'BRL' + | 'BSD' + | 'BTC' + | 'BTN' + | 'BWP' + | 'BYN' + | 'BZD' + | 'CAD' + | 'CDF' + | 'CHF' + | 'CLP' + | 'CNY' + | 'COP' + | 'CRC' + | 'CVE' + | 'CZK' + | 'DJF' + | 'DKK' + | 'DOP' + | 'DZD' + | 'EGP' + | 'ERN' + | 'ETB' + | 'EUR' + | 'FJD' + | 'GBP' + | 'GEL' + | 'GHS' + | 'GIP' + | 'GMD' + | 'GNF' + | 'GTQ' + | 'GYD' + | 'HKD' + | 'HNL' + | 'HRK' + | 'HTG' + | 'HUF' + | 'IDR' + | 'ILS' + | 'INR' + | 'IQD' + | 'IRR' + | 'ISK' + | 'JMD' + | 'JOD' + | 'JPY' + | 'KES' + | 'KGS' + | 'KHR' + | 'KMF' + | 'KRW' + | 'KWD' + | 'KYD' + | 'KZT' + | 'LAK' + | 'LBP' + | 'LKR' + | 'LRD' + | 'LTL' + | 'LVL' + | 'LSL' + | 'LYD' + | 'MAD' + | 'MDL' + | 'MGA' + | 'MKD' + | 'MMK' + | 'MNT' + | 'MOP' + | 'MRU' + | 'MTL' + | 'MUR' + | 'MVR' + | 'MWK' + | 'MXN' + | 'MYR' + | 'MZN' + | 'NAD' + | 'NGN' + | 'NIO' + | 'NOK' + | 'NPR' + | 'NZD' + | 'OMR' + | 'PAB' + | 'PEN' + | 'PGK' + | 'PHP' + | 'PKR' + | 'PLN' + | 'PYG' + | 'QAR' + | 'RON' + | 'RSD' + | 'RUB' + | 'RWF' + | 'SAR' + | 'SBD' + | 'SCR' + | 'SDG' + | 'SEK' + | 'SGD' + | 'SRD' + | 'SSP' + | 'STN' + | 'SYP' + | 'SZL' + | 'THB' + | 'TJS' + | 'TMT' + | 'TND' + | 'TOP' + | 'TRY' + | 'TTD' + | 'TWD' + | 'TZS' + | 'UAH' + | 'UGX' + | 'USD' + | 'UYU' + | 'UZS' + | 'VES' + | 'VND' + | 'VUV' + | 'WST' + | 'XAF' + | 'XCD' + | 'XOF' + | 'XPF' + | 'YER' + | 'ZAR' + | 'ZMW' + export type ModelEnum = 'events' | 'persons' | 'sessions' + export type BatchExportDestinationTypeEnum = + | 'S3' + | 'Snowflake' + | 'Postgres' + | 'Redshift' + | 'BigQuery' + | 'HTTP' + | 'NoOp' + export type BatchExportDestination = { + type: BatchExportDestinationTypeEnum + config?: unknown | undefined + } + export type IntervalEnum = 'hour' | 'day' | 'week' | 'every 5 minutes' + export type BatchExportRunStatusEnum = + | 'Cancelled' + | 'Completed' + | 'ContinuedAsNew' + | 'Failed' + | 'FailedRetryable' + | 'FailedBilling' + | 'Terminated' + | 'TimedOut' + | 'Running' + | 'Starting' + export type BatchExportRun = { + id: string + status: BatchExportRunStatusEnum + records_completed?: (number | null) | undefined + latest_error?: (string | null) | undefined + data_interval_start?: (string | null) | undefined + data_interval_end: string + cursor?: (string | null) | undefined + created_at: string + finished_at?: (string | null) | undefined + last_updated_at: string + records_total_count?: (number | null) | undefined + bytes_exported?: (number | null) | undefined + batch_export: string + backfill?: (string | null) | undefined + } + export type BatchExport = { + id: string + team_id: number + name: string + model?: ((ModelEnum | BlankEnum | NullEnum) | null) | undefined + destination: BatchExportDestination + interval: IntervalEnum + paused?: boolean | undefined + created_at: string + last_updated_at: string + last_paused_at?: (string | null) | undefined + start_at?: (string | null) | undefined + end_at?: (string | null) | undefined + latest_runs: Array + hogql_query?: string | undefined + schema: unknown | null + filters?: (unknown | null) | undefined + } + export type BatchExportBackfillStatusEnum = + | 'Cancelled' + | 'Completed' + | 'ContinuedAsNew' + | 'Failed' + | 'FailedRetryable' + | 'Terminated' + | 'TimedOut' + | 'Running' + | 'Starting' + export type BatchExportBackfill = { + id: string + progress: string + start_at?: (string | null) | undefined + end_at?: (string | null) | undefined + status: BatchExportBackfillStatusEnum + created_at: string + finished_at?: (string | null) | undefined + last_updated_at: string + team: number + batch_export: string + } + export type BreakdownItem = { label: string; value: string | number } + export type ByweekdayEnum = + | 'monday' + | 'tuesday' + | 'wednesday' + | 'thursday' + | 'friday' + | 'saturday' + | 'sunday' + export type CalendarHeatmapFilter = Partial<{ dummy: string | null }> + export type EventsHeatMapColumnAggregationResult = { column: number; value: number } + export type EventsHeatMapDataResult = { column: number; row: number; value: number } + export type EventsHeatMapRowAggregationResult = { row: number; value: number } + export type EventsHeatMapStructuredResult = { + allAggregations: number + columnAggregations: Array + data: Array + rowAggregations: Array + } + export type CalendarHeatmapResponse = { + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: EventsHeatMapStructuredResult + timings?: (Array | null) | undefined + } + export type CalendarHeatmapQuery = { + aggregation_group_type_index?: (number | null) | undefined + calendarHeatmapFilter?: (CalendarHeatmapFilter | null) | undefined + conversionGoal?: (ActionConversionGoal | CustomEventConversionGoal | null) | undefined + dataColorTheme?: (number | null) | undefined + dateRange?: (DateRange | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + interval?: (IntervalType | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + properties?: + | ( + | Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > + | PropertyGroupFilter + | null + ) + | undefined + response?: (CalendarHeatmapResponse | null) | undefined + samplingFactor?: (number | null) | undefined + series: Array + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type DisplayType = 'auto' | 'line' | 'bar' + export type YAxisPosition = 'left' | 'right' + export type ChartSettingsDisplay = Partial<{ + color: string | null + displayType: DisplayType | null + label: string | null + trendLine: boolean | null + yAxisPosition: YAxisPosition | null + }> + export type Style = 'none' | 'number' | 'percent' + export type ChartSettingsFormatting = Partial<{ + decimalPlaces: number | null + prefix: string | null + style: Style | null + suffix: string | null + }> + export type Settings = Partial<{ + display: ChartSettingsDisplay | null + formatting: ChartSettingsFormatting | null + }> + export type ChartAxis = { column: string; settings?: (Settings | null) | undefined } + export type Scale = 'linear' | 'logarithmic' + export type YAxisSettings = Partial<{ + scale: Scale | null + showGridLines: boolean | null + showTicks: boolean | null + startAtZero: boolean | null + }> + export type ChartSettings = Partial<{ + goalLines: Array | null + leftYAxisSettings: YAxisSettings | null + rightYAxisSettings: YAxisSettings | null + seriesBreakdownColumn: string | null + showLegend: boolean | null + showTotalRow: boolean | null + showXAxisBorder: boolean | null + showXAxisTicks: boolean | null + showYAxisBorder: boolean | null + stackBars100: boolean | null + xAxis: ChartAxis | null + yAxis: Array | null + yAxisAtZero: boolean | null + }> + export type ClickhouseEvent = { + id: string + distinct_id: string + properties: string + event: string + timestamp: string + person: string + elements: string + elements_chain: string + } + export type CohortTypeEnum = 'static' | 'person_property' | 'behavioral' | 'analytical' + export type Cohort = { + id: number + name?: (string | null) | undefined + description?: string | undefined + groups?: unknown | undefined + deleted?: boolean | undefined + filters?: (unknown | null) | undefined + query?: (unknown | null) | undefined + is_calculating: boolean + created_by: UserBasic & unknown + created_at: string | null + last_calculation: string | null + errors_calculating: number + count: number | null + is_static?: boolean | undefined + cohort_type?: ((CohortTypeEnum | BlankEnum | NullEnum) | null) | undefined + experiment_set: Array + _create_in_folder?: string | undefined + } + export type ColorMode = 'light' | 'dark' + export type CompareItem = { label: string; value: string } + export type ConclusionEnum = 'won' | 'lost' | 'inconclusive' | 'stopped_early' | 'invalid' + export type ConditionalFormattingRule = { + bytecode: Array + color: string + colorMode?: (ColorMode | null) | undefined + columnName: string + id: string + input: string + templateId: string + } + export type ConversionGoalFilter1 = { + conversion_goal_id: string + conversion_goal_name: string + custom_name?: (string | null) | undefined + event?: (string | null) | undefined + fixedProperties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + kind?: string | undefined + limit?: (number | null) | undefined + math?: + | ( + | BaseMathType + | FunnelMathType + | PropertyMathType + | CountPerActorMathType + | ExperimentMetricMathType + | CalendarHeatmapMathType + | string + | string + | null + ) + | undefined + math_group_type_index?: (MathGroupTypeIndex | null) | undefined + math_hogql?: (string | null) | undefined + math_multiplier?: (number | null) | undefined + math_property?: (string | null) | undefined + math_property_revenue_currency?: (RevenueCurrencyPropertyConfig | null) | undefined + math_property_type?: (string | null) | undefined + name?: (string | null) | undefined + orderBy?: (Array | null) | undefined + properties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + response?: (Record | null) | undefined + schema_map: Record + version?: (number | null) | undefined + } + export type ConversionGoalFilter2 = { + conversion_goal_id: string + conversion_goal_name: string + custom_name?: (string | null) | undefined + fixedProperties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + id: number + kind?: string | undefined + math?: + | ( + | BaseMathType + | FunnelMathType + | PropertyMathType + | CountPerActorMathType + | ExperimentMetricMathType + | CalendarHeatmapMathType + | string + | string + | null + ) + | undefined + math_group_type_index?: (MathGroupTypeIndex | null) | undefined + math_hogql?: (string | null) | undefined + math_multiplier?: (number | null) | undefined + math_property?: (string | null) | undefined + math_property_revenue_currency?: (RevenueCurrencyPropertyConfig | null) | undefined + math_property_type?: (string | null) | undefined + name?: (string | null) | undefined + properties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + response?: (Record | null) | undefined + schema_map: Record + version?: (number | null) | undefined + } + export type ConversionGoalFilter3 = { + conversion_goal_id: string + conversion_goal_name: string + custom_name?: (string | null) | undefined + distinct_id_field: string + dw_source_type?: (string | null) | undefined + fixedProperties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + id: string + id_field: string + kind?: string | undefined + math?: + | ( + | BaseMathType + | FunnelMathType + | PropertyMathType + | CountPerActorMathType + | ExperimentMetricMathType + | CalendarHeatmapMathType + | string + | string + | null + ) + | undefined + math_group_type_index?: (MathGroupTypeIndex | null) | undefined + math_hogql?: (string | null) | undefined + math_multiplier?: (number | null) | undefined + math_property?: (string | null) | undefined + math_property_revenue_currency?: (RevenueCurrencyPropertyConfig | null) | undefined + math_property_type?: (string | null) | undefined + name?: (string | null) | undefined + properties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + response?: (Record | null) | undefined + schema_map: Record + table_name: string + timestamp_field: string + version?: (number | null) | undefined + } + export type CookielessServerHashModeEnum = 0 | 1 | 2 + export type CreateGroup = { + group_type_index: number + group_key: string + group_properties?: (unknown | null) | undefined + } + export type CreationContextEnum = + | 'feature_flags' + | 'experiments' + | 'surveys' + | 'early_access_features' + | 'web_experiments' + export type CreationModeEnum = 'default' | 'template' | 'duplicate' + export type Credential = { + id: string + created_by: UserBasic & unknown + created_at: string + access_key: string + access_secret: string + } + export type DashboardRestrictionLevel = 21 | 37 + export type EffectiveRestrictionLevelEnum = 21 | 37 + export type EffectivePrivilegeLevelEnum = 21 | 37 + export type Dashboard = { + id: number + name?: (string | null) | undefined + description?: string | undefined + pinned?: boolean | undefined + created_at: string + created_by: UserBasic & unknown + is_shared: boolean + deleted?: boolean | undefined + creation_mode: CreationModeEnum & unknown + use_template?: string | undefined + use_dashboard?: (number | null) | undefined + delete_insights?: boolean | undefined + filters: Record + variables: Record | null + breakdown_colors?: unknown | undefined + data_color_theme_id?: (number | null) | undefined + tags?: Array | undefined + tiles: Array> | null + restriction_level?: (DashboardRestrictionLevel & unknown) | undefined + effective_restriction_level: EffectiveRestrictionLevelEnum & unknown + effective_privilege_level: EffectivePrivilegeLevelEnum & unknown + user_access_level: string | null + access_control_version: string + _create_in_folder?: string | undefined + last_refresh?: (string | null) | undefined + persisted_filters: Record | null + persisted_variables: Record | null + team_id: number + } + export type DashboardBasic = { + id: number + name: string | null + description: string + pinned: boolean + created_at: string + created_by: UserBasic & unknown + last_accessed_at: string | null + is_shared: boolean + deleted: boolean + creation_mode: CreationModeEnum & unknown + tags?: Array | undefined + restriction_level: DashboardRestrictionLevel & unknown + effective_restriction_level: EffectiveRestrictionLevelEnum & unknown + effective_privilege_level: EffectivePrivilegeLevelEnum & unknown + user_access_level: string | null + access_control_version: string + last_refresh: string | null + team_id: number + } + export type DashboardCollaborator = { + id: string + dashboard_id: number + user: UserBasic & unknown + level: DashboardRestrictionLevel & unknown + added_at: string + updated_at: string + user_uuid: string + } + export type DashboardFilter = Partial<{ + breakdown_filter: BreakdownFilter | null + date_from: string | null + date_to: string | null + properties: Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null + }> + export type DashboardTemplateScopeEnum = 'team' | 'global' | 'feature_flag' + export type DashboardTemplate = { + id: string + template_name?: (string | null) | undefined + dashboard_description?: (string | null) | undefined + dashboard_filters?: (unknown | null) | undefined + tags?: (Array | null) | undefined + tiles?: (unknown | null) | undefined + variables?: (unknown | null) | undefined + deleted?: (boolean | null) | undefined + created_at: string | null + created_by?: (number | null) | undefined + image_url?: (string | null) | undefined + team_id: number | null + scope?: ((DashboardTemplateScopeEnum | BlankEnum | NullEnum) | null) | undefined + availability_contexts?: (Array | null) | undefined + } + export type DashboardTileBasic = { + id: number + dashboard_id: number + deleted?: (boolean | null) | undefined + } + export type DataTableNodeViewPropsContextType = 'event_definition' | 'team_columns' + export type DataTableNodeViewPropsContext = { + eventDefinitionId?: (string | null) | undefined + type: DataTableNodeViewPropsContextType + } + export type Response = { + columns: Array + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql: string + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + types: Array + } + export type Response1 = { + columns: Array + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql: string + limit: number + missing_actors_count?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset: number + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type Response2 = { + columns: Array + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql: string + kind?: string | undefined + limit: number + modifiers?: (HogQLQueryModifiers | null) | undefined + offset: number + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + types: Array + } + export type Response3 = { + clickhouse?: (string | null) | undefined + columns?: (Array | null) | undefined + error?: (string | null) | undefined + explain?: (Array | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + metadata?: (HogQLMetadataResponse | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query?: (string | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type WebAnalyticsItemKind = 'unit' | 'duration_s' | 'percentage' | 'currency' + export type WebOverviewItem = { + changeFromPreviousPct?: (number | null) | undefined + isIncreaseBad?: (boolean | null) | undefined + key: string + kind: WebAnalyticsItemKind + previous?: (number | null) | undefined + usedPreAggregatedTables?: (boolean | null) | undefined + value?: (number | null) | undefined + } + export type SamplingRate = { denominator?: (number | null) | undefined; numerator: number } + export type Response4 = { + dateFrom?: (string | null) | undefined + dateTo?: (string | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + usedPreAggregatedTables?: (boolean | null) | undefined + } + export type Response5 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + usedPreAggregatedTables?: (boolean | null) | undefined + } + export type Response6 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type WebVitalsPathBreakdownResultItem = { path: string; value: number } + export type WebVitalsPathBreakdownResult = { + good: Array + needs_improvements: Array + poor: Array + } + export type Response8 = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type Response9 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type Response10 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type Response11 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + } + export type RevenueAnalyticsMRRQueryResultItem = { + churn: unknown + contraction: unknown + expansion: unknown + new: unknown + total: unknown + } + export type Response12 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type RevenueAnalyticsOverviewItemKey = + | 'revenue' + | 'paying_customer_count' + | 'avg_revenue_per_customer' + export type RevenueAnalyticsOverviewItem = { + key: RevenueAnalyticsOverviewItemKey + value: number + } + export type Response13 = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type Response14 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + } + export type Response15 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type MarketingAnalyticsItem = { + changeFromPreviousPct?: (number | null) | undefined + hasComparison?: (boolean | null) | undefined + isIncreaseBad?: (boolean | null) | undefined + key: string + kind: WebAnalyticsItemKind + previous?: (number | string | null) | undefined + value?: (number | string | null) | undefined + } + export type Response17 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type VolumeBucket = { label: string; value: number } + export type ErrorTrackingIssueAggregations = { + occurrences: number + sessions: number + users: number + volumeRange?: (Array | null) | undefined + volume_buckets: Array + } + export type ErrorTrackingIssueAssigneeType = 'user' | 'role' + export type ErrorTrackingIssueAssignee = { + id: string | number + type: ErrorTrackingIssueAssigneeType + } + export type IntegrationKind = + | 'slack' + | 'salesforce' + | 'hubspot' + | 'google-pubsub' + | 'google-cloud-storage' + | 'google-ads' + | 'google-sheets' + | 'linkedin-ads' + | 'snapchat' + | 'intercom' + | 'email' + | 'twilio' + | 'linear' + | 'github' + | 'meta-ads' + | 'clickup' + | 'reddit-ads' + export type ErrorTrackingExternalReferenceIntegration = { + display_name: string + id: number + kind: IntegrationKind + } + export type ErrorTrackingExternalReference = { + external_url: string + id: string + integration: ErrorTrackingExternalReferenceIntegration + } + export type FirstEvent = { properties: string; timestamp: string; uuid: string } + export type LastEvent = { properties: string; timestamp: string; uuid: string } + export type Status = 'archived' | 'active' | 'resolved' | 'pending_release' | 'suppressed' + export type ErrorTrackingIssue = { + aggregations?: (ErrorTrackingIssueAggregations | null) | undefined + assignee?: (ErrorTrackingIssueAssignee | null) | undefined + description?: (string | null) | undefined + external_issues?: (Array | null) | undefined + first_event?: (FirstEvent | null) | undefined + first_seen: string + id: string + last_event?: (LastEvent | null) | undefined + last_seen: string + library?: (string | null) | undefined + name?: (string | null) | undefined + status: Status + } + export type Response18 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type Population = { + both: number + exception_only: number + neither: number + success_only: number + } + export type ErrorTrackingCorrelatedIssue = { + assignee?: (ErrorTrackingIssueAssignee | null) | undefined + description?: (string | null) | undefined + event: string + external_issues?: (Array | null) | undefined + first_seen: string + id: string + last_seen: string + library?: (string | null) | undefined + name?: (string | null) | undefined + odds_ratio: number + population: Population + status: Status + } + export type Response19 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type ExperimentSignificanceCode = + | 'significant' + | 'not_enough_exposure' + | 'low_win_probability' + | 'high_loss' + | 'high_p_value' + export type ExperimentVariantFunnelsBaseStats = { + failure_count: number + key: string + success_count: number + } + export type Response20 = { + credible_intervals: Record> + expected_loss: number + funnels_query?: (FunnelsQuery | null) | undefined + insight: Array>> + kind?: string | undefined + probability: Record + significance_code: ExperimentSignificanceCode + significant: boolean + stats_version?: (number | null) | undefined + variants: Array + } + export type ExperimentVariantTrendsBaseStats = { + absolute_exposure: number + count: number + exposure: number + key: string + } + export type Response21 = { + count_query?: (TrendsQuery | null) | undefined + credible_intervals: Record> + exposure_query?: (TrendsQuery | null) | undefined + insight: Array> + kind?: string | undefined + p_value: number + probability: Record + significance_code: ExperimentSignificanceCode + significant: boolean + stats_version?: (number | null) | undefined + variants: Array + } + export type LLMTraceEvent = { + createdAt: string + event: AIEventType | string + id: string + properties: Record + } + export type LLMTracePerson = { + created_at: string + distinct_id: string + properties: Record + uuid: string + } + export type LLMTrace = { + createdAt: string + events: Array + id: string + inputCost?: (number | null) | undefined + inputState?: (unknown | null) | undefined + inputTokens?: (number | null) | undefined + outputCost?: (number | null) | undefined + outputState?: (unknown | null) | undefined + outputTokens?: (number | null) | undefined + person: LLMTracePerson + totalCost?: (number | null) | undefined + totalLatency?: (number | null) | undefined + traceName?: (string | null) | undefined + } + export type Response22 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type TaxonomicFilterGroupType = + | 'metadata' + | 'actions' + | 'cohorts' + | 'cohorts_with_all' + | 'data_warehouse' + | 'data_warehouse_properties' + | 'data_warehouse_person_properties' + | 'elements' + | 'events' + | 'event_properties' + | 'event_feature_flags' + | 'event_metadata' + | 'numerical_event_properties' + | 'person_properties' + | 'pageview_urls' + | 'screens' + | 'custom_events' + | 'wildcard' + | 'groups' + | 'persons' + | 'feature_flags' + | 'insights' + | 'experiments' + | 'plugins' + | 'dashboards' + | 'name_groups' + | 'session_properties' + | 'hogql_expression' + | 'notebooks' + | 'log_entries' + | 'error_tracking_issues' + | 'log_attributes' + | 'replay' + | 'revenue_analytics_properties' + | 'resources' + | 'error_tracking_properties' + | 'max_ai_context' + export type EventsQueryResponse = { + columns: Array + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql: string + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + types: Array + } + export type EventsQuery = { + actionId?: (number | null) | undefined + after?: (string | null) | undefined + before?: (string | null) | undefined + event?: (string | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + fixedProperties?: + | (Array< + | PropertyGroupFilter + | PropertyGroupFilterValue + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + kind?: string | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + orderBy?: (Array | null) | undefined + personId?: (string | null) | undefined + properties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + response?: (EventsQueryResponse | null) | undefined + select: Array + source?: (InsightActorsQuery | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + where?: (Array | null) | undefined + } + export type PersonsNode = Partial<{ + cohort: number | null + distinctId: string | null + fixedProperties: Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null + kind: string + limit: number | null + modifiers: HogQLQueryModifiers | null + offset: number | null + properties: Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null + response: Record | null + search: string | null + tags: QueryLogTags | null + version: number | null + }> + export type GroupsQueryResponse = { + columns: Array + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql: string + kind?: string | undefined + limit: number + modifiers?: (HogQLQueryModifiers | null) | undefined + offset: number + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + types: Array + } + export type GroupsQuery = { + group_type_index: number + kind?: string | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + orderBy?: (Array | null) | undefined + properties?: (Array | null) | undefined + response?: (GroupsQueryResponse | null) | undefined + search?: (string | null) | undefined + select?: (Array | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type WebAnalyticsOrderByFields = + | 'Visitors' + | 'Views' + | 'Clicks' + | 'BounceRate' + | 'AverageScrollPercentage' + | 'ScrollGt80Percentage' + | 'TotalConversions' + | 'UniqueConversions' + | 'ConversionRate' + | 'ConvertingUsers' + | 'RageClicks' + | 'DeadClicks' + | 'Errors' + export type WebAnalyticsOrderByDirection = 'ASC' | 'DESC' + export type WebOverviewQueryResponse = { + dateFrom?: (string | null) | undefined + dateTo?: (string | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + usedPreAggregatedTables?: (boolean | null) | undefined + } + export type WebAnalyticsSampling = Partial<{ + enabled: boolean | null + forceSamplingRate: SamplingRate | null + }> + export type WebOverviewQuery = { + compareFilter?: (CompareFilter | null) | undefined + conversionGoal?: (ActionConversionGoal | CustomEventConversionGoal | null) | undefined + dateRange?: (DateRange | null) | undefined + doPathCleaning?: (boolean | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + includeRevenue?: (boolean | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + orderBy?: + | (Array | null) + | undefined + properties: Array + response?: (WebOverviewQueryResponse | null) | undefined + sampling?: (WebAnalyticsSampling | null) | undefined + tags?: (QueryLogTags | null) | undefined + useSessionsTable?: (boolean | null) | undefined + version?: (number | null) | undefined + } + export type WebStatsBreakdown = + | 'Page' + | 'InitialPage' + | 'ExitPage' + | 'ExitClick' + | 'PreviousPage' + | 'ScreenName' + | 'InitialChannelType' + | 'InitialReferringDomain' + | 'InitialUTMSource' + | 'InitialUTMCampaign' + | 'InitialUTMMedium' + | 'InitialUTMTerm' + | 'InitialUTMContent' + | 'InitialUTMSourceMediumCampaign' + | 'Browser' + | 'OS' + | 'Viewport' + | 'DeviceType' + | 'Country' + | 'Region' + | 'City' + | 'Timezone' + | 'Language' + | 'FrustrationMetrics' + export type WebStatsTableQueryResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + usedPreAggregatedTables?: (boolean | null) | undefined + } + export type WebStatsTableQuery = { + breakdownBy: WebStatsBreakdown + compareFilter?: (CompareFilter | null) | undefined + conversionGoal?: (ActionConversionGoal | CustomEventConversionGoal | null) | undefined + dateRange?: (DateRange | null) | undefined + doPathCleaning?: (boolean | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + includeBounceRate?: (boolean | null) | undefined + includeRevenue?: (boolean | null) | undefined + includeScrollDepth?: (boolean | null) | undefined + kind?: string | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + orderBy?: + | (Array | null) + | undefined + properties: Array + response?: (WebStatsTableQueryResponse | null) | undefined + sampling?: (WebAnalyticsSampling | null) | undefined + tags?: (QueryLogTags | null) | undefined + useSessionsTable?: (boolean | null) | undefined + version?: (number | null) | undefined + } + export type WebExternalClicksTableQueryResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type WebExternalClicksTableQuery = { + compareFilter?: (CompareFilter | null) | undefined + conversionGoal?: (ActionConversionGoal | CustomEventConversionGoal | null) | undefined + dateRange?: (DateRange | null) | undefined + doPathCleaning?: (boolean | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + includeRevenue?: (boolean | null) | undefined + kind?: string | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + orderBy?: + | (Array | null) + | undefined + properties: Array + response?: (WebExternalClicksTableQueryResponse | null) | undefined + sampling?: (WebAnalyticsSampling | null) | undefined + stripQueryParams?: (boolean | null) | undefined + tags?: (QueryLogTags | null) | undefined + useSessionsTable?: (boolean | null) | undefined + version?: (number | null) | undefined + } + export type WebGoalsQueryResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type WebGoalsQuery = { + compareFilter?: (CompareFilter | null) | undefined + conversionGoal?: (ActionConversionGoal | CustomEventConversionGoal | null) | undefined + dateRange?: (DateRange | null) | undefined + doPathCleaning?: (boolean | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + includeRevenue?: (boolean | null) | undefined + kind?: string | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + orderBy?: + | (Array | null) + | undefined + properties: Array + response?: (WebGoalsQueryResponse | null) | undefined + sampling?: (WebAnalyticsSampling | null) | undefined + tags?: (QueryLogTags | null) | undefined + useSessionsTable?: (boolean | null) | undefined + version?: (number | null) | undefined + } + export type WebVitalsQuery = { + compareFilter?: (CompareFilter | null) | undefined + conversionGoal?: (ActionConversionGoal | CustomEventConversionGoal | null) | undefined + dateRange?: (DateRange | null) | undefined + doPathCleaning?: (boolean | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + includeRevenue?: (boolean | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + orderBy?: + | (Array | null) + | undefined + properties: Array + response?: (WebGoalsQueryResponse | null) | undefined + sampling?: (WebAnalyticsSampling | null) | undefined + source: + | TrendsQuery + | FunnelsQuery + | RetentionQuery + | PathsQuery + | StickinessQuery + | LifecycleQuery + tags?: (QueryLogTags | null) | undefined + useSessionsTable?: (boolean | null) | undefined + version?: (number | null) | undefined + } + export type WebVitalsMetric = 'INP' | 'LCP' | 'CLS' | 'FCP' + export type WebVitalsPercentile = 'p75' | 'p90' | 'p99' + export type WebVitalsPathBreakdownQueryResponse = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type WebVitalsPathBreakdownQuery = { + compareFilter?: (CompareFilter | null) | undefined + conversionGoal?: (ActionConversionGoal | CustomEventConversionGoal | null) | undefined + dateRange?: (DateRange | null) | undefined + doPathCleaning?: (boolean | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + includeRevenue?: (boolean | null) | undefined + kind?: string | undefined + metric: WebVitalsMetric + modifiers?: (HogQLQueryModifiers | null) | undefined + orderBy?: + | (Array | null) + | undefined + percentile: WebVitalsPercentile + properties: Array + response?: (WebVitalsPathBreakdownQueryResponse | null) | undefined + sampling?: (WebAnalyticsSampling | null) | undefined + tags?: (QueryLogTags | null) | undefined + thresholds: Array + useSessionsTable?: (boolean | null) | undefined + version?: (number | null) | undefined + } + export type Filters = Partial<{ + dateRange: DateRange | null + properties: Array | null + }> + export type SessionAttributionGroupBy = + | 'ChannelType' + | 'Medium' + | 'Source' + | 'Campaign' + | 'AdIds' + | 'ReferringDomain' + | 'InitialURL' + export type SessionAttributionExplorerQueryResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type SessionAttributionExplorerQuery = { + filters?: (Filters | null) | undefined + groupBy: Array + kind?: string | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + response?: (SessionAttributionExplorerQueryResponse | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type RevenueAnalyticsBreakdown = { property: string; type?: string | undefined } + export type SimpleIntervalType = 'day' | 'month' + export type RevenueAnalyticsGrossRevenueQueryResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type RevenueAnalyticsGrossRevenueQuery = { + breakdown: Array + dateRange?: (DateRange | null) | undefined + interval: SimpleIntervalType + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + properties: Array + response?: (RevenueAnalyticsGrossRevenueQueryResponse | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type RevenueAnalyticsMetricsQueryResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + } + export type RevenueAnalyticsMetricsQuery = { + breakdown: Array + dateRange?: (DateRange | null) | undefined + interval: SimpleIntervalType + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + properties: Array + response?: (RevenueAnalyticsMetricsQueryResponse | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type RevenueAnalyticsMRRQueryResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type RevenueAnalyticsMRRQuery = { + breakdown: Array + dateRange?: (DateRange | null) | undefined + interval: SimpleIntervalType + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + properties: Array + response?: (RevenueAnalyticsMRRQueryResponse | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type RevenueAnalyticsOverviewQueryResponse = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type RevenueAnalyticsOverviewQuery = { + dateRange?: (DateRange | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + properties: Array + response?: (RevenueAnalyticsOverviewQueryResponse | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type RevenueAnalyticsTopCustomersGroupBy = 'month' | 'all' + export type RevenueAnalyticsTopCustomersQueryResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + } + export type RevenueAnalyticsTopCustomersQuery = { + dateRange?: (DateRange | null) | undefined + groupBy: RevenueAnalyticsTopCustomersGroupBy + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + properties: Array + response?: (RevenueAnalyticsTopCustomersQueryResponse | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type RevenueExampleEventsQueryResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type RevenueExampleEventsQuery = Partial<{ + kind: string + limit: number | null + modifiers: HogQLQueryModifiers | null + offset: number | null + response: RevenueExampleEventsQueryResponse | null + tags: QueryLogTags | null + version: number | null + }> + export type RevenueExampleDataWarehouseTablesQueryResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type RevenueExampleDataWarehouseTablesQuery = Partial<{ + kind: string + limit: number | null + modifiers: HogQLQueryModifiers | null + offset: number | null + response: RevenueExampleDataWarehouseTablesQueryResponse | null + tags: QueryLogTags | null + version: number | null + }> + export type MarketingAnalyticsOrderByEnum = 'ASC' | 'DESC' + export type MarketingAnalyticsTableQueryResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type MarketingAnalyticsTableQuery = { + compareFilter?: (CompareFilter | null) | undefined + conversionGoal?: (ActionConversionGoal | CustomEventConversionGoal | null) | undefined + dateRange?: (DateRange | null) | undefined + doPathCleaning?: (boolean | null) | undefined + draftConversionGoal?: + | (ConversionGoalFilter1 | ConversionGoalFilter2 | ConversionGoalFilter3 | null) + | undefined + filterTestAccounts?: (boolean | null) | undefined + includeRevenue?: (boolean | null) | undefined + kind?: string | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + orderBy?: (Array> | null) | undefined + properties: Array + response?: (MarketingAnalyticsTableQueryResponse | null) | undefined + sampling?: (WebAnalyticsSampling | null) | undefined + select?: (Array | null) | undefined + tags?: (QueryLogTags | null) | undefined + useSessionsTable?: (boolean | null) | undefined + version?: (number | null) | undefined + } + export type OrderBy = 'last_seen' | 'first_seen' | 'occurrences' | 'users' | 'sessions' + export type OrderDirection = 'ASC' | 'DESC' + export type ErrorTrackingQueryResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type Status2 = + | 'archived' + | 'active' + | 'resolved' + | 'pending_release' + | 'suppressed' + | 'all' + export type ErrorTrackingQuery = { + assignee?: (ErrorTrackingIssueAssignee | null) | undefined + dateRange: DateRange + filterGroup?: (PropertyGroupFilter | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + issueId?: (string | null) | undefined + kind?: string | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + orderBy?: (OrderBy | null) | undefined + orderDirection?: (OrderDirection | null) | undefined + response?: (ErrorTrackingQueryResponse | null) | undefined + searchQuery?: (string | null) | undefined + status?: (Status2 | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + volumeResolution: number + withAggregations?: (boolean | null) | undefined + withFirstEvent?: (boolean | null) | undefined + withLastEvent?: (boolean | null) | undefined + } + export type ErrorTrackingIssueCorrelationQueryResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type ErrorTrackingIssueCorrelationQuery = { + events: Array + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + response?: (ErrorTrackingIssueCorrelationQueryResponse | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type ExperimentFunnelsQueryResponse = { + credible_intervals: Record> + expected_loss: number + funnels_query?: (FunnelsQuery | null) | undefined + insight: Array>> + kind?: string | undefined + probability: Record + significance_code: ExperimentSignificanceCode + significant: boolean + stats_version?: (number | null) | undefined + variants: Array + } + export type ExperimentFunnelsQuery = { + experiment_id?: (number | null) | undefined + funnels_query: FunnelsQuery + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + name?: (string | null) | undefined + response?: (ExperimentFunnelsQueryResponse | null) | undefined + tags?: (QueryLogTags | null) | undefined + uuid?: (string | null) | undefined + version?: (number | null) | undefined + } + export type ExperimentTrendsQueryResponse = { + count_query?: (TrendsQuery | null) | undefined + credible_intervals: Record> + exposure_query?: (TrendsQuery | null) | undefined + insight: Array> + kind?: string | undefined + p_value: number + probability: Record + significance_code: ExperimentSignificanceCode + significant: boolean + stats_version?: (number | null) | undefined + variants: Array + } + export type ExperimentTrendsQuery = { + count_query: TrendsQuery + experiment_id?: (number | null) | undefined + exposure_query?: (TrendsQuery | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + name?: (string | null) | undefined + response?: (ExperimentTrendsQueryResponse | null) | undefined + tags?: (QueryLogTags | null) | undefined + uuid?: (string | null) | undefined + version?: (number | null) | undefined + } + export type TracesQueryResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type TracesQuery = Partial<{ + dateRange: DateRange | null + filterTestAccounts: boolean | null + kind: string + limit: number | null + modifiers: HogQLQueryModifiers | null + offset: number | null + properties: Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null + response: TracesQueryResponse | null + showColumnConfigurator: boolean | null + tags: QueryLogTags | null + traceId: string | null + version: number | null + }> + export type DataTableNode = { + allowSorting?: (boolean | null) | undefined + columns?: (Array | null) | undefined + context?: (DataTableNodeViewPropsContext | null) | undefined + embedded?: (boolean | null) | undefined + expandable?: (boolean | null) | undefined + full?: (boolean | null) | undefined + hiddenColumns?: (Array | null) | undefined + kind?: string | undefined + pinnedColumns?: (Array | null) | undefined + propertiesViaUrl?: (boolean | null) | undefined + response?: + | ( + | Record + | Response + | Response1 + | Response2 + | Response3 + | Response4 + | Response5 + | Response6 + | Response8 + | Response9 + | Response10 + | Response11 + | Response12 + | Response13 + | Response14 + | Response15 + | Response17 + | Response18 + | Response19 + | Response20 + | Response21 + | Response22 + | null + ) + | undefined + showActions?: (boolean | null) | undefined + showColumnConfigurator?: (boolean | null) | undefined + showDateRange?: (boolean | null) | undefined + showElapsedTime?: (boolean | null) | undefined + showEventFilter?: (boolean | null) | undefined + showExport?: (boolean | null) | undefined + showHogQLEditor?: (boolean | null) | undefined + showOpenEditorButton?: (boolean | null) | undefined + showPersistentColumnConfigurator?: (boolean | null) | undefined + showPropertyFilter?: (boolean | Array | null) | undefined + showReload?: (boolean | null) | undefined + showResultsTable?: (boolean | null) | undefined + showSavedFilters?: (boolean | null) | undefined + showSavedQueries?: (boolean | null) | undefined + showSearch?: (boolean | null) | undefined + showTestAccountFilters?: (boolean | null) | undefined + showTimings?: (boolean | null) | undefined + source: + | EventsNode + | EventsQuery + | PersonsNode + | ActorsQuery + | GroupsQuery + | HogQLQuery + | WebOverviewQuery + | WebStatsTableQuery + | WebExternalClicksTableQuery + | WebGoalsQuery + | WebVitalsQuery + | WebVitalsPathBreakdownQuery + | SessionAttributionExplorerQuery + | RevenueAnalyticsGrossRevenueQuery + | RevenueAnalyticsMetricsQuery + | RevenueAnalyticsMRRQuery + | RevenueAnalyticsOverviewQuery + | RevenueAnalyticsTopCustomersQuery + | RevenueExampleEventsQuery + | RevenueExampleDataWarehouseTablesQuery + | MarketingAnalyticsTableQuery + | ErrorTrackingQuery + | ErrorTrackingIssueCorrelationQuery + | ExperimentFunnelsQuery + | ExperimentTrendsQuery + | TracesQuery + version?: (number | null) | undefined + } + export type TableSettings = Partial<{ + columns: Array | null + conditionalFormatting: Array | null + }> + export type DataVisualizationNode = { + chartSettings?: (ChartSettings | null) | undefined + display?: (ChartDisplayType | null) | undefined + kind?: string | undefined + source: HogQLQuery + tableSettings?: (TableSettings | null) | undefined + version?: (number | null) | undefined + } + export type DataWarehouseSavedQueryStatusEnum = + | 'Cancelled' + | 'Modified' + | 'Completed' + | 'Failed' + | 'Running' + export type DataWarehouseSavedQuery = { + id: string + deleted?: (boolean | null) | undefined + name: string + query?: (unknown | null) | undefined + created_by: UserBasic & unknown + created_at: string + sync_frequency: string + columns: string + status: (DataWarehouseSavedQueryStatusEnum | NullEnum) | null + last_run_at: string | null + latest_error: string | null + edited_history_id?: (string | null) | undefined + latest_history_id: string + soft_update?: (boolean | null) | undefined + is_materialized: boolean | null + } + export type DataWarehouseViewLinkConfiguration = Partial<{ + experiments_optimized: boolean | null + experiments_timestamp_key: string | null + }> + export type HedgehogColorOptions = + | 'green' + | 'red' + | 'blue' + | 'purple' + | 'dark' + | 'light' + | 'sepia' + | 'invert' + | 'invert-hue' + | 'greyscale' + export type MinimalHedgehogConfig = { + accessories: Array + color?: (HedgehogColorOptions | null) | undefined + use_as_profile: boolean + } + export type UserBasicType = { + distinct_id: string + email: string + first_name: string + hedgehog_config?: (MinimalHedgehogConfig | null) | undefined + id: number + is_email_verified?: (unknown | null) | undefined + last_name?: (string | null) | undefined + uuid: string + } + export type DataWarehouseViewLink = { + configuration?: (DataWarehouseViewLinkConfiguration | null) | undefined + created_at?: (string | null) | undefined + created_by?: (UserBasicType | null) | undefined + field_name?: (string | null) | undefined + id: string + joining_table_key?: (string | null) | undefined + joining_table_name?: (string | null) | undefined + source_table_key?: (string | null) | undefined + source_table_name?: (string | null) | undefined + } + export type DatabaseSerializedFieldType = + | 'integer' + | 'float' + | 'decimal' + | 'string' + | 'datetime' + | 'date' + | 'boolean' + | 'array' + | 'json' + | 'lazy_table' + | 'virtual_table' + | 'field_traverser' + | 'expression' + | 'view' + | 'materialized_view' + | 'unknown' + export type DatabaseSchemaField = { + chain?: (Array | null) | undefined + fields?: (Array | null) | undefined + hogql_value: string + id?: (string | null) | undefined + name: string + schema_valid: boolean + table?: (string | null) | undefined + type: DatabaseSerializedFieldType + } + export type DatabaseSchemaBatchExportTable = { + fields: Record + id: string + name: string + row_count?: (number | null) | undefined + type?: string | undefined + } + export type DatabaseSchemaSchema = { + id: string + incremental: boolean + last_synced_at?: (string | null) | undefined + name: string + should_sync: boolean + status?: (string | null) | undefined + } + export type DatabaseSchemaSource = { + id: string + last_synced_at?: (string | null) | undefined + prefix: string + source_type: string + status: string + } + export type DatabaseSchemaDataWarehouseTable = { + fields: Record + format: string + id: string + name: string + row_count?: (number | null) | undefined + schema?: (DatabaseSchemaSchema | null) | undefined + source?: (DatabaseSchemaSource | null) | undefined + type?: string | undefined + url_pattern: string + } + export type DatabaseSchemaManagedViewTableKind = + | 'revenue_analytics_charge' + | 'revenue_analytics_customer' + | 'revenue_analytics_product' + | 'revenue_analytics_revenue_item' + | 'revenue_analytics_subscription' + export type DatabaseSchemaManagedViewTable = { + fields: Record + id: string + kind: DatabaseSchemaManagedViewTableKind + name: string + query: HogQLQuery + row_count?: (number | null) | undefined + source_id?: (string | null) | undefined + type?: string | undefined + } + export type DatabaseSchemaMaterializedViewTable = { + fields: Record + id: string + last_run_at?: (string | null) | undefined + name: string + query: HogQLQuery + row_count?: (number | null) | undefined + status?: (string | null) | undefined + type?: string | undefined + } + export type DatabaseSchemaPostHogTable = { + fields: Record + id: string + name: string + row_count?: (number | null) | undefined + type?: string | undefined + } + export type DatabaseSchemaViewTable = { + fields: Record + id: string + name: string + query: HogQLQuery + row_count?: (number | null) | undefined + type?: string | undefined + } + export type DatabaseSchemaQueryResponse = { + joins: Array + tables: Record + } + export type DatabaseSchemaQuery = Partial<{ + kind: string + modifiers: HogQLQueryModifiers | null + response: DatabaseSchemaQueryResponse | null + tags: QueryLogTags | null + version: number | null + }> + export type DayItem = { label: string; value: string | string | number } + export type DefaultExperimentStatsMethodEnum = 'bayesian' | 'frequentist' + export type DisplayEnum = 'number' | 'sparkline' + export type EvaluationRuntimeEnum = 'server' | 'client' | 'all' + export type MinimalFeatureFlag = { + id: number + team_id: number + name?: string | undefined + key: string + filters?: Record | undefined + deleted?: boolean | undefined + active?: boolean | undefined + ensure_experience_continuity?: (boolean | null) | undefined + has_encrypted_payloads?: (boolean | null) | undefined + version?: (number | null) | undefined + evaluation_runtime?: ((EvaluationRuntimeEnum | BlankEnum | NullEnum) | null) | undefined + } + export type StageEnum = + | 'draft' + | 'concept' + | 'alpha' + | 'beta' + | 'general-availability' + | 'archived' + export type EarlyAccessFeature = { + id: string + feature_flag: MinimalFeatureFlag & unknown + name: string + description?: string | undefined + stage: StageEnum + documentation_url?: string | undefined + created_at: string + } + export type EarlyAccessFeatureSerializerCreateOnly = { + id: string + name: string + description?: string | undefined + stage: StageEnum + documentation_url?: string | undefined + created_at: string + feature_flag_id?: number | undefined + feature_flag: MinimalFeatureFlag & unknown + _create_in_folder?: string | undefined + } + export type EffectiveMembershipLevelEnum = 1 | 8 | 15 + export type ElementType = { + attr_class?: (Array | null) | undefined + attr_id?: (string | null) | undefined + attributes: Record + href?: (string | null) | undefined + nth_child?: (number | null) | undefined + nth_of_type?: (number | null) | undefined + order?: (number | null) | undefined + tag_name: string + text?: (string | null) | undefined + } + export type ErrorTrackingAssignmentRule = { + id: string + filters: unknown + assignee: string + order_key: number + disabled_data?: (unknown | null) | undefined + } + export type ErrorTrackingGroupingRule = { + id: string + filters: unknown + assignee: string + order_key: number + disabled_data?: (unknown | null) | undefined + } + export type ErrorTrackingRelease = { + id: string + hash_id: string + team_id: number + created_at: string + metadata?: (unknown | null) | undefined + version: string + project: string + } + export type ErrorTrackingSuppressionRule = { id: string; filters: unknown; order_key: number } + export type ErrorTrackingSymbolSet = { + id: string + ref: string + team_id: number + created_at: string + storage_ptr?: (string | null) | undefined + failure_reason?: (string | null) | undefined + } + export type EventTaxonomyItem = { + property: string + sample_count: number + sample_values: Array + } + export type EventTaxonomyQueryResponse = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type EventTaxonomyQuery = Partial<{ + actionId: number | null + event: string | null + kind: string + maxPropertyValues: number | null + modifiers: HogQLQueryModifiers | null + properties: Array | null + response: EventTaxonomyQueryResponse | null + tags: QueryLogTags | null + version: number | null + }> + export type Person = { + id: number + name: string + distinct_ids: Array + properties?: unknown | undefined + created_at: string + uuid: string + } + export type EventType = { + distinct_id: string + elements: Array + elements_chain?: (string | null) | undefined + event: string + id: string + person?: (Person | null) | undefined + properties: Record + timestamp: string + uuid?: (string | null) | undefined + } + export type ExperimentHoldout = { + id: number + name: string + description?: (string | null) | undefined + filters?: unknown | undefined + created_by: UserBasic & unknown + created_at: string + updated_at: string + } + export type ExperimentToSavedMetric = { + id: number + experiment: number + saved_metric: number + metadata?: unknown | undefined + created_at: string + query: unknown + name: string + } + export type ExperimentTypeEnum = 'web' | 'product' + export type Experiment = { + id: number + name: string + description?: (string | null) | undefined + start_date?: (string | null) | undefined + end_date?: (string | null) | undefined + feature_flag_key: string + feature_flag: MinimalFeatureFlag & unknown + holdout: ExperimentHoldout & unknown + holdout_id?: (number | null) | undefined + exposure_cohort: number | null + parameters?: (unknown | null) | undefined + secondary_metrics?: (unknown | null) | undefined + saved_metrics: Array + saved_metrics_ids?: (Array | null) | undefined + filters?: unknown | undefined + archived?: boolean | undefined + deleted?: (boolean | null) | undefined + created_by: UserBasic & unknown + created_at: string + updated_at: string + type?: ((ExperimentTypeEnum | BlankEnum | NullEnum) | null) | undefined + exposure_criteria?: (unknown | null) | undefined + metrics?: (unknown | null) | undefined + metrics_secondary?: (unknown | null) | undefined + stats_config?: (unknown | null) | undefined + _create_in_folder?: string | undefined + conclusion?: ((ConclusionEnum | BlankEnum | NullEnum) | null) | undefined + conclusion_comment?: (string | null) | undefined + primary_metrics_ordered_uuids?: (unknown | null) | undefined + secondary_metrics_ordered_uuids?: (unknown | null) | undefined + } + export type ExperimentDataWarehouseNode = { + custom_name?: (string | null) | undefined + data_warehouse_join_key: string + events_join_key: string + fixedProperties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + kind?: string | undefined + math?: + | ( + | BaseMathType + | FunnelMathType + | PropertyMathType + | CountPerActorMathType + | ExperimentMetricMathType + | CalendarHeatmapMathType + | string + | string + | null + ) + | undefined + math_group_type_index?: (MathGroupTypeIndex | null) | undefined + math_hogql?: (string | null) | undefined + math_multiplier?: (number | null) | undefined + math_property?: (string | null) | undefined + math_property_revenue_currency?: (RevenueCurrencyPropertyConfig | null) | undefined + math_property_type?: (string | null) | undefined + name?: (string | null) | undefined + properties?: + | (Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null) + | undefined + response?: (Record | null) | undefined + table_name: string + timestamp_field: string + version?: (number | null) | undefined + } + export type ExperimentEventExposureConfig = { + event: string + kind?: string | undefined + properties: Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > + response?: (Record | null) | undefined + version?: (number | null) | undefined + } + export type MultipleVariantHandling = 'exclude' | 'first_seen' + export type ExperimentExposureCriteria = Partial<{ + exposure_config: ExperimentEventExposureConfig | null + filterTestAccounts: boolean | null + multiple_variant_handling: MultipleVariantHandling | null + }> + export type ExperimentHoldoutType = { + created_at?: (string | null) | undefined + created_by?: (UserBasicType | null) | undefined + description?: (string | null) | undefined + filters: Record + id?: (number | null) | undefined + name: string + updated_at?: (string | null) | undefined + } + export type ExperimentExposureTimeSeries = { + days: Array + exposure_counts: Array + variant: string + } + export type ExperimentExposureQueryResponse = { + date_range: DateRange + kind?: string | undefined + timeseries: Array + total_exposures: Record + } + export type ExperimentExposureQuery = { + end_date?: (string | null) | undefined + experiment_id?: (number | null) | undefined + experiment_name: string + exposure_criteria?: (ExperimentExposureCriteria | null) | undefined + feature_flag: Record + holdout?: (ExperimentHoldoutType | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + response?: (ExperimentExposureQueryResponse | null) | undefined + start_date?: (string | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type ExperimentMetricGoal = 'increase' | 'decrease' + export type ExperimentFunnelMetric = { + conversion_window?: (number | null) | undefined + conversion_window_unit?: (FunnelConversionWindowTimeUnit | null) | undefined + funnel_order_type?: (StepOrderValue | null) | undefined + goal?: (ExperimentMetricGoal | null) | undefined + kind?: string | undefined + metric_type?: string | undefined + name?: (string | null) | undefined + response?: (Record | null) | undefined + series: Array + uuid?: (string | null) | undefined + version?: (number | null) | undefined + } + export type ExperimentMeanMetric = { + conversion_window?: (number | null) | undefined + conversion_window_unit?: (FunnelConversionWindowTimeUnit | null) | undefined + goal?: (ExperimentMetricGoal | null) | undefined + kind?: string | undefined + lower_bound_percentile?: (number | null) | undefined + metric_type?: string | undefined + name?: (string | null) | undefined + response?: (Record | null) | undefined + source: EventsNode | ActionsNode | ExperimentDataWarehouseNode + upper_bound_percentile?: (number | null) | undefined + uuid?: (string | null) | undefined + version?: (number | null) | undefined + } + export type ExperimentRatioMetric = { + conversion_window?: (number | null) | undefined + conversion_window_unit?: (FunnelConversionWindowTimeUnit | null) | undefined + denominator: EventsNode | ActionsNode | ExperimentDataWarehouseNode + goal?: (ExperimentMetricGoal | null) | undefined + kind?: string | undefined + metric_type?: string | undefined + name?: (string | null) | undefined + numerator: EventsNode | ActionsNode | ExperimentDataWarehouseNode + response?: (Record | null) | undefined + uuid?: (string | null) | undefined + version?: (number | null) | undefined + } + export type ExperimentStatsValidationFailure = + | 'not-enough-exposures' + | 'baseline-mean-is-zero' + | 'not-enough-metric-data' + export type ExperimentStatsBaseValidated = { + denominator_sum?: (number | null) | undefined + denominator_sum_squares?: (number | null) | undefined + key: string + number_of_samples: number + numerator_denominator_sum_product?: (number | null) | undefined + sum: number + sum_squares: number + validation_failures?: (Array | null) | undefined + } + export type ExperimentVariantResultFrequentist = { + confidence_interval?: (Array | null) | undefined + denominator_sum?: (number | null) | undefined + denominator_sum_squares?: (number | null) | undefined + key: string + method?: string | undefined + number_of_samples: number + numerator_denominator_sum_product?: (number | null) | undefined + p_value?: (number | null) | undefined + significant?: (boolean | null) | undefined + sum: number + sum_squares: number + validation_failures?: (Array | null) | undefined + } + export type ExperimentVariantResultBayesian = { + chance_to_win?: (number | null) | undefined + credible_interval?: (Array | null) | undefined + denominator_sum?: (number | null) | undefined + denominator_sum_squares?: (number | null) | undefined + key: string + method?: string | undefined + number_of_samples: number + numerator_denominator_sum_product?: (number | null) | undefined + significant?: (boolean | null) | undefined + sum: number + sum_squares: number + validation_failures?: (Array | null) | undefined + } + export type ExperimentQueryResponse = Partial<{ + baseline: ExperimentStatsBaseValidated | null + credible_intervals: Record> | null + insight: Array> | null + kind: string + metric: ExperimentMeanMetric | ExperimentFunnelMetric | ExperimentRatioMetric | null + p_value: number | null + probability: Record | null + significance_code: ExperimentSignificanceCode | null + significant: boolean | null + stats_version: number | null + variant_results: + | Array + | Array + | null + variants: + | Array + | Array + | null + }> + export type ExperimentQuery = { + experiment_id?: (number | null) | undefined + kind?: string | undefined + metric: ExperimentMeanMetric | ExperimentFunnelMetric | ExperimentRatioMetric + modifiers?: (HogQLQueryModifiers | null) | undefined + name?: (string | null) | undefined + response?: (ExperimentQueryResponse | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type ExperimentSavedMetric = { + id: number + name: string + description?: (string | null) | undefined + query: unknown + created_by: UserBasic & unknown + created_at: string + updated_at: string + tags?: Array | undefined + } + export type ExplicitTeamMemberLevelEnum = 1 | 8 + export type ExplicitTeamMember = { + id: string + level?: (ExplicitTeamMemberLevelEnum & unknown) | undefined + parent_level: number + parent_membership_id: string + joined_at: string + updated_at: string + user: UserBasic & unknown + user_uuid: string + effective_level: EffectiveMembershipLevelEnum & unknown + } + export type ExportFormatEnum = + | 'image/png' + | 'application/pdf' + | 'text/csv' + | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + | 'video/webm' + | 'video/mp4' + | 'image/gif' + | 'application/json' + export type ExportedAsset = { + id: number + dashboard?: (number | null) | undefined + insight?: (number | null) | undefined + export_format: ExportFormatEnum + created_at: string + has_content: string + export_context?: (unknown | null) | undefined + filename: string + expires_after?: (string | null) | undefined + exception: string | null + } + export type ExternalQueryErrorCode = 'platform_access_required' | 'query_execution_failed' + export type ExternalQueryError = { code: ExternalQueryErrorCode; detail: string } + export type ExternalQueryStatus = 'success' | 'error' + export type FeatureFlag = { + id: number + name?: string | undefined + key: string + filters?: Record | undefined + deleted?: boolean | undefined + active?: boolean | undefined + created_by: UserBasic & unknown + created_at?: string | undefined + version?: number | undefined + last_modified_by: UserBasic & unknown + is_simple_flag: boolean + rollout_percentage: number | null + ensure_experience_continuity?: (boolean | null) | undefined + experiment_set: string + surveys: Record + features: Record + rollback_conditions?: (unknown | null) | undefined + performed_rollback?: (boolean | null) | undefined + can_edit: boolean + tags?: Array | undefined + usage_dashboard: number + analytics_dashboards?: Array | undefined + has_enriched_analytics?: (boolean | null) | undefined + user_access_level: string | null + creation_context?: (CreationContextEnum & unknown) | undefined + is_remote_configuration?: (boolean | null) | undefined + has_encrypted_payloads?: (boolean | null) | undefined + status: string + evaluation_runtime?: ((EvaluationRuntimeEnum | BlankEnum | NullEnum) | null) | undefined + _create_in_folder?: string | undefined + } + export type FeatureFlagsAccessLevelEnum = 21 | 37 + export type Role = { + id: string + name: string + feature_flags_access_level?: (FeatureFlagsAccessLevelEnum & unknown) | undefined + created_at: string + created_by: UserBasic & unknown + members: string + is_default: string + } + export type FeatureFlagRoleAccess = { + id: number + feature_flag: FeatureFlag & unknown + role: Role & unknown + role_id: string + added_at: string + updated_at: string + } + export type FileSystem = { + id: string + path: string + depth: number | null + type?: string | undefined + ref?: (string | null) | undefined + href?: (string | null) | undefined + meta?: (unknown | null) | undefined + shortcut?: (boolean | null) | undefined + created_at: string + } + export type FileSystemShortcut = { + id: string + path: string + type?: string | undefined + ref?: (string | null) | undefined + href?: (string | null) | undefined + created_at: string + } + export type FrequencyEnum = 'daily' | 'weekly' | 'monthly' | 'yearly' + export type Group = { + group_type_index: number + group_key: string + group_properties?: unknown | undefined + created_at: string + } + export type GroupType = { + group_type: string + group_type_index: number + name_singular?: (string | null) | undefined + name_plural?: (string | null) | undefined + detail_dashboard?: (number | null) | undefined + default_columns?: (Array | null) | undefined + created_at?: (string | null) | undefined + } + export type GroupUsageMetricFormatEnum = 'numeric' | 'currency' + export type GroupUsageMetric = { + id: string + name: string + format?: GroupUsageMetricFormatEnum | undefined + interval?: number | undefined + display?: DisplayEnum | undefined + filters: unknown + } + export type HogFunctionTypeEnum = + | 'destination' + | 'site_destination' + | 'internal_destination' + | 'source_webhook' + | 'site_app' + | 'transformation' + export type InputsSchemaItemTypeEnum = + | 'string' + | 'number' + | 'boolean' + | 'dictionary' + | 'choice' + | 'json' + | 'integration' + | 'integration_field' + | 'email' + | 'native_email' + export type InputsSchemaItemTemplatingEnum = true | false | 'hog' | 'liquid' + export type InputsSchemaItem = { + type: InputsSchemaItemTypeEnum + key: string + label?: string | undefined + choices?: Array> | undefined + required?: boolean | undefined + default?: unknown | undefined + secret?: boolean | undefined + hidden?: boolean | undefined + description?: string | undefined + integration?: string | undefined + integration_key?: string | undefined + requires_field?: string | undefined + integration_field?: string | undefined + requiredScopes?: string | undefined + templating?: InputsSchemaItemTemplatingEnum | undefined + } + export type InputsItemTemplatingEnum = 'hog' | 'liquid' + export type InputsItem = { + value?: string | undefined + templating?: InputsItemTemplatingEnum | undefined + bytecode: Array + order: number + transpiled: unknown + } + export type HogFunctionFiltersSourceEnum = 'events' | 'person-updates' + export type HogFunctionFilters = Partial<{ + source: HogFunctionFiltersSourceEnum & unknown + actions: Array> + events: Array> + properties: Array> + bytecode: unknown | null + transpiled: unknown + filter_test_accounts: boolean + bytecode_error: string + }> + export type HogFunctionMasking = { + ttl: number + threshold?: (number | null) | undefined + hash: string + bytecode?: (unknown | null) | undefined + } + export type Mappings = Partial<{ + name: string + inputs_schema: Array + inputs: Record + filters: HogFunctionFilters + }> + export type HogFunctionMappingTemplate = { + name: string + include_by_default?: (boolean | null) | undefined + filters?: (unknown | null) | undefined + inputs?: (unknown | null) | undefined + inputs_schema?: (unknown | null) | undefined + } + export type HogFunctionTemplate = { + id: string + name: string + description?: (string | null) | undefined + code: string + code_language?: string | undefined + inputs_schema: unknown + type: string + status?: string | undefined + category?: unknown | undefined + free?: boolean | undefined + icon_url?: (string | null) | undefined + filters?: (unknown | null) | undefined + masking?: (unknown | null) | undefined + mapping_templates?: (Array | null) | undefined + } + export type StateEnum = 0 | 1 | 2 | 3 | 11 | 12 + export type HogFunctionStatus = { state: StateEnum; tokens: number } + export type HogFunction = { + id: string + type?: ((HogFunctionTypeEnum | NullEnum) | null) | undefined + name?: (string | null) | undefined + description?: string | undefined + created_at: string + created_by: UserBasic & unknown + updated_at: string + enabled?: boolean | undefined + deleted?: boolean | undefined + hog?: string | undefined + bytecode: unknown | null + transpiled: string | null + inputs_schema?: Array | undefined + inputs?: Record | undefined + filters?: HogFunctionFilters | undefined + masking?: ((HogFunctionMasking & (unknown | null)) | null) | undefined + mappings?: (Array | null) | undefined + icon_url?: (string | null) | undefined + template: HogFunctionTemplate & unknown + template_id?: (string | null) | undefined + status: (HogFunctionStatus & (unknown | null)) | null + execution_order?: (number | null) | undefined + _create_in_folder?: string | undefined + } + export type HogFunctionMinimal = { + id: string + type: string | null + name: string | null + description: string + created_at: string + created_by: UserBasic & unknown + updated_at: string + enabled: boolean + hog: string + filters: unknown | null + icon_url: string | null + template: HogFunctionTemplate & unknown + status: (HogFunctionStatus & (unknown | null)) | null + execution_order: number | null + } + export type HogLanguage = 'hog' | 'hogJson' | 'hogQL' | 'hogQLExpr' | 'hogTemplate' + export type HogQLASTQuery = { + explain?: (boolean | null) | undefined + filters?: (HogQLFilters | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + name?: (string | null) | undefined + query: Record + response?: (HogQLQueryResponse | null) | undefined + tags?: (QueryLogTags | null) | undefined + values?: (Record | null) | undefined + variables?: (Record | null) | undefined + version?: (number | null) | undefined + } + export type HogQLAutocompleteResponse = { + incomplete_list: boolean + suggestions: Array + timings?: (Array | null) | undefined + } + export type MultipleBreakdownOptions = { values: Array } + export type IntervalItem = { label: string; value: number } + export type Series = { label: string; value: number } + export type StatusItem = { label: string; value: string } + export type InsightActorsQueryOptionsResponse = Partial<{ + breakdown: Array | null + breakdowns: Array | null + compare: Array | null + day: Array | null + interval: Array | null + series: Array | null + status: Array | null + }> + export type InsightActorsQueryOptions = { + kind?: string | undefined + response?: (InsightActorsQueryOptionsResponse | null) | undefined + source: + | InsightActorsQuery + | FunnelsActorsQuery + | FunnelCorrelationActorsQuery + | StickinessActorsQuery + version?: (number | null) | undefined + } + export type TimelineEntry = { + events: Array + recording_duration_s?: (number | null) | undefined + sessionId?: (string | null) | undefined + } + export type SessionsTimelineQueryResponse = { + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type SessionsTimelineQuery = Partial<{ + after: string | null + before: string | null + kind: string + modifiers: HogQLQueryModifiers | null + personId: string | null + response: SessionsTimelineQueryResponse | null + tags: QueryLogTags | null + version: number | null + }> + export type HogQueryResponse = { + bytecode?: (Array | null) | undefined + coloredBytecode?: (Array | null) | undefined + results: unknown + stdout?: (string | null) | undefined + } + export type HogQuery = Partial<{ + code: string | null + kind: string + modifiers: HogQLQueryModifiers | null + response: HogQueryResponse | null + tags: QueryLogTags | null + version: number | null + }> + export type PageURL = { count: number; url: string } + export type WebPageURLSearchQueryResponse = { + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type WebPageURLSearchQuery = { + compareFilter?: (CompareFilter | null) | undefined + conversionGoal?: (ActionConversionGoal | CustomEventConversionGoal | null) | undefined + dateRange?: (DateRange | null) | undefined + doPathCleaning?: (boolean | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + includeRevenue?: (boolean | null) | undefined + kind?: string | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + orderBy?: + | (Array | null) + | undefined + properties: Array + response?: (WebPageURLSearchQueryResponse | null) | undefined + sampling?: (WebAnalyticsSampling | null) | undefined + searchTerm?: (string | null) | undefined + stripQueryParams?: (boolean | null) | undefined + tags?: (QueryLogTags | null) | undefined + useSessionsTable?: (boolean | null) | undefined + version?: (number | null) | undefined + } + export type WebTrendsMetric = + | 'UniqueUsers' + | 'PageViews' + | 'Sessions' + | 'Bounces' + | 'SessionDuration' + | 'TotalSessions' + export type Metrics = Partial<{ + Bounces: number | null + PageViews: number | null + SessionDuration: number | null + Sessions: number | null + TotalSessions: number | null + UniqueUsers: number | null + }> + export type WebTrendsItem = { bucket: string; metrics: Metrics } + export type WebTrendsQueryResponse = { + clickhouse?: (string | null) | undefined + columns?: (Array | null) | undefined + error?: (string | null) | undefined + explain?: (Array | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + metadata?: (HogQLMetadataResponse | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query?: (string | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + usedPreAggregatedTables?: (boolean | null) | undefined + } + export type WebTrendsQuery = { + compareFilter?: (CompareFilter | null) | undefined + conversionGoal?: (ActionConversionGoal | CustomEventConversionGoal | null) | undefined + dateRange?: (DateRange | null) | undefined + doPathCleaning?: (boolean | null) | undefined + filterTestAccounts?: (boolean | null) | undefined + includeRevenue?: (boolean | null) | undefined + interval: IntervalType + kind?: string | undefined + limit?: (number | null) | undefined + metrics: Array + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + orderBy?: + | (Array | null) + | undefined + properties: Array + response?: (WebTrendsQueryResponse | null) | undefined + sampling?: (WebAnalyticsSampling | null) | undefined + tags?: (QueryLogTags | null) | undefined + useSessionsTable?: (boolean | null) | undefined + version?: (number | null) | undefined + } + export type WebAnalyticsExternalSummaryQueryResponse = { + data: Record + error?: (ExternalQueryError | null) | undefined + status: ExternalQueryStatus + } + export type WebAnalyticsExternalSummaryQuery = { + dateRange: DateRange + kind?: string | undefined + properties: Array + response?: (WebAnalyticsExternalSummaryQueryResponse | null) | undefined + version?: (number | null) | undefined + } + export type OrderBy2 = 'latest' | 'earliest' + export type LogsQueryResponse = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + } + export type LogSeverityLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal' + export type LogsQuery = { + dateRange: DateRange + filterGroup: PropertyGroupFilter + kind?: string | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + orderBy?: (OrderBy2 | null) | undefined + response?: (LogsQueryResponse | null) | undefined + searchTerm?: (string | null) | undefined + serviceNames: Array + severityLevels: Array + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type RecordingOrder = + | 'duration' + | 'recording_duration' + | 'inactive_seconds' + | 'active_seconds' + | 'start_time' + | 'console_error_count' + | 'click_count' + | 'keypress_count' + | 'mouse_activity_count' + | 'activity_score' + export type RecordingOrderDirection = 'ASC' | 'DESC' + export type MatchedRecordingEvent = { uuid: string } + export type MatchedRecording = { + events: Array + session_id?: (string | null) | undefined + } + export type PersonType = { + created_at?: (string | null) | undefined + distinct_ids: Array + id?: (string | null) | undefined + is_identified?: (boolean | null) | undefined + name?: (string | null) | undefined + properties: Record + uuid?: (string | null) | undefined + } + export type SnapshotSource = 'web' | 'mobile' | 'unknown' + export type Storage = 'object_storage_lts' | 'object_storage' + export type SessionRecordingType = { + active_seconds?: (number | null) | undefined + activity_score?: (number | null) | undefined + click_count?: (number | null) | undefined + console_error_count?: (number | null) | undefined + console_log_count?: (number | null) | undefined + console_warn_count?: (number | null) | undefined + distinct_id?: (string | null) | undefined + email?: (string | null) | undefined + end_time: string + id: string + inactive_seconds?: (number | null) | undefined + keypress_count?: (number | null) | undefined + matching_events?: (Array | null) | undefined + mouse_activity_count?: (number | null) | undefined + ongoing?: (boolean | null) | undefined + person?: (PersonType | null) | undefined + recording_duration: number + retention_period_days?: (number | null) | undefined + snapshot_source: SnapshotSource + start_time: string + start_url?: (string | null) | undefined + storage?: (Storage | null) | undefined + summary?: (string | null) | undefined + viewed: boolean + viewers: Array + } + export type RecordingsQueryResponse = { + has_next: boolean + results: Array + } + export type RecordingsQuery = Partial<{ + actions: Array> | null + comment_text: RecordingPropertyFilter | null + console_log_filters: Array | null + date_from: string | null + date_to: string | null + distinct_ids: Array | null + events: Array> | null + filter_test_accounts: boolean | null + having_predicates: Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null + kind: string + limit: number | null + modifiers: HogQLQueryModifiers | null + offset: number | null + operand: FilterLogicalOperator | null + order: RecordingOrder | null + order_direction: RecordingOrderDirection | null + person_uuid: string | null + properties: Array< + | EventPropertyFilter + | PersonPropertyFilter + | ElementPropertyFilter + | EventMetadataPropertyFilter + | SessionPropertyFilter + | CohortPropertyFilter + | RecordingPropertyFilter + | LogEntryPropertyFilter + | GroupPropertyFilter + | FeaturePropertyFilter + | FlagPropertyFilter + | HogQLPropertyFilter + | EmptyPropertyFilter + | DataWarehousePropertyFilter + | DataWarehousePersonPropertyFilter + | ErrorTrackingIssueFilter + | LogPropertyFilter + | RevenueAnalyticsPropertyFilter + > | null + response: RecordingsQueryResponse | null + session_ids: Array | null + tags: QueryLogTags | null + user_modified_filters: Record | null + version: number | null + }> + export type VectorSearchResponseItem = { distance: number; id: string } + export type VectorSearchQueryResponse = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type VectorSearchQuery = { + embedding: Array + embeddingVersion?: (number | null) | undefined + kind?: string | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + response?: (VectorSearchQueryResponse | null) | undefined + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type HogQLMetadata = { + debug?: (boolean | null) | undefined + filters?: (HogQLFilters | null) | undefined + globals?: (Record | null) | undefined + kind?: string | undefined + language: HogLanguage + modifiers?: (HogQLQueryModifiers | null) | undefined + query: string + response?: (HogQLMetadataResponse | null) | undefined + sourceQuery?: + | ( + | EventsNode + | ActionsNode + | PersonsNode + | EventsQuery + | ActorsQuery + | GroupsQuery + | InsightActorsQuery + | InsightActorsQueryOptions + | SessionsTimelineQuery + | HogQuery + | HogQLQuery + | HogQLMetadata + | HogQLAutocomplete + | RevenueAnalyticsGrossRevenueQuery + | RevenueAnalyticsMetricsQuery + | RevenueAnalyticsMRRQuery + | RevenueAnalyticsOverviewQuery + | RevenueAnalyticsTopCustomersQuery + | MarketingAnalyticsTableQuery + | WebOverviewQuery + | WebStatsTableQuery + | WebExternalClicksTableQuery + | WebGoalsQuery + | WebVitalsQuery + | WebVitalsPathBreakdownQuery + | WebPageURLSearchQuery + | WebTrendsQuery + | WebAnalyticsExternalSummaryQuery + | SessionAttributionExplorerQuery + | RevenueExampleEventsQuery + | RevenueExampleDataWarehouseTablesQuery + | ErrorTrackingQuery + | ErrorTrackingIssueCorrelationQuery + | LogsQuery + | ExperimentFunnelsQuery + | ExperimentTrendsQuery + | CalendarHeatmapQuery + | RecordingsQuery + | TracesQuery + | VectorSearchQuery + | null + ) + | undefined + tags?: (QueryLogTags | null) | undefined + variables?: (Record | null) | undefined + version?: (number | null) | undefined + } + export type HogQLAutocomplete = { + endPosition: number + filters?: (HogQLFilters | null) | undefined + globals?: (Record | null) | undefined + kind?: string | undefined + language: HogLanguage + modifiers?: (HogQLQueryModifiers | null) | undefined + query: string + response?: (HogQLAutocompleteResponse | null) | undefined + sourceQuery?: + | ( + | EventsNode + | ActionsNode + | PersonsNode + | EventsQuery + | ActorsQuery + | GroupsQuery + | InsightActorsQuery + | InsightActorsQueryOptions + | SessionsTimelineQuery + | HogQuery + | HogQLQuery + | HogQLMetadata + | HogQLAutocomplete + | RevenueAnalyticsGrossRevenueQuery + | RevenueAnalyticsMetricsQuery + | RevenueAnalyticsMRRQuery + | RevenueAnalyticsOverviewQuery + | RevenueAnalyticsTopCustomersQuery + | MarketingAnalyticsTableQuery + | WebOverviewQuery + | WebStatsTableQuery + | WebExternalClicksTableQuery + | WebGoalsQuery + | WebVitalsQuery + | WebVitalsPathBreakdownQuery + | WebPageURLSearchQuery + | WebTrendsQuery + | WebAnalyticsExternalSummaryQuery + | SessionAttributionExplorerQuery + | RevenueExampleEventsQuery + | RevenueExampleDataWarehouseTablesQuery + | ErrorTrackingQuery + | ErrorTrackingIssueCorrelationQuery + | LogsQuery + | ExperimentFunnelsQuery + | ExperimentTrendsQuery + | CalendarHeatmapQuery + | RecordingsQuery + | TracesQuery + | VectorSearchQuery + | null + ) + | undefined + startPosition: number + tags?: (QueryLogTags | null) | undefined + version?: (number | null) | undefined + } + export type Insight = { + id: number + short_id: string + name?: (string | null) | undefined + derived_name?: (string | null) | undefined + query?: (Record | null) | undefined + order?: (number | null) | undefined + deleted?: boolean | undefined + dashboards?: Array | undefined + dashboard_tiles: Array + last_refresh: string + cache_target_age: string + next_allowed_client_refresh: string + result: string + hasMore: string + columns: string + created_at: string | null + created_by: UserBasic & unknown + description?: (string | null) | undefined + updated_at: string + tags?: Array | undefined + favorited?: boolean | undefined + last_modified_at: string + last_modified_by: UserBasic & unknown + is_sample: boolean + effective_restriction_level: EffectiveRestrictionLevelEnum & unknown + effective_privilege_level: EffectivePrivilegeLevelEnum & unknown + user_access_level: string | null + timezone: string + is_cached: string + query_status: string + hogql: string + types: string + _create_in_folder?: string | undefined + alerts: string + } + export type RETENTION = Partial<{ + hideLineGraph: boolean | null + hideSizeColumn: boolean | null + useSmallLayout: boolean | null + }> + export type VizSpecificOptions = Partial<{ + ActionsPie: ActionsPie | null + RETENTION: RETENTION | null + }> + export type InsightVizNode = { + embedded?: (boolean | null) | undefined + full?: (boolean | null) | undefined + hidePersonsModal?: (boolean | null) | undefined + hideTooltipOnScroll?: (boolean | null) | undefined + kind?: string | undefined + showCorrelationTable?: (boolean | null) | undefined + showFilters?: (boolean | null) | undefined + showHeader?: (boolean | null) | undefined + showLastComputation?: (boolean | null) | undefined + showLastComputationRefresh?: (boolean | null) | undefined + showResults?: (boolean | null) | undefined + showTable?: (boolean | null) | undefined + source: + | TrendsQuery + | FunnelsQuery + | RetentionQuery + | PathsQuery + | StickinessQuery + | LifecycleQuery + suppressSessionAnalysisWarning?: (boolean | null) | undefined + version?: (number | null) | undefined + vizSpecificOptions?: (VizSpecificOptions | null) | undefined + } + export type MinimalPerson = { + id: number + name: string + distinct_ids: string + properties?: unknown | undefined + created_at: string + uuid: string + } + export type Notebook = { + id: string + short_id: string + title?: (string | null) | undefined + content?: (unknown | null) | undefined + text_content?: (string | null) | undefined + version?: number | undefined + deleted?: boolean | undefined + created_at: string + created_by: UserBasic & unknown + last_modified_at: string + last_modified_by: UserBasic & unknown + user_access_level: string | null + _create_in_folder?: string | undefined + } + export type NotebookMinimal = { + id: string + short_id: string + title: string | null + deleted: boolean + created_at: string + created_by: UserBasic & unknown + last_modified_at: string + last_modified_by: UserBasic & unknown + user_access_level: string | null + _create_in_folder?: string | undefined + } + export type OperatorEnum = + | 'exact' + | 'is_not' + | 'icontains' + | 'not_icontains' + | 'regex' + | 'not_regex' + | 'gt' + | 'lt' + | 'gte' + | 'lte' + | 'is_set' + | 'is_not_set' + | 'is_date_exact' + | 'is_date_after' + | 'is_date_before' + | 'in' + | 'not_in' + export type PluginsAccessLevelEnum = 0 | 3 | 6 | 9 + export type Organization = { + id: string + name: string + slug: string + logo_media_id?: (string | null) | undefined + created_at: string + updated_at: string + membership_level: (EffectiveMembershipLevelEnum & (unknown | null)) | null + plugins_access_level: PluginsAccessLevelEnum & unknown + teams: Array> + projects: Array> + available_product_features: Array | null + is_member_join_email_enabled?: boolean | undefined + metadata: string + customer_id: string | null + enforce_2fa?: (boolean | null) | undefined + members_can_invite?: (boolean | null) | undefined + members_can_use_personal_api_keys?: boolean | undefined + allow_publicly_shared_resources?: boolean | undefined + member_count: string + is_ai_data_processing_approved?: (boolean | null) | undefined + default_experiment_stats_method?: + | ((DefaultExperimentStatsMethodEnum | BlankEnum | NullEnum) | null) + | undefined + default_role_id?: (string | null) | undefined + } + export type OrganizationBasic = { + id: string + name: string + slug: string + logo_media_id: string | null + membership_level: (EffectiveMembershipLevelEnum & (unknown | null)) | null + members_can_use_personal_api_keys?: boolean | undefined + } + export type OrganizationDomain = { + id: string + domain: string + is_verified: boolean + verified_at: string | null + verification_challenge: string + jit_provisioning_enabled?: boolean | undefined + sso_enforcement?: string | undefined + has_saml: boolean + saml_entity_id?: (string | null) | undefined + saml_acs_url?: (string | null) | undefined + saml_x509_cert?: (string | null) | undefined + } + export type OrganizationMembershipLevel = 1 | 8 | 15 + export type OrganizationInvite = { + id: string + target_email: string + first_name?: string | undefined + emailing_attempt_made: boolean + level?: (OrganizationMembershipLevel & unknown) | undefined + is_expired: boolean + created_by: UserBasic & unknown + created_at: string + updated_at: string + message?: (string | null) | undefined + private_project_access?: (unknown | null) | undefined + send_email?: boolean | undefined + combine_pending_invites?: boolean | undefined + } + export type OrganizationMember = { + id: string + user: UserBasic & unknown + level?: (OrganizationMembershipLevel & unknown) | undefined + joined_at: string + updated_at: string + is_2fa_enabled: boolean + has_social_auth: boolean + last_login: string + } + export type PaginatedActionList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedActivityLogList = Array + export type PaginatedAnnotationList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedBatchExportBackfillList = { + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedBatchExportList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedBatchExportRunList = { + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedClickhouseEventList = Partial<{ + next: string | null + results: Array + }> + export type PaginatedCohortList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedDashboardBasicList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedDashboardTemplateList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedDataWarehouseSavedQueryList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedEarlyAccessFeatureList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedErrorTrackingAssignmentRuleList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedErrorTrackingGroupingRuleList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedErrorTrackingReleaseList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedErrorTrackingSuppressionRuleList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedErrorTrackingSymbolSetList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedExperimentHoldoutList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedExperimentList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedExperimentSavedMetricList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedExportedAssetList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedFeatureFlagList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedFeatureFlagRoleAccessList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedFileSystemList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedFileSystemShortcutList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedGroupList = { + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedGroupUsageMetricList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedHogFunctionMinimalList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedInsightList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedNotebookMinimalList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedOrganizationDomainList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedOrganizationInviteList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedOrganizationList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedOrganizationMemberList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PersistedFolderTypeEnum = 'home' | 'pinned' + export type PersistedFolder = { + id: string + type: PersistedFolderTypeEnum + protocol?: string | undefined + path?: string | undefined + created_at: string + updated_at: string + } + export type PaginatedPersistedFolderList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedPersonList = Partial<{ + next: string | null + previous: string | null + count: number + results: Array + }> + export type PluginLogEntrySourceEnum = 'SYSTEM' | 'PLUGIN' | 'CONSOLE' + export type PluginLogEntryTypeEnum = 'DEBUG' | 'LOG' | 'INFO' | 'WARN' | 'ERROR' + export type PluginLogEntry = { + id: string + team_id: number + plugin_id: number + plugin_config_id: number + timestamp: string + source: PluginLogEntrySourceEnum + type: PluginLogEntryTypeEnum + message: string + instance_id: string + } + export type PaginatedPluginLogEntryList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type TimezoneEnum = + | 'Africa/Abidjan' + | 'Africa/Accra' + | 'Africa/Addis_Ababa' + | 'Africa/Algiers' + | 'Africa/Asmara' + | 'Africa/Asmera' + | 'Africa/Bamako' + | 'Africa/Bangui' + | 'Africa/Banjul' + | 'Africa/Bissau' + | 'Africa/Blantyre' + | 'Africa/Brazzaville' + | 'Africa/Bujumbura' + | 'Africa/Cairo' + | 'Africa/Casablanca' + | 'Africa/Ceuta' + | 'Africa/Conakry' + | 'Africa/Dakar' + | 'Africa/Dar_es_Salaam' + | 'Africa/Djibouti' + | 'Africa/Douala' + | 'Africa/El_Aaiun' + | 'Africa/Freetown' + | 'Africa/Gaborone' + | 'Africa/Harare' + | 'Africa/Johannesburg' + | 'Africa/Juba' + | 'Africa/Kampala' + | 'Africa/Khartoum' + | 'Africa/Kigali' + | 'Africa/Kinshasa' + | 'Africa/Lagos' + | 'Africa/Libreville' + | 'Africa/Lome' + | 'Africa/Luanda' + | 'Africa/Lubumbashi' + | 'Africa/Lusaka' + | 'Africa/Malabo' + | 'Africa/Maputo' + | 'Africa/Maseru' + | 'Africa/Mbabane' + | 'Africa/Mogadishu' + | 'Africa/Monrovia' + | 'Africa/Nairobi' + | 'Africa/Ndjamena' + | 'Africa/Niamey' + | 'Africa/Nouakchott' + | 'Africa/Ouagadougou' + | 'Africa/Porto-Novo' + | 'Africa/Sao_Tome' + | 'Africa/Timbuktu' + | 'Africa/Tripoli' + | 'Africa/Tunis' + | 'Africa/Windhoek' + | 'America/Adak' + | 'America/Anchorage' + | 'America/Anguilla' + | 'America/Antigua' + | 'America/Araguaina' + | 'America/Argentina/Buenos_Aires' + | 'America/Argentina/Catamarca' + | 'America/Argentina/ComodRivadavia' + | 'America/Argentina/Cordoba' + | 'America/Argentina/Jujuy' + | 'America/Argentina/La_Rioja' + | 'America/Argentina/Mendoza' + | 'America/Argentina/Rio_Gallegos' + | 'America/Argentina/Salta' + | 'America/Argentina/San_Juan' + | 'America/Argentina/San_Luis' + | 'America/Argentina/Tucuman' + | 'America/Argentina/Ushuaia' + | 'America/Aruba' + | 'America/Asuncion' + | 'America/Atikokan' + | 'America/Atka' + | 'America/Bahia' + | 'America/Bahia_Banderas' + | 'America/Barbados' + | 'America/Belem' + | 'America/Belize' + | 'America/Blanc-Sablon' + | 'America/Boa_Vista' + | 'America/Bogota' + | 'America/Boise' + | 'America/Buenos_Aires' + | 'America/Cambridge_Bay' + | 'America/Campo_Grande' + | 'America/Cancun' + | 'America/Caracas' + | 'America/Catamarca' + | 'America/Cayenne' + | 'America/Cayman' + | 'America/Chicago' + | 'America/Chihuahua' + | 'America/Ciudad_Juarez' + | 'America/Coral_Harbour' + | 'America/Cordoba' + | 'America/Costa_Rica' + | 'America/Creston' + | 'America/Cuiaba' + | 'America/Curacao' + | 'America/Danmarkshavn' + | 'America/Dawson' + | 'America/Dawson_Creek' + | 'America/Denver' + | 'America/Detroit' + | 'America/Dominica' + | 'America/Edmonton' + | 'America/Eirunepe' + | 'America/El_Salvador' + | 'America/Ensenada' + | 'America/Fort_Nelson' + | 'America/Fort_Wayne' + | 'America/Fortaleza' + | 'America/Glace_Bay' + | 'America/Godthab' + | 'America/Goose_Bay' + | 'America/Grand_Turk' + | 'America/Grenada' + | 'America/Guadeloupe' + | 'America/Guatemala' + | 'America/Guayaquil' + | 'America/Guyana' + | 'America/Halifax' + | 'America/Havana' + | 'America/Hermosillo' + | 'America/Indiana/Indianapolis' + | 'America/Indiana/Knox' + | 'America/Indiana/Marengo' + | 'America/Indiana/Petersburg' + | 'America/Indiana/Tell_City' + | 'America/Indiana/Vevay' + | 'America/Indiana/Vincennes' + | 'America/Indiana/Winamac' + | 'America/Indianapolis' + | 'America/Inuvik' + | 'America/Iqaluit' + | 'America/Jamaica' + | 'America/Jujuy' + | 'America/Juneau' + | 'America/Kentucky/Louisville' + | 'America/Kentucky/Monticello' + | 'America/Knox_IN' + | 'America/Kralendijk' + | 'America/La_Paz' + | 'America/Lima' + | 'America/Los_Angeles' + | 'America/Louisville' + | 'America/Lower_Princes' + | 'America/Maceio' + | 'America/Managua' + | 'America/Manaus' + | 'America/Marigot' + | 'America/Martinique' + | 'America/Matamoros' + | 'America/Mazatlan' + | 'America/Mendoza' + | 'America/Menominee' + | 'America/Merida' + | 'America/Metlakatla' + | 'America/Mexico_City' + | 'America/Miquelon' + | 'America/Moncton' + | 'America/Monterrey' + | 'America/Montevideo' + | 'America/Montreal' + | 'America/Montserrat' + | 'America/Nassau' + | 'America/New_York' + | 'America/Nipigon' + | 'America/Nome' + | 'America/Noronha' + | 'America/North_Dakota/Beulah' + | 'America/North_Dakota/Center' + | 'America/North_Dakota/New_Salem' + | 'America/Nuuk' + | 'America/Ojinaga' + | 'America/Panama' + | 'America/Pangnirtung' + | 'America/Paramaribo' + | 'America/Phoenix' + | 'America/Port-au-Prince' + | 'America/Port_of_Spain' + | 'America/Porto_Acre' + | 'America/Porto_Velho' + | 'America/Puerto_Rico' + | 'America/Punta_Arenas' + | 'America/Rainy_River' + | 'America/Rankin_Inlet' + | 'America/Recife' + | 'America/Regina' + | 'America/Resolute' + | 'America/Rio_Branco' + | 'America/Rosario' + | 'America/Santa_Isabel' + | 'America/Santarem' + | 'America/Santiago' + | 'America/Santo_Domingo' + | 'America/Sao_Paulo' + | 'America/Scoresbysund' + | 'America/Shiprock' + | 'America/Sitka' + | 'America/St_Barthelemy' + | 'America/St_Johns' + | 'America/St_Kitts' + | 'America/St_Lucia' + | 'America/St_Thomas' + | 'America/St_Vincent' + | 'America/Swift_Current' + | 'America/Tegucigalpa' + | 'America/Thule' + | 'America/Thunder_Bay' + | 'America/Tijuana' + | 'America/Toronto' + | 'America/Tortola' + | 'America/Vancouver' + | 'America/Virgin' + | 'America/Whitehorse' + | 'America/Winnipeg' + | 'America/Yakutat' + | 'America/Yellowknife' + | 'Antarctica/Casey' + | 'Antarctica/Davis' + | 'Antarctica/DumontDUrville' + | 'Antarctica/Macquarie' + | 'Antarctica/Mawson' + | 'Antarctica/McMurdo' + | 'Antarctica/Palmer' + | 'Antarctica/Rothera' + | 'Antarctica/South_Pole' + | 'Antarctica/Syowa' + | 'Antarctica/Troll' + | 'Antarctica/Vostok' + | 'Arctic/Longyearbyen' + | 'Asia/Aden' + | 'Asia/Almaty' + | 'Asia/Amman' + | 'Asia/Anadyr' + | 'Asia/Aqtau' + | 'Asia/Aqtobe' + | 'Asia/Ashgabat' + | 'Asia/Ashkhabad' + | 'Asia/Atyrau' + | 'Asia/Baghdad' + | 'Asia/Bahrain' + | 'Asia/Baku' + | 'Asia/Bangkok' + | 'Asia/Barnaul' + | 'Asia/Beirut' + | 'Asia/Bishkek' + | 'Asia/Brunei' + | 'Asia/Calcutta' + | 'Asia/Chita' + | 'Asia/Choibalsan' + | 'Asia/Chongqing' + | 'Asia/Chungking' + | 'Asia/Colombo' + | 'Asia/Dacca' + | 'Asia/Damascus' + | 'Asia/Dhaka' + | 'Asia/Dili' + | 'Asia/Dubai' + | 'Asia/Dushanbe' + | 'Asia/Famagusta' + | 'Asia/Gaza' + | 'Asia/Harbin' + | 'Asia/Hebron' + | 'Asia/Ho_Chi_Minh' + | 'Asia/Hong_Kong' + | 'Asia/Hovd' + | 'Asia/Irkutsk' + | 'Asia/Istanbul' + | 'Asia/Jakarta' + | 'Asia/Jayapura' + | 'Asia/Jerusalem' + | 'Asia/Kabul' + | 'Asia/Kamchatka' + | 'Asia/Karachi' + | 'Asia/Kashgar' + | 'Asia/Kathmandu' + | 'Asia/Katmandu' + | 'Asia/Khandyga' + | 'Asia/Kolkata' + | 'Asia/Krasnoyarsk' + | 'Asia/Kuala_Lumpur' + | 'Asia/Kuching' + | 'Asia/Kuwait' + | 'Asia/Macao' + | 'Asia/Macau' + | 'Asia/Magadan' + | 'Asia/Makassar' + | 'Asia/Manila' + | 'Asia/Muscat' + | 'Asia/Nicosia' + | 'Asia/Novokuznetsk' + | 'Asia/Novosibirsk' + | 'Asia/Omsk' + | 'Asia/Oral' + | 'Asia/Phnom_Penh' + | 'Asia/Pontianak' + | 'Asia/Pyongyang' + | 'Asia/Qatar' + | 'Asia/Qostanay' + | 'Asia/Qyzylorda' + | 'Asia/Rangoon' + | 'Asia/Riyadh' + | 'Asia/Saigon' + | 'Asia/Sakhalin' + | 'Asia/Samarkand' + | 'Asia/Seoul' + | 'Asia/Shanghai' + | 'Asia/Singapore' + | 'Asia/Srednekolymsk' + | 'Asia/Taipei' + | 'Asia/Tashkent' + | 'Asia/Tbilisi' + | 'Asia/Tehran' + | 'Asia/Tel_Aviv' + | 'Asia/Thimbu' + | 'Asia/Thimphu' + | 'Asia/Tokyo' + | 'Asia/Tomsk' + | 'Asia/Ujung_Pandang' + | 'Asia/Ulaanbaatar' + | 'Asia/Ulan_Bator' + | 'Asia/Urumqi' + | 'Asia/Ust-Nera' + | 'Asia/Vientiane' + | 'Asia/Vladivostok' + | 'Asia/Yakutsk' + | 'Asia/Yangon' + | 'Asia/Yekaterinburg' + | 'Asia/Yerevan' + | 'Atlantic/Azores' + | 'Atlantic/Bermuda' + | 'Atlantic/Canary' + | 'Atlantic/Cape_Verde' + | 'Atlantic/Faeroe' + | 'Atlantic/Faroe' + | 'Atlantic/Jan_Mayen' + | 'Atlantic/Madeira' + | 'Atlantic/Reykjavik' + | 'Atlantic/South_Georgia' + | 'Atlantic/St_Helena' + | 'Atlantic/Stanley' + | 'Australia/ACT' + | 'Australia/Adelaide' + | 'Australia/Brisbane' + | 'Australia/Broken_Hill' + | 'Australia/Canberra' + | 'Australia/Currie' + | 'Australia/Darwin' + | 'Australia/Eucla' + | 'Australia/Hobart' + | 'Australia/LHI' + | 'Australia/Lindeman' + | 'Australia/Lord_Howe' + | 'Australia/Melbourne' + | 'Australia/NSW' + | 'Australia/North' + | 'Australia/Perth' + | 'Australia/Queensland' + | 'Australia/South' + | 'Australia/Sydney' + | 'Australia/Tasmania' + | 'Australia/Victoria' + | 'Australia/West' + | 'Australia/Yancowinna' + | 'Brazil/Acre' + | 'Brazil/DeNoronha' + | 'Brazil/East' + | 'Brazil/West' + | 'CET' + | 'CST6CDT' + | 'Canada/Atlantic' + | 'Canada/Central' + | 'Canada/Eastern' + | 'Canada/Mountain' + | 'Canada/Newfoundland' + | 'Canada/Pacific' + | 'Canada/Saskatchewan' + | 'Canada/Yukon' + | 'Chile/Continental' + | 'Chile/EasterIsland' + | 'Cuba' + | 'EET' + | 'EST' + | 'EST5EDT' + | 'Egypt' + | 'Eire' + | 'Etc/GMT' + | 'Etc/GMT+0' + | 'Etc/GMT+1' + | 'Etc/GMT+10' + | 'Etc/GMT+11' + | 'Etc/GMT+12' + | 'Etc/GMT+2' + | 'Etc/GMT+3' + | 'Etc/GMT+4' + | 'Etc/GMT+5' + | 'Etc/GMT+6' + | 'Etc/GMT+7' + | 'Etc/GMT+8' + | 'Etc/GMT+9' + | 'Etc/GMT-0' + | 'Etc/GMT-1' + | 'Etc/GMT-10' + | 'Etc/GMT-11' + | 'Etc/GMT-12' + | 'Etc/GMT-13' + | 'Etc/GMT-14' + | 'Etc/GMT-2' + | 'Etc/GMT-3' + | 'Etc/GMT-4' + | 'Etc/GMT-5' + | 'Etc/GMT-6' + | 'Etc/GMT-7' + | 'Etc/GMT-8' + | 'Etc/GMT-9' + | 'Etc/GMT0' + | 'Etc/Greenwich' + | 'Etc/UCT' + | 'Etc/UTC' + | 'Etc/Universal' + | 'Etc/Zulu' + | 'Europe/Amsterdam' + | 'Europe/Andorra' + | 'Europe/Astrakhan' + | 'Europe/Athens' + | 'Europe/Belfast' + | 'Europe/Belgrade' + | 'Europe/Berlin' + | 'Europe/Bratislava' + | 'Europe/Brussels' + | 'Europe/Bucharest' + | 'Europe/Budapest' + | 'Europe/Busingen' + | 'Europe/Chisinau' + | 'Europe/Copenhagen' + | 'Europe/Dublin' + | 'Europe/Gibraltar' + | 'Europe/Guernsey' + | 'Europe/Helsinki' + | 'Europe/Isle_of_Man' + | 'Europe/Istanbul' + | 'Europe/Jersey' + | 'Europe/Kaliningrad' + | 'Europe/Kiev' + | 'Europe/Kirov' + | 'Europe/Kyiv' + | 'Europe/Lisbon' + | 'Europe/Ljubljana' + | 'Europe/London' + | 'Europe/Luxembourg' + | 'Europe/Madrid' + | 'Europe/Malta' + | 'Europe/Mariehamn' + | 'Europe/Minsk' + | 'Europe/Monaco' + | 'Europe/Moscow' + | 'Europe/Nicosia' + | 'Europe/Oslo' + | 'Europe/Paris' + | 'Europe/Podgorica' + | 'Europe/Prague' + | 'Europe/Riga' + | 'Europe/Rome' + | 'Europe/Samara' + | 'Europe/San_Marino' + | 'Europe/Sarajevo' + | 'Europe/Saratov' + | 'Europe/Simferopol' + | 'Europe/Skopje' + | 'Europe/Sofia' + | 'Europe/Stockholm' + | 'Europe/Tallinn' + | 'Europe/Tirane' + | 'Europe/Tiraspol' + | 'Europe/Ulyanovsk' + | 'Europe/Uzhgorod' + | 'Europe/Vaduz' + | 'Europe/Vatican' + | 'Europe/Vienna' + | 'Europe/Vilnius' + | 'Europe/Volgograd' + | 'Europe/Warsaw' + | 'Europe/Zagreb' + | 'Europe/Zaporozhye' + | 'Europe/Zurich' + | 'GB' + | 'GB-Eire' + | 'GMT' + | 'GMT+0' + | 'GMT-0' + | 'GMT0' + | 'Greenwich' + | 'HST' + | 'Hongkong' + | 'Iceland' + | 'Indian/Antananarivo' + | 'Indian/Chagos' + | 'Indian/Christmas' + | 'Indian/Cocos' + | 'Indian/Comoro' + | 'Indian/Kerguelen' + | 'Indian/Mahe' + | 'Indian/Maldives' + | 'Indian/Mauritius' + | 'Indian/Mayotte' + | 'Indian/Reunion' + | 'Iran' + | 'Israel' + | 'Jamaica' + | 'Japan' + | 'Kwajalein' + | 'Libya' + | 'MET' + | 'MST' + | 'MST7MDT' + | 'Mexico/BajaNorte' + | 'Mexico/BajaSur' + | 'Mexico/General' + | 'NZ' + | 'NZ-CHAT' + | 'Navajo' + | 'PRC' + | 'PST8PDT' + | 'Pacific/Apia' + | 'Pacific/Auckland' + | 'Pacific/Bougainville' + | 'Pacific/Chatham' + | 'Pacific/Chuuk' + | 'Pacific/Easter' + | 'Pacific/Efate' + | 'Pacific/Enderbury' + | 'Pacific/Fakaofo' + | 'Pacific/Fiji' + | 'Pacific/Funafuti' + | 'Pacific/Galapagos' + | 'Pacific/Gambier' + | 'Pacific/Guadalcanal' + | 'Pacific/Guam' + | 'Pacific/Honolulu' + | 'Pacific/Johnston' + | 'Pacific/Kanton' + | 'Pacific/Kiritimati' + | 'Pacific/Kosrae' + | 'Pacific/Kwajalein' + | 'Pacific/Majuro' + | 'Pacific/Marquesas' + | 'Pacific/Midway' + | 'Pacific/Nauru' + | 'Pacific/Niue' + | 'Pacific/Norfolk' + | 'Pacific/Noumea' + | 'Pacific/Pago_Pago' + | 'Pacific/Palau' + | 'Pacific/Pitcairn' + | 'Pacific/Pohnpei' + | 'Pacific/Ponape' + | 'Pacific/Port_Moresby' + | 'Pacific/Rarotonga' + | 'Pacific/Saipan' + | 'Pacific/Samoa' + | 'Pacific/Tahiti' + | 'Pacific/Tarawa' + | 'Pacific/Tongatapu' + | 'Pacific/Truk' + | 'Pacific/Wake' + | 'Pacific/Wallis' + | 'Pacific/Yap' + | 'Poland' + | 'Portugal' + | 'ROC' + | 'ROK' + | 'Singapore' + | 'Turkey' + | 'UCT' + | 'US/Alaska' + | 'US/Aleutian' + | 'US/Arizona' + | 'US/Central' + | 'US/East-Indiana' + | 'US/Eastern' + | 'US/Hawaii' + | 'US/Indiana-Starke' + | 'US/Michigan' + | 'US/Mountain' + | 'US/Pacific' + | 'US/Samoa' + | 'UTC' + | 'Universal' + | 'W-SU' + | 'WET' + | 'Zulu' + export type ProjectBackwardCompatBasic = { + id: number + uuid: string + organization: string + api_token: string + name: string + completed_snippet_onboarding: boolean + has_completed_onboarding_for: unknown | null + ingested_event: boolean + is_demo: boolean + timezone: TimezoneEnum & unknown + access_control: boolean + } + export type PaginatedProjectBackwardCompatBasicList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PropertyTypeEnum = 'DateTime' | 'String' | 'Numeric' | 'Boolean' | 'Duration' + export type PropertyDefinition = { + id: string + name: string + is_numerical?: boolean | undefined + property_type?: ((PropertyTypeEnum | BlankEnum | NullEnum) | null) | undefined + tags?: Array | undefined + is_seen_on_filtered_events: string + } + export type PaginatedPropertyDefinitionList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type ProxyRecordStatusEnum = + | 'waiting' + | 'issuing' + | 'valid' + | 'warning' + | 'erroring' + | 'deleting' + | 'timed_out' + export type ProxyRecord = { + id: string + domain: string + target_cname: string + status: ProxyRecordStatusEnum & unknown + message: string | null + created_at: string + updated_at: string + created_by: number | null + } + export type PaginatedProxyRecordList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PaginatedRoleList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type RoleMembership = { + id: string + role_id: string + organization_member: OrganizationMember & unknown + user: UserBasic & unknown + joined_at: string + updated_at: string + user_uuid: string + } + export type PaginatedRoleMembershipList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type SessionRecording = { + id: string + distinct_id: string | null + viewed: boolean + viewers: Array + recording_duration: number + active_seconds: number | null + inactive_seconds: number | null + start_time: string | null + end_time: string | null + click_count: number | null + keypress_count: number | null + mouse_activity_count: number | null + console_log_count: number | null + console_warn_count: number | null + console_error_count: number | null + start_url: string | null + person?: MinimalPerson | undefined + storage: string + retention_period_days: number | null + snapshot_source: string | null + ongoing: boolean + activity_score: number | null + } + export type PaginatedSessionRecordingList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type SessionRecordingPlaylistTypeEnum = 'collection' | 'filters' + export type SessionRecordingPlaylist = { + id: number + short_id: string + name?: (string | null) | undefined + derived_name?: (string | null) | undefined + description?: string | undefined + pinned?: boolean | undefined + created_at: string + created_by: UserBasic & unknown + deleted?: boolean | undefined + filters?: unknown | undefined + last_modified_at: string + last_modified_by: UserBasic & unknown + recordings_counts: Record> + type: (SessionRecordingPlaylistTypeEnum | NullEnum) | null + _create_in_folder?: string | undefined + } + export type PaginatedSessionRecordingPlaylistList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type TargetTypeEnum = 'email' | 'slack' | 'webhook' + export type Subscription = { + id: number + dashboard?: (number | null) | undefined + insight?: (number | null) | undefined + target_type: TargetTypeEnum + target_value: string + frequency: FrequencyEnum + interval?: number | undefined + byweekday?: (Array | null) | undefined + bysetpos?: (number | null) | undefined + count?: (number | null) | undefined + start_date: string + until_date?: (string | null) | undefined + created_at: string + created_by: UserBasic & unknown + deleted?: boolean | undefined + title?: (string | null) | undefined + summary: string + next_delivery_date: string | null + invite_message?: (string | null) | undefined + } + export type PaginatedSubscriptionList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type SurveyType = 'popover' | 'widget' | 'external_survey' | 'api' + export type ResponseSamplingIntervalTypeEnum = 'day' | 'week' | 'month' + export type Survey = { + id: string + name: string + description?: string | undefined + type: SurveyType + schedule?: (string | null) | undefined + linked_flag: MinimalFeatureFlag & unknown + linked_flag_id?: (number | null) | undefined + targeting_flag: MinimalFeatureFlag & unknown + internal_targeting_flag: MinimalFeatureFlag & unknown + questions?: (unknown | null) | undefined + conditions: string + appearance?: (unknown | null) | undefined + created_at: string + created_by: UserBasic & unknown + start_date?: (string | null) | undefined + end_date?: (string | null) | undefined + archived?: boolean | undefined + responses_limit?: (number | null) | undefined + feature_flag_keys: Array + iteration_count?: (number | null) | undefined + iteration_frequency_days?: (number | null) | undefined + iteration_start_dates?: (Array | null) | undefined + current_iteration?: (number | null) | undefined + current_iteration_start_date?: (string | null) | undefined + response_sampling_start_date?: (string | null) | undefined + response_sampling_interval_type?: + | ((ResponseSamplingIntervalTypeEnum | BlankEnum | NullEnum) | null) + | undefined + response_sampling_interval?: (number | null) | undefined + response_sampling_limit?: (number | null) | undefined + response_sampling_daily_limits?: (unknown | null) | undefined + enable_partial_responses?: (boolean | null) | undefined + } + export type PaginatedSurveyList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type TableFormatEnum = + | 'CSV' + | 'CSVWithNames' + | 'Parquet' + | 'JSONEachRow' + | 'Delta' + | 'DeltaS3Wrapper' + export type SourceTypeEnum = + | 'Stripe' + | 'Hubspot' + | 'Postgres' + | 'Zendesk' + | 'Snowflake' + | 'Salesforce' + | 'MySQL' + | 'MongoDB' + | 'MSSQL' + | 'Vitally' + | 'BigQuery' + | 'Chargebee' + | 'GoogleAds' + | 'TemporalIO' + | 'DoIt' + | 'GoogleSheets' + | 'MetaAds' + | 'Klaviyo' + | 'Mailchimp' + | 'Braze' + | 'Mailjet' + | 'Redshift' + | 'Polar' + | 'RevenueCat' + | 'LinkedinAds' + | 'RedditAds' + export type SimpleExternalDataSourceSerializers = { + id: string + created_at: string + created_by: number | null + status: string + source_type: SourceTypeEnum & unknown + } + export type Table = { + id: string + deleted?: (boolean | null) | undefined + name: string + format: TableFormatEnum + created_by: UserBasic & unknown + created_at: string + url_pattern: string + credential: Credential + columns: string + external_data_source: SimpleExternalDataSourceSerializers & unknown + external_schema: string + } + export type PaginatedTableList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type TeamBasic = { + id: number + uuid: string + organization: string + project_id: number + api_token: string + name: string + completed_snippet_onboarding: boolean + has_completed_onboarding_for: unknown | null + ingested_event: boolean + is_demo: boolean + timezone: TimezoneEnum & unknown + access_control: boolean + } + export type PaginatedTeamBasicList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type UserInterview = { + id: string + created_by: UserBasic & unknown + created_at: string + interviewee_emails?: Array | undefined + transcript: string + summary?: string | undefined + audio: string + } + export type PaginatedUserInterviewList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type ToolbarModeEnum = 'disabled' | 'toolbar' + export type ScenePersonalisationBasic = { + scene: string + dashboard?: (number | null) | undefined + } + export type ThemeModeEnum = 'light' | 'dark' | 'system' + export type User = { + date_joined: string + uuid: string + distinct_id: string | null + first_name?: string | undefined + last_name?: string | undefined + email: string + pending_email: string | null + is_email_verified: boolean | null + notification_settings?: Record | undefined + anonymize_data?: (boolean | null) | undefined + toolbar_mode?: ((ToolbarModeEnum | BlankEnum | NullEnum) | null) | undefined + has_password: boolean + id: number + is_staff?: boolean | undefined + is_impersonated: boolean | null + is_impersonated_until: string | null + sensitive_session_expires_at: string | null + team: TeamBasic & unknown + organization: Organization & unknown + organizations: Array + set_current_organization?: string | undefined + set_current_team?: string | undefined + password: string + current_password?: string | undefined + events_column_config?: unknown | undefined + is_2fa_enabled: boolean + has_social_auth: boolean + has_sso_enforcement: boolean + has_seen_product_intro_for?: (unknown | null) | undefined + scene_personalisation: Array + theme_mode?: ((ThemeModeEnum | BlankEnum | NullEnum) | null) | undefined + hedgehog_config?: (unknown | null) | undefined + role_at_organization?: RoleAtOrganizationEnum | undefined + } + export type PaginatedUserList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type WebExperimentsAPI = { + id: number + name: string + created_at?: string | undefined + feature_flag_key: string + variants: unknown + } + export type PaginatedWebExperimentsAPIList = { + count: number + next?: (string | null) | undefined + previous?: (string | null) | undefined + results: Array + } + export type PatchedAction = Partial<{ + id: number + name: string | null + description: string + tags: Array + post_to_slack: boolean + slack_message_format: string + steps: Array + created_at: string + created_by: UserBasic & unknown + deleted: boolean + is_calculating: boolean + last_calculated_at: string + team_id: number + is_action: boolean + bytecode_error: string | null + pinned_at: string | null + creation_context: string + _create_in_folder: string + }> + export type PatchedAnnotation = Partial<{ + id: number + content: string | null + date_marker: string | null + creation_type: CreationTypeEnum + dashboard_item: number | null + dashboard_id: number | null + dashboard_name: string | null + insight_short_id: string | null + insight_name: string | null + insight_derived_name: string | null + created_by: UserBasic & unknown + created_at: string | null + updated_at: string + deleted: boolean + scope: AnnotationScopeEnum + }> + export type PatchedBatchExport = Partial<{ + id: string + team_id: number + name: string + model: (ModelEnum | BlankEnum | NullEnum) | null + destination: BatchExportDestination + interval: IntervalEnum + paused: boolean + created_at: string + last_updated_at: string + last_paused_at: string | null + start_at: string | null + end_at: string | null + latest_runs: Array + hogql_query: string + schema: unknown | null + filters: unknown | null + }> + export type PatchedCohort = Partial<{ + id: number + name: string | null + description: string + groups: unknown + deleted: boolean + filters: unknown | null + query: unknown | null + is_calculating: boolean + created_by: UserBasic & unknown + created_at: string | null + last_calculation: string | null + errors_calculating: number + count: number | null + is_static: boolean + cohort_type: (CohortTypeEnum | BlankEnum | NullEnum) | null + experiment_set: Array + _create_in_folder: string + }> + export type PatchedDashboard = Partial<{ + id: number + name: string | null + description: string + pinned: boolean + created_at: string + created_by: UserBasic & unknown + is_shared: boolean + deleted: boolean + creation_mode: CreationModeEnum & unknown + use_template: string + use_dashboard: number | null + delete_insights: boolean + filters: Record + variables: Record | null + breakdown_colors: unknown + data_color_theme_id: number | null + tags: Array + tiles: Array> | null + restriction_level: DashboardRestrictionLevel & unknown + effective_restriction_level: EffectiveRestrictionLevelEnum & unknown + effective_privilege_level: EffectivePrivilegeLevelEnum & unknown + user_access_level: string | null + access_control_version: string + _create_in_folder: string + last_refresh: string | null + persisted_filters: Record | null + persisted_variables: Record | null + team_id: number + }> + export type PatchedDashboardTemplate = Partial<{ + id: string + template_name: string | null + dashboard_description: string | null + dashboard_filters: unknown | null + tags: Array | null + tiles: unknown | null + variables: unknown | null + deleted: boolean | null + created_at: string | null + created_by: number | null + image_url: string | null + team_id: number | null + scope: (DashboardTemplateScopeEnum | BlankEnum | NullEnum) | null + availability_contexts: Array | null + }> + export type PatchedDataWarehouseSavedQuery = Partial<{ + id: string + deleted: boolean | null + name: string + query: unknown | null + created_by: UserBasic & unknown + created_at: string + sync_frequency: string + columns: string + status: (DataWarehouseSavedQueryStatusEnum | NullEnum) | null + last_run_at: string | null + latest_error: string | null + edited_history_id: string | null + latest_history_id: string + soft_update: boolean | null + is_materialized: boolean | null + }> + export type PatchedEarlyAccessFeature = Partial<{ + id: string + feature_flag: MinimalFeatureFlag & unknown + name: string + description: string + stage: StageEnum + documentation_url: string + created_at: string + }> + export type PatchedErrorTrackingAssignmentRule = Partial<{ + id: string + filters: unknown + assignee: string + order_key: number + disabled_data: unknown | null + }> + export type PatchedErrorTrackingGroupingRule = Partial<{ + id: string + filters: unknown + assignee: string + order_key: number + disabled_data: unknown | null + }> + export type PatchedErrorTrackingRelease = Partial<{ + id: string + hash_id: string + team_id: number + created_at: string + metadata: unknown | null + version: string + project: string + }> + export type PatchedErrorTrackingSuppressionRule = Partial<{ + id: string + filters: unknown + order_key: number + }> + export type PatchedErrorTrackingSymbolSet = Partial<{ + id: string + ref: string + team_id: number + created_at: string + storage_ptr: string | null + failure_reason: string | null + }> + export type PatchedExperiment = Partial<{ + id: number + name: string + description: string | null + start_date: string | null + end_date: string | null + feature_flag_key: string + feature_flag: MinimalFeatureFlag & unknown + holdout: ExperimentHoldout & unknown + holdout_id: number | null + exposure_cohort: number | null + parameters: unknown | null + secondary_metrics: unknown | null + saved_metrics: Array + saved_metrics_ids: Array | null + filters: unknown + archived: boolean + deleted: boolean | null + created_by: UserBasic & unknown + created_at: string + updated_at: string + type: (ExperimentTypeEnum | BlankEnum | NullEnum) | null + exposure_criteria: unknown | null + metrics: unknown | null + metrics_secondary: unknown | null + stats_config: unknown | null + _create_in_folder: string + conclusion: (ConclusionEnum | BlankEnum | NullEnum) | null + conclusion_comment: string | null + primary_metrics_ordered_uuids: unknown | null + secondary_metrics_ordered_uuids: unknown | null + }> + export type PatchedExperimentHoldout = Partial<{ + id: number + name: string + description: string | null + filters: unknown + created_by: UserBasic & unknown + created_at: string + updated_at: string + }> + export type PatchedExperimentSavedMetric = Partial<{ + id: number + name: string + description: string | null + query: unknown + created_by: UserBasic & unknown + created_at: string + updated_at: string + tags: Array + }> + export type PatchedExplicitTeamMember = Partial<{ + id: string + level: ExplicitTeamMemberLevelEnum & unknown + parent_level: number + parent_membership_id: string + joined_at: string + updated_at: string + user: UserBasic & unknown + user_uuid: string + effective_level: EffectiveMembershipLevelEnum & unknown + }> + export type PatchedFeatureFlag = Partial<{ + id: number + name: string + key: string + filters: Record + deleted: boolean + active: boolean + created_by: UserBasic & unknown + created_at: string + version: number + last_modified_by: UserBasic & unknown + is_simple_flag: boolean + rollout_percentage: number | null + ensure_experience_continuity: boolean | null + experiment_set: string + surveys: Record + features: Record + rollback_conditions: unknown | null + performed_rollback: boolean | null + can_edit: boolean + tags: Array + usage_dashboard: number + analytics_dashboards: Array + has_enriched_analytics: boolean | null + user_access_level: string | null + creation_context: CreationContextEnum & unknown + is_remote_configuration: boolean | null + has_encrypted_payloads: boolean | null + status: string + evaluation_runtime: (EvaluationRuntimeEnum | BlankEnum | NullEnum) | null + _create_in_folder: string + }> + export type PatchedFileSystem = Partial<{ + id: string + path: string + depth: number | null + type: string + ref: string | null + href: string | null + meta: unknown | null + shortcut: boolean | null + created_at: string + }> + export type PatchedFileSystemShortcut = Partial<{ + id: string + path: string + type: string + ref: string | null + href: string | null + created_at: string + }> + export type PatchedGroupType = Partial<{ + group_type: string + group_type_index: number + name_singular: string | null + name_plural: string | null + detail_dashboard: number | null + default_columns: Array | null + created_at: string | null + }> + export type PatchedGroupUsageMetric = Partial<{ + id: string + name: string + format: GroupUsageMetricFormatEnum + interval: number + display: DisplayEnum + filters: unknown + }> + export type PatchedHogFunction = Partial<{ + id: string + type: (HogFunctionTypeEnum | NullEnum) | null + name: string | null + description: string + created_at: string + created_by: UserBasic & unknown + updated_at: string + enabled: boolean + deleted: boolean + hog: string + bytecode: unknown | null + transpiled: string | null + inputs_schema: Array + inputs: Record + filters: HogFunctionFilters + masking: (HogFunctionMasking & (unknown | null)) | null + mappings: Array | null + icon_url: string | null + template: HogFunctionTemplate & unknown + template_id: string | null + status: (HogFunctionStatus & (unknown | null)) | null + execution_order: number | null + _create_in_folder: string + }> + export type PatchedInsight = Partial<{ + id: number + short_id: string + name: string | null + derived_name: string | null + query: Record | null + order: number | null + deleted: boolean + dashboards: Array + dashboard_tiles: Array + last_refresh: string + cache_target_age: string + next_allowed_client_refresh: string + result: string + hasMore: string + columns: string + created_at: string | null + created_by: UserBasic & unknown + description: string | null + updated_at: string + tags: Array + favorited: boolean + last_modified_at: string + last_modified_by: UserBasic & unknown + is_sample: boolean + effective_restriction_level: EffectiveRestrictionLevelEnum & unknown + effective_privilege_level: EffectivePrivilegeLevelEnum & unknown + user_access_level: string | null + timezone: string + is_cached: string + query_status: string + hogql: string + types: string + _create_in_folder: string + alerts: string + }> + export type PatchedNotebook = Partial<{ + id: string + short_id: string + title: string | null + content: unknown | null + text_content: string | null + version: number + deleted: boolean + created_at: string + created_by: UserBasic & unknown + last_modified_at: string + last_modified_by: UserBasic & unknown + user_access_level: string | null + _create_in_folder: string + }> + export type PatchedOrganization = Partial<{ + id: string + name: string + slug: string + logo_media_id: string | null + created_at: string + updated_at: string + membership_level: (EffectiveMembershipLevelEnum & (unknown | null)) | null + plugins_access_level: PluginsAccessLevelEnum & unknown + teams: Array> + projects: Array> + available_product_features: Array | null + is_member_join_email_enabled: boolean + metadata: string + customer_id: string | null + enforce_2fa: boolean | null + members_can_invite: boolean | null + members_can_use_personal_api_keys: boolean + allow_publicly_shared_resources: boolean + member_count: string + is_ai_data_processing_approved: boolean | null + default_experiment_stats_method: + | (DefaultExperimentStatsMethodEnum | BlankEnum | NullEnum) + | null + default_role_id: string | null + }> + export type PatchedOrganizationDomain = Partial<{ + id: string + domain: string + is_verified: boolean + verified_at: string | null + verification_challenge: string + jit_provisioning_enabled: boolean + sso_enforcement: string + has_saml: boolean + saml_entity_id: string | null + saml_acs_url: string | null + saml_x509_cert: string | null + }> + export type PatchedOrganizationMember = Partial<{ + id: string + user: UserBasic & unknown + level: OrganizationMembershipLevel & unknown + joined_at: string + updated_at: string + is_2fa_enabled: boolean + has_social_auth: boolean + last_login: string + }> + export type PatchedPersistedFolder = Partial<{ + id: string + type: PersistedFolderTypeEnum + protocol: string + path: string + created_at: string + updated_at: string + }> + export type PatchedPerson = Partial<{ + id: number + name: string + distinct_ids: Array + properties: unknown + created_at: string + uuid: string + }> + export type WeekStartDayEnum = 0 | 1 + export type PatchedProjectBackwardCompat = Partial<{ + id: number + organization: string + name: string + product_description: string | null + created_at: string + effective_membership_level: (EffectiveMembershipLevelEnum & (unknown | null)) | null + has_group_types: boolean + group_types: Array> + live_events_token: string | null + updated_at: string + uuid: string + api_token: string + app_urls: Array + slack_incoming_webhook: string | null + anonymize_ips: boolean + completed_snippet_onboarding: boolean + ingested_event: boolean + test_account_filters: unknown + test_account_filters_default_checked: boolean | null + path_cleaning_filters: unknown | null + is_demo: boolean + timezone: TimezoneEnum + data_attributes: unknown + person_display_name_properties: Array | null + correlation_config: unknown | null + autocapture_opt_out: boolean | null + autocapture_exceptions_opt_in: boolean | null + autocapture_web_vitals_opt_in: boolean | null + autocapture_web_vitals_allowed_metrics: unknown | null + autocapture_exceptions_errors_to_ignore: unknown | null + capture_console_log_opt_in: boolean | null + capture_performance_opt_in: boolean | null + session_recording_opt_in: boolean + session_recording_sample_rate: string | null + session_recording_minimum_duration_milliseconds: number | null + session_recording_linked_flag: unknown | null + session_recording_network_payload_capture_config: unknown | null + session_recording_masking_config: unknown | null + session_replay_config: unknown | null + survey_config: unknown | null + access_control: boolean + week_start_day: (WeekStartDayEnum | NullEnum) | null + primary_dashboard: number | null + live_events_columns: Array | null + recording_domains: Array | null + person_on_events_querying_enabled: string + inject_web_apps: boolean | null + extra_settings: unknown | null + modifiers: unknown | null + default_modifiers: string + has_completed_onboarding_for: unknown | null + surveys_opt_in: boolean | null + heatmaps_opt_in: boolean | null + product_intents: string + flags_persistence_default: boolean | null + secret_api_token: string | null + secret_api_token_backup: string | null + }> + export type PatchedPropertyDefinition = Partial<{ + id: string + name: string + is_numerical: boolean + property_type: (PropertyTypeEnum | BlankEnum | NullEnum) | null + tags: Array + is_seen_on_filtered_events: string + }> + export type PatchedProxyRecord = Partial<{ + id: string + domain: string + target_cname: string + status: ProxyRecordStatusEnum & unknown + message: string | null + created_at: string + updated_at: string + created_by: number | null + }> + export type PatchedRole = Partial<{ + id: string + name: string + feature_flags_access_level: FeatureFlagsAccessLevelEnum & unknown + created_at: string + created_by: UserBasic & unknown + members: string + is_default: string + }> + export type PatchedSessionRecording = Partial<{ + id: string + distinct_id: string | null + viewed: boolean + viewers: Array + recording_duration: number + active_seconds: number | null + inactive_seconds: number | null + start_time: string | null + end_time: string | null + click_count: number | null + keypress_count: number | null + mouse_activity_count: number | null + console_log_count: number | null + console_warn_count: number | null + console_error_count: number | null + start_url: string | null + person: MinimalPerson + storage: string + retention_period_days: number | null + snapshot_source: string | null + ongoing: boolean + activity_score: number | null + }> + export type PatchedSessionRecordingPlaylist = Partial<{ + id: number + short_id: string + name: string | null + derived_name: string | null + description: string + pinned: boolean + created_at: string + created_by: UserBasic & unknown + deleted: boolean + filters: unknown + last_modified_at: string + last_modified_by: UserBasic & unknown + recordings_counts: Record> + type: (SessionRecordingPlaylistTypeEnum | NullEnum) | null + _create_in_folder: string + }> + export type PatchedSubscription = Partial<{ + id: number + dashboard: number | null + insight: number | null + target_type: TargetTypeEnum + target_value: string + frequency: FrequencyEnum + interval: number + byweekday: Array | null + bysetpos: number | null + count: number | null + start_date: string + until_date: string | null + created_at: string + created_by: UserBasic & unknown + deleted: boolean + title: string | null + summary: string + next_delivery_date: string | null + invite_message: string | null + }> + export type PatchedSurveySerializerCreateUpdateOnly = Partial<{ + id: string + name: string + description: string + type: SurveyType + schedule: string | null + linked_flag: MinimalFeatureFlag & unknown + linked_flag_id: number | null + targeting_flag_id: number + targeting_flag: MinimalFeatureFlag & unknown + internal_targeting_flag: MinimalFeatureFlag & unknown + targeting_flag_filters: unknown | null + remove_targeting_flag: boolean | null + questions: unknown | null + conditions: unknown | null + appearance: unknown | null + created_at: string + created_by: UserBasic & unknown + start_date: string | null + end_date: string | null + archived: boolean + responses_limit: number | null + iteration_count: number | null + iteration_frequency_days: number | null + iteration_start_dates: Array | null + current_iteration: number | null + current_iteration_start_date: string | null + response_sampling_start_date: string | null + response_sampling_interval_type: + | (ResponseSamplingIntervalTypeEnum | BlankEnum | NullEnum) + | null + response_sampling_interval: number | null + response_sampling_limit: number | null + response_sampling_daily_limits: unknown | null + enable_partial_responses: boolean | null + _create_in_folder: string + }> + export type PatchedTable = Partial<{ + id: string + deleted: boolean | null + name: string + format: TableFormatEnum + created_by: UserBasic & unknown + created_at: string + url_pattern: string + credential: Credential + columns: string + external_data_source: SimpleExternalDataSourceSerializers & unknown + external_schema: string + }> + export type TeamRevenueAnalyticsConfig = Partial<{ + base_currency: BaseCurrencyEnum + events: unknown + goals: unknown + filter_test_accounts: boolean + }> + export type TeamMarketingAnalyticsConfig = Partial<{ + sources_map: unknown + conversion_goals: unknown + }> + export type PatchedTeam = Partial<{ + id: number + uuid: string + name: string + access_control: boolean + organization: string + project_id: number + api_token: string + secret_api_token: string | null + secret_api_token_backup: string | null + created_at: string + updated_at: string + ingested_event: boolean + default_modifiers: Record + person_on_events_querying_enabled: boolean + user_access_level: string | null + app_urls: Array + slack_incoming_webhook: string | null + anonymize_ips: boolean + completed_snippet_onboarding: boolean + test_account_filters: unknown + test_account_filters_default_checked: boolean | null + path_cleaning_filters: unknown | null + is_demo: boolean + timezone: TimezoneEnum + data_attributes: unknown + person_display_name_properties: Array | null + correlation_config: unknown | null + autocapture_opt_out: boolean | null + autocapture_exceptions_opt_in: boolean | null + autocapture_web_vitals_opt_in: boolean | null + autocapture_web_vitals_allowed_metrics: unknown | null + autocapture_exceptions_errors_to_ignore: unknown | null + capture_console_log_opt_in: boolean | null + capture_performance_opt_in: boolean | null + session_recording_opt_in: boolean + session_recording_sample_rate: string | null + session_recording_minimum_duration_milliseconds: number | null + session_recording_linked_flag: unknown | null + session_recording_network_payload_capture_config: unknown | null + session_recording_masking_config: unknown | null + session_recording_url_trigger_config: Array | null + session_recording_url_blocklist_config: Array | null + session_recording_event_trigger_config: Array | null + session_recording_trigger_match_type_config: string | null + session_replay_config: unknown | null + survey_config: unknown | null + week_start_day: (WeekStartDayEnum | NullEnum) | null + primary_dashboard: number | null + live_events_columns: Array | null + recording_domains: Array | null + cookieless_server_hash_mode: (CookielessServerHashModeEnum | NullEnum) | null + human_friendly_comparison_periods: boolean | null + inject_web_apps: boolean | null + extra_settings: unknown | null + modifiers: unknown | null + has_completed_onboarding_for: unknown | null + surveys_opt_in: boolean | null + heatmaps_opt_in: boolean | null + flags_persistence_default: boolean | null + feature_flag_confirmation_enabled: boolean | null + feature_flag_confirmation_message: string | null + capture_dead_clicks: boolean | null + default_data_theme: number | null + revenue_analytics_config: TeamRevenueAnalyticsConfig + marketing_analytics_config: TeamMarketingAnalyticsConfig + onboarding_tasks: unknown | null + base_currency: BaseCurrencyEnum & unknown + web_analytics_pre_aggregated_tables_enabled: boolean | null + effective_membership_level: (EffectiveMembershipLevelEnum & (unknown | null)) | null + has_group_types: boolean + group_types: Array> + live_events_token: string | null + product_intents: string + }> + export type PatchedUser = Partial<{ + date_joined: string + uuid: string + distinct_id: string | null + first_name: string + last_name: string + email: string + pending_email: string | null + is_email_verified: boolean | null + notification_settings: Record + anonymize_data: boolean | null + toolbar_mode: (ToolbarModeEnum | BlankEnum | NullEnum) | null + has_password: boolean + id: number + is_staff: boolean + is_impersonated: boolean | null + is_impersonated_until: string | null + sensitive_session_expires_at: string | null + team: TeamBasic & unknown + organization: Organization & unknown + organizations: Array + set_current_organization: string + set_current_team: string + password: string + current_password: string + events_column_config: unknown + is_2fa_enabled: boolean + has_social_auth: boolean + has_sso_enforcement: boolean + has_seen_product_intro_for: unknown | null + scene_personalisation: Array + theme_mode: (ThemeModeEnum | BlankEnum | NullEnum) | null + hedgehog_config: unknown | null + role_at_organization: RoleAtOrganizationEnum + }> + export type PatchedUserInterview = Partial<{ + id: string + created_by: UserBasic & unknown + created_at: string + interviewee_emails: Array + transcript: string + summary: string + audio: string + }> + export type PatchedWebExperimentsAPI = Partial<{ + id: number + name: string + created_at: string + feature_flag_key: string + variants: unknown + }> + export type ProjectBackwardCompat = { + id: number + organization: string + name?: string | undefined + product_description?: (string | null) | undefined + created_at: string + effective_membership_level: (EffectiveMembershipLevelEnum & (unknown | null)) | null + has_group_types: boolean + group_types: Array> + live_events_token: string | null + updated_at: string + uuid: string + api_token: string + app_urls?: Array | undefined + slack_incoming_webhook?: (string | null) | undefined + anonymize_ips?: boolean | undefined + completed_snippet_onboarding?: boolean | undefined + ingested_event: boolean + test_account_filters?: unknown | undefined + test_account_filters_default_checked?: (boolean | null) | undefined + path_cleaning_filters?: (unknown | null) | undefined + is_demo?: boolean | undefined + timezone?: TimezoneEnum | undefined + data_attributes?: unknown | undefined + person_display_name_properties?: (Array | null) | undefined + correlation_config?: (unknown | null) | undefined + autocapture_opt_out?: (boolean | null) | undefined + autocapture_exceptions_opt_in?: (boolean | null) | undefined + autocapture_web_vitals_opt_in?: (boolean | null) | undefined + autocapture_web_vitals_allowed_metrics?: (unknown | null) | undefined + autocapture_exceptions_errors_to_ignore?: (unknown | null) | undefined + capture_console_log_opt_in?: (boolean | null) | undefined + capture_performance_opt_in?: (boolean | null) | undefined + session_recording_opt_in?: boolean | undefined + session_recording_sample_rate?: (string | null) | undefined + session_recording_minimum_duration_milliseconds?: (number | null) | undefined + session_recording_linked_flag?: (unknown | null) | undefined + session_recording_network_payload_capture_config?: (unknown | null) | undefined + session_recording_masking_config?: (unknown | null) | undefined + session_replay_config?: (unknown | null) | undefined + survey_config?: (unknown | null) | undefined + access_control?: boolean | undefined + week_start_day?: ((WeekStartDayEnum | NullEnum) | null) | undefined + primary_dashboard?: (number | null) | undefined + live_events_columns?: (Array | null) | undefined + recording_domains?: (Array | null) | undefined + person_on_events_querying_enabled: string + inject_web_apps?: (boolean | null) | undefined + extra_settings?: (unknown | null) | undefined + modifiers?: (unknown | null) | undefined + default_modifiers: string + has_completed_onboarding_for?: (unknown | null) | undefined + surveys_opt_in?: (boolean | null) | undefined + heatmaps_opt_in?: (boolean | null) | undefined + product_intents: string + flags_persistence_default?: (boolean | null) | undefined + secret_api_token: string | null + secret_api_token_backup: string | null + } + export type PropertyItemTypeEnum = + | 'event' + | 'event_metadata' + | 'feature' + | 'person' + | 'cohort' + | 'element' + | 'static-cohort' + | 'dynamic-cohort' + | 'precalculated-cohort' + | 'group' + | 'recording' + | 'log_entry' + | 'behavioral' + | 'session' + | 'hogql' + | 'data_warehouse' + | 'data_warehouse_person_property' + | 'error_tracking_issue' + | 'log' + | 'revenue_analytics' + | 'flag' + export type PropertyItem = { + key: string + value: string + operator?: ((OperatorEnum | BlankEnum | NullEnum) | null) | undefined + type?: (PropertyItemTypeEnum | BlankEnum) | undefined + } + export type Property = { + type?: (PropertyTypeEnum & unknown) | undefined + values: Array + } + export type SavedInsightNode = { + allowSorting?: (boolean | null) | undefined + context?: (DataTableNodeViewPropsContext | null) | undefined + embedded?: (boolean | null) | undefined + expandable?: (boolean | null) | undefined + full?: (boolean | null) | undefined + hidePersonsModal?: (boolean | null) | undefined + hideTooltipOnScroll?: (boolean | null) | undefined + kind?: string | undefined + propertiesViaUrl?: (boolean | null) | undefined + shortId: string + showActions?: (boolean | null) | undefined + showColumnConfigurator?: (boolean | null) | undefined + showCorrelationTable?: (boolean | null) | undefined + showDateRange?: (boolean | null) | undefined + showElapsedTime?: (boolean | null) | undefined + showEventFilter?: (boolean | null) | undefined + showExport?: (boolean | null) | undefined + showFilters?: (boolean | null) | undefined + showHeader?: (boolean | null) | undefined + showHogQLEditor?: (boolean | null) | undefined + showLastComputation?: (boolean | null) | undefined + showLastComputationRefresh?: (boolean | null) | undefined + showOpenEditorButton?: (boolean | null) | undefined + showPersistentColumnConfigurator?: (boolean | null) | undefined + showPropertyFilter?: (boolean | Array | null) | undefined + showReload?: (boolean | null) | undefined + showResults?: (boolean | null) | undefined + showResultsTable?: (boolean | null) | undefined + showSavedFilters?: (boolean | null) | undefined + showSavedQueries?: (boolean | null) | undefined + showSearch?: (boolean | null) | undefined + showTable?: (boolean | null) | undefined + showTestAccountFilters?: (boolean | null) | undefined + showTimings?: (boolean | null) | undefined + suppressSessionAnalysisWarning?: (boolean | null) | undefined + version?: (number | null) | undefined + vizSpecificOptions?: (VizSpecificOptions | null) | undefined + } + export type SuggestedQuestionsQueryResponse = { questions: Array } + export type SuggestedQuestionsQuery = Partial<{ + kind: string + modifiers: HogQLQueryModifiers | null + response: SuggestedQuestionsQueryResponse | null + tags: QueryLogTags | null + version: number | null + }> + export type TeamTaxonomyItem = { count: number; event: string } + export type TeamTaxonomyQueryResponse = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type TeamTaxonomyQuery = Partial<{ + kind: string + modifiers: HogQLQueryModifiers | null + response: TeamTaxonomyQueryResponse | null + tags: QueryLogTags | null + version: number | null + }> + export type RefreshType = + | 'async' + | 'async_except_on_cache_miss' + | 'blocking' + | 'force_async' + | 'force_blocking' + | 'force_cache' + | 'lazy_async' + export type QueryRequest = { + async?: (boolean | null) | undefined + client_query_id?: (string | null) | undefined + filters_override?: (DashboardFilter | null) | undefined + name?: (string | null) | undefined + query: + | EventsNode + | ActionsNode + | PersonsNode + | DataWarehouseNode + | EventsQuery + | ActorsQuery + | GroupsQuery + | InsightActorsQuery + | InsightActorsQueryOptions + | SessionsTimelineQuery + | HogQuery + | HogQLQuery + | HogQLMetadata + | HogQLAutocomplete + | HogQLASTQuery + | SessionAttributionExplorerQuery + | RevenueExampleEventsQuery + | RevenueExampleDataWarehouseTablesQuery + | ErrorTrackingQuery + | ErrorTrackingIssueCorrelationQuery + | ExperimentFunnelsQuery + | ExperimentTrendsQuery + | ExperimentQuery + | ExperimentExposureQuery + | WebOverviewQuery + | WebStatsTableQuery + | WebExternalClicksTableQuery + | WebGoalsQuery + | WebVitalsQuery + | WebVitalsPathBreakdownQuery + | WebPageURLSearchQuery + | WebAnalyticsExternalSummaryQuery + | RevenueAnalyticsGrossRevenueQuery + | RevenueAnalyticsMetricsQuery + | RevenueAnalyticsMRRQuery + | RevenueAnalyticsOverviewQuery + | RevenueAnalyticsTopCustomersQuery + | MarketingAnalyticsTableQuery + | DataVisualizationNode + | DataTableNode + | SavedInsightNode + | InsightVizNode + | TrendsQuery + | FunnelsQuery + | RetentionQuery + | PathsQuery + | StickinessQuery + | LifecycleQuery + | FunnelCorrelationQuery + | DatabaseSchemaQuery + | LogsQuery + | SuggestedQuestionsQuery + | TeamTaxonomyQuery + | EventTaxonomyQuery + | ActorsPropertyTaxonomyQuery + | TracesQuery + | VectorSearchQuery + refresh?: (RefreshType | null) | undefined + variables_override?: (Record> | null) | undefined + } + export type QueryResponseAlternative1 = { + columns: Array + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql: string + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + types: Array + } + export type QueryResponseAlternative2 = { + columns: Array + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql: string + limit: number + missing_actors_count?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset: number + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type QueryResponseAlternative3 = { + columns: Array + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql: string + kind?: string | undefined + limit: number + modifiers?: (HogQLQueryModifiers | null) | undefined + offset: number + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + types: Array + } + export type QueryResponseAlternative4 = Partial<{ + breakdown: Array | null + breakdowns: Array | null + compare: Array | null + day: Array | null + interval: Array | null + series: Array | null + status: Array | null + }> + export type QueryResponseAlternative5 = { + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative6 = { + bytecode?: (Array | null) | undefined + coloredBytecode?: (Array | null) | undefined + results: unknown + stdout?: (string | null) | undefined + } + export type QueryResponseAlternative7 = { + clickhouse?: (string | null) | undefined + columns?: (Array | null) | undefined + error?: (string | null) | undefined + explain?: (Array | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + metadata?: (HogQLMetadataResponse | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query?: (string | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type QueryResponseAlternative8 = { + errors: Array + isUsingIndices?: (QueryIndexUsage | null) | undefined + isValid?: (boolean | null) | undefined + notices: Array + query?: (string | null) | undefined + table_names?: (Array | null) | undefined + warnings: Array + } + export type QueryResponseAlternative9 = { + incomplete_list: boolean + suggestions: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative10 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type QueryResponseAlternative13 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative14 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative15 = { + credible_intervals: Record> + expected_loss: number + funnels_query?: (FunnelsQuery | null) | undefined + insight: Array>> + kind?: string | undefined + probability: Record + significance_code: ExperimentSignificanceCode + significant: boolean + stats_version?: (number | null) | undefined + variants: Array + } + export type QueryResponseAlternative16 = { + count_query?: (TrendsQuery | null) | undefined + credible_intervals: Record> + exposure_query?: (TrendsQuery | null) | undefined + insight: Array> + kind?: string | undefined + p_value: number + probability: Record + significance_code: ExperimentSignificanceCode + significant: boolean + stats_version?: (number | null) | undefined + variants: Array + } + export type QueryResponseAlternative17 = Partial<{ + baseline: ExperimentStatsBaseValidated | null + credible_intervals: Record> | null + insight: Array> | null + kind: string + metric: ExperimentMeanMetric | ExperimentFunnelMetric | ExperimentRatioMetric | null + p_value: number | null + probability: Record | null + significance_code: ExperimentSignificanceCode | null + significant: boolean | null + stats_version: number | null + variant_results: + | Array + | Array + | null + variants: + | Array + | Array + | null + }> + export type QueryResponseAlternative18 = { + date_range: DateRange + kind?: string | undefined + timeseries: Array + total_exposures: Record + } + export type QueryResponseAlternative19 = { + dateFrom?: (string | null) | undefined + dateTo?: (string | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + usedPreAggregatedTables?: (boolean | null) | undefined + } + export type QueryResponseAlternative20 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + usedPreAggregatedTables?: (boolean | null) | undefined + } + export type QueryResponseAlternative21 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type QueryResponseAlternative23 = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative24 = { + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative25 = { + data: Record + error?: (ExternalQueryError | null) | undefined + status: ExternalQueryStatus + } + export type QueryResponseAlternative26 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative27 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative28 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative29 = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative30 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative31 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type QueryResponseAlternative32 = { + columns: Array + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql: string + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + types: Array + } + export type QueryResponseAlternative33 = { + columns: Array + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql: string + limit: number + missing_actors_count?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset: number + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type QueryResponseAlternative34 = { + columns: Array + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql: string + kind?: string | undefined + limit: number + modifiers?: (HogQLQueryModifiers | null) | undefined + offset: number + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + types: Array + } + export type QueryResponseAlternative35 = { + clickhouse?: (string | null) | undefined + columns?: (Array | null) | undefined + error?: (string | null) | undefined + explain?: (Array | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + metadata?: (HogQLMetadataResponse | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query?: (string | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type QueryResponseAlternative36 = { + dateFrom?: (string | null) | undefined + dateTo?: (string | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + usedPreAggregatedTables?: (boolean | null) | undefined + } + export type QueryResponseAlternative37 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + usedPreAggregatedTables?: (boolean | null) | undefined + } + export type QueryResponseAlternative38 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type QueryResponseAlternative40 = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative41 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type QueryResponseAlternative42 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative43 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative44 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative45 = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative46 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative47 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type QueryResponseAlternative49 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + samplingRate?: (SamplingRate | null) | undefined + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type QueryResponseAlternative50 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative52 = { + credible_intervals: Record> + expected_loss: number + funnels_query?: (FunnelsQuery | null) | undefined + insight: Array>> + kind?: string | undefined + probability: Record + significance_code: ExperimentSignificanceCode + significant: boolean + stats_version?: (number | null) | undefined + variants: Array + } + export type QueryResponseAlternative53 = { + count_query?: (TrendsQuery | null) | undefined + credible_intervals: Record> + exposure_query?: (TrendsQuery | null) | undefined + insight: Array> + kind?: string | undefined + p_value: number + probability: Record + significance_code: ExperimentSignificanceCode + significant: boolean + stats_version?: (number | null) | undefined + variants: Array + } + export type QueryResponseAlternative54 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative55 = { + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative56 = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + isUdf?: (boolean | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative57 = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative58 = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative59 = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array> + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative61 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: FunnelCorrelationResult + timings?: (Array | null) | undefined + types?: (Array | null) | undefined + } + export type QueryResponseAlternative62 = { + joins: Array + tables: Record + } + export type QueryResponseAlternative63 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: unknown + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative64 = { questions: Array } + export type QueryResponseAlternative65 = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative66 = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative67 = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: ActorsPropertyTaxonomyResponse | Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative68 = { + columns?: (Array | null) | undefined + error?: (string | null) | undefined + hasMore?: (boolean | null) | undefined + hogql?: (string | null) | undefined + limit?: (number | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + offset?: (number | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative69 = { + error?: (string | null) | undefined + hogql?: (string | null) | undefined + modifiers?: (HogQLQueryModifiers | null) | undefined + query_status?: (QueryStatus | null) | undefined + resolved_date_range?: (ResolvedDateRangeResponse | null) | undefined + results: Array + timings?: (Array | null) | undefined + } + export type QueryResponseAlternative = + | Record + | QueryResponseAlternative1 + | QueryResponseAlternative2 + | QueryResponseAlternative3 + | QueryResponseAlternative4 + | QueryResponseAlternative5 + | QueryResponseAlternative6 + | QueryResponseAlternative7 + | QueryResponseAlternative8 + | QueryResponseAlternative9 + | QueryResponseAlternative10 + | QueryResponseAlternative13 + | QueryResponseAlternative14 + | QueryResponseAlternative15 + | QueryResponseAlternative16 + | QueryResponseAlternative17 + | QueryResponseAlternative18 + | QueryResponseAlternative19 + | QueryResponseAlternative20 + | QueryResponseAlternative21 + | QueryResponseAlternative23 + | QueryResponseAlternative24 + | QueryResponseAlternative25 + | QueryResponseAlternative26 + | QueryResponseAlternative27 + | QueryResponseAlternative28 + | QueryResponseAlternative29 + | QueryResponseAlternative30 + | QueryResponseAlternative31 + | unknown + | QueryResponseAlternative32 + | QueryResponseAlternative33 + | QueryResponseAlternative34 + | QueryResponseAlternative35 + | QueryResponseAlternative36 + | QueryResponseAlternative37 + | QueryResponseAlternative38 + | QueryResponseAlternative40 + | QueryResponseAlternative41 + | QueryResponseAlternative42 + | QueryResponseAlternative43 + | QueryResponseAlternative44 + | QueryResponseAlternative45 + | QueryResponseAlternative46 + | QueryResponseAlternative47 + | QueryResponseAlternative49 + | QueryResponseAlternative50 + | QueryResponseAlternative52 + | QueryResponseAlternative53 + | QueryResponseAlternative54 + | QueryResponseAlternative55 + | QueryResponseAlternative56 + | QueryResponseAlternative57 + | QueryResponseAlternative58 + | QueryResponseAlternative59 + | QueryResponseAlternative61 + | QueryResponseAlternative62 + | QueryResponseAlternative63 + | QueryResponseAlternative64 + | QueryResponseAlternative65 + | QueryResponseAlternative66 + | QueryResponseAlternative67 + | QueryResponseAlternative68 + | QueryResponseAlternative69 + export type QueryStatusResponse = { query_status: QueryStatus } + export type QueryUpgradeRequest = { + query: + | EventsNode + | ActionsNode + | PersonsNode + | DataWarehouseNode + | EventsQuery + | ActorsQuery + | GroupsQuery + | InsightActorsQuery + | InsightActorsQueryOptions + | SessionsTimelineQuery + | HogQuery + | HogQLQuery + | HogQLMetadata + | HogQLAutocomplete + | HogQLASTQuery + | SessionAttributionExplorerQuery + | RevenueExampleEventsQuery + | RevenueExampleDataWarehouseTablesQuery + | ErrorTrackingQuery + | ErrorTrackingIssueCorrelationQuery + | ExperimentFunnelsQuery + | ExperimentTrendsQuery + | ExperimentQuery + | ExperimentExposureQuery + | WebOverviewQuery + | WebStatsTableQuery + | WebExternalClicksTableQuery + | WebGoalsQuery + | WebVitalsQuery + | WebVitalsPathBreakdownQuery + | WebPageURLSearchQuery + | WebAnalyticsExternalSummaryQuery + | RevenueAnalyticsGrossRevenueQuery + | RevenueAnalyticsMetricsQuery + | RevenueAnalyticsMRRQuery + | RevenueAnalyticsOverviewQuery + | RevenueAnalyticsTopCustomersQuery + | MarketingAnalyticsTableQuery + | DataVisualizationNode + | DataTableNode + | SavedInsightNode + | InsightVizNode + | TrendsQuery + | FunnelsQuery + | RetentionQuery + | PathsQuery + | StickinessQuery + | LifecycleQuery + | FunnelCorrelationQuery + | DatabaseSchemaQuery + | LogsQuery + | SuggestedQuestionsQuery + | TeamTaxonomyQuery + | EventTaxonomyQuery + | ActorsPropertyTaxonomyQuery + | TracesQuery + | VectorSearchQuery + } + export type QueryUpgradeResponse = { + query: + | EventsNode + | ActionsNode + | PersonsNode + | DataWarehouseNode + | EventsQuery + | ActorsQuery + | GroupsQuery + | InsightActorsQuery + | InsightActorsQueryOptions + | SessionsTimelineQuery + | HogQuery + | HogQLQuery + | HogQLMetadata + | HogQLAutocomplete + | HogQLASTQuery + | SessionAttributionExplorerQuery + | RevenueExampleEventsQuery + | RevenueExampleDataWarehouseTablesQuery + | ErrorTrackingQuery + | ErrorTrackingIssueCorrelationQuery + | ExperimentFunnelsQuery + | ExperimentTrendsQuery + | ExperimentQuery + | ExperimentExposureQuery + | WebOverviewQuery + | WebStatsTableQuery + | WebExternalClicksTableQuery + | WebGoalsQuery + | WebVitalsQuery + | WebVitalsPathBreakdownQuery + | WebPageURLSearchQuery + | WebAnalyticsExternalSummaryQuery + | RevenueAnalyticsGrossRevenueQuery + | RevenueAnalyticsMetricsQuery + | RevenueAnalyticsMRRQuery + | RevenueAnalyticsOverviewQuery + | RevenueAnalyticsTopCustomersQuery + | MarketingAnalyticsTableQuery + | DataVisualizationNode + | DataTableNode + | SavedInsightNode + | InsightVizNode + | TrendsQuery + | FunnelsQuery + | RetentionQuery + | PathsQuery + | StickinessQuery + | LifecycleQuery + | FunnelCorrelationQuery + | DatabaseSchemaQuery + | LogsQuery + | SuggestedQuestionsQuery + | TeamTaxonomyQuery + | EventTaxonomyQuery + | ActorsPropertyTaxonomyQuery + | TracesQuery + | VectorSearchQuery + } + export type SessionSummaries = { session_ids: Array; focus_area?: string | undefined } + export type SharingConfiguration = { + created_at: string + enabled?: boolean | undefined + access_token: string | null + settings?: (unknown | null) | undefined + password_required?: boolean | undefined + share_passwords: string + } + export type SurveySerializerCreateUpdateOnly = { + id: string + name: string + description?: string | undefined + type: SurveyType + schedule?: (string | null) | undefined + linked_flag: MinimalFeatureFlag & unknown + linked_flag_id?: (number | null) | undefined + targeting_flag_id?: number | undefined + targeting_flag: MinimalFeatureFlag & unknown + internal_targeting_flag: MinimalFeatureFlag & unknown + targeting_flag_filters?: (unknown | null) | undefined + remove_targeting_flag?: (boolean | null) | undefined + questions?: (unknown | null) | undefined + conditions?: (unknown | null) | undefined + appearance?: (unknown | null) | undefined + created_at: string + created_by: UserBasic & unknown + start_date?: (string | null) | undefined + end_date?: (string | null) | undefined + archived?: boolean | undefined + responses_limit?: (number | null) | undefined + iteration_count?: (number | null) | undefined + iteration_frequency_days?: (number | null) | undefined + iteration_start_dates?: (Array | null) | undefined + current_iteration?: (number | null) | undefined + current_iteration_start_date?: (string | null) | undefined + response_sampling_start_date?: (string | null) | undefined + response_sampling_interval_type?: + | ((ResponseSamplingIntervalTypeEnum | BlankEnum | NullEnum) | null) + | undefined + response_sampling_interval?: (number | null) | undefined + response_sampling_limit?: (number | null) | undefined + response_sampling_daily_limits?: (unknown | null) | undefined + enable_partial_responses?: (boolean | null) | undefined + _create_in_folder?: string | undefined + } + export type Team = { + id: number + uuid: string + name?: string | undefined + access_control?: boolean | undefined + organization: string + project_id: number + api_token: string + secret_api_token: string | null + secret_api_token_backup: string | null + created_at: string + updated_at: string + ingested_event: boolean + default_modifiers: Record + person_on_events_querying_enabled: boolean + user_access_level: string | null + app_urls?: Array | undefined + slack_incoming_webhook?: (string | null) | undefined + anonymize_ips?: boolean | undefined + completed_snippet_onboarding?: boolean | undefined + test_account_filters?: unknown | undefined + test_account_filters_default_checked?: (boolean | null) | undefined + path_cleaning_filters?: (unknown | null) | undefined + is_demo?: boolean | undefined + timezone?: TimezoneEnum | undefined + data_attributes?: unknown | undefined + person_display_name_properties?: (Array | null) | undefined + correlation_config?: (unknown | null) | undefined + autocapture_opt_out?: (boolean | null) | undefined + autocapture_exceptions_opt_in?: (boolean | null) | undefined + autocapture_web_vitals_opt_in?: (boolean | null) | undefined + autocapture_web_vitals_allowed_metrics?: (unknown | null) | undefined + autocapture_exceptions_errors_to_ignore?: (unknown | null) | undefined + capture_console_log_opt_in?: (boolean | null) | undefined + capture_performance_opt_in?: (boolean | null) | undefined + session_recording_opt_in?: boolean | undefined + session_recording_sample_rate?: (string | null) | undefined + session_recording_minimum_duration_milliseconds?: (number | null) | undefined + session_recording_linked_flag?: (unknown | null) | undefined + session_recording_network_payload_capture_config?: (unknown | null) | undefined + session_recording_masking_config?: (unknown | null) | undefined + session_recording_url_trigger_config?: (Array | null) | undefined + session_recording_url_blocklist_config?: (Array | null) | undefined + session_recording_event_trigger_config?: (Array | null) | undefined + session_recording_trigger_match_type_config?: (string | null) | undefined + session_replay_config?: (unknown | null) | undefined + survey_config?: (unknown | null) | undefined + week_start_day?: ((WeekStartDayEnum | NullEnum) | null) | undefined + primary_dashboard?: (number | null) | undefined + live_events_columns?: (Array | null) | undefined + recording_domains?: (Array | null) | undefined + cookieless_server_hash_mode?: ((CookielessServerHashModeEnum | NullEnum) | null) | undefined + human_friendly_comparison_periods?: (boolean | null) | undefined + inject_web_apps?: (boolean | null) | undefined + extra_settings?: (unknown | null) | undefined + modifiers?: (unknown | null) | undefined + has_completed_onboarding_for?: (unknown | null) | undefined + surveys_opt_in?: (boolean | null) | undefined + heatmaps_opt_in?: (boolean | null) | undefined + flags_persistence_default?: (boolean | null) | undefined + feature_flag_confirmation_enabled?: (boolean | null) | undefined + feature_flag_confirmation_message?: (string | null) | undefined + capture_dead_clicks?: (boolean | null) | undefined + default_data_theme?: (number | null) | undefined + revenue_analytics_config?: TeamRevenueAnalyticsConfig | undefined + marketing_analytics_config?: TeamMarketingAnalyticsConfig | undefined + onboarding_tasks?: (unknown | null) | undefined + base_currency?: (BaseCurrencyEnum & unknown) | undefined + web_analytics_pre_aggregated_tables_enabled?: (boolean | null) | undefined + effective_membership_level: (EffectiveMembershipLevelEnum & (unknown | null)) | null + has_group_types: boolean + group_types: Array> + live_events_token: string | null + product_intents: string + } + export type WebAnalyticsBreakdownResponse = { + next?: (string | null) | undefined + results: Array + } + export type WebAnalyticsOverviewResponse = { + visitors: number + views: number + sessions: number + bounce_rate: number + session_duration: number + } + + // +} + +export namespace Endpoints { + // + + export type get_Environments_app_metrics_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/app_metrics/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_app_metrics_error_details_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/app_metrics/{id}/error_details/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_app_metrics_historical_exports_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/app_metrics/{plugin_config_id}/historical_exports/' + requestFormat: 'json' + parameters: { + path: { plugin_config_id: string; project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_app_metrics_historical_exports_retrieve_2 = { + method: 'GET' + path: '/api/environments/{project_id}/app_metrics/{plugin_config_id}/historical_exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; plugin_config_id: string; project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_batch_exports_list = { + method: 'GET' + path: '/api/environments/{project_id}/batch_exports/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedBatchExportList } + } + export type post_Environments_batch_exports_create = { + method: 'POST' + path: '/api/environments/{project_id}/batch_exports/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.BatchExport + } + responses: { 201: Schemas.BatchExport } + } + export type get_Environments_batch_exports_backfills_list = { + method: 'GET' + path: '/api/environments/{project_id}/batch_exports/{batch_export_id}/backfills/' + requestFormat: 'json' + parameters: { + query: Partial<{ cursor: string; ordering: string }> + path: { batch_export_id: string; project_id: string } + } + responses: { 200: Schemas.PaginatedBatchExportBackfillList } + } + export type post_Environments_batch_exports_backfills_create = { + method: 'POST' + path: '/api/environments/{project_id}/batch_exports/{batch_export_id}/backfills/' + requestFormat: 'json' + parameters: { + path: { batch_export_id: string; project_id: string } + + body: Schemas.BatchExportBackfill + } + responses: { 201: Schemas.BatchExportBackfill } + } + export type get_Environments_batch_exports_backfills_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/batch_exports/{batch_export_id}/backfills/{id}/' + requestFormat: 'json' + parameters: { + path: { batch_export_id: string; id: string; project_id: string } + } + responses: { 200: Schemas.BatchExportBackfill } + } + export type post_Environments_batch_exports_backfills_cancel_create = { + method: 'POST' + path: '/api/environments/{project_id}/batch_exports/{batch_export_id}/backfills/{id}/cancel/' + requestFormat: 'json' + parameters: { + path: { batch_export_id: string; id: string; project_id: string } + + body: Schemas.BatchExportBackfill + } + responses: { 200: unknown } + } + export type get_Environments_batch_exports_runs_list = { + method: 'GET' + path: '/api/environments/{project_id}/batch_exports/{batch_export_id}/runs/' + requestFormat: 'json' + parameters: { + query: Partial<{ cursor: string; ordering: string }> + path: { batch_export_id: string; project_id: string } + } + responses: { 200: Schemas.PaginatedBatchExportRunList } + } + export type get_Environments_batch_exports_runs_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/batch_exports/{batch_export_id}/runs/{id}/' + requestFormat: 'json' + parameters: { + path: { batch_export_id: string; id: string; project_id: string } + } + responses: { 200: Schemas.BatchExportRun } + } + export type post_Environments_batch_exports_runs_cancel_create = { + method: 'POST' + path: '/api/environments/{project_id}/batch_exports/{batch_export_id}/runs/{id}/cancel/' + requestFormat: 'json' + parameters: { + path: { batch_export_id: string; id: string; project_id: string } + + body: Schemas.BatchExportRun + } + responses: { 200: unknown } + } + export type get_Environments_batch_exports_runs_logs_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/batch_exports/{batch_export_id}/runs/{id}/logs/' + requestFormat: 'json' + parameters: { + path: { batch_export_id: string; id: string; project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_batch_exports_runs_retry_create = { + method: 'POST' + path: '/api/environments/{project_id}/batch_exports/{batch_export_id}/runs/{id}/retry/' + requestFormat: 'json' + parameters: { + path: { batch_export_id: string; id: string; project_id: string } + + body: Schemas.BatchExportRun + } + responses: { 200: unknown } + } + export type get_Environments_batch_exports_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/batch_exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.BatchExport } + } + export type put_Environments_batch_exports_update = { + method: 'PUT' + path: '/api/environments/{project_id}/batch_exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.BatchExport + } + responses: { 200: Schemas.BatchExport } + } + export type patch_Environments_batch_exports_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/batch_exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedBatchExport + } + responses: { 200: Schemas.BatchExport } + } + export type delete_Environments_batch_exports_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/batch_exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type post_Environments_batch_exports_backfill_create = { + method: 'POST' + path: '/api/environments/{project_id}/batch_exports/{id}/backfill/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.BatchExport + } + responses: { 200: unknown } + } + export type get_Environments_batch_exports_logs_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/batch_exports/{id}/logs/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_batch_exports_pause_create = { + method: 'POST' + path: '/api/environments/{project_id}/batch_exports/{id}/pause/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.BatchExport + } + responses: { 200: unknown } + } + export type post_Environments_batch_exports_run_test_step_create = { + method: 'POST' + path: '/api/environments/{project_id}/batch_exports/{id}/run_test_step/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.BatchExport + } + responses: { 200: unknown } + } + export type post_Environments_batch_exports_unpause_create = { + method: 'POST' + path: '/api/environments/{project_id}/batch_exports/{id}/unpause/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.BatchExport + } + responses: { 200: unknown } + } + export type post_Environments_batch_exports_run_test_step_new_create = { + method: 'POST' + path: '/api/environments/{project_id}/batch_exports/run_test_step_new/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.BatchExport + } + responses: { 200: unknown } + } + export type get_Environments_batch_exports_test_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/batch_exports/test/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_dashboards_list = { + method: 'GET' + path: '/api/environments/{project_id}/dashboards/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt'; limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedDashboardBasicList } + } + export type post_Environments_dashboards_create = { + method: 'POST' + path: '/api/environments/{project_id}/dashboards/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { project_id: string } + + body: Schemas.Dashboard + } + responses: { 201: Schemas.Dashboard } + } + export type get_Environments_dashboards_collaborators_list = { + method: 'GET' + path: '/api/environments/{project_id}/dashboards/{dashboard_id}/collaborators/' + requestFormat: 'json' + parameters: { + path: { dashboard_id: number; project_id: string } + } + responses: { 200: Array } + } + export type post_Environments_dashboards_collaborators_create = { + method: 'POST' + path: '/api/environments/{project_id}/dashboards/{dashboard_id}/collaborators/' + requestFormat: 'json' + parameters: { + path: { dashboard_id: number; project_id: string } + + body: Schemas.DashboardCollaborator + } + responses: { 201: Schemas.DashboardCollaborator } + } + export type delete_Environments_dashboards_collaborators_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/dashboards/{dashboard_id}/collaborators/{user__uuid}/' + requestFormat: 'json' + parameters: { + path: { dashboard_id: number; project_id: string; user__uuid: string } + } + responses: { 204: unknown } + } + export type get_Environments_dashboards_sharing_list = { + method: 'GET' + path: '/api/environments/{project_id}/dashboards/{dashboard_id}/sharing/' + requestFormat: 'json' + parameters: { + path: { dashboard_id: number; project_id: string } + } + responses: { 200: Array } + } + export type post_Environments_dashboards_sharing_passwords_create = { + method: 'POST' + path: '/api/environments/{project_id}/dashboards/{dashboard_id}/sharing/passwords/' + requestFormat: 'json' + parameters: { + path: { dashboard_id: number; project_id: string } + + body: Schemas.SharingConfiguration + } + responses: { 200: Schemas.SharingConfiguration } + } + export type delete_Environments_dashboards_sharing_passwords_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/dashboards/{dashboard_id}/sharing/passwords/{password_id}/' + requestFormat: 'json' + parameters: { + path: { dashboard_id: number; password_id: string; project_id: string } + } + responses: { 204: unknown } + } + export type post_Environments_dashboards_sharing_refresh_create = { + method: 'POST' + path: '/api/environments/{project_id}/dashboards/{dashboard_id}/sharing/refresh/' + requestFormat: 'json' + parameters: { + path: { dashboard_id: number; project_id: string } + + body: Schemas.SharingConfiguration + } + responses: { 200: Schemas.SharingConfiguration } + } + export type get_Environments_dashboards_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/dashboards/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { id: number; project_id: string } + } + responses: { 200: Schemas.Dashboard } + } + export type put_Environments_dashboards_update = { + method: 'PUT' + path: '/api/environments/{project_id}/dashboards/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { id: number; project_id: string } + + body: Schemas.Dashboard + } + responses: { 200: Schemas.Dashboard } + } + export type patch_Environments_dashboards_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/dashboards/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { id: number; project_id: string } + + body: Schemas.PatchedDashboard + } + responses: { 200: Schemas.Dashboard } + } + export type delete_Environments_dashboards_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/dashboards/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { id: number; project_id: string } + } + responses: { 405: unknown } + } + export type patch_Environments_dashboards_move_tile_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/dashboards/{id}/move_tile/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { id: number; project_id: string } + + body: Schemas.PatchedDashboard + } + responses: { 200: unknown } + } + export type get_Environments_dashboards_stream_tiles_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/dashboards/{id}/stream_tiles/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_dashboards_create_from_template_json_create = { + method: 'POST' + path: '/api/environments/{project_id}/dashboards/create_from_template_json/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { project_id: string } + + body: Schemas.Dashboard + } + responses: { 200: unknown } + } + export type get_Environments_error_tracking_assignment_rules_list = { + method: 'GET' + path: '/api/environments/{project_id}/error_tracking/assignment_rules/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedErrorTrackingAssignmentRuleList } + } + export type post_Environments_error_tracking_assignment_rules_create = { + method: 'POST' + path: '/api/environments/{project_id}/error_tracking/assignment_rules/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.ErrorTrackingAssignmentRule + } + responses: { 201: Schemas.ErrorTrackingAssignmentRule } + } + export type get_Environments_error_tracking_assignment_rules_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/error_tracking/assignment_rules/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.ErrorTrackingAssignmentRule } + } + export type put_Environments_error_tracking_assignment_rules_update = { + method: 'PUT' + path: '/api/environments/{project_id}/error_tracking/assignment_rules/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.ErrorTrackingAssignmentRule + } + responses: { 200: Schemas.ErrorTrackingAssignmentRule } + } + export type patch_Environments_error_tracking_assignment_rules_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/error_tracking/assignment_rules/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedErrorTrackingAssignmentRule + } + responses: { 200: Schemas.ErrorTrackingAssignmentRule } + } + export type delete_Environments_error_tracking_assignment_rules_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/error_tracking/assignment_rules/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type patch_Environments_error_tracking_assignment_rules_reorder_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/error_tracking/assignment_rules/reorder/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.PatchedErrorTrackingAssignmentRule + } + responses: { 200: unknown } + } + export type get_Environments_error_tracking_grouping_rules_list = { + method: 'GET' + path: '/api/environments/{project_id}/error_tracking/grouping_rules/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedErrorTrackingGroupingRuleList } + } + export type post_Environments_error_tracking_grouping_rules_create = { + method: 'POST' + path: '/api/environments/{project_id}/error_tracking/grouping_rules/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.ErrorTrackingGroupingRule + } + responses: { 201: Schemas.ErrorTrackingGroupingRule } + } + export type get_Environments_error_tracking_grouping_rules_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/error_tracking/grouping_rules/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.ErrorTrackingGroupingRule } + } + export type put_Environments_error_tracking_grouping_rules_update = { + method: 'PUT' + path: '/api/environments/{project_id}/error_tracking/grouping_rules/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.ErrorTrackingGroupingRule + } + responses: { 200: Schemas.ErrorTrackingGroupingRule } + } + export type patch_Environments_error_tracking_grouping_rules_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/error_tracking/grouping_rules/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedErrorTrackingGroupingRule + } + responses: { 200: Schemas.ErrorTrackingGroupingRule } + } + export type delete_Environments_error_tracking_grouping_rules_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/error_tracking/grouping_rules/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type patch_Environments_error_tracking_grouping_rules_reorder_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/error_tracking/grouping_rules/reorder/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.PatchedErrorTrackingGroupingRule + } + responses: { 200: unknown } + } + export type get_Environments_error_tracking_releases_list = { + method: 'GET' + path: '/api/environments/{project_id}/error_tracking/releases/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedErrorTrackingReleaseList } + } + export type post_Environments_error_tracking_releases_create = { + method: 'POST' + path: '/api/environments/{project_id}/error_tracking/releases/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.ErrorTrackingRelease + } + responses: { 201: Schemas.ErrorTrackingRelease } + } + export type get_Environments_error_tracking_releases_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/error_tracking/releases/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.ErrorTrackingRelease } + } + export type put_Environments_error_tracking_releases_update = { + method: 'PUT' + path: '/api/environments/{project_id}/error_tracking/releases/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.ErrorTrackingRelease + } + responses: { 200: Schemas.ErrorTrackingRelease } + } + export type patch_Environments_error_tracking_releases_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/error_tracking/releases/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedErrorTrackingRelease + } + responses: { 200: Schemas.ErrorTrackingRelease } + } + export type delete_Environments_error_tracking_releases_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/error_tracking/releases/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Environments_error_tracking_suppression_rules_list = { + method: 'GET' + path: '/api/environments/{project_id}/error_tracking/suppression_rules/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedErrorTrackingSuppressionRuleList } + } + export type post_Environments_error_tracking_suppression_rules_create = { + method: 'POST' + path: '/api/environments/{project_id}/error_tracking/suppression_rules/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.ErrorTrackingSuppressionRule + } + responses: { 201: Schemas.ErrorTrackingSuppressionRule } + } + export type get_Environments_error_tracking_suppression_rules_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/error_tracking/suppression_rules/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.ErrorTrackingSuppressionRule } + } + export type put_Environments_error_tracking_suppression_rules_update = { + method: 'PUT' + path: '/api/environments/{project_id}/error_tracking/suppression_rules/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.ErrorTrackingSuppressionRule + } + responses: { 200: Schemas.ErrorTrackingSuppressionRule } + } + export type patch_Environments_error_tracking_suppression_rules_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/error_tracking/suppression_rules/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedErrorTrackingSuppressionRule + } + responses: { 200: Schemas.ErrorTrackingSuppressionRule } + } + export type delete_Environments_error_tracking_suppression_rules_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/error_tracking/suppression_rules/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type patch_Environments_error_tracking_suppression_rules_reorder_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/error_tracking/suppression_rules/reorder/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.PatchedErrorTrackingSuppressionRule + } + responses: { 200: unknown } + } + export type get_Environments_error_tracking_symbol_sets_list = { + method: 'GET' + path: '/api/environments/{project_id}/error_tracking/symbol_sets/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedErrorTrackingSymbolSetList } + } + export type post_Environments_error_tracking_symbol_sets_create = { + method: 'POST' + path: '/api/environments/{project_id}/error_tracking/symbol_sets/' + requestFormat: 'form-data' + parameters: { + path: { project_id: string } + + body: Schemas.ErrorTrackingSymbolSet + } + responses: { 201: Schemas.ErrorTrackingSymbolSet } + } + export type get_Environments_error_tracking_symbol_sets_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/error_tracking/symbol_sets/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.ErrorTrackingSymbolSet } + } + export type put_Environments_error_tracking_symbol_sets_update = { + method: 'PUT' + path: '/api/environments/{project_id}/error_tracking/symbol_sets/{id}/' + requestFormat: 'form-data' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.ErrorTrackingSymbolSet + } + responses: { 200: Schemas.ErrorTrackingSymbolSet } + } + export type patch_Environments_error_tracking_symbol_sets_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/error_tracking/symbol_sets/{id}/' + requestFormat: 'form-data' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedErrorTrackingSymbolSet + } + responses: { 200: Schemas.ErrorTrackingSymbolSet } + } + export type delete_Environments_error_tracking_symbol_sets_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/error_tracking/symbol_sets/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type put_Environments_error_tracking_symbol_sets_finish_upload_update = { + method: 'PUT' + path: '/api/environments/{project_id}/error_tracking/symbol_sets/{id}/finish_upload/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.ErrorTrackingSymbolSet + } + responses: { 200: unknown } + } + export type post_Environments_error_tracking_symbol_sets_bulk_finish_upload_create = { + method: 'POST' + path: '/api/environments/{project_id}/error_tracking/symbol_sets/bulk_finish_upload/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.ErrorTrackingSymbolSet + } + responses: { 200: unknown } + } + export type post_Environments_error_tracking_symbol_sets_bulk_start_upload_create = { + method: 'POST' + path: '/api/environments/{project_id}/error_tracking/symbol_sets/bulk_start_upload/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.ErrorTrackingSymbolSet + } + responses: { 200: unknown } + } + export type post_Environments_error_tracking_symbol_sets_start_upload_create = { + method: 'POST' + path: '/api/environments/{project_id}/error_tracking/symbol_sets/start_upload/' + requestFormat: 'form-data' + parameters: { + path: { project_id: string } + + body: Schemas.ErrorTrackingSymbolSet + } + responses: { 200: unknown } + } + export type get_Environments_events_list = { + method: 'GET' + path: '/api/environments/{project_id}/events/' + requestFormat: 'json' + parameters: { + query: Partial<{ + after: string + before: string + distinct_id: number + event: string + format: 'csv' | 'json' + limit: number + offset: number + person_id: number + properties: Array + select: Array + where: Array + }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedClickhouseEventList } + } + export type get_Environments_events_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/events/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: string; project_id: string } + } + responses: { 200: Schemas.ClickhouseEvent } + } + export type get_Environments_events_values_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/events/values/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_explicit_members_list = { + method: 'GET' + path: '/api/environments/{project_id}/explicit_members/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: Array } + } + export type post_Environments_explicit_members_create = { + method: 'POST' + path: '/api/environments/{project_id}/explicit_members/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.ExplicitTeamMember + } + responses: { 201: Schemas.ExplicitTeamMember } + } + export type get_Environments_explicit_members_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/explicit_members/{parent_membership__user__uuid}/' + requestFormat: 'json' + parameters: { + path: { parent_membership__user__uuid: string; project_id: string } + } + responses: { 200: Schemas.ExplicitTeamMember } + } + export type put_Environments_explicit_members_update = { + method: 'PUT' + path: '/api/environments/{project_id}/explicit_members/{parent_membership__user__uuid}/' + requestFormat: 'json' + parameters: { + path: { parent_membership__user__uuid: string; project_id: string } + + body: Schemas.ExplicitTeamMember + } + responses: { 200: Schemas.ExplicitTeamMember } + } + export type patch_Environments_explicit_members_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/explicit_members/{parent_membership__user__uuid}/' + requestFormat: 'json' + parameters: { + path: { parent_membership__user__uuid: string; project_id: string } + + body: Schemas.PatchedExplicitTeamMember + } + responses: { 200: Schemas.ExplicitTeamMember } + } + export type delete_Environments_explicit_members_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/explicit_members/{parent_membership__user__uuid}/' + requestFormat: 'json' + parameters: { + path: { parent_membership__user__uuid: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Environments_exports_list = { + method: 'GET' + path: '/api/environments/{project_id}/exports/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedExportedAssetList } + } + export type post_Environments_exports_create = { + method: 'POST' + path: '/api/environments/{project_id}/exports/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.ExportedAsset + } + responses: { 201: Schemas.ExportedAsset } + } + export type get_Environments_exports_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: Schemas.ExportedAsset } + } + export type get_Environments_exports_content_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/exports/{id}/content/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_file_system_list = { + method: 'GET' + path: '/api/environments/{project_id}/file_system/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number; search: string }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedFileSystemList } + } + export type post_Environments_file_system_create = { + method: 'POST' + path: '/api/environments/{project_id}/file_system/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.FileSystem + } + responses: { 201: Schemas.FileSystem } + } + export type get_Environments_file_system_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/file_system/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.FileSystem } + } + export type put_Environments_file_system_update = { + method: 'PUT' + path: '/api/environments/{project_id}/file_system/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.FileSystem + } + responses: { 200: Schemas.FileSystem } + } + export type patch_Environments_file_system_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/file_system/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedFileSystem + } + responses: { 200: Schemas.FileSystem } + } + export type delete_Environments_file_system_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/file_system/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type post_Environments_file_system_count_create = { + method: 'POST' + path: '/api/environments/{project_id}/file_system/{id}/count/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.FileSystem + } + responses: { 200: unknown } + } + export type post_Environments_file_system_link_create = { + method: 'POST' + path: '/api/environments/{project_id}/file_system/{id}/link/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.FileSystem + } + responses: { 200: unknown } + } + export type post_Environments_file_system_move_create = { + method: 'POST' + path: '/api/environments/{project_id}/file_system/{id}/move/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.FileSystem + } + responses: { 200: unknown } + } + export type post_Environments_file_system_count_by_path_create = { + method: 'POST' + path: '/api/environments/{project_id}/file_system/count_by_path/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.FileSystem + } + responses: { 200: unknown } + } + export type get_Environments_file_system_unfiled_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/file_system/unfiled/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_file_system_shortcut_list = { + method: 'GET' + path: '/api/environments/{project_id}/file_system_shortcut/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedFileSystemShortcutList } + } + export type post_Environments_file_system_shortcut_create = { + method: 'POST' + path: '/api/environments/{project_id}/file_system_shortcut/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.FileSystemShortcut + } + responses: { 201: Schemas.FileSystemShortcut } + } + export type get_Environments_file_system_shortcut_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/file_system_shortcut/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.FileSystemShortcut } + } + export type put_Environments_file_system_shortcut_update = { + method: 'PUT' + path: '/api/environments/{project_id}/file_system_shortcut/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.FileSystemShortcut + } + responses: { 200: Schemas.FileSystemShortcut } + } + export type patch_Environments_file_system_shortcut_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/file_system_shortcut/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedFileSystemShortcut + } + responses: { 200: Schemas.FileSystemShortcut } + } + export type delete_Environments_file_system_shortcut_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/file_system_shortcut/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Environments_groups_list = { + method: 'GET' + path: '/api/environments/{project_id}/groups/' + requestFormat: 'json' + parameters: { + query: { cursor?: string | undefined; group_type_index: number; search: string } + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedGroupList } + } + export type post_Environments_groups_create = { + method: 'POST' + path: '/api/environments/{project_id}/groups/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.CreateGroup + } + responses: { 201: Schemas.Group } + } + export type get_Environments_groups_activity_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/groups/activity/' + requestFormat: 'json' + parameters: { + query: { group_type_index: number; id: string } + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_groups_delete_property_create = { + method: 'POST' + path: '/api/environments/{project_id}/groups/delete_property/' + requestFormat: 'json' + parameters: { + query: { group_key: string; group_type_index: number } + path: { project_id: string } + + body: Schemas.Group + } + responses: { 200: unknown } + } + export type get_Environments_groups_find_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/groups/find/' + requestFormat: 'json' + parameters: { + query: { group_key: string; group_type_index: number } + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_groups_property_definitions_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/groups/property_definitions/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_groups_property_values_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/groups/property_values/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_groups_related_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/groups/related/' + requestFormat: 'json' + parameters: { + query: { group_type_index: number; id: string } + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_groups_update_property_create = { + method: 'POST' + path: '/api/environments/{project_id}/groups/update_property/' + requestFormat: 'json' + parameters: { + query: { group_key: string; group_type_index: number } + path: { project_id: string } + + body: Schemas.Group + } + responses: { 200: unknown } + } + export type get_Environments_hog_functions_list = { + method: 'GET' + path: '/api/environments/{project_id}/hog_functions/' + requestFormat: 'json' + parameters: { + query: Partial<{ + created_at: string + created_by: number + enabled: boolean + id: string + limit: number + offset: number + search: string + type: Array + updated_at: string + }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedHogFunctionMinimalList } + } + export type post_Environments_hog_functions_create = { + method: 'POST' + path: '/api/environments/{project_id}/hog_functions/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.HogFunction + } + responses: { 201: Schemas.HogFunction } + } + export type get_Environments_hog_functions_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/hog_functions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.HogFunction } + } + export type put_Environments_hog_functions_update = { + method: 'PUT' + path: '/api/environments/{project_id}/hog_functions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.HogFunction + } + responses: { 200: Schemas.HogFunction } + } + export type patch_Environments_hog_functions_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/hog_functions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedHogFunction + } + responses: { 200: Schemas.HogFunction } + } + export type delete_Environments_hog_functions_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/hog_functions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 405: unknown } + } + export type post_Environments_hog_functions_broadcast_create = { + method: 'POST' + path: '/api/environments/{project_id}/hog_functions/{id}/broadcast/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.HogFunction + } + responses: { 200: unknown } + } + export type post_Environments_hog_functions_invocations_create = { + method: 'POST' + path: '/api/environments/{project_id}/hog_functions/{id}/invocations/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.HogFunction + } + responses: { 200: unknown } + } + export type get_Environments_hog_functions_logs_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/hog_functions/{id}/logs/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_hog_functions_metrics_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/hog_functions/{id}/metrics/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_hog_functions_metrics_totals_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/hog_functions/{id}/metrics/totals/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_hog_functions_icon_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/hog_functions/icon/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_hog_functions_icons_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/hog_functions/icons/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type patch_Environments_hog_functions_rearrange_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/hog_functions/rearrange/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.PatchedHogFunction + } + responses: { 200: unknown } + } + export type get_Environments_insights_list = { + method: 'GET' + path: '/api/environments/{project_id}/insights/' + requestFormat: 'json' + parameters: { + query: Partial<{ + basic: boolean + created_by: number + format: 'csv' | 'json' + limit: number + offset: number + refresh: + | 'async' + | 'async_except_on_cache_miss' + | 'blocking' + | 'force_async' + | 'force_blocking' + | 'force_cache' + | 'lazy_async' + short_id: string + }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedInsightList } + } + export type post_Environments_insights_create = { + method: 'POST' + path: '/api/environments/{project_id}/insights/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + + body: Schemas.Insight + } + responses: { 201: Schemas.Insight } + } + export type get_Environments_insights_sharing_list = { + method: 'GET' + path: '/api/environments/{project_id}/insights/{insight_id}/sharing/' + requestFormat: 'json' + parameters: { + path: { insight_id: number; project_id: string } + } + responses: { 200: Array } + } + export type post_Environments_insights_sharing_passwords_create = { + method: 'POST' + path: '/api/environments/{project_id}/insights/{insight_id}/sharing/passwords/' + requestFormat: 'json' + parameters: { + path: { insight_id: number; project_id: string } + + body: Schemas.SharingConfiguration + } + responses: { 200: Schemas.SharingConfiguration } + } + export type delete_Environments_insights_sharing_passwords_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/insights/{insight_id}/sharing/passwords/{password_id}/' + requestFormat: 'json' + parameters: { + path: { insight_id: number; password_id: string; project_id: string } + } + responses: { 204: unknown } + } + export type post_Environments_insights_sharing_refresh_create = { + method: 'POST' + path: '/api/environments/{project_id}/insights/{insight_id}/sharing/refresh/' + requestFormat: 'json' + parameters: { + path: { insight_id: number; project_id: string } + + body: Schemas.SharingConfiguration + } + responses: { 200: Schemas.SharingConfiguration } + } + export type get_Environments_insights_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/insights/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ + format: 'csv' | 'json' + from_dashboard: number + refresh: + | 'async' + | 'async_except_on_cache_miss' + | 'blocking' + | 'force_async' + | 'force_blocking' + | 'force_cache' + | 'lazy_async' + }> + path: { id: number; project_id: string } + } + responses: { 200: Schemas.Insight } + } + export type put_Environments_insights_update = { + method: 'PUT' + path: '/api/environments/{project_id}/insights/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.Insight + } + responses: { 200: Schemas.Insight } + } + export type patch_Environments_insights_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/insights/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.PatchedInsight + } + responses: { 200: Schemas.Insight } + } + export type delete_Environments_insights_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/insights/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + } + responses: { 405: unknown } + } + export type get_Environments_insights_activity_retrieve_2 = { + method: 'GET' + path: '/api/environments/{project_id}/insights/{id}/activity/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_insights_viewed_create = { + method: 'POST' + path: '/api/environments/{project_id}/insights/{id}/viewed/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.Insight + } + responses: { 200: unknown } + } + export type get_Environments_insights_activity_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/insights/activity/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_insights_cancel_create = { + method: 'POST' + path: '/api/environments/{project_id}/insights/cancel/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + + body: Schemas.Insight + } + responses: { 200: unknown } + } + export type get_Environments_insights_my_last_viewed_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/insights/my_last_viewed/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_logs_attributes_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/logs/attributes/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_logs_query_create = { + method: 'POST' + path: '/api/environments/{project_id}/logs/query/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_logs_sparkline_create = { + method: 'POST' + path: '/api/environments/{project_id}/logs/sparkline/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_logs_values_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/logs/values/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_max_tools_create_and_query_insight_create = { + method: 'POST' + path: '/api/environments/{project_id}/max_tools/create_and_query_insight/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_persisted_folder_list = { + method: 'GET' + path: '/api/environments/{project_id}/persisted_folder/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedPersistedFolderList } + } + export type post_Environments_persisted_folder_create = { + method: 'POST' + path: '/api/environments/{project_id}/persisted_folder/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.PersistedFolder + } + responses: { 201: Schemas.PersistedFolder } + } + export type get_Environments_persisted_folder_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/persisted_folder/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.PersistedFolder } + } + export type put_Environments_persisted_folder_update = { + method: 'PUT' + path: '/api/environments/{project_id}/persisted_folder/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PersistedFolder + } + responses: { 200: Schemas.PersistedFolder } + } + export type patch_Environments_persisted_folder_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/persisted_folder/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedPersistedFolder + } + responses: { 200: Schemas.PersistedFolder } + } + export type delete_Environments_persisted_folder_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/persisted_folder/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Environments_persons_list = { + method: 'GET' + path: '/api/environments/{project_id}/persons/' + requestFormat: 'json' + parameters: { + query: Partial<{ + distinct_id: string + email: string + format: 'csv' | 'json' + limit: number + offset: number + properties: Array + search: string + }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedPersonList } + } + export type get_Environments_persons_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/persons/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + } + responses: { 200: Schemas.Person } + } + export type put_Environments_persons_update = { + method: 'PUT' + path: '/api/environments/{project_id}/persons/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.Person + } + responses: { 200: Schemas.Person } + } + export type patch_Environments_persons_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/persons/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.PatchedPerson + } + responses: { 200: Schemas.Person } + } + export type delete_Environments_persons_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/persons/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ delete_events: boolean; format: 'csv' | 'json' }> + path: { id: number; project_id: string } + } + responses: { 204: unknown } + } + export type get_Environments_persons_activity_retrieve_2 = { + method: 'GET' + path: '/api/environments/{project_id}/persons/{id}/activity/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_persons_delete_events_create = { + method: 'POST' + path: '/api/environments/{project_id}/persons/{id}/delete_events/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type post_Environments_persons_delete_property_create = { + method: 'POST' + path: '/api/environments/{project_id}/persons/{id}/delete_property/' + requestFormat: 'json' + parameters: { + query: { $unset: string; format?: ('csv' | 'json') | undefined } + path: { id: number; project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type get_Environments_persons_properties_timeline_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/persons/{id}/properties_timeline/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_persons_split_create = { + method: 'POST' + path: '/api/environments/{project_id}/persons/{id}/split/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type post_Environments_persons_update_property_create = { + method: 'POST' + path: '/api/environments/{project_id}/persons/{id}/update_property/' + requestFormat: 'json' + parameters: { + query: { format?: ('csv' | 'json') | undefined; key: string; value: unknown } + path: { id: number; project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type get_Environments_persons_activity_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/persons/activity/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_persons_bulk_delete_create = { + method: 'POST' + path: '/api/environments/{project_id}/persons/bulk_delete/' + requestFormat: 'json' + parameters: { + query: Partial<{ + delete_events: boolean + distinct_ids: Record + format: 'csv' | 'json' + ids: Record + }> + path: { project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type get_Environments_persons_cohorts_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/persons/cohorts/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_persons_funnel_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/persons/funnel/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_persons_funnel_create = { + method: 'POST' + path: '/api/environments/{project_id}/persons/funnel/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type get_Environments_persons_funnel_correlation_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/persons/funnel/correlation/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_persons_funnel_correlation_create = { + method: 'POST' + path: '/api/environments/{project_id}/persons/funnel/correlation/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type get_Environments_persons_lifecycle_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/persons/lifecycle/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_persons_reset_person_distinct_id_create = { + method: 'POST' + path: '/api/environments/{project_id}/persons/reset_person_distinct_id/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type get_Environments_persons_stickiness_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/persons/stickiness/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_persons_trends_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/persons/trends/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_persons_values_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/persons/values/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_plugin_configs_logs_list = { + method: 'GET' + path: '/api/environments/{project_id}/plugin_configs/{plugin_config_id}/logs/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { plugin_config_id: string; project_id: string } + } + responses: { 200: Schemas.PaginatedPluginLogEntryList } + } + export type post_Environments_query_create = { + method: 'POST' + path: '/api/environments/{project_id}/query/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.QueryRequest + } + responses: { 200: Schemas.QueryResponseAlternative } + } + export type get_Environments_query_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/query/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.QueryStatusResponse } + } + export type delete_Environments_query_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/query/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Environments_query_log_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/query/{id}/log/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Record } + } + export type post_Environments_query_check_auth_for_async_create = { + method: 'POST' + path: '/api/environments/{project_id}/query/check_auth_for_async/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_query_draft_sql_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/query/draft_sql/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_query_upgrade_create = { + method: 'POST' + path: '/api/environments/{project_id}/query/upgrade/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.QueryUpgradeRequest + } + responses: { 200: Schemas.QueryUpgradeResponse } + } + export type get_Environments_session_recording_playlists_list = { + method: 'GET' + path: '/api/environments/{project_id}/session_recording_playlists/' + requestFormat: 'json' + parameters: { + query: Partial<{ created_by: number; limit: number; offset: number; short_id: string }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedSessionRecordingPlaylistList } + } + export type post_Environments_session_recording_playlists_create = { + method: 'POST' + path: '/api/environments/{project_id}/session_recording_playlists/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.SessionRecordingPlaylist + } + responses: { 201: Schemas.SessionRecordingPlaylist } + } + export type get_Environments_session_recording_playlists_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/session_recording_playlists/{short_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; short_id: string } + } + responses: { 200: Schemas.SessionRecordingPlaylist } + } + export type put_Environments_session_recording_playlists_update = { + method: 'PUT' + path: '/api/environments/{project_id}/session_recording_playlists/{short_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; short_id: string } + + body: Schemas.SessionRecordingPlaylist + } + responses: { 200: Schemas.SessionRecordingPlaylist } + } + export type patch_Environments_session_recording_playlists_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/session_recording_playlists/{short_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; short_id: string } + + body: Schemas.PatchedSessionRecordingPlaylist + } + responses: { 200: Schemas.SessionRecordingPlaylist } + } + export type delete_Environments_session_recording_playlists_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/session_recording_playlists/{short_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; short_id: string } + } + responses: { 405: unknown } + } + export type get_Environments_session_recording_playlists_recordings_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/session_recording_playlists/{short_id}/recordings/' + requestFormat: 'json' + parameters: { + path: { project_id: string; short_id: string } + } + responses: { 200: unknown } + } + export type post_Environments_session_recording_playlists_recordings_create = { + method: 'POST' + path: '/api/environments/{project_id}/session_recording_playlists/{short_id}/recordings/{session_recording_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; session_recording_id: string; short_id: string } + + body: Schemas.SessionRecordingPlaylist + } + responses: { 200: unknown } + } + export type delete_Environments_session_recording_playlists_recordings_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/session_recording_playlists/{short_id}/recordings/{session_recording_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; session_recording_id: string; short_id: string } + } + responses: { 204: unknown } + } + export type get_Environments_session_recordings_list = { + method: 'GET' + path: '/api/environments/{project_id}/session_recordings/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedSessionRecordingList } + } + export type get_Environments_session_recordings_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/session_recordings/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.SessionRecording } + } + export type put_Environments_session_recordings_update = { + method: 'PUT' + path: '/api/environments/{project_id}/session_recordings/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.SessionRecording + } + responses: { 200: Schemas.SessionRecording } + } + export type patch_Environments_session_recordings_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/session_recordings/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedSessionRecording + } + responses: { 200: Schemas.SessionRecording } + } + export type delete_Environments_session_recordings_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/session_recordings/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Environments_session_recordings_sharing_list = { + method: 'GET' + path: '/api/environments/{project_id}/session_recordings/{recording_id}/sharing/' + requestFormat: 'json' + parameters: { + path: { project_id: string; recording_id: string } + } + responses: { 200: Array } + } + export type post_Environments_session_recordings_sharing_passwords_create = { + method: 'POST' + path: '/api/environments/{project_id}/session_recordings/{recording_id}/sharing/passwords/' + requestFormat: 'json' + parameters: { + path: { project_id: string; recording_id: string } + + body: Schemas.SharingConfiguration + } + responses: { 200: Schemas.SharingConfiguration } + } + export type delete_Environments_session_recordings_sharing_passwords_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/session_recordings/{recording_id}/sharing/passwords/{password_id}/' + requestFormat: 'json' + parameters: { + path: { password_id: string; project_id: string; recording_id: string } + } + responses: { 204: unknown } + } + export type post_Environments_session_recordings_sharing_refresh_create = { + method: 'POST' + path: '/api/environments/{project_id}/session_recordings/{recording_id}/sharing/refresh/' + requestFormat: 'json' + parameters: { + path: { project_id: string; recording_id: string } + + body: Schemas.SharingConfiguration + } + responses: { 200: Schemas.SharingConfiguration } + } + export type post_Create_session_summaries = { + method: 'POST' + path: '/api/environments/{project_id}/session_summaries/create_session_summaries/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.SessionSummaries + } + responses: { 200: Schemas.SessionSummaries } + } + export type get_Environments_sessions_property_definitions_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/sessions/property_definitions/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_sessions_values_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/sessions/values/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_subscriptions_list = { + method: 'GET' + path: '/api/environments/{project_id}/subscriptions/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedSubscriptionList } + } + export type post_Environments_subscriptions_create = { + method: 'POST' + path: '/api/environments/{project_id}/subscriptions/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.Subscription + } + responses: { 201: Schemas.Subscription } + } + export type get_Environments_subscriptions_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/subscriptions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: Schemas.Subscription } + } + export type put_Environments_subscriptions_update = { + method: 'PUT' + path: '/api/environments/{project_id}/subscriptions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.Subscription + } + responses: { 200: Schemas.Subscription } + } + export type patch_Environments_subscriptions_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/subscriptions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedSubscription + } + responses: { 200: Schemas.Subscription } + } + export type delete_Environments_subscriptions_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/subscriptions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 405: unknown } + } + export type get_Environments_user_interviews_list = { + method: 'GET' + path: '/api/environments/{project_id}/user_interviews/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedUserInterviewList } + } + export type post_Environments_user_interviews_create = { + method: 'POST' + path: '/api/environments/{project_id}/user_interviews/' + requestFormat: 'form-data' + parameters: { + path: { project_id: string } + + body: Schemas.UserInterview + } + responses: { 201: Schemas.UserInterview } + } + export type get_Environments_user_interviews_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/user_interviews/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.UserInterview } + } + export type put_Environments_user_interviews_update = { + method: 'PUT' + path: '/api/environments/{project_id}/user_interviews/{id}/' + requestFormat: 'form-data' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.UserInterview + } + responses: { 200: Schemas.UserInterview } + } + export type patch_Environments_user_interviews_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/user_interviews/{id}/' + requestFormat: 'form-data' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedUserInterview + } + responses: { 200: Schemas.UserInterview } + } + export type delete_Environments_user_interviews_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/user_interviews/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Environments_warehouse_saved_queries_list = { + method: 'GET' + path: '/api/environments/{project_id}/warehouse_saved_queries/' + requestFormat: 'json' + parameters: { + query: Partial<{ page: number; search: string }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedDataWarehouseSavedQueryList } + } + export type post_Environments_warehouse_saved_queries_create = { + method: 'POST' + path: '/api/environments/{project_id}/warehouse_saved_queries/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.DataWarehouseSavedQuery + } + responses: { 201: Schemas.DataWarehouseSavedQuery } + } + export type get_Environments_warehouse_saved_queries_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/warehouse_saved_queries/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type put_Environments_warehouse_saved_queries_update = { + method: 'PUT' + path: '/api/environments/{project_id}/warehouse_saved_queries/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.DataWarehouseSavedQuery + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type patch_Environments_warehouse_saved_queries_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/warehouse_saved_queries/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedDataWarehouseSavedQuery + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type delete_Environments_warehouse_saved_queries_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/warehouse_saved_queries/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Environments_warehouse_saved_queries_activity_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/warehouse_saved_queries/{id}/activity/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type post_Environments_warehouse_saved_queries_ancestors_create = { + method: 'POST' + path: '/api/environments/{project_id}/warehouse_saved_queries/{id}/ancestors/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.DataWarehouseSavedQuery + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type post_Environments_warehouse_saved_queries_cancel_create = { + method: 'POST' + path: '/api/environments/{project_id}/warehouse_saved_queries/{id}/cancel/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.DataWarehouseSavedQuery + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type post_Environments_warehouse_saved_queries_descendants_create = { + method: 'POST' + path: '/api/environments/{project_id}/warehouse_saved_queries/{id}/descendants/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.DataWarehouseSavedQuery + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type post_Environments_warehouse_saved_queries_revert_materialization_create = { + method: 'POST' + path: '/api/environments/{project_id}/warehouse_saved_queries/{id}/revert_materialization/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.DataWarehouseSavedQuery + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type post_Environments_warehouse_saved_queries_run_create = { + method: 'POST' + path: '/api/environments/{project_id}/warehouse_saved_queries/{id}/run/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.DataWarehouseSavedQuery + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type get_Environments_warehouse_tables_list = { + method: 'GET' + path: '/api/environments/{project_id}/warehouse_tables/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number; search: string }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedTableList } + } + export type post_Environments_warehouse_tables_create = { + method: 'POST' + path: '/api/environments/{project_id}/warehouse_tables/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.Table + } + responses: { 201: Schemas.Table } + } + export type get_Environments_warehouse_tables_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/warehouse_tables/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.Table } + } + export type put_Environments_warehouse_tables_update = { + method: 'PUT' + path: '/api/environments/{project_id}/warehouse_tables/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.Table + } + responses: { 200: Schemas.Table } + } + export type patch_Environments_warehouse_tables_partial_update = { + method: 'PATCH' + path: '/api/environments/{project_id}/warehouse_tables/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedTable + } + responses: { 200: Schemas.Table } + } + export type delete_Environments_warehouse_tables_destroy = { + method: 'DELETE' + path: '/api/environments/{project_id}/warehouse_tables/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type post_Environments_warehouse_tables_refresh_schema_create = { + method: 'POST' + path: '/api/environments/{project_id}/warehouse_tables/{id}/refresh_schema/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.Table + } + responses: { 200: unknown } + } + export type post_Environments_warehouse_tables_update_schema_create = { + method: 'POST' + path: '/api/environments/{project_id}/warehouse_tables/{id}/update_schema/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.Table + } + responses: { 200: unknown } + } + export type post_Environments_warehouse_tables_file_create = { + method: 'POST' + path: '/api/environments/{project_id}/warehouse_tables/file/' + requestFormat: 'form-data' + parameters: { + path: { project_id: string } + + body: Schemas.Table + } + responses: { 200: unknown } + } + export type get_Environments_web_vitals_retrieve = { + method: 'GET' + path: '/api/environments/{project_id}/web_vitals/' + requestFormat: 'json' + parameters: { + query: { pathname: string } + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_List = { + method: 'GET' + path: '/api/organizations/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + } + responses: { 200: Schemas.PaginatedOrganizationList } + } + export type post_Create = { + method: 'POST' + path: '/api/organizations/' + requestFormat: 'json' + parameters: { + body: Schemas.Organization + } + responses: { 201: Schemas.Organization } + } + export type get_Retrieve = { + method: 'GET' + path: '/api/organizations/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string } + } + responses: { 200: Schemas.Organization } + } + export type put_Update = { + method: 'PUT' + path: '/api/organizations/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string } + + body: Schemas.Organization + } + responses: { 200: Schemas.Organization } + } + export type patch_Partial_update = { + method: 'PATCH' + path: '/api/organizations/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string } + + body: Schemas.PatchedOrganization + } + responses: { 200: Schemas.Organization } + } + export type delete_Destroy = { + method: 'DELETE' + path: '/api/organizations/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string } + } + responses: { 204: unknown } + } + export type post_Environments_rollback_create = { + method: 'POST' + path: '/api/organizations/{id}/environments_rollback/' + requestFormat: 'json' + parameters: { + path: { id: string } + + body: Schemas.Organization + } + responses: { 200: Schemas.Organization } + } + export type get_Batch_exports_list = { + method: 'GET' + path: '/api/organizations/{organization_id}/batch_exports/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { organization_id: string } + } + responses: { 200: Schemas.PaginatedBatchExportList } + } + export type post_Batch_exports_create = { + method: 'POST' + path: '/api/organizations/{organization_id}/batch_exports/' + requestFormat: 'json' + parameters: { + path: { organization_id: string } + + body: Schemas.BatchExport + } + responses: { 201: Schemas.BatchExport } + } + export type get_Batch_exports_retrieve = { + method: 'GET' + path: '/api/organizations/{organization_id}/batch_exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + } + responses: { 200: Schemas.BatchExport } + } + export type put_Batch_exports_update = { + method: 'PUT' + path: '/api/organizations/{organization_id}/batch_exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + + body: Schemas.BatchExport + } + responses: { 200: Schemas.BatchExport } + } + export type patch_Batch_exports_partial_update = { + method: 'PATCH' + path: '/api/organizations/{organization_id}/batch_exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + + body: Schemas.PatchedBatchExport + } + responses: { 200: Schemas.BatchExport } + } + export type delete_Batch_exports_destroy = { + method: 'DELETE' + path: '/api/organizations/{organization_id}/batch_exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + } + responses: { 204: unknown } + } + export type post_Batch_exports_backfill_create = { + method: 'POST' + path: '/api/organizations/{organization_id}/batch_exports/{id}/backfill/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + + body: Schemas.BatchExport + } + responses: { 200: unknown } + } + export type get_Batch_exports_logs_retrieve = { + method: 'GET' + path: '/api/organizations/{organization_id}/batch_exports/{id}/logs/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + } + responses: { 200: unknown } + } + export type post_Batch_exports_pause_create = { + method: 'POST' + path: '/api/organizations/{organization_id}/batch_exports/{id}/pause/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + + body: Schemas.BatchExport + } + responses: { 200: unknown } + } + export type post_Batch_exports_run_test_step_create = { + method: 'POST' + path: '/api/organizations/{organization_id}/batch_exports/{id}/run_test_step/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + + body: Schemas.BatchExport + } + responses: { 200: unknown } + } + export type post_Batch_exports_unpause_create = { + method: 'POST' + path: '/api/organizations/{organization_id}/batch_exports/{id}/unpause/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + + body: Schemas.BatchExport + } + responses: { 200: unknown } + } + export type post_Batch_exports_run_test_step_new_create = { + method: 'POST' + path: '/api/organizations/{organization_id}/batch_exports/run_test_step_new/' + requestFormat: 'json' + parameters: { + path: { organization_id: string } + + body: Schemas.BatchExport + } + responses: { 200: unknown } + } + export type get_Batch_exports_test_retrieve = { + method: 'GET' + path: '/api/organizations/{organization_id}/batch_exports/test/' + requestFormat: 'json' + parameters: { + path: { organization_id: string } + } + responses: { 200: unknown } + } + export type get_Domains_list = { + method: 'GET' + path: '/api/organizations/{organization_id}/domains/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { organization_id: string } + } + responses: { 200: Schemas.PaginatedOrganizationDomainList } + } + export type post_Domains_create = { + method: 'POST' + path: '/api/organizations/{organization_id}/domains/' + requestFormat: 'json' + parameters: { + path: { organization_id: string } + + body: Schemas.OrganizationDomain + } + responses: { 201: Schemas.OrganizationDomain } + } + export type get_Domains_retrieve = { + method: 'GET' + path: '/api/organizations/{organization_id}/domains/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + } + responses: { 200: Schemas.OrganizationDomain } + } + export type put_Domains_update = { + method: 'PUT' + path: '/api/organizations/{organization_id}/domains/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + + body: Schemas.OrganizationDomain + } + responses: { 200: Schemas.OrganizationDomain } + } + export type patch_Domains_partial_update = { + method: 'PATCH' + path: '/api/organizations/{organization_id}/domains/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + + body: Schemas.PatchedOrganizationDomain + } + responses: { 200: Schemas.OrganizationDomain } + } + export type delete_Domains_destroy = { + method: 'DELETE' + path: '/api/organizations/{organization_id}/domains/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + } + responses: { 204: unknown } + } + export type post_Domains_verify_create = { + method: 'POST' + path: '/api/organizations/{organization_id}/domains/{id}/verify/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + + body: Schemas.OrganizationDomain + } + responses: { 200: unknown } + } + export type get_Invites_list = { + method: 'GET' + path: '/api/organizations/{organization_id}/invites/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { organization_id: string } + } + responses: { 200: Schemas.PaginatedOrganizationInviteList } + } + export type post_Invites_create = { + method: 'POST' + path: '/api/organizations/{organization_id}/invites/' + requestFormat: 'json' + parameters: { + path: { organization_id: string } + + body: Schemas.OrganizationInvite + } + responses: { 201: Schemas.OrganizationInvite } + } + export type delete_Invites_destroy = { + method: 'DELETE' + path: '/api/organizations/{organization_id}/invites/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + } + responses: { 204: unknown } + } + export type post_Invites_bulk_create = { + method: 'POST' + path: '/api/organizations/{organization_id}/invites/bulk/' + requestFormat: 'json' + parameters: { + path: { organization_id: string } + + body: Schemas.OrganizationInvite + } + responses: { 200: unknown } + } + export type get_Members_list = { + method: 'GET' + path: '/api/organizations/{organization_id}/members/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { organization_id: string } + } + responses: { 200: Schemas.PaginatedOrganizationMemberList } + } + export type put_Members_update = { + method: 'PUT' + path: '/api/organizations/{organization_id}/members/{user__uuid}/' + requestFormat: 'json' + parameters: { + path: { organization_id: string; user__uuid: string } + + body: Schemas.OrganizationMember + } + responses: { 200: Schemas.OrganizationMember } + } + export type patch_Members_partial_update = { + method: 'PATCH' + path: '/api/organizations/{organization_id}/members/{user__uuid}/' + requestFormat: 'json' + parameters: { + path: { organization_id: string; user__uuid: string } + + body: Schemas.PatchedOrganizationMember + } + responses: { 200: Schemas.OrganizationMember } + } + export type delete_Members_destroy = { + method: 'DELETE' + path: '/api/organizations/{organization_id}/members/{user__uuid}/' + requestFormat: 'json' + parameters: { + path: { organization_id: string; user__uuid: string } + } + responses: { 204: unknown } + } + export type get_Members_scoped_api_keys_retrieve = { + method: 'GET' + path: '/api/organizations/{organization_id}/members/{user__uuid}/scoped_api_keys/' + requestFormat: 'json' + parameters: { + path: { organization_id: string; user__uuid: string } + } + responses: { 200: Schemas.OrganizationMember } + } + export type get_List_2 = { + method: 'GET' + path: '/api/organizations/{organization_id}/projects/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { organization_id: string } + } + responses: { 200: Schemas.PaginatedProjectBackwardCompatBasicList } + } + export type post_Create_2 = { + method: 'POST' + path: '/api/organizations/{organization_id}/projects/' + requestFormat: 'json' + parameters: { + path: { organization_id: string } + + body: Schemas.ProjectBackwardCompat + } + responses: { 201: Schemas.ProjectBackwardCompat } + } + export type get_Retrieve_2 = { + method: 'GET' + path: '/api/organizations/{organization_id}/projects/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; organization_id: string } + } + responses: { 200: Schemas.ProjectBackwardCompat } + } + export type put_Update_2 = { + method: 'PUT' + path: '/api/organizations/{organization_id}/projects/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; organization_id: string } + + body: Schemas.ProjectBackwardCompat + } + responses: { 200: Schemas.ProjectBackwardCompat } + } + export type patch_Partial_update_2 = { + method: 'PATCH' + path: '/api/organizations/{organization_id}/projects/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; organization_id: string } + + body: Schemas.PatchedProjectBackwardCompat + } + responses: { 200: Schemas.ProjectBackwardCompat } + } + export type delete_Destroy_2 = { + method: 'DELETE' + path: '/api/organizations/{organization_id}/projects/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; organization_id: string } + } + responses: { 204: unknown } + } + export type get_Activity_retrieve = { + method: 'GET' + path: '/api/organizations/{organization_id}/projects/{id}/activity/' + requestFormat: 'json' + parameters: { + path: { id: number; organization_id: string } + } + responses: { 200: Schemas.ProjectBackwardCompat } + } + export type patch_Add_product_intent_partial_update = { + method: 'PATCH' + path: '/api/organizations/{organization_id}/projects/{id}/add_product_intent/' + requestFormat: 'json' + parameters: { + path: { id: number; organization_id: string } + + body: Schemas.PatchedProjectBackwardCompat + } + responses: { 200: Schemas.ProjectBackwardCompat } + } + export type post_Change_organization_create = { + method: 'POST' + path: '/api/organizations/{organization_id}/projects/{id}/change_organization/' + requestFormat: 'json' + parameters: { + path: { id: number; organization_id: string } + + body: Schemas.ProjectBackwardCompat + } + responses: { 200: Schemas.ProjectBackwardCompat } + } + export type patch_Complete_product_onboarding_partial_update = { + method: 'PATCH' + path: '/api/organizations/{organization_id}/projects/{id}/complete_product_onboarding/' + requestFormat: 'json' + parameters: { + path: { id: number; organization_id: string } + + body: Schemas.PatchedProjectBackwardCompat + } + responses: { 200: Schemas.ProjectBackwardCompat } + } + export type patch_Delete_secret_token_backup_partial_update = { + method: 'PATCH' + path: '/api/organizations/{organization_id}/projects/{id}/delete_secret_token_backup/' + requestFormat: 'json' + parameters: { + path: { id: number; organization_id: string } + + body: Schemas.PatchedProjectBackwardCompat + } + responses: { 200: Schemas.ProjectBackwardCompat } + } + export type get_Is_generating_demo_data_retrieve = { + method: 'GET' + path: '/api/organizations/{organization_id}/projects/{id}/is_generating_demo_data/' + requestFormat: 'json' + parameters: { + path: { id: number; organization_id: string } + } + responses: { 200: Schemas.ProjectBackwardCompat } + } + export type patch_Reset_token_partial_update = { + method: 'PATCH' + path: '/api/organizations/{organization_id}/projects/{id}/reset_token/' + requestFormat: 'json' + parameters: { + path: { id: number; organization_id: string } + + body: Schemas.PatchedProjectBackwardCompat + } + responses: { 200: Schemas.ProjectBackwardCompat } + } + export type patch_Rotate_secret_token_partial_update = { + method: 'PATCH' + path: '/api/organizations/{organization_id}/projects/{id}/rotate_secret_token/' + requestFormat: 'json' + parameters: { + path: { id: number; organization_id: string } + + body: Schemas.PatchedProjectBackwardCompat + } + responses: { 200: Schemas.ProjectBackwardCompat } + } + export type get_Proxy_records_list = { + method: 'GET' + path: '/api/organizations/{organization_id}/proxy_records/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { organization_id: string } + } + responses: { 200: Schemas.PaginatedProxyRecordList } + } + export type post_Proxy_records_create = { + method: 'POST' + path: '/api/organizations/{organization_id}/proxy_records/' + requestFormat: 'json' + parameters: { + path: { organization_id: string } + + body: Schemas.ProxyRecord + } + responses: { 201: Schemas.ProxyRecord } + } + export type get_Proxy_records_retrieve = { + method: 'GET' + path: '/api/organizations/{organization_id}/proxy_records/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + } + responses: { 200: Schemas.ProxyRecord } + } + export type put_Proxy_records_update = { + method: 'PUT' + path: '/api/organizations/{organization_id}/proxy_records/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + + body: Schemas.ProxyRecord + } + responses: { 200: Schemas.ProxyRecord } + } + export type patch_Proxy_records_partial_update = { + method: 'PATCH' + path: '/api/organizations/{organization_id}/proxy_records/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + + body: Schemas.PatchedProxyRecord + } + responses: { 200: Schemas.ProxyRecord } + } + export type delete_Proxy_records_destroy = { + method: 'DELETE' + path: '/api/organizations/{organization_id}/proxy_records/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + } + responses: { 204: unknown } + } + export type get_Roles_list = { + method: 'GET' + path: '/api/organizations/{organization_id}/roles/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { organization_id: string } + } + responses: { 200: Schemas.PaginatedRoleList } + } + export type post_Roles_create = { + method: 'POST' + path: '/api/organizations/{organization_id}/roles/' + requestFormat: 'json' + parameters: { + path: { organization_id: string } + + body: Schemas.Role + } + responses: { 201: Schemas.Role } + } + export type get_Roles_retrieve = { + method: 'GET' + path: '/api/organizations/{organization_id}/roles/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + } + responses: { 200: Schemas.Role } + } + export type put_Roles_update = { + method: 'PUT' + path: '/api/organizations/{organization_id}/roles/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + + body: Schemas.Role + } + responses: { 200: Schemas.Role } + } + export type patch_Roles_partial_update = { + method: 'PATCH' + path: '/api/organizations/{organization_id}/roles/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + + body: Schemas.PatchedRole + } + responses: { 200: Schemas.Role } + } + export type delete_Roles_destroy = { + method: 'DELETE' + path: '/api/organizations/{organization_id}/roles/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string } + } + responses: { 204: unknown } + } + export type get_Roles_role_memberships_list = { + method: 'GET' + path: '/api/organizations/{organization_id}/roles/{role_id}/role_memberships/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { organization_id: string; role_id: string } + } + responses: { 200: Schemas.PaginatedRoleMembershipList } + } + export type post_Roles_role_memberships_create = { + method: 'POST' + path: '/api/organizations/{organization_id}/roles/{role_id}/role_memberships/' + requestFormat: 'json' + parameters: { + path: { organization_id: string; role_id: string } + + body: Schemas.RoleMembership + } + responses: { 201: Schemas.RoleMembership } + } + export type delete_Roles_role_memberships_destroy = { + method: 'DELETE' + path: '/api/organizations/{organization_id}/roles/{role_id}/role_memberships/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; organization_id: string; role_id: string } + } + responses: { 204: unknown } + } + export type get_Actions_list = { + method: 'GET' + path: '/api/projects/{project_id}/actions/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json'; limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedActionList } + } + export type post_Actions_create = { + method: 'POST' + path: '/api/projects/{project_id}/actions/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + + body: Schemas.Action + } + responses: { 201: Schemas.Action } + } + export type get_Actions_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/actions/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + } + responses: { 200: Schemas.Action } + } + export type put_Actions_update = { + method: 'PUT' + path: '/api/projects/{project_id}/actions/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.Action + } + responses: { 200: Schemas.Action } + } + export type patch_Actions_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/actions/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.PatchedAction + } + responses: { 200: Schemas.Action } + } + export type delete_Actions_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/actions/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + } + responses: { 405: unknown } + } + export type get_Activity_log_list = { + method: 'GET' + path: '/api/projects/{project_id}/activity_log/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedActivityLogList } + } + export type get_Annotations_list = { + method: 'GET' + path: '/api/projects/{project_id}/annotations/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number; search: string }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedAnnotationList } + } + export type post_Annotations_create = { + method: 'POST' + path: '/api/projects/{project_id}/annotations/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.Annotation + } + responses: { 201: Schemas.Annotation } + } + export type get_Annotations_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/annotations/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: Schemas.Annotation } + } + export type put_Annotations_update = { + method: 'PUT' + path: '/api/projects/{project_id}/annotations/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.Annotation + } + responses: { 200: Schemas.Annotation } + } + export type patch_Annotations_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/annotations/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedAnnotation + } + responses: { 200: Schemas.Annotation } + } + export type delete_Annotations_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/annotations/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 405: unknown } + } + export type get_App_metrics_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/app_metrics/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type get_App_metrics_error_details_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/app_metrics/{id}/error_details/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type get_App_metrics_historical_exports_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/app_metrics/{plugin_config_id}/historical_exports/' + requestFormat: 'json' + parameters: { + path: { plugin_config_id: string; project_id: string } + } + responses: { 200: unknown } + } + export type get_App_metrics_historical_exports_retrieve_2 = { + method: 'GET' + path: '/api/projects/{project_id}/app_metrics/{plugin_config_id}/historical_exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; plugin_config_id: string; project_id: string } + } + responses: { 200: unknown } + } + export type get_Batch_exports_list_2 = { + method: 'GET' + path: '/api/projects/{project_id}/batch_exports/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedBatchExportList } + } + export type post_Batch_exports_create_2 = { + method: 'POST' + path: '/api/projects/{project_id}/batch_exports/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.BatchExport + } + responses: { 201: Schemas.BatchExport } + } + export type get_Batch_exports_backfills_list = { + method: 'GET' + path: '/api/projects/{project_id}/batch_exports/{batch_export_id}/backfills/' + requestFormat: 'json' + parameters: { + query: Partial<{ cursor: string; ordering: string }> + path: { batch_export_id: string; project_id: string } + } + responses: { 200: Schemas.PaginatedBatchExportBackfillList } + } + export type post_Batch_exports_backfills_create = { + method: 'POST' + path: '/api/projects/{project_id}/batch_exports/{batch_export_id}/backfills/' + requestFormat: 'json' + parameters: { + path: { batch_export_id: string; project_id: string } + + body: Schemas.BatchExportBackfill + } + responses: { 201: Schemas.BatchExportBackfill } + } + export type get_Batch_exports_backfills_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/batch_exports/{batch_export_id}/backfills/{id}/' + requestFormat: 'json' + parameters: { + path: { batch_export_id: string; id: string; project_id: string } + } + responses: { 200: Schemas.BatchExportBackfill } + } + export type post_Batch_exports_backfills_cancel_create = { + method: 'POST' + path: '/api/projects/{project_id}/batch_exports/{batch_export_id}/backfills/{id}/cancel/' + requestFormat: 'json' + parameters: { + path: { batch_export_id: string; id: string; project_id: string } + + body: Schemas.BatchExportBackfill + } + responses: { 200: unknown } + } + export type get_Batch_exports_runs_list = { + method: 'GET' + path: '/api/projects/{project_id}/batch_exports/{batch_export_id}/runs/' + requestFormat: 'json' + parameters: { + query: Partial<{ cursor: string; ordering: string }> + path: { batch_export_id: string; project_id: string } + } + responses: { 200: Schemas.PaginatedBatchExportRunList } + } + export type get_Batch_exports_runs_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/batch_exports/{batch_export_id}/runs/{id}/' + requestFormat: 'json' + parameters: { + path: { batch_export_id: string; id: string; project_id: string } + } + responses: { 200: Schemas.BatchExportRun } + } + export type post_Batch_exports_runs_cancel_create = { + method: 'POST' + path: '/api/projects/{project_id}/batch_exports/{batch_export_id}/runs/{id}/cancel/' + requestFormat: 'json' + parameters: { + path: { batch_export_id: string; id: string; project_id: string } + + body: Schemas.BatchExportRun + } + responses: { 200: unknown } + } + export type get_Batch_exports_runs_logs_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/batch_exports/{batch_export_id}/runs/{id}/logs/' + requestFormat: 'json' + parameters: { + path: { batch_export_id: string; id: string; project_id: string } + } + responses: { 200: unknown } + } + export type post_Batch_exports_runs_retry_create = { + method: 'POST' + path: '/api/projects/{project_id}/batch_exports/{batch_export_id}/runs/{id}/retry/' + requestFormat: 'json' + parameters: { + path: { batch_export_id: string; id: string; project_id: string } + + body: Schemas.BatchExportRun + } + responses: { 200: unknown } + } + export type get_Batch_exports_retrieve_2 = { + method: 'GET' + path: '/api/projects/{project_id}/batch_exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.BatchExport } + } + export type put_Batch_exports_update_2 = { + method: 'PUT' + path: '/api/projects/{project_id}/batch_exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.BatchExport + } + responses: { 200: Schemas.BatchExport } + } + export type patch_Batch_exports_partial_update_2 = { + method: 'PATCH' + path: '/api/projects/{project_id}/batch_exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedBatchExport + } + responses: { 200: Schemas.BatchExport } + } + export type delete_Batch_exports_destroy_2 = { + method: 'DELETE' + path: '/api/projects/{project_id}/batch_exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type post_Batch_exports_backfill_create_2 = { + method: 'POST' + path: '/api/projects/{project_id}/batch_exports/{id}/backfill/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.BatchExport + } + responses: { 200: unknown } + } + export type get_Batch_exports_logs_retrieve_2 = { + method: 'GET' + path: '/api/projects/{project_id}/batch_exports/{id}/logs/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: unknown } + } + export type post_Batch_exports_pause_create_2 = { + method: 'POST' + path: '/api/projects/{project_id}/batch_exports/{id}/pause/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.BatchExport + } + responses: { 200: unknown } + } + export type post_Batch_exports_run_test_step_create_2 = { + method: 'POST' + path: '/api/projects/{project_id}/batch_exports/{id}/run_test_step/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.BatchExport + } + responses: { 200: unknown } + } + export type post_Batch_exports_unpause_create_2 = { + method: 'POST' + path: '/api/projects/{project_id}/batch_exports/{id}/unpause/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.BatchExport + } + responses: { 200: unknown } + } + export type post_Batch_exports_run_test_step_new_create_2 = { + method: 'POST' + path: '/api/projects/{project_id}/batch_exports/run_test_step_new/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.BatchExport + } + responses: { 200: unknown } + } + export type get_Batch_exports_test_retrieve_2 = { + method: 'GET' + path: '/api/projects/{project_id}/batch_exports/test/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Cohorts_list = { + method: 'GET' + path: '/api/projects/{project_id}/cohorts/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedCohortList } + } + export type post_Cohorts_create = { + method: 'POST' + path: '/api/projects/{project_id}/cohorts/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.Cohort + } + responses: { 201: Schemas.Cohort } + } + export type get_Cohorts_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/cohorts/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: Schemas.Cohort } + } + export type put_Cohorts_update = { + method: 'PUT' + path: '/api/projects/{project_id}/cohorts/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.Cohort + } + responses: { 200: Schemas.Cohort } + } + export type patch_Cohorts_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/cohorts/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedCohort + } + responses: { 200: Schemas.Cohort } + } + export type delete_Cohorts_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/cohorts/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 405: unknown } + } + export type get_Cohorts_activity_retrieve_2 = { + method: 'GET' + path: '/api/projects/{project_id}/cohorts/{id}/activity/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type patch_Cohorts_add_persons_to_static_cohort_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/cohorts/{id}/add_persons_to_static_cohort/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedCohort + } + responses: { 200: unknown } + } + export type get_Cohorts_duplicate_as_static_cohort_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/cohorts/{id}/duplicate_as_static_cohort/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type get_Cohorts_persons_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/cohorts/{id}/persons/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type get_Cohorts_activity_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/cohorts/activity/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Dashboard_templates_list = { + method: 'GET' + path: '/api/projects/{project_id}/dashboard_templates/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedDashboardTemplateList } + } + export type post_Dashboard_templates_create = { + method: 'POST' + path: '/api/projects/{project_id}/dashboard_templates/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.DashboardTemplate + } + responses: { 201: Schemas.DashboardTemplate } + } + export type get_Dashboard_templates_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/dashboard_templates/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.DashboardTemplate } + } + export type put_Dashboard_templates_update = { + method: 'PUT' + path: '/api/projects/{project_id}/dashboard_templates/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.DashboardTemplate + } + responses: { 200: Schemas.DashboardTemplate } + } + export type patch_Dashboard_templates_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/dashboard_templates/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedDashboardTemplate + } + responses: { 200: Schemas.DashboardTemplate } + } + export type delete_Dashboard_templates_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/dashboard_templates/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 405: unknown } + } + export type get_Dashboard_templates_json_schema_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/dashboard_templates/json_schema/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Dashboards_list = { + method: 'GET' + path: '/api/projects/{project_id}/dashboards/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt'; limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedDashboardBasicList } + } + export type post_Dashboards_create = { + method: 'POST' + path: '/api/projects/{project_id}/dashboards/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { project_id: string } + + body: Schemas.Dashboard + } + responses: { 201: Schemas.Dashboard } + } + export type get_Dashboards_collaborators_list = { + method: 'GET' + path: '/api/projects/{project_id}/dashboards/{dashboard_id}/collaborators/' + requestFormat: 'json' + parameters: { + path: { dashboard_id: number; project_id: string } + } + responses: { 200: Array } + } + export type post_Dashboards_collaborators_create = { + method: 'POST' + path: '/api/projects/{project_id}/dashboards/{dashboard_id}/collaborators/' + requestFormat: 'json' + parameters: { + path: { dashboard_id: number; project_id: string } + + body: Schemas.DashboardCollaborator + } + responses: { 201: Schemas.DashboardCollaborator } + } + export type delete_Dashboards_collaborators_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/dashboards/{dashboard_id}/collaborators/{user__uuid}/' + requestFormat: 'json' + parameters: { + path: { dashboard_id: number; project_id: string; user__uuid: string } + } + responses: { 204: unknown } + } + export type get_Dashboards_sharing_list = { + method: 'GET' + path: '/api/projects/{project_id}/dashboards/{dashboard_id}/sharing/' + requestFormat: 'json' + parameters: { + path: { dashboard_id: number; project_id: string } + } + responses: { 200: Array } + } + export type post_Dashboards_sharing_passwords_create = { + method: 'POST' + path: '/api/projects/{project_id}/dashboards/{dashboard_id}/sharing/passwords/' + requestFormat: 'json' + parameters: { + path: { dashboard_id: number; project_id: string } + + body: Schemas.SharingConfiguration + } + responses: { 200: Schemas.SharingConfiguration } + } + export type delete_Dashboards_sharing_passwords_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/dashboards/{dashboard_id}/sharing/passwords/{password_id}/' + requestFormat: 'json' + parameters: { + path: { dashboard_id: number; password_id: string; project_id: string } + } + responses: { 204: unknown } + } + export type post_Dashboards_sharing_refresh_create = { + method: 'POST' + path: '/api/projects/{project_id}/dashboards/{dashboard_id}/sharing/refresh/' + requestFormat: 'json' + parameters: { + path: { dashboard_id: number; project_id: string } + + body: Schemas.SharingConfiguration + } + responses: { 200: Schemas.SharingConfiguration } + } + export type get_Dashboards_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/dashboards/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { id: number; project_id: string } + } + responses: { 200: Schemas.Dashboard } + } + export type put_Dashboards_update = { + method: 'PUT' + path: '/api/projects/{project_id}/dashboards/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { id: number; project_id: string } + + body: Schemas.Dashboard + } + responses: { 200: Schemas.Dashboard } + } + export type patch_Dashboards_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/dashboards/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { id: number; project_id: string } + + body: Schemas.PatchedDashboard + } + responses: { 200: Schemas.Dashboard } + } + export type delete_Dashboards_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/dashboards/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { id: number; project_id: string } + } + responses: { 405: unknown } + } + export type patch_Dashboards_move_tile_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/dashboards/{id}/move_tile/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { id: number; project_id: string } + + body: Schemas.PatchedDashboard + } + responses: { 200: unknown } + } + export type get_Dashboards_stream_tiles_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/dashboards/{id}/stream_tiles/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type post_Dashboards_create_from_template_json_create = { + method: 'POST' + path: '/api/projects/{project_id}/dashboards/create_from_template_json/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'json' | 'txt' }> + path: { project_id: string } + + body: Schemas.Dashboard + } + responses: { 200: unknown } + } + export type get_Early_access_feature_list = { + method: 'GET' + path: '/api/projects/{project_id}/early_access_feature/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedEarlyAccessFeatureList } + } + export type post_Early_access_feature_create = { + method: 'POST' + path: '/api/projects/{project_id}/early_access_feature/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.EarlyAccessFeatureSerializerCreateOnly + } + responses: { 201: Schemas.EarlyAccessFeatureSerializerCreateOnly } + } + export type get_Early_access_feature_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/early_access_feature/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.EarlyAccessFeature } + } + export type put_Early_access_feature_update = { + method: 'PUT' + path: '/api/projects/{project_id}/early_access_feature/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.EarlyAccessFeature + } + responses: { 200: Schemas.EarlyAccessFeature } + } + export type patch_Early_access_feature_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/early_access_feature/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedEarlyAccessFeature + } + responses: { 200: Schemas.EarlyAccessFeature } + } + export type delete_Early_access_feature_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/early_access_feature/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Environments_list = { + method: 'GET' + path: '/api/projects/{project_id}/environments/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedTeamBasicList } + } + export type post_Environments_create = { + method: 'POST' + path: '/api/projects/{project_id}/environments/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.Team + } + responses: { 201: Schemas.Team } + } + export type get_Environments_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/environments/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: Schemas.Team } + } + export type put_Environments_update = { + method: 'PUT' + path: '/api/projects/{project_id}/environments/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.Team + } + responses: { 200: Schemas.Team } + } + export type patch_Environments_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/environments/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedTeam + } + responses: { 200: Schemas.Team } + } + export type delete_Environments_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/environments/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 204: unknown } + } + export type get_Environments_activity_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/environments/{id}/activity/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type patch_Environments_add_product_intent_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/environments/{id}/add_product_intent/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedTeam + } + responses: { 200: unknown } + } + export type patch_Environments_complete_product_onboarding_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/environments/{id}/complete_product_onboarding/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedTeam + } + responses: { 200: unknown } + } + export type patch_Environments_delete_secret_token_backup_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/environments/{id}/delete_secret_token_backup/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedTeam + } + responses: { 200: unknown } + } + export type get_Environments_event_ingestion_restrictions_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/environments/{id}/event_ingestion_restrictions/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type get_Environments_is_generating_demo_data_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/environments/{id}/is_generating_demo_data/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type patch_Environments_reset_token_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/environments/{id}/reset_token/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedTeam + } + responses: { 200: unknown } + } + export type patch_Environments_rotate_secret_token_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/environments/{id}/rotate_secret_token/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedTeam + } + responses: { 200: unknown } + } + export type get_Event_definitions_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/event_definitions/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Event_definitions_retrieve_2 = { + method: 'GET' + path: '/api/projects/{project_id}/event_definitions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: unknown } + } + export type put_Event_definitions_update = { + method: 'PUT' + path: '/api/projects/{project_id}/event_definitions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: unknown } + } + export type patch_Event_definitions_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/event_definitions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: unknown } + } + export type delete_Event_definitions_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/event_definitions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Event_definitions_metrics_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/event_definitions/{id}/metrics/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: unknown } + } + export type get_Events_list = { + method: 'GET' + path: '/api/projects/{project_id}/events/' + requestFormat: 'json' + parameters: { + query: Partial<{ + after: string + before: string + distinct_id: number + event: string + format: 'csv' | 'json' + limit: number + offset: number + person_id: number + properties: Array + select: Array + where: Array + }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedClickhouseEventList } + } + export type get_Events_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/events/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: string; project_id: string } + } + responses: { 200: Schemas.ClickhouseEvent } + } + export type get_Events_values_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/events/values/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Experiment_holdouts_list = { + method: 'GET' + path: '/api/projects/{project_id}/experiment_holdouts/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedExperimentHoldoutList } + } + export type post_Experiment_holdouts_create = { + method: 'POST' + path: '/api/projects/{project_id}/experiment_holdouts/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.ExperimentHoldout + } + responses: { 201: Schemas.ExperimentHoldout } + } + export type get_Experiment_holdouts_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/experiment_holdouts/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: Schemas.ExperimentHoldout } + } + export type put_Experiment_holdouts_update = { + method: 'PUT' + path: '/api/projects/{project_id}/experiment_holdouts/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.ExperimentHoldout + } + responses: { 200: Schemas.ExperimentHoldout } + } + export type patch_Experiment_holdouts_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/experiment_holdouts/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedExperimentHoldout + } + responses: { 200: Schemas.ExperimentHoldout } + } + export type delete_Experiment_holdouts_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/experiment_holdouts/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 204: unknown } + } + export type get_Experiment_saved_metrics_list = { + method: 'GET' + path: '/api/projects/{project_id}/experiment_saved_metrics/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedExperimentSavedMetricList } + } + export type post_Experiment_saved_metrics_create = { + method: 'POST' + path: '/api/projects/{project_id}/experiment_saved_metrics/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.ExperimentSavedMetric + } + responses: { 201: Schemas.ExperimentSavedMetric } + } + export type get_Experiment_saved_metrics_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/experiment_saved_metrics/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: Schemas.ExperimentSavedMetric } + } + export type put_Experiment_saved_metrics_update = { + method: 'PUT' + path: '/api/projects/{project_id}/experiment_saved_metrics/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.ExperimentSavedMetric + } + responses: { 200: Schemas.ExperimentSavedMetric } + } + export type patch_Experiment_saved_metrics_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/experiment_saved_metrics/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedExperimentSavedMetric + } + responses: { 200: Schemas.ExperimentSavedMetric } + } + export type delete_Experiment_saved_metrics_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/experiment_saved_metrics/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 204: unknown } + } + export type get_Experiments_list = { + method: 'GET' + path: '/api/projects/{project_id}/experiments/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedExperimentList } + } + export type post_Experiments_create = { + method: 'POST' + path: '/api/projects/{project_id}/experiments/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.Experiment + } + responses: { 201: Schemas.Experiment } + } + export type get_Experiments_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/experiments/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: Schemas.Experiment } + } + export type put_Experiments_update = { + method: 'PUT' + path: '/api/projects/{project_id}/experiments/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.Experiment + } + responses: { 200: Schemas.Experiment } + } + export type patch_Experiments_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/experiments/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedExperiment + } + responses: { 200: Schemas.Experiment } + } + export type delete_Experiments_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/experiments/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 405: unknown } + } + export type post_Experiments_create_exposure_cohort_for_experiment_create = { + method: 'POST' + path: '/api/projects/{project_id}/experiments/{id}/create_exposure_cohort_for_experiment/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.Experiment + } + responses: { 200: unknown } + } + export type post_Experiments_duplicate_create = { + method: 'POST' + path: '/api/projects/{project_id}/experiments/{id}/duplicate/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.Experiment + } + responses: { 200: unknown } + } + export type get_Experiments_requires_flag_implementation_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/experiments/requires_flag_implementation/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Explicit_members_list = { + method: 'GET' + path: '/api/projects/{project_id}/explicit_members/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: Array } + } + export type post_Explicit_members_create = { + method: 'POST' + path: '/api/projects/{project_id}/explicit_members/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.ExplicitTeamMember + } + responses: { 201: Schemas.ExplicitTeamMember } + } + export type get_Explicit_members_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/explicit_members/{parent_membership__user__uuid}/' + requestFormat: 'json' + parameters: { + path: { parent_membership__user__uuid: string; project_id: string } + } + responses: { 200: Schemas.ExplicitTeamMember } + } + export type put_Explicit_members_update = { + method: 'PUT' + path: '/api/projects/{project_id}/explicit_members/{parent_membership__user__uuid}/' + requestFormat: 'json' + parameters: { + path: { parent_membership__user__uuid: string; project_id: string } + + body: Schemas.ExplicitTeamMember + } + responses: { 200: Schemas.ExplicitTeamMember } + } + export type patch_Explicit_members_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/explicit_members/{parent_membership__user__uuid}/' + requestFormat: 'json' + parameters: { + path: { parent_membership__user__uuid: string; project_id: string } + + body: Schemas.PatchedExplicitTeamMember + } + responses: { 200: Schemas.ExplicitTeamMember } + } + export type delete_Explicit_members_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/explicit_members/{parent_membership__user__uuid}/' + requestFormat: 'json' + parameters: { + path: { parent_membership__user__uuid: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Exports_list = { + method: 'GET' + path: '/api/projects/{project_id}/exports/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedExportedAssetList } + } + export type post_Exports_create = { + method: 'POST' + path: '/api/projects/{project_id}/exports/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.ExportedAsset + } + responses: { 201: Schemas.ExportedAsset } + } + export type get_Exports_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/exports/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: Schemas.ExportedAsset } + } + export type get_Exports_content_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/exports/{id}/content/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type get_Feature_flags_list = { + method: 'GET' + path: '/api/projects/{project_id}/feature_flags/' + requestFormat: 'json' + parameters: { + query: Partial<{ + active: 'STALE' | 'false' | 'true' + created_by_id: string + evaluation_runtime: 'both' | 'client' | 'server' + excluded_properties: string + limit: number + offset: number + search: string + type: 'boolean' | 'experiment' | 'multivariant' + }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedFeatureFlagList } + } + export type post_Feature_flags_create = { + method: 'POST' + path: '/api/projects/{project_id}/feature_flags/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.FeatureFlag + } + responses: { 201: Schemas.FeatureFlag } + } + export type get_Feature_flags_role_access_list = { + method: 'GET' + path: '/api/projects/{project_id}/feature_flags/{feature_flag_id}/role_access/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { feature_flag_id: number; project_id: string } + } + responses: { 200: Schemas.PaginatedFeatureFlagRoleAccessList } + } + export type post_Feature_flags_role_access_create = { + method: 'POST' + path: '/api/projects/{project_id}/feature_flags/{feature_flag_id}/role_access/' + requestFormat: 'json' + parameters: { + path: { feature_flag_id: number; project_id: string } + + body: Schemas.FeatureFlagRoleAccess + } + responses: { 201: Schemas.FeatureFlagRoleAccess } + } + export type get_Feature_flags_role_access_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/feature_flags/{feature_flag_id}/role_access/{id}/' + requestFormat: 'json' + parameters: { + path: { feature_flag_id: number; id: number; project_id: string } + } + responses: { 200: Schemas.FeatureFlagRoleAccess } + } + export type delete_Feature_flags_role_access_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/feature_flags/{feature_flag_id}/role_access/{id}/' + requestFormat: 'json' + parameters: { + path: { feature_flag_id: number; id: number; project_id: string } + } + responses: { 204: unknown } + } + export type get_Feature_flags_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/feature_flags/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: Schemas.FeatureFlag } + } + export type put_Feature_flags_update = { + method: 'PUT' + path: '/api/projects/{project_id}/feature_flags/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.FeatureFlag + } + responses: { 200: Schemas.FeatureFlag } + } + export type patch_Feature_flags_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/feature_flags/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedFeatureFlag + } + responses: { 200: Schemas.FeatureFlag } + } + export type delete_Feature_flags_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/feature_flags/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 405: unknown } + } + export type get_Feature_flags_activity_retrieve_2 = { + method: 'GET' + path: '/api/projects/{project_id}/feature_flags/{id}/activity/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type post_Feature_flags_create_static_cohort_for_flag_create = { + method: 'POST' + path: '/api/projects/{project_id}/feature_flags/{id}/create_static_cohort_for_flag/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.FeatureFlag + } + responses: { 200: unknown } + } + export type post_Feature_flags_dashboard_create = { + method: 'POST' + path: '/api/projects/{project_id}/feature_flags/{id}/dashboard/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.FeatureFlag + } + responses: { 200: unknown } + } + export type post_Feature_flags_enrich_usage_dashboard_create = { + method: 'POST' + path: '/api/projects/{project_id}/feature_flags/{id}/enrich_usage_dashboard/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.FeatureFlag + } + responses: { 200: unknown } + } + export type get_Feature_flags_remote_config_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/feature_flags/{id}/remote_config/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type get_Feature_flags_status_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/feature_flags/{id}/status/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type get_Feature_flags_activity_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/feature_flags/activity/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Feature_flags_bulk_keys_create = { + method: 'POST' + path: '/api/projects/{project_id}/feature_flags/bulk_keys/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.FeatureFlag + } + responses: { 200: unknown } + } + export type get_Feature_flags_evaluation_reasons_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/feature_flags/evaluation_reasons/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Feature_flags_local_evaluation_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/feature_flags/local_evaluation/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Feature_flags_my_flags_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/feature_flags/my_flags/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Feature_flags_user_blast_radius_create = { + method: 'POST' + path: '/api/projects/{project_id}/feature_flags/user_blast_radius/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.FeatureFlag + } + responses: { 200: unknown } + } + export type get_File_system_list = { + method: 'GET' + path: '/api/projects/{project_id}/file_system/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number; search: string }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedFileSystemList } + } + export type post_File_system_create = { + method: 'POST' + path: '/api/projects/{project_id}/file_system/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.FileSystem + } + responses: { 201: Schemas.FileSystem } + } + export type get_File_system_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/file_system/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.FileSystem } + } + export type put_File_system_update = { + method: 'PUT' + path: '/api/projects/{project_id}/file_system/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.FileSystem + } + responses: { 200: Schemas.FileSystem } + } + export type patch_File_system_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/file_system/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedFileSystem + } + responses: { 200: Schemas.FileSystem } + } + export type delete_File_system_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/file_system/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type post_File_system_count_create = { + method: 'POST' + path: '/api/projects/{project_id}/file_system/{id}/count/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.FileSystem + } + responses: { 200: unknown } + } + export type post_File_system_link_create = { + method: 'POST' + path: '/api/projects/{project_id}/file_system/{id}/link/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.FileSystem + } + responses: { 200: unknown } + } + export type post_File_system_move_create = { + method: 'POST' + path: '/api/projects/{project_id}/file_system/{id}/move/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.FileSystem + } + responses: { 200: unknown } + } + export type post_File_system_count_by_path_create = { + method: 'POST' + path: '/api/projects/{project_id}/file_system/count_by_path/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.FileSystem + } + responses: { 200: unknown } + } + export type get_File_system_unfiled_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/file_system/unfiled/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_File_system_shortcut_list = { + method: 'GET' + path: '/api/projects/{project_id}/file_system_shortcut/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedFileSystemShortcutList } + } + export type post_File_system_shortcut_create = { + method: 'POST' + path: '/api/projects/{project_id}/file_system_shortcut/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.FileSystemShortcut + } + responses: { 201: Schemas.FileSystemShortcut } + } + export type get_File_system_shortcut_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/file_system_shortcut/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.FileSystemShortcut } + } + export type put_File_system_shortcut_update = { + method: 'PUT' + path: '/api/projects/{project_id}/file_system_shortcut/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.FileSystemShortcut + } + responses: { 200: Schemas.FileSystemShortcut } + } + export type patch_File_system_shortcut_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/file_system_shortcut/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedFileSystemShortcut + } + responses: { 200: Schemas.FileSystemShortcut } + } + export type delete_File_system_shortcut_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/file_system_shortcut/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Flag_value_values_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/flag_value/values/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Groups_list = { + method: 'GET' + path: '/api/projects/{project_id}/groups/' + requestFormat: 'json' + parameters: { + query: { cursor?: string | undefined; group_type_index: number; search: string } + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedGroupList } + } + export type post_Groups_create = { + method: 'POST' + path: '/api/projects/{project_id}/groups/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.CreateGroup + } + responses: { 201: Schemas.Group } + } + export type get_Groups_activity_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/groups/activity/' + requestFormat: 'json' + parameters: { + query: { group_type_index: number; id: string } + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Groups_delete_property_create = { + method: 'POST' + path: '/api/projects/{project_id}/groups/delete_property/' + requestFormat: 'json' + parameters: { + query: { group_key: string; group_type_index: number } + path: { project_id: string } + + body: Schemas.Group + } + responses: { 200: unknown } + } + export type get_Groups_find_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/groups/find/' + requestFormat: 'json' + parameters: { + query: { group_key: string; group_type_index: number } + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Groups_property_definitions_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/groups/property_definitions/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Groups_property_values_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/groups/property_values/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Groups_related_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/groups/related/' + requestFormat: 'json' + parameters: { + query: { group_type_index: number; id: string } + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Groups_update_property_create = { + method: 'POST' + path: '/api/projects/{project_id}/groups/update_property/' + requestFormat: 'json' + parameters: { + query: { group_key: string; group_type_index: number } + path: { project_id: string } + + body: Schemas.Group + } + responses: { 200: unknown } + } + export type get_Groups_types_list = { + method: 'GET' + path: '/api/projects/{project_id}/groups_types/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: Array } + } + export type delete_Groups_types_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/groups_types/{group_type_index}/' + requestFormat: 'json' + parameters: { + path: { group_type_index: number; project_id: string } + } + responses: { 204: unknown } + } + export type get_Groups_types_metrics_list = { + method: 'GET' + path: '/api/projects/{project_id}/groups_types/{group_type_index}/metrics/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { group_type_index: number; project_id: string } + } + responses: { 200: Schemas.PaginatedGroupUsageMetricList } + } + export type post_Groups_types_metrics_create = { + method: 'POST' + path: '/api/projects/{project_id}/groups_types/{group_type_index}/metrics/' + requestFormat: 'json' + parameters: { + path: { group_type_index: number; project_id: string } + + body: Schemas.GroupUsageMetric + } + responses: { 201: Schemas.GroupUsageMetric } + } + export type get_Groups_types_metrics_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/groups_types/{group_type_index}/metrics/{id}/' + requestFormat: 'json' + parameters: { + path: { group_type_index: number; id: string; project_id: string } + } + responses: { 200: Schemas.GroupUsageMetric } + } + export type put_Groups_types_metrics_update = { + method: 'PUT' + path: '/api/projects/{project_id}/groups_types/{group_type_index}/metrics/{id}/' + requestFormat: 'json' + parameters: { + path: { group_type_index: number; id: string; project_id: string } + + body: Schemas.GroupUsageMetric + } + responses: { 200: Schemas.GroupUsageMetric } + } + export type patch_Groups_types_metrics_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/groups_types/{group_type_index}/metrics/{id}/' + requestFormat: 'json' + parameters: { + path: { group_type_index: number; id: string; project_id: string } + + body: Schemas.PatchedGroupUsageMetric + } + responses: { 200: Schemas.GroupUsageMetric } + } + export type delete_Groups_types_metrics_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/groups_types/{group_type_index}/metrics/{id}/' + requestFormat: 'json' + parameters: { + path: { group_type_index: number; id: string; project_id: string } + } + responses: { 204: unknown } + } + export type put_Groups_types_create_detail_dashboard_update = { + method: 'PUT' + path: '/api/projects/{project_id}/groups_types/create_detail_dashboard/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.GroupType + } + responses: { 200: unknown } + } + export type put_Groups_types_set_default_columns_update = { + method: 'PUT' + path: '/api/projects/{project_id}/groups_types/set_default_columns/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.GroupType + } + responses: { 200: unknown } + } + export type patch_Groups_types_update_metadata_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/groups_types/update_metadata/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.PatchedGroupType + } + responses: { 200: unknown } + } + export type get_Hog_functions_list = { + method: 'GET' + path: '/api/projects/{project_id}/hog_functions/' + requestFormat: 'json' + parameters: { + query: Partial<{ + created_at: string + created_by: number + enabled: boolean + id: string + limit: number + offset: number + search: string + type: Array + updated_at: string + }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedHogFunctionMinimalList } + } + export type post_Hog_functions_create = { + method: 'POST' + path: '/api/projects/{project_id}/hog_functions/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.HogFunction + } + responses: { 201: Schemas.HogFunction } + } + export type get_Hog_functions_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/hog_functions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.HogFunction } + } + export type put_Hog_functions_update = { + method: 'PUT' + path: '/api/projects/{project_id}/hog_functions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.HogFunction + } + responses: { 200: Schemas.HogFunction } + } + export type patch_Hog_functions_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/hog_functions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedHogFunction + } + responses: { 200: Schemas.HogFunction } + } + export type delete_Hog_functions_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/hog_functions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 405: unknown } + } + export type post_Hog_functions_broadcast_create = { + method: 'POST' + path: '/api/projects/{project_id}/hog_functions/{id}/broadcast/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.HogFunction + } + responses: { 200: unknown } + } + export type post_Hog_functions_invocations_create = { + method: 'POST' + path: '/api/projects/{project_id}/hog_functions/{id}/invocations/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.HogFunction + } + responses: { 200: unknown } + } + export type get_Hog_functions_logs_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/hog_functions/{id}/logs/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: unknown } + } + export type get_Hog_functions_metrics_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/hog_functions/{id}/metrics/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: unknown } + } + export type get_Hog_functions_metrics_totals_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/hog_functions/{id}/metrics/totals/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: unknown } + } + export type get_Hog_functions_icon_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/hog_functions/icon/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Hog_functions_icons_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/hog_functions/icons/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type patch_Hog_functions_rearrange_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/hog_functions/rearrange/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.PatchedHogFunction + } + responses: { 200: unknown } + } + export type get_Insights_list = { + method: 'GET' + path: '/api/projects/{project_id}/insights/' + requestFormat: 'json' + parameters: { + query: Partial<{ + basic: boolean + created_by: number + format: 'csv' | 'json' + limit: number + offset: number + refresh: + | 'async' + | 'async_except_on_cache_miss' + | 'blocking' + | 'force_async' + | 'force_blocking' + | 'force_cache' + | 'lazy_async' + short_id: string + }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedInsightList } + } + export type post_Insights_create = { + method: 'POST' + path: '/api/projects/{project_id}/insights/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + + body: Schemas.Insight + } + responses: { 201: Schemas.Insight } + } + export type get_Insights_sharing_list = { + method: 'GET' + path: '/api/projects/{project_id}/insights/{insight_id}/sharing/' + requestFormat: 'json' + parameters: { + path: { insight_id: number; project_id: string } + } + responses: { 200: Array } + } + export type post_Insights_sharing_passwords_create = { + method: 'POST' + path: '/api/projects/{project_id}/insights/{insight_id}/sharing/passwords/' + requestFormat: 'json' + parameters: { + path: { insight_id: number; project_id: string } + + body: Schemas.SharingConfiguration + } + responses: { 200: Schemas.SharingConfiguration } + } + export type delete_Insights_sharing_passwords_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/insights/{insight_id}/sharing/passwords/{password_id}/' + requestFormat: 'json' + parameters: { + path: { insight_id: number; password_id: string; project_id: string } + } + responses: { 204: unknown } + } + export type post_Insights_sharing_refresh_create = { + method: 'POST' + path: '/api/projects/{project_id}/insights/{insight_id}/sharing/refresh/' + requestFormat: 'json' + parameters: { + path: { insight_id: number; project_id: string } + + body: Schemas.SharingConfiguration + } + responses: { 200: Schemas.SharingConfiguration } + } + export type get_Insights_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/insights/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ + format: 'csv' | 'json' + from_dashboard: number + refresh: + | 'async' + | 'async_except_on_cache_miss' + | 'blocking' + | 'force_async' + | 'force_blocking' + | 'force_cache' + | 'lazy_async' + }> + path: { id: number; project_id: string } + } + responses: { 200: Schemas.Insight } + } + export type put_Insights_update = { + method: 'PUT' + path: '/api/projects/{project_id}/insights/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.Insight + } + responses: { 200: Schemas.Insight } + } + export type patch_Insights_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/insights/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.PatchedInsight + } + responses: { 200: Schemas.Insight } + } + export type delete_Insights_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/insights/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + } + responses: { 405: unknown } + } + export type get_Insights_activity_retrieve_2 = { + method: 'GET' + path: '/api/projects/{project_id}/insights/{id}/activity/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type post_Insights_viewed_create = { + method: 'POST' + path: '/api/projects/{project_id}/insights/{id}/viewed/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.Insight + } + responses: { 200: unknown } + } + export type get_Insights_activity_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/insights/activity/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Insights_cancel_create = { + method: 'POST' + path: '/api/projects/{project_id}/insights/cancel/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + + body: Schemas.Insight + } + responses: { 200: unknown } + } + export type get_Insights_my_last_viewed_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/insights/my_last_viewed/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Logs_attributes_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/logs/attributes/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Logs_query_create = { + method: 'POST' + path: '/api/projects/{project_id}/logs/query/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Logs_sparkline_create = { + method: 'POST' + path: '/api/projects/{project_id}/logs/sparkline/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Logs_values_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/logs/values/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Notebooks_list = { + method: 'GET' + path: '/api/projects/{project_id}/notebooks/' + requestFormat: 'json' + parameters: { + query: Partial<{ + contains: string + created_by: number + date_from: string + date_to: string + limit: number + offset: number + user: string + }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedNotebookMinimalList } + } + export type post_Notebooks_create = { + method: 'POST' + path: '/api/projects/{project_id}/notebooks/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.Notebook + } + responses: { 201: Schemas.Notebook } + } + export type get_Notebooks_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/notebooks/{short_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; short_id: string } + } + responses: { 200: Schemas.Notebook } + } + export type put_Notebooks_update = { + method: 'PUT' + path: '/api/projects/{project_id}/notebooks/{short_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; short_id: string } + + body: Schemas.Notebook + } + responses: { 200: Schemas.Notebook } + } + export type patch_Notebooks_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/notebooks/{short_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; short_id: string } + + body: Schemas.PatchedNotebook + } + responses: { 200: Schemas.Notebook } + } + export type delete_Notebooks_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/notebooks/{short_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; short_id: string } + } + responses: { 405: unknown } + } + export type get_Notebooks_activity_retrieve_2 = { + method: 'GET' + path: '/api/projects/{project_id}/notebooks/{short_id}/activity/' + requestFormat: 'json' + parameters: { + path: { project_id: string; short_id: string } + } + responses: { 200: unknown } + } + export type get_Notebooks_activity_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/notebooks/activity/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Notebooks_recording_comments_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/notebooks/recording_comments/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Persisted_folder_list = { + method: 'GET' + path: '/api/projects/{project_id}/persisted_folder/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedPersistedFolderList } + } + export type post_Persisted_folder_create = { + method: 'POST' + path: '/api/projects/{project_id}/persisted_folder/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.PersistedFolder + } + responses: { 201: Schemas.PersistedFolder } + } + export type get_Persisted_folder_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/persisted_folder/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.PersistedFolder } + } + export type put_Persisted_folder_update = { + method: 'PUT' + path: '/api/projects/{project_id}/persisted_folder/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PersistedFolder + } + responses: { 200: Schemas.PersistedFolder } + } + export type patch_Persisted_folder_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/persisted_folder/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedPersistedFolder + } + responses: { 200: Schemas.PersistedFolder } + } + export type delete_Persisted_folder_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/persisted_folder/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Persons_list = { + method: 'GET' + path: '/api/projects/{project_id}/persons/' + requestFormat: 'json' + parameters: { + query: Partial<{ + distinct_id: string + email: string + format: 'csv' | 'json' + limit: number + offset: number + properties: Array + search: string + }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedPersonList } + } + export type get_Persons_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/persons/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + } + responses: { 200: Schemas.Person } + } + export type put_Persons_update = { + method: 'PUT' + path: '/api/projects/{project_id}/persons/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.Person + } + responses: { 200: Schemas.Person } + } + export type patch_Persons_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/persons/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.PatchedPerson + } + responses: { 200: Schemas.Person } + } + export type delete_Persons_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/persons/{id}/' + requestFormat: 'json' + parameters: { + query: Partial<{ delete_events: boolean; format: 'csv' | 'json' }> + path: { id: number; project_id: string } + } + responses: { 204: unknown } + } + export type get_Persons_activity_retrieve_2 = { + method: 'GET' + path: '/api/projects/{project_id}/persons/{id}/activity/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type post_Persons_delete_events_create = { + method: 'POST' + path: '/api/projects/{project_id}/persons/{id}/delete_events/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type post_Persons_delete_property_create = { + method: 'POST' + path: '/api/projects/{project_id}/persons/{id}/delete_property/' + requestFormat: 'json' + parameters: { + query: { $unset: string; format?: ('csv' | 'json') | undefined } + path: { id: number; project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type get_Persons_properties_timeline_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/persons/{id}/properties_timeline/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + } + responses: { 200: unknown } + } + export type post_Persons_split_create = { + method: 'POST' + path: '/api/projects/{project_id}/persons/{id}/split/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { id: number; project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type post_Persons_update_property_create = { + method: 'POST' + path: '/api/projects/{project_id}/persons/{id}/update_property/' + requestFormat: 'json' + parameters: { + query: { format?: ('csv' | 'json') | undefined; key: string; value: unknown } + path: { id: number; project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type get_Persons_activity_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/persons/activity/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Persons_bulk_delete_create = { + method: 'POST' + path: '/api/projects/{project_id}/persons/bulk_delete/' + requestFormat: 'json' + parameters: { + query: Partial<{ + delete_events: boolean + distinct_ids: Record + format: 'csv' | 'json' + ids: Record + }> + path: { project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type get_Persons_cohorts_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/persons/cohorts/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Persons_funnel_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/persons/funnel/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Persons_funnel_create = { + method: 'POST' + path: '/api/projects/{project_id}/persons/funnel/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type get_Persons_funnel_correlation_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/persons/funnel/correlation/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Persons_funnel_correlation_create = { + method: 'POST' + path: '/api/projects/{project_id}/persons/funnel/correlation/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type get_Persons_lifecycle_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/persons/lifecycle/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Persons_reset_person_distinct_id_create = { + method: 'POST' + path: '/api/projects/{project_id}/persons/reset_person_distinct_id/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + + body: Schemas.Person + } + responses: { 200: unknown } + } + export type get_Persons_stickiness_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/persons/stickiness/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Persons_trends_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/persons/trends/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Persons_values_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/persons/values/' + requestFormat: 'json' + parameters: { + query: Partial<{ format: 'csv' | 'json' }> + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Plugin_configs_logs_list = { + method: 'GET' + path: '/api/projects/{project_id}/plugin_configs/{plugin_config_id}/logs/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { plugin_config_id: string; project_id: string } + } + responses: { 200: Schemas.PaginatedPluginLogEntryList } + } + export type get_Property_definitions_list = { + method: 'GET' + path: '/api/projects/{project_id}/property_definitions/' + requestFormat: 'json' + parameters: { + query: Partial<{ + event_names: string + exclude_core_properties: boolean + exclude_hidden: boolean + excluded_properties: string + filter_by_event_names: boolean | null + group_type_index: number + is_feature_flag: boolean | null + is_numerical: boolean | null + limit: number + offset: number + properties: string + search: string + type: 'event' | 'person' | 'group' | 'session' + }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedPropertyDefinitionList } + } + export type get_Property_definitions_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/property_definitions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.PropertyDefinition } + } + export type put_Property_definitions_update = { + method: 'PUT' + path: '/api/projects/{project_id}/property_definitions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PropertyDefinition + } + responses: { 200: Schemas.PropertyDefinition } + } + export type patch_Property_definitions_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/property_definitions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedPropertyDefinition + } + responses: { 200: Schemas.PropertyDefinition } + } + export type delete_Property_definitions_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/property_definitions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Property_definitions_seen_together_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/property_definitions/seen_together/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Query_create = { + method: 'POST' + path: '/api/projects/{project_id}/query/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.QueryRequest + } + responses: { 200: Schemas.QueryResponseAlternative } + } + export type get_Query_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/query/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.QueryStatusResponse } + } + export type delete_Query_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/query/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Query_log_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/query/{id}/log/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Record } + } + export type post_Query_check_auth_for_async_create = { + method: 'POST' + path: '/api/projects/{project_id}/query/check_auth_for_async/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Query_draft_sql_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/query/draft_sql/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type post_Query_upgrade_create = { + method: 'POST' + path: '/api/projects/{project_id}/query/upgrade/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.QueryUpgradeRequest + } + responses: { 200: Schemas.QueryUpgradeResponse } + } + export type get_Session_recording_playlists_list = { + method: 'GET' + path: '/api/projects/{project_id}/session_recording_playlists/' + requestFormat: 'json' + parameters: { + query: Partial<{ created_by: number; limit: number; offset: number; short_id: string }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedSessionRecordingPlaylistList } + } + export type post_Session_recording_playlists_create = { + method: 'POST' + path: '/api/projects/{project_id}/session_recording_playlists/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.SessionRecordingPlaylist + } + responses: { 201: Schemas.SessionRecordingPlaylist } + } + export type get_Session_recording_playlists_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/session_recording_playlists/{short_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; short_id: string } + } + responses: { 200: Schemas.SessionRecordingPlaylist } + } + export type put_Session_recording_playlists_update = { + method: 'PUT' + path: '/api/projects/{project_id}/session_recording_playlists/{short_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; short_id: string } + + body: Schemas.SessionRecordingPlaylist + } + responses: { 200: Schemas.SessionRecordingPlaylist } + } + export type patch_Session_recording_playlists_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/session_recording_playlists/{short_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; short_id: string } + + body: Schemas.PatchedSessionRecordingPlaylist + } + responses: { 200: Schemas.SessionRecordingPlaylist } + } + export type delete_Session_recording_playlists_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/session_recording_playlists/{short_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; short_id: string } + } + responses: { 405: unknown } + } + export type get_Session_recording_playlists_recordings_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/session_recording_playlists/{short_id}/recordings/' + requestFormat: 'json' + parameters: { + path: { project_id: string; short_id: string } + } + responses: { 200: unknown } + } + export type post_Session_recording_playlists_recordings_create = { + method: 'POST' + path: '/api/projects/{project_id}/session_recording_playlists/{short_id}/recordings/{session_recording_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; session_recording_id: string; short_id: string } + + body: Schemas.SessionRecordingPlaylist + } + responses: { 200: unknown } + } + export type delete_Session_recording_playlists_recordings_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/session_recording_playlists/{short_id}/recordings/{session_recording_id}/' + requestFormat: 'json' + parameters: { + path: { project_id: string; session_recording_id: string; short_id: string } + } + responses: { 204: unknown } + } + export type get_Session_recordings_list = { + method: 'GET' + path: '/api/projects/{project_id}/session_recordings/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedSessionRecordingList } + } + export type get_Session_recordings_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/session_recordings/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.SessionRecording } + } + export type put_Session_recordings_update = { + method: 'PUT' + path: '/api/projects/{project_id}/session_recordings/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.SessionRecording + } + responses: { 200: Schemas.SessionRecording } + } + export type patch_Session_recordings_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/session_recordings/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedSessionRecording + } + responses: { 200: Schemas.SessionRecording } + } + export type delete_Session_recordings_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/session_recordings/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Session_recordings_sharing_list = { + method: 'GET' + path: '/api/projects/{project_id}/session_recordings/{recording_id}/sharing/' + requestFormat: 'json' + parameters: { + path: { project_id: string; recording_id: string } + } + responses: { 200: Array } + } + export type post_Session_recordings_sharing_passwords_create = { + method: 'POST' + path: '/api/projects/{project_id}/session_recordings/{recording_id}/sharing/passwords/' + requestFormat: 'json' + parameters: { + path: { project_id: string; recording_id: string } + + body: Schemas.SharingConfiguration + } + responses: { 200: Schemas.SharingConfiguration } + } + export type delete_Session_recordings_sharing_passwords_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/session_recordings/{recording_id}/sharing/passwords/{password_id}/' + requestFormat: 'json' + parameters: { + path: { password_id: string; project_id: string; recording_id: string } + } + responses: { 204: unknown } + } + export type post_Session_recordings_sharing_refresh_create = { + method: 'POST' + path: '/api/projects/{project_id}/session_recordings/{recording_id}/sharing/refresh/' + requestFormat: 'json' + parameters: { + path: { project_id: string; recording_id: string } + + body: Schemas.SharingConfiguration + } + responses: { 200: Schemas.SharingConfiguration } + } + export type get_Sessions_property_definitions_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/sessions/property_definitions/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Sessions_values_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/sessions/values/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Subscriptions_list = { + method: 'GET' + path: '/api/projects/{project_id}/subscriptions/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedSubscriptionList } + } + export type post_Subscriptions_create = { + method: 'POST' + path: '/api/projects/{project_id}/subscriptions/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.Subscription + } + responses: { 201: Schemas.Subscription } + } + export type get_Subscriptions_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/subscriptions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: Schemas.Subscription } + } + export type put_Subscriptions_update = { + method: 'PUT' + path: '/api/projects/{project_id}/subscriptions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.Subscription + } + responses: { 200: Schemas.Subscription } + } + export type patch_Subscriptions_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/subscriptions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedSubscription + } + responses: { 200: Schemas.Subscription } + } + export type delete_Subscriptions_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/subscriptions/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 405: unknown } + } + export type get_Surveys_list = { + method: 'GET' + path: '/api/projects/{project_id}/surveys/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number; search: string }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedSurveyList } + } + export type post_Surveys_create = { + method: 'POST' + path: '/api/projects/{project_id}/surveys/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.SurveySerializerCreateUpdateOnly + } + responses: { 201: Schemas.SurveySerializerCreateUpdateOnly } + } + export type get_Surveys_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/surveys/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.Survey } + } + export type put_Surveys_update = { + method: 'PUT' + path: '/api/projects/{project_id}/surveys/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.Survey + } + responses: { 200: Schemas.Survey } + } + export type patch_Surveys_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/surveys/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedSurveySerializerCreateUpdateOnly + } + responses: { 200: Schemas.SurveySerializerCreateUpdateOnly } + } + export type delete_Surveys_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/surveys/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Surveys_activity_retrieve_2 = { + method: 'GET' + path: '/api/projects/{project_id}/surveys/{id}/activity/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: unknown } + } + export type get_Surveys_stats_retrieve_2 = { + method: 'GET' + path: '/api/projects/{project_id}/surveys/{id}/stats/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: unknown } + } + export type post_Surveys_summarize_responses_create = { + method: 'POST' + path: '/api/projects/{project_id}/surveys/{id}/summarize_responses/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.SurveySerializerCreateUpdateOnly + } + responses: { 200: unknown } + } + export type get_Surveys_activity_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/surveys/activity/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Surveys_responses_count_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/surveys/responses_count/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Surveys_stats_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/surveys/stats/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + } + responses: { 200: unknown } + } + export type get_Warehouse_saved_queries_list = { + method: 'GET' + path: '/api/projects/{project_id}/warehouse_saved_queries/' + requestFormat: 'json' + parameters: { + query: Partial<{ page: number; search: string }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedDataWarehouseSavedQueryList } + } + export type post_Warehouse_saved_queries_create = { + method: 'POST' + path: '/api/projects/{project_id}/warehouse_saved_queries/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.DataWarehouseSavedQuery + } + responses: { 201: Schemas.DataWarehouseSavedQuery } + } + export type get_Warehouse_saved_queries_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/warehouse_saved_queries/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type put_Warehouse_saved_queries_update = { + method: 'PUT' + path: '/api/projects/{project_id}/warehouse_saved_queries/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.DataWarehouseSavedQuery + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type patch_Warehouse_saved_queries_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/warehouse_saved_queries/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedDataWarehouseSavedQuery + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type delete_Warehouse_saved_queries_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/warehouse_saved_queries/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type get_Warehouse_saved_queries_activity_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/warehouse_saved_queries/{id}/activity/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type post_Warehouse_saved_queries_ancestors_create = { + method: 'POST' + path: '/api/projects/{project_id}/warehouse_saved_queries/{id}/ancestors/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.DataWarehouseSavedQuery + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type post_Warehouse_saved_queries_cancel_create = { + method: 'POST' + path: '/api/projects/{project_id}/warehouse_saved_queries/{id}/cancel/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.DataWarehouseSavedQuery + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type post_Warehouse_saved_queries_descendants_create = { + method: 'POST' + path: '/api/projects/{project_id}/warehouse_saved_queries/{id}/descendants/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.DataWarehouseSavedQuery + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type post_Warehouse_saved_queries_revert_materialization_create = { + method: 'POST' + path: '/api/projects/{project_id}/warehouse_saved_queries/{id}/revert_materialization/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.DataWarehouseSavedQuery + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type post_Warehouse_saved_queries_run_create = { + method: 'POST' + path: '/api/projects/{project_id}/warehouse_saved_queries/{id}/run/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.DataWarehouseSavedQuery + } + responses: { 200: Schemas.DataWarehouseSavedQuery } + } + export type get_Warehouse_tables_list = { + method: 'GET' + path: '/api/projects/{project_id}/warehouse_tables/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number; search: string }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedTableList } + } + export type post_Warehouse_tables_create = { + method: 'POST' + path: '/api/projects/{project_id}/warehouse_tables/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.Table + } + responses: { 201: Schemas.Table } + } + export type get_Warehouse_tables_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/warehouse_tables/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 200: Schemas.Table } + } + export type put_Warehouse_tables_update = { + method: 'PUT' + path: '/api/projects/{project_id}/warehouse_tables/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.Table + } + responses: { 200: Schemas.Table } + } + export type patch_Warehouse_tables_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/warehouse_tables/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.PatchedTable + } + responses: { 200: Schemas.Table } + } + export type delete_Warehouse_tables_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/warehouse_tables/{id}/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + } + responses: { 204: unknown } + } + export type post_Warehouse_tables_refresh_schema_create = { + method: 'POST' + path: '/api/projects/{project_id}/warehouse_tables/{id}/refresh_schema/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.Table + } + responses: { 200: unknown } + } + export type post_Warehouse_tables_update_schema_create = { + method: 'POST' + path: '/api/projects/{project_id}/warehouse_tables/{id}/update_schema/' + requestFormat: 'json' + parameters: { + path: { id: string; project_id: string } + + body: Schemas.Table + } + responses: { 200: unknown } + } + export type post_Warehouse_tables_file_create = { + method: 'POST' + path: '/api/projects/{project_id}/warehouse_tables/file/' + requestFormat: 'form-data' + parameters: { + path: { project_id: string } + + body: Schemas.Table + } + responses: { 200: unknown } + } + export type get_Web_analytics_breakdown_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/web_analytics/breakdown/' + requestFormat: 'json' + parameters: { + query: { + apply_path_cleaning?: boolean | undefined + breakdown_by: + | 'DeviceType' + | 'Browser' + | 'OS' + | 'Viewport' + | 'InitialReferringDomain' + | 'InitialUTMSource' + | 'InitialUTMMedium' + | 'InitialUTMCampaign' + | 'InitialUTMTerm' + | 'InitialUTMContent' + | 'Country' + | 'Region' + | 'City' + | 'InitialPage' + | 'Page' + | 'ExitPage' + | 'InitialChannelType' + date_from: string + date_to: string + filter_test_accounts?: boolean | undefined + host?: (string | null) | undefined + limit?: number | undefined + offset?: number | undefined + } + path: { project_id: string } + } + responses: { 200: Schemas.WebAnalyticsBreakdownResponse } + } + export type get_Web_analytics_overview_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/web_analytics/overview/' + requestFormat: 'json' + parameters: { + query: { + date_from: string + date_to: string + filter_test_accounts?: boolean | undefined + host?: (string | null) | undefined + } + path: { project_id: string } + } + responses: { 200: Schemas.WebAnalyticsOverviewResponse } + } + export type get_Web_experiments_list = { + method: 'GET' + path: '/api/projects/{project_id}/web_experiments/' + requestFormat: 'json' + parameters: { + query: Partial<{ limit: number; offset: number }> + path: { project_id: string } + } + responses: { 200: Schemas.PaginatedWebExperimentsAPIList } + } + export type post_Web_experiments_create = { + method: 'POST' + path: '/api/projects/{project_id}/web_experiments/' + requestFormat: 'json' + parameters: { + path: { project_id: string } + + body: Schemas.WebExperimentsAPI + } + responses: { 201: Schemas.WebExperimentsAPI } + } + export type get_Web_experiments_retrieve = { + method: 'GET' + path: '/api/projects/{project_id}/web_experiments/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 200: Schemas.WebExperimentsAPI } + } + export type put_Web_experiments_update = { + method: 'PUT' + path: '/api/projects/{project_id}/web_experiments/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.WebExperimentsAPI + } + responses: { 200: Schemas.WebExperimentsAPI } + } + export type patch_Web_experiments_partial_update = { + method: 'PATCH' + path: '/api/projects/{project_id}/web_experiments/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + + body: Schemas.PatchedWebExperimentsAPI + } + responses: { 200: Schemas.WebExperimentsAPI } + } + export type delete_Web_experiments_destroy = { + method: 'DELETE' + path: '/api/projects/{project_id}/web_experiments/{id}/' + requestFormat: 'json' + parameters: { + path: { id: number; project_id: string } + } + responses: { 204: unknown } + } + export type get_Users_list = { + method: 'GET' + path: '/api/users/' + requestFormat: 'json' + parameters: { + query: Partial<{ email: string; is_staff: boolean; limit: number; offset: number }> + } + responses: { 200: Schemas.PaginatedUserList } + } + export type get_Users_retrieve = { + method: 'GET' + path: '/api/users/{uuid}/' + requestFormat: 'json' + parameters: { + path: { uuid: string } + } + responses: { 200: Schemas.User } + } + export type put_Users_update = { + method: 'PUT' + path: '/api/users/{uuid}/' + requestFormat: 'json' + parameters: { + path: { uuid: string } + + body: Schemas.User + } + responses: { 200: Schemas.User } + } + export type patch_Users_partial_update = { + method: 'PATCH' + path: '/api/users/{uuid}/' + requestFormat: 'json' + parameters: { + path: { uuid: string } + + body: Schemas.PatchedUser + } + responses: { 200: Schemas.User } + } + export type delete_Users_destroy = { + method: 'DELETE' + path: '/api/users/{uuid}/' + requestFormat: 'json' + parameters: { + path: { uuid: string } + } + responses: { 204: unknown } + } + export type get_Users_hedgehog_config_retrieve = { + method: 'GET' + path: '/api/users/{uuid}/hedgehog_config/' + requestFormat: 'json' + parameters: { + path: { uuid: string } + } + responses: { 200: unknown } + } + export type patch_Users_hedgehog_config_partial_update = { + method: 'PATCH' + path: '/api/users/{uuid}/hedgehog_config/' + requestFormat: 'json' + parameters: { + path: { uuid: string } + + body: Schemas.PatchedUser + } + responses: { 200: unknown } + } + export type post_Users_scene_personalisation_create = { + method: 'POST' + path: '/api/users/{uuid}/scene_personalisation/' + requestFormat: 'json' + parameters: { + path: { uuid: string } + + body: Schemas.User + } + responses: { 200: unknown } + } + export type get_Users_start_2fa_setup_retrieve = { + method: 'GET' + path: '/api/users/{uuid}/start_2fa_setup/' + requestFormat: 'json' + parameters: { + path: { uuid: string } + } + responses: { 200: unknown } + } + export type post_Users_two_factor_backup_codes_create = { + method: 'POST' + path: '/api/users/{uuid}/two_factor_backup_codes/' + requestFormat: 'json' + parameters: { + path: { uuid: string } + + body: Schemas.User + } + responses: { 200: unknown } + } + export type post_Users_two_factor_disable_create = { + method: 'POST' + path: '/api/users/{uuid}/two_factor_disable/' + requestFormat: 'json' + parameters: { + path: { uuid: string } + + body: Schemas.User + } + responses: { 200: unknown } + } + export type get_Users_two_factor_start_setup_retrieve = { + method: 'GET' + path: '/api/users/{uuid}/two_factor_start_setup/' + requestFormat: 'json' + parameters: { + path: { uuid: string } + } + responses: { 200: unknown } + } + export type get_Users_two_factor_status_retrieve = { + method: 'GET' + path: '/api/users/{uuid}/two_factor_status/' + requestFormat: 'json' + parameters: { + path: { uuid: string } + } + responses: { 200: unknown } + } + export type post_Users_two_factor_validate_create = { + method: 'POST' + path: '/api/users/{uuid}/two_factor_validate/' + requestFormat: 'json' + parameters: { + path: { uuid: string } + + body: Schemas.User + } + responses: { 200: unknown } + } + export type post_Users_validate_2fa_create = { + method: 'POST' + path: '/api/users/{uuid}/validate_2fa/' + requestFormat: 'json' + parameters: { + path: { uuid: string } + + body: Schemas.User + } + responses: { 200: unknown } + } + export type patch_Users_cancel_email_change_request_partial_update = { + method: 'PATCH' + path: '/api/users/cancel_email_change_request/' + requestFormat: 'json' + parameters: { + body: Schemas.PatchedUser + } + responses: { 200: unknown } + } + export type post_Users_request_email_verification_create = { + method: 'POST' + path: '/api/users/request_email_verification/' + requestFormat: 'json' + parameters: { + body: Schemas.User + } + responses: { 200: unknown } + } + export type post_Users_verify_email_create = { + method: 'POST' + path: '/api/users/verify_email/' + requestFormat: 'json' + parameters: { + body: Schemas.User + } + responses: { 200: unknown } + } + + // +} + +// +export type EndpointByMethod = { + get: { + '/api/environments/{project_id}/app_metrics/{id}/': Endpoints.get_Environments_app_metrics_retrieve + '/api/environments/{project_id}/app_metrics/{id}/error_details/': Endpoints.get_Environments_app_metrics_error_details_retrieve + '/api/environments/{project_id}/app_metrics/{plugin_config_id}/historical_exports/': Endpoints.get_Environments_app_metrics_historical_exports_retrieve + '/api/environments/{project_id}/app_metrics/{plugin_config_id}/historical_exports/{id}/': Endpoints.get_Environments_app_metrics_historical_exports_retrieve_2 + '/api/environments/{project_id}/batch_exports/': Endpoints.get_Environments_batch_exports_list + '/api/environments/{project_id}/batch_exports/{batch_export_id}/backfills/': Endpoints.get_Environments_batch_exports_backfills_list + '/api/environments/{project_id}/batch_exports/{batch_export_id}/backfills/{id}/': Endpoints.get_Environments_batch_exports_backfills_retrieve + '/api/environments/{project_id}/batch_exports/{batch_export_id}/runs/': Endpoints.get_Environments_batch_exports_runs_list + '/api/environments/{project_id}/batch_exports/{batch_export_id}/runs/{id}/': Endpoints.get_Environments_batch_exports_runs_retrieve + '/api/environments/{project_id}/batch_exports/{batch_export_id}/runs/{id}/logs/': Endpoints.get_Environments_batch_exports_runs_logs_retrieve + '/api/environments/{project_id}/batch_exports/{id}/': Endpoints.get_Environments_batch_exports_retrieve + '/api/environments/{project_id}/batch_exports/{id}/logs/': Endpoints.get_Environments_batch_exports_logs_retrieve + '/api/environments/{project_id}/batch_exports/test/': Endpoints.get_Environments_batch_exports_test_retrieve + '/api/environments/{project_id}/dashboards/': Endpoints.get_Environments_dashboards_list + '/api/environments/{project_id}/dashboards/{dashboard_id}/collaborators/': Endpoints.get_Environments_dashboards_collaborators_list + '/api/environments/{project_id}/dashboards/{dashboard_id}/sharing/': Endpoints.get_Environments_dashboards_sharing_list + '/api/environments/{project_id}/dashboards/{id}/': Endpoints.get_Environments_dashboards_retrieve + '/api/environments/{project_id}/dashboards/{id}/stream_tiles/': Endpoints.get_Environments_dashboards_stream_tiles_retrieve + '/api/environments/{project_id}/error_tracking/assignment_rules/': Endpoints.get_Environments_error_tracking_assignment_rules_list + '/api/environments/{project_id}/error_tracking/assignment_rules/{id}/': Endpoints.get_Environments_error_tracking_assignment_rules_retrieve + '/api/environments/{project_id}/error_tracking/grouping_rules/': Endpoints.get_Environments_error_tracking_grouping_rules_list + '/api/environments/{project_id}/error_tracking/grouping_rules/{id}/': Endpoints.get_Environments_error_tracking_grouping_rules_retrieve + '/api/environments/{project_id}/error_tracking/releases/': Endpoints.get_Environments_error_tracking_releases_list + '/api/environments/{project_id}/error_tracking/releases/{id}/': Endpoints.get_Environments_error_tracking_releases_retrieve + '/api/environments/{project_id}/error_tracking/suppression_rules/': Endpoints.get_Environments_error_tracking_suppression_rules_list + '/api/environments/{project_id}/error_tracking/suppression_rules/{id}/': Endpoints.get_Environments_error_tracking_suppression_rules_retrieve + '/api/environments/{project_id}/error_tracking/symbol_sets/': Endpoints.get_Environments_error_tracking_symbol_sets_list + '/api/environments/{project_id}/error_tracking/symbol_sets/{id}/': Endpoints.get_Environments_error_tracking_symbol_sets_retrieve + '/api/environments/{project_id}/events/': Endpoints.get_Environments_events_list + '/api/environments/{project_id}/events/{id}/': Endpoints.get_Environments_events_retrieve + '/api/environments/{project_id}/events/values/': Endpoints.get_Environments_events_values_retrieve + '/api/environments/{project_id}/explicit_members/': Endpoints.get_Environments_explicit_members_list + '/api/environments/{project_id}/explicit_members/{parent_membership__user__uuid}/': Endpoints.get_Environments_explicit_members_retrieve + '/api/environments/{project_id}/exports/': Endpoints.get_Environments_exports_list + '/api/environments/{project_id}/exports/{id}/': Endpoints.get_Environments_exports_retrieve + '/api/environments/{project_id}/exports/{id}/content/': Endpoints.get_Environments_exports_content_retrieve + '/api/environments/{project_id}/file_system/': Endpoints.get_Environments_file_system_list + '/api/environments/{project_id}/file_system/{id}/': Endpoints.get_Environments_file_system_retrieve + '/api/environments/{project_id}/file_system/unfiled/': Endpoints.get_Environments_file_system_unfiled_retrieve + '/api/environments/{project_id}/file_system_shortcut/': Endpoints.get_Environments_file_system_shortcut_list + '/api/environments/{project_id}/file_system_shortcut/{id}/': Endpoints.get_Environments_file_system_shortcut_retrieve + '/api/environments/{project_id}/groups/': Endpoints.get_Environments_groups_list + '/api/environments/{project_id}/groups/activity/': Endpoints.get_Environments_groups_activity_retrieve + '/api/environments/{project_id}/groups/find/': Endpoints.get_Environments_groups_find_retrieve + '/api/environments/{project_id}/groups/property_definitions/': Endpoints.get_Environments_groups_property_definitions_retrieve + '/api/environments/{project_id}/groups/property_values/': Endpoints.get_Environments_groups_property_values_retrieve + '/api/environments/{project_id}/groups/related/': Endpoints.get_Environments_groups_related_retrieve + '/api/environments/{project_id}/hog_functions/': Endpoints.get_Environments_hog_functions_list + '/api/environments/{project_id}/hog_functions/{id}/': Endpoints.get_Environments_hog_functions_retrieve + '/api/environments/{project_id}/hog_functions/{id}/logs/': Endpoints.get_Environments_hog_functions_logs_retrieve + '/api/environments/{project_id}/hog_functions/{id}/metrics/': Endpoints.get_Environments_hog_functions_metrics_retrieve + '/api/environments/{project_id}/hog_functions/{id}/metrics/totals/': Endpoints.get_Environments_hog_functions_metrics_totals_retrieve + '/api/environments/{project_id}/hog_functions/icon/': Endpoints.get_Environments_hog_functions_icon_retrieve + '/api/environments/{project_id}/hog_functions/icons/': Endpoints.get_Environments_hog_functions_icons_retrieve + '/api/environments/{project_id}/insights/': Endpoints.get_Environments_insights_list + '/api/environments/{project_id}/insights/{insight_id}/sharing/': Endpoints.get_Environments_insights_sharing_list + '/api/environments/{project_id}/insights/{id}/': Endpoints.get_Environments_insights_retrieve + '/api/environments/{project_id}/insights/{id}/activity/': Endpoints.get_Environments_insights_activity_retrieve_2 + '/api/environments/{project_id}/insights/activity/': Endpoints.get_Environments_insights_activity_retrieve + '/api/environments/{project_id}/insights/my_last_viewed/': Endpoints.get_Environments_insights_my_last_viewed_retrieve + '/api/environments/{project_id}/logs/attributes/': Endpoints.get_Environments_logs_attributes_retrieve + '/api/environments/{project_id}/logs/values/': Endpoints.get_Environments_logs_values_retrieve + '/api/environments/{project_id}/persisted_folder/': Endpoints.get_Environments_persisted_folder_list + '/api/environments/{project_id}/persisted_folder/{id}/': Endpoints.get_Environments_persisted_folder_retrieve + '/api/environments/{project_id}/persons/': Endpoints.get_Environments_persons_list + '/api/environments/{project_id}/persons/{id}/': Endpoints.get_Environments_persons_retrieve + '/api/environments/{project_id}/persons/{id}/activity/': Endpoints.get_Environments_persons_activity_retrieve_2 + '/api/environments/{project_id}/persons/{id}/properties_timeline/': Endpoints.get_Environments_persons_properties_timeline_retrieve + '/api/environments/{project_id}/persons/activity/': Endpoints.get_Environments_persons_activity_retrieve + '/api/environments/{project_id}/persons/cohorts/': Endpoints.get_Environments_persons_cohorts_retrieve + '/api/environments/{project_id}/persons/funnel/': Endpoints.get_Environments_persons_funnel_retrieve + '/api/environments/{project_id}/persons/funnel/correlation/': Endpoints.get_Environments_persons_funnel_correlation_retrieve + '/api/environments/{project_id}/persons/lifecycle/': Endpoints.get_Environments_persons_lifecycle_retrieve + '/api/environments/{project_id}/persons/stickiness/': Endpoints.get_Environments_persons_stickiness_retrieve + '/api/environments/{project_id}/persons/trends/': Endpoints.get_Environments_persons_trends_retrieve + '/api/environments/{project_id}/persons/values/': Endpoints.get_Environments_persons_values_retrieve + '/api/environments/{project_id}/plugin_configs/{plugin_config_id}/logs/': Endpoints.get_Environments_plugin_configs_logs_list + '/api/environments/{project_id}/query/{id}/': Endpoints.get_Environments_query_retrieve + '/api/environments/{project_id}/query/{id}/log/': Endpoints.get_Environments_query_log_retrieve + '/api/environments/{project_id}/query/draft_sql/': Endpoints.get_Environments_query_draft_sql_retrieve + '/api/environments/{project_id}/session_recording_playlists/': Endpoints.get_Environments_session_recording_playlists_list + '/api/environments/{project_id}/session_recording_playlists/{short_id}/': Endpoints.get_Environments_session_recording_playlists_retrieve + '/api/environments/{project_id}/session_recording_playlists/{short_id}/recordings/': Endpoints.get_Environments_session_recording_playlists_recordings_retrieve + '/api/environments/{project_id}/session_recordings/': Endpoints.get_Environments_session_recordings_list + '/api/environments/{project_id}/session_recordings/{id}/': Endpoints.get_Environments_session_recordings_retrieve + '/api/environments/{project_id}/session_recordings/{recording_id}/sharing/': Endpoints.get_Environments_session_recordings_sharing_list + '/api/environments/{project_id}/sessions/property_definitions/': Endpoints.get_Environments_sessions_property_definitions_retrieve + '/api/environments/{project_id}/sessions/values/': Endpoints.get_Environments_sessions_values_retrieve + '/api/environments/{project_id}/subscriptions/': Endpoints.get_Environments_subscriptions_list + '/api/environments/{project_id}/subscriptions/{id}/': Endpoints.get_Environments_subscriptions_retrieve + '/api/environments/{project_id}/user_interviews/': Endpoints.get_Environments_user_interviews_list + '/api/environments/{project_id}/user_interviews/{id}/': Endpoints.get_Environments_user_interviews_retrieve + '/api/environments/{project_id}/warehouse_saved_queries/': Endpoints.get_Environments_warehouse_saved_queries_list + '/api/environments/{project_id}/warehouse_saved_queries/{id}/': Endpoints.get_Environments_warehouse_saved_queries_retrieve + '/api/environments/{project_id}/warehouse_saved_queries/{id}/activity/': Endpoints.get_Environments_warehouse_saved_queries_activity_retrieve + '/api/environments/{project_id}/warehouse_tables/': Endpoints.get_Environments_warehouse_tables_list + '/api/environments/{project_id}/warehouse_tables/{id}/': Endpoints.get_Environments_warehouse_tables_retrieve + '/api/environments/{project_id}/web_vitals/': Endpoints.get_Environments_web_vitals_retrieve + '/api/organizations/': Endpoints.get_List + '/api/organizations/{id}/': Endpoints.get_Retrieve + '/api/organizations/{organization_id}/batch_exports/': Endpoints.get_Batch_exports_list + '/api/organizations/{organization_id}/batch_exports/{id}/': Endpoints.get_Batch_exports_retrieve + '/api/organizations/{organization_id}/batch_exports/{id}/logs/': Endpoints.get_Batch_exports_logs_retrieve + '/api/organizations/{organization_id}/batch_exports/test/': Endpoints.get_Batch_exports_test_retrieve + '/api/organizations/{organization_id}/domains/': Endpoints.get_Domains_list + '/api/organizations/{organization_id}/domains/{id}/': Endpoints.get_Domains_retrieve + '/api/organizations/{organization_id}/invites/': Endpoints.get_Invites_list + '/api/organizations/{organization_id}/members/': Endpoints.get_Members_list + '/api/organizations/{organization_id}/members/{user__uuid}/scoped_api_keys/': Endpoints.get_Members_scoped_api_keys_retrieve + '/api/organizations/{organization_id}/projects/': Endpoints.get_List_2 + '/api/organizations/{organization_id}/projects/{id}/': Endpoints.get_Retrieve_2 + '/api/organizations/{organization_id}/projects/{id}/activity/': Endpoints.get_Activity_retrieve + '/api/organizations/{organization_id}/projects/{id}/is_generating_demo_data/': Endpoints.get_Is_generating_demo_data_retrieve + '/api/organizations/{organization_id}/proxy_records/': Endpoints.get_Proxy_records_list + '/api/organizations/{organization_id}/proxy_records/{id}/': Endpoints.get_Proxy_records_retrieve + '/api/organizations/{organization_id}/roles/': Endpoints.get_Roles_list + '/api/organizations/{organization_id}/roles/{id}/': Endpoints.get_Roles_retrieve + '/api/organizations/{organization_id}/roles/{role_id}/role_memberships/': Endpoints.get_Roles_role_memberships_list + '/api/projects/{project_id}/actions/': Endpoints.get_Actions_list + '/api/projects/{project_id}/actions/{id}/': Endpoints.get_Actions_retrieve + '/api/projects/{project_id}/activity_log/': Endpoints.get_Activity_log_list + '/api/projects/{project_id}/annotations/': Endpoints.get_Annotations_list + '/api/projects/{project_id}/annotations/{id}/': Endpoints.get_Annotations_retrieve + '/api/projects/{project_id}/app_metrics/{id}/': Endpoints.get_App_metrics_retrieve + '/api/projects/{project_id}/app_metrics/{id}/error_details/': Endpoints.get_App_metrics_error_details_retrieve + '/api/projects/{project_id}/app_metrics/{plugin_config_id}/historical_exports/': Endpoints.get_App_metrics_historical_exports_retrieve + '/api/projects/{project_id}/app_metrics/{plugin_config_id}/historical_exports/{id}/': Endpoints.get_App_metrics_historical_exports_retrieve_2 + '/api/projects/{project_id}/batch_exports/': Endpoints.get_Batch_exports_list_2 + '/api/projects/{project_id}/batch_exports/{batch_export_id}/backfills/': Endpoints.get_Batch_exports_backfills_list + '/api/projects/{project_id}/batch_exports/{batch_export_id}/backfills/{id}/': Endpoints.get_Batch_exports_backfills_retrieve + '/api/projects/{project_id}/batch_exports/{batch_export_id}/runs/': Endpoints.get_Batch_exports_runs_list + '/api/projects/{project_id}/batch_exports/{batch_export_id}/runs/{id}/': Endpoints.get_Batch_exports_runs_retrieve + '/api/projects/{project_id}/batch_exports/{batch_export_id}/runs/{id}/logs/': Endpoints.get_Batch_exports_runs_logs_retrieve + '/api/projects/{project_id}/batch_exports/{id}/': Endpoints.get_Batch_exports_retrieve_2 + '/api/projects/{project_id}/batch_exports/{id}/logs/': Endpoints.get_Batch_exports_logs_retrieve_2 + '/api/projects/{project_id}/batch_exports/test/': Endpoints.get_Batch_exports_test_retrieve_2 + '/api/projects/{project_id}/cohorts/': Endpoints.get_Cohorts_list + '/api/projects/{project_id}/cohorts/{id}/': Endpoints.get_Cohorts_retrieve + '/api/projects/{project_id}/cohorts/{id}/activity/': Endpoints.get_Cohorts_activity_retrieve_2 + '/api/projects/{project_id}/cohorts/{id}/duplicate_as_static_cohort/': Endpoints.get_Cohorts_duplicate_as_static_cohort_retrieve + '/api/projects/{project_id}/cohorts/{id}/persons/': Endpoints.get_Cohorts_persons_retrieve + '/api/projects/{project_id}/cohorts/activity/': Endpoints.get_Cohorts_activity_retrieve + '/api/projects/{project_id}/dashboard_templates/': Endpoints.get_Dashboard_templates_list + '/api/projects/{project_id}/dashboard_templates/{id}/': Endpoints.get_Dashboard_templates_retrieve + '/api/projects/{project_id}/dashboard_templates/json_schema/': Endpoints.get_Dashboard_templates_json_schema_retrieve + '/api/projects/{project_id}/dashboards/': Endpoints.get_Dashboards_list + '/api/projects/{project_id}/dashboards/{dashboard_id}/collaborators/': Endpoints.get_Dashboards_collaborators_list + '/api/projects/{project_id}/dashboards/{dashboard_id}/sharing/': Endpoints.get_Dashboards_sharing_list + '/api/projects/{project_id}/dashboards/{id}/': Endpoints.get_Dashboards_retrieve + '/api/projects/{project_id}/dashboards/{id}/stream_tiles/': Endpoints.get_Dashboards_stream_tiles_retrieve + '/api/projects/{project_id}/early_access_feature/': Endpoints.get_Early_access_feature_list + '/api/projects/{project_id}/early_access_feature/{id}/': Endpoints.get_Early_access_feature_retrieve + '/api/projects/{project_id}/environments/': Endpoints.get_Environments_list + '/api/projects/{project_id}/environments/{id}/': Endpoints.get_Environments_retrieve + '/api/projects/{project_id}/environments/{id}/activity/': Endpoints.get_Environments_activity_retrieve + '/api/projects/{project_id}/environments/{id}/event_ingestion_restrictions/': Endpoints.get_Environments_event_ingestion_restrictions_retrieve + '/api/projects/{project_id}/environments/{id}/is_generating_demo_data/': Endpoints.get_Environments_is_generating_demo_data_retrieve + '/api/projects/{project_id}/event_definitions/': Endpoints.get_Event_definitions_retrieve + '/api/projects/{project_id}/event_definitions/{id}/': Endpoints.get_Event_definitions_retrieve_2 + '/api/projects/{project_id}/event_definitions/{id}/metrics/': Endpoints.get_Event_definitions_metrics_retrieve + '/api/projects/{project_id}/events/': Endpoints.get_Events_list + '/api/projects/{project_id}/events/{id}/': Endpoints.get_Events_retrieve + '/api/projects/{project_id}/events/values/': Endpoints.get_Events_values_retrieve + '/api/projects/{project_id}/experiment_holdouts/': Endpoints.get_Experiment_holdouts_list + '/api/projects/{project_id}/experiment_holdouts/{id}/': Endpoints.get_Experiment_holdouts_retrieve + '/api/projects/{project_id}/experiment_saved_metrics/': Endpoints.get_Experiment_saved_metrics_list + '/api/projects/{project_id}/experiment_saved_metrics/{id}/': Endpoints.get_Experiment_saved_metrics_retrieve + '/api/projects/{project_id}/experiments/': Endpoints.get_Experiments_list + '/api/projects/{project_id}/experiments/{id}/': Endpoints.get_Experiments_retrieve + '/api/projects/{project_id}/experiments/requires_flag_implementation/': Endpoints.get_Experiments_requires_flag_implementation_retrieve + '/api/projects/{project_id}/explicit_members/': Endpoints.get_Explicit_members_list + '/api/projects/{project_id}/explicit_members/{parent_membership__user__uuid}/': Endpoints.get_Explicit_members_retrieve + '/api/projects/{project_id}/exports/': Endpoints.get_Exports_list + '/api/projects/{project_id}/exports/{id}/': Endpoints.get_Exports_retrieve + '/api/projects/{project_id}/exports/{id}/content/': Endpoints.get_Exports_content_retrieve + '/api/projects/{project_id}/feature_flags/': Endpoints.get_Feature_flags_list + '/api/projects/{project_id}/feature_flags/{feature_flag_id}/role_access/': Endpoints.get_Feature_flags_role_access_list + '/api/projects/{project_id}/feature_flags/{feature_flag_id}/role_access/{id}/': Endpoints.get_Feature_flags_role_access_retrieve + '/api/projects/{project_id}/feature_flags/{id}/': Endpoints.get_Feature_flags_retrieve + '/api/projects/{project_id}/feature_flags/{id}/activity/': Endpoints.get_Feature_flags_activity_retrieve_2 + '/api/projects/{project_id}/feature_flags/{id}/remote_config/': Endpoints.get_Feature_flags_remote_config_retrieve + '/api/projects/{project_id}/feature_flags/{id}/status/': Endpoints.get_Feature_flags_status_retrieve + '/api/projects/{project_id}/feature_flags/activity/': Endpoints.get_Feature_flags_activity_retrieve + '/api/projects/{project_id}/feature_flags/evaluation_reasons/': Endpoints.get_Feature_flags_evaluation_reasons_retrieve + '/api/projects/{project_id}/feature_flags/local_evaluation/': Endpoints.get_Feature_flags_local_evaluation_retrieve + '/api/projects/{project_id}/feature_flags/my_flags/': Endpoints.get_Feature_flags_my_flags_retrieve + '/api/projects/{project_id}/file_system/': Endpoints.get_File_system_list + '/api/projects/{project_id}/file_system/{id}/': Endpoints.get_File_system_retrieve + '/api/projects/{project_id}/file_system/unfiled/': Endpoints.get_File_system_unfiled_retrieve + '/api/projects/{project_id}/file_system_shortcut/': Endpoints.get_File_system_shortcut_list + '/api/projects/{project_id}/file_system_shortcut/{id}/': Endpoints.get_File_system_shortcut_retrieve + '/api/projects/{project_id}/flag_value/values/': Endpoints.get_Flag_value_values_retrieve + '/api/projects/{project_id}/groups/': Endpoints.get_Groups_list + '/api/projects/{project_id}/groups/activity/': Endpoints.get_Groups_activity_retrieve + '/api/projects/{project_id}/groups/find/': Endpoints.get_Groups_find_retrieve + '/api/projects/{project_id}/groups/property_definitions/': Endpoints.get_Groups_property_definitions_retrieve + '/api/projects/{project_id}/groups/property_values/': Endpoints.get_Groups_property_values_retrieve + '/api/projects/{project_id}/groups/related/': Endpoints.get_Groups_related_retrieve + '/api/projects/{project_id}/groups_types/': Endpoints.get_Groups_types_list + '/api/projects/{project_id}/groups_types/{group_type_index}/metrics/': Endpoints.get_Groups_types_metrics_list + '/api/projects/{project_id}/groups_types/{group_type_index}/metrics/{id}/': Endpoints.get_Groups_types_metrics_retrieve + '/api/projects/{project_id}/hog_functions/': Endpoints.get_Hog_functions_list + '/api/projects/{project_id}/hog_functions/{id}/': Endpoints.get_Hog_functions_retrieve + '/api/projects/{project_id}/hog_functions/{id}/logs/': Endpoints.get_Hog_functions_logs_retrieve + '/api/projects/{project_id}/hog_functions/{id}/metrics/': Endpoints.get_Hog_functions_metrics_retrieve + '/api/projects/{project_id}/hog_functions/{id}/metrics/totals/': Endpoints.get_Hog_functions_metrics_totals_retrieve + '/api/projects/{project_id}/hog_functions/icon/': Endpoints.get_Hog_functions_icon_retrieve + '/api/projects/{project_id}/hog_functions/icons/': Endpoints.get_Hog_functions_icons_retrieve + '/api/projects/{project_id}/insights/': Endpoints.get_Insights_list + '/api/projects/{project_id}/insights/{insight_id}/sharing/': Endpoints.get_Insights_sharing_list + '/api/projects/{project_id}/insights/{id}/': Endpoints.get_Insights_retrieve + '/api/projects/{project_id}/insights/{id}/activity/': Endpoints.get_Insights_activity_retrieve_2 + '/api/projects/{project_id}/insights/activity/': Endpoints.get_Insights_activity_retrieve + '/api/projects/{project_id}/insights/my_last_viewed/': Endpoints.get_Insights_my_last_viewed_retrieve + '/api/projects/{project_id}/logs/attributes/': Endpoints.get_Logs_attributes_retrieve + '/api/projects/{project_id}/logs/values/': Endpoints.get_Logs_values_retrieve + '/api/projects/{project_id}/notebooks/': Endpoints.get_Notebooks_list + '/api/projects/{project_id}/notebooks/{short_id}/': Endpoints.get_Notebooks_retrieve + '/api/projects/{project_id}/notebooks/{short_id}/activity/': Endpoints.get_Notebooks_activity_retrieve_2 + '/api/projects/{project_id}/notebooks/activity/': Endpoints.get_Notebooks_activity_retrieve + '/api/projects/{project_id}/notebooks/recording_comments/': Endpoints.get_Notebooks_recording_comments_retrieve + '/api/projects/{project_id}/persisted_folder/': Endpoints.get_Persisted_folder_list + '/api/projects/{project_id}/persisted_folder/{id}/': Endpoints.get_Persisted_folder_retrieve + '/api/projects/{project_id}/persons/': Endpoints.get_Persons_list + '/api/projects/{project_id}/persons/{id}/': Endpoints.get_Persons_retrieve + '/api/projects/{project_id}/persons/{id}/activity/': Endpoints.get_Persons_activity_retrieve_2 + '/api/projects/{project_id}/persons/{id}/properties_timeline/': Endpoints.get_Persons_properties_timeline_retrieve + '/api/projects/{project_id}/persons/activity/': Endpoints.get_Persons_activity_retrieve + '/api/projects/{project_id}/persons/cohorts/': Endpoints.get_Persons_cohorts_retrieve + '/api/projects/{project_id}/persons/funnel/': Endpoints.get_Persons_funnel_retrieve + '/api/projects/{project_id}/persons/funnel/correlation/': Endpoints.get_Persons_funnel_correlation_retrieve + '/api/projects/{project_id}/persons/lifecycle/': Endpoints.get_Persons_lifecycle_retrieve + '/api/projects/{project_id}/persons/stickiness/': Endpoints.get_Persons_stickiness_retrieve + '/api/projects/{project_id}/persons/trends/': Endpoints.get_Persons_trends_retrieve + '/api/projects/{project_id}/persons/values/': Endpoints.get_Persons_values_retrieve + '/api/projects/{project_id}/plugin_configs/{plugin_config_id}/logs/': Endpoints.get_Plugin_configs_logs_list + '/api/projects/{project_id}/property_definitions/': Endpoints.get_Property_definitions_list + '/api/projects/{project_id}/property_definitions/{id}/': Endpoints.get_Property_definitions_retrieve + '/api/projects/{project_id}/property_definitions/seen_together/': Endpoints.get_Property_definitions_seen_together_retrieve + '/api/projects/{project_id}/query/{id}/': Endpoints.get_Query_retrieve + '/api/projects/{project_id}/query/{id}/log/': Endpoints.get_Query_log_retrieve + '/api/projects/{project_id}/query/draft_sql/': Endpoints.get_Query_draft_sql_retrieve + '/api/projects/{project_id}/session_recording_playlists/': Endpoints.get_Session_recording_playlists_list + '/api/projects/{project_id}/session_recording_playlists/{short_id}/': Endpoints.get_Session_recording_playlists_retrieve + '/api/projects/{project_id}/session_recording_playlists/{short_id}/recordings/': Endpoints.get_Session_recording_playlists_recordings_retrieve + '/api/projects/{project_id}/session_recordings/': Endpoints.get_Session_recordings_list + '/api/projects/{project_id}/session_recordings/{id}/': Endpoints.get_Session_recordings_retrieve + '/api/projects/{project_id}/session_recordings/{recording_id}/sharing/': Endpoints.get_Session_recordings_sharing_list + '/api/projects/{project_id}/sessions/property_definitions/': Endpoints.get_Sessions_property_definitions_retrieve + '/api/projects/{project_id}/sessions/values/': Endpoints.get_Sessions_values_retrieve + '/api/projects/{project_id}/subscriptions/': Endpoints.get_Subscriptions_list + '/api/projects/{project_id}/subscriptions/{id}/': Endpoints.get_Subscriptions_retrieve + '/api/projects/{project_id}/surveys/': Endpoints.get_Surveys_list + '/api/projects/{project_id}/surveys/{id}/': Endpoints.get_Surveys_retrieve + '/api/projects/{project_id}/surveys/{id}/activity/': Endpoints.get_Surveys_activity_retrieve_2 + '/api/projects/{project_id}/surveys/{id}/stats/': Endpoints.get_Surveys_stats_retrieve_2 + '/api/projects/{project_id}/surveys/activity/': Endpoints.get_Surveys_activity_retrieve + '/api/projects/{project_id}/surveys/responses_count/': Endpoints.get_Surveys_responses_count_retrieve + '/api/projects/{project_id}/surveys/stats/': Endpoints.get_Surveys_stats_retrieve + '/api/projects/{project_id}/warehouse_saved_queries/': Endpoints.get_Warehouse_saved_queries_list + '/api/projects/{project_id}/warehouse_saved_queries/{id}/': Endpoints.get_Warehouse_saved_queries_retrieve + '/api/projects/{project_id}/warehouse_saved_queries/{id}/activity/': Endpoints.get_Warehouse_saved_queries_activity_retrieve + '/api/projects/{project_id}/warehouse_tables/': Endpoints.get_Warehouse_tables_list + '/api/projects/{project_id}/warehouse_tables/{id}/': Endpoints.get_Warehouse_tables_retrieve + '/api/projects/{project_id}/web_analytics/breakdown/': Endpoints.get_Web_analytics_breakdown_retrieve + '/api/projects/{project_id}/web_analytics/overview/': Endpoints.get_Web_analytics_overview_retrieve + '/api/projects/{project_id}/web_experiments/': Endpoints.get_Web_experiments_list + '/api/projects/{project_id}/web_experiments/{id}/': Endpoints.get_Web_experiments_retrieve + '/api/users/': Endpoints.get_Users_list + '/api/users/{uuid}/': Endpoints.get_Users_retrieve + '/api/users/{uuid}/hedgehog_config/': Endpoints.get_Users_hedgehog_config_retrieve + '/api/users/{uuid}/start_2fa_setup/': Endpoints.get_Users_start_2fa_setup_retrieve + '/api/users/{uuid}/two_factor_start_setup/': Endpoints.get_Users_two_factor_start_setup_retrieve + '/api/users/{uuid}/two_factor_status/': Endpoints.get_Users_two_factor_status_retrieve + } + post: { + '/api/environments/{project_id}/batch_exports/': Endpoints.post_Environments_batch_exports_create + '/api/environments/{project_id}/batch_exports/{batch_export_id}/backfills/': Endpoints.post_Environments_batch_exports_backfills_create + '/api/environments/{project_id}/batch_exports/{batch_export_id}/backfills/{id}/cancel/': Endpoints.post_Environments_batch_exports_backfills_cancel_create + '/api/environments/{project_id}/batch_exports/{batch_export_id}/runs/{id}/cancel/': Endpoints.post_Environments_batch_exports_runs_cancel_create + '/api/environments/{project_id}/batch_exports/{batch_export_id}/runs/{id}/retry/': Endpoints.post_Environments_batch_exports_runs_retry_create + '/api/environments/{project_id}/batch_exports/{id}/backfill/': Endpoints.post_Environments_batch_exports_backfill_create + '/api/environments/{project_id}/batch_exports/{id}/pause/': Endpoints.post_Environments_batch_exports_pause_create + '/api/environments/{project_id}/batch_exports/{id}/run_test_step/': Endpoints.post_Environments_batch_exports_run_test_step_create + '/api/environments/{project_id}/batch_exports/{id}/unpause/': Endpoints.post_Environments_batch_exports_unpause_create + '/api/environments/{project_id}/batch_exports/run_test_step_new/': Endpoints.post_Environments_batch_exports_run_test_step_new_create + '/api/environments/{project_id}/dashboards/': Endpoints.post_Environments_dashboards_create + '/api/environments/{project_id}/dashboards/{dashboard_id}/collaborators/': Endpoints.post_Environments_dashboards_collaborators_create + '/api/environments/{project_id}/dashboards/{dashboard_id}/sharing/passwords/': Endpoints.post_Environments_dashboards_sharing_passwords_create + '/api/environments/{project_id}/dashboards/{dashboard_id}/sharing/refresh/': Endpoints.post_Environments_dashboards_sharing_refresh_create + '/api/environments/{project_id}/dashboards/create_from_template_json/': Endpoints.post_Environments_dashboards_create_from_template_json_create + '/api/environments/{project_id}/error_tracking/assignment_rules/': Endpoints.post_Environments_error_tracking_assignment_rules_create + '/api/environments/{project_id}/error_tracking/grouping_rules/': Endpoints.post_Environments_error_tracking_grouping_rules_create + '/api/environments/{project_id}/error_tracking/releases/': Endpoints.post_Environments_error_tracking_releases_create + '/api/environments/{project_id}/error_tracking/suppression_rules/': Endpoints.post_Environments_error_tracking_suppression_rules_create + '/api/environments/{project_id}/error_tracking/symbol_sets/': Endpoints.post_Environments_error_tracking_symbol_sets_create + '/api/environments/{project_id}/error_tracking/symbol_sets/bulk_finish_upload/': Endpoints.post_Environments_error_tracking_symbol_sets_bulk_finish_upload_create + '/api/environments/{project_id}/error_tracking/symbol_sets/bulk_start_upload/': Endpoints.post_Environments_error_tracking_symbol_sets_bulk_start_upload_create + '/api/environments/{project_id}/error_tracking/symbol_sets/start_upload/': Endpoints.post_Environments_error_tracking_symbol_sets_start_upload_create + '/api/environments/{project_id}/explicit_members/': Endpoints.post_Environments_explicit_members_create + '/api/environments/{project_id}/exports/': Endpoints.post_Environments_exports_create + '/api/environments/{project_id}/file_system/': Endpoints.post_Environments_file_system_create + '/api/environments/{project_id}/file_system/{id}/count/': Endpoints.post_Environments_file_system_count_create + '/api/environments/{project_id}/file_system/{id}/link/': Endpoints.post_Environments_file_system_link_create + '/api/environments/{project_id}/file_system/{id}/move/': Endpoints.post_Environments_file_system_move_create + '/api/environments/{project_id}/file_system/count_by_path/': Endpoints.post_Environments_file_system_count_by_path_create + '/api/environments/{project_id}/file_system_shortcut/': Endpoints.post_Environments_file_system_shortcut_create + '/api/environments/{project_id}/groups/': Endpoints.post_Environments_groups_create + '/api/environments/{project_id}/groups/delete_property/': Endpoints.post_Environments_groups_delete_property_create + '/api/environments/{project_id}/groups/update_property/': Endpoints.post_Environments_groups_update_property_create + '/api/environments/{project_id}/hog_functions/': Endpoints.post_Environments_hog_functions_create + '/api/environments/{project_id}/hog_functions/{id}/broadcast/': Endpoints.post_Environments_hog_functions_broadcast_create + '/api/environments/{project_id}/hog_functions/{id}/invocations/': Endpoints.post_Environments_hog_functions_invocations_create + '/api/environments/{project_id}/insights/': Endpoints.post_Environments_insights_create + '/api/environments/{project_id}/insights/{insight_id}/sharing/passwords/': Endpoints.post_Environments_insights_sharing_passwords_create + '/api/environments/{project_id}/insights/{insight_id}/sharing/refresh/': Endpoints.post_Environments_insights_sharing_refresh_create + '/api/environments/{project_id}/insights/{id}/viewed/': Endpoints.post_Environments_insights_viewed_create + '/api/environments/{project_id}/insights/cancel/': Endpoints.post_Environments_insights_cancel_create + '/api/environments/{project_id}/logs/query/': Endpoints.post_Environments_logs_query_create + '/api/environments/{project_id}/logs/sparkline/': Endpoints.post_Environments_logs_sparkline_create + '/api/environments/{project_id}/max_tools/create_and_query_insight/': Endpoints.post_Environments_max_tools_create_and_query_insight_create + '/api/environments/{project_id}/persisted_folder/': Endpoints.post_Environments_persisted_folder_create + '/api/environments/{project_id}/persons/{id}/delete_events/': Endpoints.post_Environments_persons_delete_events_create + '/api/environments/{project_id}/persons/{id}/delete_property/': Endpoints.post_Environments_persons_delete_property_create + '/api/environments/{project_id}/persons/{id}/split/': Endpoints.post_Environments_persons_split_create + '/api/environments/{project_id}/persons/{id}/update_property/': Endpoints.post_Environments_persons_update_property_create + '/api/environments/{project_id}/persons/bulk_delete/': Endpoints.post_Environments_persons_bulk_delete_create + '/api/environments/{project_id}/persons/funnel/': Endpoints.post_Environments_persons_funnel_create + '/api/environments/{project_id}/persons/funnel/correlation/': Endpoints.post_Environments_persons_funnel_correlation_create + '/api/environments/{project_id}/persons/reset_person_distinct_id/': Endpoints.post_Environments_persons_reset_person_distinct_id_create + '/api/environments/{project_id}/query/': Endpoints.post_Environments_query_create + '/api/environments/{project_id}/query/check_auth_for_async/': Endpoints.post_Environments_query_check_auth_for_async_create + '/api/environments/{project_id}/query/upgrade/': Endpoints.post_Environments_query_upgrade_create + '/api/environments/{project_id}/session_recording_playlists/': Endpoints.post_Environments_session_recording_playlists_create + '/api/environments/{project_id}/session_recording_playlists/{short_id}/recordings/{session_recording_id}/': Endpoints.post_Environments_session_recording_playlists_recordings_create + '/api/environments/{project_id}/session_recordings/{recording_id}/sharing/passwords/': Endpoints.post_Environments_session_recordings_sharing_passwords_create + '/api/environments/{project_id}/session_recordings/{recording_id}/sharing/refresh/': Endpoints.post_Environments_session_recordings_sharing_refresh_create + '/api/environments/{project_id}/session_summaries/create_session_summaries/': Endpoints.post_Create_session_summaries + '/api/environments/{project_id}/subscriptions/': Endpoints.post_Environments_subscriptions_create + '/api/environments/{project_id}/user_interviews/': Endpoints.post_Environments_user_interviews_create + '/api/environments/{project_id}/warehouse_saved_queries/': Endpoints.post_Environments_warehouse_saved_queries_create + '/api/environments/{project_id}/warehouse_saved_queries/{id}/ancestors/': Endpoints.post_Environments_warehouse_saved_queries_ancestors_create + '/api/environments/{project_id}/warehouse_saved_queries/{id}/cancel/': Endpoints.post_Environments_warehouse_saved_queries_cancel_create + '/api/environments/{project_id}/warehouse_saved_queries/{id}/descendants/': Endpoints.post_Environments_warehouse_saved_queries_descendants_create + '/api/environments/{project_id}/warehouse_saved_queries/{id}/revert_materialization/': Endpoints.post_Environments_warehouse_saved_queries_revert_materialization_create + '/api/environments/{project_id}/warehouse_saved_queries/{id}/run/': Endpoints.post_Environments_warehouse_saved_queries_run_create + '/api/environments/{project_id}/warehouse_tables/': Endpoints.post_Environments_warehouse_tables_create + '/api/environments/{project_id}/warehouse_tables/{id}/refresh_schema/': Endpoints.post_Environments_warehouse_tables_refresh_schema_create + '/api/environments/{project_id}/warehouse_tables/{id}/update_schema/': Endpoints.post_Environments_warehouse_tables_update_schema_create + '/api/environments/{project_id}/warehouse_tables/file/': Endpoints.post_Environments_warehouse_tables_file_create + '/api/organizations/': Endpoints.post_Create + '/api/organizations/{id}/environments_rollback/': Endpoints.post_Environments_rollback_create + '/api/organizations/{organization_id}/batch_exports/': Endpoints.post_Batch_exports_create + '/api/organizations/{organization_id}/batch_exports/{id}/backfill/': Endpoints.post_Batch_exports_backfill_create + '/api/organizations/{organization_id}/batch_exports/{id}/pause/': Endpoints.post_Batch_exports_pause_create + '/api/organizations/{organization_id}/batch_exports/{id}/run_test_step/': Endpoints.post_Batch_exports_run_test_step_create + '/api/organizations/{organization_id}/batch_exports/{id}/unpause/': Endpoints.post_Batch_exports_unpause_create + '/api/organizations/{organization_id}/batch_exports/run_test_step_new/': Endpoints.post_Batch_exports_run_test_step_new_create + '/api/organizations/{organization_id}/domains/': Endpoints.post_Domains_create + '/api/organizations/{organization_id}/domains/{id}/verify/': Endpoints.post_Domains_verify_create + '/api/organizations/{organization_id}/invites/': Endpoints.post_Invites_create + '/api/organizations/{organization_id}/invites/bulk/': Endpoints.post_Invites_bulk_create + '/api/organizations/{organization_id}/projects/': Endpoints.post_Create_2 + '/api/organizations/{organization_id}/projects/{id}/change_organization/': Endpoints.post_Change_organization_create + '/api/organizations/{organization_id}/proxy_records/': Endpoints.post_Proxy_records_create + '/api/organizations/{organization_id}/roles/': Endpoints.post_Roles_create + '/api/organizations/{organization_id}/roles/{role_id}/role_memberships/': Endpoints.post_Roles_role_memberships_create + '/api/projects/{project_id}/actions/': Endpoints.post_Actions_create + '/api/projects/{project_id}/annotations/': Endpoints.post_Annotations_create + '/api/projects/{project_id}/batch_exports/': Endpoints.post_Batch_exports_create_2 + '/api/projects/{project_id}/batch_exports/{batch_export_id}/backfills/': Endpoints.post_Batch_exports_backfills_create + '/api/projects/{project_id}/batch_exports/{batch_export_id}/backfills/{id}/cancel/': Endpoints.post_Batch_exports_backfills_cancel_create + '/api/projects/{project_id}/batch_exports/{batch_export_id}/runs/{id}/cancel/': Endpoints.post_Batch_exports_runs_cancel_create + '/api/projects/{project_id}/batch_exports/{batch_export_id}/runs/{id}/retry/': Endpoints.post_Batch_exports_runs_retry_create + '/api/projects/{project_id}/batch_exports/{id}/backfill/': Endpoints.post_Batch_exports_backfill_create_2 + '/api/projects/{project_id}/batch_exports/{id}/pause/': Endpoints.post_Batch_exports_pause_create_2 + '/api/projects/{project_id}/batch_exports/{id}/run_test_step/': Endpoints.post_Batch_exports_run_test_step_create_2 + '/api/projects/{project_id}/batch_exports/{id}/unpause/': Endpoints.post_Batch_exports_unpause_create_2 + '/api/projects/{project_id}/batch_exports/run_test_step_new/': Endpoints.post_Batch_exports_run_test_step_new_create_2 + '/api/projects/{project_id}/cohorts/': Endpoints.post_Cohorts_create + '/api/projects/{project_id}/dashboard_templates/': Endpoints.post_Dashboard_templates_create + '/api/projects/{project_id}/dashboards/': Endpoints.post_Dashboards_create + '/api/projects/{project_id}/dashboards/{dashboard_id}/collaborators/': Endpoints.post_Dashboards_collaborators_create + '/api/projects/{project_id}/dashboards/{dashboard_id}/sharing/passwords/': Endpoints.post_Dashboards_sharing_passwords_create + '/api/projects/{project_id}/dashboards/{dashboard_id}/sharing/refresh/': Endpoints.post_Dashboards_sharing_refresh_create + '/api/projects/{project_id}/dashboards/create_from_template_json/': Endpoints.post_Dashboards_create_from_template_json_create + '/api/projects/{project_id}/early_access_feature/': Endpoints.post_Early_access_feature_create + '/api/projects/{project_id}/environments/': Endpoints.post_Environments_create + '/api/projects/{project_id}/experiment_holdouts/': Endpoints.post_Experiment_holdouts_create + '/api/projects/{project_id}/experiment_saved_metrics/': Endpoints.post_Experiment_saved_metrics_create + '/api/projects/{project_id}/experiments/': Endpoints.post_Experiments_create + '/api/projects/{project_id}/experiments/{id}/create_exposure_cohort_for_experiment/': Endpoints.post_Experiments_create_exposure_cohort_for_experiment_create + '/api/projects/{project_id}/experiments/{id}/duplicate/': Endpoints.post_Experiments_duplicate_create + '/api/projects/{project_id}/explicit_members/': Endpoints.post_Explicit_members_create + '/api/projects/{project_id}/exports/': Endpoints.post_Exports_create + '/api/projects/{project_id}/feature_flags/': Endpoints.post_Feature_flags_create + '/api/projects/{project_id}/feature_flags/{feature_flag_id}/role_access/': Endpoints.post_Feature_flags_role_access_create + '/api/projects/{project_id}/feature_flags/{id}/create_static_cohort_for_flag/': Endpoints.post_Feature_flags_create_static_cohort_for_flag_create + '/api/projects/{project_id}/feature_flags/{id}/dashboard/': Endpoints.post_Feature_flags_dashboard_create + '/api/projects/{project_id}/feature_flags/{id}/enrich_usage_dashboard/': Endpoints.post_Feature_flags_enrich_usage_dashboard_create + '/api/projects/{project_id}/feature_flags/bulk_keys/': Endpoints.post_Feature_flags_bulk_keys_create + '/api/projects/{project_id}/feature_flags/user_blast_radius/': Endpoints.post_Feature_flags_user_blast_radius_create + '/api/projects/{project_id}/file_system/': Endpoints.post_File_system_create + '/api/projects/{project_id}/file_system/{id}/count/': Endpoints.post_File_system_count_create + '/api/projects/{project_id}/file_system/{id}/link/': Endpoints.post_File_system_link_create + '/api/projects/{project_id}/file_system/{id}/move/': Endpoints.post_File_system_move_create + '/api/projects/{project_id}/file_system/count_by_path/': Endpoints.post_File_system_count_by_path_create + '/api/projects/{project_id}/file_system_shortcut/': Endpoints.post_File_system_shortcut_create + '/api/projects/{project_id}/groups/': Endpoints.post_Groups_create + '/api/projects/{project_id}/groups/delete_property/': Endpoints.post_Groups_delete_property_create + '/api/projects/{project_id}/groups/update_property/': Endpoints.post_Groups_update_property_create + '/api/projects/{project_id}/groups_types/{group_type_index}/metrics/': Endpoints.post_Groups_types_metrics_create + '/api/projects/{project_id}/hog_functions/': Endpoints.post_Hog_functions_create + '/api/projects/{project_id}/hog_functions/{id}/broadcast/': Endpoints.post_Hog_functions_broadcast_create + '/api/projects/{project_id}/hog_functions/{id}/invocations/': Endpoints.post_Hog_functions_invocations_create + '/api/projects/{project_id}/insights/': Endpoints.post_Insights_create + '/api/projects/{project_id}/insights/{insight_id}/sharing/passwords/': Endpoints.post_Insights_sharing_passwords_create + '/api/projects/{project_id}/insights/{insight_id}/sharing/refresh/': Endpoints.post_Insights_sharing_refresh_create + '/api/projects/{project_id}/insights/{id}/viewed/': Endpoints.post_Insights_viewed_create + '/api/projects/{project_id}/insights/cancel/': Endpoints.post_Insights_cancel_create + '/api/projects/{project_id}/logs/query/': Endpoints.post_Logs_query_create + '/api/projects/{project_id}/logs/sparkline/': Endpoints.post_Logs_sparkline_create + '/api/projects/{project_id}/notebooks/': Endpoints.post_Notebooks_create + '/api/projects/{project_id}/persisted_folder/': Endpoints.post_Persisted_folder_create + '/api/projects/{project_id}/persons/{id}/delete_events/': Endpoints.post_Persons_delete_events_create + '/api/projects/{project_id}/persons/{id}/delete_property/': Endpoints.post_Persons_delete_property_create + '/api/projects/{project_id}/persons/{id}/split/': Endpoints.post_Persons_split_create + '/api/projects/{project_id}/persons/{id}/update_property/': Endpoints.post_Persons_update_property_create + '/api/projects/{project_id}/persons/bulk_delete/': Endpoints.post_Persons_bulk_delete_create + '/api/projects/{project_id}/persons/funnel/': Endpoints.post_Persons_funnel_create + '/api/projects/{project_id}/persons/funnel/correlation/': Endpoints.post_Persons_funnel_correlation_create + '/api/projects/{project_id}/persons/reset_person_distinct_id/': Endpoints.post_Persons_reset_person_distinct_id_create + '/api/projects/{project_id}/query/': Endpoints.post_Query_create + '/api/projects/{project_id}/query/check_auth_for_async/': Endpoints.post_Query_check_auth_for_async_create + '/api/projects/{project_id}/query/upgrade/': Endpoints.post_Query_upgrade_create + '/api/projects/{project_id}/session_recording_playlists/': Endpoints.post_Session_recording_playlists_create + '/api/projects/{project_id}/session_recording_playlists/{short_id}/recordings/{session_recording_id}/': Endpoints.post_Session_recording_playlists_recordings_create + '/api/projects/{project_id}/session_recordings/{recording_id}/sharing/passwords/': Endpoints.post_Session_recordings_sharing_passwords_create + '/api/projects/{project_id}/session_recordings/{recording_id}/sharing/refresh/': Endpoints.post_Session_recordings_sharing_refresh_create + '/api/projects/{project_id}/subscriptions/': Endpoints.post_Subscriptions_create + '/api/projects/{project_id}/surveys/': Endpoints.post_Surveys_create + '/api/projects/{project_id}/surveys/{id}/summarize_responses/': Endpoints.post_Surveys_summarize_responses_create + '/api/projects/{project_id}/warehouse_saved_queries/': Endpoints.post_Warehouse_saved_queries_create + '/api/projects/{project_id}/warehouse_saved_queries/{id}/ancestors/': Endpoints.post_Warehouse_saved_queries_ancestors_create + '/api/projects/{project_id}/warehouse_saved_queries/{id}/cancel/': Endpoints.post_Warehouse_saved_queries_cancel_create + '/api/projects/{project_id}/warehouse_saved_queries/{id}/descendants/': Endpoints.post_Warehouse_saved_queries_descendants_create + '/api/projects/{project_id}/warehouse_saved_queries/{id}/revert_materialization/': Endpoints.post_Warehouse_saved_queries_revert_materialization_create + '/api/projects/{project_id}/warehouse_saved_queries/{id}/run/': Endpoints.post_Warehouse_saved_queries_run_create + '/api/projects/{project_id}/warehouse_tables/': Endpoints.post_Warehouse_tables_create + '/api/projects/{project_id}/warehouse_tables/{id}/refresh_schema/': Endpoints.post_Warehouse_tables_refresh_schema_create + '/api/projects/{project_id}/warehouse_tables/{id}/update_schema/': Endpoints.post_Warehouse_tables_update_schema_create + '/api/projects/{project_id}/warehouse_tables/file/': Endpoints.post_Warehouse_tables_file_create + '/api/projects/{project_id}/web_experiments/': Endpoints.post_Web_experiments_create + '/api/users/{uuid}/scene_personalisation/': Endpoints.post_Users_scene_personalisation_create + '/api/users/{uuid}/two_factor_backup_codes/': Endpoints.post_Users_two_factor_backup_codes_create + '/api/users/{uuid}/two_factor_disable/': Endpoints.post_Users_two_factor_disable_create + '/api/users/{uuid}/two_factor_validate/': Endpoints.post_Users_two_factor_validate_create + '/api/users/{uuid}/validate_2fa/': Endpoints.post_Users_validate_2fa_create + '/api/users/request_email_verification/': Endpoints.post_Users_request_email_verification_create + '/api/users/verify_email/': Endpoints.post_Users_verify_email_create + } + put: { + '/api/environments/{project_id}/batch_exports/{id}/': Endpoints.put_Environments_batch_exports_update + '/api/environments/{project_id}/dashboards/{id}/': Endpoints.put_Environments_dashboards_update + '/api/environments/{project_id}/error_tracking/assignment_rules/{id}/': Endpoints.put_Environments_error_tracking_assignment_rules_update + '/api/environments/{project_id}/error_tracking/grouping_rules/{id}/': Endpoints.put_Environments_error_tracking_grouping_rules_update + '/api/environments/{project_id}/error_tracking/releases/{id}/': Endpoints.put_Environments_error_tracking_releases_update + '/api/environments/{project_id}/error_tracking/suppression_rules/{id}/': Endpoints.put_Environments_error_tracking_suppression_rules_update + '/api/environments/{project_id}/error_tracking/symbol_sets/{id}/': Endpoints.put_Environments_error_tracking_symbol_sets_update + '/api/environments/{project_id}/error_tracking/symbol_sets/{id}/finish_upload/': Endpoints.put_Environments_error_tracking_symbol_sets_finish_upload_update + '/api/environments/{project_id}/explicit_members/{parent_membership__user__uuid}/': Endpoints.put_Environments_explicit_members_update + '/api/environments/{project_id}/file_system/{id}/': Endpoints.put_Environments_file_system_update + '/api/environments/{project_id}/file_system_shortcut/{id}/': Endpoints.put_Environments_file_system_shortcut_update + '/api/environments/{project_id}/hog_functions/{id}/': Endpoints.put_Environments_hog_functions_update + '/api/environments/{project_id}/insights/{id}/': Endpoints.put_Environments_insights_update + '/api/environments/{project_id}/persisted_folder/{id}/': Endpoints.put_Environments_persisted_folder_update + '/api/environments/{project_id}/persons/{id}/': Endpoints.put_Environments_persons_update + '/api/environments/{project_id}/session_recording_playlists/{short_id}/': Endpoints.put_Environments_session_recording_playlists_update + '/api/environments/{project_id}/session_recordings/{id}/': Endpoints.put_Environments_session_recordings_update + '/api/environments/{project_id}/subscriptions/{id}/': Endpoints.put_Environments_subscriptions_update + '/api/environments/{project_id}/user_interviews/{id}/': Endpoints.put_Environments_user_interviews_update + '/api/environments/{project_id}/warehouse_saved_queries/{id}/': Endpoints.put_Environments_warehouse_saved_queries_update + '/api/environments/{project_id}/warehouse_tables/{id}/': Endpoints.put_Environments_warehouse_tables_update + '/api/organizations/{id}/': Endpoints.put_Update + '/api/organizations/{organization_id}/batch_exports/{id}/': Endpoints.put_Batch_exports_update + '/api/organizations/{organization_id}/domains/{id}/': Endpoints.put_Domains_update + '/api/organizations/{organization_id}/members/{user__uuid}/': Endpoints.put_Members_update + '/api/organizations/{organization_id}/projects/{id}/': Endpoints.put_Update_2 + '/api/organizations/{organization_id}/proxy_records/{id}/': Endpoints.put_Proxy_records_update + '/api/organizations/{organization_id}/roles/{id}/': Endpoints.put_Roles_update + '/api/projects/{project_id}/actions/{id}/': Endpoints.put_Actions_update + '/api/projects/{project_id}/annotations/{id}/': Endpoints.put_Annotations_update + '/api/projects/{project_id}/batch_exports/{id}/': Endpoints.put_Batch_exports_update_2 + '/api/projects/{project_id}/cohorts/{id}/': Endpoints.put_Cohorts_update + '/api/projects/{project_id}/dashboard_templates/{id}/': Endpoints.put_Dashboard_templates_update + '/api/projects/{project_id}/dashboards/{id}/': Endpoints.put_Dashboards_update + '/api/projects/{project_id}/early_access_feature/{id}/': Endpoints.put_Early_access_feature_update + '/api/projects/{project_id}/environments/{id}/': Endpoints.put_Environments_update + '/api/projects/{project_id}/event_definitions/{id}/': Endpoints.put_Event_definitions_update + '/api/projects/{project_id}/experiment_holdouts/{id}/': Endpoints.put_Experiment_holdouts_update + '/api/projects/{project_id}/experiment_saved_metrics/{id}/': Endpoints.put_Experiment_saved_metrics_update + '/api/projects/{project_id}/experiments/{id}/': Endpoints.put_Experiments_update + '/api/projects/{project_id}/explicit_members/{parent_membership__user__uuid}/': Endpoints.put_Explicit_members_update + '/api/projects/{project_id}/feature_flags/{id}/': Endpoints.put_Feature_flags_update + '/api/projects/{project_id}/file_system/{id}/': Endpoints.put_File_system_update + '/api/projects/{project_id}/file_system_shortcut/{id}/': Endpoints.put_File_system_shortcut_update + '/api/projects/{project_id}/groups_types/{group_type_index}/metrics/{id}/': Endpoints.put_Groups_types_metrics_update + '/api/projects/{project_id}/groups_types/create_detail_dashboard/': Endpoints.put_Groups_types_create_detail_dashboard_update + '/api/projects/{project_id}/groups_types/set_default_columns/': Endpoints.put_Groups_types_set_default_columns_update + '/api/projects/{project_id}/hog_functions/{id}/': Endpoints.put_Hog_functions_update + '/api/projects/{project_id}/insights/{id}/': Endpoints.put_Insights_update + '/api/projects/{project_id}/notebooks/{short_id}/': Endpoints.put_Notebooks_update + '/api/projects/{project_id}/persisted_folder/{id}/': Endpoints.put_Persisted_folder_update + '/api/projects/{project_id}/persons/{id}/': Endpoints.put_Persons_update + '/api/projects/{project_id}/property_definitions/{id}/': Endpoints.put_Property_definitions_update + '/api/projects/{project_id}/session_recording_playlists/{short_id}/': Endpoints.put_Session_recording_playlists_update + '/api/projects/{project_id}/session_recordings/{id}/': Endpoints.put_Session_recordings_update + '/api/projects/{project_id}/subscriptions/{id}/': Endpoints.put_Subscriptions_update + '/api/projects/{project_id}/surveys/{id}/': Endpoints.put_Surveys_update + '/api/projects/{project_id}/warehouse_saved_queries/{id}/': Endpoints.put_Warehouse_saved_queries_update + '/api/projects/{project_id}/warehouse_tables/{id}/': Endpoints.put_Warehouse_tables_update + '/api/projects/{project_id}/web_experiments/{id}/': Endpoints.put_Web_experiments_update + '/api/users/{uuid}/': Endpoints.put_Users_update + } + patch: { + '/api/environments/{project_id}/batch_exports/{id}/': Endpoints.patch_Environments_batch_exports_partial_update + '/api/environments/{project_id}/dashboards/{id}/': Endpoints.patch_Environments_dashboards_partial_update + '/api/environments/{project_id}/dashboards/{id}/move_tile/': Endpoints.patch_Environments_dashboards_move_tile_partial_update + '/api/environments/{project_id}/error_tracking/assignment_rules/{id}/': Endpoints.patch_Environments_error_tracking_assignment_rules_partial_update + '/api/environments/{project_id}/error_tracking/assignment_rules/reorder/': Endpoints.patch_Environments_error_tracking_assignment_rules_reorder_partial_update + '/api/environments/{project_id}/error_tracking/grouping_rules/{id}/': Endpoints.patch_Environments_error_tracking_grouping_rules_partial_update + '/api/environments/{project_id}/error_tracking/grouping_rules/reorder/': Endpoints.patch_Environments_error_tracking_grouping_rules_reorder_partial_update + '/api/environments/{project_id}/error_tracking/releases/{id}/': Endpoints.patch_Environments_error_tracking_releases_partial_update + '/api/environments/{project_id}/error_tracking/suppression_rules/{id}/': Endpoints.patch_Environments_error_tracking_suppression_rules_partial_update + '/api/environments/{project_id}/error_tracking/suppression_rules/reorder/': Endpoints.patch_Environments_error_tracking_suppression_rules_reorder_partial_update + '/api/environments/{project_id}/error_tracking/symbol_sets/{id}/': Endpoints.patch_Environments_error_tracking_symbol_sets_partial_update + '/api/environments/{project_id}/explicit_members/{parent_membership__user__uuid}/': Endpoints.patch_Environments_explicit_members_partial_update + '/api/environments/{project_id}/file_system/{id}/': Endpoints.patch_Environments_file_system_partial_update + '/api/environments/{project_id}/file_system_shortcut/{id}/': Endpoints.patch_Environments_file_system_shortcut_partial_update + '/api/environments/{project_id}/hog_functions/{id}/': Endpoints.patch_Environments_hog_functions_partial_update + '/api/environments/{project_id}/hog_functions/rearrange/': Endpoints.patch_Environments_hog_functions_rearrange_partial_update + '/api/environments/{project_id}/insights/{id}/': Endpoints.patch_Environments_insights_partial_update + '/api/environments/{project_id}/persisted_folder/{id}/': Endpoints.patch_Environments_persisted_folder_partial_update + '/api/environments/{project_id}/persons/{id}/': Endpoints.patch_Environments_persons_partial_update + '/api/environments/{project_id}/session_recording_playlists/{short_id}/': Endpoints.patch_Environments_session_recording_playlists_partial_update + '/api/environments/{project_id}/session_recordings/{id}/': Endpoints.patch_Environments_session_recordings_partial_update + '/api/environments/{project_id}/subscriptions/{id}/': Endpoints.patch_Environments_subscriptions_partial_update + '/api/environments/{project_id}/user_interviews/{id}/': Endpoints.patch_Environments_user_interviews_partial_update + '/api/environments/{project_id}/warehouse_saved_queries/{id}/': Endpoints.patch_Environments_warehouse_saved_queries_partial_update + '/api/environments/{project_id}/warehouse_tables/{id}/': Endpoints.patch_Environments_warehouse_tables_partial_update + '/api/organizations/{id}/': Endpoints.patch_Partial_update + '/api/organizations/{organization_id}/batch_exports/{id}/': Endpoints.patch_Batch_exports_partial_update + '/api/organizations/{organization_id}/domains/{id}/': Endpoints.patch_Domains_partial_update + '/api/organizations/{organization_id}/members/{user__uuid}/': Endpoints.patch_Members_partial_update + '/api/organizations/{organization_id}/projects/{id}/': Endpoints.patch_Partial_update_2 + '/api/organizations/{organization_id}/projects/{id}/add_product_intent/': Endpoints.patch_Add_product_intent_partial_update + '/api/organizations/{organization_id}/projects/{id}/complete_product_onboarding/': Endpoints.patch_Complete_product_onboarding_partial_update + '/api/organizations/{organization_id}/projects/{id}/delete_secret_token_backup/': Endpoints.patch_Delete_secret_token_backup_partial_update + '/api/organizations/{organization_id}/projects/{id}/reset_token/': Endpoints.patch_Reset_token_partial_update + '/api/organizations/{organization_id}/projects/{id}/rotate_secret_token/': Endpoints.patch_Rotate_secret_token_partial_update + '/api/organizations/{organization_id}/proxy_records/{id}/': Endpoints.patch_Proxy_records_partial_update + '/api/organizations/{organization_id}/roles/{id}/': Endpoints.patch_Roles_partial_update + '/api/projects/{project_id}/actions/{id}/': Endpoints.patch_Actions_partial_update + '/api/projects/{project_id}/annotations/{id}/': Endpoints.patch_Annotations_partial_update + '/api/projects/{project_id}/batch_exports/{id}/': Endpoints.patch_Batch_exports_partial_update_2 + '/api/projects/{project_id}/cohorts/{id}/': Endpoints.patch_Cohorts_partial_update + '/api/projects/{project_id}/cohorts/{id}/add_persons_to_static_cohort/': Endpoints.patch_Cohorts_add_persons_to_static_cohort_partial_update + '/api/projects/{project_id}/dashboard_templates/{id}/': Endpoints.patch_Dashboard_templates_partial_update + '/api/projects/{project_id}/dashboards/{id}/': Endpoints.patch_Dashboards_partial_update + '/api/projects/{project_id}/dashboards/{id}/move_tile/': Endpoints.patch_Dashboards_move_tile_partial_update + '/api/projects/{project_id}/early_access_feature/{id}/': Endpoints.patch_Early_access_feature_partial_update + '/api/projects/{project_id}/environments/{id}/': Endpoints.patch_Environments_partial_update + '/api/projects/{project_id}/environments/{id}/add_product_intent/': Endpoints.patch_Environments_add_product_intent_partial_update + '/api/projects/{project_id}/environments/{id}/complete_product_onboarding/': Endpoints.patch_Environments_complete_product_onboarding_partial_update + '/api/projects/{project_id}/environments/{id}/delete_secret_token_backup/': Endpoints.patch_Environments_delete_secret_token_backup_partial_update + '/api/projects/{project_id}/environments/{id}/reset_token/': Endpoints.patch_Environments_reset_token_partial_update + '/api/projects/{project_id}/environments/{id}/rotate_secret_token/': Endpoints.patch_Environments_rotate_secret_token_partial_update + '/api/projects/{project_id}/event_definitions/{id}/': Endpoints.patch_Event_definitions_partial_update + '/api/projects/{project_id}/experiment_holdouts/{id}/': Endpoints.patch_Experiment_holdouts_partial_update + '/api/projects/{project_id}/experiment_saved_metrics/{id}/': Endpoints.patch_Experiment_saved_metrics_partial_update + '/api/projects/{project_id}/experiments/{id}/': Endpoints.patch_Experiments_partial_update + '/api/projects/{project_id}/explicit_members/{parent_membership__user__uuid}/': Endpoints.patch_Explicit_members_partial_update + '/api/projects/{project_id}/feature_flags/{id}/': Endpoints.patch_Feature_flags_partial_update + '/api/projects/{project_id}/file_system/{id}/': Endpoints.patch_File_system_partial_update + '/api/projects/{project_id}/file_system_shortcut/{id}/': Endpoints.patch_File_system_shortcut_partial_update + '/api/projects/{project_id}/groups_types/{group_type_index}/metrics/{id}/': Endpoints.patch_Groups_types_metrics_partial_update + '/api/projects/{project_id}/groups_types/update_metadata/': Endpoints.patch_Groups_types_update_metadata_partial_update + '/api/projects/{project_id}/hog_functions/{id}/': Endpoints.patch_Hog_functions_partial_update + '/api/projects/{project_id}/hog_functions/rearrange/': Endpoints.patch_Hog_functions_rearrange_partial_update + '/api/projects/{project_id}/insights/{id}/': Endpoints.patch_Insights_partial_update + '/api/projects/{project_id}/notebooks/{short_id}/': Endpoints.patch_Notebooks_partial_update + '/api/projects/{project_id}/persisted_folder/{id}/': Endpoints.patch_Persisted_folder_partial_update + '/api/projects/{project_id}/persons/{id}/': Endpoints.patch_Persons_partial_update + '/api/projects/{project_id}/property_definitions/{id}/': Endpoints.patch_Property_definitions_partial_update + '/api/projects/{project_id}/session_recording_playlists/{short_id}/': Endpoints.patch_Session_recording_playlists_partial_update + '/api/projects/{project_id}/session_recordings/{id}/': Endpoints.patch_Session_recordings_partial_update + '/api/projects/{project_id}/subscriptions/{id}/': Endpoints.patch_Subscriptions_partial_update + '/api/projects/{project_id}/surveys/{id}/': Endpoints.patch_Surveys_partial_update + '/api/projects/{project_id}/warehouse_saved_queries/{id}/': Endpoints.patch_Warehouse_saved_queries_partial_update + '/api/projects/{project_id}/warehouse_tables/{id}/': Endpoints.patch_Warehouse_tables_partial_update + '/api/projects/{project_id}/web_experiments/{id}/': Endpoints.patch_Web_experiments_partial_update + '/api/users/{uuid}/': Endpoints.patch_Users_partial_update + '/api/users/{uuid}/hedgehog_config/': Endpoints.patch_Users_hedgehog_config_partial_update + '/api/users/cancel_email_change_request/': Endpoints.patch_Users_cancel_email_change_request_partial_update + } + delete: { + '/api/environments/{project_id}/batch_exports/{id}/': Endpoints.delete_Environments_batch_exports_destroy + '/api/environments/{project_id}/dashboards/{dashboard_id}/collaborators/{user__uuid}/': Endpoints.delete_Environments_dashboards_collaborators_destroy + '/api/environments/{project_id}/dashboards/{dashboard_id}/sharing/passwords/{password_id}/': Endpoints.delete_Environments_dashboards_sharing_passwords_destroy + '/api/environments/{project_id}/dashboards/{id}/': Endpoints.delete_Environments_dashboards_destroy + '/api/environments/{project_id}/error_tracking/assignment_rules/{id}/': Endpoints.delete_Environments_error_tracking_assignment_rules_destroy + '/api/environments/{project_id}/error_tracking/grouping_rules/{id}/': Endpoints.delete_Environments_error_tracking_grouping_rules_destroy + '/api/environments/{project_id}/error_tracking/releases/{id}/': Endpoints.delete_Environments_error_tracking_releases_destroy + '/api/environments/{project_id}/error_tracking/suppression_rules/{id}/': Endpoints.delete_Environments_error_tracking_suppression_rules_destroy + '/api/environments/{project_id}/error_tracking/symbol_sets/{id}/': Endpoints.delete_Environments_error_tracking_symbol_sets_destroy + '/api/environments/{project_id}/explicit_members/{parent_membership__user__uuid}/': Endpoints.delete_Environments_explicit_members_destroy + '/api/environments/{project_id}/file_system/{id}/': Endpoints.delete_Environments_file_system_destroy + '/api/environments/{project_id}/file_system_shortcut/{id}/': Endpoints.delete_Environments_file_system_shortcut_destroy + '/api/environments/{project_id}/hog_functions/{id}/': Endpoints.delete_Environments_hog_functions_destroy + '/api/environments/{project_id}/insights/{insight_id}/sharing/passwords/{password_id}/': Endpoints.delete_Environments_insights_sharing_passwords_destroy + '/api/environments/{project_id}/insights/{id}/': Endpoints.delete_Environments_insights_destroy + '/api/environments/{project_id}/persisted_folder/{id}/': Endpoints.delete_Environments_persisted_folder_destroy + '/api/environments/{project_id}/persons/{id}/': Endpoints.delete_Environments_persons_destroy + '/api/environments/{project_id}/query/{id}/': Endpoints.delete_Environments_query_destroy + '/api/environments/{project_id}/session_recording_playlists/{short_id}/': Endpoints.delete_Environments_session_recording_playlists_destroy + '/api/environments/{project_id}/session_recording_playlists/{short_id}/recordings/{session_recording_id}/': Endpoints.delete_Environments_session_recording_playlists_recordings_destroy + '/api/environments/{project_id}/session_recordings/{id}/': Endpoints.delete_Environments_session_recordings_destroy + '/api/environments/{project_id}/session_recordings/{recording_id}/sharing/passwords/{password_id}/': Endpoints.delete_Environments_session_recordings_sharing_passwords_destroy + '/api/environments/{project_id}/subscriptions/{id}/': Endpoints.delete_Environments_subscriptions_destroy + '/api/environments/{project_id}/user_interviews/{id}/': Endpoints.delete_Environments_user_interviews_destroy + '/api/environments/{project_id}/warehouse_saved_queries/{id}/': Endpoints.delete_Environments_warehouse_saved_queries_destroy + '/api/environments/{project_id}/warehouse_tables/{id}/': Endpoints.delete_Environments_warehouse_tables_destroy + '/api/organizations/{id}/': Endpoints.delete_Destroy + '/api/organizations/{organization_id}/batch_exports/{id}/': Endpoints.delete_Batch_exports_destroy + '/api/organizations/{organization_id}/domains/{id}/': Endpoints.delete_Domains_destroy + '/api/organizations/{organization_id}/invites/{id}/': Endpoints.delete_Invites_destroy + '/api/organizations/{organization_id}/members/{user__uuid}/': Endpoints.delete_Members_destroy + '/api/organizations/{organization_id}/projects/{id}/': Endpoints.delete_Destroy_2 + '/api/organizations/{organization_id}/proxy_records/{id}/': Endpoints.delete_Proxy_records_destroy + '/api/organizations/{organization_id}/roles/{id}/': Endpoints.delete_Roles_destroy + '/api/organizations/{organization_id}/roles/{role_id}/role_memberships/{id}/': Endpoints.delete_Roles_role_memberships_destroy + '/api/projects/{project_id}/actions/{id}/': Endpoints.delete_Actions_destroy + '/api/projects/{project_id}/annotations/{id}/': Endpoints.delete_Annotations_destroy + '/api/projects/{project_id}/batch_exports/{id}/': Endpoints.delete_Batch_exports_destroy_2 + '/api/projects/{project_id}/cohorts/{id}/': Endpoints.delete_Cohorts_destroy + '/api/projects/{project_id}/dashboard_templates/{id}/': Endpoints.delete_Dashboard_templates_destroy + '/api/projects/{project_id}/dashboards/{dashboard_id}/collaborators/{user__uuid}/': Endpoints.delete_Dashboards_collaborators_destroy + '/api/projects/{project_id}/dashboards/{dashboard_id}/sharing/passwords/{password_id}/': Endpoints.delete_Dashboards_sharing_passwords_destroy + '/api/projects/{project_id}/dashboards/{id}/': Endpoints.delete_Dashboards_destroy + '/api/projects/{project_id}/early_access_feature/{id}/': Endpoints.delete_Early_access_feature_destroy + '/api/projects/{project_id}/environments/{id}/': Endpoints.delete_Environments_destroy + '/api/projects/{project_id}/event_definitions/{id}/': Endpoints.delete_Event_definitions_destroy + '/api/projects/{project_id}/experiment_holdouts/{id}/': Endpoints.delete_Experiment_holdouts_destroy + '/api/projects/{project_id}/experiment_saved_metrics/{id}/': Endpoints.delete_Experiment_saved_metrics_destroy + '/api/projects/{project_id}/experiments/{id}/': Endpoints.delete_Experiments_destroy + '/api/projects/{project_id}/explicit_members/{parent_membership__user__uuid}/': Endpoints.delete_Explicit_members_destroy + '/api/projects/{project_id}/feature_flags/{feature_flag_id}/role_access/{id}/': Endpoints.delete_Feature_flags_role_access_destroy + '/api/projects/{project_id}/feature_flags/{id}/': Endpoints.delete_Feature_flags_destroy + '/api/projects/{project_id}/file_system/{id}/': Endpoints.delete_File_system_destroy + '/api/projects/{project_id}/file_system_shortcut/{id}/': Endpoints.delete_File_system_shortcut_destroy + '/api/projects/{project_id}/groups_types/{group_type_index}/': Endpoints.delete_Groups_types_destroy + '/api/projects/{project_id}/groups_types/{group_type_index}/metrics/{id}/': Endpoints.delete_Groups_types_metrics_destroy + '/api/projects/{project_id}/hog_functions/{id}/': Endpoints.delete_Hog_functions_destroy + '/api/projects/{project_id}/insights/{insight_id}/sharing/passwords/{password_id}/': Endpoints.delete_Insights_sharing_passwords_destroy + '/api/projects/{project_id}/insights/{id}/': Endpoints.delete_Insights_destroy + '/api/projects/{project_id}/notebooks/{short_id}/': Endpoints.delete_Notebooks_destroy + '/api/projects/{project_id}/persisted_folder/{id}/': Endpoints.delete_Persisted_folder_destroy + '/api/projects/{project_id}/persons/{id}/': Endpoints.delete_Persons_destroy + '/api/projects/{project_id}/property_definitions/{id}/': Endpoints.delete_Property_definitions_destroy + '/api/projects/{project_id}/query/{id}/': Endpoints.delete_Query_destroy + '/api/projects/{project_id}/session_recording_playlists/{short_id}/': Endpoints.delete_Session_recording_playlists_destroy + '/api/projects/{project_id}/session_recording_playlists/{short_id}/recordings/{session_recording_id}/': Endpoints.delete_Session_recording_playlists_recordings_destroy + '/api/projects/{project_id}/session_recordings/{id}/': Endpoints.delete_Session_recordings_destroy + '/api/projects/{project_id}/session_recordings/{recording_id}/sharing/passwords/{password_id}/': Endpoints.delete_Session_recordings_sharing_passwords_destroy + '/api/projects/{project_id}/subscriptions/{id}/': Endpoints.delete_Subscriptions_destroy + '/api/projects/{project_id}/surveys/{id}/': Endpoints.delete_Surveys_destroy + '/api/projects/{project_id}/warehouse_saved_queries/{id}/': Endpoints.delete_Warehouse_saved_queries_destroy + '/api/projects/{project_id}/warehouse_tables/{id}/': Endpoints.delete_Warehouse_tables_destroy + '/api/projects/{project_id}/web_experiments/{id}/': Endpoints.delete_Web_experiments_destroy + '/api/users/{uuid}/': Endpoints.delete_Users_destroy + } +} + +// + +// +export type GetEndpoints = EndpointByMethod['get'] +export type PostEndpoints = EndpointByMethod['post'] +export type PutEndpoints = EndpointByMethod['put'] +export type PatchEndpoints = EndpointByMethod['patch'] +export type DeleteEndpoints = EndpointByMethod['delete'] +// + +// +export type EndpointParameters = { + body?: unknown + query?: Record + header?: Record + path?: Record +} + +export type MutationMethod = 'post' | 'put' | 'patch' | 'delete' +export type Method = 'get' | 'head' | 'options' | MutationMethod + +type RequestFormat = 'json' | 'form-data' | 'form-url' | 'binary' | 'text' + +export type DefaultEndpoint = { + parameters?: EndpointParameters | undefined + responses?: Record + responseHeaders?: Record +} + +export type Endpoint = { + operationId: string + method: Method + path: string + requestFormat: RequestFormat + parameters?: TConfig['parameters'] + meta: { + alias: string + hasParameters: boolean + areParametersRequired: boolean + } + responses?: TConfig['responses'] + responseHeaders?: TConfig['responseHeaders'] +} + +export interface Fetcher { + decodePathParams?: (path: string, pathParams: Record) => string + encodeSearchParams?: (searchParams: Record | undefined) => URLSearchParams + // + fetch: (input: { + method: Method + url: URL + urlSearchParams?: URLSearchParams | undefined + parameters?: EndpointParameters | undefined + path: string + overrides?: RequestInit + throwOnStatusError?: boolean + }) => Promise + parseResponseData?: (response: Response) => Promise +} + +export const successStatusCodes = [ + 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301, 302, 303, 304, 305, 306, 307, 308, +] as const +export type SuccessStatusCode = (typeof successStatusCodes)[number] + +export const errorStatusCodes = [ + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 421, 422, 423, 424, 425, 426, 428, 429, 431, 451, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 510, 511, +] as const +export type ErrorStatusCode = (typeof errorStatusCodes)[number] + +// Taken from https://github.com/unjs/fetchdts/blob/ec4eaeab5d287116171fc1efd61f4a1ad34e4609/src/fetch.ts#L3 +export interface TypedHeaders | unknown> + extends Omit< + Headers, + 'append' | 'delete' | 'get' | 'getSetCookie' | 'has' | 'set' | 'forEach' + > { + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/append) */ + append: | (string & {})>( + name: Name, + value: Lowercase extends keyof TypedHeaderValues + ? TypedHeaderValues[Lowercase] + : string + ) => void + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/delete) */ + delete: | (string & {})>( + name: Name + ) => void + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/get) */ + get: | (string & {})>( + name: Name + ) => + | (Lowercase extends keyof TypedHeaderValues + ? TypedHeaderValues[Lowercase] + : string) + | null + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/getSetCookie) */ + getSetCookie: () => string[] + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/has) */ + has: | (string & {})>( + name: Name + ) => boolean + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/set) */ + set: | (string & {})>( + name: Name, + value: Lowercase extends keyof TypedHeaderValues + ? TypedHeaderValues[Lowercase] + : string + ) => void + forEach: ( + callbackfn: ( + value: TypedHeaderValues[keyof TypedHeaderValues] | (string & {}), + key: Extract | (string & {}), + parent: TypedHeaders + ) => void, + thisArg?: any + ) => void +} + +/** @see https://developer.mozilla.org/en-US/docs/Web/API/Response */ +export interface TypedSuccessResponse + extends Omit { + ok: true + status: TStatusCode + headers: never extends THeaders ? Headers : TypedHeaders + data: TSuccess + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Response/json) */ + json: () => Promise +} + +/** @see https://developer.mozilla.org/en-US/docs/Web/API/Response */ +export interface TypedErrorResponse + extends Omit { + ok: false + status: TStatusCode + headers: never extends THeaders ? Headers : TypedHeaders + data: TData + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Response/json) */ + json: () => Promise +} + +export type TypedApiResponse< + TAllResponses extends Record = {}, + THeaders = {}, +> = { + [K in keyof TAllResponses]: K extends string + ? K extends `${infer TStatusCode extends number}` + ? TStatusCode extends SuccessStatusCode + ? TypedSuccessResponse< + TAllResponses[K], + TStatusCode, + K extends keyof THeaders ? THeaders[K] : never + > + : TypedErrorResponse< + TAllResponses[K], + TStatusCode, + K extends keyof THeaders ? THeaders[K] : never + > + : never + : K extends number + ? K extends SuccessStatusCode + ? TypedSuccessResponse< + TAllResponses[K], + K, + K extends keyof THeaders ? THeaders[K] : never + > + : TypedErrorResponse< + TAllResponses[K], + K, + K extends keyof THeaders ? THeaders[K] : never + > + : never +}[keyof TAllResponses] + +export type SafeApiResponse = TEndpoint extends { responses: infer TResponses } + ? TResponses extends Record + ? TypedApiResponse< + TResponses, + TEndpoint extends { responseHeaders: infer THeaders } ? THeaders : never + > + : never + : never + +export type InferResponseByStatus = Extract< + SafeApiResponse, + { status: TStatusCode } +> + +type RequiredKeys = { + [P in keyof T]-?: undefined extends T[P] ? never : P +}[keyof T] + +type MaybeOptionalArg = RequiredKeys extends never ? [config?: T] : [config: T] +type NotNever = [T] extends [never] ? false : true + +// + +// +export class TypedStatusError extends Error { + response: TypedErrorResponse + status: number + constructor(response: TypedErrorResponse) { + super(`HTTP ${response.status}: ${response.statusText}`) + this.name = 'TypedStatusError' + this.response = response + this.status = response.status + } +} +// + +// +export class ApiClient { + baseUrl = '' + successStatusCodes = successStatusCodes + errorStatusCodes = errorStatusCodes + + constructor(public fetcher: Fetcher) {} + + setBaseUrl(baseUrl: string) { + this.baseUrl = baseUrl + return this + } + + /** + * Replace path parameters in URL + * Supports both OpenAPI format {param} and Express format :param + */ + defaultDecodePathParams = (url: string, params: Record): string => { + return url + .replace(/{(\w+)}/g, (_, key: string) => params[key] || `{${key}}`) + .replace(/:([a-zA-Z0-9_]+)/g, (_, key: string) => params[key] || `:${key}`) + } + + /** Uses URLSearchParams, skips null/undefined values */ + defaultEncodeSearchParams = ( + queryParams: Record | undefined + ): URLSearchParams | undefined => { + if (!queryParams) { + return + } + + const searchParams = new URLSearchParams() + Object.entries(queryParams).forEach(([key, value]) => { + if (value != null) { + // Skip null/undefined values + if (Array.isArray(value)) { + value.forEach((val) => val != null && searchParams.append(key, String(val))) + } else { + searchParams.append(key, String(value)) + } + } + }) + + return searchParams + } + + defaultParseResponseData = async (response: Response): Promise => { + const contentType = response.headers.get('content-type') ?? '' + if (contentType.startsWith('text/')) { + return await response.text() + } + + if (contentType === 'application/octet-stream') { + return await response.arrayBuffer() + } + + if ( + contentType.includes('application/json') || + (contentType.includes('application/') && contentType.includes('json')) || + contentType === '*/*' + ) { + try { + return await response.json() + } catch { + return undefined + } + } + + return + } + + // + get( + path: Path, + ...params: MaybeOptionalArg< + TEndpoint extends { parameters: infer UParams } + ? NotNever extends true + ? UParams & { + overrides?: RequestInit + withResponse?: false + throwOnStatusError?: boolean + } + : { + overrides?: RequestInit + withResponse?: false + throwOnStatusError?: boolean + } + : { overrides?: RequestInit; withResponse?: false; throwOnStatusError?: boolean } + > + ): Promise, { data: {} }>['data']> + + get( + path: Path, + ...params: MaybeOptionalArg< + TEndpoint extends { parameters: infer UParams } + ? NotNever extends true + ? UParams & { + overrides?: RequestInit + withResponse?: true + throwOnStatusError?: boolean + } + : { overrides?: RequestInit; withResponse?: true; throwOnStatusError?: boolean } + : { overrides?: RequestInit; withResponse?: true; throwOnStatusError?: boolean } + > + ): Promise> + + get( + path: Path, + ...params: MaybeOptionalArg + ): Promise { + return this.request('get', path, ...params) + } + // + + // + post( + path: Path, + ...params: MaybeOptionalArg< + TEndpoint extends { parameters: infer UParams } + ? NotNever extends true + ? UParams & { + overrides?: RequestInit + withResponse?: false + throwOnStatusError?: boolean + } + : { + overrides?: RequestInit + withResponse?: false + throwOnStatusError?: boolean + } + : { overrides?: RequestInit; withResponse?: false; throwOnStatusError?: boolean } + > + ): Promise, { data: {} }>['data']> + + post( + path: Path, + ...params: MaybeOptionalArg< + TEndpoint extends { parameters: infer UParams } + ? NotNever extends true + ? UParams & { + overrides?: RequestInit + withResponse?: true + throwOnStatusError?: boolean + } + : { overrides?: RequestInit; withResponse?: true; throwOnStatusError?: boolean } + : { overrides?: RequestInit; withResponse?: true; throwOnStatusError?: boolean } + > + ): Promise> + + post( + path: Path, + ...params: MaybeOptionalArg + ): Promise { + return this.request('post', path, ...params) + } + // + + // + put( + path: Path, + ...params: MaybeOptionalArg< + TEndpoint extends { parameters: infer UParams } + ? NotNever extends true + ? UParams & { + overrides?: RequestInit + withResponse?: false + throwOnStatusError?: boolean + } + : { + overrides?: RequestInit + withResponse?: false + throwOnStatusError?: boolean + } + : { overrides?: RequestInit; withResponse?: false; throwOnStatusError?: boolean } + > + ): Promise, { data: {} }>['data']> + + put( + path: Path, + ...params: MaybeOptionalArg< + TEndpoint extends { parameters: infer UParams } + ? NotNever extends true + ? UParams & { + overrides?: RequestInit + withResponse?: true + throwOnStatusError?: boolean + } + : { overrides?: RequestInit; withResponse?: true; throwOnStatusError?: boolean } + : { overrides?: RequestInit; withResponse?: true; throwOnStatusError?: boolean } + > + ): Promise> + + put( + path: Path, + ...params: MaybeOptionalArg + ): Promise { + return this.request('put', path, ...params) + } + // + + // + patch( + path: Path, + ...params: MaybeOptionalArg< + TEndpoint extends { parameters: infer UParams } + ? NotNever extends true + ? UParams & { + overrides?: RequestInit + withResponse?: false + throwOnStatusError?: boolean + } + : { + overrides?: RequestInit + withResponse?: false + throwOnStatusError?: boolean + } + : { overrides?: RequestInit; withResponse?: false; throwOnStatusError?: boolean } + > + ): Promise, { data: {} }>['data']> + + patch( + path: Path, + ...params: MaybeOptionalArg< + TEndpoint extends { parameters: infer UParams } + ? NotNever extends true + ? UParams & { + overrides?: RequestInit + withResponse?: true + throwOnStatusError?: boolean + } + : { overrides?: RequestInit; withResponse?: true; throwOnStatusError?: boolean } + : { overrides?: RequestInit; withResponse?: true; throwOnStatusError?: boolean } + > + ): Promise> + + patch( + path: Path, + ...params: MaybeOptionalArg + ): Promise { + return this.request('patch', path, ...params) + } + // + + // + delete( + path: Path, + ...params: MaybeOptionalArg< + TEndpoint extends { parameters: infer UParams } + ? NotNever extends true + ? UParams & { + overrides?: RequestInit + withResponse?: false + throwOnStatusError?: boolean + } + : { + overrides?: RequestInit + withResponse?: false + throwOnStatusError?: boolean + } + : { overrides?: RequestInit; withResponse?: false; throwOnStatusError?: boolean } + > + ): Promise, { data: {} }>['data']> + + delete( + path: Path, + ...params: MaybeOptionalArg< + TEndpoint extends { parameters: infer UParams } + ? NotNever extends true + ? UParams & { + overrides?: RequestInit + withResponse?: true + throwOnStatusError?: boolean + } + : { overrides?: RequestInit; withResponse?: true; throwOnStatusError?: boolean } + : { overrides?: RequestInit; withResponse?: true; throwOnStatusError?: boolean } + > + ): Promise> + + delete( + path: Path, + ...params: MaybeOptionalArg + ): Promise { + return this.request('delete', path, ...params) + } + // + + // + /** + * Generic request method with full type-safety for any endpoint + */ + request< + TMethod extends keyof EndpointByMethod, + TPath extends keyof EndpointByMethod[TMethod], + TEndpoint extends EndpointByMethod[TMethod][TPath], + >( + method: TMethod, + path: TPath, + ...params: MaybeOptionalArg< + TEndpoint extends { parameters: infer UParams } + ? NotNever extends true + ? UParams & { + overrides?: RequestInit + withResponse?: false + throwOnStatusError?: boolean + } + : { + overrides?: RequestInit + withResponse?: false + throwOnStatusError?: boolean + } + : { overrides?: RequestInit; withResponse?: false; throwOnStatusError?: boolean } + > + ): Promise, { data: {} }>['data']> + + request< + TMethod extends keyof EndpointByMethod, + TPath extends keyof EndpointByMethod[TMethod], + TEndpoint extends EndpointByMethod[TMethod][TPath], + >( + method: TMethod, + path: TPath, + ...params: MaybeOptionalArg< + TEndpoint extends { parameters: infer UParams } + ? NotNever extends true + ? UParams & { + overrides?: RequestInit + withResponse?: true + throwOnStatusError?: boolean + } + : { overrides?: RequestInit; withResponse?: true; throwOnStatusError?: boolean } + : { overrides?: RequestInit; withResponse?: true; throwOnStatusError?: boolean } + > + ): Promise> + + request< + TMethod extends keyof EndpointByMethod, + TPath extends keyof EndpointByMethod[TMethod], + TEndpoint extends EndpointByMethod[TMethod][TPath], + >(method: TMethod, path: TPath, ...params: MaybeOptionalArg): Promise { + const requestParams = params[0] + const withResponse = requestParams?.withResponse + const { + withResponse: _, + throwOnStatusError = withResponse ? false : true, + overrides, + ...fetchParams + } = requestParams || {} + + const parametersToSend: EndpointParameters = {} + if (requestParams?.body !== undefined) { + ;(parametersToSend as any).body = requestParams.body + } + if (requestParams?.query !== undefined) { + ;(parametersToSend as any).query = requestParams.query + } + if (requestParams?.header !== undefined) { + ;(parametersToSend as any).header = requestParams.header + } + if (requestParams?.path !== undefined) { + ;(parametersToSend as any).path = requestParams.path + } + + const resolvedPath = (this.fetcher.decodePathParams ?? this.defaultDecodePathParams)( + this.baseUrl + (path as string), + (parametersToSend.path ?? {}) as Record + ) + const url = new URL(resolvedPath) + const urlSearchParams = (this.fetcher.encodeSearchParams ?? this.defaultEncodeSearchParams)( + parametersToSend.query + ) + + const promise = this.fetcher + .fetch({ + method: method, + path: path as string, + url, + urlSearchParams, + parameters: Object.keys(fetchParams).length ? fetchParams : undefined, + overrides, + throwOnStatusError, + }) + .then(async (response) => { + const data = await ( + this.fetcher.parseResponseData ?? this.defaultParseResponseData + )(response) + const typedResponse = Object.assign(response, { + data: data, + json: () => Promise.resolve(data), + }) as SafeApiResponse + + if (throwOnStatusError && errorStatusCodes.includes(response.status as never)) { + throw new TypedStatusError(typedResponse as never) + } + + return withResponse ? typedResponse : data + }) + + return promise as Extract< + InferResponseByStatus, + { data: {} } + >['data'] + } + // +} + +export function createApiClient(fetcher: Fetcher, baseUrl?: string) { + return new ApiClient(fetcher).setBaseUrl(baseUrl ?? '') +} + +/** + Example usage: + const api = createApiClient((method, url, params) => + fetch(url, { method, body: JSON.stringify(params) }).then((res) => res.json()), + ); + api.get("/users").then((users) => console.log(users)); + api.post("/users", { body: { name: "John" } }).then((user) => console.log(user)); + api.put("/users/:id", { path: { id: 1 }, body: { name: "John" } }).then((user) => console.log(user)); + + // With error handling + const result = await api.get("/users/{id}", { path: { id: "123" }, withResponse: true }); + if (result.ok) { + // Access data directly + const user = result.data; + console.log(user); + + // Or use the json() method for compatibility + const userFromJson = await result.json(); + console.log(userFromJson); + } else { + const error = result.data; + console.error(`Error ${result.status}:`, error); + } +*/ + +// diff --git a/products/mcp/typescript/src/index.ts b/products/mcp/typescript/src/index.ts new file mode 100644 index 0000000000..85048937f9 --- /dev/null +++ b/products/mcp/typescript/src/index.ts @@ -0,0 +1,2 @@ +export { getToolsFromContext, PostHogAgentToolkit, type PostHogToolsOptions } from './tools' +export type { Context, State, Tool } from './tools/types' diff --git a/products/mcp/typescript/src/inkeepApi.ts b/products/mcp/typescript/src/inkeepApi.ts new file mode 100644 index 0000000000..2ea2de7413 --- /dev/null +++ b/products/mcp/typescript/src/inkeepApi.ts @@ -0,0 +1,44 @@ +export interface InkeepResponse { + choices: Array<{ + message: { + content: string + } + }> +} + +export async function docsSearch(apiKey: string, userQuery: string): Promise { + if (!apiKey) { + throw new Error('No API key provided') + } + + const response = await fetch('https://api.inkeep.com/v1/chat/completions', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${apiKey}`, + }, + body: JSON.stringify({ + model: 'inkeep-context-gpt-4o', + messages: [{ role: 'user', content: userQuery }], + }), + }) + + if (!response.ok) { + const errorText = await response.text() + console.error('Inkeep API error:', errorText) + throw new Error(`Error querying Inkeep API: ${response.status} ${errorText}`) + } + + const data = (await response.json()) as InkeepResponse + + if ( + data.choices && + data.choices.length > 0 && + data.choices[0]?.message && + data.choices[0].message.content + ) { + return data.choices[0].message.content + } + console.error('Inkeep API response format unexpected:', data) + throw new Error('Unexpected response format from Inkeep API.') +} diff --git a/products/mcp/typescript/src/integrations/ai-sdk/index.ts b/products/mcp/typescript/src/integrations/ai-sdk/index.ts new file mode 100644 index 0000000000..3195b62692 --- /dev/null +++ b/products/mcp/typescript/src/integrations/ai-sdk/index.ts @@ -0,0 +1,77 @@ +import { ApiClient } from '@/api/client' +import { SessionManager } from '@/lib/utils/SessionManager' +import { StateManager } from '@/lib/utils/StateManager' +import { MemoryCache } from '@/lib/utils/cache/MemoryCache' +import { hash } from '@/lib/utils/helper-functions' +import { getToolsFromContext } from '@/tools' +import type { Context } from '@/tools/types' +import { type Tool as VercelTool, tool } from 'ai' +import type { z } from 'zod' + +/** + * Options for the PostHog Agent Toolkit + */ +export type PostHogToolsOptions = { + posthogPersonalApiKey: string + posthogApiBaseUrl: string +} + +export class PostHogAgentToolkit { + public options: PostHogToolsOptions + + /** + * Create a new PostHog Agent Toolkit + * @param options - The options for the PostHog Agent Toolkit + */ + constructor(options: PostHogToolsOptions) { + this.options = options + } + + /** + * Get the context for the PostHog Agent Toolkit + * @returns A context object + */ + getContext(): Context { + const api = new ApiClient({ + apiToken: this.options.posthogPersonalApiKey, + baseUrl: this.options.posthogApiBaseUrl, + }) + + const scope = hash(this.options.posthogPersonalApiKey) + const cache = new MemoryCache(scope) + + return { + api, + cache, + env: { + INKEEP_API_KEY: undefined, + }, + stateManager: new StateManager(cache, api), + sessionManager: new SessionManager(cache), + } + } + + /** + * Get all the tools for the PostHog Agent Toolkit + * @returns A record of tool names to Vercel tools + */ + async getTools(): Promise> { + const context = this.getContext() + const allTools = await getToolsFromContext(context) + + return allTools.reduce( + (acc, t) => { + acc[t.name] = tool({ + description: t.description, + inputSchema: t.schema, + execute: async (arg: z.output) => { + return t.handler(context, arg) + }, + }) + + return acc + }, + {} as Record + ) + } +} diff --git a/products/mcp/typescript/src/integrations/langchain/index.ts b/products/mcp/typescript/src/integrations/langchain/index.ts new file mode 100644 index 0000000000..040d499e41 --- /dev/null +++ b/products/mcp/typescript/src/integrations/langchain/index.ts @@ -0,0 +1,81 @@ +import { ApiClient } from '@/api/client' +import { SessionManager } from '@/lib/utils/SessionManager' +import { StateManager } from '@/lib/utils/StateManager' +import { MemoryCache } from '@/lib/utils/cache/MemoryCache' +import { hash } from '@/lib/utils/helper-functions' +import { getToolsFromContext } from '@/tools' +import type { Context } from '@/tools/types' +import { DynamicStructuredTool } from '@langchain/core/tools' +import type { z } from 'zod' + +/** + * Options for the PostHog Agent Toolkit + */ +export type PostHogToolsOptions = { + posthogPersonalApiKey: string + posthogApiBaseUrl: string +} + +export class PostHogAgentToolkit { + public options: PostHogToolsOptions + + /** + * Create a new PostHog Agent Toolkit + * @param options - The options for the PostHog Agent Toolkit + */ + constructor(options: PostHogToolsOptions) { + this.options = options + } + + /** + * Get the context for the PostHog Agent Toolkit + * @returns A context object + */ + getContext(): Context { + const api = new ApiClient({ + apiToken: this.options.posthogPersonalApiKey, + baseUrl: this.options.posthogApiBaseUrl, + }) + + const scope = hash(this.options.posthogPersonalApiKey) + const cache = new MemoryCache(scope) + + return { + api, + cache, + env: { + INKEEP_API_KEY: undefined, + }, + stateManager: new StateManager(cache, api), + sessionManager: new SessionManager(cache), + } + } + + /** + * Get all the tools for the PostHog Agent Toolkit + * @returns An array of DynamicStructuredTool tools + */ + async getTools(): Promise { + const context = this.getContext() + const allTools = await getToolsFromContext(context) + + return allTools.map((t) => { + return new DynamicStructuredTool({ + name: t.name, + description: t.description, + schema: t.schema, + func: async (arg: z.output) => { + const result = await t.handler(context, arg) + + if (typeof result === 'string') { + return result + } + + const text = result.content.map((c: { text: string }) => c.text).join('\n') + + return text + }, + }) + }) + } +} diff --git a/products/mcp/typescript/src/integrations/mcp/index.ts b/products/mcp/typescript/src/integrations/mcp/index.ts new file mode 100644 index 0000000000..67ea1b3c9c --- /dev/null +++ b/products/mcp/typescript/src/integrations/mcp/index.ts @@ -0,0 +1,320 @@ +import { McpServer, type ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js' +import { McpAgent } from 'agents/mcp' +import type { z } from 'zod' + +import { ApiClient } from '@/api/client' +import { getPostHogClient } from '@/integrations/mcp/utils/client' +import { handleToolError } from '@/integrations/mcp/utils/handleToolError' +import type { AnalyticsEvent } from '@/lib/analytics' +import { CUSTOM_BASE_URL, MCP_DOCS_URL } from '@/lib/constants' +import { SessionManager } from '@/lib/utils/SessionManager' +import { StateManager } from '@/lib/utils/StateManager' +import { DurableObjectCache } from '@/lib/utils/cache/DurableObjectCache' +import { hash } from '@/lib/utils/helper-functions' +import { getToolsFromContext } from '@/tools' +import type { CloudRegion, Context, State, Tool } from '@/tools/types' + +const INSTRUCTIONS = ` +- You are a helpful assistant that can query PostHog API. +- If you get errors due to permissions being denied, check that you have the correct active project and that the user has access to the required project. +- If you cannot answer the user's PostHog related request or question using other available tools in this MCP, use the 'docs-search' tool to provide information from the documentation to guide user how they can do it themselves - when doing so provide condensed instructions with links to sources. +` + +type RequestProperties = { + userHash: string + apiToken: string + sessionId?: string + features?: string[] +} + +// Define our MCP agent with tools +export class MyMCP extends McpAgent { + server = new McpServer({ + name: 'PostHog', + version: '1.0.0', + instructions: INSTRUCTIONS, + }) + + initialState: State = { + projectId: undefined, + orgId: undefined, + distinctId: undefined, + region: undefined, + apiKey: undefined, + } + + _cache: DurableObjectCache | undefined + + _api: ApiClient | undefined + + _sessionManager: SessionManager | undefined + + get requestProperties() { + return this.props as RequestProperties + } + + get cache() { + if (!this.requestProperties.userHash) { + throw new Error('User hash is required to use the cache') + } + + if (!this._cache) { + this._cache = new DurableObjectCache( + this.requestProperties.userHash, + this.ctx.storage + ) + } + + return this._cache + } + + get sessionManager() { + if (!this._sessionManager) { + this._sessionManager = new SessionManager(this.cache) + } + + return this._sessionManager + } + + async detectRegion(): Promise { + const usClient = new ApiClient({ + apiToken: this.requestProperties.apiToken, + baseUrl: 'https://us.posthog.com', + }) + + const euClient = new ApiClient({ + apiToken: this.requestProperties.apiToken, + baseUrl: 'https://eu.posthog.com', + }) + + const [usResult, euResult] = await Promise.all([ + usClient.users().me(), + euClient.users().me(), + ]) + + if (usResult.success) { + await this.cache.set('region', 'us') + return 'us' + } + + if (euResult.success) { + await this.cache.set('region', 'eu') + return 'eu' + } + + return undefined + } + + async getBaseUrl() { + if (CUSTOM_BASE_URL) { + return CUSTOM_BASE_URL + } + + const region = (await this.cache.get('region')) || (await this.detectRegion()) + + if (region === 'eu') { + return 'https://eu.posthog.com' + } + + return 'https://us.posthog.com' + } + + async api() { + if (!this._api) { + const baseUrl = await this.getBaseUrl() + this._api = new ApiClient({ + apiToken: this.requestProperties.apiToken, + baseUrl, + }) + } + + return this._api + } + + async getDistinctId() { + let _distinctId = await this.cache.get('distinctId') + + if (!_distinctId) { + const userResult = await (await this.api()).users().me() + if (!userResult.success) { + throw new Error(`Failed to get user: ${userResult.error.message}`) + } + await this.cache.set('distinctId', userResult.data.distinct_id) + _distinctId = userResult.data.distinct_id + } + + return _distinctId + } + + async trackEvent(event: AnalyticsEvent, properties: Record = {}) { + try { + const distinctId = await this.getDistinctId() + + const client = getPostHogClient() + + client.capture({ + distinctId, + event, + properties: { + ...(this.requestProperties.sessionId + ? { + $session_id: await this.sessionManager.getSessionUuid( + this.requestProperties.sessionId + ), + } + : {}), + ...properties, + }, + }) + } catch (error) { + // + } + } + + registerTool( + tool: Tool>, + handler: (params: z.infer>) => Promise + ): void { + const wrappedHandler = async (params: z.infer>) => { + const validation = tool.schema.safeParse(params) + + if (!validation.success) { + await this.trackEvent('mcp tool call', { + tool: tool.name, + valid_input: false, + input: params, + }) + return [ + { + type: 'text', + text: `Invalid input: ${validation.error.message}`, + }, + ] + } + + await this.trackEvent('mcp tool call', { + tool: tool.name, + valid_input: true, + input: params, + }) + + try { + const result = await handler(params) + await this.trackEvent('mcp tool response', { + tool: tool.name, + valid_input: true, + input: params, + output: result, + }) + return result + } catch (error: any) { + const distinctId = await this.getDistinctId() + return handleToolError( + error, + tool.name, + distinctId, + this.requestProperties.sessionId + ? await this.sessionManager.getSessionUuid(this.requestProperties.sessionId) + : undefined + ) + } + } + + this.server.registerTool( + tool.name, + { + title: tool.title, + description: tool.description, + inputSchema: tool.schema.shape, + annotations: tool.annotations, + }, + wrappedHandler as unknown as ToolCallback + ) + } + + async getContext(): Promise { + const api = await this.api() + return { + api, + cache: this.cache, + env: this.env, + stateManager: new StateManager(this.cache, api), + sessionManager: this.sessionManager, + } + } + + async init() { + const context = await this.getContext() + + // Get features from request properties if available + const features = this.requestProperties.features + const allTools = await getToolsFromContext(context, features) + + for (const tool of allTools) { + this.registerTool(tool, async (params) => tool.handler(context, params)) + } + } +} + +export default { + async fetch(request: Request, env: Env, ctx: ExecutionContext) { + const url = new URL(request.url) + + if (url.pathname === '/') { + return new Response( + `

Welcome to the PostHog MCP Server. For setup and usage instructions, see: ${MCP_DOCS_URL}

`, + { + headers: { + 'content-type': 'text/html', + }, + } + ) + } + + const token = request.headers.get('Authorization')?.split(' ')[1] + + const sessionId = url.searchParams.get('sessionId') + + if (!token) { + return new Response( + `No token provided, please provide a valid API token. View the documentation for more information: ${MCP_DOCS_URL}`, + { + status: 401, + } + ) + } + + if (!token.startsWith('phx_')) { + return new Response( + `Invalid token, please provide a valid API token. View the documentation for more information: ${MCP_DOCS_URL}`, + { + status: 401, + } + ) + } + + ctx.props = { + apiToken: token, + userHash: hash(token), + sessionId: sessionId || undefined, + } + + // Search params are used to build up the list of available tools. If no features are provided, all tools are available. + // If features are provided, only tools matching those features will be available. + // Features are provided as a comma-separated list in the "features" query parameter. + // Example: ?features=org,insights + const featuresParam = url.searchParams.get('features') + const features = featuresParam ? featuresParam.split(',').filter(Boolean) : undefined + ctx.props = { ...ctx.props, features } + + if (url.pathname.startsWith('/mcp')) { + return MyMCP.serve('/mcp').fetch(request, env, ctx) + } + + if (url.pathname.startsWith('/sse')) { + return MyMCP.serveSSE('/sse').fetch(request, env, ctx) + } + + return new Response('Not found', { status: 404 }) + }, +} diff --git a/products/mcp/typescript/src/integrations/mcp/utils/client.ts b/products/mcp/typescript/src/integrations/mcp/utils/client.ts new file mode 100644 index 0000000000..4b1ff7f2de --- /dev/null +++ b/products/mcp/typescript/src/integrations/mcp/utils/client.ts @@ -0,0 +1,15 @@ +import { PostHog } from 'posthog-node' + +let _client: PostHog | undefined + +export const getPostHogClient = () => { + if (!_client) { + _client = new PostHog('sTMFPsFhdP1Ssg', { + host: 'https://us.i.posthog.com', + flushAt: 1, + flushInterval: 0, + }) + } + + return _client +} diff --git a/products/mcp/typescript/src/integrations/mcp/utils/handleToolError.ts b/products/mcp/typescript/src/integrations/mcp/utils/handleToolError.ts new file mode 100644 index 0000000000..5d58f8942c --- /dev/null +++ b/products/mcp/typescript/src/integrations/mcp/utils/handleToolError.ts @@ -0,0 +1,83 @@ +import { getPostHogClient } from '@/integrations/mcp/utils/client' +import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js' + +export class MCPToolError extends Error { + public readonly tool: string + public readonly originalError: unknown + public readonly timestamp: Date + + constructor(message: string, tool: string, originalError?: unknown) { + super(message) + this.name = 'MCPToolError' + this.tool = tool + this.originalError = originalError + this.timestamp = new Date() + } + + getTrackingData() { + return { + tool: this.tool, + message: this.message, + timestamp: this.timestamp.toISOString(), + originalError: + this.originalError instanceof Error + ? { + name: this.originalError.name, + message: this.originalError.message, + stack: this.originalError.stack, + } + : String(this.originalError), + } + } +} + +/** + * Handles tool errors and returns a structured error message. + * Any errors that originate from the tool SHOULD be reported inside the result + * object, with `isError` set to true, _not_ as an MCP protocol-level error + * response. Otherwise, the LLM would not be able to see that an error occurred + * and self-correct. + * + * @param error - The error object. + * @param tool - Tool that caused the error. + * @param distinctId - User's distinct ID for tracking. + * @param sessionId - Session UUID for tracking. + * @returns A structured error message. + */ +export function handleToolError( + error: any, + tool?: string, + distinctId?: string, + sessionUuid?: string +): CallToolResult { + const mcpError = + error instanceof MCPToolError + ? error + : new MCPToolError( + error instanceof Error ? error.message : String(error), + tool || 'unknown', + error + ) + + const properties: Record = { + team: 'growth', + tool: mcpError.tool, + $exception_fingerprint: `${mcpError.tool}-${mcpError.message}`, + } + + if (sessionUuid) { + properties.$session_id = sessionUuid + } + + getPostHogClient().captureException(mcpError, distinctId, properties) + + return { + content: [ + { + type: 'text', + text: `Error: [${mcpError.tool}]: ${mcpError.message}`, + }, + ], + isError: true, + } +} diff --git a/products/mcp/typescript/src/lib/analytics.ts b/products/mcp/typescript/src/lib/analytics.ts new file mode 100644 index 0000000000..bcca429b72 --- /dev/null +++ b/products/mcp/typescript/src/lib/analytics.ts @@ -0,0 +1 @@ +export type AnalyticsEvent = 'mcp tool call' | 'mcp tool response' diff --git a/products/mcp/typescript/src/lib/constants.ts b/products/mcp/typescript/src/lib/constants.ts new file mode 100644 index 0000000000..471d0d62bc --- /dev/null +++ b/products/mcp/typescript/src/lib/constants.ts @@ -0,0 +1,7 @@ +import { env } from 'cloudflare:workers' + +export const DEV = false + +export const CUSTOM_BASE_URL = env.POSTHOG_BASE_URL || (DEV ? 'http://localhost:8010' : undefined) + +export const MCP_DOCS_URL = 'https://posthog.com/docs/model-context-protocol' diff --git a/products/mcp/typescript/src/lib/errors.ts b/products/mcp/typescript/src/lib/errors.ts new file mode 100644 index 0000000000..bd54924b6e --- /dev/null +++ b/products/mcp/typescript/src/lib/errors.ts @@ -0,0 +1,3 @@ +export enum ErrorCode { + INVALID_API_KEY = 'INVALID_API_KEY', +} diff --git a/products/mcp/typescript/src/lib/types.ts b/products/mcp/typescript/src/lib/types.ts new file mode 100644 index 0000000000..06fe14a397 --- /dev/null +++ b/products/mcp/typescript/src/lib/types.ts @@ -0,0 +1 @@ +type PrefixedString = `${T}:${string}` diff --git a/products/mcp/typescript/src/lib/utils/SessionManager.ts b/products/mcp/typescript/src/lib/utils/SessionManager.ts new file mode 100644 index 0000000000..0b0a839e3f --- /dev/null +++ b/products/mcp/typescript/src/lib/utils/SessionManager.ts @@ -0,0 +1,48 @@ +import type { ScopedCache } from '@/lib/utils/cache/ScopedCache' +import type { State } from '@/tools' +import { v7 as uuidv7 } from 'uuid' + +export class SessionManager { + private cache: ScopedCache + + constructor(cache: ScopedCache) { + this.cache = cache + } + + async _getKey(sessionId: string): Promise> { + return `session:${sessionId}` + } + + async getSessionUuid(sessionId: string): Promise { + const key = await this._getKey(sessionId) + + const existingSession = await this.cache.get(key) + + if (existingSession?.uuid) { + return existingSession.uuid + } + + const newSessionUuid = uuidv7() + + await this.cache.set(key, { uuid: newSessionUuid }) + + return newSessionUuid + } + + async hasSession(sessionId: string): Promise { + const key = await this._getKey(sessionId) + + const session = await this.cache.get(key) + return !!session?.uuid + } + + async removeSession(sessionId: string): Promise { + const key = await this._getKey(sessionId) + + await this.cache.delete(key) + } + + async clearAllSessions(): Promise { + await this.cache.clear() + } +} diff --git a/products/mcp/typescript/src/lib/utils/StateManager.ts b/products/mcp/typescript/src/lib/utils/StateManager.ts new file mode 100644 index 0000000000..d4f0360f02 --- /dev/null +++ b/products/mcp/typescript/src/lib/utils/StateManager.ts @@ -0,0 +1,145 @@ +import type { ApiClient } from '@/api/client' +import type { ApiUser } from '@/schema/api' +import type { State } from '@/tools/types' +import type { ScopedCache } from './cache/ScopedCache' + +export class StateManager { + private _cache: ScopedCache + private _api: ApiClient + private _user?: ApiUser + + constructor(cache: ScopedCache, api: ApiClient) { + this._cache = cache + this._api = api + } + + private async _fetchUser() { + const userResult = await this._api.users().me() + if (!userResult.success) { + throw new Error(`Failed to get user: ${userResult.error.message}`) + } + return userResult.data + } + + async getUser() { + if (!this._user) { + this._user = await this._fetchUser() + } + + return this._user + } + + private async _fetchApiKey() { + const apiKeyResult = await this._api.apiKeys().current() + if (!apiKeyResult.success) { + throw new Error(`Failed to get API key: ${apiKeyResult.error.message}`) + } + return apiKeyResult.data + } + + async getApiKey() { + let _apiKey = await this._cache.get('apiKey') + + if (!_apiKey) { + _apiKey = await this._fetchApiKey() + await this._cache.set('apiKey', _apiKey) + } + + return _apiKey + } + + async getDistinctId() { + let _distinctId = await this._cache.get('distinctId') + + if (!_distinctId) { + const user = await this.getUser() + + await this._cache.set('distinctId', user.distinct_id) + _distinctId = user.distinct_id + } + + return _distinctId + } + + private async _getDefaultOrganizationAndProject(): Promise<{ + organizationId?: string + projectId: number + }> { + const { scoped_organizations, scoped_teams } = await this.getApiKey() + const { organization: activeOrganization, team: activeTeam } = await this.getUser() + + if (scoped_teams.length > 0) { + // Keys scoped to projects should only be scoped to one project + if (scoped_teams.length > 1) { + throw new Error( + 'API key has access to multiple projects, please specify a single project ID or change the API key to have access to an organization to include the projects within it.' + ) + } + + const projectId = scoped_teams[0]! + + return { projectId } + } + + if ( + scoped_organizations.length === 0 || + scoped_organizations.includes(activeOrganization.id) + ) { + return { organizationId: activeOrganization.id, projectId: activeTeam.id } + } + + const organizationId = scoped_organizations[0]! + + const projectsResult = await this._api + .organizations() + .projects({ orgId: organizationId }) + .list() + + if (!projectsResult.success) { + throw projectsResult.error + } + + if (projectsResult.data.length === 0) { + throw new Error('API key does not have access to any projects') + } + + const projectId = projectsResult.data[0]! + + return { organizationId, projectId: Number(projectId) } + } + + async setDefaultOrganizationAndProject() { + const { organizationId, projectId } = await this._getDefaultOrganizationAndProject() + + if (organizationId) { + await this._cache.set('orgId', organizationId) + } + + await this._cache.set('projectId', projectId.toString()) + + return { organizationId, projectId } + } + + async getOrgID(): Promise { + const orgId = await this._cache.get('orgId') + + if (!orgId) { + const { organizationId } = await this.setDefaultOrganizationAndProject() + + return organizationId + } + + return orgId + } + + async getProjectId(): Promise { + const projectId = await this._cache.get('projectId') + + if (!projectId) { + const { projectId } = await this.setDefaultOrganizationAndProject() + return projectId.toString() + } + + return projectId + } +} diff --git a/products/mcp/typescript/src/lib/utils/api.ts b/products/mcp/typescript/src/lib/utils/api.ts new file mode 100644 index 0000000000..6eafa96057 --- /dev/null +++ b/products/mcp/typescript/src/lib/utils/api.ts @@ -0,0 +1,54 @@ +import { ApiListResponseSchema } from '@/schema/api' + +import type { z } from 'zod' + +export const withPagination = async ( + url: string, + apiToken: string, + dataSchema: z.ZodType +): Promise => { + const response = await fetch(url, { + headers: { + Authorization: `Bearer ${apiToken}`, + }, + }) + + if (!response.ok) { + throw new Error(`Failed to fetch ${url}: ${response.statusText}`) + } + + const data = await response.json() + + const responseSchema = ApiListResponseSchema>(dataSchema) + + const parsedData = responseSchema.parse(data) + + const results = parsedData.results.map((result: T) => result) + + if (parsedData.next) { + const nextResults: T[] = await withPagination(parsedData.next, apiToken, dataSchema) + return [...results, ...nextResults] + } + + return results +} + +export const hasScope = (scopes: string[], requiredScope: string) => { + if (scopes.includes('*')) { + return true + } + + // if read scoped required, and write present, return true + if ( + requiredScope.endsWith(':read') && + scopes.includes(requiredScope.replace(':read', ':write')) + ) { + return true + } + + return scopes.includes(requiredScope) +} + +export const hasScopes = (scopes: string[], requiredScopes: string[]) => { + return requiredScopes.every((scope) => hasScope(scopes, scope)) +} diff --git a/products/mcp/typescript/src/lib/utils/cache/DurableObjectCache.ts b/products/mcp/typescript/src/lib/utils/cache/DurableObjectCache.ts new file mode 100644 index 0000000000..bf4780a171 --- /dev/null +++ b/products/mcp/typescript/src/lib/utils/cache/DurableObjectCache.ts @@ -0,0 +1,52 @@ +import { ScopedCache } from '@/lib/utils/cache/ScopedCache' + +interface DurableObjectStorage { + get(key: string): Promise + put(key: string, value: T): Promise + delete(key: string): Promise + delete(keys: string[]): Promise + list(options?: { + prefix?: string + start?: string + end?: string + limit?: number + reverse?: boolean + }): Promise> +} + +export class DurableObjectCache> extends ScopedCache { + private storage: DurableObjectStorage + private userHash: string + + constructor(scope: string, storage: DurableObjectStorage) { + super(scope) + this.userHash = scope + this.storage = storage + } + + private getScopedKey(key: string): string { + return `user:${this.userHash}:${key}` + } + + async get(key: K): Promise { + const scopedKey = this.getScopedKey(key as string) + return await this.storage.get(scopedKey) + } + + async set(key: K, value: T[K]): Promise { + const scopedKey = this.getScopedKey(key as string) + await this.storage.put(scopedKey, value) + } + + async delete(key: K): Promise { + const scopedKey = this.getScopedKey(key as string) + await this.storage.delete(scopedKey) + } + + async clear(): Promise { + const prefix = `user:${this.userHash}:` + const keys = await this.storage.list({ prefix }) + const keysArray = Array.from(keys.keys()) + await this.storage.delete(keysArray) + } +} diff --git a/products/mcp/typescript/src/lib/utils/cache/MemoryCache.ts b/products/mcp/typescript/src/lib/utils/cache/MemoryCache.ts new file mode 100644 index 0000000000..286c23c9ed --- /dev/null +++ b/products/mcp/typescript/src/lib/utils/cache/MemoryCache.ts @@ -0,0 +1,30 @@ +import { ScopedCache } from '@/lib/utils/cache/ScopedCache' + +const _cacheStore = new Map() + +export class MemoryCache> extends ScopedCache { + private cache: Map = new Map() + + constructor(scope: string) { + super(scope) + this.cache = _cacheStore.get(scope) || new Map() + _cacheStore.set(scope, this.cache) + } + + async get(key: K): Promise { + return this.cache.get(key as string) + } + + async set(key: K, value: T[K]): Promise { + this.cache.set(key as string, value) + return + } + + async delete(key: K): Promise { + this.cache.delete(key as string) + } + + async clear(): Promise { + this.cache.clear() + } +} diff --git a/products/mcp/typescript/src/lib/utils/cache/ScopedCache.ts b/products/mcp/typescript/src/lib/utils/cache/ScopedCache.ts new file mode 100644 index 0000000000..f24ae6f9f5 --- /dev/null +++ b/products/mcp/typescript/src/lib/utils/cache/ScopedCache.ts @@ -0,0 +1,8 @@ +export abstract class ScopedCache> { + constructor(private scope: string) {} + + abstract get(key: K): Promise + abstract set(key: K, value: T[K]): Promise + abstract delete(key: K): Promise + abstract clear(): Promise +} diff --git a/products/mcp/typescript/src/lib/utils/helper-functions.ts b/products/mcp/typescript/src/lib/utils/helper-functions.ts new file mode 100644 index 0000000000..fa15911577 --- /dev/null +++ b/products/mcp/typescript/src/lib/utils/helper-functions.ts @@ -0,0 +1,22 @@ +import crypto from 'node:crypto' + +export function hash(data: string) { + // Use PBKDF2 with sufficient computational effort for security + // 100,000 iterations provides good security while maintaining reasonable performance + const salt = crypto.createHash('sha256').update('posthog_mcp_salt').digest() + return crypto.pbkdf2Sync(data, salt, 100000, 32, 'sha256').toString('hex') +} + +export function getSearchParamsFromRecord( + params: Record +): URLSearchParams { + const searchParams = new URLSearchParams() + + for (const [key, value] of Object.entries(params)) { + if (value !== undefined) { + searchParams.append(key, String(value)) + } + } + + return searchParams +} diff --git a/products/mcp/typescript/src/schema/api.ts b/products/mcp/typescript/src/schema/api.ts new file mode 100644 index 0000000000..a8c1624b1d --- /dev/null +++ b/products/mcp/typescript/src/schema/api.ts @@ -0,0 +1,71 @@ +import { z } from 'zod' + +export const ApiPropertyDefinitionSchema = z.object({ + id: z.string(), + name: z.string(), + description: z.string().nullish(), + is_numerical: z.boolean().nullish(), + updated_at: z.string().nullish(), + updated_by: z.any().nullish(), + is_seen_on_filtered_events: z.boolean().nullish(), + property_type: z.enum(['String', 'Numeric', 'Boolean', 'DateTime']).nullish(), + verified: z.boolean().nullish(), + verified_at: z.string().nullish(), + verified_by: z.any().nullish(), + hidden: z.boolean().nullish(), + tags: z.array(z.string()).nullish(), +}) + +export const ApiEventDefinitionSchema = z.object({ + id: z.string().uuid(), + name: z.string(), + owner: z.string().nullish(), + description: z.string().nullish(), + created_at: z.string().nullish(), + updated_at: z.string().nullish(), + updated_by: z.any().nullish(), + last_seen_at: z.string().nullish(), + verified: z.boolean().nullish(), + verified_at: z.string().nullish(), + verified_by: z.any().nullish(), + hidden: z.boolean().nullish(), + is_action: z.boolean().nullish(), + post_to_slack: z.boolean().nullish(), + default_columns: z.array(z.string().nullish()).nullish(), + tags: z.array(z.string().nullish()).nullish(), +}) + +export const ApiListResponseSchema = (dataSchema: T) => + z.object({ + count: z.number().nullish(), + next: z.string().nullish(), + previous: z.string().nullish(), + results: z.array(dataSchema), + }) + +export const ApiUserSchema = z.object({ + distinct_id: z.string(), + organizations: z.array( + z.object({ + id: z.string().uuid(), + }) + ), + team: z.object({ + id: z.number(), + organization: z.string().uuid(), + }), + organization: z.object({ + id: z.string().uuid(), + }), +}) + +export const ApiRedactedPersonalApiKeySchema = z.object({ + scopes: z.array(z.string()), // TODO: restrict available tools automatically based on scopes + scoped_teams: z.array(z.number()), + scoped_organizations: z.array(z.string()), +}) + +export type ApiPropertyDefinition = z.infer +export type ApiEventDefinition = z.infer +export type ApiUser = z.infer +export type ApiRedactedPersonalApiKey = z.infer diff --git a/products/mcp/typescript/src/schema/dashboards.ts b/products/mcp/typescript/src/schema/dashboards.ts new file mode 100644 index 0000000000..5398c2cc0c --- /dev/null +++ b/products/mcp/typescript/src/schema/dashboards.ts @@ -0,0 +1,93 @@ +import { z } from 'zod' + +export const DashboardTileSchema = z.object({ + insight: z.object({ + short_id: z.string(), + name: z.string(), + derived_name: z.string().nullable(), + description: z.string().nullable(), + query: z.object({ + kind: z.union([z.literal('InsightVizNode'), z.literal('DataVisualizationNode')]), + source: z + .any() + .describe( + 'For new insights, use the query from your successful query-run tool call. For updates, the existing query can optionally be reused.' + ), // NOTE: This is intentionally z.any() to avoid populating the context with the complicated query schema, but we prompt the LLM to use 'query-run' to check queries, before creating insights. + }), + created_at: z.string().nullish(), + updated_at: z.string().nullish(), + favorited: z.boolean().nullish(), + tags: z.array(z.string()).nullish(), + }), + order: z.number(), + color: z.string().nullish(), + layouts: z.record(z.any()).nullish(), + last_refresh: z.string().nullish(), + is_cached: z.boolean().nullish(), +}) + +// Base dashboard schema from PostHog API +export const DashboardSchema = z.object({ + id: z.number().int().positive(), + name: z.string(), + description: z.string().nullish(), + pinned: z.boolean().nullish(), + created_at: z.string(), + created_by: z + .object({ + email: z.string().email(), + }) + .optional() + .nullable(), + is_shared: z.boolean().nullish(), + deleted: z.boolean().nullish(), + filters: z.record(z.any()).nullish(), + variables: z.record(z.any()).nullish(), + tags: z.array(z.string()).nullish(), + tiles: z.array(DashboardTileSchema.nullish()).nullish(), +}) + +export const SimpleDashboardSchema = DashboardSchema.pick({ + id: true, + name: true, + description: true, + tiles: true, +}) + +// Input schema for creating dashboards +export const CreateDashboardInputSchema = z.object({ + name: z.string().min(1, 'Dashboard name is required'), + description: z.string().optional(), + pinned: z.boolean().optional(), + tags: z.array(z.string()).optional(), +}) + +// Input schema for updating dashboards +export const UpdateDashboardInputSchema = z.object({ + name: z.string().optional(), + description: z.string().optional(), + pinned: z.boolean().optional(), + tags: z.array(z.string()).optional(), +}) + +// Input schema for listing dashboards +export const ListDashboardsSchema = z.object({ + limit: z.number().int().positive().optional(), + offset: z.number().int().nonnegative().optional(), + search: z.string().optional(), + pinned: z.boolean().optional(), +}) + +// Input schema for adding insight to dashboard +export const AddInsightToDashboardSchema = z.object({ + insightId: z.string(), + dashboardId: z.number().int().positive(), +}) + +// Type exports +export type PostHogDashboard = z.infer +export type CreateDashboardInput = z.infer +export type UpdateDashboardInput = z.infer +export type ListDashboardsData = z.infer +export type AddInsightToDashboardInput = z.infer +export type SimpleDashboard = z.infer diff --git a/products/mcp/typescript/src/schema/errors.ts b/products/mcp/typescript/src/schema/errors.ts new file mode 100644 index 0000000000..09bc1cd2a1 --- /dev/null +++ b/products/mcp/typescript/src/schema/errors.ts @@ -0,0 +1,40 @@ +import { z } from 'zod' + +export enum OrderByErrors { + Occurrences = 'occurrences', + FirstSeen = 'first_seen', + LastSeen = 'last_seen', + Users = 'users', + Sessions = 'sessions', +} + +export enum OrderDirectionErrors { + Ascending = 'ASC', + Descending = 'DESC', +} + +export enum StatusErrors { + Active = 'active', + Resolved = 'resolved', + All = 'all', + Suppressed = 'suppressed', +} + +export const ListErrorsSchema = z.object({ + orderBy: z.nativeEnum(OrderByErrors).optional(), + dateFrom: z.string().datetime().optional(), + dateTo: z.string().datetime().optional(), + orderDirection: z.nativeEnum(OrderDirectionErrors).optional(), + filterTestAccounts: z.boolean().optional(), + status: z.nativeEnum(StatusErrors).optional(), +}) + +export const ErrorDetailsSchema = z.object({ + issueId: z.string().uuid(), + dateFrom: z.string().datetime().optional(), + dateTo: z.string().datetime().optional(), +}) + +export type ListErrorsData = z.infer + +export type ErrorDetailsData = z.infer diff --git a/products/mcp/typescript/src/schema/experiments.ts b/products/mcp/typescript/src/schema/experiments.ts new file mode 100644 index 0000000000..30021b1b76 --- /dev/null +++ b/products/mcp/typescript/src/schema/experiments.ts @@ -0,0 +1,560 @@ +import { v4 as uuidv4 } from 'uuid' +import { z } from 'zod' +import { FeatureFlagSchema } from './flags' +import { + ExperimentCreateSchema as ToolExperimentCreateSchema, + ExperimentUpdateInputSchema as ToolExperimentUpdateInputSchema, +} from './tool-inputs' + +const ExperimentType = ['web', 'product'] as const + +const ExperimentConclusion = ['won', 'lost', 'inconclusive', 'stopped_early', 'invalid'] as const + +/** + * This is the schema for the experiment metric base properties. + * It references the ExperimentMetricBaseProperties type from + * @posthog/frontend/src/queries/schema/schema-general.ts + * + * TODO: Add the schemas for FunnelConversionWindowTimeUnit + */ +export const ExperimentMetricBasePropertiesSchema = z.object({ + kind: z.literal('ExperimentMetric'), + uuid: z.string().optional(), + name: z.string().optional(), + conversion_window: z.number().optional(), + conversion_window_unit: z.any().optional(), // FunnelConversionWindowTimeUnit +}) + +export type ExperimentMetricBaseProperties = z.infer + +/** + * This is the schema for the experiment metric outlier handling. + * It references the ExperimentMetricOutlierHandling type from + * @posthog/frontend/src/queries/schema/schema-general.ts + */ +export const ExperimentMetricOutlierHandlingSchema = z.object({ + lower_bound_percentile: z.number().optional(), + upper_bound_percentile: z.number().optional(), +}) + +export type ExperimentMetricOutlierHandling = z.infer + +/** + * This is the schema for the experiment metric source. + * It references the ExperimentMetricSource type from + * @posthog/frontend/src/queries/schema/schema-general.ts + * + * TODO: Add the schemas for the EventsNode and ActionsNode and ExperimentDataWarehouseNode + */ +export const ExperimentMetricSourceSchema = z.any() // EventsNode | ActionsNode | ExperimentDataWarehouseNode + +/** + * This is the schema for the experiment funnel metric step. + * It references the ExperimentFunnelMetricStep type from + * @posthog/frontend/src/queries/schema/schema-general.ts + * + * TODO: Add the schemas for the EventsNode and ActionsNode + */ +export const ExperimentFunnelMetricStepSchema = z.any() // EventsNode | ActionsNode + +/** + * This is the schema for the experiment mean metric. + * It references the ExperimentMeanMetric type from + * @posthog/frontend/src/queries/schema/schema-general.ts + */ +export const ExperimentMeanMetricSchema = z + .object({ + metric_type: z.literal('mean'), + source: ExperimentMetricSourceSchema, + }) + .merge(ExperimentMetricBasePropertiesSchema) + .merge(ExperimentMetricOutlierHandlingSchema) + +export type ExperimentMeanMetric = z.infer + +/** + * This is the schema for the experiment funnel metric. + * It references the ExperimentFunnelMetric type from + * @posthog/frontend/src/queries/schema/schema-general.ts + */ +export const ExperimentFunnelMetricSchema = z + .object({ + metric_type: z.literal('funnel'), + series: z.array(ExperimentFunnelMetricStepSchema), + funnel_order_type: z.any().optional(), // StepOrderValue + }) + .merge(ExperimentMetricBasePropertiesSchema) + +export type ExperimentFunnelMetric = z.infer + +/** + * This is the schema for the experiment ratio metric. + * It references the ExperimentRatioMetric type from + * @posthog/frontend/src/queries/schema/schema-general.ts + */ +export const ExperimentRatioMetricSchema = z + .object({ + metric_type: z.literal('ratio'), + numerator: ExperimentMetricSourceSchema, + denominator: ExperimentMetricSourceSchema, + }) + .merge(ExperimentMetricBasePropertiesSchema) + +export type ExperimentRatioMetric = z.infer + +/** + * This is the schema for the experiment metric. + * It references the ExperimentMetric type from + * @posthog/frontend/src/queries/schema/schema-general.ts + */ +export const ExperimentMetricSchema = z.union([ + ExperimentMeanMetricSchema, + ExperimentFunnelMetricSchema, + ExperimentRatioMetricSchema, +]) + +export type ExperimentMetric = z.infer + +/** + * This is the schema for the experiment exposure config. + * It references the ExperimentEventExposureConfig type from + * @posthog/frontend/src/queries/schema/schema-general.ts + */ +export const ExperimentEventExposureConfigSchema = z.object({ + kind: z.literal('ExperimentEventExposureConfig'), + event: z.string(), + properties: z.array(z.any()), // this is an array of AnyPropertyFilter +}) + +/** + * This is the schema for the experiment exposure criteria. + * It references the ExperimentExposureCriteria type from + * @posthog/frontend/src/queries/schema/schema-general.ts + */ +export const ExperimentExposureCriteriaSchema = z.object({ + filterTestAccounts: z.boolean().optional(), + exposure_config: ExperimentEventExposureConfigSchema.optional(), + multiple_variant_handling: z.enum(['exclude', 'first_seen']).optional(), +}) + +/** + * This is the schema for the experiment object. + * It references the Experiment type from + * @posthog/frontend/src/types.ts + */ +export const ExperimentSchema = z.object({ + id: z.number(), + name: z.string(), + type: z.enum(ExperimentType).nullish(), + description: z.string().nullish(), + feature_flag_key: z.string(), + feature_flag: FeatureFlagSchema.nullish(), + exposure_cohort: z.number().nullish(), + exposure_criteria: ExperimentExposureCriteriaSchema.nullish(), + /** + * We only type ExperimentMetrics. Legacy metric formats are not validated. + */ + metrics: z.array(z.union([ExperimentMetricSchema, z.any()])).nullish(), + metrics_secondary: z.array(z.union([ExperimentMetricSchema, z.any()])).nullish(), + saved_metrics: z.array(z.any()).nullish(), + saved_metrics_ids: z.array(z.any()).nullable(), + parameters: z + .object({ + feature_flag_variants: z + .array( + z.object({ + key: z.string(), + name: z.string().nullish(), + rollout_percentage: z.number().nullish(), + }) + ) + .nullish(), + minimum_detectable_effect: z.number().nullish(), + recommended_running_time: z.number().nullish(), + recommended_sample_size: z.number().nullish(), + }) + .nullish(), + start_date: z.string().nullish(), + end_date: z.string().nullish(), + archived: z.boolean(), + deleted: z.boolean(), + created_at: z.string(), + updated_at: z.string(), + holdout: z.any().nullish(), + holdout_id: z.number().nullish(), + stats_config: z.any().optional(), + conclusion: z.enum(ExperimentConclusion).nullish(), + conclusion_comment: z.string().nullish(), +}) + +export type Experiment = z.infer + +/** + * Schema for the API payload when creating an experiment + * This is derived from ExperimentSchema with appropriate omissions + */ +export const ExperimentApiPayloadSchema = ExperimentSchema.omit({ + id: true, + feature_flag: true, + exposure_cohort: true, + exposure_criteria: true, + saved_metrics: true, + saved_metrics_ids: true, + start_date: true, + end_date: true, + deleted: true, + archived: true, + created_at: true, + updated_at: true, + holdout: true, + stats_config: true, + conclusion: true, + conclusion_comment: true, +}).partial() + +export type ExperimentApiPayload = z.infer + +/** + * Schema for the API payload when updating an experiment + * Derived from ExperimentSchema, omitting fields that cannot be updated + */ +export const ExperimentUpdateApiPayloadSchema = ExperimentSchema.omit({ + id: true, + feature_flag: true, + feature_flag_key: true, + type: true, + exposure_cohort: true, + saved_metrics: true, + deleted: true, + created_at: true, + updated_at: true, + holdout: true, + holdout_id: true, +}).partial() + +export type ExperimentUpdateApiPayload = z.infer + +/** + * Transform tool input metrics to ExperimentMetric format for API + */ +const transformMetricToApi = (metric: any): z.infer => { + const uuid = uuidv4() + const base = { + kind: 'ExperimentMetric' as const, + uuid, + name: metric.name, + } + + switch (metric.metric_type) { + case 'mean': + return { + ...base, + metric_type: 'mean', + source: { + kind: 'EventsNode', + event: metric.event_name, + properties: metric.properties || {}, + }, + } + + case 'funnel': + return { + ...base, + metric_type: 'funnel', + series: (metric.funnel_steps || [metric.event_name]).map((event: string) => ({ + kind: 'EventsNode', + event, + properties: metric.properties || {}, + })), + } + + case 'ratio': + return { + ...base, + metric_type: 'ratio', + numerator: { + kind: 'EventsNode', + event: metric.event_name, + properties: metric.properties?.numerator || metric.properties || {}, + }, + denominator: { + kind: 'EventsNode', + event: metric.properties?.denominator_event || metric.event_name, + properties: metric.properties?.denominator || metric.properties || {}, + }, + } + + default: + throw new Error(`Unknown metric type: ${metric.metric_type}`) + } +} + +/** + * Transform tool input to API payload format + * This bridges the gap between user-friendly input and PostHog API requirements + */ +export const ExperimentCreatePayloadSchema = ToolExperimentCreateSchema.transform((input) => { + // Transform metrics with proper UUIDs + const primaryMetrics = input.primary_metrics?.map(transformMetricToApi) || [] + const secondaryMetrics = input.secondary_metrics?.map(transformMetricToApi) || [] + + return { + // Core fields + name: input.name, + description: input.description || null, + feature_flag_key: input.feature_flag_key, // Maps to get_feature_flag_key in serializer + type: input.type || 'product', + + // Metrics - ensure arrays are never null, always empty arrays when no metrics + metrics: primaryMetrics, + metrics_secondary: secondaryMetrics, + + // Metrics UUIDs for ordering - ensure arrays are never null + primary_metrics_ordered_uuids: primaryMetrics.map((m) => m.uuid), + secondary_metrics_ordered_uuids: secondaryMetrics.map((m) => m.uuid), + + // Legacy fields still required by API + filters: {}, // Legacy but still in model + secondary_metrics: secondaryMetrics, // Use the same array as metrics_secondary + saved_metrics_ids: [], // Empty array for saved metrics + + // Parameters with variants + parameters: { + feature_flag_variants: input.variants || [ + { key: 'control', name: 'Control', rollout_percentage: 50 }, + { key: 'test', name: 'Test', rollout_percentage: 50 }, + ], + minimum_detectable_effect: input.minimum_detectable_effect || 30, + }, + + // Exposure criteria + exposure_criteria: input.filter_test_accounts + ? { + filterTestAccounts: input.filter_test_accounts, + } + : null, + + // Stats config (empty, will be filled by backend) + stats_config: {}, + + // State fields + start_date: input.draft === false ? new Date().toISOString() : null, + end_date: null, + archived: false, + deleted: false, + + // Optional holdout + holdout_id: input.holdout_id || null, + } +}).pipe(ExperimentApiPayloadSchema) + +export type ExperimentCreatePayload = z.output + +/** + * Transform user-friendly update input to API payload format for experiment updates + * This handles partial updates with the same transformation patterns as creation + */ +export const ExperimentUpdateTransformSchema = ToolExperimentUpdateInputSchema.transform( + (input) => { + const updatePayload: Record = {} + + // Basic fields - direct mapping + if (input.name !== undefined) { + updatePayload.name = input.name + } + if (input.description !== undefined) { + updatePayload.description = input.description + } + + // Transform metrics if provided + if (input.primary_metrics !== undefined) { + updatePayload.metrics = input.primary_metrics.map(transformMetricToApi) + updatePayload.primary_metrics_ordered_uuids = updatePayload.metrics.map( + (m: any) => m.uuid! + ) + } + + if (input.secondary_metrics !== undefined) { + updatePayload.metrics_secondary = input.secondary_metrics.map(transformMetricToApi) + updatePayload.secondary_metrics_ordered_uuids = updatePayload.metrics_secondary.map( + (m: any) => m.uuid! + ) + } + + // Transform minimum detectable effect into parameters + if (input.minimum_detectable_effect !== undefined) { + updatePayload.parameters = { + ...updatePayload.parameters, + minimum_detectable_effect: input.minimum_detectable_effect, + } + } + + // Handle experiment state management + if (input.launch === true) { + updatePayload.start_date = new Date().toISOString() + } + + if (input.conclude !== undefined) { + updatePayload.conclusion = input.conclude + updatePayload.end_date = new Date().toISOString() + if (input.conclusion_comment !== undefined) { + updatePayload.conclusion_comment = input.conclusion_comment + } + } + + if (input.restart === true) { + updatePayload.end_date = null + updatePayload.conclusion = null + updatePayload.conclusion_comment = null + } + + if (input.archive !== undefined) { + updatePayload.archived = input.archive + } + + return updatePayload + } +).pipe(ExperimentUpdateApiPayloadSchema) + +export type ExperimentUpdateTransform = z.output + +/** + * This is the schema for the experiment exposure query. + * It references the ExperimentExposureQuery type from + * @posthog/frontend/src/queries/schema/schema-general.ts + */ +export const ExperimentExposureQuerySchema = z.object({ + kind: z.literal('ExperimentExposureQuery'), + experiment_id: z.number(), + experiment_name: z.string(), + exposure_criteria: ExperimentExposureCriteriaSchema.nullish(), + feature_flag: FeatureFlagSchema.optional(), + start_date: z.string().nullish(), + end_date: z.string().nullish(), + holdout: z.any().optional(), +}) + +export type ExperimentExposureQuery = z.infer + +export const ExperimentExposureTimeSeriesSchema = z.object({ + variant: z.string(), + days: z.array(z.string()), + exposure_counts: z.array(z.number()), +}) + +export const ExperimentExposureQueryResponseSchema = z.object({ + kind: z.literal('ExperimentExposureQuery'), // API returns the query kind, not a response kind + timeseries: z.array(ExperimentExposureTimeSeriesSchema), + total_exposures: z.record(z.string(), z.number()), + date_range: z.object({ + date_from: z.string(), + date_to: z.string().nullable(), // API can return null for date_to + }), +}) + +export type ExperimentExposureQueryResponse = z.infer + +export const ExperimentResultsResponseSchema = z + .object({ + experiment: ExperimentSchema.pick({ + id: true, + name: true, + description: true, + feature_flag_key: true, + start_date: true, + end_date: true, + metrics: true, + metrics_secondary: true, + parameters: true, // Pick parameters to extract variants + }).transform((data) => ({ + id: data.id, + name: data.name, + description: data.description, + feature_flag_key: data.feature_flag_key, + metrics: data.metrics, + metrics_secondary: data.metrics_secondary, + start_date: data.start_date, + end_date: data.end_date, + status: data.start_date ? (data.end_date ? 'completed' : 'running') : 'draft', + variants: data.parameters?.feature_flag_variants || [], + })), + exposures: ExperimentExposureQueryResponseSchema, + primaryMetricsResults: z.array(z.any()), + secondaryMetricsResults: z.array(z.any()), + }) + .transform(({ experiment, exposures, primaryMetricsResults, secondaryMetricsResults }) => { + return { + experiment, + exposures, + metrics: { + primary: { + count: primaryMetricsResults.length, + results: primaryMetricsResults + .map((result, index) => ({ + index, + data: result, + })) + .filter((item) => item.data !== null), + }, + secondary: { + count: secondaryMetricsResults.length, + results: secondaryMetricsResults + .map((result, index) => ({ + index, + data: result, + })) + .filter((item) => item.data !== null), + }, + }, + } + }) + +/** + * Schema for updating existing experiments + * All fields are optional to support partial updates + */ +export const ExperimentUpdatePayloadSchema = z + .object({ + name: z.string().optional(), + description: z.string().nullish(), + start_date: z.string().nullish(), + end_date: z.string().nullish(), + + // Parameters + parameters: z + .object({ + feature_flag_variants: z + .array( + z.object({ + key: z.string(), + name: z.string().optional(), + rollout_percentage: z.number(), + }) + ) + .optional(), + minimum_detectable_effect: z.number().nullish(), + recommended_running_time: z.number().nullish(), + recommended_sample_size: z.number().nullish(), + variant_screenshot_media_ids: z.record(z.array(z.string())).optional(), + }) + .optional(), + + // Metrics + metrics: z.array(ExperimentMetricSchema).optional(), + metrics_secondary: z.array(ExperimentMetricSchema).optional(), + primary_metrics_ordered_uuids: z.array(z.string()).nullish(), + secondary_metrics_ordered_uuids: z.array(z.string()).nullish(), + + // State management + archived: z.boolean().optional(), + conclusion: z.enum(ExperimentConclusion).nullish(), + conclusion_comment: z.string().nullish(), + + // Configuration + exposure_criteria: ExperimentExposureCriteriaSchema.optional(), + saved_metrics_ids: z.array(z.any()).nullish(), + stats_config: z.any().optional(), + }) + .strict() + +export type ExperimentUpdatePayload = z.infer diff --git a/products/mcp/typescript/src/schema/flags.ts b/products/mcp/typescript/src/schema/flags.ts new file mode 100644 index 0000000000..e5e0916786 --- /dev/null +++ b/products/mcp/typescript/src/schema/flags.ts @@ -0,0 +1,126 @@ +import { z } from 'zod' + +export interface PostHogFeatureFlag { + id: number + key: string + name: string +} + +export interface PostHogFlagsResponse { + results?: PostHogFeatureFlag[] +} +const base = ['exact', 'is_not', 'is_set', 'is_not_set'] as const +const stringOps = [ + ...base, + 'icontains', + 'not_icontains', + 'regex', + 'not_regex', + 'is_cleaned_path_exact', +] as const +const numberOps = [...base, 'gt', 'gte', 'lt', 'lte', 'min', 'max'] as const +const booleanOps = [...base] as const + +const arrayOps = ['in', 'not_in'] as const + +const operatorSchema = z.enum([ + ...stringOps, + ...numberOps, + ...booleanOps, + ...arrayOps, +] as unknown as [string, ...string[]]) + +export const PersonPropertyFilterSchema = z + .object({ + key: z.string(), + value: z.union([ + z.string(), + z.number(), + z.boolean(), + z.array(z.string()), + z.array(z.number()), + ]), + operator: operatorSchema.optional(), + }) + .superRefine((data, ctx) => { + const { value, operator } = data + if (!operator) { + return + } + const isArray = Array.isArray(value) + + const valid = + (typeof value === 'string' && stringOps.includes(operator as any)) || + (typeof value === 'number' && numberOps.includes(operator as any)) || + (typeof value === 'boolean' && booleanOps.includes(operator as any)) || + (isArray && arrayOps.includes(operator as any)) + + if (!valid) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: `operator "${operator}" is not valid for value type "${isArray ? 'array' : typeof value}"`, + }) + } + + if (!isArray && arrayOps.includes(operator as any)) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: `operator "${operator}" requires an array value`, + }) + } + }) + .transform((data) => { + // when using is_set or is_not_set, set the value the same as the operator + if (data.operator === 'is_set' || data.operator === 'is_not_set') { + data.value = data.operator + } + + return { + ...data, + type: 'person', + } + }) + +export type PersonPropertyFilter = z.infer + +export const FiltersSchema = z.object({ + properties: z.array(PersonPropertyFilterSchema), + rollout_percentage: z.number(), +}) + +export type Filters = z.infer + +export const FilterGroupsSchema = z.object({ + groups: z.array(FiltersSchema), +}) + +export type FilterGroups = z.infer + +export const CreateFeatureFlagInputSchema = z.object({ + name: z.string(), + key: z.string(), + description: z.string(), + filters: FilterGroupsSchema, + active: z.boolean(), + tags: z.array(z.string()).optional(), +}) + +export type CreateFeatureFlagInput = z.infer + +export const UpdateFeatureFlagInputSchema = CreateFeatureFlagInputSchema.omit({ + key: true, +}).partial() + +export type UpdateFeatureFlagInput = z.infer + +export const FeatureFlagSchema = z.object({ + id: z.number(), + key: z.string(), + name: z.string(), + description: z.string().nullish(), + filters: z.any().nullish(), + active: z.boolean(), + tags: z.array(z.string()).optional(), +}) + +export type FeatureFlag = z.infer diff --git a/products/mcp/typescript/src/schema/insights.ts b/products/mcp/typescript/src/schema/insights.ts new file mode 100644 index 0000000000..c2a2f6bb96 --- /dev/null +++ b/products/mcp/typescript/src/schema/insights.ts @@ -0,0 +1,97 @@ +import { z } from 'zod' + +export const InsightSchema = z.object({ + id: z.number(), + short_id: z.string(), + name: z.string().nullish(), + description: z.string().nullish(), + filters: z.record(z.any()), + query: z.any(), + result: z.any().optional(), + created_at: z.string(), + updated_at: z.string(), + created_by: z + .object({ + id: z.number(), + uuid: z.string().uuid(), + distinct_id: z.string(), + first_name: z.string(), + email: z.string(), + }) + .optional() + .nullable(), + favorited: z.boolean().nullish(), + deleted: z.boolean(), + dashboard: z.number().nullish(), + layouts: z.record(z.any()).nullish(), + color: z.string().nullish(), + last_refresh: z.string().nullish(), + refreshing: z.boolean().nullish(), + tags: z.array(z.string()).nullish(), +}) + +export const SimpleInsightSchema = InsightSchema.pick({ + id: true, + name: true, + short_id: true, + description: true, + filters: true, + query: true, + created_at: true, + updated_at: true, + favorited: true, +}) + +export const CreateInsightInputSchema = z.object({ + name: z.string(), + query: z.object({ + kind: z.union([z.literal('InsightVizNode'), z.literal('DataVisualizationNode')]), + source: z + .any() + .describe( + 'For new insights, use the query from your successful query-run tool call. For updates, the existing query can optionally be reused.' + ), // NOTE: This is intentionally z.any() to avoid populating the context with the complicated query schema, but we prompt the LLM to use 'query-run' to check queries, before creating insights. + }), + description: z.string().optional(), + favorited: z.boolean(), + tags: z.array(z.string()).optional(), +}) + +export const UpdateInsightInputSchema = z.object({ + name: z.string().optional(), + description: z.string().optional(), + filters: z.record(z.any()).optional(), + query: z.object({ + kind: z.union([z.literal('InsightVizNode'), z.literal('DataVisualizationNode')]), + source: z + .any() + .describe( + 'For new insights, use the query from your successful query-run tool call. For updates, the existing query can optionally be reused' + ), // NOTE: This is intentionally z.any() to avoid populating the context with the complicated query schema, and to allow the LLM to make a change to an existing insight whose schema we do not support in our simplified subset of the full insight schema. + }), + favorited: z.boolean().optional(), + dashboard: z.number().optional(), + tags: z.array(z.string()).optional(), +}) + +export const ListInsightsSchema = z.object({ + limit: z.number().optional(), + offset: z.number().optional(), + favorited: z.boolean().optional(), + search: z.string().optional(), +}) + +export type PostHogInsight = z.infer +export type CreateInsightInput = z.infer +export type UpdateInsightInput = z.infer +export type ListInsightsData = z.infer +export type SimpleInsight = z.infer + +export const SQLInsightResponseSchema = z.array( + z.object({ + type: z.string(), + data: z.record(z.any()), + }) +) + +export type SQLInsightResponse = z.infer diff --git a/products/mcp/typescript/src/schema/orgs.ts b/products/mcp/typescript/src/schema/orgs.ts new file mode 100644 index 0000000000..47a36fc8ef --- /dev/null +++ b/products/mcp/typescript/src/schema/orgs.ts @@ -0,0 +1,8 @@ +import { z } from 'zod' + +export const OrganizationSchema = z.object({ + id: z.string().uuid(), + name: z.string(), +}) + +export type Organization = z.infer diff --git a/products/mcp/typescript/src/schema/projects.ts b/products/mcp/typescript/src/schema/projects.ts new file mode 100644 index 0000000000..f305a063b9 --- /dev/null +++ b/products/mcp/typescript/src/schema/projects.ts @@ -0,0 +1,9 @@ +import { z } from 'zod' + +export const ProjectSchema = z.object({ + id: z.number(), + name: z.string(), + organization: z.string().uuid(), +}) + +export type Project = z.infer diff --git a/products/mcp/typescript/src/schema/properties.ts b/products/mcp/typescript/src/schema/properties.ts new file mode 100644 index 0000000000..b639f45166 --- /dev/null +++ b/products/mcp/typescript/src/schema/properties.ts @@ -0,0 +1,21 @@ +import { + ApiEventDefinitionSchema, + type ApiListResponseSchema, + ApiPropertyDefinitionSchema, +} from '@/schema/api' +import type { z } from 'zod' + +export const PropertyDefinitionSchema = ApiPropertyDefinitionSchema.pick({ + name: true, + property_type: true, +}) + +export const EventDefinitionSchema = ApiEventDefinitionSchema.pick({ + name: true, + last_seen_at: true, +}) + +export type PropertyDefinition = z.infer +export type PropertyDefinitionsResponse = z.infer< + ReturnType> +> diff --git a/products/mcp/typescript/src/schema/query.ts b/products/mcp/typescript/src/schema/query.ts new file mode 100644 index 0000000000..2568dd95d0 --- /dev/null +++ b/products/mcp/typescript/src/schema/query.ts @@ -0,0 +1,251 @@ +import { z } from 'zod' + +// Common enums and types +const NodeKind = z.enum(['TrendsQuery', 'FunnelsQuery', 'HogQLQuery', 'EventsNode']) + +const IntervalType = z.enum(['hour', 'day', 'week', 'month']) + +const ChartDisplayType = z.enum([ + 'ActionsLineGraph', + 'ActionsTable', + 'ActionsPie', + 'ActionsBar', + 'ActionsBarValue', + 'WorldMap', + 'BoldNumber', +]) + +// NOTE: Breakdowns are restricted to either person or event for simplicity +const BreakdownType = z.enum(['person', 'event']) + +const FunnelVizType = z.enum(['steps', 'time_to_convert', 'trends']) + +const FunnelOrderType = z.enum(['ordered', 'unordered', 'strict']) + +const FunnelStepReference = z.enum(['total', 'previous']) + +const BreakdownAttributionType = z.enum(['first_touch', 'last_touch', 'all_events']) + +const FunnelLayout = z.enum(['horizontal', 'vertical']) + +const FunnelConversionWindowTimeUnit = z.enum(['minute', 'hour', 'day', 'week', 'month']) + +// Base schemas +const DateRange = z.object({ + date_from: z.string().nullable().optional(), + date_to: z.string().nullable().optional(), + explicitDate: z.boolean().optional(), +}) + +const PropertyFilter = z.object({ + key: z.string(), + value: z + .union([z.string(), z.number(), z.array(z.string()), z.array(z.number())]) + .nullable() + .optional(), + operator: z.string().optional(), + type: z.string().optional(), +}) + +// NOTE: Only a single level of nesting is supported here, since we can't specify recursive schema for tool inputs. +const PropertyGroupFilter = z.object({ + type: z.enum(['AND', 'OR']), + values: z.array(PropertyFilter), +}) + +const AnyPropertyFilter = z.union([PropertyFilter, PropertyGroupFilter]) + +const HogQLVariable = z.object({ + variableId: z.string(), + code_name: z.string(), + value: z.any().optional(), + isNull: z.boolean().optional(), +}) + +const HogQLFilters = z.object({ + properties: z.array(AnyPropertyFilter).optional(), + dateRange: DateRange.optional(), + filterTestAccounts: z.boolean().optional(), +}) + +// Math types that don't require a property +const BaseMathType = z.enum([ + 'total', + 'dau', + 'weekly_active', + 'monthly_active', + 'unique_session', + 'first_time_for_user', + 'first_matching_event_for_user', +]) + +// Math types that require a math_property +const PropertyMathType = z.enum(['avg', 'sum', 'min', 'max', 'median', 'p75', 'p90', 'p95', 'p99']) + +// Combined math types +const MathType = z.union([BaseMathType, PropertyMathType]) + +const PROPERTY_MATH_TYPES = ['avg', 'sum', 'min', 'max', 'median', 'p75', 'p90', 'p95', 'p99'] + +// Base entity object without refinement for extension +const BaseEntityObject = z.object({ + custom_name: z.string().describe('A display name'), + math: MathType.optional(), + math_property: z.string().optional(), + properties: z.union([z.array(AnyPropertyFilter), PropertyGroupFilter]).optional(), +}) + +const EventsNode = BaseEntityObject.extend({ + kind: z.literal('EventsNode'), + event: z.string().optional(), + limit: z.number().optional(), +}).refine( + (data) => { + if (PROPERTY_MATH_TYPES.includes(data.math || '')) { + return !!data.math_property + } + return true + }, + { + message: `math_property is required for ${PROPERTY_MATH_TYPES.join(', ')} math types`, + } +) + +const AnyEntityNode = EventsNode + +// Base query interface +const InsightsQueryBase = z.object({ + dateRange: DateRange.optional(), + filterTestAccounts: z.boolean().optional().default(false), + properties: z + .union([z.array(AnyPropertyFilter), PropertyGroupFilter]) + .optional() + .default([]), +}) + +// Breakdown filter +const BreakdownFilter = z.object({ + breakdown_type: BreakdownType.nullable().optional().default('event'), + breakdown_limit: z.number().optional(), + breakdown: z + .union([z.string(), z.number(), z.array(z.union([z.string(), z.number()]))]) + .nullable() + .optional(), +}) + +// Compare filter +const CompareFilter = z.object({ + compare: z.boolean().optional().default(false), + compare_to: z.string().optional(), +}) + +// Trends filter +const TrendsFilter = z.object({ + display: ChartDisplayType.optional().default('ActionsLineGraph'), + showLegend: z.boolean().optional().default(false), +}) + +// Trends query +const TrendsQuerySchema = InsightsQueryBase.extend({ + kind: z.literal('TrendsQuery'), + interval: IntervalType.optional().default('day'), + series: z.array(AnyEntityNode), + trendsFilter: TrendsFilter.optional(), + breakdownFilter: BreakdownFilter.optional(), + compareFilter: CompareFilter.optional(), + conversionGoal: z.any().nullable().optional(), +}) + +// HogQL query +const HogQLQuerySchema = z.object({ + kind: z.literal('HogQLQuery'), + query: z.string(), + filters: HogQLFilters.optional(), +}) + +// Funnels filter +const FunnelsFilter = z.object({ + layout: FunnelLayout.optional(), + breakdownAttributionType: BreakdownAttributionType.optional(), + breakdownAttributionValue: z.number().optional(), + funnelToStep: z.number().optional(), + funnelFromStep: z.number().optional(), + funnelOrderType: FunnelOrderType.optional(), + funnelVizType: FunnelVizType.optional(), + funnelWindowInterval: z.number().optional().default(14), + funnelWindowIntervalUnit: FunnelConversionWindowTimeUnit.optional().default('day'), + funnelStepReference: FunnelStepReference.optional(), +}) + +// Funnels query +const FunnelsQuerySchema = InsightsQueryBase.extend({ + kind: z.literal('FunnelsQuery'), + interval: IntervalType.optional(), + series: z.array(AnyEntityNode).min(2, 'At least two steps are required for a funnel'), + funnelsFilter: FunnelsFilter.optional(), + breakdownFilter: BreakdownFilter.optional(), +}) + +// Insight Schema +const InsightVizNodeSchema = z.object({ + kind: z.literal('InsightVizNode'), + source: z.discriminatedUnion('kind', [TrendsQuerySchema, FunnelsQuerySchema]), +}) + +const DataVisualizationNodeSchema = z.object({ + kind: z.literal('DataVisualizationNode'), + source: HogQLQuerySchema, +}) + +// Any insight query +const InsightQuerySchema = z.discriminatedUnion('kind', [ + InsightVizNodeSchema, + DataVisualizationNodeSchema, +]) + +// Export all schemas +export { + // Enums + NodeKind, + IntervalType, + ChartDisplayType, + BreakdownType, + FunnelVizType, + FunnelOrderType, + FunnelStepReference, + BreakdownAttributionType, + FunnelLayout, + FunnelConversionWindowTimeUnit, + // Math types + BaseMathType, + PropertyMathType, + MathType, + // Base types + DateRange, + PropertyFilter, + PropertyGroupFilter, + AnyPropertyFilter, + // Entity nodes + EventsNode, + AnyEntityNode, + // Filters + BreakdownFilter, + CompareFilter, + TrendsFilter, + FunnelsFilter, + // HogQL types + HogQLVariable, + HogQLFilters, + // Queries + TrendsQuerySchema, + FunnelsQuerySchema, + HogQLQuerySchema, + InsightVizNodeSchema, + DataVisualizationNodeSchema, + InsightQuerySchema, +} + +export type TrendsQuery = z.infer +export type FunnelsQuery = z.infer +export type HogQLQuery = z.infer +export type InsightQuery = z.infer diff --git a/products/mcp/typescript/src/schema/surveys.ts b/products/mcp/typescript/src/schema/surveys.ts new file mode 100644 index 0000000000..9c60cfb8d3 --- /dev/null +++ b/products/mcp/typescript/src/schema/surveys.ts @@ -0,0 +1,675 @@ +import { z } from 'zod' +import { FilterGroupsSchema } from './flags.js' + +// Survey question types +const BaseSurveyQuestionSchema = z.object({ + question: z.string(), + description: z.string().optional(), + descriptionContentType: z.enum(['html', 'text']).optional(), + optional: z.boolean().optional(), + buttonText: z.string().optional(), +}) + +// Branching logic schemas +const NextQuestionBranching = z.object({ + type: z.literal('next_question'), +}) + +const EndBranching = z.object({ + type: z.literal('end'), +}) + +// Choice response branching - uses numeric choice indices (0, 1, 2, etc.) +const ChoiceResponseBranching = z + .object({ + type: z.literal('response_based'), + responseValues: z + .record(z.string(), z.union([z.number(), z.literal('end')])) + .describe( + "Only include keys for responses that should branch to a specific question or 'end'. Omit keys for responses that should proceed to the next question (default behavior)." + ), + }) + .describe( + 'For single choice questions: use choice indices as string keys ("0", "1", "2", etc.)' + ) + +// NPS sentiment branching - uses sentiment categories +const NPSSentimentBranching = z + .object({ + type: z.literal('response_based'), + responseValues: z + .record( + z + .enum(['detractors', 'passives', 'promoters']) + .describe( + 'NPS sentiment categories: detractors (0-6), passives (7-8), promoters (9-10)' + ), + z.union([z.number(), z.literal('end')]) + ) + .describe( + "Only include keys for responses that should branch to a specific question or 'end'. Omit keys for responses that should proceed to the next question (default behavior)." + ), + }) + .describe( + 'For NPS rating questions: use sentiment keys based on score ranges - detractors (0-6), passives (7-8), promoters (9-10)' + ) + +// Match type enum for URL and device type targeting +const MatchTypeEnum = z + .enum(['regex', 'not_regex', 'exact', 'is_not', 'icontains', 'not_icontains']) + .describe( + "URL/device matching types: 'regex' (matches regex pattern), 'not_regex' (does not match regex pattern), 'exact' (exact string match), 'is_not' (not exact match), 'icontains' (case-insensitive contains), 'not_icontains' (case-insensitive does not contain)" + ) + +// Rating sentiment branching - uses sentiment categories +const RatingSentimentBranching = z + .object({ + type: z.literal('response_based'), + responseValues: z + .record( + z + .enum(['negative', 'neutral', 'positive']) + .describe( + 'Rating sentiment categories: negative (lower third of scale), neutral (middle third), positive (upper third)' + ), + z.union([z.number(), z.literal('end')]) + ) + .describe( + "Only include keys for responses that should branch to a specific question or 'end'. Omit keys for responses that should proceed to the next question (default behavior)." + ), + }) + .describe( + 'For rating questions: use sentiment keys based on scale thirds - negative (lower third), neutral (middle third), positive (upper third)' + ) + +const SpecificQuestionBranching = z.object({ + type: z.literal('specific_question'), + index: z.number(), +}) + +// Branching schema unions for different question types +const ChoiceBranching = z.union([ + NextQuestionBranching, + EndBranching, + ChoiceResponseBranching, + SpecificQuestionBranching, +]) + +const NPSBranching = z.union([ + NextQuestionBranching, + EndBranching, + NPSSentimentBranching, + SpecificQuestionBranching, +]) + +const RatingBranching = z.union([ + NextQuestionBranching, + EndBranching, + RatingSentimentBranching, + SpecificQuestionBranching, +]) + +// Question schemas - cleaner naming without Schema suffix +const OpenQuestion = BaseSurveyQuestionSchema.extend({ + type: z.literal('open'), +}) + +const LinkQuestion = BaseSurveyQuestionSchema.extend({ + type: z.literal('link'), + link: z.string().url(), +}) + +const RatingQuestion = BaseSurveyQuestionSchema.extend({ + type: z.literal('rating'), + display: z + .enum(['number', 'emoji']) + .optional() + .describe("Display format: 'number' shows numeric scale, 'emoji' shows emoji scale"), + scale: z + .union([z.literal(3), z.literal(5), z.literal(7)]) + .optional() + .describe('Rating scale can be one of 3, 5, or 7'), + lowerBoundLabel: z + .string() + .optional() + .describe("Label for the lowest rating (e.g., 'Very Poor')"), + upperBoundLabel: z + .string() + .optional() + .describe("Label for the highest rating (e.g., 'Excellent')"), + branching: RatingBranching.optional(), +}).superRefine((data, ctx) => { + // Validate display-specific scale constraints + if (data.display === 'emoji' && data.scale && ![3, 5].includes(data.scale)) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Emoji display only supports scales of 3 or 5', + path: ['scale'], + }) + } + + if (data.display === 'number' && data.scale && ![5, 7].includes(data.scale)) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Number display only supports scales of 5 or 7', + path: ['scale'], + }) + } + + // Validate response-based branching for rating questions + if (data.branching?.type === 'response_based') { + const responseValues = data.branching.responseValues + const validSentiments = ['negative', 'neutral', 'positive'] + + // Check that all response keys are valid sentiment categories + for (const key of Object.keys(responseValues)) { + if (!validSentiments.includes(key)) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: `Invalid sentiment key "${key}". Must be one of: ${validSentiments.join(', ')}`, + path: ['branching', 'responseValues', key], + }) + } + } + } +}) + +const NPSRatingQuestion = BaseSurveyQuestionSchema.extend({ + type: z.literal('rating'), + display: z.literal('number').describe('NPS questions always use numeric scale'), + scale: z.literal(10).describe('NPS questions always use 0-10 scale'), + lowerBoundLabel: z + .string() + .optional() + .describe("Label for 0 rating (typically 'Not at all likely')"), + upperBoundLabel: z + .string() + .optional() + .describe("Label for 10 rating (typically 'Extremely likely')"), + branching: NPSBranching.optional(), +}).superRefine((data, ctx) => { + // Validate response-based branching for NPS rating questions + if (data.branching?.type === 'response_based') { + const responseValues = data.branching.responseValues + const validNPSCategories = ['detractors', 'passives', 'promoters'] + + // Check that all response keys are valid NPS sentiment categories + for (const key of Object.keys(responseValues)) { + if (!validNPSCategories.includes(key)) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: `Invalid NPS category "${key}". Must be one of: ${validNPSCategories.join(', ')}`, + path: ['branching', 'responseValues', key], + }) + } + } + } +}) + +const SingleChoiceQuestion = BaseSurveyQuestionSchema.extend({ + type: z.literal('single_choice'), + choices: z + .array(z.string().min(1, 'Choice text cannot be empty')) + .min(2, 'Must have at least 2 choices') + .max(20, 'Cannot have more than 20 choices') + .describe( + 'Array of choice options. Choice indices (0, 1, 2, etc.) are used for branching logic' + ), + shuffleOptions: z + .boolean() + .optional() + .describe('Whether to randomize the order of choices for each respondent'), + hasOpenChoice: z + .boolean() + .optional() + .describe("Whether the last choice (typically 'Other', is an open text input question"), + branching: ChoiceBranching.optional(), +}).superRefine((data, ctx) => { + // Validate unique choices + const uniqueChoices = new Set(data.choices) + if (uniqueChoices.size !== data.choices.length) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'All choices must be unique', + path: ['choices'], + }) + } + + // Validate hasOpenChoice logic + if (data.hasOpenChoice && data.choices.length === 0) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Cannot have open choice without any regular choices', + path: ['hasOpenChoice'], + }) + } + + // Validate response-based branching for single choice questions + if (data.branching?.type === 'response_based') { + const responseValues = data.branching.responseValues + const choiceCount = data.choices.length + + // Check that all response keys are valid choice indices + for (const key of Object.keys(responseValues)) { + const choiceIndex = Number.parseInt(key, 10) + if (Number.isNaN(choiceIndex) || choiceIndex < 0 || choiceIndex >= choiceCount) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: `Invalid choice index "${key}". Must be between 0 and ${choiceCount - 1}`, + path: ['branching', 'responseValues', key], + }) + } + } + } +}) + +const MultipleChoiceQuestion = BaseSurveyQuestionSchema.extend({ + type: z.literal('multiple_choice'), + choices: z + .array(z.string().min(1, 'Choice text cannot be empty')) + .min(2, 'Must have at least 2 choices') + .max(20, 'Cannot have more than 20 choices') + .describe( + 'Array of choice options. Multiple selections allowed. No branching logic supported.' + ), + shuffleOptions: z + .boolean() + .optional() + .describe('Whether to randomize the order of choices for each respondent'), + hasOpenChoice: z + .boolean() + .optional() + .describe("Whether the last choice (typically 'Other', is an open text input question"), +}) + +// Input schema - strict validation for user input +export const SurveyQuestionInputSchema = z + .union([ + OpenQuestion, + LinkQuestion, + RatingQuestion, + NPSRatingQuestion, + SingleChoiceQuestion, + MultipleChoiceQuestion, + ]) + .superRefine((data, ctx) => { + // Validate that branching is only used with supported question types + if (!('branching' in data) || !data.branching) { + return + } + + const supportedTypes = ['rating', 'single_choice'] + if (!supportedTypes.includes(data.type)) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: `Branching is not supported for question type "${data.type}". Only supported for: ${supportedTypes.join(', ')}`, + path: ['branching'], + }) + } + }) + +// Output schema - permissive for API responses +export const SurveyQuestionOutputSchema = z.object({ + type: z.string(), + question: z.string().nullish(), + description: z.string().nullish(), + descriptionContentType: z.enum(['html', 'text']).nullish(), + optional: z.boolean().nullish(), + buttonText: z.string().nullish(), + // Rating question fields + display: z.string().nullish(), + scale: z.number().nullish(), + lowerBoundLabel: z.string().nullish(), + upperBoundLabel: z.string().nullish(), + // Choice question fields + choices: z.array(z.string()).nullish(), + shuffleOptions: z.boolean().nullish(), + hasOpenChoice: z.boolean().nullish(), + // Link question fields + link: z.string().nullish(), + // Branching logic + branching: z.any().nullish(), +}) + +// Survey targeting conditions - used in input schema +const SurveyConditions = z.object({ + url: z.string().optional(), + selector: z.string().optional(), + seenSurveyWaitPeriodInDays: z + .number() + .optional() + .describe("Don't show this survey to users who saw any survey in the last x days."), + urlMatchType: MatchTypeEnum.optional(), + events: z + .object({ + repeatedActivation: z + .boolean() + .optional() + .describe( + 'Whether to show the survey every time one of the events is triggered (true), or just once (false)' + ), + values: z + .array( + z.object({ + name: z.string(), + }) + ) + .optional() + .describe('Array of event names that trigger the survey'), + }) + .optional(), + deviceTypes: z.array(z.enum(['Desktop', 'Mobile', 'Tablet'])).optional(), + deviceTypesMatchType: MatchTypeEnum.optional(), + linkedFlagVariant: z + .string() + .optional() + .describe('The variant of the feature flag linked to this survey'), +}) + +// Survey appearance customization - input schema +const SurveyAppearance = z.object({ + backgroundColor: z.string().optional(), + submitButtonColor: z.string().optional(), + textColor: z.string().optional(), // deprecated, use auto contrast text color instead + submitButtonText: z.string().optional(), + submitButtonTextColor: z.string().optional(), + descriptionTextColor: z.string().optional(), + ratingButtonColor: z.string().optional(), + ratingButtonActiveColor: z.string().optional(), + ratingButtonHoverColor: z.string().optional(), + whiteLabel: z.boolean().optional(), + autoDisappear: z.boolean().optional(), + displayThankYouMessage: z.boolean().optional(), + thankYouMessageHeader: z.string().optional(), + thankYouMessageDescription: z.string().optional(), + thankYouMessageDescriptionContentType: z.enum(['html', 'text']).optional(), + thankYouMessageCloseButtonText: z.string().optional(), + borderColor: z.string().optional(), + placeholder: z.string().optional(), + shuffleQuestions: z.boolean().optional(), + surveyPopupDelaySeconds: z.number().optional(), + widgetType: z.enum(['button', 'tab', 'selector']).optional(), + widgetSelector: z.string().optional(), + widgetLabel: z.string().optional(), + widgetColor: z.string().optional(), + fontFamily: z.string().optional(), + maxWidth: z.string().optional(), + zIndex: z.string().optional(), + disabledButtonOpacity: z.string().optional(), + boxPadding: z.string().optional(), +}) + +// User data from API responses - output schema +const User = z.object({ + id: z.number(), + uuid: z.string(), + distinct_id: z.string(), + first_name: z.string(), + email: z.string(), +}) + +// Survey input schemas +export const CreateSurveyInputSchema = z.object({ + name: z.string().min(1, 'Survey name cannot be empty'), + description: z.string().optional(), + type: z.enum(['popover', 'api', 'widget', 'external_survey']).optional(), + questions: z.array(SurveyQuestionInputSchema).min(1, 'Survey must have at least one question'), + appearance: SurveyAppearance.optional(), + start_date: z + .string() + .datetime() + .nullable() + .optional() + .default(null) + .describe( + "Setting this will launch the survey immediately. Don't add a start_date unless explicitly requested to do so." + ), + responses_limit: z + .number() + .positive('Response limit must be positive') + .nullable() + .optional() + .describe('The maximum number of responses before automatically stopping the survey.'), + iteration_count: z + .number() + .positive('Iteration count must be positive') + .nullable() + .optional() + .describe( + "For a recurring schedule, this field specifies the number of times the survey should be shown to the user. Use 1 for 'once every X days', higher numbers for multiple repetitions. Works together with iteration_frequency_days to determine the overall survey schedule." + ), + iteration_frequency_days: z + .number() + .positive('Iteration frequency must be positive') + .max(365, 'Iteration frequency cannot exceed 365 days') + .nullable() + .optional() + .describe( + 'For a recurring schedule, this field specifies the interval in days between each survey instance shown to the user, used alongside iteration_count for precise scheduling.' + ), + enable_partial_responses: z + .boolean() + .optional() + .describe( + 'When at least one question is answered, the response is stored (true). The response is stored when all questions are answered (false).' + ), + linked_flag_id: z + .number() + .nullable() + .optional() + .describe('The feature flag linked to this survey'), + targeting_flag_filters: FilterGroupsSchema.optional().describe( + "Target specific users based on their properties. Example: {groups: [{properties: [{key: 'email', value: ['@company.com'], operator: 'icontains'}], rollout_percentage: 100}]}" + ), +}) + +export const UpdateSurveyInputSchema = z.object({ + name: z.string().min(1, 'Survey name cannot be empty').optional(), + description: z.string().optional(), + type: z.enum(['popover', 'api', 'widget', 'external_survey']).optional(), + questions: z + .array(SurveyQuestionInputSchema) + .min(1, 'Survey must have at least one question') + .optional(), + conditions: SurveyConditions.optional(), + appearance: SurveyAppearance.optional(), + schedule: z + .enum(['once', 'recurring', 'always']) + .optional() + .describe( + "Survey scheduling behavior: 'once' = show once per user (default), 'recurring' = repeat based on iteration_count and iteration_frequency_days settings, 'always' = show every time conditions are met (mainly for widget surveys)" + ), + start_date: z + .string() + .datetime() + .optional() + .describe( + 'When the survey should start being shown to users. Setting this will launch the survey' + ), + end_date: z + .string() + .datetime() + .optional() + .describe( + 'When the survey stopped being shown to users. Setting this will complete the survey.' + ), + archived: z.boolean().optional(), + responses_limit: z + .number() + .positive('Response limit must be positive') + .nullable() + .optional() + .describe('The maximum number of responses before automatically stopping the survey.'), + iteration_count: z + .number() + .positive('Iteration count must be positive') + .nullable() + .optional() + .describe( + "For a recurring schedule, this field specifies the number of times the survey should be shown to the user. Use 1 for 'once every X days', higher numbers for multiple repetitions. Works together with iteration_frequency_days to determine the overall survey schedule." + ), + iteration_frequency_days: z + .number() + .positive('Iteration frequency must be positive') + .max(365, 'Iteration frequency cannot exceed 365 days') + .nullable() + .optional() + .describe( + 'For a recurring schedule, this field specifies the interval in days between each survey instance shown to the user, used alongside iteration_count for precise scheduling.' + ), + enable_partial_responses: z + .boolean() + .optional() + .describe( + 'When at least one question is answered, the response is stored (true). The response is stored when all questions are answered (false).' + ), + linked_flag_id: z + .number() + .nullable() + .optional() + .describe('The feature flag to link to this survey'), + targeting_flag_id: z + .number() + .optional() + .describe('An existing targeting flag to use for this survey'), + targeting_flag_filters: FilterGroupsSchema.optional().describe( + "Target specific users based on their properties. Example: {groups: [{properties: [{key: 'email', value: ['@company.com'], operator: 'icontains'}], rollout_percentage: 50}]}" + ), + remove_targeting_flag: z + .boolean() + .optional() + .describe( + 'Set to true to completely remove all targeting filters from the survey, making it visible to all users (subject to other display conditions like URL matching).' + ), +}) + +export const ListSurveysInputSchema = z.object({ + limit: z.number().optional(), + offset: z.number().optional(), + search: z.string().optional(), +}) + +// Survey output schemas - permissive, comprehensive +export const SurveyOutputSchema = z.object({ + id: z.string(), + name: z.string(), + description: z.string().nullish(), + type: z.enum(['popover', 'api', 'widget', 'external_survey']), + questions: z.array(SurveyQuestionOutputSchema), + conditions: SurveyConditions.nullish(), + appearance: SurveyAppearance.nullish(), + created_at: z.string(), + created_by: User.nullish(), + start_date: z.string().nullish(), + end_date: z.string().nullish(), + archived: z.boolean().nullish(), + responses_limit: z.number().nullish(), + iteration_count: z.number().nullish(), + iteration_frequency_days: z.number().nullish(), + enable_partial_responses: z.boolean().nullish(), + linked_flag_id: z.number().nullish(), + schedule: z.string().nullish(), + targeting_flag: z + .any() + .nullish() + .describe( + "Target specific users based on their properties. Example: {groups: [{properties: [{key: 'email', value: ['@company.com'], operator: 'icontains'}], rollout_percentage: 50}]}" + ), +}) + +// Survey list item - lightweight version for list endpoints +export const SurveyListItemOutputSchema = z.object({ + id: z.string(), + name: z.string(), + description: z.string().nullish(), + type: z.enum(['popover', 'api', 'widget', 'external_survey']), + archived: z.boolean().nullish(), + created_at: z.string(), + created_by: User.nullish(), + start_date: z.string().nullish(), + end_date: z.string().nullish(), + conditions: z.any().nullish(), + responses_limit: z.number().nullish(), + targeting_flag: z.any().nullish(), + iteration_count: z.number().nullish(), + iteration_frequency_days: z.number().nullish(), +}) + +// Survey response statistics schemas +export const SurveyEventStatsOutputSchema = z.object({ + total_count: z.number().nullish(), + total_count_only_seen: z.number().nullish(), + unique_persons: z.number().nullish(), + unique_persons_only_seen: z.number().nullish(), + first_seen: z.string().nullish(), + last_seen: z.string().nullish(), +}) + +export const SurveyRatesOutputSchema = z.object({ + response_rate: z.number().nullish(), + dismissal_rate: z.number().nullish(), + unique_users_response_rate: z.number().nullish(), + unique_users_dismissal_rate: z.number().nullish(), +}) + +export const SurveyResponseStatsOutputSchema = z.object({ + survey_id: z.string().nullish(), + start_date: z.string().nullish(), + end_date: z.string().nullish(), + stats: z + .object({ + 'survey shown': SurveyEventStatsOutputSchema.nullish(), + 'survey dismissed': SurveyEventStatsOutputSchema.nullish(), + 'survey sent': SurveyEventStatsOutputSchema.nullish(), + }) + .nullish(), + rates: z.object({ + response_rate: z.number().nullish(), + dismissal_rate: z.number().nullish(), + unique_users_response_rate: z.number().nullish(), + unique_users_dismissal_rate: z.number().nullish(), + }), +}) + +export const GetSurveyStatsInputSchema = z.object({ + date_from: z + .string() + .datetime() + .optional() + .describe('Optional ISO timestamp for start date (e.g. 2024-01-01T00:00:00Z)'), + date_to: z + .string() + .datetime() + .optional() + .describe('Optional ISO timestamp for end date (e.g. 2024-01-31T23:59:59Z)'), +}) + +export const GetSurveySpecificStatsInputSchema = z.object({ + survey_id: z.string(), + date_from: z + .string() + .datetime() + .optional() + .describe('Optional ISO timestamp for start date (e.g. 2024-01-01T00:00:00Z)'), + date_to: z + .string() + .datetime() + .optional() + .describe('Optional ISO timestamp for end date (e.g. 2024-01-31T23:59:59Z)'), +}) + +// Input types +export type CreateSurveyInput = z.infer +export type UpdateSurveyInput = z.infer +export type ListSurveysInput = z.infer +export type GetSurveyStatsInput = z.infer +export type GetSurveySpecificStatsInput = z.infer +export type SurveyQuestionInput = z.infer + +// Output types +export type SurveyOutput = z.infer +export type SurveyListItemOutput = z.infer +export type SurveyEventStatsOutput = z.infer +export type SurveyRatesOutput = z.infer +export type SurveyResponseStatsOutput = z.infer +export type SurveyQuestionOutput = z.infer diff --git a/products/mcp/typescript/src/schema/tool-inputs.ts b/products/mcp/typescript/src/schema/tool-inputs.ts new file mode 100644 index 0000000000..9efbef0f79 --- /dev/null +++ b/products/mcp/typescript/src/schema/tool-inputs.ts @@ -0,0 +1,409 @@ +import { z } from 'zod' +import { + AddInsightToDashboardSchema, + CreateDashboardInputSchema, + ListDashboardsSchema, + UpdateDashboardInputSchema, +} from './dashboards' +import { ErrorDetailsSchema, ListErrorsSchema } from './errors' +import { FilterGroupsSchema, UpdateFeatureFlagInputSchema } from './flags' +import { CreateInsightInputSchema, ListInsightsSchema, UpdateInsightInputSchema } from './insights' +import { InsightQuerySchema } from './query' +import { + CreateSurveyInputSchema, + GetSurveySpecificStatsInputSchema, + GetSurveyStatsInputSchema, + ListSurveysInputSchema, + UpdateSurveyInputSchema, +} from './surveys' + +export const DashboardAddInsightSchema = z.object({ + data: AddInsightToDashboardSchema, +}) + +export const DashboardCreateSchema = z.object({ + data: CreateDashboardInputSchema, +}) + +export const DashboardDeleteSchema = z.object({ + dashboardId: z.number(), +}) + +export const DashboardGetSchema = z.object({ + dashboardId: z.number(), +}) + +export const DashboardGetAllSchema = z.object({ + data: ListDashboardsSchema.optional(), +}) + +export const DashboardUpdateSchema = z.object({ + dashboardId: z.number(), + data: UpdateDashboardInputSchema, +}) + +export const DocumentationSearchSchema = z.object({ + query: z.string(), +}) + +export const ErrorTrackingDetailsSchema = ErrorDetailsSchema + +export const ErrorTrackingListSchema = ListErrorsSchema + +export const ExperimentGetAllSchema = z.object({}) + +export const ExperimentGetSchema = z.object({ + experimentId: z.number().describe('The ID of the experiment to retrieve'), +}) + +export const ExperimentResultsGetSchema = z.object({ + experimentId: z.number().describe('The ID of the experiment to get comprehensive results for'), + refresh: z.boolean().describe('Force refresh of results instead of using cached values'), +}) + +export const ExperimentDeleteSchema = z.object({ + experimentId: z.number().describe('The ID of the experiment to delete'), +}) + +/** + * User-friendly input schema for experiment updates + * This provides a simplified interface that gets transformed to API format + */ +export const ExperimentUpdateInputSchema = z.object({ + name: z.string().optional().describe('Update experiment name'), + + description: z.string().optional().describe('Update experiment description'), + + // Primary metrics with guidance + primary_metrics: z + .array( + z.object({ + name: z.string().optional().describe('Human-readable metric name'), + metric_type: z + .enum(['mean', 'funnel', 'ratio']) + .describe( + "Metric type: 'mean' for average values, 'funnel' for conversion flows, 'ratio' for comparing two metrics" + ), + event_name: z + .string() + .describe("PostHog event name (e.g., '$pageview', 'add_to_cart', 'purchase')"), + funnel_steps: z + .array(z.string()) + .optional() + .describe('For funnel metrics only: Array of event names for each funnel step'), + properties: z.record(z.any()).optional().describe('Event properties to filter on'), + description: z.string().optional().describe('What this metric measures'), + }) + ) + .optional() + .describe('Update primary metrics'), + + secondary_metrics: z + .array( + z.object({ + name: z.string().optional().describe('Human-readable metric name'), + metric_type: z.enum(['mean', 'funnel', 'ratio']).describe('Metric type'), + event_name: z.string().describe('PostHog event name'), + funnel_steps: z + .array(z.string()) + .optional() + .describe('For funnel metrics only: Array of event names'), + properties: z.record(z.any()).optional().describe('Event properties to filter on'), + description: z.string().optional().describe('What this metric measures'), + }) + ) + .optional() + .describe('Update secondary metrics'), + + minimum_detectable_effect: z + .number() + .optional() + .describe('Update minimum detectable effect in percentage'), + + // Experiment state management + launch: z.boolean().optional().describe('Launch experiment (set start_date) or keep as draft'), + + conclude: z + .enum(['won', 'lost', 'inconclusive', 'stopped_early', 'invalid']) + .optional() + .describe('Conclude experiment with result'), + + conclusion_comment: z.string().optional().describe('Comment about experiment conclusion'), + + restart: z + .boolean() + .optional() + .describe('Restart concluded experiment (clears end_date and conclusion)'), + + archive: z.boolean().optional().describe('Archive or unarchive experiment'), +}) + +export const ExperimentUpdateSchema = z.object({ + experimentId: z.number().describe('The ID of the experiment to update'), + data: ExperimentUpdateInputSchema.describe( + 'The experiment data to update using user-friendly format' + ), +}) + +export const ExperimentCreateSchema = z.object({ + name: z + .string() + .min(1) + .describe('Experiment name - should clearly describe what is being tested'), + + description: z + .string() + .optional() + .describe( + 'Detailed description of the experiment hypothesis, what changes are being tested, and expected outcomes' + ), + + feature_flag_key: z + .string() + .describe( + 'Feature flag key (letters, numbers, hyphens, underscores only). IMPORTANT: First search for existing feature flags that might be suitable using the feature-flags-get-all tool, then suggest reusing existing ones or creating a new key based on the experiment name' + ), + + type: z + .enum(['product', 'web']) + .default('product') + .describe( + "Experiment type: 'product' for backend/API changes, 'web' for frontend UI changes" + ), + + // Primary metrics with guidance + primary_metrics: z + .array( + z.object({ + name: z.string().optional().describe('Human-readable metric name'), + metric_type: z + .enum(['mean', 'funnel', 'ratio']) + .describe( + "Metric type: 'mean' for average values (revenue, time spent), 'funnel' for conversion flows, 'ratio' for comparing two metrics" + ), + event_name: z + .string() + .describe( + "REQUIRED for metrics to work: PostHog event name (e.g., '$pageview', 'add_to_cart', 'purchase'). For funnels, this is the first step. Use '$pageview' if unsure. Search project-property-definitions tool for available events." + ), + funnel_steps: z + .array(z.string()) + .optional() + .describe( + "For funnel metrics only: Array of event names for each funnel step (e.g., ['product_view', 'add_to_cart', 'checkout', 'purchase'])" + ), + properties: z.record(z.any()).optional().describe('Event properties to filter on'), + description: z + .string() + .optional() + .describe( + "What this metric measures and why it's important for the experiment" + ), + }) + ) + .optional() + .describe( + 'Primary metrics to measure experiment success. IMPORTANT: Each metric needs event_name to track data. For funnels, provide funnel_steps array with event names for each step. Ask user what events they track, or use project-property-definitions to find available events.' + ), + + // Secondary metrics for additional insights + secondary_metrics: z + .array( + z.object({ + name: z.string().optional().describe('Human-readable metric name'), + metric_type: z + .enum(['mean', 'funnel', 'ratio']) + .describe( + "Metric type: 'mean' for average values, 'funnel' for conversion flows, 'ratio' for comparing two metrics" + ), + event_name: z + .string() + .describe("REQUIRED: PostHog event name. Use '$pageview' if unsure."), + funnel_steps: z + .array(z.string()) + .optional() + .describe('For funnel metrics only: Array of event names for each funnel step'), + properties: z.record(z.any()).optional().describe('Event properties to filter on'), + description: z.string().optional().describe('What this secondary metric measures'), + }) + ) + .optional() + .describe( + 'Secondary metrics to monitor for potential side effects or additional insights. Each metric needs event_name.' + ), + + // Feature flag variants + variants: z + .array( + z.object({ + key: z + .string() + .describe("Variant key (e.g., 'control', 'variant_a', 'new_design')"), + name: z.string().optional().describe('Human-readable variant name'), + rollout_percentage: z + .number() + .min(0) + .max(100) + .describe('Percentage of users to show this variant'), + }) + ) + .optional() + .describe( + 'Experiment variants. If not specified, defaults to 50/50 control/test split. Ask user how many variants they need and what each tests' + ), + + // Experiment parameters + minimum_detectable_effect: z + .number() + .default(30) + .describe( + 'Minimum detectable effect in percentage. Lower values require more users but detect smaller changes. Suggest 20-30% for most experiments' + ), + + // Exposure and targeting + filter_test_accounts: z + .boolean() + .default(true) + .describe('Whether to filter out internal test accounts'), + + target_properties: z + .record(z.any()) + .optional() + .describe('Properties to target specific user segments (e.g., country, subscription type)'), + + // Control flags + draft: z + .boolean() + .default(true) + .describe( + 'Create as draft (true) or launch immediately (false). Recommend draft for review first' + ), + + holdout_id: z + .number() + .optional() + .describe( + 'Holdout group ID if this experiment should exclude users from other experiments' + ), +}) + +export const FeatureFlagCreateSchema = z.object({ + name: z.string(), + key: z.string(), + description: z.string(), + filters: FilterGroupsSchema, + active: z.boolean(), + tags: z.array(z.string()).optional(), +}) + +export const FeatureFlagDeleteSchema = z.object({ + flagKey: z.string(), +}) + +export const FeatureFlagGetAllSchema = z.object({}) + +export const FeatureFlagGetDefinitionSchema = z.object({ + flagId: z.number().int().positive().optional(), + flagKey: z.string().optional(), +}) + +export const FeatureFlagUpdateSchema = z.object({ + flagKey: z.string(), + data: UpdateFeatureFlagInputSchema, +}) + +export const InsightCreateSchema = z.object({ + data: CreateInsightInputSchema, +}) + +export const InsightDeleteSchema = z.object({ + insightId: z.string(), +}) + +export const InsightGetSchema = z.object({ + insightId: z.string(), +}) + +export const InsightGetAllSchema = z.object({ + data: ListInsightsSchema.optional(), +}) + +export const InsightGenerateHogQLFromQuestionSchema = z.object({ + question: z + .string() + .max(1000) + .describe('Your natural language query describing the SQL insight (max 1000 characters).'), +}) + +export const InsightQueryInputSchema = z.object({ + insightId: z.string(), +}) + +export const InsightUpdateSchema = z.object({ + insightId: z.string(), + data: UpdateInsightInputSchema, +}) + +export const LLMAnalyticsGetCostsSchema = z.object({ + projectId: z.number().int().positive(), + days: z.number().optional(), +}) + +export const OrganizationGetDetailsSchema = z.object({}) + +export const OrganizationGetAllSchema = z.object({}) + +export const OrganizationSetActiveSchema = z.object({ + orgId: z.string().uuid(), +}) + +export const ProjectGetAllSchema = z.object({}) + +export const ProjectEventDefinitionsSchema = z.object({ + q: z + .string() + .optional() + .describe('Search query to filter event names. Only use if there are lots of events.'), +}) + +export const ProjectPropertyDefinitionsInputSchema = z.object({ + type: z.enum(['event', 'person']).describe('Type of properties to get'), + eventName: z + .string() + .describe('Event name to filter properties by, required for event type') + .optional(), + includePredefinedProperties: z + .boolean() + .optional() + .describe('Whether to include predefined properties'), +}) + +export const ProjectSetActiveSchema = z.object({ + projectId: z.number().int().positive(), +}) + +export const SurveyCreateSchema = CreateSurveyInputSchema + +export const SurveyResponseCountsSchema = z.object({}) + +export const SurveyGlobalStatsSchema = GetSurveyStatsInputSchema + +export const SurveyStatsSchema = GetSurveySpecificStatsInputSchema + +export const SurveyDeleteSchema = z.object({ + surveyId: z.string(), +}) + +export const SurveyGetSchema = z.object({ + surveyId: z.string(), +}) + +export const SurveyGetAllSchema = ListSurveysInputSchema + +export const SurveyUpdateSchema = UpdateSurveyInputSchema.extend({ + surveyId: z.string(), +}) + +export const QueryRunInputSchema = z.object({ + query: InsightQuerySchema, +}) diff --git a/products/mcp/typescript/src/tools/README.md b/products/mcp/typescript/src/tools/README.md new file mode 100644 index 0000000000..ba2f9f21ce --- /dev/null +++ b/products/mcp/typescript/src/tools/README.md @@ -0,0 +1,253 @@ +# Adding Tools to the PostHog MCP + +This guide explains how to add new tools to the PostHog MCP server. Tools are the interface between MCP clients (like Claude Desktop) and PostHog. + +## Quick Start + +To add a new tool, you'll need to: + +1. Define the tool's input schema +2. Create the tool handler +3. Add the tool definition +4. Write integration tests +5. Update the API client if needed + +## Example: Creating a Feature Flag Tool + +Let's walk through the `create-feature-flag` tool as a reference example. + +### 1. Define Input Schema (`schema/tool-inputs.ts`) + +Define your tool's input schema using Zod. Keep inputs **simple and user-friendly**, not necessarily matching the API exactly: + +```typescript +export const FeatureFlagCreateSchema = z.object({ + name: z.string(), + key: z.string(), + description: z.string(), + filters: FilterGroupsSchema, + active: z.boolean(), + tags: z.array(z.string()).optional(), +}) +``` + +**Best Practices:** + +- **Keep inputs simple**: Focus on what users would naturally want to provide +- **Make schemas tight for inputs**: Use strict validation to catch errors early +- **Make schemas loose for outputs**: Be permissive when parsing API responses +- **Use descriptive field names**: Prefer `name` over `flag_name` if it's clear from context + +### 2. Create Tool Handler (`tools/featureFlags/create.ts`) + +```typescript +import { FeatureFlagCreateSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = FeatureFlagCreateSchema +type Params = z.infer + +export const createHandler = async (context: Context, params: Params) => { + const { name, key, description, filters, active, tags } = params + const projectId = await context.stateManager.getProjectId() + + // Call API client method + const flagResult = await context.api.featureFlags({ projectId }).create({ + data: { name, key, description, filters, active, tags }, + }) + + if (!flagResult.success) { + throw new Error(`Failed to create feature flag: ${flagResult.error.message}`) + } + + // Add context that is useful, like in this case a URL for the LLM to link to. + const featureFlagWithUrl = { + ...flagResult.data, + url: `${context.api.getProjectBaseUrl(projectId)}/feature_flags/${flagResult.data.id}`, + } + + return { + content: [{ type: 'text', text: JSON.stringify(featureFlagWithUrl) }], + } +} + +const tool = (): ToolBase => ({ + name: 'create-feature-flag', + schema, + handler: createHandler, +}) + +export default tool +``` + +**Key Points:** + +- Use `context.stateManager.getProjectId()` to get the active project +- Use `context.api` to make API calls +- Add helpful information like URLs to responses +- Handle errors gracefully with descriptive messages +- Return `ToolBase` type - title, description, scopes and annotations are injected from JSON + +### 3. Add Tool Definition (`schema/tool-definitions.json`) + +Add a clear, actionable description for your tool, assign it to a feature, specify required API scopes, and include behavioral annotations: + +```json +{ + "create-feature-flag": { + "title": "Create Feature Flag", + "description": "Creates a new feature flag in the project. Once you have created a feature flag, you should: Ask the user if they want to add it to their codebase, Use the \"search-docs\" tool to find documentation on how to add feature flags to the codebase (search for the right language / framework), Clarify where it should be added and then add it.", + "category": "Feature flags", // This will be displayed in the docs, but not readable by the MCP client + "feature": "flags", + "summary": "Creates a new feature flag in the project.", // This will be displayed in the docs, but not readable by the MCP client. + "required_scopes": ["feature_flag:write"], // You can find a list of available scopes here: https://github.com/PostHog/posthog/blob/31082f4bcc4c45a0ac830777b8a3048e7752a1bc/frontend/src/lib/scopes.tsx + "annotations": { + "destructiveHint": false, // Does the tool delete or destructively modify data? + "idempotentHint": false, // Can the tool be safely called multiple times with same result? + "openWorldHint": true, // Does the tool interact with external systems or create new resources? + "readOnlyHint": false // Is the tool read-only (doesn't modify any state)? + } + } +} +``` + +**Available Features:** + +- `flags` - [Feature flag management](https://posthog.com/docs/feature-flags) +- `workspace` - [Organization and project management](https://posthog.com/docs/getting-started/cloud) +- `error-tracking` - [Error monitoring and debugging](https://posthog.com/docs/errors) +- `dashboards` - [Dashboard creation and management](https://posthog.com/docs/product-analytics/dashboards) +- `insights` - [Analytics insights and SQL queries](https://posthog.com/docs/product-analytics/insights) +- `experiments` - [A/B testing experiments](https://posthog.com/docs/experiments) +- `llm-analytics` - [LLM usage and cost tracking](https://posthog.com/docs/llm-analytics) +- `docs` - PostHog documentation search + +If your tool doesn't fit any of these features, you can create a new feature category yourself. +If you do add a new feature, make sure to update the `README.md` in the root of the repository to list the new feature and include it in the tests at `typescript/tests/unit/tool-filtering.test.ts`. You'll also need to update the `AVAILABLE_FEATURES` list in `https://github.com/posthog/wizard/` so it shows up during feature selection when running `wizard mcp add`. + +**Tool Definition Tips:** + +- **Title**: Human-readable name shown in UI +- **Description**: Be specific about what the tool does, include follow-up actions if relevant +- **Required Scopes**: Use highest required scope (write if creates/modifies, read if only reads) +- **Annotations**: Provide hints about tool behavior for MCP clients +- **Feature**: Assign to appropriate feature category for filtering +- **Category**: Groups the tools for display in the docs + +### 4. Write Integration Tests (`tests/tools/featureFlags.integration.test.ts`) + +Always include integration tests to help us catch if there is a change to the underlying API: + +```typescript +import { + cleanupResources, + createTestClient, + createTestContext, + generateUniqueKey, + parseToolResponse, + setActiveProjectAndOrg, +} from '@/shared/test-utils' +import createFeatureFlagTool from '@/tools/featureFlags/create' +import { afterEach, beforeAll, describe, expect, it } from 'vitest' + +describe('Feature Flags', () => { + let context: Context + const createdResources: CreatedResources = { + featureFlags: [], + insights: [], + dashboards: [], + } + + beforeAll(async () => { + const client = createTestClient() + context = createTestContext(client) + await setActiveProjectAndOrg(context, TEST_PROJECT_ID!, TEST_ORG_ID!) + }) + + afterEach(async () => { + await cleanupResources(context.api, TEST_PROJECT_ID!, createdResources) + }) + + describe('create-feature-flag tool', () => { + const createTool = createFeatureFlagTool() + + it('should create a feature flag with minimal required fields', async () => { + const params = { + name: 'Test Feature Flag', + key: generateUniqueKey('test-flag'), + description: 'Integration test flag', + filters: { groups: [] }, + active: true, + } + + const result = await createTool.handler(context, params) + const flagData = parseToolResponse(result) + + expect(flagData.id).toBeDefined() + expect(flagData.key).toBe(params.key) + expect(flagData.name).toBe(params.name) + expect(flagData.active).toBe(params.active) + expect(flagData.url).toContain('/feature_flags/') + + createdResources.featureFlags.push(flagData.id) + }) + + it('should create a feature flag with complex filters', async () => { + // Test with more complex scenarios + }) + }) +}) +``` + +**Testing Best Practices:** + +- Clean up created resources after each test +- Use unique keys/names to avoid conflicts +- Test both minimal and complex scenarios +- Verify the response structure and content +- Test error cases and edge conditions + +### 5. Update API Client if Needed (`api/client.ts`) + +If your tool requires new API endpoints, add them to the ApiClient: + +```typescript +public featureFlags(params: { projectId: number }) { + return { + create: async ({ data }: { data: CreateFeatureFlagInput }) => { + return this.request({ + method: "POST", + path: `/api/projects/${params.projectId}/feature_flags/`, + body: data, + schema: FeatureFlagResponseSchema, + }); + }, + // Add other methods as needed + }; +} +``` + +**API Client Guidelines:** + +- Group related endpoints under resource methods +- Use consistent naming patterns +- Return `Result` types +- Add proper TypeScript types for all parameters and responses +- Include schema validation for responses + +## Schema Design Philosophy + +### Input Schemas + +- **Be strict**: Validate inputs thoroughly to catch errors early +- **Be user-friendly**: Design inputs around what users naturally want to provide +- **Be minimal**: Only require essential fields, make others optional +- **Be clear**: Use descriptive names that don't require API knowledge + +### Output Schemas + +- **Be permissive**: Don't fail on unexpected fields from the API +- **Be comprehensive**: Include useful information in responses, but don't stuff the context window with unnecessary information +- **Add context**: Include helpful URLs, descriptions, or related data +- **Be consistent**: Use similar patterns across tools diff --git a/products/mcp/typescript/src/tools/dashboards/addInsight.ts b/products/mcp/typescript/src/tools/dashboards/addInsight.ts new file mode 100644 index 0000000000..a99333f2b5 --- /dev/null +++ b/products/mcp/typescript/src/tools/dashboards/addInsight.ts @@ -0,0 +1,50 @@ +import { DashboardAddInsightSchema } from '@/schema/tool-inputs' +import { resolveInsightId } from '@/tools/insights/utils' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = DashboardAddInsightSchema + +type Params = z.infer + +export const addInsightHandler = async (context: Context, params: Params) => { + const { data } = params + const projectId = await context.stateManager.getProjectId() + + const numericInsightId = await resolveInsightId(context, data.insightId, projectId) + + const insightResult = await context.api + .insights({ projectId }) + .get({ insightId: data.insightId }) + + if (!insightResult.success) { + throw new Error(`Failed to get insight: ${insightResult.error.message}`) + } + + const result = await context.api.dashboards({ projectId }).addInsight({ + data: { + ...data, + insightId: numericInsightId, + }, + }) + + if (!result.success) { + throw new Error(`Failed to add insight to dashboard: ${result.error.message}`) + } + + const resultWithUrls = { + ...result.data, + dashboard_url: `${context.api.getProjectBaseUrl(projectId)}/dashboard/${data.dashboardId}`, + insight_url: `${context.api.getProjectBaseUrl(projectId)}/insights/${insightResult.data.short_id}`, + } + + return { content: [{ type: 'text', text: JSON.stringify(resultWithUrls) }] } +} + +const tool = (): ToolBase => ({ + name: 'add-insight-to-dashboard', + schema, + handler: addInsightHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/dashboards/create.ts b/products/mcp/typescript/src/tools/dashboards/create.ts new file mode 100644 index 0000000000..8c83a65556 --- /dev/null +++ b/products/mcp/typescript/src/tools/dashboards/create.ts @@ -0,0 +1,32 @@ +import { DashboardCreateSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = DashboardCreateSchema + +type Params = z.infer + +export const createHandler = async (context: Context, params: Params) => { + const { data } = params + const projectId = await context.stateManager.getProjectId() + const dashboardResult = await context.api.dashboards({ projectId }).create({ data }) + + if (!dashboardResult.success) { + throw new Error(`Failed to create dashboard: ${dashboardResult.error.message}`) + } + + const dashboardWithUrl = { + ...dashboardResult.data, + url: `${context.api.getProjectBaseUrl(projectId)}/dashboard/${dashboardResult.data.id}`, + } + + return { content: [{ type: 'text', text: JSON.stringify(dashboardWithUrl) }] } +} + +const tool = (): ToolBase => ({ + name: 'dashboard-create', + schema, + handler: createHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/dashboards/delete.ts b/products/mcp/typescript/src/tools/dashboards/delete.ts new file mode 100644 index 0000000000..4fab5cdcab --- /dev/null +++ b/products/mcp/typescript/src/tools/dashboards/delete.ts @@ -0,0 +1,27 @@ +import { DashboardDeleteSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = DashboardDeleteSchema + +type Params = z.infer + +export const deleteHandler = async (context: Context, params: Params) => { + const { dashboardId } = params + const projectId = await context.stateManager.getProjectId() + const result = await context.api.dashboards({ projectId }).delete({ dashboardId }) + + if (!result.success) { + throw new Error(`Failed to delete dashboard: ${result.error.message}`) + } + + return { content: [{ type: 'text', text: JSON.stringify(result.data) }] } +} + +const tool = (): ToolBase => ({ + name: 'dashboard-delete', + schema, + handler: deleteHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/dashboards/get.ts b/products/mcp/typescript/src/tools/dashboards/get.ts new file mode 100644 index 0000000000..afe14cbdee --- /dev/null +++ b/products/mcp/typescript/src/tools/dashboards/get.ts @@ -0,0 +1,27 @@ +import { DashboardGetSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = DashboardGetSchema + +type Params = z.infer + +export const getHandler = async (context: Context, params: Params) => { + const { dashboardId } = params + const projectId = await context.stateManager.getProjectId() + const dashboardResult = await context.api.dashboards({ projectId }).get({ dashboardId }) + + if (!dashboardResult.success) { + throw new Error(`Failed to get dashboard: ${dashboardResult.error.message}`) + } + + return { content: [{ type: 'text', text: JSON.stringify(dashboardResult.data) }] } +} + +const tool = (): ToolBase => ({ + name: 'dashboard-get', + schema, + handler: getHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/dashboards/getAll.ts b/products/mcp/typescript/src/tools/dashboards/getAll.ts new file mode 100644 index 0000000000..b21aff5d8e --- /dev/null +++ b/products/mcp/typescript/src/tools/dashboards/getAll.ts @@ -0,0 +1,29 @@ +import { DashboardGetAllSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = DashboardGetAllSchema + +type Params = z.infer + +export const getAllHandler = async (context: Context, params: Params) => { + const { data } = params + const projectId = await context.stateManager.getProjectId() + const dashboardsResult = await context.api + .dashboards({ projectId }) + .list({ params: data ?? {} }) + + if (!dashboardsResult.success) { + throw new Error(`Failed to get dashboards: ${dashboardsResult.error.message}`) + } + + return { content: [{ type: 'text', text: JSON.stringify(dashboardsResult.data) }] } +} + +const tool = (): ToolBase => ({ + name: 'dashboards-get-all', + schema, + handler: getAllHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/dashboards/update.ts b/products/mcp/typescript/src/tools/dashboards/update.ts new file mode 100644 index 0000000000..0e8ee6fd17 --- /dev/null +++ b/products/mcp/typescript/src/tools/dashboards/update.ts @@ -0,0 +1,34 @@ +import { DashboardUpdateSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = DashboardUpdateSchema + +type Params = z.infer + +export const updateHandler = async (context: Context, params: Params) => { + const { dashboardId, data } = params + const projectId = await context.stateManager.getProjectId() + const dashboardResult = await context.api + .dashboards({ projectId }) + .update({ dashboardId, data }) + + if (!dashboardResult.success) { + throw new Error(`Failed to update dashboard: ${dashboardResult.error.message}`) + } + + const dashboardWithUrl = { + ...dashboardResult.data, + url: `${context.api.getProjectBaseUrl(projectId)}/dashboard/${dashboardResult.data.id}`, + } + + return { content: [{ type: 'text', text: JSON.stringify(dashboardWithUrl) }] } +} + +const tool = (): ToolBase => ({ + name: 'dashboard-update', + schema, + handler: updateHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/documentation/searchDocs.ts b/products/mcp/typescript/src/tools/documentation/searchDocs.ts new file mode 100644 index 0000000000..434b6b73a0 --- /dev/null +++ b/products/mcp/typescript/src/tools/documentation/searchDocs.ts @@ -0,0 +1,34 @@ +import { docsSearch } from '@/inkeepApi' +import { DocumentationSearchSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = DocumentationSearchSchema + +type Params = z.infer + +export const searchDocsHandler = async (context: Context, params: Params) => { + const { query } = params + const inkeepApiKey = context.env.INKEEP_API_KEY + + if (!inkeepApiKey) { + return { + content: [ + { + type: 'text', + text: 'Error: INKEEP_API_KEY is not configured.', + }, + ], + } + } + const resultText = await docsSearch(inkeepApiKey, query) + return { content: [{ type: 'text', text: resultText }] } +} + +const tool = (): ToolBase => ({ + name: 'docs-search', + schema, + handler: searchDocsHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/errorTracking/errorDetails.ts b/products/mcp/typescript/src/tools/errorTracking/errorDetails.ts new file mode 100644 index 0000000000..a81b527397 --- /dev/null +++ b/products/mcp/typescript/src/tools/errorTracking/errorDetails.ts @@ -0,0 +1,39 @@ +import { ErrorTrackingDetailsSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = ErrorTrackingDetailsSchema + +type Params = z.infer + +export const errorDetailsHandler = async (context: Context, params: Params) => { + const { issueId, dateFrom, dateTo } = params + const projectId = await context.stateManager.getProjectId() + + const errorQuery = { + kind: 'ErrorTrackingQuery', + dateRange: { + date_from: dateFrom || new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), + date_to: dateTo || new Date().toISOString(), + }, + volumeResolution: 0, + issueId, + } + + const errorsResult = await context.api.query({ projectId }).execute({ queryBody: errorQuery }) + if (!errorsResult.success) { + throw new Error(`Failed to get error details: ${errorsResult.error.message}`) + } + + return { + content: [{ type: 'text', text: JSON.stringify(errorsResult.data.results) }], + } +} + +const tool = (): ToolBase => ({ + name: 'error-details', + schema, + handler: errorDetailsHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/errorTracking/listErrors.ts b/products/mcp/typescript/src/tools/errorTracking/listErrors.ts new file mode 100644 index 0000000000..9437ecca27 --- /dev/null +++ b/products/mcp/typescript/src/tools/errorTracking/listErrors.ts @@ -0,0 +1,42 @@ +import { ErrorTrackingListSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = ErrorTrackingListSchema + +type Params = z.infer + +export const listErrorsHandler = async (context: Context, params: Params) => { + const { orderBy, dateFrom, dateTo, orderDirection, filterTestAccounts, status } = params + const projectId = await context.stateManager.getProjectId() + + const errorQuery = { + kind: 'ErrorTrackingQuery', + orderBy: orderBy || 'occurrences', + dateRange: { + date_from: dateFrom || new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), + date_to: dateTo || new Date().toISOString(), + }, + volumeResolution: 1, + orderDirection: orderDirection || 'DESC', + filterTestAccounts: filterTestAccounts ?? true, + status: status || 'active', + } + + const errorsResult = await context.api.query({ projectId }).execute({ queryBody: errorQuery }) + if (!errorsResult.success) { + throw new Error(`Failed to list errors: ${errorsResult.error.message}`) + } + + return { + content: [{ type: 'text', text: JSON.stringify(errorsResult.data.results) }], + } +} + +const tool = (): ToolBase => ({ + name: 'list-errors', + schema, + handler: listErrorsHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/experiments/create.ts b/products/mcp/typescript/src/tools/experiments/create.ts new file mode 100644 index 0000000000..1f6c740bac --- /dev/null +++ b/products/mcp/typescript/src/tools/experiments/create.ts @@ -0,0 +1,44 @@ +import { ExperimentCreateSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = ExperimentCreateSchema + +type Params = z.infer + +/** + * Create a comprehensive A/B test experiment with guided setup + * This tool helps users create well-configured experiments through conversation + */ +export const createExperimentHandler = async (context: Context, params: Params) => { + const projectId = await context.stateManager.getProjectId() + + const result = await context.api.experiments({ projectId }).create(params) + + if (!result.success) { + throw new Error(`Failed to create experiment: ${result.error.message}`) + } + + const experiment = result.data + const experimentWithUrl = { + ...experiment, + url: `${context.api.getProjectBaseUrl(projectId)}/experiments/${experiment.id}`, + } + + return { + content: [ + { + type: 'text', + text: JSON.stringify(experimentWithUrl, null, 2), + }, + ], + } +} + +const tool = (): ToolBase => ({ + name: 'experiment-create', + schema, + handler: createExperimentHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/experiments/delete.ts b/products/mcp/typescript/src/tools/experiments/delete.ts new file mode 100644 index 0000000000..c6482e7a88 --- /dev/null +++ b/products/mcp/typescript/src/tools/experiments/delete.ts @@ -0,0 +1,31 @@ +import { ExperimentDeleteSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = ExperimentDeleteSchema + +type Params = z.infer + +export const deleteHandler = async (context: Context, { experimentId }: Params) => { + const projectId = await context.stateManager.getProjectId() + + const deleteResult = await context.api.experiments({ projectId }).delete({ + experimentId, + }) + + if (!deleteResult.success) { + throw new Error(`Failed to delete experiment: ${deleteResult.error.message}`) + } + + return { + content: [{ type: 'text', text: JSON.stringify(deleteResult.data) }], + } +} + +const tool = (): ToolBase => ({ + name: 'experiment-delete', + schema, + handler: deleteHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/experiments/get.ts b/products/mcp/typescript/src/tools/experiments/get.ts new file mode 100644 index 0000000000..09ac27c4e0 --- /dev/null +++ b/products/mcp/typescript/src/tools/experiments/get.ts @@ -0,0 +1,29 @@ +import { ExperimentGetSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = ExperimentGetSchema + +type Params = z.infer + +export const getHandler = async (context: Context, { experimentId }: Params) => { + const projectId = await context.stateManager.getProjectId() + + const result = await context.api.experiments({ projectId }).get({ + experimentId: experimentId, + }) + + if (!result.success) { + throw new Error(`Failed to get experiment: ${result.error.message}`) + } + + return { content: [{ type: 'text', text: JSON.stringify(result.data) }] } +} + +const tool = (): ToolBase => ({ + name: 'experiment-get', + schema, + handler: getHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/experiments/getAll.ts b/products/mcp/typescript/src/tools/experiments/getAll.ts new file mode 100644 index 0000000000..ee2b82dc31 --- /dev/null +++ b/products/mcp/typescript/src/tools/experiments/getAll.ts @@ -0,0 +1,27 @@ +import { ExperimentGetAllSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = ExperimentGetAllSchema + +type Params = z.infer + +export const getAllHandler = async (context: Context, _params: Params) => { + const projectId = await context.stateManager.getProjectId() + + const results = await context.api.experiments({ projectId }).list() + + if (!results.success) { + throw new Error(`Failed to get experiments: ${results.error.message}`) + } + + return { content: [{ type: 'text', text: JSON.stringify(results.data) }] } +} + +const tool = (): ToolBase => ({ + name: 'experiment-get-all', + schema, + handler: getAllHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/experiments/getResults.ts b/products/mcp/typescript/src/tools/experiments/getResults.ts new file mode 100644 index 0000000000..ec3474b322 --- /dev/null +++ b/products/mcp/typescript/src/tools/experiments/getResults.ts @@ -0,0 +1,53 @@ +import { ExperimentResultsResponseSchema } from '@/schema/experiments' +import { ExperimentResultsGetSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = ExperimentResultsGetSchema + +type Params = z.infer + +/** + * Get experiment results including metrics and exposures data + * This tool fetches the experiment details and executes the necessary queries + * to get metrics results (both primary and secondary) and exposure data + */ +export const getResultsHandler = async (context: Context, params: Params) => { + const projectId = await context.stateManager.getProjectId() + + const result = await context.api.experiments({ projectId }).getMetricResults({ + experimentId: params.experimentId, + refresh: params.refresh, + }) + + if (!result.success) { + throw new Error(`Failed to get experiment results: ${result.error.message}`) + } + + const { experiment, primaryMetricsResults, secondaryMetricsResults, exposures } = result.data + + // Format the response using the schema + const parsedExperiment = ExperimentResultsResponseSchema.parse({ + experiment, + primaryMetricsResults, + secondaryMetricsResults, + exposures, + }) + + return { + content: [ + { + type: 'text', + text: JSON.stringify(parsedExperiment, null, 2), + }, + ], + } +} + +const tool = (): ToolBase => ({ + name: 'experiment-results-get', + schema, + handler: getResultsHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/experiments/update.ts b/products/mcp/typescript/src/tools/experiments/update.ts new file mode 100644 index 0000000000..852ab221c0 --- /dev/null +++ b/products/mcp/typescript/src/tools/experiments/update.ts @@ -0,0 +1,54 @@ +import { ExperimentUpdateTransformSchema } from '@/schema/experiments' +import { ExperimentUpdateSchema } from '@/schema/tool-inputs' +import { getToolDefinition } from '@/tools/toolDefinitions' +import type { Context, Tool } from '@/tools/types' +import type { z } from 'zod' + +const schema = ExperimentUpdateSchema + +type Params = z.infer + +export const updateHandler = async (context: Context, params: Params) => { + const { experimentId, data } = params + const projectId = await context.stateManager.getProjectId() + + // Transform the tool input to API payload format + const apiPayload = ExperimentUpdateTransformSchema.parse(data) + + const updateResult = await context.api.experiments({ projectId }).update({ + experimentId, + updateData: apiPayload, + }) + + if (!updateResult.success) { + throw new Error(`Failed to update experiment: ${updateResult.error.message}`) + } + + const experimentWithUrl = { + ...updateResult.data, + url: `${context.api.getProjectBaseUrl(projectId)}/experiments/${updateResult.data.id}`, + } + + return { + content: [{ type: 'text', text: JSON.stringify(experimentWithUrl, null, 2) }], + } +} + +const definition = getToolDefinition('experiment-update') + +const tool = (): Tool => ({ + name: 'experiment-update', + title: definition.title, + description: definition.description, + schema, + handler: updateHandler, + scopes: ['experiments:write'], + annotations: { + destructiveHint: false, + idempotentHint: true, + openWorldHint: true, + readOnlyHint: false, + }, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/featureFlags/create.ts b/products/mcp/typescript/src/tools/featureFlags/create.ts new file mode 100644 index 0000000000..ae8dac6ce2 --- /dev/null +++ b/products/mcp/typescript/src/tools/featureFlags/create.ts @@ -0,0 +1,37 @@ +import { FeatureFlagCreateSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = FeatureFlagCreateSchema + +type Params = z.infer + +export const createHandler = async (context: Context, params: Params) => { + const { name, key, description, filters, active, tags } = params + const projectId = await context.stateManager.getProjectId() + + const flagResult = await context.api.featureFlags({ projectId }).create({ + data: { name, key, description, filters, active, tags }, + }) + + if (!flagResult.success) { + throw new Error(`Failed to create feature flag: ${flagResult.error.message}`) + } + + const featureFlagWithUrl = { + ...flagResult.data, + url: `${context.api.getProjectBaseUrl(projectId)}/feature_flags/${flagResult.data.id}`, + } + + return { + content: [{ type: 'text', text: JSON.stringify(featureFlagWithUrl) }], + } +} + +const tool = (): ToolBase => ({ + name: 'create-feature-flag', + schema, + handler: createHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/featureFlags/delete.ts b/products/mcp/typescript/src/tools/featureFlags/delete.ts new file mode 100644 index 0000000000..7774a805f0 --- /dev/null +++ b/products/mcp/typescript/src/tools/featureFlags/delete.ts @@ -0,0 +1,42 @@ +import { FeatureFlagDeleteSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = FeatureFlagDeleteSchema + +type Params = z.infer + +export const deleteHandler = async (context: Context, params: Params) => { + const { flagKey } = params + const projectId = await context.stateManager.getProjectId() + + const flagResult = await context.api.featureFlags({ projectId }).findByKey({ key: flagKey }) + if (!flagResult.success) { + throw new Error(`Failed to find feature flag: ${flagResult.error.message}`) + } + + if (!flagResult.data) { + return { + content: [{ type: 'text', text: 'Feature flag is already deleted.' }], + } + } + + const deleteResult = await context.api.featureFlags({ projectId }).delete({ + flagId: flagResult.data.id, + }) + if (!deleteResult.success) { + throw new Error(`Failed to delete feature flag: ${deleteResult.error.message}`) + } + + return { + content: [{ type: 'text', text: JSON.stringify(deleteResult.data) }], + } +} + +const tool = (): ToolBase => ({ + name: 'delete-feature-flag', + schema, + handler: deleteHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/featureFlags/getAll.ts b/products/mcp/typescript/src/tools/featureFlags/getAll.ts new file mode 100644 index 0000000000..b74e0376e8 --- /dev/null +++ b/products/mcp/typescript/src/tools/featureFlags/getAll.ts @@ -0,0 +1,27 @@ +import { FeatureFlagGetAllSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = FeatureFlagGetAllSchema + +type Params = z.infer + +export const getAllHandler = async (context: Context, _params: Params) => { + const projectId = await context.stateManager.getProjectId() + + const flagsResult = await context.api.featureFlags({ projectId }).list() + + if (!flagsResult.success) { + throw new Error(`Failed to get feature flags: ${flagsResult.error.message}`) + } + + return { content: [{ type: 'text', text: JSON.stringify(flagsResult.data) }] } +} + +const tool = (): ToolBase => ({ + name: 'feature-flag-get-all', + schema, + handler: getAllHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/featureFlags/getDefinition.ts b/products/mcp/typescript/src/tools/featureFlags/getDefinition.ts new file mode 100644 index 0000000000..5ba4323edf --- /dev/null +++ b/products/mcp/typescript/src/tools/featureFlags/getDefinition.ts @@ -0,0 +1,72 @@ +import { FeatureFlagGetDefinitionSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = FeatureFlagGetDefinitionSchema + +type Params = z.infer + +export const getDefinitionHandler = async (context: Context, { flagId, flagKey }: Params) => { + if (!flagId && !flagKey) { + return { + content: [ + { + type: 'text', + text: 'Error: Either flagId or flagKey must be provided.', + }, + ], + } + } + + const projectId = await context.stateManager.getProjectId() + + if (flagId) { + const flagResult = await context.api + .featureFlags({ projectId }) + .get({ flagId: String(flagId) }) + if (!flagResult.success) { + throw new Error(`Failed to get feature flag: ${flagResult.error.message}`) + } + return { + content: [{ type: 'text', text: JSON.stringify(flagResult.data) }], + } + } + + if (flagKey) { + const flagResult = await context.api.featureFlags({ projectId }).findByKey({ key: flagKey }) + + if (!flagResult.success) { + throw new Error(`Failed to find feature flag: ${flagResult.error.message}`) + } + if (flagResult.data) { + return { + content: [{ type: 'text', text: JSON.stringify(flagResult.data) }], + } + } + return { + content: [ + { + type: 'text', + text: `Error: Flag with key "${flagKey}" not found.`, + }, + ], + } + } + + return { + content: [ + { + type: 'text', + text: 'Error: Could not determine or find the feature flag.', + }, + ], + } +} + +const tool = (): ToolBase => ({ + name: 'feature-flag-get-definition', + schema, + handler: getDefinitionHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/featureFlags/update.ts b/products/mcp/typescript/src/tools/featureFlags/update.ts new file mode 100644 index 0000000000..3769f38a9c --- /dev/null +++ b/products/mcp/typescript/src/tools/featureFlags/update.ts @@ -0,0 +1,38 @@ +import { FeatureFlagUpdateSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = FeatureFlagUpdateSchema + +type Params = z.infer + +export const updateHandler = async (context: Context, params: Params) => { + const { flagKey, data } = params + const projectId = await context.stateManager.getProjectId() + + const flagResult = await context.api.featureFlags({ projectId }).update({ + key: flagKey, + data: data, + }) + + if (!flagResult.success) { + throw new Error(`Failed to update feature flag: ${flagResult.error.message}`) + } + + const featureFlagWithUrl = { + ...flagResult.data, + url: `${context.api.getProjectBaseUrl(projectId)}/feature_flags/${flagResult.data.id}`, + } + + return { + content: [{ type: 'text', text: JSON.stringify(featureFlagWithUrl) }], + } +} + +const tool = (): ToolBase => ({ + name: 'update-feature-flag', + schema, + handler: updateHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/index.ts b/products/mcp/typescript/src/tools/index.ts new file mode 100644 index 0000000000..43afe665e9 --- /dev/null +++ b/products/mcp/typescript/src/tools/index.ts @@ -0,0 +1,221 @@ +import type { Context, Tool, ToolBase, ZodObjectAny } from './types' + +import { ApiClient } from '@/api/client' +import { SessionManager } from '@/lib/utils/SessionManager' +import { StateManager } from '@/lib/utils/StateManager' +import { MemoryCache } from '@/lib/utils/cache/MemoryCache' +import { hash } from '@/lib/utils/helper-functions' +import { getToolsForFeatures as getFilteredToolNames, getToolDefinition } from './toolDefinitions' + +import createFeatureFlag from './featureFlags/create' +import deleteFeatureFlag from './featureFlags/delete' +import getAllFeatureFlags from './featureFlags/getAll' +// Feature Flags +import getFeatureFlagDefinition from './featureFlags/getDefinition' +import updateFeatureFlag from './featureFlags/update' + +import getOrganizationDetails from './organizations/getDetails' +// Organizations +import getOrganizations from './organizations/getOrganizations' +import setActiveOrganization from './organizations/setActive' + +import eventDefinitions from './projects/eventDefinitions' +// Projects +import getProjects from './projects/getProjects' +import getProperties from './projects/propertyDefinitions' +import setActiveProject from './projects/setActive' + +// Documentation +import searchDocs from './documentation/searchDocs' + +import errorDetails from './errorTracking/errorDetails' +// Error Tracking +import listErrors from './errorTracking/listErrors' + +// Experiments +import createExperiment from './experiments/create' +import deleteExperiment from './experiments/delete' +import getExperiment from './experiments/get' +import getAllExperiments from './experiments/getAll' +import getExperimentResults from './experiments/getResults' +import updateExperiment from './experiments/update' + +import createInsight from './insights/create' +import deleteInsight from './insights/delete' + +import getInsight from './insights/get' +// Insights +import getAllInsights from './insights/getAll' +import queryInsight from './insights/query' +import updateInsight from './insights/update' + +import addInsightToDashboard from './dashboards/addInsight' +import createDashboard from './dashboards/create' +import deleteDashboard from './dashboards/delete' +import getDashboard from './dashboards/get' + +// Dashboards +import getAllDashboards from './dashboards/getAll' +import updateDashboard from './dashboards/update' +import generateHogQLFromQuestion from './query/generateHogQLFromQuestion' +// Query +import queryRun from './query/run' + +import { hasScopes } from '@/lib/utils/api' +// LLM Observability +import getLLMCosts from './llmAnalytics/getLLMCosts' + +// Surveys +import createSurvey from './surveys/create' +import deleteSurvey from './surveys/delete' +import getSurvey from './surveys/get' +import getAllSurveys from './surveys/getAll' +import surveysGlobalStats from './surveys/global-stats' +import surveyStats from './surveys/stats' +import updateSurvey from './surveys/update' + +// Map of tool names to tool factory functions +const TOOL_MAP: Record ToolBase> = { + // Feature Flags + 'feature-flag-get-definition': getFeatureFlagDefinition, + 'feature-flag-get-all': getAllFeatureFlags, + 'create-feature-flag': createFeatureFlag, + 'update-feature-flag': updateFeatureFlag, + 'delete-feature-flag': deleteFeatureFlag, + + // Organizations + 'organizations-get': getOrganizations, + 'switch-organization': setActiveOrganization, + 'organization-details-get': getOrganizationDetails, + + // Projects + 'projects-get': getProjects, + 'switch-project': setActiveProject, + 'event-definitions-list': eventDefinitions, + 'properties-list': getProperties, + + // Documentation - handled separately due to env check + // "docs-search": searchDocs, + + // Error Tracking + 'list-errors': listErrors, + 'error-details': errorDetails, + + // Experiments + 'experiment-get-all': getAllExperiments, + 'experiment-get': getExperiment, + 'experiment-results-get': getExperimentResults, + 'experiment-create': createExperiment, + 'experiment-delete': deleteExperiment, + 'experiment-update': updateExperiment, + + // Insights + 'insights-get-all': getAllInsights, + 'insight-get': getInsight, + 'insight-create-from-query': createInsight, + 'insight-update': updateInsight, + 'insight-delete': deleteInsight, + 'insight-query': queryInsight, + + // Queries + 'query-generate-hogql-from-question': generateHogQLFromQuestion, + 'query-run': queryRun, + + // Dashboards + 'dashboards-get-all': getAllDashboards, + 'dashboard-get': getDashboard, + 'dashboard-create': createDashboard, + 'dashboard-update': updateDashboard, + 'dashboard-delete': deleteDashboard, + 'add-insight-to-dashboard': addInsightToDashboard, + + // LLM Observability + 'get-llm-total-costs-for-project': getLLMCosts, + + // Surveys + 'surveys-get-all': getAllSurveys, + 'survey-get': getSurvey, + 'survey-create': createSurvey, + 'survey-update': updateSurvey, + 'survey-delete': deleteSurvey, + 'surveys-global-stats': surveysGlobalStats, + 'survey-stats': surveyStats, +} + +export const getToolsFromContext = async ( + context: Context, + features?: string[] +): Promise[]> => { + const allowedToolNames = getFilteredToolNames(features) + const toolBases: ToolBase[] = [] + + for (const toolName of allowedToolNames) { + // Special handling for docs-search which requires API key + if (toolName === 'docs-search' && context.env.INKEEP_API_KEY) { + toolBases.push(searchDocs()) + } else { + const toolFactory = TOOL_MAP[toolName] + if (toolFactory) { + toolBases.push(toolFactory()) + } + } + } + + const tools: Tool[] = toolBases.map((toolBase) => { + const definition = getToolDefinition(toolBase.name) + return { + ...toolBase, + title: definition.title, + description: definition.description, + scopes: definition.required_scopes ?? [], + annotations: definition.annotations, + } + }) + + const { scopes } = await context.stateManager.getApiKey() + + const filteredTools = tools.filter((tool) => { + return hasScopes(scopes, tool.scopes) + }) + + return filteredTools +} + +export type PostHogToolsOptions = { + posthogApiToken: string + posthogApiBaseUrl: string + inkeepApiKey?: string +} +export class PostHogAgentToolkit { + public options: PostHogToolsOptions + + constructor(options: PostHogToolsOptions) { + this.options = options + } + + getContext(): Context { + const api = new ApiClient({ + apiToken: this.options.posthogApiToken, + baseUrl: this.options.posthogApiBaseUrl, + }) + + const scope = hash(this.options.posthogApiToken) + const cache = new MemoryCache(scope) + + return { + api, + cache, + env: { + INKEEP_API_KEY: this.options.inkeepApiKey, + }, + stateManager: new StateManager(cache, api), + sessionManager: new SessionManager(cache), + } + } + async getTools(): Promise[]> { + const context = this.getContext() + return await getToolsFromContext(context) + } +} + +export type { Context, State, Tool } from './types' diff --git a/products/mcp/typescript/src/tools/insights/create.ts b/products/mcp/typescript/src/tools/insights/create.ts new file mode 100644 index 0000000000..8f2656f438 --- /dev/null +++ b/products/mcp/typescript/src/tools/insights/create.ts @@ -0,0 +1,31 @@ +import { InsightCreateSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = InsightCreateSchema + +type Params = z.infer + +export const createHandler = async (context: Context, params: Params) => { + const { data } = params + const projectId = await context.stateManager.getProjectId() + const insightResult = await context.api.insights({ projectId }).create({ data }) + if (!insightResult.success) { + throw new Error(`Failed to create insight: ${insightResult.error.message}`) + } + + const insightWithUrl = { + ...insightResult.data, + url: `${context.api.getProjectBaseUrl(projectId)}/insights/${insightResult.data.short_id}`, + } + + return { content: [{ type: 'text', text: JSON.stringify(insightWithUrl) }] } +} + +const tool = (): ToolBase => ({ + name: 'insight-create-from-query', + schema, + handler: createHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/insights/delete.ts b/products/mcp/typescript/src/tools/insights/delete.ts new file mode 100644 index 0000000000..532b6de123 --- /dev/null +++ b/products/mcp/typescript/src/tools/insights/delete.ts @@ -0,0 +1,30 @@ +import { InsightDeleteSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import { resolveInsightId } from './utils' +import type { z } from 'zod' + +const schema = InsightDeleteSchema + +type Params = z.infer + +export const deleteHandler = async (context: Context, params: Params) => { + const { insightId } = params + const projectId = await context.stateManager.getProjectId() + + const numericId = await resolveInsightId(context, insightId, projectId) + const result = await context.api.insights({ projectId }).delete({ insightId: numericId }) + + if (!result.success) { + throw new Error(`Failed to delete insight: ${result.error.message}`) + } + + return { content: [{ type: 'text', text: JSON.stringify(result.data) }] } +} + +const tool = (): ToolBase => ({ + name: 'insight-delete', + schema, + handler: deleteHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/insights/get.ts b/products/mcp/typescript/src/tools/insights/get.ts new file mode 100644 index 0000000000..eb6ede50c4 --- /dev/null +++ b/products/mcp/typescript/src/tools/insights/get.ts @@ -0,0 +1,31 @@ +import { InsightGetSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = InsightGetSchema + +type Params = z.infer + +export const getHandler = async (context: Context, params: Params) => { + const { insightId } = params + const projectId = await context.stateManager.getProjectId() + const insightResult = await context.api.insights({ projectId }).get({ insightId }) + if (!insightResult.success) { + throw new Error(`Failed to get insight: ${insightResult.error.message}`) + } + + const insightWithUrl = { + ...insightResult.data, + url: `${context.api.getProjectBaseUrl(projectId)}/insights/${insightResult.data.short_id}`, + } + + return { content: [{ type: 'text', text: JSON.stringify(insightWithUrl) }] } +} + +const tool = (): ToolBase => ({ + name: 'insight-get', + schema, + handler: getHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/insights/getAll.ts b/products/mcp/typescript/src/tools/insights/getAll.ts new file mode 100644 index 0000000000..1a65b5fb02 --- /dev/null +++ b/products/mcp/typescript/src/tools/insights/getAll.ts @@ -0,0 +1,32 @@ +import { InsightGetAllSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = InsightGetAllSchema + +type Params = z.infer + +export const getAllHandler = async (context: Context, params: Params) => { + const { data } = params + const projectId = await context.stateManager.getProjectId() + const insightsResult = await context.api.insights({ projectId }).list({ params: { ...data } }) + + if (!insightsResult.success) { + throw new Error(`Failed to get insights: ${insightsResult.error.message}`) + } + + const insightsWithUrls = insightsResult.data.map((insight) => ({ + ...insight, + url: `${context.api.getProjectBaseUrl(projectId)}/insights/${insight.short_id}`, + })) + + return { content: [{ type: 'text', text: JSON.stringify(insightsWithUrls) }] } +} + +const tool = (): ToolBase => ({ + name: 'insights-get-all', + schema, + handler: getAllHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/insights/query.ts b/products/mcp/typescript/src/tools/insights/query.ts new file mode 100644 index 0000000000..7b1c126fa9 --- /dev/null +++ b/products/mcp/typescript/src/tools/insights/query.ts @@ -0,0 +1,45 @@ +import { InsightQueryInputSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = InsightQueryInputSchema + +type Params = z.infer + +export const queryHandler = async (context: Context, params: Params) => { + const { insightId } = params + const projectId = await context.stateManager.getProjectId() + + const insightResult = await context.api.insights({ projectId }).get({ insightId }) + + if (!insightResult.success) { + throw new Error(`Failed to get insight: ${insightResult.error.message}`) + } + + // Query the insight with parameters to get actual results + const queryResult = await context.api.insights({ projectId }).query({ + query: insightResult.data.query, + }) + + if (!queryResult.success) { + throw new Error(`Failed to query insight: ${queryResult.error.message}`) + } + + const responseData = { + insight: { + url: `${context.api.getProjectBaseUrl(projectId)}/insights/${insightResult.data.short_id}`, + ...insightResult.data, + }, + results: queryResult.data.results, + } + + return { content: [{ type: 'text', text: JSON.stringify(responseData) }] } +} + +const tool = (): ToolBase => ({ + name: 'insight-query', + schema, + handler: queryHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/insights/update.ts b/products/mcp/typescript/src/tools/insights/update.ts new file mode 100644 index 0000000000..41273c440e --- /dev/null +++ b/products/mcp/typescript/src/tools/insights/update.ts @@ -0,0 +1,39 @@ +import { InsightUpdateSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' +import { resolveInsightId } from './utils' + +const schema = InsightUpdateSchema + +type Params = z.infer + +export const updateHandler = async (context: Context, params: Params) => { + const { insightId, data } = params + const projectId = await context.stateManager.getProjectId() + + const numericId = await resolveInsightId(context, insightId, projectId) + + const insightResult = await context.api.insights({ projectId }).update({ + insightId: numericId, + data, + }) + + if (!insightResult.success) { + throw new Error(`Failed to update insight: ${insightResult.error.message}`) + } + + const insightWithUrl = { + ...insightResult.data, + url: `${context.api.getProjectBaseUrl(projectId)}/insights/${insightResult.data.short_id}`, + } + + return { content: [{ type: 'text', text: JSON.stringify(insightWithUrl) }] } +} + +const tool = (): ToolBase => ({ + name: 'insight-update', + schema, + handler: updateHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/insights/utils.ts b/products/mcp/typescript/src/tools/insights/utils.ts new file mode 100644 index 0000000000..609a06bbf1 --- /dev/null +++ b/products/mcp/typescript/src/tools/insights/utils.ts @@ -0,0 +1,28 @@ +import type { Context } from '@/tools/types' + +export const isShortId = (id: string): boolean => { + return /^[A-Za-z0-9]{8}$/.test(id) +} + +export const resolveInsightId = async ( + context: Context, + insightId: string, + projectId: string +): Promise => { + if (isShortId(insightId)) { + const result = await context.api.insights({ projectId }).get({ insightId }) + + if (!result.success) { + throw new Error(`Failed to resolve insight: ${result.error.message}`) + } + + return result.data.id + } + + const numericId = Number.parseInt(insightId, 10) + if (Number.isNaN(numericId)) { + throw new Error(`Invalid insight ID format: ${insightId}`) + } + + return numericId +} diff --git a/products/mcp/typescript/src/tools/llmAnalytics/getLLMCosts.ts b/products/mcp/typescript/src/tools/llmAnalytics/getLLMCosts.ts new file mode 100644 index 0000000000..2a2509a4e3 --- /dev/null +++ b/products/mcp/typescript/src/tools/llmAnalytics/getLLMCosts.ts @@ -0,0 +1,51 @@ +import { LLMAnalyticsGetCostsSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = LLMAnalyticsGetCostsSchema + +type Params = z.infer + +export const getLLMCostsHandler = async (context: Context, params: Params) => { + const { projectId, days } = params + + const trendsQuery = { + kind: 'TrendsQuery', + dateRange: { + date_from: `-${days || 6}d`, + date_to: null, + }, + filterTestAccounts: true, + series: [ + { + event: '$ai_generation', + name: '$ai_generation', + math: 'sum', + math_property: '$ai_total_cost_usd', + kind: 'EventsNode', + }, + ], + breakdownFilter: { + breakdown_type: 'event', + breakdown: '$ai_model', + }, + } + + const costsResult = await context.api + .query({ projectId: String(projectId) }) + .execute({ queryBody: trendsQuery }) + if (!costsResult.success) { + throw new Error(`Failed to get LLM costs: ${costsResult.error.message}`) + } + return { + content: [{ type: 'text', text: JSON.stringify(costsResult.data.results) }], + } +} + +const tool = (): ToolBase => ({ + name: 'get-llm-total-costs-for-project', + schema, + handler: getLLMCostsHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/organizations/getDetails.ts b/products/mcp/typescript/src/tools/organizations/getDetails.ts new file mode 100644 index 0000000000..3ef379a783 --- /dev/null +++ b/products/mcp/typescript/src/tools/organizations/getDetails.ts @@ -0,0 +1,35 @@ +import { OrganizationGetDetailsSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = OrganizationGetDetailsSchema + +type Params = z.infer + +export const getDetailsHandler = async (context: Context, _params: Params) => { + const orgId = await context.stateManager.getOrgID() + + if (!orgId) { + throw new Error( + 'API key does not have access to any organizations. This is likely because the API key is scoped to a project, and not an organization.' + ) + } + + const orgResult = await context.api.organizations().get({ orgId }) + + if (!orgResult.success) { + throw new Error(`Failed to get organization details: ${orgResult.error.message}`) + } + + return { + content: [{ type: 'text', text: JSON.stringify(orgResult.data) }], + } +} + +const tool = (): ToolBase => ({ + name: 'organization-details-get', + schema, + handler: getDetailsHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/organizations/getOrganizations.ts b/products/mcp/typescript/src/tools/organizations/getOrganizations.ts new file mode 100644 index 0000000000..61d640263d --- /dev/null +++ b/products/mcp/typescript/src/tools/organizations/getOrganizations.ts @@ -0,0 +1,26 @@ +import { OrganizationGetAllSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = OrganizationGetAllSchema + +type Params = z.infer + +export const getOrganizationsHandler = async (context: Context, _params: Params) => { + const orgsResult = await context.api.organizations().list() + if (!orgsResult.success) { + throw new Error(`Failed to get organizations: ${orgsResult.error.message}`) + } + + return { + content: [{ type: 'text', text: JSON.stringify(orgsResult.data) }], + } +} + +const tool = (): ToolBase => ({ + name: 'organizations-get', + schema, + handler: getOrganizationsHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/organizations/setActive.ts b/products/mcp/typescript/src/tools/organizations/setActive.ts new file mode 100644 index 0000000000..ab7d778868 --- /dev/null +++ b/products/mcp/typescript/src/tools/organizations/setActive.ts @@ -0,0 +1,24 @@ +import { OrganizationSetActiveSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = OrganizationSetActiveSchema + +type Params = z.infer + +export const setActiveHandler = async (context: Context, params: Params) => { + const { orgId } = params + await context.cache.set('orgId', orgId) + + return { + content: [{ type: 'text', text: `Switched to organization ${orgId}` }], + } +} + +const tool = (): ToolBase => ({ + name: 'switch-organization', + schema, + handler: setActiveHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/projects/eventDefinitions.ts b/products/mcp/typescript/src/tools/projects/eventDefinitions.ts new file mode 100644 index 0000000000..eca3e52299 --- /dev/null +++ b/products/mcp/typescript/src/tools/projects/eventDefinitions.ts @@ -0,0 +1,34 @@ +import { EventDefinitionSchema } from '@/schema/properties' +import { ProjectEventDefinitionsSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = ProjectEventDefinitionsSchema + +type Params = z.infer + +export const eventDefinitionsHandler = async (context: Context, _params: Params) => { + const projectId = await context.stateManager.getProjectId() + + const eventDefsResult = await context.api + .projects() + .eventDefinitions({ projectId, search: _params.q }) + + if (!eventDefsResult.success) { + throw new Error(`Failed to get event definitions: ${eventDefsResult.error.message}`) + } + + const simplifiedEvents = eventDefsResult.data.map((def) => EventDefinitionSchema.parse(def)) + + return { + content: [{ type: 'text', text: JSON.stringify(simplifiedEvents) }], + } +} + +const tool = (): ToolBase => ({ + name: 'event-definitions-list', + schema, + handler: eventDefinitionsHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/projects/getProjects.ts b/products/mcp/typescript/src/tools/projects/getProjects.ts new file mode 100644 index 0000000000..d1d55726a5 --- /dev/null +++ b/products/mcp/typescript/src/tools/projects/getProjects.ts @@ -0,0 +1,35 @@ +import { ProjectGetAllSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = ProjectGetAllSchema + +type Params = z.infer + +export const getProjectsHandler = async (context: Context, _params: Params) => { + const orgId = await context.stateManager.getOrgID() + + if (!orgId) { + throw new Error( + 'API key does not have access to any organizations. This is likely because the API key is scoped to a project, and not an organization.' + ) + } + + const projectsResult = await context.api.organizations().projects({ orgId }).list() + + if (!projectsResult.success) { + throw new Error(`Failed to get projects: ${projectsResult.error.message}`) + } + + return { + content: [{ type: 'text', text: JSON.stringify(projectsResult.data) }], + } +} + +const tool = (): ToolBase => ({ + name: 'projects-get', + schema, + handler: getProjectsHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/projects/propertyDefinitions.ts b/products/mcp/typescript/src/tools/projects/propertyDefinitions.ts new file mode 100644 index 0000000000..725b02b7cd --- /dev/null +++ b/products/mcp/typescript/src/tools/projects/propertyDefinitions.ts @@ -0,0 +1,46 @@ +import { PropertyDefinitionSchema } from '@/schema/properties' +import { ProjectPropertyDefinitionsInputSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = ProjectPropertyDefinitionsInputSchema + +type Params = z.infer + +export const propertyDefinitionsHandler = async (context: Context, params: Params) => { + const projectId = await context.stateManager.getProjectId() + + if (!params.eventName && params.type === 'event') { + throw new Error('eventName is required for event type') + } + + const propDefsResult = await context.api.projects().propertyDefinitions({ + projectId, + eventNames: params.eventName ? [params.eventName] : undefined, + filterByEventNames: params.type === 'event', + isFeatureFlag: false, + limit: 200, + type: params.type, + excludeCoreProperties: !params.includePredefinedProperties, + }) + + if (!propDefsResult.success) { + throw new Error( + `Failed to get property definitions for ${params.type}s: ${propDefsResult.error.message}` + ) + } + + const simplifiedProperties = PropertyDefinitionSchema.array().parse(propDefsResult.data) + + return { + content: [{ type: 'text', text: JSON.stringify(simplifiedProperties) }], + } +} + +const tool = (): ToolBase => ({ + name: 'properties-list', + schema, + handler: propertyDefinitionsHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/projects/setActive.ts b/products/mcp/typescript/src/tools/projects/setActive.ts new file mode 100644 index 0000000000..356981af7d --- /dev/null +++ b/products/mcp/typescript/src/tools/projects/setActive.ts @@ -0,0 +1,25 @@ +import { ProjectSetActiveSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = ProjectSetActiveSchema + +type Params = z.infer + +export const setActiveHandler = async (context: Context, params: Params) => { + const { projectId } = params + + await context.cache.set('projectId', projectId.toString()) + + return { + content: [{ type: 'text', text: `Switched to project ${projectId}` }], + } +} + +const tool = (): ToolBase => ({ + name: 'switch-project', + schema, + handler: setActiveHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/query/generateHogQLFromQuestion.ts b/products/mcp/typescript/src/tools/query/generateHogQLFromQuestion.ts new file mode 100644 index 0000000000..3ce42bba01 --- /dev/null +++ b/products/mcp/typescript/src/tools/query/generateHogQLFromQuestion.ts @@ -0,0 +1,38 @@ +import { InsightGenerateHogQLFromQuestionSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = InsightGenerateHogQLFromQuestionSchema + +type Params = z.infer + +export const generateHogQLHandler = async (context: Context, params: Params) => { + const { question } = params + const projectId = await context.stateManager.getProjectId() + + const result = await context.api.insights({ projectId }).sqlInsight({ query: question }) + + if (!result.success) { + throw new Error(`Failed to execute SQL insight: ${result.error.message}`) + } + + if (result.data.length === 0) { + return { + content: [ + { + type: 'text', + text: 'Received an empty SQL insight or no data in the stream.', + }, + ], + } + } + return { content: [{ type: 'text', text: JSON.stringify(result.data) }] } +} + +const tool = (): ToolBase => ({ + name: 'query-generate-hogql-from-question', + schema, + handler: generateHogQLHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/query/run.ts b/products/mcp/typescript/src/tools/query/run.ts new file mode 100644 index 0000000000..e2201dcbee --- /dev/null +++ b/products/mcp/typescript/src/tools/query/run.ts @@ -0,0 +1,31 @@ +import { QueryRunInputSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = QueryRunInputSchema + +type Params = z.infer + +export const queryRunHandler = async (context: Context, params: Params) => { + const { query } = params + + const projectId = await context.stateManager.getProjectId() + + const queryResult = await context.api.insights({ projectId }).query({ + query: query, + }) + + if (!queryResult.success) { + throw new Error(`Failed to query insight: ${queryResult.error.message}`) + } + + return { content: [{ type: 'text', text: JSON.stringify(queryResult.data.results) }] } +} + +const tool = (): ToolBase => ({ + name: 'query-run', + schema, + handler: queryRunHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/surveys/create.ts b/products/mcp/typescript/src/tools/surveys/create.ts new file mode 100644 index 0000000000..ef9b6faefa --- /dev/null +++ b/products/mcp/typescript/src/tools/surveys/create.ts @@ -0,0 +1,52 @@ +import { SurveyCreateSchema } from '@/schema/tool-inputs' +import { formatSurvey } from '@/tools/surveys/utils/survey-utils' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = SurveyCreateSchema +type Params = z.infer + +export const createHandler = async (context: Context, params: Params) => { + const projectId = await context.stateManager.getProjectId() + + // Process questions to handle branching logic + if (params.questions) { + params.questions = params.questions.map((question: any) => { + // Handle single choice questions - convert numeric keys to strings + if ( + 'branching' in question && + question.branching?.type === 'response_based' && + question.type === 'single_choice' + ) { + question.branching.responseValues = Object.fromEntries( + Object.entries(question.branching.responseValues).map(([key, value]) => { + return [String(key), value] + }) + ) + } + return question + }) + } + + const surveyResult = await context.api.surveys({ projectId }).create({ + data: params, + }) + + if (!surveyResult.success) { + throw new Error(`Failed to create survey: ${surveyResult.error.message}`) + } + + const formattedSurvey = formatSurvey(surveyResult.data, context, projectId) + + return { + content: [{ type: 'text', text: JSON.stringify(formattedSurvey) }], + } +} + +const tool = (): ToolBase => ({ + name: 'survey-create', + schema, + handler: createHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/surveys/delete.ts b/products/mcp/typescript/src/tools/surveys/delete.ts new file mode 100644 index 0000000000..ef11b1d7f0 --- /dev/null +++ b/products/mcp/typescript/src/tools/surveys/delete.ts @@ -0,0 +1,31 @@ +import { SurveyDeleteSchema } from '@/schema/tool-inputs' +import type { Context, Tool, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = SurveyDeleteSchema +type Params = z.infer + +export const deleteHandler = async (context: Context, params: Params) => { + const { surveyId } = params + const projectId = await context.stateManager.getProjectId() + + const deleteResult = await context.api.surveys({ projectId }).delete({ + surveyId, + }) + + if (!deleteResult.success) { + throw new Error(`Failed to delete survey: ${deleteResult.error.message}`) + } + + return { + content: [{ type: 'text', text: JSON.stringify(deleteResult.data) }], + } +} + +const tool = (): ToolBase => ({ + name: 'survey-delete', + schema, + handler: deleteHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/surveys/get.ts b/products/mcp/typescript/src/tools/surveys/get.ts new file mode 100644 index 0000000000..fe29749056 --- /dev/null +++ b/products/mcp/typescript/src/tools/surveys/get.ts @@ -0,0 +1,34 @@ +import { SurveyGetSchema } from '@/schema/tool-inputs' +import { formatSurvey } from '@/tools/surveys/utils/survey-utils' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = SurveyGetSchema +type Params = z.infer + +export const getHandler = async (context: Context, params: Params) => { + const { surveyId } = params + const projectId = await context.stateManager.getProjectId() + + const surveyResult = await context.api.surveys({ projectId }).get({ + surveyId, + }) + + if (!surveyResult.success) { + throw new Error(`Failed to get survey: ${surveyResult.error.message}`) + } + + const formattedSurvey = formatSurvey(surveyResult.data, context, projectId) + + return { + content: [{ type: 'text', text: JSON.stringify(formattedSurvey) }], + } +} + +const tool = (): ToolBase => ({ + name: 'survey-get', + schema, + handler: getHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/surveys/getAll.ts b/products/mcp/typescript/src/tools/surveys/getAll.ts new file mode 100644 index 0000000000..e92faaf883 --- /dev/null +++ b/products/mcp/typescript/src/tools/surveys/getAll.ts @@ -0,0 +1,35 @@ +import { SurveyGetAllSchema } from '@/schema/tool-inputs' +import { formatSurveys } from '@/tools/surveys/utils/survey-utils' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = SurveyGetAllSchema +type Params = z.infer + +export const getAllHandler = async (context: Context, params: Params) => { + const projectId = await context.stateManager.getProjectId() + + const surveysResult = await context.api.surveys({ projectId }).list(params ? { params } : {}) + + if (!surveysResult.success) { + throw new Error(`Failed to get surveys: ${surveysResult.error.message}`) + } + + const formattedSurveys = formatSurveys(surveysResult.data, context, projectId) + + const response = { + results: formattedSurveys, + } + + return { + content: [{ type: 'text', text: JSON.stringify(response) }], + } +} + +const tool = (): ToolBase => ({ + name: 'surveys-get-all', + schema, + handler: getAllHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/surveys/global-stats.ts b/products/mcp/typescript/src/tools/surveys/global-stats.ts new file mode 100644 index 0000000000..30bccd8d64 --- /dev/null +++ b/products/mcp/typescript/src/tools/surveys/global-stats.ts @@ -0,0 +1,28 @@ +import { SurveyGlobalStatsSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = SurveyGlobalStatsSchema +type Params = z.infer + +export const globalStatsHandler = async (context: Context, params: Params) => { + const projectId = await context.stateManager.getProjectId() + + const result = await context.api.surveys({ projectId }).globalStats({ params }) + + if (!result.success) { + throw new Error(`Failed to get survey global stats: ${result.error.message}`) + } + + return { + content: [{ type: 'text', text: JSON.stringify(result.data, null, 2) }], + } +} + +const tool = (): ToolBase => ({ + name: 'surveys-global-stats', + schema, + handler: globalStatsHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/surveys/stats.ts b/products/mcp/typescript/src/tools/surveys/stats.ts new file mode 100644 index 0000000000..14b4767813 --- /dev/null +++ b/products/mcp/typescript/src/tools/surveys/stats.ts @@ -0,0 +1,32 @@ +import { SurveyStatsSchema } from '@/schema/tool-inputs' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = SurveyStatsSchema +type Params = z.infer + +export const statsHandler = async (context: Context, params: Params) => { + const projectId = await context.stateManager.getProjectId() + + const result = await context.api.surveys({ projectId }).stats({ + survey_id: params.survey_id, + date_from: params.date_from, + date_to: params.date_to, + }) + + if (!result.success) { + throw new Error(`Failed to get survey stats: ${result.error.message}`) + } + + return { + content: [{ type: 'text', text: JSON.stringify(result.data, null, 2) }], + } +} + +const tool = (): ToolBase => ({ + name: 'survey-stats', + schema, + handler: statsHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/surveys/update.ts b/products/mcp/typescript/src/tools/surveys/update.ts new file mode 100644 index 0000000000..656e6e88d8 --- /dev/null +++ b/products/mcp/typescript/src/tools/surveys/update.ts @@ -0,0 +1,54 @@ +import { SurveyUpdateSchema } from '@/schema/tool-inputs' +import { formatSurvey } from '@/tools/surveys/utils/survey-utils' +import type { Context, ToolBase } from '@/tools/types' +import type { z } from 'zod' + +const schema = SurveyUpdateSchema +type Params = z.infer + +export const updateHandler = async (context: Context, params: Params) => { + const { surveyId, ...data } = params + + const projectId = await context.stateManager.getProjectId() + + if (data.questions) { + data.questions = data.questions.map((question: any) => { + // Handle single choice questions - convert numeric keys to strings + if ( + 'branching' in question && + question.branching?.type === 'response_based' && + question.type === 'single_choice' + ) { + question.branching.responseValues = Object.fromEntries( + Object.entries(question.branching.responseValues).map(([key, value]) => { + return [String(key), value] + }) + ) + } + return question + }) + } + + const surveyResult = await context.api.surveys({ projectId }).update({ + surveyId, + data, + }) + + if (!surveyResult.success) { + throw new Error(`Failed to update survey: ${surveyResult.error.message}`) + } + + const formattedSurvey = formatSurvey(surveyResult.data, context, projectId) + + return { + content: [{ type: 'text', text: JSON.stringify(formattedSurvey) }], + } +} + +const tool = (): ToolBase => ({ + name: 'survey-update', + schema, + handler: updateHandler, +}) + +export default tool diff --git a/products/mcp/typescript/src/tools/surveys/utils/survey-utils.ts b/products/mcp/typescript/src/tools/surveys/utils/survey-utils.ts new file mode 100644 index 0000000000..528f30301e --- /dev/null +++ b/products/mcp/typescript/src/tools/surveys/utils/survey-utils.ts @@ -0,0 +1,52 @@ +import type { SurveyListItemOutput, SurveyOutput } from '@/schema/surveys' +import type { Context } from '@/tools/types' + +type SurveyData = SurveyOutput | SurveyListItemOutput + +export interface FormattedSurvey extends Omit { + status: 'draft' | 'active' | 'completed' | 'archived' + end_date?: string | undefined + url?: string +} + +/** + * Formats a survey with consistent status logic and additional fields + */ +export function formatSurvey( + survey: SurveyData, + context: Context, + projectId: string +): FormattedSurvey { + const status = survey.archived + ? 'archived' + : survey.start_date === null || survey.start_date === undefined + ? 'draft' + : survey.end_date + ? 'completed' + : 'active' + + const formatted: FormattedSurvey = { + ...survey, + status, + end_date: survey.end_date || undefined, // Don't show null end_date + } + + // Add URL if we have context and survey ID + if (context && survey.id && projectId) { + const baseUrl = context.api.getProjectBaseUrl(projectId) + formatted.url = `${baseUrl}/surveys/${survey.id}` + } + + return formatted +} + +/** + * Formats multiple surveys consistently + */ +export function formatSurveys( + surveys: SurveyData[], + context: Context, + projectId: string +): FormattedSurvey[] { + return surveys.map((survey) => formatSurvey(survey, context, projectId)) +} diff --git a/products/mcp/typescript/src/tools/toolDefinitions.ts b/products/mcp/typescript/src/tools/toolDefinitions.ts new file mode 100644 index 0000000000..6905cb18d5 --- /dev/null +++ b/products/mcp/typescript/src/tools/toolDefinitions.ts @@ -0,0 +1,54 @@ +import z from 'zod' +import toolDefinitionsJson from '../../../schema/tool-definitions.json' + +export const ToolDefinitionSchema = z.object({ + description: z.string(), + category: z.string(), + feature: z.string(), + summary: z.string(), + title: z.string(), + required_scopes: z.array(z.string()), + annotations: z.object({ + destructiveHint: z.boolean(), + idempotentHint: z.boolean(), + openWorldHint: z.boolean(), + readOnlyHint: z.boolean(), + }), +}) + +export type ToolDefinition = z.infer + +export type ToolDefinitions = Record + +let _toolDefinitions: ToolDefinitions | undefined = undefined + +export function getToolDefinitions(): ToolDefinitions { + if (!_toolDefinitions) { + _toolDefinitions = z.record(z.string(), ToolDefinitionSchema).parse(toolDefinitionsJson) + } + return _toolDefinitions +} + +export function getToolDefinition(toolName: string): ToolDefinition { + const toolDefinitions = getToolDefinitions() + + const definition = toolDefinitions[toolName] + + if (!definition) { + throw new Error(`Tool definition not found for: ${toolName}`) + } + + return definition +} + +export function getToolsForFeatures(features?: string[]): string[] { + const toolDefinitions = getToolDefinitions() + + if (!features || features.length === 0) { + return Object.keys(toolDefinitions) + } + + return Object.entries(toolDefinitions) + .filter(([_, definition]) => definition.feature && features.includes(definition.feature)) + .map(([toolName, _]) => toolName) +} diff --git a/products/mcp/typescript/src/tools/types.ts b/products/mcp/typescript/src/tools/types.ts new file mode 100644 index 0000000000..7304629b20 --- /dev/null +++ b/products/mcp/typescript/src/tools/types.ts @@ -0,0 +1,54 @@ +import type { ApiClient } from '@/api/client' +import type { StateManager } from '@/lib/utils/StateManager' +import type { SessionManager } from '@/lib/utils/SessionManager' +import type { ScopedCache } from '@/lib/utils/cache/ScopedCache' +import type { ApiRedactedPersonalApiKey } from '@/schema/api' +import type { z } from 'zod' + +export type CloudRegion = 'us' | 'eu' + +export type SessionState = { + uuid: string +} + +export type State = { + projectId: string | undefined + orgId: string | undefined + distinctId: string | undefined + region: CloudRegion | undefined + apiKey: ApiRedactedPersonalApiKey | undefined +} & Record, SessionState> + +export type Env = { + INKEEP_API_KEY: string | undefined +} + +export type Context = { + api: ApiClient + cache: ScopedCache + env: Env + stateManager: StateManager + sessionManager: SessionManager +} + +export type Tool = { + name: string + title: string + description: string + schema: TSchema + handler: (context: Context, params: z.infer) => Promise + scopes: string[] + annotations: { + destructiveHint: boolean + idempotentHint: boolean + openWorldHint: boolean + readOnlyHint: boolean + } +} + +export type ToolBase = Omit< + Tool, + 'title' | 'description' | 'scopes' | 'annotations' +> + +export type ZodObjectAny = z.ZodObject diff --git a/products/mcp/typescript/tests/README.md b/products/mcp/typescript/tests/README.md new file mode 100644 index 0000000000..4a8149baee --- /dev/null +++ b/products/mcp/typescript/tests/README.md @@ -0,0 +1,23 @@ +# API Integration Tests + +These tests should verify that the API works as intended. + +## Setup + +1. **Configure environment:** + + ```bash + cp .env.test.example .env.test + ``` + + Edit `.env.test` and set an api token and base url for your local PostHog instance + +## Running Tests + +```bash +# Run all tests +npm run test + +# Run tests in watch mode +npm run test:watch +``` diff --git a/products/mcp/typescript/tests/api/client.integration.test.ts b/products/mcp/typescript/tests/api/client.integration.test.ts new file mode 100644 index 0000000000..fd03d212e7 --- /dev/null +++ b/products/mcp/typescript/tests/api/client.integration.test.ts @@ -0,0 +1,1651 @@ +import { ApiClient } from '@/api/client' +import type { CreateInsightInput } from '@/schema/insights' +import { afterEach, beforeAll, describe, expect, it } from 'vitest' + +const API_BASE_URL = process.env.TEST_POSTHOG_API_BASE_URL || 'http://localhost:8010' +const API_TOKEN = process.env.TEST_POSTHOG_PERSONAL_API_KEY +const TEST_ORG_ID = process.env.TEST_ORG_ID +const TEST_PROJECT_ID = process.env.TEST_PROJECT_ID + +describe('API Client Integration Tests', { concurrent: false }, () => { + let client: ApiClient + let testOrgId: string + let testProjectId: string + + // Track created resources for cleanup + const createdResources = { + featureFlags: [] as number[], + insights: [] as number[], + dashboards: [] as number[], + experiments: [] as number[], + } + + beforeAll(async () => { + if (!API_TOKEN) { + throw new Error('TEST_POSTHOG_PERSONAL_API_KEY environment variable is required') + } + + if (!TEST_ORG_ID) { + throw new Error('TEST_ORG_ID environment variable is required') + } + + if (!TEST_PROJECT_ID) { + throw new Error('TEST_PROJECT_ID environment variable is required') + } + + client = new ApiClient({ + apiToken: API_TOKEN, + baseUrl: API_BASE_URL, + }) + + testOrgId = TEST_ORG_ID + testProjectId = TEST_PROJECT_ID + }) + + afterEach(async () => { + // Clean up created feature flags + for (const flagId of createdResources.featureFlags) { + try { + await client.featureFlags({ projectId: testProjectId }).delete({ flagId }) + } catch (error) { + console.warn(`Failed to cleanup feature flag ${flagId}:`, error) + } + } + createdResources.featureFlags = [] + + // Clean up created insights + for (const insightId of createdResources.insights) { + try { + await client.insights({ projectId: testProjectId }).delete({ insightId }) + } catch (error) { + console.warn(`Failed to cleanup insight ${insightId}:`, error) + } + } + createdResources.insights = [] + + // Clean up created dashboards + for (const dashboardId of createdResources.dashboards) { + try { + await client.dashboards({ projectId: testProjectId }).delete({ dashboardId }) + } catch (error) { + console.warn(`Failed to cleanup dashboard ${dashboardId}:`, error) + } + } + createdResources.dashboards = [] + + // Clean up created experiments + for (const experimentId of createdResources.experiments) { + try { + await client.experiments({ projectId: testProjectId }).delete({ + experimentId, + }) + } catch (error) { + console.warn(`Failed to cleanup experiment ${experimentId}:`, error) + } + } + createdResources.experiments = [] + }) + + describe.skip('Organizations API', () => { + it('should list organizations', async () => { + const result = await client.organizations().list() + + if (!result.success) { + console.error('Failed to list organizations:', (result as any).error) + } + + expect(result.success).toBe(true) + + if (result.success) { + expect(Array.isArray(result.data)).toBe(true) + if (result.data.length > 0) { + const org = result.data[0] + expect(org).toHaveProperty('id') + expect(org).toHaveProperty('name') + if (org) { + expect(typeof org.id).toBe('string') + expect(typeof org.name).toBe('string') + } + } + } + }) + + it('should get organization details', async () => { + const result = await client.organizations().get({ orgId: testOrgId }) + + expect(result.success).toBe(true) + + if (result.success) { + expect(result.data).toHaveProperty('id') + expect(result.data).toHaveProperty('name') + expect(result.data.id).toBe(testOrgId) + } + }) + + it('should list projects for organization', async () => { + const result = await client.organizations().projects({ orgId: testOrgId }).list() + + if (!result.success) { + console.error('Failed to list projects:', (result as any).error) + } + + expect(result.success).toBe(true) + + if (result.success) { + expect(Array.isArray(result.data)).toBe(true) + if (result.data.length > 0) { + const project = result.data[0] + expect(project).toHaveProperty('id') + expect(project).toHaveProperty('name') + if (project) { + expect(typeof project.id).toBe('number') + expect(typeof project.name).toBe('string') + } + } + } + }) + }) + + describe('Projects API', () => { + it('should get project details', async () => { + const result = await client.projects().get({ projectId: testProjectId }) + + if (!result.success) { + console.error('Failed to get project details:', (result as any).error) + } + + expect(result.success).toBe(true) + + if (result.success) { + expect(result.data).toHaveProperty('id') + expect(result.data).toHaveProperty('name') + expect(result.data.id).toBe(Number(testProjectId)) + } + }) + + it.each(['event', 'person'] as const)( + 'should get property definitions for %s type', + async (type) => { + const result = await client.projects().propertyDefinitions({ + projectId: testProjectId, + type, + eventNames: type === 'event' ? ['$pageview'] : undefined, + excludeCoreProperties: false, + filterByEventNames: type === 'event', + isFeatureFlag: false, + limit: 100, + }) + + expect(result.success).toBe(true) + + if (result.success) { + expect(Array.isArray(result.data)).toBe(true) + if (result.data.length > 0) { + const propDef = result.data[0] + expect(propDef).toHaveProperty('id') + expect(propDef).toHaveProperty('name') + } + } + } + ) + + it('should get event definitions', async () => { + const result = await client.projects().eventDefinitions({ projectId: testProjectId }) + + expect(result.success).toBe(true) + + if (result.success) { + expect(Array.isArray(result.data)).toBe(true) + if (result.data.length > 0) { + const eventDef = result.data[0] + expect(eventDef).toHaveProperty('id') + expect(eventDef).toHaveProperty('name') + expect(eventDef).toHaveProperty('last_seen_at') + } + } + }) + + it('should get event definitions with search parameter', async () => { + const result = await client.projects().eventDefinitions({ + projectId: testProjectId, + search: 'pageview', + }) + + expect(result.success).toBe(true) + + if (result.success) { + expect(Array.isArray(result.data)).toBe(true) + // All returned events should contain "pageview" in their name + for (const eventDef of result.data) { + expect(eventDef.name.toLowerCase()).toContain('pageview') + } + } + }) + + it('should return empty array when searching for non-existent events', async () => { + const result = await client.projects().eventDefinitions({ + projectId: testProjectId, + search: 'non-existent-event-xyz123', + }) + + expect(result.success).toBe(true) + + if (result.success) { + expect(Array.isArray(result.data)).toBe(true) + expect(result.data.length).toBe(0) + } + }) + }) + + describe('Feature Flags API', () => { + it('should list feature flags', async () => { + const result = await client.featureFlags({ projectId: testProjectId }).list() + + expect(result.success).toBe(true) + + if (result.success) { + expect(Array.isArray(result.data)).toBe(true) + for (const flag of result.data) { + expect(flag).toHaveProperty('id') + expect(flag).toHaveProperty('key') + expect(flag).toHaveProperty('name') + expect(flag).toHaveProperty('active') + expect(typeof flag.id).toBe('number') + expect(typeof flag.key).toBe('string') + expect(typeof flag.name).toBe('string') + expect(typeof flag.active).toBe('boolean') + } + } + }) + + it('should create, get, update, and delete a feature flag', async () => { + const testKey = `test-flag-${Date.now()}` + + // Create + const createResult = await client.featureFlags({ projectId: testProjectId }).create({ + data: { + key: testKey, + name: 'Test Flag', + description: 'Test feature flag', + active: true, + filters: { groups: [] }, + }, + }) + + expect(createResult.success).toBe(true) + + if (createResult.success) { + const flagId = createResult.data.id + createdResources.featureFlags.push(flagId) + + // Get by ID + const getResult = await client + .featureFlags({ projectId: testProjectId }) + .get({ flagId }) + expect(getResult.success).toBe(true) + + if (getResult.success) { + expect(getResult.data.key).toBe(testKey) + expect(getResult.data.name).toBe('Test Flag') + } + + // Find by key + const findResult = await client + .featureFlags({ projectId: testProjectId }) + .findByKey({ key: testKey }) + expect(findResult.success).toBe(true) + + if (findResult.success && findResult.data) { + expect(findResult.data.id).toBe(flagId) + expect(findResult.data.key).toBe(testKey) + } + + // Update + const updateResult = await client + .featureFlags({ projectId: testProjectId }) + .update({ + key: testKey, + data: { + name: 'Updated Test Flag', + active: false, + }, + }) + expect(updateResult.success).toBe(true) + + // Verify update + const updatedGetResult = await client + .featureFlags({ projectId: testProjectId }) + .get({ flagId }) + if (updatedGetResult.success) { + expect(updatedGetResult.data.name).toBe('Updated Test Flag') + expect(updatedGetResult.data.active).toBe(false) + } + + // Delete will be handled by afterEach cleanup + } + }) + }) + + describe('Insights API', () => { + it('should list insights', async () => { + const result = await client.insights({ projectId: testProjectId }).list() + + expect(result.success).toBe(true) + + if (result.success) { + expect(Array.isArray(result.data)).toBe(true) + for (const insight of result.data) { + expect(insight).toHaveProperty('id') + expect(insight).toHaveProperty('name') + expect(typeof insight.id).toBe('number') + expect(typeof insight.name).toBe('string') + } + } + }) + + it.skip('should execute SQL insight query', async () => { + const result = await client + .insights({ projectId: testProjectId }) + .sqlInsight({ query: 'SELECT 1 as test' }) + + if (!result.success) { + console.error('Failed to execute SQL insight:', (result as any).error) + } + + expect(result.success).toBe(true) + + if (result.success) { + expect(result.data).toHaveProperty('columns') + expect(result.data).toHaveProperty('results') + if ('columns' in result.data && 'results' in result.data) { + expect(Array.isArray(result.data.columns)).toBe(true) + expect(Array.isArray(result.data.results)).toBe(true) + } + } + }) + + it('should create, get, update, and delete an insight', async () => { + const createResult = await client.insights({ projectId: testProjectId }).create({ + data: { + name: 'Test Insight', + query: { + kind: 'DataVisualizationNode', + source: { + kind: 'HogQLQuery', + query: 'SELECT 1 as test', + filters: { + dateRange: { + date_from: '-7d', + date_to: '1d', + }, + }, + }, + }, + favorited: false, + }, + }) + + if (!createResult.success) { + console.error('Failed to create insight:', (createResult as any).error) + } + + expect(createResult.success).toBe(true) + + if (createResult.success) { + const insightId = createResult.data.id + createdResources.insights.push(insightId) + + // Get + const getResult = await client + .insights({ projectId: testProjectId }) + .get({ insightId: insightId.toString() }) + + if (!getResult.success) { + console.error('Failed to get insight:', (getResult as any).error) + } + + expect(getResult.success).toBe(true) + + if (getResult.success) { + expect(getResult.data.name).toBe('Test Insight') + } + + // Update + const updateResult = await client.insights({ projectId: testProjectId }).update({ + insightId, + data: { + name: 'Updated Test Insight', + }, + }) + expect(updateResult.success).toBe(true) + + // Delete will be handled by afterEach cleanup + } + }) + + describe('Trends Query Tests', () => { + it('should create trends insight with minimal parameters', async () => { + const insightData: CreateInsightInput = { + name: 'Basic Trends Test', + query: { + kind: 'InsightVizNode', + source: { + kind: 'TrendsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + math: 'total', + }, + ], + properties: [], + filterTestAccounts: false, + interval: 'day', + }, + }, + favorited: false, + } + + const result = await client.insights({ projectId: testProjectId }).create({ + data: insightData, + }) + + expect(result.success).toBe(true) + if (result.success) { + createdResources.insights.push(result.data.id) + } + }) + + it('should create trends insight with all display types', async () => { + const displayTypes = [ + 'ActionsLineGraph', + 'ActionsTable', + 'ActionsPie', + 'ActionsBar', + 'ActionsBarValue', + 'WorldMap', + 'BoldNumber', + ] as const + + for (const display of displayTypes) { + const insightData: CreateInsightInput = { + name: `Trends Display - ${display}`, + query: { + kind: 'InsightVizNode', + source: { + kind: 'TrendsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + math: 'total', + }, + ], + trendsFilter: { + display, + showLegend: true, + }, + properties: [], + filterTestAccounts: true, + interval: 'day', + }, + }, + favorited: false, + } + + const result = await client.insights({ projectId: testProjectId }).create({ + data: insightData, + }) + + expect(result.success).toBe(true) + if (result.success) { + createdResources.insights.push(result.data.id) + } + } + }) + + it('should create trends insight with breakdowns', async () => { + const breakdownTypes = ['event', 'person'] as const + + for (const breakdownType of breakdownTypes) { + const insightData: CreateInsightInput = { + name: `Trends Breakdown - ${breakdownType}`, + query: { + kind: 'InsightVizNode', + source: { + kind: 'TrendsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + math: 'total', + }, + ], + breakdownFilter: { + breakdown_type: breakdownType, + breakdown: + breakdownType === 'event' ? '$current_url' : '$browser', + breakdown_limit: 10, + }, + properties: [], + filterTestAccounts: true, + interval: 'day', + }, + }, + favorited: false, + } + + const result = await client.insights({ projectId: testProjectId }).create({ + data: insightData, + }) + + expect(result.success).toBe(true) + if (result.success) { + createdResources.insights.push(result.data.id) + } + } + }) + + it('should create trends insight with different intervals', async () => { + const intervals = ['hour', 'day', 'week', 'month'] as const + + for (const interval of intervals) { + const insightData: CreateInsightInput = { + name: `Trends Interval - ${interval}`, + query: { + kind: 'InsightVizNode', + source: { + kind: 'TrendsQuery', + dateRange: { + date_from: '-30d', + date_to: null, + }, + interval, + series: [ + { + kind: 'EventsNode', + event: '$pageview', + math: 'total', + }, + ], + properties: [], + filterTestAccounts: true, + }, + }, + favorited: false, + } + + const result = await client.insights({ projectId: testProjectId }).create({ + data: insightData, + }) + + expect(result.success).toBe(true) + if (result.success) { + createdResources.insights.push(result.data.id) + } + } + }) + + it('should create trends insight with compare filter', async () => { + const insightData: CreateInsightInput = { + name: 'Trends Compare Test', + query: { + kind: 'InsightVizNode', + source: { + kind: 'TrendsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + math: 'total', + }, + ], + compareFilter: { + compare: true, + compare_to: '-1w', + }, + properties: [], + filterTestAccounts: false, + interval: 'day', + }, + }, + favorited: false, + } + + const result = await client.insights({ projectId: testProjectId }).create({ + data: insightData, + }) + + expect(result.success).toBe(true) + if (result.success) { + createdResources.insights.push(result.data.id) + } + }) + + it('should create trends insight with property filters', async () => { + const insightData: CreateInsightInput = { + name: 'Trends Property Filters', + query: { + kind: 'InsightVizNode', + source: { + kind: 'TrendsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + math: 'total', + properties: [ + { + key: '$browser', + value: ['Chrome', 'Safari'], + operator: 'exact', + type: 'event', + }, + ], + }, + ], + properties: [ + { + key: '$current_url', + value: '/dashboard', + operator: 'icontains', + type: 'event', + }, + ], + filterTestAccounts: false, + interval: 'day', + }, + }, + favorited: false, + } + + const result = await client.insights({ projectId: testProjectId }).create({ + data: insightData, + }) + + expect(result.success).toBe(true) + if (result.success) { + createdResources.insights.push(result.data.id) + } + }) + }) + + describe('Funnels Query Tests', () => { + it('should create funnel insight with minimal parameters', async () => { + const insightData: CreateInsightInput = { + name: 'Basic Funnel Test', + query: { + kind: 'InsightVizNode', + source: { + kind: 'FunnelsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + math: 'total', + }, + { + kind: 'EventsNode', + event: 'button_clicked', + math: 'total', + }, + ], + properties: [], + filterTestAccounts: false, + }, + }, + favorited: false, + } + + const result = await client.insights({ projectId: testProjectId }).create({ + data: insightData, + }) + + expect(result.success).toBe(true) + if (result.success) { + createdResources.insights.push(result.data.id) + } + }) + + it('should create funnel insight with different layouts and order types', async () => { + const configs = [ + { layout: 'horizontal' as const, orderType: 'ordered' as const }, + { layout: 'vertical' as const, orderType: 'unordered' as const }, + { layout: 'vertical' as const, orderType: 'strict' as const }, + ] + + for (const config of configs) { + const insightData: CreateInsightInput = { + name: `Funnel ${config.layout} ${config.orderType}`, + query: { + kind: 'InsightVizNode', + source: { + kind: 'FunnelsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + math: 'total', + }, + { + kind: 'EventsNode', + event: 'button_clicked', + math: 'total', + }, + ], + funnelsFilter: { + layout: config.layout, + funnelOrderType: config.orderType, + funnelWindowInterval: 7, + funnelWindowIntervalUnit: 'day', + }, + properties: [], + filterTestAccounts: false, + }, + }, + favorited: false, + } + + const result = await client.insights({ projectId: testProjectId }).create({ + data: insightData, + }) + + expect(result.success).toBe(true) + if (result.success) { + createdResources.insights.push(result.data.id) + } + } + }) + + it('should create funnel insight with breakdown attribution', async () => { + const attributionTypes = ['first_touch', 'last_touch', 'all_events'] as const + + for (const attribution of attributionTypes) { + const insightData: CreateInsightInput = { + name: `Funnel Attribution - ${attribution}`, + query: { + kind: 'InsightVizNode', + source: { + kind: 'FunnelsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + math: 'total', + }, + { + kind: 'EventsNode', + event: 'button_clicked', + math: 'total', + }, + ], + breakdownFilter: { + breakdown_type: 'event', + breakdown: '$browser', + breakdown_limit: 5, + }, + funnelsFilter: { + breakdownAttributionType: attribution, + }, + properties: [], + filterTestAccounts: false, + }, + }, + favorited: false, + } + + const result = await client.insights({ projectId: testProjectId }).create({ + data: insightData, + }) + + expect(result.success).toBe(true) + if (result.success) { + createdResources.insights.push(result.data.id) + } + } + }) + + it('should create funnel insight with conversion window', async () => { + const windowUnits = ['minute', 'hour', 'day', 'week', 'month'] as const + + for (const unit of windowUnits) { + const insightData: CreateInsightInput = { + name: `Funnel Window - ${unit}`, + query: { + kind: 'InsightVizNode', + source: { + kind: 'FunnelsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + math: 'total', + }, + { + kind: 'EventsNode', + event: 'button_clicked', + math: 'total', + }, + ], + funnelsFilter: { + funnelWindowInterval: + unit === 'minute' ? 30 : unit === 'hour' ? 2 : 7, + funnelWindowIntervalUnit: unit, + }, + properties: [], + filterTestAccounts: false, + }, + }, + favorited: false, + } + + const result = await client.insights({ projectId: testProjectId }).create({ + data: insightData, + }) + + expect(result.success).toBe(true) + if (result.success) { + createdResources.insights.push(result.data.id) + } + } + }) + }) + + describe('HogQL Query Tests', () => { + it('should create HogQL insight with basic query', async () => { + const insightData: CreateInsightInput = { + name: 'Basic HogQL Test', + query: { + kind: 'DataVisualizationNode' as const, + source: { + kind: 'HogQLQuery' as const, + query: "SELECT count() as total_events FROM events WHERE event = '$pageview'", + filters: { + dateRange: { + date_from: '-7d', + date_to: null, + }, + filterTestAccounts: true, + }, + }, + }, + favorited: false, + } + + const result = await client.insights({ projectId: testProjectId }).create({ + data: insightData, + }) + + expect(result.success).toBe(true) + if (result.success) { + createdResources.insights.push(result.data.id) + } + }) + + it('should create HogQL insight with aggregation query', async () => { + const insightData: CreateInsightInput = { + name: 'HogQL Aggregation Test', + query: { + kind: 'DataVisualizationNode' as const, + source: { + kind: 'HogQLQuery' as const, + query: ` + SELECT + toDate(timestamp) as date, + count() as events, + uniq(distinct_id) as unique_users, + avg(toFloat(JSONExtractString(properties, '$screen_width'))) as avg_screen_width + FROM events + WHERE event = '$pageview' + AND timestamp >= now() - INTERVAL 30 DAY + GROUP BY date + ORDER BY date + `, + filters: { + dateRange: { + date_from: '-30d', + date_to: null, + }, + filterTestAccounts: true, + }, + }, + }, + favorited: false, + } + + const result = await client.insights({ projectId: testProjectId }).create({ + data: insightData, + }) + + expect(result.success).toBe(true) + if (result.success) { + createdResources.insights.push(result.data.id) + } + }) + + it('should create HogQL insight with property filters', async () => { + const insightData: CreateInsightInput = { + name: 'HogQL Property Filter Test', + query: { + kind: 'DataVisualizationNode' as const, + source: { + kind: 'HogQLQuery' as const, + query: ` + SELECT + JSONExtractString(properties, '$browser') as browser, + count() as pageviews + FROM events + WHERE event = '$pageview' + GROUP BY browser + ORDER BY pageviews DESC + LIMIT 10 + `, + filters: { + dateRange: { + date_from: '-30d', + date_to: null, + }, + filterTestAccounts: true, + properties: [ + { + key: '$browser', + value: 'Chrome', + operator: 'exact', + type: 'event', + }, + ], + }, + }, + }, + favorited: false, + } + + const result = await client.insights({ projectId: testProjectId }).create({ + data: insightData, + }) + + expect(result.success).toBe(true) + if (result.success) { + createdResources.insights.push(result.data.id) + } + }) + }) + }) + + describe('Dashboards API', () => { + it('should list dashboards', async () => { + const result = await client.dashboards({ projectId: testProjectId }).list() + + expect(result.success).toBe(true) + + if (result.success) { + expect(Array.isArray(result.data)).toBe(true) + for (const dashboard of result.data) { + expect(dashboard).toHaveProperty('id') + expect(dashboard).toHaveProperty('name') + expect(typeof dashboard.id).toBe('number') + expect(typeof dashboard.name).toBe('string') + } + } + }) + + it('should create, get, update, and delete a dashboard', async () => { + const createResult = await client.dashboards({ projectId: testProjectId }).create({ + data: { + name: 'Test Dashboard', + description: 'Test dashboard for API tests', + pinned: false, + }, + }) + + expect(createResult.success).toBe(true) + + if (createResult.success) { + const dashboardId = createResult.data.id + createdResources.dashboards.push(dashboardId) + + // Get + const getResult = await client + .dashboards({ projectId: testProjectId }) + .get({ dashboardId }) + expect(getResult.success).toBe(true) + + if (getResult.success) { + expect(getResult.data.name).toBe('Test Dashboard') + } + + // Update + const updateResult = await client.dashboards({ projectId: testProjectId }).update({ + dashboardId, + data: { + name: 'Updated Test Dashboard', + }, + }) + expect(updateResult.success).toBe(true) + + // Delete will be handled by afterEach cleanup + } + }) + }) + + describe('Query API', () => { + it('should execute error tracking query', async () => { + const errorQuery = { + kind: 'ErrorTrackingQuery', + orderBy: 'occurrences', + dateRange: { + date_from: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), + date_to: new Date().toISOString(), + }, + volumeResolution: 1, + orderDirection: 'DESC', + filterTestAccounts: true, + status: 'active', + } + + const result = await client + .query({ projectId: testProjectId }) + .execute({ queryBody: errorQuery }) + + if (!result.success) { + console.error('Failed to execute error query:', (result as any).error) + } + + expect(result.success).toBe(true) + + if (result.success) { + expect(result.data).toHaveProperty('results') + expect(Array.isArray(result.data.results)).toBe(true) + } + }) + + it('should execute trends query for LLM costs', async () => { + const trendsQuery = { + kind: 'TrendsQuery', + dateRange: { + date_from: '-6d', + date_to: null, + }, + filterTestAccounts: true, + series: [ + { + event: '$ai_generation', + name: '$ai_generation', + math: 'sum', + math_property: '$ai_total_cost_usd', + kind: 'EventsNode', + }, + ], + breakdownFilter: { + breakdown_type: 'event', + breakdown: '$ai_model', + }, + } + + const result = await client + .query({ projectId: testProjectId }) + .execute({ queryBody: trendsQuery }) + + expect(result.success).toBe(true) + + if (result.success) { + expect(result.data).toHaveProperty('results') + expect(Array.isArray(result.data.results)).toBe(true) + } + }) + }) + + describe('Users API', () => { + it('should get current user', async () => { + const result = await client.users().me() + + expect(result.success).toBe(true) + + if (result.success) { + expect(result.data).toHaveProperty('distinct_id') + expect(typeof result.data.distinct_id).toBe('string') + } + }) + }) + + describe('Experiments API', () => { + // Helper function to create a test experiment + const createTestExperiment = async ( + options: { + name?: string + description?: string + featureFlagKey?: string + type?: 'product' | 'web' + draft?: boolean + metrics?: Array<{ + name?: string + metric_type: 'mean' | 'funnel' | 'ratio' + event_name?: string + funnel_steps?: string[] + properties?: Record + description?: string + }> + } = {} + ) => { + const timestamp = Date.now() + const createResult = await client.experiments({ projectId: testProjectId }).create({ + name: options.name || `Test Experiment ${timestamp}`, + description: options.description || 'Integration test experiment', + feature_flag_key: options.featureFlagKey || `test-exp-${timestamp}`, + type: options.type || 'product', + primary_metrics: options.metrics + ? options.metrics.map((metric) => ({ + name: metric.name || 'Test Metric', + metric_type: metric.metric_type, + event_name: metric.event_name || '$pageview', + funnel_steps: metric.funnel_steps, + properties: metric.properties || {}, + description: metric.description, + })) + : undefined, + variants: [ + { key: 'control', name: 'Control', rollout_percentage: 50 }, + { key: 'test', name: 'Test', rollout_percentage: 50 }, + ], + minimum_detectable_effect: 5, + filter_test_accounts: true, + draft: options.draft !== undefined ? options.draft : true, + }) + + expect(createResult.success).toBe(true) + + if (createResult.success) { + const experimentId = createResult.data.id + createdResources.experiments.push(experimentId) + return createResult.data + } + + throw new Error( + `Failed to create test experiment: ${(createResult as any).error?.message}` + ) + } + + it.skip('should list experiments', async () => { + const result = await client.experiments({ projectId: testProjectId }).list() + + if (!result.success) { + console.error('List experiments failed:', result.error?.message) + } + + expect(result.success).toBe(true) + + if (result.success) { + expect(Array.isArray(result.data)).toBe(true) + for (const experiment of result.data) { + expect(experiment).toHaveProperty('id') + expect(experiment).toHaveProperty('name') + expect(experiment).toHaveProperty('feature_flag_key') + expect(typeof experiment.id).toBe('number') + expect(typeof experiment.name).toBe('string') + expect(typeof experiment.feature_flag_key).toBe('string') + } + } + }) + + it('should create, get, update experiment', async () => { + // Create a test experiment + const experiment = await createTestExperiment({ + name: 'CRUD Test Experiment', + description: 'Test experiment for CRUD operations', + }) + + // Get the created experiment + const getResult = await client + .experiments({ projectId: testProjectId }) + .get({ experimentId: experiment.id }) + + expect(getResult.success).toBe(true) + + if (getResult.success) { + expect(getResult.data.id).toBe(experiment.id) + expect(getResult.data.name).toBe('CRUD Test Experiment') + expect(getResult.data.description).toBe('Test experiment for CRUD operations') + expect(getResult.data.start_date).toBeNull() // Should be draft + expect(getResult.data.archived).toBe(false) + } + + // Update the experiment + const updateResult = await client.experiments({ projectId: testProjectId }).update({ + experimentId: experiment.id, + updateData: { + name: 'Updated CRUD Test Experiment', + description: 'Updated description', + }, + }) + + expect(updateResult.success).toBe(true) + + if (updateResult.success) { + expect(updateResult.data.name).toBe('Updated CRUD Test Experiment') + expect(updateResult.data.description).toBe('Updated description') + } + + // Verify update persisted + const getUpdatedResult = await client + .experiments({ projectId: testProjectId }) + .get({ experimentId: experiment.id }) + + if (getUpdatedResult.success) { + expect(getUpdatedResult.data.name).toBe('Updated CRUD Test Experiment') + expect(getUpdatedResult.data.description).toBe('Updated description') + } + }) + + it('should create experiment with different metric types', async () => { + // Test mean metric + const meanExperiment = await createTestExperiment({ + name: 'Mean Metric Test', + metrics: [ + { + name: 'Page Views', + metric_type: 'mean', + event_name: '$pageview', + description: 'Average page views per user', + }, + ], + }) + + expect(meanExperiment.metrics).toHaveLength(1) + expect(meanExperiment.metrics?.[0]?.metric_type).toBe('mean') + + // Test funnel metric + const funnelExperiment = await createTestExperiment({ + name: 'Funnel Metric Test', + featureFlagKey: `funnel-test-${Date.now()}`, + metrics: [ + { + name: 'Signup Funnel', + metric_type: 'funnel', + event_name: '$pageview', + funnel_steps: ['$pageview', 'sign_up_start', 'sign_up_complete'], + description: 'Signup conversion funnel', + }, + ], + }) + + expect(funnelExperiment.metrics).toHaveLength(1) + expect(funnelExperiment.metrics?.[0]?.metric_type).toBe('funnel') + + // Test ratio metric + const ratioExperiment = await createTestExperiment({ + name: 'Ratio Metric Test', + featureFlagKey: `ratio-test-${Date.now()}`, + metrics: [ + { + name: 'Click-through Rate', + metric_type: 'ratio', + event_name: 'button_click', + description: 'Button click rate', + }, + ], + }) + + expect(ratioExperiment.metrics).toHaveLength(1) + expect(ratioExperiment.metrics?.[0]?.metric_type).toBe('ratio') + }) + + it('should handle experiment lifecycle - launch and archive', async () => { + const experiment = await createTestExperiment({ + name: 'Lifecycle Test Experiment', + draft: true, + }) + + // Initially should be draft + expect(experiment.start_date).toBeNull() + expect(experiment.archived).toBe(false) + + // Launch experiment + const launchResult = await client.experiments({ projectId: testProjectId }).update({ + experimentId: experiment.id, + updateData: { + start_date: new Date().toISOString(), + }, + }) + + expect(launchResult.success).toBe(true) + + if (launchResult.success) { + expect(launchResult.data.start_date).not.toBeNull() + } + + // Archive experiment + const archiveResult = await client.experiments({ projectId: testProjectId }).update({ + experimentId: experiment.id, + updateData: { + archived: true, + }, + }) + + expect(archiveResult.success).toBe(true) + + if (archiveResult.success) { + expect(archiveResult.data.archived).toBe(true) + } + }) + + it.skip('should get experiment exposures for launched experiment', async () => { + // Create and launch experiment + const experiment = await createTestExperiment({ + name: 'Exposure Test Experiment', + draft: false, // Create as launched + }) + + // Launch the experiment + await client.experiments({ projectId: testProjectId }).update({ + experimentId: experiment.id, + updateData: { + start_date: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(), // 1 day ago + }, + }) + + // Try to get exposures (may not have data immediately) + const exposureResult = await client + .experiments({ projectId: testProjectId }) + .getExposures({ + experimentId: experiment.id, + refresh: true, + }) + + // Should succeed even if no exposure data yet + expect(exposureResult.success).toBe(true) + + if (exposureResult.success) { + expect(exposureResult.data).toHaveProperty('exposures') + expect(exposureResult.data.exposures).toBeDefined() + } + }) + + it('should fail to get exposures for draft experiment', async () => { + const experiment = await createTestExperiment({ + name: 'Draft Exposure Test', + draft: true, + }) + + const exposureResult = await client + .experiments({ projectId: testProjectId }) + .getExposures({ + experimentId: experiment.id, + refresh: false, + }) + + expect(exposureResult.success).toBe(false) + expect((exposureResult as any).error.message).toContain('has not started yet') + }) + + it.skip('should get experiment metric results for launched experiment', async () => { + // Create and launch experiment + const experiment = await createTestExperiment({ + name: 'Metric Results Test', + draft: false, + }) + + // Launch the experiment + await client.experiments({ projectId: testProjectId }).update({ + experimentId: experiment.id, + updateData: { + start_date: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(), + }, + }) + + // Try to get metric results + const metricsResult = await client + .experiments({ projectId: testProjectId }) + .getMetricResults({ + experimentId: experiment.id, + refresh: true, + }) + + expect(metricsResult.success).toBe(true) + + if (metricsResult.success) { + expect(metricsResult.data).toHaveProperty('experiment') + expect(metricsResult.data).toHaveProperty('primaryMetricsResults') + expect(metricsResult.data).toHaveProperty('secondaryMetricsResults') + expect(metricsResult.data).toHaveProperty('exposures') + expect(metricsResult.data.experiment.id).toBe(experiment.id) + } + }) + + it('should fail to get metric results for draft experiment', async () => { + const experiment = await createTestExperiment({ + name: 'Draft Metrics Test', + draft: true, + }) + + const metricsResult = await client + .experiments({ projectId: testProjectId }) + .getMetricResults({ + experimentId: experiment.id, + refresh: false, + }) + + expect(metricsResult.success).toBe(false) + expect((metricsResult as any).error.message).toContain('has not started yet') + }) + + it('should handle invalid experiment ID', async () => { + const nonExistentId = 999999 + + const getResult = await client + .experiments({ projectId: testProjectId }) + .get({ experimentId: nonExistentId }) + + expect(getResult.success).toBe(false) + }) + + it('should create experiment with custom variants', async () => { + const experiment = await createTestExperiment({ + name: 'Custom Variants Test', + }) + + // Verify default variants were created + expect(experiment.parameters?.feature_flag_variants).toHaveLength(2) + + // Update with custom variants + const updateResult = await client.experiments({ projectId: testProjectId }).update({ + experimentId: experiment.id, + updateData: { + parameters: { + feature_flag_variants: [ + { key: 'control', rollout_percentage: 25 }, + { key: 'variant_a', rollout_percentage: 25 }, + { key: 'variant_b', rollout_percentage: 25 }, + { key: 'variant_c', rollout_percentage: 25 }, + ], + }, + }, + }) + + expect(updateResult.success).toBe(true) + + if (updateResult.success) { + expect(updateResult.data.parameters?.feature_flag_variants).toHaveLength(4) + const variants = updateResult.data.parameters?.feature_flag_variants || [] + expect(variants.map((v) => v.key)).toEqual([ + 'control', + 'variant_a', + 'variant_b', + 'variant_c', + ]) + } + }) + + it('should delete experiment successfully', async () => { + // Create a test experiment to delete + const experiment = await createTestExperiment({ + name: 'Delete Test Experiment', + description: 'Test experiment for delete operations', + }) + + // Verify experiment exists before deletion + const getBeforeDelete = await client + .experiments({ projectId: testProjectId }) + .get({ experimentId: experiment.id }) + + expect(getBeforeDelete.success).toBe(true) + + if (getBeforeDelete.success) { + expect(getBeforeDelete.data.id).toBe(experiment.id) + expect(getBeforeDelete.data.name).toBe('Delete Test Experiment') + } + + // Delete the experiment + const deleteResult = await client + .experiments({ projectId: testProjectId }) + .delete({ experimentId: experiment.id }) + + expect(deleteResult.success).toBe(true) + if (deleteResult.success) { + expect(deleteResult.data.success).toBe(true) + expect(deleteResult.data.message).toContain('successfully') + } + + // Verify experiment is soft deleted (should return 404 or be marked as deleted) + const getAfterDelete = await client + .experiments({ projectId: testProjectId }) + .get({ experimentId: experiment.id }) + + // After soft delete, the API should return an error (404) or the experiment should be marked as deleted + expect(getAfterDelete.success).toBe(false) + }) + + it('should handle deleting non-existent experiment', async () => { + const nonExistentId = 999999999 + + const deleteResult = await client + .experiments({ projectId: testProjectId }) + .delete({ experimentId: nonExistentId }) + + // Should handle gracefully (either success with no-op or specific error) + // The exact behavior depends on the API implementation + expect(typeof deleteResult.success).toBe('boolean') + }) + + it('should complete full CRUD workflow including delete', async () => { + const timestamp = Date.now() + + // CREATE + const createResult = await client.experiments({ projectId: testProjectId }).create({ + name: `Full CRUD Test ${timestamp}`, + description: 'Complete CRUD workflow test', + feature_flag_key: `full-crud-${timestamp}`, + type: 'product', + primary_metrics: [ + { + name: 'Test Conversion Rate', + metric_type: 'funnel' as const, + event_name: 'landing', + funnel_steps: ['landing', 'signup', 'activation'], + properties: {}, + }, + ], + variants: [ + { key: 'control', name: 'Control', rollout_percentage: 50 }, + { key: 'variant', name: 'Variant', rollout_percentage: 50 }, + ], + minimum_detectable_effect: 10, + filter_test_accounts: true, + draft: true, + }) + + expect(createResult.success).toBe(true) + + if (!createResult.success) { + throw new Error('Failed to create experiment for CRUD test') + } + + const experimentId = createResult.data.id + createdResources.experiments.push(experimentId) + + // READ + const getResult = await client + .experiments({ projectId: testProjectId }) + .get({ experimentId }) + + expect(getResult.success).toBe(true) + + if (getResult.success) { + expect(getResult.data.id).toBe(experimentId) + expect(getResult.data.name).toBe(`Full CRUD Test ${timestamp}`) + expect(getResult.data.description).toBe('Complete CRUD workflow test') + } + + // UPDATE + const updateResult = await client.experiments({ projectId: testProjectId }).update({ + experimentId, + updateData: { + name: `Updated Full CRUD Test ${timestamp}`, + description: 'Updated description for CRUD test', + }, + }) + + expect(updateResult.success).toBe(true) + + if (updateResult.success) { + expect(updateResult.data.name).toBe(`Updated Full CRUD Test ${timestamp}`) + expect(updateResult.data.description).toBe('Updated description for CRUD test') + } + + // DELETE + const deleteResult = await client + .experiments({ projectId: testProjectId }) + .delete({ experimentId }) + + expect(deleteResult.success).toBe(true) + if (deleteResult.success) { + expect(deleteResult.data.success).toBe(true) + expect(deleteResult.data.message).toContain('successfully') + } + + // Verify deletion worked + const getAfterDeleteResult = await client + .experiments({ projectId: testProjectId }) + .get({ experimentId }) + + expect(getAfterDeleteResult.success).toBe(false) + + // Remove from cleanup array since we already deleted it + const index = createdResources.experiments.indexOf(experimentId) + if (index > -1) { + createdResources.experiments.splice(index, 1) + } + }) + + it('should handle delete operations idempotently', async () => { + // Create experiment + const experiment = await createTestExperiment({ + name: 'Idempotent Delete Test', + }) + + // First delete should succeed + const firstDeleteResult = await client + .experiments({ projectId: testProjectId }) + .delete({ experimentId: experiment.id }) + + expect(firstDeleteResult.success).toBe(true) + if (firstDeleteResult.success) { + expect(firstDeleteResult.data.success).toBe(true) + expect(firstDeleteResult.data.message).toContain('successfully') + } + + // Second delete should handle gracefully (idempotent) + const secondDeleteResult = await client + .experiments({ projectId: testProjectId }) + .delete({ experimentId: experiment.id }) + + // Should not throw error, either success or specific "already deleted" error + expect(typeof secondDeleteResult.success).toBe('boolean') + + // Remove from cleanup array since we already deleted it + const index = createdResources.experiments.indexOf(experiment.id) + if (index > -1) { + createdResources.experiments.splice(index, 1) + } + }) + }) +}) diff --git a/products/mcp/typescript/tests/integration/feature-routing.test.ts b/products/mcp/typescript/tests/integration/feature-routing.test.ts new file mode 100644 index 0000000000..83b7cab727 --- /dev/null +++ b/products/mcp/typescript/tests/integration/feature-routing.test.ts @@ -0,0 +1,69 @@ +import { SessionManager } from '@/lib/utils/SessionManager' +import { getToolsFromContext } from '@/tools' +import type { Context } from '@/tools/types' +import { describe, expect, it } from 'vitest' + +const createMockContext = (): Context => ({ + api: {} as any, + cache: {} as any, + env: { INKEEP_API_KEY: undefined }, + stateManager: { + getApiKey: async () => ({ scopes: ['*'] }), + } as any, + sessionManager: new SessionManager({} as any), +}) + +describe('Feature Routing Integration', () => { + const integrationTests = [ + { + features: undefined, + description: 'all tools when no features specified', + expectedTools: [ + 'feature-flag-get-definition', + 'dashboard-create', + 'insights-get-all', + 'organizations-get', + 'list-errors', + ], + }, + { + features: ['dashboards'], + description: 'only dashboard tools', + expectedTools: [ + 'dashboard-create', + 'dashboards-get-all', + 'dashboard-get', + 'dashboard-update', + 'dashboard-delete', + 'add-insight-to-dashboard', + ], + }, + { + features: ['flags', 'workspace'], + description: 'tools from multiple features', + expectedTools: [ + 'feature-flag-get-definition', + 'create-feature-flag', + 'feature-flag-get-all', + 'organizations-get', + 'switch-organization', + 'projects-get', + ], + }, + { + features: ['invalid', 'flags', 'unknown'], + description: 'valid tools ignoring invalid features', + expectedTools: ['feature-flag-get-definition', 'create-feature-flag'], + }, + ] + + it.each(integrationTests)('should return $description', async ({ features, expectedTools }) => { + const context = createMockContext() + const tools = await getToolsFromContext(context, features) + const toolNames = tools.map((t) => t.name) + + for (const tool of expectedTools) { + expect(toolNames).toContain(tool) + } + }) +}) diff --git a/products/mcp/typescript/tests/setup.ts b/products/mcp/typescript/tests/setup.ts new file mode 100644 index 0000000000..e09a2ff936 --- /dev/null +++ b/products/mcp/typescript/tests/setup.ts @@ -0,0 +1,13 @@ +import { config } from 'dotenv' +import { resolve } from 'node:path' +import { vi } from 'vitest' + +// Load .env.test file +config({ path: resolve(process.cwd(), '.env.test') }) + +// Mock cloudflare:workers module for Node.js test environment +vi.mock('cloudflare:workers', () => ({ + env: { + POSTHOG_BASE_URL: undefined, // Use default from constants + }, +})) diff --git a/products/mcp/typescript/tests/shared/test-utils.ts b/products/mcp/typescript/tests/shared/test-utils.ts new file mode 100644 index 0000000000..fec1c59295 --- /dev/null +++ b/products/mcp/typescript/tests/shared/test-utils.ts @@ -0,0 +1,477 @@ +import { ApiClient } from '@/api/client' +import { SessionManager } from '@/lib/utils/SessionManager' +import { StateManager } from '@/lib/utils/StateManager' +import { MemoryCache } from '@/lib/utils/cache/MemoryCache' +import type { InsightQuery } from '@/schema/query' +import type { Context } from '@/tools/types' +import { expect } from 'vitest' + +export const API_BASE_URL = process.env.TEST_POSTHOG_API_BASE_URL || 'http://localhost:8010' +export const API_TOKEN = process.env.TEST_POSTHOG_PERSONAL_API_KEY +export const TEST_ORG_ID = process.env.TEST_ORG_ID +export const TEST_PROJECT_ID = process.env.TEST_PROJECT_ID + +export interface CreatedResources { + featureFlags: number[] + insights: number[] + dashboards: number[] + surveys: string[] +} + +export function validateEnvironmentVariables() { + if (!API_TOKEN) { + throw new Error('TEST_POSTHOG_PERSONAL_API_KEY environment variable is required') + } + + if (!TEST_ORG_ID) { + throw new Error('TEST_ORG_ID environment variable is required') + } + + if (!TEST_PROJECT_ID) { + throw new Error('TEST_PROJECT_ID environment variable is required') + } +} + +export function createTestClient(): ApiClient { + return new ApiClient({ + apiToken: API_TOKEN!, + baseUrl: API_BASE_URL, + }) +} + +export function createTestContext(client: ApiClient): Context { + const cache = new MemoryCache('test-user') + const stateManager = new StateManager(cache, client) + + const context: Context = { + api: client, + cache, + env: {} as any, + stateManager, + sessionManager: new SessionManager(cache), + } + + return context +} + +export async function setActiveProjectAndOrg(context: Context, projectId: string, orgId: string) { + const cache = context.cache + await cache.set('projectId', projectId) + await cache.set('orgId', orgId) +} + +export async function cleanupResources( + client: ApiClient, + projectId: string, + resources: CreatedResources +) { + for (const flagId of resources.featureFlags) { + try { + await client.featureFlags({ projectId }).delete({ flagId }) + } catch (error) { + console.warn(`Failed to cleanup feature flag ${flagId}:`, error) + } + } + resources.featureFlags = [] + + for (const insightId of resources.insights) { + try { + await client.insights({ projectId }).delete({ insightId }) + } catch (error) { + console.warn(`Failed to cleanup insight ${insightId}:`, error) + } + } + resources.insights = [] + + for (const dashboardId of resources.dashboards) { + try { + await client.dashboards({ projectId }).delete({ dashboardId }) + } catch (error) { + console.warn(`Failed to cleanup dashboard ${dashboardId}:`, error) + } + } + resources.dashboards = [] + + for (const surveyId of resources.surveys) { + try { + await client.surveys({ projectId }).delete({ surveyId, softDelete: false }) + } catch (error) { + console.warn(`Failed to cleanup survey ${surveyId}:`, error) + } + } + resources.surveys = [] +} + +export function parseToolResponse(result: any) { + expect(result.content).toBeDefined() + expect(result.content[0].type).toBe('text') + return JSON.parse(result.content[0].text) +} + +export function generateUniqueKey(prefix: string): string { + return `${prefix}-${Date.now()}-${Math.random().toString(36).substring(7)}` +} + +type SampleHogQLQuery = 'pageviews' | 'topEvents' + +export const SAMPLE_HOGQL_QUERIES: Record = { + pageviews: { + kind: 'DataVisualizationNode', + source: { + kind: 'HogQLQuery', + query: "SELECT event, count() AS event_count FROM events WHERE timestamp >= now() - INTERVAL 7 DAY AND event = '$pageview' GROUP BY event ORDER BY event_count DESC LIMIT 10", + filters: { + dateRange: { + date_from: '-7d', + date_to: '-1d', + }, + }, + }, + }, + topEvents: { + kind: 'DataVisualizationNode', + source: { + kind: 'HogQLQuery', + query: 'SELECT event, count() AS event_count FROM events WHERE timestamp >= now() - INTERVAL 7 DAY GROUP BY event ORDER BY event_count DESC LIMIT 10', + filters: { + dateRange: { + date_from: '-7d', + date_to: '-1d', + }, + }, + }, + }, +} + +type SampleTrendQuery = + | 'basicPageviews' + | 'uniqueUsers' + | 'multipleEvents' + | 'withBreakdown' + | 'withPropertyFilter' + +export const SAMPLE_TREND_QUERIES: Record = { + basicPageviews: { + kind: 'InsightVizNode', + source: { + kind: 'TrendsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + custom_name: 'Page Views', + math: 'total', + }, + ], + dateRange: { + date_from: '-7d', + date_to: null, + }, + interval: 'day', + properties: [], + filterTestAccounts: false, + }, + }, + uniqueUsers: { + kind: 'InsightVizNode', + source: { + kind: 'TrendsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + custom_name: 'Unique Users', + math: 'dau', + }, + ], + dateRange: { + date_from: '-30d', + date_to: null, + }, + interval: 'day', + properties: [], + filterTestAccounts: true, + }, + }, + multipleEvents: { + kind: 'InsightVizNode', + source: { + kind: 'TrendsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + custom_name: 'Page Views', + math: 'total', + }, + { + kind: 'EventsNode', + event: 'button_clicked', + custom_name: 'Button Clicks', + math: 'total', + }, + ], + dateRange: { + date_from: '-14d', + date_to: null, + }, + interval: 'day', + properties: [], + filterTestAccounts: false, + }, + }, + withBreakdown: { + kind: 'InsightVizNode', + source: { + kind: 'TrendsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + custom_name: 'Page Views by Browser', + math: 'total', + }, + ], + breakdownFilter: { + breakdown_type: 'event', + breakdown: '$browser', + breakdown_limit: 10, + }, + dateRange: { + date_from: '-7d', + date_to: null, + }, + interval: 'day', + properties: [], + filterTestAccounts: false, + }, + }, + withPropertyFilter: { + kind: 'InsightVizNode', + source: { + kind: 'TrendsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + custom_name: 'Chrome/Safari Page Views', + math: 'total', + properties: [ + { + key: '$browser', + value: ['Chrome', 'Safari'], + operator: 'exact', + type: 'event', + }, + ], + }, + ], + dateRange: { + date_from: '-7d', + date_to: null, + }, + interval: 'day', + properties: [], + filterTestAccounts: false, + }, + }, +} + +type SampleFunnelQuery = + | 'basicFunnel' + | 'strictOrderFunnel' + | 'funnelWithBreakdown' + | 'conversionWindow' + | 'onboardingFunnel' + +export const SAMPLE_FUNNEL_QUERIES: Record = { + basicFunnel: { + kind: 'InsightVizNode', + source: { + kind: 'FunnelsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + custom_name: 'Page View', + }, + { + kind: 'EventsNode', + event: 'button_clicked', + custom_name: 'Button Clicked', + }, + ], + dateRange: { + date_from: '-7d', + date_to: null, + }, + properties: [], + filterTestAccounts: false, + }, + }, + strictOrderFunnel: { + kind: 'InsightVizNode', + source: { + kind: 'FunnelsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + custom_name: 'Landing Page View', + }, + { + kind: 'EventsNode', + event: 'sign_up_started', + custom_name: 'Sign Up Started', + }, + { + kind: 'EventsNode', + event: 'sign_up_completed', + custom_name: 'Sign Up Completed', + }, + ], + funnelsFilter: { + layout: 'vertical', + breakdownAttributionType: 'first_touch', + funnelOrderType: 'strict', + funnelVizType: 'steps', + funnelWindowInterval: 7, + funnelWindowIntervalUnit: 'day', + funnelStepReference: 'total', + }, + dateRange: { + date_from: '-30d', + date_to: null, + }, + properties: [], + filterTestAccounts: false, + }, + }, + funnelWithBreakdown: { + kind: 'InsightVizNode', + source: { + kind: 'FunnelsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + custom_name: 'Product Page View', + }, + { + kind: 'EventsNode', + event: 'purchase', + custom_name: 'Purchase', + }, + ], + breakdownFilter: { + breakdown_type: 'event', + breakdown: '$browser', + breakdown_limit: 5, + }, + funnelsFilter: { + layout: 'vertical', + breakdownAttributionType: 'first_touch', + funnelOrderType: 'ordered', + funnelVizType: 'steps', + funnelWindowInterval: 14, + funnelWindowIntervalUnit: 'day', + funnelStepReference: 'total', + }, + dateRange: { + date_from: '-14d', + date_to: null, + }, + properties: [], + filterTestAccounts: false, + }, + }, + conversionWindow: { + kind: 'InsightVizNode', + source: { + kind: 'FunnelsQuery', + series: [ + { + kind: 'EventsNode', + event: '$pageview', + custom_name: 'Page View', + }, + { + kind: 'EventsNode', + event: 'add_to_cart', + custom_name: 'Add to Cart', + }, + { + kind: 'EventsNode', + event: 'purchase', + custom_name: 'Purchase', + }, + ], + funnelsFilter: { + layout: 'vertical', + breakdownAttributionType: 'first_touch', + funnelOrderType: 'ordered', + funnelVizType: 'steps', + funnelWindowInterval: 1, + funnelWindowIntervalUnit: 'hour', + funnelStepReference: 'total', + }, + dateRange: { + date_from: '-7d', + date_to: null, + }, + properties: [], + filterTestAccounts: false, + }, + }, + onboardingFunnel: { + kind: 'InsightVizNode', + source: { + kind: 'FunnelsQuery', + series: [ + { + kind: 'EventsNode', + event: 'Signed In', + custom_name: 'User Signs In', + }, + { + kind: 'EventsNode', + event: '$pageview', + properties: [ + { + key: '$pathname', + type: 'event', + value: 'get-started', + operator: 'icontains', + }, + ], + custom_name: 'Views Get-Started Page', + }, + { + kind: 'EventsNode', + event: 'Integration Connected', + custom_name: 'Connects Integration', + }, + { + kind: 'EventsNode', + event: 'Onboarding Completed', + custom_name: 'Completes Onboarding', + }, + ], + dateRange: { + date_to: 'today', + date_from: '-30d', + }, + funnelsFilter: { + layout: 'vertical', + breakdownAttributionType: 'first_touch', + funnelOrderType: 'ordered', + funnelVizType: 'steps', + funnelWindowInterval: 24, + funnelWindowIntervalUnit: 'hour', + funnelStepReference: 'total', + }, + properties: [], + filterTestAccounts: true, + }, + }, +} diff --git a/products/mcp/typescript/tests/tools/dashboards.integration.test.ts b/products/mcp/typescript/tests/tools/dashboards.integration.test.ts new file mode 100644 index 0000000000..f346687aa9 --- /dev/null +++ b/products/mcp/typescript/tests/tools/dashboards.integration.test.ts @@ -0,0 +1,224 @@ +import { describe, it, expect, beforeAll, afterEach } from 'vitest' +import { + validateEnvironmentVariables, + createTestClient, + createTestContext, + setActiveProjectAndOrg, + cleanupResources, + parseToolResponse, + generateUniqueKey, + TEST_PROJECT_ID, + TEST_ORG_ID, + type CreatedResources, +} from '@/shared/test-utils' +import createDashboardTool from '@/tools/dashboards/create' +import updateDashboardTool from '@/tools/dashboards/update' +import deleteDashboardTool from '@/tools/dashboards/delete' +import getAllDashboardsTool from '@/tools/dashboards/getAll' +import getDashboardTool from '@/tools/dashboards/get' +import type { Context } from '@/tools/types' + +describe('Dashboards', { concurrent: false }, () => { + let context: Context + const createdResources: CreatedResources = { + featureFlags: [], + insights: [], + dashboards: [], + surveys: [], + } + + beforeAll(async () => { + validateEnvironmentVariables() + const client = createTestClient() + context = createTestContext(client) + await setActiveProjectAndOrg(context, TEST_PROJECT_ID!, TEST_ORG_ID!) + }) + + afterEach(async () => { + await cleanupResources(context.api, TEST_PROJECT_ID!, createdResources) + }) + + describe('create-dashboard tool', () => { + const createTool = createDashboardTool() + + it('should create a dashboard with minimal fields', async () => { + const params = { + data: { + name: generateUniqueKey('Test Dashboard'), + description: 'Integration test dashboard', + pinned: false, + }, + } + + const result = await createTool.handler(context, params) + const dashboardData = parseToolResponse(result) + + expect(dashboardData.id).toBeDefined() + expect(dashboardData.name).toBe(params.data.name) + expect(dashboardData.url).toContain('/dashboard/') + + createdResources.dashboards.push(dashboardData.id) + }) + + it('should create a dashboard with tags', async () => { + const params = { + data: { + name: generateUniqueKey('Tagged Dashboard'), + description: 'Dashboard with tags', + tags: ['test', 'integration'], + pinned: false, + }, + } + + const result = await createTool.handler(context, params) + const dashboardData = parseToolResponse(result) + + expect(dashboardData.id).toBeDefined() + expect(dashboardData.name).toBe(params.data.name) + + createdResources.dashboards.push(dashboardData.id) + }) + }) + + describe('update-dashboard tool', () => { + const createTool = createDashboardTool() + const updateTool = updateDashboardTool() + + it('should update dashboard name and description', async () => { + const createParams = { + data: { + name: generateUniqueKey('Original Dashboard'), + description: 'Original description', + pinned: false, + }, + } + + const createResult = await createTool.handler(context, createParams) + const createdDashboard = parseToolResponse(createResult) + createdResources.dashboards.push(createdDashboard.id) + + const updateParams = { + dashboardId: createdDashboard.id, + data: { + name: 'Updated Dashboard Name', + description: 'Updated description', + }, + } + + const updateResult = await updateTool.handler(context, updateParams) + const updatedDashboard = parseToolResponse(updateResult) + + expect(updatedDashboard.id).toBe(createdDashboard.id) + expect(updatedDashboard.name).toBe(updateParams.data.name) + }) + }) + + describe('get-all-dashboards tool', () => { + const getAllTool = getAllDashboardsTool() + + it('should return dashboards with proper structure', async () => { + const result = await getAllTool.handler(context, {}) + const dashboards = parseToolResponse(result) + + expect(Array.isArray(dashboards)).toBe(true) + if (dashboards.length > 0) { + const dashboard = dashboards[0] + expect(dashboard).toHaveProperty('id') + expect(dashboard).toHaveProperty('name') + } + }) + }) + + describe('get-dashboard tool', () => { + const createTool = createDashboardTool() + const getTool = getDashboardTool() + + it('should get a specific dashboard by ID', async () => { + const createParams = { + data: { + name: generateUniqueKey('Get Test Dashboard'), + description: 'Test dashboard for get operation', + pinned: false, + }, + } + + const createResult = await createTool.handler(context, createParams) + const createdDashboard = parseToolResponse(createResult) + createdResources.dashboards.push(createdDashboard.id) + + const result = await getTool.handler(context, { dashboardId: createdDashboard.id }) + const retrievedDashboard = parseToolResponse(result) + + expect(retrievedDashboard.id).toBe(createdDashboard.id) + expect(retrievedDashboard.name).toBe(createParams.data.name) + }) + }) + + describe('delete-dashboard tool', () => { + const createTool = createDashboardTool() + const deleteTool = deleteDashboardTool() + + it('should delete a dashboard', async () => { + const createParams = { + data: { + name: generateUniqueKey('Delete Test Dashboard'), + description: 'Test dashboard for deletion', + pinned: false, + }, + } + + const createResult = await createTool.handler(context, createParams) + const createdDashboard = parseToolResponse(createResult) + + const deleteResult = await deleteTool.handler(context, { + dashboardId: createdDashboard.id, + }) + const deleteResponse = parseToolResponse(deleteResult) + + expect(deleteResponse.success).toBe(true) + expect(deleteResponse.message).toContain('deleted successfully') + }) + }) + + describe('Dashboard workflow', () => { + it('should support full CRUD workflow', async () => { + const createTool = createDashboardTool() + const updateTool = updateDashboardTool() + const getTool = getDashboardTool() + const deleteTool = deleteDashboardTool() + + const createParams = { + data: { + name: generateUniqueKey('Workflow Test Dashboard'), + description: 'Testing full workflow', + pinned: false, + }, + } + + const createResult = await createTool.handler(context, createParams) + const createdDashboard = parseToolResponse(createResult) + + const getResult = await getTool.handler(context, { dashboardId: createdDashboard.id }) + const retrievedDashboard = parseToolResponse(getResult) + expect(retrievedDashboard.id).toBe(createdDashboard.id) + + const updateParams = { + dashboardId: createdDashboard.id, + data: { + name: 'Updated Workflow Dashboard', + description: 'Updated workflow description', + }, + } + + const updateResult = await updateTool.handler(context, updateParams) + const updatedDashboard = parseToolResponse(updateResult) + expect(updatedDashboard.name).toBe(updateParams.data.name) + + const deleteResult = await deleteTool.handler(context, { + dashboardId: createdDashboard.id, + }) + const deleteResponse = parseToolResponse(deleteResult) + expect(deleteResponse.success).toBe(true) + }) + }) +}) diff --git a/products/mcp/typescript/tests/tools/documentation.integration.test.ts b/products/mcp/typescript/tests/tools/documentation.integration.test.ts new file mode 100644 index 0000000000..52bd4ee200 --- /dev/null +++ b/products/mcp/typescript/tests/tools/documentation.integration.test.ts @@ -0,0 +1,93 @@ +import { describe, it, expect, beforeAll, afterEach } from 'vitest' +import { + validateEnvironmentVariables, + createTestClient, + createTestContext, + setActiveProjectAndOrg, + cleanupResources, + TEST_PROJECT_ID, + TEST_ORG_ID, + type CreatedResources, +} from '@/shared/test-utils' +import searchDocsTool from '@/tools/documentation/searchDocs' +import type { Context } from '@/tools/types' + +describe('Documentation', { concurrent: false }, () => { + let context: Context + const createdResources: CreatedResources = { + featureFlags: [], + insights: [], + dashboards: [], + surveys: [], + } + + beforeAll(async () => { + validateEnvironmentVariables() + const client = createTestClient() + context = createTestContext(client) + await setActiveProjectAndOrg(context, TEST_PROJECT_ID!, TEST_ORG_ID!) + }) + + afterEach(async () => { + await cleanupResources(context.api, TEST_PROJECT_ID!, createdResources) + }) + + describe('search-docs tool', () => { + const searchTool = searchDocsTool() + + it('should handle missing INKEEP_API_KEY', async () => { + const contextWithoutKey = { + ...context, + env: { ...context.env, INKEEP_API_KEY: undefined as any }, + } + + const result = await searchTool.handler(contextWithoutKey as Context, { + query: 'feature flags', + }) + + expect(result.content[0].text).toBe('Error: INKEEP_API_KEY is not configured.') + }) + + it.skip('should search documentation with valid query', async () => { + const result = await searchTool.handler(context, { + query: 'feature flags', + }) + + expect(result.content[0].type).toBe('text') + expect(result.content[0].text).toBeDefined() + expect(result.content[0].text.length).toBeGreaterThan(0) + }) + + it.skip('should search for analytics documentation', async () => { + const result = await searchTool.handler(context, { + query: 'analytics events tracking', + }) + + expect(result.content[0].type).toBe('text') + expect(result.content[0].text).toBeDefined() + expect(result.content[0].text.length).toBeGreaterThan(0) + }) + + it.skip('should handle empty query results', async () => { + const result = await searchTool.handler(context, { + query: 'zxcvbnmasdfghjklqwertyuiop123456789', + }) + + expect(result.content[0].type).toBe('text') + expect(result.content[0].text).toBeDefined() + }) + }) + + describe('Documentation search workflow', () => { + it('should validate query parameter is required', async () => { + const searchTool = searchDocsTool() + + try { + await searchTool.handler(context, { query: '' }) + expect.fail('Should have thrown validation error') + } catch (error) { + expect(error).toBeDefined() + } + }) + }) +}) diff --git a/products/mcp/typescript/tests/tools/errorTracking.integration.test.ts b/products/mcp/typescript/tests/tools/errorTracking.integration.test.ts new file mode 100644 index 0000000000..a2050b9152 --- /dev/null +++ b/products/mcp/typescript/tests/tools/errorTracking.integration.test.ts @@ -0,0 +1,142 @@ +import { describe, it, expect, beforeAll, afterEach } from 'vitest' +import { + validateEnvironmentVariables, + createTestClient, + createTestContext, + setActiveProjectAndOrg, + cleanupResources, + TEST_PROJECT_ID, + TEST_ORG_ID, + type CreatedResources, + parseToolResponse, +} from '@/shared/test-utils' +import listErrorsTool from '@/tools/errorTracking/listErrors' +import errorDetailsTool from '@/tools/errorTracking/errorDetails' +import type { Context } from '@/tools/types' +import { OrderByErrors, OrderDirectionErrors, StatusErrors } from '@/schema/errors' + +describe('Error Tracking', { concurrent: false }, () => { + let context: Context + const createdResources: CreatedResources = { + featureFlags: [], + insights: [], + dashboards: [], + surveys: [], + } + + beforeAll(async () => { + validateEnvironmentVariables() + const client = createTestClient() + context = createTestContext(client) + await setActiveProjectAndOrg(context, TEST_PROJECT_ID!, TEST_ORG_ID!) + }) + + afterEach(async () => { + await cleanupResources(context.api, TEST_PROJECT_ID!, createdResources) + }) + + describe('list-errors tool', () => { + const listTool = listErrorsTool() + + it('should list errors with default parameters', async () => { + const result = await listTool.handler(context, {}) + const errorData = parseToolResponse(result) + + expect(Array.isArray(errorData)).toBe(true) + }) + + it('should list errors with custom date range', async () => { + const dateFrom = new Date(Date.now() - 14 * 24 * 60 * 60 * 1000).toISOString() + const dateTo = new Date().toISOString() + + const result = await listTool.handler(context, { + dateFrom, + dateTo, + orderBy: OrderByErrors.Occurrences, + orderDirection: OrderDirectionErrors.Descending, + }) + const errorData = parseToolResponse(result) + + expect(Array.isArray(errorData)).toBe(true) + }) + + it('should filter by status', async () => { + const result = await listTool.handler(context, { + status: StatusErrors.Active, + }) + const errorData = parseToolResponse(result) + + expect(Array.isArray(errorData)).toBe(true) + }) + + it('should handle empty results', async () => { + const result = await listTool.handler(context, { + dateFrom: new Date(Date.now() - 60000).toISOString(), + dateTo: new Date(Date.now() - 30000).toISOString(), + }) + const errorData = parseToolResponse(result) + + expect(Array.isArray(errorData)).toBe(true) + }) + }) + + describe('error-details tool', () => { + const detailsTool = errorDetailsTool() + + it('should get error details by issue ID', async () => { + const testIssueId = '00000000-0000-0000-0000-000000000000' + + const result = await detailsTool.handler(context, { + issueId: testIssueId, + }) + const errorDetails = parseToolResponse(result) + + expect(Array.isArray(errorDetails)).toBe(true) + }) + + it('should get error details with custom date range', async () => { + const testIssueId = '00000000-0000-0000-0000-000000000000' + const dateFrom = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString() + const dateTo = new Date().toISOString() + + const result = await detailsTool.handler(context, { + issueId: testIssueId, + dateFrom, + dateTo, + }) + const errorDetails = parseToolResponse(result) + + expect(Array.isArray(errorDetails)).toBe(true) + }) + }) + + describe('Error tracking workflow', () => { + it('should support listing errors and getting details workflow', async () => { + const listTool = listErrorsTool() + const detailsTool = errorDetailsTool() + + const listResult = await listTool.handler(context, {}) + const errorList = parseToolResponse(listResult) + + expect(Array.isArray(errorList)).toBe(true) + + if (errorList.length > 0 && errorList[0].issueId) { + const firstError = errorList[0] + const detailsResult = await detailsTool.handler(context, { + issueId: firstError.issueId, + }) + const errorDetails = parseToolResponse(detailsResult) + + expect(Array.isArray(errorDetails)).toBe(true) + } else { + const testIssueId = '00000000-0000-0000-0000-000000000000' + const detailsResult = await detailsTool.handler(context, { + issueId: testIssueId, + }) + const errorDetails = parseToolResponse(detailsResult) + + expect(Array.isArray(errorDetails)).toBe(true) + } + }) + }) +}) diff --git a/products/mcp/typescript/tests/tools/experiments.integration.test.ts b/products/mcp/typescript/tests/tools/experiments.integration.test.ts new file mode 100644 index 0000000000..b309efef0a --- /dev/null +++ b/products/mcp/typescript/tests/tools/experiments.integration.test.ts @@ -0,0 +1,1251 @@ +import { describe, it, expect, beforeAll, afterEach } from 'vitest' +import { + validateEnvironmentVariables, + createTestClient, + createTestContext, + setActiveProjectAndOrg, + cleanupResources, + TEST_PROJECT_ID, + TEST_ORG_ID, + type CreatedResources, + parseToolResponse, + generateUniqueKey, +} from '@/shared/test-utils' +import createExperimentTool from '@/tools/experiments/create' +import deleteExperimentTool from '@/tools/experiments/delete' +import getAllExperimentsTool from '@/tools/experiments/getAll' +import getExperimentTool from '@/tools/experiments/get' +import getExperimentResultsTool from '@/tools/experiments/getResults' +import updateExperimentTool from '@/tools/experiments/update' +import type { Context } from '@/tools/types' + +describe('Experiments', { concurrent: false }, () => { + let context: Context + const createdResources: CreatedResources = { + featureFlags: [], + insights: [], + dashboards: [], + surveys: [], + } + const createdExperiments: number[] = [] + + // Helper function to track created experiments and their feature flags + const trackExperiment = (experiment: any) => { + if (experiment.id) { + createdExperiments.push(experiment.id) + } + if (experiment.feature_flag?.id) { + createdResources.featureFlags.push(experiment.feature_flag.id) + } + } + + beforeAll(async () => { + validateEnvironmentVariables() + const client = createTestClient() + context = createTestContext(client) + await setActiveProjectAndOrg(context, TEST_PROJECT_ID!, TEST_ORG_ID!) + }) + + afterEach(async () => { + // Clean up experiments first + for (const experimentId of createdExperiments) { + try { + await context.api.experiments({ projectId: TEST_PROJECT_ID! }).delete({ + experimentId, + }) + } catch (error) { + console.warn(`Failed to cleanup experiment ${experimentId}:`, error) + } + } + createdExperiments.length = 0 + + // Clean up associated feature flags + await cleanupResources(context.api, TEST_PROJECT_ID!, createdResources) + }) + + describe('create-experiment tool', () => { + const createTool = createExperimentTool() + + it('should create a draft experiment with minimal required fields', async () => { + // Note: API auto-creates feature flag if it doesn't exist + const flagKey = generateUniqueKey('exp-flag') + + // Create experiment + const params = { + name: 'Minimal Test Experiment', + feature_flag_key: flagKey, + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + expect(experiment.name).toBe(params.name) + expect(experiment.feature_flag_key).toBe(params.feature_flag_key) + expect(experiment.start_date).toBeNull() // Draft experiments have no start date + expect(experiment.url).toContain('/experiments/') + + trackExperiment(experiment) + }) + + it('should create an experiment with description and type', async () => { + const flagKey = generateUniqueKey('exp-flag-desc') + + const params = { + name: 'Detailed Test Experiment', + description: 'This experiment tests the impact of button color on conversions', + feature_flag_key: flagKey, + type: 'web' as const, + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + expect(experiment.name).toBe(params.name) + expect(experiment.feature_flag_key).toBe(params.feature_flag_key) + + trackExperiment(experiment) + }) + + it('should create an experiment with custom variants', async () => { + const flagKey = generateUniqueKey('exp-flag-variants') + + const params = { + name: 'Variant Test Experiment', + feature_flag_key: flagKey, + variants: [ + { key: 'control', name: 'Control Group', rollout_percentage: 33 }, + { key: 'variant_a', name: 'Variant A', rollout_percentage: 33 }, + { key: 'variant_b', name: 'Variant B', rollout_percentage: 34 }, + ], + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + expect(experiment.parameters?.feature_flag_variants).toHaveLength(3) + expect(experiment.parameters?.feature_flag_variants?.[0]?.key).toBe('control') + expect(experiment.parameters?.feature_flag_variants?.[0]?.rollout_percentage).toBe(33) + + trackExperiment(experiment) + }) + + it('should create an experiment with mean metric', async () => { + const flagKey = generateUniqueKey('exp-flag-mean') + + const params = { + name: 'Mean Metric Experiment', + feature_flag_key: flagKey, + primary_metrics: [ + { + name: 'Average Page Load Time', + metric_type: 'mean' as const, + event_name: '$pageview', + properties: { page: '/checkout' }, + description: 'Measure average page load time for checkout page', + }, + ], + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + expect(experiment.metrics).toHaveLength(1) + + trackExperiment(experiment) + }) + + it('should create an experiment with funnel metric', async () => { + const flagKey = generateUniqueKey('exp-flag-funnel') + + const params = { + name: 'Funnel Metric Experiment', + feature_flag_key: flagKey, + primary_metrics: [ + { + name: 'Checkout Conversion Funnel', + metric_type: 'funnel' as const, + event_name: 'product_view', + funnel_steps: ['product_view', 'add_to_cart', 'checkout_start', 'purchase'], + description: 'Track conversion through checkout funnel', + }, + ], + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + expect(experiment.metrics).toHaveLength(1) + + trackExperiment(experiment) + }) + + it('should create an experiment with ratio metric', async () => { + const flagKey = generateUniqueKey('exp-flag-ratio') + + const params = { + name: 'Ratio Metric Experiment', + feature_flag_key: flagKey, + primary_metrics: [ + { + name: 'Button Click Rate', + metric_type: 'ratio' as const, + event_name: 'button_click', + description: 'Ratio of button clicks to page views', + }, + ], + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + expect(experiment.metrics).toHaveLength(1) + + trackExperiment(experiment) + }) + + it('should create an experiment with multiple metrics', async () => { + const flagKey = generateUniqueKey('exp-flag-multi') + + const params = { + name: 'Multi Metric Experiment', + feature_flag_key: flagKey, + primary_metrics: [ + { + name: 'Conversion Rate', + metric_type: 'funnel' as const, + event_name: 'visit', + funnel_steps: ['visit', 'signup', 'purchase'], + }, + { + name: 'Average Revenue', + metric_type: 'mean' as const, + event_name: 'purchase', + }, + ], + secondary_metrics: [ + { + name: 'Page Views', + metric_type: 'mean' as const, + event_name: '$pageview', + }, + { + name: 'Bounce Rate', + metric_type: 'ratio' as const, + event_name: 'bounce', + }, + ], + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + expect(experiment.metrics).toHaveLength(2) + expect(experiment.metrics_secondary).toHaveLength(2) + + trackExperiment(experiment) + }) + + it('should create an experiment with minimum detectable effect', async () => { + const flagKey = generateUniqueKey('exp-flag-mde') + + const params = { + name: 'MDE Test Experiment', + feature_flag_key: flagKey, + minimum_detectable_effect: 15, + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + + trackExperiment(experiment) + }) + + it('should create an experiment with filter test accounts enabled', async () => { + const flagKey = generateUniqueKey('exp-flag-filter') + + const params = { + name: 'Filter Test Accounts Experiment', + feature_flag_key: flagKey, + filter_test_accounts: true, + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + + trackExperiment(experiment) + }) + + it("should create experiment when feature flag doesn't exist (API creates it)", async () => { + // Note: The API might auto-create the feature flag if it doesn't exist + const params = { + name: 'Auto-Create Flag Experiment', + feature_flag_key: generateUniqueKey('auto-created-flag'), + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + trackExperiment(experiment) + }) + }) + + describe('get-all-experiments tool', () => { + const createTool = createExperimentTool() + const getAllTool = getAllExperimentsTool() + + it('should list all experiments', async () => { + // Create a few test experiments + const testExperiments = [] + for (let i = 0; i < 3; i++) { + const flagKey = generateUniqueKey(`exp-list-flag-${i}`) + + const params = { + name: `List Test Experiment ${i}`, + feature_flag_key: flagKey, + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + testExperiments.push(experiment) + trackExperiment(experiment) + } + + // Get all experiments + const result = await getAllTool.handler(context, {}) + const allExperiments = parseToolResponse(result) + + expect(Array.isArray(allExperiments)).toBe(true) + expect(allExperiments.length).toBeGreaterThanOrEqual(3) + + // Verify our test experiments are in the list + for (const testExp of testExperiments) { + const found = allExperiments.find((e: any) => e.id === testExp.id) + expect(found).toBeDefined() + } + }) + + it('should return experiments with proper structure', async () => { + const result = await getAllTool.handler(context, {}) + const experiments = parseToolResponse(result) + + if (experiments.length > 0) { + const experiment = experiments[0] + expect(experiment).toHaveProperty('id') + expect(experiment).toHaveProperty('name') + expect(experiment).toHaveProperty('feature_flag_key') + } + }) + }) + + describe('get-experiment tool', () => { + const createTool = createExperimentTool() + const getTool = getExperimentTool() + + it('should get experiment by ID', async () => { + // Create an experiment + const flagKey = generateUniqueKey('exp-get-flag') + + const createParams = { + name: 'Get Test Experiment', + description: 'Test experiment for get operation', + feature_flag_key: flagKey, + draft: true, + } + + const createResult = await createTool.handler(context, createParams as any) + const createdExperiment = parseToolResponse(createResult) + trackExperiment(createdExperiment) + + // Get the experiment + const result = await getTool.handler(context, { experimentId: createdExperiment.id }) + const retrievedExperiment = parseToolResponse(result) + + expect(retrievedExperiment.id).toBe(createdExperiment.id) + expect(retrievedExperiment.name).toBe(createParams.name) + expect(retrievedExperiment.feature_flag_key).toBe(createParams.feature_flag_key) + }) + + it('should handle non-existent experiment ID', async () => { + const nonExistentId = 999999 + + await expect( + getTool.handler(context, { experimentId: nonExistentId }) + ).rejects.toThrow() + }) + }) + + describe('get-experiment-results tool', () => { + const createTool = createExperimentTool() + const getResultsTool = getExperimentResultsTool() + + it('should fail for draft experiment (not started)', async () => { + // Create a draft experiment with metrics + const flagKey = generateUniqueKey('exp-metrics-flag') + + const createParams = { + name: 'Metrics Draft Experiment', + feature_flag_key: flagKey, + primary_metrics: [ + { + name: 'Test Metric', + metric_type: 'mean' as const, + event_name: '$pageview', + }, + ], + draft: true, + } + + const createResult = await createTool.handler(context, createParams as any) + const experiment = parseToolResponse(createResult) + trackExperiment(experiment) + + // Try to get metric results for draft experiment + await expect( + getResultsTool.handler(context, { + experimentId: experiment.id, + refresh: false, + }) + ).rejects.toThrow(/has not started yet/) + }) + + it('should handle refresh parameter', async () => { + // Create an experiment with metrics + const flagKey = generateUniqueKey('exp-metrics-refresh-flag') + + const createParams = { + name: 'Metrics Refresh Test Experiment', + feature_flag_key: flagKey, + primary_metrics: [ + { + name: 'Refresh Test Metric', + metric_type: 'mean' as const, + event_name: '$pageview', + }, + ], + secondary_metrics: [ + { + name: 'Secondary Refresh Metric', + metric_type: 'ratio' as const, + event_name: 'button_click', + }, + ], + draft: true, + } + + const createResult = await createTool.handler(context, createParams as any) + const experiment = parseToolResponse(createResult) + trackExperiment(experiment) + + // Test with refresh=true (will still fail for draft, but tests parameter handling) + await expect( + getResultsTool.handler(context, { + experimentId: experiment.id, + refresh: true, + }) + ).rejects.toThrow(/has not started yet/) + }) + }) + + describe('Complex experiment workflows', () => { + const createTool = createExperimentTool() + const getTool = getExperimentTool() + const getAllTool = getAllExperimentsTool() + + it('should support complete experiment creation and retrieval workflow', async () => { + // Create feature flag + const flagKey = generateUniqueKey('exp-workflow-flag') + + // Create comprehensive experiment + const createParams = { + name: 'Complete Workflow Experiment', + description: 'Testing complete experiment workflow with all features', + feature_flag_key: flagKey, + type: 'product' as const, + variants: [ + { key: 'control', name: 'Control', rollout_percentage: 50 }, + { key: 'test', name: 'Test Variant', rollout_percentage: 50 }, + ], + primary_metrics: [ + { + name: 'Conversion Funnel', + metric_type: 'funnel' as const, + event_name: 'landing', + funnel_steps: ['landing', 'signup', 'activation'], + description: 'Main conversion funnel', + }, + { + name: 'Revenue per User', + metric_type: 'mean' as const, + event_name: 'purchase', + description: 'Average revenue', + }, + ], + secondary_metrics: [ + { + name: 'Engagement Rate', + metric_type: 'ratio' as const, + event_name: 'engagement', + description: 'User engagement ratio', + }, + ], + minimum_detectable_effect: 20, + filter_test_accounts: true, + draft: true, + } + + const createResult = await createTool.handler(context, createParams as any) + const createdExperiment = parseToolResponse(createResult) + trackExperiment(createdExperiment) + + // Verify creation + expect(createdExperiment.id).toBeDefined() + expect(createdExperiment.name).toBe(createParams.name) + expect(createdExperiment.parameters?.feature_flag_variants).toHaveLength(2) + expect(createdExperiment.metrics).toHaveLength(2) + expect(createdExperiment.metrics_secondary).toHaveLength(1) + + // Get the experiment + const getResult = await getTool.handler(context, { + experimentId: createdExperiment.id, + }) + const retrievedExperiment = parseToolResponse(getResult) + expect(retrievedExperiment.id).toBe(createdExperiment.id) + + // Verify it appears in list + const listResult = await getAllTool.handler(context, {}) + const allExperiments = parseToolResponse(listResult) + const found = allExperiments.find((e: any) => e.id === createdExperiment.id) + expect(found).toBeDefined() + }) + + it('should create experiment with complex funnel metrics', async () => { + const flagKey = generateUniqueKey('exp-complex-funnel-flag') + + const params = { + name: 'Complex Funnel Experiment', + feature_flag_key: flagKey, + primary_metrics: [ + { + name: 'E-commerce Full Funnel', + metric_type: 'funnel' as const, + event_name: 'home_page_view', + funnel_steps: [ + 'home_page_view', + 'product_list_view', + 'product_detail_view', + 'add_to_cart', + 'checkout_start', + 'payment_info_entered', + 'order_completed', + ], + description: 'Complete e-commerce conversion funnel', + }, + ], + secondary_metrics: [ + { + name: 'Cart Abandonment Funnel', + metric_type: 'funnel' as const, + event_name: 'add_to_cart', + funnel_steps: ['add_to_cart', 'checkout_start', 'order_completed'], + description: 'Track where users drop off in checkout', + }, + ], + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + expect(experiment.metrics).toHaveLength(1) + expect(experiment.metrics_secondary).toHaveLength(1) + + trackExperiment(experiment) + }) + + it('should create experiment with target properties', async () => { + const flagKey = generateUniqueKey('exp-target-props-flag') + + const params = { + name: 'Targeted Experiment', + feature_flag_key: flagKey, + target_properties: { + country: 'US', + plan: 'premium', + cohort: 'early_adopters', + }, + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + + trackExperiment(experiment) + }) + + it('should create experiment without holdout group', async () => { + const flagKey = generateUniqueKey('exp-no-holdout-flag') + + const params = { + name: 'No Holdout Group Experiment', + feature_flag_key: flagKey, + // Not setting holdout_id (as it may not exist) + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + + trackExperiment(experiment) + }) + }) + + describe('Edge cases and error handling', () => { + const createTool = createExperimentTool() + const getTool = getExperimentTool() + const getResultsTool = getExperimentResultsTool() + + it('should handle creating experiment without metrics', async () => { + const flagKey = generateUniqueKey('exp-no-metrics-flag') + + const params = { + name: 'No Metrics Experiment', + feature_flag_key: flagKey, + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + expect(experiment.metrics || []).toHaveLength(0) + expect(experiment.metrics_secondary || []).toHaveLength(0) + + trackExperiment(experiment) + }) + + it('should handle invalid experiment ID in get operations', async () => { + const invalidId = 999999999 + + // Test get experiment + await expect(getTool.handler(context, { experimentId: invalidId })).rejects.toThrow() + + // Test get metric results + await expect( + getResultsTool.handler(context, { + experimentId: invalidId, + refresh: false, + }) + ).rejects.toThrow() + }) + + it('should handle variants with invalid rollout percentages', async () => { + const flagKey = generateUniqueKey('exp-invalid-rollout-flag') + + const params = { + name: 'Invalid Rollout Experiment', + feature_flag_key: flagKey, + variants: [ + { key: 'control', rollout_percentage: 60 }, + { key: 'test', rollout_percentage: 60 }, // Total > 100% + ], + draft: true, + } + + // This might succeed or fail depending on API validation + // Just ensure it doesn't crash the test suite + try { + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + trackExperiment(experiment) + } catch (error) { + // Expected for invalid configuration + expect(error).toBeDefined() + } + }) + + it('should handle metric with explicit event_name', async () => { + const flagKey = generateUniqueKey('exp-explicit-event-flag') + + const params = { + name: 'Explicit Event Name Experiment', + feature_flag_key: flagKey, + primary_metrics: [ + { + name: 'Default Event Metric', + metric_type: 'mean' as const, + event_name: '$pageview', // Explicit event_name since it's now required + }, + ], + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + expect(experiment.metrics).toHaveLength(1) + + trackExperiment(experiment) + }) + + it('should handle empty funnel steps array', async () => { + const flagKey = generateUniqueKey('exp-empty-funnel-flag') + + const params = { + name: 'Empty Funnel Steps Experiment', + feature_flag_key: flagKey, + primary_metrics: [ + { + name: 'Empty Funnel', + metric_type: 'funnel' as const, + funnel_steps: [], // Empty array + event_name: '$pageview', // Falls back to this + }, + ], + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.id).toBeDefined() + + trackExperiment(experiment) + }) + + it('should handle very long experiment names', async () => { + const flagKey = generateUniqueKey('exp-long-name-flag') + + const longName = 'A'.repeat(500) // Very long name + const params = { + name: longName, + feature_flag_key: flagKey, + draft: true, + } + + try { + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + expect(experiment.id).toBeDefined() + trackExperiment(experiment) + } catch (error) { + // Some APIs might reject very long names + expect(error).toBeDefined() + } + }) + }) + + describe('delete-experiment tool', () => { + const createTool = createExperimentTool() + const deleteTool = deleteExperimentTool() + + it('should delete an existing experiment', async () => { + // Create experiment first + const flagKey = generateUniqueKey('exp-delete-flag') + + const createParams = { + name: 'Experiment to Delete', + feature_flag_key: flagKey, + draft: true, + } + + const createResult = await createTool.handler(context, createParams as any) + const experiment = parseToolResponse(createResult) + expect(experiment.id).toBeDefined() + trackExperiment(experiment) + + // Delete the experiment + const deleteParams = { experimentId: experiment.id } + const deleteResult = await deleteTool.handler(context, deleteParams) + const deleteResponse = parseToolResponse(deleteResult) + + expect(deleteResponse.success).toBe(true) + expect(deleteResponse.message).toBe('Experiment deleted successfully') + + // Remove from tracking since we deleted it manually + const index = createdExperiments.indexOf(experiment.id) + if (index > -1) { + createdExperiments.splice(index, 1) + } + + // Clean up the feature flag that was auto-created + if (experiment.feature_flag?.id) { + createdResources.featureFlags.push(experiment.feature_flag.id) + } + }) + + it('should handle invalid experiment ID', async () => { + const invalidId = 999999 + + const deleteParams = { experimentId: invalidId } + + try { + await deleteTool.handler(context, deleteParams) + expect.fail('Should have thrown an error for invalid experiment ID') + } catch (error) { + expect(error).toBeDefined() + expect((error as Error).message).toContain('Failed to delete experiment') + } + }) + + it('should handle already deleted experiment gracefully', async () => { + // Create experiment first + const flagKey = generateUniqueKey('exp-already-deleted-flag') + + const createParams = { + name: 'Experiment Already Deleted', + feature_flag_key: flagKey, + draft: true, + } + + const createResult = await createTool.handler(context, createParams as any) + const experiment = parseToolResponse(createResult) + expect(experiment.id).toBeDefined() + trackExperiment(experiment) + + // Delete the experiment twice + const deleteParams = { experimentId: experiment.id } + + // First delete should succeed + const firstDeleteResult = await deleteTool.handler(context, deleteParams) + const firstDeleteResponse = parseToolResponse(firstDeleteResult) + expect(firstDeleteResponse.success).toBe(true) + + // Second delete should throw error (API returns 404 for already deleted) + try { + await deleteTool.handler(context, deleteParams) + expect.fail('Should have thrown an error for already deleted experiment') + } catch (error) { + expect(error).toBeDefined() + expect((error as Error).message).toContain('Failed to delete experiment') + expect((error as Error).message).toContain('404') + } + + // Remove from tracking since we deleted it manually + const index = createdExperiments.indexOf(experiment.id) + if (index > -1) { + createdExperiments.splice(index, 1) + } + + // Clean up the feature flag that was auto-created + if (experiment.feature_flag?.id) { + createdResources.featureFlags.push(experiment.feature_flag.id) + } + }) + + it('should validate required experimentId parameter', async () => { + try { + await deleteTool.handler(context, {} as any) + expect.fail('Should have thrown validation error for missing experimentId') + } catch (error) { + expect(error).toBeDefined() + } + }) + }) + + describe('update-experiment tool', () => { + const createTool = createExperimentTool() + const updateTool = updateExperimentTool() + + it('should update basic experiment fields', async () => { + // Create experiment first + const flagKey = generateUniqueKey('exp-update-basic-flag') + + const createParams = { + name: 'Original Name', + description: 'Original description', + feature_flag_key: flagKey, + draft: true, + } + + const createResult = await createTool.handler(context, createParams as any) + const experiment = parseToolResponse(createResult) + expect(experiment.id).toBeDefined() + trackExperiment(experiment) + + // Update basic fields + const updateParams = { + experimentId: experiment.id, + data: { + name: 'Updated Name', + description: 'Updated description with new hypothesis', + }, + } + + const updateResult = await updateTool.handler(context, updateParams) + const updatedExperiment = parseToolResponse(updateResult) + + expect(updatedExperiment.name).toBe('Updated Name') + expect(updatedExperiment.description).toBe('Updated description with new hypothesis') + expect(updatedExperiment.url).toContain('/experiments/') + expect(updatedExperiment.start_date).toBeNull() // Draft experiments have no start date + + trackExperiment(experiment) + }) + + it('should launch a draft experiment (draft → running)', async () => { + // Create draft experiment + const flagKey = generateUniqueKey('exp-launch-flag') + + const createParams = { + name: 'Launch Test Experiment', + feature_flag_key: flagKey, + draft: true, + } + + const createResult = await createTool.handler(context, createParams as any) + const experiment = parseToolResponse(createResult) + expect(experiment.start_date).toBeNull() // Draft experiments have no start date + trackExperiment(experiment) + + // Launch the experiment + const launchParams = { + experimentId: experiment.id, + data: { + launch: true, + }, + } + + const updateResult = await updateTool.handler(context, launchParams) + const launchedExperiment = parseToolResponse(updateResult) + + expect(launchedExperiment.start_date).toBeDefined() // Running experiments have start date + expect(launchedExperiment.end_date).toBeNull() // But no end date yet + + trackExperiment(experiment) + }) + + it('should stop a running experiment', async () => { + // Create and launch experiment + const flagKey = generateUniqueKey('exp-stop-flag') + + const createParams = { + name: 'Stop Test Experiment', + feature_flag_key: flagKey, + draft: false, // Create as launched + } + + const createResult = await createTool.handler(context, createParams as any) + const experiment = parseToolResponse(createResult) + trackExperiment(experiment) + + // Stop the experiment + const stopParams = { + experimentId: experiment.id, + data: { + end_date: new Date().toISOString(), + conclusion: 'stopped_early' as const, + conclusion_comment: 'Test completed successfully', + }, + } + + const updateResult = await updateTool.handler(context, stopParams) + const stoppedExperiment = parseToolResponse(updateResult) + + expect(stoppedExperiment.end_date).toBeDefined() + // Note: API may not set conclusion field automatically, it depends on the backend implementation + // The important thing is that end_date is set, indicating the experiment is stopped + + trackExperiment(experiment) + }) + + it('should restart a concluded experiment', async () => { + // Create and conclude experiment + const flagKey = generateUniqueKey('exp-restart-flag') + + const createParams = { + name: 'Restart Test Experiment', + feature_flag_key: flagKey, + draft: false, + } + + const createResult = await createTool.handler(context, createParams as any) + const experiment = parseToolResponse(createResult) + trackExperiment(experiment) + + // First stop it + const stopParams = { + experimentId: experiment.id, + data: { + end_date: new Date().toISOString(), + conclusion: 'inconclusive' as const, + conclusion_comment: 'Need more data', + }, + } + + await updateTool.handler(context, stopParams) + + // Now restart it (following restart workflow) + const restartParams = { + experimentId: experiment.id, + data: { + restart: true, + launch: true, + }, + } + + const restartResult = await updateTool.handler(context, restartParams) + const restartedExperiment = parseToolResponse(restartResult) + + expect(restartedExperiment.end_date).toBeNull() + expect(restartedExperiment.conclusion).toBeNull() + expect(restartedExperiment.conclusion_comment).toBeNull() + expect(restartedExperiment.start_date).toBeDefined() // Restarted experiments have start date + expect(restartedExperiment.end_date).toBeNull() // But no end date + + trackExperiment(experiment) + }) + + it('should restart experiment as draft', async () => { + // Create and conclude experiment + const flagKey = generateUniqueKey('exp-restart-draft-flag') + + const createParams = { + name: 'Restart as Draft Test', + feature_flag_key: flagKey, + draft: false, + } + + const createResult = await createTool.handler(context, createParams as any) + const experiment = parseToolResponse(createResult) + trackExperiment(experiment) + + // First conclude it + const concludeParams = { + experimentId: experiment.id, + data: { + conclude: 'won' as const, + }, + } + + await updateTool.handler(context, concludeParams) + + // Restart as draft (clear all completion fields including start_date) + const restartAsDraftParams = { + experimentId: experiment.id, + data: { + restart: true, + }, + } + + const restartResult = await updateTool.handler(context, restartAsDraftParams) + const restartedExperiment = parseToolResponse(restartResult) + + expect(restartedExperiment.end_date).toBeNull() + expect(restartedExperiment.conclusion).toBeNull() + expect(restartedExperiment.start_date).toBeNull() // Draft experiments have no start date + + trackExperiment(experiment) + }) + + it('should archive and unarchive experiment', async () => { + // Create experiment + const flagKey = generateUniqueKey('exp-archive-flag') + + const createParams = { + name: 'Archive Test Experiment', + feature_flag_key: flagKey, + draft: true, + } + + const createResult = await createTool.handler(context, createParams as any) + const experiment = parseToolResponse(createResult) + trackExperiment(experiment) + + // Archive the experiment + const archiveParams = { + experimentId: experiment.id, + data: { + archive: true, + }, + } + + const archiveResult = await updateTool.handler(context, archiveParams) + const archivedExperiment = parseToolResponse(archiveResult) + + expect(archivedExperiment.archived).toBe(true) + + // Unarchive the experiment + const unarchiveParams = { + experimentId: experiment.id, + data: { + archive: false, + }, + } + + const unarchiveResult = await updateTool.handler(context, unarchiveParams) + const unarchivedExperiment = parseToolResponse(unarchiveResult) + + expect(unarchivedExperiment.archived).toBe(false) + + trackExperiment(experiment) + }) + + it('should update experiment variants', async () => { + // Create experiment with default variants + const flagKey = generateUniqueKey('exp-variants-flag') + + const createParams = { + name: 'Variants Update Test', + feature_flag_key: flagKey, + draft: true, + variants: [ + { key: 'control', rollout_percentage: 50 }, + { key: 'test', rollout_percentage: 50 }, + ], + } + + const createResult = await createTool.handler(context, createParams as any) + const experiment = parseToolResponse(createResult) + trackExperiment(experiment) + + // Update minimum detectable effect + const updateParamsParams = { + experimentId: experiment.id, + data: { + minimum_detectable_effect: 25, + }, + } + + const updateResult = await updateTool.handler(context, updateParamsParams) + const updatedExperiment = parseToolResponse(updateResult) + + expect(updatedExperiment.parameters?.minimum_detectable_effect).toBe(25) + + trackExperiment(experiment) + }) + + it('should handle invalid experiment ID', async () => { + const invalidId = 999999 + + const updateParams = { + experimentId: invalidId, + data: { + name: 'This should fail', + }, + } + + try { + await updateTool.handler(context, updateParams) + expect.fail('Should have thrown an error for invalid experiment ID') + } catch (error) { + expect(error).toBeDefined() + expect((error as Error).message).toContain('Failed to update experiment') + } + }) + + it('should validate required experimentId parameter', async () => { + try { + await updateTool.handler(context, { data: { name: 'Test' } } as any) + expect.fail('Should have thrown validation error for missing experimentId') + } catch (error) { + expect(error).toBeDefined() + } + }) + + it('should handle partial updates correctly', async () => { + // Create experiment + const flagKey = generateUniqueKey('exp-partial-flag') + + const createParams = { + name: 'Partial Update Test', + description: 'Original description', + feature_flag_key: flagKey, + draft: true, + } + + const createResult = await createTool.handler(context, createParams as any) + const experiment = parseToolResponse(createResult) + trackExperiment(experiment) + + // Update only name, leaving description unchanged + const updateParams = { + experimentId: experiment.id, + data: { + name: 'Updated Name Only', + }, + } + + const updateResult = await updateTool.handler(context, updateParams) + const updatedExperiment = parseToolResponse(updateResult) + + expect(updatedExperiment.name).toBe('Updated Name Only') + // Description should remain unchanged + expect(updatedExperiment.description).toBe('Original description') + + trackExperiment(experiment) + }) + }) + + describe('Experiment status handling', () => { + const createTool = createExperimentTool() + + it('should correctly identify draft experiments', async () => { + const flagKey = generateUniqueKey('exp-draft-status-flag') + + const params = { + name: 'Draft Status Experiment', + feature_flag_key: flagKey, + draft: true, + } + + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + expect(experiment.start_date).toBeNull() // Draft experiments have no start date + + trackExperiment(experiment) + }) + + it('should handle immediate launch (non-draft) experiments', async () => { + const flagKey = generateUniqueKey('exp-launch-flag') + + const params = { + name: 'Immediate Launch Experiment', + feature_flag_key: flagKey, + draft: false, + } + + try { + const result = await createTool.handler(context, params as any) + const experiment = parseToolResponse(result) + + // Check actual date fields instead of computed status + expect(experiment.start_date).toBeDefined() // Should have start date if launched + + trackExperiment(experiment) + } catch (error) { + // Some environments might not allow immediate launch + expect(error).toBeDefined() + } + }) + }) +}) diff --git a/products/mcp/typescript/tests/tools/featureFlags.integration.test.ts b/products/mcp/typescript/tests/tools/featureFlags.integration.test.ts new file mode 100644 index 0000000000..a87afb0764 --- /dev/null +++ b/products/mcp/typescript/tests/tools/featureFlags.integration.test.ts @@ -0,0 +1,375 @@ +import { describe, it, expect, beforeAll, afterEach } from 'vitest' +import { + validateEnvironmentVariables, + createTestClient, + createTestContext, + setActiveProjectAndOrg, + cleanupResources, + TEST_PROJECT_ID, + TEST_ORG_ID, + type CreatedResources, + parseToolResponse, + generateUniqueKey, +} from '@/shared/test-utils' +import createFeatureFlagTool from '@/tools/featureFlags/create' +import updateFeatureFlagTool from '@/tools/featureFlags/update' +import deleteFeatureFlagTool from '@/tools/featureFlags/delete' +import getAllFeatureFlagsTool from '@/tools/featureFlags/getAll' +import getFeatureFlagDefinitionTool from '@/tools/featureFlags/getDefinition' +import type { Context } from '@/tools/types' + +describe('Feature Flags', { concurrent: false }, () => { + let context: Context + const createdResources: CreatedResources = { + featureFlags: [], + insights: [], + dashboards: [], + surveys: [], + } + + beforeAll(async () => { + validateEnvironmentVariables() + const client = createTestClient() + context = createTestContext(client) + await setActiveProjectAndOrg(context, TEST_PROJECT_ID!, TEST_ORG_ID!) + }) + + afterEach(async () => { + await cleanupResources(context.api, TEST_PROJECT_ID!, createdResources) + }) + + describe('create-feature-flag tool', () => { + const createTool = createFeatureFlagTool() + + it('should create a feature flag with minimal required fields', async () => { + const params = { + name: 'Test Feature Flag', + key: generateUniqueKey('test-flag'), + description: 'Integration test flag', + filters: { groups: [] }, + active: true, + } + + const result = await createTool.handler(context, params) + + const flagData = parseToolResponse(result) + expect(flagData.id).toBeDefined() + expect(flagData.key).toBe(params.key) + expect(flagData.name).toBe(params.name) + expect(flagData.active).toBe(params.active) + expect(flagData.url).toContain('/feature_flags/') + + createdResources.featureFlags.push(flagData.id) + }) + + it('should create a feature flag with tags', async () => { + const params = { + name: 'Tagged Feature Flag', + key: generateUniqueKey('tagged-flag'), + description: 'Flag with tags', + filters: { groups: [] }, + active: true, + tags: ['test', 'integration'], + } + + const result = await createTool.handler(context, params) + const flagData = parseToolResponse(result) + + expect(flagData.id).toBeDefined() + expect(flagData.key).toBe(params.key) + expect(flagData.name).toBe(params.name) + + createdResources.featureFlags.push(flagData.id) + }) + + it('should create a feature flag with complex filters', async () => { + const params = { + name: 'Complex Filter Flag', + key: generateUniqueKey('complex-flag'), + description: 'Flag with complex filters', + active: true, + filters: { + groups: [ + { + variant: null, + properties: [ + { + key: 'email', + type: 'person', + value: 'test@example.com', + operator: 'exact', + }, + ], + rollout_percentage: 100, + }, + ], + }, + } + + const result = await createTool.handler(context, params) + const flagData = parseToolResponse(result) + + expect(flagData.id).toBeDefined() + expect(flagData.key).toBe(params.key) + expect(flagData.name).toBe(params.name) + + createdResources.featureFlags.push(flagData.id) + }) + }) + + describe('update-feature-flag tool', () => { + const createTool = createFeatureFlagTool() + const updateTool = updateFeatureFlagTool() + + it('should update a feature flag by key', async () => { + // First create a flag + const createParams = { + name: 'Original Name', + key: generateUniqueKey('update-test'), + description: 'Original description', + filters: { groups: [] }, + active: true, + } + + const createResult = await createTool.handler(context, createParams) + const createdFlag = parseToolResponse(createResult) + createdResources.featureFlags.push(createdFlag.id) + + // Update the flag + const updateParams = { + flagKey: createParams.key, + data: { + name: 'Updated Name', + description: 'Updated description', + active: false, + }, + } + + const updateResult = await updateTool.handler(context, updateParams) + const updatedFlag = parseToolResponse(updateResult) + + expect(updatedFlag.name).toBe('Updated Name') + expect(updatedFlag.active).toBe(false) + expect(updatedFlag.key).toBe(createParams.key) + }) + + it('should update feature flag filters', async () => { + // Create a flag + const createParams = { + name: 'Filter Update Test', + key: generateUniqueKey('filter-update'), + description: 'Testing filter updates', + filters: { groups: [] }, + active: true, + } + + const createResult = await createTool.handler(context, createParams) + const createdFlag = parseToolResponse(createResult) + createdResources.featureFlags.push(createdFlag.id) + + // Update with new filters + const updateParams = { + flagKey: createParams.key, + data: { + filters: { + groups: [ + { + variant: null, + properties: [], + rollout_percentage: 50, + }, + ], + }, + }, + } + + const updateResult = await updateTool.handler(context, updateParams) + const updatedFlag = parseToolResponse(updateResult) + + expect(updatedFlag.id).toBeDefined() + expect(updatedFlag.key).toBe(createParams.key) + }) + }) + + describe('get-all-feature-flags tool', () => { + const createTool = createFeatureFlagTool() + const getAllTool = getAllFeatureFlagsTool() + + it('should list all feature flags', async () => { + // Create a few test flags + const testFlags = [] + for (let i = 0; i < 3; i++) { + const params = { + name: `List Test Flag ${i}`, + key: generateUniqueKey(`list-test-${i}`), + description: `Test flag ${i}`, + filters: { groups: [] }, + active: true, + } + + const result = await createTool.handler(context, params) + const flag = parseToolResponse(result) + testFlags.push(flag) + createdResources.featureFlags.push(flag.id) + } + + // Get all flags + const result = await getAllTool.handler(context, {}) + const allFlags = parseToolResponse(result) + + expect(Array.isArray(allFlags)).toBe(true) + expect(allFlags.length).toBeGreaterThanOrEqual(3) + + // Verify our test flags are in the list + for (const testFlag of testFlags) { + const found = allFlags.find((f: any) => f.id === testFlag.id) + expect(found).toBeDefined() + expect(found.key).toBe(testFlag.key) + } + }) + + it('should return flags with proper structure', async () => { + const result = await getAllTool.handler(context, {}) + const flags = parseToolResponse(result) + + if (flags.length > 0) { + const flag = flags[0] + expect(flag).toHaveProperty('id') + expect(flag).toHaveProperty('key') + expect(flag).toHaveProperty('name') + expect(flag).toHaveProperty('active') + } + }) + }) + + describe('get-feature-flag-definition tool', () => { + const createTool = createFeatureFlagTool() + const getDefinitionTool = getFeatureFlagDefinitionTool() + + it('should get feature flag definition by key', async () => { + // Create a flag + const createParams = { + name: 'Definition Test Flag', + key: generateUniqueKey('definition-test'), + description: 'Test flag for definition', + filters: { groups: [] }, + active: true, + tags: ['test-tag'], + } + + const createResult = await createTool.handler(context, createParams) + const createdFlag = parseToolResponse(createResult) + createdResources.featureFlags.push(createdFlag.id) + + // Get definition + const result = await getDefinitionTool.handler(context, { flagKey: createParams.key }) + const definition = parseToolResponse(result) + + expect(definition.id).toBe(createdFlag.id) + expect(definition.key).toBe(createParams.key) + expect(definition.name).toBe(createParams.name) + expect(definition.active).toBe(createParams.active) + }) + + it('should return error message for non-existent flag key', async () => { + const nonExistentKey = generateUniqueKey('non-existent') + + const result = await getDefinitionTool.handler(context, { flagKey: nonExistentKey }) + + expect(result.content[0].text).toBe( + `Error: Flag with key "${nonExistentKey}" not found.` + ) + }) + }) + + describe('delete-feature-flag tool', () => { + const createTool = createFeatureFlagTool() + const deleteTool = deleteFeatureFlagTool() + + it('should delete a feature flag by key', async () => { + // Create a flag + const createParams = { + name: 'Delete Test Flag', + key: generateUniqueKey('delete-test'), + description: 'Test flag for deletion', + filters: { groups: [] }, + active: true, + } + + await createTool.handler(context, createParams) + + // Delete the flag + const deleteResult = await deleteTool.handler(context, { flagKey: createParams.key }) + + expect(deleteResult.content).toBeDefined() + expect(deleteResult.content[0].type).toBe('text') + const deleteResponse = parseToolResponse(deleteResult) + expect(deleteResponse.success).toBe(true) + expect(deleteResponse.message).toContain('deleted successfully') + + // Verify it's deleted by trying to get it + const getDefinitionTool = getFeatureFlagDefinitionTool() + const getResult = await getDefinitionTool.handler(context, { + flagKey: createParams.key, + }) + expect(getResult.content[0].text).toBe( + `Error: Flag with key "${createParams.key}" not found.` + ) + }) + + it('should handle deletion of non-existent flag', async () => { + const nonExistentKey = generateUniqueKey('non-existent-delete') + + const result = await deleteTool.handler(context, { flagKey: nonExistentKey }) + expect(result.content[0].text).toBe('Feature flag is already deleted.') + }) + }) + + describe('Feature flag workflow', () => { + it('should support full CRUD workflow', async () => { + const createTool = createFeatureFlagTool() + const updateTool = updateFeatureFlagTool() + const getDefinitionTool = getFeatureFlagDefinitionTool() + const deleteTool = deleteFeatureFlagTool() + + const flagKey = generateUniqueKey('workflow-test') + + // Create + const createParams = { + name: 'Workflow Test Flag', + key: flagKey, + description: 'Testing full workflow', + filters: { groups: [] }, + active: false, + } + + const createResult = await createTool.handler(context, createParams) + const createdFlag = parseToolResponse(createResult) + + // Read + const getResult = await getDefinitionTool.handler(context, { flagKey: flagKey }) + const retrievedFlag = parseToolResponse(getResult) + expect(retrievedFlag.id).toBe(createdFlag.id) + + // Update + const updateParams = { + flagKey: flagKey, + data: { + active: true, + name: 'Updated Workflow Flag', + }, + } + + const updateResult = await updateTool.handler(context, updateParams) + const updatedFlag = parseToolResponse(updateResult) + expect(updatedFlag.active).toBe(true) + expect(updatedFlag.name).toBe('Updated Workflow Flag') + + // Delete + const deleteResult = await deleteTool.handler(context, { flagKey: flagKey }) + const deleteResponse = parseToolResponse(deleteResult) + expect(deleteResponse.success).toBe(true) + expect(deleteResponse.message).toContain('deleted successfully') + }) + }) +}) diff --git a/products/mcp/typescript/tests/tools/insights.integration.test.ts b/products/mcp/typescript/tests/tools/insights.integration.test.ts new file mode 100644 index 0000000000..30d363212f --- /dev/null +++ b/products/mcp/typescript/tests/tools/insights.integration.test.ts @@ -0,0 +1,317 @@ +import { + type CreatedResources, + SAMPLE_HOGQL_QUERIES, + TEST_ORG_ID, + TEST_PROJECT_ID, + cleanupResources, + createTestClient, + createTestContext, + generateUniqueKey, + parseToolResponse, + setActiveProjectAndOrg, + validateEnvironmentVariables, +} from '@/shared/test-utils' +import createInsightTool from '@/tools/insights/create' +import deleteInsightTool from '@/tools/insights/delete' +import getInsightTool from '@/tools/insights/get' +import getAllInsightsTool from '@/tools/insights/getAll' +import queryInsightTool from '@/tools/insights/query' +import updateInsightTool from '@/tools/insights/update' +import type { Context } from '@/tools/types' +import { afterEach, beforeAll, describe, expect, it } from 'vitest' + +describe('Insights', { concurrent: false }, () => { + // All tests run sequentially to avoid conflicts with shared PostHog project + let context: Context + const createdResources: CreatedResources = { + featureFlags: [], + insights: [], + dashboards: [], + surveys: [], + } + + beforeAll(async () => { + validateEnvironmentVariables() + const client = createTestClient() + context = createTestContext(client) + await setActiveProjectAndOrg(context, TEST_PROJECT_ID!, TEST_ORG_ID!) + }) + + afterEach(async () => { + await cleanupResources(context.api, TEST_PROJECT_ID!, createdResources) + }) + + describe('create-insight tool', () => { + const createTool = createInsightTool() + + it('should create an insight with pageview query', async () => { + const params = { + data: { + name: generateUniqueKey('Test Pageview Insight'), + description: 'Integration test for pageview insight', + query: SAMPLE_HOGQL_QUERIES.pageviews, + favorited: false, + }, + } + + const result = await createTool.handler(context, params) + + const insightData = parseToolResponse(result) + expect(insightData.id).toBeDefined() + expect(insightData.name).toBe(params.data.name) + expect(insightData.url).toContain('/insights/') + + createdResources.insights.push(insightData.id) + }) + + it('should create an insight with top events query', async () => { + const params = { + data: { + name: generateUniqueKey('Test Top Events Insight'), + description: 'Integration test for top events insight', + query: SAMPLE_HOGQL_QUERIES.topEvents, + favorited: false, + }, + } + + const result = await createTool.handler(context, params) + + const insightData = parseToolResponse(result) + expect(insightData.id).toBeDefined() + expect(insightData.name).toBe(params.data.name) + + createdResources.insights.push(insightData.id) + }) + + it('should create an insight with tags', async () => { + const params = { + data: { + name: generateUniqueKey('Test Tagged Insight'), + description: 'Integration test with tags', + query: SAMPLE_HOGQL_QUERIES.pageviews, + tags: ['test', 'integration'], + favorited: false, + }, + } + + const result = await createTool.handler(context, params) + + const insightData = parseToolResponse(result) + expect(insightData.id).toBeDefined() + expect(insightData.name).toBe(params.data.name) + + createdResources.insights.push(insightData.id) + }) + }) + + describe('update-insight tool', () => { + const createTool = createInsightTool() + const updateTool = updateInsightTool() + + it("should update an insight's name and description", async () => { + const createParams = { + data: { + name: generateUniqueKey('Original Insight Name'), + description: 'Original description', + query: SAMPLE_HOGQL_QUERIES.pageviews, + favorited: false, + }, + } + + const createResult = await createTool.handler(context, createParams) + const createdInsight = parseToolResponse(createResult) + createdResources.insights.push(createdInsight.id) + + const updateParams = { + insightId: createdInsight.id, + data: { + name: 'Updated Insight Name', + description: 'Updated description', + query: SAMPLE_HOGQL_QUERIES.pageviews, + }, + } + + const updateResult = await updateTool.handler(context, updateParams) + + const updatedInsight = parseToolResponse(updateResult) + expect(updatedInsight.id).toBe(createdInsight.id) + expect(updatedInsight.name).toBe(updateParams.data.name) + }) + + it("should update an insight's query", async () => { + const createParams = { + data: { + name: generateUniqueKey('Query Update Test'), + description: 'Testing query updates', + query: SAMPLE_HOGQL_QUERIES.pageviews, + favorited: false, + }, + } + + const createResult = await createTool.handler(context, createParams) + const createdInsight = parseToolResponse(createResult) + createdResources.insights.push(createdInsight.id) + + const updateParams = { + insightId: createdInsight.id, + data: { + query: SAMPLE_HOGQL_QUERIES.topEvents, + }, + } + + const updateResult = await updateTool.handler(context, updateParams) + + const updatedInsight = parseToolResponse(updateResult) + expect(updatedInsight.id).toBe(createdInsight.id) + expect(updatedInsight.name).toBe(createParams.data.name) + }) + }) + + describe('get-all-insights tool', () => { + const getAllTool = getAllInsightsTool() + + it('should return insights with proper structure', async () => { + const result = await getAllTool.handler(context, {}) + const insights = parseToolResponse(result) + + expect(Array.isArray(insights)).toBe(true) + if (insights.length > 0) { + const insight = insights[0] + expect(insight).toHaveProperty('id') + expect(insight).toHaveProperty('name') + expect(insight).toHaveProperty('description') + expect(insight).toHaveProperty('url') + } + }) + }) + + describe('get-insight tool', () => { + const createTool = createInsightTool() + const getTool = getInsightTool() + + it('should get a specific insight by ID', async () => { + const createParams = { + data: { + name: generateUniqueKey('Get Test Insight'), + description: 'Test insight for get operation', + query: SAMPLE_HOGQL_QUERIES.pageviews, + favorited: false, + }, + } + + const createResult = await createTool.handler(context, createParams) + const createdInsight = parseToolResponse(createResult) + createdResources.insights.push(createdInsight.id) + + const result = await getTool.handler(context, { insightId: createdInsight.id }) + const retrievedInsight = parseToolResponse(result) + + expect(retrievedInsight.id).toBe(createdInsight.id) + expect(retrievedInsight.name).toBe(createParams.data.name) + expect(retrievedInsight.description).toBe(createParams.data.description) + expect(retrievedInsight.url).toContain('/insights/') + }) + }) + + describe('query-insight tool', () => { + const createTool = createInsightTool() + const queryTool = queryInsightTool() + + it('should query an insight and return results with metadata', async () => { + const createParams = { + data: { + name: generateUniqueKey('Query Test Insight'), + description: 'Test insight for query operation', + query: SAMPLE_HOGQL_QUERIES.pageviews, + favorited: false, + }, + } + + const createResult = await createTool.handler(context, createParams) + const createdInsight = parseToolResponse(createResult) + createdResources.insights.push(createdInsight.id) + + const result = await queryTool.handler(context, { + insightId: createdInsight.id, + }) + const queryResponse = parseToolResponse(result) + + expect(queryResponse).toHaveProperty('insight') + expect(queryResponse).toHaveProperty('results') + expect(queryResponse.insight.id).toBe(createdInsight.id) + expect(queryResponse.insight.name).toBe(createParams.data.name) + expect(queryResponse.insight.url).toContain('/insights/') + }) + }) + + describe('delete-insight tool', () => { + const createTool = createInsightTool() + const deleteTool = deleteInsightTool() + + it('should delete an insight', async () => { + const createParams = { + data: { + name: generateUniqueKey('Delete Test Insight'), + description: 'Test insight for deletion', + query: SAMPLE_HOGQL_QUERIES.pageviews, + favorited: false, + }, + } + + const createResult = await createTool.handler(context, createParams) + const createdInsight = parseToolResponse(createResult) + + const deleteResult = await deleteTool.handler(context, { + insightId: createdInsight.id, + }) + + const deleteResponse = parseToolResponse(deleteResult) + expect(deleteResponse.success).toBe(true) + expect(deleteResponse.message).toContain('deleted successfully') + }) + }) + + describe('Insights workflow', () => { + it('should support full CRUD workflow', async () => { + const createTool = createInsightTool() + const updateTool = updateInsightTool() + const getTool = getInsightTool() + const deleteTool = deleteInsightTool() + + const createParams = { + data: { + name: generateUniqueKey('Workflow Test Insight'), + description: 'Testing full workflow', + query: SAMPLE_HOGQL_QUERIES.pageviews, + favorited: false, + }, + } + + const createResult = await createTool.handler(context, createParams) + const createdInsight = parseToolResponse(createResult) + + const getResult = await getTool.handler(context, { insightId: createdInsight.id }) + const retrievedInsight = parseToolResponse(getResult) + expect(retrievedInsight.id).toBe(createdInsight.id) + + const updateParams = { + insightId: createdInsight.id, + data: { + name: 'Updated Workflow Insight', + description: 'Updated workflow description', + query: SAMPLE_HOGQL_QUERIES.pageviews, + }, + } + + const updateResult = await updateTool.handler(context, updateParams) + const updatedInsight = parseToolResponse(updateResult) + expect(updatedInsight.name).toBe(updateParams.data.name) + + const deleteResult = await deleteTool.handler(context, { + insightId: createdInsight.id, + }) + const deleteResponse = parseToolResponse(deleteResult) + expect(deleteResponse.success).toBe(true) + }) + }) +}) diff --git a/products/mcp/typescript/tests/tools/llmAnalytics.integration.test.ts b/products/mcp/typescript/tests/tools/llmAnalytics.integration.test.ts new file mode 100644 index 0000000000..6f82fd4dd1 --- /dev/null +++ b/products/mcp/typescript/tests/tools/llmAnalytics.integration.test.ts @@ -0,0 +1,88 @@ +import { describe, it, expect, beforeAll, afterEach } from 'vitest' +import { + validateEnvironmentVariables, + createTestClient, + createTestContext, + setActiveProjectAndOrg, + cleanupResources, + TEST_PROJECT_ID, + TEST_ORG_ID, + type CreatedResources, + parseToolResponse, +} from '@/shared/test-utils' +import getLLMCostsTool from '@/tools/llmAnalytics/getLLMCosts' +import type { Context } from '@/tools/types' + +describe('LLM Analytics', { concurrent: false }, () => { + let context: Context + const createdResources: CreatedResources = { + featureFlags: [], + insights: [], + dashboards: [], + surveys: [], + } + + beforeAll(async () => { + validateEnvironmentVariables() + const client = createTestClient() + context = createTestContext(client) + await setActiveProjectAndOrg(context, TEST_PROJECT_ID!, TEST_ORG_ID!) + }) + + afterEach(async () => { + await cleanupResources(context.api, TEST_PROJECT_ID!, createdResources) + }) + + describe('get-llm-costs tool', () => { + const costsTool = getLLMCostsTool() + + it('should get LLM costs with default days (6 days)', async () => { + const result = await costsTool.handler(context, { + projectId: Number(TEST_PROJECT_ID), + }) + const costsData = parseToolResponse(result) + + expect(Array.isArray(costsData)).toBe(true) + }) + + it('should get LLM costs for custom time period', async () => { + const result = await costsTool.handler(context, { + projectId: Number(TEST_PROJECT_ID), + days: 30, + }) + const costsData = parseToolResponse(result) + + expect(Array.isArray(costsData)).toBe(true) + }) + + it('should get LLM costs for single day', async () => { + const result = await costsTool.handler(context, { + projectId: Number(TEST_PROJECT_ID), + days: 1, + }) + const costsData = parseToolResponse(result) + + expect(Array.isArray(costsData)).toBe(true) + }) + }) + + describe('LLM Analytics workflow', () => { + it('should support getting costs for different time periods', async () => { + const costsTool = getLLMCostsTool() + + const weekResult = await costsTool.handler(context, { + projectId: Number(TEST_PROJECT_ID), + days: 7, + }) + const weekData = parseToolResponse(weekResult) + expect(Array.isArray(weekData)).toBe(true) + + const monthResult = await costsTool.handler(context, { + projectId: Number(TEST_PROJECT_ID), + days: 30, + }) + const monthData = parseToolResponse(monthResult) + expect(Array.isArray(monthData)).toBe(true) + }) + }) +}) diff --git a/products/mcp/typescript/tests/tools/organizations.integration.test.ts b/products/mcp/typescript/tests/tools/organizations.integration.test.ts new file mode 100644 index 0000000000..0f57dc513a --- /dev/null +++ b/products/mcp/typescript/tests/tools/organizations.integration.test.ts @@ -0,0 +1,138 @@ +import { + type CreatedResources, + TEST_ORG_ID, + TEST_PROJECT_ID, + cleanupResources, + createTestClient, + createTestContext, + parseToolResponse, + setActiveProjectAndOrg, + validateEnvironmentVariables, +} from '@/shared/test-utils' +import getOrganizationDetailsTool from '@/tools/organizations/getDetails' +import getOrganizationsTool from '@/tools/organizations/getOrganizations' +import setActiveOrganizationTool from '@/tools/organizations/setActive' +import type { Context } from '@/tools/types' +import { afterEach, beforeAll, describe, expect, it } from 'vitest' + +describe.skip('Organizations', { concurrent: false }, () => { + let context: Context + const createdResources: CreatedResources = { + featureFlags: [], + insights: [], + dashboards: [], + surveys: [], + } + + beforeAll(async () => { + validateEnvironmentVariables() + const client = createTestClient() + context = createTestContext(client) + await setActiveProjectAndOrg(context, TEST_PROJECT_ID!, TEST_ORG_ID!) + }) + + afterEach(async () => { + await cleanupResources(context.api, TEST_PROJECT_ID!, createdResources) + }) + + describe('get-organizations tool', () => { + const getTool = getOrganizationsTool() + + it('should list all organizations', async () => { + const result = await getTool.handler(context, {}) + const orgs = parseToolResponse(result) + + expect(Array.isArray(orgs)).toBe(true) + expect(orgs.length).toBeGreaterThan(0) + + const org = orgs[0] + expect(org).toHaveProperty('id') + expect(org).toHaveProperty('name') + }) + + it('should return organizations with proper structure', async () => { + const result = await getTool.handler(context, {}) + const orgs = parseToolResponse(result) + + const testOrg = orgs.find((org: any) => org.id === TEST_ORG_ID) + expect(testOrg).toBeDefined() + expect(testOrg.id).toBe(TEST_ORG_ID) + }) + }) + + describe('set-active-organization tool', () => { + const setTool = setActiveOrganizationTool() + const getTool = getOrganizationsTool() + + it('should set active organization', async () => { + const orgsResult = await getTool.handler(context, {}) + const orgs = parseToolResponse(orgsResult) + expect(orgs.length).toBeGreaterThan(0) + + const targetOrg = orgs[0] + const setResult = await setTool.handler(context, { orgId: targetOrg.id }) + + expect(setResult.content[0].text).toBe(`Switched to organization ${targetOrg.id}`) + }) + + it('should handle invalid organization ID', async () => { + try { + await setTool.handler(context, { orgId: 'invalid-org-id-12345' }) + expect.fail('Should have thrown an error') + } catch (error) { + expect(error).toBeDefined() + } + }) + }) + + describe('get-organization-details tool', () => { + const getDetailsTool = getOrganizationDetailsTool() + + it.skip('should get organization details for active org', async () => { + const result = await getDetailsTool.handler(context, {}) + const orgDetails = parseToolResponse(result) + + expect(orgDetails.id).toBe(TEST_ORG_ID) + expect(orgDetails).toHaveProperty('name') + expect(orgDetails).toHaveProperty('projects') + expect(Array.isArray(orgDetails.projects)).toBe(true) + }) + + it.skip('should include projects in organization details', async () => { + const result = await getDetailsTool.handler(context, {}) + const orgDetails = parseToolResponse(result) + + expect(orgDetails.projects).toBeDefined() + expect(Array.isArray(orgDetails.projects)).toBe(true) + + if (orgDetails.projects.length > 0) { + const project = orgDetails.projects[0] + expect(project).toHaveProperty('id') + expect(project).toHaveProperty('name') + } + + const testProject = orgDetails.projects.find( + (p: any) => p.id === Number(TEST_PROJECT_ID) + ) + expect(testProject).toBeDefined() + }) + }) + + describe('Organization workflow', () => { + it('should support listing and setting active org workflow', async () => { + const getTool = getOrganizationsTool() + const setTool = setActiveOrganizationTool() + + const orgsResult = await getTool.handler(context, {}) + const orgs = parseToolResponse(orgsResult) + expect(orgs.length).toBeGreaterThan(0) + + const targetOrg = orgs.find((org: any) => org.id === TEST_ORG_ID) || orgs[0] + + const setResult = await setTool.handler(context, { orgId: targetOrg.id }) + expect(setResult.content[0].text).toBe(`Switched to organization ${targetOrg.id}`) + + await context.cache.set('orgId', targetOrg.id) + }) + }) +}) diff --git a/products/mcp/typescript/tests/tools/projects.integration.test.ts b/products/mcp/typescript/tests/tools/projects.integration.test.ts new file mode 100644 index 0000000000..a323d3be45 --- /dev/null +++ b/products/mcp/typescript/tests/tools/projects.integration.test.ts @@ -0,0 +1,215 @@ +import { + type CreatedResources, + TEST_ORG_ID, + TEST_PROJECT_ID, + cleanupResources, + createTestClient, + createTestContext, + parseToolResponse, + setActiveProjectAndOrg, + validateEnvironmentVariables, +} from '@/shared/test-utils' +import eventDefinitionsTool from '@/tools/projects/eventDefinitions' +import getProjectsTool from '@/tools/projects/getProjects' +import propertyDefinitionsTool from '@/tools/projects/propertyDefinitions' +import setActiveProjectTool from '@/tools/projects/setActive' +import type { Context } from '@/tools/types' +import { v4 as uuidv4 } from 'uuid' +import { afterEach, beforeAll, describe, expect, it } from 'vitest' + +describe('Projects', { concurrent: false }, () => { + let context: Context + const createdResources: CreatedResources = { + featureFlags: [], + insights: [], + dashboards: [], + surveys: [], + } + + beforeAll(async () => { + validateEnvironmentVariables() + const client = createTestClient() + context = createTestContext(client) + await setActiveProjectAndOrg(context, TEST_PROJECT_ID!, TEST_ORG_ID!) + }) + + afterEach(async () => { + await cleanupResources(context.api, TEST_PROJECT_ID!, createdResources) + }) + + describe.skip('get-projects tool', () => { + const getTool = getProjectsTool() + + it('should list all projects for the active organization', async () => { + const result = await getTool.handler(context, {}) + const projects = parseToolResponse(result) + + expect(Array.isArray(projects)).toBe(true) + expect(projects.length).toBeGreaterThan(0) + + const project = projects[0] + expect(project).toHaveProperty('id') + expect(project).toHaveProperty('name') + }) + + it('should return projects with proper structure', async () => { + const result = await getTool.handler(context, {}) + const projects = parseToolResponse(result) + + const testProject = projects.find((proj: any) => proj.id === Number(TEST_PROJECT_ID)) + expect(testProject).toBeDefined() + expect(testProject.id).toBe(Number(TEST_PROJECT_ID)) + }) + }) + + describe('switch-project tool', () => { + const setTool = setActiveProjectTool() + + it('should set active project', async () => { + const targetProject = TEST_PROJECT_ID! + const setResult = await setTool.handler(context, { projectId: Number(targetProject) }) + + expect(setResult.content[0].text).toBe(`Switched to project ${targetProject}`) + }) + }) + + describe('properties-list tool', () => { + const propertyDefsTool = propertyDefinitionsTool() + + it('should get property definitions for a specific event', async () => { + const result = await propertyDefsTool.handler(context, { + type: 'event', + eventName: '$pageview', + }) + const propertyDefs = parseToolResponse(result) + + expect(Array.isArray(propertyDefs)).toBe(true) + }) + + it('should return property definitions with proper structure', async () => { + const result = await propertyDefsTool.handler(context, { + type: 'event', + eventName: '$pageview', + }) + const propertyDefs = parseToolResponse(result) + + if (propertyDefs.length > 0) { + const prop = propertyDefs[0] + expect(prop).toHaveProperty('name') + expect(prop).toHaveProperty('property_type') + expect(typeof prop.name).toBe('string') + expect(typeof prop.property_type).toBe('string') + } + }) + + it('should handle invalid event names gracefully', async () => { + try { + const result = await propertyDefsTool.handler(context, { + type: 'event', + eventName: `non-existent-event-${uuidv4()}`, + }) + const propertyDefs = parseToolResponse(result) + expect(Array.isArray(propertyDefs)).toBe(true) + } catch (error) { + expect(error).toBeInstanceOf(Error) + } + }) + + it('should get property definitions for persons', async () => { + const result = await propertyDefsTool.handler(context, { + type: 'person', + }) + const propertyDefs = parseToolResponse(result) + expect(Array.isArray(propertyDefs)).toBe(true) + expect(propertyDefs.length).toBeGreaterThan(0) + }) + }) + + describe('event-definitions-list tool', () => { + const eventDefsTool = eventDefinitionsTool() + + it('should list all event definitions for active project', async () => { + const result = await eventDefsTool.handler(context, {}) + const eventDefs = parseToolResponse(result) + + expect(Array.isArray(eventDefs)).toBe(true) + }) + + it('should return event definitions with proper structure', async () => { + const result = await eventDefsTool.handler(context, {}) + const eventDefs = parseToolResponse(result) + + if (eventDefs.length > 0) { + const eventDef = eventDefs[0] + expect(eventDef).toHaveProperty('name') + expect(eventDef).toHaveProperty('last_seen_at') + expect(typeof eventDef.name).toBe('string') + } + }) + + it('should include common events like $pageview', async () => { + const result = await eventDefsTool.handler(context, {}) + const eventDefs = parseToolResponse(result) + + const pageviewEvent = eventDefs.find((event: any) => event.name === '$pageview') + if (eventDefs.length > 0) { + expect(pageviewEvent).toBeDefined() + } + }) + + it('should filter event definitions with search parameter', async () => { + const result = await eventDefsTool.handler(context, { q: 'pageview' }) + const eventDefs = parseToolResponse(result) + + expect(Array.isArray(eventDefs)).toBe(true) + + // All returned events should contain "pageview" in their name + for (const event of eventDefs) { + expect(event.name.toLowerCase()).toContain('pageview') + } + }) + + it('should return empty array when searching for non-existent events', async () => { + const result = await eventDefsTool.handler(context, { q: 'non-existent-event-xyz123' }) + const eventDefs = parseToolResponse(result) + + expect(Array.isArray(eventDefs)).toBe(true) + expect(eventDefs.length).toBe(0) + }) + + it('should return all events when no search parameter is provided', async () => { + const resultWithoutSearch = await eventDefsTool.handler(context, {}) + const resultWithSearch = await eventDefsTool.handler(context, { q: 'pageview' }) + + const allEventDefs = parseToolResponse(resultWithoutSearch) + const filteredEventDefs = parseToolResponse(resultWithSearch) + + expect(Array.isArray(allEventDefs)).toBe(true) + expect(Array.isArray(filteredEventDefs)).toBe(true) + + if (allEventDefs.length > 0 && filteredEventDefs.length > 0) { + // Filtered results should be a subset of all results + expect(filteredEventDefs.length).toBeLessThanOrEqual(allEventDefs.length) + } + }) + }) + + describe('Projects workflow', () => { + it.skip('should support listing and setting active project workflow', async () => { + const getTool = getProjectsTool() + const setTool = setActiveProjectTool() + + const projectsResult = await getTool.handler(context, {}) + const projects = parseToolResponse(projectsResult) + expect(projects.length).toBeGreaterThan(0) + + const targetProject = + projects.find((p: any) => p.id === Number(TEST_PROJECT_ID)) || projects[0] + + const setResult = await setTool.handler(context, { projectId: targetProject.id }) + expect(setResult.content[0].text).toBe(`Switched to project ${targetProject.id}`) + + await context.cache.set('projectId', targetProject.id.toString()) + }) + }) +}) diff --git a/products/mcp/typescript/tests/tools/query.integration.test.ts b/products/mcp/typescript/tests/tools/query.integration.test.ts new file mode 100644 index 0000000000..776925a9f3 --- /dev/null +++ b/products/mcp/typescript/tests/tools/query.integration.test.ts @@ -0,0 +1,282 @@ +import type { ApiClient } from '@/api/client' +import type { InsightQuery } from '@/schema/query' +import queryRunTool from '@/tools/query/run' +import type { Context } from '@/tools/types' +import { afterEach, beforeAll, describe, expect, it } from 'vitest' +import { + type CreatedResources, + SAMPLE_FUNNEL_QUERIES, + SAMPLE_HOGQL_QUERIES, + SAMPLE_TREND_QUERIES, + TEST_ORG_ID, + TEST_PROJECT_ID, + cleanupResources, + createTestClient, + createTestContext, + parseToolResponse, + setActiveProjectAndOrg, + validateEnvironmentVariables, +} from '../shared/test-utils' + +describe('Query Integration Tests', () => { + let client: ApiClient + let context: Context + let testProjectId: string + let testOrgId: string + let createdResources: CreatedResources + + beforeAll(async () => { + validateEnvironmentVariables() + client = createTestClient() + context = createTestContext(client) + testProjectId = TEST_PROJECT_ID! + testOrgId = TEST_ORG_ID! + + await setActiveProjectAndOrg(context, testProjectId, testOrgId) + + createdResources = { + featureFlags: [], + insights: [], + dashboards: [], + surveys: [], + } + }) + + afterEach(async () => { + await cleanupResources(client, testProjectId, createdResources) + }) + + describe('HogQL Query Execution', () => { + it('should execute pageviews HogQL query successfully', async () => { + const tool = queryRunTool() + const query = SAMPLE_HOGQL_QUERIES.pageviews + const result = await tool.handler(context, { + query, + }) + + const response = parseToolResponse(result) + + expect(result.content).toBeDefined() + expect(result.content[0].type).toBe('text') + expect(response).toBeDefined() + expect(Array.isArray(response)).toBe(true) + }) + + it('should execute topEvents HogQL query successfully', async () => { + const tool = queryRunTool() + const result = await tool.handler(context, { + query: SAMPLE_HOGQL_QUERIES.topEvents, + }) + + const response = parseToolResponse(result) + + expect(result.content).toBeDefined() + expect(result.content[0].type).toBe('text') + expect(response).toBeDefined() + expect(Array.isArray(response)).toBe(true) + }) + + it('should handle invalid HogQL query with invalid node', async () => { + const invalidQuery = { + kind: 'DataVisualizationNode' as const, + source: { + kind: 'HogQLQuery' as const, + query: "SELECT * FROM invalid_table WHERE invalid_column = 'test'", + filters: { + dateRange: { + date_from: '-7d', + date_to: null, + }, + }, + }, + } + + const tool = queryRunTool() + + try { + await tool.handler(context, { + query: invalidQuery, + }) + } catch (error: any) { + expect(error).toBeDefined() + expect(error.message).toContain('Failed to query insight') + } + }) + }) + + describe('Trends Query Execution', () => { + it('should execute basic pageviews trends query successfully', async () => { + const tool = queryRunTool() + const result = await tool.handler(context, { + query: SAMPLE_TREND_QUERIES.basicPageviews, + }) + + const response = parseToolResponse(result) + + expect(result.content).toBeDefined() + expect(result.content[0].type).toBe('text') + expect(response).toBeDefined() + expect(Array.isArray(response)).toBe(true) + }) + + it('should execute unique users trends query successfully', async () => { + const tool = queryRunTool() + const result = await tool.handler(context, { + query: SAMPLE_TREND_QUERIES.uniqueUsers, + }) + + const response = parseToolResponse(result) + + expect(result.content).toBeDefined() + expect(result.content[0].type).toBe('text') + expect(response).toBeDefined() + expect(Array.isArray(response)).toBe(true) + }) + + it('should execute multiple events trends query successfully', async () => { + const tool = queryRunTool() + const result = await tool.handler(context, { + query: SAMPLE_TREND_QUERIES.multipleEvents, + }) + + const response = parseToolResponse(result) + + expect(result.content).toBeDefined() + expect(result.content[0].type).toBe('text') + expect(response).toBeDefined() + expect(Array.isArray(response)).toBe(true) + }) + + it('should execute trends query with breakdown successfully', async () => { + const tool = queryRunTool() + const result = await tool.handler(context, { + query: SAMPLE_TREND_QUERIES.withBreakdown, + }) + + const response = parseToolResponse(result) + + expect(result.content).toBeDefined() + expect(result.content[0].type).toBe('text') + expect(response).toBeDefined() + expect(Array.isArray(response)).toBe(true) + }) + + it('should execute trends query with property filter successfully', async () => { + const tool = queryRunTool() + const result = await tool.handler(context, { + query: SAMPLE_TREND_QUERIES.withPropertyFilter, + }) + + const response = parseToolResponse(result) + + expect(result.content).toBeDefined() + expect(result.content[0].type).toBe('text') + expect(response).toBeDefined() + expect(Array.isArray(response)).toBe(true) + }) + }) + + describe('Funnel Query Execution', () => { + it('should execute basic funnel query successfully', async () => { + const tool = queryRunTool() + const result = await tool.handler(context, { + query: SAMPLE_FUNNEL_QUERIES.basicFunnel, + }) + + const response = parseToolResponse(result) + + expect(result.content).toBeDefined() + expect(result.content[0].type).toBe('text') + expect(response).toBeDefined() + expect(Array.isArray(response)).toBe(true) + }) + + it('should execute strict order funnel query successfully', async () => { + const tool = queryRunTool() + const result = await tool.handler(context, { + query: SAMPLE_FUNNEL_QUERIES.strictOrderFunnel, + }) + + const response = parseToolResponse(result) + + expect(result.content).toBeDefined() + expect(result.content[0].type).toBe('text') + expect(response).toBeDefined() + expect(Array.isArray(response)).toBe(true) + }) + + it('should execute funnel with breakdown query successfully', async () => { + const tool = queryRunTool() + const result = await tool.handler(context, { + query: SAMPLE_FUNNEL_QUERIES.funnelWithBreakdown, + }) + + const response = parseToolResponse(result) + + expect(result.content).toBeDefined() + expect(result.content[0].type).toBe('text') + expect(response).toBeDefined() + expect(Array.isArray(response)).toBe(true) + }) + + it('should execute funnel with conversion window query successfully', async () => { + const tool = queryRunTool() + const result = await tool.handler(context, { + query: SAMPLE_FUNNEL_QUERIES.conversionWindow, + }) + + const response = parseToolResponse(result) + + expect(result.content).toBeDefined() + expect(result.content[0].type).toBe('text') + expect(response).toBeDefined() + expect(Array.isArray(response)).toBe(true) + }) + + it('should execute onboarding funnel query successfully', async () => { + const tool = queryRunTool() + const result = await tool.handler(context, { + query: SAMPLE_FUNNEL_QUERIES.onboardingFunnel, + }) + + const response = parseToolResponse(result) + + expect(result.content).toBeDefined() + expect(result.content[0].type).toBe('text') + expect(response).toBeDefined() + expect(Array.isArray(response)).toBe(true) + }) + + it('should handle malformed funnel query with invalid node', async () => { + const malformedFunnel = { + kind: 'InsightVizNode' as const, + source: { + kind: 'FunnelsQuery' as const, + series: [ + { + kind: 'InvalidNode' as const, + event: '$pageview', + custom_name: 'Single Step', + }, + ], + dateRange: { + date_from: '-7d', + date_to: null, + }, + properties: [], + filterTestAccounts: false, + }, + } + + const tool = queryRunTool() + + try { + await tool.handler(context, { + query: malformedFunnel as unknown as InsightQuery, + }) + } catch (error: any) { + expect(error).toBeDefined() + } + }) + }) +}) diff --git a/products/mcp/typescript/tests/tools/surveys.integration.test.ts b/products/mcp/typescript/tests/tools/surveys.integration.test.ts new file mode 100644 index 0000000000..baa3946d2f --- /dev/null +++ b/products/mcp/typescript/tests/tools/surveys.integration.test.ts @@ -0,0 +1,993 @@ +import { + type CreatedResources, + TEST_ORG_ID, + TEST_PROJECT_ID, + cleanupResources, + createTestClient, + createTestContext, + generateUniqueKey, + parseToolResponse, + setActiveProjectAndOrg, + validateEnvironmentVariables, +} from '@/shared/test-utils' +import createSurveyTool from '@/tools/surveys/create' +import deleteSurveyTool from '@/tools/surveys/delete' +import getSurveyTool from '@/tools/surveys/get' +import getAllSurveysTool from '@/tools/surveys/getAll' +import getGlobalSurveyStatsTool from '@/tools/surveys/global-stats' +import getSurveyStatsTool from '@/tools/surveys/stats' +import updateSurveyTool from '@/tools/surveys/update' +import type { Context } from '@/tools/types' +import { afterEach, beforeAll, describe, expect, it } from 'vitest' + +describe('Surveys', { concurrent: false }, () => { + let context: Context + const createdResources: CreatedResources = { + featureFlags: [], + insights: [], + dashboards: [], + surveys: [], + } + + beforeAll(async () => { + validateEnvironmentVariables() + const client = createTestClient() + context = createTestContext(client) + await setActiveProjectAndOrg(context, TEST_PROJECT_ID!, TEST_ORG_ID!) + }) + + afterEach(async () => { + await cleanupResources(context.api, TEST_PROJECT_ID!, createdResources) + }) + + describe('survey-create tool', () => { + const createTool = createSurveyTool() + + it('should create a survey with minimal required fields', async () => { + const getTool = getSurveyTool() + const params = { + name: `Test Survey ${Date.now()}`, + description: 'Integration test survey', + type: 'popover' as const, + questions: [ + { + type: 'open' as const, + question: 'What do you think about our product?', + }, + ], + start_date: null, + } + + const result = await createTool.handler(context, params) + const createResponse = parseToolResponse(result) + expect(createResponse.id).toBeDefined() + createdResources.surveys.push(createResponse.id) + + // Verify by getting the created survey + const getResult = await getTool.handler(context, { surveyId: createResponse.id }) + const surveyData = parseToolResponse(getResult) + + expect(surveyData.id).toBe(createResponse.id) + expect(surveyData.name).toBe(params.name) + expect(surveyData.description).toBe(params.description) + expect(surveyData.type).toBe(params.type) + expect(surveyData.questions).toHaveLength(1) + expect(surveyData.questions[0]?.question).toBe(params.questions[0]?.question) + }) + + it('should create a survey with multiple question types', async () => { + const getTool = getSurveyTool() + const params = { + name: `Multi-Question Survey ${Date.now()}`, + description: 'Survey with various question types', + type: 'popover' as const, + questions: [ + { + type: 'open' as const, + question: 'Tell us about your experience', + optional: false, + }, + { + type: 'rating' as const, + question: 'How would you rate our service?', + scale: 5 as const, + lowerBoundLabel: 'Poor', + upperBoundLabel: 'Excellent', + display: 'number' as const, + }, + { + type: 'single_choice' as const, + question: 'Which feature do you use most?', + choices: ['Analytics', 'Feature Flags', 'Session Replay', 'Surveys'], + }, + { + type: 'multiple_choice' as const, + question: 'What improvements would you like to see?', + choices: [ + 'Better UI', + 'More integrations', + 'Faster performance', + 'Better docs', + ], + hasOpenChoice: true, + }, + ], + start_date: null, + } + + const result = await createTool.handler(context, params) + const createResponse = parseToolResponse(result) + expect(createResponse.id).toBeDefined() + createdResources.surveys.push(createResponse.id) + + // Verify by getting the created survey + const getResult = await getTool.handler(context, { surveyId: createResponse.id }) + const surveyData = parseToolResponse(getResult) + + expect(surveyData.id).toBe(createResponse.id) + expect(surveyData.name).toBe(params.name) + expect(surveyData.questions).toHaveLength(4) + expect(surveyData.questions[0].type).toBe('open') + expect(surveyData.questions[1].type).toBe('rating') + expect(surveyData.questions[2].type).toBe('single_choice') + expect(surveyData.questions[3].type).toBe('multiple_choice') + }) + + it('should create an NPS survey with branching logic', async () => { + const getTool = getSurveyTool() + const params = { + name: `NPS Survey ${Date.now()}`, + description: 'Net Promoter Score survey with follow-up questions', + type: 'popover' as const, + questions: [ + { + type: 'rating' as const, + question: + 'How likely are you to recommend our product to a friend or colleague?', + scale: 10 as const, + display: 'number' as const, + lowerBoundLabel: 'Not at all likely', + upperBoundLabel: 'Extremely likely', + branching: { + type: 'response_based' as const, + responseValues: { + detractors: 1, // Go to question 1 (index 1) + promoters: 2, // Go to question 2 (index 2) + // passives will go to next question by default + }, + }, + }, + { + type: 'open' as const, + question: 'What could we do to improve your experience?', + }, + { + type: 'open' as const, + question: 'What do you love most about our product?', + }, + { + type: 'open' as const, + question: 'Thank you for your feedback!', + }, + ], + start_date: null, + } + + const result = await createTool.handler(context, params) + const createResponse = parseToolResponse(result) + expect(createResponse.id).toBeDefined() + createdResources.surveys.push(createResponse.id) + + // Verify by getting the created survey + const getResult = await getTool.handler(context, { surveyId: createResponse.id }) + const surveyData = parseToolResponse(getResult) + + expect(surveyData.id).toBe(createResponse.id) + expect(surveyData.name).toBe(params.name) + expect(surveyData.questions).toHaveLength(4) + expect(surveyData.questions[0].branching).toBeDefined() + expect(surveyData.questions[0].branching.type).toBe('response_based') + }) + + it('should create a survey with targeting filters', async () => { + const getTool = getSurveyTool() + const params = { + name: `Targeted Survey ${Date.now()}`, + description: 'Survey with user targeting', + type: 'popover' as const, + questions: [ + { + type: 'open' as const, + question: 'How satisfied are you with our premium features?', + }, + ], + targeting_flag_filters: { + groups: [ + { + properties: [ + { + key: 'subscription', + value: 'premium', + operator: 'exact' as const, + type: 'person', + }, + ], + rollout_percentage: 100, + }, + ], + }, + start_date: null, + } + + const result = await createTool.handler(context, params) + const createResponse = parseToolResponse(result) + expect(createResponse.id).toBeDefined() + createdResources.surveys.push(createResponse.id) + + // Verify by getting the created survey + const getResult = await getTool.handler(context, { surveyId: createResponse.id }) + const surveyData = parseToolResponse(getResult) + + expect(surveyData.id).toBe(createResponse.id) + expect(surveyData.name).toBe(params.name) + expect(surveyData.targeting_flag).toBeDefined() + }) + }) + + describe('survey-get tool', () => { + const createTool = createSurveyTool() + const getTool = getSurveyTool() + + it('should get a survey by ID', async () => { + // Create a survey first + const createParams = { + name: `Get Test Survey ${Date.now()}`, + description: 'Survey for get testing', + type: 'popover' as const, + questions: [ + { + type: 'open' as const, + question: 'Test question', + }, + ], + start_date: null, + } + + const createResult = await createTool.handler(context, createParams) + const createdSurvey = parseToolResponse(createResult) + createdResources.surveys.push(createdSurvey.id) + + // Get the survey + const getResult = await getTool.handler(context, { surveyId: createdSurvey.id }) + const retrievedSurvey = parseToolResponse(getResult) + + expect(retrievedSurvey.id).toBe(createdSurvey.id) + expect(retrievedSurvey.name).toBe(createParams.name) + expect(retrievedSurvey.description).toBe(createParams.description) + expect(retrievedSurvey.questions).toHaveLength(1) + }) + + it('should return error for non-existent survey ID', async () => { + const nonExistentId = generateUniqueKey('non-existent') + + await expect(getTool.handler(context, { surveyId: nonExistentId })).rejects.toThrow( + 'Failed to get survey' + ) + }) + }) + + describe('surveys-get-all tool', () => { + const createTool = createSurveyTool() + const getAllTool = getAllSurveysTool() + + it('should list all surveys', async () => { + // Create a few test surveys + const testSurveys = [] + const timestamp = Date.now() + for (let i = 0; i < 3; i++) { + const params = { + name: `List Test Survey ${timestamp}-${i}`, + description: `Test survey ${i} for listing`, + type: 'popover' as const, + questions: [ + { + type: 'open' as const, + question: `Test question ${i}`, + }, + ], + start_date: null, + } + + const result = await createTool.handler(context, params) + const survey = parseToolResponse(result) + testSurveys.push(survey) + createdResources.surveys.push(survey.id) + } + + // Get all surveys + const result = await getAllTool.handler(context, {}) + const allSurveys = parseToolResponse(result) + + expect(Array.isArray(allSurveys.results)).toBe(true) + expect(allSurveys.results.length).toBeGreaterThanOrEqual(3) + + // Verify our test surveys are in the list + for (const testSurvey of testSurveys) { + const found = allSurveys.results.find((s: any) => s.id === testSurvey.id) + expect(found).toBeDefined() + expect(found.name).toBe(testSurvey.name) + } + }) + + it('should support search filtering', async () => { + // Create a survey with a unique name + const timestamp = Date.now() + const uniqueName = `Search Test Survey ${timestamp}` + const params = { + name: uniqueName, + description: 'Survey for search testing', + type: 'popover' as const, + questions: [ + { + type: 'open' as const, + question: 'Search test question', + }, + ], + start_date: null, + } + + const createResult = await createTool.handler(context, params) + const createdSurvey = parseToolResponse(createResult) + createdResources.surveys.push(createdSurvey.id) + + // Search for the survey + const searchResult = await getAllTool.handler(context, { + search: 'Search Test', + }) + const searchResults = parseToolResponse(searchResult) + + // Handle case where search might return empty results + if (searchResults?.results) { + expect(searchResults.results.length).toBeGreaterThanOrEqual(0) + // Only check for specific survey if results exist + if (searchResults.results.length > 0) { + const found = searchResults.results.find((s: any) => s.id === createdSurvey.id) + // Survey might not be found in search results immediately + expect(found).toBeDefined() + } + } else { + // If no results structure, just verify we got a response + expect(searchResults).toBeDefined() + } + }) + }) + + describe('survey-stats tool', () => { + const statsTool = getSurveyStatsTool() + + it('should get survey statistics', async () => { + // Create a survey + const createTool = createSurveyTool() + const createParams = { + name: `Stats Test Survey ${Date.now()}`, + description: 'Survey for stats testing', + type: 'popover' as const, + questions: [ + { + type: 'rating' as const, + question: 'Rate our service', + scale: 5 as const, + display: 'number' as const, + }, + ], + start_date: null, + } + + const createResult = await createTool.handler(context, createParams) + const createdSurvey = parseToolResponse(createResult) + createdResources.surveys.push(createdSurvey.id) + + // Get stats + const statsResult = await statsTool.handler(context, { survey_id: createdSurvey.id }) + const stats = parseToolResponse(statsResult) + + expect(stats).toBeDefined() + // Stats may be undefined if no survey events exist yet + expect(typeof (stats.survey_shown || 0)).toBe('number') + expect(typeof (stats.survey_dismissed || 0)).toBe('number') + expect(typeof (stats.survey_sent || 0)).toBe('number') + }) + }) + + describe('surveys-global-stats tool', () => { + const globalStatsTool = getGlobalSurveyStatsTool() + + it('should get global survey statistics', async () => { + const result = await globalStatsTool.handler(context, {}) + const stats = parseToolResponse(result) + + expect(stats).toBeDefined() + // Stats may be undefined if no survey events exist yet + expect(typeof (stats.survey_shown || 0)).toBe('number') + expect(typeof (stats.survey_dismissed || 0)).toBe('number') + expect(typeof (stats.survey_sent || 0)).toBe('number') + }) + + it('should support date filtering', async () => { + const result = await globalStatsTool.handler(context, { + date_from: '2024-01-01T00:00:00Z', + date_to: '2024-12-31T23:59:59Z', + }) + const stats = parseToolResponse(result) + + expect(stats).toBeDefined() + }) + }) + + describe('survey-delete tool', () => { + const createTool = createSurveyTool() + const deleteTool = deleteSurveyTool() + const getTool = getSurveyTool() + + it('should delete a survey by ID', async () => { + // Create a survey + const createParams = { + name: `Delete Test Survey ${Date.now()}`, + description: 'Survey for deletion testing', + type: 'popover' as const, + questions: [ + { + type: 'open' as const, + question: 'This will be deleted', + }, + ], + start_date: null, + } + + const createResult = await createTool.handler(context, createParams) + const createdSurvey = parseToolResponse(createResult) + createdResources.surveys.push(createdSurvey.id) + + // Delete the survey + const deleteResult = await deleteTool.handler(context, { surveyId: createdSurvey.id }) + + expect(deleteResult.content).toBeDefined() + expect(deleteResult.content[0].type).toBe('text') + const deleteResponse = parseToolResponse(deleteResult) + expect(deleteResponse.success).toBe(true) + expect(deleteResponse.message).toContain('archived successfully') + + // Verify it's archived (client soft deletes surveys, so archived) + const getResult = await getTool.handler(context, { surveyId: createdSurvey.id }) + const archivedSurvey = parseToolResponse(getResult) + expect(archivedSurvey.archived).toBe(true) + }) + + it('should handle deletion of non-existent survey', async () => { + const deleteTool = deleteSurveyTool() + try { + await deleteTool.handler(context, { surveyId: 'non-existent-id' }) + expect.fail('Should not reach here') + } catch (error) { + expect(error).toBeInstanceOf(Error) + expect((error as Error).message).toContain('Failed to delete survey') + } + }) + }) + + describe('survey-update tool', () => { + const createTool = createSurveyTool() + const updateTool = updateSurveyTool() + const getTool = getSurveyTool() + + it('should update title, description, appearance and questions', async () => { + // Create a survey + const createParams = { + name: `Update Test Survey ${Date.now()}`, + description: 'Original description', + type: 'popover' as const, + questions: [ + { + type: 'open' as const, + question: 'Original question', + }, + ], + appearance: { + backgroundColor: '#ffffff', + textColor: '#000000', + }, + start_date: null, + } + + const createResult = await createTool.handler(context, createParams) + const createdSurvey = parseToolResponse(createResult) + createdResources.surveys.push(createdSurvey.id) + + // Update the survey + const updateParams = { + surveyId: createdSurvey.id, + name: `Updated Survey ${Date.now()}`, + description: 'Updated description with new content', + questions: [ + { + type: 'rating' as const, + question: 'How would you rate our service?', + scale: 10 as const, + display: 'number' as const, + lowerBoundLabel: 'Poor', + upperBoundLabel: 'Excellent', + }, + ], + appearance: { + backgroundColor: '#f0f0f0', + textColor: '#333333', + submitButtonColor: '#007bff', + submitButtonText: 'Submit Feedback', + }, + } + + const updateResult = await updateTool.handler(context, updateParams) + const updateResponse = parseToolResponse(updateResult) + expect(updateResponse.id).toBe(createdSurvey.id) + + // Verify the updates + const getResult = await getTool.handler(context, { surveyId: createdSurvey.id }) + const updatedSurvey = parseToolResponse(getResult) + + expect(updatedSurvey.name).toContain('Updated Survey') + expect(updatedSurvey.description).toBe('Updated description with new content') + expect(updatedSurvey.questions).toHaveLength(1) + expect(updatedSurvey.questions[0].type).toBe('rating') + expect(updatedSurvey.questions[0].scale).toBe(10) + expect(updatedSurvey.appearance.backgroundColor).toBe('#f0f0f0') + expect(updatedSurvey.appearance.submitButtonColor).toBe('#007bff') + }) + + it('should add and remove questions and change question types', async () => { + // Create a survey with one question + const createParams = { + name: `Questions Test Survey ${Date.now()}`, + description: 'Testing question modifications', + type: 'popover' as const, + questions: [ + { + type: 'open' as const, + question: 'What do you think?', + }, + ], + start_date: null, + } + + const createResult = await createTool.handler(context, createParams) + const createdSurvey = parseToolResponse(createResult) + createdResources.surveys.push(createdSurvey.id) + + // Update to add more questions and change types + const updateParams = { + surveyId: createdSurvey.id, + questions: [ + { + type: 'single_choice' as const, + question: 'Which option do you prefer?', + choices: ['Option A', 'Option B', 'Option C', 'Other'], + hasOpenChoice: true, + }, + { + type: 'multiple_choice' as const, + question: 'Select all that apply:', + choices: ['Feature 1', 'Feature 2', 'Feature 3'], + }, + { + type: 'rating' as const, + question: 'Rate your experience', + scale: 5 as const, + display: 'emoji' as const, + }, + ], + } + + const updateResult = await updateTool.handler(context, updateParams) + const updateResponse = parseToolResponse(updateResult) + expect(updateResponse.id).toBe(createdSurvey.id) + + // Verify the question updates + const getResult = await getTool.handler(context, { surveyId: createdSurvey.id }) + const updatedSurvey = parseToolResponse(getResult) + + expect(updatedSurvey.questions).toHaveLength(3) + expect(updatedSurvey.questions[0].type).toBe('single_choice') + expect(updatedSurvey.questions[0].choices).toHaveLength(4) + expect(updatedSurvey.questions[0].hasOpenChoice).toBe(true) + expect(updatedSurvey.questions[1].type).toBe('multiple_choice') + expect(updatedSurvey.questions[2].type).toBe('rating') + expect(updatedSurvey.questions[2].display).toBe('emoji') + }) + + it('should update display conditions (device type, URL matching)', async () => { + // Create a survey + const createParams = { + name: `Conditions Test Survey ${Date.now()}`, + description: 'Testing display conditions', + type: 'popover' as const, + questions: [ + { + type: 'open' as const, + question: 'Feedback question', + }, + ], + start_date: null, + } + + const createResult = await createTool.handler(context, createParams) + const createdSurvey = parseToolResponse(createResult) + createdResources.surveys.push(createdSurvey.id) + + // Update with display conditions + const updateParams = { + surveyId: createdSurvey.id, + conditions: { + url: 'https://example.com/product', + urlMatchType: 'icontains' as const, + deviceTypes: ['Desktop', 'Mobile'] as ('Desktop' | 'Mobile' | 'Tablet')[], + deviceTypesMatchType: 'exact' as const, + }, + } + + const updateResult = await updateTool.handler(context, updateParams) + const updateResponse = parseToolResponse(updateResult) + expect(updateResponse.id).toBe(createdSurvey.id) + + // Verify the conditions + const getResult = await getTool.handler(context, { surveyId: createdSurvey.id }) + const updatedSurvey = parseToolResponse(getResult) + + expect(updatedSurvey.conditions.url).toBe('https://example.com/product') + expect(updatedSurvey.conditions.urlMatchType).toBe('icontains') + expect(updatedSurvey.conditions.deviceTypes).toEqual(['Desktop', 'Mobile']) + }) + + it('should update feature flag conditions', async () => { + // First create a simple feature flag + const flagParams = { + data: { + key: `survey-test-flag-${Date.now()}`, + name: 'Survey Test Flag', + description: 'Test flag for survey conditions', + filters: { + groups: [ + { + properties: [], + rollout_percentage: 100, + }, + ], + }, + active: true, + }, + } + + const projectId = await context.stateManager.getProjectId() + const flagResult = await context.api.featureFlags({ projectId }).create(flagParams) + if (!flagResult.success) { + throw new Error(`Failed to create feature flag: ${flagResult.error.message}`) + } + const createdFlag = flagResult.data + createdResources.featureFlags.push(createdFlag.id) + + // Create a survey + const createParams = { + name: `Flag Conditions Test Survey ${Date.now()}`, + description: 'Testing feature flag conditions', + type: 'popover' as const, + questions: [ + { + type: 'open' as const, + question: 'Flag-based question', + }, + ], + start_date: null, + } + + const createResult = await createTool.handler(context, createParams) + const createdSurvey = parseToolResponse(createResult) + createdResources.surveys.push(createdSurvey.id) + + // Update with feature flag conditions + const updateParams = { + surveyId: createdSurvey.id, + linked_flag_id: createdFlag.id, + } + + const updateResult = await updateTool.handler(context, updateParams) + const updateResponse = parseToolResponse(updateResult) + expect(updateResponse.id).toBe(createdSurvey.id) + + // Get the updated survey to verify the feature flag conditions + const getResult = await getTool.handler(context, { surveyId: createdSurvey.id }) + const updatedSurvey = parseToolResponse(getResult) + + // Check if the feature flag was successfully linked + if (updatedSurvey.linked_flag_id) { + expect(updatedSurvey.linked_flag_id).toBe(createdFlag.id) + } else { + // If linked_flag_id is not set, the feature flag linking might not be supported + // or there might be an issue with the update tool + console.warn( + 'Feature flag linking appears to not be working - linked_flag_id is undefined' + ) + expect(updatedSurvey.id).toBe(createdSurvey.id) // At least verify the survey exists + } + }) + + it('should update person properties targeting', async () => { + // Create a survey + const createParams = { + name: `Properties Test Survey ${Date.now()}`, + description: 'Testing person properties targeting', + type: 'popover' as const, + questions: [ + { + type: 'open' as const, + question: 'Targeted question', + }, + ], + start_date: null, + } + + const createResult = await createTool.handler(context, createParams) + const createdSurvey = parseToolResponse(createResult) + createdResources.surveys.push(createdSurvey.id) + + // Update with person properties targeting + const updateParams = { + surveyId: createdSurvey.id, + targeting_flag_filters: { + groups: [ + { + properties: [ + { + type: 'person', + key: 'email', + value: '@company.com', + operator: 'icontains' as const, + }, + { + type: 'person', + key: 'plan', + value: ['premium', 'enterprise'], + operator: 'in' as const, + }, + ], + rollout_percentage: 75, + }, + ], + }, + } + + const updateResult = await updateTool.handler(context, updateParams) + const updateResponse = parseToolResponse(updateResult) + expect(updateResponse.id).toBe(createdSurvey.id) + + // Verify the targeting + const getResult = await getTool.handler(context, { surveyId: createdSurvey.id }) + const updatedSurvey = parseToolResponse(getResult) + + expect(updatedSurvey.targeting_flag).toBeDefined() + expect(updatedSurvey.targeting_flag.filters.groups).toHaveLength(1) + expect(updatedSurvey.targeting_flag.filters.groups[0].properties).toHaveLength(2) + expect(updatedSurvey.targeting_flag.filters.groups[0].rollout_percentage).toBe(75) + }) + + it('should update survey scheduling', async () => { + // Create a survey + const createParams = { + name: `Scheduling Test Survey ${Date.now()}`, + description: 'Testing survey scheduling', + type: 'popover' as const, + questions: [ + { + type: 'open' as const, + question: 'Scheduled question', + }, + ], + start_date: null, + } + + const createResult = await createTool.handler(context, createParams) + const createdSurvey = parseToolResponse(createResult) + createdResources.surveys.push(createdSurvey.id) + + // Update with scheduling + const futureDate = new Date() + futureDate.setDate(futureDate.getDate() + 7) // 7 days from now + + const updateParams = { + surveyId: createdSurvey.id, + schedule: 'recurring' as const, + iteration_count: 3, + iteration_frequency_days: 7, + responses_limit: 100, + start_date: futureDate.toISOString(), + } + + const updateResult = await updateTool.handler(context, updateParams) + const updateResponse = parseToolResponse(updateResult) + expect(updateResponse.id).toBe(createdSurvey.id) + + // Verify the scheduling + const getResult = await getTool.handler(context, { surveyId: createdSurvey.id }) + const updatedSurvey = parseToolResponse(getResult) + + expect(updatedSurvey.schedule).toBe('recurring') + expect(updatedSurvey.iteration_count).toBe(3) + expect(updatedSurvey.iteration_frequency_days).toBe(7) + expect(updatedSurvey.responses_limit).toBe(100) + expect(updatedSurvey.start_date).toBeDefined() + }) + }) + + describe('Survey workflow', () => { + it('should support full CRUD workflow', async () => { + const createTool = createSurveyTool() + const updateTool = updateSurveyTool() + const getTool = getSurveyTool() + const deleteTool = deleteSurveyTool() + + // Create + const createParams = { + name: `Workflow Survey ${Date.now()}`, + description: 'Testing full workflow', + type: 'popover' as const, + questions: [ + { + type: 'open' as const, + question: 'Initial question', + }, + ], + start_date: null, + } + + const createResult = await createTool.handler(context, createParams) + const createdSurvey = parseToolResponse(createResult) + createdResources.surveys.push(createdSurvey.id) + + // Read + const getResult = await getTool.handler(context, { surveyId: createdSurvey.id }) + const retrievedSurvey = parseToolResponse(getResult) + expect(retrievedSurvey.id).toBe(createdSurvey.id) + expect(retrievedSurvey.name).toBe(createParams.name) + + // Update + const updateParams = { + surveyId: createdSurvey.id, + name: `Updated Workflow Survey ${Date.now()}`, + description: 'Updated description', + questions: [ + { + type: 'rating' as const, + question: 'Updated question', + scale: 5 as const, + display: 'number' as const, + }, + ], + } + + const updateResult = await updateTool.handler(context, updateParams) + const updateResponse = parseToolResponse(updateResult) + expect(updateResponse.id).toBeDefined() + + // Verify update by getting the survey + const getUpdatedResult = await getTool.handler(context, { surveyId: createdSurvey.id }) + const updatedSurvey = parseToolResponse(getUpdatedResult) + expect(updatedSurvey.name).toContain('Updated Workflow Survey') + expect(updatedSurvey.questions[0]?.type).toBe('rating') + + // Delete + const deleteResult = await deleteTool.handler(context, { surveyId: createdSurvey.id }) + const deleteResponse = parseToolResponse(deleteResult) + expect(deleteResponse.success).toBe(true) + expect(deleteResponse.message).toContain('archived successfully') + + // Verify deletion (client soft deletes, so survey is archived) + const finalGetResult = await getTool.handler(context, { surveyId: createdSurvey.id }) + const finalSurvey = parseToolResponse(finalGetResult) + expect(finalSurvey.archived).toBe(true) + }) + + it('should handle complex survey with all features', async () => { + const createTool = createSurveyTool() + const getTool = getSurveyTool() + const updateTool = updateSurveyTool() + const statsTool = getSurveyStatsTool() + const deleteTool = deleteSurveyTool() + + // Create complex survey + const createParams = { + name: `Complex Feature Survey ${Date.now()}`, + description: 'Survey showcasing all features', + type: 'popover' as const, + questions: [ + { + type: 'rating' as const, + question: 'How likely are you to recommend us?', + scale: 10 as const, + display: 'number' as const, + lowerBoundLabel: 'Not likely', + upperBoundLabel: 'Very likely', + branching: { + type: 'response_based' as const, + responseValues: { + detractors: 2, + promoters: 'end' as const, + }, + }, + }, + { + type: 'open' as const, + question: 'What can we improve?', + }, + { + type: 'open' as const, + question: 'What do you love about us?', + }, + ], + targeting_flag_filters: { + groups: [ + { + properties: [ + { + key: 'email', + value: ['test@example.com'], + operator: 'in' as const, + type: 'person', + }, + ], + rollout_percentage: 50, + }, + ], + }, + responses_limit: 100, + start_date: null, + } + + const createResult = await createTool.handler(context, createParams) + const createResponse = parseToolResponse(createResult) + expect(createResponse.id).toBeDefined() + createdResources.surveys.push(createResponse.id) + + // Verify creation by getting the survey + const getResult = await getTool.handler(context, { surveyId: createResponse.id }) + const createdSurvey = parseToolResponse(getResult) + + expect(createdSurvey.id).toBe(createResponse.id) + expect(createdSurvey.questions).toHaveLength(3) + expect(createdSurvey.questions[0]?.branching).toBeDefined() + expect(createdSurvey.targeting_flag).toBeDefined() + expect(createdSurvey.responses_limit).toBe(100) + + // Update survey + const updateResult = await updateTool.handler(context, { + surveyId: createResponse.id, + responses_limit: 200, + }) + const updateResponse = parseToolResponse(updateResult) + expect(updateResponse.id).toBeDefined() + + // Verify update by getting the survey again + const getUpdatedResult = await getTool.handler(context, { + surveyId: createResponse.id, + }) + const updatedSurvey = parseToolResponse(getUpdatedResult) + expect(updatedSurvey.responses_limit).toBe(200) + + // Get stats + const statsResult = await statsTool.handler(context, { survey_id: createdSurvey.id }) + const stats = parseToolResponse(statsResult) + expect(stats).toBeDefined() + + // Clean up + const deleteResult = await deleteTool.handler(context, { surveyId: createdSurvey.id }) + const deleteResponse = parseToolResponse(deleteResult) + expect(deleteResponse.success).toBe(true) + }) + }) +}) diff --git a/products/mcp/typescript/tests/unit/SessionManager.test.ts b/products/mcp/typescript/tests/unit/SessionManager.test.ts new file mode 100644 index 0000000000..26a057c856 --- /dev/null +++ b/products/mcp/typescript/tests/unit/SessionManager.test.ts @@ -0,0 +1,215 @@ +import { SessionManager } from '@/lib/utils/SessionManager' +import type { ScopedCache } from '@/lib/utils/cache/ScopedCache' +import type { State } from '@/tools' +import { beforeEach, describe, expect, it, vi } from 'vitest' + +vi.mock('uuid', () => ({ + v7: vi.fn(() => 'test-uuid-12345'), +})) + +describe('SessionManager', () => { + let mockCache: ScopedCache + let sessionManager: SessionManager + + beforeEach(() => { + mockCache = { + get: vi.fn(), + set: vi.fn(), + delete: vi.fn(), + clear: vi.fn(), + has: vi.fn(), + values: vi.fn(), + entries: vi.fn(), + keys: vi.fn(), + } as unknown as ScopedCache + + sessionManager = new SessionManager(mockCache) + vi.clearAllMocks() + }) + + describe('getSessionUuid', () => { + it('should return existing session uuid if it exists', async () => { + const sessionId = 'test-session-123' + const existingUuid = 'existing-uuid-456' + + ;(mockCache.get as any).mockResolvedValue({ uuid: existingUuid }) + + const result = await sessionManager.getSessionUuid(sessionId) + + expect(result).toBe(existingUuid) + expect(mockCache.get).toHaveBeenCalledWith('session:test-session-123') + expect(mockCache.set).not.toHaveBeenCalled() + }) + + it('should create and return new session uuid if none exists', async () => { + const sessionId = 'test-session-123' + + ;(mockCache.get as any).mockResolvedValue(null) + + const result = await sessionManager.getSessionUuid(sessionId) + + expect(result).toBe('test-uuid-12345') + expect(mockCache.get).toHaveBeenCalledWith('session:test-session-123') + expect(mockCache.set).toHaveBeenCalledWith('session:test-session-123', { + uuid: 'test-uuid-12345', + }) + }) + + it('should create new uuid if session exists but has no uuid', async () => { + const sessionId = 'test-session-123' + + ;(mockCache.get as any).mockResolvedValue({}) + + const result = await sessionManager.getSessionUuid(sessionId) + + expect(result).toBe('test-uuid-12345') + expect(mockCache.set).toHaveBeenCalledWith('session:test-session-123', { + uuid: 'test-uuid-12345', + }) + }) + }) + + describe('hasSession', () => { + it('should return true if session exists with uuid', async () => { + const sessionId = 'test-session-123' + + ;(mockCache.get as any).mockResolvedValue({ uuid: 'some-uuid' }) + + const result = await sessionManager.hasSession(sessionId) + + expect(result).toBe(true) + expect(mockCache.get).toHaveBeenCalledWith('session:test-session-123') + }) + + it('should return false if session does not exist', async () => { + const sessionId = 'test-session-123' + + ;(mockCache.get as any).mockResolvedValue(null) + + const result = await sessionManager.hasSession(sessionId) + + expect(result).toBe(false) + expect(mockCache.get).toHaveBeenCalledWith('session:test-session-123') + }) + + it('should return false if session exists but has no uuid', async () => { + const sessionId = 'test-session-123' + + ;(mockCache.get as any).mockResolvedValue({}) + + const result = await sessionManager.hasSession(sessionId) + + expect(result).toBe(false) + }) + + it('should return false if session exists with undefined uuid', async () => { + const sessionId = 'test-session-123' + + ;(mockCache.get as any).mockResolvedValue({ uuid: undefined }) + + const result = await sessionManager.hasSession(sessionId) + + expect(result).toBe(false) + }) + }) + + describe('removeSession', () => { + it('should delete session from cache', async () => { + const sessionId = 'test-session-123' + + await sessionManager.removeSession(sessionId) + + expect(mockCache.delete).toHaveBeenCalledWith('session:test-session-123') + }) + + it('should handle removal of non-existent session gracefully', async () => { + const sessionId = 'non-existent-session' + + ;(mockCache.delete as any).mockResolvedValue(undefined) + + await sessionManager.removeSession(sessionId) + + expect(mockCache.delete).toHaveBeenCalledWith('session:non-existent-session') + }) + }) + + describe('clearAllSessions', () => { + it('should clear all sessions from cache', async () => { + await sessionManager.clearAllSessions() + + expect(mockCache.clear).toHaveBeenCalled() + }) + }) + + describe('_getKey', () => { + it('should format session key correctly', async () => { + const sessionId = 'test-session' + + const key = await sessionManager._getKey(sessionId) + + expect(key).toBe('session:test-session') + }) + + it('should handle special characters in session id', async () => { + const sessionId = 'test-session!@#$%^&*()' + + const key = await sessionManager._getKey(sessionId) + + expect(key).toBe('session:test-session!@#$%^&*()') + }) + + it('should handle empty session id', async () => { + const sessionId = '' + + const key = await sessionManager._getKey(sessionId) + + expect(key).toBe('session:') + }) + }) + + describe('integration scenarios', () => { + it('should handle multiple sequential operations', async () => { + const sessionId = 'test-session' + + ;(mockCache.get as any).mockResolvedValueOnce(null) + ;(mockCache.get as any).mockResolvedValueOnce({ uuid: 'test-uuid-12345' }) + ;(mockCache.get as any).mockResolvedValueOnce(null) + + const uuid1 = await sessionManager.getSessionUuid(sessionId) + expect(uuid1).toBe('test-uuid-12345') + expect(mockCache.set).toHaveBeenCalled() + + const hasSession = await sessionManager.hasSession(sessionId) + expect(hasSession).toBe(true) + + await sessionManager.removeSession(sessionId) + expect(mockCache.delete).toHaveBeenCalled() + + const hasSessionAfterRemove = await sessionManager.hasSession(sessionId) + expect(hasSessionAfterRemove).toBe(false) + }) + + it('should handle concurrent sessions', async () => { + const sessionId1 = 'session-1' + const sessionId2 = 'session-2' + + ;(mockCache.get as any).mockImplementation((key: string) => { + if (key === 'session:session-1') { + return Promise.resolve({ uuid: 'uuid-1' }) + } + if (key === 'session:session-2') { + return Promise.resolve({ uuid: 'uuid-2' }) + } + return Promise.resolve(null) + }) + + const [uuid1, uuid2] = await Promise.all([ + sessionManager.getSessionUuid(sessionId1), + sessionManager.getSessionUuid(sessionId2), + ]) + + expect(uuid1).toBe('uuid-1') + expect(uuid2).toBe('uuid-2') + }) + }) +}) diff --git a/products/mcp/typescript/tests/unit/StateManager.test.ts b/products/mcp/typescript/tests/unit/StateManager.test.ts new file mode 100644 index 0000000000..67d6d110ca --- /dev/null +++ b/products/mcp/typescript/tests/unit/StateManager.test.ts @@ -0,0 +1,268 @@ +import type { ApiClient } from '@/api/client' +import { StateManager } from '@/lib/utils/StateManager' +import { MemoryCache } from '@/lib/utils/cache/MemoryCache' +import type { ApiRedactedPersonalApiKey, ApiUser } from '@/schema/api' +import type { State } from '@/tools/types' +import { beforeEach, describe, expect, it, vi } from 'vitest' + +describe('StateManager', () => { + let stateManager: StateManager + let cache: MemoryCache + const mockUser: ApiUser = { + distinct_id: 'distinct-123', + organizations: [{ id: 'org-1' }, { id: 'org-2' }], + team: { id: 456, organization: 'org-1' }, + organization: { id: 'org-1' }, + } + + const mockApiKey: ApiRedactedPersonalApiKey = { + scopes: ['user:read', 'insight:write'], + scoped_organizations: [], + scoped_teams: [], + } + + beforeEach(async () => { + cache = new MemoryCache('test-user') + await cache.clear() + stateManager = new StateManager(cache, {} as ApiClient) + }) + + describe('getUser', () => { + it('should fetch and cache user on first call', async () => { + const fetchUserSpy = vi + .spyOn(stateManager as any, '_fetchUser') + .mockResolvedValue(mockUser) + + const result = await stateManager.getUser() + + expect(result).toEqual(mockUser) + expect(fetchUserSpy).toHaveBeenCalledOnce() + }) + + it('should return cached user on subsequent calls', async () => { + const fetchUserSpy = vi + .spyOn(stateManager as any, '_fetchUser') + .mockResolvedValue(mockUser) + + await stateManager.getUser() + const result = await stateManager.getUser() + + expect(result).toEqual(mockUser) + expect(fetchUserSpy).toHaveBeenCalledOnce() + }) + + it('should throw error when user fetch fails', async () => { + const error = new Error('API error') + vi.spyOn(stateManager as any, '_fetchUser').mockRejectedValue(error) + + await expect(stateManager.getUser()).rejects.toThrow('API error') + }) + }) + + describe('getDistinctId', () => { + it('should get distinct ID from cache if available', async () => { + await cache.set('distinctId', 'cached-distinct-id') + + const result = await stateManager.getDistinctId() + + expect(result).toBe('cached-distinct-id') + }) + + it('should fetch user and cache distinct ID if not in cache', async () => { + const getUserSpy = vi.spyOn(stateManager, 'getUser').mockResolvedValue(mockUser) + + const result = await stateManager.getDistinctId() + + expect(result).toBe('distinct-123') + expect(await cache.get('distinctId')).toBe('distinct-123') + expect(getUserSpy).toHaveBeenCalledOnce() + }) + }) + + describe('setDefaultOrganizationAndProject', () => { + it('should handle team-scoped API key with single team', async () => { + const teamScopedApiKey = { + ...mockApiKey, + scoped_teams: [456], + } + + vi.spyOn(stateManager, 'getApiKey').mockResolvedValue(teamScopedApiKey) + vi.spyOn(stateManager, 'getUser').mockResolvedValue(mockUser) + + const result = await stateManager.setDefaultOrganizationAndProject() + + expect(result.projectId).toBe(456) + expect(result.organizationId).toBeUndefined() + }) + + it('should throw error for team-scoped API key with multiple teams', async () => { + const multiTeamApiKey = { + ...mockApiKey, + scoped_teams: [123, 456], + } + + vi.spyOn(stateManager, 'getApiKey').mockResolvedValue(multiTeamApiKey) + vi.spyOn(stateManager, 'getUser').mockResolvedValue(mockUser) + + await expect(stateManager.setDefaultOrganizationAndProject()).rejects.toThrow( + 'API key has access to multiple projects' + ) + }) + + it("should use user's active org and team when no scoped restrictions", async () => { + vi.spyOn(stateManager, 'getApiKey').mockResolvedValue(mockApiKey) + vi.spyOn(stateManager, 'getUser').mockResolvedValue(mockUser) + + const result = await stateManager.setDefaultOrganizationAndProject() + + expect(result.organizationId).toBe('org-1') + expect(result.projectId).toBe(456) + expect(await cache.get('orgId')).toBe('org-1') + expect(await cache.get('projectId')).toBe('456') + }) + + it("should use user's active org and team when org is in scoped list", async () => { + const scopedOrgApiKey = { + ...mockApiKey, + scoped_organizations: ['org-2', 'org-1'], + } + + vi.spyOn(stateManager, 'getApiKey').mockResolvedValue(scopedOrgApiKey) + vi.spyOn(stateManager, 'getUser').mockResolvedValue(mockUser) + + const result = await stateManager.setDefaultOrganizationAndProject() + + expect(result.organizationId).toBe('org-1') + expect(result.projectId).toBe(456) + }) + + it("should use first scoped org when user's active org not in scoped list", async () => { + const scopedOrgApiKey = { + ...mockApiKey, + scoped_organizations: ['org-3'], + } + + const mockApi = stateManager as any + vi.spyOn(stateManager, 'getApiKey').mockResolvedValue(scopedOrgApiKey) + vi.spyOn(stateManager, 'getUser').mockResolvedValue(mockUser) + + // Mock the API client organization projects list call + mockApi._api = { + organizations: () => ({ + projects: () => ({ + list: vi.fn().mockResolvedValue({ + success: true, + data: [789], + }), + }), + }), + } + + const result = await stateManager.setDefaultOrganizationAndProject() + + expect(result.organizationId).toBe('org-3') + expect(result.projectId).toBe(789) + }) + + it('should throw error when no projects available for scoped org', async () => { + const scopedOrgApiKey = { + ...mockApiKey, + scoped_organizations: ['org-3'], + } + + const mockApi = stateManager as any + vi.spyOn(stateManager, 'getApiKey').mockResolvedValue(scopedOrgApiKey) + vi.spyOn(stateManager, 'getUser').mockResolvedValue(mockUser) + + // Mock the API client organization projects list call + mockApi._api = { + organizations: () => ({ + projects: () => ({ + list: vi.fn().mockResolvedValue({ + success: true, + data: [], + }), + }), + }), + } + + await expect(stateManager.setDefaultOrganizationAndProject()).rejects.toThrow( + 'API key does not have access to any projects' + ) + }) + + it('should throw error when projects fetch fails', async () => { + const scopedOrgApiKey = { + ...mockApiKey, + scoped_organizations: ['org-3'], + } + + const mockApi = stateManager as any + vi.spyOn(stateManager, 'getApiKey').mockResolvedValue(scopedOrgApiKey) + vi.spyOn(stateManager, 'getUser').mockResolvedValue(mockUser) + + // Mock the API client organization projects list call + const mockError = new Error('Projects fetch failed') + mockApi._api = { + organizations: () => ({ + projects: () => ({ + list: vi.fn().mockResolvedValue({ + success: false, + error: mockError, + }), + }), + }), + } + + await expect(stateManager.setDefaultOrganizationAndProject()).rejects.toThrow(mockError) + }) + }) + + describe('getOrgID', () => { + it('should return cached orgId if available', async () => { + await cache.set('orgId', 'cached-org-id') + + const result = await stateManager.getOrgID() + + expect(result).toBe('cached-org-id') + }) + + it('should call setDefaultOrganizationAndProject when not cached', async () => { + const spy = vi + .spyOn(stateManager, 'setDefaultOrganizationAndProject') + .mockResolvedValue({ + organizationId: 'default-org', + projectId: 123, + }) + + const result = await stateManager.getOrgID() + + expect(result).toBe('default-org') + expect(spy).toHaveBeenCalledOnce() + }) + }) + + describe('getProjectId', () => { + it('should return cached projectId if available', async () => { + await cache.set('projectId', 'cached-project-id') + + const result = await stateManager.getProjectId() + + expect(result).toBe('cached-project-id') + }) + + it('should call setDefaultOrganizationAndProject when not cached', async () => { + const spy = vi + .spyOn(stateManager, 'setDefaultOrganizationAndProject') + .mockResolvedValue({ + organizationId: 'default-org', + projectId: 789, + }) + + const result = await stateManager.getProjectId() + + expect(result).toBe('789') + expect(spy).toHaveBeenCalledOnce() + }) + }) +}) diff --git a/products/mcp/typescript/tests/unit/api-client.test.ts b/products/mcp/typescript/tests/unit/api-client.test.ts new file mode 100644 index 0000000000..ea5597b54d --- /dev/null +++ b/products/mcp/typescript/tests/unit/api-client.test.ts @@ -0,0 +1,37 @@ +import { ApiClient } from '@/api/client' +import { describe, expect, it } from 'vitest' + +describe('ApiClient', () => { + it('should create ApiClient with required config', () => { + const client = new ApiClient({ + apiToken: 'test-token', + baseUrl: 'https://example.com', + }) + + expect(client).toBeInstanceOf(ApiClient) + }) + + it('should use custom baseUrl when provided', () => { + const customUrl = 'https://custom.example.com' + const client = new ApiClient({ + apiToken: 'test-token', + baseUrl: customUrl, + }) + + const baseUrl = (client as any).baseUrl + expect(baseUrl).toBe(customUrl) + }) + + it('should build correct headers', () => { + const client = new ApiClient({ + apiToken: 'test-token-123', + baseUrl: 'https://example.com', + }) + + const headers = (client as any).buildHeaders() + expect(headers).toEqual({ + Authorization: 'Bearer test-token-123', + 'Content-Type': 'application/json', + }) + }) +}) diff --git a/products/mcp/typescript/tests/unit/tool-filtering.test.ts b/products/mcp/typescript/tests/unit/tool-filtering.test.ts new file mode 100644 index 0000000000..b38686a1f8 --- /dev/null +++ b/products/mcp/typescript/tests/unit/tool-filtering.test.ts @@ -0,0 +1,192 @@ +import { SessionManager } from '@/lib/utils/SessionManager' +import { getToolsFromContext } from '@/tools' +import { getToolsForFeatures } from '@/tools/toolDefinitions' +import type { Context } from '@/tools/types' +import { describe, expect, it } from 'vitest' + +describe('Tool Filtering - Features', () => { + const featureTests = [ + { + features: undefined, + description: 'all tools when no features specified', + expectedTools: [ + 'feature-flag-get-definition', + 'dashboard-create', + 'insights-get-all', + 'organizations-get', + ], + }, + { + features: [], + description: 'all tools when empty array passed', + expectedTools: ['feature-flag-get-definition', 'dashboard-create'], + }, + { + features: ['flags'], + description: 'flag tools only', + expectedTools: [ + 'feature-flag-get-definition', + 'feature-flag-get-all', + 'create-feature-flag', + 'update-feature-flag', + 'delete-feature-flag', + ], + }, + { + features: ['dashboards', 'insights'], + description: 'dashboard and insight tools', + expectedTools: [ + 'dashboard-create', + 'dashboards-get-all', + 'add-insight-to-dashboard', + 'insights-get-all', + 'query-generate-hogql-from-question', + 'query-run', + 'insight-create-from-query', + ], + }, + { + features: ['workspace'], + description: 'workspace tools', + expectedTools: [ + 'organizations-get', + 'switch-organization', + 'projects-get', + 'switch-project', + 'property-definitions', + ], + }, + { + features: ['error-tracking'], + description: 'error tracking tools', + expectedTools: ['list-errors', 'error-details'], + }, + { + features: ['experiments'], + description: 'experiment tools', + expectedTools: ['experiment-get-all'], + }, + { + features: ['llm-analytics'], + description: 'LLM analytics tools', + expectedTools: ['get-llm-total-costs-for-project'], + }, + { + features: ['docs'], + description: 'documentation tools', + expectedTools: ['docs-search'], + }, + { + features: ['invalid', 'flags'], + description: 'valid tools when mixed with invalid features', + expectedTools: ['feature-flag-get-definition'], + }, + { + features: ['invalid', 'unknown'], + description: 'empty array for only invalid features', + expectedTools: [], + }, + ] + + describe('getToolsForFeatures', () => { + it.each(featureTests)('should return $description', ({ features, expectedTools }) => { + const tools = getToolsForFeatures(features) + + for (const tool of expectedTools) { + expect(tools).toContain(tool) + } + }) + }) +}) + +const createMockContext = (scopes: string[]): Context => ({ + api: {} as any, + cache: {} as any, + env: { INKEEP_API_KEY: undefined }, + stateManager: { + getApiKey: async () => ({ scopes }), + } as any, + sessionManager: new SessionManager({} as any), +}) + +describe('Tool Filtering - API Scopes', () => { + it('should return all tools when user has * scope', async () => { + const context = createMockContext(['*']) + const tools = await getToolsFromContext(context) + const toolNames = tools.map((t) => t.name) + + expect(toolNames).toContain('dashboard-create') + expect(toolNames).toContain('create-feature-flag') + expect(toolNames).toContain('insight-create-from-query') + expect(toolNames.length).toBeGreaterThan(25) + }) + + it('should only return dashboard tools when user has dashboard scopes', async () => { + const context = createMockContext(['dashboard:read', 'dashboard:write']) + const tools = await getToolsFromContext(context) + const toolNames = tools.map((t) => t.name) + + expect(toolNames).toContain('dashboard-create') + expect(toolNames).toContain('dashboard-get') + expect(toolNames).toContain('dashboards-get-all') + expect(toolNames).toContain('add-insight-to-dashboard') + + expect(toolNames).not.toContain('create-feature-flag') + expect(toolNames).not.toContain('organizations-get') + }) + + it('should include read tools when user has write scope', async () => { + const context = createMockContext(['feature_flag:write']) + const tools = await getToolsFromContext(context) + const toolNames = tools.map((t) => t.name) + + expect(toolNames).toContain('create-feature-flag') + expect(toolNames).toContain('feature-flag-get-all') + expect(toolNames).toContain('feature-flag-get-definition') + + expect(toolNames).not.toContain('dashboard-create') + }) + + it('should only return read tools when user has read scope', async () => { + const context = createMockContext(['insight:read']) + const tools = await getToolsFromContext(context) + const toolNames = tools.map((t) => t.name) + + expect(toolNames).toContain('insights-get-all') + expect(toolNames).toContain('insight-get') + + expect(toolNames).not.toContain('insight-create-from-query') + expect(toolNames).not.toContain('dashboard-create') + }) + + it('should return multiple scope tools when user has multiple scopes', async () => { + const context = createMockContext([ + 'dashboard:read', + 'feature_flag:write', + 'organization:read', + ]) + const tools = await getToolsFromContext(context) + const toolNames = tools.map((t) => t.name) + + expect(toolNames).toContain('dashboard-get') + expect(toolNames).toContain('create-feature-flag') + expect(toolNames).toContain('organization-details-get') + + expect(toolNames).not.toContain('dashboard-create') + expect(toolNames).not.toContain('insight-create-from-query') + }) + + it('should return empty array when user has no matching scopes', async () => { + const context = createMockContext(['some:unknown']) + const tools = await getToolsFromContext(context) + + expect(tools).toHaveLength(0) + }) + + it('should return empty array when user has empty scopes', async () => { + const context = createMockContext([]) + const tools = await getToolsFromContext(context) + + expect(tools).toHaveLength(0) + }) +}) diff --git a/products/mcp/typescript/tests/unit/url-routing.test.ts b/products/mcp/typescript/tests/unit/url-routing.test.ts new file mode 100644 index 0000000000..b5748322e5 --- /dev/null +++ b/products/mcp/typescript/tests/unit/url-routing.test.ts @@ -0,0 +1,59 @@ +import { describe, expect, it } from 'vitest' + +describe('URL Routing', () => { + const testCases = [ + { path: '/mcp', params: '', expected: { path: '/mcp', features: undefined } }, + { + path: '/mcp', + params: '?features=dashboards', + expected: { path: '/mcp', features: ['dashboards'] }, + }, + { + path: '/mcp', + params: '?features=dashboards,insights', + expected: { path: '/mcp', features: ['dashboards', 'insights'] }, + }, + { path: '/sse', params: '', expected: { path: '/sse', features: undefined } }, + { + path: '/sse', + params: '?features=flags,org', + expected: { path: '/sse', features: ['flags', 'org'] }, + }, + { + path: '/sse/message', + params: '', + expected: { path: '/sse/message', features: undefined }, + }, + { + path: '/sse/message', + params: '?features=flags', + expected: { path: '/sse/message', features: ['flags'] }, + }, + ] + + describe('Query parameter parsing', () => { + it.each(testCases)('should parse $path$params correctly', ({ path, params, expected }) => { + const url = new URL(`https://example.com${path}${params}`) + + expect(url.pathname).toBe(expected.path) + + const featuresParam = url.searchParams.get('features') + const features = featuresParam ? featuresParam.split(',').filter(Boolean) : undefined + expect(features).toEqual(expected.features) + }) + }) + + describe('Features string parsing', () => { + const featureTests = [ + { input: 'dashboards,insights,flags', expected: ['dashboards', 'insights', 'flags'] }, + { input: 'dashboards', expected: ['dashboards'] }, + { input: 'dashboards,,insights,', expected: ['dashboards', 'insights'] }, + { input: '', expected: [] }, + ] + + it.each(featureTests)("should parse '$input' as $expected", ({ input, expected }) => { + const features = input.split(',').filter(Boolean) + expect(features).toEqual(expected) + }) + }) +}) diff --git a/products/mcp/typescript/tsconfig.json b/products/mcp/typescript/tsconfig.json new file mode 100644 index 0000000000..2bff557169 --- /dev/null +++ b/products/mcp/typescript/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "es2021", + "lib": ["es2021"], + "jsx": "react-jsx", + "module": "es2022", + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "allowJs": true, + "checkJs": false, + "noEmit": true, + "isolatedModules": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "skipLibCheck": true, + "types": ["node", "./worker-configuration.d.ts"], + "baseUrl": ".", + "paths": { + "@/*": ["src/*", "tests/*"] + } + }, + "include": ["src/**/*.ts", "scripts/**/*.ts", "tests/**/*.ts", "worker-configuration.d.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/products/mcp/typescript/tsup.config.ts b/products/mcp/typescript/tsup.config.ts new file mode 100644 index 0000000000..1d64a2c5e4 --- /dev/null +++ b/products/mcp/typescript/tsup.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from 'tsup' + +export default defineConfig({ + entry: { + index: 'src/index.ts', + tools: 'src/tools/index.ts', + 'ai-sdk': 'src/integrations/ai-sdk/index.ts', + langchain: 'src/integrations/langchain/index.ts', + }, + format: ['cjs', 'esm'], + dts: true, + clean: true, + splitting: false, + treeshake: true, +}) diff --git a/products/mcp/typescript/vitest.config.mts b/products/mcp/typescript/vitest.config.mts new file mode 100644 index 0000000000..3dfb12e02f --- /dev/null +++ b/products/mcp/typescript/vitest.config.mts @@ -0,0 +1,14 @@ +import tsconfigPaths from 'vite-tsconfig-paths' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + plugins: [tsconfigPaths({ root: '.' })], + test: { + globals: true, + environment: 'node', + testTimeout: 10000, + setupFiles: ['tests/setup.ts'], + include: ['tests/**/*.test.ts'], + exclude: ['node_modules/**', 'dist/**', 'tests/**/*.integration.test.ts'], + }, +}) diff --git a/products/mcp/typescript/vitest.integration.config.mts b/products/mcp/typescript/vitest.integration.config.mts new file mode 100644 index 0000000000..ddc9d2835b --- /dev/null +++ b/products/mcp/typescript/vitest.integration.config.mts @@ -0,0 +1,14 @@ +import tsconfigPaths from 'vite-tsconfig-paths' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + plugins: [tsconfigPaths({ root: '.' })], + test: { + globals: true, + environment: 'node', + testTimeout: 30000, + setupFiles: ['tests/setup.ts'], + include: ['tests/**/*.integration.test.ts'], + exclude: ['node_modules/**', 'dist/**'], + }, +}) diff --git a/products/mcp/typescript/worker-configuration.d.ts b/products/mcp/typescript/worker-configuration.d.ts new file mode 100644 index 0000000000..ef3418053c --- /dev/null +++ b/products/mcp/typescript/worker-configuration.d.ts @@ -0,0 +1,6581 @@ +/* eslint-disable */ +// Generated by Wrangler by running `wrangler types` (hash: 96c2de0d6730863f9401b3bcb7bbc669) +// Runtime types generated with workerd@1.20250508.0 2025-03-10 nodejs_compat +declare namespace Cloudflare { + interface Env { + INKEEP_API_KEY: string + POSTHOG_BASE_URL: string + MCP_OBJECT: DurableObjectNamespace + } +} +interface Env extends Cloudflare.Env {} + +// Begin runtime types +/*! ***************************************************************************** +Copyright (c) Cloudflare. All rights reserved. +Copyright (c) Microsoft Corporation. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0 +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */ +/* eslint-disable */ +// noinspection JSUnusedGlobalSymbols +declare var onmessage: never +/** + * An abnormal event (called an exception) which occurs as a result of calling a method or accessing a property of a web API. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException) + */ +declare class DOMException extends Error { + constructor(message?: string, name?: string) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException/message) */ + readonly message: string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException/name) */ + readonly name: string + /** + * @deprecated + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException/code) + */ + readonly code: number + static readonly INDEX_SIZE_ERR: number + static readonly DOMSTRING_SIZE_ERR: number + static readonly HIERARCHY_REQUEST_ERR: number + static readonly WRONG_DOCUMENT_ERR: number + static readonly INVALID_CHARACTER_ERR: number + static readonly NO_DATA_ALLOWED_ERR: number + static readonly NO_MODIFICATION_ALLOWED_ERR: number + static readonly NOT_FOUND_ERR: number + static readonly NOT_SUPPORTED_ERR: number + static readonly INUSE_ATTRIBUTE_ERR: number + static readonly INVALID_STATE_ERR: number + static readonly SYNTAX_ERR: number + static readonly INVALID_MODIFICATION_ERR: number + static readonly NAMESPACE_ERR: number + static readonly INVALID_ACCESS_ERR: number + static readonly VALIDATION_ERR: number + static readonly TYPE_MISMATCH_ERR: number + static readonly SECURITY_ERR: number + static readonly NETWORK_ERR: number + static readonly ABORT_ERR: number + static readonly URL_MISMATCH_ERR: number + static readonly QUOTA_EXCEEDED_ERR: number + static readonly TIMEOUT_ERR: number + static readonly INVALID_NODE_TYPE_ERR: number + static readonly DATA_CLONE_ERR: number + get stack(): any + set stack(value: any) +} +type WorkerGlobalScopeEventMap = { + fetch: FetchEvent + scheduled: ScheduledEvent + queue: QueueEvent + unhandledrejection: PromiseRejectionEvent + rejectionhandled: PromiseRejectionEvent +} +declare abstract class WorkerGlobalScope extends EventTarget { + EventTarget: typeof EventTarget +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console) */ +interface Console { + 'assert'(condition?: boolean, ...data: any[]): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/clear_static) */ + clear(): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/count_static) */ + count(label?: string): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/countReset_static) */ + countReset(label?: string): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/debug_static) */ + debug(...data: any[]): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/dir_static) */ + dir(item?: any, options?: any): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/dirxml_static) */ + dirxml(...data: any[]): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/error_static) */ + error(...data: any[]): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/group_static) */ + group(...data: any[]): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/groupCollapsed_static) */ + groupCollapsed(...data: any[]): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/groupEnd_static) */ + groupEnd(): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/info_static) */ + info(...data: any[]): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/log_static) */ + log(...data: any[]): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/table_static) */ + table(tabularData?: any, properties?: string[]): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/time_static) */ + time(label?: string): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/timeEnd_static) */ + timeEnd(label?: string): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/timeLog_static) */ + timeLog(label?: string, ...data: any[]): void + timeStamp(label?: string): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/trace_static) */ + trace(...data: any[]): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/warn_static) */ + warn(...data: any[]): void +} +declare const console: Console +type BufferSource = ArrayBufferView | ArrayBuffer +type TypedArray = + | Int8Array + | Uint8Array + | Uint8ClampedArray + | Int16Array + | Uint16Array + | Int32Array + | Uint32Array + | Float32Array + | Float64Array + | BigInt64Array + | BigUint64Array +declare namespace WebAssembly { + class CompileError extends Error { + constructor(message?: string) + } + class RuntimeError extends Error { + constructor(message?: string) + } + type ValueType = 'anyfunc' | 'externref' | 'f32' | 'f64' | 'i32' | 'i64' | 'v128' + interface GlobalDescriptor { + value: ValueType + mutable?: boolean + } + class Global { + constructor(descriptor: GlobalDescriptor, value?: any) + value: any + valueOf(): any + } + type ImportValue = ExportValue | number + type ModuleImports = Record + type Imports = Record + type ExportValue = Function | Global | Memory | Table + type Exports = Record + class Instance { + constructor(module: Module, imports?: Imports) + readonly exports: Exports + } + interface MemoryDescriptor { + initial: number + maximum?: number + shared?: boolean + } + class Memory { + constructor(descriptor: MemoryDescriptor) + readonly buffer: ArrayBuffer + grow(delta: number): number + } + type ImportExportKind = 'function' | 'global' | 'memory' | 'table' + interface ModuleExportDescriptor { + kind: ImportExportKind + name: string + } + interface ModuleImportDescriptor { + kind: ImportExportKind + module: string + name: string + } + abstract class Module { + static customSections(module: Module, sectionName: string): ArrayBuffer[] + static exports(module: Module): ModuleExportDescriptor[] + static imports(module: Module): ModuleImportDescriptor[] + } + type TableKind = 'anyfunc' | 'externref' + interface TableDescriptor { + element: TableKind + initial: number + maximum?: number + } + class Table { + constructor(descriptor: TableDescriptor, value?: any) + readonly length: number + get(index: number): any + grow(delta: number, value?: any): number + set(index: number, value?: any): void + } + function instantiate(module: Module, imports?: Imports): Promise + function validate(bytes: BufferSource): boolean +} +/** + * This ServiceWorker API interface represents the global execution context of a service worker. + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ServiceWorkerGlobalScope) + */ +interface ServiceWorkerGlobalScope extends WorkerGlobalScope { + DOMException: typeof DOMException + WorkerGlobalScope: typeof WorkerGlobalScope + btoa(data: string): string + atob(data: string): string + setTimeout(callback: (...args: any[]) => void, msDelay?: number): number + setTimeout( + callback: (...args: Args) => void, + msDelay?: number, + ...args: Args + ): number + clearTimeout(timeoutId: number | null): void + setInterval(callback: (...args: any[]) => void, msDelay?: number): number + setInterval( + callback: (...args: Args) => void, + msDelay?: number, + ...args: Args + ): number + clearInterval(timeoutId: number | null): void + queueMicrotask(task: Function): void + structuredClone(value: T, options?: StructuredSerializeOptions): T + reportError(error: any): void + fetch(input: RequestInfo | URL, init?: RequestInit): Promise + self: ServiceWorkerGlobalScope + crypto: Crypto + caches: CacheStorage + scheduler: Scheduler + performance: Performance + Cloudflare: Cloudflare + readonly origin: string + Event: typeof Event + ExtendableEvent: typeof ExtendableEvent + CustomEvent: typeof CustomEvent + PromiseRejectionEvent: typeof PromiseRejectionEvent + FetchEvent: typeof FetchEvent + TailEvent: typeof TailEvent + TraceEvent: typeof TailEvent + ScheduledEvent: typeof ScheduledEvent + MessageEvent: typeof MessageEvent + CloseEvent: typeof CloseEvent + ReadableStreamDefaultReader: typeof ReadableStreamDefaultReader + ReadableStreamBYOBReader: typeof ReadableStreamBYOBReader + ReadableStream: typeof ReadableStream + WritableStream: typeof WritableStream + WritableStreamDefaultWriter: typeof WritableStreamDefaultWriter + TransformStream: typeof TransformStream + ByteLengthQueuingStrategy: typeof ByteLengthQueuingStrategy + CountQueuingStrategy: typeof CountQueuingStrategy + ErrorEvent: typeof ErrorEvent + EventSource: typeof EventSource + ReadableStreamBYOBRequest: typeof ReadableStreamBYOBRequest + ReadableStreamDefaultController: typeof ReadableStreamDefaultController + ReadableByteStreamController: typeof ReadableByteStreamController + WritableStreamDefaultController: typeof WritableStreamDefaultController + TransformStreamDefaultController: typeof TransformStreamDefaultController + CompressionStream: typeof CompressionStream + DecompressionStream: typeof DecompressionStream + TextEncoderStream: typeof TextEncoderStream + TextDecoderStream: typeof TextDecoderStream + Headers: typeof Headers + Body: typeof Body + Request: typeof Request + Response: typeof Response + WebSocket: typeof WebSocket + WebSocketPair: typeof WebSocketPair + WebSocketRequestResponsePair: typeof WebSocketRequestResponsePair + AbortController: typeof AbortController + AbortSignal: typeof AbortSignal + TextDecoder: typeof TextDecoder + TextEncoder: typeof TextEncoder + navigator: Navigator + Navigator: typeof Navigator + URL: typeof URL + URLSearchParams: typeof URLSearchParams + URLPattern: typeof URLPattern + Blob: typeof Blob + File: typeof File + FormData: typeof FormData + Crypto: typeof Crypto + SubtleCrypto: typeof SubtleCrypto + CryptoKey: typeof CryptoKey + CacheStorage: typeof CacheStorage + Cache: typeof Cache + FixedLengthStream: typeof FixedLengthStream + IdentityTransformStream: typeof IdentityTransformStream + HTMLRewriter: typeof HTMLRewriter +} +declare function addEventListener( + type: Type, + handler: EventListenerOrEventListenerObject, + options?: EventTargetAddEventListenerOptions | boolean +): void +declare function removeEventListener( + type: Type, + handler: EventListenerOrEventListenerObject, + options?: EventTargetEventListenerOptions | boolean +): void +/** + * Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent) + */ +declare function dispatchEvent( + event: WorkerGlobalScopeEventMap[keyof WorkerGlobalScopeEventMap] +): boolean +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/btoa) */ +declare function btoa(data: string): string +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/atob) */ +declare function atob(data: string): string +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setTimeout) */ +declare function setTimeout(callback: (...args: any[]) => void, msDelay?: number): number +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setTimeout) */ +declare function setTimeout( + callback: (...args: Args) => void, + msDelay?: number, + ...args: Args +): number +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/clearTimeout) */ +declare function clearTimeout(timeoutId: number | null): void +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setInterval) */ +declare function setInterval(callback: (...args: any[]) => void, msDelay?: number): number +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setInterval) */ +declare function setInterval( + callback: (...args: Args) => void, + msDelay?: number, + ...args: Args +): number +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/clearInterval) */ +declare function clearInterval(timeoutId: number | null): void +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/queueMicrotask) */ +declare function queueMicrotask(task: Function): void +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/structuredClone) */ +declare function structuredClone(value: T, options?: StructuredSerializeOptions): T +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/reportError) */ +declare function reportError(error: any): void +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/fetch) */ +declare function fetch( + input: RequestInfo | URL, + init?: RequestInit +): Promise +declare const self: ServiceWorkerGlobalScope +/** + * The Web Crypto API provides a set of low-level functions for common cryptographic tasks. + * The Workers runtime implements the full surface of this API, but with some differences in + * the [supported algorithms](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/#supported-algorithms) + * compared to those implemented in most browsers. + * + * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/) + */ +declare const crypto: Crypto +/** + * The Cache API allows fine grained control of reading and writing from the Cloudflare global network cache. + * + * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/) + */ +declare const caches: CacheStorage +declare const scheduler: Scheduler +/** + * The Workers runtime supports a subset of the Performance API, used to measure timing and performance, + * as well as timing of subrequests and other operations. + * + * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/) + */ +declare const performance: Performance +declare const Cloudflare: Cloudflare +declare const origin: string +declare const navigator: Navigator +interface TestController {} +interface ExecutionContext { + waitUntil(promise: Promise): void + passThroughOnException(): void + props: any +} +type ExportedHandlerFetchHandler = ( + request: Request>, + env: Env, + ctx: ExecutionContext +) => Response | Promise +type ExportedHandlerTailHandler = ( + events: TraceItem[], + env: Env, + ctx: ExecutionContext +) => void | Promise +type ExportedHandlerTraceHandler = ( + traces: TraceItem[], + env: Env, + ctx: ExecutionContext +) => void | Promise +type ExportedHandlerTailStreamHandler = ( + event: TailStream.TailEvent, + env: Env, + ctx: ExecutionContext +) => TailStream.TailEventHandlerType | Promise +type ExportedHandlerScheduledHandler = ( + controller: ScheduledController, + env: Env, + ctx: ExecutionContext +) => void | Promise +type ExportedHandlerQueueHandler = ( + batch: MessageBatch, + env: Env, + ctx: ExecutionContext +) => void | Promise +type ExportedHandlerTestHandler = ( + controller: TestController, + env: Env, + ctx: ExecutionContext +) => void | Promise +interface ExportedHandler { + fetch?: ExportedHandlerFetchHandler + tail?: ExportedHandlerTailHandler + trace?: ExportedHandlerTraceHandler + tailStream?: ExportedHandlerTailStreamHandler + scheduled?: ExportedHandlerScheduledHandler + test?: ExportedHandlerTestHandler + email?: EmailExportedHandler + queue?: ExportedHandlerQueueHandler +} +interface StructuredSerializeOptions { + transfer?: any[] +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/PromiseRejectionEvent) */ +declare abstract class PromiseRejectionEvent extends Event { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/PromiseRejectionEvent/promise) */ + readonly promise: Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/PromiseRejectionEvent/reason) */ + readonly reason: any +} +declare abstract class Navigator { + sendBeacon( + url: string, + body?: + | ReadableStream + | string + | (ArrayBuffer | ArrayBufferView) + | Blob + | FormData + | URLSearchParams + | URLSearchParams + ): boolean + readonly userAgent: string + readonly hardwareConcurrency: number +} +/** + * The Workers runtime supports a subset of the Performance API, used to measure timing and performance, + * as well as timing of subrequests and other operations. + * + * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/) + */ +interface Performance { + /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/#performancetimeorigin) */ + readonly timeOrigin: number + /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/#performancenow) */ + now(): number +} +interface AlarmInvocationInfo { + readonly isRetry: boolean + readonly retryCount: number +} +interface Cloudflare { + readonly compatibilityFlags: Record +} +interface DurableObject { + fetch(request: Request): Response | Promise + alarm?(alarmInfo?: AlarmInvocationInfo): void | Promise + webSocketMessage?(ws: WebSocket, message: string | ArrayBuffer): void | Promise + webSocketClose?( + ws: WebSocket, + code: number, + reason: string, + wasClean: boolean + ): void | Promise + webSocketError?(ws: WebSocket, error: unknown): void | Promise +} +type DurableObjectStub = Fetcher< + T, + 'alarm' | 'webSocketMessage' | 'webSocketClose' | 'webSocketError' +> & { + readonly id: DurableObjectId + readonly name?: string +} +interface DurableObjectId { + toString(): string + equals(other: DurableObjectId): boolean + readonly name?: string +} +interface DurableObjectNamespace { + newUniqueId(options?: DurableObjectNamespaceNewUniqueIdOptions): DurableObjectId + idFromName(name: string): DurableObjectId + idFromString(id: string): DurableObjectId + get( + id: DurableObjectId, + options?: DurableObjectNamespaceGetDurableObjectOptions + ): DurableObjectStub + jurisdiction(jurisdiction: DurableObjectJurisdiction): DurableObjectNamespace +} +type DurableObjectJurisdiction = 'eu' | 'fedramp' +interface DurableObjectNamespaceNewUniqueIdOptions { + jurisdiction?: DurableObjectJurisdiction +} +type DurableObjectLocationHint = + | 'wnam' + | 'enam' + | 'sam' + | 'weur' + | 'eeur' + | 'apac' + | 'oc' + | 'afr' + | 'me' +interface DurableObjectNamespaceGetDurableObjectOptions { + locationHint?: DurableObjectLocationHint +} +interface DurableObjectState { + waitUntil(promise: Promise): void + readonly id: DurableObjectId + readonly storage: DurableObjectStorage + container?: Container + blockConcurrencyWhile(callback: () => Promise): Promise + acceptWebSocket(ws: WebSocket, tags?: string[]): void + getWebSockets(tag?: string): WebSocket[] + setWebSocketAutoResponse(maybeReqResp?: WebSocketRequestResponsePair): void + getWebSocketAutoResponse(): WebSocketRequestResponsePair | null + getWebSocketAutoResponseTimestamp(ws: WebSocket): Date | null + setHibernatableWebSocketEventTimeout(timeoutMs?: number): void + getHibernatableWebSocketEventTimeout(): number | null + getTags(ws: WebSocket): string[] + abort(reason?: string): void +} +interface DurableObjectTransaction { + get(key: string, options?: DurableObjectGetOptions): Promise + get(keys: string[], options?: DurableObjectGetOptions): Promise> + list(options?: DurableObjectListOptions): Promise> + put(key: string, value: T, options?: DurableObjectPutOptions): Promise + put(entries: Record, options?: DurableObjectPutOptions): Promise + delete(key: string, options?: DurableObjectPutOptions): Promise + delete(keys: string[], options?: DurableObjectPutOptions): Promise + rollback(): void + getAlarm(options?: DurableObjectGetAlarmOptions): Promise + setAlarm(scheduledTime: number | Date, options?: DurableObjectSetAlarmOptions): Promise + deleteAlarm(options?: DurableObjectSetAlarmOptions): Promise +} +interface DurableObjectStorage { + get(key: string, options?: DurableObjectGetOptions): Promise + get(keys: string[], options?: DurableObjectGetOptions): Promise> + list(options?: DurableObjectListOptions): Promise> + put(key: string, value: T, options?: DurableObjectPutOptions): Promise + put(entries: Record, options?: DurableObjectPutOptions): Promise + delete(key: string, options?: DurableObjectPutOptions): Promise + delete(keys: string[], options?: DurableObjectPutOptions): Promise + deleteAll(options?: DurableObjectPutOptions): Promise + transaction(closure: (txn: DurableObjectTransaction) => Promise): Promise + getAlarm(options?: DurableObjectGetAlarmOptions): Promise + setAlarm(scheduledTime: number | Date, options?: DurableObjectSetAlarmOptions): Promise + deleteAlarm(options?: DurableObjectSetAlarmOptions): Promise + sync(): Promise + sql: SqlStorage + transactionSync(closure: () => T): T + getCurrentBookmark(): Promise + getBookmarkForTime(timestamp: number | Date): Promise + onNextSessionRestoreBookmark(bookmark: string): Promise +} +interface DurableObjectListOptions { + start?: string + startAfter?: string + end?: string + prefix?: string + reverse?: boolean + limit?: number + allowConcurrency?: boolean + noCache?: boolean +} +interface DurableObjectGetOptions { + allowConcurrency?: boolean + noCache?: boolean +} +interface DurableObjectGetAlarmOptions { + allowConcurrency?: boolean +} +interface DurableObjectPutOptions { + allowConcurrency?: boolean + allowUnconfirmed?: boolean + noCache?: boolean +} +interface DurableObjectSetAlarmOptions { + allowConcurrency?: boolean + allowUnconfirmed?: boolean +} +declare class WebSocketRequestResponsePair { + constructor(request: string, response: string) + get request(): string + get response(): string +} +interface AnalyticsEngineDataset { + writeDataPoint(event?: AnalyticsEngineDataPoint): void +} +interface AnalyticsEngineDataPoint { + indexes?: ((ArrayBuffer | string) | null)[] + doubles?: number[] + blobs?: ((ArrayBuffer | string) | null)[] +} +/** + * An event which takes place in the DOM. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event) + */ +declare class Event { + constructor(type: string, init?: EventInit) + /** + * Returns the type of event, e.g. "click", "hashchange", or "submit". + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/type) + */ + get type(): string + /** + * Returns the event's phase, which is one of NONE, CAPTURING_PHASE, AT_TARGET, and BUBBLING_PHASE. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/eventPhase) + */ + get eventPhase(): number + /** + * Returns true or false depending on how event was initialized. True if event invokes listeners past a ShadowRoot node that is the root of its target, and false otherwise. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/composed) + */ + get composed(): boolean + /** + * Returns true or false depending on how event was initialized. True if event goes through its target's ancestors in reverse tree order, and false otherwise. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/bubbles) + */ + get bubbles(): boolean + /** + * Returns true or false depending on how event was initialized. Its return value does not always carry meaning, but true can indicate that part of the operation during which event was dispatched, can be canceled by invoking the preventDefault() method. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/cancelable) + */ + get cancelable(): boolean + /** + * Returns true if preventDefault() was invoked successfully to indicate cancelation, and false otherwise. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/defaultPrevented) + */ + get defaultPrevented(): boolean + /** + * @deprecated + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/returnValue) + */ + get returnValue(): boolean + /** + * Returns the object whose event listener's callback is currently being invoked. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/currentTarget) + */ + get currentTarget(): EventTarget | undefined + /** + * Returns the object to which event is dispatched (its target). + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/target) + */ + get target(): EventTarget | undefined + /** + * @deprecated + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/srcElement) + */ + get srcElement(): EventTarget | undefined + /** + * Returns the event's timestamp as the number of milliseconds measured relative to the time origin. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/timeStamp) + */ + get timeStamp(): number + /** + * Returns true if event was dispatched by the user agent, and false otherwise. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/isTrusted) + */ + get isTrusted(): boolean + /** + * @deprecated + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/cancelBubble) + */ + get cancelBubble(): boolean + /** + * @deprecated + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/cancelBubble) + */ + set cancelBubble(value: boolean) + /** + * Invoking this method prevents event from reaching any registered event listeners after the current one finishes running and, when dispatched in a tree, also prevents event from reaching any other objects. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/stopImmediatePropagation) + */ + stopImmediatePropagation(): void + /** + * If invoked when the cancelable attribute value is true, and while executing a listener for the event with passive set to false, signals to the operation that caused event to be dispatched that it needs to be canceled. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/preventDefault) + */ + preventDefault(): void + /** + * When dispatched in a tree, invoking this method prevents event from reaching any objects other than the current object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/stopPropagation) + */ + stopPropagation(): void + /** + * Returns the invocation target objects of event's path (objects on which listeners will be invoked), except for any nodes in shadow trees of which the shadow root's mode is "closed" that are not reachable from event's currentTarget. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/composedPath) + */ + composedPath(): EventTarget[] + static readonly NONE: number + static readonly CAPTURING_PHASE: number + static readonly AT_TARGET: number + static readonly BUBBLING_PHASE: number +} +interface EventInit { + bubbles?: boolean + cancelable?: boolean + composed?: boolean +} +type EventListener = (event: EventType) => void +interface EventListenerObject { + handleEvent(event: EventType): void +} +type EventListenerOrEventListenerObject = + | EventListener + | EventListenerObject +/** + * EventTarget is a DOM interface implemented by objects that can receive events and may have listeners for them. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget) + */ +declare class EventTarget = Record> { + constructor() + /** + * Appends an event listener for events whose type attribute value is type. The callback argument sets the callback that will be invoked when the event is dispatched. + * + * The options argument sets listener-specific options. For compatibility this can be a boolean, in which case the method behaves exactly as if the value was specified as options's capture. + * + * When set to true, options's capture prevents callback from being invoked when the event's eventPhase attribute value is BUBBLING_PHASE. When false (or not present), callback will not be invoked when event's eventPhase attribute value is CAPTURING_PHASE. Either way, callback will be invoked if event's eventPhase attribute value is AT_TARGET. + * + * When set to true, options's passive indicates that the callback will not cancel the event by invoking preventDefault(). This is used to enable performance optimizations described in § 2.8 Observing event listeners. + * + * When set to true, options's once indicates that the callback will only be invoked once after which the event listener will be removed. + * + * If an AbortSignal is passed for options's signal, then the event listener will be removed when signal is aborted. + * + * The event listener is appended to target's event listener list and is not appended if it has the same type, callback, and capture. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) + */ + addEventListener( + type: Type, + handler: EventListenerOrEventListenerObject, + options?: EventTargetAddEventListenerOptions | boolean + ): void + /** + * Removes the event listener in target's event listener list with the same type, callback, and options. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/removeEventListener) + */ + removeEventListener( + type: Type, + handler: EventListenerOrEventListenerObject, + options?: EventTargetEventListenerOptions | boolean + ): void + /** + * Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent) + */ + dispatchEvent(event: EventMap[keyof EventMap]): boolean +} +interface EventTargetEventListenerOptions { + capture?: boolean +} +interface EventTargetAddEventListenerOptions { + capture?: boolean + passive?: boolean + once?: boolean + signal?: AbortSignal +} +interface EventTargetHandlerObject { + handleEvent: (event: Event) => any | undefined +} +/** + * A controller object that allows you to abort one or more DOM requests as and when desired. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortController) + */ +declare class AbortController { + constructor() + /** + * Returns the AbortSignal object associated with this object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortController/signal) + */ + get signal(): AbortSignal + /** + * Invoking this method will set this object's AbortSignal's aborted flag and signal to any observers that the associated activity is to be aborted. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortController/abort) + */ + abort(reason?: any): void +} +/** + * A signal object that allows you to communicate with a DOM request (such as a Fetch) and abort it if required via an AbortController object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal) + */ +declare abstract class AbortSignal extends EventTarget { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_static) */ + static abort(reason?: any): AbortSignal + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/timeout_static) */ + static timeout(delay: number): AbortSignal + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/any_static) */ + static any(signals: AbortSignal[]): AbortSignal + /** + * Returns true if this AbortSignal's AbortController has signaled to abort, and false otherwise. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/aborted) + */ + get aborted(): boolean + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/reason) */ + get reason(): any + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_event) */ + get onabort(): any | null + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_event) */ + set onabort(value: any | null) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/throwIfAborted) */ + throwIfAborted(): void +} +interface Scheduler { + wait(delay: number, maybeOptions?: SchedulerWaitOptions): Promise +} +interface SchedulerWaitOptions { + signal?: AbortSignal +} +/** + * Extends the lifetime of the install and activate events dispatched on the global scope as part of the service worker lifecycle. This ensures that any functional events (like FetchEvent) are not dispatched until it upgrades database schemas and deletes the outdated cache entries. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ExtendableEvent) + */ +declare abstract class ExtendableEvent extends Event { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ExtendableEvent/waitUntil) */ + waitUntil(promise: Promise): void +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CustomEvent) */ +declare class CustomEvent extends Event { + constructor(type: string, init?: CustomEventCustomEventInit) + /** + * Returns any custom data event was created with. Typically used for synthetic events. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CustomEvent/detail) + */ + get detail(): T +} +interface CustomEventCustomEventInit { + bubbles?: boolean + cancelable?: boolean + composed?: boolean + detail?: any +} +/** + * A file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format. The File interface is based on Blob, inheriting blob functionality and expanding it to support files on the user's system. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob) + */ +declare class Blob { + constructor(type?: ((ArrayBuffer | ArrayBufferView) | string | Blob)[], options?: BlobOptions) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/size) */ + get size(): number + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/type) */ + get type(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/slice) */ + slice(start?: number, end?: number, type?: string): Blob + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/arrayBuffer) */ + arrayBuffer(): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/bytes) */ + bytes(): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/text) */ + text(): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/stream) */ + stream(): ReadableStream +} +interface BlobOptions { + type?: string +} +/** + * Provides information about files and allows JavaScript in a web page to access their content. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/File) + */ +declare class File extends Blob { + constructor( + bits: ((ArrayBuffer | ArrayBufferView) | string | Blob)[] | undefined, + name: string, + options?: FileOptions + ) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/name) */ + get name(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/lastModified) */ + get lastModified(): number +} +interface FileOptions { + type?: string + lastModified?: number +} +/** + * The Cache API allows fine grained control of reading and writing from the Cloudflare global network cache. + * + * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/) + */ +declare abstract class CacheStorage { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CacheStorage/open) */ + open(cacheName: string): Promise + readonly default: Cache +} +/** + * The Cache API allows fine grained control of reading and writing from the Cloudflare global network cache. + * + * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/) + */ +declare abstract class Cache { + /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/#delete) */ + delete(request: RequestInfo | URL, options?: CacheQueryOptions): Promise + /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/#match) */ + match(request: RequestInfo | URL, options?: CacheQueryOptions): Promise + /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/#put) */ + put(request: RequestInfo | URL, response: Response): Promise +} +interface CacheQueryOptions { + ignoreMethod?: boolean +} +/** + * The Web Crypto API provides a set of low-level functions for common cryptographic tasks. + * The Workers runtime implements the full surface of this API, but with some differences in + * the [supported algorithms](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/#supported-algorithms) + * compared to those implemented in most browsers. + * + * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/) + */ +declare abstract class Crypto { + /** + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/subtle) + */ + get subtle(): SubtleCrypto + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/getRandomValues) */ + getRandomValues< + T extends + | Int8Array + | Uint8Array + | Int16Array + | Uint16Array + | Int32Array + | Uint32Array + | BigInt64Array + | BigUint64Array, + >(buffer: T): T + /** + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/randomUUID) + */ + randomUUID(): string + DigestStream: typeof DigestStream +} +/** + * This Web Crypto API interface provides a number of low-level cryptographic functions. It is accessed via the Crypto.subtle properties available in a window context (via Window.crypto). + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto) + */ +declare abstract class SubtleCrypto { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/encrypt) */ + encrypt( + algorithm: string | SubtleCryptoEncryptAlgorithm, + key: CryptoKey, + plainText: ArrayBuffer | ArrayBufferView + ): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/decrypt) */ + decrypt( + algorithm: string | SubtleCryptoEncryptAlgorithm, + key: CryptoKey, + cipherText: ArrayBuffer | ArrayBufferView + ): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/sign) */ + sign( + algorithm: string | SubtleCryptoSignAlgorithm, + key: CryptoKey, + data: ArrayBuffer | ArrayBufferView + ): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/verify) */ + verify( + algorithm: string | SubtleCryptoSignAlgorithm, + key: CryptoKey, + signature: ArrayBuffer | ArrayBufferView, + data: ArrayBuffer | ArrayBufferView + ): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/digest) */ + digest( + algorithm: string | SubtleCryptoHashAlgorithm, + data: ArrayBuffer | ArrayBufferView + ): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/generateKey) */ + generateKey( + algorithm: string | SubtleCryptoGenerateKeyAlgorithm, + extractable: boolean, + keyUsages: string[] + ): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveKey) */ + deriveKey( + algorithm: string | SubtleCryptoDeriveKeyAlgorithm, + baseKey: CryptoKey, + derivedKeyAlgorithm: string | SubtleCryptoImportKeyAlgorithm, + extractable: boolean, + keyUsages: string[] + ): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveBits) */ + deriveBits( + algorithm: string | SubtleCryptoDeriveKeyAlgorithm, + baseKey: CryptoKey, + length?: number | null + ): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/importKey) */ + importKey( + format: string, + keyData: (ArrayBuffer | ArrayBufferView) | JsonWebKey, + algorithm: string | SubtleCryptoImportKeyAlgorithm, + extractable: boolean, + keyUsages: string[] + ): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/exportKey) */ + exportKey(format: string, key: CryptoKey): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/wrapKey) */ + wrapKey( + format: string, + key: CryptoKey, + wrappingKey: CryptoKey, + wrapAlgorithm: string | SubtleCryptoEncryptAlgorithm + ): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/unwrapKey) */ + unwrapKey( + format: string, + wrappedKey: ArrayBuffer | ArrayBufferView, + unwrappingKey: CryptoKey, + unwrapAlgorithm: string | SubtleCryptoEncryptAlgorithm, + unwrappedKeyAlgorithm: string | SubtleCryptoImportKeyAlgorithm, + extractable: boolean, + keyUsages: string[] + ): Promise + timingSafeEqual(a: ArrayBuffer | ArrayBufferView, b: ArrayBuffer | ArrayBufferView): boolean +} +/** + * The CryptoKey dictionary of the Web Crypto API represents a cryptographic key. + * Available only in secure contexts. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey) + */ +declare abstract class CryptoKey { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/type) */ + readonly type: string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/extractable) */ + readonly extractable: boolean + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/algorithm) */ + readonly algorithm: + | CryptoKeyKeyAlgorithm + | CryptoKeyAesKeyAlgorithm + | CryptoKeyHmacKeyAlgorithm + | CryptoKeyRsaKeyAlgorithm + | CryptoKeyEllipticKeyAlgorithm + | CryptoKeyArbitraryKeyAlgorithm + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/usages) */ + readonly usages: string[] +} +interface CryptoKeyPair { + publicKey: CryptoKey + privateKey: CryptoKey +} +interface JsonWebKey { + kty: string + use?: string + key_ops?: string[] + alg?: string + ext?: boolean + crv?: string + x?: string + y?: string + d?: string + n?: string + e?: string + p?: string + q?: string + dp?: string + dq?: string + qi?: string + oth?: RsaOtherPrimesInfo[] + k?: string +} +interface RsaOtherPrimesInfo { + r?: string + d?: string + t?: string +} +interface SubtleCryptoDeriveKeyAlgorithm { + name: string + salt?: ArrayBuffer | ArrayBufferView + iterations?: number + hash?: string | SubtleCryptoHashAlgorithm + $public?: CryptoKey + info?: ArrayBuffer | ArrayBufferView +} +interface SubtleCryptoEncryptAlgorithm { + name: string + iv?: ArrayBuffer | ArrayBufferView + additionalData?: ArrayBuffer | ArrayBufferView + tagLength?: number + counter?: ArrayBuffer | ArrayBufferView + length?: number + label?: ArrayBuffer | ArrayBufferView +} +interface SubtleCryptoGenerateKeyAlgorithm { + name: string + hash?: string | SubtleCryptoHashAlgorithm + modulusLength?: number + publicExponent?: ArrayBuffer | ArrayBufferView + length?: number + namedCurve?: string +} +interface SubtleCryptoHashAlgorithm { + name: string +} +interface SubtleCryptoImportKeyAlgorithm { + name: string + hash?: string | SubtleCryptoHashAlgorithm + length?: number + namedCurve?: string + compressed?: boolean +} +interface SubtleCryptoSignAlgorithm { + name: string + hash?: string | SubtleCryptoHashAlgorithm + dataLength?: number + saltLength?: number +} +interface CryptoKeyKeyAlgorithm { + name: string +} +interface CryptoKeyAesKeyAlgorithm { + name: string + length: number +} +interface CryptoKeyHmacKeyAlgorithm { + name: string + hash: CryptoKeyKeyAlgorithm + length: number +} +interface CryptoKeyRsaKeyAlgorithm { + name: string + modulusLength: number + publicExponent: ArrayBuffer | ArrayBufferView + hash?: CryptoKeyKeyAlgorithm +} +interface CryptoKeyEllipticKeyAlgorithm { + name: string + namedCurve: string +} +interface CryptoKeyArbitraryKeyAlgorithm { + name: string + hash?: CryptoKeyKeyAlgorithm + namedCurve?: string + length?: number +} +declare class DigestStream extends WritableStream { + constructor(algorithm: string | SubtleCryptoHashAlgorithm) + readonly digest: Promise + get bytesWritten(): number | bigint +} +/** + * A decoder for a specific method, that is a specific character encoding, like utf-8, iso-8859-2, koi8, cp1261, gbk, etc. A decoder takes a stream of bytes as input and emits a stream of code points. For a more scalable, non-native library, see StringView – a C-like representation of strings based on typed arrays. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextDecoder) + */ +declare class TextDecoder { + constructor(label?: string, options?: TextDecoderConstructorOptions) + /** + * Returns the result of running encoding's decoder. The method can be invoked zero or more times with options's stream set to true, and then once without options's stream (or set to false), to process a fragmented input. If the invocation without options's stream (or set to false) has no input, it's clearest to omit both arguments. + * + * ``` + * var string = "", decoder = new TextDecoder(encoding), buffer; + * while(buffer = next_chunk()) { + * string += decoder.decode(buffer, {stream:true}); + * } + * string += decoder.decode(); // end-of-queue + * ``` + * + * If the error mode is "fatal" and encoding's decoder returns error, throws a TypeError. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextDecoder/decode) + */ + decode(input?: ArrayBuffer | ArrayBufferView, options?: TextDecoderDecodeOptions): string + get encoding(): string + get fatal(): boolean + get ignoreBOM(): boolean +} +/** + * TextEncoder takes a stream of code points as input and emits a stream of bytes. For a more scalable, non-native library, see StringView – a C-like representation of strings based on typed arrays. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoder) + */ +declare class TextEncoder { + constructor() + /** + * Returns the result of running UTF-8's encoder. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoder/encode) + */ + encode(input?: string): Uint8Array + /** + * Runs the UTF-8 encoder on source, stores the result of that operation into destination, and returns the progress made as an object wherein read is the number of converted code units of source and written is the number of bytes modified in destination. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoder/encodeInto) + */ + encodeInto(input: string, buffer: ArrayBuffer | ArrayBufferView): TextEncoderEncodeIntoResult + get encoding(): string +} +interface TextDecoderConstructorOptions { + fatal: boolean + ignoreBOM: boolean +} +interface TextDecoderDecodeOptions { + stream: boolean +} +interface TextEncoderEncodeIntoResult { + read: number + written: number +} +/** + * Events providing information related to errors in scripts or in files. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent) + */ +declare class ErrorEvent extends Event { + constructor(type: string, init?: ErrorEventErrorEventInit) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/filename) */ + get filename(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/message) */ + get message(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/lineno) */ + get lineno(): number + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/colno) */ + get colno(): number + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/error) */ + get error(): any +} +interface ErrorEventErrorEventInit { + message?: string + filename?: string + lineno?: number + colno?: number + error?: any +} +/** + * Provides a way to easily construct a set of key/value pairs representing form fields and their values, which can then be easily sent using the XMLHttpRequest.send() method. It uses the same format a form would use if the encoding type were set to "multipart/form-data". + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData) + */ +declare class FormData { + constructor() + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/append) */ + append(name: string, value: string): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/append) */ + append(name: string, value: Blob, filename?: string): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/delete) */ + delete(name: string): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/get) */ + get(name: string): (File | string) | null + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/getAll) */ + getAll(name: string): (File | string)[] + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/has) */ + has(name: string): boolean + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/set) */ + set(name: string, value: string): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/set) */ + set(name: string, value: Blob, filename?: string): void + /* Returns an array of key, value pairs for every entry in the list. */ + entries(): IterableIterator<[key: string, value: File | string]> + /* Returns a list of keys in the list. */ + keys(): IterableIterator + /* Returns a list of values in the list. */ + values(): IterableIterator + forEach( + callback: (this: This, value: File | string, key: string, parent: FormData) => void, + thisArg?: This + ): void + [Symbol.iterator](): IterableIterator<[key: string, value: File | string]> +} +interface ContentOptions { + html?: boolean +} +declare class HTMLRewriter { + constructor() + on(selector: string, handlers: HTMLRewriterElementContentHandlers): HTMLRewriter + onDocument(handlers: HTMLRewriterDocumentContentHandlers): HTMLRewriter + transform(response: Response): Response +} +interface HTMLRewriterElementContentHandlers { + element?(element: Element): void | Promise + comments?(comment: Comment): void | Promise + text?(element: Text): void | Promise +} +interface HTMLRewriterDocumentContentHandlers { + doctype?(doctype: Doctype): void | Promise + comments?(comment: Comment): void | Promise + text?(text: Text): void | Promise + end?(end: DocumentEnd): void | Promise +} +interface Doctype { + readonly name: string | null + readonly publicId: string | null + readonly systemId: string | null +} +interface Element { + tagName: string + readonly attributes: IterableIterator + readonly removed: boolean + readonly namespaceURI: string + getAttribute(name: string): string | null + hasAttribute(name: string): boolean + setAttribute(name: string, value: string): Element + removeAttribute(name: string): Element + before(content: string | ReadableStream | Response, options?: ContentOptions): Element + after(content: string | ReadableStream | Response, options?: ContentOptions): Element + prepend(content: string | ReadableStream | Response, options?: ContentOptions): Element + append(content: string | ReadableStream | Response, options?: ContentOptions): Element + replace(content: string | ReadableStream | Response, options?: ContentOptions): Element + remove(): Element + removeAndKeepContent(): Element + setInnerContent(content: string | ReadableStream | Response, options?: ContentOptions): Element + onEndTag(handler: (tag: EndTag) => void | Promise): void +} +interface EndTag { + name: string + before(content: string | ReadableStream | Response, options?: ContentOptions): EndTag + after(content: string | ReadableStream | Response, options?: ContentOptions): EndTag + remove(): EndTag +} +interface Comment { + text: string + readonly removed: boolean + before(content: string, options?: ContentOptions): Comment + after(content: string, options?: ContentOptions): Comment + replace(content: string, options?: ContentOptions): Comment + remove(): Comment +} +interface Text { + readonly text: string + readonly lastInTextNode: boolean + readonly removed: boolean + before(content: string | ReadableStream | Response, options?: ContentOptions): Text + after(content: string | ReadableStream | Response, options?: ContentOptions): Text + replace(content: string | ReadableStream | Response, options?: ContentOptions): Text + remove(): Text +} +interface DocumentEnd { + append(content: string, options?: ContentOptions): DocumentEnd +} +/** + * This is the event type for fetch events dispatched on the service worker global scope. It contains information about the fetch, including the request and how the receiver will treat the response. It provides the event.respondWith() method, which allows us to provide a response to this fetch. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent) + */ +declare abstract class FetchEvent extends ExtendableEvent { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent/request) */ + readonly request: Request + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent/respondWith) */ + respondWith(promise: Response | Promise): void + passThroughOnException(): void +} +type HeadersInit = Headers | Iterable> | Record +/** + * This Fetch API interface allows you to perform various actions on HTTP request and response headers. These actions include retrieving, setting, adding to, and removing. A Headers object has an associated header list, which is initially empty and consists of zero or more name and value pairs.  You can add to this using methods like append() (see Examples.) In all methods of this interface, header names are matched by case-insensitive byte sequence. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers) + */ +declare class Headers { + constructor(init?: HeadersInit) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/get) */ + get(name: string): string | null + getAll(name: string): string[] + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/getSetCookie) */ + getSetCookie(): string[] + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/has) */ + has(name: string): boolean + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/set) */ + set(name: string, value: string): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/append) */ + append(name: string, value: string): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/delete) */ + delete(name: string): void + forEach( + callback: (this: This, value: string, key: string, parent: Headers) => void, + thisArg?: This + ): void + /* Returns an iterator allowing to go through all key/value pairs contained in this object. */ + entries(): IterableIterator<[key: string, value: string]> + /* Returns an iterator allowing to go through all keys of the key/value pairs contained in this object. */ + keys(): IterableIterator + /* Returns an iterator allowing to go through all values of the key/value pairs contained in this object. */ + values(): IterableIterator + [Symbol.iterator](): IterableIterator<[key: string, value: string]> +} +type BodyInit = + | ReadableStream + | string + | ArrayBuffer + | ArrayBufferView + | Blob + | URLSearchParams + | FormData +declare abstract class Body { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) */ + get body(): ReadableStream | null + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ + get bodyUsed(): boolean + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ + arrayBuffer(): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) */ + bytes(): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/text) */ + text(): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/json) */ + json(): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/formData) */ + formData(): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ + blob(): Promise +} +/** + * This Fetch API interface represents the response to a request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response) + */ +declare var Response: { + prototype: Response + new (body?: BodyInit | null, init?: ResponseInit): Response + error(): Response + redirect(url: string, status?: number): Response + json(any: any, maybeInit?: ResponseInit | Response): Response +} +/** + * This Fetch API interface represents the response to a request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response) + */ +interface Response extends Body { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/clone) */ + clone(): Response + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/status) */ + status: number + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/statusText) */ + statusText: string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/headers) */ + headers: Headers + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/ok) */ + ok: boolean + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/redirected) */ + redirected: boolean + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/url) */ + url: string + webSocket: WebSocket | null + cf: any | undefined + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/type) */ + type: 'default' | 'error' +} +interface ResponseInit { + status?: number + statusText?: string + headers?: HeadersInit + cf?: any + webSocket?: WebSocket | null + encodeBody?: 'automatic' | 'manual' +} +type RequestInfo> = + | Request + | string +/** + * This Fetch API interface represents a resource request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request) + */ +declare var Request: { + prototype: Request + new >( + input: RequestInfo | URL, + init?: RequestInit + ): Request +} +/** + * This Fetch API interface represents a resource request. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request) + */ +interface Request> extends Body { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/clone) */ + clone(): Request + /** + * Returns request's HTTP method, which is "GET" by default. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/method) + */ + method: string + /** + * Returns the URL of request as a string. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/url) + */ + url: string + /** + * Returns a Headers object consisting of the headers associated with request. Note that headers added in the network layer by the user agent will not be accounted for in this object, e.g., the "Host" header. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/headers) + */ + headers: Headers + /** + * Returns the redirect mode associated with request, which is a string indicating how redirects for the request will be handled during fetching. A request will follow redirects by default. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/redirect) + */ + redirect: string + fetcher: Fetcher | null + /** + * Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/signal) + */ + signal: AbortSignal + cf: Cf | undefined + /** + * Returns request's subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of multiple hashes separated by whitespace. [SRI] + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/integrity) + */ + integrity: string + /** + * Returns a boolean indicating whether or not request can outlive the global in which it was created. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/keepalive) + */ + keepalive: boolean + /** + * Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/cache) + */ + cache?: 'no-store' +} +interface RequestInit { + /* A string to set request's method. */ + method?: string + /* A Headers object, an object literal, or an array of two-item arrays to set request's headers. */ + headers?: HeadersInit + /* A BodyInit object or null to set request's body. */ + body?: BodyInit | null + /* A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect. */ + redirect?: string + fetcher?: Fetcher | null + cf?: Cf + /* A string indicating how the request will interact with the browser's cache to set request's cache. */ + cache?: 'no-store' + /* A cryptographic hash of the resource to be fetched by request. Sets request's integrity. */ + integrity?: string + /* An AbortSignal to set request's signal. */ + signal?: AbortSignal | null + encodeResponseBody?: 'automatic' | 'manual' +} +type Service = Fetcher +type Fetcher< + T extends Rpc.EntrypointBranded | undefined = undefined, + Reserved extends string = never, +> = (T extends Rpc.EntrypointBranded + ? Rpc.Provider + : unknown) & { + fetch(input: RequestInfo | URL, init?: RequestInit): Promise + connect(address: SocketAddress | string, options?: SocketOptions): Socket +} +interface KVNamespaceListKey { + name: Key + expiration?: number + metadata?: Metadata +} +type KVNamespaceListResult = + | { + list_complete: false + keys: KVNamespaceListKey[] + cursor: string + cacheStatus: string | null + } + | { + list_complete: true + keys: KVNamespaceListKey[] + cacheStatus: string | null + } +interface KVNamespace { + get(key: Key, options?: Partial>): Promise + get(key: Key, type: 'text'): Promise + get(key: Key, type: 'json'): Promise + get(key: Key, type: 'arrayBuffer'): Promise + get(key: Key, type: 'stream'): Promise + get(key: Key, options?: KVNamespaceGetOptions<'text'>): Promise + get( + key: Key, + options?: KVNamespaceGetOptions<'json'> + ): Promise + get(key: Key, options?: KVNamespaceGetOptions<'arrayBuffer'>): Promise + get(key: Key, options?: KVNamespaceGetOptions<'stream'>): Promise + get(key: Array, type: 'text'): Promise> + get( + key: Array, + type: 'json' + ): Promise> + get( + key: Array, + options?: Partial> + ): Promise> + get( + key: Array, + options?: KVNamespaceGetOptions<'text'> + ): Promise> + get( + key: Array, + options?: KVNamespaceGetOptions<'json'> + ): Promise> + list( + options?: KVNamespaceListOptions + ): Promise> + put( + key: Key, + value: string | ArrayBuffer | ArrayBufferView | ReadableStream, + options?: KVNamespacePutOptions + ): Promise + getWithMetadata( + key: Key, + options?: Partial> + ): Promise> + getWithMetadata( + key: Key, + type: 'text' + ): Promise> + getWithMetadata( + key: Key, + type: 'json' + ): Promise> + getWithMetadata( + key: Key, + type: 'arrayBuffer' + ): Promise> + getWithMetadata( + key: Key, + type: 'stream' + ): Promise> + getWithMetadata( + key: Key, + options: KVNamespaceGetOptions<'text'> + ): Promise> + getWithMetadata( + key: Key, + options: KVNamespaceGetOptions<'json'> + ): Promise> + getWithMetadata( + key: Key, + options: KVNamespaceGetOptions<'arrayBuffer'> + ): Promise> + getWithMetadata( + key: Key, + options: KVNamespaceGetOptions<'stream'> + ): Promise> + getWithMetadata( + key: Array, + type: 'text' + ): Promise>> + getWithMetadata( + key: Array, + type: 'json' + ): Promise>> + getWithMetadata( + key: Array, + options?: Partial> + ): Promise>> + getWithMetadata( + key: Array, + options?: KVNamespaceGetOptions<'text'> + ): Promise>> + getWithMetadata( + key: Array, + options?: KVNamespaceGetOptions<'json'> + ): Promise>> + delete(key: Key): Promise +} +interface KVNamespaceListOptions { + limit?: number + prefix?: string | null + cursor?: string | null +} +interface KVNamespaceGetOptions { + type: Type + cacheTtl?: number +} +interface KVNamespacePutOptions { + expiration?: number + expirationTtl?: number + metadata?: any | null +} +interface KVNamespaceGetWithMetadataResult { + value: Value | null + metadata: Metadata | null + cacheStatus: string | null +} +type QueueContentType = 'text' | 'bytes' | 'json' | 'v8' +interface Queue { + send(message: Body, options?: QueueSendOptions): Promise + sendBatch( + messages: Iterable>, + options?: QueueSendBatchOptions + ): Promise +} +interface QueueSendOptions { + contentType?: QueueContentType + delaySeconds?: number +} +interface QueueSendBatchOptions { + delaySeconds?: number +} +interface MessageSendRequest { + body: Body + contentType?: QueueContentType + delaySeconds?: number +} +interface QueueRetryOptions { + delaySeconds?: number +} +interface Message { + readonly id: string + readonly timestamp: Date + readonly body: Body + readonly attempts: number + retry(options?: QueueRetryOptions): void + ack(): void +} +interface QueueEvent extends ExtendableEvent { + readonly messages: readonly Message[] + readonly queue: string + retryAll(options?: QueueRetryOptions): void + ackAll(): void +} +interface MessageBatch { + readonly messages: readonly Message[] + readonly queue: string + retryAll(options?: QueueRetryOptions): void + ackAll(): void +} +interface R2Error extends Error { + readonly name: string + readonly code: number + readonly message: string + readonly action: string + readonly stack: any +} +interface R2ListOptions { + limit?: number + prefix?: string + cursor?: string + delimiter?: string + startAfter?: string + include?: ('httpMetadata' | 'customMetadata')[] +} +declare abstract class R2Bucket { + head(key: string): Promise + get( + key: string, + options: R2GetOptions & { + onlyIf: R2Conditional | Headers + } + ): Promise + get(key: string, options?: R2GetOptions): Promise + put( + key: string, + value: ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob, + options?: R2PutOptions & { + onlyIf: R2Conditional | Headers + } + ): Promise + put( + key: string, + value: ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob, + options?: R2PutOptions + ): Promise + createMultipartUpload(key: string, options?: R2MultipartOptions): Promise + resumeMultipartUpload(key: string, uploadId: string): R2MultipartUpload + delete(keys: string | string[]): Promise + list(options?: R2ListOptions): Promise +} +interface R2MultipartUpload { + readonly key: string + readonly uploadId: string + uploadPart( + partNumber: number, + value: ReadableStream | (ArrayBuffer | ArrayBufferView) | string | Blob, + options?: R2UploadPartOptions + ): Promise + abort(): Promise + complete(uploadedParts: R2UploadedPart[]): Promise +} +interface R2UploadedPart { + partNumber: number + etag: string +} +declare abstract class R2Object { + readonly key: string + readonly version: string + readonly size: number + readonly etag: string + readonly httpEtag: string + readonly checksums: R2Checksums + readonly uploaded: Date + readonly httpMetadata?: R2HTTPMetadata + readonly customMetadata?: Record + readonly range?: R2Range + readonly storageClass: string + readonly ssecKeyMd5?: string + writeHttpMetadata(headers: Headers): void +} +interface R2ObjectBody extends R2Object { + get body(): ReadableStream + get bodyUsed(): boolean + arrayBuffer(): Promise + text(): Promise + json(): Promise + blob(): Promise +} +type R2Range = + | { + offset: number + length?: number + } + | { + offset?: number + length: number + } + | { + suffix: number + } +interface R2Conditional { + etagMatches?: string + etagDoesNotMatch?: string + uploadedBefore?: Date + uploadedAfter?: Date + secondsGranularity?: boolean +} +interface R2GetOptions { + onlyIf?: R2Conditional | Headers + range?: R2Range | Headers + ssecKey?: ArrayBuffer | string +} +interface R2PutOptions { + onlyIf?: R2Conditional | Headers + httpMetadata?: R2HTTPMetadata | Headers + customMetadata?: Record + md5?: (ArrayBuffer | ArrayBufferView) | string + sha1?: (ArrayBuffer | ArrayBufferView) | string + sha256?: (ArrayBuffer | ArrayBufferView) | string + sha384?: (ArrayBuffer | ArrayBufferView) | string + sha512?: (ArrayBuffer | ArrayBufferView) | string + storageClass?: string + ssecKey?: ArrayBuffer | string +} +interface R2MultipartOptions { + httpMetadata?: R2HTTPMetadata | Headers + customMetadata?: Record + storageClass?: string + ssecKey?: ArrayBuffer | string +} +interface R2Checksums { + readonly md5?: ArrayBuffer + readonly sha1?: ArrayBuffer + readonly sha256?: ArrayBuffer + readonly sha384?: ArrayBuffer + readonly sha512?: ArrayBuffer + toJSON(): R2StringChecksums +} +interface R2StringChecksums { + md5?: string + sha1?: string + sha256?: string + sha384?: string + sha512?: string +} +interface R2HTTPMetadata { + contentType?: string + contentLanguage?: string + contentDisposition?: string + contentEncoding?: string + cacheControl?: string + cacheExpiry?: Date +} +type R2Objects = { + objects: R2Object[] + delimitedPrefixes: string[] +} & ( + | { + truncated: true + cursor: string + } + | { + truncated: false + } +) +interface R2UploadPartOptions { + ssecKey?: ArrayBuffer | string +} +declare abstract class ScheduledEvent extends ExtendableEvent { + readonly scheduledTime: number + readonly cron: string + noRetry(): void +} +interface ScheduledController { + readonly scheduledTime: number + readonly cron: string + noRetry(): void +} +interface QueuingStrategy { + highWaterMark?: number | bigint + size?: (chunk: T) => number | bigint +} +interface UnderlyingSink { + type?: string + start?: (controller: WritableStreamDefaultController) => void | Promise + write?: (chunk: W, controller: WritableStreamDefaultController) => void | Promise + abort?: (reason: any) => void | Promise + close?: () => void | Promise +} +interface UnderlyingByteSource { + type: 'bytes' + autoAllocateChunkSize?: number + start?: (controller: ReadableByteStreamController) => void | Promise + pull?: (controller: ReadableByteStreamController) => void | Promise + cancel?: (reason: any) => void | Promise +} +interface UnderlyingSource { + type?: '' | undefined + start?: (controller: ReadableStreamDefaultController) => void | Promise + pull?: (controller: ReadableStreamDefaultController) => void | Promise + cancel?: (reason: any) => void | Promise + expectedLength?: number | bigint +} +interface Transformer { + readableType?: string + writableType?: string + start?: (controller: TransformStreamDefaultController) => void | Promise + transform?: (chunk: I, controller: TransformStreamDefaultController) => void | Promise + flush?: (controller: TransformStreamDefaultController) => void | Promise + cancel?: (reason: any) => void | Promise + expectedLength?: number +} +interface StreamPipeOptions { + /** + * Pipes this readable stream to a given writable stream destination. The way in which the piping process behaves under various error conditions can be customized with a number of passed options. It returns a promise that fulfills when the piping process completes successfully, or rejects if any errors were encountered. + * + * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader. + * + * Errors and closures of the source and destination streams propagate as follows: + * + * An error in this source readable stream will abort destination, unless preventAbort is truthy. The returned promise will be rejected with the source's error, or with any error that occurs during aborting the destination. + * + * An error in destination will cancel this source readable stream, unless preventCancel is truthy. The returned promise will be rejected with the destination's error, or with any error that occurs during canceling the source. + * + * When this source readable stream closes, destination will be closed, unless preventClose is truthy. The returned promise will be fulfilled once this process completes, unless an error is encountered while closing the destination, in which case it will be rejected with that error. + * + * If destination starts out closed or closing, this source readable stream will be canceled, unless preventCancel is true. The returned promise will be rejected with an error indicating piping to a closed stream failed, or with any error that occurs during canceling the source. + * + * The signal option can be set to an AbortSignal to allow aborting an ongoing pipe operation via the corresponding AbortController. In this case, this source readable stream will be canceled, and destination aborted, unless the respective options preventCancel or preventAbort are set. + */ + preventClose?: boolean + preventAbort?: boolean + preventCancel?: boolean + signal?: AbortSignal +} +type ReadableStreamReadResult = + | { + done: false + value: R + } + | { + done: true + value?: undefined + } +/** + * This Streams API interface represents a readable stream of byte data. The Fetch API offers a concrete instance of a ReadableStream through the body property of a Response object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream) + */ +interface ReadableStream { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/locked) */ + get locked(): boolean + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/cancel) */ + cancel(reason?: any): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/getReader) */ + getReader(): ReadableStreamDefaultReader + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/getReader) */ + getReader(options: ReadableStreamGetReaderOptions): ReadableStreamBYOBReader + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/pipeThrough) */ + pipeThrough( + transform: ReadableWritablePair, + options?: StreamPipeOptions + ): ReadableStream + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/pipeTo) */ + pipeTo(destination: WritableStream, options?: StreamPipeOptions): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/tee) */ + tee(): [ReadableStream, ReadableStream] + values(options?: ReadableStreamValuesOptions): AsyncIterableIterator + [Symbol.asyncIterator](options?: ReadableStreamValuesOptions): AsyncIterableIterator +} +/** + * This Streams API interface represents a readable stream of byte data. The Fetch API offers a concrete instance of a ReadableStream through the body property of a Response object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream) + */ +declare const ReadableStream: { + prototype: ReadableStream + new ( + underlyingSource: UnderlyingByteSource, + strategy?: QueuingStrategy + ): ReadableStream + new ( + underlyingSource?: UnderlyingSource, + strategy?: QueuingStrategy + ): ReadableStream +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader) */ +declare class ReadableStreamDefaultReader { + constructor(stream: ReadableStream) + get closed(): Promise + cancel(reason?: any): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader/read) */ + read(): Promise> + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader/releaseLock) */ + releaseLock(): void +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader) */ +declare class ReadableStreamBYOBReader { + constructor(stream: ReadableStream) + get closed(): Promise + cancel(reason?: any): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader/read) */ + read(view: T): Promise> + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader/releaseLock) */ + releaseLock(): void + readAtLeast( + minElements: number, + view: T + ): Promise> +} +interface ReadableStreamBYOBReaderReadableStreamBYOBReaderReadOptions { + min?: number +} +interface ReadableStreamGetReaderOptions { + /** + * Creates a ReadableStreamBYOBReader and locks the stream to the new reader. + * + * This call behaves the same way as the no-argument variant, except that it only works on readable byte streams, i.e. streams which were constructed specifically with the ability to handle "bring your own buffer" reading. The returned BYOB reader provides the ability to directly read individual chunks from the stream via its read() method, into developer-supplied buffers, allowing more precise control over allocation. + */ + mode: 'byob' +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest) */ +declare abstract class ReadableStreamBYOBRequest { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest/view) */ + get view(): Uint8Array | null + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest/respond) */ + respond(bytesWritten: number): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest/respondWithNewView) */ + respondWithNewView(view: ArrayBuffer | ArrayBufferView): void + get atLeast(): number | null +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController) */ +declare abstract class ReadableStreamDefaultController { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/desiredSize) */ + get desiredSize(): number | null + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/close) */ + close(): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/enqueue) */ + enqueue(chunk?: R): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/error) */ + error(reason: any): void +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController) */ +declare abstract class ReadableByteStreamController { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/byobRequest) */ + get byobRequest(): ReadableStreamBYOBRequest | null + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/desiredSize) */ + get desiredSize(): number | null + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/close) */ + close(): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/enqueue) */ + enqueue(chunk: ArrayBuffer | ArrayBufferView): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/error) */ + error(reason: any): void +} +/** + * This Streams API interface represents a controller allowing control of a WritableStream's state. When constructing a WritableStream, the underlying sink is given a corresponding WritableStreamDefaultController instance to manipulate. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultController) + */ +declare abstract class WritableStreamDefaultController { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultController/signal) */ + get signal(): AbortSignal + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultController/error) */ + error(reason?: any): void +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController) */ +declare abstract class TransformStreamDefaultController { + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/desiredSize) */ + get desiredSize(): number | null + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/enqueue) */ + enqueue(chunk?: O): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/error) */ + error(reason: any): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/terminate) */ + terminate(): void +} +interface ReadableWritablePair { + /** + * Provides a convenient, chainable way of piping this readable stream through a transform stream (or any other { writable, readable } pair). It simply pipes the stream into the writable side of the supplied pair, and returns the readable side for further use. + * + * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader. + */ + writable: WritableStream + readable: ReadableStream +} +/** + * This Streams API interface provides a standard abstraction for writing streaming data to a destination, known as a sink. This object comes with built-in backpressure and queuing. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream) + */ +declare class WritableStream { + constructor(underlyingSink?: UnderlyingSink, queuingStrategy?: QueuingStrategy) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/locked) */ + get locked(): boolean + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/abort) */ + abort(reason?: any): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/close) */ + close(): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/getWriter) */ + getWriter(): WritableStreamDefaultWriter +} +/** + * This Streams API interface is the object returned by WritableStream.getWriter() and once created locks the < writer to the WritableStream ensuring that no other streams can write to the underlying sink. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter) + */ +declare class WritableStreamDefaultWriter { + constructor(stream: WritableStream) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/closed) */ + get closed(): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/ready) */ + get ready(): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/desiredSize) */ + get desiredSize(): number | null + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/abort) */ + abort(reason?: any): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/close) */ + close(): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/write) */ + write(chunk?: W): Promise + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/releaseLock) */ + releaseLock(): void +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStream) */ +declare class TransformStream { + constructor( + transformer?: Transformer, + writableStrategy?: QueuingStrategy, + readableStrategy?: QueuingStrategy + ) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStream/readable) */ + get readable(): ReadableStream + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStream/writable) */ + get writable(): WritableStream +} +declare class FixedLengthStream extends IdentityTransformStream { + constructor( + expectedLength: number | bigint, + queuingStrategy?: IdentityTransformStreamQueuingStrategy + ) +} +declare class IdentityTransformStream extends TransformStream< + ArrayBuffer | ArrayBufferView, + Uint8Array +> { + constructor(queuingStrategy?: IdentityTransformStreamQueuingStrategy) +} +interface IdentityTransformStreamQueuingStrategy { + highWaterMark?: number | bigint +} +interface ReadableStreamValuesOptions { + preventCancel?: boolean +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CompressionStream) */ +declare class CompressionStream extends TransformStream { + constructor(format: 'gzip' | 'deflate' | 'deflate-raw') +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/DecompressionStream) */ +declare class DecompressionStream extends TransformStream< + ArrayBuffer | ArrayBufferView, + Uint8Array +> { + constructor(format: 'gzip' | 'deflate' | 'deflate-raw') +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoderStream) */ +declare class TextEncoderStream extends TransformStream { + constructor() + get encoding(): string +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextDecoderStream) */ +declare class TextDecoderStream extends TransformStream { + constructor(label?: string, options?: TextDecoderStreamTextDecoderStreamInit) + get encoding(): string + get fatal(): boolean + get ignoreBOM(): boolean +} +interface TextDecoderStreamTextDecoderStreamInit { + fatal?: boolean + ignoreBOM?: boolean +} +/** + * This Streams API interface provides a built-in byte length queuing strategy that can be used when constructing streams. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ByteLengthQueuingStrategy) + */ +declare class ByteLengthQueuingStrategy implements QueuingStrategy { + constructor(init: QueuingStrategyInit) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ByteLengthQueuingStrategy/highWaterMark) */ + get highWaterMark(): number + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ByteLengthQueuingStrategy/size) */ + get size(): (chunk?: any) => number +} +/** + * This Streams API interface provides a built-in byte length queuing strategy that can be used when constructing streams. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CountQueuingStrategy) + */ +declare class CountQueuingStrategy implements QueuingStrategy { + constructor(init: QueuingStrategyInit) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CountQueuingStrategy/highWaterMark) */ + get highWaterMark(): number + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CountQueuingStrategy/size) */ + get size(): (chunk?: any) => number +} +interface QueuingStrategyInit { + /** + * Creates a new ByteLengthQueuingStrategy with the provided high water mark. + * + * Note that the provided high water mark will not be validated ahead of time. Instead, if it is negative, NaN, or not a number, the resulting ByteLengthQueuingStrategy will cause the corresponding stream constructor to throw. + */ + highWaterMark: number +} +interface ScriptVersion { + id?: string + tag?: string + message?: string +} +declare abstract class TailEvent extends ExtendableEvent { + readonly events: TraceItem[] + readonly traces: TraceItem[] +} +interface TraceItem { + readonly event: + | ( + | TraceItemFetchEventInfo + | TraceItemJsRpcEventInfo + | TraceItemScheduledEventInfo + | TraceItemAlarmEventInfo + | TraceItemQueueEventInfo + | TraceItemEmailEventInfo + | TraceItemTailEventInfo + | TraceItemCustomEventInfo + | TraceItemHibernatableWebSocketEventInfo + ) + | null + readonly eventTimestamp: number | null + readonly logs: TraceLog[] + readonly exceptions: TraceException[] + readonly diagnosticsChannelEvents: TraceDiagnosticChannelEvent[] + readonly scriptName: string | null + readonly entrypoint?: string + readonly scriptVersion?: ScriptVersion + readonly dispatchNamespace?: string + readonly scriptTags?: string[] + readonly outcome: string + readonly executionModel: string + readonly truncated: boolean + readonly cpuTime: number + readonly wallTime: number +} +interface TraceItemAlarmEventInfo { + readonly scheduledTime: Date +} +interface TraceItemCustomEventInfo {} +interface TraceItemScheduledEventInfo { + readonly scheduledTime: number + readonly cron: string +} +interface TraceItemQueueEventInfo { + readonly queue: string + readonly batchSize: number +} +interface TraceItemEmailEventInfo { + readonly mailFrom: string + readonly rcptTo: string + readonly rawSize: number +} +interface TraceItemTailEventInfo { + readonly consumedEvents: TraceItemTailEventInfoTailItem[] +} +interface TraceItemTailEventInfoTailItem { + readonly scriptName: string | null +} +interface TraceItemFetchEventInfo { + readonly response?: TraceItemFetchEventInfoResponse + readonly request: TraceItemFetchEventInfoRequest +} +interface TraceItemFetchEventInfoRequest { + readonly cf?: any + readonly headers: Record + readonly method: string + readonly url: string + getUnredacted(): TraceItemFetchEventInfoRequest +} +interface TraceItemFetchEventInfoResponse { + readonly status: number +} +interface TraceItemJsRpcEventInfo { + readonly rpcMethod: string +} +interface TraceItemHibernatableWebSocketEventInfo { + readonly getWebSocketEvent: + | TraceItemHibernatableWebSocketEventInfoMessage + | TraceItemHibernatableWebSocketEventInfoClose + | TraceItemHibernatableWebSocketEventInfoError +} +interface TraceItemHibernatableWebSocketEventInfoMessage { + readonly webSocketEventType: string +} +interface TraceItemHibernatableWebSocketEventInfoClose { + readonly webSocketEventType: string + readonly code: number + readonly wasClean: boolean +} +interface TraceItemHibernatableWebSocketEventInfoError { + readonly webSocketEventType: string +} +interface TraceLog { + readonly timestamp: number + readonly level: string + readonly message: any +} +interface TraceException { + readonly timestamp: number + readonly message: string + readonly name: string + readonly stack?: string +} +interface TraceDiagnosticChannelEvent { + readonly timestamp: number + readonly channel: string + readonly message: any +} +interface TraceMetrics { + readonly cpuTime: number + readonly wallTime: number +} +interface UnsafeTraceMetrics { + fromTrace(item: TraceItem): TraceMetrics +} +/** + * The URL interface represents an object providing static methods used for creating object URLs. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL) + */ +declare class URL { + constructor(url: string | URL, base?: string | URL) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/origin) */ + get origin(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/href) */ + get href(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/href) */ + set href(value: string) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/protocol) */ + get protocol(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/protocol) */ + set protocol(value: string) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/username) */ + get username(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/username) */ + set username(value: string) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/password) */ + get password(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/password) */ + set password(value: string) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/host) */ + get host(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/host) */ + set host(value: string) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hostname) */ + get hostname(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hostname) */ + set hostname(value: string) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/port) */ + get port(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/port) */ + set port(value: string) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/pathname) */ + get pathname(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/pathname) */ + set pathname(value: string) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/search) */ + get search(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/search) */ + set search(value: string) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hash) */ + get hash(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hash) */ + set hash(value: string) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/searchParams) */ + get searchParams(): URLSearchParams + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/toJSON) */ + toJSON(): string + /*function toString() { [native code] }*/ + toString(): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/canParse_static) */ + static canParse(url: string, base?: string): boolean + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/parse_static) */ + static parse(url: string, base?: string): URL | null + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/createObjectURL_static) */ + static createObjectURL(object: File | Blob): string + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/revokeObjectURL_static) */ + static revokeObjectURL(object_url: string): void +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams) */ +declare class URLSearchParams { + constructor(init?: Iterable> | Record | string) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/size) */ + get size(): number + /** + * Appends a specified key/value pair as a new search parameter. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/append) + */ + append(name: string, value: string): void + /** + * Deletes the given search parameter, and its associated value, from the list of all search parameters. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/delete) + */ + delete(name: string, value?: string): void + /** + * Returns the first value associated to the given search parameter. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/get) + */ + get(name: string): string | null + /** + * Returns all the values association with a given search parameter. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/getAll) + */ + getAll(name: string): string[] + /** + * Returns a Boolean indicating if such a search parameter exists. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/has) + */ + has(name: string, value?: string): boolean + /** + * Sets the value associated to a given search parameter to the given value. If there were several values, delete the others. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/set) + */ + set(name: string, value: string): void + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/sort) */ + sort(): void + /* Returns an array of key, value pairs for every entry in the search params. */ + entries(): IterableIterator<[key: string, value: string]> + /* Returns a list of keys in the search params. */ + keys(): IterableIterator + /* Returns a list of values in the search params. */ + values(): IterableIterator + forEach( + callback: (this: This, value: string, key: string, parent: URLSearchParams) => void, + thisArg?: This + ): void + /*function toString() { [native code] } Returns a string containing a query string suitable for use in a URL. Does not include the question mark. */ + toString(): string + [Symbol.iterator](): IterableIterator<[key: string, value: string]> +} +declare class URLPattern { + constructor( + input?: string | URLPatternInit, + baseURL?: string | URLPatternOptions, + patternOptions?: URLPatternOptions + ) + get protocol(): string + get username(): string + get password(): string + get hostname(): string + get port(): string + get pathname(): string + get search(): string + get hash(): string + test(input?: string | URLPatternInit, baseURL?: string): boolean + exec(input?: string | URLPatternInit, baseURL?: string): URLPatternResult | null +} +interface URLPatternInit { + protocol?: string + username?: string + password?: string + hostname?: string + port?: string + pathname?: string + search?: string + hash?: string + baseURL?: string +} +interface URLPatternComponentResult { + input: string + groups: Record +} +interface URLPatternResult { + inputs: (string | URLPatternInit)[] + protocol: URLPatternComponentResult + username: URLPatternComponentResult + password: URLPatternComponentResult + hostname: URLPatternComponentResult + port: URLPatternComponentResult + pathname: URLPatternComponentResult + search: URLPatternComponentResult + hash: URLPatternComponentResult +} +interface URLPatternOptions { + ignoreCase?: boolean +} +/** + * A CloseEvent is sent to clients using WebSockets when the connection is closed. This is delivered to the listener indicated by the WebSocket object's onclose attribute. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent) + */ +declare class CloseEvent extends Event { + constructor(type: string, initializer?: CloseEventInit) + /** + * Returns the WebSocket connection close code provided by the server. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent/code) + */ + readonly code: number + /** + * Returns the WebSocket connection close reason provided by the server. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent/reason) + */ + readonly reason: string + /** + * Returns true if the connection closed cleanly; false otherwise. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent/wasClean) + */ + readonly wasClean: boolean +} +interface CloseEventInit { + code?: number + reason?: string + wasClean?: boolean +} +/** + * A message received by a target object. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent) + */ +declare class MessageEvent extends Event { + constructor(type: string, initializer: MessageEventInit) + /** + * Returns the data of the message. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/data) + */ + readonly data: ArrayBuffer | string +} +interface MessageEventInit { + data: ArrayBuffer | string +} +type WebSocketEventMap = { + close: CloseEvent + message: MessageEvent + open: Event + error: ErrorEvent +} +/** + * Provides the API for creating and managing a WebSocket connection to a server, as well as for sending and receiving data on the connection. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket) + */ +declare var WebSocket: { + prototype: WebSocket + new (url: string, protocols?: string[] | string): WebSocket + readonly READY_STATE_CONNECTING: number + readonly CONNECTING: number + readonly READY_STATE_OPEN: number + readonly OPEN: number + readonly READY_STATE_CLOSING: number + readonly CLOSING: number + readonly READY_STATE_CLOSED: number + readonly CLOSED: number +} +/** + * Provides the API for creating and managing a WebSocket connection to a server, as well as for sending and receiving data on the connection. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket) + */ +interface WebSocket extends EventTarget { + accept(): void + /** + * Transmits data using the WebSocket connection. data can be a string, a Blob, an ArrayBuffer, or an ArrayBufferView. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/send) + */ + send(message: (ArrayBuffer | ArrayBufferView) | string): void + /** + * Closes the WebSocket connection, optionally using code as the the WebSocket connection close code and reason as the the WebSocket connection close reason. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/close) + */ + close(code?: number, reason?: string): void + serializeAttachment(attachment: any): void + deserializeAttachment(): any | null + /** + * Returns the state of the WebSocket object's connection. It can have the values described below. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/readyState) + */ + readyState: number + /** + * Returns the URL that was used to establish the WebSocket connection. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/url) + */ + url: string | null + /** + * Returns the subprotocol selected by the server, if any. It can be used in conjunction with the array form of the constructor's second argument to perform subprotocol negotiation. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/protocol) + */ + protocol: string | null + /** + * Returns the extensions selected by the server, if any. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/extensions) + */ + extensions: string | null +} +declare const WebSocketPair: { + new (): { + 0: WebSocket + 1: WebSocket + } +} +interface SqlStorage { + exec>( + query: string, + ...bindings: any[] + ): SqlStorageCursor + get databaseSize(): number + Cursor: typeof SqlStorageCursor + Statement: typeof SqlStorageStatement +} +declare abstract class SqlStorageStatement {} +type SqlStorageValue = ArrayBuffer | string | number | null +declare abstract class SqlStorageCursor> { + next(): + | { + done?: false + value: T + } + | { + done: true + value?: never + } + toArray(): T[] + one(): T + raw(): IterableIterator + columnNames: string[] + get rowsRead(): number + get rowsWritten(): number + [Symbol.iterator](): IterableIterator +} +interface Socket { + get readable(): ReadableStream + get writable(): WritableStream + get closed(): Promise + get opened(): Promise + get upgraded(): boolean + get secureTransport(): 'on' | 'off' | 'starttls' + close(): Promise + startTls(options?: TlsOptions): Socket +} +interface SocketOptions { + secureTransport?: string + allowHalfOpen: boolean + highWaterMark?: number | bigint +} +interface SocketAddress { + hostname: string + port: number +} +interface TlsOptions { + expectedServerHostname?: string +} +interface SocketInfo { + remoteAddress?: string + localAddress?: string +} +/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource) */ +declare class EventSource extends EventTarget { + constructor(url: string, init?: EventSourceEventSourceInit) + /** + * Aborts any instances of the fetch algorithm started for this EventSource object, and sets the readyState attribute to CLOSED. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/close) + */ + close(): void + /** + * Returns the URL providing the event stream. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/url) + */ + get url(): string + /** + * Returns true if the credentials mode for connection requests to the URL providing the event stream is set to "include", and false otherwise. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/withCredentials) + */ + get withCredentials(): boolean + /** + * Returns the state of this EventSource object's connection. It can have the values described below. + * + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/readyState) + */ + get readyState(): number + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/open_event) */ + get onopen(): any | null + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/open_event) */ + set onopen(value: any | null) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/message_event) */ + get onmessage(): any | null + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/message_event) */ + set onmessage(value: any | null) + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/error_event) */ + get onerror(): any | null + /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/error_event) */ + set onerror(value: any | null) + static readonly CONNECTING: number + static readonly OPEN: number + static readonly CLOSED: number + static from(stream: ReadableStream): EventSource +} +interface EventSourceEventSourceInit { + withCredentials?: boolean + fetcher?: Fetcher +} +interface Container { + get running(): boolean + start(options?: ContainerStartupOptions): void + monitor(): Promise + destroy(error?: any): Promise + signal(signo: number): void + getTcpPort(port: number): Fetcher +} +interface ContainerStartupOptions { + entrypoint?: string[] + enableInternet: boolean + env?: Record +} +type AiImageClassificationInput = { + image: number[] +} +type AiImageClassificationOutput = { + score?: number + label?: string +}[] +declare abstract class BaseAiImageClassification { + inputs: AiImageClassificationInput + postProcessedOutputs: AiImageClassificationOutput +} +type AiImageToTextInput = { + image: number[] + prompt?: string + max_tokens?: number + temperature?: number + top_p?: number + top_k?: number + seed?: number + repetition_penalty?: number + frequency_penalty?: number + presence_penalty?: number + raw?: boolean + messages?: RoleScopedChatInput[] +} +type AiImageToTextOutput = { + description: string +} +declare abstract class BaseAiImageToText { + inputs: AiImageToTextInput + postProcessedOutputs: AiImageToTextOutput +} +type AiImageTextToTextInput = { + image: string + prompt?: string + max_tokens?: number + temperature?: number + ignore_eos?: boolean + top_p?: number + top_k?: number + seed?: number + repetition_penalty?: number + frequency_penalty?: number + presence_penalty?: number + raw?: boolean + messages?: RoleScopedChatInput[] +} +type AiImageTextToTextOutput = { + description: string +} +declare abstract class BaseAiImageTextToText { + inputs: AiImageTextToTextInput + postProcessedOutputs: AiImageTextToTextOutput +} +type AiObjectDetectionInput = { + image: number[] +} +type AiObjectDetectionOutput = { + score?: number + label?: string +}[] +declare abstract class BaseAiObjectDetection { + inputs: AiObjectDetectionInput + postProcessedOutputs: AiObjectDetectionOutput +} +type AiSentenceSimilarityInput = { + source: string + sentences: string[] +} +type AiSentenceSimilarityOutput = number[] +declare abstract class BaseAiSentenceSimilarity { + inputs: AiSentenceSimilarityInput + postProcessedOutputs: AiSentenceSimilarityOutput +} +type AiAutomaticSpeechRecognitionInput = { + audio: number[] +} +type AiAutomaticSpeechRecognitionOutput = { + text?: string + words?: { + word: string + start: number + end: number + }[] + vtt?: string +} +declare abstract class BaseAiAutomaticSpeechRecognition { + inputs: AiAutomaticSpeechRecognitionInput + postProcessedOutputs: AiAutomaticSpeechRecognitionOutput +} +type AiSummarizationInput = { + input_text: string + max_length?: number +} +type AiSummarizationOutput = { + summary: string +} +declare abstract class BaseAiSummarization { + inputs: AiSummarizationInput + postProcessedOutputs: AiSummarizationOutput +} +type AiTextClassificationInput = { + text: string +} +type AiTextClassificationOutput = { + score?: number + label?: string +}[] +declare abstract class BaseAiTextClassification { + inputs: AiTextClassificationInput + postProcessedOutputs: AiTextClassificationOutput +} +type AiTextEmbeddingsInput = { + text: string | string[] +} +type AiTextEmbeddingsOutput = { + shape: number[] + data: number[][] +} +declare abstract class BaseAiTextEmbeddings { + inputs: AiTextEmbeddingsInput + postProcessedOutputs: AiTextEmbeddingsOutput +} +type RoleScopedChatInput = { + role: 'user' | 'assistant' | 'system' | 'tool' | (string & NonNullable) + content: string + name?: string +} +type AiTextGenerationToolLegacyInput = { + name: string + description: string + parameters?: { + type: 'object' | (string & NonNullable) + properties: { + [key: string]: { + type: string + description?: string + } + } + required: string[] + } +} +type AiTextGenerationToolInput = { + type: 'function' | (string & NonNullable) + function: { + name: string + description: string + parameters?: { + type: 'object' | (string & NonNullable) + properties: { + [key: string]: { + type: string + description?: string + } + } + required: string[] + } + } +} +type AiTextGenerationFunctionsInput = { + name: string + code: string +} +type AiTextGenerationResponseFormat = { + type: string + json_schema?: any +} +type AiTextGenerationInput = { + prompt?: string + raw?: boolean + stream?: boolean + max_tokens?: number + temperature?: number + top_p?: number + top_k?: number + seed?: number + repetition_penalty?: number + frequency_penalty?: number + presence_penalty?: number + messages?: RoleScopedChatInput[] + response_format?: AiTextGenerationResponseFormat + tools?: + | AiTextGenerationToolInput[] + | AiTextGenerationToolLegacyInput[] + | (object & NonNullable) + functions?: AiTextGenerationFunctionsInput[] +} +type AiTextGenerationOutput = + | { + response?: string + tool_calls?: { + name: string + arguments: unknown + }[] + } + | ReadableStream +declare abstract class BaseAiTextGeneration { + inputs: AiTextGenerationInput + postProcessedOutputs: AiTextGenerationOutput +} +type AiTextToSpeechInput = { + prompt: string + lang?: string +} +type AiTextToSpeechOutput = + | Uint8Array + | { + audio: string + } +declare abstract class BaseAiTextToSpeech { + inputs: AiTextToSpeechInput + postProcessedOutputs: AiTextToSpeechOutput +} +type AiTextToImageInput = { + prompt: string + negative_prompt?: string + height?: number + width?: number + image?: number[] + image_b64?: string + mask?: number[] + num_steps?: number + strength?: number + guidance?: number + seed?: number +} +type AiTextToImageOutput = ReadableStream +declare abstract class BaseAiTextToImage { + inputs: AiTextToImageInput + postProcessedOutputs: AiTextToImageOutput +} +type AiTranslationInput = { + text: string + target_lang: string + source_lang?: string +} +type AiTranslationOutput = { + translated_text?: string +} +declare abstract class BaseAiTranslation { + inputs: AiTranslationInput + postProcessedOutputs: AiTranslationOutput +} +type Ai_Cf_Openai_Whisper_Input = + | string + | { + /** + * An array of integers that represent the audio data constrained to 8-bit unsigned integer values + */ + audio: number[] + } +interface Ai_Cf_Openai_Whisper_Output { + /** + * The transcription + */ + text: string + word_count?: number + words?: { + word?: string + /** + * The second this word begins in the recording + */ + start?: number + /** + * The ending second when the word completes + */ + end?: number + }[] + vtt?: string +} +declare abstract class Base_Ai_Cf_Openai_Whisper { + inputs: Ai_Cf_Openai_Whisper_Input + postProcessedOutputs: Ai_Cf_Openai_Whisper_Output +} +type Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Input = + | string + | { + /** + * The input text prompt for the model to generate a response. + */ + prompt?: string + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean + /** + * Controls the creativity of the AI's responses by adjusting how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number + /** + * Random seed for reproducibility of the generation. + */ + seed?: number + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number + image: number[] | (string & NonNullable) + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number + } +interface Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Output { + description?: string +} +declare abstract class Base_Ai_Cf_Unum_Uform_Gen2_Qwen_500M { + inputs: Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Input + postProcessedOutputs: Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Output +} +type Ai_Cf_Openai_Whisper_Tiny_En_Input = + | string + | { + /** + * An array of integers that represent the audio data constrained to 8-bit unsigned integer values + */ + audio: number[] + } +interface Ai_Cf_Openai_Whisper_Tiny_En_Output { + /** + * The transcription + */ + text: string + word_count?: number + words?: { + word?: string + /** + * The second this word begins in the recording + */ + start?: number + /** + * The ending second when the word completes + */ + end?: number + }[] + vtt?: string +} +declare abstract class Base_Ai_Cf_Openai_Whisper_Tiny_En { + inputs: Ai_Cf_Openai_Whisper_Tiny_En_Input + postProcessedOutputs: Ai_Cf_Openai_Whisper_Tiny_En_Output +} +interface Ai_Cf_Openai_Whisper_Large_V3_Turbo_Input { + /** + * Base64 encoded value of the audio data. + */ + audio: string + /** + * Supported tasks are 'translate' or 'transcribe'. + */ + task?: string + /** + * The language of the audio being transcribed or translated. + */ + language?: string + /** + * Preprocess the audio with a voice activity detection model. + */ + vad_filter?: string + /** + * A text prompt to help provide context to the model on the contents of the audio. + */ + initial_prompt?: string + /** + * The prefix it appended the the beginning of the output of the transcription and can guide the transcription result. + */ + prefix?: string +} +interface Ai_Cf_Openai_Whisper_Large_V3_Turbo_Output { + transcription_info?: { + /** + * The language of the audio being transcribed or translated. + */ + language?: string + /** + * The confidence level or probability of the detected language being accurate, represented as a decimal between 0 and 1. + */ + language_probability?: number + /** + * The total duration of the original audio file, in seconds. + */ + duration?: number + /** + * The duration of the audio after applying Voice Activity Detection (VAD) to remove silent or irrelevant sections, in seconds. + */ + duration_after_vad?: number + } + /** + * The complete transcription of the audio. + */ + text: string + /** + * The total number of words in the transcription. + */ + word_count?: number + segments?: { + /** + * The starting time of the segment within the audio, in seconds. + */ + start?: number + /** + * The ending time of the segment within the audio, in seconds. + */ + end?: number + /** + * The transcription of the segment. + */ + text?: string + /** + * The temperature used in the decoding process, controlling randomness in predictions. Lower values result in more deterministic outputs. + */ + temperature?: number + /** + * The average log probability of the predictions for the words in this segment, indicating overall confidence. + */ + avg_logprob?: number + /** + * The compression ratio of the input to the output, measuring how much the text was compressed during the transcription process. + */ + compression_ratio?: number + /** + * The probability that the segment contains no speech, represented as a decimal between 0 and 1. + */ + no_speech_prob?: number + words?: { + /** + * The individual word transcribed from the audio. + */ + word?: string + /** + * The starting time of the word within the audio, in seconds. + */ + start?: number + /** + * The ending time of the word within the audio, in seconds. + */ + end?: number + }[] + }[] + /** + * The transcription in WebVTT format, which includes timing and text information for use in subtitles. + */ + vtt?: string +} +declare abstract class Base_Ai_Cf_Openai_Whisper_Large_V3_Turbo { + inputs: Ai_Cf_Openai_Whisper_Large_V3_Turbo_Input + postProcessedOutputs: Ai_Cf_Openai_Whisper_Large_V3_Turbo_Output +} +type Ai_Cf_Baai_Bge_M3_Input = BGEM3InputQueryAndContexts | BGEM3InputEmbedding +interface BGEM3InputQueryAndContexts { + /** + * A query you wish to perform against the provided contexts. If no query is provided the model with respond with embeddings for contexts + */ + query?: string + /** + * List of provided contexts. Note that the index in this array is important, as the response will refer to it. + */ + contexts: { + /** + * One of the provided context content + */ + text?: string + }[] + /** + * When provided with too long context should the model error out or truncate the context to fit? + */ + truncate_inputs?: boolean +} +interface BGEM3InputEmbedding { + text: string | string[] + /** + * When provided with too long context should the model error out or truncate the context to fit? + */ + truncate_inputs?: boolean +} +type Ai_Cf_Baai_Bge_M3_Output = + | BGEM3OuputQuery + | BGEM3OutputEmbeddingForContexts + | BGEM3OuputEmbedding +interface BGEM3OuputQuery { + response?: { + /** + * Index of the context in the request + */ + id?: number + /** + * Score of the context under the index. + */ + score?: number + }[] +} +interface BGEM3OutputEmbeddingForContexts { + response?: number[][] + shape?: number[] + /** + * The pooling method used in the embedding process. + */ + pooling?: 'mean' | 'cls' +} +interface BGEM3OuputEmbedding { + shape?: number[] + /** + * Embeddings of the requested text values + */ + data?: number[][] + /** + * The pooling method used in the embedding process. + */ + pooling?: 'mean' | 'cls' +} +declare abstract class Base_Ai_Cf_Baai_Bge_M3 { + inputs: Ai_Cf_Baai_Bge_M3_Input + postProcessedOutputs: Ai_Cf_Baai_Bge_M3_Output +} +interface Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Input { + /** + * A text description of the image you want to generate. + */ + prompt: string + /** + * The number of diffusion steps; higher values can improve quality but take longer. + */ + steps?: number +} +interface Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Output { + /** + * The generated image in Base64 format. + */ + image?: string +} +declare abstract class Base_Ai_Cf_Black_Forest_Labs_Flux_1_Schnell { + inputs: Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Input + postProcessedOutputs: Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Output +} +type Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Input = Prompt | Messages +interface Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string + image?: number[] | (string & NonNullable) + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number + /** + * Random seed for reproducibility of the generation. + */ + seed?: number + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number + /** + * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model. + */ + lora?: string +} +interface Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role: string + /** + * The content of the message as a string. + */ + content: string + }[] + image?: number[] | string + functions?: { + name: string + code: string + }[] + /** + * A list of tools available for the assistant to use. + */ + tools?: ( + | { + /** + * The name of the tool. More descriptive the better. + */ + name: string + /** + * A brief description of what the tool does. + */ + description: string + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string + /** + * List of required parameter names. + */ + required?: string[] + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string + /** + * A description of the expected parameter. + */ + description: string + } + } + } + } + | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string + /** + * A brief description of what the function does. + */ + description: string + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string + /** + * List of required parameter names. + */ + required?: string[] + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string + /** + * A description of the expected parameter. + */ + description: string + } + } + } + } + } + )[] + /** + * If true, the response will be streamed back incrementally. + */ + stream?: boolean + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number + /** + * Controls the creativity of the AI's responses by adjusting how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number + /** + * Random seed for reproducibility of the generation. + */ + seed?: number + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number +} +type Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Output = + | { + /** + * The generated text response from the model + */ + response?: string + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object + /** + * The name of the tool to be called + */ + name?: string + }[] + } + | ReadableStream +declare abstract class Base_Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct { + inputs: Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Input + postProcessedOutputs: Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Output +} +interface Ai_Cf_Meta_Llama_Guard_3_8B_Input { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender must alternate between 'user' and 'assistant'. + */ + role: 'user' | 'assistant' + /** + * The content of the message as a string. + */ + content: string + }[] + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number + /** + * Dictate the output format of the generated response. + */ + response_format?: { + /** + * Set to json_object to process and output generated text as JSON. + */ + type?: string + } +} +interface Ai_Cf_Meta_Llama_Guard_3_8B_Output { + response?: + | string + | { + /** + * Whether the conversation is safe or not. + */ + safe?: boolean + /** + * A list of what hazard categories predicted for the conversation, if the conversation is deemed unsafe. + */ + categories?: string[] + } + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number + /** + * Total number of tokens in output + */ + completion_tokens?: number + /** + * Total number of input and output tokens + */ + total_tokens?: number + } +} +declare abstract class Base_Ai_Cf_Meta_Llama_Guard_3_8B { + inputs: Ai_Cf_Meta_Llama_Guard_3_8B_Input + postProcessedOutputs: Ai_Cf_Meta_Llama_Guard_3_8B_Output +} +interface Ai_Cf_Baai_Bge_Reranker_Base_Input { + /** + * A query you wish to perform against the provided contexts. + */ + /** + * Number of returned results starting with the best score. + */ + top_k?: number + /** + * List of provided contexts. Note that the index in this array is important, as the response will refer to it. + */ + contexts: { + /** + * One of the provided context content + */ + text?: string + }[] +} +interface Ai_Cf_Baai_Bge_Reranker_Base_Output { + response?: { + /** + * Index of the context in the request + */ + id?: number + /** + * Score of the context under the index. + */ + score?: number + }[] +} +declare abstract class Base_Ai_Cf_Baai_Bge_Reranker_Base { + inputs: Ai_Cf_Baai_Bge_Reranker_Base_Input + postProcessedOutputs: Ai_Cf_Baai_Bge_Reranker_Base_Output +} +type Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Input = + | Ai_Cf_Meta_Llama_4_Prompt + | Ai_Cf_Meta_Llama_4_Messages +interface Ai_Cf_Meta_Llama_4_Prompt { + /** + * The input text prompt for the model to generate a response. + */ + prompt: string + /** + * JSON schema that should be fulfilled for the response. + */ + guided_json?: object + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number + /** + * Random seed for reproducibility of the generation. + */ + seed?: number + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number +} +interface Ai_Cf_Meta_Llama_4_Messages { + /** + * An array of message objects representing the conversation history. + */ + messages: { + /** + * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool'). + */ + role?: string + /** + * The tool call id. Must be supplied for tool calls for Mistral-3. If you don't know what to put here you can fall back to 000000001 + */ + tool_call_id?: string + content?: + | string + | { + /** + * Type of the content provided + */ + type?: string + text?: string + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string + } + }[] + | { + /** + * Type of the content provided + */ + type?: string + text?: string + image_url?: { + /** + * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted + */ + url?: string + } + } + }[] + functions?: { + name: string + code: string + }[] + /** + * A list of tools available for the assistant to use. + */ + tools?: ( + | { + /** + * The name of the tool. More descriptive the better. + */ + name: string + /** + * A brief description of what the tool does. + */ + description: string + /** + * Schema defining the parameters accepted by the tool. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string + /** + * List of required parameter names. + */ + required?: string[] + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string + /** + * A description of the expected parameter. + */ + description: string + } + } + } + } + | { + /** + * Specifies the type of tool (e.g., 'function'). + */ + type: string + /** + * Details of the function tool. + */ + function: { + /** + * The name of the function. + */ + name: string + /** + * A brief description of what the function does. + */ + description: string + /** + * Schema defining the parameters accepted by the function. + */ + parameters: { + /** + * The type of the parameters object (usually 'object'). + */ + type: string + /** + * List of required parameter names. + */ + required?: string[] + /** + * Definitions of each parameter. + */ + properties: { + [k: string]: { + /** + * The data type of the parameter. + */ + type: string + /** + * A description of the expected parameter. + */ + description: string + } + } + } + } + } + )[] + /** + * JSON schema that should be fufilled for the response. + */ + guided_json?: object + /** + * If true, a chat template is not applied and you must adhere to the specific model's expected formatting. + */ + raw?: boolean + /** + * If true, the response will be streamed back incrementally using SSE, Server Sent Events. + */ + stream?: boolean + /** + * The maximum number of tokens to generate in the response. + */ + max_tokens?: number + /** + * Controls the randomness of the output; higher values produce more random results. + */ + temperature?: number + /** + * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses. + */ + top_p?: number + /** + * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises. + */ + top_k?: number + /** + * Random seed for reproducibility of the generation. + */ + seed?: number + /** + * Penalty for repeated tokens; higher values discourage repetition. + */ + repetition_penalty?: number + /** + * Decreases the likelihood of the model repeating the same lines verbatim. + */ + frequency_penalty?: number + /** + * Increases the likelihood of the model introducing new topics. + */ + presence_penalty?: number +} +type Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Output = + | { + /** + * The generated text response from the model + */ + response: string + /** + * Usage statistics for the inference request + */ + usage?: { + /** + * Total number of tokens in input + */ + prompt_tokens?: number + /** + * Total number of tokens in output + */ + completion_tokens?: number + /** + * Total number of input and output tokens + */ + total_tokens?: number + } + /** + * An array of tool calls requests made during the response generation + */ + tool_calls?: { + /** + * The arguments passed to be passed to the tool call request + */ + arguments?: object + /** + * The name of the tool to be called + */ + name?: string + }[] + } + | string +declare abstract class Base_Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct { + inputs: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Input + postProcessedOutputs: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Output +} +interface AiModels { + '@cf/huggingface/distilbert-sst-2-int8': BaseAiTextClassification + '@cf/stabilityai/stable-diffusion-xl-base-1.0': BaseAiTextToImage + '@cf/runwayml/stable-diffusion-v1-5-inpainting': BaseAiTextToImage + '@cf/runwayml/stable-diffusion-v1-5-img2img': BaseAiTextToImage + '@cf/lykon/dreamshaper-8-lcm': BaseAiTextToImage + '@cf/bytedance/stable-diffusion-xl-lightning': BaseAiTextToImage + '@cf/myshell-ai/melotts': BaseAiTextToSpeech + '@cf/baai/bge-base-en-v1.5': BaseAiTextEmbeddings + '@cf/baai/bge-small-en-v1.5': BaseAiTextEmbeddings + '@cf/baai/bge-large-en-v1.5': BaseAiTextEmbeddings + '@cf/microsoft/resnet-50': BaseAiImageClassification + '@cf/facebook/detr-resnet-50': BaseAiObjectDetection + '@cf/meta/llama-2-7b-chat-int8': BaseAiTextGeneration + '@cf/mistral/mistral-7b-instruct-v0.1': BaseAiTextGeneration + '@cf/meta/llama-2-7b-chat-fp16': BaseAiTextGeneration + '@hf/thebloke/llama-2-13b-chat-awq': BaseAiTextGeneration + '@hf/thebloke/mistral-7b-instruct-v0.1-awq': BaseAiTextGeneration + '@hf/thebloke/zephyr-7b-beta-awq': BaseAiTextGeneration + '@hf/thebloke/openhermes-2.5-mistral-7b-awq': BaseAiTextGeneration + '@hf/thebloke/neural-chat-7b-v3-1-awq': BaseAiTextGeneration + '@hf/thebloke/llamaguard-7b-awq': BaseAiTextGeneration + '@hf/thebloke/deepseek-coder-6.7b-base-awq': BaseAiTextGeneration + '@hf/thebloke/deepseek-coder-6.7b-instruct-awq': BaseAiTextGeneration + '@cf/deepseek-ai/deepseek-math-7b-instruct': BaseAiTextGeneration + '@cf/defog/sqlcoder-7b-2': BaseAiTextGeneration + '@cf/openchat/openchat-3.5-0106': BaseAiTextGeneration + '@cf/tiiuae/falcon-7b-instruct': BaseAiTextGeneration + '@cf/thebloke/discolm-german-7b-v1-awq': BaseAiTextGeneration + '@cf/qwen/qwen1.5-0.5b-chat': BaseAiTextGeneration + '@cf/qwen/qwen1.5-7b-chat-awq': BaseAiTextGeneration + '@cf/qwen/qwen1.5-14b-chat-awq': BaseAiTextGeneration + '@cf/tinyllama/tinyllama-1.1b-chat-v1.0': BaseAiTextGeneration + '@cf/microsoft/phi-2': BaseAiTextGeneration + '@cf/qwen/qwen1.5-1.8b-chat': BaseAiTextGeneration + '@cf/mistral/mistral-7b-instruct-v0.2-lora': BaseAiTextGeneration + '@hf/nousresearch/hermes-2-pro-mistral-7b': BaseAiTextGeneration + '@hf/nexusflow/starling-lm-7b-beta': BaseAiTextGeneration + '@hf/google/gemma-7b-it': BaseAiTextGeneration + '@cf/meta-llama/llama-2-7b-chat-hf-lora': BaseAiTextGeneration + '@cf/google/gemma-2b-it-lora': BaseAiTextGeneration + '@cf/google/gemma-7b-it-lora': BaseAiTextGeneration + '@hf/mistral/mistral-7b-instruct-v0.2': BaseAiTextGeneration + '@cf/meta/llama-3-8b-instruct': BaseAiTextGeneration + '@cf/fblgit/una-cybertron-7b-v2-bf16': BaseAiTextGeneration + '@cf/meta/llama-3-8b-instruct-awq': BaseAiTextGeneration + '@hf/meta-llama/meta-llama-3-8b-instruct': BaseAiTextGeneration + '@cf/meta/llama-3.1-8b-instruct': BaseAiTextGeneration + '@cf/meta/llama-3.1-8b-instruct-fp8': BaseAiTextGeneration + '@cf/meta/llama-3.1-8b-instruct-awq': BaseAiTextGeneration + '@cf/meta/llama-3.2-3b-instruct': BaseAiTextGeneration + '@cf/meta/llama-3.2-1b-instruct': BaseAiTextGeneration + '@cf/meta/llama-3.3-70b-instruct-fp8-fast': BaseAiTextGeneration + '@cf/deepseek-ai/deepseek-r1-distill-qwen-32b': BaseAiTextGeneration + '@cf/meta/m2m100-1.2b': BaseAiTranslation + '@cf/facebook/bart-large-cnn': BaseAiSummarization + '@cf/llava-hf/llava-1.5-7b-hf': BaseAiImageToText + '@cf/openai/whisper': Base_Ai_Cf_Openai_Whisper + '@cf/unum/uform-gen2-qwen-500m': Base_Ai_Cf_Unum_Uform_Gen2_Qwen_500M + '@cf/openai/whisper-tiny-en': Base_Ai_Cf_Openai_Whisper_Tiny_En + '@cf/openai/whisper-large-v3-turbo': Base_Ai_Cf_Openai_Whisper_Large_V3_Turbo + '@cf/baai/bge-m3': Base_Ai_Cf_Baai_Bge_M3 + '@cf/black-forest-labs/flux-1-schnell': Base_Ai_Cf_Black_Forest_Labs_Flux_1_Schnell + '@cf/meta/llama-3.2-11b-vision-instruct': Base_Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct + '@cf/meta/llama-guard-3-8b': Base_Ai_Cf_Meta_Llama_Guard_3_8B + '@cf/baai/bge-reranker-base': Base_Ai_Cf_Baai_Bge_Reranker_Base + '@cf/meta/llama-4-scout-17b-16e-instruct': Base_Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct +} +type AiOptions = { + gateway?: GatewayOptions + returnRawResponse?: boolean + prefix?: string + extraHeaders?: object +} +type ConversionResponse = { + name: string + mimeType: string + format: 'markdown' + tokens: number + data: string +} +type AiModelsSearchParams = { + author?: string + hide_experimental?: boolean + page?: number + per_page?: number + search?: string + source?: number + task?: string +} +type AiModelsSearchObject = { + id: string + source: number + name: string + description: string + task: { + id: string + name: string + description: string + } + tags: string[] + properties: { + property_id: string + value: string + }[] +} +interface InferenceUpstreamError extends Error {} +interface AiInternalError extends Error {} +type AiModelListType = Record +declare abstract class Ai { + aiGatewayLogId: string | null + gateway(gatewayId: string): AiGateway + autorag(autoragId: string): AutoRAG + run( + model: Name, + inputs: AiModelList[Name]['inputs'], + options?: Options + ): Promise< + Options extends { + returnRawResponse: true + } + ? Response + : AiModelList[Name]['postProcessedOutputs'] + > + models(params?: AiModelsSearchParams): Promise + toMarkdown( + files: { + name: string + blob: Blob + }[], + options?: { + gateway?: GatewayOptions + extraHeaders?: object + } + ): Promise + toMarkdown( + files: { + name: string + blob: Blob + }, + options?: { + gateway?: GatewayOptions + extraHeaders?: object + } + ): Promise +} +type GatewayRetries = { + maxAttempts?: 1 | 2 | 3 | 4 | 5 + retryDelayMs?: number + backoff?: 'constant' | 'linear' | 'exponential' +} +type GatewayOptions = { + id: string + cacheKey?: string + cacheTtl?: number + skipCache?: boolean + metadata?: Record + collectLog?: boolean + eventId?: string + requestTimeoutMs?: number + retries?: GatewayRetries +} +type AiGatewayPatchLog = { + score?: number | null + feedback?: -1 | 1 | null + metadata?: Record | null +} +type AiGatewayLog = { + id: string + provider: string + model: string + model_type?: string + path: string + duration: number + request_type?: string + request_content_type?: string + status_code: number + response_content_type?: string + success: boolean + cached: boolean + tokens_in?: number + tokens_out?: number + metadata?: Record + step?: number + cost?: number + custom_cost?: boolean + request_size: number + request_head?: string + request_head_complete: boolean + response_size: number + response_head?: string + response_head_complete: boolean + created_at: Date +} +type AIGatewayProviders = + | 'workers-ai' + | 'anthropic' + | 'aws-bedrock' + | 'azure-openai' + | 'google-vertex-ai' + | 'huggingface' + | 'openai' + | 'perplexity-ai' + | 'replicate' + | 'groq' + | 'cohere' + | 'google-ai-studio' + | 'mistral' + | 'grok' + | 'openrouter' + | 'deepseek' + | 'cerebras' + | 'cartesia' + | 'elevenlabs' + | 'adobe-firefly' +type AIGatewayHeaders = { + 'cf-aig-metadata': Record | string + 'cf-aig-custom-cost': + | { + per_token_in?: number + per_token_out?: number + } + | { + total_cost?: number + } + | string + 'cf-aig-cache-ttl': number | string + 'cf-aig-skip-cache': boolean | string + 'cf-aig-cache-key': string + 'cf-aig-event-id': string + 'cf-aig-request-timeout': number | string + 'cf-aig-max-attempts': number | string + 'cf-aig-retry-delay': number | string + 'cf-aig-backoff': string + 'cf-aig-collect-log': boolean | string + Authorization: string + 'Content-Type': string + [key: string]: string | number | boolean | object +} +type AIGatewayUniversalRequest = { + provider: AIGatewayProviders | string // eslint-disable-line + endpoint: string + headers: Partial + query: unknown +} +interface AiGatewayInternalError extends Error {} +interface AiGatewayLogNotFound extends Error {} +declare abstract class AiGateway { + patchLog(logId: string, data: AiGatewayPatchLog): Promise + getLog(logId: string): Promise + run( + data: AIGatewayUniversalRequest | AIGatewayUniversalRequest[], + options?: { + gateway?: GatewayOptions + extraHeaders?: object + } + ): Promise + getUrl(provider?: AIGatewayProviders | string): Promise // eslint-disable-line +} +interface AutoRAGInternalError extends Error {} +interface AutoRAGNotFoundError extends Error {} +interface AutoRAGUnauthorizedError extends Error {} +type ComparisonFilter = { + key: string + type: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' + value: string | number | boolean +} +type CompoundFilter = { + type: 'and' | 'or' + filters: ComparisonFilter[] +} +type AutoRagSearchRequest = { + query: string + filters?: CompoundFilter | ComparisonFilter + max_num_results?: number + ranking_options?: { + ranker?: string + score_threshold?: number + } + rewrite_query?: boolean +} +type AutoRagAiSearchRequest = AutoRagSearchRequest & { + stream?: boolean +} +type AutoRagAiSearchRequestStreaming = Omit & { + stream: true +} +type AutoRagSearchResponse = { + object: 'vector_store.search_results.page' + search_query: string + data: { + file_id: string + filename: string + score: number + attributes: Record + content: { + type: 'text' + text: string + }[] + }[] + has_more: boolean + next_page: string | null +} +type AutoRagAiSearchResponse = AutoRagSearchResponse & { + response: string +} +declare abstract class AutoRAG { + search(params: AutoRagSearchRequest): Promise + aiSearch(params: AutoRagAiSearchRequestStreaming): Promise + aiSearch(params: AutoRagAiSearchRequest): Promise + aiSearch(params: AutoRagAiSearchRequest): Promise +} +interface BasicImageTransformations { + /** + * Maximum width in image pixels. The value must be an integer. + */ + width?: number + /** + * Maximum height in image pixels. The value must be an integer. + */ + height?: number + /** + * Resizing mode as a string. It affects interpretation of width and height + * options: + * - scale-down: Similar to contain, but the image is never enlarged. If + * the image is larger than given width or height, it will be resized. + * Otherwise its original size will be kept. + * - contain: Resizes to maximum size that fits within the given width and + * height. If only a single dimension is given (e.g. only width), the + * image will be shrunk or enlarged to exactly match that dimension. + * Aspect ratio is always preserved. + * - cover: Resizes (shrinks or enlarges) to fill the entire area of width + * and height. If the image has an aspect ratio different from the ratio + * of width and height, it will be cropped to fit. + * - crop: The image will be shrunk and cropped to fit within the area + * specified by width and height. The image will not be enlarged. For images + * smaller than the given dimensions it's the same as scale-down. For + * images larger than the given dimensions, it's the same as cover. + * See also trim. + * - pad: Resizes to the maximum size that fits within the given width and + * height, and then fills the remaining area with a background color + * (white by default). Use of this mode is not recommended, as the same + * effect can be more efficiently achieved with the contain mode and the + * CSS object-fit: contain property. + * - squeeze: Stretches and deforms to the width and height given, even if it + * breaks aspect ratio + */ + fit?: 'scale-down' | 'contain' | 'cover' | 'crop' | 'pad' | 'squeeze' + /** + * When cropping with fit: "cover", this defines the side or point that should + * be left uncropped. The value is either a string + * "left", "right", "top", "bottom", "auto", or "center" (the default), + * or an object {x, y} containing focal point coordinates in the original + * image expressed as fractions ranging from 0.0 (top or left) to 1.0 + * (bottom or right), 0.5 being the center. {fit: "cover", gravity: "top"} will + * crop bottom or left and right sides as necessary, but won’t crop anything + * from the top. {fit: "cover", gravity: {x:0.5, y:0.2}} will crop each side to + * preserve as much as possible around a point at 20% of the height of the + * source image. + */ + gravity?: + | 'left' + | 'right' + | 'top' + | 'bottom' + | 'center' + | 'auto' + | 'entropy' + | BasicImageTransformationsGravityCoordinates + /** + * Background color to add underneath the image. Applies only to images with + * transparency (such as PNG). Accepts any CSS color (#RRGGBB, rgba(…), + * hsl(…), etc.) + */ + background?: string + /** + * Number of degrees (90, 180, 270) to rotate the image by. width and height + * options refer to axes after rotation. + */ + rotate?: 0 | 90 | 180 | 270 | 360 +} +interface BasicImageTransformationsGravityCoordinates { + x?: number + y?: number + mode?: 'remainder' | 'box-center' +} +/** + * In addition to the properties you can set in the RequestInit dict + * that you pass as an argument to the Request constructor, you can + * set certain properties of a `cf` object to control how Cloudflare + * features are applied to that new Request. + * + * Note: Currently, these properties cannot be tested in the + * playground. + */ +interface RequestInitCfProperties extends Record { + cacheEverything?: boolean + /** + * A request's cache key is what determines if two requests are + * "the same" for caching purposes. If a request has the same cache key + * as some previous request, then we can serve the same cached response for + * both. (e.g. 'some-key') + * + * Only available for Enterprise customers. + */ + cacheKey?: string + /** + * This allows you to append additional Cache-Tag response headers + * to the origin response without modifications to the origin server. + * This will allow for greater control over the Purge by Cache Tag feature + * utilizing changes only in the Workers process. + * + * Only available for Enterprise customers. + */ + cacheTags?: string[] + /** + * Force response to be cached for a given number of seconds. (e.g. 300) + */ + cacheTtl?: number + /** + * Force response to be cached for a given number of seconds based on the Origin status code. + * (e.g. { '200-299': 86400, '404': 1, '500-599': 0 }) + */ + cacheTtlByStatus?: Record + scrapeShield?: boolean + apps?: boolean + image?: RequestInitCfPropertiesImage + minify?: RequestInitCfPropertiesImageMinify + mirage?: boolean + polish?: 'lossy' | 'lossless' | 'off' + r2?: RequestInitCfPropertiesR2 + /** + * Redirects the request to an alternate origin server. You can use this, + * for example, to implement load balancing across several origins. + * (e.g.us-east.example.com) + * + * Note - For security reasons, the hostname set in resolveOverride must + * be proxied on the same Cloudflare zone of the incoming request. + * Otherwise, the setting is ignored. CNAME hosts are allowed, so to + * resolve to a host under a different domain or a DNS only domain first + * declare a CNAME record within your own zone’s DNS mapping to the + * external hostname, set proxy on Cloudflare, then set resolveOverride + * to point to that CNAME record. + */ + resolveOverride?: string +} +interface RequestInitCfPropertiesImageDraw extends BasicImageTransformations { + /** + * Absolute URL of the image file to use for the drawing. It can be any of + * the supported file formats. For drawing of watermarks or non-rectangular + * overlays we recommend using PNG or WebP images. + */ + url: string + /** + * Floating-point number between 0 (transparent) and 1 (opaque). + * For example, opacity: 0.5 makes overlay semitransparent. + */ + opacity?: number + /** + * - If set to true, the overlay image will be tiled to cover the entire + * area. This is useful for stock-photo-like watermarks. + * - If set to "x", the overlay image will be tiled horizontally only + * (form a line). + * - If set to "y", the overlay image will be tiled vertically only + * (form a line). + */ + repeat?: true | 'x' | 'y' + /** + * Position of the overlay image relative to a given edge. Each property is + * an offset in pixels. 0 aligns exactly to the edge. For example, left: 10 + * positions left side of the overlay 10 pixels from the left edge of the + * image it's drawn over. bottom: 0 aligns bottom of the overlay with bottom + * of the background image. + * + * Setting both left & right, or both top & bottom is an error. + * + * If no position is specified, the image will be centered. + */ + top?: number + left?: number + bottom?: number + right?: number +} +interface RequestInitCfPropertiesImage extends BasicImageTransformations { + /** + * Device Pixel Ratio. Default 1. Multiplier for width/height that makes it + * easier to specify higher-DPI sizes in . + */ + dpr?: number + /** + * Allows you to trim your image. Takes dpr into account and is performed before + * resizing or rotation. + * + * It can be used as: + * - left, top, right, bottom - it will specify the number of pixels to cut + * off each side + * - width, height - the width/height you'd like to end up with - can be used + * in combination with the properties above + * - border - this will automatically trim the surroundings of an image based on + * it's color. It consists of three properties: + * - color: rgb or hex representation of the color you wish to trim (todo: verify the rgba bit) + * - tolerance: difference from color to treat as color + * - keep: the number of pixels of border to keep + */ + trim?: + | 'border' + | { + top?: number + bottom?: number + left?: number + right?: number + width?: number + height?: number + border?: + | boolean + | { + color?: string + tolerance?: number + keep?: number + } + } + /** + * Quality setting from 1-100 (useful values are in 60-90 range). Lower values + * make images look worse, but load faster. The default is 85. It applies only + * to JPEG and WebP images. It doesn’t have any effect on PNG. + */ + quality?: number | 'low' | 'medium-low' | 'medium-high' | 'high' + /** + * Output format to generate. It can be: + * - avif: generate images in AVIF format. + * - webp: generate images in Google WebP format. Set quality to 100 to get + * the WebP-lossless format. + * - json: instead of generating an image, outputs information about the + * image, in JSON format. The JSON object will contain image size + * (before and after resizing), source image’s MIME type, file size, etc. + * - jpeg: generate images in JPEG format. + * - png: generate images in PNG format. + */ + format?: 'avif' | 'webp' | 'json' | 'jpeg' | 'png' | 'baseline-jpeg' | 'png-force' | 'svg' + /** + * Whether to preserve animation frames from input files. Default is true. + * Setting it to false reduces animations to still images. This setting is + * recommended when enlarging images or processing arbitrary user content, + * because large GIF animations can weigh tens or even hundreds of megabytes. + * It is also useful to set anim:false when using format:"json" to get the + * response quicker without the number of frames. + */ + anim?: boolean + /** + * What EXIF data should be preserved in the output image. Note that EXIF + * rotation and embedded color profiles are always applied ("baked in" into + * the image), and aren't affected by this option. Note that if the Polish + * feature is enabled, all metadata may have been removed already and this + * option may have no effect. + * - keep: Preserve most of EXIF metadata, including GPS location if there's + * any. + * - copyright: Only keep the copyright tag, and discard everything else. + * This is the default behavior for JPEG files. + * - none: Discard all invisible EXIF metadata. Currently WebP and PNG + * output formats always discard metadata. + */ + metadata?: 'keep' | 'copyright' | 'none' + /** + * Strength of sharpening filter to apply to the image. Floating-point + * number between 0 (no sharpening, default) and 10 (maximum). 1.0 is a + * recommended value for downscaled images. + */ + sharpen?: number + /** + * Radius of a blur filter (approximate gaussian). Maximum supported radius + * is 250. + */ + blur?: number + /** + * Overlays are drawn in the order they appear in the array (last array + * entry is the topmost layer). + */ + draw?: RequestInitCfPropertiesImageDraw[] + /** + * Fetching image from authenticated origin. Setting this property will + * pass authentication headers (Authorization, Cookie, etc.) through to + * the origin. + */ + 'origin-auth'?: 'share-publicly' + /** + * Adds a border around the image. The border is added after resizing. Border + * width takes dpr into account, and can be specified either using a single + * width property, or individually for each side. + */ + border?: + | { + color: string + width: number + } + | { + color: string + top: number + right: number + bottom: number + left: number + } + /** + * Increase brightness by a factor. A value of 1.0 equals no change, a value + * of 0.5 equals half brightness, and a value of 2.0 equals twice as bright. + * 0 is ignored. + */ + brightness?: number + /** + * Increase contrast by a factor. A value of 1.0 equals no change, a value of + * 0.5 equals low contrast, and a value of 2.0 equals high contrast. 0 is + * ignored. + */ + contrast?: number + /** + * Increase exposure by a factor. A value of 1.0 equals no change, a value of + * 0.5 darkens the image, and a value of 2.0 lightens the image. 0 is ignored. + */ + gamma?: number + /** + * Increase contrast by a factor. A value of 1.0 equals no change, a value of + * 0.5 equals low contrast, and a value of 2.0 equals high contrast. 0 is + * ignored. + */ + saturation?: number + /** + * Flips the images horizontally, vertically, or both. Flipping is applied before + * rotation, so if you apply flip=h,rotate=90 then the image will be flipped + * horizontally, then rotated by 90 degrees. + */ + flip?: 'h' | 'v' | 'hv' + /** + * Slightly reduces latency on a cache miss by selecting a + * quickest-to-compress file format, at a cost of increased file size and + * lower image quality. It will usually override the format option and choose + * JPEG over WebP or AVIF. We do not recommend using this option, except in + * unusual circumstances like resizing uncacheable dynamically-generated + * images. + */ + compression?: 'fast' +} +interface RequestInitCfPropertiesImageMinify { + javascript?: boolean + css?: boolean + html?: boolean +} +interface RequestInitCfPropertiesR2 { + /** + * Colo id of bucket that an object is stored in + */ + bucketColoId?: number +} +/** + * Request metadata provided by Cloudflare's edge. + */ +type IncomingRequestCfProperties = IncomingRequestCfPropertiesBase & + IncomingRequestCfPropertiesBotManagementEnterprise & + IncomingRequestCfPropertiesCloudflareForSaaSEnterprise & + IncomingRequestCfPropertiesGeographicInformation & + IncomingRequestCfPropertiesCloudflareAccessOrApiShield +interface IncomingRequestCfPropertiesBase extends Record { + /** + * [ASN](https://www.iana.org/assignments/as-numbers/as-numbers.xhtml) of the incoming request. + * + * @example 395747 + */ + asn: number + /** + * The organization which owns the ASN of the incoming request. + * + * @example "Google Cloud" + */ + asOrganization: string + /** + * The original value of the `Accept-Encoding` header if Cloudflare modified it. + * + * @example "gzip, deflate, br" + */ + clientAcceptEncoding?: string + /** + * The number of milliseconds it took for the request to reach your worker. + * + * @example 22 + */ + clientTcpRtt?: number + /** + * The three-letter [IATA](https://en.wikipedia.org/wiki/IATA_airport_code) + * airport code of the data center that the request hit. + * + * @example "DFW" + */ + colo: string + /** + * Represents the upstream's response to a + * [TCP `keepalive` message](https://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html) + * from cloudflare. + * + * For workers with no upstream, this will always be `1`. + * + * @example 3 + */ + edgeRequestKeepAliveStatus: IncomingRequestCfPropertiesEdgeRequestKeepAliveStatus + /** + * The HTTP Protocol the request used. + * + * @example "HTTP/2" + */ + httpProtocol: string + /** + * The browser-requested prioritization information in the request object. + * + * If no information was set, defaults to the empty string `""` + * + * @example "weight=192;exclusive=0;group=3;group-weight=127" + * @default "" + */ + requestPriority: string + /** + * The TLS version of the connection to Cloudflare. + * In requests served over plaintext (without TLS), this property is the empty string `""`. + * + * @example "TLSv1.3" + */ + tlsVersion: string + /** + * The cipher for the connection to Cloudflare. + * In requests served over plaintext (without TLS), this property is the empty string `""`. + * + * @example "AEAD-AES128-GCM-SHA256" + */ + tlsCipher: string + /** + * Metadata containing the [`HELLO`](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2) and [`FINISHED`](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.9) messages from this request's TLS handshake. + * + * If the incoming request was served over plaintext (without TLS) this field is undefined. + */ + tlsExportedAuthenticator?: IncomingRequestCfPropertiesExportedAuthenticatorMetadata +} +interface IncomingRequestCfPropertiesBotManagementBase { + /** + * Cloudflare’s [level of certainty](https://developers.cloudflare.com/bots/concepts/bot-score/) that a request comes from a bot, + * represented as an integer percentage between `1` (almost certainly a bot) and `99` (almost certainly human). + * + * @example 54 + */ + score: number + /** + * A boolean value that is true if the request comes from a good bot, like Google or Bing. + * Most customers choose to allow this traffic. For more details, see [Traffic from known bots](https://developers.cloudflare.com/firewall/known-issues-and-faq/#how-does-firewall-rules-handle-traffic-from-known-bots). + */ + verifiedBot: boolean + /** + * A boolean value that is true if the request originates from a + * Cloudflare-verified proxy service. + */ + corporateProxy: boolean + /** + * A boolean value that's true if the request matches [file extensions](https://developers.cloudflare.com/bots/reference/static-resources/) for many types of static resources. + */ + staticResource: boolean + /** + * List of IDs that correlate to the Bot Management heuristic detections made on a request (you can have multiple heuristic detections on the same request). + */ + detectionIds: number[] +} +interface IncomingRequestCfPropertiesBotManagement { + /** + * Results of Cloudflare's Bot Management analysis + */ + botManagement: IncomingRequestCfPropertiesBotManagementBase + /** + * Duplicate of `botManagement.score`. + * + * @deprecated + */ + clientTrustScore: number +} +interface IncomingRequestCfPropertiesBotManagementEnterprise + extends IncomingRequestCfPropertiesBotManagement { + /** + * Results of Cloudflare's Bot Management analysis + */ + botManagement: IncomingRequestCfPropertiesBotManagementBase & { + /** + * A [JA3 Fingerprint](https://developers.cloudflare.com/bots/concepts/ja3-fingerprint/) to help profile specific SSL/TLS clients + * across different destination IPs, Ports, and X509 certificates. + */ + ja3Hash: string + } +} +interface IncomingRequestCfPropertiesCloudflareForSaaSEnterprise { + /** + * Custom metadata set per-host in [Cloudflare for SaaS](https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/). + * + * This field is only present if you have Cloudflare for SaaS enabled on your account + * and you have followed the [required steps to enable it]((https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/domain-support/custom-metadata/)). + */ + hostMetadata: HostMetadata +} +interface IncomingRequestCfPropertiesCloudflareAccessOrApiShield { + /** + * Information about the client certificate presented to Cloudflare. + * + * This is populated when the incoming request is served over TLS using + * either Cloudflare Access or API Shield (mTLS) + * and the presented SSL certificate has a valid + * [Certificate Serial Number](https://ldapwiki.com/wiki/Certificate%20Serial%20Number) + * (i.e., not `null` or `""`). + * + * Otherwise, a set of placeholder values are used. + * + * The property `certPresented` will be set to `"1"` when + * the object is populated (i.e. the above conditions were met). + */ + tlsClientAuth: + | IncomingRequestCfPropertiesTLSClientAuth + | IncomingRequestCfPropertiesTLSClientAuthPlaceholder +} +/** + * Metadata about the request's TLS handshake + */ +interface IncomingRequestCfPropertiesExportedAuthenticatorMetadata { + /** + * The client's [`HELLO` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2), encoded in hexadecimal + * + * @example "44372ba35fa1270921d318f34c12f155dc87b682cf36a790cfaa3ba8737a1b5d" + */ + clientHandshake: string + /** + * The server's [`HELLO` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2), encoded in hexadecimal + * + * @example "44372ba35fa1270921d318f34c12f155dc87b682cf36a790cfaa3ba8737a1b5d" + */ + serverHandshake: string + /** + * The client's [`FINISHED` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.9), encoded in hexadecimal + * + * @example "084ee802fe1348f688220e2a6040a05b2199a761f33cf753abb1b006792d3f8b" + */ + clientFinished: string + /** + * The server's [`FINISHED` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.9), encoded in hexadecimal + * + * @example "084ee802fe1348f688220e2a6040a05b2199a761f33cf753abb1b006792d3f8b" + */ + serverFinished: string +} +/** + * Geographic data about the request's origin. + */ +interface IncomingRequestCfPropertiesGeographicInformation { + /** + * The [ISO 3166-1 Alpha 2](https://www.iso.org/iso-3166-country-codes.html) country code the request originated from. + * + * If your worker is [configured to accept TOR connections](https://support.cloudflare.com/hc/en-us/articles/203306930-Understanding-Cloudflare-Tor-support-and-Onion-Routing), this may also be `"T1"`, indicating a request that originated over TOR. + * + * If Cloudflare is unable to determine where the request originated this property is omitted. + * + * The country code `"T1"` is used for requests originating on TOR. + * + * @example "GB" + */ + country?: Iso3166Alpha2Code | 'T1' + /** + * If present, this property indicates that the request originated in the EU + * + * @example "1" + */ + isEUCountry?: '1' + /** + * A two-letter code indicating the continent the request originated from. + * + * @example "AN" + */ + continent?: ContinentCode + /** + * The city the request originated from + * + * @example "Austin" + */ + city?: string + /** + * Postal code of the incoming request + * + * @example "78701" + */ + postalCode?: string + /** + * Latitude of the incoming request + * + * @example "30.27130" + */ + latitude?: string + /** + * Longitude of the incoming request + * + * @example "-97.74260" + */ + longitude?: string + /** + * Timezone of the incoming request + * + * @example "America/Chicago" + */ + timezone?: string + /** + * If known, the ISO 3166-2 name for the first level region associated with + * the IP address of the incoming request + * + * @example "Texas" + */ + region?: string + /** + * If known, the ISO 3166-2 code for the first-level region associated with + * the IP address of the incoming request + * + * @example "TX" + */ + regionCode?: string + /** + * Metro code (DMA) of the incoming request + * + * @example "635" + */ + metroCode?: string +} +/** Data about the incoming request's TLS certificate */ +interface IncomingRequestCfPropertiesTLSClientAuth { + /** Always `"1"`, indicating that the certificate was presented */ + certPresented: '1' + /** + * Result of certificate verification. + * + * @example "FAILED:self signed certificate" + */ + certVerified: Exclude + /** The presented certificate's revokation status. + * + * - A value of `"1"` indicates the certificate has been revoked + * - A value of `"0"` indicates the certificate has not been revoked + */ + certRevoked: '1' | '0' + /** + * The certificate issuer's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) + * + * @example "CN=cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" + */ + certIssuerDN: string + /** + * The certificate subject's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) + * + * @example "CN=*.cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" + */ + certSubjectDN: string + /** + * The certificate issuer's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) ([RFC 2253](https://www.rfc-editor.org/rfc/rfc2253.html) formatted) + * + * @example "CN=cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" + */ + certIssuerDNRFC2253: string + /** + * The certificate subject's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) ([RFC 2253](https://www.rfc-editor.org/rfc/rfc2253.html) formatted) + * + * @example "CN=*.cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare" + */ + certSubjectDNRFC2253: string + /** The certificate issuer's distinguished name (legacy policies) */ + certIssuerDNLegacy: string + /** The certificate subject's distinguished name (legacy policies) */ + certSubjectDNLegacy: string + /** + * The certificate's serial number + * + * @example "00936EACBE07F201DF" + */ + certSerial: string + /** + * The certificate issuer's serial number + * + * @example "2489002934BDFEA34" + */ + certIssuerSerial: string + /** + * The certificate's Subject Key Identifier + * + * @example "BB:AF:7E:02:3D:FA:A6:F1:3C:84:8E:AD:EE:38:98:EC:D9:32:32:D4" + */ + certSKI: string + /** + * The certificate issuer's Subject Key Identifier + * + * @example "BB:AF:7E:02:3D:FA:A6:F1:3C:84:8E:AD:EE:38:98:EC:D9:32:32:D4" + */ + certIssuerSKI: string + /** + * The certificate's SHA-1 fingerprint + * + * @example "6b9109f323999e52259cda7373ff0b4d26bd232e" + */ + certFingerprintSHA1: string + /** + * The certificate's SHA-256 fingerprint + * + * @example "acf77cf37b4156a2708e34c4eb755f9b5dbbe5ebb55adfec8f11493438d19e6ad3f157f81fa3b98278453d5652b0c1fd1d71e5695ae4d709803a4d3f39de9dea" + */ + certFingerprintSHA256: string + /** + * The effective starting date of the certificate + * + * @example "Dec 22 19:39:00 2018 GMT" + */ + certNotBefore: string + /** + * The effective expiration date of the certificate + * + * @example "Dec 22 19:39:00 2018 GMT" + */ + certNotAfter: string +} +/** Placeholder values for TLS Client Authorization */ +interface IncomingRequestCfPropertiesTLSClientAuthPlaceholder { + certPresented: '0' + certVerified: 'NONE' + certRevoked: '0' + certIssuerDN: '' + certSubjectDN: '' + certIssuerDNRFC2253: '' + certSubjectDNRFC2253: '' + certIssuerDNLegacy: '' + certSubjectDNLegacy: '' + certSerial: '' + certIssuerSerial: '' + certSKI: '' + certIssuerSKI: '' + certFingerprintSHA1: '' + certFingerprintSHA256: '' + certNotBefore: '' + certNotAfter: '' +} +/** Possible outcomes of TLS verification */ +declare type CertVerificationStatus = + /** Authentication succeeded */ + | 'SUCCESS' + /** No certificate was presented */ + | 'NONE' + /** Failed because the certificate was self-signed */ + | 'FAILED:self signed certificate' + /** Failed because the certificate failed a trust chain check */ + | 'FAILED:unable to verify the first certificate' + /** Failed because the certificate not yet valid */ + | 'FAILED:certificate is not yet valid' + /** Failed because the certificate is expired */ + | 'FAILED:certificate has expired' + /** Failed for another unspecified reason */ + | 'FAILED' +/** + * An upstream endpoint's response to a TCP `keepalive` message from Cloudflare. + */ +declare type IncomingRequestCfPropertiesEdgeRequestKeepAliveStatus = + | 0 /** Unknown */ + | 1 /** no keepalives (not found) */ + | 2 /** no connection re-use, opening keepalive connection failed */ + | 3 /** no connection re-use, keepalive accepted and saved */ + | 4 /** connection re-use, refused by the origin server (`TCP FIN`) */ + | 5 /** connection re-use, accepted by the origin server */ +/** ISO 3166-1 Alpha-2 codes */ +declare type Iso3166Alpha2Code = + | 'AD' + | 'AE' + | 'AF' + | 'AG' + | 'AI' + | 'AL' + | 'AM' + | 'AO' + | 'AQ' + | 'AR' + | 'AS' + | 'AT' + | 'AU' + | 'AW' + | 'AX' + | 'AZ' + | 'BA' + | 'BB' + | 'BD' + | 'BE' + | 'BF' + | 'BG' + | 'BH' + | 'BI' + | 'BJ' + | 'BL' + | 'BM' + | 'BN' + | 'BO' + | 'BQ' + | 'BR' + | 'BS' + | 'BT' + | 'BV' + | 'BW' + | 'BY' + | 'BZ' + | 'CA' + | 'CC' + | 'CD' + | 'CF' + | 'CG' + | 'CH' + | 'CI' + | 'CK' + | 'CL' + | 'CM' + | 'CN' + | 'CO' + | 'CR' + | 'CU' + | 'CV' + | 'CW' + | 'CX' + | 'CY' + | 'CZ' + | 'DE' + | 'DJ' + | 'DK' + | 'DM' + | 'DO' + | 'DZ' + | 'EC' + | 'EE' + | 'EG' + | 'EH' + | 'ER' + | 'ES' + | 'ET' + | 'FI' + | 'FJ' + | 'FK' + | 'FM' + | 'FO' + | 'FR' + | 'GA' + | 'GB' + | 'GD' + | 'GE' + | 'GF' + | 'GG' + | 'GH' + | 'GI' + | 'GL' + | 'GM' + | 'GN' + | 'GP' + | 'GQ' + | 'GR' + | 'GS' + | 'GT' + | 'GU' + | 'GW' + | 'GY' + | 'HK' + | 'HM' + | 'HN' + | 'HR' + | 'HT' + | 'HU' + | 'ID' + | 'IE' + | 'IL' + | 'IM' + | 'IN' + | 'IO' + | 'IQ' + | 'IR' + | 'IS' + | 'IT' + | 'JE' + | 'JM' + | 'JO' + | 'JP' + | 'KE' + | 'KG' + | 'KH' + | 'KI' + | 'KM' + | 'KN' + | 'KP' + | 'KR' + | 'KW' + | 'KY' + | 'KZ' + | 'LA' + | 'LB' + | 'LC' + | 'LI' + | 'LK' + | 'LR' + | 'LS' + | 'LT' + | 'LU' + | 'LV' + | 'LY' + | 'MA' + | 'MC' + | 'MD' + | 'ME' + | 'MF' + | 'MG' + | 'MH' + | 'MK' + | 'ML' + | 'MM' + | 'MN' + | 'MO' + | 'MP' + | 'MQ' + | 'MR' + | 'MS' + | 'MT' + | 'MU' + | 'MV' + | 'MW' + | 'MX' + | 'MY' + | 'MZ' + | 'NA' + | 'NC' + | 'NE' + | 'NF' + | 'NG' + | 'NI' + | 'NL' + | 'NO' + | 'NP' + | 'NR' + | 'NU' + | 'NZ' + | 'OM' + | 'PA' + | 'PE' + | 'PF' + | 'PG' + | 'PH' + | 'PK' + | 'PL' + | 'PM' + | 'PN' + | 'PR' + | 'PS' + | 'PT' + | 'PW' + | 'PY' + | 'QA' + | 'RE' + | 'RO' + | 'RS' + | 'RU' + | 'RW' + | 'SA' + | 'SB' + | 'SC' + | 'SD' + | 'SE' + | 'SG' + | 'SH' + | 'SI' + | 'SJ' + | 'SK' + | 'SL' + | 'SM' + | 'SN' + | 'SO' + | 'SR' + | 'SS' + | 'ST' + | 'SV' + | 'SX' + | 'SY' + | 'SZ' + | 'TC' + | 'TD' + | 'TF' + | 'TG' + | 'TH' + | 'TJ' + | 'TK' + | 'TL' + | 'TM' + | 'TN' + | 'TO' + | 'TR' + | 'TT' + | 'TV' + | 'TW' + | 'TZ' + | 'UA' + | 'UG' + | 'UM' + | 'US' + | 'UY' + | 'UZ' + | 'VA' + | 'VC' + | 'VE' + | 'VG' + | 'VI' + | 'VN' + | 'VU' + | 'WF' + | 'WS' + | 'YE' + | 'YT' + | 'ZA' + | 'ZM' + | 'ZW' +/** The 2-letter continent codes Cloudflare uses */ +declare type ContinentCode = 'AF' | 'AN' | 'AS' | 'EU' | 'NA' | 'OC' | 'SA' +type CfProperties = + | IncomingRequestCfProperties + | RequestInitCfProperties +interface D1Meta { + duration: number + size_after: number + rows_read: number + rows_written: number + last_row_id: number + changed_db: boolean + changes: number + /** + * The region of the database instance that executed the query. + */ + served_by_region?: string + /** + * True if-and-only-if the database instance that executed the query was the primary. + */ + served_by_primary?: boolean + timings?: { + /** + * The duration of the SQL query execution by the database instance. It doesn't include any network time. + */ + sql_duration_ms: number + } +} +interface D1Response { + success: true + meta: D1Meta & Record + error?: never +} +type D1Result = D1Response & { + results: T[] +} +interface D1ExecResult { + count: number + duration: number +} +type D1SessionConstraint = + // Indicates that the first query should go to the primary, and the rest queries + // using the same D1DatabaseSession will go to any replica that is consistent with + // the bookmark maintained by the session (returned by the first query). + | 'first-primary' + // Indicates that the first query can go anywhere (primary or replica), and the rest queries + // using the same D1DatabaseSession will go to any replica that is consistent with + // the bookmark maintained by the session (returned by the first query). + | 'first-unconstrained' +type D1SessionBookmark = string +declare abstract class D1Database { + prepare(query: string): D1PreparedStatement + batch(statements: D1PreparedStatement[]): Promise[]> + exec(query: string): Promise + /** + * Creates a new D1 Session anchored at the given constraint or the bookmark. + * All queries executed using the created session will have sequential consistency, + * meaning that all writes done through the session will be visible in subsequent reads. + * + * @param constraintOrBookmark Either the session constraint or the explicit bookmark to anchor the created session. + */ + withSession(constraintOrBookmark?: D1SessionBookmark | D1SessionConstraint): D1DatabaseSession + /** + * @deprecated dump() will be removed soon, only applies to deprecated alpha v1 databases. + */ + dump(): Promise +} +declare abstract class D1DatabaseSession { + prepare(query: string): D1PreparedStatement + batch(statements: D1PreparedStatement[]): Promise[]> + /** + * @returns The latest session bookmark across all executed queries on the session. + * If no query has been executed yet, `null` is returned. + */ + getBookmark(): D1SessionBookmark | null +} +declare abstract class D1PreparedStatement { + bind(...values: unknown[]): D1PreparedStatement + first(colName: string): Promise + first>(): Promise + run>(): Promise> + all>(): Promise> + raw(options: { columnNames: true }): Promise<[string[], ...T[]]> + raw(options?: { columnNames?: false }): Promise +} +// `Disposable` was added to TypeScript's standard lib types in version 5.2. +// To support older TypeScript versions, define an empty `Disposable` interface. +// Users won't be able to use `using`/`Symbol.dispose` without upgrading to 5.2, +// but this will ensure type checking on older versions still passes. +// TypeScript's interface merging will ensure our empty interface is effectively +// ignored when `Disposable` is included in the standard lib. +interface Disposable {} +/** + * An email message that can be sent from a Worker. + */ +interface EmailMessage { + /** + * Envelope From attribute of the email message. + */ + readonly from: string + /** + * Envelope To attribute of the email message. + */ + readonly to: string +} +/** + * An email message that is sent to a consumer Worker and can be rejected/forwarded. + */ +interface ForwardableEmailMessage extends EmailMessage { + /** + * Stream of the email message content. + */ + readonly raw: ReadableStream + /** + * An [Headers object](https://developer.mozilla.org/en-US/docs/Web/API/Headers). + */ + readonly headers: Headers + /** + * Size of the email message content. + */ + readonly rawSize: number + /** + * Reject this email message by returning a permanent SMTP error back to the connecting client including the given reason. + * @param reason The reject reason. + * @returns void + */ + setReject(reason: string): void + /** + * Forward this email message to a verified destination address of the account. + * @param rcptTo Verified destination address. + * @param headers A [Headers object](https://developer.mozilla.org/en-US/docs/Web/API/Headers). + * @returns A promise that resolves when the email message is forwarded. + */ + forward(rcptTo: string, headers?: Headers): Promise + /** + * Reply to the sender of this email message with a new EmailMessage object. + * @param message The reply message. + * @returns A promise that resolves when the email message is replied. + */ + reply(message: EmailMessage): Promise +} +/** + * A binding that allows a Worker to send email messages. + */ +interface SendEmail { + send(message: EmailMessage): Promise +} +declare abstract class EmailEvent extends ExtendableEvent { + readonly message: ForwardableEmailMessage +} +declare type EmailExportedHandler = ( + message: ForwardableEmailMessage, + env: Env, + ctx: ExecutionContext +) => void | Promise +declare module 'cloudflare:email' { + let _EmailMessage: { + prototype: EmailMessage + new (from: string, to: string, raw: ReadableStream | string): EmailMessage + } + export { _EmailMessage as EmailMessage } +} +interface Hyperdrive { + /** + * Connect directly to Hyperdrive as if it's your database, returning a TCP socket. + * + * Calling this method returns an idential socket to if you call + * `connect("host:port")` using the `host` and `port` fields from this object. + * Pick whichever approach works better with your preferred DB client library. + * + * Note that this socket is not yet authenticated -- it's expected that your + * code (or preferably, the client library of your choice) will authenticate + * using the information in this class's readonly fields. + */ + connect(): Socket + /** + * A valid DB connection string that can be passed straight into the typical + * client library/driver/ORM. This will typically be the easiest way to use + * Hyperdrive. + */ + readonly connectionString: string + /* + * A randomly generated hostname that is only valid within the context of the + * currently running Worker which, when passed into `connect()` function from + * the "cloudflare:sockets" module, will connect to the Hyperdrive instance + * for your database. + */ + readonly host: string + /* + * The port that must be paired the the host field when connecting. + */ + readonly port: number + /* + * The username to use when authenticating to your database via Hyperdrive. + * Unlike the host and password, this will be the same every time + */ + readonly user: string + /* + * The randomly generated password to use when authenticating to your + * database via Hyperdrive. Like the host field, this password is only valid + * within the context of the currently running Worker instance from which + * it's read. + */ + readonly password: string + /* + * The name of the database to connect to. + */ + readonly database: string +} +// Copyright (c) 2024 Cloudflare, Inc. +// Licensed under the Apache 2.0 license found in the LICENSE file or at: +// https://opensource.org/licenses/Apache-2.0 +type ImageInfoResponse = + | { + format: 'image/svg+xml' + } + | { + format: string + fileSize: number + width: number + height: number + } +type ImageTransform = { + width?: number + height?: number + background?: string + blur?: number + border?: + | { + color?: string + width?: number + } + | { + top?: number + bottom?: number + left?: number + right?: number + } + brightness?: number + contrast?: number + fit?: 'scale-down' | 'contain' | 'pad' | 'squeeze' | 'cover' | 'crop' + flip?: 'h' | 'v' | 'hv' + gamma?: number + gravity?: + | 'left' + | 'right' + | 'top' + | 'bottom' + | 'center' + | 'auto' + | 'entropy' + | { + x?: number + y?: number + mode: 'remainder' | 'box-center' + } + rotate?: 0 | 90 | 180 | 270 + saturation?: number + sharpen?: number + trim?: + | 'border' + | { + top?: number + bottom?: number + left?: number + right?: number + width?: number + height?: number + border?: + | boolean + | { + color?: string + tolerance?: number + keep?: number + } + } +} +type ImageDrawOptions = { + opacity?: number + repeat?: boolean | string + top?: number + left?: number + bottom?: number + right?: number +} +type ImageOutputOptions = { + format: 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp' | 'image/avif' | 'rgb' | 'rgba' + quality?: number + background?: string +} +interface ImagesBinding { + /** + * Get image metadata (type, width and height) + * @throws {@link ImagesError} with code 9412 if input is not an image + * @param stream The image bytes + */ + info(stream: ReadableStream): Promise + /** + * Begin applying a series of transformations to an image + * @param stream The image bytes + * @returns A transform handle + */ + input(stream: ReadableStream): ImageTransformer +} +interface ImageTransformer { + /** + * Apply transform next, returning a transform handle. + * You can then apply more transformations, draw, or retrieve the output. + * @param transform + */ + transform(transform: ImageTransform): ImageTransformer + /** + * Draw an image on this transformer, returning a transform handle. + * You can then apply more transformations, draw, or retrieve the output. + * @param image The image (or transformer that will give the image) to draw + * @param options The options configuring how to draw the image + */ + draw( + image: ReadableStream | ImageTransformer, + options?: ImageDrawOptions + ): ImageTransformer + /** + * Retrieve the image that results from applying the transforms to the + * provided input + * @param options Options that apply to the output e.g. output format + */ + output(options: ImageOutputOptions): Promise +} +interface ImageTransformationResult { + /** + * The image as a response, ready to store in cache or return to users + */ + response(): Response + /** + * The content type of the returned image + */ + contentType(): string + /** + * The bytes of the response + */ + image(): ReadableStream +} +interface ImagesError extends Error { + readonly code: number + readonly message: string + readonly stack?: string +} +type Params

= Record +type EventContext = { + request: Request> + functionPath: string + waitUntil: (promise: Promise) => void + passThroughOnException: () => void + next: (input?: Request | string, init?: RequestInit) => Promise + env: Env & { + ASSETS: { + fetch: typeof fetch + } + } + params: Params

+ data: Data +} +type PagesFunction< + Env = unknown, + Params extends string = any, + Data extends Record = Record, +> = (context: EventContext) => Response | Promise +type EventPluginContext = { + request: Request> + functionPath: string + waitUntil: (promise: Promise) => void + passThroughOnException: () => void + next: (input?: Request | string, init?: RequestInit) => Promise + env: Env & { + ASSETS: { + fetch: typeof fetch + } + } + params: Params

+ data: Data + pluginArgs: PluginArgs +} +type PagesPluginFunction< + Env = unknown, + Params extends string = any, + Data extends Record = Record, + PluginArgs = unknown, +> = (context: EventPluginContext) => Response | Promise +declare module 'assets:*' { + export const onRequest: PagesFunction +} +// Copyright (c) 2022-2023 Cloudflare, Inc. +// Licensed under the Apache 2.0 license found in the LICENSE file or at: +// https://opensource.org/licenses/Apache-2.0 +declare module 'cloudflare:pipelines' { + export abstract class PipelineTransformationEntrypoint< + Env = unknown, + I extends PipelineRecord = PipelineRecord, + O extends PipelineRecord = PipelineRecord, + > { + protected env: Env + protected ctx: ExecutionContext + constructor(ctx: ExecutionContext, env: Env) + /** + * run recieves an array of PipelineRecord which can be + * transformed and returned to the pipeline + * @param records Incoming records from the pipeline to be transformed + * @param metadata Information about the specific pipeline calling the transformation entrypoint + * @returns A promise containing the transformed PipelineRecord array + */ + public run(records: I[], metadata: PipelineBatchMetadata): Promise + } + export type PipelineRecord = Record + export type PipelineBatchMetadata = { + pipelineId: string + pipelineName: string + } + export interface Pipeline { + /** + * The Pipeline interface represents the type of a binding to a Pipeline + * + * @param records The records to send to the pipeline + */ + send(records: T[]): Promise + } +} +// PubSubMessage represents an incoming PubSub message. +// The message includes metadata about the broker, the client, and the payload +// itself. +// https://developers.cloudflare.com/pub-sub/ +interface PubSubMessage { + // Message ID + readonly mid: number + // MQTT broker FQDN in the form mqtts://BROKER.NAMESPACE.cloudflarepubsub.com:PORT + readonly broker: string + // The MQTT topic the message was sent on. + readonly topic: string + // The client ID of the client that published this message. + readonly clientId: string + // The unique identifier (JWT ID) used by the client to authenticate, if token + // auth was used. + readonly jti?: string + // A Unix timestamp (seconds from Jan 1, 1970), set when the Pub/Sub Broker + // received the message from the client. + readonly receivedAt: number + // An (optional) string with the MIME type of the payload, if set by the + // client. + readonly contentType: string + // Set to 1 when the payload is a UTF-8 string + // https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901063 + readonly payloadFormatIndicator: number + // Pub/Sub (MQTT) payloads can be UTF-8 strings, or byte arrays. + // You can use payloadFormatIndicator to inspect this before decoding. + payload: string | Uint8Array +} +// JsonWebKey extended by kid parameter +interface JsonWebKeyWithKid extends JsonWebKey { + // Key Identifier of the JWK + readonly kid: string +} +interface RateLimitOptions { + key: string +} +interface RateLimitOutcome { + success: boolean +} +interface RateLimit { + /** + * Rate limit a request based on the provided options. + * @see https://developers.cloudflare.com/workers/runtime-apis/bindings/rate-limit/ + * @returns A promise that resolves with the outcome of the rate limit. + */ + limit(options: RateLimitOptions): Promise +} +// Namespace for RPC utility types. Unfortunately, we can't use a `module` here as these types need +// to referenced by `Fetcher`. This is included in the "importable" version of the types which +// strips all `module` blocks. +declare namespace Rpc { + // Branded types for identifying `WorkerEntrypoint`/`DurableObject`/`Target`s. + // TypeScript uses *structural* typing meaning anything with the same shape as type `T` is a `T`. + // For the classes exported by `cloudflare:workers` we want *nominal* typing (i.e. we only want to + // accept `WorkerEntrypoint` from `cloudflare:workers`, not any other class with the same shape) + export const __RPC_STUB_BRAND: '__RPC_STUB_BRAND' + export const __RPC_TARGET_BRAND: '__RPC_TARGET_BRAND' + export const __WORKER_ENTRYPOINT_BRAND: '__WORKER_ENTRYPOINT_BRAND' + export const __DURABLE_OBJECT_BRAND: '__DURABLE_OBJECT_BRAND' + export const __WORKFLOW_ENTRYPOINT_BRAND: '__WORKFLOW_ENTRYPOINT_BRAND' + export interface RpcTargetBranded { + [__RPC_TARGET_BRAND]: never + } + export interface WorkerEntrypointBranded { + [__WORKER_ENTRYPOINT_BRAND]: never + } + export interface DurableObjectBranded { + [__DURABLE_OBJECT_BRAND]: never + } + export interface WorkflowEntrypointBranded { + [__WORKFLOW_ENTRYPOINT_BRAND]: never + } + export type EntrypointBranded = + | WorkerEntrypointBranded + | DurableObjectBranded + | WorkflowEntrypointBranded + // Types that can be used through `Stub`s + export type Stubable = RpcTargetBranded | ((...args: any[]) => any) + // Types that can be passed over RPC + // The reason for using a generic type here is to build a serializable subset of structured + // cloneable composite types. This allows types defined with the "interface" keyword to pass the + // serializable check as well. Otherwise, only types defined with the "type" keyword would pass. + type Serializable = + // Structured cloneables + | BaseType + // Structured cloneable composites + | Map< + T extends Map ? Serializable : never, + T extends Map ? Serializable : never + > + | Set ? Serializable : never> + | ReadonlyArray ? Serializable : never> + | { + [K in keyof T]: K extends number | string ? Serializable : never + } + // Special types + | Stub + // Serialized as stubs, see `Stubify` + | Stubable + // Base type for all RPC stubs, including common memory management methods. + // `T` is used as a marker type for unwrapping `Stub`s later. + interface StubBase extends Disposable { + [__RPC_STUB_BRAND]: T + dup(): this + } + export type Stub = Provider & StubBase + // This represents all the types that can be sent as-is over an RPC boundary + type BaseType = + | void + | undefined + | null + | boolean + | number + | bigint + | string + | TypedArray + | ArrayBuffer + | DataView + | Date + | Error + | RegExp + | ReadableStream + | WritableStream + | Request + | Response + | Headers + // Recursively rewrite all `Stubable` types with `Stub`s + // prettier-ignore + type Stubify = T extends Stubable ? Stub : T extends Map ? Map, Stubify> : T extends Set ? Set> : T extends Array ? Array> : T extends ReadonlyArray ? ReadonlyArray> : T extends BaseType ? T : T extends { + [key: string | number]: any; + } ? { + [K in keyof T]: Stubify; + } : T; + // Recursively rewrite all `Stub`s with the corresponding `T`s. + // Note we use `StubBase` instead of `Stub` here to avoid circular dependencies: + // `Stub` depends on `Provider`, which depends on `Unstubify`, which would depend on `Stub`. + // prettier-ignore + type Unstubify = T extends StubBase ? V : T extends Map ? Map, Unstubify> : T extends Set ? Set> : T extends Array ? Array> : T extends ReadonlyArray ? ReadonlyArray> : T extends BaseType ? T : T extends { + [key: string | number]: unknown; + } ? { + [K in keyof T]: Unstubify; + } : T; + type UnstubifyAll = { + [I in keyof A]: Unstubify + } + // Utility type for adding `Provider`/`Disposable`s to `object` types only. + // Note `unknown & T` is equivalent to `T`. + type MaybeProvider = T extends object ? Provider : unknown + type MaybeDisposable = T extends object ? Disposable : unknown + // Type for method return or property on an RPC interface. + // - Stubable types are replaced by stubs. + // - Serializable types are passed by value, with stubable types replaced by stubs + // and a top-level `Disposer`. + // Everything else can't be passed over PRC. + // Technically, we use custom thenables here, but they quack like `Promise`s. + // Intersecting with `(Maybe)Provider` allows pipelining. + // prettier-ignore + type Result = R extends Stubable ? Promise> & Provider : R extends Serializable ? Promise & MaybeDisposable> & MaybeProvider : never; + // Type for method or property on an RPC interface. + // For methods, unwrap `Stub`s in parameters, and rewrite returns to be `Result`s. + // Unwrapping `Stub`s allows calling with `Stubable` arguments. + // For properties, rewrite types to be `Result`s. + // In each case, unwrap `Promise`s. + type MethodOrProperty = V extends (...args: infer P) => infer R + ? (...args: UnstubifyAll

) => Result> + : Result> + // Type for the callable part of an `Provider` if `T` is callable. + // This is intersected with methods/properties. + type MaybeCallableProvider = T extends (...args: any[]) => any + ? MethodOrProperty + : unknown + // Base type for all other types providing RPC-like interfaces. + // Rewrites all methods/properties to be `MethodOrProperty`s, while preserving callable types. + // `Reserved` names (e.g. stub method names like `dup()`) and symbols can't be accessed over RPC. + export type Provider< + T extends object, + Reserved extends string = never, + > = MaybeCallableProvider & { + [K in Exclude>]: MethodOrProperty + } +} +declare namespace Cloudflare { + interface Env {} +} +declare module 'cloudflare:workers' { + export type RpcStub = Rpc.Stub + export const RpcStub: { + new (value: T): Rpc.Stub + } + export abstract class RpcTarget implements Rpc.RpcTargetBranded { + [Rpc.__RPC_TARGET_BRAND]: never + } + // `protected` fields don't appear in `keyof`s, so can't be accessed over RPC + export abstract class WorkerEntrypoint implements Rpc.WorkerEntrypointBranded { + [Rpc.__WORKER_ENTRYPOINT_BRAND]: never + protected ctx: ExecutionContext + protected env: Env + constructor(ctx: ExecutionContext, env: Env) + fetch?(request: Request): Response | Promise + tail?(events: TraceItem[]): void | Promise + trace?(traces: TraceItem[]): void | Promise + scheduled?(controller: ScheduledController): void | Promise + queue?(batch: MessageBatch): void | Promise + test?(controller: TestController): void | Promise + } + export abstract class DurableObject implements Rpc.DurableObjectBranded { + [Rpc.__DURABLE_OBJECT_BRAND]: never + protected ctx: DurableObjectState + protected env: Env + constructor(ctx: DurableObjectState, env: Env) + fetch?(request: Request): Response | Promise + alarm?(alarmInfo?: AlarmInvocationInfo): void | Promise + webSocketMessage?(ws: WebSocket, message: string | ArrayBuffer): void | Promise + webSocketClose?( + ws: WebSocket, + code: number, + reason: string, + wasClean: boolean + ): void | Promise + webSocketError?(ws: WebSocket, error: unknown): void | Promise + } + export type WorkflowDurationLabel = + | 'second' + | 'minute' + | 'hour' + | 'day' + | 'week' + | 'month' + | 'year' + export type WorkflowSleepDuration = `${number} ${WorkflowDurationLabel}${'s' | ''}` | number + export type WorkflowDelayDuration = WorkflowSleepDuration + export type WorkflowTimeoutDuration = WorkflowSleepDuration + export type WorkflowBackoff = 'constant' | 'linear' | 'exponential' + export type WorkflowStepConfig = { + retries?: { + limit: number + delay: WorkflowDelayDuration | number + backoff?: WorkflowBackoff + } + timeout?: WorkflowTimeoutDuration | number + } + export type WorkflowEvent = { + payload: Readonly + timestamp: Date + instanceId: string + } + export type WorkflowStepEvent = { + payload: Readonly + timestamp: Date + type: string + } + export abstract class WorkflowStep { + do>(name: string, callback: () => Promise): Promise + do>( + name: string, + config: WorkflowStepConfig, + callback: () => Promise + ): Promise + sleep: (name: string, duration: WorkflowSleepDuration) => Promise + sleepUntil: (name: string, timestamp: Date | number) => Promise + waitForEvent>( + name: string, + options: { + type: string + timeout?: WorkflowTimeoutDuration | number + } + ): Promise> + } + export abstract class WorkflowEntrypoint< + Env = unknown, + T extends Rpc.Serializable | unknown = unknown, + > implements Rpc.WorkflowEntrypointBranded + { + [Rpc.__WORKFLOW_ENTRYPOINT_BRAND]: never + protected ctx: ExecutionContext + protected env: Env + constructor(ctx: ExecutionContext, env: Env) + run(event: Readonly>, step: WorkflowStep): Promise + } + export const env: Cloudflare.Env +} +interface SecretsStoreSecret { + /** + * Get a secret from the Secrets Store, returning a string of the secret value + * if it exists, or throws an error if it does not exist + */ + get(): Promise +} +declare module 'cloudflare:sockets' { + function _connect(address: string | SocketAddress, options?: SocketOptions): Socket + export { _connect as connect } +} +declare namespace TailStream { + interface Header { + readonly name: string + readonly value: string + } + interface FetchEventInfo { + readonly type: 'fetch' + readonly method: string + readonly url: string + readonly cfJson: string + readonly headers: Header[] + } + interface JsRpcEventInfo { + readonly type: 'jsrpc' + readonly methodName: string + } + interface ScheduledEventInfo { + readonly type: 'scheduled' + readonly scheduledTime: Date + readonly cron: string + } + interface AlarmEventInfo { + readonly type: 'alarm' + readonly scheduledTime: Date + } + interface QueueEventInfo { + readonly type: 'queue' + readonly queueName: string + readonly batchSize: number + } + interface EmailEventInfo { + readonly type: 'email' + readonly mailFrom: string + readonly rcptTo: string + readonly rawSize: number + } + interface TraceEventInfo { + readonly type: 'trace' + readonly traces: (string | null)[] + } + interface HibernatableWebSocketEventInfoMessage { + readonly type: 'message' + } + interface HibernatableWebSocketEventInfoError { + readonly type: 'error' + } + interface HibernatableWebSocketEventInfoClose { + readonly type: 'close' + readonly code: number + readonly wasClean: boolean + } + interface HibernatableWebSocketEventInfo { + readonly type: 'hibernatableWebSocket' + readonly info: + | HibernatableWebSocketEventInfoClose + | HibernatableWebSocketEventInfoError + | HibernatableWebSocketEventInfoMessage + } + interface Resume { + readonly type: 'resume' + readonly attachment?: any + } + interface CustomEventInfo { + readonly type: 'custom' + } + interface FetchResponseInfo { + readonly type: 'fetch' + readonly statusCode: number + } + type EventOutcome = + | 'ok' + | 'canceled' + | 'exception' + | 'unknown' + | 'killSwitch' + | 'daemonDown' + | 'exceededCpu' + | 'exceededMemory' + | 'loadShed' + | 'responseStreamDisconnected' + | 'scriptNotFound' + interface ScriptVersion { + readonly id: string + readonly tag?: string + readonly message?: string + } + interface Trigger { + readonly traceId: string + readonly invocationId: string + readonly spanId: string + } + interface Onset { + readonly type: 'onset' + readonly dispatchNamespace?: string + readonly entrypoint?: string + readonly scriptName?: string + readonly scriptTags?: string[] + readonly scriptVersion?: ScriptVersion + readonly trigger?: Trigger + readonly info: + | FetchEventInfo + | JsRpcEventInfo + | ScheduledEventInfo + | AlarmEventInfo + | QueueEventInfo + | EmailEventInfo + | TraceEventInfo + | HibernatableWebSocketEventInfo + | Resume + | CustomEventInfo + } + interface Outcome { + readonly type: 'outcome' + readonly outcome: EventOutcome + readonly cpuTime: number + readonly wallTime: number + } + interface Hibernate { + readonly type: 'hibernate' + } + interface SpanOpen { + readonly type: 'spanOpen' + readonly name: string + readonly info?: FetchEventInfo | JsRpcEventInfo | Attributes + } + interface SpanClose { + readonly type: 'spanClose' + readonly outcome: EventOutcome + } + interface DiagnosticChannelEvent { + readonly type: 'diagnosticChannel' + readonly channel: string + readonly message: any + } + interface Exception { + readonly type: 'exception' + readonly name: string + readonly message: string + readonly stack?: string + } + interface Log { + readonly type: 'log' + readonly level: 'debug' | 'error' | 'info' | 'log' | 'warn' + readonly message: string + } + interface Return { + readonly type: 'return' + readonly info?: FetchResponseInfo | Attributes + } + interface Link { + readonly type: 'link' + readonly label?: string + readonly traceId: string + readonly invocationId: string + readonly spanId: string + } + interface Attribute { + readonly name: string + readonly value: + | string + | string[] + | boolean + | boolean[] + | number + | number[] + | bigint + | bigint[] + } + interface Attributes { + readonly type: 'attributes' + readonly info: Attribute[] + } + interface TailEvent { + readonly traceId: string + readonly invocationId: string + readonly spanId: string + readonly timestamp: Date + readonly sequence: number + readonly event: + | Onset + | Outcome + | Hibernate + | SpanOpen + | SpanClose + | DiagnosticChannelEvent + | Exception + | Log + | Return + | Link + | Attributes + } + type TailEventHandler = (event: TailEvent) => void | Promise + type TailEventHandlerName = + | 'outcome' + | 'hibernate' + | 'spanOpen' + | 'spanClose' + | 'diagnosticChannel' + | 'exception' + | 'log' + | 'return' + | 'link' + | 'attributes' + type TailEventHandlerObject = Record + type TailEventHandlerType = TailEventHandler | TailEventHandlerObject +} +// Copyright (c) 2022-2023 Cloudflare, Inc. +// Licensed under the Apache 2.0 license found in the LICENSE file or at: +// https://opensource.org/licenses/Apache-2.0 +/** + * Data types supported for holding vector metadata. + */ +type VectorizeVectorMetadataValue = string | number | boolean | string[] +/** + * Additional information to associate with a vector. + */ +type VectorizeVectorMetadata = + | VectorizeVectorMetadataValue + | Record +type VectorFloatArray = Float32Array | Float64Array +interface VectorizeError { + code?: number + error: string +} +/** + * Comparison logic/operation to use for metadata filtering. + * + * This list is expected to grow as support for more operations are released. + */ +type VectorizeVectorMetadataFilterOp = '$eq' | '$ne' +/** + * Filter criteria for vector metadata used to limit the retrieved query result set. + */ +type VectorizeVectorMetadataFilter = { + [field: string]: + | Exclude + | null + | { + [Op in VectorizeVectorMetadataFilterOp]?: Exclude< + VectorizeVectorMetadataValue, + string[] + > | null + } +} +/** + * Supported distance metrics for an index. + * Distance metrics determine how other "similar" vectors are determined. + */ +type VectorizeDistanceMetric = 'euclidean' | 'cosine' | 'dot-product' +/** + * Metadata return levels for a Vectorize query. + * + * Default to "none". + * + * @property all Full metadata for the vector return set, including all fields (including those un-indexed) without truncation. This is a more expensive retrieval, as it requires additional fetching & reading of un-indexed data. + * @property indexed Return all metadata fields configured for indexing in the vector return set. This level of retrieval is "free" in that no additional overhead is incurred returning this data. However, note that indexed metadata is subject to truncation (especially for larger strings). + * @property none No indexed metadata will be returned. + */ +type VectorizeMetadataRetrievalLevel = 'all' | 'indexed' | 'none' +interface VectorizeQueryOptions { + topK?: number + namespace?: string + returnValues?: boolean + returnMetadata?: boolean | VectorizeMetadataRetrievalLevel + filter?: VectorizeVectorMetadataFilter +} +/** + * Information about the configuration of an index. + */ +type VectorizeIndexConfig = + | { + dimensions: number + metric: VectorizeDistanceMetric + } + | { + preset: string // keep this generic, as we'll be adding more presets in the future and this is only in a read capacity + } +/** + * Metadata about an existing index. + * + * This type is exclusively for the Vectorize **beta** and will be deprecated once Vectorize RC is released. + * See {@link VectorizeIndexInfo} for its post-beta equivalent. + */ +interface VectorizeIndexDetails { + /** The unique ID of the index */ + readonly id: string + /** The name of the index. */ + name: string + /** (optional) A human readable description for the index. */ + description?: string + /** The index configuration, including the dimension size and distance metric. */ + config: VectorizeIndexConfig + /** The number of records containing vectors within the index. */ + vectorsCount: number +} +/** + * Metadata about an existing index. + */ +interface VectorizeIndexInfo { + /** The number of records containing vectors within the index. */ + vectorCount: number + /** Number of dimensions the index has been configured for. */ + dimensions: number + /** ISO 8601 datetime of the last processed mutation on in the index. All changes before this mutation will be reflected in the index state. */ + processedUpToDatetime: number + /** UUIDv4 of the last mutation processed by the index. All changes before this mutation will be reflected in the index state. */ + processedUpToMutation: number +} +/** + * Represents a single vector value set along with its associated metadata. + */ +interface VectorizeVector { + /** The ID for the vector. This can be user-defined, and must be unique. It should uniquely identify the object, and is best set based on the ID of what the vector represents. */ + id: string + /** The vector values */ + values: VectorFloatArray | number[] + /** The namespace this vector belongs to. */ + namespace?: string + /** Metadata associated with the vector. Includes the values of other fields and potentially additional details. */ + metadata?: Record +} +/** + * Represents a matched vector for a query along with its score and (if specified) the matching vector information. + */ +type VectorizeMatch = Pick, 'values'> & + Omit & { + /** The score or rank for similarity, when returned as a result */ + score: number + } +/** + * A set of matching {@link VectorizeMatch} for a particular query. + */ +interface VectorizeMatches { + matches: VectorizeMatch[] + count: number +} +/** + * Results of an operation that performed a mutation on a set of vectors. + * Here, `ids` is a list of vectors that were successfully processed. + * + * This type is exclusively for the Vectorize **beta** and will be deprecated once Vectorize RC is released. + * See {@link VectorizeAsyncMutation} for its post-beta equivalent. + */ +interface VectorizeVectorMutation { + /* List of ids of vectors that were successfully processed. */ + ids: string[] + /* Total count of the number of processed vectors. */ + count: number +} +/** + * Result type indicating a mutation on the Vectorize Index. + * Actual mutations are processed async where the `mutationId` is the unique identifier for the operation. + */ +interface VectorizeAsyncMutation { + /** The unique identifier for the async mutation operation containing the changeset. */ + mutationId: string +} +/** + * A Vectorize Vector Search Index for querying vectors/embeddings. + * + * This type is exclusively for the Vectorize **beta** and will be deprecated once Vectorize RC is released. + * See {@link Vectorize} for its new implementation. + */ +declare abstract class VectorizeIndex { + /** + * Get information about the currently bound index. + * @returns A promise that resolves with information about the current index. + */ + public describe(): Promise + /** + * Use the provided vector to perform a similarity search across the index. + * @param vector Input vector that will be used to drive the similarity search. + * @param options Configuration options to massage the returned data. + * @returns A promise that resolves with matched and scored vectors. + */ + public query( + vector: VectorFloatArray | number[], + options?: VectorizeQueryOptions + ): Promise + /** + * Insert a list of vectors into the index dataset. If a provided id exists, an error will be thrown. + * @param vectors List of vectors that will be inserted. + * @returns A promise that resolves with the ids & count of records that were successfully processed. + */ + public insert(vectors: VectorizeVector[]): Promise + /** + * Upsert a list of vectors into the index dataset. If a provided id exists, it will be replaced with the new values. + * @param vectors List of vectors that will be upserted. + * @returns A promise that resolves with the ids & count of records that were successfully processed. + */ + public upsert(vectors: VectorizeVector[]): Promise + /** + * Delete a list of vectors with a matching id. + * @param ids List of vector ids that should be deleted. + * @returns A promise that resolves with the ids & count of records that were successfully processed (and thus deleted). + */ + public deleteByIds(ids: string[]): Promise + /** + * Get a list of vectors with a matching id. + * @param ids List of vector ids that should be returned. + * @returns A promise that resolves with the raw unscored vectors matching the id set. + */ + public getByIds(ids: string[]): Promise +} +/** + * A Vectorize Vector Search Index for querying vectors/embeddings. + * + * Mutations in this version are async, returning a mutation id. + */ +declare abstract class Vectorize { + /** + * Get information about the currently bound index. + * @returns A promise that resolves with information about the current index. + */ + public describe(): Promise + /** + * Use the provided vector to perform a similarity search across the index. + * @param vector Input vector that will be used to drive the similarity search. + * @param options Configuration options to massage the returned data. + * @returns A promise that resolves with matched and scored vectors. + */ + public query( + vector: VectorFloatArray | number[], + options?: VectorizeQueryOptions + ): Promise + /** + * Use the provided vector-id to perform a similarity search across the index. + * @param vectorId Id for a vector in the index against which the index should be queried. + * @param options Configuration options to massage the returned data. + * @returns A promise that resolves with matched and scored vectors. + */ + public queryById(vectorId: string, options?: VectorizeQueryOptions): Promise + /** + * Insert a list of vectors into the index dataset. If a provided id exists, an error will be thrown. + * @param vectors List of vectors that will be inserted. + * @returns A promise that resolves with a unique identifier of a mutation containing the insert changeset. + */ + public insert(vectors: VectorizeVector[]): Promise + /** + * Upsert a list of vectors into the index dataset. If a provided id exists, it will be replaced with the new values. + * @param vectors List of vectors that will be upserted. + * @returns A promise that resolves with a unique identifier of a mutation containing the upsert changeset. + */ + public upsert(vectors: VectorizeVector[]): Promise + /** + * Delete a list of vectors with a matching id. + * @param ids List of vector ids that should be deleted. + * @returns A promise that resolves with a unique identifier of a mutation containing the delete changeset. + */ + public deleteByIds(ids: string[]): Promise + /** + * Get a list of vectors with a matching id. + * @param ids List of vector ids that should be returned. + * @returns A promise that resolves with the raw unscored vectors matching the id set. + */ + public getByIds(ids: string[]): Promise +} +/** + * The interface for "version_metadata" binding + * providing metadata about the Worker Version using this binding. + */ +type WorkerVersionMetadata = { + /** The ID of the Worker Version using this binding */ + id: string + /** The tag of the Worker Version using this binding */ + tag: string + /** The timestamp of when the Worker Version was uploaded */ + timestamp: string +} +interface DynamicDispatchLimits { + /** + * Limit CPU time in milliseconds. + */ + cpuMs?: number + /** + * Limit number of subrequests. + */ + subRequests?: number +} +interface DynamicDispatchOptions { + /** + * Limit resources of invoked Worker script. + */ + limits?: DynamicDispatchLimits + /** + * Arguments for outbound Worker script, if configured. + */ + outbound?: { + [key: string]: any + } +} +interface DispatchNamespace { + /** + * @param name Name of the Worker script. + * @param args Arguments to Worker script. + * @param options Options for Dynamic Dispatch invocation. + * @returns A Fetcher object that allows you to send requests to the Worker script. + * @throws If the Worker script does not exist in this dispatch namespace, an error will be thrown. + */ + get( + name: string, + args?: { + [key: string]: any + }, + options?: DynamicDispatchOptions + ): Fetcher +} +declare module 'cloudflare:workflows' { + /** + * NonRetryableError allows for a user to throw a fatal error + * that makes a Workflow instance fail immediately without triggering a retry + */ + export class NonRetryableError extends Error { + public constructor(message: string, name?: string) + } +} +declare abstract class Workflow { + /** + * Get a handle to an existing instance of the Workflow. + * @param id Id for the instance of this Workflow + * @returns A promise that resolves with a handle for the Instance + */ + public get(id: string): Promise + /** + * Create a new instance and return a handle to it. If a provided id exists, an error will be thrown. + * @param options Options when creating an instance including id and params + * @returns A promise that resolves with a handle for the Instance + */ + public create(options?: WorkflowInstanceCreateOptions): Promise + /** + * Create a batch of instances and return handle for all of them. If a provided id exists, an error will be thrown. + * `createBatch` is limited at 100 instances at a time or when the RPC limit for the batch (1MiB) is reached. + * @param batch List of Options when creating an instance including name and params + * @returns A promise that resolves with a list of handles for the created instances. + */ + public createBatch(batch: WorkflowInstanceCreateOptions[]): Promise +} +interface WorkflowInstanceCreateOptions { + /** + * An id for your Workflow instance. Must be unique within the Workflow. + */ + id?: string + /** + * The event payload the Workflow instance is triggered with + */ + params?: PARAMS +} +type InstanceStatus = { + status: + | 'queued' // means that instance is waiting to be started (see concurrency limits) + | 'running' + | 'paused' + | 'errored' + | 'terminated' // user terminated the instance while it was running + | 'complete' + | 'waiting' // instance is hibernating and waiting for sleep or event to finish + | 'waitingForPause' // instance is finishing the current work to pause + | 'unknown' + error?: string + output?: object +} +interface WorkflowError { + code?: number + message: string +} +declare abstract class WorkflowInstance { + public id: string + /** + * Pause the instance. + */ + public pause(): Promise + /** + * Resume the instance. If it is already running, an error will be thrown. + */ + public resume(): Promise + /** + * Terminate the instance. If it is errored, terminated or complete, an error will be thrown. + */ + public terminate(): Promise + /** + * Restart the instance. + */ + public restart(): Promise + /** + * Returns the current status of the instance. + */ + public status(): Promise + /** + * Send an event to this instance. + */ + public sendEvent({ type, payload }: { type: string; payload: unknown }): Promise +} diff --git a/products/mcp/typescript/wrangler.jsonc b/products/mcp/typescript/wrangler.jsonc new file mode 100644 index 0000000000..52ef131ac8 --- /dev/null +++ b/products/mcp/typescript/wrangler.jsonc @@ -0,0 +1,62 @@ +/** + * For more details on how to configure Wrangler, refer to: + * https://developers.cloudflare.com/workers/wrangler/configuration/ + */ +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "mcp1", + "main": "src/integrations/mcp/index.ts", + "compatibility_date": "2025-03-10", + "compatibility_flags": ["nodejs_compat"], + "migrations": [ + { + "new_sqlite_classes": ["MyMCP"], + "tag": "v1", + }, + ], + "durable_objects": { + "bindings": [ + { + "class_name": "MyMCP", + "name": "MCP_OBJECT", + }, + ], + }, + "observability": { + "enabled": true, + }, + /** + * Smart Placement + * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement + */ + // "placement": { "mode": "smart" }, + + /** + * Bindings + * Bindings allow your Worker to interact with resources on the Cloudflare Developer Platform, including + * databases, object storage, AI inference, real-time communication and more. + * https://developers.cloudflare.com/workers/runtime-apis/bindings/ + */ + + /** + * Environment Variables + * https://developers.cloudflare.com/workers/wrangler/configuration/#environment-variables + */ + // "vars": { "MY_VARIABLE": "production_value" }, + /** + * Note: Use secrets to store sensitive data. + * https://developers.cloudflare.com/workers/configuration/secrets/ + */ + + /** + * Static Assets + * https://developers.cloudflare.com/workers/static-assets/binding/ + */ + // "assets": { "directory": "./public/", "binding": "ASSETS" }, + + /** + * Service Bindings (communicate between multiple Workers) + * https://developers.cloudflare.com/workers/wrangler/configuration/#service-bindings + */ + // "services": [{ "binding": "MY_SERVICE", "service": "my-service" }] +}