devrev-Python-SDK 2.14.1__tar.gz → 3.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/PKG-INFO +1 -1
- devrev_python_sdk-3.0.0/docs/api/services/conversations.md +84 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/services/works.md +68 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/changelog.md +89 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/mcp/tools-reference.md +32 -4
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/openapi-spec-corrections.yaml +112 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/pyproject.toml +1 -1
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/conversations.py +8 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/works.py +16 -6
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/base.py +6 -2
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/conversations.py +156 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/works.py +295 -10
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/conversations.py +77 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/works.py +123 -7
- devrev_python_sdk-3.0.0/tests/integration/test_date_filtering.py +78 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/conftest.py +1 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_conversations.py +139 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_works.py +179 -1
- devrev_python_sdk-3.0.0/tests/unit/services/test_conversations.py +548 -0
- devrev_python_sdk-3.0.0/tests/unit/services/test_works.py +706 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/test_base_service.py +42 -0
- devrev_python_sdk-2.14.1/docs/api/services/conversations.md +0 -37
- devrev_python_sdk-2.14.1/tests/unit/services/test_conversations.py +0 -166
- devrev_python_sdk-2.14.1/tests/unit/services/test_works.py +0 -209
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/agents/bug-fixer.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/agents/builder.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/agents/documentation.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/agents/foreman.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/agents/pr-review-boss.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/agents/release-manager.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/agents/simplifier.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/agents/tester.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/commands/foreman-work.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/commands/release-prepare.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/commands/review-start.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/commands/simplify-code.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/rules/code-quality.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/rules/data-modeling.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/rules/devrev-sdk.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/rules/git-workflow.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/rules/pull-requests.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/rules/python-development.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/rules/security.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.augment/rules/testing.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.dockerignore +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.env.sample +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/ISSUE_TEMPLATE/article-artifact-simplification.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/dependabot.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/pull_request_template.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/workflows/api-check.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/workflows/ci.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/workflows/claude-code-review.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/workflows/claude.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/workflows/deploy.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/workflows/docs.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/workflows/integration-tests.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/workflows/release.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.github/workflows/sync-openapi.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.gitignore +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/.pre-commit-config.yaml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/CLAUDE.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/CODE_OF_CONDUCT.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/CONTRIBUTING.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/DEPRECATIONS.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/Dockerfile +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/KNOWN_ISSUES.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/OPENAPI_SPEC_DISCREPANCIES.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/README.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/SECURITY.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/augment-mcp-config-remote.json +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/augment-mcp-config.json +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/augment-settings.json +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/benchmarks/README.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/benchmarks/bench_http_client.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/benchmarks/bench_models.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/benchmarks/bench_pagination.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/benchmarks/conftest.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/context7.json +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/deploy/README.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/deploy/audit-logging-setup.sh +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/deploy/cloudbuild.yaml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/deploy/monitoring/README.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/deploy/monitoring/alert-policies.yaml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/deploy/monitoring/dashboard.json +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/deploy/monitoring/validate-config.sh +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/deploy/service.yaml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docker-compose.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/beta/brands.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/beta/engagements.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/beta/incidents.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/beta/index.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/beta/question-answers.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/beta/recommendations.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/beta/search.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/beta/uoms.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/beta-api-differences.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/client.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/config.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/exceptions.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/index.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/models/accounts.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/models/base.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/models/index.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/models/users.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/models/works.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/services/accounts.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/services/articles.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/services/code-changes.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/services/dev-users.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/services/groups.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/services/index.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/services/links.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/services/parts.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/services/rev-users.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/services/slas.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/services/tags.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/services/timeline-entries.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/api/services/webhooks.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/examples/advanced.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/examples/basic.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/examples/beta-features.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/examples/index.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/examples/integrations.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/getting-started/authentication.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/getting-started/index.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/getting-started/installation.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/getting-started/quickstart.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/guides/beta-api.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/guides/compatibility.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/guides/configuration.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/guides/error-handling.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/guides/github-actions-setup.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/guides/index.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/guides/logging.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/guides/pagination.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/guides/sync-vs-async.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/guides/testing.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/guides/version-support.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/guides/write-integration-testing-strategy.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/hooks/copy_llms.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/index.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/mcp/deployment.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/mcp/index.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/mcp/quickstart.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/docs/stylesheets/extra.css +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/README.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/basic/README.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/basic/async_example.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/basic/create_work.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/basic/error_handling.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/basic/list_accounts.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/basic/pagination.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/basic/search_users.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/integrations/cloud_functions/README.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/integrations/cloud_functions/main.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/integrations/cloud_functions/requirements.txt +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/integrations/fastapi/README.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/integrations/fastapi/main.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/integrations/fastapi/requirements.txt +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/integrations/flask/README.md +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/integrations/flask/app.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/examples/integrations/flask/requirements.txt +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/llms-ctx-full.txt +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/llms-ctx.txt +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/llms-mcp.txt +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/llms.txt +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/mkdocs.yml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/openapi-beta.yaml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/openapi-public.yaml +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/scripts/build_ai_docs.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/scripts/debug_articles.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/scripts/setup-github-secrets.sh +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/client.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/config.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/exceptions.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/accounts.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/articles.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/artifacts.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/base.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/brands.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/code_changes.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/dev_users.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/engagements.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/groups.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/incidents.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/links.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/notifications.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/parts.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/preferences.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/question_answers.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/recommendations.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/rev_orgs.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/rev_users.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/search.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/slas.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/sync.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/tags.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/tasks.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/timeline_entries.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/timeline_events.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/track_events.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/uoms.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/webhooks.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/models/widgets.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/py.typed +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/accounts.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/articles.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/artifacts.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/brands.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/code_changes.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/dev_users.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/engagements.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/groups.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/incidents.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/links.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/notifications.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/parts.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/preferences.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/question_answers.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/recommendations.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/rev_orgs.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/rev_users.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/search.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/slas.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/tags.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/timeline_entries.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/track_events.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/uoms.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/services/webhooks.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/utils/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/utils/content_converter.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/utils/deprecation.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/utils/http.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/utils/logging.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev/utils/pagination.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/__main__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/config.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/middleware/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/middleware/audit.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/middleware/auth.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/middleware/health.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/middleware/rate_limit.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/prompts/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/prompts/escalation.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/prompts/investigate.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/prompts/response.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/prompts/summarize.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/prompts/triage.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/resources/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/resources/account.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/resources/article.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/resources/conversation.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/resources/part.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/resources/server_info.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/resources/ticket.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/resources/user.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/server.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/accounts.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/articles.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/engagements.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/groups.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/incidents.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/links.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/parts.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/question_answers.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/recommendations.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/rev_orgs.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/search.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/server_info.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/slas.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/tags.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/timeline.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/tools/users.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/utils/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/utils/don_id.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/utils/errors.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/utils/formatting.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/src/devrev_mcp/utils/pagination.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/conftest.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/conftest.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_accounts_e2e.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_all_readonly_endpoints.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_articles_lifecycle.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_backwards_compatibility.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_contacts_e2e.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_core_services_phase1.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_extended_services_phase2.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_get_endpoints.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_issues_e2e.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_kb_articles_e2e.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_mcp_articles.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_ping.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_question_answers_e2e.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_readonly_endpoints.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_specialized_services_phase3.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_tickets_e2e.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/test_write_operations.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/utils/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/utils/cleanup.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/utils/constants.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/integration/utils/data_manager.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/performance/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/performance/test_articles_performance.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_audit.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_config.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_phase4_transport.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_prompts.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_resources.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_server_info.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_accounts.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_articles.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_engagements.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_groups.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_incidents.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_links.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_parts.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_question_answers.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_recommendations.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_search.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_slas.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_tags.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_timeline.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_tools_users.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/mcp/test_utils.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/models/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/models/test_user_state_regression.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/__init__.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/conftest.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_articles.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_async_services.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_brands.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_code_changes.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_engagements.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_groups.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_incidents.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_links.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_notifications.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_parts.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_preferences.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_question_answers.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_recommendations.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_search.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_slas.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_tags.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_timeline_entries.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_track_events.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_uoms.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/services/test_webhooks.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/test_articles_unified.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/test_artifacts.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/test_backward_compatibility.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/test_client.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/test_config.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/test_content_converter.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/test_deprecation.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/test_don_id_validation.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/test_error_handling.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/test_exceptions.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/test_http.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/test_logging.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/test_pagination.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/tests/unit/test_rev_orgs.py +0 -0
- {devrev_python_sdk-2.14.1 → devrev_python_sdk-3.0.0}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devrev-Python-SDK
|
|
3
|
-
Version:
|
|
3
|
+
Version: 3.0.0
|
|
4
4
|
Summary: A modern, type-safe Python SDK for the DevRev API
|
|
5
5
|
Project-URL: Homepage, https://github.com/mgmonteleone/py-dev-rev
|
|
6
6
|
Project-URL: Documentation, https://github.com/mgmonteleone/py-dev-rev
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Conversations Service
|
|
2
|
+
|
|
3
|
+
Manage customer conversations in DevRev.
|
|
4
|
+
|
|
5
|
+
## ConversationsService
|
|
6
|
+
|
|
7
|
+
::: devrev.services.conversations.ConversationsService
|
|
8
|
+
options:
|
|
9
|
+
show_source: true
|
|
10
|
+
|
|
11
|
+
## AsyncConversationsService
|
|
12
|
+
|
|
13
|
+
::: devrev.services.conversations.AsyncConversationsService
|
|
14
|
+
options:
|
|
15
|
+
show_source: true
|
|
16
|
+
|
|
17
|
+
## Usage Examples
|
|
18
|
+
|
|
19
|
+
### List Conversations
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
from devrev import DevRevClient
|
|
23
|
+
|
|
24
|
+
client = DevRevClient()
|
|
25
|
+
|
|
26
|
+
response = client.conversations.list(limit=20)
|
|
27
|
+
for conv in response.conversations:
|
|
28
|
+
print(f"{conv.id}: {conv.title}")
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Get Conversation
|
|
32
|
+
|
|
33
|
+
```python
|
|
34
|
+
response = client.conversations.get(id="don:core:dvrv-us-1:devo/1:conversation/123")
|
|
35
|
+
print(f"Title: {response.conversation.title}")
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Sort Order
|
|
39
|
+
|
|
40
|
+
`list` accepts a `sort_by` parameter. Both forms are accepted and normalized
|
|
41
|
+
to the server form before the request is sent:
|
|
42
|
+
|
|
43
|
+
- Canonical: `"modified_date:desc"`, `"created_date:asc"`
|
|
44
|
+
- Legacy shortcut: `"-modified_date"` (descending), `"created_date"` (ascending)
|
|
45
|
+
|
|
46
|
+
!!! note "Server requires `field:direction`"
|
|
47
|
+
The DevRev server rejects bare `"-field"` entries. The SDK normalizes
|
|
48
|
+
legacy shortcuts to the `field:direction` form on your behalf.
|
|
49
|
+
|
|
50
|
+
### List Conversations Modified Since
|
|
51
|
+
|
|
52
|
+
Use `list_modified_since` to stream conversations that changed within a recent
|
|
53
|
+
window. It pages server-side sorted `modified_date:desc` and stops as soon as
|
|
54
|
+
a record older than the cutoff is seen.
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
from datetime import datetime, timedelta, timezone
|
|
58
|
+
from devrev import DevRevClient
|
|
59
|
+
|
|
60
|
+
client = DevRevClient()
|
|
61
|
+
|
|
62
|
+
cutoff = datetime.now(timezone.utc) - timedelta(days=7)
|
|
63
|
+
recent = client.conversations.list_modified_since(cutoff, limit=200)
|
|
64
|
+
for conv in recent:
|
|
65
|
+
print(f"{conv.id}: {conv.title}")
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Async Usage
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
import asyncio
|
|
72
|
+
from datetime import datetime, timedelta, timezone
|
|
73
|
+
from devrev import AsyncDevRevClient
|
|
74
|
+
|
|
75
|
+
async def main():
|
|
76
|
+
async with AsyncDevRevClient() as client:
|
|
77
|
+
cutoff = datetime.now(timezone.utc) - timedelta(days=1)
|
|
78
|
+
recent = await client.conversations.list_modified_since(cutoff)
|
|
79
|
+
for conv in recent:
|
|
80
|
+
print(f"{conv.id}: {conv.title}")
|
|
81
|
+
|
|
82
|
+
asyncio.run(main())
|
|
83
|
+
```
|
|
84
|
+
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Manage work items (issues, tickets, tasks, opportunities) in DevRev.
|
|
4
4
|
|
|
5
|
+
In DevRev, **works** is the umbrella type covering tickets (customer support),
|
|
6
|
+
issues (engineering), and tasks.
|
|
7
|
+
|
|
5
8
|
## WorksService
|
|
6
9
|
|
|
7
10
|
::: devrev.services.works.WorksService
|
|
@@ -15,6 +18,8 @@ Manage work items (issues, tickets, tasks, opportunities) in DevRev.
|
|
|
15
18
|
- delete
|
|
16
19
|
- export
|
|
17
20
|
- count
|
|
21
|
+
- list_modified_since
|
|
22
|
+
- list_created_since
|
|
18
23
|
|
|
19
24
|
## AsyncWorksService
|
|
20
25
|
|
|
@@ -121,6 +126,65 @@ response = client.works.export(
|
|
|
121
126
|
print(f"Exported {len(response.works)} issues")
|
|
122
127
|
```
|
|
123
128
|
|
|
129
|
+
### Sort Order
|
|
130
|
+
|
|
131
|
+
`list` and `export` accept a `sort_by` parameter. Both forms are accepted and
|
|
132
|
+
normalized to the server form before the request is sent:
|
|
133
|
+
|
|
134
|
+
- Canonical: `"modified_date:desc"`, `"created_date:asc"`
|
|
135
|
+
- Legacy shortcut: `"-modified_date"` (descending), `"created_date"` (ascending)
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
# Canonical form
|
|
139
|
+
response = client.works.list(
|
|
140
|
+
type=[WorkType.TICKET],
|
|
141
|
+
sort_by=["modified_date:desc"],
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
# Legacy shortcut — normalized internally to "modified_date:desc"
|
|
145
|
+
response = client.works.list(
|
|
146
|
+
type=[WorkType.TICKET],
|
|
147
|
+
sort_by=["-modified_date"],
|
|
148
|
+
)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
!!! note "Server requires `field:direction`"
|
|
152
|
+
The DevRev server rejects bare `"-field"` entries. The SDK normalizes
|
|
153
|
+
legacy shortcuts to the `field:direction` form on your behalf — you do not
|
|
154
|
+
need to change existing call sites, but new code should prefer the
|
|
155
|
+
canonical form.
|
|
156
|
+
|
|
157
|
+
### List Work Items Modified or Created Since
|
|
158
|
+
|
|
159
|
+
Use `list_modified_since` / `list_created_since` to stream work items that
|
|
160
|
+
changed within a recent window. Both helpers page server-side sorted
|
|
161
|
+
`{timestamp_field}:desc` and early-exit as soon as a record older than the
|
|
162
|
+
cutoff is seen.
|
|
163
|
+
|
|
164
|
+
```python
|
|
165
|
+
from datetime import datetime, timedelta, timezone
|
|
166
|
+
from devrev import DevRevClient
|
|
167
|
+
from devrev.models import WorkType
|
|
168
|
+
|
|
169
|
+
client = DevRevClient()
|
|
170
|
+
|
|
171
|
+
cutoff = datetime.now(timezone.utc) - timedelta(days=7)
|
|
172
|
+
|
|
173
|
+
# All works modified in the last 7 days
|
|
174
|
+
recent = client.works.list_modified_since(
|
|
175
|
+
cutoff,
|
|
176
|
+
type=[WorkType.TICKET, WorkType.ISSUE],
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
# Cap total items; page_size tunes per-request page size
|
|
180
|
+
recent_capped = client.works.list_created_since(
|
|
181
|
+
cutoff,
|
|
182
|
+
type=[WorkType.TICKET],
|
|
183
|
+
limit=500,
|
|
184
|
+
page_size=100,
|
|
185
|
+
)
|
|
186
|
+
```
|
|
187
|
+
|
|
124
188
|
### Async Usage
|
|
125
189
|
|
|
126
190
|
```python
|
|
@@ -133,6 +197,10 @@ async def main():
|
|
|
133
197
|
for work in response.works:
|
|
134
198
|
print(f"[{work.type}] {work.title}")
|
|
135
199
|
|
|
200
|
+
# Async variants of the time-based helpers
|
|
201
|
+
cutoff = datetime.now(timezone.utc) - timedelta(days=1)
|
|
202
|
+
recent = await client.works.list_modified_since(cutoff)
|
|
203
|
+
|
|
136
204
|
asyncio.run(main())
|
|
137
205
|
```
|
|
138
206
|
|
|
@@ -7,6 +7,94 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
## [3.0.0] - 2026-04-22
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- **`WorksService.list_modified_since` and `list_created_since`** (CUSS-451) —
|
|
21
|
+
New sync and async helpers on `WorksService` / `AsyncWorksService` that
|
|
22
|
+
stream work items with `modified_date >= after` or `created_date >= after`.
|
|
23
|
+
Both page server-side sorted `{timestamp_field}:desc` and early-exit when a
|
|
24
|
+
record older than the cutoff is seen. Accept `type`, `owned_by`,
|
|
25
|
+
`applies_to_part`, `limit` (hard cap on total items), and `page_size`
|
|
26
|
+
(per-request page size).
|
|
27
|
+
- **`ConversationsService.list_modified_since`** (CUSS-451) — New sync and
|
|
28
|
+
async helper that streams conversations modified after a given datetime,
|
|
29
|
+
newest first. Pages via cursor until the server returns no further cursor,
|
|
30
|
+
`limit` is reached, or a conversation older than `after` is seen. Accepts
|
|
31
|
+
`limit` and `page_size`.
|
|
32
|
+
- **MCP tools for time-windowed queries** (CUSS-451) —
|
|
33
|
+
`devrev_works_list_modified_since`, `devrev_works_list_created_since`, and
|
|
34
|
+
`devrev_conversations_list_modified_since`. Each accepts an ISO-8601
|
|
35
|
+
`after` timestamp and optional `limit`.
|
|
36
|
+
- **`sort_by` and `modified_date_after` / `modified_date_before` on
|
|
37
|
+
`devrev_conversations_list` MCP tool** (CUSS-451) — Expose the same sort
|
|
38
|
+
and date-range filters already available in the SDK `list` request.
|
|
39
|
+
- **`sort_by` on `devrev_works_list` and `devrev_works_export` MCP tools**
|
|
40
|
+
(CUSS-451) — Forward the sort order down to the SDK.
|
|
41
|
+
|
|
42
|
+
### Changed / Breaking
|
|
43
|
+
|
|
44
|
+
- **BREAKING: `WorksListRequest` and `WorksExportRequest` no longer accept
|
|
45
|
+
date filter fields** (CUSS-451) — `WorksListRequest` previously exposed
|
|
46
|
+
`created_date` and `modified_date` fields, and `WorksExportRequest`
|
|
47
|
+
previously exposed a `created_date` field. These were aspirational: the
|
|
48
|
+
DevRev PUBLIC API rejects both filters on `/works.list` and
|
|
49
|
+
`/works.export` with `400 bad-request.bad-request-field`. The fields have
|
|
50
|
+
been removed from both request models. Existing callers that populate
|
|
51
|
+
`WorksListRequest(created_date=...)`,
|
|
52
|
+
`WorksListRequest(modified_date=...)`, or
|
|
53
|
+
`WorksExportRequest(created_date=...)` will now raise
|
|
54
|
+
`pydantic.ValidationError` at construction time.
|
|
55
|
+
|
|
56
|
+
**Migration**: use the new `WorksService.list_modified_since` /
|
|
57
|
+
`WorksService.list_created_since` helpers (sync and async), which page
|
|
58
|
+
server-side sorted `{timestamp_field}:desc` and early-exit on records
|
|
59
|
+
older than the cutoff. See `docs/api/services/works.md` for examples.
|
|
60
|
+
- **`sort_by` syntax normalization** (CUSS-451) — The DevRev server rejects
|
|
61
|
+
bare `"-field"` entries on `/works.list` and `/conversations.list` and
|
|
62
|
+
requires the canonical `"field:asc"` / `"field:desc"` form. `WorksService`
|
|
63
|
+
and `ConversationsService` now normalize both legacy `"-field"` /
|
|
64
|
+
`"field"` shortcuts and canonical `"field:direction"` entries to the
|
|
65
|
+
server form before sending the request. Existing call sites using the
|
|
66
|
+
`"-field"` shortcut continue to work unchanged; new code should prefer the
|
|
67
|
+
canonical form. Callers that previously sent `"-field"` directly to a
|
|
68
|
+
request model and bypassed the service layer will now see their input
|
|
69
|
+
normalized when they route through `WorksService.list` /
|
|
70
|
+
`ConversationsService.list`.
|
|
71
|
+
|
|
72
|
+
### Fixed
|
|
73
|
+
|
|
74
|
+
- **`/works.list` rejected bare `"-field"` sort entries** (CUSS-451) —
|
|
75
|
+
Integration tests observed the DevRev PUBLIC API returning an error for
|
|
76
|
+
bare `"-modified_date"` / `"-created_date"` sort values, requiring the
|
|
77
|
+
canonical `field:direction` form. `WorksService.list` /
|
|
78
|
+
`WorksService.export` (and their async variants) now normalize
|
|
79
|
+
`sort_by` before sending.
|
|
80
|
+
- **`/conversations.list` rejected bare `"-field"` sort entries** (CUSS-451)
|
|
81
|
+
— Same server behavior observed for conversations. `ConversationsService.list`
|
|
82
|
+
(and its async variant) now normalize `sort_by` before sending.
|
|
83
|
+
- **`list_modified_since` / `list_created_since` helpers paginate until the
|
|
84
|
+
cutoff is crossed** (CUSS-451) — Server-side `modified_date` / `created_date`
|
|
85
|
+
filters may not be honored uniformly across older accounts. The new
|
|
86
|
+
helpers apply client-side early-exit on the sorted stream so results are
|
|
87
|
+
bounded by the cutoff even when the server does not filter.
|
|
88
|
+
- **`BaseService._post` serialized non-JSON-native types incorrectly**
|
|
89
|
+
(CUSS-451) — `BaseService._post` and `AsyncBaseService._post` dumped
|
|
90
|
+
request models with `model_dump(exclude_none=True, by_alias=True)`, which
|
|
91
|
+
returns Python-native types (e.g., `datetime` as `datetime` objects
|
|
92
|
+
rather than ISO 8601 strings). Request bodies containing timestamps — as
|
|
93
|
+
used by the new `list_modified_since` / `list_created_since` filter
|
|
94
|
+
payloads — failed to round-trip through the HTTP layer. Both methods now
|
|
95
|
+
pass `mode="json"` so Pydantic produces JSON-serializable primitives
|
|
96
|
+
before the request is sent.
|
|
97
|
+
|
|
10
98
|
## [2.14.1] - 2026-04-14
|
|
11
99
|
|
|
12
100
|
### Security
|
|
@@ -636,6 +724,7 @@ This release marks the completion of all four development phases, providing a pr
|
|
|
636
724
|
|
|
637
725
|
| Version | Date | Highlights |
|
|
638
726
|
|---------|------|------------|
|
|
727
|
+
| 3.0.0 | 2026-04-22 | 🚨 BREAKING: Remove unsupported date filter fields from Works requests; add time-windowed list helpers |
|
|
639
728
|
| 2.7.0 | 2026-02-28 | 🔍 Server version discoverability for AI agents |
|
|
640
729
|
| 2.6.0 | 2026-02-28 | 🔐 Compliance-grade audit logging, MCP documentation |
|
|
641
730
|
| 2.4.1 | 2026-02-27 | 🐛 CI: mypy strict-mode type errors, test collection |
|
|
@@ -10,15 +10,32 @@ Complete reference of all MCP capabilities provided by the DevRev MCP Server.
|
|
|
10
10
|
|
|
11
11
|
Tools are the primary way AI assistants interact with DevRev. Each tool maps to one or more DevRev API endpoints.
|
|
12
12
|
|
|
13
|
-
### Works (Tickets &
|
|
13
|
+
### Works (Tickets, Issues & Tasks)
|
|
14
|
+
|
|
15
|
+
In DevRev, **works** is the umbrella type covering tickets (customer support),
|
|
16
|
+
issues (engineering), and tasks.
|
|
14
17
|
|
|
15
18
|
| Tool | Description |
|
|
16
19
|
|------|-------------|
|
|
17
|
-
| `devrev_works_list` | List work items (
|
|
20
|
+
| `devrev_works_list` | List work items with filters and `sort_by` (e.g., `["modified_date:desc"]`) |
|
|
18
21
|
| `devrev_works_get` | Get a specific work item by ID |
|
|
19
|
-
| `devrev_works_create` | Create a new ticket or
|
|
22
|
+
| `devrev_works_create` | Create a new ticket, issue, or task |
|
|
20
23
|
| `devrev_works_update` | Update a work item's fields |
|
|
21
24
|
| `devrev_works_delete` | Delete a work item (requires destructive tools enabled) |
|
|
25
|
+
| `devrev_works_export` | Bulk-export work items (accepts `sort_by`) |
|
|
26
|
+
| `devrev_works_list_modified_since` | List work items with `modified_date >= after` (ISO-8601), paged newest-first |
|
|
27
|
+
| `devrev_works_list_created_since` | List work items with `created_date >= after` (ISO-8601), paged newest-first |
|
|
28
|
+
|
|
29
|
+
**Key parameters:**
|
|
30
|
+
|
|
31
|
+
- `sort_by` (on `devrev_works_list` / `devrev_works_export`): List of
|
|
32
|
+
`"field:asc"` / `"field:desc"` entries. The legacy `"-field"` shortcut is
|
|
33
|
+
also accepted and normalized by the SDK before the request is sent.
|
|
34
|
+
- `after` (on `*_list_modified_since` / `*_list_created_since`): ISO-8601
|
|
35
|
+
timestamp (e.g., `"2025-01-15T00:00:00Z"`). Items at or after this
|
|
36
|
+
timestamp are returned.
|
|
37
|
+
- `limit` (on `*_list_modified_since` / `*_list_created_since`): Hard cap on
|
|
38
|
+
total items returned across all pages.
|
|
22
39
|
|
|
23
40
|
### Accounts
|
|
24
41
|
|
|
@@ -64,11 +81,22 @@ Tools are the primary way AI assistants interact with DevRev. Each tool maps to
|
|
|
64
81
|
|
|
65
82
|
| Tool | Description |
|
|
66
83
|
|------|-------------|
|
|
67
|
-
| `devrev_conversations_list` | List conversations |
|
|
84
|
+
| `devrev_conversations_list` | List conversations; supports `modified_date_after` / `modified_date_before` (ISO-8601) and `sort_by` |
|
|
85
|
+
| `devrev_conversations_list_modified_since` | List conversations with `modified_date >= after` (ISO-8601), paged newest-first |
|
|
68
86
|
| `devrev_conversations_get` | Get conversation details |
|
|
69
87
|
| `devrev_conversations_create` | Create a conversation |
|
|
70
88
|
| `devrev_conversations_update` | Update a conversation |
|
|
71
89
|
|
|
90
|
+
**Key parameters:**
|
|
91
|
+
|
|
92
|
+
- `modified_date_after` / `modified_date_before` (on `devrev_conversations_list`):
|
|
93
|
+
ISO-8601 timestamps bounding the `modified_date` filter.
|
|
94
|
+
- `sort_by` (on `devrev_conversations_list`): Same syntax as on
|
|
95
|
+
`devrev_works_list` — `"field:asc"` / `"field:desc"` entries, with the
|
|
96
|
+
legacy `"-field"` shortcut accepted and normalized by the SDK.
|
|
97
|
+
- `after` (on `devrev_conversations_list_modified_since`): ISO-8601
|
|
98
|
+
timestamp. Items at or after this timestamp are returned.
|
|
99
|
+
|
|
72
100
|
### Parts (Products & Features)
|
|
73
101
|
|
|
74
102
|
| Tool | Description |
|
|
@@ -220,3 +220,115 @@ components:
|
|
|
220
220
|
nullable: true
|
|
221
221
|
description: User state
|
|
222
222
|
|
|
223
|
+
# ============================================================================
|
|
224
|
+
# CORRECTION #3: /works.list sort_by syntax (CUSS-451)
|
|
225
|
+
# ============================================================================
|
|
226
|
+
#
|
|
227
|
+
# Issue: OpenAPI spec documents `sort_by` as an array of strings without
|
|
228
|
+
# specifying the accepted entry format. The live PUBLIC API rejects
|
|
229
|
+
# bare "-field" shortcuts and requires the canonical
|
|
230
|
+
# "field:asc" / "field:desc" form.
|
|
231
|
+
#
|
|
232
|
+
# Affected Endpoint: POST /works.list (and POST /works.export)
|
|
233
|
+
# Severity: HIGH - Causes 4xx validation errors for any client that
|
|
234
|
+
# relies on the common "-field" descending shortcut.
|
|
235
|
+
# Ticket: CUSS-451
|
|
236
|
+
#
|
|
237
|
+
# Observed server response for `sort_by: ["-modified_date"]`:
|
|
238
|
+
# 400 Bad Request — "sort_by entries must be of the form
|
|
239
|
+
# 'field:asc' or 'field:desc'"
|
|
240
|
+
#
|
|
241
|
+
# SDK Mitigation: `WorksService.list` / `WorksService.export` normalize
|
|
242
|
+
# `sort_by` entries before sending. Callers MAY continue to pass
|
|
243
|
+
# "-field" / "field" shortcuts; they are rewritten to
|
|
244
|
+
# "field:desc" / "field:asc" on the wire.
|
|
245
|
+
#
|
|
246
|
+
# Spec Correction (documentation-only — no schema change needed):
|
|
247
|
+
WorksListSortByCorrection:
|
|
248
|
+
type: array
|
|
249
|
+
description: |
|
|
250
|
+
Sort order for /works.list results.
|
|
251
|
+
|
|
252
|
+
**Required format**: Each entry MUST be `"field:asc"` or
|
|
253
|
+
`"field:desc"`. The server rejects bare `"-field"` and `"field"`
|
|
254
|
+
shortcuts.
|
|
255
|
+
|
|
256
|
+
**SDK behavior**: The Python SDK normalizes legacy shortcuts to the
|
|
257
|
+
canonical form before sending, so callers may pass either format to
|
|
258
|
+
`WorksService.list` / `WorksService.export`.
|
|
259
|
+
items:
|
|
260
|
+
type: string
|
|
261
|
+
pattern: "^[a-zA-Z_][a-zA-Z0-9_.]*:(asc|desc)$"
|
|
262
|
+
example: "modified_date:desc"
|
|
263
|
+
example:
|
|
264
|
+
- "modified_date:desc"
|
|
265
|
+
- "created_date:asc"
|
|
266
|
+
|
|
267
|
+
# ============================================================================
|
|
268
|
+
# CORRECTION #4: /conversations.list sort_by syntax (CUSS-451)
|
|
269
|
+
# ============================================================================
|
|
270
|
+
#
|
|
271
|
+
# Issue: Same as Correction #3 but on the conversations endpoint. The
|
|
272
|
+
# live PUBLIC API rejects bare "-field" entries on
|
|
273
|
+
# POST /conversations.list and requires "field:asc" / "field:desc".
|
|
274
|
+
#
|
|
275
|
+
# Affected Endpoint: POST /conversations.list
|
|
276
|
+
# Severity: HIGH - Causes 4xx validation errors.
|
|
277
|
+
# Ticket: CUSS-451
|
|
278
|
+
#
|
|
279
|
+
# SDK Mitigation: `ConversationsService.list` normalizes `sort_by`
|
|
280
|
+
# entries before sending.
|
|
281
|
+
ConversationsListSortByCorrection:
|
|
282
|
+
type: array
|
|
283
|
+
description: |
|
|
284
|
+
Sort order for /conversations.list results.
|
|
285
|
+
|
|
286
|
+
**Required format**: Each entry MUST be `"field:asc"` or
|
|
287
|
+
`"field:desc"`. Matches the corrected syntax documented for
|
|
288
|
+
/works.list.
|
|
289
|
+
items:
|
|
290
|
+
type: string
|
|
291
|
+
pattern: "^[a-zA-Z_][a-zA-Z0-9_.]*:(asc|desc)$"
|
|
292
|
+
example: "modified_date:desc"
|
|
293
|
+
example:
|
|
294
|
+
- "modified_date:desc"
|
|
295
|
+
|
|
296
|
+
# ============================================================================
|
|
297
|
+
# CORRECTION #5: Time-windowed listing on /works.list and /conversations.list (CUSS-451)
|
|
298
|
+
# ============================================================================
|
|
299
|
+
#
|
|
300
|
+
# Issue: The spec documents `modified_date` / `created_date` filters on
|
|
301
|
+
# /works.list and /conversations.list, but server-side filtering is
|
|
302
|
+
# not uniformly honored across all accounts. Observed behavior:
|
|
303
|
+
# - Some accounts return records older than the declared `after`
|
|
304
|
+
# cutoff when paginating results.
|
|
305
|
+
# - Sort order is honored reliably when `sort_by` uses the
|
|
306
|
+
# `field:direction` form (see Corrections #3 and #4).
|
|
307
|
+
#
|
|
308
|
+
# Affected Endpoints: POST /works.list, POST /conversations.list
|
|
309
|
+
# Severity: MEDIUM - Does not break validation, but causes over-broad
|
|
310
|
+
# result sets for clients that rely on the server-side date filter.
|
|
311
|
+
# Ticket: CUSS-451
|
|
312
|
+
#
|
|
313
|
+
# SDK Mitigation: `WorksService.list_modified_since`,
|
|
314
|
+
# `WorksService.list_created_since`, and
|
|
315
|
+
# `ConversationsService.list_modified_since` page server-side sorted
|
|
316
|
+
# `{timestamp_field}:desc` and apply a client-side early-exit as soon
|
|
317
|
+
# as a record older than the cutoff is seen. This guarantees the
|
|
318
|
+
# returned set is bounded by the cutoff regardless of server-side
|
|
319
|
+
# filter behavior.
|
|
320
|
+
#
|
|
321
|
+
# Documentation-only correction (no schema change):
|
|
322
|
+
TimeWindowedListingCorrection:
|
|
323
|
+
type: object
|
|
324
|
+
description: |
|
|
325
|
+
/works.list and /conversations.list support `modified_date` and
|
|
326
|
+
(for works) `created_date` filters, but server-side honoring of
|
|
327
|
+
these filters is inconsistent across accounts. Clients that need a
|
|
328
|
+
strict time-window guarantee should sort by the timestamp field in
|
|
329
|
+
descending order and early-exit on the first record older than the
|
|
330
|
+
cutoff.
|
|
331
|
+
properties:
|
|
332
|
+
note:
|
|
333
|
+
type: string
|
|
334
|
+
example: "See SDK helpers list_modified_since / list_created_since."
|
|
@@ -8,6 +8,7 @@ from typing import Any
|
|
|
8
8
|
from pydantic import Field
|
|
9
9
|
|
|
10
10
|
from devrev.models.base import (
|
|
11
|
+
DateFilter,
|
|
11
12
|
DevRevBaseModel,
|
|
12
13
|
DevRevResponseModel,
|
|
13
14
|
PaginatedResponse,
|
|
@@ -63,6 +64,13 @@ class ConversationsListRequest(DevRevBaseModel):
|
|
|
63
64
|
|
|
64
65
|
cursor: str | None = Field(default=None, description="Pagination cursor")
|
|
65
66
|
limit: int | None = Field(default=None, ge=1, le=100, description="Max results")
|
|
67
|
+
modified_date: DateFilter | None = Field(
|
|
68
|
+
default=None, description="Filter by modification date"
|
|
69
|
+
)
|
|
70
|
+
sort_by: list[str] | None = Field(
|
|
71
|
+
default=None,
|
|
72
|
+
description='Sort order (e.g., ["modified_date:desc"])',
|
|
73
|
+
)
|
|
66
74
|
|
|
67
75
|
|
|
68
76
|
class ConversationsUpdateRequest(DevRevBaseModel):
|
|
@@ -167,15 +167,18 @@ class WorksListRequest(DevRevBaseModel):
|
|
|
167
167
|
type: list[WorkType] | None = Field(default=None, description="Filter by work types")
|
|
168
168
|
applies_to_part: list[str] | None = Field(default=None, description="Filter by part IDs")
|
|
169
169
|
created_by: list[str] | None = Field(default=None, description="Filter by creator user IDs")
|
|
170
|
-
created_date: DateFilter | None = Field(default=None, description="Filter by creation date")
|
|
171
170
|
cursor: str | None = Field(default=None, description="Pagination cursor")
|
|
172
171
|
external_ref: list[str] | None = Field(default=None, description="Filter by external refs")
|
|
173
172
|
limit: int | None = Field(default=None, ge=1, le=100, description="Max results to return")
|
|
174
|
-
modified_date: DateFilter | None = Field(
|
|
175
|
-
default=None, description="Filter by modification date"
|
|
176
|
-
)
|
|
177
173
|
owned_by: list[str] | None = Field(default=None, description="Filter by owner user IDs")
|
|
178
|
-
sort_by: list[str] | None = Field(
|
|
174
|
+
sort_by: list[str] | None = Field(
|
|
175
|
+
default=None,
|
|
176
|
+
description=(
|
|
177
|
+
"Sort order. Each entry uses the server form 'field:asc' or 'field:desc' "
|
|
178
|
+
"(e.g. 'modified_date:desc'). The legacy '-field' form is accepted by the "
|
|
179
|
+
"service and normalized before being sent."
|
|
180
|
+
),
|
|
181
|
+
)
|
|
179
182
|
stage_name: list[str] | None = Field(default=None, description="Filter by stage names")
|
|
180
183
|
target_close_date: DateFilter | None = Field(
|
|
181
184
|
default=None, description="Filter by target close date"
|
|
@@ -226,8 +229,15 @@ class WorksExportRequest(DevRevBaseModel):
|
|
|
226
229
|
type: list[WorkType] | None = Field(default=None, description="Filter by work types")
|
|
227
230
|
applies_to_part: list[str] | None = Field(default=None, description="Filter by part IDs")
|
|
228
231
|
created_by: list[str] | None = Field(default=None, description="Filter by creator user IDs")
|
|
229
|
-
created_date: DateFilter | None = Field(default=None, description="Filter by creation date")
|
|
230
232
|
first: int | None = Field(default=None, ge=1, le=10000, description="Max results")
|
|
233
|
+
sort_by: list[str] | None = Field(
|
|
234
|
+
default=None,
|
|
235
|
+
description=(
|
|
236
|
+
"Sort order. Each entry uses the server form 'field:asc' or 'field:desc' "
|
|
237
|
+
"(e.g. 'modified_date:desc'). The legacy '-field' form is accepted by the "
|
|
238
|
+
"service and normalized before being sent."
|
|
239
|
+
),
|
|
240
|
+
)
|
|
231
241
|
|
|
232
242
|
|
|
233
243
|
class WorksCountRequest(DevRevBaseModel):
|
|
@@ -72,7 +72,9 @@ class BaseService:
|
|
|
72
72
|
Returns:
|
|
73
73
|
Parsed response model or raw dict if no response_type
|
|
74
74
|
"""
|
|
75
|
-
data =
|
|
75
|
+
data = (
|
|
76
|
+
request.model_dump(exclude_none=True, by_alias=True, mode="json") if request else None
|
|
77
|
+
)
|
|
76
78
|
response = self._http.post(endpoint, data=data)
|
|
77
79
|
|
|
78
80
|
# Handle empty responses (204 No Content or empty body)
|
|
@@ -185,7 +187,9 @@ class AsyncBaseService:
|
|
|
185
187
|
Returns:
|
|
186
188
|
Parsed response model or raw dict if no response_type
|
|
187
189
|
"""
|
|
188
|
-
data =
|
|
190
|
+
data = (
|
|
191
|
+
request.model_dump(exclude_none=True, by_alias=True, mode="json") if request else None
|
|
192
|
+
)
|
|
189
193
|
response = await self._http.post(endpoint, data=data)
|
|
190
194
|
|
|
191
195
|
# Handle empty responses (204 No Content or empty body)
|