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.messages and gen_ai.output.messages on its invoke_agent root;
- the post-reload continuation emitted
gen_ai.output.messages, but no gen_ai.input.messages, on its new invoke_agent root;
- 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_agent root 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_agent root structurally, but currently checks captured input/output content only on child chat spans: 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.
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_agentspan can omitgen_ai.input.messageseven though message-content capture is enabled.This is specific to the resumed/continued invocation path, not every turn:
gen_ai.input.messagesandgen_ai.output.messageson itsinvoke_agentroot;gen_ai.output.messages, but nogen_ai.input.messages, on its newinvoke_agentroot;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.messagesis 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'sservice.versionandgen_ai.agent.versionattributes).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.messagesattribute.Expected behavior
With content capture enabled, an
invoke_agentroot that continues a user-initiated turn after reconnect/reload should remain self-contained and include the originating user input ingen_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
1.136.1invoke_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.tsA regression test that reloads/reconnects during an active turn and asserts root-level
gen_ai.input.messageswould cover this path without relying on a particular OTel backend.