Repository navigation
feat(timeline): emoji reactions and comments on activities - #570
Conversation
The timeline becomes a feed everyone in a namespace talks on. An opened item has a React button with a palette and shows everyone's reactions as chips; its comments open as threads with Reply, where Enter sends. A closed line sums its items' reactions and says how many comments it has. A comment on an asset's arrival is a comment on the asset, so the same thread shows on its page.
Each reaction is a reaction.added activity (noisy, by the person, with the activity as its object) and each comment a comment.added with the activity as its target, following the activity's audience, so automations and agents can act on them. Agents react and comment over MCP (react_to_activity, activity_comments, comment_on_activity) and through POST /activities/{id}/react and /activities/{id}/comments.
Reactions are one event_reaction row per person and activity, as marks are; comments reuse the comment table with an activity field. No model call is involved.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ln25ykE6uBDqx21WBU94SX
…-pf8kii # Conflicts: # CHANGELOG.md
…-pf8kii # Conflicts: # CHANGELOG.md
Release 0.15.0 carries #400, so the requirements check failed on main with it still under In progress; it moves to the built list with its checks. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ln25ykE6uBDqx21WBU94SX
|
Clicks and keystrokes per feature is red on this head (786db63): the phone survey's Generated by Claude Code |
… raced the stream
The page moves to /chat/{id} as a new conversation's first answer
streams. On a slow device that first load of the conversation is still
in flight when the answer ends, and the query cache folds the refetch
asked for then into the load, which predates the answer: the page showed
"No answer was saved for this question" until reloaded (the phone
clicks survey's chat-ask journey in CI). After an answer, when the
conversation read back lacks it, it is read once more.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ln25ykE6uBDqx21WBU94SX
|
Fix for the phone Clicks failure pushed in 7f260ec. CI's screenshot ( Generated by Claude Code |
…-pf8kii # Conflicts: # README.md
…rst load raced the stream" This reverts commit 7f260ec: #582 carries the same fix for main (refetchFresh in every chat panel, and the answer written on a thread of its own), so this PR stays one concern. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ln25ykE6uBDqx21WBU94SX
….d fragment, and name them in the README The release commit folds Unreleased into the version section and #581 moved new entries to changelog.d/, so the entry becomes changelog.d/timeline-social.md. The README's built line lost its reactions and comments clause in an earlier merge; it is back. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ln25ykE6uBDqx21WBU94SX
Requested by Adeel · project thread
Description
Before: the Timeline page listed what came in, and each person could mark items reviewed, important or hidden for themselves alone. There was no way to react to an item or talk about it with the others in the namespace, and nothing an agent could read of what people thought of an item.
After: the timeline is a feed everyone in a namespace talks on. An opened item has a React button with a palette (👍 ❤️ 🎉 👀 😂 😮 😢 🙏) and shows everyone's reactions as chips (yours highlighted; a click on yours takes it back). Its comments open as threads with Reply, where Enter sends. A closed line sums its items' reactions and says "3 comments". A comment on an asset's arrival is a comment on the asset itself, so the same thread shows on its page. Agents react and comment over MCP (
react_to_activity,activity_comments,comment_on_activity) and throughPOST /api/v1/activities/{id}/reactand/activities/{id}/comments;GET /activitiescarries everyone's reactions and each item's comment count.Each reaction is a
reaction.addedactivity (Like, noisy, by the person, with the activity as its object) and each comment acomment.addedwhose target is the activity, following the activity's audience, so automations and agents can act on them.How: reactions are one
event_reactionrow per person and activity (as review marks are), read for a page in one query; comments reuse thecommenttable with anactivityfield andabout(the summary), dual-keyed to the asset forcreate-recording-<id>. New tables and fields only, so no migration. No model call anywhere.Motivation and Context
Step 3 of the activity stream design (thread above): a structured feed without costing tons, where people and agents interact on items. Steps 1 and 2 (the stream API and the Timeline page) were already built.
Types of changes
!in the title)Checklist:
make hookschecks it on commit).docs/accordingly.## UnreleasedinCHANGELOG.md.Done questions (AGENTS.md)
/activities/{id}/react,/activities/{id}/comments) and MCP (react_to_activity,activity_comments,comment_on_activity).event_reactionand new optional fields oncomment;DEFINE ... IF NOT EXISTS, safe on existing installs, no migration.test_timeline_social.py(4 tests), jesttimeline-ui.test.tsxandtimeline-social-model.test.ts; docs timeline.md, api.md, mcp.md, automations.md, requirements.md, CHANGELOG;make openapiregenerated the client.Likefor reactions,NotewithinReplyTofor comments; no new dependency.comment.addedto the item).event_marks.py; comments reusecomments.py, the comments routes'_comments_out, and the recording page's thread model and writer helpers.Local CI (
ci/local-ci.sh) on this head: FastAPI embedded and server, Next.js, pre-commit, PR title and upgrade all pass.Generated by Claude Code