Replies: 1 comment
|
Confirmed, with one mechanism correction that doesn't change your conclusion. The identity derivation is as you quoted, match: event => event.type === 'user/message'
&& isAppendSurfaceEvent(event)
&& !isCompactionCheckpoint(event)
? { id: String(event.data.id), role: 'start' }
: null,So two append-surface Drift: the assembler doesn't "fold" the later start; it throws an invariant error. if (role === 'start' && context?.start !== undefined) {
throw new Error(`conversation Context ${key} received more than one start Match`)(the batch path at Your suggested fix is sound and consistent with the file: Two notes: (1) the refresh symptom you mention shares a shape with #6954 — the same duplicate pair in the opening window would throw through If you can share the two colliding events' full payloads (type/source/id/seq) from a session log, that would pin down the producer path. |
Uh oh!
There was an error while loading. Please reload this page.
What happens
Clicking Load earlier in Chat can return a successful page while no new rows appear on screen. Clicking it repeatedly looks like the button is simply broken. A browser refresh that replays the same history window can expose the same symptom.
Where
packages/client/ui-chat/src/client/conversation-nodes/message.tsCause
The
input-messageContext id is derived from the producer id:When two append-surface
user/messageevents carry the same producerdata.id, both match a singleinput-messageContext as two separate starts. That violates the assembler's unique-start invariant, so the later occurrence is folded away and produces no visible row. Neither symptom requires missing persisted events or a server restart.Observed evidence
With a long transcript, paging twice produced:
Suggested fix
Use the event's own position for row identity, and keep the producer id for the things that genuinely need it:
data.idis still required for Inbox correlation and steering classification, so it should stay in the payload — only the Context/row identity needs to change.Why this cannot be a plugin
The
conversation.chat.nodeslots render nodes, but they do not let a plugin change how node identity is computed, and there is no public seam for registering or overriding aConversationNodeDefinition. So this appears to need a change insideui-chat.Process note
Issues are disabled on this repo and
CONTRIBUTING.mdstates external pull requests are not accepted, so I am posting here as instructed. Sorry if this is the wrong category — happy to move it.All reactions