Repository navigation
Description
Feature Request: Show Copilot activity descriptions beside the chat brain indicator
Slug: copilot-chat-activity-intent
Created: 2026-10-04T17:32:43Z
Description
Show Copilot's own short description of its current work beside the in-chat
brain indicator on web, desktop, and native mobile. Keep sidebar statuses
simple and short. Fall back to the existing generic chat label when a current
description is unavailable.
Status and baseline
Requested only; implementation is not approved. Research and registration do
not advance the tpatch lifecycle. Canonical backlog: #1.
Branch request/copilot-chat-activity-intent starts from published fork source
bc9eeb9a6f5e3fe2e6d58d9c1b14d5ed93d6c2be
(0.0.42-preview.20261003.2). The investigation also checked the native mobile
checkout at aeb0b48220d2cb83698e2298a163261f75ec5681; the adapter, ingestion,
and chat indicator files cited below are unchanged from the published base.
Investigation: SDK support already exists
The installed @github/copilot-sdk 1.0.8 exposes assistant.intent:
data.intentis a human-readable description of the current activity or plan.ephemeral: truemeans it is a live hint, not a persisted native session event
that can be reconstructed from session history after resume.- Optional
agentIddistinguishes a subagent from the root agent. - This is a dedicated activity description, separate from reasoning content.
No additional model call, terminal scraping, or polling is needed to consume it.
Authoritative pinned SDK source:
The SDK tag v1.0.8 resolves to the full commit above. No SDK upgrade is
indicated by this investigation. Event availability and cadence across models,
long-running tools, resumed sessions, and background work have not been measured
in a new live provider run.
Investigation: where the fork currently loses the description
All source references below are relative to the published baseline:
apps/server/src/provider/Layers/CopilotAdapter.ts:1317-1337already reads
assistant.intent. Root-agent intent becomestool.progress.summary;
known child-agent intent becomestask.progress.description.apps/server/src/orchestration/Layers/ProviderRuntimeIngestion.ts:744-780
discardstool.progresswithout ataskId. The root intent therefore does
not become a chat activity through this projection.packages/contracts/src/providerRuntime.ts:761-770already types the
optional summary on the runtime progress payload. This is not, by itself,
a client-visible current-intent contract.apps/web/src/session-logic.ts:484and
apps/mobile/src/lib/threadActivity.ts:423skiptool.progressin the
ordinary work-log mapping.apps/web/src/components/chat/MessagesTimeline.tsx:2375-2382and
apps/mobile/src/features/threads/thread-work-log.tsx:1131-1147render
the brain row with the fixed labelThinking.
This is a modest end-to-end enhancement, not merely a JSX label replacement.
The existing exclusions intentionally prevent progress heartbeats from filling
the durable work log; do not remove them indiscriminately.
Requested outcome to assess during analysis
- Render the latest relevant root-agent description in the chat brain/status
row. Do not expand sidebar, thread-list, badge, notification, or Live Activity
status labels. Preserve the elapsed-time display. - Treat the description as advisory text, never as authoritative execution,
completion, attention, or connection state. Approval/input, failure,
disconnection, setup, and compaction states retain their existing precedence. - Scope current intent by environment, thread, and active turn. Subagent
descriptions must not overwrite the root-agent label. - Clear or invalidate stale text at turn and session boundaries, abort/error,
and reconnect. A resumed client must not present a historical description as
current work. Assess a bounded current-state snapshot versus waiting for the
next live event before choosing the smallest correct transport. - Preserve the Copilot completion fix: model iteration boundaries and
assistant.idledo not independently complete a T3 user turn; successful
completion remains tied to rootsession.idle. - Keep only the latest bounded plain-text hint for rendering. Deduplicate
unchanged text; do not append one permanent chat row per progress update,
introduce a per-row timer, or add continuous animation. - Support narrow mobile screens, large text, accessibility labels, and stable
virtualized layout without a scrolling marquee or disruptive reflow. - Web and desktop share presentation; iOS and Android require the native
presentation path. Local, direct remote, NetBird, SSH/relay, multiple
environments, and multiple clients must preserve the same scoping rules. - Keep generic labels for providers without a supported activity-description
signal. Do not generate synthetic descriptions from reasoning or tool output.
Evidence and ownership before implementation
Verify real SDK event availability in an explicitly approved isolated session.
Cover absent/repeated hints, subagents, late events, lifecycle clearing,
reconnect, and cross-environment isolation in focused behavior tests. An approved
integrated client pass should verify the actual brain row rather than only
asserting prop wiring.
Assess maintained-root ownership before implementation: reuse or extend
copilot-cli-provider for adapter behavior rather than create an overlapping
backend root. Do not change canonical attention, notification delivery, or
provider lifecycle semantics as part of this request.
No runtime implementation, analyze/define/apply phase advancement, provider
turn, device interaction, build, deployment, PR, or release is authorized by
this registration.
Activity
jdbencardinop commentedon Oct 4, 2026
Registered and pushed as requested-only tpatch feature
copilot-chat-activity-intenton branchrequest/copilot-chat-activity-intent, commited16e31e8ae9a4fbcba805802c6bd594ec91aae1.Versioned request and investigation.
tpatch nextremainsanalyze; analysis phase and implementation have not been started. No product source change or PR.Recorded by GPT-6 Astra using GitHub Copilot CLI; no delegated inference.
jdbencardinop commentedon Nov 6, 2026
Current-source assessment: SDK 1.0.28 / v0.1.4 architecture
The old SDK 1.0.8/file-path map in the original description is historical. This assessment uses validated main
0490e7bb2753ee455d58f9832f6ea943af81b0e0, upstream v0.1.4783581d461dc72cdd8f78fc8abb4ad536dfc4547, and SDK 1.0.28 (official tag commitfa108e71ee3025663e0dac20f2a071055d3a6b14).Still available in the SDK schema:
assistant.intenthasdata.intent,ephemeral: true, and optionalagentId. It has no turn/message ownership field; its event ID, timestamp, and chronological parent are not a T3 attempt identity.Current gap: the Copilot adapter does not normalize this event into a client activity-description signal. The current thread stream carries snapshots and sequenced domain events, not an existing current-intent field. Reusing the old progress-event path would be the wrong architecture.
The actual presentation points are now web/desktop
ThinkingTimelineRowand nativeThreadThinkingRow. This remains more than a label replacement.Zero-vendor-inference qualification attempted: two disposable SDK/native-CLI loopback sessions used runtime 1.0.105, protocol 3, empty isolated homes, configuration discovery and custom instructions disabled, and deterministic local responses. One used a
report_intent-only tool filter with a fixture model; the other used the knowngpt-4.1profile and default offered tools. Both completed one local request with one user message, one idle event, no session error, and unchanged native identity. Neither offeredreport_intentor emittedassistant.intent. The fixture therefore did not establish live intent availability or cadence. This negative result is configuration-specific, not evidence that the CLI never emits the event. No external tools were executed or paid provider requests made; both native sessions, servers, and temporary homes were cleaned up.Recommended definition boundary: one bounded, deduplicated, advisory latest hint; root-agent only; scoped to the destination environment/thread/attempt; invalidated on turn replacement, completion, abort/error, session loss, and reconnect. Keep lifecycle and approval/input precedence, generic fallback labels, existing elapsed-time behavior, and all sidebar/notification/attention labels unchanged. Do not write a durable heartbeat row per hint, synthesize descriptions from reasoning, add polling, or add per-row timers/animation.
Before implementation, obtain a genuine intent-producing trace and qualify its ordering around abort/steer/resume. Then choose a typed transient transport and shared client-runtime state without corrupting the thread stream's durable cursor. The initial historical request branch is untouched; no hint implementation, UI change, client probe, or deployment was made. The #42 event-ingress candidate is separate hardening, not an activity-description implementation.
jdbencardinop commentedon Nov 6, 2026
Continued native signal-production qualification
Assessed the current SDK 1.0.28, bundled native runtime 1.0.105, protocol 3, against disposable loopback-only model fixtures. This used the actual SDK/native CLI, not a fake event emitter or a live conversation. No vendor inference, credentials, client/device work, or product changes were involved.
The additional tool-cycle fixture completed two local model requests and one host-defined tool callback. The callback deliberately overrode the
bashname with an in-memory handler; no shell command or filesystem tool ran. It emitted oneuser.message, one finalsession.idle, nosession.error, and noassistant.intent. This does not qualify the native bash implementation itself.Read-only native metadata also showed:
gpt-4.1tool listing contained 15 tools, withoutreport_intent.report_intent.The pinned SDK still documents the ephemeral
assistant.intentevent. It does not document activation conditions sufficient to obtain a genuine producing trace in the configurations above.The separate native steering/queue experiment added an ownership constraint:
user.message.data.turnIdwas"0"for both the original prompt and a later queued follow-up; an interjected prompt used"1". That identifier alone must not be treated as a globally unique T3 turn/attempt key for activity hints. Stable message admission/consumption identity and T3 attempt/session ownership remain distinct.Status: requested-only, blocked on a genuine intent-producing native configuration/trace before choosing and implementing the transport. No synthetic descriptions, durable progress rows, label changes, tpatch phase advancement, or lifecycle changes were made. A declaration-only implementation would not establish production availability or safe ownership.
jdbencardinop commentedon Nov 6, 2026
Explicit-streaming qualification: production signal still unobserved
One configuration detail needed tightening: the earlier activity probes did not set
streaming, whose SDK default is false. T3's Copilot adapter explicitly enables streaming. Those earlier results remain configuration-specific, not a production-equivalence claim.I executed another actual SDK 1.0.28 / bundled CLI 1.0.105 / protocol 3 session with
streaming: trueandincludeSubAgentStreamingEvents: false, matching those T3 settings. The model endpoint was deterministic and loopback-only. The sole offeredbashtool was overridden with an in-memory handler; no native bash implementation or shell command executed.Observed:
assistant.message_delta, one user message, and one final idle were received; native session identity stayed unchanged.assistant.intentcount: 0; no session error.report_intent.The SDK dispatcher delivers incoming events to both typed and wildcard callbacks; using a wildcard callback does not require a separate typed intent subscription. The probe counts raw intent events before interpreting their payload and propagates malformed intent payloads as fixture failures, rather than relying on an empty collected-description array.
This rules out the omitted streaming option as the explanation in this specific configuration. It does not establish that authenticated GitHub/Fusion sessions, other models, interactive modes, or other runtime configurations cannot produce intent. No vendor inference, live-conversation writes, client launch, or implementation was performed.
The request remains open and requested-only. We still need a genuine producing configuration/trace before selecting a production transport and attempt-ownership contract. The event's optional
agentIdis not itself a T3 attempt key, and native numeric turn IDs can be reused across queued follow-ups. Any eventual hint must remain advisory, bounded and root-scoped, with lifecycle invalidation; reasoning text or tool descriptions must not be substituted for a missing native signal.jdbencardinop commentedon Nov 6, 2026
Longer native SDK and plain CLI comparison; activity API cross-check
The SDK's documented
assistant.intentremains the best semantic match for this request: native short current-work/plan text, ephemeral, with optional subagent identity. A documented schema is not evidence that the producer is active in every runtime/model configuration.Other declared signals are different:
tool.execution_startidentifies a tool call and its arguments, not root-agent current intent.tool.execution_progresscarries a tool-scopedprogressMessage/toolCallId. It may describe a particular tool, but is not documented as the general root brain-row signal.assistant.reasoning/reasoning deltas are reasoning content, not a bounded activity hint.session.infois categorized information, including configuration/status; Fusion phase events describe specialized runtime phases. Neither establishes an interchangeable generic current-intent source.No substitute label was generated from these signals.
Prior coverage and its limit
Earlier tests used the actual SDK 1.0.28 / native CLI 1.0.105 / protocol 3 against deterministic loopback model responses: intent-only/default-tool profiles, a two-request tool cycle, then explicit streaming enabled. They did not run authenticated model inference or an interactive terminal session. The omitted streaming setting was corrected before concluding it was not the explanation in that specific configuration.
The negative observations were limited: none demonstrated that production intent was universally unsupported. Model-specific and raw built-in metadata did not list
report_intent, but names/catalogs alone do not prove all configurations or feature rollouts behave alike.Additional executed coverage
copilotCLI, no SDK wrapper--stream=on --output-format=json, one prompt; 7 loopback requests, six nativeviewtool calls reading six disposable files. Every native tool completion reported success and exactly matched the expected file text; result exitCode 0.session.infoonly described disabled-tool configuration. No shell tool, credentials or vendor inference.The direct CLI profile used COPILOT_OFFLINE=true, a loopback custom provider, an empty disposable home/cwd and only the native read-only view tool. All six files belonged to the fixture. This is a genuine plain prompt-mode stream, not interactive CLI/TUI behavior. The SDK profile retained the same native identity across all three turns. Both profiles awaited their owned process/SDK/server shutdown and removed only their exact fixture directory.
More model/tool iterations did not produce intent in either tested mode. This does not prove that elapsed duration is irrelevant in all configurations; neither fixture used a real model choosing its own reporting behavior. Long artificial delays would not supply the missing production-model/configuration evidence.
Next evidence needed
An explicitly approved, tightly bounded pair of actual-model SDK and plain-CLI sessions should use the same account/model/runtime, isolated native storage and a read-only disposable task with several real tool decisions. Capture live events/JSONL before considering any transcript import, because ephemeral intent is not persisted. If the terminal displays a genuine activity description but the event trace does not contain intent, inspect that renderer's actual source/correlated producer rather than assume the SDK event name. Interactive mode may need its own approved terminal capture; authenticated/Fusion behavior is not qualified by these loopback tests.
Status remains open/requested-only. No runtime, transport, label, lifecycle, SDK upgrade, deployment or live-conversation change was made.
jdbencardinop commentedon Nov 6, 2026
Authenticated SDK/plain-CLI comparison and a second native activity source
Completed the authorized bounded real-model comparison in disposable synthetic state, not a live T3 conversation. The account catalog enabled
gpt-6-luna; it tied for the lowest declared input/output token-price pair in that catalog. No price currency or actual charge is inferred here.Both profiles used the same model and credential source: SDK 1.0.28/native runtime 1.0.105/protocol 3, and the plain CLI's streaming JSON prompt path. Each followed a five-file synthetic chain using only
view, made six model calls, read all five exact file contents, and returned the correct total, 62. No shell, subagent, repository-content task, production flag change or client interaction was involved.Observed signals in each profile: zero
assistant.intent, zerotool.execution_progress, and five nonemptyassistant.message.data.toolRequests[].intentionSummaryvalues. These are genuine native per-tool descriptions, not labels reconstructed by T3 from reasoning or tool output. The earlier deterministic plain-CLI trace also contained six such summaries.The alternative field is explicitly documented in the pinned SDK 1.0.28 event types: "Resolved intention summary describing what this specific call does." It is tool-scoped, not equivalent to the root agent's current activity/plan hint. The current Copilot adapter consumes assistant text and tool-start events but does not publish these tool-request summaries as root current-intent state.
Flag investigation
SDK session configuration does expose host-resolved
featureFlags. An isolated, no-inference read of the installed native runtime's experimental internal static catalog returned 152 declared flags. No named general intent/activity producer gate was identified. Fusion and specialized reasoning/compaction flags exist, but that does not establish an intent activation switch.This is a bounded catalog/source observation, not proof that no account-, model-, experiment- or interactive-mode-specific gate exists. No flags were forced on, and internal metadata access is not proposed as a production dependency.
Interpretation and remaining scope
The longer loopback traces were not simply too short: real authenticated inference also emitted tool intentions without root
assistant.intent. We now have a concrete second producer to assess instead of guessing an event name. However, neither prompt-mode JSON nor SDK traces prove what the interactive CLI's brain row displays.Keep this issue requested-only. A product decision is still needed on whether a native per-tool intention is an acceptable bounded fallback for the requested root description. Do not turn it into authoritative work/completion state, persist one row per update, scrape the terminal, or synthesize activity from reasoning. Root/subagent ownership, late updates, lifecycle clearing, reconnect and integrated client behavior remain unqualified.
Raw events, account data and local fixture paths remain private. Disposable state was removed. No UI, adapter, capability, deployment or tpatch lifecycle change was made.