feat(appkit): use chat history in the full chat UI#395
Open
hubertzub-db wants to merge 8 commits into
Open
Conversation
Signed-off-by: Hubert Zub <hubert.zub@databricks.com>
- responses-api-transport: normalize CRLF to LF in the SSE line parser
so the "\n\n" frame-boundary split works behind proxies that re-emit
events with CRLF line endings. Adds a CRLF-stream unit test.
- use-scroll-to-bottom: switch from useRef + listener-attach-on-mount
to a state-backed ref callback. The listener-attach effect now
re-runs when the container DOM node changes, so consumers that
conditionally render the scroll container (e.g. behind a loading
gate) still get auto-stick. The public ref type changes from
RefObject<T | null> to (node: T | null) => void; JSX
`ref={containerRef}` keeps working because React accepts both
shapes, and no consumer reads `.current` (verified across the repo).
Signed-off-by: Hubert Zub <hubert.zub@databricks.com>
Signed-off-by: Hubert Zub <hubert.zub@databricks.com>
Follow-up to the parent fix that switched `useScrollToBottom` from
`useRef` to a state-backed ref callback. `ChatMessages` previously
typed `containerRef` as `RefObject<HTMLDivElement | null>`, which no
longer matches the hook's return shape — the public type signature
needs to follow.
Behavior is unchanged at runtime since the prop is only ever forwarded
to a JSX `ref={...}`, which accepts both ref shapes.
Signed-off-by: Hubert Zub <hubert.zub@databricks.com>
Signed-off-by: Hubert Zub <hubert.zub@databricks.com>
- useChat: ref the `onFinish` callback and pass a stable wrapper to `useAiChat`, matching the pattern already used for `onData`/`onStreamPart`/`headers`. Consumers can keep passing callbacks bound via `useCallback(..., [list, …])` without worrying whether the AI SDK rebinds the callback per render. - agent.route: add a TODO comment on `seedMessages` documenting that hydration drops `tool`-role messages and only emits plain `text` parts — past tool invocations and approval cards therefore do not re-render when a thread is resumed. No behavior change here; the proper fix needs a shared Message → UIMessage converter that can be reused by `<ChatApp>` as well. Signed-off-by: Hubert Zub <hubert.zub@databricks.com>
Signed-off-by: Hubert Zub <hubert.zub@databricks.com>
- chat-history-sidebar.groupThreadsByDate: replace setMonth math with
a fixed 30-day window. The old `setMonth(getMonth() - 1)` overflows
at end-of-month (e.g. Mar 31 - 1 month rolls to Mar 3 because Feb is
shorter), bucketing threads into the wrong group on those days. The
new window also matches the visible "Last 30 days" label.
- chat-history-sidebar: surface delete failures. Adds a `deleteState`
prop ({ loading, error }) so the confirmation AlertDialog can stay
open while the delete is in flight, show the error inline if it
rejects, and disable Cancel/Continue during the request. Continue
now preventDefaults so it doesn't auto-close on failure. The dialog
only dismisses on a successful delete.
- chat-app.ChatAppWithHistory: propagate `loading`/`error` from
`useDeleteThread` into the new `deleteState` prop, and rewrite
`handleDeleteThread` to re-throw on failure (was swallowed before)
so the rejection reaches the sidebar.
- chat-app: mirror the hydration TODO comment from `agent.route.tsx`
onto the matching `seedMessages` block here so the limitation is
documented at both call sites.
Signed-off-by: Hubert Zub <hubert.zub@databricks.com>
cbbf25a to
4846fca
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
<ChatApp>was a single-conversation shell — no way to revisit a past thread or start a fresh one. The thread-history hooks added in the previous PR were only wired into the build-your-own demo.What changed
<ChatApp>now ships a collapsible history sidebar (historyprop, defaulttrue; passfalsefor the old single-conversation layout).ChatBodysouseChatreinitializes with seeded messages — mirrors the manual pattern already used inagent.route.tsx.position: fixed), so<ChatApp>fits inside a parent below a host header without overlapping it. The dev-playground showcase route was retightened accordingly (h-[calc(100svh-65px)]).full-history.mov
Tests