Skip to content

feat(os+extension): complete OS chat and Ask Signet UX overhaul + Chrome/Firefox Extension Improvements#450

Draft
aaf2tbz wants to merge 4 commits intomainfrom
chore/chrome-extension-rework
Draft

feat(os+extension): complete OS chat and Ask Signet UX overhaul + Chrome/Firefox Extension Improvements#450
aaf2tbz wants to merge 4 commits intomainfrom
chore/chrome-extension-rework

Conversation

@aaf2tbz
Copy link
Copy Markdown
Collaborator

@aaf2tbz aaf2tbz commented Apr 2, 2026

Summary

This PR delivers a full OS chat and browser-extension UX/reliability overhaul, including provider/model routing fixes, Ask Signet in-page workflow upgrades, MCP render-window improvements, voice input support, and popup/navigation cleanup.

Context

The existing branch work solved multiple cross-surface issues (OS chat + extension): unstable model resolution, outdated fallback behavior, missing context-menu/overlay reliability, rough render-window ergonomics, and popup layout regressions. This PR consolidates and rebases those fixes onto latest main.

Changes

OS Chat / Dashboard

  • Added dynamic provider/model discovery and stricter selected-model routing behavior.
  • Removed hardcoded persona artifacts and normalized assistant prompting behavior.
  • Improved OS chat action flows (remember/transcribe/recall) and chat-linked interactions.
  • Added per-response copy action in assistant messages.
  • Added robust microphone capture flow with selectable devices and improved listening states.
  • Improved light/dark theming behavior with consistent Signet green input/icon accents.
  • Refined OS layout: 50/50 chat/render workspace, tabbed multi-render windows, loading/error handling, cleaner headers.
  • Enhanced left groups panel (All Apps, All Skills, browser-sync categories, drag/drop into chat, bookmark click-to-open new tab).

Daemon

  • Improved /api/os/chat + /api/os/chat/models behavior for provider/model reliability.
  • Added stronger OpenCode model discovery/execution behavior.
  • Hardened MCP probe/widget generation flows and normalized actionable error paths.
  • Improved widget generation lifecycle behavior for OS render-window UX.

Browser Extension

  • Added Ask Signet right-click flow with in-page draggable overlay chat.
  • Hardened Ask Signet request path via background relay/fallback instead of fragile direct page fetch.
  • Added model registry in Ask Signet overlay and aligned theme behavior with system defaults.
  • Added per-response copy action in Ask Signet messages.
  • Added voice input support for Ask Signet with improved start/stop handling.
  • Updated context menu set and behavior (Send to Signet Os, View MCP Servers, transcribe routing through Ask Signet flow).
  • Refactored popup tools/navigation layout, removed deprecated controls, improved notes visibility behavior.
  • Fixed popup memory search response parsing and default display behavior.

Testing

  • bun run check (dashboard)
  • bun run typecheck && bun run build (extension)
  • bun run build.ts (daemon)

PR Readiness Checklist

  • Spec alignment validated (INDEX.md + dependencies.yaml)
  • Agent scoping verified on all new/changed data queries
  • Input/config validation and bounds checks added
  • Error handling and fallback paths tested (no silent swallow)
  • Security checks applied to admin/mutation endpoints
  • Docs updated for API/spec/status changes
  • Regression tests added for each bug fix
  • Lint/typecheck/tests pass locally

Checklist Status (blue checks)

  • 🔵 ✅ Branch rebased on latest origin/main
  • 🔵 ✅ Working tree clean before push
  • 🔵 ✅ Branch pushed: chore/chrome-extension-rework
  • 🔵 ✅ Local validation commands pass
Screenshot 2026-04-02 at 3 41 05 PM Screenshot 2026-04-02 at 3 41 25 PM Screenshot 2026-04-02 at 3 42 02 PM Screenshot 2026-04-02 at 3 46 58 PM

@BusyBee3333

This comment was marked as low quality.

BusyBee3333

This comment was marked as low quality.

@aaf2tbz aaf2tbz changed the title feat(os+extension): complete OS chat and Ask Signet UX overhaul feat(os+extension): complete OS chat and Ask Signet UX overhaul + Chrome/Firefox Extension Improvements Apr 2, 2026
if (!match) return message;
const executable = match[1];
if (executable === "docker") {
return "Docker CLI is required for this MCP app but was not found in PATH. Install Docker Desktop (with CLI), then restart Signet daemon and retry.";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bruh

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We may want to defer this until we've sorted out all of the duplicated provider logic, this is insane. (not your fault)

@PR-Reviewer-Ant
Copy link
Copy Markdown
Collaborator

Hi @aaf2tbz - I'm an automated code reviewer powered by pr-reviewer. I'm taking a look at the feature work in feat(os+extension): complete OS chat and Ask Signet UX overhaul + Chrome/Firefox Extension Improvements (commit fcb93b72) now and I'll follow up shortly with feedback.

Copy link
Copy Markdown
Collaborator

@PR-Reviewer-Ant PR-Reviewer-Ant left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by pr-reviewer | model: claude-sonnet-4-6 | commit: fcb93b72

[Automated Review — pr-reviewer bot] PR #450 introduces several UX and reliability improvements but has two blocking issues: a scoping invariant violation on memory reads and an unhandled promise rejection that causes silent render-window lockup.

Confidence: High [sufficient_diff_evidence, targeted_context_included] - Both blocking issues are directly readable in the added code. The missing agent_id is unambiguous in refreshBrowserCategories (SidebarGroups.svelte). The missing .catch() on fetchWidgetHtml().then() is unambiguous in OsTab.svelte's SSE handler. The SpeechRecognition.start(track) misuse is verifiable against the Web Speech API spec. No runtime trace or cross-module context is needed to confirm these findings.

}

if (
tags.has("browser-tool") ||
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agent scoping violation: refreshBrowserCategories fetches /api/memories?limit=500&offset=0 without an agent_id parameter. AGENTS.md mandates threading agent_id through every read/write that touches user data. In a multi-agent workspace this will return all agents' memories, not just the active agent's. The fix is to pass the current agent ID: /api/memories?limit=500&offset=0&agent_id=${encodeURIComponent(agentId)}.

}
});
} else if (event.type === "widget.error" && event.payload?.serverId) {
onWidgetGenerationFailed(event.payload.serverId);
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unhandled promise rejection: fetchWidgetHtml(event.payload.serverId).then(html => { ... }) has no .catch(). If the fetch rejects (network error, daemon restart), neither onWidgetGenerated nor onWidgetGenerationFailed is called. The render window stays permanently in a loading/blank state with no error surfaced and no recovery path. Add .catch(err => { onWidgetGenerationFailed(event.payload.serverId); setRenderWindowError(event.payload.serverId, err instanceof Error ? err.message : 'Failed to load widget.'); }).

}

const ctor = getSpeechRecognitionCtor();
if (!ctor) {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Web Speech API SpeechRecognition.start() accepts no arguments — passing a MediaStreamTrack is outside the spec and silently ignored in all major browsers. The microphone device selection via getUserMedia is therefore a no-op: activeMicStream is acquired and held open but speech recognition always uses the browser-default microphone, making the device picker non-functional. Either remove the getUserMedia acquisition entirely (keep the select for informational purposes only) or document that device selection is a best-effort hint that only labels are retrieved from.

const nextErrors = { ...renderWindowErrors };
delete nextErrors[appId];
renderWindowErrors = nextErrors;
return;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Silent failure in loadAppIntoRenderWindow: when the entry cannot be found after a tray refresh and activeRenderTabId is null (empty render window), the condition if (activeRenderTabId) setRenderWindowError(...) silently drops the error. The user sees nothing. Either always emit an error (using a local notice or a toast), or show it in the empty-state region.

title="Clear all render tabs"
onclick={clearRenderWindow}
disabled={renderWindowTabIds.length === 0}
>
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The tab close target is a <span> acting as an interactive control without role="button" or tabindex="0". It is unreachable by keyboard. Consider replacing with a <button> (with type="button") so it participates in the same focus model as the surrounding render tab buttons.

type="button"
onclick={() => { browserSessionsExpanded = !browserSessionsExpanded; }}
>
<span>Browser Sessions</span>
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CSS indentation inconsistency: .skill-command-preview block is written at column 0 while all surrounding style rules are indented to match the <style> block. This is a formatting divergence that may confuse future editors. The bun run check step in the dashboard should catch this.

@aaf2tbz aaf2tbz added enhancement New feature or request spec: needs-spec Needs planning/approved spec coverage before implementation labels Apr 3, 2026
@aaf2tbz aaf2tbz marked this pull request as draft April 12, 2026 03:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request spec: needs-spec Needs planning/approved spec coverage before implementation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants