1711 Commits
Author SHA1 Message Date
7c186016a5 feat(core): multica 1.0 part 1 (MUL-8317) (#9635)
* feat(core): add app space model for rail navigation

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(layout): replace left sidebar with app rail and space panels

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* test(e2e): drive navigation through the app rail

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(layout): finish the rail and panel shell against the mock

- The sidebar toggle always works: in Inbox, Chat and Settings it collapses
  the page's own list column instead of being disabled.
- Move create workspace from the rail into the account menu, and complete
  the menu: profile, theme and language submenus, shortcuts, docs, change
  log, Discord, desktop download, log out.
- Add an explicit New issue button to the Issues and My issues headers.
- Autopilot panel gets a create button and template shortcuts; Team panel
  gets an invite-member button for owners and admins.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(desktop): draw tabs as pills on the title bar

The active tab no longer merges into the content card: with the space panel
inside the card, the merged tab landed over whatever column happened to sit
below it. Every tab is now a pill on the title bar; the active one uses the
card's own surface, inactive ones a lighter tint.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(layout): give list columns the space panel's width

Inbox and Chat defaulted to 260px with their own saved widths, Settings was a
fixed 240px, and the space panel used the sidebar width. They now share one
ListColumn sized by --sidebar-width with the panel's resize edge, so the
divider stays in place across spaces and one drag resizes them all.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(layout): return each rail space to where you left it

Rail items always linked to the space's home, so switching spaces dropped
the project, squad, chat session or settings tab you had open. The shell
now remembers the last page (path and query) per space and workspace, and
the rail links there; the current space's item still leads home, so a second
click resets it.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(layout): animate the list column when the sidebar toggles

Inbox, Chat and Settings unmounted their list column on toggle, so it
snapped away while the space panel slid. ListColumn now stays mounted and
eases its width like the panel (200ms, off under reduced motion and while
dragging), which also keeps the list's scroll position across a collapse.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(layout): one title band for every left column

The space panels used PanelHeader (title-sm, no rule), Inbox and Chat used
the page header (body size, bottom border) and Settings its own 64px title.
PanelHeader now takes a heading level, a leading slot and a meta slot, and
Inbox, Chat and Settings render their list title with it.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(layout): collapse the whole sidebar with one toggle across spaces

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(layout): switch workspaces from one rail tile

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(layout): preview Inbox, Chat and Settings lists on rail hover

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(inbox): keep the list column's own loading skeleton

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(desktop): lay out the shell for the page on screen during rail switches (MUL-8317)

The tab session URL moves before the router commits the next page (it renders
in a transition), so for a few frames the shell already showed the incoming
space's layout around the outgoing page: switching into Inbox or Chat dropped
the Work panel and the old page's header icon jumped to the top-left.

The router now publishes its committed pathname from a layout effect and the
shell's panel and list columns follow it; space memory keeps following the
navigation URL.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(views): flatten the settings nav into one level of section headings (MUL-8317)

Scope header rows, sub-group headings and dividers stacked three levels into
the 240px list column. Every section is now a peer with the space panels'
section label and spacing; each page already names its scope in a badge.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(views): expand projects inline in the work panel (MUL-8317)

Project rows in the Issues panel get a chevron that lists the project's open issues in place, so the sidebar can move between issues without opening the project page. The issue on screen reveals its project and stays lit; expansion persists per workspace. A dedicated open-issues cache follows realtime title patches and refetches only when status or project membership moves.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(views): sidebar tree settings, load more, expandable views and project order (MUL-8317)

- Expanded projects and views list issues from the server (updated date,
  finished statuses hidden) with Load more / Show less.
- One shared issue display popover on hovered expanded projects; a project
  display popover on the Projects header (ordering, statuses, only mine,
  counts); drag to reorder; collapsible section; no project cap.
- Issue rows shimmer and show agent avatars while an agent works or waits.
- Settings, order and expansion persist per workspace.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(views): show sidebar status filters as checkboxes (MUL-8317)

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(ui): auto-collapse the nav only below lg (MUL-8317)

The rail now stays on screen beside the space panel, so laptop-sized
windows (1024-1279px, just under the 1280 desktop default) have room for
the panel; they no longer open Issues with it collapsed.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(views): one Projects display popover, higher-contrast filter chips (MUL-8317)

Issue settings are shared by every project, so they move from each expanded
row into the Projects header popover beside the project settings. Status
filters go back to chips: a solid outline and tint when on, dashed and
faded when off.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(server): list views across scopes and store sidebar view order

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(views): starred views sidebar, unified view header and All views page

- Sidebar Views lists only starred views (built-in and saved, user-ordered)
  with an All views row; order lives in a per-user sidebar preference.
- Issues, My issues and project pages share one header: view name menu,
  folding filter chips (+N), assignee-type / relation chip, Reset and Save.
- Saved-view filters are fully editable; new views are created directly
  and renamed inline instead of through the save dialog.
- New All views directory with tabs, search and star toggles.
- Project page drops the breadcrumb and hides the redundant project chip.
- Remove the view bar, save/manage dialogs and the old headers.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(inbox): switch between inbox and archive with header tabs

Replace the Archived row that trailed the notification list (and the back
row inside the archive) with Inbox | Archived tabs pinned under the list
header. The unread count moves onto the Inbox tab, and an empty archive no
longer says the inbox is empty.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* Revert "feat(inbox): switch between inbox and archive with header tabs"

This reverts commit e8a8e1bcea1bf5b45c4e5830d654523a0b77daff.

Co-authored-by: multica-agent <[email protected]>

* fix(inbox): drop the count beside the no-agents-working filter

The count widened the whole filter menu for a toggle whose result is
visible in the list as soon as it is applied.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(inbox): switch to the archive from the page title

The Archived entry trailed the notification list and scrolled away with
it. The list title is now a menu (Inbox / Archived), so the switch stays
in reach without adding a row, and the archive's back row is gone. An
empty archive no longer says the inbox is empty.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(sidebar): keep a pinned issue lit after its URL turns canonical

The issue route replaces /issues/<uuid> with /issues/MUL-123, but a pin
only matched its own UUID href, so clicking a pinned issue lit the same
issue under its project instead. Issue pins now match the open issue by
id, a lit pin no longer auto-expands its project, and pinned issues show
the running agent the same way tree rows do.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(sidebar): line pinned agent avatars up with the tree rows

The avatar sat inside the gap reserved for the unpin button, so pinned
avatars landed left of the project tree's and the label lost room. A
pinned issue with agents now puts the avatar in the row's right edge and
hands that slot to the unpin button on hover.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(sidebar): raise the contrast of the working-agent shimmer

ShimmerText now reads --shimmer-text-base, --shimmer-text-highlight and --shimmer-text-spread, defaulting to the previous values. Sidebar issue rows (tree and Pinned) rest on faint-foreground and use a 22% highlight band so the sweep is visible at sidebar size; chat, the issue page and other shimmer hosts are unchanged.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(issues): keep the view header from overlapping on narrow widths

The view-name button kept the Button base shrink-0, so once the h1 hit its min width the name painted over the add-filter trigger (visible on a 390px web viewport). The button now shrinks and truncates, the add-filter label becomes screen-reader-only in a narrow header, and FoldingFilterChips re-measures its reserved width when its leading or trailing controls resize instead of only when the chips change.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(issues): one Filter dropdown and a header that adapts to its width

The view header no longer lays filters out as chips with a +N overflow. A single Filter button carries the active count and opens the filter menu, which now lists the dimensions already filtering first, each showing its values, with the scope axis (assignee type, relation to me) at the top. The split is taken when the menu opens so a row never moves mid-edit.

The header measures itself: when the title side runs out of room it first folds the display controls to icons, then the agents chip and New issue, before the title truncates, and only releases a step once the row is wider than the width that forced it. This fixes the overlap in saved views with table controls and after toggling agents working.

FoldingFilterChips and single-row-fit had no other users and are removed.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(sidebar): keep the highlight on the row that was clicked

An issue that is both pinned and listed in the tree always lit its pin, so clicking it under a project moved the highlight away from the row just clicked. The work panel now remembers which section a click on an issue link came from: a click in the tree keeps the tree row lit and the pin unlit, a click on the pin keeps the pin. Arriving any other way (search, a link, a shortcut) still lights the pin.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(sidebar): let Views and Pinned collapse like Projects

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(sidebar): keep a dragged row at its own height while reordering (MUL-8354) (#9662)

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(sidebar): create an issue in a project from its row

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(issues): put the workflow beside the title and set the panel toggle apart

The project workflow now sits on the left with the title and Filter, in
the same borderless style. New issue matches Display's height, and a
divider separates the right-sidebar toggle from the header actions.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(issues): fold the layout switcher into the Display panel

One Display button whose icon follows the layout. The panel opens with
the layouts as a segmented row, then grouping, ordering and sub-issues,
then the current layout's own options. The table's grouping and column
pickers move in from the header.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(issues): keep hovered Display chips from looking selected

Light mode's muted and accent are the same grey, so a hovered chip
matched a pressed one. Hover now only darkens the text and border, and a
pressed chip fills with the stronger input tone.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(sidebar): give the Projects settings the Display panel's controls

Both panels now share one chip and one sort-direction button. The
sidebar popover drops its dividers and dashed off-chips, takes the same
section headings, and its selects match the Display panel's width.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(issues): quiet the issue view header down to its title

The header carried six pieces of text, half of which said nothing: the
project's workflow name, "0 agents working" and "Display".

- Workflow moves into the project title menu as a submenu; the properties
  panel keeps its row.
- Filter becomes an icon beside the title, followed by Reset / Save, so the
  count sits next to the actions it causes. Its tooltip names the active
  filter fields.
- Display and New issue become ghost icon buttons named by tooltips, with
  New issue showing its C shortcut.
- The agents chip shows only while someone is working or its filter is on,
  as avatars and a number.

With every control already an icon, the crowding steps are gone.

MUL-8361

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(issues): is / is not per filter, Relation to me, and a hover summary (MUL-8353) (#9663)

* feat(issues): is / is not per filter, a Relation to me filter, and a hover summary (MUL-8353)

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(issues): match the Relation filter's Chinese labels to My issues (MUL-8353)

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(views): advanced filter mode, menu search, and due date filter

Advanced mode turns the simple filters into a rule tree (match all/any,
is/is not per condition, one level of groups) edited in a panel behind
the same Filter trigger. Switching back is offered when the tree is
something simple mode can say.

The filter menu gets a search box that matches fields and values; a
value hit reads as the condition it adds. Due date joins as a dimension
with relative buckets (overdue, today, this week, next 7 days, none).

The issue table query accepts filters.advanced, filters.due_dates and
filters.today, compiled to SQL with the same IS NOT TRUE negation.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* test(e2e): menu search, due date and advanced filter

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
Co-authored-by: Cursor <[email protected]>

* test(e2e): let menus settle before filter screenshots

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(views): advanced filter keeps status columns, property filters and negated totals

- Columns follow a status the rule tree requires, and a status it names
  un-hides its column, so switching to advanced no longer drops rows.
- Status branch totals drop the excluded keys for "is not" instead of
  falling back to the loaded count.
- The advanced panel shows property filters as editable rows with an
  "Add property filter" entry, and Clear all clears them too.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(views): make custom properties ordinary advanced filter conditions

Properties are fields in the advanced tree: they sit in the field picker
after the built-in fields, can live in groups and follow all/any, and
edit their values with the property's own options. The server compiles a
property:<id> condition with the existing property predicate. Entering
advanced mode moves property filters into the tree, so the separate
property section and its Add property filter button are gone.

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(views): typed filter operators and direct condition groups

- Add condition group inserts an empty group and opens its own add menu,
  instead of asking for a field first. The group's header carries its
  match ("Match any of these"); rows only show the joining word.
- A row's menu can turn it into a group, and a tree with groups reads
  back as one sentence under the rows.
- Operators follow the field's type: is / is not, includes any / none of
  for labels and multi-value properties, contains for text, comparisons
  for numbers, before / after for dates, and is empty / is not empty for
  anything that can be unset. Text, number and date values are typed in
  the row. Every operator is a reading of the stored negated + values, so
  saved views and the server query are unchanged.
- Actor value headings sit in a menu group, which Base UI requires.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(layout): New issue and search at the far end of the desktop title bar

New issue lived only as a pen in the Issues panel header, so Inbox, Team,
Chat and Auto had no way to start an issue but the C shortcut. Search sat
in the rail between the workspace tile and the spaces.

- Desktop: New issue and search are icon buttons at the right end of the
  title bar, styled like Back/Forward, with search last. The tabs give way
  to them. The rail drops search.
- Web has no title bar, so its rail keeps both under the workspace tile,
  New issue first.
- The button does what C does: a project page files the issue into that
  project. Both now share one helper.
- The Issues panel header loses its pen; the page header keeps New issue.

MUL-8359

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(issues): remove horizontal scrollbar from the filter menu

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(sidebar): every view expands in the sidebar

Saved views preview through the table query, which expresses every view filter (is not, relation, due date, rule trees, my-any). Built-in views expand too, scoped like their page and listed with the sidebar issue settings.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(sidebar): group expanded rows by spacing, folder icon for projects

Issues under an expanded row drop to 26px rows with no gap and a 12px status
icon, an open group ends with 8px of space, and the expanded row's name goes
full-strength. Sections sit 20px apart. Sidebar projects show a folder icon
instead of their emoji.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(sidebar): expandable rows give their label the full width

The hidden chevron, an empty spacer and their gaps reserved about 90px at the
end of every expandable row, so names truncated with space to spare. The
chevron now takes the icon's place on hover.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(sidebar): tree row chevron swaps back to the icon immediately

Drop the opacity fades, and show the chevron for keyboard focus only, so a
clicked row no longer keeps it until focus moves.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(issues): drop the hint beside Switch to advanced filter

The grey text sat where the menu shows current values, so it read as a
setting rather than an explanation.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(layout): tighten the gap under panel titles, keep selected rows at regular weight

The first section kept the 20px that separates sections, so it sat far
below the panel title. Selected and expanded rows, desktop tabs, the
Settings nav, agent tabs and the skills file tree no longer switch to
medium weight: the wider glyphs made the label grow when it was clicked.
Selection reads from the background and text colour.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(sidebar): keep stars while loading, leave view state to in-place clicks, page past 100

- Star, unstar and reorder write the stored order, not the resolved items,
  and wait until that order is known, so views still loading are kept.
- Sidebar rows switch the active view only when the click navigates this
  page; a new tab takes its target from the URL.
- Sidebar issue lists walk 100-row pages so Load more keeps growing.
- Drop a trailing blank line in advanced-filter-panel.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(views): open the clicked view in desktop tabs, prepare view state only on in-place navigation

- Desktop tabs carry their own ?view=: list pages adopt it on mount and on
  back/forward, write view changes back with replace, and the active-view
  map is swapped with the active tab. A saved view is part of tab identity,
  so cmd+clicking view B from a tab on view A opens B in a new tab.
- AppLink and useRowLink call onNavigateInPlace right before they push, so
  sidebar and All views rows prepare view state exactly when the page
  navigates in place (desktop shift-click included, web shift-click not).
- Rail items and the workspace tile use named radius tokens.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(views): one page system for lists and objects

Every page now follows the Issues page: one 48px header, nothing stacked
under it.

- Lists entered from the sidebar (agents, squads, skills, runtimes,
  projects, views, autopilots, issue wakeups) title themselves with an
  icon and a scope menu, and keep only icon tools: filter with its count
  and Reset, display, and "+". Counts left the header; list search is
  removed.
- Objects (agent, squad, skill, runtime, autopilot, member) open under a
  breadcrumb with at most one solid action and a ⋯ menu. Their tabs became
  body sections with actions on the section titles, in a 760px column,
  with a 300px properties panel the header toggles.
- Analytics keeps its tabs, now in the header; settings, chat and the
  create-agent flow share the same header.
- Shared CollectionPage* and ObjectPage* primitives in views/layout.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(views): one CollectionList for every list page

Replace the per-page tables and ListGrid with a shared CollectionList in
packages/views/layout: single-line 36px rows with inline grey
descriptions, a shared column/grid template, header sort, row selection
with shift-range, keyboard navigation (arrows, J/K, Enter, X, Cmd+A,
Esc), right-click and kebab row menus, load-more, and a shared batch bar.

- createCollectionViewStore factory in core; display menus are generated
  from the column definitions.
- Agents, Squads, Skills, Projects, Autopilots, Runtimes (page and
  RuntimeList), Views and Wakeups migrate to it; Wakeups pages with
  load-more instead of prev/next.
- The Issues batch toolbar uses the shared CollectionBatchBar.
- Agents hides owner and access by default so the default columns fit at
  1280px; persisted v1 defaults migrate, custom choices are kept.
- Remove ListGrid and the now-unused per-page locale keys.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(layout): smooth the nav panel toggle

- Ease the panel and list columns with a soft-start curve (220ms ease)
  instead of ease-out, whose first frame jumped a quarter of the width
  and, when that frame dropped, nearly half of it.
- End-align the panel content and clip it while it grows, so it slides
  in with the edge instead of spilling under the page; the resize handle
  moves to a zero-width sibling so the clip does not cut it.
- The floating chat stays mounted while closed and re-rendered on every
  frame of the toggle as its container resized; it now re-renders only
  when the clamped window size changes.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(issues): give My agents' work its own URL

My agents' work shared /my-issues with My issues and was told apart only by
a persisted global scope, so it could not open in its own tab, and switching
one tab flipped every other. It now lives at /my-issues?scope=agents: the
page, header and sidebar read the scope from the URL, desktop tab dedupe
keys on it, and the tab gets its own title and icon.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(views): preserve My agents' work in copied links

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
2026-10-31 15:26:51 +08:00
22a05d832b MUL-8423 chore(ui-lab): remove the UI Lab design workbench (#9746)
Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
2026-10-31 14:10:13 +08:00
53c4bbe5cd MUL-8395 fix(lark): distinguish bound bots from verified message reception (#9709)
* fix(lark): verify message reception separately from binding

* fix(lark): preserve verification evidence during rollout

* fix(lark): remove stray space in Chinese verification hint

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: Multica Eve <[email protected]>
Co-authored-by: multica-agent <[email protected]>
2026-10-31 02:05:37 +08:00
77c17eb361 MUL-8410 fix(qoder): run chat turns on Qoder Cloud Agents (#9726)
* fix(qoder): run chat turns on Qoder Cloud Agents

* fix(qoder): address review nits for Qoder chat (MUL-8410)

- Tell the agent the chat audience (group/direct/unknown) like the local
  daemon's chat prompt, so an IM group reply is not treated as private.
- Update the qoder-runtime README: chat turns and chat session
  continuation are supported.
- Show conversation starters and the new-chat preview for Qoder agents,
  and keep starters when creating a Qoder agent.
- PriorSessionID comment covers chats as well as issues.

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: 安辰 <[email protected]>
Co-authored-by: Multica Eve <[email protected]>
Co-authored-by: multica-agent <[email protected]>
2026-10-31 01:29:56 +08:00
16f0d307dd fix(realtime): announce comments folded into a queued run (#9702)
A reply posted while the agent already has a queued run in the same thread is
folded into that run on the server: the reply becomes the run's trigger and the
earlier comment joins its covered set. The run's status does not change, so no
task event fired and open issue pages kept the run under the earlier comment,
leaving the new reply with no visible queue row.

Publish task:coalesced after the merge (and after a delegated-failure merge).
Web and desktop already refresh the issue's runs on any task: event, which moves
the queued block under the newest comment it answers; mobile now listens for it
too.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>
2026-10-30 17:45:54 +08:00
Multica Eveandmultica-agent 354243b459 MUL-8386: feat(cli): add workflow and project workflow commands (#9714)
* feat(cli): add workflow and project workflow commands

Wrap the existing /api/issue-workflows endpoints and the project workflow
switch so agents and scripts can read and change workflows without the
web UI. Permission checks stay on the server.

Refs #9698

Co-authored-by: multica-agent <[email protected]>

* docs(skill): teach the workflow CLI in the multica-platform skill

Workflow edits are rare, so the commands live in the projects reference
instead of the per-turn brief.

Co-authored-by: multica-agent <[email protected]>

* fix(cli): keep the mapping plan when a workflow write needs status mappings

On a 409 workflow_status_mapping_required, project workflow set and
workflow update now print the server's code and full plan to stdout
(JSON, or a table with --output table) and the message to stderr, and
still exit non-zero. The default formatter kept only the first message.

Also fix the zh CLI reference wording for tasks vs runs.

Co-authored-by: multica-agent <[email protected]>

* fix(cli): keep error bodies up to 64 KiB so structured errors parse

newHTTPError kept only 4 KiB of an error response. A workflow's 409
status mapping plan lists one row per status in use and passes 4 KiB at
around 45 statuses; the cut body no longer parsed, so the CLI fell back
to a generic message and dropped the plan.

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: multica-agent <[email protected]>
2026-10-30 17:41:37 +08:00
Multica Eveandmultica-agent f05a525ac8 MUL-8399: chore(release): add 0.7.2 changelog (#9718)
* chore(release): add 0.8.0 changelog

Co-authored-by: multica-agent <[email protected]>

* chore(release): use 0.7.2 as the release version

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: multica-agent <[email protected]>
2026-10-30 17:38:46 +08:00
Bohan Jiangandmultica-agent 374b6f3db4 fix: respect omp profiles when discovering runtime skills (#9711)
Co-authored-by: multica-agent <[email protected]>
2026-10-30 11:36:14 +08:00
Jiahao 139b13a462 MUL-8369: fix(mobile): preserve runs while stop requests are pending (#9670)
* fix(mobile): preserve runs while stop requests are pending

* docs(mobile): clarify cancellation cache synchronization
2026-10-29 17:24:28 +08:00
Bohan Jiangandmultica-agent 46d4e26712 MUL-8347: fix Hermes compatibility with gateway-backed and older ACP (#9666)
* fix(hermes): support gateway-backed and in-process ACP

Co-authored-by: multica-agent <[email protected]>

* fix(hermes): interrupt active task gateways during cleanup

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: multica-agent <[email protected]>
2026-10-29 14:59:57 +08:00
e03dabdade fix(projects): preserve resource cache across concurrent deletes (MUL-8332) (#9633)
* fix(projects): preserve resource cache across concurrent deletes

* fix(projects): address resource deletion review nits (MUL-8332)

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: Sol-Boy <[email protected]>
Co-authored-by: multica-agent <[email protected]>
2026-10-29 13:59:27 +08:00
ec72a00ac3 MUL-8342 fix(daemon): reject legacy DSH profiles (ZIC-374) (#9649)
* fix(daemon): reject legacy DSH runtime profiles

Co-authored-by: multica-agent <[email protected]>

* fix(dsh): show bridge migration steps in refusal notices

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: multica-agent <[email protected]>
Co-authored-by: Sol-Boy <[email protected]>
2026-10-29 13:39:35 +08:00
Spedymax 39d8a11970 fix(issues): restore an archived inbox notification from the issue page (#9653) 2026-10-29 12:27:12 +08:00
f0c361ebca feat(ui): Multica icons, roomier menus and typography pass (MUL-8334, MUL-8338) (#9640)
* refactor(ui): add @multica/ui/icons as the single icon entry point (MUL-8334)

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* refactor: import icons from @multica/ui/icons instead of lucide-react (MUL-8334)

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* chore(lint): ban direct lucide-react imports outside @multica/ui/icons (MUL-8334)

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(ui): draw Multica icons and enlarge primitive icon sizes (MUL-8334)

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(ui): roomier menu and sidebar rhythm (MUL-8334)

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(ui): mark body and detail layers in icon glyphs (MUL-8334)

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(ui): Inter optical sizing, lighter titles, CJK leading and zh-TW font stack (MUL-8338)

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(ui): 13px for in-place reading text, regular weight for descriptive labels (MUL-8338)

Issue detail timeline, comment headers, properties panel, wakeup and PR rows
move from 12px to 13px; sub-issue identifiers match list/board (12px regular);
sidebar group labels drop to regular weight; board card titles get more
leading under a CJK UI via a new cjk: variant.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(ui): tint the active sidebar icon's body with a light fill (MUL-8334)

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(ui): draw every remaining icon and drop lucide-react (MUL-8334)

All 286 icon names now render Multica drawings. The drawings, their
construction helpers and the generator live in packages/ui/icons/drawings;
glyphs.ts and index.ts are generated and a test fails when they drift.
Search loses its lens highlight and Inbox its arrow.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* chore: guard against icon libraries and document drawing new icons (MUL-8334)

Lint bans the common React icon libraries, AGENTS.md points to a new
multica-icons skill, route icons must mark a body for the active tint,
and comments no longer describe product icons as Lucide.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(ui): fill the active sidebar icon solid with its details knocked out (MUL-8334)

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(lint): ban icon library subpaths too (MUL-8334)

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]>
2026-10-28 23:52:28 +08:00
48df977755 fix(views): stop page-switch layout jumps and prefetch page data (MUL-8337) (#9643)
* fix(views): stop page-switch layout jumps from double skeletons and late toolbars (MUL-8337)

Remove the dashboard-level loading.tsx again: it flashed a generic
skeleton on every web route change before the page's own skeleton or
content, the regression #1256 originally fixed. The NavigationProgress
bar now covers click feedback.

Agents, Skills, Squads and Autopilots now keep their list toolbar
mounted through loading so rows no longer drop by its height when data
lands, matching Projects and Issues.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(views): prefetch page data on link intent and hold skeletons for 200ms (MUL-8337)

Sidebar links now warm the destination page's queries on hover/focus,
and the common list pages (agents, skills, squads, autopilots, projects)
are prefetched once the workspace is idle, so most navigations render
from cache in one pass.

Skeletons stay invisible (space reserved) for their first 200ms, so data
that lands quickly swaps straight to content without a placeholder flash.

Co-authored-by: Cursor <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix(views): draw runtimes, inbox and issue-surface skeletons in their real layout (MUL-8337)

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]>
2026-10-28 21:16:01 +08:00
bb3747186e feat: let agents steer running turns they could start (MUL-8285) (#9630)
* feat(server): let agents steer running turns they could start (MUL-8285)

An agent comment can now be added to another agent's running turn, the way
a member steers from the composer: exactly when the comment could start that
agent (canInvokeAgent, judged on the human at the top of the chain), never
its own turn.

- steer_task_ids now work for agent authors; steer: true asks the server to
  add the comment to the current running turn of every recipient without a
  named turn.
- Agent-authored bindings are capped per turn (10) and per authoring agent
  (3). The task row is locked in its own statement before the bind, so the
  cap count sees what an earlier lock holder committed.
- An agent comment that steered a turn but was never read is replayed on
  completion like the mention it replaced. Member receipts keep today's
  behaviour (the member sees the failure and can retry or resend).
- The supplement claim returns author_type and the agent's name. A daemon
  that does not send task-supplement-author-v1 gets the attribution in the
  content, so an agent message never reads as a human's.
- can_supplement on task-runs is computed for an agent caller by the same
  rule.

Co-authored-by: Tim Smart <[email protected]>
Co-authored-by: WitMiao <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(daemon): present an agent's added message as an agent's (MUL-8285)

Claims send the task-supplement-author-v1 capability and render agent
messages as peer input that cannot replace the objective or override humans.

Co-authored-by: Tim Smart <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* feat(cli): add --steer and --steer-active to issue comment add (MUL-8285)

Docs: CLI help, CLI_AND_DAEMON.md, the CLI docs in every locale, the squad
leader briefing, and a steering section in the multica-platform mentions
reference.

Co-authored-by: Tim Smart <[email protected]>
Co-authored-by: multica-agent <[email protected]>

* fix: close the review gaps in agent steering (MUL-8285)

- Replay an unread agent steer even when it reached the turn through an
  implicit route (a worker's reply to its leader): a comment bound to the
  completing run counts as planned input for the replay filter.
- Drop the receipt of an agent steer once completion has replayed it, so no
  client (old or new) offers to resend what the follow-up already handles.
- Never hand an agent's message to a daemon without
  task-supplement-author-v1: it would frame it as a human's. The message
  stays pending, settles when the turn ends, and is replayed as a mention.
- Tell a squad leader about --steer only when its daemon advertises
  cli-comment-steer-v1, since an older CLI rejects the flag; the skill
  reference says to drop the flag on 'unknown flag'.

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: Tim Smart <[email protected]>
Co-authored-by: WitMiao <[email protected]>
Co-authored-by: multica-agent <[email protected]>
2026-10-28 17:09:59 +08:00
4a0c147c50 fix(storage): support GCS S3 XML API signing (MUL-8232) (#9513)
* fix(storage): omit unsigned headers from SigV4 to support GCS S3 XML API

Google Cloud Storage through its S3-compatible XML API mutates the
Accept-Encoding request header in transit (identity -> identity,gzip(gfe)).
Because aws-sdk-go-v2 signs Accept-Encoding into SignedHeaders by default,
this mutation causes HTTP 403 SignatureDoesNotMatch on storage calls.

This commit:
- Automatically excludes accept-encoding from SigV4 signing when
  AWS_ENDPOINT_URL points to Google Cloud Storage (storage.googleapis.com).
- Adds S3_UNSIGNED_HEADERS to configure additional unsigned headers,
  preserving accept-encoding when targeting GCS.
- Strips unsigned headers prior to SigV4 signing while restoring captured
  headers (including Accept-Encoding: identity) on the wire via an HTTP
  client wrapper.
- Documents S3_UNSIGNED_HEADERS across all 5 documentation translations
  (en, zh, ja, ko, fr) with an integrity protection note.
- Adds regression tests for SigV4 omission, wire transmission, and presigned
  X-Amz-SignedHeaders.

Closes #9509

* fix(storage): scope GCS signing workaround to Accept-Encoding (MUL-8232)

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: Sol-Boy <[email protected]>
Co-authored-by: multica-agent <[email protected]>
2026-10-28 17:02:10 +08:00
002b2dcbca MUL-8308: feat(mobile): open historical run transcripts (#9613)
* feat(mobile): open historical run transcripts

Co-authored-by: Cursor <[email protected]>

* fix(mobile): complete historical run transcript behavior (MUL-8308)

Co-authored-by: multica-agent <[email protected]>

* fix(mobile): backfill run transcripts and pair tool results

Co-authored-by: multica-agent <[email protected]>

* fix(mobile): preserve cached transcripts and theme run icons

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: Cursor <[email protected]>
Co-authored-by: Yushen <[email protected]>
Co-authored-by: multica-agent <[email protected]>
2026-10-28 16:14:47 +08:00
b20cea33ad fix(desktop): wait for daemon shutdown before quitting (MUL-8290) (#9590)
* fix(desktop): wait for daemon shutdown before quitting

* fix(desktop): clarify daemon quit progress and dialogs

* fix(desktop): preserve stopped daemon after cancelling quit

* fix(desktop): suppress deferred restart after cancelled quit

* fix(daemon): require explicit cleanup confirmation before quit

Record a profile-scoped, PID-matched shutdown result before releasing the daemon lock. Keep cleanup timeouts and provider cleanup_unconfirmed results sticky, and reject absent, malformed, stale or negative results in the forced stop path.

Co-authored-by: multica-agent <[email protected]>

* fix(daemon): keep unconfirmed cleanup sticky across repeated stops

When a stopped daemon left no matching shutdown result (for example a daemon started by an older CLI, or a stale record from an earlier daemon), the first forced stop correctly failed, but a repeated stop saw an idle profile with no result file and reported success. Record the unconfirmed outcome on failure so cancelling the quit dialog and quitting again still requires an explicit ignore. A profile that never ran a daemon still stops as an idle no-op, and the next daemon start replaces the record.

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: Bohan-J <[email protected]>
Co-authored-by: multica-agent <[email protected]>
2026-10-28 15:29:05 +08:00
3647fd2245 feat(ui): use TruncatedTooltip for truncated labels across the app (MUL-8313) (#9618)
* 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]>
2026-10-28 14:25:41 +08:00
3e4dcef95f MUL-8312: fix(i18n): unify Chinese review copy across clients (#9615)
* 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]>
2026-10-28 13:31:53 +08:00
JimmyChia 8ffcc88dbd fix(desktop): show spelling suggestions in right-click menu (#9608) 2026-10-28 10:10:14 +08:00
Bohan Jiangandmultica-agent d7d1831fcf feat(cli): add run-targeted retries with a fresh option (#9592)
Co-authored-by: multica-agent <[email protected]>
2026-10-27 18:18:32 +08:00
Multica Eveandmultica-agent aec9b0b169 MUL-8287: docs(changelog): release 0.7.1 (#9593)
* docs(changelog): release 0.7.1

Co-authored-by: multica-agent <[email protected]>

* docs(changelog): retitle 0.7.1 and tighten wording

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: multica-agent <[email protected]>
2026-10-27 17:39:22 +08:00
Multica Eveandmultica-agent 317e17f123 MUL-8287: fix(web): stop sending workspace titles to Google Analytics (#9595)
* 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]>
2026-10-27 17:03:32 +08:00
984d9db74b MUL-7695: fix(desktop): stop daemon before Windows update install (#9582)
* 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]>
2026-10-27 15:47:51 +08:00
188971168d fix(runtimes): spell out Qoder Cloud Agents instead of QCA (MUL-8282) (#9581)
* 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]>
2026-10-27 14:06:52 +08:00
73f5664ca4 MUL-8263 fix(agents): reject reserved custom arguments on save (#9560)
* fix(agents): reject reserved custom arguments on save

* fix(agents): validate OMP session arguments before saving

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: Sol-Boy <[email protected]>
Co-authored-by: multica-agent <[email protected]>
2026-10-27 12:59:25 +08:00
bcf40040e0 MUL-8233: fix Pi cancellation and guard unconfirmed cleanup (#9557)
* fix(agent): join Pi cancellation cleanup and guard continuation

Co-authored-by: multica-agent <[email protected]>

* fix(agent): preserve Pi completion and negotiate cleanup

Co-authored-by: multica-agent <[email protected]>

* perf(agent): avoid Pi exit delay and index cleanup guards

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: Multica Eve <[email protected]>
Co-authored-by: multica-agent <[email protected]>
2026-10-27 12:37:13 +08:00
a097f592be MUL-8260 feat(web): fit the mobile web app to iPhone Duo (#9558)
* 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]>
2026-10-26 19:14:36 +08:00
Multica Eveandmultica-agent 7c50af7b66 MUL-8094: feat(wakeups): accept blocked in --until-issue-state (#9553)
* 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]>
2026-10-26 18:20:16 +08:00
2213734215 MUL-8253 feat(web): opt-in Google Analytics via GOOGLE_ANALYTICS_ID (#9544)
* 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]>
2026-10-26 18:04:40 +08:00
e8fdcfd226 MUL-6623 feat(agent): add host-local Devin CLI over ACP (#7485)
* 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]>
2026-10-26 15:11:05 +08:00
21e7299707 MUL-8230: feat(i18n): add Traditional Chinese (zh-Hant) locale (#9507)
* 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]>
2026-10-26 15:09:38 +08:00
8a95f0d3b9 MUL-8205 feat(lark): deliver reply images and files (#9477)
* 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]>
2026-10-26 15:05:40 +08:00
苗大 e13a902f59 MUL-8220: docs: interactive demos, structured pages and docs for undocumented features (#9498)
* 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.
2026-10-26 14:38:47 +08:00
LinYushen cf1b841a88 Revert "MUL-8243: feat(selfhost): wire feature flags through Compose and Helm…" (#9533)
This reverts commit 8981630a87.
2026-10-26 12:41:05 +08:00
wrj97 8981630a87 MUL-8243: feat(selfhost): wire feature flags through Compose and Helm (#9523)
* 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.
2026-10-26 12:40:29 +08:00
Multica Eveandmultica-agent 3de79cbeaf MUL-8216: docs(changelog): add workflow GA to 0.7.0 title (#9490)
* 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]>
2026-10-24 11:32:48 +08:00
Multica Eveandmultica-agent dbdbb29916 MUL-8198: chore(release): prepare 0.7.0 changelog (#9468)
Co-authored-by: multica-agent <[email protected]>
2026-10-23 17:46:12 +08:00
Frezc d651730987 fix(web): normalize whitespace before setting document titles (#9441) 2026-10-23 11:31:31 +08:00
Bohan Jiangandmultica-agent ff674c4e1d MUL-8185: Support sharing runtimes with specific members (#9455)
* 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]>
2026-10-23 09:28:22 +08:00
ZIceandmultica-agent 6b0f8315f6 MUL-7960 fix(mobile): align lint and TypeScript with Expo SDK 57 (#9174)
* fix(mobile): align lint and TypeScript with Expo SDK 57

Co-authored-by: multica-agent <[email protected]>

* fix(mobile): preserve navigation during realtime workspace changes

Co-authored-by: multica-agent <[email protected]>

---------

Co-authored-by: multica-agent <[email protected]>
2026-10-23 07:53:45 +08:00
Multica Eveandmultica-agent 72d9058cc6 feat(telemetry): add visiting and delegating member counts (MUL-8161) (#9435)
* 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]>
2026-10-23 07:40:05 +08:00
Multica Eveandmultica-agent 88de9d3713 feat(agent): surface Hermes dependency reinstall at launch (MUL-8124) (#9434)
* 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]>
2026-10-22 18:59:58 +08:00
029466efb3 feat(agents): move conversation starters to the agent profile (MUL-8151) (#9419)
* 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]>
2026-10-22 15:43:29 +08:00
ac61e5ed32 fix(runtimes): rename to Qoder Cloud Agents and use Qoder's current logo (MUL-8153) (#9418)
* 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]>
2026-10-22 13:57:20 +08:00
ef2d2b3e48 MUL-8149: patch Node 22.23.4 in web image, Electron 39→44 (#9416)
* 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]>
2026-10-22 13:26:40 +08:00
Multica Eveandmultica-agent 2c86a9c3b0 fix(workflows): clarify the send-back handoff copy (MUL-8146) (#9414)
Co-authored-by: multica-agent <[email protected]>
2026-10-22 10:55:54 +08:00
0fc6794821 MUL-7035 feat(cli): add comparison operators to issue list --property (#8001)
* 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]>
2026-10-22 08:55:24 +08:00