You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Bug reporting from the Hub UI and the CLI. A "🐞 Bug report" button in
the Hub opens a dialog where you describe the symptom and the steps to
reproduce; the Hub then opens a pre-filled GitHub Issue form. Everything
that will leave your machine is shown in a preview first. The same flow is
available as many-ai-cli issue (--title / --provider / --dry-run);
under MANY_AI_CLI_AUTO=1 only --dry-run is permitted. Environment
details are gathered through an explicit allow-list (version, OS, arch, Go
version, provider, model, User-Agent, hub port, per-provider last model) —
the config file is never attached. Adds POST /api/bug-report/preview and POST /api/bug-report/finalize
(internal/hub/bug_report_handler.go, internal/report/, cmd/many-ai-cli/issue.go, web/src/app/bug-report-modal.ts).
Optional session-log attachment for bug reports. Off by default. When
enabled, the last 200 lines are redacted and shown to you, and only after
you confirm are they uploaded via gh gist create --secret and linked from
the issue body. Without gh, or if the gist fails, or if the issue URL
would exceed 8192 bytes, the redacted report is written to ~/.many-ai-cli/reports/ instead and GitHub opens with the title only.
Vietnamese language support. Hub UI locale (web/src/i18n/vi.json),
a Tiếng Việt entry in the language selector, automatic selection when navigator.language starts with vi, and vi-VN speech recognition.
Vietnamese translations of the README, CLAUDE.md, and 11 manuals under docs/ are included. The UI locale is at full parity with Japanese and
English (1337 keys each).
Contributed by @ngav1491 in #2.
Copy button on each message in the Grok conversation viewer
(web/src/app/grok-chat-viewer.ts).
include_body toggle in Hub Settings. The notification section now
exposes the notify.include_body config key that was previously only
editable by hand in config.yaml, with a note explaining that enabling it
sends approval questions and completion summaries to an external service.
hub.wrapper_send_write_timeout_sec setting (default 5) for the
WebSocket write deadline used by the wrapper.
Changed
Approval markers are now detected across scrollback. The VT buffer keeps
a 500-line scrollback ring and marker extraction scans 300 lines instead of
the visible 120, so multi-question blocks taller than the terminal (as Grok
emits) are picked up. Native approval detection still looks only at the
current screen, to avoid re-detecting prompts that were already answered
(internal/hub/vt_buffer.go, approval_detector.go, wrapper_loop.go).
The wrapper no longer blocks PTY reads on WebSocket writes. Output now
goes through a bounded 64-slot queue drained by a dedicated goroutine, so a
stalled Hub connection can no longer freeze the wrapped CLI. If the queue
overflows or a send fails, the connection is dropped as a transport fault
rather than silently discarding output, and the existing 64 KB replay
buffer restores a consistent screen on reconnect. The reconnect supervisor
now distinguishes "Hub HTTP is alive but the WebSocket transport is broken"
from a deliberate disconnect (internal/wrapper/wrapper.go).
AI-generated commit messages now follow Conventional Commits. Subjects
are <type>(<scope>): …, where the scope is the first non-generic segment
of the deepest common directory (src / internal / cmd / pkg / lib
are skipped, so web/src/app yields app). The verb is chosen from ten
candidates including new move, simplify, and handle detections
(internal/hub/git_commit.go).
The session list no longer reorders cards when approvals arrive. Cards
keep their position; pending approvals are indicated by the badge and the
per-project pending count instead. Summary counts are localized and collapse
to numbers only when space is tight (web/src/app/session-list.ts).
Working-directory favorites in the spawn panel are sorted automatically
by folder name (ties broken by full path) instead of being manually
ordered, and every row now commits on mousedown
(web/src/app/spawn-panel.ts).
Task-completion notifications no longer send the summary body by default. SendDone now follows the same opt-in rule as approval notifications: only session #<id>: <status label> is sent unless notify.include_body is
enabled, and when it is, the summary goes through MaskSecrets first.
Previously the raw summary was sent to ntfy / webhook with truncation only.
Fixed
The ✕ on the action bar now suppresses the approval the same way the
"✕ approve" control next to the input does. Previously it only hid the bar
for 60 seconds, so the same question reappeared once the timer expired.
The action bar could stay hidden after switching back to a session when the
Hub had already delivered that marker. It is now redrawn whenever the bar is
empty or not visible (web/src/app/approval.ts).
A free-input option ("N. User specifies") was dropped when a single-section Q1-style block was flattened, so no free-input control appeared on the
action bar (web/src/app/approval-parser.ts).
PTY resize suppression while the approval bar is shown was cut from 60
seconds to 350 ms, followed by one authoritative viewport-size update. This
stops Codex from redrawing against a stale row count and fossilizing blank
lines into the scrollback (web/src/app/terminal.ts).
The preamble panel could not be expanded after being drag-resized, because
the inline max-height survived; wheel events inside it no longer propagate
to the terminal.
Approval summary cards no longer stretch vertically and leave a large gap in
column layouts (web/src/styles/approval.css).
Dragging to select text in the Grok conversation and history viewers no
longer clears the selection through focus recovery
(web/src/app.ts, web/src/app/attachments.ts).
Session-dismiss no longer reorders other project groups. Dismissing a
session in one project group used to bump neighbouring groups up/down
because their keys were not yet registered in groupOrder. Unknown keys
are now auto-appended so the visible ordering is stable across dismiss /
spawn cycles (web/src/app/session-list.ts).
Auto-dismiss after Claude Code exits is now 24 h, not 5 s. The
previous 5-second timer removed sessions from the list while the user
was away from the desk, hiding recent exit context. Long-running desks
now keep the finished session visible for up to a day.
Codex synchronized-update sequences pass through to xterm.js 6.0.0. ESC[?2026h / ESC[?2026l were being stripped, causing Codex to
redraw past output line-by-line on every turn. The sequence is now
forwarded so xterm.js batches the repaint as intended.
/api/debug/batch-log diagnostic endpoint. Temporary read-only
endpoint for investigating the batch-approval action-bar redraw path;
it will be removed once the underlying issue is confirmed fixed.
Removed
Drag-and-drop reordering of working-directory favorites in the spawn panel,
superseded by automatic sorting (see Changed).
Security
All bug-report output is redacted at every boundary — preview, finalize,
issue URL, and local fallback all pass through internal/report/redact.go.
It masks provider and platform tokens (sk- / sk-ant-api*, ghp_ and the
other GitHub prefixes, glpat-, xox[abprs]-, AIza, hf_, npm_, pypi-, xai-, gsk_, AWS key ids, JWTs, PEM private key blocks),
generic secrets (?token= / Bearer / key: value pairs / credentials in
URLs), private paths, home directories (so the account name never leaks),
non-loopback IP addresses, email addresses, and private hostnames.
Attaching a session log requires a single-use preview token (32 random
bytes, 15-minute TTL, constant-time comparison), so a gist is only created
for content that was actually shown to you. Log reads are restricted to .jsonl files under <log_dir>/sessions after symlink resolution, capped
at 512 KB, and returned gist URLs are strictly validated.
F1: internal/hub/doctor_handler.go now threads r.Context()
through the diagnostics HTTP calls instead of context.Background(),
so a cancelled client no longer leaks probe goroutines.
F3: internal/hub/grok_history_handler.go returns early when os.UserHomeDir fails instead of walking an empty root, which used
to expand into the process CWD on some Windows setups.
F9: internal/usagerelay validates that the injected hubURL
resolves to a loopback address before forwarding, closing an SSRF
surface exposed to co-tenant processes.
F10: HTML escaping for approval / bug-report previews is now
served by a single local escapeHtml helper that also escapes
single quotes, replacing three drifting per-file copies.
F14: privateNetworkBlockingDialContext now resolves the
hostname itself and dials the verified IP directly, eliminating a
DNS-rebinding TOCTOU window between the allow-list check and the
real dial.
F15: handleNotifyConfig now routes the incoming payload
through validateNotifyBackend, so an invalid backend combination
can no longer be persisted to config.yaml and crash on next load.
F18: handleAuthLogin performs a strict PIN pre-format check
before hitting the crypto compare path, rejecting malformed input
without touching timing-sensitive code.
F35: WSL "open dir" now spawns explorer.exe <path> directly
instead of cmd.exe /c start "" <path>, closing a
command-injection surface on paths containing & / | / ".
Updated golang.org/x/crypto 0.52.0 → 0.54.0, golang.org/x/net 0.55.0 →
0.57.0, golang.org/x/sys 0.45.0 → 0.47.0, golang.org/x/term 0.43.0 →
0.45.0, and modernc.org/sqlite 1.51.0 → 1.54.0. Note that GO-2026-5932
(x/crypto) has no fixed release upstream yet; govulncheck reports it at
module level only and the affected symbols are not called by this project.