Skip to content

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 06 Jul 06:10

Removed

  • Workbench tab and Hub-internal chat proxy retired. The Workbench tab
    (SQLite-backed session history browser, timeline/summaries/redacted exports,
    prompt templates, task/policy notes, diagnostics, usage summaries,
    stale-session and worktree helpers) and the associated /api/workbench/*
    routes have been removed. The Hub-internal chat proxy that intercepted
    ANTHROPIC_BASE_URL / OPENAI_BASE_URL to capture request payloads
    (internal/proxy/, internal/hub/chat_proxy*.go) has also been removed;
    wrapped claude / codex sessions now talk directly to the upstream API.
  • Side effect: Sonnet 5+ default 1M context restored under the Hub. Because
    Claude Code no longer sees a rewritten ANTHROPIC_BASE_URL pointing at an
    unknown gateway, it stops downgrading to the 200K cap and honours the
    Sonnet 5-era default 1M context window again. No more per-model
    claude-sonnet-5[1m] workaround. Ollama / LM Studio routing (which legitimately
    needs a rewritten base URL) is unaffected.
  • Temporary /api/debug/cursor-hide-log diagnostic endpoint (introduced and
    removed within the v0.4.0 cycle).

Added

  • Grok Build CLI provider support. many-ai-cli grok (and wrap grok)
    now wraps xAI's official grok terminal coding agent in a PTY, joining
    Claude Code / Codex CLI / GitHub Copilot CLI / Cursor Agent CLI as the fifth
    supported provider. It is handled like Cursor Agent — grok --model <id>
    passthrough with no route or env injection, the shared approval-rules block
    injected into the project-root AGENTS.md, and official approval patterns
    from resources/approval-patterns/grok.md. /api/spawn validation,
    diagnostics, slash-command/approval-pattern sources, and the model picker
    were extended accordingly. Requires a SuperGrok or X Premium+ subscription;
    many-ai-cli never reads, stores, or proxies xAI session tokens.
  • opencode CLI wrapper. many-ai-cli opencode (and wrap opencode) wraps
    the community opencode CLI in a PTY. Instead of pattern-scraping approval
    prompts, the Hub writes the provider's own opencode.json (permission
    field) into the session cwd: normal sessions get ask (surface the approval
    to the Hub UI), while orchestration child sessions get allow (bypass the
    provider's own approval so the conductor stays in charge). The original
    opencode.json is restored on session end.
  • Light orchestration API. POST /api/sessions/:id/spawn-child lets a
    conductor session spawn child AI sessions with a role, provider, model,
    initial prompt, and optional cwd. The Hub creates
    ~/.many-ai-cli/orchestration/<orchestration_id>/board.md, injects the
    board path into the child prompt, and watches the board for appended
    progress and ## DONE <role> session=<child_id> markers. When the parent
    cwd is a git repository, children run in dedicated worktrees under
    .many-ai-cli/worktrees/<orchestration_id>/<role> by default. The Hub does
    not auto-merge child branches; the conductor / user decides what to merge.
    Also ships companion improvements: send-side duplicate guard, idle-false-
    positive suppression, board notification path isolation, and a
    waitForInputReady staleguard (internal/wrapper/staleguard.go).
  • VT-based approval marker detection. In addition to the existing
    xterm.js buffer scan, the Hub now detects [MANY-AI-CLI] markers directly
    from the Hub-side VT stream (internal/hub/approval_marker.go). This
    catches approval prompts that the pure xterm scan used to lose to CUP
    positioning or the cursor-hide filter (a recurring class of v0.3.x bugs).
  • Configurable Ollama daemon base URL. ollama.base_url in
    ~/.many-ai-cli/config.yaml can now point Ollama routing at any HTTP(S)
    daemon reachable from the Hub process, not just localhost:11434. This
    supports host/guest setups such as Windows host + Hyper-V guest or Windows
    host + WSL guest: /api/models reads <base_url>/api/tags, Claude Code gets
    ANTHROPIC_BASE_URL=<base_url>, and Codex gets
    OPENAI_BASE_URL=<base_url>/v1.
  • Mobile UX overhaul. A dedicated mobile home screen
    (web/src/app/mobile-home.ts + web/src/styles/mobile-home.css), a
    lightweight mobile terminal (mobile-terminal-lite.ts), and a mobile
    transcript view (mobile-transcript.ts) replace the previous
    responsive-only layout. The redesign covers the approval sheet, drawer,
    swipe-based navigation gestures, and PWA polish (manifest, icons, service
    worker updates).
  • Claude Code skill-derived slash-command auto-discovery.
    internal/hub/slash_cmd_fetch.go (discoverSkillSlashCmds) walks
    ~/.claude/skills/*/SKILL.md and surfaces registered skills in the Hub's
    slash-command listing.
  • Attachment filename sanitization. sanitizeFilename in
    internal/attach/store.go keeps the original filename visible while
    stripping path-traversal and unsafe characters from the on-disk path.
  • Consolidated build info. internal/hub/buildinfo.go centralizes the
    version / build metadata exposed by /api/info and the About panel, so the
    ldflags-injected values have a single source of truth on the server side.
  • Session log noise filter. A repetitive-progress-line filter is applied
    when writing the clean transcript (internal/sessionstore/store.go +
    noise_output_test.go), so re-drawn progress bars no longer dominate the
    saved .txt.
  • Regression tests for input splitting (internal/wrapper/input_split_test.go)
    and the cursor-hide filter (web/src/app/cursor-hide-filter-fixtures.ts).

Changed

  • README (English / Japanese) opening hook rewritten around "run multiple AI
    CLIs in parallel and approve from your phone" so the primary value
    proposition is clear from the first paragraph.
  • Ollama routing env-var assembly now flows through
    EnvPresetForWithOllamaBase, deriving ANTHROPIC_BASE_URL /
    OPENAI_BASE_URL from ollama.base_url in one place.
  • Windows resource metadata (winres/winres.json and the regenerated
    rsrc_windows_*.syso) is bumped to 0.4.0 so the executable properties
    dialog matches the release tag.
  • The session-list / spawn-panel / settings / terminal / token-statusbar
    frontends were reorganized to share layout primitives with the new mobile
    UI without regressing the desktop Hub.

Fixed

  • Hotfix → develop merges no longer leave the develop-side version constant
    stale (develop-version-stale-v0.3.4).
  • Cursor Agent no longer drops chunks of larger inputs that contain a Ctrl+U
    (cursor-agent-ctrl-u-chunk-input-drop).
  • Grok history viewer no longer renders blank rows caused by leftover SGR
    state (grok-history-viewer-sgr-blank), and the Grok build display label
    no longer breaks alignment (grok-build-display-label).
  • Grok responses and opencode pickers are no longer eaten by the cursor-hide
    filter (grok-response-discarded-by-cursor-hide-filter,
    opencode-picker-discarded-by-cursor-hide-filter).
  • The orchestration conductor's initial prompt is now submitted with an
    Enter (orchestration-conductor-initial-prompt-not-submitted), and
    codex child sessions spawn reliably again
    (orchestration-codex-child-spawn-failures).
  • Mobile drawer no longer shows a transparent background layer or lingers on
    PC-width viewports (mobile-drawer-bg-layer-transparent,
    mobile-drawer-residue-on-pc-width). The floating hamburger, header height,
    and tab bar dead space were also fixed
    (mobile-header-band-floating-hamburger, mobile-header-height-reduction,
    mobile-header-tab-bar-dead-space).
  • Empty input bar no longer renders a stale placeholder height
    (input-bar-empty-placeholder-height), and clicks in the empty wrap area
    no longer lose focus (input-wrap-empty-area-focus).
  • The Hub marker filter no longer swallows CUP positioning, so layouts
    driven by cursor positioning stay intact
    (hub-marker-filter-strips-cup-positioning).
  • Batch approval Q-tabs no longer overflow the action bar
    (batch-approval-tabs-overflow), and marker blocks no longer collapse
    onto a single line (marker-block-line-collapse).
  • The spawn cwd chip no longer collides with a full-path prefix
    (spawn-cwd-chip-fullpath-prefix-collision).
  • Approval popups no longer leak across sessions
    (approval-popup-cross-session-leak).
  • Local-LLM routing fixes for Qwen via LM Studio / Ollama
    (local-llm-qwen-lmstudio-ollama-unusable).
  • WebGL terminal renderer works again (vendored xterm.js generation mismatch).
    The vendored xterm-addon-webgl.min.js had been updated to 0.19.0 (the
    xterm.js 6.0.0 generation, which requires the mainDocument API of the
    terminal core), while xterm.min.js and the fit / unicode11 / web-links
    addons were still the older 5.x-generation files — only the license ledger
    and the About dialog had been bumped to 6.0.0. Every loadAddon call then
    threw Cannot read properties of undefined (reading 'createElement') inside
    the addon, so the UI silently fell back to the DOM renderer on each session
    switch, re-introducing the fullwidth-glyph / selection-highlight drift the
    WebGL renderer exists to fix. The vendored core (xterm.min.js,
    xterm.min.css) and the three addons are now the actual 6.0.0-generation
    artifacts, matching the ledger.
  • Orchestration fallback ID no longer collides across Hub restarts. When a
    conductor started a child via spawn-child without going through
    /api/orchestration/create, the orchestration ID was s<parentSessionID>
    (e.g. s3). After a Hub restart the session number was reassigned from #1,
    so the same conductor session ID could reuse the previous run's
    ~/.many-ai-cli/orchestration/s<N>/board.md (header/purpose stayed from the
    old run) and its child-<sessionID>.md history. The fallback is now
    s<parentSessionID>-<UnixNano>, which is unique per Hub start. Existing
    s<N>/ folders are harmless leftovers and can be moved aside or deleted
    manually.
  • No more scroll residue when switching between terminals. attachTerminal
    used to append the terminal DOM node first and then flush the buffered
    chunks that had accumulated while the tab was hidden, which made the target
    tab briefly show the pre-switch viewport and then scroll down through the
    buffered output. flushPending now takes an onDrained callback, and
    attachTerminal flushes first — appending the container, releasing hidden
    WebGL renderers, scrolling to the bottom, and fitting the terminal only
    after the buffered chunks are fully written.