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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (664) hide show
  1. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/CHANGELOG.md +30 -0
  2. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/PKG-INFO +1 -1
  3. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_entity_files_read.py +5 -8
  4. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/note_cmds.py +3 -2
  5. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/org_read_cmds.py +3 -3
  6. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/secondary.py +5 -5
  7. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/v1_only.py +81 -101
  8. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/examples.md +1 -1
  9. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/api-versions-and-routing.md +2 -1
  10. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/migrating-to-2.md +7 -5
  11. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/api-coverage.md +8 -8
  12. affinity_sdk-2.0.1/docs/public/reference/services/v1/files.md +8 -0
  13. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/v1/notes.md +1 -1
  14. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.registry/commands.generated.json +2 -2
  15. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/CHANGELOG.md +2 -0
  16. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/affinity-sdk/.claude-plugin/plugin.json +1 -1
  17. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/SKILL.md +2 -2
  18. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/affinity-sdk/.claude-plugin/skills/affinity-python-sdk/references/services.md +3 -3
  19. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/pyproject.toml +1 -1
  20. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_file_url.py +7 -0
  21. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_files_read.py +20 -20
  22. affinity_sdk-2.0.1/tests/test_files_v2.py +172 -0
  23. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_notes_v2.py +5 -5
  24. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_v1_only_async.py +0 -2
  25. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_v1_only_services_additional_coverage.py +0 -2
  26. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/api_coverage.json +8 -8
  27. affinity_sdk-2.0.0/docs/public/reference/services/v1/files.md +0 -8
  28. affinity_sdk-2.0.0/tests/test_files_v2.py +0 -111
  29. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.claude-plugin/marketplace.json +0 -0
  30. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.cursor/rules/test-data-privacy.mdc +0 -0
  31. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.editorconfig +0 -0
  32. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.env.example +0 -0
  33. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.gitattributes +0 -0
  34. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/CODEOWNERS +0 -0
  35. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  36. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  37. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/PULL_REQUEST_TEMPLATE/cli_command.md +0 -0
  38. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/PULL_REQUEST_TEMPLATE/release.md +0 -0
  39. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/dependabot.yml +0 -0
  40. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/labels.yml +0 -0
  41. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/mcp-release-install-footer.md +0 -0
  42. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/pull_request_template.md +0 -0
  43. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/release-install-footer.md +0 -0
  44. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/ci.yml +0 -0
  45. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/cowork-replay.yml +0 -0
  46. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/docs.yml +0 -0
  47. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/labels.yml +0 -0
  48. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/linkcheck.yml +0 -0
  49. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/openapi-validation.yml +0 -0
  50. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/plugin-build.yml +0 -0
  51. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/plugin-release.yml +0 -0
  52. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/release-detect.yml +0 -0
  53. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/release.yml +0 -0
  54. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.github/workflows/version-check.yml +0 -0
  55. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.gitignore +0 -0
  56. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/.pre-commit-config.yaml +0 -0
  57. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/AGENTS.md +0 -0
  58. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/CODE_OF_CONDUCT.md +0 -0
  59. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/CONTRIBUTING.md +0 -0
  60. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/LICENSE +0 -0
  61. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/README.md +0 -0
  62. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/SECURITY.md +0 -0
  63. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/VERSIONING.md +0 -0
  64. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/__init__.py +0 -0
  65. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/_internal/__init__.py +0 -0
  66. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/_internal/keyfile.py +0 -0
  67. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/api_versions.py +0 -0
  68. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/__init__.py +0 -0
  69. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/__main__.py +0 -0
  70. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/_update_worker.py +0 -0
  71. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/click_compat.py +0 -0
  72. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/__init__.py +0 -0
  73. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_entity_field.py +0 -0
  74. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_entity_files_dump.py +0 -0
  75. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_entity_files_upload.py +0 -0
  76. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_list_entry_fields.py +0 -0
  77. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_org_reads.py +0 -0
  78. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_search_common.py +0 -0
  79. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/_v1_parsing.py +0 -0
  80. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/company_cmds.py +0 -0
  81. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/completion_cmd.py +0 -0
  82. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/config_cmds.py +0 -0
  83. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/entry_cmds.py +0 -0
  84. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/field_cmds.py +0 -0
  85. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/file_cmds.py +0 -0
  86. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/file_url_cmd.py +0 -0
  87. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/interaction_cmds.py +0 -0
  88. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/list_cmds.py +0 -0
  89. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/opportunity_cmds.py +0 -0
  90. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/person_cmds.py +0 -0
  91. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/query_cmd.py +0 -0
  92. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/relationship_strength_cmds.py +0 -0
  93. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/reminder_cmds.py +0 -0
  94. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/resolve_url_cmd.py +0 -0
  95. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/session_cmds.py +0 -0
  96. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/task_cmds.py +0 -0
  97. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/transcript_cmds.py +0 -0
  98. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/version_cmd.py +0 -0
  99. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/webhook_cmds.py +0 -0
  100. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/commands/whoami_cmd.py +0 -0
  101. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/config.py +0 -0
  102. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/confirm.py +0 -0
  103. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/constants.py +0 -0
  104. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/context.py +0 -0
  105. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/csv_utils.py +0 -0
  106. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/date_utils.py +0 -0
  107. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/decorators.py +0 -0
  108. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/errors.py +0 -0
  109. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/field_utils.py +0 -0
  110. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/formatters.py +0 -0
  111. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/help_json.py +0 -0
  112. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/interaction_utils.py +0 -0
  113. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/logging.py +0 -0
  114. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/main.py +0 -0
  115. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/mcp_limits.py +0 -0
  116. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/options.py +0 -0
  117. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/paths.py +0 -0
  118. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/progress.py +0 -0
  119. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/__init__.py +0 -0
  120. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/aggregates.py +0 -0
  121. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/cursor.py +0 -0
  122. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/dates.py +0 -0
  123. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/exceptions.py +0 -0
  124. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/executor.py +0 -0
  125. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/filters.py +0 -0
  126. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/models.py +0 -0
  127. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/output.py +0 -0
  128. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/parser.py +0 -0
  129. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/planner.py +0 -0
  130. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/progress.py +0 -0
  131. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/query/schema.py +0 -0
  132. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/render.py +0 -0
  133. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/resolve.py +0 -0
  134. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/resolvers.py +0 -0
  135. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/results.py +0 -0
  136. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/runner.py +0 -0
  137. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/serialization.py +0 -0
  138. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/session_cache.py +0 -0
  139. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/types.py +0 -0
  140. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/cli/update_check.py +0 -0
  141. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/client.py +0 -0
  142. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/clients/__init__.py +0 -0
  143. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/clients/http.py +0 -0
  144. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/clients/pipeline.py +0 -0
  145. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/compare.py +0 -0
  146. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/downloads.py +0 -0
  147. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/exceptions.py +0 -0
  148. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/field_resolve_utils.py +0 -0
  149. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/field_resolver.py +0 -0
  150. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/filters.py +0 -0
  151. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/hooks.py +0 -0
  152. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/inbound_webhooks.py +0 -0
  153. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/__init__.py +0 -0
  154. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/entities.py +0 -0
  155. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/interactions_v2.py +0 -0
  156. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/pagination.py +0 -0
  157. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/rate_limit_snapshot.py +0 -0
  158. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/relationships_v2.py +0 -0
  159. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/search.py +0 -0
  160. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/transcripts.py +0 -0
  161. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/models/types.py +0 -0
  162. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/policies.py +0 -0
  163. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/progress.py +0 -0
  164. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/py.typed +0 -0
  165. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/__init__.py +0 -0
  166. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/_dropdown_options.py +0 -0
  167. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/_field_listing.py +0 -0
  168. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/_field_updates.py +0 -0
  169. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/_note_html.py +0 -0
  170. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/_org_reads.py +0 -0
  171. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/_v2_filters.py +0 -0
  172. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/companies.py +0 -0
  173. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/lists.py +0 -0
  174. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/opportunities.py +0 -0
  175. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/persons.py +0 -0
  176. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/rate_limits.py +0 -0
  177. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/reminders.py +0 -0
  178. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/search.py +0 -0
  179. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/tasks.py +0 -0
  180. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/transcripts.py +0 -0
  181. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/services/webhooks.py +0 -0
  182. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/affinity/types.py +0 -0
  183. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/codecov.yml +0 -0
  184. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/cli-development-guide.md +0 -0
  185. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/ai-integrations/index.md +0 -0
  186. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/changelog.md +0 -0
  187. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/cli/commands.md +0 -0
  188. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/cli/index.md +0 -0
  189. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/cli/scripting.md +0 -0
  190. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/cli-reference.md +0 -0
  191. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/getting-started.md +0 -0
  192. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/glossary.md +0 -0
  193. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/affinity-official-mcp-comparison.md +0 -0
  194. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/api-versions.md +0 -0
  195. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/authentication.md +0 -0
  196. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/claude-code-plugins.md +0 -0
  197. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/configuration.md +0 -0
  198. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/csv-export.md +0 -0
  199. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/datetime-handling.md +0 -0
  200. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/debugging-hooks.md +0 -0
  201. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/errors-and-retries.md +0 -0
  202. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/field-types-and-values.md +0 -0
  203. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/field-values.md +0 -0
  204. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/filtering.md +0 -0
  205. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/ids-and-types.md +0 -0
  206. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/models.md +0 -0
  207. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/opportunity-associations.md +0 -0
  208. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/pagination.md +0 -0
  209. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/performance.md +0 -0
  210. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/query-command.md +0 -0
  211. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/rate-limits.md +0 -0
  212. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/sync-vs-async.md +0 -0
  213. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/guides/webhooks.md +0 -0
  214. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/index.md +0 -0
  215. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/mcp/index.md +0 -0
  216. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/client.md +0 -0
  217. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/exceptions.md +0 -0
  218. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/filters.md +0 -0
  219. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/models.md +0 -0
  220. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/query-language.md +0 -0
  221. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/companies.md +0 -0
  222. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/lists.md +0 -0
  223. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/opportunities.md +0 -0
  224. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/persons.md +0 -0
  225. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/reminders.md +0 -0
  226. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/tasks.md +0 -0
  227. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/v1/auth.md +0 -0
  228. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/v1/field-values.md +0 -0
  229. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/v1/fields.md +0 -0
  230. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/v1/interactions.md +0 -0
  231. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/v1/relationships.md +0 -0
  232. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/services/webhooks.md +0 -0
  233. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/reference/types.md +0 -0
  234. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/docs/public/troubleshooting.md +0 -0
  235. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/advanced_usage.py +0 -0
  236. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/async_lifecycle.py +0 -0
  237. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/basic_usage.py +0 -0
  238. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/filter_builder.py +0 -0
  239. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/hooks_debugging.py +0 -0
  240. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/list_management.py +0 -0
  241. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/resolve_helpers.py +0 -0
  242. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/examples/task_polling.py +0 -0
  243. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/.gitignore +0 -0
  244. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/plugin.json +0 -0
  245. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/skills/affinity-mcp-workflows/SKILL.md +0 -0
  246. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/skills/pipeline-history/SKILL.md +0 -0
  247. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/skills/query-language/SKILL.md +0 -0
  248. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/skills/query-language/references/filter-operators.md +0 -0
  249. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/skills/query-language/references/include-expand.md +0 -0
  250. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/skills/query-language/references/output-formats.md +0 -0
  251. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/skills/query-language/references/quantifiers.md +0 -0
  252. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.claude-plugin/xaffinity-mcp.sh +0 -0
  253. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.gitignore +0 -0
  254. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/VERSION +0 -0
  255. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/bin/mcp-bash +0 -0
  256. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/completion.sh +0 -0
  257. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/lifecycle.sh +0 -0
  258. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/logging.sh +0 -0
  259. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/ping.sh +0 -0
  260. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/prompts.sh +0 -0
  261. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/resources.sh +0 -0
  262. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/roots.sh +0 -0
  263. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/handlers/tools.sh +0 -0
  264. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/auth.sh +0 -0
  265. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/capabilities.sh +0 -0
  266. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/cli/common.sh +0 -0
  267. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/cli/health.sh +0 -0
  268. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/completion.sh +0 -0
  269. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/core.sh +0 -0
  270. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/elicitation.sh +0 -0
  271. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/file_read.sh +0 -0
  272. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/handler_helpers.sh +0 -0
  273. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/hash.sh +0 -0
  274. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/ids.sh +0 -0
  275. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/io.sh +0 -0
  276. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/json.sh +0 -0
  277. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/lock.sh +0 -0
  278. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/logging.sh +0 -0
  279. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/meta_env.sh +0 -0
  280. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/paginate.sh +0 -0
  281. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/path.sh +0 -0
  282. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/policy.sh +0 -0
  283. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/progress-passthrough.sh +0 -0
  284. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/progress.sh +0 -0
  285. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/prompts.sh +0 -0
  286. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/registry.sh +0 -0
  287. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/require.sh +0 -0
  288. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/resource_content.sh +0 -0
  289. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/resource_match.sh +0 -0
  290. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/resource_providers.sh +0 -0
  291. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/resources.sh +0 -0
  292. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/roots.sh +0 -0
  293. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/rpc.sh +0 -0
  294. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/runtime.sh +0 -0
  295. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/spec.sh +0 -0
  296. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/timeout.sh +0 -0
  297. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/tools.sh +0 -0
  298. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/tools_policy.sh +0 -0
  299. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/ui-templates.sh +0 -0
  300. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/ui.sh +0 -0
  301. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/uri.sh +0 -0
  302. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/lib/validate.sh +0 -0
  303. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/providers/echo.sh +0 -0
  304. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/providers/file.sh +0 -0
  305. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/providers/git.sh +0 -0
  306. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/providers/https.sh +0 -0
  307. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/providers/ui.sh +0 -0
  308. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/sdk/tool-error.sh +0 -0
  309. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/sdk/tool-sdk.sh +0 -0
  310. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/sdk/ui-sdk.sh +0 -0
  311. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.mcp-bash/vendor.json +0 -0
  312. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.registry/mcp-commands.json +0 -0
  313. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.registry/prompts.json +0 -0
  314. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.registry/resource-templates.json +0 -0
  315. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.registry/resources.json +0 -0
  316. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/.registry/ui-resources.json +0 -0
  317. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/COMPATIBILITY +0 -0
  318. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/Makefile +0 -0
  319. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/README.md +0 -0
  320. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/VERSION +0 -0
  321. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/completions/entity-name.sh +0 -0
  322. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/completions/list-name.sh +0 -0
  323. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/completions/status-value.sh +0 -0
  324. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/docs/DEBUGGING.md +0 -0
  325. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/icon.svg +0 -0
  326. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/lib/cache.sh +0 -0
  327. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/lib/cli-detect.sh +0 -0
  328. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/lib/cli-gateway.sh +0 -0
  329. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/lib/common.sh +0 -0
  330. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/lib/entity-types.sh +0 -0
  331. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/lib/field-resolution.sh +0 -0
  332. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/mcp-bash.lock +0 -0
  333. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/mcp-publisher.lock +0 -0
  334. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/mcpb.conf +0 -0
  335. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/change-status/change-status.completion.sh +0 -0
  336. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/change-status/change-status.meta.json +0 -0
  337. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/change-status/change-status.txt +0 -0
  338. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/interaction-brief/interaction-brief.meta.json +0 -0
  339. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/interaction-brief/interaction-brief.txt +0 -0
  340. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/log-call/log-call.meta.json +0 -0
  341. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/log-call/log-call.txt +0 -0
  342. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.meta.json +0 -0
  343. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/log-interaction-and-update-workflow/log-interaction-and-update-workflow.txt +0 -0
  344. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/log-message/log-message.meta.json +0 -0
  345. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/log-message/log-message.txt +0 -0
  346. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/pipeline-review/pipeline-review.completion.sh +0 -0
  347. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/pipeline-review/pipeline-review.meta.json +0 -0
  348. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/pipeline-review/pipeline-review.txt +0 -0
  349. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/prepare-briefing/prepare-briefing.meta.json +0 -0
  350. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/prepare-briefing/prepare-briefing.txt +0 -0
  351. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/warm-intro/warm-intro.meta.json +0 -0
  352. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/prompts/warm-intro/warm-intro.txt +0 -0
  353. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/providers/xaffinity.sh +0 -0
  354. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/data-model/data-model.md +0 -0
  355. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/data-model/data-model.meta.json +0 -0
  356. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/field-catalogs/field-catalogs.meta.json +0 -0
  357. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/field-catalogs/field-catalogs.sh +0 -0
  358. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/interaction-enums/interaction-enums.json +0 -0
  359. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/interaction-enums/interaction-enums.meta.json +0 -0
  360. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/me/me.meta.json +0 -0
  361. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/me/me.sh +0 -0
  362. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/me-person-id/me-person-id.meta.json +0 -0
  363. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/me-person-id/me-person-id.sh +0 -0
  364. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/query-guide/query-guide.meta.json +0 -0
  365. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/query-guide/query-guide.sh +0 -0
  366. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/saved-views/saved-views.meta.json +0 -0
  367. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/saved-views/saved-views.sh +0 -0
  368. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/workflow-config/workflow-config.meta.json +0 -0
  369. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/workflow-config/workflow-config.sh +0 -0
  370. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/workflows-guide/workflows-guide.meta.json +0 -0
  371. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/workflows-guide/workflows-guide.sh +0 -0
  372. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/xaffinity-field-catalogs.completion.sh +0 -0
  373. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/xaffinity-saved-views.completion.sh +0 -0
  374. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/resources/xaffinity-workflow-config.completion.sh +0 -0
  375. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/server.d/env.sh +0 -0
  376. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/server.d/health-checks.sh +0 -0
  377. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/server.d/policy.sh +0 -0
  378. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/server.d/requirements.json +0 -0
  379. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/server.d/server.meta.json +0 -0
  380. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/server.json +0 -0
  381. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/test/README.md +0 -0
  382. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/test/run.sh +0 -0
  383. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/test/test_env_update_check.sh +0 -0
  384. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/test-progress.sh +0 -0
  385. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/discover-commands/tool.meta.json +0 -0
  386. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/discover-commands/tool.sh +0 -0
  387. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/execute-read-command/tool.meta.json +0 -0
  388. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/execute-read-command/tool.sh +0 -0
  389. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/execute-write-command/tool.meta.json +0 -0
  390. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/execute-write-command/tool.sh +0 -0
  391. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/get-entity-dossier/tool.meta.json +0 -0
  392. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/get-entity-dossier/tool.sh +0 -0
  393. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/get-file-url/tool.meta.json +0 -0
  394. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/get-file-url/tool.sh +0 -0
  395. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/query/tool.meta.json +0 -0
  396. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/query/tool.sh +0 -0
  397. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/read-xaffinity-resource/tool.meta.json +0 -0
  398. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/tools/read-xaffinity-resource/tool.sh +0 -0
  399. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/user-config.json +0 -0
  400. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/xaffinity-mcp-env.sh +0 -0
  401. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mcp/xaffinity-mcp.sh +0 -0
  402. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/mkdocs.yml +0 -0
  403. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/.claude-plugin/plugin.json +0 -0
  404. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/hooks/guard-env-read.sh +0 -0
  405. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/hooks/hooks.json +0 -0
  406. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/hooks/pre-xaffinity.sh +0 -0
  407. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/hooks/session-setup.sh +0 -0
  408. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/SKILL.md +0 -0
  409. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/files-and-writes.md +0 -0
  410. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/filtering.md +0 -0
  411. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/history-and-activity.md +0 -0
  412. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/interactions.md +0 -0
  413. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/query-guide.md +0 -0
  414. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/plugins/xaffinity-cli/skills/xaffinity-cli-usage/references/setup.md +0 -0
  415. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/query/test_cursor.py +0 -0
  416. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_company_create_dedup.py +0 -0
  417. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_company_ls_filter_rejection.py +0 -0
  418. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_formatters.py +0 -0
  419. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_output_formats_integration.py +0 -0
  420. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_person_create_dedup.py +0 -0
  421. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_person_ls_filter_rejection.py +0 -0
  422. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_query_filter_rejection.py +0 -0
  423. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_query_list_entry_relationships.py +0 -0
  424. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_query_list_export_parity.py +0 -0
  425. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_query_output_flattening.py +0 -0
  426. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_query_output_truncation.py +0 -0
  427. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cli/test_query_unreplied.py +0 -0
  428. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/conftest.py +0 -0
  429. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/.cowork-redact.json +0 -0
  430. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/README.md +0 -0
  431. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/cassettes/company-lists-status.cassette.json +0 -0
  432. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/cassettes/hook-blocks-without-key.cassette.json +0 -0
  433. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/cassettes/no-key-skill-path.cassette.json +0 -0
  434. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/cassettes/status-history.cassette.json +0 -0
  435. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/fixtures/workdir-key/README.txt +0 -0
  436. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/fixtures/workdir-key/xaffinity-test-key +0 -0
  437. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/fixtures/workdir-nokey/README.txt +0 -0
  438. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/image/Dockerfile +0 -0
  439. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/image/fakeaff/build_fixtures.py +0 -0
  440. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/image/fakeaff/fixtures.json +0 -0
  441. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/image/fakeaff/server.py +0 -0
  442. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/image/xaffinity-wrapper.sh +0 -0
  443. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/privacy-allow.txt +0 -0
  444. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/record.sh +0 -0
  445. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/scenarios/company-lists-status.yaml +0 -0
  446. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/scenarios/hook-blocks-without-key.yaml +0 -0
  447. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/scenarios/no-key-skill-path.yaml +0 -0
  448. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/scenarios/status-history.yaml +0 -0
  449. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/sessions/no-key.yaml +0 -0
  450. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/cowork/sessions/with-key.yaml +0 -0
  451. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/field_write_mocks.py +0 -0
  452. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/fixtures/openapi/mini_openapi.json +0 -0
  453. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/fixtures/webhooks/field_value_updated.json +0 -0
  454. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/fixtures/webhooks/list_entry_created.json +0 -0
  455. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/fixtures/webhooks/organization_created.json +0 -0
  456. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/fixtures/webhooks/organization_merged.json +0 -0
  457. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/fixtures/webhooks/person_created.json +0 -0
  458. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/fixtures/webhooks/unknown_event.json +0 -0
  459. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/README.md +0 -0
  460. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/conftest.py +0 -0
  461. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/setup_query_parity_data.py +0 -0
  462. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/test_cli_writes.py +0 -0
  463. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/test_query_parity_integration.py +0 -0
  464. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/test_sdk_reads.py +0 -0
  465. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/test_sdk_writes.py +0 -0
  466. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/integration/test_sdk_writes_runner.py +0 -0
  467. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/mcp/__init__.py +0 -0
  468. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/mcp/test_query_cursor.py +0 -0
  469. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/skill-evals/xaffinity-cli-usage-evals/evals.json +0 -0
  470. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/spec_guard.py +0 -0
  471. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_affinity_client_wrapper_additional_coverage.py +0 -0
  472. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_api_coverage.py +0 -0
  473. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_api_key_file_formats.py +0 -0
  474. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_api_key_resolution.py +0 -0
  475. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_api_version.py +0 -0
  476. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_api_version_per_operation.py +0 -0
  477. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_async_file_download_streaming.py +0 -0
  478. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_batch_get.py +0 -0
  479. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_api_version.py +0 -0
  480. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_column_limiting.py +0 -0
  481. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_command_context.py +0 -0
  482. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_company_cmds_coverage.py +0 -0
  483. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_company_get.py +0 -0
  484. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_config_cmds.py +0 -0
  485. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_context_coverage.py +0 -0
  486. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_csv_export.py +0 -0
  487. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_date_params.py +0 -0
  488. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_date_utils.py +0 -0
  489. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_datetime_formatting.py +0 -0
  490. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_datetime_header_offsets.py +0 -0
  491. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_domain_linkification.py +0 -0
  492. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_dotenv_resolution.py +0 -0
  493. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_dropdown_field_writes.py +0 -0
  494. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_enriched_field_writes.py +0 -0
  495. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_entity_field_writes.py +0 -0
  496. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_entity_files_dump.py +0 -0
  497. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_entry_field.py +0 -0
  498. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_entry_field_batch_writes.py +0 -0
  499. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_entry_field_multi_value_limits.py +0 -0
  500. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_error_hints.py +0 -0
  501. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_error_rendering.py +0 -0
  502. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_field_history.py +0 -0
  503. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_field_history_bulk.py +0 -0
  504. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_field_options_and_transcripts.py +0 -0
  505. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_field_utils.py +0 -0
  506. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_field_utils_coverage.py +0 -0
  507. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_field_utils_set_phase.py +0 -0
  508. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_field_value_humanization.py +0 -0
  509. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_files_ls.py +0 -0
  510. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_get_interaction_dates.py +0 -0
  511. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_help_json.py +0 -0
  512. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_interaction_date_chunking.py +0 -0
  513. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_interaction_utils.py +0 -0
  514. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_json_safety.py +0 -0
  515. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_list_cmds_coverage.py +0 -0
  516. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_list_expand_interactions.py +0 -0
  517. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_list_export_entity_scope.py +0 -0
  518. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_list_export_field_refresh.py +0 -0
  519. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_list_export_filter_safety.py +0 -0
  520. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_list_export_truncation_meta.py +0 -0
  521. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_missing_coverage.py +0 -0
  522. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_multi_value_truncation_warnings.py +0 -0
  523. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_no_network_commands.py +0 -0
  524. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_notes_writes.py +0 -0
  525. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_opportunity_cmds.py +0 -0
  526. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_opportunity_cmds_coverage.py +0 -0
  527. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_pager_logic.py +0 -0
  528. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_person_cmds_coverage.py +0 -0
  529. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_person_get.py +0 -0
  530. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_plugin_manifest.py +0 -0
  531. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_pre_xaffinity_hook.py +0 -0
  532. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_progress_manager.py +0 -0
  533. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_aggregates.py +0 -0
  534. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_cmd.py +0 -0
  535. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_cmd_coverage.py +0 -0
  536. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_dates.py +0 -0
  537. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_executor.py +0 -0
  538. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_expand_interactions.py +0 -0
  539. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_filters.py +0 -0
  540. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_integration.py +0 -0
  541. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_parser.py +0 -0
  542. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_planner.py +0 -0
  543. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_safety.py +0 -0
  544. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_query_schema.py +0 -0
  545. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_rate_limit_rendering.py +0 -0
  546. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_rate_limit_throttle.py +0 -0
  547. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_reminders.py +0 -0
  548. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_render_coverage.py +0 -0
  549. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_resolve_coverage.py +0 -0
  550. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_resolve_url_parsing.py +0 -0
  551. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_result_summary.py +0 -0
  552. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_safe_field_writes.py +0 -0
  553. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_search.py +0 -0
  554. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_serialization.py +0 -0
  555. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_session_cache.py +0 -0
  556. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_session_setup_hook.py +0 -0
  557. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_set_phase_atomicity.py +0 -0
  558. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_types.py +0 -0
  559. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_unreplied.py +0 -0
  560. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_update_check.py +0 -0
  561. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_v1_only_cmds.py +0 -0
  562. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_v1_parsing.py +0 -0
  563. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_webhooks.py +0 -0
  564. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_cli_write_ops.py +0 -0
  565. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_client.py +0 -0
  566. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_companies_create_dedup.py +0 -0
  567. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_companies_filter_rejection.py +0 -0
  568. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_compare.py +0 -0
  569. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_env_helpers.py +0 -0
  570. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_exceptions_coverage.py +0 -0
  571. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_field_resolver.py +0 -0
  572. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_field_service_caching.py +0 -0
  573. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_field_types_c4.py +0 -0
  574. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_field_value_type.py +0 -0
  575. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_field_values_get_value.py +0 -0
  576. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_file_batch_get.py +0 -0
  577. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_file_download_streaming.py +0 -0
  578. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_file_list_batch.py +0 -0
  579. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_file_upload_helpers_and_validation.py +0 -0
  580. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_files_upload_returning_files.py +0 -0
  581. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_filters.py +0 -0
  582. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_generate_mcp_command_registry.py +0 -0
  583. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_get_fields_filter_includes.py +0 -0
  584. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_get_fields_pagination.py +0 -0
  585. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_get_first.py +0 -0
  586. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_hidden_field_values.py +0 -0
  587. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_hooks.py +0 -0
  588. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_http_client_additional_coverage.py +0 -0
  589. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_http_client_remaining_coverage.py +0 -0
  590. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_inbound_webhooks.py +0 -0
  591. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_integration_smoke.py +0 -0
  592. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_interaction_date_validation.py +0 -0
  593. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_interactions_and_files_regressions.py +0 -0
  594. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_isodatetime.py +0 -0
  595. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_list_entry_membership_and_opportunities.py +0 -0
  596. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_list_term.py +0 -0
  597. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_lists_v2_writes.py +0 -0
  598. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_bundle_env_and_completions.py +0 -0
  599. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_cli_version_check.py +0 -0
  600. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_entity_dossier.py +0 -0
  601. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_gateway_limits.py +0 -0
  602. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_history_bulk_gateway.py +0 -0
  603. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_limits.py +0 -0
  604. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_query_cli_error.py +0 -0
  605. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_read_truncation.py +0 -0
  606. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_mcp_resource_scripts.py +0 -0
  607. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_models.py +0 -0
  608. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_models_v2_2026_fields.py +0 -0
  609. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_multi_value_limits.py +0 -0
  610. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_new_features.py +0 -0
  611. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_notes_v2_writes.py +0 -0
  612. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_opportunities_filter_rejection.py +0 -0
  613. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_org_reads.py +0 -0
  614. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_pagination_iterators.py +0 -0
  615. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_persons_create_dedup.py +0 -0
  616. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_persons_filter_rejection.py +0 -0
  617. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_public_api.py +0 -0
  618. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_rate_limit_v2.py +0 -0
  619. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_raw_pipeline_hook_events.py +0 -0
  620. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_readonly_factory.py +0 -0
  621. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_reminder_list_batch.py +0 -0
  622. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_reminders_v2.py +0 -0
  623. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_requirements_additional.py +0 -0
  624. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_sdk_interaction_dates.py +0 -0
  625. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_search.py +0 -0
  626. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_service_get_parameter_combinations.py +0 -0
  627. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_companies_coverage_gaps.py +0 -0
  628. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_dropdown_options.py +0 -0
  629. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_entity_field_updates.py +0 -0
  630. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_field_value_changes.py +0 -0
  631. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_list_entries_filter_paths.py +0 -0
  632. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_lists_additional_coverage.py +0 -0
  633. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_lists_coverage_gaps.py +0 -0
  634. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_opportunities_additional_coverage.py +0 -0
  635. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_opportunities_coverage_gaps.py +0 -0
  636. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_opportunities_tasks_additional_coverage.py +0 -0
  637. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_persons_companies_additional_coverage.py +0 -0
  638. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_rate_limits_coverage_gaps.py +0 -0
  639. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_services_v1_only_coverage_gaps.py +0 -0
  640. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_small_modules_coverage.py +0 -0
  641. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_spec_guard.py +0 -0
  642. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_transport_and_readonly_mode.py +0 -0
  643. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_v1_association_parsing.py +0 -0
  644. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_v1_only_services_more_coverage.py +0 -0
  645. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_v2_request_bodies.py +0 -0
  646. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_validate_openapi_tool.py +0 -0
  647. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/test_webhooks_v2.py +0 -0
  648. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/unit/__init__.py +0 -0
  649. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tests/unit/test_exceptions.py +0 -0
  650. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/__init__.py +0 -0
  651. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/api_coverage.py +0 -0
  652. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/api_coverage_v1_snapshot.json +0 -0
  653. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/check_cli_patterns.py +0 -0
  654. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/generate_mcp_command_registry.py +0 -0
  655. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/generate_release_notes.py +0 -0
  656. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/generate_requirements_mapping.py +0 -0
  657. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/openapi_snapshots/2024-01-01.json +0 -0
  658. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/openapi_snapshots/2026-07-15.json +0 -0
  659. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/openapi_snapshots/2026-09-17.json +0 -0
  660. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/sync_mcp_bundle_env.py +0 -0
  661. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/sync_mcp_registry.py +0 -0
  662. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/sync_mcp_version.py +0 -0
  663. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/validate_mcp_registry_metadata.py +0 -0
  664. {affinity_sdk-2.0.0 → affinity_sdk-2.0.1}/tools/validate_openapi_models.py +0 -0
@@ -7,6 +7,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.0.1] - 2026-10-12
11
+
12
+ ### Changed (breaking)
13
+
14
+ **Exception to semantic versioning:** these renames break code written against 2.0.0, in a
15
+ patch release. 2.0.0 had been out for under an hour, and the renames remove method names that
16
+ said which Affinity API they used instead of what they do.
17
+
18
+ - `notes.list_v2()` / `iter_v2()` → **`notes.feed()` / `iter_feed()`** (every note across the
19
+ organization; the CLI's `note feed`).
20
+ - `notes.get_v2()` → **`notes.get()`**, which now returns `NoteV2` (`includes=True` adds the
21
+ attached companies, persons and opportunities). The V1 `notes.get()` (returning `Note`) is
22
+ removed; `notes.list()` (one entity's notes, V1) is unchanged.
23
+ - `files.list_v2()` / `iter_v2()` → **`files.feed()` / `iter_feed()`** (every file you can see,
24
+ newest first).
25
+ - `files.get_v2()` is removed. **`files.get_download_url()`** now asks V2 first: one request
26
+ for the details and a signed URL (valid 60 seconds) instead of V1's two. It falls back to
27
+ V1 when the client is pinned to an API version older than 2026-09-17, or when V2 refuses or
28
+ doesn't find the file; the result (`PresignedUrl`) is the same either way. `files.get()`
29
+ stays on V1 (`EntityFile`, with the file's person, company or opportunity) and works under
30
+ any version pin.
31
+ - CLI `note get` reads the note from V2: same output keys, `content` is the stored HTML (as in
32
+ `note create`/`update` output), and the attachment ids come from V2.
33
+ - CLI `files read` and `file-url` get the file's details and URL in one request where V2 can
34
+ answer (V1's path otherwise).
35
+
36
+ ### Plugins
37
+
38
+ - **SDK plugin**: 2.0.0 → 2.0.1 — skill: the renamed note methods.
39
+
10
40
  ## [2.0.0] - 2026-10-12
11
41
 
12
42
  ### Highlights
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: affinity-sdk
3
- Version: 2.0.0
3
+ Version: 2.0.1
4
4
  Summary: A modern, strongly-typed Python SDK for the Affinity CRM API
5
5
  Project-URL: Homepage, https://github.com/yaniv-golan/affinity-sdk
6
6
  Project-URL: Documentation, https://yaniv-golan.github.io/affinity-sdk/latest/
@@ -87,9 +87,9 @@ def read_file_content(
87
87
  def fn(ctx: CLIContext, warnings: list[str]) -> CommandOutput:
88
88
  client = ctx.get_client(warnings=warnings)
89
89
 
90
- # Get file metadata
91
- file_meta = client.files.get(FileId(file_id))
92
- file_size = file_meta.size or 0
90
+ # Name, size, type and a signed URL: one V2 request (or V1's two where V2 can't answer)
91
+ presigned = client.files.get_download_url(FileId(file_id))
92
+ file_size = presigned.size or 0
93
93
 
94
94
  # Validate offset
95
95
  if offset < 0:
@@ -107,9 +107,6 @@ def read_file_content(
107
107
  hint=f"File size is {file_size} bytes. Use --offset 0 to start from beginning.",
108
108
  )
109
109
 
110
- # Get presigned URL
111
- presigned = client.files.get_download_url(FileId(file_id))
112
-
113
110
  # Calculate actual bytes to read
114
111
  remaining = file_size - offset
115
112
  bytes_to_read = min(limit, remaining)
@@ -161,9 +158,9 @@ def read_file_content(
161
158
 
162
159
  data = {
163
160
  "fileId": int(file_id),
164
- "name": file_meta.name,
161
+ "name": presigned.name,
165
162
  "size": file_size,
166
- "contentType": file_meta.content_type,
163
+ "contentType": presigned.content_type,
167
164
  "offset": offset,
168
165
  "length": actual_length,
169
166
  "hasMore": has_more,
@@ -432,7 +432,8 @@ def note_get(ctx: CLIContext, note_id: int) -> None:
432
432
 
433
433
  def fn(ctx: CLIContext, warnings: list[str]) -> CommandOutput:
434
434
  client = ctx.get_client(warnings=warnings)
435
- note = client.notes.get(NoteId(note_id))
435
+ note = client.notes.get(NoteId(note_id), includes=True)
436
+ _truncation_warnings(note, warnings)
436
437
 
437
438
  cmd_context = CommandContext(
438
439
  name="note get",
@@ -440,7 +441,7 @@ def note_get(ctx: CLIContext, note_id: int) -> None:
440
441
  modifiers={},
441
442
  )
442
443
 
443
- payload = _note_payload(note)
444
+ payload = _note_v2_payload(note)
444
445
 
445
446
  # For table display, separate content from metadata for better readability
446
447
  if ctx.output != "json":
@@ -486,17 +486,17 @@ def note_feed(
486
486
  "updated_after": _when(updated_after, "--updated-after"),
487
487
  }
488
488
  rows, next_cursor = collect_pages(
489
- (lambda: notes.list_v2(cursor=cursor))
489
+ (lambda: notes.feed(cursor=cursor))
490
490
  if cursor is not None
491
491
  else (
492
- lambda: notes.list_v2(
492
+ lambda: notes.feed(
493
493
  **times,
494
494
  creator_id=creator_id,
495
495
  includes=True if with_attached else None,
496
496
  limit=page_limit(max_results),
497
497
  )
498
498
  ),
499
- lambda c: notes.list_v2(cursor=c),
499
+ lambda c: notes.feed(cursor=c),
500
500
  note_row,
501
501
  max_results=max_results,
502
502
  all_pages=all_pages,
@@ -134,8 +134,8 @@ class NoteV2(AffinityModel):
134
134
  """V2 API note format.
135
135
 
136
136
  ``replies_count`` and the attached ``companies`` / ``persons`` / ``opportunities`` (first ones,
137
- with ``*_total``) are filled only when requested with ``includes`` (``notes.list_v2`` /
138
- ``notes.get_v2``); otherwise they are ``None``.
137
+ with ``*_total``) are filled only when requested with ``includes`` (``notes.feed`` /
138
+ ``notes.get``); otherwise they are ``None``.
139
139
  """
140
140
 
141
141
  id: NoteId
@@ -280,10 +280,10 @@ class OpportunityRef(AffinityModel):
280
280
 
281
281
 
282
282
  class FileV2(AffinityModel):
283
- """A file's metadata from V2 (``files.get_v2``, ``files.list_v2``).
283
+ """A file's metadata from V2 (``files.feed``).
284
284
 
285
- V2 files carry no person/company/opportunity; ``download_url`` (``get_v2`` only) is a signed
286
- URL that expires 60 seconds after the response.
285
+ V2 files carry no person/company/opportunity; ``download_url`` (single-file reads only) is
286
+ a signed URL that expires 60 seconds after the response.
287
287
  """
288
288
 
289
289
  id: FileId
@@ -24,7 +24,12 @@ import httpx
24
24
  from pydantic import AliasChoices, TypeAdapter, ValidationError
25
25
 
26
26
  from ..downloads import AsyncDownloadedFile, DownloadedFile
27
- from ..exceptions import AffinityError
27
+ from ..exceptions import (
28
+ AffinityError,
29
+ ApiVersionTooOldError,
30
+ AuthorizationError,
31
+ NotFoundError,
32
+ )
28
33
  from ..exceptions import ValidationError as AffinityValidationError
29
34
  from ..models.entities import (
30
35
  FieldCreate,
@@ -117,6 +122,26 @@ class PresignedUrl:
117
122
  expires_at: datetime
118
123
 
119
124
 
125
+ def _presigned(
126
+ url: str, file_id: int, name: str, size: int, content_type: str | None
127
+ ) -> PresignedUrl:
128
+ """A ``PresignedUrl``; its lifetime comes from ``X-Amz-Expires`` (60 seconds if absent)."""
129
+ expires_in = 60
130
+ qs = parse_qs(urlparse(url).query)
131
+ if "X-Amz-Expires" in qs:
132
+ with contextlib.suppress(ValueError, IndexError):
133
+ expires_in = int(qs["X-Amz-Expires"][0])
134
+ return PresignedUrl(
135
+ url=url,
136
+ file_id=int(file_id),
137
+ name=name,
138
+ size=size,
139
+ content_type=content_type,
140
+ expires_in=expires_in,
141
+ expires_at=datetime.now(timezone.utc) + timedelta(seconds=expires_in),
142
+ )
143
+
144
+
120
145
  _MAX_INTERACTION_RANGE_DAYS = 365
121
146
 
122
147
 
@@ -345,11 +370,6 @@ class NoteService(NoteSearchMixin):
345
370
  next_page_token=data.get("next_page_token") or data.get("nextPageToken"),
346
371
  )
347
372
 
348
- def get(self, note_id: NoteId) -> Note:
349
- """Get a single note by ID."""
350
- data = self._client.get(f"/notes/{note_id}", v1=True)
351
- return Note.model_validate(data)
352
-
353
373
  def create(self, data: NoteCreate) -> NoteV2:
354
374
  """Create a note (V2) and return it.
355
375
 
@@ -373,11 +393,11 @@ class NoteService(NoteSearchMixin):
373
393
  if data.content is not None:
374
394
  note = None
375
395
  with contextlib.suppress(AffinityError):
376
- note = self.get_v2(note_id)
396
+ note = self.get(note_id)
377
397
  if has_mentions(note):
378
398
  raise mentions_error(exc) from exc
379
399
  raise
380
- return self.get_v2(note_id, includes=True)
400
+ return self.get(note_id, includes=True)
381
401
 
382
402
  def delete(self, note_id: NoteId) -> bool:
383
403
  """Delete a note you created (V2). Deleting a note also deletes its replies."""
@@ -423,7 +443,7 @@ class NoteService(NoteSearchMixin):
423
443
  # V2 notes (read): NoteV2 with creator, HTML content, interaction, transcript
424
444
  # =========================================================================
425
445
 
426
- def list_v2(
446
+ def feed(
427
447
  self,
428
448
  *,
429
449
  creator_id: int | None = None,
@@ -467,7 +487,7 @@ class NoteService(NoteSearchMixin):
467
487
  )
468
488
  return page_of(NoteV2, self._client.get("/notes", params=params or None))
469
489
 
470
- def iter_v2(
490
+ def iter_feed(
471
491
  self,
472
492
  *,
473
493
  creator_id: int | None = None,
@@ -477,12 +497,12 @@ class NoteService(NoteSearchMixin):
477
497
  includes: bool | Sequence[str] | None = None,
478
498
  limit: int | None = None,
479
499
  ) -> Iterator[NoteV2]:
480
- """All notes matching the filters (every page); see :meth:`list_v2`."""
500
+ """All notes matching the filters (every page); see :meth:`feed`."""
481
501
 
482
502
  def fetch_page(next_url: str | None) -> PaginatedResponse[NoteV2]:
483
503
  if next_url:
484
- return self.list_v2(cursor=next_url)
485
- return self.list_v2(
504
+ return self.feed(cursor=next_url)
505
+ return self.feed(
486
506
  creator_id=creator_id,
487
507
  created_after=created_after,
488
508
  created_before=created_before,
@@ -493,8 +513,8 @@ class NoteService(NoteSearchMixin):
493
513
 
494
514
  return PageIterator(fetch_page)
495
515
 
496
- def get_v2(self, note_id: NoteId, *, includes: bool | Sequence[str] | None = None) -> NoteV2:
497
- """One note as ``NoteV2`` (``includes`` as in :meth:`list_v2`)."""
516
+ def get(self, note_id: NoteId, *, includes: bool | Sequence[str] | None = None) -> NoteV2:
517
+ """One note as ``NoteV2`` (``includes`` as in :meth:`feed`)."""
498
518
  params = [("includes", value) for value in note_includes(includes)]
499
519
  return NoteV2.model_validate(
500
520
  self._client.get(f"/notes/{int(note_id)}", params=params or None)
@@ -1852,18 +1872,12 @@ class EntityFileService(FileSearchMixin):
1852
1872
  )
1853
1873
 
1854
1874
  def get(self, file_id: FileId) -> EntityFile:
1855
- """Get file metadata."""
1875
+ """A file's details, including the person, company or opportunity it belongs to (V1;
1876
+ works under any API version). :meth:`get_download_url` adds a download link."""
1856
1877
  data = self._client.get(f"/entity-files/{file_id}", v1=True)
1857
1878
  return EntityFile.model_validate(data)
1858
1879
 
1859
- def get_v2(self, file_id: FileId) -> FileV2:
1860
- """One file's metadata from V2 (Affinity API 2026-09-17+), with a download URL that
1861
- expires 60 seconds later. :meth:`get` (V1) is unchanged."""
1862
- return FileV2.model_validate(
1863
- self._client.get(f"/files/{int(file_id)}", min_api_version=FILES_V2_MIN_API_VERSION)
1864
- )
1865
-
1866
- def list_v2(
1880
+ def feed(
1867
1881
  self,
1868
1882
  *,
1869
1883
  created_after: datetime | None = None,
@@ -1895,7 +1909,7 @@ class EntityFileService(FileSearchMixin):
1895
1909
  ),
1896
1910
  )
1897
1911
 
1898
- def iter_v2(
1912
+ def iter_feed(
1899
1913
  self,
1900
1914
  *,
1901
1915
  created_after: datetime | None = None,
@@ -1903,12 +1917,12 @@ class EntityFileService(FileSearchMixin):
1903
1917
  creator_id: UserId | None = None,
1904
1918
  limit: int | None = None,
1905
1919
  ) -> Iterator[FileV2]:
1906
- """All files matching the filters (every page); see :meth:`list_v2`."""
1920
+ """All files matching the filters (every page); see :meth:`feed`."""
1907
1921
 
1908
1922
  def fetch_page(next_url: str | None) -> PaginatedResponse[FileV2]:
1909
1923
  if next_url:
1910
- return self.list_v2(cursor=next_url)
1911
- return self.list_v2(
1924
+ return self.feed(cursor=next_url)
1925
+ return self.feed(
1912
1926
  created_after=created_after,
1913
1927
  created_before=created_before,
1914
1928
  creator_id=creator_id,
@@ -1954,7 +1968,16 @@ class EntityFileService(FileSearchMixin):
1954
1968
  Raises:
1955
1969
  AffinityError: If the API doesn't return a redirect URL
1956
1970
  """
1957
- # Fetch file metadata first
1971
+ # V2 answers with the details and a signed URL in one request (API 2026-09-17+, beta);
1972
+ # a client pinned older, or a V2 refusal, uses V1's details and redirect instead
1973
+ try:
1974
+ v2 = FileV2.model_validate(
1975
+ self._client.get(f"/files/{int(file_id)}", min_api_version=FILES_V2_MIN_API_VERSION)
1976
+ )
1977
+ if v2.download_url:
1978
+ return _presigned(v2.download_url, v2.id, v2.name, v2.size, v2.content_type)
1979
+ except (ApiVersionTooOldError, AuthorizationError, NotFoundError):
1980
+ pass
1958
1981
  file_meta = self.get(file_id)
1959
1982
 
1960
1983
  url = self._client.get_redirect_url(
@@ -1967,27 +1990,7 @@ class EntityFileService(FileSearchMixin):
1967
1990
  f"Failed to get presigned URL for file {file_id}: no redirect returned"
1968
1991
  )
1969
1992
 
1970
- # Parse X-Amz-Expires from the presigned URL to determine TTL
1971
- # Default to 60 seconds if not found (Affinity's typical TTL)
1972
- parsed = urlparse(url)
1973
- qs = parse_qs(parsed.query)
1974
- expires_in = 60 # default
1975
- if "X-Amz-Expires" in qs:
1976
- with contextlib.suppress(ValueError, IndexError):
1977
- expires_in = int(qs["X-Amz-Expires"][0])
1978
-
1979
- now = datetime.now(timezone.utc)
1980
- expires_at = now + timedelta(seconds=expires_in)
1981
-
1982
- return PresignedUrl(
1983
- url=url,
1984
- file_id=int(file_id),
1985
- name=file_meta.name,
1986
- size=file_meta.size,
1987
- content_type=file_meta.content_type,
1988
- expires_in=expires_in,
1989
- expires_at=expires_at,
1990
- )
1993
+ return _presigned(url, file_id, file_meta.name, file_meta.size, file_meta.content_type)
1991
1994
 
1992
1995
  def download_stream(
1993
1996
  self,
@@ -2468,10 +2471,6 @@ class AsyncNoteService(AsyncNoteSearchMixin):
2468
2471
  next_page_token=data.get("next_page_token") or data.get("nextPageToken"),
2469
2472
  )
2470
2473
 
2471
- async def get(self, note_id: NoteId) -> Note:
2472
- data = await self._client.get(f"/notes/{note_id}", v1=True)
2473
- return Note.model_validate(data)
2474
-
2475
2474
  async def create(self, data: NoteCreate) -> NoteV2:
2476
2475
  """Create a note (V2); see :meth:`NoteService.create`."""
2477
2476
  return NoteV2.model_validate(await self._client.post("/notes", json=note_create_body(data)))
@@ -2484,11 +2483,11 @@ class AsyncNoteService(AsyncNoteSearchMixin):
2484
2483
  if data.content is not None:
2485
2484
  note = None
2486
2485
  with contextlib.suppress(AffinityError):
2487
- note = await self.get_v2(note_id)
2486
+ note = await self.get(note_id)
2488
2487
  if has_mentions(note):
2489
2488
  raise mentions_error(exc) from exc
2490
2489
  raise
2491
- return await self.get_v2(note_id, includes=True)
2490
+ return await self.get(note_id, includes=True)
2492
2491
 
2493
2492
  async def delete(self, note_id: NoteId) -> bool:
2494
2493
  """Delete a note you created (V2); see :meth:`NoteService.delete`."""
@@ -2534,7 +2533,7 @@ class AsyncNoteService(AsyncNoteSearchMixin):
2534
2533
  # V2 notes (read): NoteV2 with creator, HTML content, interaction, transcript
2535
2534
  # =========================================================================
2536
2535
 
2537
- async def list_v2(
2536
+ async def feed(
2538
2537
  self,
2539
2538
  *,
2540
2539
  creator_id: int | None = None,
@@ -2578,7 +2577,7 @@ class AsyncNoteService(AsyncNoteSearchMixin):
2578
2577
  )
2579
2578
  return page_of(NoteV2, await self._client.get("/notes", params=params or None))
2580
2579
 
2581
- def iter_v2(
2580
+ def iter_feed(
2582
2581
  self,
2583
2582
  *,
2584
2583
  creator_id: int | None = None,
@@ -2588,12 +2587,12 @@ class AsyncNoteService(AsyncNoteSearchMixin):
2588
2587
  includes: bool | Sequence[str] | None = None,
2589
2588
  limit: int | None = None,
2590
2589
  ) -> AsyncIterator[NoteV2]:
2591
- """All notes matching the filters (every page); see :meth:`list_v2`."""
2590
+ """All notes matching the filters (every page); see :meth:`feed`."""
2592
2591
 
2593
2592
  async def fetch_page(next_url: str | None) -> PaginatedResponse[NoteV2]:
2594
2593
  if next_url:
2595
- return await self.list_v2(cursor=next_url)
2596
- return await self.list_v2(
2594
+ return await self.feed(cursor=next_url)
2595
+ return await self.feed(
2597
2596
  creator_id=creator_id,
2598
2597
  created_after=created_after,
2599
2598
  created_before=created_before,
@@ -2604,10 +2603,8 @@ class AsyncNoteService(AsyncNoteSearchMixin):
2604
2603
 
2605
2604
  return AsyncPageIterator(fetch_page)
2606
2605
 
2607
- async def get_v2(
2608
- self, note_id: NoteId, *, includes: bool | Sequence[str] | None = None
2609
- ) -> NoteV2:
2610
- """One note as ``NoteV2`` (``includes`` as in :meth:`list_v2`)."""
2606
+ async def get(self, note_id: NoteId, *, includes: bool | Sequence[str] | None = None) -> NoteV2:
2607
+ """One note as ``NoteV2`` (``includes`` as in :meth:`feed`)."""
2611
2608
  params = [("includes", value) for value in note_includes(includes)]
2612
2609
  return NoteV2.model_validate(
2613
2610
  await self._client.get(f"/notes/{int(note_id)}", params=params or None)
@@ -3735,19 +3732,11 @@ class AsyncEntityFileService(AsyncFileSearchMixin):
3735
3732
  )
3736
3733
 
3737
3734
  async def get(self, file_id: FileId) -> EntityFile:
3735
+ """A file's details (V1); see :meth:`EntityFileService.get`."""
3738
3736
  data = await self._client.get(f"/entity-files/{file_id}", v1=True)
3739
3737
  return EntityFile.model_validate(data)
3740
3738
 
3741
- async def get_v2(self, file_id: FileId) -> FileV2:
3742
- """One file's metadata from V2 (Affinity API 2026-09-17+), with a download URL that
3743
- expires 60 seconds later. :meth:`get` (V1) is unchanged."""
3744
- return FileV2.model_validate(
3745
- await self._client.get(
3746
- f"/files/{int(file_id)}", min_api_version=FILES_V2_MIN_API_VERSION
3747
- )
3748
- )
3749
-
3750
- async def list_v2(
3739
+ async def feed(
3751
3740
  self,
3752
3741
  *,
3753
3742
  created_after: datetime | None = None,
@@ -3780,7 +3769,7 @@ class AsyncEntityFileService(AsyncFileSearchMixin):
3780
3769
  ),
3781
3770
  )
3782
3771
 
3783
- def iter_v2(
3772
+ def iter_feed(
3784
3773
  self,
3785
3774
  *,
3786
3775
  created_after: datetime | None = None,
@@ -3788,12 +3777,12 @@ class AsyncEntityFileService(AsyncFileSearchMixin):
3788
3777
  creator_id: UserId | None = None,
3789
3778
  limit: int | None = None,
3790
3779
  ) -> AsyncIterator[FileV2]:
3791
- """All files matching the filters (every page); see :meth:`list_v2`."""
3780
+ """All files matching the filters (every page); see :meth:`feed`."""
3792
3781
 
3793
3782
  async def fetch_page(next_url: str | None) -> PaginatedResponse[FileV2]:
3794
3783
  if next_url:
3795
- return await self.list_v2(cursor=next_url)
3796
- return await self.list_v2(
3784
+ return await self.feed(cursor=next_url)
3785
+ return await self.feed(
3797
3786
  created_after=created_after,
3798
3787
  created_before=created_before,
3799
3788
  creator_id=creator_id,
@@ -3992,7 +3981,18 @@ class AsyncEntityFileService(AsyncFileSearchMixin):
3992
3981
  Raises:
3993
3982
  AffinityError: If the API doesn't return a redirect URL
3994
3983
  """
3995
- # Fetch file metadata first
3984
+ # V2 answers with the details and a signed URL in one request (API 2026-09-17+, beta);
3985
+ # a client pinned older, or a V2 refusal, uses V1's details and redirect instead
3986
+ try:
3987
+ v2 = FileV2.model_validate(
3988
+ await self._client.get(
3989
+ f"/files/{int(file_id)}", min_api_version=FILES_V2_MIN_API_VERSION
3990
+ )
3991
+ )
3992
+ if v2.download_url:
3993
+ return _presigned(v2.download_url, v2.id, v2.name, v2.size, v2.content_type)
3994
+ except (ApiVersionTooOldError, AuthorizationError, NotFoundError):
3995
+ pass
3996
3996
  file_meta = await self.get(file_id)
3997
3997
 
3998
3998
  url = await self._client.get_redirect_url(
@@ -4005,27 +4005,7 @@ class AsyncEntityFileService(AsyncFileSearchMixin):
4005
4005
  f"Failed to get presigned URL for file {file_id}: no redirect returned"
4006
4006
  )
4007
4007
 
4008
- # Parse X-Amz-Expires from the presigned URL to determine TTL
4009
- # Default to 60 seconds if not found (Affinity's typical TTL)
4010
- parsed = urlparse(url)
4011
- qs = parse_qs(parsed.query)
4012
- expires_in = 60 # default
4013
- if "X-Amz-Expires" in qs:
4014
- with contextlib.suppress(ValueError, IndexError):
4015
- expires_in = int(qs["X-Amz-Expires"][0])
4016
-
4017
- now = datetime.now(timezone.utc)
4018
- expires_at = now + timedelta(seconds=expires_in)
4019
-
4020
- return PresignedUrl(
4021
- url=url,
4022
- file_id=int(file_id),
4023
- name=file_meta.name,
4024
- size=file_meta.size,
4025
- content_type=file_meta.content_type,
4026
- expires_in=expires_in,
4027
- expires_at=expires_at,
4028
- )
4008
+ return _presigned(url, file_id, file_meta.name, file_meta.size, file_meta.content_type)
4029
4009
 
4030
4010
  def download_stream(
4031
4011
  self,
@@ -84,7 +84,7 @@ from affinity.types import CompanyId, NoteId
84
84
 
85
85
  since = datetime(2025, 6, 1, tzinfo=timezone.utc)
86
86
  with Affinity.from_env() as client:
87
- for note in client.notes.iter_v2(created_after=since, includes=True):
87
+ for note in client.notes.iter_feed(created_after=since, includes=True):
88
88
  print(note.id, note.type, note.creator, note.replies_count, note.companies_total)
89
89
 
90
90
  for reply in client.notes.iter_replies(NoteId(123)):
@@ -28,7 +28,8 @@ Where V2 has the operation but can't do one part of it, that case goes through V
28
28
  | `lists.create` | `owner_id` or `additional_permissions` is set |
29
29
  | `reminders.update` | `type` is set (V2 can't change a reminder's type) |
30
30
  | `reminders.update` / `delete` | V2 refuses (403: only the creator or owner may change it on V2); retried once on V1 |
31
- | `files.list` / `iter` / `get` | always (only V1 lists one entity's files; `files.list_v2`/`get_v2` are the V2 reads) |
31
+ | `files.get` / `list` / `iter` | always (only V1 has the file's person, company or opportunity and works under any version pin; `files.feed` lists through V2) |
32
+ | `files.get_download_url` | when V2 can't answer: pinned older than 2026-09-17, or V2 refuses (V2 otherwise, in one request) |
32
33
  | `lists.get_size` | always (V2 has no list size) |
33
34
 
34
35
  The [API coverage](../reference/api-coverage.md) page lists every operation, the SDK call that
@@ -59,8 +59,10 @@ ls|get|create|update|delete`; create, update and delete ask for confirmation.
59
59
  | `type=HTML` with any tags | `<b>`/`<i>` become `<strong>`/`<em>`; tags Affinity rejects raise `ValueError` naming the allowed ones |
60
60
  | `parent_id` with entity ids (ids ignored) | `ValidationError` |
61
61
 
62
- `note get`/`note ls` and `notes.list/get` still use V1, which shows notes stored as HTML in a
63
- markdown-like form. Changing the text of a note that @mentions people is refused by the API.
62
+ `notes.get()` returns `NoteV2` (`includes=True` adds the attached companies, persons and
63
+ opportunities); `notes.list_v2()`/`iter_v2()`/`get_v2()` are now `notes.feed()`/`iter_feed()`/
64
+ `get()`. `notes.list()` (one entity's notes) and CLI `note ls` still use V1, which shows notes
65
+ stored as HTML in a markdown-like form. Changing the text of a note that @mentions people is refused by the API.
64
66
 
65
67
  ## Lists
66
68
 
@@ -76,9 +78,9 @@ unchanged (V1): Affinity's V2 spec documents them, but the API didn't serve them
76
78
 
77
79
  ## Files and rate limits
78
80
 
79
- `files.get/list/iter` are unchanged (V1). New: `files.get_v2()` (with a download URL that
80
- expires after 60 seconds) and `files.list_v2()`/`iter_v2()` (every file you can see, newest
81
- first). `rate_limits.refresh()` reads the V2 endpoint; `RateLimitSnapshot` is unchanged.
81
+ `files.get/list/iter` are unchanged (V1). `files.get_download_url()` uses V2 when it can (one
82
+ request for the details and a URL valid 60 seconds) and V1 otherwise. New:
83
+ `files.feed()`/`iter_feed()` (every file you can see, newest first, as `FileV2`). `rate_limits.refresh()` reads the V2 endpoint; `RateLimitSnapshot` is unchanged.
82
84
 
83
85
  ## CLI and MCP
84
86
 
@@ -35,9 +35,9 @@ against the pinned API specs and checks that each supported call requests its op
35
35
  | `GET /v2/emails` | supported | `interactions.list_emails()` | |
36
36
  | `POST /v2/feedback` | planned | | phase 2.x-1 |
37
37
  | `GET /v2/field-value-changes` | supported | `field_value_changes.list_global(field_id=FieldId(1))` | |
38
- | `GET /v2/files` | supported | `files.list_v2()` | beta; API 2026-09-17+ |
38
+ | `GET /v2/files` | supported | `files.feed()` | beta; API 2026-09-17+ |
39
39
  | `POST /v2/files/search` | supported | `files.search("prompt text")` | |
40
- | `GET /v2/files/{fileId}` | supported | `files.get_v2(FileId(1))` | beta; API 2026-09-17+ |
40
+ | `GET /v2/files/{fileId}` | supported | `files.get_download_url(FileId(1))` | beta; API 2026-09-17+ |
41
41
  | `GET /v2/inferred-connections/coworkers` | planned | | beta; phase 2.x-2 |
42
42
  | `GET /v2/inferred-connections/investor-executive-connections` | planned | | beta; phase 2.x-2 |
43
43
  | `GET /v2/lists` | supported | `lists.list()` | |
@@ -64,11 +64,11 @@ against the pinned API specs and checks that each supported call requests its op
64
64
  | `GET /v2/lists/{listId}/saved-views/{viewId}/list-entries` | supported | `lists.entries(ListId(1)).from_saved_view(SavedViewId(1))` | |
65
65
  | `GET /v2/meetings` | supported | `interactions.list_meetings()` | |
66
66
  | `GET /v2/meetings/{meetingId}` | planned | | beta; API 2026-07-15+; phase 2.x-1 |
67
- | `GET /v2/notes` | supported | `notes.list_v2()` | |
67
+ | `GET /v2/notes` | supported | `notes.feed()` | |
68
68
  | `POST /v2/notes` | supported | `notes.create(NoteCreate(content="x", person_ids=[PersonId(1)]))` | |
69
69
  | `POST /v2/notes/search` | supported | `notes.search("prompt text")` | |
70
70
  | `DELETE /v2/notes/{noteId}` | supported | `notes.delete(NoteId(1))` | |
71
- | `GET /v2/notes/{noteId}` | supported | `notes.get_v2(NoteId(1))` | |
71
+ | `GET /v2/notes/{noteId}` | supported | `notes.get(NoteId(1))` | |
72
72
  | `POST /v2/notes/{noteId}` | supported | `notes.update(NoteId(1), NoteUpdate(content="x"))` | |
73
73
  | `GET /v2/notes/{noteId}/attached-companies` | planned | | phase 2.x-1 |
74
74
  | `GET /v2/notes/{noteId}/attached-opportunities` | planned | | phase 2.x-1 |
@@ -125,15 +125,15 @@ against the pinned API specs and checks that each supported call requests its op
125
125
 
126
126
  ## V1 API
127
127
 
128
- 41 supported, 18 equivalent
128
+ 40 supported, 19 equivalent
129
129
 
130
130
  | Operation | Status | SDK | Notes |
131
131
  |---|---|---|---|
132
132
  | `GET /auth/whoami` | equivalent | | via v2 GET /v2/auth/whoami |
133
- | `GET /entity-files` | supported | `files.list(company_id=CompanyId(1))` | one person's, company's or opportunity's files (V2 lists only org-wide: files.list_v2) |
133
+ | `GET /entity-files` | supported | `files.list(company_id=CompanyId(1))` | one person's, company's or opportunity's files (V2 lists only org-wide: files.feed) |
134
134
  | `POST /entity-files` | supported | `files.upload_bytes(b"x", "a.txt", company_id=CompanyId(1))` | |
135
135
  | `GET /entity-files/download/{}` | supported | `files.download(FileId(1))` | |
136
- | `GET /entity-files/{}` | supported | `files.get(FileId(1))` | works under any API version pin; files.get_v2 adds a download URL (API 2026-09-17+) |
136
+ | `GET /entity-files/{}` | supported | `files.get(FileId(1))` | the file's record, with its person/company/opportunity, under any API version pin; get_download_url uses V2 when it can |
137
137
  | `GET /field-value-changes` | supported | `field_value_changes.list(FieldId(1), company_id=CompanyId(1))` | |
138
138
  | `GET /field-values` | supported | `field_values.list(company_id=CompanyId(1))` | |
139
139
  | `POST /field-values` | supported | `field_values.create(FieldValueCreate(field_id=FieldId(1), entity_id=1, value="x"))` | |
@@ -157,7 +157,7 @@ against the pinned API specs and checks that each supported call requests its op
157
157
  | `GET /notes` | supported | `notes.list()` | |
158
158
  | `POST /notes` | equivalent | | via v2 POST /v2/notes |
159
159
  | `DELETE /notes/{}` | equivalent | | via v2 DELETE /v2/notes/{noteId} |
160
- | `GET /notes/{}` | supported | `notes.get(NoteId(1))` | |
160
+ | `GET /notes/{}` | equivalent | | via v2 GET /v2/notes/{noteId} |
161
161
  | `PUT /notes/{}` | equivalent | | via v2 POST /v2/notes/{noteId} |
162
162
  | `GET /opportunities` | supported | `opportunities.search("x")` | |
163
163
  | `POST /opportunities` | supported | `opportunities.create(OpportunityCreate(name="x", list_id=ListId(1)))` | |
@@ -0,0 +1,8 @@
1
+ # Files
2
+
3
+ `get`, `list`, `all`, `iter`, uploads and downloads use V1: only V1 has a file's person,
4
+ company or opportunity, and it works under any API version pin. `get_download_url` uses V2 when
5
+ it can (one request for the details and a signed URL) and V1 otherwise. `feed`/`iter_feed`
6
+ list every file visible to you, newest first, through V2 (Affinity API 2026-09-17+).
7
+
8
+ ::: affinity.services.v1_only.EntityFileService
@@ -1,6 +1,6 @@
1
1
  # Notes
2
2
 
3
- Reads (`list`, `get`, `iter`) use V1; `list_v2`, `get_v2`, `list_replies`, `search` and the
3
+ Reads by entity (`list`, `iter`) use V1; `get`, `feed`, `iter_feed`, `list_replies`, `search` and the
4
4
  writes (`create`, `update`, `delete`) use V2, which stores notes as HTML.
5
5
 
6
6
  ::: affinity.services.v1_only.NoteService
@@ -2,11 +2,11 @@
2
2
  "_generated": {
3
3
  "warning": "DO NOT EDIT - This file is auto-generated",
4
4
  "generator": "tools/generate_mcp_command_registry.py",
5
- "cliVersion": "2.0.0",
5
+ "cliVersion": "2.0.1",
6
6
  "sourceConfig": "mcp/.registry/mcp-commands.json"
7
7
  },
8
8
  "version": 1,
9
- "cliVersion": "2.0.0",
9
+ "cliVersion": "2.0.1",
10
10
  "commands": [
11
11
  {
12
12
  "name": "company create",