Files
multica/packages/views/locales/ko/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

221 lines
12 KiB
JSON

{
"common": {
"back": "뒤로",
"close": "닫기",
"cancel": "취소",
"expand_tooltip": "펼치기",
"collapse_tooltip": "접기"
},
"create_workspace": {
"title": "새 워크스페이스 만들기",
"description": "워크스페이스는 팀이 프로젝트와 이슈를 함께 다루는 공유 환경입니다."
},
"delete_issue": {
"title": "이슈 삭제",
"description": "이 이슈와 모든 댓글이 영구 삭제됩니다. 이 작업은 되돌릴 수 없습니다.",
"hint": "워크스페이스 멤버라면 누구나 이슈를 삭제할 수 있습니다.",
"cancel": "취소",
"confirm": "삭제",
"deleting": "삭제하는 중...",
"toast_deleted": "이슈를 삭제했습니다",
"toast_delete_failed": "이슈를 삭제하지 못했습니다"
},
"feedback": {
"title": "피드백",
"placeholder": "사용 경험, 발견한 버그, 필요한 기능을 알려주세요...",
"toast_uploading": "업로드가 끝날 때까지 기다려 주세요...",
"toast_too_long": "메시지가 너무 깁니다",
"toast_sent": "피드백을 보내주셔서 감사합니다!",
"toast_failed": "피드백을 보내지 못했습니다",
"send": "피드백 보내기",
"sending": "보내는 중...",
"github_hint_prefix": "더 빠른 처리와 공개 논의를 원하시면 ",
"github_hint_link": "GitHub"
},
"issue_picker": {
"search_placeholder": "이슈 검색...",
"searching": "검색 중...",
"no_results": "이슈를 찾을 수 없습니다.",
"prompt_to_search": "이슈를 검색하려면 입력하세요"
},
"set_parent": {
"title": "상위 이슈 설정",
"description": "이 이슈의 상위 이슈로 설정할 이슈를 검색하세요",
"toast_failed": "이슈를 업데이트하지 못했습니다",
"toast_success": "{{identifier}}을(를) 상위 이슈로 설정했습니다"
},
"add_child": {
"title": "하위 이슈 추가",
"description": "하위 이슈로 추가할 이슈를 검색하세요",
"toast_failed": "하위 이슈를 추가하지 못했습니다",
"toast_success": "{{identifier}}을(를) 하위 이슈로 추가했습니다"
},
"run_confirm": {
"title_assign": "할당을 확인할까요?",
"assign_single": "이 이슈를 {{name}}에게 할당합니다. 실행 조건을 충족하면 바로 시작합니다.",
"assign_batch": "{{count}}개 이슈를 {{name}}에게 할당합니다. 실행 조건을 충족하면 바로 시작합니다.",
"note_label": "인계 메모 (선택)",
"note_placeholder": "범위·핵심·건드리지 말 것 등을 한마디로…",
"note_unsupported": "상대 런타임이 오래되어 이 인계 메모를 읽지 못할 수 있습니다.",
"confirm_assign": "할당 확인",
"dont_start": "아직 시작 안 함",
"toast_failed": "작업에 실패했습니다",
"create_will_start": "생성 후 {{name}}이(가) 바로 작업을 시작합니다.",
"create_will_start_squad": "생성 후 {{name}}의 리더가 내용을 평가한 뒤 작업 배분을 시작합니다.",
"create_parked": "할당됨 — 백로그에서는 작업을 시작하지 않습니다."
},
"create_squad": {
"title": "스쿼드 만들기",
"description": "리더 에이전트와 선택 멤버로 협업 스쿼드를 만듭니다.",
"name_label": "이름",
"name_placeholder": "예: 프런트엔드 팀",
"description_label": "설명",
"description_placeholder": "이 스쿼드가 맡는 일을 설명하세요...",
"leader_label": "리더 에이전트",
"leader_hint": "리더는 이 스쿼드에 할당된 모든 작업을 받고 팀을 조율합니다.",
"leader_placeholder": "리더 에이전트 선택",
"members_label": "추가 멤버",
"members_optional": "(선택 사항)",
"members_hint": "리더가 하위 작업을 위임할 수 있는 멤버입니다. 나중에 추가할 수 있습니다.",
"members_placeholder": "에이전트 또는 워크스페이스 멤버 추가",
"members_selected_count_other": "{{count}}개 선택됨",
"members_more_count": "+{{count}}",
"members_remove_aria": "{{name}} 제거",
"picker_search_placeholder": "에이전트와 멤버 검색...",
"group_my_agents": "내 에이전트",
"group_workspace_agents": "워크스페이스 에이전트",
"group_members": "멤버",
"no_agents": "사용 가능한 활성 에이전트가 없습니다. 먼저 에이전트를 만드세요.",
"no_results": "결과 없음",
"cancel": "취소",
"submit": "스쿼드 만들기",
"submitting": "만드는 중...",
"toast_created": "스쿼드를 만들었습니다",
"toast_failed": "스쿼드를 만들지 못했습니다",
"toast_member_add_failed": "{{name}}을(를) 추가하지 못했습니다: {{error}}"
},
"create_project": {
"title": "새 프로젝트",
"title_breadcrumb": "새 프로젝트",
"icon_tooltip": "아이콘 선택",
"title_placeholder": "프로젝트 제목",
"description_placeholder": "설명 추가...",
"description_hint": "이 프로젝트의 모든 작업에서 컨텍스트로 에이전트에게 공유됩니다.",
"lead": "리드",
"no_lead": "리드 없음",
"set_start_date": "시작일 설정...",
"set_due_date": "마감일 설정...",
"more_options_aria": "추가 옵션",
"lead_placeholder": "리드 지정...",
"members_group": "멤버",
"agents_group": "에이전트",
"no_results": "결과 없음",
"submit": "프로젝트 만들기",
"submitting": "만드는 중...",
"toast_created": "프로젝트를 만들었습니다",
"toast_failed": "프로젝트를 만들지 못했습니다",
"repos_pill": "저장소",
"repos_pill_count_other": "저장소 {{count}}개",
"repos_heading": "이 프로젝트에 GitHub 저장소 연결",
"repos_empty": "아직 워크스페이스 수준 저장소가 없습니다. 아래에 URL을 붙여 넣어 임시로 연결하세요.",
"repos_search_placeholder": "저장소 검색...",
"repos_search_empty": "검색 결과와 일치하는 저장소가 없습니다.",
"repos_url_placeholder": "https://github.com/owner/repo 또는 git@github.com:owner/repo.git",
"repos_add": "추가",
"repos_selected": "선택됨",
"source_pill_local": "로컬 디렉터리",
"source_tab_repos": "GitHub 저장소",
"source_tab_local": "로컬 디렉터리",
"local_heading": "이 기기의 로컬 작업 디렉터리 사용",
"local_on_device": "{{device}}에 연결됨",
"local_this_machine": "이 기기",
"local_daemon_offline": "데몬이 오프라인입니다. 로컬 디렉터리를 연결하려면 데몬을 시작하세요.",
"local_pick": "디렉터리 선택...",
"local_picking": "선택 창 여는 중...",
"local_change": "디렉터리 변경...",
"local_clear": "지우기",
"local_pick_failed": "디렉터리 선택 창을 열 수 없습니다.",
"local_invalid_dir": "이 디렉터리는 사용할 수 없습니다. 다른 디렉터리를 선택하세요.",
"local_hint": "다른 기기의 에이전트는 이 경로를 볼 수 없어 시작에 실패합니다. 공유 작업에는 저장소를 사용하세요."
},
"create_issue": {
"sr_manual": "새 이슈",
"sr_agent": "빠른 이슈 생성",
"manual_breadcrumb": "직접 만들기",
"agent_breadcrumb": "에이전트로 만들기",
"title_placeholder": "이슈 제목",
"description_placeholder": "설명 추가...",
"more_options_aria": "추가 옵션",
"title_required": "만들려면 제목을 입력하세요",
"submit": "이슈 만들기",
"submitting": "만드는 중...",
"toast_created": "이슈를 만들었습니다",
"view_issue": "이슈 보기",
"toast_failed": "이슈를 만들지 못했습니다",
"toast_duplicate_title": "중복 이슈",
"toast_duplicate_view": "기존 이슈 보기",
"toast_link_subissues_all_failed": "하위 이슈를 연결하지 못했습니다",
"toast_link_subissues_partial": "하위 이슈 {{total}}개 중 {{failed}}개를 연결하지 못했습니다",
"toast_link_labels_failed": "라벨을 연결하지 못했습니다",
"toast_set_properties_failed": "사용자 지정 속성 값 {{count}}개를 설정하지 못했습니다",
"switch_to_agent": "에이전트로 전환",
"switch_to_agent_tooltip": "에이전트로 만들기로 전환합니다. 한 줄로 설명하면 에이전트가 이슈를 작성합니다.",
"switch_to_manual": "직접 만들기로 전환",
"switch_to_manual_tooltip": "직접 만들기로 전환합니다. 필드를 직접 채웁니다.",
"create_another": "하나 더 만들기",
"remove_parent_aria": "상위 이슈 제거",
"remove_subissue_aria": "하위 이슈 {{identifier}} 제거",
"subissue_of": "{{identifier}}의 하위 이슈",
"subissue_chip": "하위 이슈: {{identifier}}",
"parent_with_id": "상위 이슈: {{identifier}}",
"set_due_date": "마감일 설정...",
"set_start_date": "시작일 설정...",
"set_parent": "상위 이슈 설정...",
"add_subissue": "하위 이슈 추가...",
"set_status": "상태 설정...",
"set_priority": "우선순위 설정...",
"set_assignee": "담당자 설정...",
"set_labels": "레이블 설정...",
"set_project": "프로젝트 설정...",
"customize_fields": "필드 사용자 지정...",
"custom_properties": "사용자 지정 속성",
"remove_parent": "상위 이슈 제거",
"set_parent_picker": {
"title": "상위 이슈 설정",
"description": "새 이슈의 상위 이슈로 설정할 이슈를 검색하세요"
},
"add_subissue_picker": {
"title": "하위 이슈 추가",
"description": "새 이슈의 하위 이슈로 추가할 이슈를 검색하세요"
},
"agent": {
"created_by": "생성자",
"select_agent_aria": "에이전트 선택",
"pick_an_agent": "에이전트 선택...",
"no_agents": "사용 가능한 에이전트나 스쿼드가 없습니다.",
"search_placeholder": "에이전트와 스쿼드 검색...",
"agents_group": "에이전트",
"squads_group": "스쿼드",
"version_missing": "이 에이전트의 데몬이 CLI 버전을 보고하지 않습니다. 에이전트로 만들기에는 multica CLI {{min}} 이상이 필요합니다. 데몬을 업그레이드하고 다시 연결하거나 직접 만들기로 전환하세요.",
"version_below": "이 에이전트의 데몬 CLI는 {{current}}입니다. 에이전트로 만들기에는 {{min}} 이상이 필요합니다. 데몬을 업그레이드하거나 직접 만들기로 전환하세요.",
"prompt_placeholder": "에이전트에게 할 일을 알려주세요. 예: \"Bohan이 Web 프로젝트의 인박스 로딩 지연을 고치게 해줘\"",
"more_fields_aria": "추가 필드",
"set_project": "프로젝트 설정...",
"set_priority": "우선순위 설정...",
"set_due_date": "마감일 설정...",
"customize_fields": "필드 사용자 지정...",
"submit": "만들기",
"sending": "보내는 중...",
"uploading": "업로드 중...",
"sent_label": "전송됨",
"sent_count": "{{count}}개 전송됨",
"version_blocked_tooltip": "데몬 CLI는 {{min}} 이상이어야 합니다",
"toast_sent": "에이전트에게 보냈습니다. 완료되면 인박스 알림을 받습니다",
"error_agent_unavailable_fallback": "에이전트를 사용할 수 없습니다. 다른 에이전트를 선택하세요.",
"error_daemon_version": "이 에이전트의 데몬 CLI({{current}})가 필요한 버전 {{min}}보다 낮습니다. 에이전트로 만들기를 사용하려면 데몬을 업그레이드하세요.",
"error_unknown": "제출하지 못했습니다. 다시 시도하세요.",
"sub_issue_of": "{{identifier}}의 하위 이슈"
}
}
}