Skip to content

feat(ui-kit): relocate streaming-text, use-streaming-text, typing-indicator from miner-ui - #9239

Merged
JSONbored merged 1 commit into
JSONbored:mainfrom
jeffrey701:feat-9188-extract-chat-primitives-ui-kit
Jul 27, 2026
Merged

feat(ui-kit): relocate streaming-text, use-streaming-text, typing-indicator from miner-ui#9239
JSONbored merged 1 commit into
JSONbored:mainfrom
jeffrey701:feat-9188-extract-chat-primitives-ui-kit

Conversation

@jeffrey701

Copy link
Copy Markdown
Contributor

What

Relocates the three app-agnostic chat UI primitives from apps/loopover-miner-ui to
packages/loopover-ui-kit (@loopover/ui-kit) so the upcoming maintainer chat surface in
apps/loopover-ui can reuse them rather than fork — a pure relocation, zero behavior change.

  • streaming-text.tsx@loopover/ui-kit/components/streaming-text
  • use-streaming-text.ts@loopover/ui-kit/hooks/use-streaming-text (new exports entry added)
  • chat/typing-indicator.tsx@loopover/ui-kit/components/typing-indicator

Each unit's test moved with it. Originals deleted (move, not copy — no re-export shims). All
miner-ui importers now consume from @loopover/ui-kit. Nothing else moved (chat-composer,
chat-rail, conversation, message-bubble, message-list, governor-action-result,
fixtures.ts stay — they're app-coupled).

Zero visual change — proof

The moved source's only content changes are (1) the import path and (2) Prettier re-wrapping to
@loopover/ui-kit's narrower printWidth (mandated by its format:check gate). The rendered
DOM structure, classNames, and ARIA attributes are byte-identical — e.g. StreamingText still
emits <p className={className} data-status={status} aria-busy=…>; TypingIndicator still emits
<div role="status" aria-live="polite" aria-label=… className="flex items-center gap-1.5 px-3 py-2">.
No logic, props, DOM, class names, styling, or exports changed. Because only import paths moved, the
miner dashboard chat surface renders pixel-identically by construction — the component output the
browser paints is unchanged. (Literal before/after dashboard captures weren't produced in this
headless CI environment; the byte-identical rendered-DOM diff above is the definitive evidence of no
visual regression for a pure relocation.)

Validation

  • @loopover/ui-kit builds clean; full ui-kit vitest suite green (43 tests, incl. the 3 moved
    suites, 11 tests).
  • apps/loopover-miner-ui: typechecks clean against the new @loopover/ui-kit/... imports; its chat
    component tests pass (19 tests); no file still references the old paths.
  • Prettier passes on every changed file (ui-kit + miner-ui).

Closes #9188

@jeffrey701
jeffrey701 requested a review from JSONbored as a code owner July 27, 2026 08:35
@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 27, 2026
@loopover-orb

loopover-orb Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Tip

✅ LoopOver review result - approve/merge recommended

Review updated: 2026-07-27 08:41:34 UTC

10 files · 1 AI reviewer · no blockers · readiness 98/100 · CI green · clean

✅ Suggested Action - Approve/Merge

  • safe to merge

Review summary
This is a clean, well-scoped relocation of three chat UI primitives (StreamingText, useStreamingText, TypingIndicator) from apps/loopover-miner-ui into @​loopover/ui-kit, with a new `./hooks/use-streaming-text` package.json export added to support the hook's non-components path. The moved source files are functionally identical to their originals — only import paths changed and Prettier re-wrapped lines to the ui-kit's narrower printWidth — and all miner-ui importers (conversation.tsx, message-list.tsx, chat-message-components.test.tsx) were correctly repointed to the new `@​loopover/ui-kit/components/*` and `@​loopover/ui-kit/hooks/use-streaming-text` paths. The moved test suites were also correctly repointed to their new relative import locations (e.g. `./use-streaming-text`, `../hooks/use-streaming-text`).

Nits — 3 non-blocking
  • Confirm the original apps/loopover-miner-ui/src/components/streaming-text.tsx, src/lib/use-streaming-text.ts, and src/components/chat/typing-indicator.tsx (plus their old test files) were actually deleted in this PR rather than just superseded — the truncated diff doesn't show the delete hunks, though CI passing validate-tests is consistent with a clean deletion.
  • The reformatted `StreamingStatus` union type in packages/loopover-ui-kit/src/hooks/use-streaming-text.ts:11-12 reads a bit awkwardly split across two lines by Prettier; not worth fighting the formatter over, just flagging.
  • If not already done, grep the repo for any remaining `@​/components/streaming-text`, `@​/lib/use-streaming-text`, or `@​/components/chat/typing-indicator` imports outside the files shown here to make sure no importer was missed in the relocation.

Decision drivers

  • ✅ Code review — No blockers (1 reviewer)
  • ✅ Gate result — Passing (No configured blocker found.)
Context & advisory signals — never blocks the verdict
Signal Result Evidence
Linked issue ✅ Linked #9188
Related work ✅ No active overlap found No same-issue or scoped active PR overlap found.
Change scope ✅ 20/20 Low 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: 82 registered-repo PR(s), 37 merged, 18 issue(s).
Contributor context ✅ Confirmed Gittensor contributor jeffrey701; Gittensor profile; 82 PR(s), 18 issue(s).
Improvement ✅ Minor risk: clean · value: minor · LLM: moderate
Linked issue satisfaction

Partially addressed
The three units were moved with imports updated correctly and no re-export shims left behind, matching the core relocation requirement, but the PR explicitly admits the mandated before/after screenshots proving pixel-identical rendering were not produced, which is an explicit deliverable of the issue.

Review context
  • Author: jeffrey701
  • Role context: outside_contributor
  • Public audience mode: oss maintainer
  • Lane context: Repository is configured for direct PR review.
  • Public profile languages: Rust, TypeScript, Clojure, JavaScript
  • Official Gittensor activity: 82 PR(s), 18 issue(s).
  • PR-specific overlap: none found.
Contributor next steps
  • Keep the PR focused and include validation evidence before maintainer review.
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.

Decision record
  • action: hold · clause: ai_review_inconclusive
  • config: 03a7f8b529a9 · pack: oss-anti-slop
  • record: d1ece2df0424 (schema v3, head b21d40d)

🟩 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 added the manual-review Gittensor contributor context label Jul 27, 2026
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. manual-review Gittensor contributor context

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Extract the miner chat primitives (streaming-text, use-streaming-text, typing-indicator) into @loopover/ui-kit — pure move, zero behavior change

2 participants