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.
- {microsoft_agent-2.3.3/microsoft_agent.egg-info → microsoft_agent-2.3.4}/PKG-INFO +4 -4
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/README.md +1 -1
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/connector_manifest.yml +1 -1
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/_version.py +1 -1
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_other.py +6 -1
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/connectors/tool_schema_fingerprints.json +1 -1
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/graph_file_service.py +17 -44
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/integration_tools.py +9 -3
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/power_platform.py +19 -2
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/universal_print.py +18 -47
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4/microsoft_agent.egg-info}/PKG-INFO +4 -4
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/SOURCES.txt +2 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/entry_points.txt +3 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/requires.txt +2 -2
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/pyproject.toml +6 -2
- microsoft_agent-2.3.4/tests/test_default_content_surfaces.py +43 -0
- microsoft_agent-2.3.4/tests/test_sdk_centralization.py +95 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_transport_migration.py +10 -2
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/.env.example +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/LICENSE +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/MANIFEST.in +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/control-plane/README.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/control-plane/control-plane.sample.json +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/control-plane/nginx/windows-control-plane.conf +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/control-plane/systemd/microsoft-windows-control-plane.env +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/control-plane/systemd/microsoft-windows-control-plane.service +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/entra/New-MicrosoftAgentApp.ps1 +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/entra/New-WindowsControlPlaneEntraResources.ps1 +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/entra/README.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/entra/permission-profiles.json +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/integrations.example.json +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/windows/Install-WindowsCompanion.ps1 +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/windows/README.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/windows/Run-WindowsCompanion.ps1 +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/windows/Test-WindowsCompanionDeployment.ps1 +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/windows/Uninstall-WindowsCompanion.ps1 +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/deployment/windows/windows-companion.sample.json +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/authentication.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/concepts.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/configuration.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/deployment.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/enrollment-checklist.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/index.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/installation.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/integrations.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/office-addin.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/overview.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/usage.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/docs/windows-companion.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/__init__.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/__main__.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/__init__.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/_graph_models.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_admin.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_apps.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_base.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_calendar.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_directory.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_drive.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_mail.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_system.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/api_client.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/auth.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/config_cli.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/connectors/__init__.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/connectors/mcp_source_presets.json +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/credential_adapter.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/document_service.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/integration_adapters.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/integration_auth.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/integration_config.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/intune_service.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/kg_ingest.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/__init__.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_admin.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_agreements.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_applications.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_audit.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_auth.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_calendar.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_chat.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_communications.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_connections.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_contacts.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_devices.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_directory.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_domains.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_education.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_employee_experience.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_files.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_groups.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_identity.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_mail.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_meta.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_notes.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_organization.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_places.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_policies.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_print.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_privacy.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_reports.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_search.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_security.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_sites.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_solutions.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_storage.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_subscriptions.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_tasks.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_teams.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_user.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp_config.json +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/mcp_server.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/office_bridge.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/ontology/__init__.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/ontology/certification.json +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/ontology/fixtures/records.json +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/ontology/mappings/source.yaml +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/ontology/microsoft.ttl +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/ontology/migrations/manifest.json +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/ontology/shapes/connector.shacl.ttl +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/prompts/__init__.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/prompts/collaboration_specialist.json +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/settings.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/skills/__init__.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-agent-operations/SKILL.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-agent-operations/agents/openai.yaml +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-agent-operations/references/catalog.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-calendar-scheduling/SKILL.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-mail-operations/SKILL.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-teams-messaging/SKILL.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/tool_policy.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/windows_companion.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/windows_companion_service.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/windows_control_plane.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/windows_control_plane_service.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent/windows_runtime.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/dependency_links.txt +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/top_level.txt +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/mkdocs.yml +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/README.md +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/manifest.xml +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/package-lock.json +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/package.json +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/public/assets/icon.png.b64 +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/public/assets/icon.svg +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/public/config.json +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/public/styles.css +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/public/taskpane.html +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/scripts/validate_manifest.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/src/backend-client.ts +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/src/office-bridge.ts +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/src/office-operations.ts +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/src/taskpane.ts +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/src/validation.ts +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/tests/backend-client.test.ts +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/tests/office-bridge.test.ts +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/tests/validation.test.ts +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/tsconfig.json +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/vitest.config.ts +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/office_addin/webpack.config.cjs +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/setup.cfg +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_api_client_extended.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_auth.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_auth_coverage.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_bug_cx_046_ctx_info_awaited.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_config_cli.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_credential_adapter.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_document_service.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_generate_code.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_graph_file_service.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_graph_reliability.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_graph_transport.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_init_dynamics.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_integration_adapters.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_integration_auth.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_integration_config_and_tools.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_intune_service.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_kg_ingest.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_main.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_mcp_comprehensive.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_mcp_server.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_office_bridge.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_office_manifest.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_onenote_sharepoint_print.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_placeholder.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_power_platform.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_settings_and_policy.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_startup.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_teams_reliability.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_transport_tls.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_verify_api_integration.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_windows_companion.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_windows_control_plane.py +0 -0
- {microsoft_agent-2.3.3 → microsoft_agent-2.3.4}/tests/test_windows_control_plane_service.py +0 -0
- {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
|
+
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.
|
|
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.
|
|
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.
|
|
74
|
+
Current package version: **2.3.4**
|
|
75
75
|
|
|
76
76
|
## Capabilities
|
|
77
77
|
|
|
@@ -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
|
|
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-
|
|
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
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
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
|
-
|
|
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
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
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
|
+
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.
|
|
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.
|
|
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.
|
|
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,4 +1,4 @@
|
|
|
1
|
-
agent-connector-sdk[mcp]<1.0.0,>=0.3.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
15
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|