* 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(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]>
* 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]>
* 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(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]>
* 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]>
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]>
* 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]>
* MUL-8047: feat(onboarding): open the runtime guide issue directly instead of a welcome modal
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* MUL-8047: chore(onboarding): drop dead option cards, copy, and completion animations
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* MUL-8047: fix(onboarding): reopen the existing guide issue on duplicate
A reload, or a create whose response was lost, leaves the guide issue
from an earlier Skip in place while onboarding is still incomplete; the
retry then hits the server's active-duplicate guard and the step was
stuck toasting forever. Recover the existing issue from the validated
409 body and continue to completion.
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]>
Add the 0.6.1 entry to the four changelog locales and bump the web and desktop package versions to 0.6.1.
Co-authored-by: Yushen <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* MUL-7737: feat(views): address bar for HTML attachment previews
HTML attachments render in a sandboxed srcdoc iframe, so the document's URL
is about:srcdoc and location.search is always empty. A self-contained mock
that picks its screen with `?s=overview` could only show its default screen.
A one-line bridge script placed in front of the author's markup gives the
document a real query and fragment through history.replaceState (Chromium
and WebKit allow an opaque-origin document to rewrite them), resolves
relative pushState/replaceState URLs against the document, reports address
changes to the parent, and turns `?…` link clicks into navigate requests.
The viewer and the full-page preview get a reload button and an address
field after the file name. A new query reloads the document; a
fragment-only change navigates in place. "Open in new tab" carries the
address as `loc`, and the full page keeps it in the desktop tab's view
state across tab switches.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* MUL-7737: feat(views): put the HTML address in the viewer's top bar
The address bar took a row of its own above the document. The file name
in the top bar is the fixed part of the address anyway, so it now is the
address: the query and fragment follow the file name and are edited in
place. A document at its bare address reads as just the file name, so
files that never use an address look as before; hovering or focusing
shows the field and a hint of where to type. Reload joins the HTML view
controls, disabled with them in the source view.
The address state moves from the stage to PreviewPanel, which owns both
the bar and the stage, and resets per file since the viewer pages to the
next file without remounting.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* feat(server): accept JSON Lines in the attachment text preview proxy
The viewer now shows .jsonl / .ndjson files as a tree, so the text proxy's
whitelist takes them too (extension and application/x-ndjson). The whitelist
test gains the CSV / TSV / log / JSON Lines cases and says it is mirrored by
the client-side table in packages/views/editor/utils/preview.test.ts.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* feat(views): table, tree, numbered-line and viewport views in the attachment viewer
MUL-7650, step 3 of MUL-7642. Fills in how the full-window viewer shows the
file types agents produce most.
- CSV / TSV (`table` kind): parsed to a table on the shared DataTable —
pinned header, virtualized rows, resizable columns, a frozen row-number
column. Clicking a header sorts ascending / descending / file order;
numbers sort numerically, empty cells stay last, all-number columns align
right. `;`-separated exports are sniffed. DataTable headers now carry
aria-sort when the table sorts through TanStack's own state.
- JSON / JSON Lines / YAML (`structured` kind): a collapsible tree with
inline previews of collapsed records and paged long lists; Tree / Raw in
the top bar. A file that does not parse falls back to the source and says
why. YAML alias expansion stays capped by the parser.
- Code, text and logs: numbered lines (the number is a pseudo-element, so
copying skips it) with a sticky gutter, and a wrap toggle. Logs and plain
text wrap by default, code does not; the reader's choice carries across
the sequence.
- HTML: Fit / Desktop 1440 / Tablet 768 / Phone 390. A device width lays the
document out at that width and scales it down when the stage is narrower,
with the size and scale shown under it; switching never remounts the
iframe. A source toggle shows the HTML with line numbers.
- Open in new tab works for every previewable kind: /{slug}/attachments/{id}
/preview loads the record by id and renders the viewer's own top bar and
stage (AttachmentPreviewStandalone), keeping the desktop scroll restore for
HTML.
- Whitelist: .jsonl / .ndjson join the text types on both sides, and the
client test mirrors the server's case table.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* docs(license): name Index Labs (Hong Kong) Limited as the producer (MUL-7558)
The LICENSE and NOTICE credited "Multica, Inc.", which is not a registered
entity. Replace it with the company that holds the rights, define "the
producer" (used throughout Part I but never defined), and point to where
commercial licenses and branding waivers are requested.
Co-authored-by: multica-agent <[email protected]>
* feat(web): add licensing and privacy pages, describe Multica as source-available (MUL-7558)
- /licensing: plain-language licensing FAQ with the rule of thumb and common
scenarios, in en/zh/ja/ko.
- /privacy: privacy policy based on what Multica Cloud actually collects;
the Contact Sales privacy link now points here instead of /about.
- About: new "Who's behind Multica" section (team story + contact routes;
team member cards left for later).
- Replace "open source" / "fully open source" with source-available
wording across the landing copy, page metadata, JSON-LD, docs, READMEs,
and the Helper agent prompt, since the license restricts hosted use.
- Contact Sales consent copy says "Multica" instead of "Multica, Inc.".
- Reserve the "licensing" workspace slug for the new top-level route.
Co-authored-by: multica-agent <[email protected]>
* fix(web): drop the Slack users section from the licensing page (MUL-7558)
Co-authored-by: multica-agent <[email protected]>
* fix(web): add the commercial-use FAQ in ja/ko and sharpen the source block headline (MUL-7558)
- ja and ko override faq.items wholesale, so the new "Can I use Multica
commercially?" entry (the FAQ's only link to /licensing) was missing
there. Add it, plus a test that keeps every locale's FAQ in step.
- The source block headline now states the value ("Every line, on your
terms.") instead of repeating the license category.
- Privacy policy: list apps connected through Composio among the
integrations that receive data.
Co-authored-by: multica-agent <[email protected]>
* fix(web): align the privacy policy with what the product actually does (MUL-7558)
Privacy review found promises the code does not keep:
- Workspace deletion removes content from the service, but uploaded files
are not yet erased from object storage and backups keep copies. Say so,
and give an email route for erasing files.
- AI: coding agents send prompts, code, and tool results to their own model
providers; only the Cloud assist features use a provider we pick. Scope
the training promise to Multica.
- Crash reports: redaction filters recognizable emails and credentials in
the error message only, not every field.
- Self-hosted: list the snapshot fields (including the random deployment
ID), and note that AI, integrations, and analytics follow the operator's
configuration.
- Sharing: cover workspace members, admins, and authorized agents; move
legal and M&A disclosures out of the service provider list.
- Add legal bases, consent withdrawal, and the right to complain, plus
retention for billing records and analytics.
Co-authored-by: multica-agent <[email protected]>
* fix(web): build trust-page test dictionaries through createLandingDict (MUL-7558)
main now passes a docs href to each landing dictionary factory, so the
test's single-argument calls failed typecheck. Build the dictionaries the
way the app does, mark the DOM-free test as node, and bring the new French
mobile-app doc in line with the source-available wording.
Co-authored-by: multica-agent <[email protected]>
* fix(web): stop overpromising on data handling and align trust copy with product terms (MUL-7558)
- The commercial-use FAQ now names both license triggers in every locale
(offering Multica to outside users, and embedding it in a product you sell
or distribute); ja and ko read as hosted-only before.
- Replace "your data never leaves your network" and "code never passes
through Multica servers" with what actually happens: agents run on your
machines, workspace content is stored by Multica, coding tools send
prompts to their model providers, and self-hosting keeps workspace data on
your servers. Links to the privacy policy.
- New and changed copy follows the terminology conventions: issue ->
任务/タスク/태스크, agent run -> 运行/実行/실행 (Run in English),
workspace -> 工作区, onboarding -> 上手引导.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-agent <[email protected]>
* docs(i18n): translate documentation corpus to French (MUL-7637)
Add French (.fr.mdx) translations for all 45 docs pages plus meta.fr.json
navigation, mirroring the English source. Product and UI terms follow the
in-app French locale at packages/views/locales/fr/ (issue -> tâche,
run -> exécution, autopilot -> automatisation, Chat -> Discussion,
Settings -> Paramètres, etc.). Status and role identifiers stay lowercase
English per the conventions glossary, with the French UI label shown once
where they are defined.
Co-authored-by: multica-agent <[email protected]>
* feat(docs): serve French docs locale (MUL-7637)
Register fr in the docs i18n config and add the French Fumadocs chrome,
language-switcher label, and home hero copy. Fumadocs maps fr to Orama's
built-in French tokenizer, so search needs no custom localeMap entry.
Co-authored-by: multica-agent <[email protected]>
* feat(i18n): link French UI to French docs (MUL-7637)
Route French users from the landing page, runtime guides, the autopilot
webhook filter help, and the Slack/Lark/DingTalk/Telegram setup links to
/docs/fr. The four integration tabs and the runtime helper each carried a
copy of the same locale-prefix ternary; they now share docsLocalePrefix.
Co-authored-by: multica-agent <[email protected]>
* fix(i18n): localize remaining docs entry points (MUL-7637)
French users still reached English docs from the Help menu, the Agents and
Skills "Learn more" links, and the landing footer. The views links now use
docsLocalePrefix; the landing dictionaries take the docs href from
docsHrefForLocale, so locales that reuse another dictionary (French reuses
English) still link to their own docs.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: multica-agent <[email protected]>
* fix(issues): make the duplicate action read as an action, not a copy (MUL-7349)
The status picker footer borrowed lucide's Copy glyph, which every other
surface in the app uses for copy-to-clipboard (code blocks, API tokens,
webhook URLs), so the row read as "copy this issue". Blend — two
overlapping shapes — is unused elsewhere and says "these two are the
same thing". The banner and the Relations menu item follow so all three
duplicate surfaces share one glyph.
The footer label also rendered muted, which made the only action in the
popover look disabled next to the status rows. Everything else already
matched (14px/400/20px, same icon size and text offset), so only the
colour moves; the icon stays muted like the rows' trailing check.
The trailing ellipsis goes: the footer stands alone under the status
list, where nothing else is elided. The Relations menu item keeps its
own, matching its siblings there ("Set parent issue...", "Add
sub-issue...").
Co-authored-by: multica-agent <[email protected]>
* fix(issues): use CircleEqual for the duplicate icon (MUL-7349)
Blend's two intersecting rings read first as "related" or "mixed", and
the overlap crowds at 14px. A circled equals sign says "these two are
the same thing" and stays legible at menu size. All three duplicate
surfaces switch together: the status picker footer, the Relations menu
item, and the banner above a duplicate's title.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: J <[email protected]>
Co-authored-by: multica-agent <[email protected]>
Add the 2026-09-21 changelog entry in all four locales and set the web and desktop app versions to 0.5.1. Steering is left out — it is not shipping today.
* docs(changelog): add v0.5.0 release entry (2026-09-18) (MUL-7481)
Adds the 0.5.0 changelog entry to all four landing locales and bumps the
web and desktop app versions.
Range v0.4.44 → 594ff89 (55 PRs). Minor bump because the release ships
full French product UI, which is worth announcing on its own.
Left out of the changelog, as agreed on MUL-7481: Triage (triage_v1 not
rolled out), the plugins_v1 / billing_workspace_subscriptions gate error
semantics, UI Lab, CI/test/docs, prompt and skill changes, the Issue
status category migration, and internal performance work.
Co-authored-by: multica-agent <[email protected]>
* docs(changelog): retitle the v0.5.0 entry around agent behavior (MUL-7481)
The title listed the top of `features` and carried a small feature
(Autopilot schedule editing) while leaving out the day's agent work.
Drop the small feature, keep the French UI, and put the agent side in:
runs are both steadier (Grok/Pi/Copilot/Codex/Cursor/Hermes, durable
terminal reports) and leaner — a resumed agent no longer re-reads the
whole Issue and every comment (#8377, #8488). That last one now has its
own improvements line so the title stays backed by the entry.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Sol-Boy <[email protected]>
Co-authored-by: multica-agent <[email protected]>
Co-authored-by: Bohan-J <[email protected]>
* feat(i18n): add French locale
Adds `fr` as a supported UI locale for web and desktop.
- 25 translated resource files under `packages/views/locales/fr/`, at full
parity with the English source (`locales/parity.test.ts` passes).
- Registers the locale in `SUPPORTED_LOCALES`, the views resource bundle, the
settings language picker, and the `HTML_LANG` maps for web and desktop.
- Translates the celestial workspace name list. Proper nouns with no
established French form are left unchanged.
- Landing page: adds the `FR` label but leaves the public `locales` array at
four, since the marketing copy is not translated.
- Onboarding templates map `fr` to English content, matching the existing
fallback for locales without authored templates.
- `pick-locale.test.ts` used `fr` as its example of an unsupported locale;
those assertions now use `es`, plus a new case asserting `fr-FR` resolves
to `fr`.
Terminology follows the glossary in
`apps/docs/content/docs/developers/conventions.mdx`. The UI uses the formal
register (vouvoiement) consistently.
* fix(i18n): translate the backlog status label in French
The French locale translated six of the seven issue statuses and left
`backlog` as "Backlog". The other locales translate all seven — `待规划`,
`백로그`, `バックログ` — so the odd one out was an oversight, not a choice.
`conventions.mdx` does say role and status enums stay in lowercase English,
but that rule is about surfacing the identifier inside prose ("switched to
`in_progress`"), not about the `status` display block, which every shipped
locale translates.
"À planifier" reads as a pair with "À faire" for `todo`, and matches what
`待规划` conveys: the issue exists but is not scheduled yet.
* fix(i18n): realign the French locale with main
Rebasing on main surfaced two drifts that the parity test caught:
- `settings.json` gained `shortcuts.fixed.open_settings` upstream; added
the French string.
- `search.json` lost its `pages.*` block in #7054, which now generates the
command palette's Pages group from the nav registry. Dropped the eight
French keys that no longer have an English counterpart.
* fix(i18n): resync the French locale with main
157 English keys had no French translation and 97 French keys no longer had an
English counterpart. The parity suite caught all of them.
Added: custom issue statuses (76 keys), the Telegram integration (55), issue
revision conflicts and the status catalogue (20), plugin panels and hook
activity (24), revoked agent access in chat (4), autopilot run quota and the
worktree execution mode (2).
Removed: 97 keys upstream has dropped or renamed, most of them under plugins.*.
Two shape changes worth naming, because a key count does not show them:
- plugins.install used to be the string "Install" and is now an object with
title/description/placeholder/review. A locale that keeps the old shape does
not have a missing key, it has a key of the wrong TYPE, and parity alone
stays silent about it — only writing to it fails.
- telegram_bind mirrors slack_bind key for key, so it is derived from the
existing translation with the service name substituted rather than written
again. Two texts that say the same thing drift when they are typed twice.
Register: vouvoiement throughout, consistent with the rest of the locale.
* fix(i18n): complete French locale integration and refresh translations
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Lambda <[email protected]>
Co-authored-by: multica-agent <[email protected]>
Cover v0.4.43 -> 20f20d6bc7 in the four landing
locales and bump the web app version to 0.4.44.
Patch bump: the range is channel work (DingTalk, Lark, WeCom), the Issue status
model, and incremental changes to existing surfaces — nothing that warrants a
standalone announcement.
Left out as unreachable for users after this release: the Triage groundwork
behind triage_v1 (key and helper only, no call sites), the core prompt and
built-in skill guidance changes, and the migration, index, test and CI work.
Self-hosted anonymous telemetry is included, together with its DO_NOT_TRACK
opt-out, since it is on by default and administrators need to know.
Co-authored-by: Sol-Boy <[email protected]>
Co-authored-by: multica-agent <[email protected]>
Cover the v0.4.43 -> HEAD range in the four landing locales and bump the web app version to 0.4.44.
Patch bump: the day is mostly channel work (DingTalk, Lark, WeCom) plus incremental changes to existing surfaces, with nothing that warrants a standalone announcement.
Triage infrastructure behind the triage_v1 flag, the database migration and index work, and the test/CI maintenance PRs are left out: none of them is something a user can reach after this release.
Co-authored-by: J <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* docs(changelog): add v0.4.43 release entry (2026-09-11)
Add the 0.4.43 changelog entry to the four landing locales and bump
apps/web to 0.4.43. Range: v0.4.42 -> 2441638c (origin/main), which is
Wall-E's confirmed da7fc439 plus #8309 merged after the confirmation.
MUL-7291
Co-authored-by: multica-agent <[email protected]>
* docs(changelog): trim the v0.4.43 title to performance improvements
Per review on MUL-7291: drop the tool-output truncation notice and the
long-run stability items from the title and use performance improvements
instead. The corresponding feature/fix lines are unchanged.
MUL-7291
Co-authored-by: multica-agent <[email protected]>
* docs(changelog): cover comment and description annotations in v0.4.43
Range extended to d4493208 (current origin/main): #8274 adds comment and
description annotations, so the entry gains two feature lines and the
title leads with them. #8313 and #8316 are internal and stay out.
MUL-7291
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Sol-Boy <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* feat(web): show a 14-mark provider row in the landing hero (MUL-7251)
The hero listed five runtimes as logo + name pairs, which read as the whole
list rather than a sample of a catalog that is now past twenty. Replace it
with a single row of monochrome marks under a link that states the real
count and points at the provider comparison in the docs.
The marks are the vendors' official artwork reduced to one colour so the row
reads as one system on the photographic backdrop: the app tile dropped so the
glyph inherits currentColor, and for Trae and Hermes — raster-only art — the
image flattened to white. Sizes are tuned per mark because no two vendors fill
the icon box the same way.
Co-authored-by: multica-agent <[email protected]>
* fix(web): pin the hero provider row to 14 x 1 or 7 x 2 (MUL-7251)
Free `flex-wrap` split the 14 marks 13 + 1 near 834px and 12 + 2 near 768px,
and one orphan on the second row reads as a broken layout. Give the row
explicit column counts instead — fourteen once a single row fits, seven below
that — so every width lands on a full row and the columns carry the spacing.
Also swap OpenClaw for OpenCode in the row, as asked. Its two greys become two
opacities of one colour, keeping the solid mark from outweighing the outline
glyphs beside it.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: J <[email protected]>
Co-authored-by: multica-agent <[email protected]>
The landing hero's "works with" list still showed the retired Gemini CLI. Align it with the README and runtime provider list by showing Antigravity with its official mark as a monochrome inline SVG, matching the other hero logos.
* docs(changelog): add v0.5.0 release entry (2026-09-09) (MUL-7190)
Co-authored-by: multica-agent <[email protected]>
* docs(changelog): retarget the 2026-09-09 entry at v0.4.42
Bump the release to a patch instead of a minor, tighten the entry title
in all four languages, and correct the per-thread queueing line: threads
get their own pending slot, but ClaimAgentTask still serializes runs per
(issue, agent), so they do not run without waiting for each other.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Sol-Boy <[email protected]>
Co-authored-by: multica-agent <[email protected]>
Co-authored-by: J <[email protected]>
#8114 landed one commit after the confirmed release HEAD, so the 0.4.41
entry shipped in #8115 did not describe it. Add the Settings grouping,
the single integrations page and the Preferences consolidation to all four
languages, and swap the lowest-impact title item for the reorganization.
Extended range: v0.4.40..53575a2a9 (MUL-7115). Version stays 0.4.41;
apps/web/package.json is already correct from #8115.
Co-authored-by: Sol-Boy <[email protected]>
Co-authored-by: multica-agent <[email protected]>