affinity-sdk 2.0.2__tar.gz → 2.0.4__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.2 → affinity_sdk-2.0.4}/CHANGELOG.md +233 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/PKG-INFO +42 -37
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/README.md +41 -36
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/VERSIONING.md +21 -10
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/__init__.py +2 -0
- affinity_sdk-2.0.4/affinity/_filtering/__init__.py +5 -0
- {affinity_sdk-2.0.2/affinity/cli/query → affinity_sdk-2.0.4/affinity/_filtering}/dates.py +26 -12
- {affinity_sdk-2.0.2/affinity/cli/query → affinity_sdk-2.0.4/affinity/_filtering}/filter_text.py +4 -4
- {affinity_sdk-2.0.2/affinity/cli/query → affinity_sdk-2.0.4/affinity/_filtering}/pushdown.py +11 -5
- affinity_sdk-2.0.4/affinity/_filtering/search.py +305 -0
- affinity_sdk-2.0.4/affinity/_filtering/where.py +108 -0
- affinity_sdk-2.0.4/affinity/cli/async_utils.py +44 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/company_cmds.py +6 -4
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/config_cmds.py +29 -4
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/field_cmds.py +47 -13
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/file_url_cmd.py +1 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/interaction_cmds.py +3 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/list_cmds.py +216 -45
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/note_cmds.py +3 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/opportunity_cmds.py +4 -2
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/org_cmds.py +75 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/person_cmds.py +6 -4
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/query_cmd.py +192 -121
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/reminder_cmds.py +3 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/confirm.py +32 -6
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/context.py +57 -35
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/entity_search.py +18 -13
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/field_utils.py +62 -17
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/help_json.py +3 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/interaction_utils.py +26 -13
- affinity_sdk-2.0.4/affinity/cli/list_search.py +90 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/aggregates.py +54 -15
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/cursor.py +45 -13
- affinity_sdk-2.0.4/affinity/cli/query/dates.py +21 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/executor.py +522 -403
- affinity_sdk-2.0.4/affinity/cli/query/filter_text.py +5 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/filters.py +3 -2
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/models.py +9 -93
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/output.py +285 -37
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/planner.py +35 -2
- affinity_sdk-2.0.4/affinity/cli/query/pushdown.py +12 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/render.py +1 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/client.py +37 -4
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/clients/http.py +50 -9
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/compare.py +60 -7
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/exceptions.py +9 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/entities.py +61 -6
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/org.py +9 -3
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/pagination.py +53 -47
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/types.py +13 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_field_updates.py +12 -4
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_org_reads.py +36 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/companies.py +44 -26
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/lists.py +603 -397
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/opportunities.py +47 -24
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/org.py +193 -3
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/persons.py +32 -18
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/reminders.py +14 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/tasks.py +10 -8
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/v1_only.py +6 -6
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/webhooks.py +14 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/cli-development-guide.md +3 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/cli/commands.md +242 -69
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/cli/index.md +16 -8
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/cli/scripting.md +2 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/examples.md +3 -3
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/glossary.md +6 -6
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/affinity-official-mcp-comparison.md +2 -3
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/api-versions-and-routing.md +13 -8
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/api-versions.md +18 -5
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/authentication.md +16 -7
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/claude-code-plugins.md +10 -4
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/configuration.md +5 -3
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/debugging-hooks.md +3 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/errors-and-retries.md +1 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/field-types-and-values.md +4 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/field-values.md +36 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/filtering.md +11 -6
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/pagination.md +3 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/performance.md +1 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/query-command.md +6 -3
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/sync-vs-async.md +4 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/index.md +16 -2
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/api-coverage.md +3 -1
- affinity_sdk-2.0.4/docs/public/reference/services/transcripts.md +3 -0
- affinity_sdk-2.0.4/docs/public/reference/services/v1/auth.md +5 -0
- affinity_sdk-2.0.4/docs/public/reference/services/v1/field-values.md +8 -0
- affinity_sdk-2.0.4/docs/public/reference/services/v1/fields.md +6 -0
- affinity_sdk-2.0.4/docs/public/reference/services/v1/interactions.md +7 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/plugin.json +1 -1
- affinity_sdk-2.0.4/mcp/.mcp-bash/VERSION +1 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/core.sh +60 -7
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/runtime.sh +4 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/tools.sh +16 -4
- affinity_sdk-2.0.4/mcp/.mcp-bash/vendor.json +1 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.registry/commands.generated.json +132 -49
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.registry/mcp-commands.json +11 -7
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/CHANGELOG.md +51 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/COMPATIBILITY +13 -2
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/README.md +11 -9
- affinity_sdk-2.0.4/mcp/VERSION +1 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/lib/cache.sh +26 -4
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/lib/cli-gateway.sh +7 -5
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/lib/common.sh +23 -52
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/mcp-bash.lock +2 -2
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/data-model/data-model.md +7 -7
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/server.d/env.sh +3 -2
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/server.d/requirements.json +1 -1
- affinity_sdk-2.0.4/mcp/server.d/server.meta.json +12 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/execute-read-command/tool.sh +9 -8
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/execute-write-command/tool.sh +41 -22
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/query/tool.meta.json +2 -2
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/query/tool.sh +24 -17
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/xaffinity-mcp.sh +11 -6
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mkdocs.yml +8 -8
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/affinity-sdk/.claude-plugin/plugin.json +1 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/SKILL.md +8 -5
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/.claude-plugin/plugin.json +1 -1
- affinity_sdk-2.0.4/plugins/xaffinity-cli/hooks/guard-env-read.sh +53 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/hooks/pre-xaffinity.sh +2 -2
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/hooks/session-setup.sh +7 -2
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/SKILL.md +5 -5
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/files-and-writes.md +1 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/setup.md +11 -6
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/pyproject.toml +1 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_company_create_dedup.py +9 -9
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/cassettes/company-lists-status.cassette.json +86 -86
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/cassettes/hook-blocks-without-key.cassette.json +63 -63
- affinity_sdk-2.0.4/tests/cowork/cassettes/no-key-skill-path.cassette.json +417 -0
- affinity_sdk-2.0.4/tests/cowork/cassettes/status-history.cassette.json +492 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_api_key_resolution.py +95 -15
- affinity_sdk-2.0.4/tests/test_cli_commands_must_fix.py +308 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_company_get.py +10 -10
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_context_coverage.py +6 -6
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_entity_ls_server_filter.py +84 -1
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_entry_field.py +10 -10
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_error_rendering.py +4 -4
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_field_utils.py +29 -29
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_file_url.py +30 -30
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_files_ls.py +16 -16
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_files_read.py +35 -35
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_help_json.py +8 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_interaction_utils.py +29 -13
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_list_expand_interactions.py +58 -17
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_list_export_filter_safety.py +5 -3
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_list_export_server_filter.py +16 -2
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_org.py +32 -0
- affinity_sdk-2.0.4/tests/test_cli_page_size_validation.py +45 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_executor.py +25 -218
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_expand_interactions.py +5 -3
- affinity_sdk-2.0.4/tests/test_cli_query_must_fix.py +1170 -0
- affinity_sdk-2.0.4/tests/test_cli_query_review_fixes.py +1167 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_server_filter.py +90 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_resolve_url_parsing.py +4 -4
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_session_setup_hook.py +59 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_unreplied.py +22 -3
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_write_ops.py +9 -9
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_companies_create_dedup.py +18 -18
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_compare.py +35 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_duplicates_connections.py +3 -3
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_exceptions_coverage.py +18 -18
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_files_upload_returning_files.py +18 -18
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_filters.py +10 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_get_first.py +6 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_interaction_date_validation.py +6 -4
- affinity_sdk-2.0.4/tests/test_list_entries_server_filter.py +311 -0
- affinity_sdk-2.0.4/tests/test_mcp_must_fix.py +478 -0
- affinity_sdk-2.0.4/tests/test_review_fixes_sdk_cli.py +997 -0
- affinity_sdk-2.0.4/tests/test_sdk_must_fix.py +655 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_search_v2.py +2 -2
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_lists_additional_coverage.py +6 -6
- affinity_sdk-2.0.4/tests/test_services_pages_cursor_guard.py +180 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_teams_users_feedback.py +38 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/unit/test_exceptions.py +8 -8
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/api_coverage.json +14 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/generate_mcp_command_registry.py +20 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/openapi_snapshots/2024-01-01.json +2 -2
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/openapi_snapshots/2026-07-15.json +2 -2
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/openapi_snapshots/2026-09-17.json +112 -2
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/search_golden.py +45 -5
- affinity_sdk-2.0.2/affinity/cli/list_search.py +0 -92
- affinity_sdk-2.0.2/docs/public/reference/services/v1/auth.md +0 -3
- affinity_sdk-2.0.2/docs/public/reference/services/v1/field-values.md +0 -3
- affinity_sdk-2.0.2/docs/public/reference/services/v1/fields.md +0 -3
- affinity_sdk-2.0.2/docs/public/reference/services/v1/interactions.md +0 -3
- affinity_sdk-2.0.2/mcp/.mcp-bash/VERSION +0 -1
- affinity_sdk-2.0.2/mcp/.mcp-bash/vendor.json +0 -1
- affinity_sdk-2.0.2/mcp/VERSION +0 -1
- affinity_sdk-2.0.2/mcp/server.d/server.meta.json +0 -12
- affinity_sdk-2.0.2/plugins/xaffinity-cli/hooks/guard-env-read.sh +0 -33
- affinity_sdk-2.0.2/tests/cowork/cassettes/no-key-skill-path.cassette.json +0 -395
- affinity_sdk-2.0.2/tests/cowork/cassettes/status-history.cassette.json +0 -469
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.claude-plugin/marketplace.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.cursor/rules/test-data-privacy.mdc +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.editorconfig +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.env.example +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.gitattributes +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/CODEOWNERS +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/PULL_REQUEST_TEMPLATE/cli_command.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/PULL_REQUEST_TEMPLATE/release.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/dependabot.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/labels.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/mcp-release-install-footer.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/pull_request_template.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/release-install-footer.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/ci.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/cowork-replay.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/docs.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/labels.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/linkcheck.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/openapi-validation.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/plugin-build.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/plugin-release.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/release-detect.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/release.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.github/workflows/version-check.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.gitignore +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/.pre-commit-config.yaml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/AGENTS.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/CODE_OF_CONDUCT.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/CONTRIBUTING.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/LICENSE +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/SECURITY.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/_internal/__init__.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/_internal/keyfile.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/api_versions.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/__init__.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/__main__.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/_update_worker.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/click_compat.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/__init__.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_entity_field.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_entity_files_dump.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_entity_files_read.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_entity_files_upload.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_list_entry_fields.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_org_reads.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_search_common.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/_v1_parsing.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/completion_cmd.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/discovery_cmds.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/entry_cmds.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/file_cmds.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/org_read_cmds.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/relationship_strength_cmds.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/resolve_url_cmd.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/session_cmds.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/task_cmds.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/transcript_cmds.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/version_cmd.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/webhook_cmds.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/commands/whoami_cmd.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/config.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/constants.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/csv_utils.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/date_utils.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/decorators.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/errors.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/formatters.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/logging.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/main.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/mcp_limits.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/options.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/paths.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/progress.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/__init__.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/exceptions.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/parser.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/progress.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/query/schema.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/resolve.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/resolvers.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/results.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/runner.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/serialization.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/session_cache.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/types.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/cli/update_check.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/clients/__init__.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/clients/pipeline.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/criteria.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/downloads.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/field_resolve_utils.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/field_resolver.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/filters.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/hooks.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/inbound_webhooks.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/__init__.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/discovery.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/interactions_v2.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/rate_limit_snapshot.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/relationships_v2.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/search.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/secondary.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/models/transcripts.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/policies.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/progress.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/py.typed +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/__init__.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_discovery.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_dropdown_options.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_field_listing.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_note_html.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_search.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_single_field.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/_v2_filters.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/rate_limits.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/search.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/services/transcripts.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/affinity/types.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/codecov.yml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/ai-integrations/index.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/changelog.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/cli-reference.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/getting-started.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/csv-export.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/datetime-handling.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/ids-and-types.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/migrating-to-2.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/models.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/opportunity-associations.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/rate-limits.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/guides/webhooks.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/mcp/index.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/client.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/exceptions.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/filters.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/models.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/query-language.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/companies.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/lists.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/opportunities.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/persons.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/reminders.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/tasks.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/teams-users.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/v1/files.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/v1/notes.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/v1/relationships.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/services/webhooks.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/reference/types.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/docs/public/troubleshooting.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/advanced_usage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/async_lifecycle.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/basic_usage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/filter_builder.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/hooks_debugging.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/list_management.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/resolve_helpers.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/examples/task_polling.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/.gitignore +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/skills/affinity-mcp-workflows/SKILL.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/skills/pipeline-history/SKILL.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/skills/query-language/SKILL.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/skills/query-language/references/filter-operators.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/skills/query-language/references/include-expand.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/skills/query-language/references/output-formats.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/skills/query-language/references/quantifiers.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.claude-plugin/xaffinity-mcp.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.gitignore +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/bin/mcp-bash +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/completion.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/lifecycle.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/logging.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/ping.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/prompts.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/resources.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/roots.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/handlers/tools.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/auth.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/capabilities.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/cli/common.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/cli/health.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/completion.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/elicitation.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/file_read.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/handler_helpers.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/hash.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/ids.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/io.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/json.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/lock.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/logging.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/meta_env.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/paginate.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/path.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/policy.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/progress-passthrough.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/progress.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/prompts.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/registry.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/require.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/resource_content.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/resource_match.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/resource_providers.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/resources.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/roots.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/rpc.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/spec.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/timeout.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/tools_policy.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/ui-templates.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/ui.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/uri.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/lib/validate.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/providers/echo.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/providers/file.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/providers/git.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/providers/https.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/providers/ui.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/sdk/tool-error.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/sdk/tool-sdk.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.mcp-bash/sdk/ui-sdk.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.registry/prompts.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.registry/resource-templates.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.registry/resources.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/.registry/ui-resources.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/Makefile +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/completions/entity-name.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/completions/list-name.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/completions/status-value.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/docs/DEBUGGING.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/icon.svg +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/lib/cli-detect.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/lib/entity-types.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/lib/field-resolution.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/mcp-publisher.lock +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/mcpb.conf +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/change-status/change-status.completion.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/change-status/change-status.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/change-status/change-status.txt +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/interaction-brief/interaction-brief.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/interaction-brief/interaction-brief.txt +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/log-call/log-call.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/log-call/log-call.txt +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.txt +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/log-message/log-message.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/log-message/log-message.txt +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/pipeline-review/pipeline-review.completion.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/pipeline-review/pipeline-review.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/pipeline-review/pipeline-review.txt +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/prepare-briefing/prepare-briefing.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/prepare-briefing/prepare-briefing.txt +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/warm-intro/warm-intro.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/prompts/warm-intro/warm-intro.txt +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/providers/xaffinity.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/data-model/data-model.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/field-catalogs/field-catalogs.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/field-catalogs/field-catalogs.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/interaction-enums/interaction-enums.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/interaction-enums/interaction-enums.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/me/me.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/me/me.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/me-person-id/me-person-id.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/me-person-id/me-person-id.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/query-guide/query-guide.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/query-guide/query-guide.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/saved-views/saved-views.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/saved-views/saved-views.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/workflow-config/workflow-config.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/workflow-config/workflow-config.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/workflows-guide/workflows-guide.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/workflows-guide/workflows-guide.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/xaffinity-field-catalogs.completion.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/xaffinity-saved-views.completion.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/resources/xaffinity-workflow-config.completion.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/server.d/health-checks.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/server.d/policy.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/server.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/test/README.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/test/run.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/test/test_env_update_check.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/test-progress.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/discover-commands/tool.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/discover-commands/tool.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/execute-read-command/tool.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/execute-write-command/tool.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/get-entity-dossier/tool.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/get-entity-dossier/tool.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/get-file-url/tool.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/get-file-url/tool.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/read-xaffinity-resource/tool.meta.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/tools/read-xaffinity-resource/tool.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/user-config.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/mcp/xaffinity-mcp-env.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/references/services.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/hooks/hooks.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/filtering.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/history-and-activity.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/interactions.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/query-guide.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/query/test_cursor.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_company_ls_filter_rejection.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_formatters.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_output_formats_integration.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_person_create_dedup.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_person_ls_filter_rejection.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_query_filter_rejection.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_query_list_entry_relationships.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_query_list_export_parity.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_query_output_flattening.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_query_output_truncation.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cli/test_query_unreplied.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/conftest.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/.cowork-redact.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/README.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/fixtures/workdir-key/README.txt +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/fixtures/workdir-key/xaffinity-test-key +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/fixtures/workdir-nokey/README.txt +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/image/Dockerfile +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/image/fakeaff/build_fixtures.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/image/fakeaff/fixtures.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/image/fakeaff/server.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/image/xaffinity-wrapper.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/privacy-allow.txt +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/record.sh +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/scenarios/company-lists-status.yaml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/scenarios/hook-blocks-without-key.yaml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/scenarios/no-key-skill-path.yaml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/scenarios/status-history.yaml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/sessions/no-key.yaml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/cowork/sessions/with-key.yaml +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/field_write_mocks.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/fixtures/openapi/mini_openapi.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/fixtures/webhooks/field_value_updated.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/fixtures/webhooks/list_entry_created.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/fixtures/webhooks/organization_created.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/fixtures/webhooks/organization_merged.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/fixtures/webhooks/person_created.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/fixtures/webhooks/unknown_event.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/README.md +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/conftest.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/setup_query_parity_data.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/test_cli_writes.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/test_query_parity_integration.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/test_sdk_reads.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/test_sdk_writes.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/integration/test_sdk_writes_runner.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/mcp/__init__.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/mcp/test_query_cursor.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/skill-evals/xaffinity-cli-usage-evals/evals.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/spec_guard.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_affinity_client_wrapper_additional_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_api_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_api_key_file_formats.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_api_version.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_api_version_per_operation.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_async_file_download_streaming.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_batch_get.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_api_version.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_column_limiting.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_command_context.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_company_cmds_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_config_cmds.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_csv_export.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_date_params.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_date_utils.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_datetime_formatting.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_datetime_header_offsets.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_domain_linkification.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_dotenv_resolution.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_dropdown_field_writes.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_enriched_field_writes.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_entity_field_writes.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_entity_files_dump.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_entry_field_batch_writes.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_entry_field_multi_value_limits.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_error_hints.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_field_history.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_field_history_bulk.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_field_options_and_transcripts.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_field_utils_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_field_utils_set_phase.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_field_value_humanization.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_get_interaction_dates.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_interaction_date_chunking.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_json_safety.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_list_cmds_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_list_export_entity_scope.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_list_export_field_refresh.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_list_export_truncation_meta.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_missing_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_multi_value_truncation_warnings.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_no_network_commands.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_notes_writes.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_opportunity_cmds.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_opportunity_cmds_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_pager_logic.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_person_cmds_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_person_get.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_plugin_manifest.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_pre_xaffinity_hook.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_progress_manager.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_aggregates.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_cmd.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_cmd_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_dates.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_filters.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_integration.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_parser.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_planner.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_safety.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_query_schema.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_rate_limit_rendering.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_rate_limit_throttle.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_reminders.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_render_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_resolve_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_result_summary.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_safe_field_writes.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_search.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_serialization.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_session_cache.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_set_phase_atomicity.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_types.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_update_check.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_v1_only_cmds.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_v1_parsing.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_cli_webhooks.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_client.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_companies_filter_rejection.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_env_helpers.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_field_resolver.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_field_service_caching.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_field_types_c4.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_field_value_type.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_field_values_get_value.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_file_batch_get.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_file_download_streaming.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_file_list_batch.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_file_upload_helpers_and_validation.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_files_v2.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_generate_mcp_command_registry.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_get_fields_filter_includes.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_get_fields_pagination.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_hidden_field_values.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_hooks.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_http_client_additional_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_http_client_remaining_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_inbound_webhooks.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_integration_smoke.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_interactions_and_files_regressions.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_isodatetime.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_list_entry_membership_and_opportunities.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_list_term.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_lists_v2_writes.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_bundle_env_and_completions.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_cli_version_check.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_entity_dossier.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_gateway_limits.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_history_bulk_gateway.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_limits.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_query_cli_error.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_read_truncation.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_mcp_resource_scripts.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_models.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_models_v2_2026_fields.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_multi_value_limits.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_new_features.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_notes_v2.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_notes_v2_writes.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_opportunities_filter_rejection.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_org_reads.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_pagination_iterators.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_persons_create_dedup.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_persons_filter_rejection.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_public_api.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_query_pushdown.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_rate_limit_v2.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_raw_pipeline_hook_events.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_readonly_factory.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_reminder_list_batch.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_reminders_v2.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_requirements_additional.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_sdk_interaction_dates.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_search.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_service_get_parameter_combinations.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_companies_coverage_gaps.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_dropdown_options.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_entity_field_updates.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_field_value_changes.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_list_entries_filter_paths.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_lists_coverage_gaps.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_opportunities_additional_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_opportunities_coverage_gaps.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_opportunities_tasks_additional_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_persons_companies_additional_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_rate_limits_coverage_gaps.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_v1_only_async.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_services_v1_only_coverage_gaps.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_single_field_v2.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_small_modules_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_spec_guard.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_transport_and_readonly_mode.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_v1_association_parsing.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_v1_only_services_additional_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_v1_only_services_more_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_v2_request_bodies.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_validate_openapi_tool.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/test_webhooks_v2.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tests/unit/__init__.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/__init__.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/api_coverage.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/api_coverage_v1_snapshot.json +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/check_cli_patterns.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/generate_release_notes.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/generate_requirements_mapping.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/sync_mcp_bundle_env.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/sync_mcp_registry.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/sync_mcp_version.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/validate_mcp_registry_metadata.py +0 -0
- {affinity_sdk-2.0.2 → affinity_sdk-2.0.4}/tools/validate_openapi_models.py +0 -0
|
@@ -5,7 +5,239 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
-
## [
|
|
8
|
+
## [2.0.4] - 2026-10-14
|
|
9
|
+
|
|
10
|
+
**Exception to semantic versioning** (the maintainer's call, as 2.0.2 and 2.0.3): which API key
|
|
11
|
+
the CLI uses changes when a key flag and a key environment variable are both set. The
|
|
12
|
+
`### Changed` entry says how. Some fixes below also change what a call returns or raises,
|
|
13
|
+
or a CLI exit code; each is marked **Behavior change**.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- **CLI: `--api-key-file` and `--api-key-stdin` win over the environment.** A key named on the
|
|
18
|
+
command line is used even when `AFFINITY_API_KEY`, `AFFINITY_API_KEY_FILE` or
|
|
19
|
+
`AFFINITY_API_KEY_COMMAND` is set, and the CLI warns that those are ignored (the file is not
|
|
20
|
+
read and the command is not run). Before, an environment key silently replaced the flag's key,
|
|
21
|
+
so a stale `export` could send reads and writes to another workspace. To keep using the
|
|
22
|
+
environment key, drop the flag. The SDK and the MCP server (which passes no key flag) are
|
|
23
|
+
unchanged.
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- `config check-key` reports `source: "flag"` (and a `pattern` repeating the flag) when
|
|
28
|
+
`--api-key-file` or `--api-key-stdin` is given, as commands now use that key first. It
|
|
29
|
+
doesn't read stdin; a missing or empty key file counts as not configured.
|
|
30
|
+
- The missing-API-key error no longer says `config setup-key` saves to the system keychain: it
|
|
31
|
+
writes a config file, or a `.env` file with `--scope project`.
|
|
32
|
+
- Docs: one API-key resolution order across the README, guides, CLI page, MCP README and CLI
|
|
33
|
+
skill (there is no `--api-key` CLI flag).
|
|
34
|
+
- Docs: the README coverage table, routing guide, glossary and errors guide describe 2.0's
|
|
35
|
+
routing (company and person field values, `notes.get`, transcripts, teams, semantic search
|
|
36
|
+
and connections are V2); `api-versions.md` lists every call that sends a minimum version;
|
|
37
|
+
beta endpoints need no opt-in.
|
|
38
|
+
- Docs: the CLI command page documents `files ls`/`read`/`download` on persons, companies and
|
|
39
|
+
opportunities (not the old `files dump`), `relationship-strength ls` (not `get`),
|
|
40
|
+
`opportunity field`, `list entry get`, `file-url` and `config update-check`; the CLI page says
|
|
41
|
+
which list commands return a bare `data` array.
|
|
42
|
+
- Docs: the official-MCP comparison lists this project's transcript, meeting, team, user,
|
|
43
|
+
duplicate and connection reads; `VERSIONING.md` describes 2.x and its patch-release
|
|
44
|
+
exceptions; the MCP README asks for Python 3.10+.
|
|
45
|
+
- Docs: the docs home page introduces the project and links configuration, migration, API
|
|
46
|
+
versions, the query command and webhooks; a Transcripts reference page; the reference nav no
|
|
47
|
+
longer files V2 services under "V1 endpoints"; the `Affinity`/`AsyncAffinity` docstrings and
|
|
48
|
+
the sync/async table list every service; the field-values guide starts with the V2
|
|
49
|
+
company/person/list-entry methods; the plugins page covers all three plugins.
|
|
50
|
+
- Docs and `file-url` help: examples use placeholder ids and names.
|
|
51
|
+
- **Behavior change. SDK: an empty id list returns an empty page.** `list(ids=[])` on companies,
|
|
52
|
+
persons, opportunities, webhooks, teams, users and reminders used to omit the filter and return
|
|
53
|
+
the whole collection; it now returns no rows without calling the API. `limit=0` (or less) raises
|
|
54
|
+
`ValueError` where it used to be dropped silently (companies, persons, opportunities, a
|
|
55
|
+
company's lists and list entries, saved-view entries).
|
|
56
|
+
- **Behavior change. SDK: field writes.** A `bool` value raises `TypeError` (Affinity has no
|
|
57
|
+
boolean field type; it was sent as malformed text). Datetimes are sent as whole-second UTC with
|
|
58
|
+
`Z`, like every other write; a naive datetime is taken as UTC.
|
|
59
|
+
- **Behavior change. SDK: delete results.** A delete whose response has no `success` key (an empty
|
|
60
|
+
body) returns `True`; only an explicit `"success": false` returns `False`.
|
|
61
|
+
- SDK: `get_all_pages` raises `AffinityError` when it stops at `max_pages` with pages left,
|
|
62
|
+
instead of returning (and caching) a cut-off result.
|
|
63
|
+
- SDK: company and person merges raise `AffinityError` when the response has no `taskUrl`,
|
|
64
|
+
instead of returning an empty URL.
|
|
65
|
+
- SDK: the sync client rejects an `async` hook with `ConfigurationError` at construction; under
|
|
66
|
+
`hook_error_policy="swallow"` it was logged and never ran.
|
|
67
|
+
- SDK: followed pagination URLs must match the exact host and port of the V1 or V2 base URL.
|
|
68
|
+
- SDK: the response cache key includes the per-call API version sent.
|
|
69
|
+
- SDK: `tasks.wait` no longer sleeps past its `timeout`.
|
|
70
|
+
- SDK: `lists.resolve` no longer remembers a name it didn't find, so a list created later is found.
|
|
71
|
+
- SDK: `lists.get_size` is shared by every list service on a client and dropped when an entry is
|
|
72
|
+
added or removed, an opportunity is created or deleted, or a person or company is deleted.
|
|
73
|
+
- SDK: paging stops when a cursor repeats, when a page says more follow but gives no cursor, or
|
|
74
|
+
after 1,000 empty pages in a row (with a `RuntimeWarning`), instead of looping. This covers the
|
|
75
|
+
page iterators (`iter()`, `all()`) and the `pages()` generators of companies, persons,
|
|
76
|
+
opportunities, lists, saved views and list entries (filtered reads included), sync and async.
|
|
77
|
+
- SDK: association paging tolerates `"pagination": null`.
|
|
78
|
+
- SDK filters: `in`, `has_any` and `has_all` compare values the way `=` does, so `score in [5, 6]`
|
|
79
|
+
matches the number 5.
|
|
80
|
+
- SDK models: `FieldId(True)`, `FieldValueType(True)` and fractional floats for open enums raise
|
|
81
|
+
`ValueError`; a fractional float no longer replaces a known enum member for the rest of the
|
|
82
|
+
process. `FieldValues.get` accepts bare-digit ids (`123`, `"123"`). Person and opportunity
|
|
83
|
+
company ids also read `companyIds` and `current_organization_ids`; `Location` reads
|
|
84
|
+
`streetAddress`; V2 list entries pick the entity model from `type`.
|
|
85
|
+
- **CLI `query`: resuming a cut-off result no longer skips rows.** The resume cursor jumped to
|
|
86
|
+
the next API page, losing the rest of the current page and every fetched row that didn't fit in
|
|
87
|
+
`--max-output-bytes`. A cut-off result, with its included records, is now cached and the
|
|
88
|
+
cursor resumes from it without API calls; each page's `included` holds only the records related
|
|
89
|
+
to that page's rows, also when `select` leaves out `id` (TOON pages hold as many rows as fit,
|
|
90
|
+
with matching counts; related records that can't be matched to rows are cut to the budget and
|
|
91
|
+
counted in `includedOmitted`). A cursor needs the same `--max-records` as the first run; a cursor from an
|
|
92
|
+
earlier version is refused as not matching the query (cursors expire after an hour).
|
|
93
|
+
- **Behavior change. CLI `query`: errors are no longer read as "no data".** A rate-limit, server or
|
|
94
|
+
auth error while fetching related records (for `include`, relationship filters, or an id
|
|
95
|
+
lookup, or `include: interactions`), an expansion (`interactionDates`, `unreplied`, person
|
|
96
|
+
names) or a list's field definitions (when the query uses a list field) fails the query. Before,
|
|
97
|
+
the record silently had no related records, an id-only stub or an empty expansion, so `none`,
|
|
98
|
+
`all` and `_count eq 0` filters could match wrongly. Only a deleted or merged record counts as
|
|
99
|
+
empty.
|
|
100
|
+
- **Behavior change. CLI `query`: `--max-records`.** When results are cut at it, a warning says
|
|
101
|
+
so and `meta.truncated` is set, on every path (before, the cut was silent); with `orderBy` or
|
|
102
|
+
an aggregate the cut comes after sorting and aggregating (also when the query has no `where`), so counts, sums, groups and top-N use
|
|
103
|
+
every match. Before, they were computed on the first 10,000.
|
|
104
|
+
- **Behavior change. CLI `query`: Ctrl+C exits 130** (exit 0 before). Rows that already went
|
|
105
|
+
through the query's filter, sort and aggregate are printed; when one of those hadn't run yet, no
|
|
106
|
+
rows are printed (before, unfiltered rows were) and the error type is `interrupted`. On Python
|
|
107
|
+
3.10, Ctrl+C prints no rows (it still exits 130); Python 3.11+ prints them.
|
|
108
|
+
- **Behavior change. CLI `query`:** a `listName` that matches more than one list, or none, is a
|
|
109
|
+
validation error (exit 2) asking for the list id; before, the last list with that name was
|
|
110
|
+
used. An include's `list:` name that matches several lists fails (exit 2,
|
|
111
|
+
`ambiguous_resolution`) and one that matches none is not found (exit 4); before, the scope was
|
|
112
|
+
dropped. `min`/`max` over objects,
|
|
113
|
+
lists, or a mix of numbers and text is a validation error instead of a crash or a silent pick.
|
|
114
|
+
- CLI `query`: with `orderBy` or `limit`, `include` (and an `expand` the sort doesn't read) runs
|
|
115
|
+
on the rows kept after sorting, limiting and `--max-records`, not on every match, so a top-N
|
|
116
|
+
query makes one call per kept row.
|
|
117
|
+
- CLI `query`: an Affinity error exits with the CLI's documented code (3 auth, 4 not found, 5
|
|
118
|
+
rate limit or server error) and its usual error envelope, instead of exit 1 with "Query
|
|
119
|
+
execution failed".
|
|
120
|
+
- CLI `query`: CSV output with `--max-output-bytes` cuts on whole records (a note with a line
|
|
121
|
+
break could be split), has every row's columns, honors `--csv-bom` and can be resumed; JSONL
|
|
122
|
+
resume no longer skips rows whose data contains `"truncated"`. A row larger than
|
|
123
|
+
`--max-output-bytes` is printed whole (JSON too, which exited 1 partway through paging) instead
|
|
124
|
+
of giving an empty page whose cursor repeats.
|
|
125
|
+
- CLI `query`: `include` options are applied: `list`, `where`, `limit` and `days` on a
|
|
126
|
+
`listEntries` include, and `limit` and `days` on an `interactions` include. Before, they were
|
|
127
|
+
ignored, so related opportunities came from every list and interactions used the default 90-day
|
|
128
|
+
window and 100-record limit.
|
|
129
|
+
- CLI `query`: a relationship filter on `interactions` (`interactions._count`,
|
|
130
|
+
`exists`/`all`/`none`) no longer hangs when the query has at least as many records as the
|
|
131
|
+
concurrency limit (10).
|
|
132
|
+
- CLI `query`: when fetching related records for a `listEntries` include fails, the other fetches
|
|
133
|
+
are stopped instead of continuing to call the API and printing "Task exception was never
|
|
134
|
+
retrieved".
|
|
135
|
+
- CLI `query --output toon`: a cut-off page, its `cursor:` line included, stays within
|
|
136
|
+
`--max-output-bytes` (if the cursor alone, about 500 bytes, doesn't fit, one row is shown).
|
|
137
|
+
- **Behavior change. CLI `query --output csv`:** without `--max-output-bytes`, execution warnings
|
|
138
|
+
(the `--max-records` cut, multi-value fields cut off) go to stderr as with the other formats,
|
|
139
|
+
and the CSV has the same shape as with a budget: columns in `select` order (first-seen order
|
|
140
|
+
without `select`; they were sorted alphabetically), selected `fields.*` and expanded
|
|
141
|
+
`interactionDates` flattened into columns, and every record ending with CRLF.
|
|
142
|
+
- CLI `query`: `groupBy` on object values (such as a location) works; formula fields filter and
|
|
143
|
+
sort as numbers.
|
|
144
|
+
- **Behavior change. CLI: a delete Affinity reports as failed exits 1** (`api_error`) instead of
|
|
145
|
+
printing `"success": false` with exit 0.
|
|
146
|
+
- **Behavior change. CLI `field history-bulk`:** when every entry fails it exits with the usual
|
|
147
|
+
code for that error (3 auth, 4 not found, 5 rate limit or server; 1 for mixed errors), and 3 on
|
|
148
|
+
any auth error (all exited 0). Partial failures still exit 0 with warnings and now set
|
|
149
|
+
`meta.truncated` with `truncationReason: "partialFailure"`.
|
|
150
|
+
- **Behavior change. CLI `list export` expansions:** a failed interaction, opportunity or
|
|
151
|
+
unreplied-message lookup fails the export under the default `--expand-on-error raise` (it was
|
|
152
|
+
left empty silently), and warns under `skip`, keeping the entry's other expansions. An auth
|
|
153
|
+
error during any expansion fails the export; a deleted opportunity is left out. With `--csv`
|
|
154
|
+
these warnings, and the export's other warnings (such as "Filtering locally"), are printed to
|
|
155
|
+
stderr; they were dropped.
|
|
156
|
+
- **Behavior change. CLI `--page-size` below 1** is a usage error (exit 2) on `company`,
|
|
157
|
+
`person`, `opportunity`, `list`, `note`, `interaction` and `reminder ls`, `list export` and
|
|
158
|
+
`files download`. With the SDK's new `limit` check it was an `internal_error` (exit 1) on most
|
|
159
|
+
of them, and `note ls` and `interaction ls` accepted it. `--help --json` (and the MCP command
|
|
160
|
+
registry) reports such range-checked options, including `search --max-results` and
|
|
161
|
+
`files ls --max-results`, as `int`; they were `string`.
|
|
162
|
+
- **Behavior change. CLI field writes:** `true`/`false` anywhere in a `--set-json` value (including
|
|
163
|
+
list items and object values) is refused before any write (exit 2, `validation_error`);
|
|
164
|
+
Affinity has no boolean field type. A text field no longer stores `true` as `"true"`.
|
|
165
|
+
- CLI `list entry field --unset-value` exits 1 when Affinity reports the delete failed, instead of
|
|
166
|
+
reporting the value as deleted. When an `--unset-value` or `--append` step fails after something
|
|
167
|
+
was already changed, the error is `partial_write` naming every field written and value removed;
|
|
168
|
+
a step that timed out or lost the connection is named as "may or may not have been applied"
|
|
169
|
+
(`details.uncertain`), and alone it is a `network_error` that says re-running is safe; `field delete` clears its caches only after a confirmed delete.
|
|
170
|
+
- CLI: answering "n" to a confirmation under `--json` prints an error envelope (type `aborted`),
|
|
171
|
+
still exit 1, instead of an empty stdout.
|
|
172
|
+
- CLI `list ls --type`: warns when the first page has no list of that type but more pages exist.
|
|
173
|
+
|
|
174
|
+
### Plugins
|
|
175
|
+
|
|
176
|
+
- **CLI plugin**: 2.0.2 → 2.0.3 — skill: the API-key resolution order (key flags first) and
|
|
177
|
+
where `config setup-key` stores the key. Installs pin the CLI version the plugin was written
|
|
178
|
+
for (`XAFFINITY_CLI_SPEC` overrides it); the Read hook also guards the CLI's `config.toml`;
|
|
179
|
+
the skill names the `partialFailure` truncation reason; the file download example uses `--out`
|
|
180
|
+
(there is no `--output-dir`).
|
|
181
|
+
- **SDK plugin**: 2.0.3 → 2.0.4 — skill: the duplicate-company example uses a placeholder name.
|
|
182
|
+
|
|
183
|
+
## [2.0.3] - 2026-10-13
|
|
184
|
+
|
|
185
|
+
**Exception to semantic versioning** (the maintainer's call, as 2.0.2): some results change
|
|
186
|
+
(`list(filter=...)` pages, the local sort's order, date comparisons in filters). The
|
|
187
|
+
`### Changed` entries say how.
|
|
188
|
+
|
|
189
|
+
### Changed
|
|
190
|
+
|
|
191
|
+
- **SDK list-entry filters go through Affinity's search:**
|
|
192
|
+
`lists.entries(id).list/pages/all/iter/get_first(filter=...)` send the part of the filter
|
|
193
|
+
Affinity's search can answer and check the whole filter locally, as `list export --filter`
|
|
194
|
+
does. Only when no part can go there (or the search is refused) is every entry read; that
|
|
195
|
+
case emits the new `ClientSideFilterWarning` (a `UserWarning`).
|
|
196
|
+
- **`list(filter=...)` returns the matches of one page read**, possibly fewer than `limit` (or
|
|
197
|
+
none), with a `next_cursor` that carries the filter: follow it, or use `iter()` for every
|
|
198
|
+
match. Before, it filtered only the first page and had no way to continue.
|
|
199
|
+
- **Filtered-read cursors are `xsearch2:`** (the filter travels as data, so multi-word field
|
|
200
|
+
names and dates round-trip) in the SDK, `list export`, and `company ls` / `person ls`;
|
|
201
|
+
2.0.2's `xsearch1:` cursors still work.
|
|
202
|
+
- **Field values can be named by id in text filters** (`F.field("field-123")`,
|
|
203
|
+
`--filter 'field-123 = …'`), as `query` allows `fields.<id>`.
|
|
204
|
+
- **`query`'s local sort follows Affinity's order** (when Affinity can't sort, e.g. an
|
|
205
|
+
unsortable field or a refused search): ranked dropdowns sort by rank (not by text),
|
|
206
|
+
multi-value fields by their first item, and text case-insensitively ("apple" before
|
|
207
|
+
"Zeta"); empty values stay last in both directions. Fields named only in `orderBy` are now
|
|
208
|
+
fetched (a local sort used to see them empty). Grouped rows (`groupBy`) sort by their keys
|
|
209
|
+
as before.
|
|
210
|
+
- **Quantifier queries (`all`/`none`/`exists`) on companies and persons no longer always need
|
|
211
|
+
`--max-records`**: their `where` must test a field, which Affinity's search applies first;
|
|
212
|
+
when it matches at most 100 records the query runs, otherwise it stops and names the count.
|
|
213
|
+
`--dry-run` gives a number of API calls instead of "UNBOUNDED" (with `--max-records` too),
|
|
214
|
+
which also fixes the MCP query tool's timeout for these queries (it fell back to 120 s).
|
|
215
|
+
Validation errors found while the query runs exit 2 with `validation_error`, like those
|
|
216
|
+
found while planning.
|
|
217
|
+
|
|
218
|
+
### Added
|
|
219
|
+
|
|
220
|
+
- **`server_filter=False`** on the list-entry `list/pages/all/iter/get_first` reads every entry
|
|
221
|
+
and filters locally (to compare or debug), and **`affinity.ClientSideFilterWarning`**.
|
|
222
|
+
- **More filters go to Affinity's search** (verified live): `starts_word` on single-company
|
|
223
|
+
fields, and `is_not_null` / `is_null` on location fields.
|
|
224
|
+
|
|
225
|
+
- **A team's members and accessible lists, every page** (V2, beta; API 2026-09-17+):
|
|
226
|
+
`teams.list|iter_members(team_id)` and `teams.list|iter_accessible_lists(team_id)`; CLI
|
|
227
|
+
`team members <id>` and `team lists <id>` (`team get` shows only the first 10).
|
|
228
|
+
|
|
229
|
+
### Fixed
|
|
230
|
+
|
|
231
|
+
- **Dates compare as dates in `>`, `>=`, `<`, `<=` and between**, everywhere filters run
|
|
232
|
+
(`query`, `--filter`, `--expand-filter`, `company ls` / `person ls --filter`, and the SDK's
|
|
233
|
+
`affinity.filters`): relative dates (`-30d`, `today`) and ISO dates are compared with the
|
|
234
|
+
field's timestamp in UTC. Before, the text filter compared them as text, so
|
|
235
|
+
`Close > "-30d"` matched every dated entry. Equality stays textual (`= "today"` matches the
|
|
236
|
+
word). Timestamps with `Z` or long fractions parse on Python 3.10 too.
|
|
237
|
+
- **`list export --field X --filter "Y = …"`** returned no rows: the filter's fields are now
|
|
238
|
+
fetched even when `--field` leaves them out of the output.
|
|
239
|
+
- **`Team` reads `updatedAt`** (`updated_at`), and accepts the `membersPreview` /
|
|
240
|
+
`accessibleListsPreview` blocks under their own names too.
|
|
9
241
|
|
|
10
242
|
## [2.0.2] - 2026-10-13
|
|
11
243
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: affinity-sdk
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.4
|
|
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/
|
|
@@ -106,7 +106,7 @@ For a detailed comparison, see [Affinity SDK vs. Official MCP](https://yaniv-gol
|
|
|
106
106
|
|
|
107
107
|
## Features
|
|
108
108
|
|
|
109
|
-
- **
|
|
109
|
+
- **Broad API coverage** - V1 and V2, routed per operation (6 V2 operations still planned)
|
|
110
110
|
- **CLI included** - Scriptable command-line interface for automation
|
|
111
111
|
- **Strong typing** - Full Pydantic V2 models with typed ID classes
|
|
112
112
|
- **No magic numbers** - Comprehensive enums for all API constants
|
|
@@ -539,45 +539,50 @@ from affinity.types import (
|
|
|
539
539
|
|
|
540
540
|
## API Coverage
|
|
541
541
|
|
|
542
|
-
Which Affinity API
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
| Feature |
|
|
547
|
-
|
|
548
|
-
| Companies (read) |
|
|
549
|
-
| Companies (
|
|
550
|
-
|
|
|
551
|
-
|
|
|
552
|
-
|
|
|
553
|
-
|
|
|
554
|
-
|
|
|
555
|
-
|
|
|
556
|
-
|
|
|
557
|
-
|
|
|
558
|
-
|
|
|
559
|
-
|
|
|
560
|
-
|
|
|
561
|
-
|
|
|
562
|
-
|
|
|
563
|
-
|
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
V2-only features the SDK does not wrap yet include semantic search, transcripts, duplicate
|
|
569
|
-
suggestions, coworker/investor connections and teams.
|
|
542
|
+
Which Affinity API the SDK uses for each feature. The SDK uses V2 wherever V2 can do the job and
|
|
543
|
+
V1 where it can't. The [API coverage](https://yaniv-golan.github.io/affinity-sdk/latest/reference/api-coverage/)
|
|
544
|
+
page lists every operation and the SDK call that sends it.
|
|
545
|
+
|
|
546
|
+
| Feature | SDK uses |
|
|
547
|
+
|---------|:---:|
|
|
548
|
+
| Companies, persons, opportunities (read, search) | V2 |
|
|
549
|
+
| Companies, persons (create, update, delete) | V1 (V2 has no create/update; person create/delete are planned) |
|
|
550
|
+
| Opportunities (create, update, delete) | V1 (V2 update/delete are planned) |
|
|
551
|
+
| Company/person merges | V2 |
|
|
552
|
+
| Lists, list entries (read) | V2 |
|
|
553
|
+
| Lists (create) | V2 (V1 when `owner_id` or `additional_permissions` is set) |
|
|
554
|
+
| List entries (add, delete) | V1 (V2 add is planned) |
|
|
555
|
+
| Field values (read and write, on companies, persons and list entries) | V2 |
|
|
556
|
+
| Fields (create, delete); the `field_values` service | V1 |
|
|
557
|
+
| Notes | V2, except `notes.list()` for one entity (V1) |
|
|
558
|
+
| Reminders | V2 (V1 for type changes, and when V2 refuses a non-owner) |
|
|
559
|
+
| Webhooks | V2 |
|
|
560
|
+
| Interactions | V2 reads by type (emails, meetings, calls, chat messages); V1 `list`/`get` and writes |
|
|
561
|
+
| Entity files | V1 list, get and upload; V2 feed and download URL |
|
|
562
|
+
| Relationship strengths | V1 `relationships.get`; V2 `list_relationships` on companies/persons |
|
|
563
|
+
| Transcripts, teams, users, semantic search, duplicate suggestions, coworker/investor connections | V2 |
|
|
564
|
+
|
|
565
|
+
Still planned (Affinity documents them, but the API didn't serve them when tested): V2 person
|
|
566
|
+
create/delete, opportunity update/delete, list-entry create, and transcript delete.
|
|
570
567
|
|
|
571
568
|
## Authentication
|
|
572
569
|
|
|
573
|
-
The SDK
|
|
570
|
+
The SDK and CLI resolve the API key through the following chain (first non-empty value wins):
|
|
574
571
|
|
|
575
|
-
1. **
|
|
572
|
+
1. **The key you pass explicitly** — `Affinity(api_key="…")` in the SDK; `--api-key-file <path>`
|
|
573
|
+
or `--api-key-stdin` in the CLI (the CLI has no `--api-key` flag)
|
|
576
574
|
2. **`AFFINITY_API_KEY`** — standard environment variable
|
|
577
575
|
3. **`AFFINITY_API_KEY_FILE`** — path to a file containing the key (12-factor / Docker secrets convention)
|
|
578
576
|
4. **`AFFINITY_API_KEY_COMMAND`** — shell command whose stdout is the key (credential-helper convention)
|
|
579
|
-
5.
|
|
580
|
-
|
|
577
|
+
5. **User config file** — `api_key` in `config.toml`, written by `xaffinity config setup-key --scope user`
|
|
578
|
+
(file mode `0600` on Unix; `xaffinity config path` prints the location). CLI only.
|
|
579
|
+
|
|
580
|
+
The SDK uses steps 1–4; step 5 is CLI only. When the CLI uses a key flag while
|
|
581
|
+
`AFFINITY_API_KEY`, `AFFINITY_API_KEY_FILE` or `AFFINITY_API_KEY_COMMAND` is also set, it warns
|
|
582
|
+
that those are ignored (the file is not read and the command is not run). With `load_dotenv=True` (SDK) or `--dotenv` (CLI),
|
|
583
|
+
a `.env` file is loaded into the environment before step 2, so its `AFFINITY_API_KEY` counts as
|
|
584
|
+
step 2. That is how a key saved by `xaffinity config setup-key --scope project` (a `.env` in the
|
|
585
|
+
current directory) is used: run commands with `--dotenv`.
|
|
581
586
|
|
|
582
587
|
Empty string is treated as unset at every step (safe against stale `export AFFINITY_API_KEY=` lines).
|
|
583
588
|
|
|
@@ -651,7 +656,7 @@ client = Affinity(
|
|
|
651
656
|
# Affinity V2 API version (default: your API key's default version)
|
|
652
657
|
# affinity_api_version="2026-09-17", # or "current"; CLI: --api-version / AFFINITY_API_VERSION
|
|
653
658
|
|
|
654
|
-
# Hooks
|
|
659
|
+
# Hooks
|
|
655
660
|
# on_event=lambda event: print(event.type),
|
|
656
661
|
# on_request=lambda req: print(req.method, req.url),
|
|
657
662
|
# on_response=lambda resp: print(resp.status_code, resp.request.url),
|
|
@@ -712,7 +717,7 @@ asyncio.run(main())
|
|
|
712
717
|
|
|
713
718
|
Async support mirrors the sync client surface area (including the V1 services like notes and files).
|
|
714
719
|
|
|
715
|
-
See
|
|
720
|
+
See [Sync vs async](https://yaniv-golan.github.io/affinity-sdk/latest/guides/sync-vs-async/) for more details.
|
|
716
721
|
|
|
717
722
|
If you don't use `async with`, make sure to `await client.close()` (e.g., in a `finally`) to avoid leaking connections.
|
|
718
723
|
|
|
@@ -742,7 +747,7 @@ MIT License - see [LICENSE](LICENSE) for details.
|
|
|
742
747
|
|
|
743
748
|
## Contributing
|
|
744
749
|
|
|
745
|
-
Contributions welcome! Please read
|
|
750
|
+
Contributions welcome! Please read the [contributing guidelines](https://github.com/yaniv-golan/affinity-sdk/blob/main/CONTRIBUTING.md) first.
|
|
746
751
|
|
|
747
752
|
## Links
|
|
748
753
|
|
|
@@ -45,7 +45,7 @@ For a detailed comparison, see [Affinity SDK vs. Official MCP](https://yaniv-gol
|
|
|
45
45
|
|
|
46
46
|
## Features
|
|
47
47
|
|
|
48
|
-
- **
|
|
48
|
+
- **Broad API coverage** - V1 and V2, routed per operation (6 V2 operations still planned)
|
|
49
49
|
- **CLI included** - Scriptable command-line interface for automation
|
|
50
50
|
- **Strong typing** - Full Pydantic V2 models with typed ID classes
|
|
51
51
|
- **No magic numbers** - Comprehensive enums for all API constants
|
|
@@ -478,45 +478,50 @@ from affinity.types import (
|
|
|
478
478
|
|
|
479
479
|
## API Coverage
|
|
480
480
|
|
|
481
|
-
Which Affinity API
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
| Feature |
|
|
486
|
-
|
|
487
|
-
| Companies (read) |
|
|
488
|
-
| Companies (
|
|
489
|
-
|
|
|
490
|
-
|
|
|
491
|
-
|
|
|
492
|
-
|
|
|
493
|
-
|
|
|
494
|
-
|
|
|
495
|
-
|
|
|
496
|
-
|
|
|
497
|
-
|
|
|
498
|
-
|
|
|
499
|
-
|
|
|
500
|
-
|
|
|
501
|
-
|
|
|
502
|
-
|
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
V2-only features the SDK does not wrap yet include semantic search, transcripts, duplicate
|
|
508
|
-
suggestions, coworker/investor connections and teams.
|
|
481
|
+
Which Affinity API the SDK uses for each feature. The SDK uses V2 wherever V2 can do the job and
|
|
482
|
+
V1 where it can't. The [API coverage](https://yaniv-golan.github.io/affinity-sdk/latest/reference/api-coverage/)
|
|
483
|
+
page lists every operation and the SDK call that sends it.
|
|
484
|
+
|
|
485
|
+
| Feature | SDK uses |
|
|
486
|
+
|---------|:---:|
|
|
487
|
+
| Companies, persons, opportunities (read, search) | V2 |
|
|
488
|
+
| Companies, persons (create, update, delete) | V1 (V2 has no create/update; person create/delete are planned) |
|
|
489
|
+
| Opportunities (create, update, delete) | V1 (V2 update/delete are planned) |
|
|
490
|
+
| Company/person merges | V2 |
|
|
491
|
+
| Lists, list entries (read) | V2 |
|
|
492
|
+
| Lists (create) | V2 (V1 when `owner_id` or `additional_permissions` is set) |
|
|
493
|
+
| List entries (add, delete) | V1 (V2 add is planned) |
|
|
494
|
+
| Field values (read and write, on companies, persons and list entries) | V2 |
|
|
495
|
+
| Fields (create, delete); the `field_values` service | V1 |
|
|
496
|
+
| Notes | V2, except `notes.list()` for one entity (V1) |
|
|
497
|
+
| Reminders | V2 (V1 for type changes, and when V2 refuses a non-owner) |
|
|
498
|
+
| Webhooks | V2 |
|
|
499
|
+
| Interactions | V2 reads by type (emails, meetings, calls, chat messages); V1 `list`/`get` and writes |
|
|
500
|
+
| Entity files | V1 list, get and upload; V2 feed and download URL |
|
|
501
|
+
| Relationship strengths | V1 `relationships.get`; V2 `list_relationships` on companies/persons |
|
|
502
|
+
| Transcripts, teams, users, semantic search, duplicate suggestions, coworker/investor connections | V2 |
|
|
503
|
+
|
|
504
|
+
Still planned (Affinity documents them, but the API didn't serve them when tested): V2 person
|
|
505
|
+
create/delete, opportunity update/delete, list-entry create, and transcript delete.
|
|
509
506
|
|
|
510
507
|
## Authentication
|
|
511
508
|
|
|
512
|
-
The SDK
|
|
509
|
+
The SDK and CLI resolve the API key through the following chain (first non-empty value wins):
|
|
513
510
|
|
|
514
|
-
1. **
|
|
511
|
+
1. **The key you pass explicitly** — `Affinity(api_key="…")` in the SDK; `--api-key-file <path>`
|
|
512
|
+
or `--api-key-stdin` in the CLI (the CLI has no `--api-key` flag)
|
|
515
513
|
2. **`AFFINITY_API_KEY`** — standard environment variable
|
|
516
514
|
3. **`AFFINITY_API_KEY_FILE`** — path to a file containing the key (12-factor / Docker secrets convention)
|
|
517
515
|
4. **`AFFINITY_API_KEY_COMMAND`** — shell command whose stdout is the key (credential-helper convention)
|
|
518
|
-
5.
|
|
519
|
-
|
|
516
|
+
5. **User config file** — `api_key` in `config.toml`, written by `xaffinity config setup-key --scope user`
|
|
517
|
+
(file mode `0600` on Unix; `xaffinity config path` prints the location). CLI only.
|
|
518
|
+
|
|
519
|
+
The SDK uses steps 1–4; step 5 is CLI only. When the CLI uses a key flag while
|
|
520
|
+
`AFFINITY_API_KEY`, `AFFINITY_API_KEY_FILE` or `AFFINITY_API_KEY_COMMAND` is also set, it warns
|
|
521
|
+
that those are ignored (the file is not read and the command is not run). With `load_dotenv=True` (SDK) or `--dotenv` (CLI),
|
|
522
|
+
a `.env` file is loaded into the environment before step 2, so its `AFFINITY_API_KEY` counts as
|
|
523
|
+
step 2. That is how a key saved by `xaffinity config setup-key --scope project` (a `.env` in the
|
|
524
|
+
current directory) is used: run commands with `--dotenv`.
|
|
520
525
|
|
|
521
526
|
Empty string is treated as unset at every step (safe against stale `export AFFINITY_API_KEY=` lines).
|
|
522
527
|
|
|
@@ -590,7 +595,7 @@ client = Affinity(
|
|
|
590
595
|
# Affinity V2 API version (default: your API key's default version)
|
|
591
596
|
# affinity_api_version="2026-09-17", # or "current"; CLI: --api-version / AFFINITY_API_VERSION
|
|
592
597
|
|
|
593
|
-
# Hooks
|
|
598
|
+
# Hooks
|
|
594
599
|
# on_event=lambda event: print(event.type),
|
|
595
600
|
# on_request=lambda req: print(req.method, req.url),
|
|
596
601
|
# on_response=lambda resp: print(resp.status_code, resp.request.url),
|
|
@@ -651,7 +656,7 @@ asyncio.run(main())
|
|
|
651
656
|
|
|
652
657
|
Async support mirrors the sync client surface area (including the V1 services like notes and files).
|
|
653
658
|
|
|
654
|
-
See
|
|
659
|
+
See [Sync vs async](https://yaniv-golan.github.io/affinity-sdk/latest/guides/sync-vs-async/) for more details.
|
|
655
660
|
|
|
656
661
|
If you don't use `async with`, make sure to `await client.close()` (e.g., in a `finally`) to avoid leaking connections.
|
|
657
662
|
|
|
@@ -681,7 +686,7 @@ MIT License - see [LICENSE](LICENSE) for details.
|
|
|
681
686
|
|
|
682
687
|
## Contributing
|
|
683
688
|
|
|
684
|
-
Contributions welcome! Please read
|
|
689
|
+
Contributions welcome! Please read the [contributing guidelines](https://github.com/yaniv-golan/affinity-sdk/blob/main/CONTRIBUTING.md) first.
|
|
685
690
|
|
|
686
691
|
## Links
|
|
687
692
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Versioning Policy
|
|
2
2
|
|
|
3
|
-
This document defines how versions are managed across the affinity-
|
|
3
|
+
This document defines how versions are managed across the affinity-sdk repository.
|
|
4
4
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
@@ -81,15 +81,16 @@ have valid JSON but does not enforce version sync.
|
|
|
81
81
|
- Plugin cache invalidation is based on git commit hash, not version number,
|
|
82
82
|
so version bumps are for human traceability, not distribution mechanics
|
|
83
83
|
|
|
84
|
-
##
|
|
84
|
+
## Current State (2.x)
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
The SDK and CLI are at 2.x. The rules above are the default: a breaking change to the public
|
|
87
|
+
SDK or CLI means a MAJOR bump.
|
|
88
88
|
|
|
89
|
-
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
- **Exceptions in 2.x:** the maintainer may ship a breaking change in a 2.0.x PATCH instead of a
|
|
90
|
+
new MAJOR (2.0.1, 2.0.2 and 2.0.3 did). This is the maintainer's decision for each release,
|
|
91
|
+
never a default. The CHANGELOG entry must open with **Exception to semantic versioning**,
|
|
92
|
+
say why, and list exactly what changes and how to migrate.
|
|
93
|
+
- MCP and the plugins whose content changed are bumped to the same version in that release.
|
|
93
94
|
- MCP must track CLI minor version for compatibility
|
|
94
95
|
|
|
95
96
|
## CLI Changes That Affect MCP
|
|
@@ -117,7 +118,7 @@ The release detection workflow compares the current version in version files aga
|
|
|
117
118
|
1. **After CI passes** on `main`, the release detection workflow runs
|
|
118
119
|
2. It reads the SDK version from `pyproject.toml` and MCP version from `mcp/VERSION`
|
|
119
120
|
3. It checks if release tags exist:
|
|
120
|
-
- SDK: checks for `v{version}` tag (e.g., `
|
|
121
|
+
- SDK: checks for `v{version}` tag (e.g., `v2.0.3`)
|
|
121
122
|
- MCP: checks for `mcp-v{version}` tag (e.g., `mcp-v1.7.6`)
|
|
122
123
|
4. If no tag exists for the current version, it triggers the release workflow via `workflow_dispatch` API
|
|
123
124
|
|
|
@@ -140,6 +141,16 @@ This approach is robust regardless of how many commits are pushed together, squa
|
|
|
140
141
|
|
|
141
142
|
SDK releases include MCPB bundles (built from the same commit) for convenience, so users don't need to find separate MCP releases.
|
|
142
143
|
|
|
144
|
+
**CLI pin in the CLI plugin.** The xaffinity-cli plugin installs an exact CLI version
|
|
145
|
+
(`affinity-sdk[cli]==X.Y.Z` in `hooks/session-setup.sh`, `hooks/pre-xaffinity.sh` and the skill's
|
|
146
|
+
install lines). It always equals `pyproject.toml`'s version, and
|
|
147
|
+
`tests/test_cli_session_setup_hook.py` fails until it does. So the version bump in step 1 also
|
|
148
|
+
updates the pin. That is a plugin content change, so it bumps the CLI plugin's patch version.
|
|
149
|
+
Plugin users get the new pin as soon as `main` is pushed, while PyPI gets the version only when
|
|
150
|
+
the release workflow finishes. In between, a fresh install asks pip for a version that doesn't
|
|
151
|
+
exist yet and fails. Machines with the CLI already installed are not affected. Don't push
|
|
152
|
+
anything else on top of a version bump until the release workflow is green.
|
|
153
|
+
|
|
143
154
|
### MCP Release
|
|
144
155
|
|
|
145
156
|
1. Update `mcp/VERSION`
|
|
@@ -260,7 +271,7 @@ the release notes lack context.
|
|
|
260
271
|
## Release Checklist
|
|
261
272
|
|
|
262
273
|
### SDK Release
|
|
263
|
-
- [ ] Version bumped in `pyproject.toml
|
|
274
|
+
- [ ] Version bumped in `pyproject.toml`, and the CLI plugin's install pin with it (bump the CLI plugin patch version)
|
|
264
275
|
- [ ] If plugin content also changed: plugin versions bumped in their `plugin.json` files
|
|
265
276
|
- [ ] Pre-commit ran
|
|
266
277
|
- [ ] `CHANGELOG.md` updated with `### Highlights` and categorized changes
|
|
@@ -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",
|