Files
multica/packages/views/locales/en/modals.json
Naiyuan Qing 645e8a2983 feat(issues): 确认指派弹窗去掉打开时的 run 预览等待 (MUL-5010) (#5678)
* feat(issues): confirm assignment without a pre-flight run preview (MUL-5010)

RunConfirmModal called POST /api/issues/preview-trigger on open and blocked
the entire dialog behind a "检查中…" spinner until it landed. That query is
keyed per issue id with staleTime 0, so every new issue was a guaranteed
cache miss — the wait was structural, not incidental. The dialog also
promised "会立即开始工作" while still checking whether anything would start.

Redefine it as "dialog = confirm the assignment", not "confirm N runs":

- Open fires no request. Note box and both buttons are usable on frame one.
- Title/primary action become 确认指派; copy states the assignment as certain
  and the run as conditional, with no predicted count.
- The write reports what actually happened: UpdateIssue returns runs_started
  (0/1) and batch-update returns the batch total, surfaced as one short
  toast — "已指派给 X,已启动 N 个 run", or just "已指派给 X".

runs_started counts successful enqueues rather than predicate hits, since an
insert can still no-op on the pending unique index. It is pointer+omitempty
like Labels, so only the PUT reply carries it, and it is stripped in
useUpdateIssue's onSuccess so a write-scoped fact never lands in the cache.

The handoff-note version gate stays local and synchronous, now covering
squads too by resolving the leader's runtime from the warm squad list —
removing the last reason the dialog needed the server round-trip.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>

* test(issues): assert runs_started on the write responses (MUL-5010)

The assign-confirm dialog now reports the enqueue outcome from the write
reply instead of predicting it, so the number itself is the contract. Pin
it directly on the responses:

- single assign that enqueues → runs_started 1
- single assign that starts nothing → 0, via both routes (suppress_run,
  and assigning into backlog), so a client can tell "no run" apart from
  "old backend omitting the field"
- batch → the real aggregate, asserted against a mixed selection where
  updated=3 but runs_started=2; the divergence from `updated` is the point
- absent on GET, guarding the pointer+omitempty contract that keeps a
  write-scoped fact off every read path

Each count is cross-checked against agent_task_queue so the assertions
track real enqueues rather than the predicate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>

* refactor(issues): drop runs_started + result toast, keep silent completion (MUL-5010)

Final scope: the dialog only removes the preview wait; it does not add a
post-submit result toast. Per the confirmed decision, revert everything that
existed solely to report "N runs started" and keep completion silent, exactly
as it was before this PR — the assignee and any run already surface through
the issue's normal updates.

Removed:
- the success toast on submit and its two i18n keys (all four locales)
- the `runs_started` response field on IssueResponse, the single/batch write
  counting, and dispatchIssueRun's bool return (back to void)
- the `runs_started` type/schema/api-client additions and the onSuccess strip
- server/internal/handler/issue_runs_started_test.go (only served the field)

Kept: preview-trigger removal and the instant-usable dialog — note box and
buttons live on the first frame, agent/squad handoff-note version gate resolved
locally, and "确认指派" copy. Net diff vs base is now frontend-only; the backend
and packages/core files are byte-identical to base again.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>

* docs(issues): fix stale headline comment referencing removed result toast (MUL-5010)

The result toast was removed with runs_started, but the headline comment
still said "the real one arrives in the result toast". Reword to state only
what remains true: the copy names no run count because the run is conditional.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
2026-07-21 15:48:47 +08:00

223 lines
10 KiB
JSON

{
"common": {
"back": "Back",
"close": "Close",
"cancel": "Cancel",
"expand_tooltip": "Expand",
"collapse_tooltip": "Collapse"
},
"create_workspace": {
"title": "Create a new workspace",
"description": "Workspaces are shared environments where teams can work on projects and issues."
},
"delete_issue": {
"title": "Delete issue",
"description": "This will permanently delete this issue and all its comments. This action cannot be undone.",
"hint": "Any workspace member can delete issues.",
"cancel": "Cancel",
"confirm": "Delete",
"deleting": "Deleting...",
"toast_deleted": "Issue deleted",
"toast_delete_failed": "Failed to delete issue"
},
"feedback": {
"title": "Feedback",
"placeholder": "Tell us about your experience, bugs you've found, or features you'd like to see…",
"toast_uploading": "Please wait for uploads to finish…",
"toast_too_long": "Message is too long",
"toast_sent": "Thanks for the feedback!",
"toast_failed": "Failed to send feedback",
"send": "Send feedback",
"sending": "Sending…",
"github_hint_prefix": "Want faster handling and open discussion? Head to ",
"github_hint_link": "GitHub"
},
"issue_picker": {
"search_placeholder": "Search issues...",
"searching": "Searching...",
"no_results": "No issues found.",
"prompt_to_search": "Type to search issues"
},
"set_parent": {
"title": "Set parent issue",
"description": "Search for an issue to set as the parent of this issue",
"toast_failed": "Failed to update issue",
"toast_success": "Set {{identifier}} as parent issue"
},
"add_child": {
"title": "Add sub-issue",
"description": "Search for an issue to add as a sub-issue",
"toast_failed": "Failed to add sub-issue",
"toast_success": "Added {{identifier}} as sub-issue"
},
"run_confirm": {
"title_assign": "Confirm assignment?",
"assign_single": "Assign this issue to {{name}}. They'll start right away if the run conditions are met.",
"assign_batch": "Assign {{count}} issues to {{name}}. They'll start right away if the run conditions are met.",
"note_label": "Handoff note (optional)",
"note_placeholder": "Tell them what matters — scope, focus, or what to avoid…",
"note_unsupported": "Their runtime is too old to receive this handoff note; it may not be read.",
"confirm_assign": "Confirm assignment",
"dont_start": "Don't start yet",
"toast_failed": "Action failed",
"create_will_start": "{{name}} will start working right after creation.",
"create_will_start_squad": "{{name}}'s leader will review it and start assigning work right after creation.",
"create_parked": "Assigned — won't start working in Backlog."
},
"create_squad": {
"title": "Create Squad",
"description": "Create a collaborative squad with a leader agent and optional additional members.",
"name_label": "Name",
"name_placeholder": "e.g. Frontend Team",
"description_label": "Description",
"description_placeholder": "Describe what this squad is responsible for...",
"leader_label": "Leader Agent",
"leader_hint": "The leader receives all tasks assigned to this squad and coordinates the team.",
"leader_placeholder": "Select a leader agent",
"members_label": "Additional Members",
"members_optional": "(optional)",
"members_hint": "Members the leader can delegate sub-tasks to. Can be added later.",
"members_placeholder": "Add agents or workspace members",
"members_selected_count_one": "{{count}} selected",
"members_selected_count_other": "{{count}} selected",
"members_more_count": "+{{count}}",
"members_remove_aria": "Remove {{name}}",
"picker_search_placeholder": "Search agents and members...",
"group_my_agents": "My Agents",
"group_workspace_agents": "Workspace Agents",
"group_members": "Members",
"no_agents": "No active agents available. Create an agent first.",
"no_results": "No results",
"cancel": "Cancel",
"submit": "Create Squad",
"submitting": "Creating...",
"toast_created": "Squad created",
"toast_failed": "Failed to create squad",
"toast_member_add_failed": "Failed to add {{name}}: {{error}}"
},
"create_project": {
"title": "New Project",
"title_breadcrumb": "New project",
"icon_tooltip": "Choose icon",
"title_placeholder": "Project title",
"description_placeholder": "Add description...",
"description_hint": "Shared with agents as context for every task in this project.",
"lead": "Lead",
"no_lead": "No lead",
"set_start_date": "Set start date...",
"set_due_date": "Set due date...",
"more_options_aria": "More options",
"lead_placeholder": "Assign lead...",
"members_group": "Members",
"agents_group": "Agents",
"no_results": "No results",
"submit": "Create Project",
"submitting": "Creating...",
"toast_created": "Project created",
"toast_failed": "Failed to create project",
"repos_pill": "Repos",
"repos_pill_count_one": "{{count}} repo",
"repos_pill_count_other": "{{count}} repos",
"repos_heading": "Attach GitHub repos to this project",
"repos_empty": "No workspace-level repos yet. Paste a URL below to attach one ad-hoc.",
"repos_search_placeholder": "Search repositories...",
"repos_search_empty": "No repositories match your search.",
"repos_url_placeholder": "https://github.com/owner/repo or git@github.com:owner/repo.git",
"repos_add": "Add",
"repos_selected": "Selected",
"source_pill_local": "Local directory",
"source_tab_repos": "GitHub repos",
"source_tab_local": "Local directory",
"local_heading": "Use a local working directory on this machine",
"local_on_device": "Bound to {{device}}",
"local_this_machine": "this machine",
"local_daemon_offline": "Daemon offline — start it to bind a local directory.",
"local_pick": "Choose directory…",
"local_picking": "Opening picker…",
"local_change": "Change directory…",
"local_clear": "Clear",
"local_pick_failed": "Could not open the directory picker.",
"local_invalid_dir": "This directory can't be used. Pick another.",
"local_hint": "Agents on other machines won't see this path — they'll fail to start. Use repos for shared work."
},
"create_issue": {
"sr_manual": "New Issue",
"sr_agent": "Quick create issue",
"manual_breadcrumb": "Create manually",
"agent_breadcrumb": "Create with agent",
"title_placeholder": "Issue title",
"description_placeholder": "Add description...",
"more_options_aria": "More options",
"title_required": "Enter a title to create",
"submit": "Create Issue",
"submitting": "Creating...",
"toast_created": "Issue created",
"view_issue": "View issue",
"toast_failed": "Failed to create issue",
"toast_duplicate_title": "Duplicate issue",
"toast_duplicate_view": "View existing issue",
"toast_link_subissues_all_failed": "Failed to link sub-issues",
"toast_link_subissues_partial": "Failed to link {{failed}} of {{total}} sub-issues",
"toast_link_labels_failed": "Failed to attach labels",
"toast_set_properties_failed": "Could not set {{count}} custom property values",
"switch_to_agent": "Switch to Agent",
"switch_to_agent_tooltip": "Switch to create with agent — describe in one line and let the agent file it",
"switch_to_manual": "Switch to Manual",
"switch_to_manual_tooltip": "Switch to manual create — fill the fields yourself",
"create_another": "Create another",
"remove_parent_aria": "Remove parent",
"remove_subissue_aria": "Remove sub-issue {{identifier}}",
"subissue_of": "Sub-issue of {{identifier}}",
"subissue_chip": "Sub-issue: {{identifier}}",
"parent_with_id": "Parent: {{identifier}}",
"set_due_date": "Set due date...",
"set_start_date": "Set start date...",
"set_parent": "Set parent issue...",
"add_subissue": "Add sub-issue...",
"set_status": "Set status...",
"set_priority": "Set priority...",
"set_assignee": "Set assignee...",
"set_labels": "Set labels...",
"set_project": "Set project...",
"customize_fields": "Customize fields...",
"custom_properties": "Custom properties",
"remove_parent": "Remove parent",
"set_parent_picker": {
"title": "Set parent issue",
"description": "Search for an issue to set as the parent of the new issue"
},
"add_subissue_picker": {
"title": "Add sub-issue",
"description": "Search for an issue to add as a sub-issue of the new issue"
},
"agent": {
"created_by": "Created by",
"select_agent_aria": "Select agent",
"pick_an_agent": "Pick an agent…",
"no_agents": "No agents or squads available.",
"search_placeholder": "Search agents and squads…",
"agents_group": "Agents",
"squads_group": "Squads",
"version_missing": "This agent's daemon doesn't report a CLI version. Create with agent needs multica CLI ≥ {{min}}. Upgrade the daemon and reconnect, or switch to manual create.",
"version_below": "This agent's daemon CLI is {{current}} — Create with agent needs ≥ {{min}}. Upgrade the daemon, or switch to manual create.",
"prompt_placeholder": "Tell the agent what to do, e.g. \"let Bohan fix the inbox loading slowness in the Web project\"",
"more_fields_aria": "More fields",
"set_project": "Set project...",
"set_priority": "Set priority...",
"set_due_date": "Set due date...",
"customize_fields": "Customize fields...",
"submit": "Create",
"sending": "Sending…",
"uploading": "Uploading…",
"sent_label": "Sent",
"sent_count": "{{count}} sent",
"version_blocked_tooltip": "Daemon CLI must be ≥ {{min}}",
"toast_sent": "Sent to agent — you'll get an inbox notification when it's done",
"error_agent_unavailable_fallback": "Agent is unavailable. Pick another agent.",
"error_daemon_version": "This agent's daemon CLI ({{current}}) is below the required {{min}}. Upgrade the daemon to use Create with agent.",
"error_unknown": "Failed to submit. Try again.",
"sub_issue_of": "Sub-issue of {{identifier}}"
}
}
}