Skip to content

Release - #51

Merged
ndorin merged 43 commits into
mainfrom
release
Sep 30, 2026
Merged

ndorin merged 43 commits into
mainfrom
release

Conversation

@ndorin

@ndorin ndorin commented Sep 30, 2026

Copy link
Copy Markdown
Contributor

This pull request introduces several improvements to project configuration, documentation, and developer tooling. The most notable changes include enhanced documentation using the Diataxis framework, improved VS Code and formatting tool integration, and updates to code and documentation formatting for consistency and clarity.

Documentation Enhancements:

  • Expanded the README.md and docs/README.md to more thoroughly adopt the Diataxis framework, adding new sections, clearer learning paths, and a new how-to guide for tracing signal routes and reading the routing diagram. Also clarified feature lists to highlight interactive signal routing features. [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15]

Developer Tooling and Formatting:

  • Added .prettierignore to exclude generated and build files from formatting, and introduced .git-blame-ignore-revs to ignore bulk formatting commits in blame output. Set up .gitattributes to enforce LF line endings across the codebase. [1] [2] [3]
  • Updated VS Code workspace settings: enabled Prettier as the default formatter, set formatting and code actions on save, and recommended installing ESLint and Prettier extensions. [1] [2]
  • Reformatted and cleaned up VS Code code snippets for TypeScript React, improving consistency and maintainability. [1] [2] [3]

Project Configuration:

  • Tweaked .releaserc.json formatting for consistency in the changelog plugin configuration.

These updates collectively improve the developer experience, ensure consistent formatting and documentation, and make it easier for both new users and contributors to get started and find the information they need.

ndorin and others added 30 commits June 22, 2026 21:25
…on component

feat: update Routing to support synthetic tie lines for live routing feedback
feat: modify Versions component layout for better responsiveness
feat: extend apiSlice and routingFeedbackSlice to handle multiple sink routes
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
- Introduced Help component with dynamic routing for documentation.
- Added HelpSidebar for navigation through documentation categories and pages.
- Implemented HelpArticle for rendering markdown content with support for GFM tables.
- Created docsContent module for managing documentation structure and content retrieval.
- Added tests for Help component, HelpArticle, and docsContent functionality.
- Updated LoginForm and TopNav to include links to Help documentation.
- Added react-markdown and remark-gfm for markdown rendering.
The repository already stores all text files with LF; this keeps
Windows editors and tooling from committing CRLF.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sages

Detach handlers before closing a socket and ignore events from any
socket that is no longer current, so a replaced connection can't keep
dispatching messages, clobber the active socket, or trigger a spurious
fallback. WS_DISCONNECT now also dispatches disconnected() since the
detached onclose no longer does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nding

Rapid clicks on Join started multiple debug sessions and sockets,
producing duplicate console messages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The server already returns the URL reachable from the browser's side of
the network, so connect to `url` first and use `fallbackUrl` only as the
fallback instead of swapping them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Referenced by .vscode/settings.json and the README; no lint config or
script yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- eslint.config.js: @eslint/js + typescript-eslint recommended, React
  hooks, Vite react-refresh, plus type-aware no-floating-promises and
  no-misused-promises; eslint-config-prettier last to avoid conflicts
- Rename prettierrc.json to .prettierrc.json so Prettier finds it, and
  add .prettierignore
- Add lint, lint:fix, format and format:check scripts

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No functional changes; generated by `npm run format`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GitHub applies .git-blame-ignore-revs automatically; locally run
`git config blame.ignoreRevsFile .git-blame-ignore-revs`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Log failures from join() instead of leaving an unhandled rejection
  when starting a debug session fails
- Mark fire-and-forget RTK Query triggers, refetch() and navigate() with
  `void` (their promises don't reject without unwrap())
- Wrap async click/submit handlers so React gets a void callback
- Replace `any` with `unknown` or a narrow type for the legacy monaco
  languages.json API; String -> string in LogMessage
- Remove unused getAppIdFromPath; rename icons/index.tsx to .ts since it
  holds no components

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Drop legacy eslint.options.extensions (removed in ESLint 10), the
  prettier/prettier rule customization, html validation and the
  deprecated eslint.alwaysShowStatus; the default eslint.validate also
  covers .tsx, which the old list missed
- Use Prettier as the default formatter and format on save
- Recommend the ESLint and Prettier extensions
- Document the lint and format scripts in the README

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ESLint 10, jsdom 29 and Vite 8 require Node ^20.19.0 || ^22.13.0 || >=24,
so Node 18 is no longer supported. Update the README prerequisite and
declare the range in package.json engines.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
cdenig and others added 12 commits September 23, 2026 14:37
Replace the join ref, which was released before the WebSocket opened,
with an isConnecting flag in the websocket slice. It is set when a join
begins and cleared when the socket opens, fails, or disconnects, and the
Start button is disabled while it is set.

Dispatch disconnected() when replacing a socket, since its detached
onclose no longer reports it, so a failed reconnect can't leave
isConnected stuck at true.

Exercise the stale socket's captured handlers in the middleware tests
and cover reconnect failure and the isConnecting lifecycle.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: cdenig <86131648+cdenig@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
- Add signalColors.ts to define colors for various signal types used in routing diagrams.
- Introduce signalTypes.ts to manage signal-type flag algebra, including parsing and formatting functions.
- Create signalTypes.test.ts to validate the functionality of signal type parsing and formatting.
- Implement useRouteCandidates.ts for memoized candidate-source lookup based on static tie-line graphs.
- Add routingCommands.ts to define the wire contract for routing commands and their builders.
- Create routingCommands.test.ts to ensure the correctness of command builders and error handling.
- Update routingFeedbackSlice.ts to manage sink input changes, ensuring proper route handling and clearing.
- Add routingFeedbackSlice.test.ts to validate the behavior of sink input changes in the state.
- Added `secretsFile.ts` to handle parsing and validation of secrets files, ensuring security by not exposing sensitive values in error messages or logs.
- Introduced types and interfaces for issues, summaries, and results related to secrets file processing.
- Implemented functions to normalize, validate, and summarize secrets entries.
- Added tests for the new functionality.

feat(download): create utility functions for downloading files

- Introduced `downloadFile.ts` with functions to download text and JSON files, including support for timestamped filenames.
- Added tests for download functionality to ensure correct behavior across different scenarios.

test(secretsContract): add comprehensive tests for secrets API contract

- Created `secretsContract.test.ts` to validate command builders and constants against the expected API shapes and limits.
- Ensured that command builders emit the exact wire shape required by the backend.

feat(secretsContract): define the wire contract for the Essentials secrets API

- Established the structure for secrets API requests and responses in `secretsContract.ts`, including command requests, bulk operations, and error handling.
- Documented the API's behavior and constraints to ensure consistency across implementations.
…cross routing commands and secrets contract files; add tests for routing feedback middleware; enhance WebSocket handling in middleware; update TypeScript configuration to include ES2022.Error library.
…fo, and secrets; update troubleshooting documentation for URL format; add tests for DeviceDetail and MobileControl components
@ndorin ndorin self-assigned this Sep 30, 2026
Copilot AI balanced review requested due to automatic review settings September 30, 2026 16:01

Copilot AI left a comment

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.

Copilot review overview

🟡 Changes recommended

Routing correctness, WebSocket fallback handling, Help navigation, accessibility, and documentation issues remain unresolved.

Review effort: Balanced
Findings: 2 High severity · 5 Medium severity · 2 Low severity

Open (9)
What changed in this PR

This release expands routing and secrets management, adds in-app documentation and live polling, and standardizes developer tooling and formatting.

Changes:

  • Adds live routing feedback, route editing, multiview visualization, and connection handling.
  • Adds secrets workflows, embedded Help documentation, polling, and expanded tests.
  • Introduces ESLint/Prettier integration and broad formatting/documentation updates.
File Description
vite.config.ts Reformats Vite configuration.
tsconfig.json Adds Error library typings.
src/​vite-env.d.ts Formatting cleanup.
src/​styles.scss Reformats Sass utilities.
src/​store/​websocketSlice.ts Tracks connecting state.
src/​store/​websocketMiddleware.ts Hardens socket replacement.
src/​store/​websocketMiddleware.test.ts Tests socket lifecycle behavior.
src/​store/​store.ts Registers routing feedback and listeners.
src/​store/​routingFeedbackSlice.ts Stores live routing state.
src/​store/​routingFeedbackSlice.test.ts Tests sink-route updates.
src/​store/​routingFeedbackMiddleware.ts Implements routing WebSocket handling.
src/​store/​routingFeedbackMiddleware.test.ts Tests stale and fallback sockets.
src/​store/​routingCommands.test.ts Verifies routing command contracts.
src/​store/​polling.ts Centralizes polling options.
src/​store/​hooks.ts Formatting cleanup.
src/​store/​commonUi/​commonUiState.ts Formatting cleanup.
src/​store/​commonUi/​commonUiSlice.ts Formatting cleanup.
src/​store/​commonUi/​commonUiSelectors.ts Formatting cleanup.
src/​store/​commonUi/​commonUiHooks.ts Formatting cleanup.
src/​shared/​types/​LogMessage.ts Uses primitive string type.
src/​shared/​ListFiltersHeader.tsx Reformats conditional rendering.
src/​shared/​icons/​index.ts Removes trailing whitespace.
src/​shared/​hooks/​useAppParams.ts Formatting cleanup.
src/​shared/​functions/​meetsMinimumVersion.ts Reformats version parsing.
src/​shared/​functions/​downloadFile.ts Adds browser download helpers.
src/​shared/​functions/​downloadFile.test.ts Tests download helpers.
src/​shared/​FilterSearchText.tsx Synchronizes external search values.
src/​shared/​FilterDropdownSearchParams.tsx Derives selections directly from URL.
src/​shared/​components/​EyeIcon.tsx Adds password visibility icon.
src/​react-app-env.d.ts Reformats SVG declarations.
src/​index.tsx Formatting cleanup.
src/​features/​Versions.tsx Adds scrollable version table.
src/​features/​Types.tsx Formatting cleanup.
src/​features/​TopNav.tsx Adds Help and Secrets navigation.
src/​features/​TieLineEdge.tsx Formatting cleanup.
src/​features/​secrets/​SecretDeleteModal.tsx Adds guarded secret deletion.
src/​features/​secrets/​BulkPreviewTable.tsx Displays bulk-operation previews.
src/​features/​secrets/​BulkApplyModal.test.tsx Tests provider and unmanaged handling.
src/​features/​secrets/​BulkApplyModal.module.scss Styles file drop zone.
src/​features/​RoutingDeviceNode.module.scss Styles editable routing ports.
src/​features/​routing/​useRouteCandidates.ts Caches route candidate traversal.
src/​features/​routing/​useRouteCandidates.test.ts Tests candidate caching.
src/​features/​routing/​signalTypes.ts Implements signal-flag algebra.
src/​features/​routing/​signalTypes.test.ts Tests signal handling.
src/​features/​routing/​signalColors.ts Centralizes signal colors.
src/​features/​routing/​RoutePopover.module.scss Styles route editor popover.
src/​features/​routing/​pendingRoutes.ts Tracks pending route commands.
src/​features/​routing/​currentSource.ts Resolves live upstream sources.
src/​features/​RequireAuth.tsx Formatting cleanup.
src/​features/​MultiviewLayoutPanel.tsx Adds draggable layout panels.
src/​features/​MultiviewLayoutPanel.module.scss Styles layout panels.
src/​features/​MultiviewLayoutCanvas.tsx Renders interactive multiview tiles.
src/​features/​MultiviewLayoutCanvas.module.scss Styles multiview canvas.
src/​features/​MobileControl.tsx Adds live status polling.
src/​features/​MainLayout.tsx Formatting cleanup.
src/​features/​LoginForm.tsx Adds Help and password visibility.
src/​features/​liveRefresh.test.tsx Tests polling and invalidation.
src/​features/​InitializationExceptions.tsx Formatting cleanup.
src/​features/​Help/​HelpSidebar.tsx Adds documentation navigation.
src/​features/​Help/​HelpArticle.tsx Renders Markdown documentation.
src/​features/​Help/​Help.tsx Adds Help page layout.
src/​features/​Help/​Help.test.tsx Tests Help navigation and rendering.
src/​features/​Help/​docsContent.ts Indexes and resolves documentation.
src/​features/​Help/​docsContent.test.ts Tests documentation indexing.
src/​features/​ErrorBoundary.tsx Formatting cleanup.
src/​features/​DeviceList.tsx Formatting cleanup.
src/​features/​DeviceDetail.test.tsx Tests live device refresh.
src/​features/​DebugConsole/​RestartConfirmModal.tsx Reformats restart modal.
src/​features/​DebugConsole/​MinimumLogLevelDropdown.tsx Reformats mutation handlers.
src/​features/​DebugConsole/​LogMessageDetailDrawer.tsx Formatting cleanup.
src/​features/​DebugConsole/​DeviceFilterDropdown.tsx Reformats device filters.
src/​features/​DebugConsole/​DebugFilters.tsx Removes extra whitespace.
src/​features/​DebugConsole/​debugConsts.ts Standardizes quoting.
src/​features/​DebugConsole/​ConsoleWindow.tsx Reformats console rows.
src/​features/​ConfigFile.tsx Adds polling and safer typings.
src/​features/​ApiPaths.tsx Formatting cleanup.
src/​features/​ApiPathDetailDrawer.tsx Reformats external link.
src/​App.test.tsx Expands navigation and socket tests.
README.md Expands setup and feature documentation.
package.json Adds tooling and Markdown dependencies.
index.html Normalizes doctype.
eslint.config.js Adds flat ESLint configuration.
docs/​tutorials/​README.md Reformats tutorial index.
docs/​tutorials/​getting-started.md Updates URL and routing guidance.
docs/​tutorials/​device-management-basics.md Reformats device tutorial.
docs/​tutorials/​debug-console-basics.md Reformats console tutorial.
docs/​README.md Expands documentation index.
docs/​how-to/​trace-signal-routes.md Adds routing trace guide.
docs/​how-to/​monitor-performance.md Reformats performance guide.
docs/​how-to/​manage-secrets.md Adds secrets management guide.
docs/​how-to/​change-routes.md Adds route-editing guide.
docs/​explanation/​README.md Reformats explanation index.
.vscode/​settings.json Enables formatting and fixes on save.
.vscode/​launch.json Reformats launch settings.
.vscode/​extensions.json Recommends ESLint and Prettier.
.releaserc.json Reformats release configuration.
.prettierrc.json Formatting cleanup.
.prettierignore Excludes generated files.
.gitattributes Enforces LF line endings.
.git-blame-ignore-revs Excludes formatting commit from blame.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/features/routing/currentSource.ts Outdated
Comment thread src/features/routing/pendingRoutes.ts
Comment thread src/features/Help/HelpArticle.tsx
Comment thread src/features/Help/docsContent.ts Outdated
Comment thread src/features/MultiviewLayoutCanvas.tsx Outdated
Comment thread src/store/routingFeedbackMiddleware.ts
Comment thread src/store/routingFeedbackMiddleware.ts
Comment thread docs/how-to/change-routes.md Outdated
Comment thread docs/how-to/manage-secrets.md Outdated
- Route popover marks the current source per selected signal type, so a
  breakaway output (Audio and Video from different inputs) no longer shows
  one source as current for every signal
- Pending route markers track the command's signal type, so feedback for
  another signal can't confirm or block them
- Routing feedback WebSocket guards a malformed URL and keeps trying the
  fallback on every reconnect
- Help renders heading ids (rehype-slug), scrolls to fragment links, and
  resolves links on category index pages against their own folder
- Multiview tile select and edit controls are sibling buttons instead of
  nested interactive elements
- Bulk secrets Apply stays disabled while the file checker rejected any
  entry, so a partly invalid file is never partly written
- Fix a broken fragment link in change-routes.md and document the
  all-or-nothing secrets apply accurately

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings September 30, 2026 16:21
@ndorin
ndorin requested review from aknous, andrew-welker and jkdevito and removed request for andrew-welker September 30, 2026 16:24
@ndorin
ndorin merged commit 8ef9242 into main Sep 30, 2026
3 checks passed
@ndorin
ndorin deleted the release branch September 30, 2026 16:25

Copilot AI left a comment

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.

Copilot review overview

🟡 Changes recommended

WebSocket failure handling and secrets workflows contain state and safety defects that can misreport or obscure operations.

Review effort: Balanced
Findings: 2 High severity

Open (2)
Resolved since last review (9)
Previously missed (4)

In code that hasn't changed since last review

Medium severity Prevent modal dismissal while preview or commit is running

src/​features/​secrets/​BulkApplyModal.tsx:230

The footer prevents cancellation while a preview or commit is running, but onHide={onClose} still lets the header close button or Escape dismiss the modal. A commit then continues invisibly, so users can believe it was cancelled and never see its outcome. Guard onHide and hide/disable the header close control while busy.

Medium severity Prevent dialog dismissal while deleting

src/​features/​secrets/​SecretDeleteModal.tsx:38

Although Cancel is disabled during deletion, the header close button and Escape still invoke onClose, hiding the dialog while the destructive request continues. Guard onHide and remove the close control during isDeleting.

Medium severity Use selected provider entries for collision and overwrite checks

src/​features/​secrets/​SecretEditModal.tsx:67

existingKeys contains records only for the page's active provider, but the add form lets selectedProvider change. Collision ownership and the overwrite flag are therefore computed against the wrong store: switching providers can send overwrite: true based on a same-named key in the original provider, without knowing whether the target key is unmanaged, or send false when the target actually exists. Lock adds to the active provider, or load and use the selected provider's entries before allowing submission.

This issue also appears on line 96 of the same file.

Low severity Update tutorial to reflect current Device Detail features

docs/​tutorials/​device-management-basics.md:87

This tutorial still says Device Detail is a placeholder, and its later limitations section says there is no real-time status or interaction. The current DeviceDetail renders properties, feedbacks, executable methods, manual refresh, and two-second live polling. Update these sections so the enhanced documentation describes the feature users actually see.

Comment on lines +75 to +76
store.dispatch(routingWsDisconnected());
store.dispatch(routingWsConnectionFailed([...attemptedUrls]));
Comment on lines +54 to +59
store.dispatch(
connectionFailed(
fallbackUrl && targetUrl === fallbackUrl
? [url, fallbackUrl]
: [targetUrl]
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants