affinity-sdk 2.0.1__tar.gz → 2.0.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (705) hide show
  1. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/CHANGELOG.md +163 -0
  2. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/PKG-INFO +14 -7
  3. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/README.md +13 -6
  4. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/__init__.py +2 -0
  5. affinity_sdk-2.0.3/affinity/_filtering/__init__.py +5 -0
  6. {affinity_sdk-2.0.1/affinity/cli/query → affinity_sdk-2.0.3/affinity/_filtering}/dates.py +26 -12
  7. affinity_sdk-2.0.3/affinity/_filtering/filter_text.py +52 -0
  8. affinity_sdk-2.0.3/affinity/_filtering/pushdown.py +593 -0
  9. affinity_sdk-2.0.3/affinity/_filtering/search.py +305 -0
  10. affinity_sdk-2.0.3/affinity/_filtering/where.py +108 -0
  11. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/company_cmds.py +30 -12
  12. affinity_sdk-2.0.3/affinity/cli/commands/discovery_cmds.py +243 -0
  13. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/list_cmds.py +190 -34
  14. affinity_sdk-2.0.3/affinity/cli/commands/org_cmds.py +447 -0
  15. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/person_cmds.py +30 -12
  16. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/query_cmd.py +4 -3
  17. affinity_sdk-2.0.3/affinity/cli/entity_search.py +263 -0
  18. affinity_sdk-2.0.3/affinity/cli/list_search.py +90 -0
  19. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/main.py +9 -0
  20. affinity_sdk-2.0.3/affinity/cli/query/dates.py +21 -0
  21. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/executor.py +503 -146
  22. affinity_sdk-2.0.3/affinity/cli/query/filter_text.py +5 -0
  23. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/filters.py +4 -2
  24. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/models.py +6 -92
  25. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/parser.py +35 -6
  26. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/planner.py +70 -49
  27. affinity_sdk-2.0.3/affinity/cli/query/pushdown.py +12 -0
  28. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/client.py +56 -0
  29. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/clients/http.py +54 -0
  30. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/compare.py +90 -28
  31. affinity_sdk-2.0.3/affinity/criteria.py +421 -0
  32. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/exceptions.py +9 -0
  33. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/filters.py +2 -1
  34. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/__init__.py +32 -0
  35. affinity_sdk-2.0.3/affinity/models/discovery.py +178 -0
  36. affinity_sdk-2.0.3/affinity/models/org.py +93 -0
  37. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/__init__.py +4 -0
  38. affinity_sdk-2.0.3/affinity/services/_discovery.py +470 -0
  39. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/_org_reads.py +8 -0
  40. affinity_sdk-2.0.3/affinity/services/_search.py +304 -0
  41. affinity_sdk-2.0.3/affinity/services/_single_field.py +151 -0
  42. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/companies.py +32 -2
  43. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/lists.py +721 -349
  44. affinity_sdk-2.0.3/affinity/services/org.py +563 -0
  45. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/persons.py +27 -2
  46. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/v1_only.py +183 -0
  47. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/cli/commands.md +126 -10
  48. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/cli/index.md +1 -1
  49. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/claude-code-plugins.md +5 -5
  50. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/csv-export.md +5 -5
  51. affinity_sdk-2.0.3/docs/public/guides/filtering.md +423 -0
  52. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/migrating-to-2.md +19 -0
  53. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/query-command.md +92 -21
  54. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/api-coverage.md +28 -26
  55. affinity_sdk-2.0.3/docs/public/reference/filters.md +21 -0
  56. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/query-language.md +71 -31
  57. affinity_sdk-2.0.3/docs/public/reference/services/companies.md +101 -0
  58. affinity_sdk-2.0.3/docs/public/reference/services/lists.md +24 -0
  59. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/persons.md +15 -0
  60. affinity_sdk-2.0.3/docs/public/reference/services/teams-users.md +7 -0
  61. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/plugin.json +1 -1
  62. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/skills/affinity-mcp-workflows/SKILL.md +2 -2
  63. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/skills/query-language/SKILL.md +43 -21
  64. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/skills/query-language/references/filter-operators.md +13 -5
  65. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/skills/query-language/references/quantifiers.md +25 -17
  66. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.gitignore +3 -0
  67. affinity_sdk-2.0.3/mcp/.mcp-bash/VERSION +1 -0
  68. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/bin/mcp-bash +59 -3
  69. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/resources.sh +2 -2
  70. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/tools.sh +0 -1
  71. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/cli/common.sh +2 -2
  72. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/completion.sh +1 -1
  73. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/core.sh +188 -14
  74. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/elicitation.sh +19 -2
  75. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/file_read.sh +57 -17
  76. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/io.sh +99 -14
  77. affinity_sdk-2.0.3/mcp/.mcp-bash/lib/lock.sh +252 -0
  78. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/policy.sh +7 -2
  79. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/progress-passthrough.sh +0 -2
  80. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/progress.sh +4 -3
  81. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/prompts.sh +3 -4
  82. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/registry.sh +34 -7
  83. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/resource_match.sh +18 -3
  84. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/resources.sh +266 -44
  85. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/runtime.sh +58 -5
  86. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/tools.sh +77 -103
  87. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/ui.sh +2 -1
  88. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/validate.sh +10 -0
  89. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/providers/file.sh +12 -1
  90. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/providers/ui.sh +5 -1
  91. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/sdk/tool-sdk.sh +8 -8
  92. affinity_sdk-2.0.3/mcp/.mcp-bash/vendor.json +1 -0
  93. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.registry/commands.generated.json +634 -10
  94. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.registry/mcp-commands.json +55 -4
  95. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/CHANGELOG.md +50 -1
  96. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/COMPATIBILITY +19 -2
  97. affinity_sdk-2.0.3/mcp/VERSION +1 -0
  98. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/mcp-bash.lock +2 -2
  99. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/data-model/data-model.md +24 -19
  100. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/server.d/requirements.json +1 -1
  101. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/server.d/server.meta.json +1 -1
  102. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/execute-read-command/tool.meta.json +1 -1
  103. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/execute-write-command/tool.sh +4 -0
  104. affinity_sdk-2.0.3/mcp/tools/query/tool.meta.json +111 -0
  105. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mkdocs.yml +1 -0
  106. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/affinity-sdk/.claude-plugin/plugin.json +1 -1
  107. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/SKILL.md +46 -4
  108. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/.claude-plugin/plugin.json +1 -1
  109. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/SKILL.md +11 -7
  110. affinity_sdk-2.0.3/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/filtering.md +79 -0
  111. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/query-guide.md +65 -16
  112. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/pyproject.toml +1 -1
  113. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/cassettes/company-lists-status.cassette.json +86 -86
  114. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/cassettes/hook-blocks-without-key.cassette.json +63 -63
  115. affinity_sdk-2.0.3/tests/cowork/cassettes/no-key-skill-path.cassette.json +417 -0
  116. affinity_sdk-2.0.3/tests/cowork/cassettes/status-history.cassette.json +492 -0
  117. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_company_cmds_coverage.py +4 -3
  118. affinity_sdk-2.0.3/tests/test_cli_entity_ls_server_filter.py +278 -0
  119. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_list_export_filter_safety.py +5 -3
  120. affinity_sdk-2.0.3/tests/test_cli_list_export_server_filter.py +183 -0
  121. affinity_sdk-2.0.3/tests/test_cli_org.py +193 -0
  122. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_person_cmds_coverage.py +4 -3
  123. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_planner.py +10 -8
  124. affinity_sdk-2.0.3/tests/test_cli_query_server_filter.py +424 -0
  125. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_compare.py +52 -3
  126. affinity_sdk-2.0.3/tests/test_duplicates_connections.py +277 -0
  127. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_filters.py +10 -0
  128. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_get_first.py +6 -0
  129. affinity_sdk-2.0.3/tests/test_list_entries_server_filter.py +270 -0
  130. affinity_sdk-2.0.3/tests/test_query_pushdown.py +376 -0
  131. affinity_sdk-2.0.3/tests/test_search_v2.py +277 -0
  132. affinity_sdk-2.0.3/tests/test_single_field_v2.py +150 -0
  133. affinity_sdk-2.0.3/tests/test_teams_users_feedback.py +273 -0
  134. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/api_coverage.json +64 -49
  135. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/openapi_snapshots/2024-01-01.json +2 -2
  136. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/openapi_snapshots/2026-07-15.json +2 -2
  137. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/openapi_snapshots/2026-09-17.json +112 -2
  138. affinity_sdk-2.0.3/tools/search_golden.py +238 -0
  139. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/validate_openapi_models.py +31 -0
  140. affinity_sdk-2.0.1/docs/public/guides/filtering.md +0 -303
  141. affinity_sdk-2.0.1/docs/public/reference/filters.md +0 -3
  142. affinity_sdk-2.0.1/docs/public/reference/services/companies.md +0 -45
  143. affinity_sdk-2.0.1/docs/public/reference/services/lists.md +0 -5
  144. affinity_sdk-2.0.1/mcp/.mcp-bash/VERSION +0 -1
  145. affinity_sdk-2.0.1/mcp/.mcp-bash/lib/lock.sh +0 -176
  146. affinity_sdk-2.0.1/mcp/.mcp-bash/vendor.json +0 -1
  147. affinity_sdk-2.0.1/mcp/VERSION +0 -1
  148. affinity_sdk-2.0.1/mcp/tools/query/tool.meta.json +0 -111
  149. affinity_sdk-2.0.1/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/filtering.md +0 -51
  150. affinity_sdk-2.0.1/tests/cowork/cassettes/no-key-skill-path.cassette.json +0 -395
  151. affinity_sdk-2.0.1/tests/cowork/cassettes/status-history.cassette.json +0 -469
  152. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.claude-plugin/marketplace.json +0 -0
  153. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.cursor/rules/test-data-privacy.mdc +0 -0
  154. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.editorconfig +0 -0
  155. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.env.example +0 -0
  156. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.gitattributes +0 -0
  157. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/CODEOWNERS +0 -0
  158. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  159. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  160. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/PULL_REQUEST_TEMPLATE/cli_command.md +0 -0
  161. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/PULL_REQUEST_TEMPLATE/release.md +0 -0
  162. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/dependabot.yml +0 -0
  163. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/labels.yml +0 -0
  164. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/mcp-release-install-footer.md +0 -0
  165. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/pull_request_template.md +0 -0
  166. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/release-install-footer.md +0 -0
  167. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/ci.yml +0 -0
  168. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/cowork-replay.yml +0 -0
  169. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/docs.yml +0 -0
  170. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/labels.yml +0 -0
  171. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/linkcheck.yml +0 -0
  172. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/openapi-validation.yml +0 -0
  173. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/plugin-build.yml +0 -0
  174. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/plugin-release.yml +0 -0
  175. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/release-detect.yml +0 -0
  176. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/release.yml +0 -0
  177. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.github/workflows/version-check.yml +0 -0
  178. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.gitignore +0 -0
  179. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/.pre-commit-config.yaml +0 -0
  180. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/AGENTS.md +0 -0
  181. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/CODE_OF_CONDUCT.md +0 -0
  182. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/CONTRIBUTING.md +0 -0
  183. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/LICENSE +0 -0
  184. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/SECURITY.md +0 -0
  185. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/VERSIONING.md +0 -0
  186. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/_internal/__init__.py +0 -0
  187. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/_internal/keyfile.py +0 -0
  188. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/api_versions.py +0 -0
  189. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/__init__.py +0 -0
  190. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/__main__.py +0 -0
  191. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/_update_worker.py +0 -0
  192. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/click_compat.py +0 -0
  193. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/__init__.py +0 -0
  194. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_entity_field.py +0 -0
  195. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_entity_files_dump.py +0 -0
  196. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_entity_files_read.py +0 -0
  197. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_entity_files_upload.py +0 -0
  198. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_list_entry_fields.py +0 -0
  199. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_org_reads.py +0 -0
  200. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_search_common.py +0 -0
  201. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/_v1_parsing.py +0 -0
  202. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/completion_cmd.py +0 -0
  203. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/config_cmds.py +0 -0
  204. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/entry_cmds.py +0 -0
  205. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/field_cmds.py +0 -0
  206. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/file_cmds.py +0 -0
  207. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/file_url_cmd.py +0 -0
  208. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/interaction_cmds.py +0 -0
  209. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/note_cmds.py +0 -0
  210. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/opportunity_cmds.py +0 -0
  211. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/org_read_cmds.py +0 -0
  212. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/relationship_strength_cmds.py +0 -0
  213. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/reminder_cmds.py +0 -0
  214. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/resolve_url_cmd.py +0 -0
  215. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/session_cmds.py +0 -0
  216. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/task_cmds.py +0 -0
  217. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/transcript_cmds.py +0 -0
  218. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/version_cmd.py +0 -0
  219. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/webhook_cmds.py +0 -0
  220. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/commands/whoami_cmd.py +0 -0
  221. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/config.py +0 -0
  222. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/confirm.py +0 -0
  223. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/constants.py +0 -0
  224. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/context.py +0 -0
  225. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/csv_utils.py +0 -0
  226. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/date_utils.py +0 -0
  227. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/decorators.py +0 -0
  228. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/errors.py +0 -0
  229. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/field_utils.py +0 -0
  230. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/formatters.py +0 -0
  231. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/help_json.py +0 -0
  232. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/interaction_utils.py +0 -0
  233. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/logging.py +0 -0
  234. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/mcp_limits.py +0 -0
  235. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/options.py +0 -0
  236. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/paths.py +0 -0
  237. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/progress.py +0 -0
  238. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/__init__.py +0 -0
  239. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/aggregates.py +0 -0
  240. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/cursor.py +0 -0
  241. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/exceptions.py +0 -0
  242. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/output.py +0 -0
  243. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/progress.py +0 -0
  244. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/query/schema.py +0 -0
  245. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/render.py +0 -0
  246. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/resolve.py +0 -0
  247. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/resolvers.py +0 -0
  248. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/results.py +0 -0
  249. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/runner.py +0 -0
  250. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/serialization.py +0 -0
  251. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/session_cache.py +0 -0
  252. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/types.py +0 -0
  253. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/cli/update_check.py +0 -0
  254. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/clients/__init__.py +0 -0
  255. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/clients/pipeline.py +0 -0
  256. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/downloads.py +0 -0
  257. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/field_resolve_utils.py +0 -0
  258. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/field_resolver.py +0 -0
  259. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/hooks.py +0 -0
  260. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/inbound_webhooks.py +0 -0
  261. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/entities.py +0 -0
  262. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/interactions_v2.py +0 -0
  263. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/pagination.py +0 -0
  264. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/rate_limit_snapshot.py +0 -0
  265. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/relationships_v2.py +0 -0
  266. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/search.py +0 -0
  267. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/secondary.py +0 -0
  268. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/transcripts.py +0 -0
  269. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/models/types.py +0 -0
  270. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/policies.py +0 -0
  271. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/progress.py +0 -0
  272. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/py.typed +0 -0
  273. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/_dropdown_options.py +0 -0
  274. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/_field_listing.py +0 -0
  275. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/_field_updates.py +0 -0
  276. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/_note_html.py +0 -0
  277. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/_v2_filters.py +0 -0
  278. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/opportunities.py +0 -0
  279. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/rate_limits.py +0 -0
  280. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/reminders.py +0 -0
  281. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/search.py +0 -0
  282. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/tasks.py +0 -0
  283. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/transcripts.py +0 -0
  284. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/services/webhooks.py +0 -0
  285. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/affinity/types.py +0 -0
  286. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/codecov.yml +0 -0
  287. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/cli-development-guide.md +0 -0
  288. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/ai-integrations/index.md +0 -0
  289. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/changelog.md +0 -0
  290. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/cli/scripting.md +0 -0
  291. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/cli-reference.md +0 -0
  292. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/examples.md +0 -0
  293. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/getting-started.md +0 -0
  294. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/glossary.md +0 -0
  295. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/affinity-official-mcp-comparison.md +0 -0
  296. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/api-versions-and-routing.md +0 -0
  297. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/api-versions.md +0 -0
  298. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/authentication.md +0 -0
  299. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/configuration.md +0 -0
  300. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/datetime-handling.md +0 -0
  301. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/debugging-hooks.md +0 -0
  302. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/errors-and-retries.md +0 -0
  303. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/field-types-and-values.md +0 -0
  304. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/field-values.md +0 -0
  305. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/ids-and-types.md +0 -0
  306. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/models.md +0 -0
  307. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/opportunity-associations.md +0 -0
  308. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/pagination.md +0 -0
  309. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/performance.md +0 -0
  310. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/rate-limits.md +0 -0
  311. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/sync-vs-async.md +0 -0
  312. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/guides/webhooks.md +0 -0
  313. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/index.md +0 -0
  314. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/mcp/index.md +0 -0
  315. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/client.md +0 -0
  316. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/exceptions.md +0 -0
  317. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/models.md +0 -0
  318. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/opportunities.md +0 -0
  319. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/reminders.md +0 -0
  320. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/tasks.md +0 -0
  321. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/v1/auth.md +0 -0
  322. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/v1/field-values.md +0 -0
  323. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/v1/fields.md +0 -0
  324. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/v1/files.md +0 -0
  325. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/v1/interactions.md +0 -0
  326. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/v1/notes.md +0 -0
  327. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/v1/relationships.md +0 -0
  328. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/services/webhooks.md +0 -0
  329. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/reference/types.md +0 -0
  330. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/docs/public/troubleshooting.md +0 -0
  331. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/advanced_usage.py +0 -0
  332. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/async_lifecycle.py +0 -0
  333. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/basic_usage.py +0 -0
  334. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/filter_builder.py +0 -0
  335. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/hooks_debugging.py +0 -0
  336. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/list_management.py +0 -0
  337. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/resolve_helpers.py +0 -0
  338. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/examples/task_polling.py +0 -0
  339. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/.gitignore +0 -0
  340. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/skills/pipeline-history/SKILL.md +0 -0
  341. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/skills/query-language/references/include-expand.md +0 -0
  342. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/skills/query-language/references/output-formats.md +0 -0
  343. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.claude-plugin/xaffinity-mcp.sh +0 -0
  344. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/completion.sh +0 -0
  345. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/lifecycle.sh +0 -0
  346. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/logging.sh +0 -0
  347. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/ping.sh +0 -0
  348. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/prompts.sh +0 -0
  349. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/handlers/roots.sh +0 -0
  350. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/auth.sh +0 -0
  351. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/capabilities.sh +0 -0
  352. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/cli/health.sh +0 -0
  353. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/handler_helpers.sh +0 -0
  354. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/hash.sh +0 -0
  355. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/ids.sh +0 -0
  356. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/json.sh +0 -0
  357. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/logging.sh +0 -0
  358. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/meta_env.sh +0 -0
  359. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/paginate.sh +0 -0
  360. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/path.sh +0 -0
  361. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/require.sh +0 -0
  362. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/resource_content.sh +0 -0
  363. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/resource_providers.sh +0 -0
  364. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/roots.sh +0 -0
  365. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/rpc.sh +0 -0
  366. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/spec.sh +0 -0
  367. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/timeout.sh +0 -0
  368. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/tools_policy.sh +0 -0
  369. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/ui-templates.sh +0 -0
  370. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/lib/uri.sh +0 -0
  371. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/providers/echo.sh +0 -0
  372. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/providers/git.sh +0 -0
  373. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/providers/https.sh +0 -0
  374. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/sdk/tool-error.sh +0 -0
  375. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.mcp-bash/sdk/ui-sdk.sh +0 -0
  376. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.registry/prompts.json +0 -0
  377. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.registry/resource-templates.json +0 -0
  378. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.registry/resources.json +0 -0
  379. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/.registry/ui-resources.json +0 -0
  380. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/Makefile +0 -0
  381. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/README.md +0 -0
  382. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/completions/entity-name.sh +0 -0
  383. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/completions/list-name.sh +0 -0
  384. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/completions/status-value.sh +0 -0
  385. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/docs/DEBUGGING.md +0 -0
  386. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/icon.svg +0 -0
  387. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/lib/cache.sh +0 -0
  388. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/lib/cli-detect.sh +0 -0
  389. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/lib/cli-gateway.sh +0 -0
  390. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/lib/common.sh +0 -0
  391. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/lib/entity-types.sh +0 -0
  392. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/lib/field-resolution.sh +0 -0
  393. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/mcp-publisher.lock +0 -0
  394. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/mcpb.conf +0 -0
  395. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/change-status/change-status.completion.sh +0 -0
  396. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/change-status/change-status.meta.json +0 -0
  397. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/change-status/change-status.txt +0 -0
  398. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/interaction-brief/interaction-brief.meta.json +0 -0
  399. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/interaction-brief/interaction-brief.txt +0 -0
  400. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/log-call/log-call.meta.json +0 -0
  401. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/log-call/log-call.txt +0 -0
  402. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.meta.json +0 -0
  403. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.txt +0 -0
  404. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/log-message/log-message.meta.json +0 -0
  405. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/log-message/log-message.txt +0 -0
  406. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/pipeline-review/pipeline-review.completion.sh +0 -0
  407. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/pipeline-review/pipeline-review.meta.json +0 -0
  408. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/pipeline-review/pipeline-review.txt +0 -0
  409. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/prepare-briefing/prepare-briefing.meta.json +0 -0
  410. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/prepare-briefing/prepare-briefing.txt +0 -0
  411. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/warm-intro/warm-intro.meta.json +0 -0
  412. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/prompts/warm-intro/warm-intro.txt +0 -0
  413. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/providers/xaffinity.sh +0 -0
  414. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/data-model/data-model.meta.json +0 -0
  415. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/field-catalogs/field-catalogs.meta.json +0 -0
  416. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/field-catalogs/field-catalogs.sh +0 -0
  417. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/interaction-enums/interaction-enums.json +0 -0
  418. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/interaction-enums/interaction-enums.meta.json +0 -0
  419. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/me/me.meta.json +0 -0
  420. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/me/me.sh +0 -0
  421. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/me-person-id/me-person-id.meta.json +0 -0
  422. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/me-person-id/me-person-id.sh +0 -0
  423. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/query-guide/query-guide.meta.json +0 -0
  424. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/query-guide/query-guide.sh +0 -0
  425. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/saved-views/saved-views.meta.json +0 -0
  426. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/saved-views/saved-views.sh +0 -0
  427. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/workflow-config/workflow-config.meta.json +0 -0
  428. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/workflow-config/workflow-config.sh +0 -0
  429. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/workflows-guide/workflows-guide.meta.json +0 -0
  430. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/workflows-guide/workflows-guide.sh +0 -0
  431. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/xaffinity-field-catalogs.completion.sh +0 -0
  432. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/xaffinity-saved-views.completion.sh +0 -0
  433. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/resources/xaffinity-workflow-config.completion.sh +0 -0
  434. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/server.d/env.sh +0 -0
  435. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/server.d/health-checks.sh +0 -0
  436. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/server.d/policy.sh +0 -0
  437. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/server.json +0 -0
  438. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/test/README.md +0 -0
  439. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/test/run.sh +0 -0
  440. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/test/test_env_update_check.sh +0 -0
  441. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/test-progress.sh +0 -0
  442. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/discover-commands/tool.meta.json +0 -0
  443. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/discover-commands/tool.sh +0 -0
  444. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/execute-read-command/tool.sh +0 -0
  445. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/execute-write-command/tool.meta.json +0 -0
  446. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/get-entity-dossier/tool.meta.json +0 -0
  447. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/get-entity-dossier/tool.sh +0 -0
  448. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/get-file-url/tool.meta.json +0 -0
  449. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/get-file-url/tool.sh +0 -0
  450. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/query/tool.sh +0 -0
  451. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/read-xaffinity-resource/tool.meta.json +0 -0
  452. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/tools/read-xaffinity-resource/tool.sh +0 -0
  453. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/user-config.json +0 -0
  454. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/xaffinity-mcp-env.sh +0 -0
  455. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/mcp/xaffinity-mcp.sh +0 -0
  456. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/references/services.md +0 -0
  457. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/hooks/guard-env-read.sh +0 -0
  458. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/hooks/hooks.json +0 -0
  459. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/hooks/pre-xaffinity.sh +0 -0
  460. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/hooks/session-setup.sh +0 -0
  461. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/files-and-writes.md +0 -0
  462. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/history-and-activity.md +0 -0
  463. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/interactions.md +0 -0
  464. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/setup.md +0 -0
  465. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/query/test_cursor.py +0 -0
  466. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_company_create_dedup.py +0 -0
  467. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_company_ls_filter_rejection.py +0 -0
  468. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_formatters.py +0 -0
  469. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_output_formats_integration.py +0 -0
  470. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_person_create_dedup.py +0 -0
  471. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_person_ls_filter_rejection.py +0 -0
  472. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_query_filter_rejection.py +0 -0
  473. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_query_list_entry_relationships.py +0 -0
  474. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_query_list_export_parity.py +0 -0
  475. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_query_output_flattening.py +0 -0
  476. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_query_output_truncation.py +0 -0
  477. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cli/test_query_unreplied.py +0 -0
  478. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/conftest.py +0 -0
  479. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/.cowork-redact.json +0 -0
  480. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/README.md +0 -0
  481. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/fixtures/workdir-key/README.txt +0 -0
  482. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/fixtures/workdir-key/xaffinity-test-key +0 -0
  483. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/fixtures/workdir-nokey/README.txt +0 -0
  484. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/image/Dockerfile +0 -0
  485. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/image/fakeaff/build_fixtures.py +0 -0
  486. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/image/fakeaff/fixtures.json +0 -0
  487. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/image/fakeaff/server.py +0 -0
  488. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/image/xaffinity-wrapper.sh +0 -0
  489. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/privacy-allow.txt +0 -0
  490. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/record.sh +0 -0
  491. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/scenarios/company-lists-status.yaml +0 -0
  492. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/scenarios/hook-blocks-without-key.yaml +0 -0
  493. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/scenarios/no-key-skill-path.yaml +0 -0
  494. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/scenarios/status-history.yaml +0 -0
  495. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/sessions/no-key.yaml +0 -0
  496. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/cowork/sessions/with-key.yaml +0 -0
  497. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/field_write_mocks.py +0 -0
  498. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/fixtures/openapi/mini_openapi.json +0 -0
  499. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/fixtures/webhooks/field_value_updated.json +0 -0
  500. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/fixtures/webhooks/list_entry_created.json +0 -0
  501. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/fixtures/webhooks/organization_created.json +0 -0
  502. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/fixtures/webhooks/organization_merged.json +0 -0
  503. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/fixtures/webhooks/person_created.json +0 -0
  504. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/fixtures/webhooks/unknown_event.json +0 -0
  505. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/README.md +0 -0
  506. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/conftest.py +0 -0
  507. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/setup_query_parity_data.py +0 -0
  508. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/test_cli_writes.py +0 -0
  509. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/test_query_parity_integration.py +0 -0
  510. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/test_sdk_reads.py +0 -0
  511. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/test_sdk_writes.py +0 -0
  512. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/integration/test_sdk_writes_runner.py +0 -0
  513. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/mcp/__init__.py +0 -0
  514. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/mcp/test_query_cursor.py +0 -0
  515. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/skill-evals/xaffinity-cli-usage-evals/evals.json +0 -0
  516. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/spec_guard.py +0 -0
  517. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_affinity_client_wrapper_additional_coverage.py +0 -0
  518. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_api_coverage.py +0 -0
  519. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_api_key_file_formats.py +0 -0
  520. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_api_key_resolution.py +0 -0
  521. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_api_version.py +0 -0
  522. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_api_version_per_operation.py +0 -0
  523. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_async_file_download_streaming.py +0 -0
  524. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_batch_get.py +0 -0
  525. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_api_version.py +0 -0
  526. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_column_limiting.py +0 -0
  527. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_command_context.py +0 -0
  528. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_company_get.py +0 -0
  529. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_config_cmds.py +0 -0
  530. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_context_coverage.py +0 -0
  531. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_csv_export.py +0 -0
  532. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_date_params.py +0 -0
  533. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_date_utils.py +0 -0
  534. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_datetime_formatting.py +0 -0
  535. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_datetime_header_offsets.py +0 -0
  536. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_domain_linkification.py +0 -0
  537. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_dotenv_resolution.py +0 -0
  538. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_dropdown_field_writes.py +0 -0
  539. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_enriched_field_writes.py +0 -0
  540. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_entity_field_writes.py +0 -0
  541. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_entity_files_dump.py +0 -0
  542. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_entry_field.py +0 -0
  543. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_entry_field_batch_writes.py +0 -0
  544. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_entry_field_multi_value_limits.py +0 -0
  545. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_error_hints.py +0 -0
  546. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_error_rendering.py +0 -0
  547. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_field_history.py +0 -0
  548. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_field_history_bulk.py +0 -0
  549. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_field_options_and_transcripts.py +0 -0
  550. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_field_utils.py +0 -0
  551. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_field_utils_coverage.py +0 -0
  552. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_field_utils_set_phase.py +0 -0
  553. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_field_value_humanization.py +0 -0
  554. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_file_url.py +0 -0
  555. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_files_ls.py +0 -0
  556. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_files_read.py +0 -0
  557. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_get_interaction_dates.py +0 -0
  558. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_help_json.py +0 -0
  559. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_interaction_date_chunking.py +0 -0
  560. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_interaction_utils.py +0 -0
  561. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_json_safety.py +0 -0
  562. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_list_cmds_coverage.py +0 -0
  563. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_list_expand_interactions.py +0 -0
  564. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_list_export_entity_scope.py +0 -0
  565. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_list_export_field_refresh.py +0 -0
  566. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_list_export_truncation_meta.py +0 -0
  567. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_missing_coverage.py +0 -0
  568. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_multi_value_truncation_warnings.py +0 -0
  569. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_no_network_commands.py +0 -0
  570. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_notes_writes.py +0 -0
  571. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_opportunity_cmds.py +0 -0
  572. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_opportunity_cmds_coverage.py +0 -0
  573. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_pager_logic.py +0 -0
  574. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_person_get.py +0 -0
  575. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_plugin_manifest.py +0 -0
  576. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_pre_xaffinity_hook.py +0 -0
  577. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_progress_manager.py +0 -0
  578. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_aggregates.py +0 -0
  579. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_cmd.py +0 -0
  580. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_cmd_coverage.py +0 -0
  581. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_dates.py +0 -0
  582. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_executor.py +0 -0
  583. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_expand_interactions.py +0 -0
  584. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_filters.py +0 -0
  585. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_integration.py +0 -0
  586. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_parser.py +0 -0
  587. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_safety.py +0 -0
  588. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_query_schema.py +0 -0
  589. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_rate_limit_rendering.py +0 -0
  590. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_rate_limit_throttle.py +0 -0
  591. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_reminders.py +0 -0
  592. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_render_coverage.py +0 -0
  593. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_resolve_coverage.py +0 -0
  594. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_resolve_url_parsing.py +0 -0
  595. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_result_summary.py +0 -0
  596. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_safe_field_writes.py +0 -0
  597. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_search.py +0 -0
  598. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_serialization.py +0 -0
  599. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_session_cache.py +0 -0
  600. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_session_setup_hook.py +0 -0
  601. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_set_phase_atomicity.py +0 -0
  602. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_types.py +0 -0
  603. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_unreplied.py +0 -0
  604. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_update_check.py +0 -0
  605. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_v1_only_cmds.py +0 -0
  606. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_v1_parsing.py +0 -0
  607. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_webhooks.py +0 -0
  608. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_cli_write_ops.py +0 -0
  609. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_client.py +0 -0
  610. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_companies_create_dedup.py +0 -0
  611. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_companies_filter_rejection.py +0 -0
  612. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_env_helpers.py +0 -0
  613. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_exceptions_coverage.py +0 -0
  614. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_field_resolver.py +0 -0
  615. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_field_service_caching.py +0 -0
  616. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_field_types_c4.py +0 -0
  617. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_field_value_type.py +0 -0
  618. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_field_values_get_value.py +0 -0
  619. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_file_batch_get.py +0 -0
  620. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_file_download_streaming.py +0 -0
  621. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_file_list_batch.py +0 -0
  622. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_file_upload_helpers_and_validation.py +0 -0
  623. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_files_upload_returning_files.py +0 -0
  624. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_files_v2.py +0 -0
  625. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_generate_mcp_command_registry.py +0 -0
  626. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_get_fields_filter_includes.py +0 -0
  627. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_get_fields_pagination.py +0 -0
  628. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_hidden_field_values.py +0 -0
  629. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_hooks.py +0 -0
  630. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_http_client_additional_coverage.py +0 -0
  631. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_http_client_remaining_coverage.py +0 -0
  632. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_inbound_webhooks.py +0 -0
  633. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_integration_smoke.py +0 -0
  634. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_interaction_date_validation.py +0 -0
  635. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_interactions_and_files_regressions.py +0 -0
  636. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_isodatetime.py +0 -0
  637. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_list_entry_membership_and_opportunities.py +0 -0
  638. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_list_term.py +0 -0
  639. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_lists_v2_writes.py +0 -0
  640. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_bundle_env_and_completions.py +0 -0
  641. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_cli_version_check.py +0 -0
  642. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_entity_dossier.py +0 -0
  643. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_gateway_limits.py +0 -0
  644. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_history_bulk_gateway.py +0 -0
  645. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_limits.py +0 -0
  646. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_query_cli_error.py +0 -0
  647. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_read_truncation.py +0 -0
  648. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_mcp_resource_scripts.py +0 -0
  649. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_models.py +0 -0
  650. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_models_v2_2026_fields.py +0 -0
  651. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_multi_value_limits.py +0 -0
  652. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_new_features.py +0 -0
  653. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_notes_v2.py +0 -0
  654. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_notes_v2_writes.py +0 -0
  655. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_opportunities_filter_rejection.py +0 -0
  656. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_org_reads.py +0 -0
  657. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_pagination_iterators.py +0 -0
  658. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_persons_create_dedup.py +0 -0
  659. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_persons_filter_rejection.py +0 -0
  660. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_public_api.py +0 -0
  661. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_rate_limit_v2.py +0 -0
  662. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_raw_pipeline_hook_events.py +0 -0
  663. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_readonly_factory.py +0 -0
  664. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_reminder_list_batch.py +0 -0
  665. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_reminders_v2.py +0 -0
  666. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_requirements_additional.py +0 -0
  667. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_sdk_interaction_dates.py +0 -0
  668. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_search.py +0 -0
  669. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_service_get_parameter_combinations.py +0 -0
  670. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_companies_coverage_gaps.py +0 -0
  671. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_dropdown_options.py +0 -0
  672. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_entity_field_updates.py +0 -0
  673. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_field_value_changes.py +0 -0
  674. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_list_entries_filter_paths.py +0 -0
  675. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_lists_additional_coverage.py +0 -0
  676. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_lists_coverage_gaps.py +0 -0
  677. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_opportunities_additional_coverage.py +0 -0
  678. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_opportunities_coverage_gaps.py +0 -0
  679. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_opportunities_tasks_additional_coverage.py +0 -0
  680. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_persons_companies_additional_coverage.py +0 -0
  681. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_rate_limits_coverage_gaps.py +0 -0
  682. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_v1_only_async.py +0 -0
  683. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_services_v1_only_coverage_gaps.py +0 -0
  684. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_small_modules_coverage.py +0 -0
  685. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_spec_guard.py +0 -0
  686. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_transport_and_readonly_mode.py +0 -0
  687. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_v1_association_parsing.py +0 -0
  688. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_v1_only_services_additional_coverage.py +0 -0
  689. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_v1_only_services_more_coverage.py +0 -0
  690. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_v2_request_bodies.py +0 -0
  691. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_validate_openapi_tool.py +0 -0
  692. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/test_webhooks_v2.py +0 -0
  693. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/unit/__init__.py +0 -0
  694. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tests/unit/test_exceptions.py +0 -0
  695. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/__init__.py +0 -0
  696. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/api_coverage.py +0 -0
  697. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/api_coverage_v1_snapshot.json +0 -0
  698. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/check_cli_patterns.py +0 -0
  699. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/generate_mcp_command_registry.py +0 -0
  700. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/generate_release_notes.py +0 -0
  701. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/generate_requirements_mapping.py +0 -0
  702. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/sync_mcp_bundle_env.py +0 -0
  703. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/sync_mcp_registry.py +0 -0
  704. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/sync_mcp_version.py +0 -0
  705. {affinity_sdk-2.0.1 → affinity_sdk-2.0.3}/tools/validate_mcp_registry_metadata.py +0 -0
@@ -7,6 +7,169 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.0.3] - 2026-10-13
11
+
12
+ **Exception to semantic versioning** (the maintainer's call, as 2.0.2): some results change
13
+ (`list(filter=...)` pages, the local sort's order, date comparisons in filters). The
14
+ `### Changed` entries say how.
15
+
16
+ ### Changed
17
+
18
+ - **SDK list-entry filters go through Affinity's search:**
19
+ `lists.entries(id).list/pages/all/iter/get_first(filter=...)` send the part of the filter
20
+ Affinity's search can answer and check the whole filter locally, as `list export --filter`
21
+ does. Only when no part can go there (or the search is refused) is every entry read; that
22
+ case emits the new `ClientSideFilterWarning` (a `UserWarning`).
23
+ - **`list(filter=...)` returns the matches of one page read**, possibly fewer than `limit` (or
24
+ none), with a `next_cursor` that carries the filter: follow it, or use `iter()` for every
25
+ match. Before, it filtered only the first page and had no way to continue.
26
+ - **Filtered-read cursors are `xsearch2:`** (the filter travels as data, so multi-word field
27
+ names and dates round-trip) in the SDK, `list export`, and `company ls` / `person ls`;
28
+ 2.0.2's `xsearch1:` cursors still work.
29
+ - **Field values can be named by id in text filters** (`F.field("field-123")`,
30
+ `--filter 'field-123 = …'`), as `query` allows `fields.<id>`.
31
+ - **`query`'s local sort follows Affinity's order** (when Affinity can't sort, e.g. an
32
+ unsortable field or a refused search): ranked dropdowns sort by rank (not by text),
33
+ multi-value fields by their first item, and text case-insensitively ("apple" before
34
+ "Zeta"); empty values stay last in both directions. Fields named only in `orderBy` are now
35
+ fetched (a local sort used to see them empty). Grouped rows (`groupBy`) sort by their keys
36
+ as before.
37
+ - **Quantifier queries (`all`/`none`/`exists`) on companies and persons no longer always need
38
+ `--max-records`**: their `where` must test a field, which Affinity's search applies first;
39
+ when it matches at most 100 records the query runs, otherwise it stops and names the count.
40
+ `--dry-run` gives a number of API calls instead of "UNBOUNDED" (with `--max-records` too),
41
+ which also fixes the MCP query tool's timeout for these queries (it fell back to 120 s).
42
+ Validation errors found while the query runs exit 2 with `validation_error`, like those
43
+ found while planning.
44
+
45
+ ### Added
46
+
47
+ - **`server_filter=False`** on the list-entry `list/pages/all/iter/get_first` reads every entry
48
+ and filters locally (to compare or debug), and **`affinity.ClientSideFilterWarning`**.
49
+ - **More filters go to Affinity's search** (verified live): `starts_word` on single-company
50
+ fields, and `is_not_null` / `is_null` on location fields.
51
+
52
+ - **A team's members and accessible lists, every page** (V2, beta; API 2026-09-17+):
53
+ `teams.list|iter_members(team_id)` and `teams.list|iter_accessible_lists(team_id)`; CLI
54
+ `team members <id>` and `team lists <id>` (`team get` shows only the first 10).
55
+
56
+ ### Fixed
57
+
58
+ - **Dates compare as dates in `>`, `>=`, `<`, `<=` and between**, everywhere filters run
59
+ (`query`, `--filter`, `--expand-filter`, `company ls` / `person ls --filter`, and the SDK's
60
+ `affinity.filters`): relative dates (`-30d`, `today`) and ISO dates are compared with the
61
+ field's timestamp in UTC. Before, the text filter compared them as text, so
62
+ `Close > "-30d"` matched every dated entry. Equality stays textual (`= "today"` matches the
63
+ word). Timestamps with `Z` or long fractions parse on Python 3.10 too.
64
+ - **`list export --field X --filter "Y = …"`** returned no rows: the filter's fields are now
65
+ fetched even when `--field` leaves them out of the output.
66
+ - **`Team` reads `updatedAt`** (`updated_at`), and accepts the `membersPreview` /
67
+ `accessibleListsPreview` blocks under their own names too.
68
+
69
+ ## [2.0.2] - 2026-10-13
70
+
71
+ ### Changed (breaking)
72
+
73
+ **Exception to semantic versioning:** these change what some filters return, in a patch release
74
+ (the maintainer's call). Filters now mean what Affinity's own search means, so the same filter
75
+ gives the same answer whether Affinity or the CLI applies it. This reaches Python code too:
76
+ `affinity.filters` (`F`, filter strings, `lists.entries(...).list/iter/pages(filter=...)`)
77
+ uses the same comparison rules as the CLI.
78
+
79
+ - **An empty multi-value field counts as empty.** `is_null` / `is empty` now match a field with
80
+ no items (`[]`), and `is_not_null` / `is not null` no longer do, in `query`, `--filter` and
81
+ the SDK's `affinity.filters`.
82
+ - **`contains` on person and company fields is refused** (in `query` on list entries): use the
83
+ new **`starts_word`** operator, which matches a word in the name that starts with the text,
84
+ the way Affinity's search does ("Jan" finds "Jane Doe"; "ane" doesn't).
85
+ - **`query` sorts the way Affinity's search sorts:** Affinity's order is kept when it sorts,
86
+ and the local sort breaks ties by id (ascending) instead of keeping fetch order.
87
+ - **`query`: a field name two list fields share is refused.** Name the field by id instead:
88
+ `fields.<field id>` (e.g. Affinity's and Dealroom's "Year Founded"). Such fields come back
89
+ keyed by id, instead of one silently overwriting the other. Any field can be named by id.
90
+ - **Person and company field values filter by name** in `--filter` and the SDK's
91
+ `affinity.filters` (`Owner = "Jane Doe"`, `Owner starts_word "Jan"`), as they already did in
92
+ `query`; before, they were compared as raw objects.
93
+
94
+ ### Added
95
+
96
+ - **`starts_word` filter operator** (`query` JSON and `--filter` text: `Owner starts_word "Jan"`).
97
+
98
+ - **Teams, users and feedback (V2):** `client.teams.list/iter/get` (Affinity API 2026-09-17+;
99
+ filter by name, sort, `includes` for the first members and accessible lists),
100
+ `client.users.list/iter/get` (internal users; `term`, `status`; a user's id is their person
101
+ id), `client.feedback.send(kind, subject, body)` (to Affinity's product team). New models
102
+ `Team`, `TeamMember`, `UserAccount`, `UserStatus`.
103
+ - **`interactions.get_meeting(id)`** (V2, API 2026-07-15+) and
104
+ **`notes.list/iter_attached_companies|persons|opportunities(note_id)`** (every entity a note
105
+ is attached to, beyond `get()`'s preview).
106
+ - **Duplicate suggestions and warm intros (V2, beta):**
107
+ `companies/persons.list|iter_duplicate_suggestions` (API 2026-07-15+; `term`,
108
+ `match_criteria`, `order_by`) and `companies.list|iter_coworker_connections(company_id)` /
109
+ `list|iter_investor_executive_connections(company_id)` (people at a company today whom someone
110
+ you know may know). CLI `company duplicates`, `person duplicates`, `company connections`.
111
+ - **One field at a time (V2):** `companies/persons.get_field_value(id, field_id)` (the value,
112
+ unwrapped) and `update_field_value(id, field_id, value, value_type=None)`;
113
+ `companies/persons.list|iter_field_value_items(id, field_id)` and
114
+ `lists.entries(list_id).list|iter_field_value_items(entry_id, field_id)` page through a
115
+ multi-value field's items (API 2026-09-17+); `lists.entries(list_id).list|iter_field_changes(
116
+ entry_id, ...)` give one entry's field change history, oldest first.
117
+ - **Search on Affinity's side (V2, beta):** `companies.find`, `persons.find` and
118
+ `lists.entries(list_id).find` (plus `iter_find`, and `find_body` for a prebuilt request
119
+ body) filter, sort and keyword-search on the server, so only matching records are
120
+ downloaded. Build filters with `affinity.criteria`: `Condition(field_id, operator, value)`,
121
+ `all_of`, `any_of`, `Sort`. Value types are read from the fields metadata when omitted, and
122
+ each operator is checked against the field. Needs the "Export All Organizations directory"
123
+ permission (companies, persons) or "Export data from Lists" (list entries). Allowed under
124
+ read-only mode.
125
+ - **`query` on list entries filters on Affinity's side:** conditions on list fields that
126
+ Affinity's search answers (dropdown and ranked-dropdown values, `!=` on dropdowns, numbers,
127
+ dates, text `contains`/`eq`/`starts_with`, `is_not_null` on single-value fields)
128
+ go to the server, so only matching entries are downloaded; the full `where` still runs
129
+ locally on what comes back, so results are unchanged. Everything else (related records,
130
+ `entityName`, `is_null`, Affinity's enriched fields, field names two fields share) is
131
+ filtered locally, as before. If the search is refused (for example, no "Export data from
132
+ Lists" permission) the query reads the whole list instead, with a warning.
133
+ `--include-meta` shows `meta.serverFilter` (what went to the server, and why the rest
134
+ didn't); `--dry-run` names the candidate fields. `XAFFINITY_QUERY_SERVER_FILTER=0` turns it
135
+ off.
136
+ - **`list export --filter` filters on Affinity's side** through the same engine as `query`:
137
+ the `--filter` text becomes a `query` where clause, the part Affinity's search answers is
138
+ sent, and the whole filter still runs locally. When Affinity applies the whole filter,
139
+ `--all` / `--max-results` / `--first-page-only` are no longer required (page one is the
140
+ first page of matches); otherwise the error's `details.local` says which conditions stay
141
+ local. The printed cursor (`xsearch1:...`) carries the search, so `--cursor` alone resumes
142
+ a filtered export. A refused search falls back to reading the whole list, with a warning.
143
+ - **`company ls --filter` and `person ls --filter` work** (they used to be refused): the filter
144
+ goes to Affinity's search, which filters on field values, and the whole filter still runs
145
+ locally on what comes back. A filter with no field condition is still refused (reading every
146
+ company isn't practical: use `--query`). Conditions on Affinity's enriched fields are sent
147
+ as they are, with a warning that Affinity's search can miss a few records' enriched values.
148
+ The cursor carries the search (`xsearch1:...`).
149
+ - **`query` on companies and persons can filter on their fields** (`fields.<name>`): Affinity's
150
+ search applies what it can, the rest of the `where` (e.g. `name contains`) runs on what comes
151
+ back. A `where` with no field condition is still refused (it would mean reading Affinity's
152
+ whole directory). `meta.serverFilter` with `--include-meta`; enriched-field conditions carry
153
+ a warning that a few records' enriched values can be missed.
154
+ - **More of `query` goes to Affinity** (list entries too): `is_null` / `is_not_null` on every
155
+ verified field type, multi-value fields included; multi-select dropdowns (`eq` membership,
156
+ `in`, `has_any`, `has_all`, `contains`/`starts_word` on option text, `!=`); `!=` on numbers;
157
+ and `starts_word` on a person or company
158
+ field (person, multi-person and multi-company fields; one per query, at the top level of the
159
+ `where`, plain text of 3+ letters).
160
+ - **`query` sorts on Affinity's side** when every `orderBy` key is a sortable field
161
+ (`fields.<name>`, up to 5, no `groupBy`/`aggregate`): with a `limit`, the fetch stops once
162
+ enough records pass the filter, instead of reading everything to sort it. This works on
163
+ companies and persons without a `where` too. `meta.serverFilter.sort` says so.
164
+ - **CLI:** `team ls|get`, `user ls|get`, `meeting get`, `note attached`, `feedback send` (asks
165
+ for confirmation: the text leaves your organization). The MCP registry has them; `feedback
166
+ send` goes through the user-confirmation flow.
167
+
168
+ ### Fixed
169
+
170
+ - **`query --dry-run`** no longer claims a "server-side filter" for list entries that was never
171
+ applied.
172
+
10
173
  ## [2.0.1] - 2026-10-12
11
174
 
12
175
  ### Changed (breaking)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: affinity-sdk
3
- Version: 2.0.1
3
+ Version: 2.0.3
4
4
  Summary: A modern, strongly-typed Python SDK for the Affinity CRM API
5
5
  Project-URL: Homepage, https://github.com/yaniv-golan/affinity-sdk
6
6
  Project-URL: Documentation, https://yaniv-golan.github.io/affinity-sdk/latest/
@@ -215,15 +215,22 @@ with Affinity.from_env() as client:
215
215
  ### Working with Companies
216
216
 
217
217
  ```python
218
- from affinity import Affinity, F
218
+ from datetime import date
219
+
220
+ from affinity import Affinity
221
+ from affinity.criteria import Condition, Sort, all_of
219
222
  from affinity.models import CompanyCreate
220
- from affinity.types import CompanyId, FieldType
223
+ from affinity.types import CompanyId
221
224
 
222
225
  with Affinity(api_key="your-key") as client:
223
- # List companies with filtering (V2 API)
224
- companies = client.companies.list(
225
- filter=F.field("domain").contains("acme"),
226
- field_types=[FieldType.ENRICHED],
226
+ # Filter and sort on Affinity's side (V2 search, beta)
227
+ page = client.companies.find(
228
+ all_of(
229
+ Condition("field-498220", "is-any-of", [3, 4]),
230
+ Condition("affinity-data-last-funding-date", "is-after", date(2025, 1, 1)),
231
+ ),
232
+ sort=[Sort("affinity-data-total-funding-amount", "desc")],
233
+ limit=50,
227
234
  )
228
235
 
229
236
  # Iterate through all companies with automatic pagination
@@ -154,15 +154,22 @@ with Affinity.from_env() as client:
154
154
  ### Working with Companies
155
155
 
156
156
  ```python
157
- from affinity import Affinity, F
157
+ from datetime import date
158
+
159
+ from affinity import Affinity
160
+ from affinity.criteria import Condition, Sort, all_of
158
161
  from affinity.models import CompanyCreate
159
- from affinity.types import CompanyId, FieldType
162
+ from affinity.types import CompanyId
160
163
 
161
164
  with Affinity(api_key="your-key") as client:
162
- # List companies with filtering (V2 API)
163
- companies = client.companies.list(
164
- filter=F.field("domain").contains("acme"),
165
- field_types=[FieldType.ENRICHED],
165
+ # Filter and sort on Affinity's side (V2 search, beta)
166
+ page = client.companies.find(
167
+ all_of(
168
+ Condition("field-498220", "is-any-of", [3, 4]),
169
+ Condition("affinity-data-last-funding-date", "is-after", date(2025, 1, 1)),
170
+ ),
171
+ sort=[Sort("affinity-data-total-funding-amount", "desc")],
172
+ limit=50,
166
173
  )
167
174
 
168
175
  # Iterate through all companies with automatic pagination
@@ -47,6 +47,7 @@ from .exceptions import (
47
47
  ApiVersionTooOldError,
48
48
  AuthenticationError,
49
49
  AuthorizationError,
50
+ ClientSideFilterWarning,
50
51
  CompanyMergedError,
51
52
  CompanyNotFoundError,
52
53
  ConfigurationError,
@@ -108,6 +109,7 @@ __all__ = [
108
109
  "AsyncAffinity",
109
110
  # Exceptions
110
111
  "AffinityError",
112
+ "ClientSideFilterWarning",
111
113
  "AuthenticationError",
112
114
  "AuthorizationError",
113
115
  "NotFoundError",
@@ -0,0 +1,5 @@
1
+ """The filter engine shared by the SDK and the CLI: WHERE clauses, date parsing, the split of a
2
+ filter into what Affinity's search can answer, and the ``--filter`` text conversion.
3
+
4
+ Private package: not part of the public SDK API.
5
+ """
@@ -1,7 +1,7 @@
1
1
  """Relative date parsing for query WHERE clauses.
2
2
 
3
3
  This module provides parsing for relative date strings like "-30d", "today", etc.
4
- It is CLI-only and NOT part of the public SDK API.
4
+ Private module: not part of the public SDK API (the CLI and the SDK share it).
5
5
  """
6
6
 
7
7
  from __future__ import annotations
@@ -113,17 +113,31 @@ def parse_date_value(value: str) -> datetime | None:
113
113
  pass
114
114
 
115
115
  # Try ISO date
116
- if ISO_DATE_PATTERN.match(value):
117
- try:
118
- # Handle with and without time component
119
- if "T" in value:
120
- return datetime.fromisoformat(value.replace("Z", "+00:00"))
121
- else:
122
- return datetime.fromisoformat(value)
123
- except ValueError:
124
- pass
125
-
126
- return None
116
+ return parse_iso_datetime(value)
117
+
118
+
119
+ _FRACTION = re.compile(r"(\.\d+)")
120
+
121
+
122
+ def parse_iso_datetime(value: object) -> datetime | None:
123
+ """An ISO 8601 date or date-time (``YYYY-MM-DD``, ``...THH:MM:SS[.fraction][Z|±HH:MM]``) as a
124
+ datetime, or ``None``. Tolerant of what Python 3.10's ``fromisoformat`` rejects: ``Z`` and
125
+ fractions that aren't 3 or 6 digits."""
126
+ if not isinstance(value, str) or not ISO_DATE_PATTERN.match(value.strip()):
127
+ return None
128
+ text = value.strip()
129
+ if text.endswith(("Z", "z")):
130
+ text = text[:-1] + "+00:00"
131
+ text = _FRACTION.sub(lambda m: (m.group(1) + "000000")[:7], text, count=1)
132
+ try:
133
+ return datetime.fromisoformat(text)
134
+ except ValueError:
135
+ return None
136
+
137
+
138
+ def as_utc(value: datetime) -> datetime:
139
+ """``value`` with a time zone: naive values are taken as UTC."""
140
+ return value if value.tzinfo is not None else value.replace(tzinfo=timezone.utc)
127
141
 
128
142
 
129
143
  def days_since(date: datetime, *, now: datetime | None = None) -> int:
@@ -0,0 +1,52 @@
1
+ """The ``--filter`` text language as a query WHERE clause.
2
+
3
+ ``--filter 'Status = "Won" & Amount > 5'`` and the JSON ``where`` of ``query`` are one filter
4
+ language written two ways; this turns the first into the second, so both go through the same
5
+ server-side split (:mod:`.pushdown`). The text filter still runs locally exactly as before.
6
+
7
+ Private module: not part of the public SDK API (the CLI and the SDK share it).
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from ..compare import map_operator
13
+ from ..filters import (
14
+ AndExpression,
15
+ FieldComparison,
16
+ FilterExpression,
17
+ NotExpression,
18
+ OrExpression,
19
+ RawToken,
20
+ )
21
+ from .where import WhereClause
22
+
23
+ # Row-level keys a list entry filter sees besides its fields (they aren't list fields).
24
+ ROW_KEYS = frozenset(
25
+ {"name", "domain", "primary_email", "listEntryId", "entityId", "entityName", "entityType"}
26
+ )
27
+
28
+
29
+ def where_from_filter(expr: FilterExpression, row_keys: frozenset[str] = ROW_KEYS) -> WhereClause:
30
+ """The WHERE clause for a parsed ``--filter`` expression: field names become
31
+ ``fields.<name>`` paths; ``row_keys`` (attributes such as ``entityName``) keep their own
32
+ path. The default keys are a list entry's."""
33
+ if isinstance(expr, AndExpression):
34
+ return WhereClause(
35
+ and_=[where_from_filter(expr.left, row_keys), where_from_filter(expr.right, row_keys)]
36
+ )
37
+ if isinstance(expr, OrExpression):
38
+ return WhereClause(
39
+ or_=[where_from_filter(expr.left, row_keys), where_from_filter(expr.right, row_keys)]
40
+ )
41
+ if isinstance(expr, NotExpression):
42
+ return WhereClause(not_=where_from_filter(expr.expr, row_keys))
43
+ if isinstance(expr, FieldComparison):
44
+ name = expr.field_name
45
+ path = name if name in row_keys else f"fields.{name}"
46
+ if isinstance(expr.value, RawToken) and expr.value.token == "*":
47
+ # `field = *` is "has a value"; `field != *` is "no value"
48
+ op = "is_not_null" if expr.operator == "=" else "is_null"
49
+ return WhereClause(path=path, op=op)
50
+ return WhereClause(path=path, op=map_operator(expr.operator), value=expr.value)
51
+ # Raw filter strings can't be analysed: keep them local
52
+ return WhereClause(path=None, op=None)