Issue details
Summary
In fx 0.0.10, fx acp sends both assistant reply text and operational notices as session/update agent_message_chunk events. Their messageId values differ, but the update does not identify which message is a notice. A client can separate the messages, but cannot classify them while they stream.
Steps to reproduce
- Start
fx acp, initialize it, and create a session in a workspace where fx emits a context or skill notice.
- Send a short
session/prompt, such as hi, and inspect the session/update notifications.
- Compare the live text with
fx session --id <id> --json after the turn ends.
In our ACP client, a context notice and default appeared alongside Hi! What can I help you with?. The saved assistant reply contained only Hi! What can I help you with?. This is an observed client symptom; I have not attached a raw ACP trace.
Expected behavior
The live ACP stream identifies operational notices separately from assistant reply text. A client can show notices as activity and stream the reply into the answer. Model reasoning remains separate as agent_thought_chunk.
Actual behavior and impact
fx gives operational and assistant text different message IDs, but sends both through agent_message_chunk without a kind field. A client must show notices as assistant messages, delay the answer until it can read the saved session, or guess from message order or text. A different ID indicates a different message, not its purpose.
The distinction exists inside fx: assistant_source uses assistantMessageId(), while operational uses operationalMessageId(). Both paths call sendAgentText(), which writes an agent_message_chunk. pushReasoningDelta() already writes agent_thought_chunk.
Could fx send operational notices through a distinct, documented ACP-compatible signal, while reserving agent_message_chunk for assistant reply text? An advertised extension notification is one possible approach. This differs from #207, which addressed terminal-rendered text versus raw Markdown; the reply text streams here, but has no reliable notice discriminator.
Trace
Not attached. The example above contains no credentials or private paths.
Sensitive information
Issue details
Summary
In fx 0.0.10,
fx acpsends both assistant reply text and operational notices assession/updateagent_message_chunkevents. TheirmessageIdvalues differ, but the update does not identify which message is a notice. A client can separate the messages, but cannot classify them while they stream.Steps to reproduce
fx acp, initialize it, and create a session in a workspace where fx emits a context or skill notice.session/prompt, such ashi, and inspect thesession/updatenotifications.fx session --id <id> --jsonafter the turn ends.In our ACP client, a context notice and
defaultappeared alongsideHi! What can I help you with?. The saved assistant reply contained onlyHi! What can I help you with?. This is an observed client symptom; I have not attached a raw ACP trace.Expected behavior
The live ACP stream identifies operational notices separately from assistant reply text. A client can show notices as activity and stream the reply into the answer. Model reasoning remains separate as
agent_thought_chunk.Actual behavior and impact
fx gives operational and assistant text different message IDs, but sends both through
agent_message_chunkwithout a kind field. A client must show notices as assistant messages, delay the answer until it can read the saved session, or guess from message order or text. A different ID indicates a different message, not its purpose.The distinction exists inside fx:
assistant_sourceusesassistantMessageId(), whileoperationalusesoperationalMessageId(). Both paths callsendAgentText(), which writes anagent_message_chunk.pushReasoningDelta()already writesagent_thought_chunk.Could fx send operational notices through a distinct, documented ACP-compatible signal, while reserving
agent_message_chunkfor assistant reply text? An advertised extension notification is one possible approach. This differs from #207, which addressed terminal-rendered text versus raw Markdown; the reply text streams here, but has no reliable notice discriminator.Trace
Not attached. The example above contains no credentials or private paths.
Sensitive information