ms-tau-sdk 2.0.16.dev65__tar.gz → 2.0.17.dev66__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.
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/CHANGELOG.md +12 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/PKG-INFO +1 -1
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/pyproject.toml +1 -1
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/agent_skills/tau_project_customization/SKILL.md +1 -1
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/agent_skills/tau_security_and_access/SKILL.md +1 -3
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/backend/assertions.py +9 -54
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/backend/team_memberships.py +0 -19
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/runtime/manager.py +4 -21
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/runtime/requester.py +3 -22
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/.gitignore +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/README.md +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/__init__.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/app.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/cli.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/config.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/env_file.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/logs.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/proxy.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/state.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/static/BULMA-LICENSE.txt +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/static/app.js +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/static/board.css +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/static/bulma.min.css +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/static/index.html +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/__init__.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/agent_skills/tau_a2a_runtime_adapter/SKILL.md +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/agent_skills/tau_local_development/SKILL.md +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/agent_skills/tau_repository_integration/SKILL.md +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/api/__init__.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/api/a2a.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/api/chat.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/api/conversations.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/api/dependencies.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/api/health.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/api/inspection.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/api/local_chat.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/api/models.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/api/request_identity.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/api/sessions.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/app.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/application.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/backend/__init__.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/backend/auth.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/backend/client.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/backend/local.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/backend/mcp.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/backend/models.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/backend/routes.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/cli.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/errors.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/logging.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/protocols/__init__.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/protocols/a2a_failure.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/protocols/a2a_message.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/protocols/a2a_roles.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/protocols/assistant_ui.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/protocols/chat_history.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/protocols/strict_json.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/providers/__init__.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/providers/definitions.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/providers/factory.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/providers/tau_compat.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/resources/SYSTEM.md +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/resources/__init__.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/resources/loader.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/resources/prompts/review-code-repository.md +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/runtime/__init__.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/runtime/deployment_health.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/runtime/events.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/runtime/extensions.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/runtime/failures.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/runtime/live_turns.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/runtime/observability.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/runtime/provenance.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/runtime/session.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/runtime/snapshots.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/runtime/task_context.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/sessions/__init__.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/sessions/storage.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/settings.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/skills.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/tools/__init__.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/tools/mainsequence_mcp.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/tools/mcp_applications.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/tools/mcp_connection.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/tools/skill_read.py +0 -0
- {ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/tools/task_control.py +0 -0
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
- **`team_uids` is removed; the verifier refuses caller assertions that list teams
|
|
6
|
+
([#103](https://github.com/mainsequence-sdk/ms-tau-sdk/issues/103), ADR 0019).** The platform no
|
|
7
|
+
longer signs a team list in the caller assertion, so the runtime drops it. `in_teams()` is the
|
|
8
|
+
only membership check, and it is unchanged.
|
|
9
|
+
- `VerifiedCaller` and `Requester` have no `team_uids` and no `signed_team_uids`.
|
|
10
|
+
`VerifiedCaller(uid, is_organization_admin=False)` and `Requester(uid)` are their constructors.
|
|
11
|
+
- A caller assertion that carries `team_uids`, an empty or `null` list included, is refused with
|
|
12
|
+
401.
|
|
13
|
+
- A runtime on this release refuses every caller of a platform that still signs team lists.
|
|
14
|
+
|
|
3
15
|
## 2.0.16 — 2026-10-15
|
|
4
16
|
|
|
5
17
|
- **The Tau skills say when and how a tool checks the person's teams
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: ms-tau-sdk
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.17.dev66
|
|
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
|
|
@@ -161,7 +161,7 @@ async def revenue_by_region(tool_call_id, arguments, signal=None, on_update=None
|
|
|
161
161
|
- `current_requester()` returns the person the turn serves, with `uid` and
|
|
162
162
|
`await in_teams(team_uids, *, max_age_seconds=None)`, or `None`. `in_teams()` answers while the
|
|
163
163
|
person is the verified caller of the turn's request (see `tau_security_and_access`, "Checking the
|
|
164
|
-
person's teams");
|
|
164
|
+
person's teams"); the person carries no team list. The platform names that person when the turn
|
|
165
165
|
starts, whoever called; it is `None` when the platform names nobody, in local mode, and in code
|
|
166
166
|
outside a turn. Only it names the requester: never take a person's UID from tool arguments, the
|
|
167
167
|
prompt, history, or a header.
|
|
@@ -230,9 +230,7 @@ if person is None or REPORTS_TEAM_UID not in await person.in_teams([REPORTS_TEAM
|
|
|
230
230
|
`0`: only within its request); set it in `harness_agent.spec.env_vars`. `max_age_seconds=0`
|
|
231
231
|
always asks the platform: use it before a write that must see a removal at once.
|
|
232
232
|
- A check the platform cannot answer raises `BackendError`; it never answers "not a member".
|
|
233
|
-
-
|
|
234
|
-
not know the person's teams, and raises when the caller's assertion carried no team list, as
|
|
235
|
-
every assertion will once the platform stops signing them. Use `in_teams()`.
|
|
233
|
+
- The requester carries no team list; `in_teams()` is the only membership check.
|
|
236
234
|
|
|
237
235
|
## What never reaches the model
|
|
238
236
|
|
|
@@ -5,8 +5,8 @@ The platform signs two kinds of short-lived JWS with one Ed25519 key set and sen
|
|
|
5
5
|
|
|
6
6
|
- a caller assertion, for a request a person or a workload sends to the runtime through the
|
|
7
7
|
platform. It names the caller (``sub``) and whether the caller administers the Organization
|
|
8
|
-
(``is_organization_admin``)
|
|
9
|
-
|
|
8
|
+
(``is_organization_admin``), and no teams: ``in_teams()`` asks the platform (#103), and an
|
|
9
|
+
assertion that lists teams is refused;
|
|
10
10
|
- a platform assertion, for the platform's own background calls. It names no caller.
|
|
11
11
|
|
|
12
12
|
Both are bound to this runtime's release (``aud``, ``resource_release_uid``) and Organization
|
|
@@ -33,7 +33,7 @@ import httpx
|
|
|
33
33
|
import jwt
|
|
34
34
|
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
|
|
35
35
|
|
|
36
|
-
from ms_tau_sdk.backend.team_memberships import
|
|
36
|
+
from ms_tau_sdk.backend.team_memberships import member_team_uids
|
|
37
37
|
from ms_tau_sdk.errors import ConfigurationError
|
|
38
38
|
from ms_tau_sdk.settings import (
|
|
39
39
|
CALLER_ASSERTION_ISSUER_ENV,
|
|
@@ -83,40 +83,15 @@ class AssertionKeysUnavailableError(Exception):
|
|
|
83
83
|
"""The platform's verification keys could not be obtained."""
|
|
84
84
|
|
|
85
85
|
|
|
86
|
-
@dataclass(frozen=True, slots=True
|
|
86
|
+
@dataclass(frozen=True, slots=True)
|
|
87
87
|
class VerifiedCaller:
|
|
88
88
|
"""The caller that a verified caller assertion names.
|
|
89
89
|
|
|
90
|
-
``in_teams()`` asks the platform which teams the caller belongs to.
|
|
91
|
-
deprecated list earlier assertions carried; ``signed_team_uids`` is None when the assertion
|
|
92
|
-
carried none (#103).
|
|
90
|
+
``in_teams()`` asks the platform which teams the caller belongs to (#103).
|
|
93
91
|
"""
|
|
94
92
|
|
|
95
93
|
uid: str
|
|
96
|
-
is_organization_admin: bool
|
|
97
|
-
signed_team_uids: tuple[str, ...] | None
|
|
98
|
-
|
|
99
|
-
def __init__(
|
|
100
|
-
self,
|
|
101
|
-
uid: str,
|
|
102
|
-
team_uids: tuple[str, ...] | None = None,
|
|
103
|
-
is_organization_admin: bool = False,
|
|
104
|
-
) -> None:
|
|
105
|
-
object.__setattr__(self, "uid", uid)
|
|
106
|
-
object.__setattr__(self, "is_organization_admin", is_organization_admin)
|
|
107
|
-
object.__setattr__(
|
|
108
|
-
self, "signed_team_uids", None if team_uids is None else tuple(team_uids)
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
@property
|
|
112
|
-
def team_uids(self) -> tuple[str, ...]:
|
|
113
|
-
"""Deprecated: the team UIDs the caller's assertion carried. Use ``in_teams()``.
|
|
114
|
-
|
|
115
|
-
Warns when read, and raises ``TauSDKError`` when the assertion carried no team list; it
|
|
116
|
-
never answers an empty list for that.
|
|
117
|
-
"""
|
|
118
|
-
|
|
119
|
-
return deprecated_team_uids(self.signed_team_uids)
|
|
94
|
+
is_organization_admin: bool = False
|
|
120
95
|
|
|
121
96
|
async def in_teams(
|
|
122
97
|
self,
|
|
@@ -253,28 +228,10 @@ def _fresh_until(cache_control: str | None, now: float) -> float | None:
|
|
|
253
228
|
|
|
254
229
|
def _verified_caller(payload: Mapping[str, Any]) -> VerifiedCaller:
|
|
255
230
|
uid = payload["sub"]
|
|
256
|
-
# The deprecated team list, checked while the platform still signs it (#103).
|
|
257
|
-
team_uids = payload.get("team_uids")
|
|
258
231
|
is_organization_admin = payload["is_organization_admin"]
|
|
259
|
-
if (
|
|
260
|
-
not _is_canonical_uid(uid)
|
|
261
|
-
or (
|
|
262
|
-
team_uids is not None
|
|
263
|
-
and (
|
|
264
|
-
not isinstance(team_uids, list)
|
|
265
|
-
or not all(_is_canonical_uid(team_uid) for team_uid in team_uids)
|
|
266
|
-
or team_uids != sorted(set(team_uids))
|
|
267
|
-
)
|
|
268
|
-
)
|
|
269
|
-
or ("team_uids" in payload and team_uids is None)
|
|
270
|
-
or type(is_organization_admin) is not bool
|
|
271
|
-
):
|
|
232
|
+
if not _is_canonical_uid(uid) or type(is_organization_admin) is not bool:
|
|
272
233
|
raise InvalidAssertionError("The caller assertion does not name a valid caller")
|
|
273
|
-
return VerifiedCaller(
|
|
274
|
-
uid=uid,
|
|
275
|
-
team_uids=None if team_uids is None else tuple(team_uids),
|
|
276
|
-
is_organization_admin=is_organization_admin,
|
|
277
|
-
)
|
|
234
|
+
return VerifiedCaller(uid=uid, is_organization_admin=is_organization_admin)
|
|
278
235
|
|
|
279
236
|
|
|
280
237
|
class AssertionVerifier:
|
|
@@ -382,9 +339,7 @@ class AssertionVerifier:
|
|
|
382
339
|
)
|
|
383
340
|
except (jwt.PyJWTError, TypeError, ValueError) as error:
|
|
384
341
|
raise InvalidAssertionError(f"The {kind} assertion did not verify") from error
|
|
385
|
-
|
|
386
|
-
optional = {"team_uids"} if kind == "caller" else set()
|
|
387
|
-
if set(payload) - optional != claims:
|
|
342
|
+
if set(payload) != claims:
|
|
388
343
|
raise InvalidAssertionError(f"The {kind} assertion does not have the exact claim set")
|
|
389
344
|
if (
|
|
390
345
|
payload["iss"] != self.issuer
|
{ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/backend/team_memberships.py
RENAMED
|
@@ -12,7 +12,6 @@ import math
|
|
|
12
12
|
import threading
|
|
13
13
|
import time
|
|
14
14
|
import uuid
|
|
15
|
-
import warnings
|
|
16
15
|
from collections import OrderedDict
|
|
17
16
|
from collections.abc import Iterable
|
|
18
17
|
from contextvars import ContextVar, Token
|
|
@@ -209,21 +208,3 @@ async def _platform_members(
|
|
|
209
208
|
if scope.client is None:
|
|
210
209
|
raise TauSDKError("in_teams() needs the Agent runtime of this process")
|
|
211
210
|
return await scope.client.team_memberships(person_uid, team_uids, caller_assertion=token)
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
def deprecated_team_uids(signed: tuple[str, ...] | None) -> tuple[str, ...]:
|
|
215
|
-
"""Return the deprecated team list a caller assertion carried, with a warning.
|
|
216
|
-
|
|
217
|
-
It raises when the assertion carried none; it never answers an empty list for that.
|
|
218
|
-
"""
|
|
219
|
-
|
|
220
|
-
warnings.warn(
|
|
221
|
-
"team_uids is deprecated; check membership with in_teams() instead",
|
|
222
|
-
DeprecationWarning,
|
|
223
|
-
stacklevel=3,
|
|
224
|
-
)
|
|
225
|
-
if signed is None:
|
|
226
|
-
raise TauSDKError(
|
|
227
|
-
"The caller assertion carries no team list; check membership with in_teams()"
|
|
228
|
-
)
|
|
229
|
-
return signed
|
|
@@ -30,7 +30,7 @@ from tau_agent.types import JSONValue
|
|
|
30
30
|
from tau_coding import CodingSession, CodingSessionConfig
|
|
31
31
|
from tau_coding.tools import create_coding_tools
|
|
32
32
|
|
|
33
|
-
from ms_tau_sdk.backend.assertions import CallerAssertion
|
|
33
|
+
from ms_tau_sdk.backend.assertions import CallerAssertion
|
|
34
34
|
from ms_tau_sdk.backend.client import LeaseProof, MainSequenceClient
|
|
35
35
|
from ms_tau_sdk.backend.mcp import MainSequenceMCPClient
|
|
36
36
|
from ms_tau_sdk.backend.models import (
|
|
@@ -1573,16 +1573,7 @@ class SessionRuntimeManager:
|
|
|
1573
1573
|
)
|
|
1574
1574
|
requester_binding = TurnRequesterBinding(
|
|
1575
1575
|
session_uid=session_uid,
|
|
1576
|
-
requester=self._turn_requester(
|
|
1577
|
-
runtime,
|
|
1578
|
-
caller=(
|
|
1579
|
-
presented.caller
|
|
1580
|
-
if presented is not None
|
|
1581
|
-
else task_context.caller
|
|
1582
|
-
if task_context is not None
|
|
1583
|
-
else None
|
|
1584
|
-
),
|
|
1585
|
-
),
|
|
1576
|
+
requester=self._turn_requester(runtime),
|
|
1586
1577
|
lease_proof=lambda: LeaseProof(
|
|
1587
1578
|
session_uid=session_uid,
|
|
1588
1579
|
holder_id=self.holder_id,
|
|
@@ -1765,18 +1756,11 @@ class SessionRuntimeManager:
|
|
|
1765
1756
|
|
|
1766
1757
|
return not self.settings.local_mode and self.settings.request_identity_mode == "assertion"
|
|
1767
1758
|
|
|
1768
|
-
def _turn_requester(
|
|
1769
|
-
self,
|
|
1770
|
-
runtime: ActiveSessionRuntime,
|
|
1771
|
-
*,
|
|
1772
|
-
caller: VerifiedCaller | None,
|
|
1773
|
-
) -> Requester | None:
|
|
1759
|
+
def _turn_requester(self, runtime: ActiveSessionRuntime) -> Requester | None:
|
|
1774
1760
|
"""Name the person a turn serves, or None.
|
|
1775
1761
|
|
|
1776
1762
|
The platform's answer to the turn start names that person, whoever called: a chat or A2A
|
|
1777
1763
|
Message turn, a Task attempt, and a turn the platform starts for a caller delivery alike.
|
|
1778
|
-
``caller`` is the verified caller of the request, when there is one; it supplies the
|
|
1779
|
-
deprecated team list its assertion carried only when it is that person.
|
|
1780
1764
|
"""
|
|
1781
1765
|
|
|
1782
1766
|
if not self._requester_identity_verified():
|
|
@@ -1784,8 +1768,7 @@ class SessionRuntimeManager:
|
|
|
1784
1768
|
uid = runtime.requester_user_uid
|
|
1785
1769
|
if uid is None:
|
|
1786
1770
|
return None
|
|
1787
|
-
|
|
1788
|
-
return Requester(uid=uid, team_uids=team_uids)
|
|
1771
|
+
return Requester(uid=uid)
|
|
1789
1772
|
|
|
1790
1773
|
def _requester_http(self) -> httpx.AsyncClient:
|
|
1791
1774
|
"""The client for calls to platform applications, made when first used."""
|
|
@@ -31,7 +31,7 @@ import structlog
|
|
|
31
31
|
from ms_tau_sdk.backend.auth import AccessToken, _jwt_expiry
|
|
32
32
|
from ms_tau_sdk.backend.client import LeaseProof, answer_without_request_credentials
|
|
33
33
|
from ms_tau_sdk.backend.models import ReleaseRuntimeAccess
|
|
34
|
-
from ms_tau_sdk.backend.team_memberships import
|
|
34
|
+
from ms_tau_sdk.backend.team_memberships import member_team_uids
|
|
35
35
|
from ms_tau_sdk.errors import (
|
|
36
36
|
ApplicationReadinessTimeoutError,
|
|
37
37
|
ApplicationWakingError,
|
|
@@ -52,34 +52,15 @@ type Delegation = Literal["auto", "none", "required"]
|
|
|
52
52
|
_DELEGATIONS: tuple[Delegation, ...] = ("auto", "none", "required")
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
@dataclass(frozen=True, slots=True
|
|
55
|
+
@dataclass(frozen=True, slots=True)
|
|
56
56
|
class Requester:
|
|
57
57
|
"""The verified person whose request the current turn serves.
|
|
58
58
|
|
|
59
59
|
``in_teams()`` asks the platform which teams the person belongs to while the person is the
|
|
60
|
-
verified caller of the request the turn runs in, and raises otherwise.
|
|
61
|
-
deprecated list the caller's assertion carried: empty when the turn does not know the person's
|
|
62
|
-
teams, and ``signed_team_uids`` is None when the assertion carried no list (#103).
|
|
60
|
+
verified caller of the request the turn runs in, and raises otherwise (#103).
|
|
63
61
|
"""
|
|
64
62
|
|
|
65
63
|
uid: str
|
|
66
|
-
signed_team_uids: tuple[str, ...] | None
|
|
67
|
-
|
|
68
|
-
def __init__(self, uid: str, team_uids: tuple[str, ...] | None = ()) -> None:
|
|
69
|
-
object.__setattr__(self, "uid", uid)
|
|
70
|
-
object.__setattr__(
|
|
71
|
-
self, "signed_team_uids", None if team_uids is None else tuple(team_uids)
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
@property
|
|
75
|
-
def team_uids(self) -> tuple[str, ...]:
|
|
76
|
-
"""Deprecated: the team UIDs the caller's assertion carried. Use ``in_teams()``.
|
|
77
|
-
|
|
78
|
-
Warns when read, and raises ``TauSDKError`` when the assertion carried no team list; it
|
|
79
|
-
never answers an empty list for that.
|
|
80
|
-
"""
|
|
81
|
-
|
|
82
|
-
return deprecated_team_uids(self.signed_team_uids)
|
|
83
64
|
|
|
84
65
|
async def in_teams(
|
|
85
66
|
self,
|
|
File without changes
|
|
File without changes
|
{ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/__init__.py
RENAMED
|
File without changes
|
{ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/app.py
RENAMED
|
File without changes
|
{ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/cli.py
RENAMED
|
File without changes
|
{ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/config.py
RENAMED
|
File without changes
|
{ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/env_file.py
RENAMED
|
File without changes
|
{ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/logs.py
RENAMED
|
File without changes
|
{ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/proxy.py
RENAMED
|
File without changes
|
{ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/packages/tau-board/src/ms_tau_board/state.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/protocols/assistant_ui.py
RENAMED
|
File without changes
|
{ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/protocols/chat_history.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/runtime/deployment_health.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/tools/mainsequence_mcp.py
RENAMED
|
File without changes
|
{ms_tau_sdk-2.0.16.dev65 → ms_tau_sdk-2.0.17.dev66}/src/ms_tau_sdk/tools/mcp_applications.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|