affinity-sdk 2.0.0__tar.gz → 2.0.1__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.
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/CHANGELOG.md +30 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/PKG-INFO +1 -1
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_entity_files_read.py +5 -8
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/note_cmds.py +3 -2
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/org_read_cmds.py +3 -3
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/secondary.py +5 -5
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/v1_only.py +81 -101
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/examples.md +1 -1
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/api-versions-and-routing.md +2 -1
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/migrating-to-2.md +7 -5
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/api-coverage.md +8 -8
- affinity_sdk-2.0.1/docs/public/reference/services/v1/files.md +8 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/v1/notes.md +1 -1
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.registry/commands.generated.json +2 -2
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/CHANGELOG.md +2 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/affinity-sdk/.claude-plugin/plugin.json +1 -1
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/SKILL.md +2 -2
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/references/services.md +3 -3
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/pyproject.toml +1 -1
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_file_url.py +7 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_files_read.py +20 -20
- affinity_sdk-2.0.1/tests/test_files_v2.py +172 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_notes_v2.py +5 -5
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_v1_only_async.py +0 -2
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_v1_only_services_additional_coverage.py +0 -2
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/api_coverage.json +8 -8
- affinity_sdk-2.0.0/docs/public/reference/services/v1/files.md +0 -8
- affinity_sdk-2.0.0/tests/test_files_v2.py +0 -111
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.claude-plugin/marketplace.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.cursor/rules/test-data-privacy.mdc +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.editorconfig +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.env.example +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.gitattributes +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/CODEOWNERS +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/PULL_REQUEST_TEMPLATE/cli_command.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/PULL_REQUEST_TEMPLATE/release.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/dependabot.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/labels.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/mcp-release-install-footer.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/pull_request_template.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/release-install-footer.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/ci.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/cowork-replay.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/docs.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/labels.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/linkcheck.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/openapi-validation.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/plugin-build.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/plugin-release.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/release-detect.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/release.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/version-check.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.gitignore +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.pre-commit-config.yaml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/AGENTS.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/CODE_OF_CONDUCT.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/CONTRIBUTING.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/LICENSE +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/README.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/SECURITY.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/VERSIONING.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/__init__.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/_internal/__init__.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/_internal/keyfile.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/api_versions.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/__init__.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/__main__.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/_update_worker.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/click_compat.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/__init__.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_entity_field.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_entity_files_dump.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_entity_files_upload.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_list_entry_fields.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_org_reads.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_search_common.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_v1_parsing.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/company_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/completion_cmd.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/config_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/entry_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/field_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/file_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/file_url_cmd.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/interaction_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/list_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/opportunity_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/person_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/query_cmd.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/relationship_strength_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/reminder_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/resolve_url_cmd.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/session_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/task_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/transcript_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/version_cmd.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/webhook_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/whoami_cmd.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/config.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/confirm.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/constants.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/context.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/csv_utils.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/date_utils.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/decorators.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/errors.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/field_utils.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/formatters.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/help_json.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/interaction_utils.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/logging.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/main.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/mcp_limits.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/options.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/paths.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/progress.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/__init__.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/aggregates.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/cursor.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/dates.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/exceptions.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/executor.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/filters.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/models.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/output.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/parser.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/planner.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/progress.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/schema.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/render.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/resolve.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/resolvers.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/results.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/runner.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/serialization.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/session_cache.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/types.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/update_check.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/client.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/clients/__init__.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/clients/http.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/clients/pipeline.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/compare.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/downloads.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/exceptions.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/field_resolve_utils.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/field_resolver.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/filters.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/hooks.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/inbound_webhooks.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/__init__.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/entities.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/interactions_v2.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/pagination.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/rate_limit_snapshot.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/relationships_v2.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/search.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/transcripts.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/types.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/policies.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/progress.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/py.typed +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/__init__.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/_dropdown_options.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/_field_listing.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/_field_updates.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/_note_html.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/_org_reads.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/_v2_filters.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/companies.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/lists.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/opportunities.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/persons.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/rate_limits.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/reminders.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/search.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/tasks.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/transcripts.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/webhooks.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/types.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/codecov.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/cli-development-guide.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/ai-integrations/index.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/changelog.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/cli/commands.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/cli/index.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/cli/scripting.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/cli-reference.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/getting-started.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/glossary.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/affinity-official-mcp-comparison.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/api-versions.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/authentication.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/claude-code-plugins.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/configuration.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/csv-export.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/datetime-handling.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/debugging-hooks.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/errors-and-retries.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/field-types-and-values.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/field-values.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/filtering.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/ids-and-types.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/models.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/opportunity-associations.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/pagination.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/performance.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/query-command.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/rate-limits.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/sync-vs-async.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/webhooks.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/index.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/mcp/index.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/client.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/exceptions.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/filters.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/models.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/query-language.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/companies.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/lists.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/opportunities.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/persons.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/reminders.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/tasks.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/v1/auth.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/v1/field-values.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/v1/fields.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/v1/interactions.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/v1/relationships.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/webhooks.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/types.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/troubleshooting.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/advanced_usage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/async_lifecycle.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/basic_usage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/filter_builder.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/hooks_debugging.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/list_management.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/resolve_helpers.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/task_polling.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/.gitignore +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/plugin.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/skills/affinity-mcp-workflows/SKILL.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/skills/pipeline-history/SKILL.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/skills/query-language/SKILL.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/skills/query-language/references/filter-operators.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/skills/query-language/references/include-expand.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/skills/query-language/references/output-formats.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/skills/query-language/references/quantifiers.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/xaffinity-mcp.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.gitignore +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/VERSION +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/bin/mcp-bash +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/completion.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/lifecycle.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/logging.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/ping.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/prompts.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/resources.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/roots.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/tools.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/auth.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/capabilities.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/cli/common.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/cli/health.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/completion.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/core.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/elicitation.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/file_read.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/handler_helpers.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/hash.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/ids.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/io.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/json.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/lock.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/logging.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/meta_env.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/paginate.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/path.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/policy.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/progress-passthrough.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/progress.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/prompts.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/registry.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/require.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/resource_content.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/resource_match.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/resource_providers.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/resources.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/roots.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/rpc.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/runtime.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/spec.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/timeout.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/tools.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/tools_policy.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/ui-templates.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/ui.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/uri.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/validate.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/providers/echo.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/providers/file.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/providers/git.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/providers/https.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/providers/ui.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/sdk/tool-error.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/sdk/tool-sdk.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/sdk/ui-sdk.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/vendor.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.registry/mcp-commands.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.registry/prompts.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.registry/resource-templates.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.registry/resources.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.registry/ui-resources.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/COMPATIBILITY +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/Makefile +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/README.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/VERSION +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/completions/entity-name.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/completions/list-name.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/completions/status-value.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/docs/DEBUGGING.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/icon.svg +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/lib/cache.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/lib/cli-detect.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/lib/cli-gateway.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/lib/common.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/lib/entity-types.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/lib/field-resolution.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/mcp-bash.lock +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/mcp-publisher.lock +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/mcpb.conf +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/change-status/change-status.completion.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/change-status/change-status.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/change-status/change-status.txt +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/interaction-brief/interaction-brief.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/interaction-brief/interaction-brief.txt +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/log-call/log-call.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/log-call/log-call.txt +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.txt +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/log-message/log-message.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/log-message/log-message.txt +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/pipeline-review/pipeline-review.completion.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/pipeline-review/pipeline-review.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/pipeline-review/pipeline-review.txt +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/prepare-briefing/prepare-briefing.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/prepare-briefing/prepare-briefing.txt +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/warm-intro/warm-intro.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/warm-intro/warm-intro.txt +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/providers/xaffinity.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/data-model/data-model.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/data-model/data-model.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/field-catalogs/field-catalogs.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/field-catalogs/field-catalogs.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/interaction-enums/interaction-enums.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/interaction-enums/interaction-enums.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/me/me.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/me/me.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/me-person-id/me-person-id.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/me-person-id/me-person-id.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/query-guide/query-guide.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/query-guide/query-guide.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/saved-views/saved-views.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/saved-views/saved-views.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/workflow-config/workflow-config.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/workflow-config/workflow-config.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/workflows-guide/workflows-guide.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/workflows-guide/workflows-guide.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/xaffinity-field-catalogs.completion.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/xaffinity-saved-views.completion.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/xaffinity-workflow-config.completion.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/server.d/env.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/server.d/health-checks.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/server.d/policy.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/server.d/requirements.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/server.d/server.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/server.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/test/README.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/test/run.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/test/test_env_update_check.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/test-progress.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/discover-commands/tool.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/discover-commands/tool.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/execute-read-command/tool.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/execute-read-command/tool.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/execute-write-command/tool.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/execute-write-command/tool.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/get-entity-dossier/tool.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/get-entity-dossier/tool.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/get-file-url/tool.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/get-file-url/tool.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/query/tool.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/query/tool.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/read-xaffinity-resource/tool.meta.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/read-xaffinity-resource/tool.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/user-config.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/xaffinity-mcp-env.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/xaffinity-mcp.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mkdocs.yml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/.claude-plugin/plugin.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/hooks/guard-env-read.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/hooks/hooks.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/hooks/pre-xaffinity.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/hooks/session-setup.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/SKILL.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/files-and-writes.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/filtering.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/history-and-activity.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/interactions.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/query-guide.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/setup.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/query/test_cursor.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_company_create_dedup.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_company_ls_filter_rejection.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_formatters.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_output_formats_integration.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_person_create_dedup.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_person_ls_filter_rejection.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_query_filter_rejection.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_query_list_entry_relationships.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_query_list_export_parity.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_query_output_flattening.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_query_output_truncation.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_query_unreplied.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/conftest.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/.cowork-redact.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/README.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/cassettes/company-lists-status.cassette.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/cassettes/hook-blocks-without-key.cassette.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/cassettes/no-key-skill-path.cassette.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/cassettes/status-history.cassette.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/fixtures/workdir-key/README.txt +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/fixtures/workdir-key/xaffinity-test-key +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/fixtures/workdir-nokey/README.txt +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/image/Dockerfile +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/image/fakeaff/build_fixtures.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/image/fakeaff/fixtures.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/image/fakeaff/server.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/image/xaffinity-wrapper.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/privacy-allow.txt +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/record.sh +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/scenarios/company-lists-status.yaml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/scenarios/hook-blocks-without-key.yaml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/scenarios/no-key-skill-path.yaml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/scenarios/status-history.yaml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/sessions/no-key.yaml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/sessions/with-key.yaml +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/field_write_mocks.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/fixtures/openapi/mini_openapi.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/fixtures/webhooks/field_value_updated.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/fixtures/webhooks/list_entry_created.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/fixtures/webhooks/organization_created.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/fixtures/webhooks/organization_merged.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/fixtures/webhooks/person_created.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/fixtures/webhooks/unknown_event.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/README.md +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/conftest.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/setup_query_parity_data.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/test_cli_writes.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/test_query_parity_integration.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/test_sdk_reads.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/test_sdk_writes.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/test_sdk_writes_runner.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/mcp/__init__.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/mcp/test_query_cursor.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/skill-evals/xaffinity-cli-usage-evals/evals.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/spec_guard.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_affinity_client_wrapper_additional_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_api_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_api_key_file_formats.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_api_key_resolution.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_api_version.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_api_version_per_operation.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_async_file_download_streaming.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_batch_get.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_api_version.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_column_limiting.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_command_context.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_company_cmds_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_company_get.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_config_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_context_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_csv_export.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_date_params.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_date_utils.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_datetime_formatting.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_datetime_header_offsets.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_domain_linkification.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_dotenv_resolution.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_dropdown_field_writes.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_enriched_field_writes.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_entity_field_writes.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_entity_files_dump.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_entry_field.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_entry_field_batch_writes.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_entry_field_multi_value_limits.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_error_hints.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_error_rendering.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_field_history.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_field_history_bulk.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_field_options_and_transcripts.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_field_utils.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_field_utils_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_field_utils_set_phase.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_field_value_humanization.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_files_ls.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_get_interaction_dates.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_help_json.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_interaction_date_chunking.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_interaction_utils.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_json_safety.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_list_cmds_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_list_expand_interactions.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_list_export_entity_scope.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_list_export_field_refresh.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_list_export_filter_safety.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_list_export_truncation_meta.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_missing_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_multi_value_truncation_warnings.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_no_network_commands.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_notes_writes.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_opportunity_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_opportunity_cmds_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_pager_logic.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_person_cmds_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_person_get.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_plugin_manifest.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_pre_xaffinity_hook.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_progress_manager.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_aggregates.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_cmd.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_cmd_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_dates.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_executor.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_expand_interactions.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_filters.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_integration.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_parser.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_planner.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_safety.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_schema.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_rate_limit_rendering.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_rate_limit_throttle.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_reminders.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_render_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_resolve_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_resolve_url_parsing.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_result_summary.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_safe_field_writes.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_search.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_serialization.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_session_cache.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_session_setup_hook.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_set_phase_atomicity.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_types.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_unreplied.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_update_check.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_v1_only_cmds.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_v1_parsing.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_webhooks.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_write_ops.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_client.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_companies_create_dedup.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_companies_filter_rejection.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_compare.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_env_helpers.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_exceptions_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_field_resolver.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_field_service_caching.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_field_types_c4.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_field_value_type.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_field_values_get_value.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_file_batch_get.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_file_download_streaming.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_file_list_batch.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_file_upload_helpers_and_validation.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_files_upload_returning_files.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_filters.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_generate_mcp_command_registry.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_get_fields_filter_includes.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_get_fields_pagination.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_get_first.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_hidden_field_values.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_hooks.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_http_client_additional_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_http_client_remaining_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_inbound_webhooks.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_integration_smoke.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_interaction_date_validation.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_interactions_and_files_regressions.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_isodatetime.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_list_entry_membership_and_opportunities.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_list_term.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_lists_v2_writes.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_bundle_env_and_completions.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_cli_version_check.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_entity_dossier.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_gateway_limits.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_history_bulk_gateway.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_limits.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_query_cli_error.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_read_truncation.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_resource_scripts.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_models.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_models_v2_2026_fields.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_multi_value_limits.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_new_features.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_notes_v2_writes.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_opportunities_filter_rejection.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_org_reads.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_pagination_iterators.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_persons_create_dedup.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_persons_filter_rejection.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_public_api.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_rate_limit_v2.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_raw_pipeline_hook_events.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_readonly_factory.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_reminder_list_batch.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_reminders_v2.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_requirements_additional.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_sdk_interaction_dates.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_search.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_service_get_parameter_combinations.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_companies_coverage_gaps.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_dropdown_options.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_entity_field_updates.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_field_value_changes.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_list_entries_filter_paths.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_lists_additional_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_lists_coverage_gaps.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_opportunities_additional_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_opportunities_coverage_gaps.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_opportunities_tasks_additional_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_persons_companies_additional_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_rate_limits_coverage_gaps.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_v1_only_coverage_gaps.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_small_modules_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_spec_guard.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_transport_and_readonly_mode.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_v1_association_parsing.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_v1_only_services_more_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_v2_request_bodies.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_validate_openapi_tool.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_webhooks_v2.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/unit/__init__.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/unit/test_exceptions.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/__init__.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/api_coverage.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/api_coverage_v1_snapshot.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/check_cli_patterns.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/generate_mcp_command_registry.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/generate_release_notes.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/generate_requirements_mapping.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/openapi_snapshots/2024-01-01.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/openapi_snapshots/2026-07-15.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/openapi_snapshots/2026-09-17.json +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/sync_mcp_bundle_env.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/sync_mcp_registry.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/sync_mcp_version.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/validate_mcp_registry_metadata.py +0 -0
- {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/validate_openapi_models.py +0 -0
|
@@ -7,6 +7,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.0.1] - 2026-10-12
|
|
11
|
+
|
|
12
|
+
### Changed (breaking)
|
|
13
|
+
|
|
14
|
+
**Exception to semantic versioning:** these renames break code written against 2.0.0, in a
|
|
15
|
+
patch release. 2.0.0 had been out for under an hour, and the renames remove method names that
|
|
16
|
+
said which Affinity API they used instead of what they do.
|
|
17
|
+
|
|
18
|
+
- `notes.list_v2()` / `iter_v2()` → **`notes.feed()` / `iter_feed()`** (every note across the
|
|
19
|
+
organization; the CLI's `note feed`).
|
|
20
|
+
- `notes.get_v2()` → **`notes.get()`**, which now returns `NoteV2` (`includes=True` adds the
|
|
21
|
+
attached companies, persons and opportunities). The V1 `notes.get()` (returning `Note`) is
|
|
22
|
+
removed; `notes.list()` (one entity's notes, V1) is unchanged.
|
|
23
|
+
- `files.list_v2()` / `iter_v2()` → **`files.feed()` / `iter_feed()`** (every file you can see,
|
|
24
|
+
newest first).
|
|
25
|
+
- `files.get_v2()` is removed. **`files.get_download_url()`** now asks V2 first: one request
|
|
26
|
+
for the details and a signed URL (valid 60 seconds) instead of V1's two. It falls back to
|
|
27
|
+
V1 when the client is pinned to an API version older than 2026-09-17, or when V2 refuses or
|
|
28
|
+
doesn't find the file; the result (`PresignedUrl`) is the same either way. `files.get()`
|
|
29
|
+
stays on V1 (`EntityFile`, with the file's person, company or opportunity) and works under
|
|
30
|
+
any version pin.
|
|
31
|
+
- CLI `note get` reads the note from V2: same output keys, `content` is the stored HTML (as in
|
|
32
|
+
`note create`/`update` output), and the attachment ids come from V2.
|
|
33
|
+
- CLI `files read` and `file-url` get the file's details and URL in one request where V2 can
|
|
34
|
+
answer (V1's path otherwise).
|
|
35
|
+
|
|
36
|
+
### Plugins
|
|
37
|
+
|
|
38
|
+
- **SDK plugin**: 2.0.0 → 2.0.1 — skill: the renamed note methods.
|
|
39
|
+
|
|
10
40
|
## [2.0.0] - 2026-10-12
|
|
11
41
|
|
|
12
42
|
### Highlights
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: affinity-sdk
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.1
|
|
4
4
|
Summary: A modern, strongly-typed Python SDK for the Affinity CRM API
|
|
5
5
|
Project-URL: Homepage, https://github.com/yaniv-golan/affinity-sdk
|
|
6
6
|
Project-URL: Documentation, https://yaniv-golan.github.io/affinity-sdk/latest/
|
|
@@ -87,9 +87,9 @@ def read_file_content(
|
|
|
87
87
|
def fn(ctx: CLIContext, warnings: list[str]) -> CommandOutput:
|
|
88
88
|
client = ctx.get_client(warnings=warnings)
|
|
89
89
|
|
|
90
|
-
#
|
|
91
|
-
|
|
92
|
-
file_size =
|
|
90
|
+
# Name, size, type and a signed URL: one V2 request (or V1's two where V2 can't answer)
|
|
91
|
+
presigned = client.files.get_download_url(FileId(file_id))
|
|
92
|
+
file_size = presigned.size or 0
|
|
93
93
|
|
|
94
94
|
# Validate offset
|
|
95
95
|
if offset < 0:
|
|
@@ -107,9 +107,6 @@ def read_file_content(
|
|
|
107
107
|
hint=f"File size is {file_size} bytes. Use --offset 0 to start from beginning.",
|
|
108
108
|
)
|
|
109
109
|
|
|
110
|
-
# Get presigned URL
|
|
111
|
-
presigned = client.files.get_download_url(FileId(file_id))
|
|
112
|
-
|
|
113
110
|
# Calculate actual bytes to read
|
|
114
111
|
remaining = file_size - offset
|
|
115
112
|
bytes_to_read = min(limit, remaining)
|
|
@@ -161,9 +158,9 @@ def read_file_content(
|
|
|
161
158
|
|
|
162
159
|
data = {
|
|
163
160
|
"fileId": int(file_id),
|
|
164
|
-
"name":
|
|
161
|
+
"name": presigned.name,
|
|
165
162
|
"size": file_size,
|
|
166
|
-
"contentType":
|
|
163
|
+
"contentType": presigned.content_type,
|
|
167
164
|
"offset": offset,
|
|
168
165
|
"length": actual_length,
|
|
169
166
|
"hasMore": has_more,
|
|
@@ -432,7 +432,8 @@ def note_get(ctx: CLIContext, note_id: int) -> None:
|
|
|
432
432
|
|
|
433
433
|
def fn(ctx: CLIContext, warnings: list[str]) -> CommandOutput:
|
|
434
434
|
client = ctx.get_client(warnings=warnings)
|
|
435
|
-
note = client.notes.get(NoteId(note_id))
|
|
435
|
+
note = client.notes.get(NoteId(note_id), includes=True)
|
|
436
|
+
_truncation_warnings(note, warnings)
|
|
436
437
|
|
|
437
438
|
cmd_context = CommandContext(
|
|
438
439
|
name="note get",
|
|
@@ -440,7 +441,7 @@ def note_get(ctx: CLIContext, note_id: int) -> None:
|
|
|
440
441
|
modifiers={},
|
|
441
442
|
)
|
|
442
443
|
|
|
443
|
-
payload =
|
|
444
|
+
payload = _note_v2_payload(note)
|
|
444
445
|
|
|
445
446
|
# For table display, separate content from metadata for better readability
|
|
446
447
|
if ctx.output != "json":
|
|
@@ -486,17 +486,17 @@ def note_feed(
|
|
|
486
486
|
"updated_after": _when(updated_after, "--updated-after"),
|
|
487
487
|
}
|
|
488
488
|
rows, next_cursor = collect_pages(
|
|
489
|
-
(lambda: notes.
|
|
489
|
+
(lambda: notes.feed(cursor=cursor))
|
|
490
490
|
if cursor is not None
|
|
491
491
|
else (
|
|
492
|
-
lambda: notes.
|
|
492
|
+
lambda: notes.feed(
|
|
493
493
|
**times,
|
|
494
494
|
creator_id=creator_id,
|
|
495
495
|
includes=True if with_attached else None,
|
|
496
496
|
limit=page_limit(max_results),
|
|
497
497
|
)
|
|
498
498
|
),
|
|
499
|
-
lambda c: notes.
|
|
499
|
+
lambda c: notes.feed(cursor=c),
|
|
500
500
|
note_row,
|
|
501
501
|
max_results=max_results,
|
|
502
502
|
all_pages=all_pages,
|
|
@@ -134,8 +134,8 @@ class NoteV2(AffinityModel):
|
|
|
134
134
|
"""V2 API note format.
|
|
135
135
|
|
|
136
136
|
``replies_count`` and the attached ``companies`` / ``persons`` / ``opportunities`` (first ones,
|
|
137
|
-
with ``*_total``) are filled only when requested with ``includes`` (``notes.
|
|
138
|
-
``notes.
|
|
137
|
+
with ``*_total``) are filled only when requested with ``includes`` (``notes.feed`` /
|
|
138
|
+
``notes.get``); otherwise they are ``None``.
|
|
139
139
|
"""
|
|
140
140
|
|
|
141
141
|
id: NoteId
|
|
@@ -280,10 +280,10 @@ class OpportunityRef(AffinityModel):
|
|
|
280
280
|
|
|
281
281
|
|
|
282
282
|
class FileV2(AffinityModel):
|
|
283
|
-
"""A file's metadata from V2 (``files.
|
|
283
|
+
"""A file's metadata from V2 (``files.feed``).
|
|
284
284
|
|
|
285
|
-
V2 files carry no person/company/opportunity; ``download_url`` (
|
|
286
|
-
URL that expires 60 seconds after the response.
|
|
285
|
+
V2 files carry no person/company/opportunity; ``download_url`` (single-file reads only) is
|
|
286
|
+
a signed URL that expires 60 seconds after the response.
|
|
287
287
|
"""
|
|
288
288
|
|
|
289
289
|
id: FileId
|
|
@@ -24,7 +24,12 @@ import httpx
|
|
|
24
24
|
from pydantic import AliasChoices, TypeAdapter, ValidationError
|
|
25
25
|
|
|
26
26
|
from ..downloads import AsyncDownloadedFile, DownloadedFile
|
|
27
|
-
from ..exceptions import
|
|
27
|
+
from ..exceptions import (
|
|
28
|
+
AffinityError,
|
|
29
|
+
ApiVersionTooOldError,
|
|
30
|
+
AuthorizationError,
|
|
31
|
+
NotFoundError,
|
|
32
|
+
)
|
|
28
33
|
from ..exceptions import ValidationError as AffinityValidationError
|
|
29
34
|
from ..models.entities import (
|
|
30
35
|
FieldCreate,
|
|
@@ -117,6 +122,26 @@ class PresignedUrl:
|
|
|
117
122
|
expires_at: datetime
|
|
118
123
|
|
|
119
124
|
|
|
125
|
+
def _presigned(
|
|
126
|
+
url: str, file_id: int, name: str, size: int, content_type: str | None
|
|
127
|
+
) -> PresignedUrl:
|
|
128
|
+
"""A ``PresignedUrl``; its lifetime comes from ``X-Amz-Expires`` (60 seconds if absent)."""
|
|
129
|
+
expires_in = 60
|
|
130
|
+
qs = parse_qs(urlparse(url).query)
|
|
131
|
+
if "X-Amz-Expires" in qs:
|
|
132
|
+
with contextlib.suppress(ValueError, IndexError):
|
|
133
|
+
expires_in = int(qs["X-Amz-Expires"][0])
|
|
134
|
+
return PresignedUrl(
|
|
135
|
+
url=url,
|
|
136
|
+
file_id=int(file_id),
|
|
137
|
+
name=name,
|
|
138
|
+
size=size,
|
|
139
|
+
content_type=content_type,
|
|
140
|
+
expires_in=expires_in,
|
|
141
|
+
expires_at=datetime.now(timezone.utc) + timedelta(seconds=expires_in),
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
|
|
120
145
|
_MAX_INTERACTION_RANGE_DAYS = 365
|
|
121
146
|
|
|
122
147
|
|
|
@@ -345,11 +370,6 @@ class NoteService(NoteSearchMixin):
|
|
|
345
370
|
next_page_token=data.get("next_page_token") or data.get("nextPageToken"),
|
|
346
371
|
)
|
|
347
372
|
|
|
348
|
-
def get(self, note_id: NoteId) -> Note:
|
|
349
|
-
"""Get a single note by ID."""
|
|
350
|
-
data = self._client.get(f"/notes/{note_id}", v1=True)
|
|
351
|
-
return Note.model_validate(data)
|
|
352
|
-
|
|
353
373
|
def create(self, data: NoteCreate) -> NoteV2:
|
|
354
374
|
"""Create a note (V2) and return it.
|
|
355
375
|
|
|
@@ -373,11 +393,11 @@ class NoteService(NoteSearchMixin):
|
|
|
373
393
|
if data.content is not None:
|
|
374
394
|
note = None
|
|
375
395
|
with contextlib.suppress(AffinityError):
|
|
376
|
-
note = self.
|
|
396
|
+
note = self.get(note_id)
|
|
377
397
|
if has_mentions(note):
|
|
378
398
|
raise mentions_error(exc) from exc
|
|
379
399
|
raise
|
|
380
|
-
return self.
|
|
400
|
+
return self.get(note_id, includes=True)
|
|
381
401
|
|
|
382
402
|
def delete(self, note_id: NoteId) -> bool:
|
|
383
403
|
"""Delete a note you created (V2). Deleting a note also deletes its replies."""
|
|
@@ -423,7 +443,7 @@ class NoteService(NoteSearchMixin):
|
|
|
423
443
|
# V2 notes (read): NoteV2 with creator, HTML content, interaction, transcript
|
|
424
444
|
# =========================================================================
|
|
425
445
|
|
|
426
|
-
def
|
|
446
|
+
def feed(
|
|
427
447
|
self,
|
|
428
448
|
*,
|
|
429
449
|
creator_id: int | None = None,
|
|
@@ -467,7 +487,7 @@ class NoteService(NoteSearchMixin):
|
|
|
467
487
|
)
|
|
468
488
|
return page_of(NoteV2, self._client.get("/notes", params=params or None))
|
|
469
489
|
|
|
470
|
-
def
|
|
490
|
+
def iter_feed(
|
|
471
491
|
self,
|
|
472
492
|
*,
|
|
473
493
|
creator_id: int | None = None,
|
|
@@ -477,12 +497,12 @@ class NoteService(NoteSearchMixin):
|
|
|
477
497
|
includes: bool | Sequence[str] | None = None,
|
|
478
498
|
limit: int | None = None,
|
|
479
499
|
) -> Iterator[NoteV2]:
|
|
480
|
-
"""All notes matching the filters (every page); see :meth:`
|
|
500
|
+
"""All notes matching the filters (every page); see :meth:`feed`."""
|
|
481
501
|
|
|
482
502
|
def fetch_page(next_url: str | None) -> PaginatedResponse[NoteV2]:
|
|
483
503
|
if next_url:
|
|
484
|
-
return self.
|
|
485
|
-
return self.
|
|
504
|
+
return self.feed(cursor=next_url)
|
|
505
|
+
return self.feed(
|
|
486
506
|
creator_id=creator_id,
|
|
487
507
|
created_after=created_after,
|
|
488
508
|
created_before=created_before,
|
|
@@ -493,8 +513,8 @@ class NoteService(NoteSearchMixin):
|
|
|
493
513
|
|
|
494
514
|
return PageIterator(fetch_page)
|
|
495
515
|
|
|
496
|
-
def
|
|
497
|
-
"""One note as ``NoteV2`` (``includes`` as in :meth:`
|
|
516
|
+
def get(self, note_id: NoteId, *, includes: bool | Sequence[str] | None = None) -> NoteV2:
|
|
517
|
+
"""One note as ``NoteV2`` (``includes`` as in :meth:`feed`)."""
|
|
498
518
|
params = [("includes", value) for value in note_includes(includes)]
|
|
499
519
|
return NoteV2.model_validate(
|
|
500
520
|
self._client.get(f"/notes/{int(note_id)}", params=params or None)
|
|
@@ -1852,18 +1872,12 @@ class EntityFileService(FileSearchMixin):
|
|
|
1852
1872
|
)
|
|
1853
1873
|
|
|
1854
1874
|
def get(self, file_id: FileId) -> EntityFile:
|
|
1855
|
-
"""
|
|
1875
|
+
"""A file's details, including the person, company or opportunity it belongs to (V1;
|
|
1876
|
+
works under any API version). :meth:`get_download_url` adds a download link."""
|
|
1856
1877
|
data = self._client.get(f"/entity-files/{file_id}", v1=True)
|
|
1857
1878
|
return EntityFile.model_validate(data)
|
|
1858
1879
|
|
|
1859
|
-
def
|
|
1860
|
-
"""One file's metadata from V2 (Affinity API 2026-09-17+), with a download URL that
|
|
1861
|
-
expires 60 seconds later. :meth:`get` (V1) is unchanged."""
|
|
1862
|
-
return FileV2.model_validate(
|
|
1863
|
-
self._client.get(f"/files/{int(file_id)}", min_api_version=FILES_V2_MIN_API_VERSION)
|
|
1864
|
-
)
|
|
1865
|
-
|
|
1866
|
-
def list_v2(
|
|
1880
|
+
def feed(
|
|
1867
1881
|
self,
|
|
1868
1882
|
*,
|
|
1869
1883
|
created_after: datetime | None = None,
|
|
@@ -1895,7 +1909,7 @@ class EntityFileService(FileSearchMixin):
|
|
|
1895
1909
|
),
|
|
1896
1910
|
)
|
|
1897
1911
|
|
|
1898
|
-
def
|
|
1912
|
+
def iter_feed(
|
|
1899
1913
|
self,
|
|
1900
1914
|
*,
|
|
1901
1915
|
created_after: datetime | None = None,
|
|
@@ -1903,12 +1917,12 @@ class EntityFileService(FileSearchMixin):
|
|
|
1903
1917
|
creator_id: UserId | None = None,
|
|
1904
1918
|
limit: int | None = None,
|
|
1905
1919
|
) -> Iterator[FileV2]:
|
|
1906
|
-
"""All files matching the filters (every page); see :meth:`
|
|
1920
|
+
"""All files matching the filters (every page); see :meth:`feed`."""
|
|
1907
1921
|
|
|
1908
1922
|
def fetch_page(next_url: str | None) -> PaginatedResponse[FileV2]:
|
|
1909
1923
|
if next_url:
|
|
1910
|
-
return self.
|
|
1911
|
-
return self.
|
|
1924
|
+
return self.feed(cursor=next_url)
|
|
1925
|
+
return self.feed(
|
|
1912
1926
|
created_after=created_after,
|
|
1913
1927
|
created_before=created_before,
|
|
1914
1928
|
creator_id=creator_id,
|
|
@@ -1954,7 +1968,16 @@ class EntityFileService(FileSearchMixin):
|
|
|
1954
1968
|
Raises:
|
|
1955
1969
|
AffinityError: If the API doesn't return a redirect URL
|
|
1956
1970
|
"""
|
|
1957
|
-
#
|
|
1971
|
+
# V2 answers with the details and a signed URL in one request (API 2026-09-17+, beta);
|
|
1972
|
+
# a client pinned older, or a V2 refusal, uses V1's details and redirect instead
|
|
1973
|
+
try:
|
|
1974
|
+
v2 = FileV2.model_validate(
|
|
1975
|
+
self._client.get(f"/files/{int(file_id)}", min_api_version=FILES_V2_MIN_API_VERSION)
|
|
1976
|
+
)
|
|
1977
|
+
if v2.download_url:
|
|
1978
|
+
return _presigned(v2.download_url, v2.id, v2.name, v2.size, v2.content_type)
|
|
1979
|
+
except (ApiVersionTooOldError, AuthorizationError, NotFoundError):
|
|
1980
|
+
pass
|
|
1958
1981
|
file_meta = self.get(file_id)
|
|
1959
1982
|
|
|
1960
1983
|
url = self._client.get_redirect_url(
|
|
@@ -1967,27 +1990,7 @@ class EntityFileService(FileSearchMixin):
|
|
|
1967
1990
|
f"Failed to get presigned URL for file {file_id}: no redirect returned"
|
|
1968
1991
|
)
|
|
1969
1992
|
|
|
1970
|
-
|
|
1971
|
-
# Default to 60 seconds if not found (Affinity's typical TTL)
|
|
1972
|
-
parsed = urlparse(url)
|
|
1973
|
-
qs = parse_qs(parsed.query)
|
|
1974
|
-
expires_in = 60 # default
|
|
1975
|
-
if "X-Amz-Expires" in qs:
|
|
1976
|
-
with contextlib.suppress(ValueError, IndexError):
|
|
1977
|
-
expires_in = int(qs["X-Amz-Expires"][0])
|
|
1978
|
-
|
|
1979
|
-
now = datetime.now(timezone.utc)
|
|
1980
|
-
expires_at = now + timedelta(seconds=expires_in)
|
|
1981
|
-
|
|
1982
|
-
return PresignedUrl(
|
|
1983
|
-
url=url,
|
|
1984
|
-
file_id=int(file_id),
|
|
1985
|
-
name=file_meta.name,
|
|
1986
|
-
size=file_meta.size,
|
|
1987
|
-
content_type=file_meta.content_type,
|
|
1988
|
-
expires_in=expires_in,
|
|
1989
|
-
expires_at=expires_at,
|
|
1990
|
-
)
|
|
1993
|
+
return _presigned(url, file_id, file_meta.name, file_meta.size, file_meta.content_type)
|
|
1991
1994
|
|
|
1992
1995
|
def download_stream(
|
|
1993
1996
|
self,
|
|
@@ -2468,10 +2471,6 @@ class AsyncNoteService(AsyncNoteSearchMixin):
|
|
|
2468
2471
|
next_page_token=data.get("next_page_token") or data.get("nextPageToken"),
|
|
2469
2472
|
)
|
|
2470
2473
|
|
|
2471
|
-
async def get(self, note_id: NoteId) -> Note:
|
|
2472
|
-
data = await self._client.get(f"/notes/{note_id}", v1=True)
|
|
2473
|
-
return Note.model_validate(data)
|
|
2474
|
-
|
|
2475
2474
|
async def create(self, data: NoteCreate) -> NoteV2:
|
|
2476
2475
|
"""Create a note (V2); see :meth:`NoteService.create`."""
|
|
2477
2476
|
return NoteV2.model_validate(await self._client.post("/notes", json=note_create_body(data)))
|
|
@@ -2484,11 +2483,11 @@ class AsyncNoteService(AsyncNoteSearchMixin):
|
|
|
2484
2483
|
if data.content is not None:
|
|
2485
2484
|
note = None
|
|
2486
2485
|
with contextlib.suppress(AffinityError):
|
|
2487
|
-
note = await self.
|
|
2486
|
+
note = await self.get(note_id)
|
|
2488
2487
|
if has_mentions(note):
|
|
2489
2488
|
raise mentions_error(exc) from exc
|
|
2490
2489
|
raise
|
|
2491
|
-
return await self.
|
|
2490
|
+
return await self.get(note_id, includes=True)
|
|
2492
2491
|
|
|
2493
2492
|
async def delete(self, note_id: NoteId) -> bool:
|
|
2494
2493
|
"""Delete a note you created (V2); see :meth:`NoteService.delete`."""
|
|
@@ -2534,7 +2533,7 @@ class AsyncNoteService(AsyncNoteSearchMixin):
|
|
|
2534
2533
|
# V2 notes (read): NoteV2 with creator, HTML content, interaction, transcript
|
|
2535
2534
|
# =========================================================================
|
|
2536
2535
|
|
|
2537
|
-
async def
|
|
2536
|
+
async def feed(
|
|
2538
2537
|
self,
|
|
2539
2538
|
*,
|
|
2540
2539
|
creator_id: int | None = None,
|
|
@@ -2578,7 +2577,7 @@ class AsyncNoteService(AsyncNoteSearchMixin):
|
|
|
2578
2577
|
)
|
|
2579
2578
|
return page_of(NoteV2, await self._client.get("/notes", params=params or None))
|
|
2580
2579
|
|
|
2581
|
-
def
|
|
2580
|
+
def iter_feed(
|
|
2582
2581
|
self,
|
|
2583
2582
|
*,
|
|
2584
2583
|
creator_id: int | None = None,
|
|
@@ -2588,12 +2587,12 @@ class AsyncNoteService(AsyncNoteSearchMixin):
|
|
|
2588
2587
|
includes: bool | Sequence[str] | None = None,
|
|
2589
2588
|
limit: int | None = None,
|
|
2590
2589
|
) -> AsyncIterator[NoteV2]:
|
|
2591
|
-
"""All notes matching the filters (every page); see :meth:`
|
|
2590
|
+
"""All notes matching the filters (every page); see :meth:`feed`."""
|
|
2592
2591
|
|
|
2593
2592
|
async def fetch_page(next_url: str | None) -> PaginatedResponse[NoteV2]:
|
|
2594
2593
|
if next_url:
|
|
2595
|
-
return await self.
|
|
2596
|
-
return await self.
|
|
2594
|
+
return await self.feed(cursor=next_url)
|
|
2595
|
+
return await self.feed(
|
|
2597
2596
|
creator_id=creator_id,
|
|
2598
2597
|
created_after=created_after,
|
|
2599
2598
|
created_before=created_before,
|
|
@@ -2604,10 +2603,8 @@ class AsyncNoteService(AsyncNoteSearchMixin):
|
|
|
2604
2603
|
|
|
2605
2604
|
return AsyncPageIterator(fetch_page)
|
|
2606
2605
|
|
|
2607
|
-
async def
|
|
2608
|
-
|
|
2609
|
-
) -> NoteV2:
|
|
2610
|
-
"""One note as ``NoteV2`` (``includes`` as in :meth:`list_v2`)."""
|
|
2606
|
+
async def get(self, note_id: NoteId, *, includes: bool | Sequence[str] | None = None) -> NoteV2:
|
|
2607
|
+
"""One note as ``NoteV2`` (``includes`` as in :meth:`feed`)."""
|
|
2611
2608
|
params = [("includes", value) for value in note_includes(includes)]
|
|
2612
2609
|
return NoteV2.model_validate(
|
|
2613
2610
|
await self._client.get(f"/notes/{int(note_id)}", params=params or None)
|
|
@@ -3735,19 +3732,11 @@ class AsyncEntityFileService(AsyncFileSearchMixin):
|
|
|
3735
3732
|
)
|
|
3736
3733
|
|
|
3737
3734
|
async def get(self, file_id: FileId) -> EntityFile:
|
|
3735
|
+
"""A file's details (V1); see :meth:`EntityFileService.get`."""
|
|
3738
3736
|
data = await self._client.get(f"/entity-files/{file_id}", v1=True)
|
|
3739
3737
|
return EntityFile.model_validate(data)
|
|
3740
3738
|
|
|
3741
|
-
async def
|
|
3742
|
-
"""One file's metadata from V2 (Affinity API 2026-09-17+), with a download URL that
|
|
3743
|
-
expires 60 seconds later. :meth:`get` (V1) is unchanged."""
|
|
3744
|
-
return FileV2.model_validate(
|
|
3745
|
-
await self._client.get(
|
|
3746
|
-
f"/files/{int(file_id)}", min_api_version=FILES_V2_MIN_API_VERSION
|
|
3747
|
-
)
|
|
3748
|
-
)
|
|
3749
|
-
|
|
3750
|
-
async def list_v2(
|
|
3739
|
+
async def feed(
|
|
3751
3740
|
self,
|
|
3752
3741
|
*,
|
|
3753
3742
|
created_after: datetime | None = None,
|
|
@@ -3780,7 +3769,7 @@ class AsyncEntityFileService(AsyncFileSearchMixin):
|
|
|
3780
3769
|
),
|
|
3781
3770
|
)
|
|
3782
3771
|
|
|
3783
|
-
def
|
|
3772
|
+
def iter_feed(
|
|
3784
3773
|
self,
|
|
3785
3774
|
*,
|
|
3786
3775
|
created_after: datetime | None = None,
|
|
@@ -3788,12 +3777,12 @@ class AsyncEntityFileService(AsyncFileSearchMixin):
|
|
|
3788
3777
|
creator_id: UserId | None = None,
|
|
3789
3778
|
limit: int | None = None,
|
|
3790
3779
|
) -> AsyncIterator[FileV2]:
|
|
3791
|
-
"""All files matching the filters (every page); see :meth:`
|
|
3780
|
+
"""All files matching the filters (every page); see :meth:`feed`."""
|
|
3792
3781
|
|
|
3793
3782
|
async def fetch_page(next_url: str | None) -> PaginatedResponse[FileV2]:
|
|
3794
3783
|
if next_url:
|
|
3795
|
-
return await self.
|
|
3796
|
-
return await self.
|
|
3784
|
+
return await self.feed(cursor=next_url)
|
|
3785
|
+
return await self.feed(
|
|
3797
3786
|
created_after=created_after,
|
|
3798
3787
|
created_before=created_before,
|
|
3799
3788
|
creator_id=creator_id,
|
|
@@ -3992,7 +3981,18 @@ class AsyncEntityFileService(AsyncFileSearchMixin):
|
|
|
3992
3981
|
Raises:
|
|
3993
3982
|
AffinityError: If the API doesn't return a redirect URL
|
|
3994
3983
|
"""
|
|
3995
|
-
#
|
|
3984
|
+
# V2 answers with the details and a signed URL in one request (API 2026-09-17+, beta);
|
|
3985
|
+
# a client pinned older, or a V2 refusal, uses V1's details and redirect instead
|
|
3986
|
+
try:
|
|
3987
|
+
v2 = FileV2.model_validate(
|
|
3988
|
+
await self._client.get(
|
|
3989
|
+
f"/files/{int(file_id)}", min_api_version=FILES_V2_MIN_API_VERSION
|
|
3990
|
+
)
|
|
3991
|
+
)
|
|
3992
|
+
if v2.download_url:
|
|
3993
|
+
return _presigned(v2.download_url, v2.id, v2.name, v2.size, v2.content_type)
|
|
3994
|
+
except (ApiVersionTooOldError, AuthorizationError, NotFoundError):
|
|
3995
|
+
pass
|
|
3996
3996
|
file_meta = await self.get(file_id)
|
|
3997
3997
|
|
|
3998
3998
|
url = await self._client.get_redirect_url(
|
|
@@ -4005,27 +4005,7 @@ class AsyncEntityFileService(AsyncFileSearchMixin):
|
|
|
4005
4005
|
f"Failed to get presigned URL for file {file_id}: no redirect returned"
|
|
4006
4006
|
)
|
|
4007
4007
|
|
|
4008
|
-
|
|
4009
|
-
# Default to 60 seconds if not found (Affinity's typical TTL)
|
|
4010
|
-
parsed = urlparse(url)
|
|
4011
|
-
qs = parse_qs(parsed.query)
|
|
4012
|
-
expires_in = 60 # default
|
|
4013
|
-
if "X-Amz-Expires" in qs:
|
|
4014
|
-
with contextlib.suppress(ValueError, IndexError):
|
|
4015
|
-
expires_in = int(qs["X-Amz-Expires"][0])
|
|
4016
|
-
|
|
4017
|
-
now = datetime.now(timezone.utc)
|
|
4018
|
-
expires_at = now + timedelta(seconds=expires_in)
|
|
4019
|
-
|
|
4020
|
-
return PresignedUrl(
|
|
4021
|
-
url=url,
|
|
4022
|
-
file_id=int(file_id),
|
|
4023
|
-
name=file_meta.name,
|
|
4024
|
-
size=file_meta.size,
|
|
4025
|
-
content_type=file_meta.content_type,
|
|
4026
|
-
expires_in=expires_in,
|
|
4027
|
-
expires_at=expires_at,
|
|
4028
|
-
)
|
|
4008
|
+
return _presigned(url, file_id, file_meta.name, file_meta.size, file_meta.content_type)
|
|
4029
4009
|
|
|
4030
4010
|
def download_stream(
|
|
4031
4011
|
self,
|
|
@@ -84,7 +84,7 @@ from affinity.types import CompanyId, NoteId
|
|
|
84
84
|
|
|
85
85
|
since = datetime(2025, 6, 1, tzinfo=timezone.utc)
|
|
86
86
|
with Affinity.from_env() as client:
|
|
87
|
-
for note in client.notes.
|
|
87
|
+
for note in client.notes.iter_feed(created_after=since, includes=True):
|
|
88
88
|
print(note.id, note.type, note.creator, note.replies_count, note.companies_total)
|
|
89
89
|
|
|
90
90
|
for reply in client.notes.iter_replies(NoteId(123)):
|
|
@@ -28,7 +28,8 @@ Where V2 has the operation but can't do one part of it, that case goes through V
|
|
|
28
28
|
| `lists.create` | `owner_id` or `additional_permissions` is set |
|
|
29
29
|
| `reminders.update` | `type` is set (V2 can't change a reminder's type) |
|
|
30
30
|
| `reminders.update` / `delete` | V2 refuses (403: only the creator or owner may change it on V2); retried once on V1 |
|
|
31
|
-
| `files.
|
|
31
|
+
| `files.get` / `list` / `iter` | always (only V1 has the file's person, company or opportunity and works under any version pin; `files.feed` lists through V2) |
|
|
32
|
+
| `files.get_download_url` | when V2 can't answer: pinned older than 2026-09-17, or V2 refuses (V2 otherwise, in one request) |
|
|
32
33
|
| `lists.get_size` | always (V2 has no list size) |
|
|
33
34
|
|
|
34
35
|
The [API coverage](../reference/api-coverage.md) page lists every operation, the SDK call that
|
|
@@ -59,8 +59,10 @@ ls|get|create|update|delete`; create, update and delete ask for confirmation.
|
|
|
59
59
|
| `type=HTML` with any tags | `<b>`/`<i>` become `<strong>`/`<em>`; tags Affinity rejects raise `ValueError` naming the allowed ones |
|
|
60
60
|
| `parent_id` with entity ids (ids ignored) | `ValidationError` |
|
|
61
61
|
|
|
62
|
-
`
|
|
63
|
-
|
|
62
|
+
`notes.get()` returns `NoteV2` (`includes=True` adds the attached companies, persons and
|
|
63
|
+
opportunities); `notes.list_v2()`/`iter_v2()`/`get_v2()` are now `notes.feed()`/`iter_feed()`/
|
|
64
|
+
`get()`. `notes.list()` (one entity's notes) and CLI `note ls` still use V1, which shows notes
|
|
65
|
+
stored as HTML in a markdown-like form. Changing the text of a note that @mentions people is refused by the API.
|
|
64
66
|
|
|
65
67
|
## Lists
|
|
66
68
|
|
|
@@ -76,9 +78,9 @@ unchanged (V1): Affinity's V2 spec documents them, but the API didn't serve them
|
|
|
76
78
|
|
|
77
79
|
## Files and rate limits
|
|
78
80
|
|
|
79
|
-
`files.get/list/iter` are unchanged (V1).
|
|
80
|
-
|
|
81
|
-
first). `rate_limits.refresh()` reads the V2 endpoint; `RateLimitSnapshot` is unchanged.
|
|
81
|
+
`files.get/list/iter` are unchanged (V1). `files.get_download_url()` uses V2 when it can (one
|
|
82
|
+
request for the details and a URL valid 60 seconds) and V1 otherwise. New:
|
|
83
|
+
`files.feed()`/`iter_feed()` (every file you can see, newest first, as `FileV2`). `rate_limits.refresh()` reads the V2 endpoint; `RateLimitSnapshot` is unchanged.
|
|
82
84
|
|
|
83
85
|
## CLI and MCP
|
|
84
86
|
|
|
@@ -35,9 +35,9 @@ against the pinned API specs and checks that each supported call requests its op
|
|
|
35
35
|
| `GET /v2/emails` | supported | `interactions.list_emails()` | |
|
|
36
36
|
| `POST /v2/feedback` | planned | | phase 2.x-1 |
|
|
37
37
|
| `GET /v2/field-value-changes` | supported | `field_value_changes.list_global(field_id=FieldId(1))` | |
|
|
38
|
-
| `GET /v2/files` | supported | `files.
|
|
38
|
+
| `GET /v2/files` | supported | `files.feed()` | beta; API 2026-09-17+ |
|
|
39
39
|
| `POST /v2/files/search` | supported | `files.search("prompt text")` | |
|
|
40
|
-
| `GET /v2/files/{fileId}` | supported | `files.
|
|
40
|
+
| `GET /v2/files/{fileId}` | supported | `files.get_download_url(FileId(1))` | beta; API 2026-09-17+ |
|
|
41
41
|
| `GET /v2/inferred-connections/coworkers` | planned | | beta; phase 2.x-2 |
|
|
42
42
|
| `GET /v2/inferred-connections/investor-executive-connections` | planned | | beta; phase 2.x-2 |
|
|
43
43
|
| `GET /v2/lists` | supported | `lists.list()` | |
|
|
@@ -64,11 +64,11 @@ against the pinned API specs and checks that each supported call requests its op
|
|
|
64
64
|
| `GET /v2/lists/{listId}/saved-views/{viewId}/list-entries` | supported | `lists.entries(ListId(1)).from_saved_view(SavedViewId(1))` | |
|
|
65
65
|
| `GET /v2/meetings` | supported | `interactions.list_meetings()` | |
|
|
66
66
|
| `GET /v2/meetings/{meetingId}` | planned | | beta; API 2026-07-15+; phase 2.x-1 |
|
|
67
|
-
| `GET /v2/notes` | supported | `notes.
|
|
67
|
+
| `GET /v2/notes` | supported | `notes.feed()` | |
|
|
68
68
|
| `POST /v2/notes` | supported | `notes.create(NoteCreate(content="x", person_ids=[PersonId(1)]))` | |
|
|
69
69
|
| `POST /v2/notes/search` | supported | `notes.search("prompt text")` | |
|
|
70
70
|
| `DELETE /v2/notes/{noteId}` | supported | `notes.delete(NoteId(1))` | |
|
|
71
|
-
| `GET /v2/notes/{noteId}` | supported | `notes.
|
|
71
|
+
| `GET /v2/notes/{noteId}` | supported | `notes.get(NoteId(1))` | |
|
|
72
72
|
| `POST /v2/notes/{noteId}` | supported | `notes.update(NoteId(1), NoteUpdate(content="x"))` | |
|
|
73
73
|
| `GET /v2/notes/{noteId}/attached-companies` | planned | | phase 2.x-1 |
|
|
74
74
|
| `GET /v2/notes/{noteId}/attached-opportunities` | planned | | phase 2.x-1 |
|
|
@@ -125,15 +125,15 @@ against the pinned API specs and checks that each supported call requests its op
|
|
|
125
125
|
|
|
126
126
|
## V1 API
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
40 supported, 19 equivalent
|
|
129
129
|
|
|
130
130
|
| Operation | Status | SDK | Notes |
|
|
131
131
|
|---|---|---|---|
|
|
132
132
|
| `GET /auth/whoami` | equivalent | | via v2 GET /v2/auth/whoami |
|
|
133
|
-
| `GET /entity-files` | supported | `files.list(company_id=CompanyId(1))` | one person's, company's or opportunity's files (V2 lists only org-wide: files.
|
|
133
|
+
| `GET /entity-files` | supported | `files.list(company_id=CompanyId(1))` | one person's, company's or opportunity's files (V2 lists only org-wide: files.feed) |
|
|
134
134
|
| `POST /entity-files` | supported | `files.upload_bytes(b"x", "a.txt", company_id=CompanyId(1))` | |
|
|
135
135
|
| `GET /entity-files/download/{}` | supported | `files.download(FileId(1))` | |
|
|
136
|
-
| `GET /entity-files/{}` | supported | `files.get(FileId(1))` |
|
|
136
|
+
| `GET /entity-files/{}` | supported | `files.get(FileId(1))` | the file's record, with its person/company/opportunity, under any API version pin; get_download_url uses V2 when it can |
|
|
137
137
|
| `GET /field-value-changes` | supported | `field_value_changes.list(FieldId(1), company_id=CompanyId(1))` | |
|
|
138
138
|
| `GET /field-values` | supported | `field_values.list(company_id=CompanyId(1))` | |
|
|
139
139
|
| `POST /field-values` | supported | `field_values.create(FieldValueCreate(field_id=FieldId(1), entity_id=1, value="x"))` | |
|
|
@@ -157,7 +157,7 @@ against the pinned API specs and checks that each supported call requests its op
|
|
|
157
157
|
| `GET /notes` | supported | `notes.list()` | |
|
|
158
158
|
| `POST /notes` | equivalent | | via v2 POST /v2/notes |
|
|
159
159
|
| `DELETE /notes/{}` | equivalent | | via v2 DELETE /v2/notes/{noteId} |
|
|
160
|
-
| `GET /notes/{}` |
|
|
160
|
+
| `GET /notes/{}` | equivalent | | via v2 GET /v2/notes/{noteId} |
|
|
161
161
|
| `PUT /notes/{}` | equivalent | | via v2 POST /v2/notes/{noteId} |
|
|
162
162
|
| `GET /opportunities` | supported | `opportunities.search("x")` | |
|
|
163
163
|
| `POST /opportunities` | supported | `opportunities.create(OpportunityCreate(name="x", list_id=ListId(1)))` | |
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Files
|
|
2
|
+
|
|
3
|
+
`get`, `list`, `all`, `iter`, uploads and downloads use V1: only V1 has a file's person,
|
|
4
|
+
company or opportunity, and it works under any API version pin. `get_download_url` uses V2 when
|
|
5
|
+
it can (one request for the details and a signed URL) and V1 otherwise. `feed`/`iter_feed`
|
|
6
|
+
list every file visible to you, newest first, through V2 (Affinity API 2026-09-17+).
|
|
7
|
+
|
|
8
|
+
::: affinity.services.v1_only.EntityFileService
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Notes
|
|
2
2
|
|
|
3
|
-
Reads (`list`, `
|
|
3
|
+
Reads by entity (`list`, `iter`) use V1; `get`, `feed`, `iter_feed`, `list_replies`, `search` and the
|
|
4
4
|
writes (`create`, `update`, `delete`) use V2, which stores notes as HTML.
|
|
5
5
|
|
|
6
6
|
::: affinity.services.v1_only.NoteService
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"_generated": {
|
|
3
3
|
"warning": "DO NOT EDIT - This file is auto-generated",
|
|
4
4
|
"generator": "tools/generate_mcp_command_registry.py",
|
|
5
|
-
"cliVersion": "2.0.
|
|
5
|
+
"cliVersion": "2.0.1",
|
|
6
6
|
"sourceConfig": "mcp/.registry/mcp-commands.json"
|
|
7
7
|
},
|
|
8
8
|
"version": 1,
|
|
9
|
-
"cliVersion": "2.0.
|
|
9
|
+
"cliVersion": "2.0.1",
|
|
10
10
|
"commands": [
|
|
11
11
|
{
|
|
12
12
|
"name": "company create",
|