* feat(ui): use TruncatedTooltip for truncated labels across the app (MUL-8313)
Replace native title attributes (and one plain Tooltip) whose content only
repeats a truncated label with TruncatedTooltip, so the full text shows in the
design-system tooltip and only when it is actually cut off.
TruncatedTooltip now builds on DeferredTooltip, which gains a shouldOpen
guard, so nothing but the trigger mounts until the first hover. That keeps it
cheap in dense surfaces such as table cells, board column headers, and label
chips.
Co-authored-by: multica-agent <[email protected]>
* fix(ui): open TruncatedTooltip on keyboard focus and wrap long values (MUL-8313)
- DeferredTooltip gains an opt-in openOnFocus path (open on focus, close on
blur, same popup/shouldOpen gates; focus caused by a pointer press stays
closed) and a contentClassName. TruncatedTooltip enables both, restoring
the keyboard full-name tooltip in the project picker.
- TruncatedTooltip lets the bubble break long unbroken values (hashes, URLs)
so they wrap inside the max-width popup instead of overflowing it.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Multica Eve <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(i18n): translate in_review as 審查 in zh-Hant copy
The zh-Hant strings rendered 审核 as the rare form 稽覈. Use 審查,
matching the existing zh-Hant agents and squads copy.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* fix(i18n): align Chinese review request notifications
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: Yushen <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(web): report route labels as GA page_title instead of workspace titles
Co-authored-by: multica-agent <[email protected]>
* fix(web): pin GA page_title via set so navigation updates take effect
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-agent <[email protected]>
* fix(desktop): stop bundled daemon before Windows update install (MUL-7695)
On Windows the running daemon locks the bundled multica.exe. The NSIS
installer only replaces it when it can kill the daemon via PowerShell/CIM;
otherwise its Retry path extracts while ignoring errors and the old daemon
binary silently survives the update (#8823).
Stop the daemon from the app before handing off to the installer:
- "Restart to update": stop an idle daemon and wait for the process to
exit; with active tasks, ask to install now, install when tasks finish,
or cancel.
- Quit-time auto install: stop an idle daemon first; with active tasks,
skip this quit's install instead of letting the installer kill them.
- Bounded by a 15s timeout that falls back to the previous installer
behaviour, and resumes the daemon if quitAndInstall never quits.
macOS and Linux are unchanged.
Co-authored-by: multica-agent <[email protected]>
* fix(desktop): cancel stale update preparation and coordinate quit
Co-authored-by: multica-agent <[email protected]>
* fix(desktop): keep the daemon exit barrier across update flow handoff
A superseding update flow (quit during Restart to update, or a manual
install during a deferred stop) used to abort the old flow, resume the
daemon, and treat the vanished /health endpoint as ready while the old
PID was still holding multica.exe.
- Record the PID and original deadline once an update stop is actually
issued; a successor whose probe finds /health gone keeps waiting on it.
- Handoff no longer resumes the daemon; flows that end without
installing (cancel, wait, busy quit, error) resume it instead.
Co-authored-by: multica-agent <[email protected]>
* fix(desktop): inherit the issued stop barrier while health still responds
A successor update flow only reused the earlier stop's PID barrier when
/health had already vanished. If the same daemon was still answering while
draining, it re-stopped it and restarted the 15s clock, stretching the
agreed upper bound on waiting.
Prefer an existing barrier for the same PID regardless of health, skip
the busy check for a daemon whose stop was already issued, and drop the
barrier only when a different PID is live.
Co-authored-by: multica-agent <[email protected]>
* fix(desktop): keep waiting on a draining PID when a new daemon starts
A different live PID does not prove the previously stopped daemon has
exited: legacy CLIs take no profile lock, so a Start from the runtime card
can bring up a successor while the old process still holds multica.exe.
Track every issued update stop as its own barrier. A successor stops the
new daemon as usual but stays blocked until each barrier PID has exited or
reached its own deadline; barriers are cleared only on a settled result or
when the install is abandoned, and kept when the new daemon is busy.
Co-authored-by: multica-agent <[email protected]>
* fix(desktop): simplify Windows update shutdown coordination
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-agent <[email protected]>
Co-authored-by: Bohan-J <[email protected]>
* fix(runtimes): spell out Qoder Cloud Agents instead of QCA
The UI, docs, landing copy and server messages called the product "QCA"
in labels such as "QCA Agent", "QCA runtime" and API errors like "QCA
token is required". Use the full name Qoder Cloud Agents everywhere a
person reads it, and add it to the brand list in the naming conventions
so the abbreviation does not come back.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* fix(runtimes): refine Qoder Cloud Agents copy (MUL-8282)
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: 安辰 <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: Sol-Boy <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* MUL-8260 fix(web): let the mobile nav drawer scroll as one on short screens
On iPhone Duo's outer display in landscape (368px tall) the drawer's pinned
header and footer left the nav list a three-row scroll window, hiding Issues,
Projects, Agents and the rest. At 640px tall or less the whole drawer now
scrolls as one column; taller screens keep the pinned layout.
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* MUL-8260 feat(web): dock the nav and keep list/detail panes from md up
On iPhone Duo's inner screen held sideways (951px) the nav could only open
as an overlay sheet and the inbox and chat folded to one column, because the
compact breakpoint sat at lg (MUL-5842). Move it to md: from 768px the nav is
a docked column that starts collapsed (the auto-collapse band now spans
md-xl) and the trigger docks it open, and inbox and chat keep both panes.
Below 768px nothing changes.
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* MUL-8260 test(desktop): exercise the compact shell below the new md breakpoint
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* feat(wakeups): accept blocked in --until-issue-state
Lets a coordinator wait for a specific child to reach blocked, alongside the
existing in_review handoff, without waiting for the child to close.
Exact status key match, same as in_review.
Refs #9344
Co-authored-by: multica-agent <[email protected]>
* fix(i18n): keep blocked state key in lowercase English in zh wakeup copy
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-agent <[email protected]>
* feat(web): opt-in Google Analytics via GOOGLE_ANALYTICS_ID (MUL-8253)
Co-authored-by: multica-agent <[email protected]>
* fix(i18n): add missing zh-Hant keys for model override and scheduled wakeup
Co-authored-by: multica-agent <[email protected]>
* fix(web): keep credential-bearing URLs out of Google Analytics
Co-authored-by: multica-agent <[email protected]>
* feat(selfhost): pass GOOGLE_ANALYTICS_ID through compose and helm
Co-authored-by: multica-agent <[email protected]>
* fix(web): stop GA for the document after sensitive navigation
Co-authored-by: multica-agent <[email protected]>
* test(views): await subscription cleanup and dialog focus
Co-authored-by: multica-agent <[email protected]>
* fix(web): stop GA before credential-bearing link clicks and form submits
GA4 enhanced measurement reports outbound/download link_url and
form_destination without a URL change, so signed attachment downloads
leaked their signature. Stop the tag for the document in a window
capture listener before gtag's own listeners observe the interaction.
Object URLs are exempt. Adds jsdom tests and a live gtag.js regression
covering the ~5s batch delay.
Co-authored-by: multica-agent <[email protected]>
* test(web): slim GA tests; move views test fixes to #9555
Drop the opt-in live-tag e2e spec (never runs in CI) and condense the GA
unit tests to the cases that guard against credential leaks. The two
unrelated views test-timing fixes now live in #9555.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-agent <[email protected]>
Co-authored-by: Bohan-J <[email protected]>
* feat(agent): add host-local Devin CLI over ACP
Spawn `devin acp` via the shared ACP client. Local CLI only — not
cloud Devin VMs/Playbooks/Secrets. Model via `devin acp --model`.
Catalog from `devin models list --format json` (families/variants).
* fix: skip Devin ACP handshake when browser auth is also offered
* fix: close dim case string so Devin compiles
Missing quote after dim broke runtime_config.go and every Go CI job.
* fix: stop runtimeConfigPath recursion on Devin
Devin is a builtin whose ProtocolFamily is itself. Recursing on that
overflowed the stack and killed backend-tests.
* test(agent): cover Devin model failures and final-answer delivery
Co-authored-by: multica-agent <[email protected]>
* fix(agent): honor Devin model aliases and stored login (MUL-6623)
Co-authored-by: multica-agent <[email protected]>
* fix(agent): drain Kiro panic details before terminating runtime (MUL-6623)
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Sol-Boy <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* feat(i18n): add zh-Hant locale to web and desktop
Add Traditional Chinese (zh-Hant) as a supported locale with a full
translation of the shared views bundles. Browser tags zh-TW/zh-HK/
zh-Hant now resolve to zh-Hant instead of collapsing to zh-Hans; the
document lang is zh-TW, and docs/use-case links reuse the /zh pages.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
(cherry picked from commit a6b3f6ba53a605c3e06fd6c4d30fd9df6fca8645)
* feat(mobile): add zh-Hant locale
Ship Traditional Chinese bundles for mobile and resolve zh-Hant/TW/HK/MO
device locales to them instead of falling back to English.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
(cherry picked from commit 04563c22662bdb735a9a6c04be784abd9f87da06)
* feat(ui-lab): add zh-Hant locale
Co-Authored-By: Claude Opus 5.5 <[email protected]>
(cherry picked from commit 1351ea572ed5d885d8a29034d6c0317de58641ea)
* feat(server): accept zh-Hant as user language
Co-Authored-By: Claude Opus 5.5 <[email protected]>
(cherry picked from commit 50dfe77a4c45452fc877c62497aba226d5aaa426)
* fix(i18n): sync zh-Hant with upstream copy changes
Upstream added conversation-starter, instruction-preview and board column
strings, removed restated descriptions (MUL-8162) and renamed Qoder Cloud
Agents. Mirror those key additions, removals and rewordings in zh-Hant so
the locale parity test passes.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
(cherry picked from commit 3a97dfc7e0bbf7568925f735c00fc69b6d94313d)
* fix(i18n): add zh-Hant copy for member-scoped runtime visibility
Mirror the runtime visibility "members" choice and the reworded revoke
dialog in zh-Hant so the locale parity test keeps passing.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* fix(i18n): replace Mainland terms in zh-Hant copy with Taiwan usage
Several zh-Hant strings were converted character by character from
zh-Hans and kept Mainland vocabulary, which reads wrong to Traditional
Chinese users: 郵箱 → 信箱, 賬單/賬號 → 帳單/帳號, and similar. Values
only; no keys added or removed.
* fix(i18n): polish zh-Hant copy from review
- 分割槽 → 分區 and 許可權 → 權限 (OpenCC phrase mis-conversions)
- drop stray blank lines before zh-Hant workspace names
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: Multica Eve <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* feat(lark): deliver reply images and files
Based on #8332 by @zprial, addressing its review of bounded delivery,
resource uploads, uncertain sends, file fallback and HTTP boundary tests.
Render bound images with the reply text in one card, pair video/audio
uploads with their message types, preserve pending-send uncertainty and
normalize Markdown destinations before matching bound attachments.
Keep runtime artifact ingestion and deployment-specific configuration
outside this change. Add transport, ownership and rendering regressions
and document the behavior in all supported languages.
* refactor(lark): scope attachment transfer slots to the patcher
The concurrency semaphore was a package-level global while the admission
and pending tiers lived on each Patcher. Move it onto the Patcher so all
three limits share one scope and tests no longer mutate global state.
MUL-8205
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-eve <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* chore(docs): upgrade to Fumadocs 16 and Next.js 16
Fumadocs UI 16 requires Next.js 16, so the docs app moves to Next 16
alongside it (apps/web is already on 16).
- fumadocs-core/ui 15 -> 16, fumadocs-mdx 12 -> 15
- import collections from .source/server and RootProvider from
fumadocs-ui/provider/next
- migrate UI translation keys to the v16 message ids
- rename middleware.ts to proxy.ts per the Next 16 convention
- declare the status, diff and overlay color slots v16 moved out of
preset.css
- keep heading anchors, now rendered as a[data-card], out of the card
styles
- drop the language select v16 adds to the sidebar footer; the docs
settings menu already switches language
* feat(docs): add a kit for click-through product demos
Docs pages can embed small demos that imitate the product and walk the
reader through one action. The kit holds the shared frame (title,
replay, live caption), the coach mark that rings the next control with
a localized "Click" and an arrow, and timeline pieces for runs,
comments and steps. Demos start when scrolled into view, take their
scenario copy per locale, and isolate their stacking so they stay under
the page header.
tw-animate-css provides the enter animations, as in apps/web.
* fix(docs): consistent Steps, Tabs and Accordion styling
- a Steps item is at least as tall as its number badge, so one-line
steps don't stack their badges
- accordion headers (not-prose h3) skip the editorial heading styles
- hide the copy-link button Fumadocs adds beside accordion titles; the
ids stay so links still open an entry
- tab bars end in a hairline that carries the active underline without
overflowing the scrolling bar, and a lone code block in a tab keeps its
inset and border, so every tab group looks the same
* docs: interactive getting-started pages
- concepts: clickable map of the core objects and their relations
- how-multica-works: step-through of one run from issue to result
- triggering-agents: pick a goal, get the way to start an agent,
including issue wakeups
- cloud-quickstart and tutorial use Steps; agent creation, the
runtimes entry and the sidebar paths match the current product
Covers en, zh, ja, ko and fr; copy edited to drop template phrasing.
* docs: interactive workspace, issue and project pages
- demos for member roles, issue statuses, project progress, workflow
handoffs, creating an issue with an agent, deliverable versions and
local directory modes
- new Analytics page with a demo of the usage and errors tabs: cost
estimates, runtime usage, custom prices and per-issue spend
- issues: custom properties, display settings and saved views, peek,
bulk edits and duplicates
- project progress counts the done and closed categories; status
category names, the workflow return label and share links follow the
product; agent moves trigger handoffs too
- project-resources: modes as Tabs, worktree details as Accordions
Covers en, zh, ja, ko and fr; copy edited to drop template phrasing.
* docs: interactive agent pages
- demos for agent Access, creating an agent, adding a skill and a squad
run led by its leader
- agents-create describes the current runtime -> configure -> done flow
instead of the removed start-blank / build-with-AI choice, and covers
workspace-shared MCP servers
- squads: notified members, a three-column re-trigger table, and the
sections the ja/ko pages were missing
Covers en, zh, ja, ko and fr; copy edited to drop template phrasing.
* docs: interactive everyday-collaboration pages
- demos for steering a running agent, mentioning an agent, assigning an
issue, resolving a thread, running a quick action, chat, the chat
message queue and the inbox
- mentioning-agents documents steering and the per-recipient delivery
options; follow-ups no longer always wait for the run to end
- comments: sub-issues created from a thread, the thread minimap and
edit-conflict comparison
- chat: the floating window, draft restore and the message queue
- new page for search, keyboard shortcuts and preferences
- quick actions: the sidebar list is not filtered by invoke permission
Covers en, zh, ja, ko and fr; copy edited to drop template phrasing.
* docs: interactive runtime and automation pages
- demos for a failed run and its retry, a run waiting on an offline
computer, an autopilot run, an issue wakeup and picking a coding tool
- new Issue wakeups page: event, time and periodic conditions,
check-ins, limits, the child_done system rule and its workspace
default, and the `multica issue wakeup` commands
- daemon-runtimes: start at login, local MCP merging, cleanup and
retention, Codex memory defaults, and sharing a runtime with specific
members
- runs on an offline runtime fail only after the reconnect grace
(default 3h); the execution log lists the latest three past runs
- providers and the install guide add ZeroClaw and the model-selection
column; install-agent-runtime uses Steps, Tabs and per-tool Accordions
- the event-filter heading keeps the anchor the product links to
Covers en, zh, ja, ko and fr; copy edited to drop template phrasing.
* docs: interactive integration and app pages
- demos for talking to a channel bot, a merged PR completing its issue
and per-workspace desktop tabs
- the bot guides share one Steps-based layout with their old anchors
- Lark and Telegram attach recent group messages as read-only context
- desktop-app: pinned tabs
- fix stale French GitHub and mobile self-hosting sections, and the
compressed ja/ko Telegram pages
Covers en, zh, ja, ko and fr; copy edited to drop template phrasing.
* docs: restructure self-hosting and reference pages
- self-host-quickstart and troubleshooting use Steps, Tabs and
Accordions with ASCII ids so links open the right entry; code-block
tabs become Tabs like everywhere else
- environment-variables adds the GC, log rotation and per-tool
path/model settings and drops the unused MULTICA_KEEP_ENV_AFTER_TASK
- cli adds issue timeline, issue wakeup, daemon autostart and the
commonly used flags
- fix a corrupted link, flattened code indentation and dead anchors
- translations no longer call GitHub issues "tasks"
Covers en, zh, ja, ko and fr; copy edited to drop template phrasing.
* feat(docs): show the search bar with compact results
The site already served a per-locale search index from /api/search (with
character-level tokenizers for zh and ja), but the layout hid Fumadocs's
search toggle, leaving ⌘K as the only, undiscoverable way in. The toggle
is back: a search bar atop the sidebar on desktop and an icon in the
mobile header.
Fumadocs's default dialog renders every matching paragraph, table and row
in full, which buries the page titles. Like DocSearch and Pagefind,
results now show the page and section titles plus at most three matches
per page, each a two-line excerpt around the match; table rows become one
line with their cells joined. The index and ranking are unchanged.
* feat(selfhost): wire feature flags through Compose and Helm
Feature flags were documented in .env.example but neither self-host
deployment path forwarded them: the Compose backend environment is an
explicit allowlist and the Helm ConfigMap had no flag entries. Workflows
shipped GA in v0.7.0 but stayed hidden on a default self-host install.
- forward MULTICA_FEATURE_FLAGS_FILE and FF_PROJECT_WORKFLOWS_V1 (default
true) from the Compose backend service
- render backend.config.featureFlags as FF_<FLAG_KEY> entries in the Helm
ConfigMap, keep Workflows on for --reuse-values upgrades, and add
featureFlagsFile for operators who mount a YAML rule file
- document flag precedence, self-host defaults, and per-path overrides in
SELF_HOSTING_ADVANCED.md and .env.example
- extend selfhost-config.test.sh and helm-config.test.sh so the wiring and
the documented defaults cannot drift silently again
* docs(feature-flags): add the self-host feature flag reference
Add a Feature flags page under Self-hosting in the documentation site,
translated into all five locales, and link it from the self-hosting
section of every navigation tree. The page covers flag precedence, the
self-host defaults, Compose and Helm overrides, the YAML rule file, and
how to verify a change through /api/config.
* docs(changelog): add workflow general availability to 0.7.0 title
Co-authored-by: multica-agent <[email protected]>
* docs(changelog): drop 'safer runs' from 0.7.0 title
Co-authored-by: multica-agent <[email protected]>
* docs(changelog): drop PR conflict wakeups from 0.7.0 title
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-agent <[email protected]>
* feat: share runtimes with selected workspace members
Co-authored-by: multica-agent <[email protected]>
* refactor(runtimes): one-click private/public and popover member picker
Private and Public apply immediately again (restrictions still go through
the reviewed revocation dialog). Specific members opens a draft popover
with search, Cancel and Save; selected recipients are summarized under
the scope control with an Edit entry point. The editor moves to its own
runtime-access-editor component.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-agent <[email protected]>
* feat(telemetry): report visiting and delegating member counts in self-host snapshot v2 (MUL-8161)
Co-authored-by: multica-agent <[email protected]>
* fix(telemetry): count delegating members from a human-action ledger, drop v1 fallback (MUL-8161)
- member_delegation_day records (member, UTC day) at the human action itself,
so retries, system wakeups and creator-fallback runs never count, and a
comment folded into a queued run keeps both humans and their own days.
- Activity read failures now fail collection and use the existing retry
instead of silently sending a v1 snapshot.
Co-authored-by: multica-agent <[email protected]>
* fix(telemetry): record create-with-assignee, honor DO_NOT_TRACK, build ledger PK concurrently (MUL-8161)
- A member creating an issue assigned to an agent or squad now records a
delegation day, on both the immediate and deferred create paths.
- TaskService.RecordMemberActivity gates the ledger and is set from the
startup telemetry config, so DO_NOT_TRACK stops collection too.
- member_delegation_day's primary key is built with CREATE UNIQUE INDEX
CONCURRENTLY + PRIMARY KEY USING INDEX (589-591), with cleanup registered.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-agent <[email protected]>
* feat(agent): surface Hermes dependency reinstall at launch (MUL-8124, GH #9390)
Hermes prints its launch-time dependency sync only to stderr, which the
daemon forwards at Debug, so the 30-60s rebuild that the per-task Hermes
home triggers when the user's home enables a memory plugin with Python
deps was invisible. Log one Warn when Hermes starts reinstalling (with
HERMES_HOME and a hint) and one when the ACP handshake returns, with
the measured startup delay. Task outcome is unchanged.
Document the cause and the memory.provider workaround in troubleshooting.
Co-authored-by: multica-agent <[email protected]>
* fix(agent): log Hermes reinstall finish when stderr lags the handshake (MUL-8124)
stdout and stderr are drained independently, so initialize can return
before the stderr copier reaches the reinstall marker Hermes wrote
first. Finish then saw no detection and the finish log was lost.
Record the handshake result and time in Finish, and emit the finish log
when the second of (marker, handshake) arrives. Measure the delay from
launch to handshake so it no longer depends on pipe ordering. Adds the
reviewer's repro as an Execute-level regression test plus a unit test.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-agent <[email protected]>
* feat(agents): move conversation starters to the agent profile (MUL-8151)
Starters are what people see in a new chat, not part of the system prompt,
so they now sit in Settings > General > Profile beside avatar, name and
description, autosaved, with a live new-chat preview. The Instructions tab
holds only the prompt in a Write/Preview editor with a pinned save bar. In
the create flow starters are an optional row under Identity.
The chat's Customize link now lands on General; its focus flash no longer
sticks under StrictMode.
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* docs(agents): say where conversation starters are edited (MUL-8151)
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(agents): keep an incomplete conversation starter open until filled in
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(runtimes): rename Qoder Cloud Agent to Qoder Cloud Agents
Qoder's product is called Qoder Cloud Agents, matching how Cursor Cloud
Agents is already spelled in the runtime lists. Update the display name,
default runtime name, error messages, translations, landing copy, docs
and tests.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* fix(runtimes): use Qoder's current logo
Replace the old green Qoder mark with the current monochrome mark from
qoder.com/favIcon.svg. The background is removed, the paths are
minified, and both paths use currentColor so the mark stays visible in
dark mode. It applies to the Qoder, Qoder CN and Qoder Cloud Agents
runtimes.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: 安辰 <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* fix(web): pin Dockerfile.web to node:22.23.4-alpine for Oct 2026 Node security release (MUL-8149)
Co-authored-by: multica-agent <[email protected]>
* fix(desktop): upgrade Electron 39 (EOL) to 44.9.3 (MUL-8149)
Electron 39 is end-of-life and will not receive the 2026-10-21 Node.js
security fixes. 44.x is a supported line (Node 24.22.0, Chromium 152).
clipboard.writeText now returns a Promise in Electron 44; handle the
rejection in the context menu so it can't become an unhandled rejection.
Co-authored-by: multica-agent <[email protected]>
* fix(desktop): skip auto-update on macOS 12 and older (MUL-8149)
Electron 44 requires macOS 13 (Darwin 22), but electron-builder does not
publish minimumSystemVersion in latest-mac.yml, so electron-updater would
download and install a build that cannot launch on macOS 12, replacing a
working app. Disable background checks/downloads on those hosts and make
a manual check report the OS requirement instead.
Co-authored-by: multica-agent <[email protected]>
* fix(desktop): publish macOS update floor in update metadata (MUL-8149)
Review feedback: installed macOS 12 clients run their old updater code,
so a runtime check in the new build can never stop them from downloading
an Electron 44 build that cannot launch. The guard has to live in the
published latest-mac.yml / latest-x64-mac.yml.
- beforePack hook (scripts/mac-update-floor.cjs) adds
minimumSystemVersion: 22.0.0 (Darwin kernel, = macOS 13) to the mac
releaseInfo that electron-builder spreads into update info. The config
schema rejects the key, so it is set on the packager after validation;
the hook throws if those internals move.
- mac.minimumSystemVersion: 13.0.0 for every mac bundle; drop the stale
Intel-only 12.0.0 override in package.mjs.
- Regression test runs electron-updater 6.8.3's real
checkIfUpdateSupported against the published shape: Darwin 21 skips,
22/25 update; no floor or a 13.0.0 floor would let Darwin 21 through.
- Revert the in-app updater.ts guard: it is unreachable on macOS 12.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Multica Eve <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* feat(cli): add comparison operators to issue list --property
`issue list --property` now accepts the comparison spellings #7664
reserved: > >= < <= on number, > (after) and < (before) on date, and ~=
(contains) on text and url. Each comparison is sent as the {op, value}
member the server has accepted since v0.4.38 (#7765); "Name=Value",
__none__ and repeated-flag OR keep their meaning.
A comparison the property's type cannot honour is rejected with the type
named, because the server checks the value shape but not the op against
the definition, and an empty page would read like a real answer. != is
rejected because the server has no not-equal filter, and >= or <= on a
date is rejected with the strict form to use instead.
Closes#7999
* fix(cli): treat multi_text and multi_url as equality-only in property filters
main added the free-form list types (#8559) after this branch was cut, and
the web UI's PROPERTY_FILTER_OPS_BY_TYPE gives them no operators. Without an
entry here a comparison on them reported the type as unknown and told the
user to upgrade an already-current CLI. They now get the same
'only support =' rejection as the other equality-only types.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Nick Webster <[email protected]>
Co-authored-by: Multica Eve <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* feat(server): allow workspace creation only for listed emails (self-host)
Add WORKSPACE_CREATION_ALLOWED_EMAILS. When set, POST /api/workspaces
returns 403 for callers whose email is not listed. Empty keeps the
current behavior; DISABLE_WORKSPACE_CREATION=true still blocks everyone.
No instance-admin role, no domain allowlist, no UI hiding.
Refs #9400, MUL-8136
Co-authored-by: multica-agent <[email protected]>
* docs(self-host): clarify which signup vars /api/config exposes
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-eve <[email protected]>
Co-authored-by: multica-agent <[email protected]>
High and Medium both used text-warning, so in dense issue and project
lists the only difference was one filled bar. Add a --priority-high
token (orange, hue 50, between --destructive and --warning) in light,
dark and the always-light landing block, and point High's icon and
badge at it on web/desktop (issue + project configs) and mobile.
Medium, Low, Urgent and the icon geometry are unchanged.
* feat(runtimes): add Qoder Cloud Agent managed remote execution
* fix(qoder): satisfy migration and localization CI contracts
* fix(qoder): bound execution and scope managed credentials
* fix(qoder): avoid upstream migration number collisions
* fix(qoder): gate issue creation and correlate tool results
* fix(qoder): synchronize guarded issue lifecycle transitions
* test(agent): publish Hermes holder identity atomically
* feat(agents): runtime-first create flow and cloud runtimes section for Qoder Cloud Agent
- Three-step create-agent flow (runtime -> configure -> done) with local,
remote and cloud sections; Qoder connect form inline in the runtime step
- Runtimes page regrouped into remote and cloud sections with Qoder card
- Generalize Qoder storage to cloud_agent_connection (migrations 586/587)
- Locales for en, zh-Hans, ja, ko, fr; desktop and web routes for done step
- Fix status-picker fixture owner_id and diagnostics route coverage after main merge
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* feat(runtimes): unify runtimes page into machines and cloud services
- One Add menu replaces Add remote runtime, the duplicated Add a computer
and the web-only Cloud Runtime header button
- Group by machines / cloud services instead of local / remote / cloud, so
web and desktop share one structure; this device is pinned with a badge
- Cloud services use the machine row anatomy in a single ListGrid table;
unconnected Qoder is a row with Connect, coming-soon providers are rows
- Empty groups show the next step inline; search and online/offline filter
- Rename computer to machine across runtimes copy in all locales
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* test(runtimes): cover unified runtimes page; pin status and action tracks
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* refactor(runtimes): trim redundant descriptive copy on runtimes page
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(runtimes): keep row actions visible at narrow widths
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* refactor(runtimes): align Qoder add-menu item with other cloud services
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(runtimes): close the Qoder dialog after a first-time connection
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* feat(agents): pick the runtime from one grouped list
The runtime step showed four kinds of cards, a comparison panel and
per-section descriptions. It is now one list in the runtimes-page layout:
machines (this one open, others folded to a row) and cloud services. An
unconnected Qoder opens the runtimes-page connect dialog in place and is
selected once it comes online.
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(agents): show owners as 'you' and bare version numbers in the runtime list
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* feat(qoder): disconnect action and dedicated Qoder runtime page
Disconnect removes the encrypted connection and the managed runtime, unbinding
its agents after the admin confirms them. The Qoder row now opens its own page
(status, agents, usage, configuration, pause/resume, disconnect) instead of the
machine layout; generic runtime delete and visibility refuse a managed runtime.
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(agents): land on the done page after creating from step 2 on desktop
Desktop's location is the tab URL, which moves to /agents/new/done/<id>
while the configure page is still mounted. Its missing ?runtime= tripped
the skipped-step-1 redirect and replaced the tab back to /agents/new, so
Create looked like it did nothing. Only redirect on the manual route.
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(agents): show only settings a Qoder agent can run with
The Qoder bridge fails every task whose agent carries a model, thinking or
speed override, env, custom args, custom skills, MCP config or connected
apps, and it runs issues only. The agent detail page still offered all of
those editors, so one save could break every later run.
For a qoder_cloud agent the page now keeps Instructions under Capabilities,
General / Access / QCA Agent under Settings, drops the model rows and the
header model chip, shows the QCA agent in the summary, and locks the
runtime. Other agents no longer see the Qoder runtime in their picker,
since moving onto it needs a QCA agent the server would otherwise reject.
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(agents): hide conversation starters for Qoder agents
Starters only appear in a chat, and the Qoder bridge runs issues only.
The create flow already leaves them out for this runtime.
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* feat(runtimes): show the Qoder connection as cards with per-section editing
The Qoder runtime page rendered the whole connection as one always-editable
form. It now summarizes the connection, repositories and limits as read-only
cards; each section opens its own dialog and saves only that section.
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(qoder): reuse a follow-up session only with the same repository and credential
Resolve repository credentials before deciding to continue a prior session,
and stamp each session with a fingerprint of its repositories, branches and
tokens. A follow-up continues only when the fingerprint still matches, so a
changed repository, branch or rotated/revoked token never rides into an old
session.
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(qoder): keep a paused connection paused when its settings are saved
Saving repositories, limits or the connection no longer re-enables a paused
runtime. Resume goes through a new POST /qoder/resume.
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(agents): drop settings a Qoder agent cannot run when creating one
A draft started on another runtime could carry hidden skills, model
overrides and starters into a Qoder agent that then failed every task. The
create request now drops them for Qoder, and the API rejects skills and
execution overrides on Qoder agents at save time.
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* chore(db): regenerate sqlc models for cloud_agent_connection
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(runtimes): never list the Qoder runtime under Machines
When the server could not run Qoder (no MULTICA_VCS_SECRET_KEY /
MULTICA_QODER_STATE_DIR), the managed Qoder runtime fell back into the
Machines group as if it were a computer.
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* refactor(qoder): drop MULTICA_QODER_STATE_DIR
The managed bridge keeps its run journal encrypted in cloud_agent_connection
and a database advisory lock already elects one supervisor, so the state
directory only held a redundant file lock and acted as a feature switch.
Qoder is now available whenever MULTICA_VCS_SECRET_KEY is set. The
standalone qoder-runtime command still uses its on-disk state_dir.
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(qoder): keep the branch in the session fingerprint after a journal restore
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(agents): validate Qoder agents' effective settings on every write
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: 安辰 <[email protected]>
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
The right-click menu and the matching hover labels were hardcoded English, so zh-Hans, ja, ko, and fr all showed Pin tab, Close tab, and Close other tabs.
* fix(daemon): report the checkout's own repo sync error
ensureRepoReady read the sync failure from a per-workspace slot that any
concurrent background sync overwrote, so a later successful sync of another
repo erased the error and checkout reported only "repo is configured but
not synced". syncWorkspaceReposContext now returns its error to the caller
and the shared slot is removed.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
* feat(server): share SSL_CERT_DIR CAs with daemons for git
Daemons clone with the system git, which never sees the backend's
SSL_CERT_DIR, so a repository on a host with an internal CA could not
sync even after the operator made the backend trust that CA.
The new gitca package mirrors crypto/x509's SSL_CERT_DIR loading, skips
the system directories, and keeps only certificates crypto/x509 trusts.
The register and workspace repos responses carry them as ca_certs. The
daemon writes its system CA bundle plus those certificates to a bundle
file, adds http.sslCAInfo to its git environment, and records it in the
cache and isolated checkout config so agents' fetch and push use it too.
An empty value removes the bundle; Windows daemons skip it.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
* docs: document private CA trust for daemons
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
* fix(daemon): keep operator CA trust and existing checkouts working
Review of the private CA support found two regressions for repositories
that already worked:
- Removing the last backend CA deleted the bundle while existing linked
worktrees and isolated checkouts still pointed at it, so their HTTPS
fetch and push failed. The bundle is now rewritten to the machine's own
trust instead, and each repository drops the reference the next time
the cache configures it.
- The bundle started from the system bundle and was injected through the
environment, overriding an operator's general http.sslCAInfo and any
repository-local value. It now starts from the file a general
http.sslCAInfo names (system bundle otherwise), the environment no
longer carries it, clone passes it with -c, and repository config is
only set where unset and only unset where it is ours. URL-scoped
settings, repository-local values, and GIT_SSL_CAINFO keep precedence.
Isolated checkouts record the setting before their first checkout, which
can lazily fetch from origin, and clones before the refspec migration
fetch.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
---------
Co-authored-by: Iliya Anastasov <[email protected]>
Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
* feat: add workflow management entry to issue properties
Co-authored-by: multica-agent <[email protected]>
* fix(desktop): open non-issue pages in browser from issue window navigation
The issue workflow card's Manage button pushes a settings path. The issue
window adapter silently dropped non-issue paths, so the click only closed
the card. push/replace now hand such paths to the browser, matching the
content-link handler.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-agent <[email protected]>
* fix(desktop): navigate existing reserved workspace slugs
Co-authored-by: multica-agent <[email protected]>
* fix(core): bind workspace slug lookup to the mounted provider (MUL-8028)
- Bind the reserved-slug membership lookup from QueryProvider's effect
instead of createQueryClient(), so StrictMode's discarded extra client
can never become the bound one; unbind is owner-checked.
- Only skip legacy unscoped-link prefixing for a path that is a known
member workspace + workspace route, so /chat in content still becomes
/<current>/chat (chat is not a reserved slug).
- Group the new tests under describe blocks and cover both regressions.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-agent <[email protected]>
Co-authored-by: Multica Eve <[email protected]>
* fix(docs): stop default-locale pages failing hydration with React #418
SSG prerenders each page under its canonical `[lang]` route, so client
components see `/en/agents` as the pathname at build time, while the
browser URL for the hidden default locale is `/agents` (the i18n
middleware rewrites it). Fumadocs resolves the page tree path with
`usePathname()`, and the tree stores default-locale URLs without the
prefix — so the prerendered HTML rendered tree-path fallbacks ("On this
page" in the TOC popover trigger) while hydration resolved the real
page name ("Agents"). The text mismatch threw React error #418 on every
EN page load and React regenerated the whole tree on the client,
dropping SSR-injected elements such as the next/font preload links.
Non-default locales matched on both sides and were unaffected.
Wrap the docs layout in fumadocs' `FrameworkProvider` with a
`usePathname` that strips the hidden default-locale prefix, so prerender
and hydration see the same locale-less path the page tree uses. The
prerendered HTML now carries the real page names as well. Non-default
locales keep their `/zh`-style prefix and behave exactly as before.
Fixes#9243
* fix(docs): preserve static image imports in framework provider
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Bohan-J <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* feat(agent): run Meta Muse Code as an MSP runtime
Muse Code speaks MSP (Muse Session Protocol) over `muse serve`: JSON-RPC
2.0 on stdio, like ACP, but with its own method vocabulary. A session opens
with session/start or session/resume, work is submitted with turn/start, and
assistant text, reasoning and tool calls arrive as transcript items.
The adapter maps those items onto the Backend contract, reads the terminal
turn outcome, and reports a notFound resume as ResumeRejected so the daemon
retries on a fresh session instead of losing continuity silently.
Approval is a session property, not a launch flag: `muse serve` has no
--yolo, and the CLI documents --yolo as TUI-only. A fresh session is created
with approvalMode=allowAll and a resumed session re-asserts it with
session/setApprovalMode, which is what lets a claimed task run without
waiting for a human. The container and per-task worktree remain the
isolation boundary, as they are for every other backend.
commandId must be UUIDv7 — Muse derives a turn id from it and rejects
anything else — so the adapter mints time-ordered ids rather than v4.
The model catalog comes from the session-free model/list query and the pick
is applied through session/start modelId.
* feat(runtime-profiles): allow muse as a protocol family
A custom runtime profile may only be based on a protocol family the daemon
supports, and the database enforces the same list. Widening both keeps the
create flow, the server validation and the CHECK constraint in lockstep with
agent.SupportedTypes.
* fix(muse): complete runtime integration and lifecycle handling (MUL-8057)
Co-authored-by: multica-agent <[email protected]>
* docs(muse): document runtime setup and support (MUL-8057)
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: yushen <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(desktop): require directory-capable Linux file chooser portals
Co-authored-by: multica-agent <[email protected]>
* docs(desktop): record why the Linux portal version switch is set
Name the Electron patch that disables Chromium's own portal version gate,
the StringToUint out-param overwrite that zeroes the minimum, and the
Electron versions still affected, so a future upgrade does not drop the
switch on the assumption that upstream fixed it.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: ZeroIce <[email protected]>
Co-authored-by: multica-agent <[email protected]>
Co-authored-by: Bohan <[email protected]>