Repository navigation
Conversation
…ca-ai#9088) fetchFirstPages sent one listIssues call per status category, but ApiClient.listIssues never puts status_category on the query string, so all four went out as the same GET /api/issues?limit=50. Each ran the list query and a COUNT(*), and every bucket held the same unfiltered first page with the workspace-wide total. Writers find an issue in the first bucket that holds it, so a deleted issue stayed in three buckets and a loaded issue moved to done left stale copies behind. The list now makes one request and groups its rows into the category buckets client-side. Every reader of the cache looks an issue up by id and none pages a bucket, so one shared window serves them all, and the request is the same as before. A custom status the server did not resolve lands in issueColumnCategory's bucket, so no row is dropped. Each bucket's total is its own row count.
… off (multica-ai#8983) antigravityCompletedDespiteTrailingNetworkError exists to preserve a finished answer when agy fails a follow-up round trip after producing it, but it recognised exactly one error spelling. agy also reports an exhausted retry as `API error (attempt N): request failed: Post "...": EOF`, which fell through and discarded a response already sitting in result.response with its agent_response step at DONE. Match the transport cause rather than one sentence. The classifier stays narrow on purpose: reportTaskResult documents failing closed so a provider 429 or out-of-credit run can never be shown as Completed, and quota, capacity, overload, policy and auth rejections all arrive as an HTTP response rather than a failed round trip. agy's own `request failed:` prefix is excluded too — only one spelling has been observed and nothing rules out agy reusing it for a status error.
…-7496) (multica-ai#8559) * feat(issues): add multi_text and multi_url custom property types Workspaces could only hold list-shaped values as preset option lists (multi_select) or member references (multi_actor). There was no way to keep a list of free-form strings or links on an issue, so teams with "related docs / spec links / aliases" needs had to either cram them into one text field (no structure, nothing clickable) or burn one select option per link. This adds two property types: - multi_text: an ordered list of free-form text entries - multi_url: an ordered list of http(s) URLs Each entry is validated exactly like a single text / url value (length caps, http(s)-only for URLs), duplicates are dropped, insertion order is preserved, and values are capped at 20 entries to respect the 16KB properties-bag budget. Values ride the existing jsonb bag, so the jsonb_path_ops GIN index, the @> containment filter, and the client value schema all keep working unchanged. Filtering matches any single list element exactly (equality) plus "No value" — the containment form the filter compiler already emits for array elements, so no new server predicate is needed. List types deliberately get no sort order and cannot group, like the other multi-value types. On the web, list values render as chips; multi_url chips are clickable and open in a new tab, and the editor popover offers a per-entry open button, so several related documents or links stay directly reachable from the issue. The filter menu reuses the scalar input (equality-only plus "No value"). CLI: comma-separated --value form for both types, element-equality --property filtering, and display_values rows. Server-side allowlist widened by migration 500 (check constraint re-added NOT VALID then validated, same pattern as migration 341). * fix(properties): address list property review nits Co-authored-by: multica-agent <github@multica.ai> * fix(properties): scope list drafts to the edited issue Co-authored-by: multica-agent <github@multica.ai> * test(agent): avoid fork races when writing zeroclaw fixtures Co-authored-by: multica-agent <github@multica.ai> --------- Co-authored-by: Bohan-J <bhjiang@outlook.com> Co-authored-by: multica-agent <github@multica.ai>
…a-ai#9091) * fix(docs): cite the compose lines that pin MULTICA_IMAGE_TAG The self-host upgrade warning pointed at a volume mount and a GitHub key comment, so a reader checking the pin looked at the wrong lines. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(docs): use stable self-host upgrade references Co-authored-by: multica-agent <github@multica.ai> --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Bohan <bohan@devv.ai> Co-authored-by: multica-agent <github@multica.ai>
…paths (multica-ai#9101) Co-authored-by: multica-agent <github@multica.ai>
…301) (multica-ai#9065) * fix(daemon): resume Hermes sessions across task worktrees Co-authored-by: multica-agent <github@multica.ai> * fix(hermes): preserve unreadable history during migration Co-authored-by: multica-agent <github@multica.ai> --------- Co-authored-by: multica-agent <github@multica.ai>
There was a problem hiding this comment.
This PR successfully syncs upstream changes adding multi_text and multi_url property types to the issue custom properties system. The implementation is comprehensive across migrations, backend validation, and TypeScript types.
The changes maintain consistency with the existing multi_actor pattern, properly validate list values (max 20 entries, per-item validation, deduplication), and include appropriate database migrations with safe rollback guards. The validation logic correctly handles both individual items and lists, with proper error messages for client feedback.
You can now have the agent implement changes and create commits directly on your pull request's source branch. Simply comment with /q followed by your request in natural language to ask the agent to make changes.
What does this PR do?
Merge pinned upstream main
fbd3470eacc1a643f101d703875fb59a019facf7into the accepted deployment branch. Fork main remains an upstream-only fast-forward mirror. This PR preserves merge ancestry and is never auto-merged.Risks
Review product overlays and new migrations before accepting. Acceptance authorizes production build and deployment after exact-commit CI passes and backup restore rehearsal succeeds. Image rollback alone does not reverse database migrations.
How to Test
Product CI runs on this PR and the accepted merge commit. Private operations CI builds immutable images and verifies migrations on a restored production backup before cutover.
Type of Change
AI Disclosure
AI tool used: Codex. Automated upstream merge; acceptance stays with the reviewer.