ms-tau-sdk 1.2.12.dev21__tar.gz → 1.2.13.dev22__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 (80) hide show
  1. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/CHANGELOG.md +29 -0
  2. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/PKG-INFO +20 -8
  3. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/README.md +19 -7
  4. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/packages/tau-board/src/ms_tau_board/state.py +3 -1
  5. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/packages/tau-board/src/ms_tau_board/static/app.js +1 -0
  6. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/packages/tau-board/src/ms_tau_board/static/index.html +1 -1
  7. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/pyproject.toml +1 -1
  8. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/agent_skills/tau_local_development/SKILL.md +25 -13
  9. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/application.py +2 -2
  10. ms_tau_sdk-1.2.13.dev22/src/ms_tau_sdk/backend/auth.py +480 -0
  11. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/backend/local.py +39 -10
  12. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/runtime/manager.py +3 -0
  13. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/settings.py +117 -9
  14. ms_tau_sdk-1.2.12.dev21/src/ms_tau_sdk/backend/auth.py +0 -212
  15. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/.gitignore +0 -0
  16. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/packages/tau-board/src/ms_tau_board/__init__.py +0 -0
  17. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/packages/tau-board/src/ms_tau_board/app.py +0 -0
  18. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/packages/tau-board/src/ms_tau_board/cli.py +0 -0
  19. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/packages/tau-board/src/ms_tau_board/config.py +0 -0
  20. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/packages/tau-board/src/ms_tau_board/env_file.py +0 -0
  21. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/packages/tau-board/src/ms_tau_board/logs.py +0 -0
  22. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/packages/tau-board/src/ms_tau_board/proxy.py +0 -0
  23. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/packages/tau-board/src/ms_tau_board/static/BULMA-LICENSE.txt +0 -0
  24. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/packages/tau-board/src/ms_tau_board/static/board.css +0 -0
  25. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/packages/tau-board/src/ms_tau_board/static/bulma.min.css +0 -0
  26. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/__init__.py +0 -0
  27. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/agent_skills/tau_a2a_runtime_adapter/SKILL.md +0 -0
  28. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/agent_skills/tau_project_customization/SKILL.md +0 -0
  29. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/agent_skills/tau_repository_integration/SKILL.md +0 -0
  30. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/api/__init__.py +0 -0
  31. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/api/a2a.py +0 -0
  32. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/api/chat.py +0 -0
  33. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/api/conversations.py +0 -0
  34. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/api/dependencies.py +0 -0
  35. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/api/health.py +0 -0
  36. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/api/inspection.py +0 -0
  37. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/api/local_chat.py +0 -0
  38. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/api/models.py +0 -0
  39. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/api/sessions.py +0 -0
  40. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/app.py +0 -0
  41. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/backend/__init__.py +0 -0
  42. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/backend/client.py +0 -0
  43. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/backend/mcp.py +0 -0
  44. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/backend/models.py +0 -0
  45. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/backend/routes.py +0 -0
  46. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/cli.py +0 -0
  47. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/errors.py +0 -0
  48. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/logging.py +0 -0
  49. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/protocols/__init__.py +0 -0
  50. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/protocols/a2a_failure.py +0 -0
  51. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/protocols/a2a_message.py +0 -0
  52. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/protocols/a2a_roles.py +0 -0
  53. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/protocols/assistant_ui.py +0 -0
  54. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/protocols/chat_history.py +0 -0
  55. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/protocols/strict_json.py +0 -0
  56. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/providers/__init__.py +0 -0
  57. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/providers/definitions.py +0 -0
  58. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/providers/factory.py +0 -0
  59. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/providers/tau_compat.py +0 -0
  60. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/resources/SYSTEM.md +0 -0
  61. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/resources/__init__.py +0 -0
  62. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/resources/loader.py +0 -0
  63. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/resources/prompts/review-code-repository.md +0 -0
  64. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/runtime/__init__.py +0 -0
  65. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/runtime/deployment_health.py +0 -0
  66. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/runtime/events.py +0 -0
  67. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/runtime/extensions.py +0 -0
  68. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/runtime/failures.py +0 -0
  69. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/runtime/live_turns.py +0 -0
  70. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/runtime/observability.py +0 -0
  71. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/runtime/provenance.py +0 -0
  72. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/runtime/session.py +0 -0
  73. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/runtime/snapshots.py +0 -0
  74. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/runtime/task_context.py +0 -0
  75. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/sessions/__init__.py +0 -0
  76. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/sessions/storage.py +0 -0
  77. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/skills.py +0 -0
  78. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/tools/__init__.py +0 -0
  79. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/tools/mainsequence_mcp.py +0 -0
  80. {ms_tau_sdk-1.2.12.dev21 → ms_tau_sdk-1.2.13.dev22}/src/ms_tau_sdk/tools/task_control.py +0 -0
@@ -1,5 +1,34 @@
1
1
  # Changelog
2
2
 
3
+ ## Unreleased
4
+
5
+ - Local mode no longer needs a token in the environment or in the project `.env`. With neither
6
+ `MAINSEQUENCE_ACCESS_TOKEN` nor `MAINSEQUENCE_REFRESH_TOKEN` set, it asks a Main Sequence CLI
7
+ for the access token with `mainsequence auth token --json`: log in once with
8
+ `mainsequence login`. The SDK looks for the CLI in the new `MAINSEQUENCE_CLI` setting, then
9
+ beside the Python interpreter, then on `PATH`. It keeps the token in memory, reuses it until 60
10
+ seconds before it expires, and asks again after a rejected request. It refuses an answer for
11
+ another backend. A missing CLI, a CLI too old for the command, a missing or expired session, a
12
+ machine without a credential store, a time-out, and malformed output each have their own error.
13
+ The SDK still does not depend on or import the `mainsequence` package and does not read the
14
+ CLI's credential store. The token pair stays supported in the process environment, for
15
+ launchers and CI, and with both tokens set the CLI is never run. A pair read from the project
16
+ `.env` file still works but is deprecated: startup logs one warning that names the file and the
17
+ two variables, and `mainsequence refresh-token` run in that directory removes them. `/health`
18
+ and `/ready` report the source in `mainsequence_auth_source` (`cli`, `environment`, or
19
+ `env_file`; `null` in managed mode), and Tau Board shows it in Connect. The owner scope of local
20
+ chat sessions and direct A2A conversations is derived from the subject of the CLI token, so a
21
+ user keeps the same local sessions with either source. See the 2026-09-30 amendments of ADR 0005
22
+ and ADR 0017.
23
+ - Tau Board again reads the local state the SDK writes. 1.2.12 raised the local SQLite schema
24
+ version to 6 without raising the version Tau Board accepts, so the board refused every store
25
+ that 1.2.12 had created or opened: the State, session, Task, and Task-log views returned
26
+ "Unknown Tau local SQLite schema version". Schema 6 only adds the `local_chat_sessions` table,
27
+ and the board's queries are unchanged. The board still accepts exactly one schema version, so a
28
+ store last opened by 1.2.11 or earlier is refused until Tau starts once and migrates it. A Board
29
+ test now reads a store written by the SDK's local backend, so a schema change the board has not
30
+ followed fails the Board suite.
31
+
3
32
  ## 1.2.12 — 2026-09-27
4
33
 
5
34
  - Local `/api/chat` sessions now survive a UI reload and a Tau restart. Local mode records each chat
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ms-tau-sdk
3
- Version: 1.2.12.dev21
3
+ Version: 1.2.13.dev22
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
@@ -129,9 +129,9 @@ project selects a provider and model explicitly, while Main Sequence still autho
129
129
  the provider credential and supplies the live MCP catalog:
130
130
 
131
131
  ```bash
132
+ mainsequence login # once; the session is kept by the CLI, not in .env
133
+
132
134
  export MAINSEQUENCE_AUTH_MODE=jwt
133
- export MAINSEQUENCE_ACCESS_TOKEN="<exported-user-access-token>"
134
- export MAINSEQUENCE_REFRESH_TOKEN="<exported-user-refresh-token>"
135
135
  export TAU_LOCAL_MODE=true
136
136
  export TAU_LOCAL_PROVIDER=openai
137
137
  export TAU_LOCAL_MODEL=gpt-5.4
@@ -139,10 +139,21 @@ export TAU_LOCAL_MODEL=gpt-5.4
139
139
  uv run ms-tau
140
140
  ```
141
141
 
142
- The normal Main Sequence login or project launcher may provision those JWT variables, but
143
- `ms-tau-sdk` does not install, import, or invoke the `mainsequence` Python package. It consumes the
144
- environment handoff and public refresh API directly. Provider secrets are never environment
145
- settings and are never persisted locally.
142
+ Log in once with the Main Sequence CLI. Local mode then asks that CLI for a short-lived access
143
+ token with `mainsequence auth token --json`, and again when the token is about to expire. No token
144
+ is exported and none is written to the project `.env`. The SDK looks for the CLI in
145
+ `MAINSEQUENCE_CLI`, then beside the Python interpreter, then on `PATH`. `ms-tau-sdk` does not
146
+ install or import the `mainsequence` Python package and does not read the CLI's credential store.
147
+
148
+ Launchers and CI can hand the process a token pair instead. With both variables set, the SDK
149
+ uses them and the public refresh API and never runs the CLI:
150
+
151
+ ```bash
152
+ export MAINSEQUENCE_ACCESS_TOKEN="<user-access-token>"
153
+ export MAINSEQUENCE_REFRESH_TOKEN="<user-refresh-token>"
154
+ ```
155
+
156
+ Provider secrets are never environment settings and are never persisted locally.
146
157
 
147
158
  Local conversations and public A2A Tasks are stored at
148
159
  `~/.tau/mainsequence/<workspace-hash>/runtime.sqlite3`; an omitted chat `sessionUid` uses the
@@ -243,7 +254,8 @@ are not bundled into the SDK. Main Sequence transport and protocol behavior rema
243
254
  ## Included capabilities
244
255
 
245
256
  - FastAPI application construction and lifecycle management
246
- - runtime-credential exchange, local user-JWT refresh, and authenticated Main Sequence access
257
+ - runtime-credential exchange, local sign-in through the Main Sequence CLI session or a user-JWT
258
+ environment pair, and authenticated Main Sequence access
247
259
  - provider validation and credential hydration
248
260
  - durable Tau sessions, leases, restore, persistence, cancellation, eviction, and shutdown
249
261
  - local Tau execution without backend AgentSession pre-creation
@@ -98,9 +98,9 @@ project selects a provider and model explicitly, while Main Sequence still autho
98
98
  the provider credential and supplies the live MCP catalog:
99
99
 
100
100
  ```bash
101
+ mainsequence login # once; the session is kept by the CLI, not in .env
102
+
101
103
  export MAINSEQUENCE_AUTH_MODE=jwt
102
- export MAINSEQUENCE_ACCESS_TOKEN="<exported-user-access-token>"
103
- export MAINSEQUENCE_REFRESH_TOKEN="<exported-user-refresh-token>"
104
104
  export TAU_LOCAL_MODE=true
105
105
  export TAU_LOCAL_PROVIDER=openai
106
106
  export TAU_LOCAL_MODEL=gpt-5.4
@@ -108,10 +108,21 @@ export TAU_LOCAL_MODEL=gpt-5.4
108
108
  uv run ms-tau
109
109
  ```
110
110
 
111
- The normal Main Sequence login or project launcher may provision those JWT variables, but
112
- `ms-tau-sdk` does not install, import, or invoke the `mainsequence` Python package. It consumes the
113
- environment handoff and public refresh API directly. Provider secrets are never environment
114
- settings and are never persisted locally.
111
+ Log in once with the Main Sequence CLI. Local mode then asks that CLI for a short-lived access
112
+ token with `mainsequence auth token --json`, and again when the token is about to expire. No token
113
+ is exported and none is written to the project `.env`. The SDK looks for the CLI in
114
+ `MAINSEQUENCE_CLI`, then beside the Python interpreter, then on `PATH`. `ms-tau-sdk` does not
115
+ install or import the `mainsequence` Python package and does not read the CLI's credential store.
116
+
117
+ Launchers and CI can hand the process a token pair instead. With both variables set, the SDK
118
+ uses them and the public refresh API and never runs the CLI:
119
+
120
+ ```bash
121
+ export MAINSEQUENCE_ACCESS_TOKEN="<user-access-token>"
122
+ export MAINSEQUENCE_REFRESH_TOKEN="<user-refresh-token>"
123
+ ```
124
+
125
+ Provider secrets are never environment settings and are never persisted locally.
115
126
 
116
127
  Local conversations and public A2A Tasks are stored at
117
128
  `~/.tau/mainsequence/<workspace-hash>/runtime.sqlite3`; an omitted chat `sessionUid` uses the
@@ -212,7 +223,8 @@ are not bundled into the SDK. Main Sequence transport and protocol behavior rema
212
223
  ## Included capabilities
213
224
 
214
225
  - FastAPI application construction and lifecycle management
215
- - runtime-credential exchange, local user-JWT refresh, and authenticated Main Sequence access
226
+ - runtime-credential exchange, local sign-in through the Main Sequence CLI session or a user-JWT
227
+ environment pair, and authenticated Main Sequence access
216
228
  - provider validation and credential hydration
217
229
  - durable Tau sessions, leases, restore, persistence, cancellation, eviction, and shutdown
218
230
  - local Tau execution without backend AgentSession pre-creation
@@ -9,7 +9,9 @@ from contextlib import closing
9
9
  from pathlib import Path
10
10
  from typing import Any
11
11
 
12
- SCHEMA_VERSION = "5"
12
+ # The version `ms_tau_sdk.backend.local` stamps on the store. The board never imports the SDK,
13
+ # so this follows it by hand.
14
+ SCHEMA_VERSION = "6"
13
15
  TABLES = (
14
16
  "sessions",
15
17
  "entries",
@@ -210,6 +210,7 @@ async function checkConnection() {
210
210
  detailLine(box, "Mode", result.health.mode);
211
211
  detailLine(box, "Version", result.health.version);
212
212
  detailLine(box, "Ready", result.ready ? "Yes" : "No");
213
+ detailLine(box, "Credential source", result.health.mainsequence_auth_source);
213
214
  detailLine(box, "Workspace digest", result.health.workspace_digest);
214
215
  detailLine(box, "State directory", result.stateDir);
215
216
  detailLine(box, "MCP tools", result.health.mcp_tool_count);
@@ -192,7 +192,7 @@
192
192
  <button class="button is-primary" id="settings-apply-board">Apply to this session</button>
193
193
  <p class="help mt-2">This updates the selected profile immediately. It does not write <code>.env</code>.</p>
194
194
  </div>
195
- <div class="box"><h2 class="title is-6">Credential presence</h2><p class="help mb-3">Board process and local <code>.env</code> are shown separately. Credential values are never sent to the browser.</p><div id="settings-credentials" class="detail-list"></div></div>
195
+ <div class="box"><h2 class="title is-6">Credential presence</h2><p class="help mb-3">Board process and local <code>.env</code> are shown separately. Credential values are never sent to the browser. A Tau process that uses the Main Sequence CLI session needs no token here. Connect shows its credential source.</p><div id="settings-credentials" class="detail-list"></div></div>
196
196
  </div>
197
197
  <div class="column">
198
198
  <div class="box">
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ms-tau-sdk"
7
- version = "1.2.12.dev21"
7
+ version = "1.2.13.dev22"
8
8
  description = "Workspace-bound Tau application primitives for Main Sequence projects"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -11,14 +11,15 @@ an offline, mock-provider, or mock-MCP mode.
11
11
 
12
12
  ## Start the process
13
13
 
14
- Obtain the user's access and refresh JWTs through the supported Main Sequence login or
15
- project-launcher flow. The SDK consumes that environment handoff directly; it does not install,
16
- import, or invoke the `mainsequence` Python package and does not read its private credential store.
14
+ The user logs in once with a Main Sequence CLI that provides `mainsequence auth token`. Local mode
15
+ then asks that CLI for a short-lived access token, at startup and again when the token is about to
16
+ expire. No token is exported and none is written to the project `.env`. The SDK does not install or
17
+ import the `mainsequence` Python package and does not read the CLI's private credential store.
17
18
 
18
19
  ```bash
20
+ mainsequence login # once; the session is kept by the CLI, not in .env
21
+
19
22
  export MAINSEQUENCE_AUTH_MODE=jwt
20
- export MAINSEQUENCE_ACCESS_TOKEN="<user-access-token>"
21
- export MAINSEQUENCE_REFRESH_TOKEN="<user-refresh-token>"
22
23
  export TAU_LOCAL_MODE=true
23
24
  export TAU_LOCAL_PROVIDER="<provider>"
24
25
  export TAU_LOCAL_MODEL="<model>"
@@ -28,12 +29,20 @@ export TAU_LOCAL_THINKING="<thinking-level>"
28
29
  uv run ms-tau
29
30
  ```
30
31
 
31
- Set `MAINSEQUENCE_ENDPOINT` only for a non-default platform endpoint. Local mode binds to
32
- `127.0.0.1:8787` by default. Treat an explicit public bind as privileged exposure: each accepted
33
- request can use the authenticated user's live Main Sequence permissions.
32
+ The SDK looks for the CLI in `MAINSEQUENCE_CLI`, then beside the Python interpreter that runs
33
+ `ms-tau`, then on `PATH`. Launchers and CI can export `MAINSEQUENCE_ACCESS_TOKEN` and
34
+ `MAINSEQUENCE_REFRESH_TOKEN` instead. With both set, the SDK uses that pair and never runs the
35
+ CLI. Do not add token lines to `.env`. A pair found there still works, but it is deprecated and
36
+ startup logs a warning. `mainsequence refresh-token` run in that directory removes the lines.
37
+
38
+ Set `MAINSEQUENCE_ENDPOINT` only for a non-default platform endpoint. The CLI session must be for
39
+ the same endpoint. Local mode binds to `127.0.0.1:8787` by default. Treat an explicit public bind
40
+ as privileged exposure: each accepted request can use the authenticated user's live Main Sequence
41
+ permissions.
34
42
 
35
43
  Never place JWTs or provider credentials in source control, `.tau`, copied skills, command output,
36
- or debugging artifacts. The user JWT is sent only to Main Sequence. Main Sequence validates the
44
+ or debugging artifacts. Do not run `mainsequence auth token` to read its output: it prints the
45
+ access token. The user JWT is sent only to Main Sequence. Main Sequence validates the
37
46
  explicit `TAU_LOCAL_PROVIDER` and `TAU_LOCAL_MODEL`, returns provider-control evidence, and hydrates
38
47
  the provider credential used for inference. Provider secrets are neither environment settings nor
39
48
  local state.
@@ -45,7 +54,7 @@ local state.
45
54
  | Agent or AgentSession registration | Never created or updated |
46
55
  | Chat history, snapshots, leases, activity, and cancellation | Workspace SQLite |
47
56
  | Public A2A Message and Task state | Workspace SQLite |
48
- | Main Sequence authentication and token refresh | Remote, using the exported JWT pair |
57
+ | Main Sequence authentication and token refresh | Remote. The token comes from the Main Sequence CLI session, or from an exported JWT pair |
49
58
  | Provider authorization, hydration, and inference | Remote and real |
50
59
  | Main Sequence MCP catalog and tool calls | Remote and real; platform mutations remain possible |
51
60
  | Project instructions, skills, hooks, and extensions | Normal repository `.tau` composition |
@@ -189,7 +198,8 @@ platform resources under the authenticated user's permissions.
189
198
 
190
199
  Check the process in this order:
191
200
 
192
- 1. `GET /health` reports `mode: local` and safe composition diagnostics.
201
+ 1. `GET /health` reports `mode: local`, safe composition diagnostics, and
202
+ `mainsequence_auth_source`: `cli`, `environment`, or `env_file`.
193
203
  2. `GET /ready` confirms user authentication, provider control, local storage, and MCP readiness.
194
204
  3. `GET /version` reports the expected installed SDK release.
195
205
  4. A chat request without `sessionUid` returns an effective identifier in
@@ -203,8 +213,10 @@ Check the process in this order:
203
213
  ## Classify failures
204
214
 
205
215
  - Startup setting failure: inspect the exact missing or conflicting environment variable.
206
- - Authentication failure: refresh or re-export the JWT pair; do not substitute a runtime
207
- credential in local mode.
216
+ - Authentication failure: read the error, which names its remedy. The user runs
217
+ `mainsequence login`, upgrades a Main Sequence CLI that is too old for `auth token`, sets
218
+ `MAINSEQUENCE_CLI`, or provides the JWT pair. With an exported pair, export a fresh one. Do not
219
+ substitute a runtime credential in local mode.
208
220
  - Provider/model rejection: verify the exact configured names against the authenticated live
209
221
  catalog; do not silently select a different model.
210
222
  - OpenAI-compatible transport failure: open the Task's failure incident in Tau Board. Use its
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  from dataclasses import dataclass
6
6
 
7
- from ms_tau_sdk.backend.auth import BackendAuth, JWTAuth, RuntimeCredentialAuth
7
+ from ms_tau_sdk.backend.auth import BackendAuth, RuntimeCredentialAuth, local_mode_auth
8
8
  from ms_tau_sdk.backend.client import MainSequenceClient
9
9
  from ms_tau_sdk.backend.local import LocalDevelopmentBackend
10
10
  from ms_tau_sdk.providers.factory import ProviderFactory
@@ -28,7 +28,7 @@ class ApplicationServices:
28
28
  auth: BackendAuth
29
29
  backend: MainSequenceClient
30
30
  if settings.local_mode:
31
- auth = JWTAuth(settings)
31
+ auth = local_mode_auth(settings)
32
32
  services_client = MainSequenceClient(settings, auth)
33
33
  backend = LocalDevelopmentBackend(settings, services_client)
34
34
  else: