Sign in
Join now
scn-chat
sharedcomputer.network
/
Star
Starred
Star
Something went wrong. Try again.
Fork
0
Eye filled
Watch
Watching
Watch
ATProto-based AI Assistant Chat interface.
Star
Starred
Star
Something went wrong. Try again.
Fork
Eye filled
Watch
Watching
Watch
Overview
Overview
Issues
Issues
1
1
Pulls
Pulls
Pipelines
Pipelines
scn-chat
/
apps
/
web
/
tests
/
features
/
conversation
4 folders
·
2 files
at
admin-config-export
pouriade.com
·
A streaming reply's words fade in as they arrive, over the theme's enter duration, with Streamdown's 40ms between words, so a burst of them lands as a short cascade. markdown.css animates Streamdown's word spans with --animate-fade-in, since the app doesn't load Streamdown's stylesheet, and fades a list item's marker in by its color, which is all ::marker takes. Nothing animates under reduced motion. Code blocks and math appear as before, and a finished part renders without the spans. Two tests that found streamed text by its exact node now look past the word spans.
·
2w ago
59e19733
components
A streaming reply's words fade in as they arrive, over the theme's enter duration, with Streamdown's 40ms between words, so a burst of them lands as a short cascade. markdown.css animates Streamdown's word spans with --animate-fade-in, since the app doesn't load Streamdown's stylesheet, and fades a list item's marker in by its color, which is all ::marker takes. Nothing animates under reduced motion. Code blocks and math appear as before, and a finished part renders without the spans. Two tests that found streamed text by its exact node now look past the word spans.
2w ago
hooks
Port the composer from design-reference. It is one card stuck to the panel's foot over a fade, with quotes and attachment chips at its top, a box that grows with its text and clears from its corner, and a toolbar of Attach, one quiet select for the model and its thinking effort in a submenu with timer pies, and Send, which Stop replaces while a reply runs. Files paste or drop anywhere on the conversation, Enter doesn't send on touch or while an input method composes, editing shows a banner, More quotes a reply into it, and a button above it jumps to the latest message. New chat goes to /, an empty conversation with starters whose first message creates the chat, reusing it when a send is tried again. The last effort is kept on the device, and ModelSelect and EffortSelect move onto the app's Select.
2w ago
lib
The web app's message records are typed as the lexicon's MessageRecord, and a conversation's info as InfoRecord, from the local copy, which holds only records the server validated, through BranchMessage to the message, status, details, part, and tool views, so their reads need no casts. src/shared/message.ts holds what a status means, isPending and isFinished, which counts a status another client wrote that this app doesn't know as neither, along with a message's parts, whether it is encrypted, and who wrote it, in place of the checks written out in the message view, the message actions, the chat, the reply follower, and tool status. Tests build records with messageRecord in tests/helpers/records.ts, and the status rules are tested once.
2w ago
pages
On a reload, the composer's box takes typing before the page's code loads. The page's frame, which the server sends in place of the client-only chats, now holds the composer's frame at the foot of the panel: a plain textarea in the composer's card, with Attach, the model select's loading line, and Send disabled, so Enter only adds a line. The conversation's column shows it again while its code downloads. Each frame that gives way leaves its text, cursor, and focus in composer-handoff.ts, and the frame or composer that takes its place puts them back, so the swap can't be seen. Only a composer that starts empty takes a draft, never one editing a message. The frame and the composer are built from the same parts in composer-parts.tsx, and the composer binds its form field to MessageBox. An open chat's box says neither "Ask anything" nor "Reply" until its messages arrive, and sends nothing until then, since the message wouldn't know which one it answers. On a reload the turn skeleton in the page's frame shows at once, and the skeletons that take its place carry that on rather than vanishing to fade in again. The web UI spec describes it, with tests, including one that hydrates the server's frame, and an acceptance criterion.
2w ago
chat.test.tsx
The web app's message records are typed as the lexicon's MessageRecord, and a conversation's info as InfoRecord, from the local copy, which holds only records the server validated, through BranchMessage to the message, status, details, part, and tool views, so their reads need no casts. src/shared/message.ts holds what a status means, isPending and isFinished, which counts a status another client wrote that this app doesn't know as neither, along with a message's parts, whether it is encrypted, and who wrote it, in place of the checks written out in the message view, the message actions, the chat, the reply follower, and tool status. Tests build records with messageRecord in tests/helpers/records.ts, and the status rules are tested once.
2w ago
reply-follower.test.tsx
A reply the follower followed since it was sent stops being followed once the local copy holds its final record, so what streamed of it, which can include whole fetched pages, isn't kept in memory beside the record until the chat closes. The follower's tests run through useChat over the test store, rather than mounting useConversation by hand and holding the messages in state, and a test checks a finished reply's stream goes. specs/web-ui.md says the follower refreshes through the store's refresh intent so the store's hooks know nothing of streams, rather than merging the two.
2w ago