Promote dev to master: messages polish epic, deep-nav API, CI parallelization, activity + SoC fixes#845
Conversation
…eme engine plan, messages epic, key-scope fix
It was committed before being added to .gitignore, so it stayed tracked. The file holds local-only coordination notes; keep it out of the repo.
* feat(messages): render full markdown in message content * fix(messages): address review on full markdown PR - Disallow markdown images in chat messages (privacy/SSRF leak). - Map GFM table/thead/tbody/th/td to a chat-safe, overflow-x wrapper with compact cell styling consistent with HelpPanel. - Collapse h5 and h6 to the same compact paragraph style as h1-h4. * fix(messages): wrap markdown pre blocks in an overflow-x container The renderContent fence-splitter handles properly closed triple-backtick fences, but an unclosed or otherwise malformed fence can still produce a default <pre> through react-markdown. Add a pre component mapping with overflow-x-auto and a constrained max width so the chat bubble never grows past the message width.
* feat(messages): persist composer drafts per channel * fix(messages): save drafts on every channel transition - Move the saveDraft(prevChannelRef.current, input) call out of the WebSocket-ready guard so drafts persist on channel switches while offline/reconnecting. - Handle the selectedChannel -> null case explicitly: save the draft for the channel we are leaving, clear prevChannelRef, then return, so handleDeleteArchivedChannel and similar paths no longer drop unsaved input. - Add a brief comment on the draft helpers documenting that drafts are kept in localStorage unencrypted (same approach as the job spec) and are best-effort.
* feat(messages): expose the all-threads view * fix(messages): correct threads panel a11y and overlay conflicts - Use aria-expanded + aria-controls on the all-threads toggle (the button now controls a panel, not a pressed state). Label flips between 'Show all threads' and 'Hide all threads'. Add id 'all-threads-panel' to AllThreadsList's <aside> so the link resolves. - Reset showAllThreads in the shared handleOpenThreadFor path so the list does not reappear when a thread closes. - Exclude showSettings from the AllThreadsList render gate so the fixed panel cannot cover ChannelSettingsPanel. * fix(messages): clear showAllThreads when opening channel settings handleOpenSettings cleared the open thread but left showAllThreads true, so the All Threads panel could reappear on the next open of a thread after settings closed. Reset it here too, mirroring the handleOpenThreadFor path.
Fix from review: render the separator above the first message too (showDaySeparator = !prev || prevDay !== currDay), so a same-day channel shows a single 'Today' divider at the top.
Fix from review: complete the one-right-panel mutex. Opening search now closes settings/threads (and vice versa) in both the header buttons and the panel render guards, and handleOpenSettings/handleOpenThreadFor clear setShowSearch. The onJump 50-message-window limitation comment is present.
- SearchPanel: abort in-flight fetch on query-clear and on unmount so a late response cannot repopulate stale results - onJump: replace the fixed 200ms scroll delay with a bounded rAF retry so a slow channel switch/render still lands on the target message
…U label
Duplicate entries: the controller self-registers as a worker named 'local'
(loopback url), so its NPU/CPU appeared both as controller scheduler
resources and as worker cards. The scheduler view now hides the local
worker's cards for tiers the controller already lists, keeping only its
unique devices (e.g. the integrated GPU).
Missing CPU model: _detect_cpu read the SoC only from /proc/device-tree/model,
which holds the board name ('Orange Pi 5 Plus') not the SoC. It now also
reads /proc/device-tree/compatible ('rockchip,rk3588'), so the CPU card
shows RK3588 instead of a bare ARM64. Adds _soc_from_devicetree + tests.
Adds resolveApp(token) (id, alias, or case-insensitive name) and wires the
Desktop to a deep-navigation API:
- URL: /desktop?app=<token>[,<token>] opens apps on load, with optional
?appProps=<json> to deep-link into an app (e.g. a Messages channel).
- Runtime: a taos:open-app CustomEvent ({app, props}) opens an app while the
desktop is live, so the taOS agent can drive the UI for the user.
Tokens accept friendly names ('activity' -> dashboard). Singleton apps focus
and re-receive props rather than duplicate. Useful for tests/screenshots and
agent-driven navigation. Adds resolveApp tests.
…ation hook Moves the ?app= / taos:open-app logic out of Desktop into a hook with full coverage: URL single/multi/props/malformed-props parsing, the runtime event, alias resolution, unknown-token no-op, and listener cleanup on unmount.
Adds an 'Anonymous install ping' switch to the Updates panel, bound to the existing auto-update/update_ping_enabled preference (default on), saved through the same PUT path as the neighboring auto-check toggle.
Covers exact multi-line rendering, the copy button accessible name, clipboard.writeText receiving the exact code, the copied->revert label flip with fake timers, long-line overflow container, and empty input.
Cmd/Ctrl+K opens a centered switcher over the Messages app: typed substring filters active channels (max 8), Up/Down move the highlight, Enter or click selects, Escape or backdrop closes. New ChannelSwitcher component + a window keydown listener in MessagesApp that suppresses the browser default.
…y fix, monitors armed)
…kflow decisions
The test job was not hanging, it was slow: the serial suite (4845 tests, two Python versions, -v) took ~22 minutes, so 'merge on green' was impractical. Add pytest-xdist and run with -n auto to use all runner cores; drop -v so worker output stays readable. Per-test timeout (120s) already guards against a genuinely stuck test.
… 0f retrigger, no dev->master
…Rabbit credits; usage 78%
…r collapse, pin-jump, timestamps, mention autocomplete, live threads, attachment retry, notifications, render tests (#838) Jobs 24, 21, 22, 23, 26, 19, 18, 13, 9, 10 from the agent-jobs pack. Merged on CI-green + Kilo + author review (CodeRabbit free tier exhausted).
Adds 5 answer templates (add a machine to the cluster, models for your hardware, backup, report a bug, offline operation) to the compiled agent manual. Source + regenerated compiled file committed together; the test_agent_manual_compiled CI guard passes.
|
Warning Review limit reached
More reviews will be available in 26 minutes and 13 seconds. Learn how PR review limits work. Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file). ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (26)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Code Review by Qodo
1. Sync draft save jank
|
|
👋 Thanks for the PR! This one targets See CONTRIBUTING.md for the branch model. |
PR Summary by QodoPromote dev to master: Messages polish, deep-nav API, xdist CI speedup WalkthroughsDescription• Polish Messages with threads, search, emoji picker portal, drafts, and improved unread UX. • Add deep-navigation to open apps via ?app= and taos:open-app (tested resolver + hook). • Speed up CI by parallelizing pytest with xdist; add targeted frontend and hardware tests. Diagramgraph TD
CI["GitHub Actions CI"] --> PY["pytest (xdist)"]
DESK["Desktop"] --> DN["useDeepNavigation"] --> REG["resolveApp"]
DN --> EVT["taos:open-app event"]
DN --> URL["?app= params"]
MSG["MessagesApp"] --> CHATAPI["/api/chat/*"]
MSG --> UI["Thread/Search/Switcher"]
MSG --> BROW["Browser APIs"]
MSG --> LS["localStorage drafts/collapse"]
High-Level AssessmentThe following are alternative approaches to this PR: 1. Split CI across job matrix instead of xdist
2. Centralize Messages UI state into a reducer/store
3. Use a router-driven deep-link scheme rather than `?app=` + CustomEvent
Recommendation: The current approach is appropriate for a dev→master promotion: xdist delivers immediate CI wins with minimal workflow change, deep-navigation is cleanly encapsulated in a hook + token resolver, and Messages features are mostly additive with targeted tests. If CI parallelism reveals non-parallel-safe tests, consider migrating to a job-matrix sharding strategy incrementally. File ChangesEnhancement (11)
Bug fix (2)
Tests (5)
Documentation (4)
Other (2)
|
Integration promotion of dev to the stable channel. Every change below already landed on dev through its own reviewed PR with green CI.
Highlights
?app=URL param ortaos:open-appevent, via a testeduseDeepNavigationhook.-n auto(ci: parallelize tests with pytest-xdist (-n auto) #839), ~22m -> ~13m.CI is green on the dev tip (bf37698). No new release tag is cut here.