OTel: post-reload resumed turn emits `invoke_agent` root without input messages
Nobody has claimed this yet.
- Dominant language
- Shell
- Stars
- 11.2k
- Forks
- 1.9k
- Avg merge
- 14h 16m
- Merged PRs (30d)
- 6
Description
Describe the bug
When a running Copilot CLI turn in VS Code Agent Host is interrupted by a VS Code window reload and then continues after Agent Host reconnects, the new root invoke_agent span can omit gen_ai.input.messages even though message-content capture is enabled.
This is specific to the resumed/continued invocation path, not every turn:
- the ordinary user turn immediately before the reload emitted both
gen_ai.input.messagesandgen_ai.output.messageson itsinvoke_agentroot; - the post-reload continuation emitted
gen_ai.output.messages, but nogen_ai.input.messages, on its newinvoke_agentroot; - ordinary user turns immediately afterward again emitted both input and output.
The exporter was healthy and child chat/tool spans were present. Some later child model spans contained input content, so this was not a transport failure or a global content-capture setting problem.
In LangSmith, gen_ai.input.messages is mapped to the run input. The affected root therefore appears as No data in the trace/Turns UI even though the continued turn did useful work and produced child spans.
Affected version
Observed on 1.0.81-0 (the value recorded in both the root span's service.version and gen_ai.agent.version attributes).
The latest CLI installed locally is now 1.0.82, but I have not yet repeated the active-turn reload sequence on that version, so I cannot claim that version is affected.
Steps to reproduce the behavior
-
In VS Code, enable Agent Host OTel export and content capture:
{ "chat.agentHost.otel.enabled": true, "chat.agentHost.otel.exporterType": "otlp-http", "chat.agentHost.otel.captureContent": true, "chat.agentHost.otel.dbSpanExporter.enabled": true } -
Start a Copilot CLI / Agent Host request that performs enough tool work to remain active.
-
While the turn is still running, reload the VS Code window.
-
Let Agent Host reconnect and continue the existing turn.
-
Inspect the locally exported OTLP spans or the configured backend.
-
Compare the
invoke_agentroot created for the post-reload continuation with ordinary roots before and after it.
Observed result: the continuation root has output and child spans but no gen_ai.input.messages attribute.
Expected behavior
With content capture enabled, an invoke_agent root that continues a user-initiated turn after reconnect/reload should remain self-contained and include the originating user input in gen_ai.input.messages.
If a reconnect intentionally starts a separate continuation trace, it should still carry meaningful continuation input/context (and ideally an explicit link to the original invocation) so OTel backends do not display an input-less root.
Additional context
- VS Code:
1.136.1 - OS: macOS
- Integration: VS Code Agent Host using the Copilot SDK/runtime
- Export: OTLP/HTTP to LangSmith plus the Agent Host local SQLite span exporter
- No OTLP forwarding failures were present after reload.
- The affected root began immediately after the fresh Agent Host process started, before the next user message. Its predecessor ended just before reload, and the next ordinary user-message root had input normally. This is why the evidence points to the reload/resume lifecycle path rather than an intermittent exporter failure.
- The public SDK telemetry E2E test validates the
invoke_agentroot structurally, but currently checks captured input/output content only on childchatspans: https://github.com/github/copilot-sdk/blob/main/nodejs/test/e2e/telemetry.e2e.test.ts
A regression test that reloads/reconnects during an active turn and asserts root-level gen_ai.input.messages would cover this path without relying on a particular OTel backend.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with nodejs/test/e2e/telemetry.e2e.test.ts and trace the active-turn reload/reconnect lifecycle in the Agent Host telemetry path. Reproduce the continuation scenario with content capture enabled, then add coverage that checks the resumed invoke_agent root for gen_ai.input.messages and run the telemetry E2E test.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- nodejs
- Domain
- observability-sre, testing-qa
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 66/100