mirror of
https://gh-proxy.org/https://github.com/klinsmaya/multica.git
synced 2026-11-08 01:16:45 +08:00
main
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
374b6f3db4 |
fix: respect omp profiles when discovering runtime skills (#9711)
Co-authored-by: multica-agent <[email protected]> |
||
|
|
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 |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
39d8a11970 | fix(issues): restore an archived inbox notification from the issue page (#9653) | ||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
8ffcc88dbd | fix(desktop): show spelling suggestions in right-click menu (#9608) | ||
|
|
d7d1831fcf |
feat(cli): add run-targeted retries with a fresh option (#9592)
Co-authored-by: multica-agent <[email protected]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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. |
||
|
|
cf1b841a88 |
Revert "MUL-8243: feat(selfhost): wire feature flags through Compose and Helm…" (#9533)
This reverts commit
|
||
|
|
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. |
||
|
|
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]> |
||
|
|
dbdbb29916 |
MUL-8198: chore(release): prepare 0.7.0 changelog (#9468)
Co-authored-by: multica-agent <[email protected]> |
||
|
|
d651730987 | fix(web): normalize whitespace before setting document titles (#9441) | ||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
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]> |
||
|
|
2c86a9c3b0 |
fix(workflows): clarify the send-back handoff copy (MUL-8146) (#9414)
Co-authored-by: multica-agent <[email protected]> |
||
|
|
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]> |