Adds the self-built operations UI served from the app origin under the
reserved /admin slug: overview, users (with disable/enable and token
revocation), workspaces, audit log, and platform admin management. The
shell gates on /api/admin/me, sends signed-out visitors to /login, and
hides writes a viewer cannot perform; the server enforces the same roles.
Core gains an admin API client with zod-validated responses, query
options and mutation hooks; views add the pages and copy in all five
locales.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
Claude-Session: https://claude.ai/code/session_01FrVjAFWeckYV69HS51xUhy
Adds the market_v1-gated Market browse, listing, and install-check pages in
@multica/views/market, wired into web routes, desktop routes, the sidebar,
search, tab subjects, and link handling. The install check renders the
preflight report with its runtime and model choices kept in the URL; a ready
report says the workspace can accept the listing and offers no install.
Co-authored-by: klinsmaya <[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]>
Adds the 2026-09-07 entry to all four language sites and bumps apps/web to 0.4.41.
Range: v0.4.40..d753c7d7840f56cc82f82a6cfe90bdc52e06dd19 (MUL-7115).
Excludes the two changes users cannot perceive: the agent runtime brief /
built-in skill guidance (#8102) and GitHub PR refresh replica routing (#8096).
Co-authored-by: Sol-Boy <[email protected]>
Co-authored-by: multica-agent <[email protected]>
Localize the web auth callback, 404 page, and root error boundary, plus the shared section-level ErrorBoundary.
Also fixes several pre-existing auth-path bugs surfaced during review:
- access_denied was unreachable (the !code branch preceded the error-param check)
- UserLocaleSync's reload could replay a consumed OAuth code and show 'Login Failed' after a successful sign-in
- Google token-exchange and userinfo provider failures were misreported as user-actionable causes
- checkSignupAllowed reported 'registration is disabled' for an allowlist miss
* fix(i18n): finish the MUL-5703 glossary rollout across ja/ko and docs (MUL-6896)
MUL-5703 settled the rule — the issue entity is translated (任务 / タスク /
태스크) and the agent run keeps `task` / 作業 / 작업 — but only ever landed in
the zh-Hans UI. Everything else drifted:
- ja/ko shipped 39 UI strings that still spelled the entity in English
(`issue`), or as イシュー / 課題 / 이슈.
- zh and ja spelled the *run* with the *issue* word in the project worktree
copy and in the MCP delete dialog — the exact collision MUL-5703 exists to
prevent. ko already had this right (작업).
- ko wrote runtime-health "issues" as 이슈, so a machine card read as the
entity. zh/ja use 异常 / 問題, and ko's own health_clear already said 문제.
- `conventions.ja.mdx` / `conventions.ko.mdx` still documented the *pre*-
MUL-5703 rule ("issue stays English"), contradicting the en/zh glossary.
- The docs prose sweep the glossary calls "being swept separately" never
happened: ~471 English `issue` in zh, ~414 イシュー in ja, ~418 이슈 in ko.
Sweeping the entity into 任务 / タスク / 태스크 forces the run to move too —
zh docs wrote it 执行任务, ja 実行タスク, ko 실행 태스크, all of which collide
with the entity word once the entity lands there. So the run is rewritten to
`task` / 作業 / 작업 in the same pass, matching what each UI already shows.
Standalone labels keep the English source's capitalisation (`Task` page
title and links); inline mentions are lowercase, like `skill`.
Also corrects the en source for two squad strings: squads receive *issues*
and the leader delegates *sub-issues*, not "tasks" / "sub-tasks". The three
translations already said the entity, so only en moves.
Not touched: the landing changelog archive, the generic English noun "task"
in chat/onboarding marketing copy, `issue` in the "problem" sense, and the
unrelated structural drift in the ja/ko conventions pages (they are missing
the "Runtime display names" section from an older sync).
Verified: 4907 views tests pass including locale parity, typecheck and lint
clean, go build plus the integrations/cli suites pass, and no doc anchor
broke (checked before/after).
Co-authored-by: multica-agent <[email protected]>
* fix(docs): sweep the last old run-word leftovers in zh copy (MUL-6896)
Review caught the docs home page still linking "[执行任务](/tasks)" while ja/ko
had already moved to 作業 / 작업. Four more of the same class turned up next to
it: the same link in README.zh, "任务生命周期" in VISION.zh (en: "the task
lifecycle"), and two redundant "task(task)" glosses the sweep produced where
the source had written "执行任务(task)".
With these, `执行任务` / `実行タスク` / `실행 태스크` are gone repo-wide, so the
"prose now follows the table" line added to conventions.mdx is true.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: J <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* test(wecom): move the relay claim tests off a shared Redis DB index (MUL-6890)
The relay outcome tests keep their claims in Redis DB 12, which
internal/service also takes for its own suite — and both flush that DB on
entry and exit. `go test ./...` runs packages concurrently, so a flush from
one package can delete a live delivery claim held by the other, and the
publisher's outcome watch then reads an absent claim as "nobody delivered"
and counts a drop for a reply the holder had already sent.
That is the intermittent `outbound_dropped on the publisher = 1, want 0 —
it was delivered` on main. Reproduced by running internal/service's
Redis-backed tests alongside this one; fixed by giving the package an index
nothing else uses, with the current allocation written down so the next one
does not collide either.
Co-authored-by: multica-agent <[email protected]>
* build(turbo): generate fumadocs .source once instead of racing (MUL-6890)
`build` and `typecheck` both ran `fumadocs-mdx` before their real work, and
turbo is free to run those two tasks for the same package at the same time.
fumadocs-mdx regenerates `.source/` by removing the directory and writing it
back, so the two processes fight over one tree: whichever one mkdir's first
can have it deleted underneath, and its write dies on `ENOENT: no such file
or directory, open '.source/index.ts'` — the frontend-build failure on main,
which is pure timing and passes on a rerun.
Move the generation into its own `mdx` task that both depend on. It runs
once, its output is cached like any other task's, and the two consumers can
still run concurrently. Packages with no `mdx` script are unaffected: turbo
skips a dependency nobody implements, the same way `cache-inputs` already
works here.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: J <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* docs(changelog): add v0.4.36 release entry (2026-08-28)
Add the 2026-08-28 changelog entry in en/zh/ja/ko and bump apps/web to 0.4.36.
MUL-6787
Co-authored-by: multica-agent <[email protected]>
* docs(changelog): drop unreleased billing items from v0.4.36 entry
Cloud billing is still in staging and has never shipped, so the Issue count
limit and its upgrade path must not appear in the public changelog. Retitle
around the changes that are actually live.
MUL-6787
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Sol-Boy <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(desktop): share public web URLs
* fix(navigation): keep the current fragment in shareable URLs
Rebuilding the current page from `pathname` + `searchParams` alone dropped
the fragment, so feedback sent from a `#comment-…` deep link reported the
whole issue and the maintainer lost the position the reporter was at. Web
regressed too: it previously submitted `window.location.href`, fragment
included.
The fragment cannot be read from `window.location` on desktop — the
renderer is a MemoryRouter over the packaged `file://` page — so the
platform boundary has to carry it. `NavigationAdapter` now reports `hash`
alongside `pathname` / `searchParams`, and `currentPath()` composes the
three so no caller has to remember the fragment again.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: J <[email protected]>
Co-authored-by: multica-agent <[email protected]>
Preload the above-the-fold landing background so it starts downloading alongside
the product preview instead of after it, shortening the black-fallback window on
cold loads. Also declares an explicit `sizes="100vw"` on the backdrop and moves
the product preview off the deprecated `priority` prop onto `preload`.
Co-authored-by: Binteng <[email protected]>