Skip to content

feat(miner-ui): useStreamingText hook + StreamingText renderer - #6573

Closed
jaytbarimbao-collab wants to merge 1 commit into
JSONbored:mainfrom
jaytbarimbao-collab:feat-miner-ui-streaming-text-6516
Closed

feat(miner-ui): useStreamingText hook + StreamingText renderer#6573
jaytbarimbao-collab wants to merge 1 commit into
JSONbored:mainfrom
jaytbarimbao-collab:feat-miner-ui-streaming-text-6516

Conversation

@jaytbarimbao-collab

Copy link
Copy Markdown
Contributor

Summary

The first streaming-text primitive for the miner-ui chat rail (#6516): progressively reveal a chat response's text as chunks arrive. Unwired plumbing only — no backend, no route, no live fetch/EventSource; exercised solely against mock chunk sources in tests.

Deliverables

  • lib/use-streaming-text.tsuseStreamingText(source) consumes a ChunkSource (a () => AsyncIterable<string> factory, exported by name for a future composer/message-list to type against), accumulating each chunk into text with an idle | streaming | done | error | cancelled status and a cancel(). Mirrors usePolledFetch's cancelled-flag discipline: a chunk resolving after a new source starts, after cancel(), or after unmount never touches state; a mid-stream throw/reject surfaces via status/error, never as an unhandled rejection.
  • components/streaming-text.tsx — thin <StreamingText> renderer showing the accumulated text with a caret while streaming, suppressed under prefers-reduced-motion (detected via window.matchMedia + a change listener — the use-mobile.tsx technique; no motion dependency added).
  • use-streaming-text.test.ts + streaming-text.test.tsx — co-located flat in src/, mirroring use-polled-fetch.test.ts.

Tests (every branch)

Incremental accumulation across renders; cancel-on-new-source (late chunk from the abandoned source ignored); cancel-on-unmount (no late state write, no throw); mid-stream error → status: error; renderer full-motion caret vs reduced-motion suppression + final text. apps/** is Codecov-ignored, so the operative gate is the local vitest coverage threshold (85/85/75/85) — this PR lands the suite at 88/86/81/90. Local @loopover/ui-miner typecheck + 192 tests + eslint (0 errors) all green.

Closes #6516

The first streaming-text primitive for the miner-ui chat rail (JSONbored#6516):
progressively reveal a chat response's text as chunks arrive, instead of
popping the whole message in at once. Unwired plumbing only — no backend,
no route, exercised solely against mock chunk sources in tests.

- lib/use-streaming-text.ts — useStreamingText(source): consumes a
  ChunkSource (a () => AsyncIterable<string> factory, exported by name),
  accumulating each chunk into text with an idle/streaming/done/error/
  cancelled status and a cancel(). Mirrors usePolledFetch's cancelled-flag
  discipline: a chunk resolving after a new source starts, after cancel(),
  or after unmount never touches state; a mid-stream throw/reject surfaces
  via status/error, never as an unhandled rejection.
- components/streaming-text.tsx — thin <StreamingText> renderer showing the
  accumulated text with a caret while streaming, suppressed under
  prefers-reduced-motion (detected via window.matchMedia + a change listener,
  the use-mobile.tsx technique — no motion dependency added).

Tests (co-located flat in src/, mirroring use-polled-fetch.test.ts) cover
every status transition — incremental accumulation, cancel-on-new-source,
cancel-on-unmount (no late write), and the error path — plus the renderer's
full-motion caret vs reduced-motion suppression. Local @loopover/ui-miner
gate green: typecheck + 192 tests (coverage 88/86/81/90, above the 85/85/75/85
threshold) + eslint (0 errors).

Closes JSONbored#6516
@superagent-security

Copy link
Copy Markdown
Contributor

Superagent didn't find any vulnerabilities or security issues in this PR.

@loopover-orb loopover-orb Bot added the gittensor:feature Gittensor-scored feature linked to a feature issue — scores a 0.25x multiplier. label Jul 16, 2026
@loopover-orb

loopover-orb Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Caution

🛑 LoopOver review result - fixes required

Review updated: 2026-07-16 14:50:33 UTC

4 files · no blockers · CI failing · blocked

🛑 Suggested Action - Fix Blockers

  • AI review already in progress for this PR head: Another LoopOver pass is already running the AI review for this exact PR head. This pass is skipping to avoid a duplicate LLM call.

Review summary
AI review is already running for this PR head in another LoopOver pass. LoopOver is holding this PR for manual review until that pass completes.

Nits — 1 non-blocking
  • AI review already in progress for this PR head — The gate is held for a human reviewer rather than passed automatically; it re-evaluates once the in-flight review completes or on the next update.

CI checks failing

  • validate
  • validate-code

Decision drivers

  • ✅ Code review — No blockers (No AI review summary)
  • ⚠️ Gate result — Not blocking (Advisory; not blocking this PR.)
Context & advisory signals — never blocks the verdict
Signal Result Evidence
Linked issue ✅ Linked #6516
Related work ⚠️ 2 scoped overlaps Top overlaps are listed below; lower-confidence bulk is hidden.
Change scope ❌ 8/20 High review scope from cached public metadata (1 linked issue).
Validation posture ✅ 25/25 PR body includes validation/test evidence.
Contributor workload ✅ 10/10 Author activity: 148 registered-repo PR(s), 78 merged, 4 issue(s).
Contributor context ✅ Confirmed Gittensor contributor jaytbarimbao-collab; Gittensor profile; 148 PR(s), 4 issue(s).
Improvement ✅ Minor risk: clean · value: minor
Review context
  • Author: jaytbarimbao-collab
  • Role context: outside_contributor
  • Public audience mode: oss maintainer
  • Lane context: Repository is configured for direct PR review.
  • Public profile languages: Rust
  • Official Gittensor activity: 148 PR(s), 4 issue(s).
  • Related work: Titles/paths share 7 meaningful terms. (issue #6516, issue #6518)
  • Related work: Titles/paths share 6 meaningful terms. (issue #6516, issue #6303)
Contributor next steps
  • Start here: Review top overlaps.
  • Then work through the remaining 2 steps in the Signals table above.
Signal definitions
  • Related work = same linked issue, overlapping active PRs, or title/path similarity.
  • Change scope = cached public metadata such as size labels, draft state, and review-burden hints.
  • Validation posture = whether the PR provides enough public validation/test evidence for maintainer review.
  • Contributor workload = public contributor activity and cleanup pressure, not a repo-wide quality failure.
  • Contributor context = public GitHub/Gittensor identity context; non-Gittensor status is not a blocker.
🧪 Chat with LoopOver

Ask LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.

  • @loopover ask &lt;question&gt; answers contribution-quality Q&A with source citations and freshness.
  • @loopover chat &lt;question&gt; answers in natural prose from cached decision-pack facts via local inference (maintainer/collaborator; read-only).
  • A plain-language @loopover mention with a real question is routed to the closest matching read-only command automatically — no exact syntax required.

Full command reference: https://loopover.ai/docs/loopover-commands

🧪 Experimental — new and may change.

Visual preview
Route Viewport Before (production) After (this PR's preview) Diff
/ desktop before /
before /
after /
after /
/ mobile before / (mobile)
before / (mobile)
after / (mobile)
after / (mobile)

Click any thumbnail to open the full-size screenshot. Before = production · After = this PR's preview deploy.

🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed


💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →.

Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.

  • Re-run LoopOver review

@loopover-orb

loopover-orb Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

LoopOver is closing this pull request on the maintainer's behalf (CI is failing (validate, validate-code)). This is an automated maintenance action — to pursue this change, please open a new pull request with the issues resolved. Closed PRs may be analyzed later to improve review accuracy, but they are not automatically reopened or re-reviewed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gittensor:feature Gittensor-scored feature linked to a feature issue — scores a 0.25x multiplier.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Chat UI: streaming text renderer / useStreamingText hook

1 participant