affinity-sdk 2.0.1__tar.gz → 2.0.3__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.1 → affinity_sdk-2.0.3}/CHANGELOG.md +163 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/PKG-INFO +14 -7
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/README.md +13 -6
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/__init__.py +2 -0
- affinity_sdk-2.0.3/affinity/_filtering/__init__.py +5 -0
- {affinity_sdk-2.0.1/affinity/cli/query → affinity_sdk-2.0.3/affinity/_filtering}/dates.py +26 -12
- affinity_sdk-2.0.3/affinity/_filtering/filter_text.py +52 -0
- affinity_sdk-2.0.3/affinity/_filtering/pushdown.py +593 -0
- affinity_sdk-2.0.3/affinity/_filtering/search.py +305 -0
- affinity_sdk-2.0.3/affinity/_filtering/where.py +108 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/company_cmds.py +30 -12
- affinity_sdk-2.0.3/affinity/cli/commands/discovery_cmds.py +243 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/list_cmds.py +190 -34
- affinity_sdk-2.0.3/affinity/cli/commands/org_cmds.py +447 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/person_cmds.py +30 -12
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/query_cmd.py +4 -3
- affinity_sdk-2.0.3/affinity/cli/entity_search.py +263 -0
- affinity_sdk-2.0.3/affinity/cli/list_search.py +90 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/main.py +9 -0
- affinity_sdk-2.0.3/affinity/cli/query/dates.py +21 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/executor.py +503 -146
- affinity_sdk-2.0.3/affinity/cli/query/filter_text.py +5 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/filters.py +4 -2
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/models.py +6 -92
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/parser.py +35 -6
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/planner.py +70 -49
- affinity_sdk-2.0.3/affinity/cli/query/pushdown.py +12 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/client.py +56 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/clients/http.py +54 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/compare.py +90 -28
- affinity_sdk-2.0.3/affinity/criteria.py +421 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/exceptions.py +9 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/filters.py +2 -1
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/__init__.py +32 -0
- affinity_sdk-2.0.3/affinity/models/discovery.py +178 -0
- affinity_sdk-2.0.3/affinity/models/org.py +93 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/__init__.py +4 -0
- affinity_sdk-2.0.3/affinity/services/_discovery.py +470 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/_org_reads.py +8 -0
- affinity_sdk-2.0.3/affinity/services/_search.py +304 -0
- affinity_sdk-2.0.3/affinity/services/_single_field.py +151 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/companies.py +32 -2
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/lists.py +721 -349
- affinity_sdk-2.0.3/affinity/services/org.py +563 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/persons.py +27 -2
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/v1_only.py +183 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/cli/commands.md +126 -10
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/cli/index.md +1 -1
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/claude-code-plugins.md +5 -5
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/csv-export.md +5 -5
- affinity_sdk-2.0.3/docs/public/guides/filtering.md +423 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/migrating-to-2.md +19 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/query-command.md +92 -21
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/api-coverage.md +28 -26
- affinity_sdk-2.0.3/docs/public/reference/filters.md +21 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/query-language.md +71 -31
- affinity_sdk-2.0.3/docs/public/reference/services/companies.md +101 -0
- affinity_sdk-2.0.3/docs/public/reference/services/lists.md +24 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/persons.md +15 -0
- affinity_sdk-2.0.3/docs/public/reference/services/teams-users.md +7 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/plugin.json +1 -1
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/skills/affinity-mcp-workflows/SKILL.md +2 -2
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/skills/query-language/SKILL.md +43 -21
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/skills/query-language/references/filter-operators.md +13 -5
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/skills/query-language/references/quantifiers.md +25 -17
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.gitignore +3 -0
- affinity_sdk-2.0.3/mcp/.mcp-bash/VERSION +1 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/bin/mcp-bash +59 -3
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/resources.sh +2 -2
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/tools.sh +0 -1
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/cli/common.sh +2 -2
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/completion.sh +1 -1
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/core.sh +188 -14
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/elicitation.sh +19 -2
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/file_read.sh +57 -17
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/io.sh +99 -14
- affinity_sdk-2.0.3/mcp/.mcp-bash/lib/lock.sh +252 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/policy.sh +7 -2
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/progress-passthrough.sh +0 -2
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/progress.sh +4 -3
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/prompts.sh +3 -4
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/registry.sh +34 -7
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/resource_match.sh +18 -3
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/resources.sh +266 -44
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/runtime.sh +58 -5
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/tools.sh +77 -103
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/ui.sh +2 -1
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/validate.sh +10 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/providers/file.sh +12 -1
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/providers/ui.sh +5 -1
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/sdk/tool-sdk.sh +8 -8
- affinity_sdk-2.0.3/mcp/.mcp-bash/vendor.json +1 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.registry/commands.generated.json +634 -10
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.registry/mcp-commands.json +55 -4
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/CHANGELOG.md +50 -1
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/COMPATIBILITY +19 -2
- affinity_sdk-2.0.3/mcp/VERSION +1 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/mcp-bash.lock +2 -2
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/data-model/data-model.md +24 -19
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/server.d/requirements.json +1 -1
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/server.d/server.meta.json +1 -1
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/execute-read-command/tool.meta.json +1 -1
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/execute-write-command/tool.sh +4 -0
- affinity_sdk-2.0.3/mcp/tools/query/tool.meta.json +111 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mkdocs.yml +1 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/affinity-sdk/.claude-plugin/plugin.json +1 -1
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/SKILL.md +46 -4
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/.claude-plugin/plugin.json +1 -1
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/SKILL.md +11 -7
- affinity_sdk-2.0.3/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/filtering.md +79 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/query-guide.md +65 -16
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/pyproject.toml +1 -1
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/cassettes/company-lists-status.cassette.json +86 -86
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/cassettes/hook-blocks-without-key.cassette.json +63 -63
- affinity_sdk-2.0.3/tests/cowork/cassettes/no-key-skill-path.cassette.json +417 -0
- affinity_sdk-2.0.3/tests/cowork/cassettes/status-history.cassette.json +492 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_company_cmds_coverage.py +4 -3
- affinity_sdk-2.0.3/tests/test_cli_entity_ls_server_filter.py +278 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_list_export_filter_safety.py +5 -3
- affinity_sdk-2.0.3/tests/test_cli_list_export_server_filter.py +183 -0
- affinity_sdk-2.0.3/tests/test_cli_org.py +193 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_person_cmds_coverage.py +4 -3
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_planner.py +10 -8
- affinity_sdk-2.0.3/tests/test_cli_query_server_filter.py +424 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_compare.py +52 -3
- affinity_sdk-2.0.3/tests/test_duplicates_connections.py +277 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_filters.py +10 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_get_first.py +6 -0
- affinity_sdk-2.0.3/tests/test_list_entries_server_filter.py +270 -0
- affinity_sdk-2.0.3/tests/test_query_pushdown.py +376 -0
- affinity_sdk-2.0.3/tests/test_search_v2.py +277 -0
- affinity_sdk-2.0.3/tests/test_single_field_v2.py +150 -0
- affinity_sdk-2.0.3/tests/test_teams_users_feedback.py +273 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/api_coverage.json +64 -49
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/openapi_snapshots/2024-01-01.json +2 -2
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/openapi_snapshots/2026-07-15.json +2 -2
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/openapi_snapshots/2026-09-17.json +112 -2
- affinity_sdk-2.0.3/tools/search_golden.py +238 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/validate_openapi_models.py +31 -0
- affinity_sdk-2.0.1/docs/public/guides/filtering.md +0 -303
- affinity_sdk-2.0.1/docs/public/reference/filters.md +0 -3
- affinity_sdk-2.0.1/docs/public/reference/services/companies.md +0 -45
- affinity_sdk-2.0.1/docs/public/reference/services/lists.md +0 -5
- affinity_sdk-2.0.1/mcp/.mcp-bash/VERSION +0 -1
- affinity_sdk-2.0.1/mcp/.mcp-bash/lib/lock.sh +0 -176
- affinity_sdk-2.0.1/mcp/.mcp-bash/vendor.json +0 -1
- affinity_sdk-2.0.1/mcp/VERSION +0 -1
- affinity_sdk-2.0.1/mcp/tools/query/tool.meta.json +0 -111
- affinity_sdk-2.0.1/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/filtering.md +0 -51
- affinity_sdk-2.0.1/tests/cowork/cassettes/no-key-skill-path.cassette.json +0 -395
- affinity_sdk-2.0.1/tests/cowork/cassettes/status-history.cassette.json +0 -469
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.claude-plugin/marketplace.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.cursor/rules/test-data-privacy.mdc +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.editorconfig +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.env.example +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.gitattributes +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/CODEOWNERS +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/PULL_REQUEST_TEMPLATE/cli_command.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/PULL_REQUEST_TEMPLATE/release.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/dependabot.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/labels.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/mcp-release-install-footer.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/pull_request_template.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/release-install-footer.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/ci.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/cowork-replay.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/docs.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/labels.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/linkcheck.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/openapi-validation.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/plugin-build.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/plugin-release.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/release-detect.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/release.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/version-check.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.gitignore +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.pre-commit-config.yaml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/AGENTS.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/CODE_OF_CONDUCT.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/CONTRIBUTING.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/LICENSE +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/SECURITY.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/VERSIONING.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/_internal/__init__.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/_internal/keyfile.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/api_versions.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/__init__.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/__main__.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/_update_worker.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/click_compat.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/__init__.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_entity_field.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_entity_files_dump.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_entity_files_read.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_entity_files_upload.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_list_entry_fields.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_org_reads.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_search_common.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_v1_parsing.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/completion_cmd.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/config_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/entry_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/field_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/file_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/file_url_cmd.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/interaction_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/note_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/opportunity_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/org_read_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/relationship_strength_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/reminder_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/resolve_url_cmd.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/session_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/task_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/transcript_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/version_cmd.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/webhook_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/whoami_cmd.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/config.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/confirm.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/constants.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/context.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/csv_utils.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/date_utils.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/decorators.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/errors.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/field_utils.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/formatters.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/help_json.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/interaction_utils.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/logging.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/mcp_limits.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/options.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/paths.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/progress.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/__init__.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/aggregates.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/cursor.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/exceptions.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/output.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/progress.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/schema.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/render.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/resolve.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/resolvers.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/results.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/runner.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/serialization.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/session_cache.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/types.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/update_check.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/clients/__init__.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/clients/pipeline.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/downloads.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/field_resolve_utils.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/field_resolver.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/hooks.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/inbound_webhooks.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/entities.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/interactions_v2.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/pagination.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/rate_limit_snapshot.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/relationships_v2.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/search.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/secondary.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/transcripts.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/types.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/policies.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/progress.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/py.typed +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/_dropdown_options.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/_field_listing.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/_field_updates.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/_note_html.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/_v2_filters.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/opportunities.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/rate_limits.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/reminders.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/search.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/tasks.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/transcripts.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/webhooks.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/types.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/codecov.yml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/cli-development-guide.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/ai-integrations/index.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/changelog.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/cli/scripting.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/cli-reference.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/examples.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/getting-started.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/glossary.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/affinity-official-mcp-comparison.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/api-versions-and-routing.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/api-versions.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/authentication.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/configuration.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/datetime-handling.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/debugging-hooks.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/errors-and-retries.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/field-types-and-values.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/field-values.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/ids-and-types.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/models.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/opportunity-associations.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/pagination.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/performance.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/rate-limits.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/sync-vs-async.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/webhooks.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/index.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/mcp/index.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/client.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/exceptions.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/models.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/opportunities.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/reminders.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/tasks.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/v1/auth.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/v1/field-values.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/v1/fields.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/v1/files.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/v1/interactions.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/v1/notes.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/v1/relationships.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/webhooks.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/types.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/troubleshooting.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/advanced_usage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/async_lifecycle.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/basic_usage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/filter_builder.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/hooks_debugging.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/list_management.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/resolve_helpers.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/task_polling.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/.gitignore +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/skills/pipeline-history/SKILL.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/skills/query-language/references/include-expand.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/skills/query-language/references/output-formats.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/xaffinity-mcp.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/completion.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/lifecycle.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/logging.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/ping.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/prompts.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/roots.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/auth.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/capabilities.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/cli/health.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/handler_helpers.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/hash.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/ids.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/json.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/logging.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/meta_env.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/paginate.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/path.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/require.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/resource_content.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/resource_providers.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/roots.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/rpc.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/spec.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/timeout.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/tools_policy.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/ui-templates.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/uri.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/providers/echo.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/providers/git.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/providers/https.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/sdk/tool-error.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/sdk/ui-sdk.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.registry/prompts.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.registry/resource-templates.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.registry/resources.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.registry/ui-resources.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/Makefile +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/README.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/completions/entity-name.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/completions/list-name.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/completions/status-value.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/docs/DEBUGGING.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/icon.svg +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/lib/cache.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/lib/cli-detect.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/lib/cli-gateway.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/lib/common.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/lib/entity-types.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/lib/field-resolution.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/mcp-publisher.lock +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/mcpb.conf +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/change-status/change-status.completion.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/change-status/change-status.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/change-status/change-status.txt +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/interaction-brief/interaction-brief.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/interaction-brief/interaction-brief.txt +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/log-call/log-call.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/log-call/log-call.txt +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.txt +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/log-message/log-message.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/log-message/log-message.txt +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/pipeline-review/pipeline-review.completion.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/pipeline-review/pipeline-review.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/pipeline-review/pipeline-review.txt +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/prepare-briefing/prepare-briefing.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/prepare-briefing/prepare-briefing.txt +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/warm-intro/warm-intro.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/warm-intro/warm-intro.txt +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/providers/xaffinity.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/data-model/data-model.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/field-catalogs/field-catalogs.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/field-catalogs/field-catalogs.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/interaction-enums/interaction-enums.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/interaction-enums/interaction-enums.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/me/me.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/me/me.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/me-person-id/me-person-id.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/me-person-id/me-person-id.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/query-guide/query-guide.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/query-guide/query-guide.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/saved-views/saved-views.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/saved-views/saved-views.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/workflow-config/workflow-config.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/workflow-config/workflow-config.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/workflows-guide/workflows-guide.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/workflows-guide/workflows-guide.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/xaffinity-field-catalogs.completion.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/xaffinity-saved-views.completion.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/xaffinity-workflow-config.completion.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/server.d/env.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/server.d/health-checks.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/server.d/policy.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/server.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/test/README.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/test/run.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/test/test_env_update_check.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/test-progress.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/discover-commands/tool.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/discover-commands/tool.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/execute-read-command/tool.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/execute-write-command/tool.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/get-entity-dossier/tool.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/get-entity-dossier/tool.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/get-file-url/tool.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/get-file-url/tool.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/query/tool.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/read-xaffinity-resource/tool.meta.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/read-xaffinity-resource/tool.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/user-config.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/xaffinity-mcp-env.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/xaffinity-mcp.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/references/services.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/hooks/guard-env-read.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/hooks/hooks.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/hooks/pre-xaffinity.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/hooks/session-setup.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/files-and-writes.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/history-and-activity.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/interactions.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/setup.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/query/test_cursor.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_company_create_dedup.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_company_ls_filter_rejection.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_formatters.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_output_formats_integration.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_person_create_dedup.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_person_ls_filter_rejection.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_query_filter_rejection.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_query_list_entry_relationships.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_query_list_export_parity.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_query_output_flattening.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_query_output_truncation.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_query_unreplied.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/conftest.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/.cowork-redact.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/README.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/fixtures/workdir-key/README.txt +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/fixtures/workdir-key/xaffinity-test-key +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/fixtures/workdir-nokey/README.txt +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/image/Dockerfile +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/image/fakeaff/build_fixtures.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/image/fakeaff/fixtures.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/image/fakeaff/server.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/image/xaffinity-wrapper.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/privacy-allow.txt +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/record.sh +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/scenarios/company-lists-status.yaml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/scenarios/hook-blocks-without-key.yaml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/scenarios/no-key-skill-path.yaml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/scenarios/status-history.yaml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/sessions/no-key.yaml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/sessions/with-key.yaml +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/field_write_mocks.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/fixtures/openapi/mini_openapi.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/fixtures/webhooks/field_value_updated.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/fixtures/webhooks/list_entry_created.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/fixtures/webhooks/organization_created.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/fixtures/webhooks/organization_merged.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/fixtures/webhooks/person_created.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/fixtures/webhooks/unknown_event.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/README.md +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/conftest.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/setup_query_parity_data.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/test_cli_writes.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/test_query_parity_integration.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/test_sdk_reads.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/test_sdk_writes.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/test_sdk_writes_runner.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/mcp/__init__.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/mcp/test_query_cursor.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/skill-evals/xaffinity-cli-usage-evals/evals.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/spec_guard.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_affinity_client_wrapper_additional_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_api_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_api_key_file_formats.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_api_key_resolution.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_api_version.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_api_version_per_operation.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_async_file_download_streaming.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_batch_get.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_api_version.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_column_limiting.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_command_context.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_company_get.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_config_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_context_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_csv_export.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_date_params.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_date_utils.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_datetime_formatting.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_datetime_header_offsets.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_domain_linkification.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_dotenv_resolution.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_dropdown_field_writes.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_enriched_field_writes.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_entity_field_writes.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_entity_files_dump.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_entry_field.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_entry_field_batch_writes.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_entry_field_multi_value_limits.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_error_hints.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_error_rendering.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_field_history.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_field_history_bulk.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_field_options_and_transcripts.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_field_utils.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_field_utils_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_field_utils_set_phase.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_field_value_humanization.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_file_url.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_files_ls.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_files_read.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_get_interaction_dates.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_help_json.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_interaction_date_chunking.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_interaction_utils.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_json_safety.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_list_cmds_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_list_expand_interactions.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_list_export_entity_scope.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_list_export_field_refresh.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_list_export_truncation_meta.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_missing_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_multi_value_truncation_warnings.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_no_network_commands.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_notes_writes.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_opportunity_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_opportunity_cmds_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_pager_logic.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_person_get.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_plugin_manifest.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_pre_xaffinity_hook.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_progress_manager.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_aggregates.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_cmd.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_cmd_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_dates.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_executor.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_expand_interactions.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_filters.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_integration.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_parser.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_safety.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_schema.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_rate_limit_rendering.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_rate_limit_throttle.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_reminders.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_render_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_resolve_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_resolve_url_parsing.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_result_summary.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_safe_field_writes.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_search.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_serialization.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_session_cache.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_session_setup_hook.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_set_phase_atomicity.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_types.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_unreplied.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_update_check.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_v1_only_cmds.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_v1_parsing.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_webhooks.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_write_ops.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_client.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_companies_create_dedup.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_companies_filter_rejection.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_env_helpers.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_exceptions_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_field_resolver.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_field_service_caching.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_field_types_c4.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_field_value_type.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_field_values_get_value.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_file_batch_get.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_file_download_streaming.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_file_list_batch.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_file_upload_helpers_and_validation.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_files_upload_returning_files.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_files_v2.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_generate_mcp_command_registry.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_get_fields_filter_includes.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_get_fields_pagination.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_hidden_field_values.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_hooks.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_http_client_additional_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_http_client_remaining_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_inbound_webhooks.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_integration_smoke.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_interaction_date_validation.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_interactions_and_files_regressions.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_isodatetime.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_list_entry_membership_and_opportunities.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_list_term.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_lists_v2_writes.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_bundle_env_and_completions.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_cli_version_check.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_entity_dossier.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_gateway_limits.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_history_bulk_gateway.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_limits.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_query_cli_error.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_read_truncation.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_resource_scripts.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_models.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_models_v2_2026_fields.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_multi_value_limits.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_new_features.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_notes_v2.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_notes_v2_writes.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_opportunities_filter_rejection.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_org_reads.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_pagination_iterators.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_persons_create_dedup.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_persons_filter_rejection.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_public_api.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_rate_limit_v2.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_raw_pipeline_hook_events.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_readonly_factory.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_reminder_list_batch.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_reminders_v2.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_requirements_additional.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_sdk_interaction_dates.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_search.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_service_get_parameter_combinations.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_companies_coverage_gaps.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_dropdown_options.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_entity_field_updates.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_field_value_changes.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_list_entries_filter_paths.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_lists_additional_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_lists_coverage_gaps.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_opportunities_additional_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_opportunities_coverage_gaps.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_opportunities_tasks_additional_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_persons_companies_additional_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_rate_limits_coverage_gaps.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_v1_only_async.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_v1_only_coverage_gaps.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_small_modules_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_spec_guard.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_transport_and_readonly_mode.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_v1_association_parsing.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_v1_only_services_additional_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_v1_only_services_more_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_v2_request_bodies.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_validate_openapi_tool.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_webhooks_v2.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/unit/__init__.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/unit/test_exceptions.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/__init__.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/api_coverage.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/api_coverage_v1_snapshot.json +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/check_cli_patterns.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/generate_mcp_command_registry.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/generate_release_notes.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/generate_requirements_mapping.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/sync_mcp_bundle_env.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/sync_mcp_registry.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/sync_mcp_version.py +0 -0
- {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/validate_mcp_registry_metadata.py +0 -0
|
@@ -7,6 +7,169 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.0.3] - 2026-10-13
|
|
11
|
+
|
|
12
|
+
**Exception to semantic versioning** (the maintainer's call, as 2.0.2): some results change
|
|
13
|
+
(`list(filter=...)` pages, the local sort's order, date comparisons in filters). The
|
|
14
|
+
`### Changed` entries say how.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- **SDK list-entry filters go through Affinity's search:**
|
|
19
|
+
`lists.entries(id).list/pages/all/iter/get_first(filter=...)` send the part of the filter
|
|
20
|
+
Affinity's search can answer and check the whole filter locally, as `list export --filter`
|
|
21
|
+
does. Only when no part can go there (or the search is refused) is every entry read; that
|
|
22
|
+
case emits the new `ClientSideFilterWarning` (a `UserWarning`).
|
|
23
|
+
- **`list(filter=...)` returns the matches of one page read**, possibly fewer than `limit` (or
|
|
24
|
+
none), with a `next_cursor` that carries the filter: follow it, or use `iter()` for every
|
|
25
|
+
match. Before, it filtered only the first page and had no way to continue.
|
|
26
|
+
- **Filtered-read cursors are `xsearch2:`** (the filter travels as data, so multi-word field
|
|
27
|
+
names and dates round-trip) in the SDK, `list export`, and `company ls` / `person ls`;
|
|
28
|
+
2.0.2's `xsearch1:` cursors still work.
|
|
29
|
+
- **Field values can be named by id in text filters** (`F.field("field-123")`,
|
|
30
|
+
`--filter 'field-123 = …'`), as `query` allows `fields.<id>`.
|
|
31
|
+
- **`query`'s local sort follows Affinity's order** (when Affinity can't sort, e.g. an
|
|
32
|
+
unsortable field or a refused search): ranked dropdowns sort by rank (not by text),
|
|
33
|
+
multi-value fields by their first item, and text case-insensitively ("apple" before
|
|
34
|
+
"Zeta"); empty values stay last in both directions. Fields named only in `orderBy` are now
|
|
35
|
+
fetched (a local sort used to see them empty). Grouped rows (`groupBy`) sort by their keys
|
|
36
|
+
as before.
|
|
37
|
+
- **Quantifier queries (`all`/`none`/`exists`) on companies and persons no longer always need
|
|
38
|
+
`--max-records`**: their `where` must test a field, which Affinity's search applies first;
|
|
39
|
+
when it matches at most 100 records the query runs, otherwise it stops and names the count.
|
|
40
|
+
`--dry-run` gives a number of API calls instead of "UNBOUNDED" (with `--max-records` too),
|
|
41
|
+
which also fixes the MCP query tool's timeout for these queries (it fell back to 120 s).
|
|
42
|
+
Validation errors found while the query runs exit 2 with `validation_error`, like those
|
|
43
|
+
found while planning.
|
|
44
|
+
|
|
45
|
+
### Added
|
|
46
|
+
|
|
47
|
+
- **`server_filter=False`** on the list-entry `list/pages/all/iter/get_first` reads every entry
|
|
48
|
+
and filters locally (to compare or debug), and **`affinity.ClientSideFilterWarning`**.
|
|
49
|
+
- **More filters go to Affinity's search** (verified live): `starts_word` on single-company
|
|
50
|
+
fields, and `is_not_null` / `is_null` on location fields.
|
|
51
|
+
|
|
52
|
+
- **A team's members and accessible lists, every page** (V2, beta; API 2026-09-17+):
|
|
53
|
+
`teams.list|iter_members(team_id)` and `teams.list|iter_accessible_lists(team_id)`; CLI
|
|
54
|
+
`team members <id>` and `team lists <id>` (`team get` shows only the first 10).
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
|
|
58
|
+
- **Dates compare as dates in `>`, `>=`, `<`, `<=` and between**, everywhere filters run
|
|
59
|
+
(`query`, `--filter`, `--expand-filter`, `company ls` / `person ls --filter`, and the SDK's
|
|
60
|
+
`affinity.filters`): relative dates (`-30d`, `today`) and ISO dates are compared with the
|
|
61
|
+
field's timestamp in UTC. Before, the text filter compared them as text, so
|
|
62
|
+
`Close > "-30d"` matched every dated entry. Equality stays textual (`= "today"` matches the
|
|
63
|
+
word). Timestamps with `Z` or long fractions parse on Python 3.10 too.
|
|
64
|
+
- **`list export --field X --filter "Y = …"`** returned no rows: the filter's fields are now
|
|
65
|
+
fetched even when `--field` leaves them out of the output.
|
|
66
|
+
- **`Team` reads `updatedAt`** (`updated_at`), and accepts the `membersPreview` /
|
|
67
|
+
`accessibleListsPreview` blocks under their own names too.
|
|
68
|
+
|
|
69
|
+
## [2.0.2] - 2026-10-13
|
|
70
|
+
|
|
71
|
+
### Changed (breaking)
|
|
72
|
+
|
|
73
|
+
**Exception to semantic versioning:** these change what some filters return, in a patch release
|
|
74
|
+
(the maintainer's call). Filters now mean what Affinity's own search means, so the same filter
|
|
75
|
+
gives the same answer whether Affinity or the CLI applies it. This reaches Python code too:
|
|
76
|
+
`affinity.filters` (`F`, filter strings, `lists.entries(...).list/iter/pages(filter=...)`)
|
|
77
|
+
uses the same comparison rules as the CLI.
|
|
78
|
+
|
|
79
|
+
- **An empty multi-value field counts as empty.** `is_null` / `is empty` now match a field with
|
|
80
|
+
no items (`[]`), and `is_not_null` / `is not null` no longer do, in `query`, `--filter` and
|
|
81
|
+
the SDK's `affinity.filters`.
|
|
82
|
+
- **`contains` on person and company fields is refused** (in `query` on list entries): use the
|
|
83
|
+
new **`starts_word`** operator, which matches a word in the name that starts with the text,
|
|
84
|
+
the way Affinity's search does ("Jan" finds "Jane Doe"; "ane" doesn't).
|
|
85
|
+
- **`query` sorts the way Affinity's search sorts:** Affinity's order is kept when it sorts,
|
|
86
|
+
and the local sort breaks ties by id (ascending) instead of keeping fetch order.
|
|
87
|
+
- **`query`: a field name two list fields share is refused.** Name the field by id instead:
|
|
88
|
+
`fields.<field id>` (e.g. Affinity's and Dealroom's "Year Founded"). Such fields come back
|
|
89
|
+
keyed by id, instead of one silently overwriting the other. Any field can be named by id.
|
|
90
|
+
- **Person and company field values filter by name** in `--filter` and the SDK's
|
|
91
|
+
`affinity.filters` (`Owner = "Jane Doe"`, `Owner starts_word "Jan"`), as they already did in
|
|
92
|
+
`query`; before, they were compared as raw objects.
|
|
93
|
+
|
|
94
|
+
### Added
|
|
95
|
+
|
|
96
|
+
- **`starts_word` filter operator** (`query` JSON and `--filter` text: `Owner starts_word "Jan"`).
|
|
97
|
+
|
|
98
|
+
- **Teams, users and feedback (V2):** `client.teams.list/iter/get` (Affinity API 2026-09-17+;
|
|
99
|
+
filter by name, sort, `includes` for the first members and accessible lists),
|
|
100
|
+
`client.users.list/iter/get` (internal users; `term`, `status`; a user's id is their person
|
|
101
|
+
id), `client.feedback.send(kind, subject, body)` (to Affinity's product team). New models
|
|
102
|
+
`Team`, `TeamMember`, `UserAccount`, `UserStatus`.
|
|
103
|
+
- **`interactions.get_meeting(id)`** (V2, API 2026-07-15+) and
|
|
104
|
+
**`notes.list/iter_attached_companies|persons|opportunities(note_id)`** (every entity a note
|
|
105
|
+
is attached to, beyond `get()`'s preview).
|
|
106
|
+
- **Duplicate suggestions and warm intros (V2, beta):**
|
|
107
|
+
`companies/persons.list|iter_duplicate_suggestions` (API 2026-07-15+; `term`,
|
|
108
|
+
`match_criteria`, `order_by`) and `companies.list|iter_coworker_connections(company_id)` /
|
|
109
|
+
`list|iter_investor_executive_connections(company_id)` (people at a company today whom someone
|
|
110
|
+
you know may know). CLI `company duplicates`, `person duplicates`, `company connections`.
|
|
111
|
+
- **One field at a time (V2):** `companies/persons.get_field_value(id, field_id)` (the value,
|
|
112
|
+
unwrapped) and `update_field_value(id, field_id, value, value_type=None)`;
|
|
113
|
+
`companies/persons.list|iter_field_value_items(id, field_id)` and
|
|
114
|
+
`lists.entries(list_id).list|iter_field_value_items(entry_id, field_id)` page through a
|
|
115
|
+
multi-value field's items (API 2026-09-17+); `lists.entries(list_id).list|iter_field_changes(
|
|
116
|
+
entry_id, ...)` give one entry's field change history, oldest first.
|
|
117
|
+
- **Search on Affinity's side (V2, beta):** `companies.find`, `persons.find` and
|
|
118
|
+
`lists.entries(list_id).find` (plus `iter_find`, and `find_body` for a prebuilt request
|
|
119
|
+
body) filter, sort and keyword-search on the server, so only matching records are
|
|
120
|
+
downloaded. Build filters with `affinity.criteria`: `Condition(field_id, operator, value)`,
|
|
121
|
+
`all_of`, `any_of`, `Sort`. Value types are read from the fields metadata when omitted, and
|
|
122
|
+
each operator is checked against the field. Needs the "Export All Organizations directory"
|
|
123
|
+
permission (companies, persons) or "Export data from Lists" (list entries). Allowed under
|
|
124
|
+
read-only mode.
|
|
125
|
+
- **`query` on list entries filters on Affinity's side:** conditions on list fields that
|
|
126
|
+
Affinity's search answers (dropdown and ranked-dropdown values, `!=` on dropdowns, numbers,
|
|
127
|
+
dates, text `contains`/`eq`/`starts_with`, `is_not_null` on single-value fields)
|
|
128
|
+
go to the server, so only matching entries are downloaded; the full `where` still runs
|
|
129
|
+
locally on what comes back, so results are unchanged. Everything else (related records,
|
|
130
|
+
`entityName`, `is_null`, Affinity's enriched fields, field names two fields share) is
|
|
131
|
+
filtered locally, as before. If the search is refused (for example, no "Export data from
|
|
132
|
+
Lists" permission) the query reads the whole list instead, with a warning.
|
|
133
|
+
`--include-meta` shows `meta.serverFilter` (what went to the server, and why the rest
|
|
134
|
+
didn't); `--dry-run` names the candidate fields. `XAFFINITY_QUERY_SERVER_FILTER=0` turns it
|
|
135
|
+
off.
|
|
136
|
+
- **`list export --filter` filters on Affinity's side** through the same engine as `query`:
|
|
137
|
+
the `--filter` text becomes a `query` where clause, the part Affinity's search answers is
|
|
138
|
+
sent, and the whole filter still runs locally. When Affinity applies the whole filter,
|
|
139
|
+
`--all` / `--max-results` / `--first-page-only` are no longer required (page one is the
|
|
140
|
+
first page of matches); otherwise the error's `details.local` says which conditions stay
|
|
141
|
+
local. The printed cursor (`xsearch1:...`) carries the search, so `--cursor` alone resumes
|
|
142
|
+
a filtered export. A refused search falls back to reading the whole list, with a warning.
|
|
143
|
+
- **`company ls --filter` and `person ls --filter` work** (they used to be refused): the filter
|
|
144
|
+
goes to Affinity's search, which filters on field values, and the whole filter still runs
|
|
145
|
+
locally on what comes back. A filter with no field condition is still refused (reading every
|
|
146
|
+
company isn't practical: use `--query`). Conditions on Affinity's enriched fields are sent
|
|
147
|
+
as they are, with a warning that Affinity's search can miss a few records' enriched values.
|
|
148
|
+
The cursor carries the search (`xsearch1:...`).
|
|
149
|
+
- **`query` on companies and persons can filter on their fields** (`fields.<name>`): Affinity's
|
|
150
|
+
search applies what it can, the rest of the `where` (e.g. `name contains`) runs on what comes
|
|
151
|
+
back. A `where` with no field condition is still refused (it would mean reading Affinity's
|
|
152
|
+
whole directory). `meta.serverFilter` with `--include-meta`; enriched-field conditions carry
|
|
153
|
+
a warning that a few records' enriched values can be missed.
|
|
154
|
+
- **More of `query` goes to Affinity** (list entries too): `is_null` / `is_not_null` on every
|
|
155
|
+
verified field type, multi-value fields included; multi-select dropdowns (`eq` membership,
|
|
156
|
+
`in`, `has_any`, `has_all`, `contains`/`starts_word` on option text, `!=`); `!=` on numbers;
|
|
157
|
+
and `starts_word` on a person or company
|
|
158
|
+
field (person, multi-person and multi-company fields; one per query, at the top level of the
|
|
159
|
+
`where`, plain text of 3+ letters).
|
|
160
|
+
- **`query` sorts on Affinity's side** when every `orderBy` key is a sortable field
|
|
161
|
+
(`fields.<name>`, up to 5, no `groupBy`/`aggregate`): with a `limit`, the fetch stops once
|
|
162
|
+
enough records pass the filter, instead of reading everything to sort it. This works on
|
|
163
|
+
companies and persons without a `where` too. `meta.serverFilter.sort` says so.
|
|
164
|
+
- **CLI:** `team ls|get`, `user ls|get`, `meeting get`, `note attached`, `feedback send` (asks
|
|
165
|
+
for confirmation: the text leaves your organization). The MCP registry has them; `feedback
|
|
166
|
+
send` goes through the user-confirmation flow.
|
|
167
|
+
|
|
168
|
+
### Fixed
|
|
169
|
+
|
|
170
|
+
- **`query --dry-run`** no longer claims a "server-side filter" for list entries that was never
|
|
171
|
+
applied.
|
|
172
|
+
|
|
10
173
|
## [2.0.1] - 2026-10-12
|
|
11
174
|
|
|
12
175
|
### Changed (breaking)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: affinity-sdk
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.3
|
|
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/
|
|
@@ -215,15 +215,22 @@ with Affinity.from_env() as client:
|
|
|
215
215
|
### Working with Companies
|
|
216
216
|
|
|
217
217
|
```python
|
|
218
|
-
from
|
|
218
|
+
from datetime import date
|
|
219
|
+
|
|
220
|
+
from affinity import Affinity
|
|
221
|
+
from affinity.criteria import Condition, Sort, all_of
|
|
219
222
|
from affinity.models import CompanyCreate
|
|
220
|
-
from affinity.types import CompanyId
|
|
223
|
+
from affinity.types import CompanyId
|
|
221
224
|
|
|
222
225
|
with Affinity(api_key="your-key") as client:
|
|
223
|
-
#
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
226
|
+
# Filter and sort on Affinity's side (V2 search, beta)
|
|
227
|
+
page = client.companies.find(
|
|
228
|
+
all_of(
|
|
229
|
+
Condition("field-498220", "is-any-of", [3, 4]),
|
|
230
|
+
Condition("affinity-data-last-funding-date", "is-after", date(2025, 1, 1)),
|
|
231
|
+
),
|
|
232
|
+
sort=[Sort("affinity-data-total-funding-amount", "desc")],
|
|
233
|
+
limit=50,
|
|
227
234
|
)
|
|
228
235
|
|
|
229
236
|
# Iterate through all companies with automatic pagination
|
|
@@ -154,15 +154,22 @@ with Affinity.from_env() as client:
|
|
|
154
154
|
### Working with Companies
|
|
155
155
|
|
|
156
156
|
```python
|
|
157
|
-
from
|
|
157
|
+
from datetime import date
|
|
158
|
+
|
|
159
|
+
from affinity import Affinity
|
|
160
|
+
from affinity.criteria import Condition, Sort, all_of
|
|
158
161
|
from affinity.models import CompanyCreate
|
|
159
|
-
from affinity.types import CompanyId
|
|
162
|
+
from affinity.types import CompanyId
|
|
160
163
|
|
|
161
164
|
with Affinity(api_key="your-key") as client:
|
|
162
|
-
#
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
165
|
+
# Filter and sort on Affinity's side (V2 search, beta)
|
|
166
|
+
page = client.companies.find(
|
|
167
|
+
all_of(
|
|
168
|
+
Condition("field-498220", "is-any-of", [3, 4]),
|
|
169
|
+
Condition("affinity-data-last-funding-date", "is-after", date(2025, 1, 1)),
|
|
170
|
+
),
|
|
171
|
+
sort=[Sort("affinity-data-total-funding-amount", "desc")],
|
|
172
|
+
limit=50,
|
|
166
173
|
)
|
|
167
174
|
|
|
168
175
|
# Iterate through all companies with automatic pagination
|
|
@@ -47,6 +47,7 @@ from .exceptions import (
|
|
|
47
47
|
ApiVersionTooOldError,
|
|
48
48
|
AuthenticationError,
|
|
49
49
|
AuthorizationError,
|
|
50
|
+
ClientSideFilterWarning,
|
|
50
51
|
CompanyMergedError,
|
|
51
52
|
CompanyNotFoundError,
|
|
52
53
|
ConfigurationError,
|
|
@@ -108,6 +109,7 @@ __all__ = [
|
|
|
108
109
|
"AsyncAffinity",
|
|
109
110
|
# Exceptions
|
|
110
111
|
"AffinityError",
|
|
112
|
+
"ClientSideFilterWarning",
|
|
111
113
|
"AuthenticationError",
|
|
112
114
|
"AuthorizationError",
|
|
113
115
|
"NotFoundError",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Relative date parsing for query WHERE clauses.
|
|
2
2
|
|
|
3
3
|
This module provides parsing for relative date strings like "-30d", "today", etc.
|
|
4
|
-
|
|
4
|
+
Private module: not part of the public SDK API (the CLI and the SDK share it).
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
from __future__ import annotations
|
|
@@ -113,17 +113,31 @@ def parse_date_value(value: str) -> datetime | None:
|
|
|
113
113
|
pass
|
|
114
114
|
|
|
115
115
|
# Try ISO date
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
116
|
+
return parse_iso_datetime(value)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
_FRACTION = re.compile(r"(\.\d+)")
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def parse_iso_datetime(value: object) -> datetime | None:
|
|
123
|
+
"""An ISO 8601 date or date-time (``YYYY-MM-DD``, ``...THH:MM:SS[.fraction][Z|±HH:MM]``) as a
|
|
124
|
+
datetime, or ``None``. Tolerant of what Python 3.10's ``fromisoformat`` rejects: ``Z`` and
|
|
125
|
+
fractions that aren't 3 or 6 digits."""
|
|
126
|
+
if not isinstance(value, str) or not ISO_DATE_PATTERN.match(value.strip()):
|
|
127
|
+
return None
|
|
128
|
+
text = value.strip()
|
|
129
|
+
if text.endswith(("Z", "z")):
|
|
130
|
+
text = text[:-1] + "+00:00"
|
|
131
|
+
text = _FRACTION.sub(lambda m: (m.group(1) + "000000")[:7], text, count=1)
|
|
132
|
+
try:
|
|
133
|
+
return datetime.fromisoformat(text)
|
|
134
|
+
except ValueError:
|
|
135
|
+
return None
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def as_utc(value: datetime) -> datetime:
|
|
139
|
+
"""``value`` with a time zone: naive values are taken as UTC."""
|
|
140
|
+
return value if value.tzinfo is not None else value.replace(tzinfo=timezone.utc)
|
|
127
141
|
|
|
128
142
|
|
|
129
143
|
def days_since(date: datetime, *, now: datetime | None = None) -> int:
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""The ``--filter`` text language as a query WHERE clause.
|
|
2
|
+
|
|
3
|
+
``--filter 'Status = "Won" & Amount > 5'`` and the JSON ``where`` of ``query`` are one filter
|
|
4
|
+
language written two ways; this turns the first into the second, so both go through the same
|
|
5
|
+
server-side split (:mod:`.pushdown`). The text filter still runs locally exactly as before.
|
|
6
|
+
|
|
7
|
+
Private module: not part of the public SDK API (the CLI and the SDK share it).
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from ..compare import map_operator
|
|
13
|
+
from ..filters import (
|
|
14
|
+
AndExpression,
|
|
15
|
+
FieldComparison,
|
|
16
|
+
FilterExpression,
|
|
17
|
+
NotExpression,
|
|
18
|
+
OrExpression,
|
|
19
|
+
RawToken,
|
|
20
|
+
)
|
|
21
|
+
from .where import WhereClause
|
|
22
|
+
|
|
23
|
+
# Row-level keys a list entry filter sees besides its fields (they aren't list fields).
|
|
24
|
+
ROW_KEYS = frozenset(
|
|
25
|
+
{"name", "domain", "primary_email", "listEntryId", "entityId", "entityName", "entityType"}
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def where_from_filter(expr: FilterExpression, row_keys: frozenset[str] = ROW_KEYS) -> WhereClause:
|
|
30
|
+
"""The WHERE clause for a parsed ``--filter`` expression: field names become
|
|
31
|
+
``fields.<name>`` paths; ``row_keys`` (attributes such as ``entityName``) keep their own
|
|
32
|
+
path. The default keys are a list entry's."""
|
|
33
|
+
if isinstance(expr, AndExpression):
|
|
34
|
+
return WhereClause(
|
|
35
|
+
and_=[where_from_filter(expr.left, row_keys), where_from_filter(expr.right, row_keys)]
|
|
36
|
+
)
|
|
37
|
+
if isinstance(expr, OrExpression):
|
|
38
|
+
return WhereClause(
|
|
39
|
+
or_=[where_from_filter(expr.left, row_keys), where_from_filter(expr.right, row_keys)]
|
|
40
|
+
)
|
|
41
|
+
if isinstance(expr, NotExpression):
|
|
42
|
+
return WhereClause(not_=where_from_filter(expr.expr, row_keys))
|
|
43
|
+
if isinstance(expr, FieldComparison):
|
|
44
|
+
name = expr.field_name
|
|
45
|
+
path = name if name in row_keys else f"fields.{name}"
|
|
46
|
+
if isinstance(expr.value, RawToken) and expr.value.token == "*":
|
|
47
|
+
# `field = *` is "has a value"; `field != *` is "no value"
|
|
48
|
+
op = "is_not_null" if expr.operator == "=" else "is_null"
|
|
49
|
+
return WhereClause(path=path, op=op)
|
|
50
|
+
return WhereClause(path=path, op=map_operator(expr.operator), value=expr.value)
|
|
51
|
+
# Raw filter strings can't be analysed: keep them local
|
|
52
|
+
return WhereClause(path=None, op=None)
|