feat: attach client_session_id to requests and set the CLI session env var - #1074
Merged
aqandrew merged 10 commits intoAug 17, 2026
Merged
Conversation
aqandrew
force-pushed
the
aqandrew/devex-661-session-id-requests
branch
from
August 12, 2026 22:00
f2f6512 to
e6e52cc
Compare
aqandrew
force-pushed
the
aqandrew/devex-661-session-id-requests
branch
from
August 13, 2026 00:40
0baf84a to
8d98780
Compare
EhabY
reviewed
Aug 13, 2026
aqandrew
force-pushed
the
aqandrew/devex-661-session-id-requests
branch
6 times, most recently
from
August 14, 2026 00:03
0cc3e42 to
5d327f2
Compare
aqandrew
added a commit
that referenced
this pull request
Aug 14, 2026
Add core/sessionId.ts exporting a single session ID constant (generated once per activation) and remove newSessionId() from telemetry/ids.ts. Consumers now import the constant directly instead of threading it through constructors and CoderApi.create, so every CoderApi client attaches the client_session_id baggage header unconditionally. Addresses review feedback on #1074.
EhabY
approved these changes
Aug 17, 2026
Add SessionLogger, which wraps the Coder output channel and prefixes every message with the activation's session ID so all log lines for a session can be correlated by a single ID. Generate the ID once in the ServiceContainer, reuse it as the telemetry session ID, and expose it via getSessionId() for downstream consumers.
Attach the session ID to every API request via the W3C baggage header (session_id=<id>) so the server can correlate requests with the session's logs and telemetry, threading it through CoderApi.create at all call sites. Set CODER_TRACE_SESSION_ID on both process.env and the terminal environment collection so the spawned `coder ssh` ProxyCommand reuses the plugin's session ID instead of generating its own.
Align with the updated RFC: the session ID baggage key changes from session_id to client_session_id.
Add core/sessionId.ts exporting a single session ID constant (generated once per activation) and remove newSessionId() from telemetry/ids.ts. Consumers now import the constant directly instead of threading it through constructors and CoderApi.create, so every CoderApi client attaches the client_session_id baggage header unconditionally. Addresses review feedback on #1074.
aqandrew
force-pushed
the
aqandrew/devex-661-session-id-requests
branch
from
August 17, 2026 20:21
fec1170 to
2c72a37
Compare
aqandrew
added a commit
that referenced
this pull request
Aug 21, 2026
## What Add info-level logging of workspace, agent, and lifecycle status transitions so connection debugging has a record of state changes — correlated by the session ID from #1073. This is **Phase 3 of 3** for [DEVEX-661](https://linear.app/codercom/issue/DEVEX-661) (RFC req 7). It builds on #1074. ## Changes State handling is split into three layers, one job each: - **detect** — `WorkspaceStateObserver` / `WorkspaceAgentObserver` (`src/instrumentation/workspace.ts`) each detect a transition once and report a transition object. Stateful but effect-free (no logger/telemetry imports). The agent observer tracks every agent by ID and reports agents that disappear. - **record** — `recordWorkspaceState` / `recordAgentState` emit the `workspace.state_transitioned` / `workspace.agent.state_transitioned` telemetry events. - **log** — inline in `WorkspaceMonitor.update()`, with flat scalar payloads matching the repo's other log sites. Logs `state observed` on first sight, `state changed` afterward, and `agent <name> removed` when an agent disappears. `WorkspaceMonitor` is now the single agent-observation site, so `WorkspaceStateMachine` no longer tracks agent telemetry. > [!IMPORTANT] > **Telemetry data change.** `workspace.agent.state_transitioned` now covers **every agent for the whole monitored session** (deduped per agent), rather than only the connected agent during connection setup. In practice most workspaces have one agent, so volume is unchanged; multi-agent workspaces and flaky connections emit more. There is no sampling in `src/telemetry/`, so this lands as-is. `EVENTS.md` is updated; heads-up to whoever owns the funnel queries. ## Testing - `pnpm typecheck`, targeted `pnpm lint`, full `pnpm test` (2456 passing). - Unit tests cover observer detection (first observation, dedup, per-agent independence, removal, reset), the `record*` event shapes, and the monitor's inline logging (observed vs changed, agent transitions across all agents, agent removal). <details> <summary>Refactor design (reviewer's three-layer shape)</summary> Per the review, the goal was to remove the duplication between the telemetry observers and the state loggers by making transition detection happen once: - **detect**: pure-detection observers report a transition object; no logger or telemetry imports. - **record**: `recordWorkspaceState` / `recordAgentState` in `src/instrumentation/`, telemetry only. - **log**: inline in the monitor, same as every other logging call site. This deletes both `src/workspace/*Logger.ts` files and leaves one tracker per concern. **Observer API decision:** observers return a transition object (workspace → `WorkspaceStateTransition | undefined`; agents → `{ transitions, removed }`) and `WorkspaceMonitor.update()` logs inline and calls `record*`. This was chosen over a constructor callback because `observe()` has a single synchronous caller, so a callback would only hide the side effects and complicate tests. </details> --- 🤖 Generated by Coder Agents.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Propagate the session ID from Phase 1 to outbound API requests and to the CLI, so server-side logs, telemetry, and the spawned
coder sshprocess can all be correlated with the extension's session.This is Phase 2 of 3 for DEVEX-661. It builds on #1073.
Changes
sessionIdargument toCoderApi.createand attach the session ID to every request via the W3Cbaggageheader using theclient_session_idkey (baggage: client_session_id=<hex>), on both the REST default headers and the WebSocket handshake headers. Threaded through allCoderApi.createcall sites, including the pre-auth OAuth/login/deployment clients, so every request carries it.sessionId, which ships on every event's context.applySshEnvironmentto also setCODER_TRACE_SESSION_IDon bothprocess.envand the terminal environment collection, so the spawnedcoder sshProxyCommand reuses the plugin's session ID instead of generating its own.Testing
pnpm typecheck, targetedpnpm lint, fullpnpm test:extension(2108 passing).baggage: client_session_id=<hex>present/absent onCoderApi;CODER_TRACE_SESSION_IDapplied toprocess.envand the terminal collection and restored on dispose.🤖 Generated by Coder Agents.