ms-tau-sdk 2.0.9.dev49__tar.gz → 2.0.10.dev50__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 (86) hide show
  1. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/CHANGELOG.md +9 -1
  2. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/PKG-INFO +1 -1
  3. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/pyproject.toml +1 -1
  4. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/backend/client.py +15 -0
  5. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/errors.py +8 -0
  6. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/runtime/requester.py +7 -3
  7. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/tools/mcp_applications.py +18 -3
  8. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/.gitignore +0 -0
  9. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/README.md +0 -0
  10. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/packages/tau-board/src/ms_tau_board/__init__.py +0 -0
  11. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/packages/tau-board/src/ms_tau_board/app.py +0 -0
  12. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/packages/tau-board/src/ms_tau_board/cli.py +0 -0
  13. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/packages/tau-board/src/ms_tau_board/config.py +0 -0
  14. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/packages/tau-board/src/ms_tau_board/env_file.py +0 -0
  15. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/packages/tau-board/src/ms_tau_board/logs.py +0 -0
  16. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/packages/tau-board/src/ms_tau_board/proxy.py +0 -0
  17. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/packages/tau-board/src/ms_tau_board/state.py +0 -0
  18. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/packages/tau-board/src/ms_tau_board/static/BULMA-LICENSE.txt +0 -0
  19. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/packages/tau-board/src/ms_tau_board/static/app.js +0 -0
  20. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/packages/tau-board/src/ms_tau_board/static/board.css +0 -0
  21. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/packages/tau-board/src/ms_tau_board/static/bulma.min.css +0 -0
  22. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/packages/tau-board/src/ms_tau_board/static/index.html +0 -0
  23. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/__init__.py +0 -0
  24. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/agent_skills/tau_a2a_runtime_adapter/SKILL.md +0 -0
  25. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/agent_skills/tau_local_development/SKILL.md +0 -0
  26. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/agent_skills/tau_project_customization/SKILL.md +0 -0
  27. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/agent_skills/tau_repository_integration/SKILL.md +0 -0
  28. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/agent_skills/tau_security_and_access/SKILL.md +0 -0
  29. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/api/__init__.py +0 -0
  30. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/api/a2a.py +0 -0
  31. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/api/chat.py +0 -0
  32. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/api/conversations.py +0 -0
  33. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/api/dependencies.py +0 -0
  34. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/api/health.py +0 -0
  35. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/api/inspection.py +0 -0
  36. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/api/local_chat.py +0 -0
  37. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/api/models.py +0 -0
  38. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/api/request_identity.py +0 -0
  39. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/api/sessions.py +0 -0
  40. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/app.py +0 -0
  41. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/application.py +0 -0
  42. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/backend/__init__.py +0 -0
  43. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/backend/assertions.py +0 -0
  44. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/backend/auth.py +0 -0
  45. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/backend/local.py +0 -0
  46. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/backend/mcp.py +0 -0
  47. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/backend/models.py +0 -0
  48. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/backend/routes.py +0 -0
  49. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/cli.py +0 -0
  50. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/logging.py +0 -0
  51. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/protocols/__init__.py +0 -0
  52. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/protocols/a2a_failure.py +0 -0
  53. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/protocols/a2a_message.py +0 -0
  54. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/protocols/a2a_roles.py +0 -0
  55. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/protocols/assistant_ui.py +0 -0
  56. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/protocols/chat_history.py +0 -0
  57. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/protocols/strict_json.py +0 -0
  58. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/providers/__init__.py +0 -0
  59. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/providers/definitions.py +0 -0
  60. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/providers/factory.py +0 -0
  61. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/providers/tau_compat.py +0 -0
  62. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/resources/SYSTEM.md +0 -0
  63. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/resources/__init__.py +0 -0
  64. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/resources/loader.py +0 -0
  65. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/resources/prompts/review-code-repository.md +0 -0
  66. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/runtime/__init__.py +0 -0
  67. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/runtime/deployment_health.py +0 -0
  68. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/runtime/events.py +0 -0
  69. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/runtime/extensions.py +0 -0
  70. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/runtime/failures.py +0 -0
  71. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/runtime/live_turns.py +0 -0
  72. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/runtime/manager.py +0 -0
  73. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/runtime/observability.py +0 -0
  74. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/runtime/provenance.py +0 -0
  75. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/runtime/session.py +0 -0
  76. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/runtime/snapshots.py +0 -0
  77. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/runtime/task_context.py +0 -0
  78. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/sessions/__init__.py +0 -0
  79. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/sessions/storage.py +0 -0
  80. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/settings.py +0 -0
  81. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/skills.py +0 -0
  82. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/tools/__init__.py +0 -0
  83. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/tools/mainsequence_mcp.py +0 -0
  84. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/tools/mcp_connection.py +0 -0
  85. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/tools/skill_read.py +0 -0
  86. {ms_tau_sdk-2.0.9.dev49 → ms_tau_sdk-2.0.10.dev50}/src/ms_tau_sdk/tools/task_control.py +0 -0
@@ -1,6 +1,14 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 2.0.10 — 2026-10-09
4
+
5
+ - **Application access timeouts no longer become `access_unavailable`.** Platform transport
6
+ timeouts retain their classification and time limit when application access is obtained or
7
+ renewed. The tool reports `failure: timeout` with `phase: access`; HTTP 408/504 responses
8
+ also report a timeout with their status, without claiming the tool's configured limit elapsed.
9
+ Other access failures retain their classification. Tool calls are never replayed after failure.
10
+
11
+ ## 2.0.9 — 2026-10-09
4
12
 
5
13
  - **Turn logs name the session's Agent
6
14
  ([#85](https://github.com/mainsequence-sdk/ms-tau-sdk/issues/85)).** Every log line of a turn
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ms-tau-sdk
3
- Version: 2.0.9.dev49
3
+ Version: 2.0.10.dev50
4
4
  Summary: Workspace-bound Tau application primitives for Main Sequence projects
5
5
  Project-URL: Changelog, https://github.com/mainsequence-sdk/ms-tau-sdk/blob/development/CHANGELOG.md
6
6
  Project-URL: Documentation, https://github.com/mainsequence-sdk/ms-tau-sdk/tree/development/docs
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ms-tau-sdk"
7
- version = "2.0.9.dev49"
7
+ version = "2.0.10.dev50"
8
8
  description = "Workspace-bound Tau application primitives for Main Sequence projects"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -19,6 +19,7 @@ from tau_coding.oauth import account_id_from_access_token
19
19
  from ms_tau_sdk.errors import (
20
20
  BackendConflictError,
21
21
  BackendError,
22
+ BackendTimeoutError,
22
23
  LocalModeUnsupportedError,
23
24
  SessionNotFoundError,
24
25
  )
@@ -372,6 +373,20 @@ class MainSequenceClient:
372
373
  if transport_attempt >= attempts:
373
374
  break
374
375
  await asyncio.sleep(0.25 * (2 ** (transport_attempt - 1)))
376
+ if isinstance(last_error, httpx.TimeoutException):
377
+ timeout_phase = (
378
+ "connect"
379
+ if isinstance(last_error, httpx.ConnectTimeout)
380
+ else "write"
381
+ if isinstance(last_error, httpx.WriteTimeout)
382
+ else "pool"
383
+ if isinstance(last_error, httpx.PoolTimeout)
384
+ else "read"
385
+ )
386
+ raise BackendTimeoutError(
387
+ "Backend request timed out",
388
+ timeout_seconds=getattr(self._client.timeout, timeout_phase),
389
+ ) from last_error
375
390
  raise BackendError(f"Backend transport failed: {last_error}") from last_error
376
391
 
377
392
  @staticmethod
@@ -37,6 +37,14 @@ class BackendConflictError(BackendError):
37
37
  status_code = 409
38
38
 
39
39
 
40
+ class BackendTimeoutError(BackendError):
41
+ """A platform request timed out; keep its limit without retaining the request."""
42
+
43
+ def __init__(self, message: str, *, timeout_seconds: float | None = None) -> None:
44
+ super().__init__(message)
45
+ self.timeout_seconds = timeout_seconds
46
+
47
+
40
48
  class LeaseLostError(TauSDKError):
41
49
  code = "runtime_lease_lost"
42
50
  status_code = 409
@@ -30,7 +30,7 @@ import structlog
30
30
  from ms_tau_sdk.backend.auth import AccessToken, _jwt_expiry
31
31
  from ms_tau_sdk.backend.client import LeaseProof, answer_without_request_credentials
32
32
  from ms_tau_sdk.backend.models import ReleaseRuntimeAccess
33
- from ms_tau_sdk.errors import BackendError, TauSDKError
33
+ from ms_tau_sdk.errors import BackendError, BackendTimeoutError, TauSDKError
34
34
 
35
35
  logger = structlog.get_logger(__name__)
36
36
 
@@ -276,8 +276,12 @@ class TurnRequesterBinding:
276
276
  )
277
277
  except BackendError as error:
278
278
  # A transport failure keeps the request, and its credentials, as its cause, so
279
- # only the message, status and answer are carried on.
280
- failure = BackendError(str(error), status_code=error.backend_status)
279
+ # only safe metadata is carried on, including a timeout's classification.
280
+ failure = (
281
+ BackendTimeoutError(str(error), timeout_seconds=error.timeout_seconds)
282
+ if isinstance(error, BackendTimeoutError)
283
+ else BackendError(str(error), status_code=error.backend_status)
284
+ )
281
285
  failure.detail = error.detail
282
286
  if failure is not None:
283
287
  if delegate and failure.backend_status == 403:
@@ -35,7 +35,7 @@ from tau_agent.types import JSONValue
35
35
 
36
36
  from ms_tau_sdk.backend.mcp import MCPConnectionClient
37
37
  from ms_tau_sdk.backend.models import MCPApplication
38
- from ms_tau_sdk.errors import BackendError, ConfigurationError
38
+ from ms_tau_sdk.errors import BackendError, BackendTimeoutError, ConfigurationError
39
39
  from ms_tau_sdk.runtime.requester import (
40
40
  RequesterBindingError,
41
41
  _turn_application_access,
@@ -102,7 +102,9 @@ def application_connector(settings: TauSDKSettings) -> ApplicationConnector:
102
102
  def _timed_out(error: BaseException) -> bool:
103
103
  if isinstance(error, McpError):
104
104
  return error.error.code == httpx.codes.REQUEST_TIMEOUT
105
- return isinstance(error, httpx.TimeoutException) and not isinstance(error, httpx.ConnectTimeout)
105
+ return isinstance(error, TimeoutError) or (
106
+ isinstance(error, httpx.TimeoutException) and not isinstance(error, httpx.ConnectTimeout)
107
+ )
106
108
 
107
109
 
108
110
  def _failure(
@@ -117,6 +119,16 @@ def _failure(
117
119
  if isinstance(error, RequesterBindingError):
118
120
  return "Your access for this request ended.", {"failure": "access_ended"}
119
121
  if isinstance(error, BackendError):
122
+ if isinstance(error, BackendTimeoutError) or error.backend_status in {408, 504}:
123
+ details: dict[str, JSONValue] = {"failure": "timeout", "phase": "access"}
124
+ if isinstance(error, BackendTimeoutError) and error.timeout_seconds is not None:
125
+ details["timeout_seconds"] = error.timeout_seconds
126
+ if error.backend_status is not None:
127
+ details["status"] = error.backend_status
128
+ return (
129
+ f"Main Sequence timed out while providing access to the {name} application.",
130
+ details,
131
+ )
120
132
  if error.backend_status in {403, 404}:
121
133
  return (
122
134
  f"The {name} application is not available for this call.",
@@ -134,6 +146,9 @@ def _failure(
134
146
  )
135
147
  if isinstance(error, httpx.HTTPStatusError):
136
148
  status = error.response.status_code
149
+ if status in {408, 504}:
150
+ text = f"The {name} application or its gateway reported a timeout ({status})."
151
+ return text, {"failure": "timeout", "status": status}
137
152
  if status >= 500:
138
153
  text = f"The {name} application answered with a server error ({status})."
139
154
  return text, {"failure": "server_error", "status": status}
@@ -151,7 +166,7 @@ def _retryable(error: BaseException) -> bool:
151
166
  """Whether opening the session failed in a way that a second attempt may not repeat."""
152
167
 
153
168
  if isinstance(error, httpx.HTTPStatusError):
154
- return error.response.status_code >= 500
169
+ return error.response.status_code == 408 or error.response.status_code >= 500
155
170
  return isinstance(error, httpx.TransportError) or _timed_out(error)
156
171
 
157
172