mainsequence 9.0.18.dev61__tar.gz → 9.0.20__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 (105) hide show
  1. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/PKG-INFO +1 -1
  2. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/client/agent_runtime_models.py +14 -13
  3. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence.egg-info/PKG-INFO +1 -1
  4. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/pyproject.toml +1 -1
  5. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/LICENSE +0 -0
  6. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/README.md +0 -0
  7. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/agent_scaffold/AGENTS.md +0 -0
  8. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/agent_scaffold/skills/a2a_sdk_execution/SKILL.md +0 -0
  9. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  10. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/agent_scaffold/skills/mainsequence-inference/SKILL.md +0 -0
  11. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  12. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/agent_scaffold/skills/maintenance/code_repository_maintenance/SKILL.md +0 -0
  13. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/agent_scaffold/skills/maintenance/metatables_transition/SKILL.md +0 -0
  14. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  15. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  16. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/agent_scaffold/skills/sdk_code_repository_execution/SKILL.md +0 -0
  17. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/__init__.py +0 -0
  18. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/__main__.py +0 -0
  19. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/_request_identity.py +0 -0
  20. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/bootstrap.py +0 -0
  21. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/cli/__init__.py +0 -0
  22. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/cli/api.py +0 -0
  23. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/cli/browser_auth.py +0 -0
  24. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/cli/cli.py +0 -0
  25. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/cli/code_repository_status.py +0 -0
  26. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/cli/config.py +0 -0
  27. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/cli/docker_utils.py +0 -0
  28. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/cli/doctor.py +0 -0
  29. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/cli/local_ops.py +0 -0
  30. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/cli/model_filters.py +0 -0
  31. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/cli/pydantic_cli.py +0 -0
  32. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/cli/sdk_utils.py +0 -0
  33. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/cli/ssh_utils.py +0 -0
  34. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/cli/ui.py +0 -0
  35. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/client/__init__.py +0 -0
  36. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/client/_transport.py +0 -0
  37. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/client/base.py +0 -0
  38. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/client/client.py +0 -0
  39. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/client/compute_validation.py +0 -0
  40. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/client/exceptions.py +0 -0
  41. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/client/github_issues.py +0 -0
  42. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/client/inference.py +0 -0
  43. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/client/models_foundry.py +0 -0
  44. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/client/models_helpers.py +0 -0
  45. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/client/models_user.py +0 -0
  46. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/client/observability.py +0 -0
  47. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/client/utils.py +0 -0
  48. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/client/value_sets.py +0 -0
  49. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/code_repository_context.py +0 -0
  50. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/code_repository_skills.py +0 -0
  51. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/defaults.py +0 -0
  52. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/instrumentation/__init__.py +0 -0
  53. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/instrumentation/utils.py +0 -0
  54. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/logconf.py +0 -0
  55. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/repository_identity_security.py +0 -0
  56. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/runtime_credential_exchange.py +0 -0
  57. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/runtime_flags.py +0 -0
  58. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/scaffold_skills.py +0 -0
  59. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/server/__init__.py +0 -0
  60. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/server/caller_assertions.py +0 -0
  61. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence/server/fastapi.py +0 -0
  62. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence.egg-info/SOURCES.txt +0 -0
  63. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence.egg-info/dependency_links.txt +0 -0
  64. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence.egg-info/entry_points.txt +0 -0
  65. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence.egg-info/requires.txt +0 -0
  66. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/mainsequence.egg-info/top_level.txt +0 -0
  67. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/setup.cfg +0 -0
  68. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_auth_bootstrap.py +0 -0
  69. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_auth_precedence.py +0 -0
  70. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_caller_assertions.py +0 -0
  71. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_canonical_api_route_contract.py +0 -0
  72. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_cli_auth_contract.py +0 -0
  73. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_cli_browser_auth.py +0 -0
  74. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_cli_secure_storage.py +0 -0
  75. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_client.py +0 -0
  76. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_code_repository_branch_contract.py +0 -0
  77. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_code_repository_documentation_contract.py +0 -0
  78. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_code_repository_runtime_context.py +0 -0
  79. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_code_repository_skills.py +0 -0
  80. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_credential_repr.py +0 -0
  81. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_dependency_extras.py +0 -0
  82. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_dev_release_version.py +0 -0
  83. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_environment_resource_context.py +0 -0
  84. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_environment_response_contracts.py +0 -0
  85. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_fastapi_mcp.py +0 -0
  86. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_fastapi_request_identity.py +0 -0
  87. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_github_issues_client.py +0 -0
  88. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_http_retry_budget.py +0 -0
  89. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_independent_context.py +0 -0
  90. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_inference_client.py +0 -0
  91. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_instrumentation.py +0 -0
  92. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_job_client.py +0 -0
  93. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_local_ops.py +0 -0
  94. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_logconf.py +0 -0
  95. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_models_user_request_bound_auth.py +0 -0
  96. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_notification_uid_contract.py +0 -0
  97. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_observability_client.py +0 -0
  98. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_runtime_credential_exchange.py +0 -0
  99. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_scaffold_skills.py +0 -0
  100. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_secret_client_model.py +0 -0
  101. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_source_ownership.py +0 -0
  102. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_ssh_utils.py +0 -0
  103. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_tolerant_response_reading.py +0 -0
  104. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_tolerant_value_sets.py +0 -0
  105. {mainsequence-9.0.18.dev61 → mainsequence-9.0.20}/tests/test_user_application_facts.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 9.0.18.dev61
3
+ Version: 9.0.20
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: MIT
@@ -38,8 +38,9 @@ DEFAULT_AGENT_RUNTIME_ACCESS_CACHE_EXPIRY_SKEW_SECONDS = 30.0
38
38
  STANDARD_A2A_MESSAGE_SEND_PATH = "/api/a2a/v1/message:send"
39
39
  STANDARD_A2A_TASKS_PATH = "/api/a2a/v1/tasks"
40
40
  STANDARD_A2A_CONTENT_TYPE = "application/a2a+json"
41
- STANDARD_A2A_REQUESTER_ROLE = "ROLE_REQUESTER"
42
- STANDARD_A2A_RESPONDER_ROLE = "ROLE_RESPONDER"
41
+ # Public A2A v1 roles; requester/responder directions belong to the runtime binding.
42
+ STANDARD_A2A_REQUESTER_ROLE = "ROLE_USER"
43
+ STANDARD_A2A_RESPONDER_ROLE = "ROLE_AGENT"
43
44
  STANDARD_A2A_RESPONSE_KIND_EXTENSION_URI = "https://mainsequence.ai/a2a/extensions/response-kind/v1"
44
45
  STANDARD_A2A_OUTPUT_CONTRACT_METADATA_KEY = (
45
46
  "https://mainsequence.ai/a2a/extensions/output-contract/v1"
@@ -112,8 +113,15 @@ class A2AMessageSendResult(BasePydanticModel):
112
113
  def _require_exact_result(self) -> A2AMessageSendResult:
113
114
  if (self.message is None) == (self.task is None):
114
115
  raise ValueError("A2A message-send result must contain exactly one of message or task")
115
- if self.message is not None and self.message.get("role") != STANDARD_A2A_RESPONDER_ROLE:
116
- raise ValueError(f"A2A message result role must be {STANDARD_A2A_RESPONDER_ROLE}.")
116
+ if self.message is not None:
117
+ if self.message.get("role") != STANDARD_A2A_RESPONDER_ROLE:
118
+ raise ValueError(f"A2A message result role must be {STANDARD_A2A_RESPONDER_ROLE}.")
119
+ message_id = self.message.get("messageId")
120
+ if not isinstance(message_id, str) or not message_id.strip():
121
+ raise ValueError("A2A message result messageId must be a non-empty string.")
122
+ parts = self.message.get("parts")
123
+ if not isinstance(parts, list) or not parts:
124
+ raise ValueError("A2A message result parts must be a non-empty array.")
117
125
  return self
118
126
 
119
127
  @property
@@ -768,10 +776,7 @@ class Agent(
768
776
  "llm_provider": llm_provider,
769
777
  "llm_model": llm_model,
770
778
  "llm_thinking": llm_thinking,
771
- "custom_id": (
772
- custom_id
773
- if custom_id is not None else None
774
- ),
779
+ "custom_id": (custom_id if custom_id is not None else None),
775
780
  }
776
781
  if resolved_session_uid and any(value is not None for value in creation_options.values()):
777
782
  raise ValueError("Creation options require handle_unique_id, not session_uid")
@@ -801,11 +806,7 @@ class Agent(
801
806
  if not isinstance(session_payload, dict):
802
807
  raise TypeError("get_or_create_session response must be an AgentSession object")
803
808
  session = AgentSession(**session_payload)
804
- if (
805
- custom_id is not None
806
- and session.custom_id
807
- != creation_options["custom_id"]
808
- ):
809
+ if custom_id is not None and session.custom_id != creation_options["custom_id"]:
809
810
  raise ValueError("The returned session does not use the requested configured provider")
810
811
  return session
811
812
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 9.0.18.dev61
3
+ Version: 9.0.20
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence"
7
- version = "9.0.18.dev61"
7
+ version = "9.0.20"
8
8
  description = "Main Sequence SDK"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"