microsoft-agent 2.3.3__tar.gz → 2.3.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. {microsoft_agent-2.3.3/microsoft_agent.egg-info → microsoft_agent-2.3.4}/PKG-INFO +4 -4
  2. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/README.md +1 -1
  3. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/connector_manifest.yml +1 -1
  4. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/_version.py +1 -1
  5. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_other.py +6 -1
  6. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/connectors/tool_schema_fingerprints.json +1 -1
  7. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/graph_file_service.py +17 -44
  8. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/integration_tools.py +9 -3
  9. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/power_platform.py +19 -2
  10. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/universal_print.py +18 -47
  11. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4/microsoft_agent.egg-info}/PKG-INFO +4 -4
  12. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/SOURCES.txt +2 -0
  13. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/entry_points.txt +3 -0
  14. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/requires.txt +2 -2
  15. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/pyproject.toml +6 -2
  16. microsoft_agent-2.3.4/tests/test_default_content_surfaces.py +43 -0
  17. microsoft_agent-2.3.4/tests/test_sdk_centralization.py +95 -0
  18. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_transport_migration.py +10 -2
  19. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/.env.example +0 -0
  20. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/LICENSE +0 -0
  21. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/MANIFEST.in +0 -0
  22. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/control-plane/README.md +0 -0
  23. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/control-plane/control-plane.sample.json +0 -0
  24. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/control-plane/nginx/windows-control-plane.conf +0 -0
  25. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/control-plane/systemd/microsoft-windows-control-plane.env +0 -0
  26. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/control-plane/systemd/microsoft-windows-control-plane.service +0 -0
  27. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/entra/New-MicrosoftAgentApp.ps1 +0 -0
  28. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/entra/New-WindowsControlPlaneEntraResources.ps1 +0 -0
  29. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/entra/README.md +0 -0
  30. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/entra/permission-profiles.json +0 -0
  31. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/integrations.example.json +0 -0
  32. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/windows/Install-WindowsCompanion.ps1 +0 -0
  33. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/windows/README.md +0 -0
  34. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/windows/Run-WindowsCompanion.ps1 +0 -0
  35. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/windows/Test-WindowsCompanionDeployment.ps1 +0 -0
  36. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/windows/Uninstall-WindowsCompanion.ps1 +0 -0
  37. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/windows/windows-companion.sample.json +0 -0
  38. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/authentication.md +0 -0
  39. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/concepts.md +0 -0
  40. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/configuration.md +0 -0
  41. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/deployment.md +0 -0
  42. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/enrollment-checklist.md +0 -0
  43. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/index.md +0 -0
  44. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/installation.md +0 -0
  45. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/integrations.md +0 -0
  46. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/office-addin.md +0 -0
  47. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/overview.md +0 -0
  48. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/usage.md +0 -0
  49. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/windows-companion.md +0 -0
  50. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/__init__.py +0 -0
  51. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/__main__.py +0 -0
  52. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/__init__.py +0 -0
  53. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/_graph_models.py +0 -0
  54. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_admin.py +0 -0
  55. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_apps.py +0 -0
  56. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_base.py +0 -0
  57. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_calendar.py +0 -0
  58. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_directory.py +0 -0
  59. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_drive.py +0 -0
  60. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_mail.py +0 -0
  61. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_system.py +0 -0
  62. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api_client.py +0 -0
  63. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/auth.py +0 -0
  64. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/config_cli.py +0 -0
  65. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/connectors/__init__.py +0 -0
  66. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/connectors/mcp_source_presets.json +0 -0
  67. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/credential_adapter.py +0 -0
  68. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/document_service.py +0 -0
  69. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/integration_adapters.py +0 -0
  70. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/integration_auth.py +0 -0
  71. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/integration_config.py +0 -0
  72. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/intune_service.py +0 -0
  73. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/kg_ingest.py +0 -0
  74. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/__init__.py +0 -0
  75. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_admin.py +0 -0
  76. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_agreements.py +0 -0
  77. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_applications.py +0 -0
  78. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_audit.py +0 -0
  79. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_auth.py +0 -0
  80. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_calendar.py +0 -0
  81. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_chat.py +0 -0
  82. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_communications.py +0 -0
  83. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_connections.py +0 -0
  84. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_contacts.py +0 -0
  85. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_devices.py +0 -0
  86. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_directory.py +0 -0
  87. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_domains.py +0 -0
  88. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_education.py +0 -0
  89. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_employee_experience.py +0 -0
  90. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_files.py +0 -0
  91. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_groups.py +0 -0
  92. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_identity.py +0 -0
  93. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_mail.py +0 -0
  94. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_meta.py +0 -0
  95. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_notes.py +0 -0
  96. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_organization.py +0 -0
  97. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_places.py +0 -0
  98. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_policies.py +0 -0
  99. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_print.py +0 -0
  100. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_privacy.py +0 -0
  101. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_reports.py +0 -0
  102. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_search.py +0 -0
  103. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_security.py +0 -0
  104. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_sites.py +0 -0
  105. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_solutions.py +0 -0
  106. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_storage.py +0 -0
  107. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_subscriptions.py +0 -0
  108. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_tasks.py +0 -0
  109. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_teams.py +0 -0
  110. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_user.py +0 -0
  111. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp_config.json +0 -0
  112. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp_server.py +0 -0
  113. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/office_bridge.py +0 -0
  114. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/ontology/__init__.py +0 -0
  115. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/ontology/certification.json +0 -0
  116. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/ontology/fixtures/records.json +0 -0
  117. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/ontology/mappings/source.yaml +0 -0
  118. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/ontology/microsoft.ttl +0 -0
  119. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/ontology/migrations/manifest.json +0 -0
  120. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/ontology/shapes/connector.shacl.ttl +0 -0
  121. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/prompts/__init__.py +0 -0
  122. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/prompts/collaboration_specialist.json +0 -0
  123. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/settings.py +0 -0
  124. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/skills/__init__.py +0 -0
  125. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-agent-operations/SKILL.md +0 -0
  126. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-agent-operations/agents/openai.yaml +0 -0
  127. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-agent-operations/references/catalog.md +0 -0
  128. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-calendar-scheduling/SKILL.md +0 -0
  129. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-mail-operations/SKILL.md +0 -0
  130. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-teams-messaging/SKILL.md +0 -0
  131. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/tool_policy.py +0 -0
  132. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/windows_companion.py +0 -0
  133. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/windows_companion_service.py +0 -0
  134. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/windows_control_plane.py +0 -0
  135. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/windows_control_plane_service.py +0 -0
  136. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/windows_runtime.py +0 -0
  137. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/dependency_links.txt +0 -0
  138. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/top_level.txt +0 -0
  139. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/mkdocs.yml +0 -0
  140. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/README.md +0 -0
  141. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/manifest.xml +0 -0
  142. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/package-lock.json +0 -0
  143. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/package.json +0 -0
  144. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/public/assets/icon.png.b64 +0 -0
  145. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/public/assets/icon.svg +0 -0
  146. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/public/config.json +0 -0
  147. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/public/styles.css +0 -0
  148. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/public/taskpane.html +0 -0
  149. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/scripts/validate_manifest.py +0 -0
  150. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/src/backend-client.ts +0 -0
  151. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/src/office-bridge.ts +0 -0
  152. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/src/office-operations.ts +0 -0
  153. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/src/taskpane.ts +0 -0
  154. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/src/validation.ts +0 -0
  155. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/tests/backend-client.test.ts +0 -0
  156. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/tests/office-bridge.test.ts +0 -0
  157. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/tests/validation.test.ts +0 -0
  158. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/tsconfig.json +0 -0
  159. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/vitest.config.ts +0 -0
  160. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/webpack.config.cjs +0 -0
  161. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/setup.cfg +0 -0
  162. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_api_client_extended.py +0 -0
  163. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_auth.py +0 -0
  164. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_auth_coverage.py +0 -0
  165. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_bug_cx_046_ctx_info_awaited.py +0 -0
  166. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_config_cli.py +0 -0
  167. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_credential_adapter.py +0 -0
  168. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_document_service.py +0 -0
  169. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_generate_code.py +0 -0
  170. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_graph_file_service.py +0 -0
  171. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_graph_reliability.py +0 -0
  172. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_graph_transport.py +0 -0
  173. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_init_dynamics.py +0 -0
  174. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_integration_adapters.py +0 -0
  175. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_integration_auth.py +0 -0
  176. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_integration_config_and_tools.py +0 -0
  177. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_intune_service.py +0 -0
  178. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_kg_ingest.py +0 -0
  179. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_main.py +0 -0
  180. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_mcp_comprehensive.py +0 -0
  181. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_mcp_server.py +0 -0
  182. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_office_bridge.py +0 -0
  183. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_office_manifest.py +0 -0
  184. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_onenote_sharepoint_print.py +0 -0
  185. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_placeholder.py +0 -0
  186. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_power_platform.py +0 -0
  187. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_settings_and_policy.py +0 -0
  188. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_startup.py +0 -0
  189. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_teams_reliability.py +0 -0
  190. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_transport_tls.py +0 -0
  191. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_verify_api_integration.py +0 -0
  192. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_windows_companion.py +0 -0
  193. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_windows_control_plane.py +0 -0
  194. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_windows_control_plane_service.py +0 -0
  195. {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_windows_runtime.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: microsoft-agent
3
- Version: 2.3.3
3
+ Version: 2.3.4
4
4
  Summary: Governed Microsoft Graph agent and MCP server
5
5
  Author-email: Project Maintainers <maintainers@users.noreply.github.com>
6
6
  License-Expression: MIT
@@ -11,7 +11,7 @@ Classifier: Programming Language :: Python :: 3
11
11
  Requires-Python: >=3.12
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
- Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.6
14
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18
15
15
  Requires-Dist: azure-core>=1.41.0
16
16
  Requires-Dist: httpx>=0.28.1
17
17
  Requires-Dist: keyring>=25.7.0
@@ -19,7 +19,7 @@ Requires-Dist: msal>=1.39.0
19
19
  Requires-Dist: msgraph-sdk>=1.64.0
20
20
  Requires-Dist: pydantic>=2.14.1
21
21
  Provides-Extra: mcp
22
- Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.6; extra == "mcp"
22
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; extra == "mcp"
23
23
  Provides-Extra: documents
24
24
  Requires-Dist: python-docx>=1.2.0; extra == "documents"
25
25
  Requires-Dist: python-pptx>=1.0.2; extra == "documents"
@@ -71,7 +71,7 @@ Dynamic: license-file
71
71
  agent. It uses Agent Connector SDK for MCP, identity propagation, intent delegation,
72
72
  configuration, telemetry, and graph integration.
73
73
 
74
- Current package version: **2.3.3**
74
+ Current package version: **2.3.4**
75
75
 
76
76
  ## Capabilities
77
77
 
@@ -3,7 +3,7 @@
3
3
  agent. It uses Agent Connector SDK for MCP, identity propagation, intent delegation,
4
4
  configuration, telemetry, and graph integration.
5
5
 
6
- Current package version: **2.3.3**
6
+ Current package version: **2.3.4**
7
7
 
8
8
  ## Capabilities
9
9
 
@@ -1,4 +1,4 @@
1
- connector: microsoft-agent
1
+ connector: microsoft-mcp
2
2
  ontology_source: microsoft
3
3
  schema_version: '1'
4
4
  resources:
@@ -1,3 +1,3 @@
1
1
  """Single package version authority."""
2
2
 
3
- __version__ = "2.3.3"
3
+ __version__ = "2.3.4"
@@ -2032,8 +2032,12 @@ class MicrosoftGraphApiOther(MicrosoftGraphApiBase):
2032
2032
  upload_transport: AsyncHttpTransport | None = None,
2033
2033
  ) -> dict[str, Any]:
2034
2034
  """Create, upload, and start one print job without exposing its upload URL."""
2035
- from microsoft_agent.power_platform import HttpxAsyncHttpTransport
2035
+ from microsoft_agent.power_platform import (
2036
+ HttpxAsyncHttpTransport,
2037
+ upload_retry_policy,
2038
+ )
2036
2039
  from microsoft_agent.universal_print import (
2040
+ PRINT_UPLOAD_MAX_RETRIES,
2037
2041
  PrintDocumentSubmission,
2038
2042
  UniversalPrintUploader,
2039
2043
  validate_print_upload_url,
@@ -2088,6 +2092,7 @@ class MicrosoftGraphApiOther(MicrosoftGraphApiBase):
2088
2092
  service="microsoft_graph",
2089
2093
  tls_profile=self.auth_manager.graph_tls_profile,
2090
2094
  tls_profile_ref=self.auth_manager.graph_tls_profile_ref,
2095
+ retry=upload_retry_policy(PRINT_UPLOAD_MAX_RETRIES),
2091
2096
  )
2092
2097
  transport = owned_transport
2093
2098
  uploader = UniversalPrintUploader(transport)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "algorithm": "agent-connector-sdk:mcp-tool-contract-compat:v2",
3
- "connector": "microsoft-agent",
3
+ "connector": "microsoft-mcp",
4
4
  "schema_version": "1",
5
5
  "tools": {
6
6
  "list_microsoft_ingestion_projection": "828d3116067086b5bfc4aae2794b99f13adb50c15644a3d9eb15bd60ba0ba14b"
@@ -7,7 +7,6 @@ that are multiples of 320 KiB, as required by Graph.
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
- import asyncio
11
10
  import json
12
11
  import re
13
12
  from collections.abc import Mapping
@@ -261,32 +260,23 @@ class GraphFileService:
261
260
  "Content-Range": f"bytes {start}-{end}/{total}",
262
261
  }
263
262
  # The preauthenticated upload URL must not receive the Graph bearer token.
264
- for attempt in range(self.settings.max_retries + 1):
265
- try:
266
- response = await self._transport.request(
267
- "PUT",
268
- upload_url,
269
- headers=headers,
270
- body=fragment,
271
- timeout=self.settings.timeout_seconds,
272
- )
273
- except (OSError, TimeoutError) as exc:
274
- if attempt >= self.settings.max_retries:
275
- raise GraphFileServiceError("Upload transport failed.") from exc
276
- await asyncio.sleep(min(2**attempt, 8))
277
- continue
278
- if response.status_code in {200, 201, 202}:
279
- return response
280
- if (
281
- response.status_code not in {429, 500, 502, 503, 504}
282
- or attempt >= self.settings.max_retries
283
- ):
284
- raise GraphFileServiceError(
285
- "Microsoft Graph rejected an upload fragment.",
286
- status_code=response.status_code,
287
- )
288
- await asyncio.sleep(_retry_delay(response, attempt))
289
- raise GraphFileServiceError("Upload fragment retry limit was exceeded.")
263
+ # The transport's SDK retry policy owns backoff and Retry-After handling.
264
+ try:
265
+ response = await self._transport.request(
266
+ "PUT",
267
+ upload_url,
268
+ headers=headers,
269
+ body=fragment,
270
+ timeout=self.settings.timeout_seconds,
271
+ )
272
+ except (OSError, TimeoutError) as exc:
273
+ raise GraphFileServiceError("Upload transport failed.") from exc
274
+ if response.status_code in {200, 201, 202}:
275
+ return response
276
+ raise GraphFileServiceError(
277
+ "Microsoft Graph rejected an upload fragment.",
278
+ status_code=response.status_code,
279
+ )
290
280
 
291
281
  async def _graph_request(
292
282
  self,
@@ -397,20 +387,3 @@ def _range_start(value: Any) -> int:
397
387
  if not isinstance(value, str) or not re.fullmatch(r"\d+-\d*", value):
398
388
  raise GraphFileServiceError("Graph returned an invalid expected range.")
399
389
  return int(value.partition("-")[0])
400
-
401
-
402
- def _retry_delay(response: HttpResponse, attempt: int) -> float:
403
- raw = next(
404
- (
405
- value
406
- for key, value in response.headers.items()
407
- if key.lower() == "retry-after"
408
- ),
409
- None,
410
- )
411
- try:
412
- return (
413
- min(max(float(raw), 0.0), 30.0) if raw is not None else min(2**attempt, 8)
414
- )
415
- except ValueError:
416
- return min(2**attempt, 8)
@@ -3,10 +3,11 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from functools import lru_cache
6
- from typing import Any, TypeVar
6
+ from typing import Any, TypeAlias, TypeVar
7
7
  from urllib.parse import urlparse
8
8
  from uuid import UUID
9
9
 
10
+ from agent_connector_sdk.http.retry import RetryPolicy
10
11
  from fastmcp import FastMCP
11
12
  from pydantic import Field
12
13
 
@@ -41,6 +42,7 @@ from microsoft_agent.power_platform import (
41
42
  FlowState,
42
43
  HttpxAsyncHttpTransport,
43
44
  PowerPlatformClient,
45
+ upload_retry_policy,
44
46
  )
45
47
  from microsoft_agent.settings import get_settings
46
48
  from microsoft_agent.windows_companion import (
@@ -52,7 +54,7 @@ from microsoft_agent.windows_companion import (
52
54
  WindowsCompanionClient,
53
55
  )
54
56
 
55
- _ManagedTransport = HttpxAsyncHttpTransport | HttpxCompanionTransport
57
+ _ManagedTransport: TypeAlias = HttpxAsyncHttpTransport | HttpxCompanionTransport
56
58
  _ManagedTransportT = TypeVar("_ManagedTransportT", bound=_ManagedTransport)
57
59
  _managed_transports: list[_ManagedTransport] = []
58
60
 
@@ -95,6 +97,7 @@ def _http_transport(
95
97
  tls_profile: str | None = None,
96
98
  tls_profile_ref: str | None = None,
97
99
  allowed_private_hosts: tuple[str, ...] = (),
100
+ retry: RetryPolicy | None = None,
98
101
  ) -> HttpxAsyncHttpTransport:
99
102
  return _manage_transport(
100
103
  HttpxAsyncHttpTransport(
@@ -102,6 +105,7 @@ def _http_transport(
102
105
  tls_profile=tls_profile,
103
106
  tls_profile_ref=tls_profile_ref,
104
107
  allowed_private_hosts=allowed_private_hosts,
108
+ retry=retry,
105
109
  )
106
110
  )
107
111
 
@@ -125,13 +129,15 @@ def _companion_transport(
125
129
  def _graph_file_service() -> GraphFileService:
126
130
  settings = get_settings()
127
131
  provider = MicrosoftAudienceTokenProvider([GRAPH_AUDIENCE])
132
+ file_settings = GraphFileSettings(graph_base_url=settings.graph_base_url)
128
133
  return GraphFileService(
129
- GraphFileSettings(graph_base_url=settings.graph_base_url),
134
+ file_settings,
130
135
  provider,
131
136
  _http_transport(
132
137
  service="microsoft_graph",
133
138
  tls_profile=settings.graph_tls_profile,
134
139
  tls_profile_ref=settings.graph_tls_profile_ref,
140
+ retry=upload_retry_policy(file_settings.max_retries),
135
141
  ),
136
142
  )
137
143
 
@@ -30,7 +30,7 @@ from agent_connector_sdk.credentials.runtime_references import (
30
30
  )
31
31
  from agent_connector_sdk.http.client import create_http_client
32
32
  from agent_connector_sdk.http.options import HttpClientOptions
33
- from agent_connector_sdk.http.retry import RetryPolicy
33
+ from agent_connector_sdk.http.retry import RETRYABLE_STATUSES, RetryPolicy
34
34
  from agent_connector_sdk.tls.profile import ResolvedTLSProfile
35
35
  from agent_connector_sdk.tls.resolve import resolve_tls_profile
36
36
  from pydantic import (
@@ -112,6 +112,22 @@ class AudienceTokenProvider(Protocol):
112
112
  """Return a bearer token whose ``aud`` claim matches ``audience``."""
113
113
 
114
114
 
115
+ #: Statuses an upload fragment retries; the SDK client applies them to PUT.
116
+ UPLOAD_RETRY_STATUSES = RETRYABLE_STATUSES | {500}
117
+
118
+
119
+ def upload_retry_policy(max_retries: int) -> RetryPolicy:
120
+ """SDK retry policy for resumable upload fragments (``max_retries`` retries)."""
121
+
122
+ return RetryPolicy(
123
+ max_attempts=max_retries + 1,
124
+ backoff_base=1.0,
125
+ max_backoff=8.0,
126
+ max_retry_after=30.0,
127
+ retry_statuses=UPLOAD_RETRY_STATUSES,
128
+ )
129
+
130
+
115
131
  class HttpxAsyncHttpTransport:
116
132
  """Bounded async facade over the shared verified sync HTTP boundary."""
117
133
 
@@ -124,6 +140,7 @@ class HttpxAsyncHttpTransport:
124
140
  allowed_private_hosts: tuple[str, ...] = (),
125
141
  max_response_bytes: int = 16 * 1024 * 1024,
126
142
  client: httpx.Client | None = None,
143
+ retry: RetryPolicy | None = None,
127
144
  ) -> None:
128
145
  if not 1_024 <= max_response_bytes <= 64 * 1024 * 1024:
129
146
  raise ValueError("HTTP response bound is invalid")
@@ -149,7 +166,7 @@ class HttpxAsyncHttpTransport:
149
166
  # Requests carry absolute URLs; the base is never dialed.
150
167
  base_url="https://pinned.invalid",
151
168
  timeout=httpx.Timeout(30.0),
152
- retry=RetryPolicy(max_attempts=1),
169
+ retry=retry or RetryPolicy(max_attempts=1),
153
170
  tls=self._tls,
154
171
  limits=httpx.Limits(
155
172
  max_connections=32,
@@ -8,7 +8,6 @@ Print upload origin and sends bounded sequential byte ranges.
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
- import asyncio
12
11
  import base64
13
12
  import binascii
14
13
  import json
@@ -96,6 +95,10 @@ class PrintDocumentSubmission(BaseModel):
96
95
  return content
97
96
 
98
97
 
98
+ #: Retries the print upload transport applies to a failed range.
99
+ PRINT_UPLOAD_MAX_RETRIES = 3
100
+
101
+
99
102
  class UniversalPrintUploadError(RuntimeError):
100
103
  """Safe upload failure that never contains the preauthenticated URL."""
101
104
 
@@ -113,7 +116,6 @@ class UniversalPrintUploader:
113
116
  *,
114
117
  timeout_seconds: float = 60,
115
118
  chunk_bytes: int = PRINT_UPLOAD_CHUNK_BYTES,
116
- max_retries: int = 3,
117
119
  ) -> None:
118
120
  if not 0 < chunk_bytes < 10 * 1024 * 1024:
119
121
  raise ValueError("Universal Print chunks must be smaller than 10 MiB")
@@ -121,12 +123,9 @@ class UniversalPrintUploader:
121
123
  raise ValueError("Universal Print chunks must be multiples of 320 KiB")
122
124
  if not 0 < timeout_seconds <= 600:
123
125
  raise ValueError("timeout_seconds must be between 0 and 600")
124
- if not 0 <= max_retries <= 8:
125
- raise ValueError("max_retries must be between 0 and 8")
126
126
  self._transport = transport
127
127
  self.timeout_seconds = timeout_seconds
128
128
  self.chunk_bytes = chunk_bytes
129
- self.max_retries = max_retries
130
129
 
131
130
  async def upload(self, upload_url: str, content: bytes) -> dict[str, Any]:
132
131
  """Upload sequential ranges and return final printDocument metadata."""
@@ -192,31 +191,19 @@ class UniversalPrintUploader:
192
191
  "Content-Length": str(len(fragment)),
193
192
  "Content-Range": f"bytes {start}-{end}/{total}",
194
193
  }
195
- for attempt in range(self.max_retries + 1):
196
- try:
197
- response = await self._transport.request(
198
- "PUT",
199
- upload_url,
200
- headers=headers,
201
- body=fragment,
202
- timeout=self.timeout_seconds,
203
- )
204
- except (OSError, TimeoutError) as exc:
205
- if attempt >= self.max_retries:
206
- raise UniversalPrintUploadError(
207
- "Universal Print upload transport failed."
208
- ) from exc
209
- await asyncio.sleep(min(2**attempt, 8))
210
- continue
211
- if response.status_code in {201, 202}:
212
- return response
213
- if (
214
- response.status_code not in {429, 500, 502, 503, 504}
215
- or attempt >= self.max_retries
216
- ):
217
- return response
218
- await asyncio.sleep(_retry_delay(response, attempt))
219
- raise UniversalPrintUploadError("Universal Print retry limit was exceeded.")
194
+ # The transport's SDK retry policy owns backoff and Retry-After handling.
195
+ try:
196
+ return await self._transport.request(
197
+ "PUT",
198
+ upload_url,
199
+ headers=headers,
200
+ body=fragment,
201
+ timeout=self.timeout_seconds,
202
+ )
203
+ except (OSError, TimeoutError) as exc:
204
+ raise UniversalPrintUploadError(
205
+ "Universal Print upload transport failed."
206
+ ) from exc
220
207
 
221
208
 
222
209
  def validate_print_upload_url(value: Any) -> str:
@@ -269,24 +256,8 @@ def _range_start(value: Any) -> int:
269
256
  return int(value.partition("-")[0])
270
257
 
271
258
 
272
- def _retry_delay(response: HttpResponse, attempt: int) -> float:
273
- raw = next(
274
- (
275
- value
276
- for key, value in response.headers.items()
277
- if key.casefold() == "retry-after"
278
- ),
279
- None,
280
- )
281
- try:
282
- return (
283
- min(max(float(raw), 0.0), 30.0) if raw is not None else min(2**attempt, 8)
284
- )
285
- except ValueError:
286
- return min(2**attempt, 8)
287
-
288
-
289
259
  __all__ = [
260
+ "PRINT_UPLOAD_MAX_RETRIES",
290
261
  "MAX_PRINT_DOCUMENT_BYTES",
291
262
  "PRINT_UPLOAD_CHUNK_BYTES",
292
263
  "PRINT_UPLOAD_HOST",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: microsoft-agent
3
- Version: 2.3.3
3
+ Version: 2.3.4
4
4
  Summary: Governed Microsoft Graph agent and MCP server
5
5
  Author-email: Project Maintainers <maintainers@users.noreply.github.com>
6
6
  License-Expression: MIT
@@ -11,7 +11,7 @@ Classifier: Programming Language :: Python :: 3
11
11
  Requires-Python: >=3.12
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
- Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.6
14
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18
15
15
  Requires-Dist: azure-core>=1.41.0
16
16
  Requires-Dist: httpx>=0.28.1
17
17
  Requires-Dist: keyring>=25.7.0
@@ -19,7 +19,7 @@ Requires-Dist: msal>=1.39.0
19
19
  Requires-Dist: msgraph-sdk>=1.64.0
20
20
  Requires-Dist: pydantic>=2.14.1
21
21
  Provides-Extra: mcp
22
- Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.6; extra == "mcp"
22
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; extra == "mcp"
23
23
  Provides-Extra: documents
24
24
  Requires-Dist: python-docx>=1.2.0; extra == "documents"
25
25
  Requires-Dist: python-pptx>=1.0.2; extra == "documents"
@@ -71,7 +71,7 @@ Dynamic: license-file
71
71
  agent. It uses Agent Connector SDK for MCP, identity propagation, intent delegation,
72
72
  configuration, telemetry, and graph integration.
73
73
 
74
- Current package version: **2.3.3**
74
+ Current package version: **2.3.4**
75
75
 
76
76
  ## Capabilities
77
77
 
@@ -160,6 +160,7 @@ tests/test_auth_coverage.py
160
160
  tests/test_bug_cx_046_ctx_info_awaited.py
161
161
  tests/test_config_cli.py
162
162
  tests/test_credential_adapter.py
163
+ tests/test_default_content_surfaces.py
163
164
  tests/test_document_service.py
164
165
  tests/test_generate_code.py
165
166
  tests/test_graph_file_service.py
@@ -179,6 +180,7 @@ tests/test_office_manifest.py
179
180
  tests/test_onenote_sharepoint_print.py
180
181
  tests/test_placeholder.py
181
182
  tests/test_power_platform.py
183
+ tests/test_sdk_centralization.py
182
184
  tests/test_settings_and_policy.py
183
185
  tests/test_startup.py
184
186
  tests/test_teams_reliability.py
@@ -1,3 +1,6 @@
1
+ [agent_connector_sdk.connector]
2
+ microsoft-mcp = microsoft_agent
3
+
1
4
  [agent_connector_sdk.ontology_providers]
2
5
  microsoft-agent = microsoft_agent.ontology
3
6
 
@@ -1,4 +1,4 @@
1
- agent-connector-sdk[mcp]<1.0.0,>=0.3.6
1
+ agent-connector-sdk[mcp]<1.0.0,>=0.3.18
2
2
  azure-core>=1.41.0
3
3
  httpx>=0.28.1
4
4
  keyring>=25.7.0
@@ -40,7 +40,7 @@ python-docx>=1.2.0
40
40
  python-pptx>=1.0.2
41
41
 
42
42
  [mcp]
43
- agent-connector-sdk[mcp]<1.0.0,>=0.3.6
43
+ agent-connector-sdk[mcp]<1.0.0,>=0.3.18
44
44
 
45
45
  [test]
46
46
  cryptography>=50.0.2
@@ -14,7 +14,7 @@ classifiers = [
14
14
  "Operating System :: OS Independent",
15
15
  "Programming Language :: Python :: 3",
16
16
  ]
17
- dependencies = [ "agent-connector-sdk[mcp]>=0.3.6,<1.0.0", "azure-core>=1.41.0", "httpx>=0.28.1", "keyring>=25.7.0", "msal>=1.39.0", "msgraph-sdk>=1.64.0", "pydantic>=2.14.1",]
17
+ dependencies = [ "agent-connector-sdk[mcp]>=0.3.18,<1.0.0", "azure-core>=1.41.0", "httpx>=0.28.1", "keyring>=25.7.0", "msal>=1.39.0", "msgraph-sdk>=1.64.0", "pydantic>=2.14.1",]
18
18
  license = "MIT"
19
19
 
20
20
  [[project.authors]]
@@ -22,7 +22,7 @@ name = "Project Maintainers"
22
22
  email = "maintainers@users.noreply.github.com"
23
23
 
24
24
  [project.optional-dependencies]
25
- mcp = [ "agent-connector-sdk[mcp]>=0.3.6,<1.0.0",]
25
+ mcp = [ "agent-connector-sdk[mcp]>=0.3.18,<1.0.0",]
26
26
  documents = ["python-docx>=1.2.0", "python-pptx>=1.0.2"]
27
27
  cloud = ["azure-identity>=1.26.0", "httpx>=0.28.1"]
28
28
  windows = [
@@ -96,6 +96,10 @@ dev = [
96
96
  "ruff>=0.17.1,<1",
97
97
  ]
98
98
 
99
+ # The one declared connector identity: the fleet name (SDK-CONNECTOR-CONTROL-R071).
100
+ [project.entry-points."agent_connector_sdk.connector"]
101
+ microsoft-mcp = "microsoft_agent"
102
+
99
103
  [tool.uv.workspace]
100
104
  members = ["."]
101
105
 
@@ -0,0 +1,43 @@
1
+ """CONN-MICROSOFT-AGENT-CONNECTOR-CONTENT-R001: the server lists its packaged skills, ontology and prompts by default."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import importlib
7
+ from pathlib import Path
8
+
9
+ import pytest
10
+ from fastmcp import Client
11
+
12
+ PACKAGE = "microsoft_agent"
13
+ ROOT = Path(list(importlib.import_module(PACKAGE).__path__)[0])
14
+
15
+ pytestmark = pytest.mark.spec("CONN-MICROSOFT-AGENT-CONNECTOR-CONTENT-R001")
16
+
17
+
18
+ def _server():
19
+ namespace = {"__name__": PACKAGE + ".mcp_server"}
20
+ exec(
21
+ "from agent_connector_sdk.mcp.server import create_mcp_server\n"
22
+ "result = create_mcp_server('microsoft-mcp', version='0', command_args=[])",
23
+ namespace,
24
+ )
25
+ return namespace["result"][1]
26
+
27
+
28
+ async def _listings():
29
+ async with Client(_server()) as client:
30
+ resources = {str(r.uri) for r in await client.list_resources()}
31
+ prompts = {p.name for p in await client.list_prompts()}
32
+ return resources, prompts
33
+
34
+
35
+ def test_default_content_surfaces() -> None:
36
+ resources, prompts = asyncio.run(_listings())
37
+ if list(ROOT.glob("skills/*/SKILL.md")):
38
+ assert any(u.startswith("skill://") for u in resources)
39
+ if list(ROOT.glob("ontology/*.ttl")):
40
+ assert any(u.startswith("ontology://microsoft-mcp/") for u in resources)
41
+ for path in ROOT.glob("prompts/*.json"):
42
+ if not path.name.startswith("_"):
43
+ assert path.stem in prompts
@@ -0,0 +1,95 @@
1
+ """TLS profile and upload retry behavior owned by the connector SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import httpx
6
+ import pytest
7
+ from agent_connector_sdk.http.client import create_http_client
8
+ from agent_connector_sdk.http.options import HttpClientOptions
9
+ from agent_connector_sdk.http.retry import RetryPolicy
10
+
11
+ from microsoft_agent.graph_file_service import (
12
+ GraphFileService,
13
+ GraphFileServiceError,
14
+ GraphFileSettings,
15
+ )
16
+ from microsoft_agent.power_platform import (
17
+ HttpxAsyncHttpTransport,
18
+ upload_retry_policy,
19
+ )
20
+ from microsoft_agent.universal_print import UniversalPrintUploader
21
+
22
+ PRINT_URL = (
23
+ "https://print.print.microsoft.com/uploadSessions/session-1?tempauthtoken=opaque"
24
+ )
25
+ UPLOAD_URL = "https://upload.example/session-1?tempauthtoken=opaque"
26
+
27
+
28
+ class _NoToken:
29
+ async def get_token(self, audience: str) -> str:
30
+ return "token"
31
+
32
+
33
+ def _transport(
34
+ handler: httpx.MockTransport, retries: int, monkeypatch: pytest.MonkeyPatch
35
+ ) -> HttpxAsyncHttpTransport:
36
+ monkeypatch.setattr("agent_connector_sdk.http.transport.time.sleep", lambda _: None)
37
+ client = create_http_client(
38
+ HttpClientOptions(
39
+ base_url="https://pinned.invalid",
40
+ retry=upload_retry_policy(retries),
41
+ ),
42
+ transport=handler,
43
+ )
44
+ return HttpxAsyncHttpTransport(service="microsoft_graph", client=client)
45
+
46
+
47
+ @pytest.mark.spec("CONN-MICROSOFT-AGENT-UPLOAD-RETRY-R001")
48
+ def test_upload_retry_policy_is_bounded_and_retries_server_errors() -> None:
49
+ policy = upload_retry_policy(3)
50
+ assert policy.max_attempts == 4
51
+ assert {429, 500, 503} <= policy.retry_statuses
52
+ assert policy.max_retry_after == 30.0
53
+ assert isinstance(policy, RetryPolicy)
54
+
55
+
56
+ @pytest.mark.spec("CONN-MICROSOFT-AGENT-UPLOAD-RETRY-R001")
57
+ async def test_print_range_retries_through_the_sdk_client(
58
+ monkeypatch: pytest.MonkeyPatch,
59
+ ) -> None:
60
+ calls: list[int] = []
61
+
62
+ def handler(request: httpx.Request) -> httpx.Response:
63
+ calls.append(1)
64
+ if len(calls) < 3:
65
+ return httpx.Response(503, headers={"Retry-After": "1"})
66
+ return httpx.Response(201, json={"id": "document-1"})
67
+
68
+ uploader = UniversalPrintUploader(
69
+ _transport(httpx.MockTransport(handler), 3, monkeypatch)
70
+ )
71
+ result = await uploader.upload(PRINT_URL, b"abc")
72
+ assert result == {"id": "document-1"}
73
+ assert len(calls) == 3
74
+
75
+
76
+ @pytest.mark.spec("CONN-MICROSOFT-AGENT-UPLOAD-RETRY-R001")
77
+ async def test_graph_fragment_failure_surfaces_status_after_sdk_retries(
78
+ monkeypatch: pytest.MonkeyPatch,
79
+ ) -> None:
80
+ calls: list[int] = []
81
+
82
+ def handler(request: httpx.Request) -> httpx.Response:
83
+ calls.append(1)
84
+ return httpx.Response(500)
85
+
86
+ transport = _transport(httpx.MockTransport(handler), 2, monkeypatch)
87
+ service = GraphFileService(
88
+ GraphFileSettings(max_retries=2),
89
+ _NoToken(),
90
+ transport, # type: ignore[arg-type]
91
+ )
92
+ with pytest.raises(GraphFileServiceError) as caught:
93
+ await service._upload_fragment(UPLOAD_URL, b"abc", 0, 2, 3) # noqa: SLF001
94
+ assert caught.value.status_code == 500
95
+ assert len(calls) == 3
@@ -11,8 +11,14 @@ import httpx
11
11
  import pytest
12
12
 
13
13
  from microsoft_agent.api_client import MicrosoftGraphApi
14
- from microsoft_agent.power_platform import HttpxAsyncHttpTransport
15
- from microsoft_agent.universal_print import PrintDocumentSubmission
14
+ from microsoft_agent.power_platform import (
15
+ HttpxAsyncHttpTransport,
16
+ upload_retry_policy,
17
+ )
18
+ from microsoft_agent.universal_print import (
19
+ PRINT_UPLOAD_MAX_RETRIES,
20
+ PrintDocumentSubmission,
21
+ )
16
22
  from microsoft_agent.windows_companion import HttpxCompanionTransport
17
23
 
18
24
 
@@ -123,6 +129,7 @@ def test_integration_cache_clear_closes_owned_transports(monkeypatch) -> None:
123
129
  tls_profile="private-ca",
124
130
  tls_profile_ref=None,
125
131
  allowed_private_hosts=(),
132
+ retry=None,
126
133
  )
127
134
  transport.close.assert_called_once_with()
128
135
 
@@ -181,6 +188,7 @@ async def test_print_upload_closes_only_its_default_transport() -> None:
181
188
  service="microsoft_graph",
182
189
  tls_profile="private-ca",
183
190
  tls_profile_ref=None,
191
+ retry=upload_retry_policy(PRINT_UPLOAD_MAX_RETRIES),
184
192
  )
185
193
  owned_transport.close.assert_called_once_with()
186
194
 
File without changes