chore: status report update editing composer polish (#2886) master
* chore: dashboard composer activity timeline improvements * refactor: force at least one update on status reports * feat(api): edit and delete status report updates over RPC and MCP Add UpdateStatusReportUpdate and DeleteStatusReportUpdate to the status report service, with update_status_report_update and delete_status_report_update agent tools exposed through MCP and the Slack assistant. list_status_reports now returns each report's full timeline with ids so the new tools can target an entry. Regenerate the OpenAPI spec. * feat(dashboard): render status report update tool calls in chat * docs: document status report and maintenance update methods * fix(dashboard): hide delete on the last report or maintenance update The services refuse to remove the only update, so the timeline no longer offers the action. * fix(dashboard): keep legacy impact rows unselected in the composer Rows without a current impact showed the override as selected even when nothing had been picked yet. * refactor(dashboard): share the OrderedComponent type for page components * refactor(dashboard): move postmortem actions into the composer footer Drop ComposerHeader and its Write/Preview tabs; every composer now toggles the preview from the footer. Copy and draft-with-agent become ComposerIconButtons next to it. * style(dashboard): render GFM task list checkboxes in markdown previews * style(dashboard): always show the remove button on maintenance components * refactor(services): order incidents by declared date only * fix(dashboard): return 404 for unknown incidents Resolve the incident on the server with fetchQueryOrNotFound instead of rendering an inline empty state, and link incidents from the not-found page. * chore(status-page): sync next-env types with next dev * fix: address review findings on status report update editing - reject RPC ids beyond the safe integer range; fail when an edited update vanishes before the re-read - cap list_status_reports timeline at 10 entries and point id guidance at updates[].id - describe list_incidents as newest declared first - keep composer drafts in memory when localStorage throws; show Ctrl on non-Apple platforms; lock the textarea while publishing - reset plain badge font; align update counts; hide the compact-row dot until the time renders - link Slack bind/unbind rows to the channel named in the event - gate the maintenance window text on hydration; diff impacts against the carried-forward state - overlap the postmortem prefetch with the other prefetches - docs: decimal SDK ids, notify required over MCP, resolved differs by surface, comma splices - tests: assert ids present before ordering; sort inserted rows by date * style(dashboard): badge the avatar with the Slack source instead of a via link * feat(dashboard): toggle composer preview with E and leave it with Escape * feat(agent-tools): add get_status_report with the full update timeline Expose the tool over MCP and the dashboard chat with a details-table renderer, parse RPC status report ids strictly, and note the 10-entry cap on list_status_reports in the prompt and docs. * fix: accept resolved in update_status_report_update and address review findings - update_status_report_update accepts status resolved; editing the latest entry re-derives the report to resolved without notifying - get_status_report tenant test inserts a report in another workspace - composer hotkey ignores key repeat and overlays (select, menu, dialog) - ComposerTextarea/ComposerPreview merge a consumer ref with focus-on-mount - chat summary pluralizes updates; MCP docs headline counts reconciled * fix(dashboard): show a dash for reports without affected components * style(dashboard): square the severity dot in the incident timeline Matches the rounded-xs severity dot in the properties sidebar; status dots stay round. * style(dashboard): flatten composer footers like Linear Drop the footer divider and tint, strip borders from the status select, date picker and components menu, and show the current impact as a dot on each component row. Align dots and buttons on the text column and use a 6px gap for rows and actions. * style(dashboard): align the composer text column with the timeline cards Pad the textarea, preview, section rows and footer to the card's 16px column so the status dot and text sit on the avatar edge. * fix(dashboard): address composer review findings Name the component in each remove button's label so screen readers can tell them apart. Replace the postmortem status badge with a dot and mono label aligned on the composer text column, and drop the agent hint since the draft already says so. Clarify that the severity dot only applies in plain rows. * ci: apply automated fixes * style(dashboard): cap the add component menu height Pages with many components pushed the menu to the full viewport; it now scrolls past 320px. * fix: keep the component menu viewport-bound and name get_status_report in the Slack prompt tailwind-merge dropped the Radix available-height class once max-h-80 was added, so short viewports could push the menu off-screen; cap with min() instead. The Slack system prompt now mentions get_status_report, which the prompt coverage test requires for every registry tool. --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>