agent-engine-runner-shared 0.11.8__tar.gz → 0.11.9__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 (247) hide show
  1. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/PKG-INFO +4 -4
  2. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/docs/api.md +30 -5
  3. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/pyproject.toml +4 -4
  4. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/README.md +22 -1
  5. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/bundle.py +5 -3
  6. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/definitions.py +22 -5
  7. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/executor.py +29 -5
  8. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/generate/authoring.py +3 -0
  9. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/generate/security.py +1 -1
  10. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/runtime.py +7 -1
  11. agent_engine_runner_shared-0.11.9/src/agent_engine_runner_shared/generated/workflow/v1/activity_pb2.py +61 -0
  12. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/generated/workflow/v1/activity_pb2.pyi +13 -2
  13. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/generated/workflow/v1/state_pb2.py +4 -4
  14. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/generated/workflow/v1/state_pb2.pyi +4 -2
  15. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/mcp_tools.py +32 -0
  16. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/models.py +8 -0
  17. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/secure_llm_proxy.py +36 -6
  18. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/secure_wrapper.py +8 -1
  19. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/aer.py +584 -230
  20. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/callback_delivery.py +18 -3
  21. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/drain.py +20 -0
  22. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/workflow/__init__.py +8 -0
  23. agent_engine_runner_shared-0.11.9/src/agent_engine_runner_shared/workflow/cancelled_history.py +268 -0
  24. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/workflow/client.py +33 -4
  25. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/workflow/settlement.py +14 -1
  26. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/connectors/test_bundle.py +19 -0
  27. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/connectors/test_core.py +84 -1
  28. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/connectors/test_generate.py +25 -0
  29. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/connectors/test_materialize.py +12 -0
  30. agent_engine_runner_shared-0.11.9/tests/unit/test_aer_cancelled_turn.py +374 -0
  31. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_aer_chunk_delivery_reliability.py +48 -1
  32. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_aer_durable_attempt.py +446 -20
  33. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_aer_session_finish.py +30 -9
  34. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_drain.py +14 -0
  35. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_durable_guardrail_review.py +58 -2
  36. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_mcp_tools.py +146 -0
  37. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_tool_server_startup.py +90 -1
  38. agent_engine_runner_shared-0.11.9/tests/unit/workflow/test_cancelled_history.py +347 -0
  39. agent_engine_runner_shared-0.11.8/src/agent_engine_runner_shared/generated/workflow/v1/activity_pb2.py +0 -59
  40. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/CHANGELOG.md +0 -0
  41. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/Dockerfile +0 -0
  42. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/LICENSE +0 -0
  43. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/Makefile +0 -0
  44. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/README.md +0 -0
  45. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/pydoc-markdown.yml +0 -0
  46. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/pyrightconfig.json +0 -0
  47. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/scripts/agentic-vendored-wheel-check.sh +0 -0
  48. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/__init__.py +0 -0
  49. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/__main__.py +0 -0
  50. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/a2a.py +0 -0
  51. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/a2a_auth.py +0 -0
  52. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/agent_config.py +0 -0
  53. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/async_utils.py +0 -0
  54. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/checkpoint_workspace.py +0 -0
  55. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/__init__.py +0 -0
  56. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/create_tool.py +0 -0
  57. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/generate/README.md +0 -0
  58. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/generate/__init__.py +0 -0
  59. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/generate/catalog.py +0 -0
  60. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/generate/modes.py +0 -0
  61. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/generate/naming.py +0 -0
  62. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/generate/parameters.py +0 -0
  63. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/generate/spec.py +0 -0
  64. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/connectors/materialize.py +0 -0
  65. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/context.py +0 -0
  66. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/custom_events.py +0 -0
  67. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/db_config.py +0 -0
  68. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/db_naming.py +0 -0
  69. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/error_reporting.py +0 -0
  70. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/execution.py +0 -0
  71. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/generated/__init__.py +0 -0
  72. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/generated/workflow/__init__.py +0 -0
  73. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/generated/workflow/v1/__init__.py +0 -0
  74. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/generated/workflow/v1/common_pb2.py +0 -0
  75. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/generated/workflow/v1/common_pb2.pyi +0 -0
  76. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/generated/workflow/v1/runtime_pb2.py +0 -0
  77. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/generated/workflow/v1/runtime_pb2.pyi +0 -0
  78. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/guardrails_evaluator/__init__.py +0 -0
  79. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/guardrails_evaluator/core.py +0 -0
  80. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/guardrails_evaluator/regex.py +0 -0
  81. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/hooks.py +0 -0
  82. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/http_path.py +0 -0
  83. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/launcher.py +0 -0
  84. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/mcp_oauth.py +0 -0
  85. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/mcp_oauth_cache_lock.py +0 -0
  86. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/mcp_oauth_cache_name.py +0 -0
  87. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/mcp_oauth_cli.py +0 -0
  88. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/mcp_oauth_secret.py +0 -0
  89. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/memory.py +0 -0
  90. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/memory_appbound.py +0 -0
  91. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/metrics.py +0 -0
  92. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/node_logger.py +0 -0
  93. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/owner_callback.py +0 -0
  94. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/progress.py +0 -0
  95. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/py.typed +0 -0
  96. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/runtime.py +0 -0
  97. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/__init__.py +0 -0
  98. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/auth.py +0 -0
  99. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/base.py +0 -0
  100. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/call_interrupt.py +0 -0
  101. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/chunk_types.py +0 -0
  102. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/cors.py +0 -0
  103. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/function.py +0 -0
  104. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/graph_warm.py +0 -0
  105. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/http_retry.py +0 -0
  106. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/metadata.py +0 -0
  107. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/oe_url.py +0 -0
  108. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/owner_url.py +0 -0
  109. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/query.py +0 -0
  110. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/server/tool.py +0 -0
  111. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/span_kinds.py +0 -0
  112. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/span_names.py +0 -0
  113. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/structured_logging.py +0 -0
  114. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/tls_client.py +0 -0
  115. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/tool_api_error.py +0 -0
  116. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/tool_memory_ownership.py +0 -0
  117. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/toolpod_handlers.py +0 -0
  118. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/tracing/__init__.py +0 -0
  119. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/tracing/exporters.py +0 -0
  120. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/tracing/setup.py +0 -0
  121. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/types.py +0 -0
  122. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/utils.py +0 -0
  123. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/workflow/activity.py +0 -0
  124. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/workflow/attempt.py +0 -0
  125. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/workflow/context.py +0 -0
  126. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/workflow/heartbeat.py +0 -0
  127. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/workflow/memory.py +0 -0
  128. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/src/agent_engine_runner_shared/workflow/protojson.py +0 -0
  129. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/__init__.py +0 -0
  130. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/conftest.py +0 -0
  131. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/corpus/.gitignore +0 -0
  132. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/corpus/README.md +0 -0
  133. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/corpus/__init__.py +0 -0
  134. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/corpus/fetch_corpus.py +0 -0
  135. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/corpus/manifest.json +0 -0
  136. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/corpus/test_api_corpus.py +0 -0
  137. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/integration/__init__.py +0 -0
  138. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/integration/mock_embedder.py +0 -0
  139. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/integration/test_a2a_trace_propagation.py +0 -0
  140. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/integration/test_runtime.py +0 -0
  141. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/integration/test_secure_async.py +0 -0
  142. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/integration/test_secure_sync.py +0 -0
  143. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/integration/test_tracing_otlp_wire_format.py +0 -0
  144. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/pact/conftest.py +0 -0
  145. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/pact/test_oe_provider_verification.py +0 -0
  146. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/__init__.py +0 -0
  147. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/connectors/__init__.py +0 -0
  148. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/connectors/fixtures/jira.tool_defs.yaml +0 -0
  149. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/connectors/test_create_tool.py +0 -0
  150. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_a2a.py +0 -0
  151. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_a2a_auth.py +0 -0
  152. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_aer_a2a_registration.py +0 -0
  153. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_aer_build_agent_span.py +0 -0
  154. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_aer_capability_advertise.py +0 -0
  155. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_aer_chunk_emission.py +0 -0
  156. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_aer_llm_invocation_signal.py +0 -0
  157. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_aer_metadata_payload.py +0 -0
  158. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_aer_policy_denied.py +0 -0
  159. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_aer_timeout_signal.py +0 -0
  160. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_aer_trace_context.py +0 -0
  161. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_aer_workspace_scope.py +0 -0
  162. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_agent_config.py +0 -0
  163. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_async_utils.py +0 -0
  164. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_call_interrupt.py +0 -0
  165. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_call_interrupt_contract.py +0 -0
  166. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_checkpoint_workspace.py +0 -0
  167. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_cors.py +0 -0
  168. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_create_memory_client_headers.py +0 -0
  169. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_custom_headers_context.py +0 -0
  170. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_custom_headers_models.py +0 -0
  171. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_db_naming.py +0 -0
  172. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_debug_hook.py +0 -0
  173. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_drain_contract.py +0 -0
  174. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_durable_proxies.py +0 -0
  175. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_emit_custom_event.py +0 -0
  176. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_emit_progress.py +0 -0
  177. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_error_reporting.py +0 -0
  178. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_execution.py +0 -0
  179. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_extract_turn_messages.py +0 -0
  180. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_format_llm_error.py +0 -0
  181. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_function_mode.py +0 -0
  182. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_graph_warm.py +0 -0
  183. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_guardrails_protocol.py +0 -0
  184. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_hitl_interrupt.py +0 -0
  185. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_hooks.py +0 -0
  186. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_http_path.py +0 -0
  187. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_http_retry.py +0 -0
  188. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_launcher.py +0 -0
  189. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_listen_host.py +0 -0
  190. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_llm_credential_classification.py +0 -0
  191. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_llm_routing.py +0 -0
  192. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_mcp_oauth.py +0 -0
  193. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_mcp_oauth_cli.py +0 -0
  194. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_mcp_oauth_secret.py +0 -0
  195. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_memory_appbound.py +0 -0
  196. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_memory_search_metadata.py +0 -0
  197. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_memory_writer_context.py +0 -0
  198. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_metadata.py +0 -0
  199. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_metrics.py +0 -0
  200. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_models.py +0 -0
  201. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_no_lc_imports.py +0 -0
  202. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_node_logger.py +0 -0
  203. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_oe_url.py +0 -0
  204. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_owner_callback.py +0 -0
  205. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_owner_url.py +0 -0
  206. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_payload_context.py +0 -0
  207. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_query_routes.py +0 -0
  208. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_request_id_context.py +0 -0
  209. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_resume_payload.py +0 -0
  210. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_runtime_build_context_from_sources.py +0 -0
  211. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_runtime_checkpoint_workspace.py +0 -0
  212. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_runtime_custom_memory.py +0 -0
  213. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_runtime_memory_context.py +0 -0
  214. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_runtime_models.py +0 -0
  215. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_runtime_register_tool.py +0 -0
  216. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_secure_llm_proxy.py +0 -0
  217. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_secure_wrapper.py +0 -0
  218. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_server_auth.py +0 -0
  219. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_server_health.py +0 -0
  220. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_server_shutdown.py +0 -0
  221. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_session_filesystem_isolation.py +0 -0
  222. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_session_finish_context.py +0 -0
  223. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_structured_logging.py +0 -0
  224. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_thinking_tokens.py +0 -0
  225. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_tls_client.py +0 -0
  226. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_tls_client_integration.py +0 -0
  227. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_token_capture.py +0 -0
  228. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_tool.py +0 -0
  229. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_tool_api_error.py +0 -0
  230. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_tool_authorization.py +0 -0
  231. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_tool_cancellation_boundary.py +0 -0
  232. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_tool_deserialization.py +0 -0
  233. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_tool_log_redaction.py +0 -0
  234. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_tool_memory_ownership.py +0 -0
  235. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_tool_trace_context.py +0 -0
  236. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_toolpod_handlers.py +0 -0
  237. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_tracing_exporter.py +0 -0
  238. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/test_tracing_retry.py +0 -0
  239. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/workflow/test_activity.py +0 -0
  240. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/workflow/test_attempt.py +0 -0
  241. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/workflow/test_client.py +0 -0
  242. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/workflow/test_context.py +0 -0
  243. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/workflow/test_heartbeat.py +0 -0
  244. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/workflow/test_memory.py +0 -0
  245. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/workflow/test_protojson.py +0 -0
  246. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/workflow/test_protojson_helpers.py +0 -0
  247. {agent_engine_runner_shared-0.11.8 → agent_engine_runner_shared-0.11.9}/tests/unit/workflow/test_settlement.py +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agent-engine-runner-shared
3
- Version: 0.11.8
3
+ Version: 0.11.9
4
4
  Summary: Runner SDK - Framework-agnostic agent runtime
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE
7
7
  Requires-Python: >=3.11
8
- Requires-Dist: agent-engine-sdk-memory==0.11.8
9
- Requires-Dist: agent-engine-sdk==0.11.8
8
+ Requires-Dist: agent-engine-sdk-memory==0.11.9
9
+ Requires-Dist: agent-engine-sdk==0.11.9
10
10
  Requires-Dist: fastapi>=0.141.1
11
11
  Requires-Dist: filelock>=3.0.0
12
12
  Requires-Dist: httpx-sse>=0.4.0
@@ -20,7 +20,7 @@ Requires-Dist: python-dotenv>=1.0.0
20
20
  Requires-Dist: pyyaml>=6.0
21
21
  Requires-Dist: regex>=2026.4.4
22
22
  Requires-Dist: sentry-sdk>=2.27.0
23
- Requires-Dist: starlette>=1.4.1
23
+ Requires-Dist: starlette>=1.7.0
24
24
  Requires-Dist: uvicorn>=0.32.0
25
25
  Provides-Extra: debug
26
26
  Requires-Dist: debugpy>=1.8.0; extra == 'debug'
@@ -166,6 +166,7 @@
166
166
  * [register\_guardrail\_policy\_engine](#agent_engine_runner_shared.guardrails_evaluator.core.register_guardrail_policy_engine)
167
167
  * [evaluate\_guardrail\_check](#agent_engine_runner_shared.guardrails_evaluator.core.evaluate_guardrail_check)
168
168
  * [agent\_engine\_runner\_shared.secure\_llm\_proxy](#agent_engine_runner_shared.secure_llm_proxy)
169
+ * [GuardrailReviewPending](#agent_engine_runner_shared.secure_llm_proxy.GuardrailReviewPending)
169
170
  * [guardrail\_review\_wait\_id](#agent_engine_runner_shared.secure_llm_proxy.guardrail_review_wait_id)
170
171
  * [SecureLLMProxy](#agent_engine_runner_shared.secure_llm_proxy.SecureLLMProxy)
171
172
  * [step\_counter](#agent_engine_runner_shared.secure_llm_proxy.SecureLLMProxy.step_counter)
@@ -181,6 +182,7 @@
181
182
  * [raise\_for\_oe\_rejection](#agent_engine_runner_shared.secure_wrapper.raise_for_oe_rejection)
182
183
  * [ToolCallTimeoutError](#agent_engine_runner_shared.secure_wrapper.ToolCallTimeoutError)
183
184
  * [OperationalStepAllocator](#agent_engine_runner_shared.secure_wrapper.OperationalStepAllocator)
185
+ * [allocation\_count](#agent_engine_runner_shared.secure_wrapper.OperationalStepAllocator.allocation_count)
184
186
  * [ExternalAPICallError](#agent_engine_runner_shared.secure_wrapper.ExternalAPICallError)
185
187
  * [LLMInvocationError](#agent_engine_runner_shared.secure_wrapper.LLMInvocationError)
186
188
  * [request\_oe\_approval](#agent_engine_runner_shared.secure_wrapper.request_oe_approval)
@@ -2623,6 +2625,16 @@ The proxy packages intercepted invoke_llm requests for the Orchestration Engine
2623
2625
  and unwraps the streamed OE relay back into sdk-core models. The OE owns
2624
2626
  approval, routing, live SSE relay, and final audit/result recording.
2625
2627
 
2628
+ <a id="agent_engine_runner_shared.secure_llm_proxy.GuardrailReviewPending"></a>
2629
+
2630
+ ## GuardrailReviewPending
2631
+
2632
+ ```python
2633
+ class GuardrailReviewPending(Exception)
2634
+ ```
2635
+
2636
+ A recorded halt whose adapter emits its native wait after the LLM call.
2637
+
2626
2638
  <a id="agent_engine_runner_shared.secure_llm_proxy.guardrail_review_wait_id"></a>
2627
2639
 
2628
2640
  #### guardrail\_review\_wait\_id
@@ -2691,11 +2703,14 @@ Collect streamed sdk-core chunks into a final sdk-core LLMResponse.
2691
2703
  #### stream
2692
2704
 
2693
2705
  ```python
2694
- def stream(messages: list[Message],
2695
- step: int | None = None,
2696
- stop: list[str] | None = None,
2697
- options: LLMInvocationOptions | None = None,
2698
- activity_key: str | None = None) -> Iterator[LLMStreamChunk]
2706
+ def stream(
2707
+ messages: list[Message],
2708
+ step: int | None = None,
2709
+ stop: list[str] | None = None,
2710
+ options: LLMInvocationOptions | None = None,
2711
+ activity_key: str | None = None,
2712
+ pending_review: GuardrailReviewPending | None = None
2713
+ ) -> Iterator[LLMStreamChunk]
2699
2714
  ```
2700
2715
 
2701
2716
  Stream invoke_llm chunks through OE approval and OE-owned SSE relay.
@@ -2818,6 +2833,16 @@ Process-local operational step_number mint for one AER execution.
2818
2833
  Shared by SecureToolWrapper and SecureLLMProxy so parallel tools and LLM
2819
2834
  calls cannot collide under a single AER. Not a multi-OE authority.
2820
2835
 
2836
+ <a id="agent_engine_runner_shared.secure_wrapper.OperationalStepAllocator.allocation_count"></a>
2837
+
2838
+ #### allocation\_count
2839
+
2840
+ ```python
2841
+ def allocation_count() -> int
2842
+ ```
2843
+
2844
+ Count minted request slots independently of replayed step watermarks.
2845
+
2821
2846
  <a id="agent_engine_runner_shared.secure_wrapper.ExternalAPICallError"></a>
2822
2847
 
2823
2848
  ## ExternalAPICallError
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agent-engine-runner-shared"
3
- version = "0.11.8"
3
+ version = "0.11.9"
4
4
  description = "Runner SDK - Framework-agnostic agent runtime"
5
5
  readme = "README.md"
6
6
  license = {text = "Apache-2.0"}
@@ -11,7 +11,7 @@ dependencies = [
11
11
  # floor: older starlette rebuilds url.path from the Host header with no
12
12
  # validation, which can disagree with scope["path"]. The
13
13
  # Host-validating _HOST_RE landed in starlette 1.4.1.
14
- "starlette>=1.4.1",
14
+ "starlette>=1.7.0",
15
15
  "uvicorn>=0.32.0",
16
16
  "pydantic>=2.0.0",
17
17
  "protobuf>=6.33.6,<7",
@@ -23,9 +23,9 @@ dependencies = [
23
23
  "jsonschema>=4.26.0",
24
24
  "sentry-sdk>=2.27.0",
25
25
  # BaseAgent protocol and AgentInput/AgentEvent models
26
- "agent-engine-sdk==0.11.8",
26
+ "agent-engine-sdk==0.11.9",
27
27
  # Memory models and the MemoryClient HTTP client
28
- "agent-engine-sdk-memory==0.11.8",
28
+ "agent-engine-sdk-memory==0.11.9",
29
29
  # Required for checkpoint message decoding (query/sessions endpoints)
30
30
  "msgpack>=1.0.0",
31
31
  # Required by guardrails_evaluator/regex.py for advanced regex matching
@@ -42,6 +42,25 @@ auth:
42
42
  env: JIRA_TOKEN
43
43
  ```
44
44
 
45
+ For delegated OAuth, replace that auth block with an explicit provider binding:
46
+
47
+ ```yaml
48
+ auth:
49
+ type: oauth
50
+ provider_type: github
51
+ scopes: [repo]
52
+ ```
53
+
54
+ `provider_type` is the key of a provider configured for the project, independent
55
+ of the resource API's base URL. The scopes apply to every exposed operation in
56
+ this connector. Registration carries this policy outside the model's argument
57
+ schema. The Orchestration Engine resolves a credential for the saved application
58
+ user and passes it to the Tool Pod for that invocation. A missing or invalid token
59
+ stops the HTTP call; OAuth never falls back to a tenant environment secret.
60
+ Existing static auth modes continue to use their configured environment bindings.
61
+ Catalog regeneration preserves the authored OAuth binding and records only
62
+ secret-free Bearer presentation in the catalog.
63
+
45
64
  The pre-materialized index paths are relative to the index and must remain inside its
46
65
  directory. AER loads the schemas as ordinary remote tools. Tool Pod startup loads the
47
66
  same materialized view and owns one `ConnectorExecutor` per connector.
@@ -52,7 +71,9 @@ same materialized view and owns one `ConnectorExecutor` per connector.
52
71
 
53
72
  Own one `ConnectorExecutor(definitions)` per connector in a Tool Pod process. Call
54
73
  `execute(tool_name, arguments, env=tenant_secrets)` after authorization; the environment
55
- mapping is request-local and defaults to the tenant-owned process environment. Close
74
+ mapping is request-local and defaults to the tenant-owned process environment for
75
+ static auth. OAuth additionally requires `authorization=ToolAuthorization(...)`;
76
+ the Tool Pod supplies it from request context and the executor never retains it. Close
56
77
  the executor at shutdown after in-flight calls finish, or use it as a context manager.
57
78
 
58
79
  The compiled format is the stable `source`, `auth`, `tools`, `params` and
@@ -95,14 +95,16 @@ class BundledTool:
95
95
 
96
96
  @property
97
97
  def registration_metadata(self) -> dict[str, Any]:
98
- """Return the shared AER and Tool Pod registration policy."""
98
+ """Return detached AER/Tool Pod policy, with delegated binding outside the schema."""
99
99
  operation = self.operation
100
+ auth = self.connector.definitions.auth
101
+ delegated = auth if auth is not None and auth.type == "oauth" else None
100
102
  return {
101
103
  "name": operation.name,
102
104
  "description": operation.description.strip() or f"REST connector tool {operation.name}",
103
105
  "is_local": False,
104
- "provider_type": None,
105
- "scopes": [],
106
+ "provider_type": delegated.provider_type if delegated else None,
107
+ "scopes": list(delegated.scopes) if delegated else [],
106
108
  "network": self.network,
107
109
  "timeout_seconds": DEFAULT_EXECUTION_TIMEOUT_SECONDS,
108
110
  "redact_fields": [],
@@ -162,8 +162,14 @@ class Credential(_Model):
162
162
 
163
163
 
164
164
  class Auth(_Model):
165
- type: Literal["none", "bearer", "api_key", "basic", "api_keys"] = Field(
166
- default="none", description="Static auth presentation"
165
+ type: Literal["none", "bearer", "api_key", "basic", "api_keys", "oauth"] = Field(
166
+ default="none", description="Static auth presentation or request-local delegated OAuth"
167
+ )
168
+ provider_type: str | None = Field(
169
+ default=None, description="Project-scoped Broker provider key"
170
+ )
171
+ scopes: list[str] = Field(
172
+ default_factory=list, description="Connector-wide delegated permissions"
167
173
  )
168
174
  env: str | None = Field(default=None, description="Tenant secret environment reference")
169
175
  header: str | None = Field(default=None, description="API key header name")
@@ -189,12 +195,23 @@ class Auth(_Model):
189
195
  "api_key": {"type", "env", "header", "location", "name", "prefix", "headers"},
190
196
  "basic": {"type", "username_env", "password_env", "headers"},
191
197
  "api_keys": {"type", "credentials", "headers"},
198
+ "oauth": {"type", "provider_type", "scopes", "headers"},
192
199
  }[self.type]
193
200
  if configured - allowed:
194
201
  raise ValueError(f"{self.type} auth contains fields for another auth type")
195
202
 
196
203
  credential_headers: set[str] = set()
197
- if self.type == "bearer":
204
+ if self.type == "oauth":
205
+ if not self.provider_type or any(
206
+ ord(character) <= 32 or ord(character) >= 127 for character in self.provider_type
207
+ ):
208
+ raise ValueError("OAuth auth requires an explicit provider key without whitespace")
209
+ if len(set(self.scopes)) != len(self.scopes) or any(
210
+ re.fullmatch(r"[!\x23-\x5B\x5D-\x7E]+", scope) is None for scope in self.scopes
211
+ ):
212
+ raise ValueError("OAuth scopes must be unique OAuth scope tokens")
213
+ credential_headers.add("authorization")
214
+ elif self.type == "bearer":
198
215
  if not _validate_secret_env(self.env):
199
216
  raise ValueError("bearer auth requires one tenant secret env")
200
217
  credential_headers.add("authorization")
@@ -235,7 +252,7 @@ class Auth(_Model):
235
252
 
236
253
  def header_name(self) -> str | None:
237
254
  """Return the single generated auth header, when this auth shape has one."""
238
- if self.type == "bearer":
255
+ if self.type in ("bearer", "oauth"):
239
256
  return "Authorization"
240
257
  if self.type == "api_key":
241
258
  if (self.location or "header") == "header":
@@ -244,7 +261,7 @@ class Auth(_Model):
244
261
 
245
262
  def header_names(self) -> set[str]:
246
263
  """List auth-controlled headers so model parameters cannot collide with them."""
247
- if self.type in ("bearer", "basic"):
264
+ if self.type in ("bearer", "basic", "oauth"):
248
265
  names = {"authorization"}
249
266
  elif self.type == "api_key" and (header_name := self.header_name()):
250
267
  names = {header_name.lower()}
@@ -27,6 +27,7 @@ from agent_engine_runner_shared.connectors.definitions import (
27
27
  validate_segment,
28
28
  validate_url,
29
29
  )
30
+ from agent_engine_runner_shared.models import ToolAuthorization
30
31
  from agent_engine_runner_shared.utils import tenant_env_vars
31
32
 
32
33
  __all__ = ["DEFAULT_EXECUTION_TIMEOUT_SECONDS", "ConnectorExecutor"]
@@ -101,7 +102,11 @@ class ConnectorExecutor:
101
102
  self._transport.close()
102
103
 
103
104
  def _prepare_request(
104
- self, tool: Operation, arguments: dict[str, Any], env: Mapping[str, str] | None
105
+ self,
106
+ tool: Operation,
107
+ arguments: dict[str, Any],
108
+ env: Mapping[str, str] | None,
109
+ authorization: ToolAuthorization | None,
105
110
  ) -> tuple[
106
111
  httpx.URL,
107
112
  dict[str, str],
@@ -178,7 +183,7 @@ class ConnectorExecutor:
178
183
  ]
179
184
  if pairs:
180
185
  headers["Cookie"] = "; ".join(pairs)
181
- base_url, auth_query, has_path_auth = self._apply_auth(headers, query, env)
186
+ base_url, auth_query, has_path_auth = self._apply_auth(headers, query, env, authorization)
182
187
  content, content_type = self._request_body(tool, arguments)
183
188
  if content_type:
184
189
  headers["Content-Type"] = content_type
@@ -200,8 +205,9 @@ class ConnectorExecutor:
200
205
  headers: dict[str, str],
201
206
  query: list[tuple[str, Any]],
202
207
  env: Mapping[str, str] | None,
208
+ authorization: ToolAuthorization | None,
203
209
  ) -> tuple[str, list[tuple[str, str]], bool]:
204
- """Place materialized credentials exactly where the definition declares them.
210
+ """Attach explicit delegated authorization or the configured static credentials.
205
211
 
206
212
  Query credentials are returned so same-origin redirects can preserve them.
207
213
  Path-authenticated requests reject redirects because moving the credential
@@ -212,6 +218,18 @@ class ConnectorExecutor:
212
218
  if not auth or auth.type == "none":
213
219
  return base_url, [], False
214
220
 
221
+ if auth.type == "oauth":
222
+ # Delegated calls must never fall back to a process/tenant secret;
223
+ # the existing OE gate binds this authorization to the saved user.
224
+ token = authorization.token if authorization else None
225
+ if not token or any(
226
+ ord(character) <= 32 or ord(character) >= 127 for character in token
227
+ ):
228
+ raise ValueError("delegated connector token is missing or invalid")
229
+ headers["Authorization"] = f"Bearer {token}"
230
+ headers.update(auth.headers or {})
231
+ return base_url, [], False
232
+
215
233
  secrets = env if env is not None else tenant_env_vars()
216
234
  auth_query: list[tuple[str, str]] = []
217
235
  has_path_auth = False
@@ -304,13 +322,19 @@ class ConnectorExecutor:
304
322
  return None, None
305
323
 
306
324
  def execute(
307
- self, name: str, arguments: dict[str, Any], *, env: Mapping[str, str] | None = None
325
+ self,
326
+ name: str,
327
+ arguments: dict[str, Any],
328
+ *,
329
+ env: Mapping[str, str] | None = None,
330
+ authorization: ToolAuthorization | None = None,
308
331
  ) -> str:
309
332
  """Execute a named compiled operation and return bounded UTF-8 response text.
310
333
 
311
334
  Invalid definitions/arguments/secrets raise ValueError before dispatch.
312
335
  HTTP and transport failures use httpx exceptions understood by ToolAPIError.
313
336
  Only GET/HEAD/OPTIONS retry 429/503; writes are never automatically replayed.
337
+ OAuth requires explicit request-local authorization; static modes ignore it.
314
338
  """
315
339
  deadline = time.monotonic() + self._timeout_seconds
316
340
  tool = self._operations.get(name)
@@ -318,7 +342,7 @@ class ConnectorExecutor:
318
342
  raise ValueError("unknown connector tool")
319
343
  try:
320
344
  url, headers, content, auth_query, has_path_auth = self._prepare_request(
321
- tool, arguments, env
345
+ tool, arguments, env, authorization
322
346
  )
323
347
  except RecursionError:
324
348
  # Pathological nesting exhausts the interpreter stack in the
@@ -135,6 +135,9 @@ def _guidance_comment(base_url: str, auth: Auth | None) -> str:
135
135
  granted = ", ".join(_quote(env) for env in envs)
136
136
  lines.append(f"# secret grant {granted} to the tool sandbox under")
137
137
  lines.append("# sandboxes.tool.secrets (sandboxes requires an agent block)")
138
+ elif auth is not None and auth.type == "oauth":
139
+ lines.append("# auth delegated OAuth; configure the named provider for this project")
140
+ lines.append("# secret none required in the tool sandbox; tokens are request-local")
138
141
  else:
139
142
  lines.append("# secret none required; this connector authenticates anonymously")
140
143
  return "\n".join(lines) + "\n"
@@ -118,7 +118,7 @@ def _catalog_override(auth: Auth | None) -> dict[str, Any] | None:
118
118
  return None
119
119
  if auth.type == "none":
120
120
  return {}
121
- if auth.type == "bearer":
121
+ if auth.type in ("bearer", "oauth"):
122
122
  return {"type": "bearer", **({"headers": auth.headers} if auth.headers else {})}
123
123
  if auth.type == "basic":
124
124
  return {"type": "basic", **({"headers": auth.headers} if auth.headers else {})}
@@ -9,6 +9,7 @@ from typing import Any, Callable, Iterator, Mapping
9
9
 
10
10
  from agent_engine_runner_shared.connectors.bundle import BundledTool, ConnectorBundle
11
11
  from agent_engine_runner_shared.connectors.executor import ConnectorExecutor
12
+ from agent_engine_runner_shared.context import get_current_authorization
12
13
 
13
14
  __all__ = ["ConnectorToolRegistration", "ConnectorToolRuntime"]
14
15
 
@@ -68,11 +69,16 @@ class ConnectorToolRuntime:
68
69
 
69
70
  @staticmethod
70
71
  def _make_callable(executor: ConnectorExecutor, tool_name: str) -> Callable[..., str]:
72
+ """Bind a tool name; capture credentials only when its invocation runs."""
73
+
71
74
  def execute(**arguments: Any) -> str:
75
+ """Execute with this worker's captured environment and delegated authorization."""
72
76
  env = _current_connector_env.get()
73
77
  if env is None:
74
78
  raise RuntimeError("connector invocation environment is unavailable")
75
- return executor.execute(tool_name, arguments, env=env)
79
+ return executor.execute(
80
+ tool_name, arguments, env=env, authorization=get_current_authorization()
81
+ )
76
82
 
77
83
  execute.__name__ = tool_name
78
84
  return execute
@@ -0,0 +1,61 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # NO CHECKED-IN PROTOBUF GENCODE
4
+ # source: workflow/v1/activity.proto
5
+ # Protobuf Python Version: 6.33.5
6
+ """Generated protocol buffer code."""
7
+ from google.protobuf import descriptor as _descriptor
8
+ from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import runtime_version as _runtime_version
10
+ from google.protobuf import symbol_database as _symbol_database
11
+ from google.protobuf.internal import builder as _builder
12
+ _runtime_version.ValidateProtobufRuntimeVersion(
13
+ _runtime_version.Domain.PUBLIC,
14
+ 6,
15
+ 33,
16
+ 5,
17
+ '',
18
+ 'workflow/v1/activity.proto'
19
+ )
20
+ # @@protoc_insertion_point(imports)
21
+
22
+ _sym_db = _symbol_database.Default()
23
+
24
+
25
+ from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
26
+ from agent_engine_runner_shared.generated.workflow.v1 import common_pb2 as workflow_dot_v1_dot_common__pb2
27
+
28
+
29
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1aworkflow/v1/activity.proto\x12\x1bmongodb.agentic.workflow.v1\x1a\x1cgoogle/protobuf/struct.proto\x1a\x18workflow/v1/common.proto\"\x91\x04\n\x0f\x41\x63tivityCommand\x12Z\n\x11workflow_identity\x18\x01 \x01(\x0b\x32-.mongodb.agentic.workflow.v1.WorkflowIdentityR\x10workflowIdentity\x12\x1d\n\nattempt_id\x18\x02 \x01(\tR\tattemptId\x12#\n\rfencing_token\x18\x03 \x01(\x03R\x0c\x66\x65ncingToken\x12I\n\x08position\x18\x04 \x01(\x0b\x32-.mongodb.agentic.workflow.v1.ActivityPositionR\x08position\x12N\n\ractivity_kind\x18\x05 \x01(\x0e\x32).mongodb.agentic.workflow.v1.ActivityKindR\x0c\x61\x63tivityKind\x12#\n\ractivity_name\x18\x06 \x01(\tR\x0c\x61\x63tivityName\x12=\n\x0esemantic_input\x18\x07 \x01(\x0b\x32\x16.google.protobuf.ValueR\rsemanticInput\x12_\n\x12on_unknown_outcome\x18\x08 \x01(\x0e\x32\x31.mongodb.agentic.workflow.v1.UnknownOutcomePolicyR\x10onUnknownOutcome\"\xd2\x01\n\x0f\x41\x63tivityContext\x12Z\n\x11workflow_identity\x18\x01 \x01(\x0b\x32-.mongodb.agentic.workflow.v1.WorkflowIdentityR\x10workflowIdentity\x12\x1f\n\x0b\x61\x63tivity_id\x18\x02 \x01(\tR\nactivityId\x12\x1d\n\nattempt_id\x18\x03 \x01(\tR\tattemptId\x12#\n\rfencing_token\x18\x04 \x01(\x03R\x0c\x66\x65ncingToken\"_\n\x12\x41\x63tivitySuspension\x12\x16\n\x06reason\x18\x01 \x01(\tR\x06reason\x12\x31\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x17.google.protobuf.StructR\x07\x63ontext\"@\n\x0bMemoryWrite\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12!\n\x0cpayload_json\x18\x02 \x01(\x0cR\x0bpayloadJson\"\xf0\x03\n\x0f\x41\x63tivityOutcome\x12Z\n\x11workflow_identity\x18\x01 \x01(\x0b\x32-.mongodb.agentic.workflow.v1.WorkflowIdentityR\x10workflowIdentity\x12\x1f\n\x0b\x61\x63tivity_id\x18\x02 \x01(\tR\nactivityId\x12\x1d\n\nattempt_id\x18\x03 \x01(\tR\tattemptId\x12#\n\rfencing_token\x18\x04 \x01(\x03R\x0c\x66\x65ncingToken\x12S\n\x0coutcome_kind\x18\x05 \x01(\x0e\x32\x30.mongodb.agentic.workflow.v1.ActivityOutcomeKindR\x0boutcomeKind\x12.\n\x06result\x18\x06 \x01(\x0b\x32\x16.google.protobuf.ValueR\x06result\x12@\n\x05\x65rror\x18\x07 \x01(\x0b\x32*.mongodb.agentic.workflow.v1.WorkflowErrorR\x05\x65rror\x12O\n\nsuspension\x18\x08 \x01(\x0b\x32/.mongodb.agentic.workflow.v1.ActivitySuspensionR\nsuspensionJ\x04\x08\t\x10\n\"\xa7\x02\n\x15\x41\x63tivityMemoryCommand\x12Z\n\x11workflow_identity\x18\x01 \x01(\x0b\x32-.mongodb.agentic.workflow.v1.WorkflowIdentityR\x10workflowIdentity\x12\x1f\n\x0b\x61\x63tivity_id\x18\x02 \x01(\tR\nactivityId\x12\x1d\n\nattempt_id\x18\x03 \x01(\tR\tattemptId\x12#\n\rfencing_token\x18\x04 \x01(\x03R\x0c\x66\x65ncingToken\x12M\n\rmemory_writes\x18\x05 \x03(\x0b\x32(.mongodb.agentic.workflow.v1.MemoryWriteR\x0cmemoryWrites\"\xe5\x02\n\x13StepSuspensionEntry\x12I\n\x08position\x18\x01 \x01(\x0b\x32-.mongodb.agentic.workflow.v1.ActivityPositionR\x08position\x12N\n\ractivity_kind\x18\x02 \x01(\x0e\x32).mongodb.agentic.workflow.v1.ActivityKindR\x0c\x61\x63tivityKind\x12#\n\ractivity_name\x18\x03 \x01(\tR\x0c\x61\x63tivityName\x12=\n\x0esemantic_input\x18\x04 \x01(\x0b\x32\x16.google.protobuf.ValueR\rsemanticInput\x12O\n\nsuspension\x18\x05 \x01(\x0b\x32/.mongodb.agentic.workflow.v1.ActivitySuspensionR\nsuspension\"\xa6\x01\n\x11StepActivityEntry\x12I\n\x08position\x18\x01 \x01(\x0b\x32-.mongodb.agentic.workflow.v1.ActivityPositionR\x08position\x12\x46\n\x07outcome\x18\x02 \x01(\x0b\x32,.mongodb.agentic.workflow.v1.ActivityOutcomeR\x07outcome\"\xf6\x01\n\x18\x41\x63tivityHeartbeatRequest\x12Z\n\x11workflow_identity\x18\x01 \x01(\x0b\x32-.mongodb.agentic.workflow.v1.WorkflowIdentityR\x10workflowIdentity\x12\x1f\n\x0b\x61\x63tivity_id\x18\x02 \x01(\tR\nactivityId\x12\x1d\n\nattempt_id\x18\x03 \x01(\tR\tattemptId\x12#\n\rfencing_token\x18\x04 \x01(\x03R\x0c\x66\x65ncingToken\x12\x19\n\x08owner_id\x18\x05 \x01(\tR\x07ownerId*v\n\x0c\x41\x63tivityKind\x12\x1d\n\x19\x41\x43TIVITY_KIND_UNSPECIFIED\x10\x00\x12\x15\n\x11\x41\x43TIVITY_KIND_LLM\x10\x01\x12\x16\n\x12\x41\x43TIVITY_KIND_TOOL\x10\x02\x12\x18\n\x14\x41\x43TIVITY_KIND_MEMORY\x10\x03*\xca\x01\n\x13\x41\x63tivityOutcomeKind\x12%\n!ACTIVITY_OUTCOME_KIND_UNSPECIFIED\x10\x00\x12#\n\x1f\x41\x43TIVITY_OUTCOME_KIND_COMPLETED\x10\x01\x12 \n\x1c\x41\x43TIVITY_OUTCOME_KIND_FAILED\x10\x02\x12 \n\x1c\x41\x43TIVITY_OUTCOME_KIND_DENIED\x10\x03\x12#\n\x1f\x41\x43TIVITY_OUTCOME_KIND_SUSPENDED\x10\x04*\x81\x01\n\x14UnknownOutcomePolicy\x12&\n\"UNKNOWN_OUTCOME_POLICY_UNSPECIFIED\x10\x00\x12\x1f\n\x1bUNKNOWN_OUTCOME_POLICY_FAIL\x10\x01\x12 \n\x1cUNKNOWN_OUTCOME_POLICY_RERUN\x10\x02\x42@Z>github.com/10gen/agentic-platform/proto/workflow/v1;workflowv1b\x06proto3')
30
+
31
+ _globals = globals()
32
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
33
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'workflow.v1.activity_pb2', _globals)
34
+ if not _descriptor._USE_C_DESCRIPTORS:
35
+ _globals['DESCRIPTOR']._loaded_options = None
36
+ _globals['DESCRIPTOR']._serialized_options = b'Z>github.com/10gen/agentic-platform/proto/workflow/v1;workflowv1'
37
+ _globals['_ACTIVITYKIND']._serialized_start=2598
38
+ _globals['_ACTIVITYKIND']._serialized_end=2716
39
+ _globals['_ACTIVITYOUTCOMEKIND']._serialized_start=2719
40
+ _globals['_ACTIVITYOUTCOMEKIND']._serialized_end=2921
41
+ _globals['_UNKNOWNOUTCOMEPOLICY']._serialized_start=2924
42
+ _globals['_UNKNOWNOUTCOMEPOLICY']._serialized_end=3053
43
+ _globals['_ACTIVITYCOMMAND']._serialized_start=116
44
+ _globals['_ACTIVITYCOMMAND']._serialized_end=645
45
+ _globals['_ACTIVITYCONTEXT']._serialized_start=648
46
+ _globals['_ACTIVITYCONTEXT']._serialized_end=858
47
+ _globals['_ACTIVITYSUSPENSION']._serialized_start=860
48
+ _globals['_ACTIVITYSUSPENSION']._serialized_end=955
49
+ _globals['_MEMORYWRITE']._serialized_start=957
50
+ _globals['_MEMORYWRITE']._serialized_end=1021
51
+ _globals['_ACTIVITYOUTCOME']._serialized_start=1024
52
+ _globals['_ACTIVITYOUTCOME']._serialized_end=1520
53
+ _globals['_ACTIVITYMEMORYCOMMAND']._serialized_start=1523
54
+ _globals['_ACTIVITYMEMORYCOMMAND']._serialized_end=1818
55
+ _globals['_STEPSUSPENSIONENTRY']._serialized_start=1821
56
+ _globals['_STEPSUSPENSIONENTRY']._serialized_end=2178
57
+ _globals['_STEPACTIVITYENTRY']._serialized_start=2181
58
+ _globals['_STEPACTIVITYENTRY']._serialized_end=2347
59
+ _globals['_ACTIVITYHEARTBEATREQUEST']._serialized_start=2350
60
+ _globals['_ACTIVITYHEARTBEATREQUEST']._serialized_end=2596
61
+ # @@protoc_insertion_point(module_scope)
@@ -23,6 +23,12 @@ class ActivityOutcomeKind(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
23
23
  ACTIVITY_OUTCOME_KIND_FAILED: _ClassVar[ActivityOutcomeKind]
24
24
  ACTIVITY_OUTCOME_KIND_DENIED: _ClassVar[ActivityOutcomeKind]
25
25
  ACTIVITY_OUTCOME_KIND_SUSPENDED: _ClassVar[ActivityOutcomeKind]
26
+
27
+ class UnknownOutcomePolicy(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
28
+ __slots__ = ()
29
+ UNKNOWN_OUTCOME_POLICY_UNSPECIFIED: _ClassVar[UnknownOutcomePolicy]
30
+ UNKNOWN_OUTCOME_POLICY_FAIL: _ClassVar[UnknownOutcomePolicy]
31
+ UNKNOWN_OUTCOME_POLICY_RERUN: _ClassVar[UnknownOutcomePolicy]
26
32
  ACTIVITY_KIND_UNSPECIFIED: ActivityKind
27
33
  ACTIVITY_KIND_LLM: ActivityKind
28
34
  ACTIVITY_KIND_TOOL: ActivityKind
@@ -32,9 +38,12 @@ ACTIVITY_OUTCOME_KIND_COMPLETED: ActivityOutcomeKind
32
38
  ACTIVITY_OUTCOME_KIND_FAILED: ActivityOutcomeKind
33
39
  ACTIVITY_OUTCOME_KIND_DENIED: ActivityOutcomeKind
34
40
  ACTIVITY_OUTCOME_KIND_SUSPENDED: ActivityOutcomeKind
41
+ UNKNOWN_OUTCOME_POLICY_UNSPECIFIED: UnknownOutcomePolicy
42
+ UNKNOWN_OUTCOME_POLICY_FAIL: UnknownOutcomePolicy
43
+ UNKNOWN_OUTCOME_POLICY_RERUN: UnknownOutcomePolicy
35
44
 
36
45
  class ActivityCommand(_message.Message):
37
- __slots__ = ("workflow_identity", "attempt_id", "fencing_token", "position", "activity_kind", "activity_name", "semantic_input")
46
+ __slots__ = ("workflow_identity", "attempt_id", "fencing_token", "position", "activity_kind", "activity_name", "semantic_input", "on_unknown_outcome")
38
47
  WORKFLOW_IDENTITY_FIELD_NUMBER: _ClassVar[int]
39
48
  ATTEMPT_ID_FIELD_NUMBER: _ClassVar[int]
40
49
  FENCING_TOKEN_FIELD_NUMBER: _ClassVar[int]
@@ -42,6 +51,7 @@ class ActivityCommand(_message.Message):
42
51
  ACTIVITY_KIND_FIELD_NUMBER: _ClassVar[int]
43
52
  ACTIVITY_NAME_FIELD_NUMBER: _ClassVar[int]
44
53
  SEMANTIC_INPUT_FIELD_NUMBER: _ClassVar[int]
54
+ ON_UNKNOWN_OUTCOME_FIELD_NUMBER: _ClassVar[int]
45
55
  workflow_identity: _common_pb2.WorkflowIdentity
46
56
  attempt_id: str
47
57
  fencing_token: int
@@ -49,7 +59,8 @@ class ActivityCommand(_message.Message):
49
59
  activity_kind: ActivityKind
50
60
  activity_name: str
51
61
  semantic_input: _struct_pb2.Value
52
- def __init__(self, workflow_identity: _Optional[_Union[_common_pb2.WorkflowIdentity, _Mapping]] = ..., attempt_id: _Optional[str] = ..., fencing_token: _Optional[int] = ..., position: _Optional[_Union[_common_pb2.ActivityPosition, _Mapping]] = ..., activity_kind: _Optional[_Union[ActivityKind, str]] = ..., activity_name: _Optional[str] = ..., semantic_input: _Optional[_Union[_struct_pb2.Value, _Mapping]] = ...) -> None: ...
62
+ on_unknown_outcome: UnknownOutcomePolicy
63
+ def __init__(self, workflow_identity: _Optional[_Union[_common_pb2.WorkflowIdentity, _Mapping]] = ..., attempt_id: _Optional[str] = ..., fencing_token: _Optional[int] = ..., position: _Optional[_Union[_common_pb2.ActivityPosition, _Mapping]] = ..., activity_kind: _Optional[_Union[ActivityKind, str]] = ..., activity_name: _Optional[str] = ..., semantic_input: _Optional[_Union[_struct_pb2.Value, _Mapping]] = ..., on_unknown_outcome: _Optional[_Union[UnknownOutcomePolicy, str]] = ...) -> None: ...
53
64
 
54
65
  class ActivityContext(_message.Message):
55
66
  __slots__ = ("workflow_identity", "activity_id", "attempt_id", "fencing_token")
@@ -27,7 +27,7 @@ from agent_engine_runner_shared.generated.workflow.v1 import activity_pb2 as wor
27
27
  from agent_engine_runner_shared.generated.workflow.v1 import common_pb2 as workflow_dot_v1_dot_common__pb2
28
28
 
29
29
 
30
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17workflow/v1/state.proto\x12\x1bmongodb.agentic.workflow.v1\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1aworkflow/v1/activity.proto\x1a\x18workflow/v1/common.proto\"\xbe\x06\n\x0fWorkflowMessage\x12<\n\x04role\x18\x01 \x01(\x0e\x32(.mongodb.agentic.workflow.v1.MessageRoleR\x04role\x12\x30\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x16.google.protobuf.ValueR\x07\x63ontent\x12\x36\n\ntool_calls\x18\x03 \x03(\x0b\x32\x17.google.protobuf.StructR\ttoolCalls\x12%\n\x0ctool_call_id\x18\x04 \x01(\tH\x00R\ntoolCallId\x88\x01\x01\x12\x17\n\x04name\x18\x05 \x01(\tH\x01R\x04name\x88\x01\x01\x12\x13\n\x02id\x18\x06 \x01(\tH\x02R\x02id\x88\x01\x01\x12\x41\n\x0esource_message\x18\t \x01(\x0b\x32\x16.google.protobuf.ValueB\x02\x18\x01R\rsourceMessage\x12\x39\n\tartifacts\x18\n \x03(\x0b\x32\x17.google.protobuf.StructB\x02\x18\x01R\tartifacts\x12\x44\n\x11\x61\x64\x64itional_kwargs\x18\x0b \x01(\x0b\x32\x17.google.protobuf.StructR\x10\x61\x64\x64itionalKwargs\x12\x44\n\x11response_metadata\x18\x0c \x01(\x0b\x32\x17.google.protobuf.StructR\x10responseMetadata\x12\x1e\n\x08is_error\x18\r \x01(\x08H\x03R\x07isError\x88\x01\x01\x12;\n\rtool_artifact\x18\x0e \x01(\x0b\x32\x16.google.protobuf.ValueR\x0ctoolArtifact\x12\x46\n\x12platform_artifacts\x18\x0f \x03(\x0b\x32\x17.google.protobuf.StructR\x11platformArtifacts\x12\x45\n\x12invalid_tool_calls\x18\x10 \x03(\x0b\x32\x17.google.protobuf.StructR\x10invalidToolCallsB\x0f\n\r_tool_call_idB\x07\n\x05_nameB\x05\n\x03_idB\x0b\n\t_is_errorJ\x04\x08\x07\x10\x08J\x04\x08\x08\x10\t\"\x92\x02\n\rStateSnapshot\x12\x37\n\nproperties\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\nproperties\x12H\n\x08messages\x18\x02 \x03(\x0b\x32,.mongodb.agentic.workflow.v1.WorkflowMessageR\x08messages\x12\x38\n\x18message_encoding_version\x18\x03 \x01(\rR\x16messageEncodingVersion\x12\x44\n\x11replay_properties\x18\x04 \x01(\x0b\x32\x17.google.protobuf.StructR\x10replayProperties\"\xfc\x01\n\x18\x43ompleteExecutionCommand\x12Z\n\x11workflow_identity\x18\x01 \x01(\x0b\x32-.mongodb.agentic.workflow.v1.WorkflowIdentityR\x10workflowIdentity\x12\x1d\n\nattempt_id\x18\x02 \x01(\tR\tattemptId\x12#\n\rfencing_token\x18\x03 \x01(\x03R\x0c\x66\x65ncingToken\x12@\n\x05state\x18\x04 \x01(\x0b\x32*.mongodb.agentic.workflow.v1.StateSnapshotR\x05state\"\xdd\x03\n\x13\x46inalizeStepCommand\x12Z\n\x11workflow_identity\x18\x01 \x01(\x0b\x32-.mongodb.agentic.workflow.v1.WorkflowIdentityR\x10workflowIdentity\x12\x1d\n\nattempt_id\x18\x02 \x01(\tR\tattemptId\x12#\n\rfencing_token\x18\x03 \x01(\x03R\x0c\x66\x65ncingToken\x12@\n\x05state\x18\x04 \x01(\x0b\x32*.mongodb.agentic.workflow.v1.StateSnapshotR\x05state\x12!\n\x0cstep_ordinal\x18\x05 \x01(\x03R\x0bstepOrdinal\x12m\n\x1bobserved_activity_positions\x18\x06 \x03(\x0b\x32-.mongodb.agentic.workflow.v1.ActivityPositionR\x19observedActivityPositions\x12R\n\x0bsuspensions\x18\x07 \x03(\x0b\x32\x30.mongodb.agentic.workflow.v1.StepSuspensionEntryR\x0bsuspensions\"\xa2\x01\n\x14\x46inalizeStepResponse\x12H\n\x07\x65ntries\x18\x01 \x03(\x0b\x32..mongodb.agentic.workflow.v1.StepActivityEntryR\x07\x65ntries\x12@\n\x05\x65rror\x18\x02 \x01(\x0b\x32*.mongodb.agentic.workflow.v1.WorkflowErrorR\x05\x65rror*\x8e\x01\n\x0bMessageRole\x12\x1c\n\x18MESSAGE_ROLE_UNSPECIFIED\x10\x00\x12\x15\n\x11MESSAGE_ROLE_USER\x10\x01\x12\x1a\n\x16MESSAGE_ROLE_ASSISTANT\x10\x02\x12\x15\n\x11MESSAGE_ROLE_TOOL\x10\x03\x12\x17\n\x13MESSAGE_ROLE_SYSTEM\x10\x04\x42@Z>github.com/10gen/agentic-platform/proto/workflow/v1;workflowv1b\x06proto3')
30
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17workflow/v1/state.proto\x12\x1bmongodb.agentic.workflow.v1\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1aworkflow/v1/activity.proto\x1a\x18workflow/v1/common.proto\"\xbe\x06\n\x0fWorkflowMessage\x12<\n\x04role\x18\x01 \x01(\x0e\x32(.mongodb.agentic.workflow.v1.MessageRoleR\x04role\x12\x30\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x16.google.protobuf.ValueR\x07\x63ontent\x12\x36\n\ntool_calls\x18\x03 \x03(\x0b\x32\x17.google.protobuf.StructR\ttoolCalls\x12%\n\x0ctool_call_id\x18\x04 \x01(\tH\x00R\ntoolCallId\x88\x01\x01\x12\x17\n\x04name\x18\x05 \x01(\tH\x01R\x04name\x88\x01\x01\x12\x13\n\x02id\x18\x06 \x01(\tH\x02R\x02id\x88\x01\x01\x12\x41\n\x0esource_message\x18\t \x01(\x0b\x32\x16.google.protobuf.ValueB\x02\x18\x01R\rsourceMessage\x12\x39\n\tartifacts\x18\n \x03(\x0b\x32\x17.google.protobuf.StructB\x02\x18\x01R\tartifacts\x12\x44\n\x11\x61\x64\x64itional_kwargs\x18\x0b \x01(\x0b\x32\x17.google.protobuf.StructR\x10\x61\x64\x64itionalKwargs\x12\x44\n\x11response_metadata\x18\x0c \x01(\x0b\x32\x17.google.protobuf.StructR\x10responseMetadata\x12\x1e\n\x08is_error\x18\r \x01(\x08H\x03R\x07isError\x88\x01\x01\x12;\n\rtool_artifact\x18\x0e \x01(\x0b\x32\x16.google.protobuf.ValueR\x0ctoolArtifact\x12\x46\n\x12platform_artifacts\x18\x0f \x03(\x0b\x32\x17.google.protobuf.StructR\x11platformArtifacts\x12\x45\n\x12invalid_tool_calls\x18\x10 \x03(\x0b\x32\x17.google.protobuf.StructR\x10invalidToolCallsB\x0f\n\r_tool_call_idB\x07\n\x05_nameB\x05\n\x03_idB\x0b\n\t_is_errorJ\x04\x08\x07\x10\x08J\x04\x08\x08\x10\t\"\x92\x02\n\rStateSnapshot\x12\x37\n\nproperties\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\nproperties\x12H\n\x08messages\x18\x02 \x03(\x0b\x32,.mongodb.agentic.workflow.v1.WorkflowMessageR\x08messages\x12\x38\n\x18message_encoding_version\x18\x03 \x01(\rR\x16messageEncodingVersion\x12\x44\n\x11replay_properties\x18\x04 \x01(\x0b\x32\x17.google.protobuf.StructR\x10replayProperties\"\xfc\x01\n\x18\x43ompleteExecutionCommand\x12Z\n\x11workflow_identity\x18\x01 \x01(\x0b\x32-.mongodb.agentic.workflow.v1.WorkflowIdentityR\x10workflowIdentity\x12\x1d\n\nattempt_id\x18\x02 \x01(\tR\tattemptId\x12#\n\rfencing_token\x18\x03 \x01(\x03R\x0c\x66\x65ncingToken\x12@\n\x05state\x18\x04 \x01(\x0b\x32*.mongodb.agentic.workflow.v1.StateSnapshotR\x05state\"\xdd\x03\n\x13\x46inalizeStepCommand\x12Z\n\x11workflow_identity\x18\x01 \x01(\x0b\x32-.mongodb.agentic.workflow.v1.WorkflowIdentityR\x10workflowIdentity\x12\x1d\n\nattempt_id\x18\x02 \x01(\tR\tattemptId\x12#\n\rfencing_token\x18\x03 \x01(\x03R\x0c\x66\x65ncingToken\x12@\n\x05state\x18\x04 \x01(\x0b\x32*.mongodb.agentic.workflow.v1.StateSnapshotR\x05state\x12!\n\x0cstep_ordinal\x18\x05 \x01(\x03R\x0bstepOrdinal\x12m\n\x1bobserved_activity_positions\x18\x06 \x03(\x0b\x32-.mongodb.agentic.workflow.v1.ActivityPositionR\x19observedActivityPositions\x12R\n\x0bsuspensions\x18\x07 \x03(\x0b\x32\x30.mongodb.agentic.workflow.v1.StepSuspensionEntryR\x0bsuspensions\"\xce\x01\n\x14\x46inalizeStepResponse\x12H\n\x07\x65ntries\x18\x01 \x03(\x0b\x32..mongodb.agentic.workflow.v1.StepActivityEntryR\x07\x65ntries\x12@\n\x05\x65rror\x18\x02 \x01(\x0b\x32*.mongodb.agentic.workflow.v1.WorkflowErrorR\x05\x65rror\x12*\n\x11source_state_hash\x18\x03 \x01(\tR\x0fsourceStateHash*\x8e\x01\n\x0bMessageRole\x12\x1c\n\x18MESSAGE_ROLE_UNSPECIFIED\x10\x00\x12\x15\n\x11MESSAGE_ROLE_USER\x10\x01\x12\x1a\n\x16MESSAGE_ROLE_ASSISTANT\x10\x02\x12\x15\n\x11MESSAGE_ROLE_TOOL\x10\x03\x12\x17\n\x13MESSAGE_ROLE_SYSTEM\x10\x04\x42@Z>github.com/10gen/agentic-platform/proto/workflow/v1;workflowv1b\x06proto3')
31
31
 
32
32
  _globals = globals()
33
33
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -39,8 +39,8 @@ if not _descriptor._USE_C_DESCRIPTORS:
39
39
  _globals['_WORKFLOWMESSAGE'].fields_by_name['source_message']._serialized_options = b'\030\001'
40
40
  _globals['_WORKFLOWMESSAGE'].fields_by_name['artifacts']._loaded_options = None
41
41
  _globals['_WORKFLOWMESSAGE'].fields_by_name['artifacts']._serialized_options = b'\030\001'
42
- _globals['_MESSAGEROLE']._serialized_start=2151
43
- _globals['_MESSAGEROLE']._serialized_end=2293
42
+ _globals['_MESSAGEROLE']._serialized_start=2195
43
+ _globals['_MESSAGEROLE']._serialized_end=2337
44
44
  _globals['_WORKFLOWMESSAGE']._serialized_start=141
45
45
  _globals['_WORKFLOWMESSAGE']._serialized_end=971
46
46
  _globals['_STATESNAPSHOT']._serialized_start=974
@@ -50,5 +50,5 @@ if not _descriptor._USE_C_DESCRIPTORS:
50
50
  _globals['_FINALIZESTEPCOMMAND']._serialized_start=1506
51
51
  _globals['_FINALIZESTEPCOMMAND']._serialized_end=1983
52
52
  _globals['_FINALIZESTEPRESPONSE']._serialized_start=1986
53
- _globals['_FINALIZESTEPRESPONSE']._serialized_end=2148
53
+ _globals['_FINALIZESTEPRESPONSE']._serialized_end=2192
54
54
  # @@protoc_insertion_point(module_scope)
@@ -98,9 +98,11 @@ class FinalizeStepCommand(_message.Message):
98
98
  def __init__(self, workflow_identity: _Optional[_Union[_common_pb2.WorkflowIdentity, _Mapping]] = ..., attempt_id: _Optional[str] = ..., fencing_token: _Optional[int] = ..., state: _Optional[_Union[StateSnapshot, _Mapping]] = ..., step_ordinal: _Optional[int] = ..., observed_activity_positions: _Optional[_Iterable[_Union[_common_pb2.ActivityPosition, _Mapping]]] = ..., suspensions: _Optional[_Iterable[_Union[_activity_pb2.StepSuspensionEntry, _Mapping]]] = ...) -> None: ...
99
99
 
100
100
  class FinalizeStepResponse(_message.Message):
101
- __slots__ = ("entries", "error")
101
+ __slots__ = ("entries", "error", "source_state_hash")
102
102
  ENTRIES_FIELD_NUMBER: _ClassVar[int]
103
103
  ERROR_FIELD_NUMBER: _ClassVar[int]
104
+ SOURCE_STATE_HASH_FIELD_NUMBER: _ClassVar[int]
104
105
  entries: _containers.RepeatedCompositeFieldContainer[_activity_pb2.StepActivityEntry]
105
106
  error: _common_pb2.WorkflowError
106
- def __init__(self, entries: _Optional[_Iterable[_Union[_activity_pb2.StepActivityEntry, _Mapping]]] = ..., error: _Optional[_Union[_common_pb2.WorkflowError, _Mapping]] = ...) -> None: ...
107
+ source_state_hash: str
108
+ def __init__(self, entries: _Optional[_Iterable[_Union[_activity_pb2.StepActivityEntry, _Mapping]]] = ..., error: _Optional[_Union[_common_pb2.WorkflowError, _Mapping]] = ..., source_state_hash: _Optional[str] = ...) -> None: ...
@@ -43,6 +43,7 @@ class MCPToolBinding:
43
43
  description: str
44
44
  input_schema: dict[str, Any]
45
45
  server_config: RuntimeMCPServerConfig
46
+ annotations: dict[str, Any] | None = None
46
47
 
47
48
 
48
49
  class MCPToolResult(BaseModel):
@@ -177,6 +178,7 @@ async def discover_mcp_tools_async(config: RuntimeMCPConfig) -> list[MCPToolBind
177
178
  description=tool.description or "",
178
179
  input_schema=dict(tool.inputSchema),
179
180
  server_config=server_config,
181
+ annotations=normalize_mcp_tool_annotations(getattr(tool, "annotations", None)),
180
182
  )
181
183
  )
182
184
 
@@ -397,6 +399,35 @@ def _run_coroutine_sync(
397
399
  raise active_loop_error
398
400
 
399
401
 
402
+ def normalize_mcp_tool_annotations(value: Any) -> dict[str, Any] | None:
403
+ """Return a JSON-safe copy of MCP ``Tool.annotations``, or ``None``.
404
+
405
+ Missing or malformed values stay missing. The SDK must not apply MCP client
406
+ defaults (``readOnlyHint: false``, ``destructiveHint: true``, …); applications
407
+ fail closed when hints are absent. Pydantic models are dumped with
408
+ ``exclude_unset=True`` so SDK field defaults are not invented as server hints.
409
+ """
410
+
411
+ if value is None:
412
+ return None
413
+ dumped: Any = value
414
+ model_dump = getattr(value, "model_dump", None)
415
+ if callable(model_dump):
416
+ try:
417
+ dumped = model_dump(mode="json", exclude_unset=True)
418
+ except Exception:
419
+ return None
420
+ if not isinstance(dumped, dict):
421
+ return None
422
+ try:
423
+ parsed = json.loads(json.dumps(dumped, allow_nan=False))
424
+ except (TypeError, ValueError):
425
+ return None
426
+ if not isinstance(parsed, dict):
427
+ return None
428
+ return parsed
429
+
430
+
400
431
  def _ensure_json_safe(field_name: str, value: Any) -> None:
401
432
  try:
402
433
  json.dumps(value)
@@ -467,6 +498,7 @@ __all__ = [
467
498
  "make_mcp_tool_pod_callable",
468
499
  "make_sync_mcp_tool_callable",
469
500
  "mcp_server_network_hosts",
501
+ "normalize_mcp_tool_annotations",
470
502
  "normalize_mcp_tool_result",
471
503
  "resolve_mcp_auth",
472
504
  "resolve_mcp_headers",
@@ -1325,6 +1325,14 @@ class LLMPodStreamEvent(BaseModel):
1325
1325
  class ExecutorCallbackRequest(BaseModel):
1326
1326
  """Callback from AER to OE when execution completes or suspends."""
1327
1327
 
1328
+ attempt_id: Optional[str] = Field(
1329
+ default=None,
1330
+ min_length=1,
1331
+ description="Originating durable attempt returned by StartAttempt",
1332
+ )
1333
+ attempt_fence: Optional[int] = Field(
1334
+ default=None, ge=1, description="Fence returned with the originating durable attempt"
1335
+ )
1328
1336
  execution_id: str = Field(..., description="Execution identifier")
1329
1337
  status: str = Field(..., description="Status: COMPLETED, SUSPENDED, ERROR")
1330
1338
  suspend_generation: Optional[int] = Field(