# Changelog

All notable changes to this project are documented here.

## 1.2.5 — 2026-10-30

### Changed

- Updated the exact development contracts to DeepSeek Harness `0.2.1-rc.5`, verified as npm `latest` on 2026-10-30, and added that exact Host version to `engines.dsh` and the matching Host peer range. Historical declarations remain unchanged.
- Refreshed English, Russian and Simplified Chinese compatibility documentation and replaced all 14 README screenshots with approved, real-browser dark-theme captures on `0.2.1-rc.5`: eight mobile PNG originals at `430 × 932` and six desktop JPEG originals at `1440 × 1000`, without re-encoding. English and Simplified Chinese use separate fictional demo profiles; Russian documentation shares the English images.
- Clarified the existing one-use invitation lifecycle in all three READMEs: successful pairing closes the QR panel, and another browser or device needs a newly generated invitation.

### Validation

- Typecheck, all 117 tests across 18 files, build, package dry-run and production dependency audit passed against `0.2.1-rc.5`. Live pairing returned `204`, authentication handoff `303` / `303`, root `200`, and WebSocket upgrade `101`; revoke immediately closed the active socket and subsequent access returned `401`. All three directory-picker RPCs remained blocked with `403`.
- Browser QA passed EN/ZH at five viewport sizes from 320 to 768 CSS pixels, plus selected-chat QR entry and fully opened navigation/session/subagent surfaces at 320 and 430 px. The Paired devices shortcut passed both locales with expanded and collapsed sidebars; browser JavaScript errors: none. Physical-phone, voice and the full historical Host matrix were not rerun.
- Rechecked all three native More menu locations, Copy link, invitation replacement (old token `410`), QR auto-close after consumption, selected-chat handoff, device rename/revoke, and diagnostic refresh/copy/clear in three repeated EN/ZH passes. Remote administration remained unavailable (`404`), and Settings/directory-picker RPCs remained blocked (`403`). Six new connection-screen captures were compared with the existing README images: Local Link controls are unchanged; native More entries are the visible Host-shell difference.

## 1.2.4 — 2026-10-19

### Changed

- Updated the exact development contracts and Host compatibility metadata to DeepSeek Harness `0.2.1-rc.2`, verified as npm `latest` on 2026-10-19. Aligned Cordis/Schemastery and regenerated the dependency graph without stale auto-installed peers; no new runtime dependency was added.
- Replaced all 14 README images with approved, real-browser dark-theme captures on `0.2.1-rc.2`: separate English and Simplified Chinese demo profiles, `430 × 932` mobile frames and `1440 × 1000` desktop frames. Russian documentation shares the English captures. Images use JPEG without re-encoding or relabelling PNG data.
- Adjusted the connection trust-boundary test for WebServer's optional TCP port (the Host also supports non-TCP listeners); the test still requires a real TCP listener and does not skip authentication checks.
- Retained the previously checked `0.2.1-alpha.2` and historical RC declarations; the older RC matrix was not rerun in full.
- Preserved invocation trusted hosts across the `webRuntime` to `webStartup` transition without requiring the removed service. The gateway's existing `webServer` dependency orders startup before the connection trust expression is evaluated.
- Adapted the legacy subagent address type to the new external catalog-entry mode; current Harness continues to own native subagent navigation.

### Fixed

- Restored the QR popover's Paired devices shortcut on current Hosts through the localized native account-menu Settings action, retaining a scoped direct-trigger fallback for older Hosts. The bridge no longer selects an unrelated session-statistics dialog trigger, does not toggle an already open menu, and stops waiting after a bounded user-initiated attempt.
- Restored mobile autofocus suppression after Session navigation using the rendered Session scope rather than the removed catalog `current` field. Explicit taps on the composer still focus the editor normally.
- Read the desktop QR invitation's Session identity from the same public Session scope, without reaching into the Workspace service's private selection store.
- Kept the new native `activity` and `usage` composer pills inside mobile Current session details, alongside the older `stats` contribution; desktop statistics are unchanged.

### Validation

- On `0.2.1-rc.2`: typecheck, 117 tests across 18 files, build and package dry-run passed with no peer-dependency issues. Live LAN pairing returned `204`, browser handoff `303` / `303`, authenticated root `200`, and `/api/remote.mux` upgraded with `101`. Revocation immediately closed the established WebSocket and subsequent access returned `401`. All three directory-picker RPCs remained blocked with `403`. Headless Chromium covered an existing chat at widths 320, 360, 390, 430 and 768 px: no horizontal overflow, visible session-info action, single-row composer controls, no Host-app opener, and no unsolicited composer focus. The session-details drawer fit at 320 px. Physical-phone, Russian voice and the full historical RC matrix were not rerun.
- Typecheck, 106 tests across 16 files, build and package dry-run passed against `0.2.1-alpha.2`; startup passed without a version exemption. Browser checks covered LAN pairing/handoff, existing-chat loading, navigation and session details at widths 320, 360, 390, 430 and 768 px. Browser acceptance is separate from physical-phone acceptance. That earlier alpha validation was local and was not published as a separate npm release.
- The `0.2.1-rc.2` browser pass also verified explicit composer taps, hidden duplicate mobile dock metrics, and a desktop-generated QR opening the same selected chat in a fresh mobile browser context. Browser JavaScript errors: none. Test devices were revoked after the checks; screenshots from the private working profile are local evidence, not README assets.
- The Settings shortcut passed live browser checks in both EN and ZH with expanded and collapsed sidebars. Seven regression tests cover current menu navigation, historical direct triggers, already-open surfaces, absent launchers, bounded waits, and rejection of unrelated statistics triggers. Screenshot QA covered both locales at `320 × 568`, `360 × 800`, `390 × 844`, `430 × 932` and `768 × 1024`.

## 1.2.3 — 2026-10-02

### Changed

- Built against the exact DeepSeek Harness `0.2.0-rc.2` contracts and added that release to both `engines.dsh` and the Host peer range, retaining the previously declared RC releases.
- Refreshed all seven README screenshots from the actual `0.2.0-rc.2` browser UI in dark mode, with separate English and Simplified Chinese demo profiles. Mobile frames retain `430 × 932`; subagents show the native header catalog, not the legacy bottom sheet. Russian documentation reuses the English frames.

### Fixed

- Kept the new native `directoryPicker.pick`, `directoryPicker.list`, and `directoryPicker.createDirectory` RPCs inaccessible through the LAN gateway, preserving the existing trusted-LAN scope after the Host API rename.
- Displayed recorded permission identifiers in the mobile Current session drawer when the session summary has no UI option catalog. Empty or null agent-preset identifiers now show the explicit not-recorded label. Model updates no longer discard the open drawer's session identity.

### Validated

- Type checking, all 105 automated tests, production build, and npm package dry-run passed against `0.2.0-rc.2`.
- On the running `0.2.0-rc.2` Host: LAN pairing returned `204`, the native browser handoff returned `303` / `303`, the authenticated root returned `200`, and `/api/remote.mux` upgraded with `101`. Revocation closed the established WebSocket and subsequent device access returned `401`.
- All three new native directory RPCs returned `403` through the authenticated LAN gateway. Historical RC releases were not all rerun for this patch; physical-phone acceptance remains separate from browser emulation.
- In-browser checks at 320, 360, 390, 430, and 834 CSS pixels kept the session-info action visible, composer actions on one row, and the Host-app opener hidden without document overflow. The 320-pixel details drawer fit the viewport; a 1280-pixel desktop check retained the Host-app opener.
- The user confirmed that the updated plugin works on their physical phone. The screenshot pass also checked the Simplified Chinese header, composer, and session drawer at 320 CSS pixels.

## 1.2.2 — 2026-09-27

### Changed

- Built against the exact DeepSeek Harness `0.1.7-rc.2` contracts while retaining the declared historical RC Host range.
- Accepted Harness's weight-named icon exports while preserving the older size-named exports for previous supported Hosts.
- Bound the mobile Current session drawer to the session-scoped trigger because the 0.1.7 list no longer contains current selection. The legacy custom subagent sheet now mounts only when its required catalog API exists; on 0.1.7 the native `dsh-client-ui-subagent` header action owns navigation.
- Hid the duplicate stock context meter and Host-app opener in Mobile View while retaining the context breakdown in Current session and both controls on desktop.
- Removed nine unused development-only Harness packages absent from the `0.1.7-rc.2` Host dependency graph.

### Validated

- Exercised one-use LAN pairing, native browser-auth handoff, authenticated page and `/api/remote.mux` WebSocket access, revoke-driven socket closure, and rejection after revoke on the running `0.1.7-rc.2` Host.
- Checked the live mobile menu, Current session drawer, and visible header controls without horizontal overflow at 320, 360, 390, 430, and 834 CSS px.
- Passed frozen-lockfile installation, TypeScript checking, all 103 tests, production build, package dry-run, and production dependency audit with no known vulnerabilities. Real-device mobile acceptance and the full manual plugin-surface checklist remain separate checks.

## 1.2.1 — 2026-09-21

### Changed

- Declared the supported DeepSeek Harness range through the official `engines.dsh` package metadata and added manifest format version `1`, allowing plugin clients to evaluate Host compatibility directly.
- Removed the duplicated compatibility matrices and standalone compatibility document; the package manifest is now the single source of truth, while historical validation remains recorded in this changelog.
- Updated the release contract to keep `engines.dsh` aligned with the Harness Host peer dependency.

### Validated

- Passed TypeScript checking, all 102 automated tests across 16 files, the production build, and package dry-run.

## 1.2.0 — 2026-09-18

`1.2.0` moves the development baseline to DeepSeek Harness `0.1.5-rc.2` and
finishes the narrow-screen presentation without changing Local Link's trusted
private-LAN scope, pairing model, or use of the stock Harness client.

### Added

- Added a complete Simplified Chinese README with an English/Chinese language switch; both README files ship in the npm package.
- Added real dark-theme browser screenshots for Navigation, Current session, Subagents, and Conversation, captured from an isolated `430 × 932` Harness profile containing synthetic data only.
- Added regression coverage for compact header actions, the narrow composer, hidden remote app-launch action, and the Harness right sidebar on mobile.

### Changed

- Moved the supported DeepSeek Harness baseline and all direct development contracts to the exact `0.1.5-rc.2` release while retaining the explicitly verified historical RC peer range.
- Reworked the mobile header controls into compact, unframed actions with balanced safe-area spacing and a non-shrinking Current session information action.
- Kept composer actions on one row at phone widths, collapsed the model selector label before overflow, and allowed the placeholder to wrap to two lines.
- Projected the Harness `rightbar` as a full-screen mobile surface instead of hiding it.

### Fixed

- Kept the Current session information action visible at very narrow widths, including a `320 × 568` browser-emulated check.
- Removed the misleading remote `Open in app` action from Mobile View.
- Preserved native message actions and the end of the conversation while keeping the composer fully usable on narrow screens.

### Validated

- Passed TypeScript checking, all 102 automated tests across 16 files, the production build, the production dependency audit with no known vulnerabilities, package dry-run, and `npm publish --dry-run`.
- Booted an isolated `0.1.5-rc.2` Harness profile with the local plugin and synthetic parent/child sessions, then exercised the real Navigation, Current session, Subagents, and Conversation surfaces at `430 × 932` and the header/composer at `320 × 568`.
- Retained the previously recorded installed-runtime compatibility evidence for `0.1.5-rc.1`, `0.1.2-rc.1`, `0.1.1-rc.2`, `0.1.1-rc.1`, and `0.1.0-rc.8`; physical-phone acceptance remains a separate check.

## 1.1.2 — 2026-09-15

### Fixed

- Prevented the mobile composer from retaining or regaining automatic focus after switching sessions, so chat navigation no longer opens the virtual keyboard. An explicit tap on the composer still focuses it normally.

### Validated

- Passed TypeScript checking, all 99 automated tests across 16 files, and the production build.
- Activated the rebuilt plugin in the current DeepSeek Harness installation through Process Launcher without restarting the local model server.

## 1.1.1 — 2026-09-12

### Changed

- Moved the supported DeepSeek Harness baseline to `0.1.5-rc.1` and expanded the optional Host peer contract for the exact `0.1.5-rc.1` and `0.1.5-rc.2` packages.
- Updated direct development contracts to `0.1.5-rc.1` while preserving the Local Link gateway, pairing, and trusted-private-LAN boundary unchanged.
- Documented the new Harness `main`/`rightbar` AppFrame alongside the retained session, composer, sidebar, Settings, and overlay slots used by Local Link.

### Validated

- Composed and booted clean Web profiles with the packed plugin source on Harness `0.1.5-rc.1` (`latest`) and `0.1.5-rc.2` (`next`).
- Rechecked the packed `1.1.1` artifact on `0.1.2-rc.1`, `0.1.1-rc.2`, `0.1.1-rc.1`, and `0.1.0-rc.8`: every isolated profile passed plugin peer checks, pairing, authenticated HTTP and WebSocket traffic, immediate socket closure on revoke, and post-revoke rejection.
- Verified desktop Local Access and QR generation plus responsive activation and navigation at `390 × 844` without client exceptions on both exact Harness versions.
- Passed typecheck, all 98 automated tests across 16 files, production build, and package dry-run against both `0.1.5` RC contract sets.

## 1.1.0 — 2026-09-07

`1.1.0` updates Local Link for DeepSeek Harness `0.1.2-rc.1` while preserving the existing trusted-private-LAN product and security boundary. It keeps the stock Harness client, session state, permissions, and live stream instead of introducing a second remote client.

### Changed

- Migrated the browser client to the DeepSeek Harness `0.1.2-rc.1` Cordis context, API session controller, UI renderer/session services, session projections, and subagent contracts.
- Pinned the direct development contracts to the exact RC and moved the plugin's Cordis peer contract to `^4.0.2`.
- Kept the previous trusted-LAN scope after the RC removed method-specific transport tiers: Local Link now rejects configuration, credential, native Host-action, and agent-preset-authoring RPCs at its own gateway.

### Fixed

- Revoking a paired device now immediately closes every open Local Link WebSocket tunnel authenticated by that device, while leaving other paired devices and `trusted-lan` connections untouched.
- The mobile appearance control now follows the left drawer transition instead of appearing abruptly while the drawer opens or closes.
- Current session statistics now round fractional token throughput consistently instead of exposing the raw floating-point tail.

### Validated

- Passed the full TypeScript, test, build, peer-dependency, and package gates against the exact `0.1.2-rc.1` contracts.
- Passed all 98 automated tests across 16 test files, the production dependency audit with no known vulnerabilities, and `npm publish --dry-run` for `dsh-local-link@1.1.0`.
- Booted the installed `0.1.2-rc.1` Web profile with Local Link, completed pairing and native browser authentication through the Ethernet gateway, verified the loopback-only Settings RPC returns `403`, and revoked the test device.
- Verified the new client services in the live boot manifest, opened the desktop QR panel, and exercised the responsive AppFrame at `390 × 844` without browser console errors.
- Installed the packed `1.1.0` release into fresh `0.1.1-rc.2`, `0.1.1-rc.1`, and `0.1.0-rc.8` profiles. Every RC passed real-client Local Access, `390 × 844` responsive navigation, private-LAN pairing, authenticated HTTP and `/api/events.mux`, plus revoke with immediate socket closure and a subsequent `401`.

## 1.0.0 — 2026-08-29

The first stable Local Link release. It keeps the focused same-LAN access and
responsive Harness-client scope established by the `0.2.x` previews, with an
exact compatibility matrix covering the current verified Harness release and
prerelease targets.

### Fixed

- Added the native browser-authentication handoff required by DeepSeek Harness `0.1.2-alpha.1`, while preserving the separate Local Link device credential and the older release-candidate flow.
- Kept alpha boot-manifest batches aligned when withholding the remote native directory picker, and allowed the alpha's exact `/api/remote.mux` live-stream endpoint without widening the WebSocket allowlist.
- Made Current session tolerate alpha conversation summaries that omit the legacy `nodes` collection while continuing to resolve the selected model through Harness's native model directory.

### Validated

- Verified pairing, current-session opening, live conversation streaming, responsive navigation, Current session, and subagent surfaces in an isolated checkout of DeepSeek Harness `0.1.2-alpha.1`.
- Reverified Local Access, one-use QR regeneration, and responsive navigation against DeepSeek Harness `0.1.1-rc.2`, `0.1.1-rc.1`, and `0.1.0-rc.8` using the same release source.

## 0.2.1 — 2026-08-29

### Fixed

- Quoted the `trustedHosts` JavaScript expression in the bundled Cordis overlay so a clean npm installation parses and boots with the strict DSH patch-list YAML schema.

### Validated

- Documented supported and verified Harness versions in a newest-first compatibility matrix.

## 0.2.0 — 2026-08-29

### Added

- Phone and tablet Mobile View with drawer navigation, safe-area support, and automatic viewport activation through the native Harness client.
- Current session drawer with context usage and breakdown, model, workspace access, agent preset, session activity, and native session-log download.
- Touch-friendly subagent status chip and bottom sheet built from Harness session catalogs and actions.
- Visible total/active subagent counts mirrored in the compact control's accessible name.
- Mobile appearance control driven by the Harness theme service.
- Shared mobile-dialog focus lifecycle with initial focus, keyboard containment, Escape handling, and focus restoration.
- English and Chinese copy for the pre-Harness automatic pairing page, selected from the browser language.
- A dedicated Mobile View guide and release acceptance matrix.

### Changed

- Reworked the stock Web client's cramped desktop-oriented narrow-screen presentation into touch-friendly navigation, session details, subagent controls, and conversation geometry without introducing a replacement client.
- Mobile View now enhances the shipped Harness AppFrame without replacing the root layout, preserving dynamic conversation views, overlays, composer extensions, and third-party registrations.
- The subagent duration clock now runs only while a visible catalog contains active work; it observes no network or session data itself.
- Authenticated gateway authorities now enter the official connection `trustedHosts` contract while privileged settings, credential, Host, and preset-authoring RPCs remain loopback-only.
- The gateway preserves the browser's original Host and origin headers instead of impersonating the loopback origin.
- Remote gateway boot omits the host directory-picker capability, so `Add workspace` is not offered while existing workspaces and sessions remain available.
- Plugin-owned controls use Harness button/input primitives, semantic tokens, and one shared Local Link hairline border variable.
- Left navigation, details, and Current session surfaces use the same compact drawer width.

### Fixed

- Prevented the mobile keyboard from opening automatically after switching sessions.
- Restored immediate access to native session and active-workspace overflow actions on touch devices.
- Separated the DeepSeek Harness brand and appearance-control hit areas.
- Kept Cordis panels viewport-bound and readable in the responsive mobile presentation.
- Removed QR-panel overflow artifacts and normalized Local access, diagnostics, device, and mobile border weight.
- Matched the documented Mobile View activation boundary at `834` CSS pixels.
- Rejected public listener addresses, loopback-lookalike Host/Origin values, and malformed device cookies without widening access or destabilizing the gateway.
- Allowed device-state persistence to recover after a transient filesystem failure instead of poisoning every later write until restart.
- Kept background diagnostics fail-soft while making an explicit `Clear` report persistence errors honestly and recover on the next attempt.

### Compatibility notes

- Mobile View targets DeepSeek Harness `0.1.1-rc.2`; responsive layout and several stock-DOM presentation hooks remain version-sensitive.
- A remote browser inherits the selected Harness session permissions. Hiding `Add workspace` is a mobile UX constraint, not an authorization boundary.
- In the supported Harness release, a remote light/dark choice is memory-backed and resets on reload to the host preference resolved against the remote device's system theme.

## 0.1.0 — 2026-08-28

### Added

- Local-only authenticated gateway to the stock DeepSeek Harness Web UI.
- One-use QR and copyable-link pairing with expiry and regeneration.
- Current-session transfer and live HTTP/WebSocket proxying.
- Remembered browsers with editable names, detected category/browser metadata, and revocation.
- Native sidebar and Settings integration with English and Chinese localization.
- Compatibility handling for Cordis footer coexistence and legacy device records.
- Mobile pairing page with robust browser detection, bounded connection time, and visible network/expiry errors instead of an endless spinner.
- Event-driven local diagnostics retaining only the latest 15 failures, with structured codes, burst coalescing, privacy allowlisting, Settings inspection, report copying, and clearing.
- Automated type checking, tests, package verification, CI, and npm release preparation.

### Known limitations

- Plain HTTP on the LAN.
- Existing WebSockets are not actively closed on revoke.
- Compatibility is currently pinned to DeepSeek Harness `0.1.1-rc.2`.
