microsoft-agent 2.3.2__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.2/microsoft_agent.egg-info → microsoft_agent-2.3.4}/PKG-INFO +4 -4
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/README.md +1 -1
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/connector_manifest.yml +1 -1
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/_version.py +1 -1
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_other.py +6 -1
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/connectors/tool_schema_fingerprints.json +1 -1
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/graph_file_service.py +17 -44
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/integration_tools.py +9 -3
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/power_platform.py +19 -2
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/universal_print.py +18 -47
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/windows_companion_service.py +9 -8
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/windows_control_plane.py +6 -9
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/windows_runtime.py +33 -6
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4/microsoft_agent.egg-info}/PKG-INFO +4 -4
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/SOURCES.txt +3 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/entry_points.txt +3 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/requires.txt +2 -2
- {microsoft_agent-2.3.2 → 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.2 → microsoft_agent-2.3.4}/tests/test_transport_migration.py +10 -2
- microsoft_agent-2.3.4/tests/test_transport_tls.py +104 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/.env.example +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/LICENSE +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/MANIFEST.in +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/control-plane/README.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/control-plane/control-plane.sample.json +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/control-plane/nginx/windows-control-plane.conf +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/control-plane/systemd/microsoft-windows-control-plane.env +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/control-plane/systemd/microsoft-windows-control-plane.service +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/entra/New-MicrosoftAgentApp.ps1 +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/entra/New-WindowsControlPlaneEntraResources.ps1 +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/entra/README.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/entra/permission-profiles.json +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/integrations.example.json +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/windows/Install-WindowsCompanion.ps1 +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/windows/README.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/windows/Run-WindowsCompanion.ps1 +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/windows/Test-WindowsCompanionDeployment.ps1 +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/windows/Uninstall-WindowsCompanion.ps1 +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/windows/windows-companion.sample.json +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/authentication.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/concepts.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/configuration.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/deployment.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/enrollment-checklist.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/index.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/installation.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/integrations.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/office-addin.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/overview.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/usage.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/windows-companion.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/__init__.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/__main__.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/__init__.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/_graph_models.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_admin.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_apps.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_base.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_calendar.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_directory.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_drive.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_mail.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_system.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api_client.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/auth.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/config_cli.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/connectors/__init__.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/connectors/mcp_source_presets.json +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/credential_adapter.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/document_service.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/integration_adapters.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/integration_auth.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/integration_config.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/intune_service.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/kg_ingest.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/__init__.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_admin.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_agreements.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_applications.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_audit.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_auth.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_calendar.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_chat.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_communications.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_connections.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_contacts.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_devices.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_directory.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_domains.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_education.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_employee_experience.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_files.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_groups.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_identity.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_mail.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_meta.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_notes.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_organization.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_places.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_policies.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_print.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_privacy.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_reports.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_search.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_security.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_sites.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_solutions.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_storage.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_subscriptions.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_tasks.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_teams.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_user.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp_config.json +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp_server.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/office_bridge.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/ontology/__init__.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/ontology/certification.json +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/ontology/fixtures/records.json +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/ontology/mappings/source.yaml +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/ontology/microsoft.ttl +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/ontology/migrations/manifest.json +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/ontology/shapes/connector.shacl.ttl +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/prompts/__init__.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/prompts/collaboration_specialist.json +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/settings.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/skills/__init__.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-agent-operations/SKILL.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-agent-operations/agents/openai.yaml +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-agent-operations/references/catalog.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-calendar-scheduling/SKILL.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-mail-operations/SKILL.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-teams-messaging/SKILL.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/tool_policy.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/windows_companion.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/windows_control_plane_service.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/dependency_links.txt +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/top_level.txt +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/mkdocs.yml +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/README.md +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/manifest.xml +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/package-lock.json +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/package.json +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/public/assets/icon.png.b64 +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/public/assets/icon.svg +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/public/config.json +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/public/styles.css +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/public/taskpane.html +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/scripts/validate_manifest.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/src/backend-client.ts +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/src/office-bridge.ts +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/src/office-operations.ts +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/src/taskpane.ts +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/src/validation.ts +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/tests/backend-client.test.ts +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/tests/office-bridge.test.ts +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/tests/validation.test.ts +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/tsconfig.json +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/vitest.config.ts +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/webpack.config.cjs +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/setup.cfg +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_api_client_extended.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_auth.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_auth_coverage.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_bug_cx_046_ctx_info_awaited.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_config_cli.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_credential_adapter.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_document_service.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_generate_code.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_graph_file_service.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_graph_reliability.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_graph_transport.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_init_dynamics.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_integration_adapters.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_integration_auth.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_integration_config_and_tools.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_intune_service.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_kg_ingest.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_main.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_mcp_comprehensive.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_mcp_server.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_office_bridge.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_office_manifest.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_onenote_sharepoint_print.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_placeholder.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_power_platform.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_settings_and_policy.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_startup.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_teams_reliability.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_verify_api_integration.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_windows_companion.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_windows_control_plane.py +0 -0
- {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_windows_control_plane_service.py +0 -0
- {microsoft_agent-2.3.2 → 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",
|
{microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/windows_companion_service.py
RENAMED
|
@@ -60,6 +60,7 @@ from microsoft_agent.windows_runtime import (
|
|
|
60
60
|
WindowsRuntimeLimits,
|
|
61
61
|
WindowsServiceManager,
|
|
62
62
|
WindowsToastNotificationAdapter,
|
|
63
|
+
build_client_tls_context,
|
|
63
64
|
)
|
|
64
65
|
|
|
65
66
|
try: # Core authentication dependency, guarded for library-only installs.
|
|
@@ -241,18 +242,18 @@ def validate_local_service_config(config: WindowsCompanionServiceConfig) -> None
|
|
|
241
242
|
certificate_der = ssl.PEM_cert_to_DER_cert(certificate_pem)
|
|
242
243
|
except ValueError as exc:
|
|
243
244
|
raise ValueError("Client certificate is not valid PEM") from exc
|
|
244
|
-
actual_thumbprint =
|
|
245
|
+
actual_thumbprint = (
|
|
246
|
+
hashlib.sha1(certificate_der, usedforsecurity=False).hexdigest().upper()
|
|
247
|
+
)
|
|
245
248
|
if not hmac.compare_digest(actual_thumbprint, certificate.thumbprint):
|
|
246
249
|
raise ValueError("Client certificate fingerprint does not match configuration")
|
|
247
250
|
password = _private_key_password(certificate)
|
|
248
|
-
context = ssl.create_default_context(
|
|
249
|
-
cafile=str(certificate.ca_bundle_path) if certificate.ca_bundle_path else None
|
|
250
|
-
)
|
|
251
251
|
try:
|
|
252
|
-
|
|
253
|
-
certificate.
|
|
254
|
-
certificate.
|
|
255
|
-
|
|
252
|
+
build_client_tls_context(
|
|
253
|
+
ca_bundle_path=certificate.ca_bundle_path,
|
|
254
|
+
client_certificate_path=certificate.client_certificate_path,
|
|
255
|
+
client_private_key_path=certificate.client_private_key_path,
|
|
256
|
+
private_key_password=password,
|
|
256
257
|
)
|
|
257
258
|
except (OSError, ssl.SSLError) as exc:
|
|
258
259
|
raise ValueError(
|
|
@@ -21,7 +21,6 @@ import json
|
|
|
21
21
|
import ntpath
|
|
22
22
|
import os
|
|
23
23
|
import sqlite3
|
|
24
|
-
import ssl
|
|
25
24
|
from collections.abc import Mapping
|
|
26
25
|
from datetime import UTC, datetime, timedelta
|
|
27
26
|
from pathlib import Path
|
|
@@ -69,6 +68,7 @@ from microsoft_agent.windows_runtime import (
|
|
|
69
68
|
RelayActionDelivery,
|
|
70
69
|
RelayPollBatch,
|
|
71
70
|
WindowsRuntimeError,
|
|
71
|
+
build_client_tls_context,
|
|
72
72
|
)
|
|
73
73
|
|
|
74
74
|
try: # FastAPI is supplied by the MCP/agent runtime extras.
|
|
@@ -1235,15 +1235,12 @@ class HttpOutboundRelayTransport(OutboundRelayTransport):
|
|
|
1235
1235
|
if not 1024 <= maximum_response_bytes <= 268_435_456:
|
|
1236
1236
|
raise ValueError("maximum_response_bytes is outside the safe range")
|
|
1237
1237
|
self._maximum_response_bytes = maximum_response_bytes
|
|
1238
|
-
context =
|
|
1239
|
-
|
|
1238
|
+
context = build_client_tls_context(
|
|
1239
|
+
ca_bundle_path=ca_bundle_path,
|
|
1240
|
+
client_certificate_path=client_certificate_path,
|
|
1241
|
+
client_private_key_path=client_private_key_path,
|
|
1242
|
+
private_key_password=private_key_password,
|
|
1240
1243
|
)
|
|
1241
|
-
if client_certificate_path and client_private_key_path:
|
|
1242
|
-
context.load_cert_chain(
|
|
1243
|
-
certfile=str(client_certificate_path),
|
|
1244
|
-
keyfile=str(client_private_key_path),
|
|
1245
|
-
password=private_key_password,
|
|
1246
|
-
)
|
|
1247
1244
|
self._opener = build_opener(_NoRedirect(), HTTPSHandler(context=context))
|
|
1248
1245
|
|
|
1249
1246
|
async def poll(
|
|
@@ -16,12 +16,14 @@ from __future__ import annotations
|
|
|
16
16
|
|
|
17
17
|
import asyncio
|
|
18
18
|
import base64
|
|
19
|
+
import contextlib
|
|
19
20
|
import hashlib
|
|
20
21
|
import json
|
|
21
22
|
import ntpath
|
|
22
23
|
import os
|
|
23
24
|
import platform
|
|
24
25
|
import socket
|
|
26
|
+
import ssl
|
|
25
27
|
import stat
|
|
26
28
|
import sys
|
|
27
29
|
from collections import OrderedDict
|
|
@@ -30,6 +32,7 @@ from datetime import UTC, datetime
|
|
|
30
32
|
from pathlib import Path, PureWindowsPath
|
|
31
33
|
from typing import Any, Protocol, TypeVar, runtime_checkable
|
|
32
34
|
|
|
35
|
+
from agent_connector_sdk.tls.resolve import resolve_tls_profile
|
|
33
36
|
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
34
37
|
|
|
35
38
|
from microsoft_agent.windows_companion import (
|
|
@@ -227,15 +230,11 @@ class PyWin32OfficeAutomation:
|
|
|
227
230
|
return {"application": application, "exported": True}
|
|
228
231
|
finally:
|
|
229
232
|
if document is not None:
|
|
230
|
-
|
|
233
|
+
with contextlib.suppress(Exception): # defensive COM cleanup
|
|
231
234
|
document.Close(False)
|
|
232
|
-
except Exception: # pragma: no cover - defensive COM cleanup
|
|
233
|
-
pass
|
|
234
235
|
if app is not None:
|
|
235
|
-
|
|
236
|
+
with contextlib.suppress(Exception): # defensive COM cleanup
|
|
236
237
|
app.Quit()
|
|
237
|
-
except Exception: # pragma: no cover - defensive COM cleanup
|
|
238
|
-
pass
|
|
239
238
|
self._pythoncom.CoUninitialize()
|
|
240
239
|
|
|
241
240
|
|
|
@@ -1303,7 +1302,35 @@ def _installed_windows_software() -> list[dict[str, str]]:
|
|
|
1303
1302
|
return sorted(found.values(), key=lambda item: item["name"].casefold())[:500]
|
|
1304
1303
|
|
|
1305
1304
|
|
|
1305
|
+
def build_client_tls_context(
|
|
1306
|
+
*,
|
|
1307
|
+
ca_bundle_path: str | os.PathLike[str] | None = None,
|
|
1308
|
+
client_certificate_path: str | os.PathLike[str] | None = None,
|
|
1309
|
+
client_private_key_path: str | os.PathLike[str] | None = None,
|
|
1310
|
+
private_key_password: str | None = None,
|
|
1311
|
+
) -> ssl.SSLContext:
|
|
1312
|
+
"""Return the verified client context for the control-plane connection.
|
|
1313
|
+
|
|
1314
|
+
Trust comes from the SDK TLS profile (``resolve_tls_profile``): a per-instance
|
|
1315
|
+
CA bundle is passed through the profile, otherwise the deployment's
|
|
1316
|
+
``MICROSOFT_*`` trust profile applies. The client certificate is loaded onto
|
|
1317
|
+
that context here because the key password is a runtime value that a profile
|
|
1318
|
+
document may not carry.
|
|
1319
|
+
"""
|
|
1320
|
+
|
|
1321
|
+
profile = {"ca_bundle_path": str(ca_bundle_path)} if ca_bundle_path else None
|
|
1322
|
+
context = resolve_tls_profile("microsoft", profile=profile).ssl_context
|
|
1323
|
+
if client_certificate_path and client_private_key_path:
|
|
1324
|
+
context.load_cert_chain(
|
|
1325
|
+
certfile=str(client_certificate_path),
|
|
1326
|
+
keyfile=str(client_private_key_path),
|
|
1327
|
+
password=private_key_password,
|
|
1328
|
+
)
|
|
1329
|
+
return context
|
|
1330
|
+
|
|
1331
|
+
|
|
1306
1332
|
__all__ = [
|
|
1333
|
+
"build_client_tls_context",
|
|
1307
1334
|
"ClipboardAdapter",
|
|
1308
1335
|
"DesktopFlowExecutor",
|
|
1309
1336
|
"NotificationAdapter",
|
|
@@ -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,10 +180,12 @@ 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
|
|
185
187
|
tests/test_transport_migration.py
|
|
188
|
+
tests/test_transport_tls.py
|
|
186
189
|
tests/test_verify_api_integration.py
|
|
187
190
|
tests/test_windows_companion.py
|
|
188
191
|
tests/test_windows_control_plane.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
|
|