Commit graph

13 commits

Author SHA1 Message Date
decolua
a28c5ec98b # v0.4.44 (2026-05-15)
## Features
- Add Blackbox provider with `bb` alias (#1143)
- Add Xiaomi token plan provider
- Enhance model select modal UX + modal traffic lights (#1111)
- Default Usage dashboard period to Today (#1141)

## Fixes
- Fix Cowork model selection and Windows CLI packaging (#1129)
- Update provider name retrieval for compatibility provider (#1135)
- Update JWT_SECRET handling
2026-05-15 12:02:32 +07:00
local
beb4599090 Fix Cowork model selection and Windows CLI packaging (#1129)
Cherry-picked from upstream PR #1129 + local improvements:
- dedupe inline remove-model handler -> use handleRemoveModel
- add .next-cli-build/ and cli/.build-home/ to .gitignore
2026-05-15 09:31:34 +07:00
decolua
1c3ab7be23 fix(tui): replace enquirer with readline to remove input lag
- Persistent raw mode across menus avoids per-prompt latency
- Suspend raw temporarily for line-buffered text input
- Update CHANGELOG v0.4.41

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-14 11:13:49 +07:00
decolua
2190ff062d feat: v0.4.41 - cli-tools UI redesign + jcode integration
- Add jcode CLI tool (#1047) with auto-configuration
- Redesign CLI Tools dashboard: grid 1/2/3 cols + per-tool detail page
- Sync DeepSeek TUI card style + resize icon 1024->128
- Add official logos: amp, jcode, qwen
- Bump version 0.4.39 -> 0.4.41

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-14 10:46:11 +07:00
Tri Dung Nguyen
5327a7dc30
fix(autostart): work on nvm + npm 9/10, actually register with launchctl (fixes #1082) (#1104)
* fix(autostart): resolve cli.js path locally, register with launchctl, verify state

The current `cli/src/cli/tray/autostart.js` is silently broken on every nvm
install (and likely Volta / asdf / Homebrew / user-prefix npm) and on every
npm version >= 9. Enabling auto-start from the tray menu writes a launchd
plist that references a non-existent script; the menu then reports
"✓ Auto-start Enabled" because the existence check only verifies the file is
on disk. On the next OS boot launchd fails with MODULE_NOT_FOUND. None of
this surfaces to the user.

This rewrite addresses the four problems reported in #1082:

1. `npm bin -g` was removed in npm 9. autostart.js called it as a primary
   resolution mechanism and silently fell back to a hardcoded
   `/usr/local/lib/node_modules/9router/cli.js` path on failure. Replaced
   with a `getCliJsPath()` helper that tries (in order): the explicit
   `cliPath` argument, `process.argv[1]` when it's our own cli.js, and a
   path computed relative to autostart.js's own location (since this file
   always lives at `<pkg>/src/cli/tray/autostart.js`, cli.js is three
   levels up regardless of install layout). Returns null on no match.

2. The `/usr/local/...` fallback was outright wrong for nvm/Volta/asdf
   installs. Dropped entirely. If no candidate resolves, return false
   instead of writing a plist pointing at a missing script.

3. `enableMacOS()` never called `launchctl load -w`, only `unload`. The
   plist was therefore inert until the next user login, with no signal to
   the user that anything was wrong. Now it unloads (defensive, in case of
   re-enable) and then loads, so the agent is active in the current session.

4. `isAutoStartEnabled()` on macOS only checked file existence — so the
   tray menu reported "✓ Enabled" even when launchd had the agent in a
   failed state or hadn't loaded it. Now also runs `launchctl list
   ${APP_LABEL}` and only returns true if launchd recognizes the label.

Additional changes for robustness:

- The macOS plist now invokes node + cli.js directly with absolute paths
  instead of wrapping in `zsh -l -c "..."`. The shell-wrapper approach
  depended on the user's login shell sourcing nvm/PATH correctly, which is
  fragile (nvm.sh sourcing varies between users; some setups don't add
  node to PATH from a non-interactive login shell).
- `EnvironmentVariables.PATH` in the plist now explicitly includes node's
  bin directory plus the standard system paths, so child processes spawned
  by cli.js (e.g. the runtime `npm install` calls) can still resolve `npm`
  even under launchd's minimal default env.
- Windows and Linux paths were calling `npm bin -g` with the same fallback
  problem; both now use `getCliJsPath()` consistently. The Windows VBS
  branch is simplified (always run node+cli.js, drop the `9router.cmd`
  lookup that depended on the npm prefix path).
- Removed the unused `getStartCommand()` helper that was never imported.

Fixes #1082

* fix(autostart): skip launchctl unload/load when current process is the agent

When the running 9router cli.js was itself spawned by the autostart launchd
agent (after a reboot when autostart was previously enabled), clicking the
tray menu's "Disable Auto-start" item would unload the agent — and that
unload sends SIGTERM to the running process, killing the click handler and
the tray icon before the menu could flip its label.

Add a small `isAgentSelfMacOS()` probe (parses `launchctl list ${label}` and
compares the PID against `process.pid`). When we're the agent itself,
disable skips the unload (the plist file removal is enough to prevent the
agent from starting on the next login) and enable skips the load (the plist
is already loaded under our own PID, the on-disk update is what matters for
next boot). External callers — e.g. enable from a manually-launched 9router
or from a script — still get the full unload/load behavior they need.

Without this, the tray UX after a reboot was: click Disable -> tray icon
silently disappears, no menu label change. Now: click Disable -> label
flips to "Enable Auto-start", tray stays, plist removed; click Enable again
-> label flips back, plist re-created.
2026-05-14 09:57:05 +07:00
decolua
a8100e9444 Fix build bug 2026-05-14 00:28:08 +07:00
decolua
58df17aa91 # v0.4.38 (2026-05-13)
## Features
- Add DeepSeek TUI as CLI tool in dashboard (#1088)

## Fixes
- Fix broken Docker image in v0.4.36/v0.4.37 (#1096, #1097)

## Improvements
- Clean Docker tags + clearer pulls badge
2026-05-13 22:54:40 +07:00
decolua
9ce5290710 chore: clean Docker tags + clearer pulls badge
- Workflow: drop sha + major.minor tags, keep only latest + full version
- README: rename "Docker Hub" badge → "Docker pulls" for clarity
2026-05-13 22:34:11 +07:00
decolua
992f4db4a0 Fix bug 2026-05-13 20:35:42 +07:00
decolua
7f7b86f70e Docker 2026-05-13 18:25:29 +07:00
decolua
7ccf8c5e84 # v0.4.36 (2026-05-13)
## Features
- Add MiniMax TTS provider support (#1043)
- Docker images now published on both GHCR & Docker Hub (decolua/9router) — pull from your preferred registry

## Improvements
- Replace browser confirm dialogs with custom ConfirmModal (#1060)

## Fixes
- Fix Docker `Cannot find module 'next'` error in standalone build
- Restore /app/server.js in Docker standalone build (#1064, #1067)
- Fix CLI TUI menu arrow-key escape sequences leaking (^[[A^[[B)
- Switch macOS/Linux tray to systray2 fork (fixes Kaspersky AV false-positive) (#1080)
- Fix zoom controls contrast in topology view (#1066)
2026-05-13 18:22:31 +07:00
Tri Dung Nguyen
5cab23d92e
fix(tray): switch macOS/Linux tray to systray2 fork (#1080)
The legacy `systray@1.0.5` package (last published 2018) bundles a 2017
x86_64 Go binary whose Mach-O headers are rejected by modern dyld (macOS
14+ / Apple Silicon). The result on affected systems was that
`9router --tray` (and "Hide to Tray" from the interactive menu) printed
"Router is now running in system tray" but no menubar icon appeared —
the failure was silently swallowed by `catch (err) { return null }`.

This swaps the runtime tray library for `systray2@2.1.4`, which embeds
the maintained getlantern/systray-portable binaries that work on macOS
14+ under Rosetta. Changes:

- hooks/trayRuntime.js: install `systray2@2.1.4` (not `systray@1.0.5`)
  into ~/.9router/runtime/node_modules. Always purge the legacy systray
  package on every run — its binary is broken on macOS and an AV false
  positive on Windows. chmod +x the bundled Go binary in case the npm
  tarball drops the executable bit (observed on macOS).
- src/cli/tray/tray.js: resolveSystray() now prefers systray2 with a
  fallback to legacy systray for safety. initUnixTray() uses the new
  .ready() promise API, surfaces failures to stderr instead of silently
  returning null, and sets isTemplateIcon:false so the full-color
  icon.png renders correctly (template mode would show a solid white
  square because only the alpha channel is used). killTray() passes
  false to systray2's kill so it doesn't call process.exit(0) before
  the rest of cleanup (server SIGKILL, MITM/tunnel) runs.
- package.json: update the `comment_systray` field to describe the new
  package choice.

Fixes #1079
2026-05-13 15:30:33 +07:00
decolua
58788a0d31 TUI Source 2026-05-12 20:26:08 +07:00