@buzzni/saycode-cli 0.7.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.mjs +229 -85
  2. package/package.json +1 -1
package/index.mjs CHANGED
@@ -45,7 +45,7 @@ function _mergeNamespaces(n, m) {
45
45
  }
46
46
  return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { value: "Module" }));
47
47
  }
48
- const version$2 = "0.7.1";
48
+ const version$2 = "0.7.2";
49
49
  const manifest = {
50
50
  version: version$2
51
51
  };
@@ -270,8 +270,8 @@ function getCurrentLanguage() {
270
270
  }
271
271
  const workKo = {
272
272
  "work.homeTitle": "어떤 작업을 도와드릴까요?",
273
- "work.new": "새 워크",
274
- "work.archived": "보관된 대화",
273
+ "work.new": "새 chat 시작",
274
+ "work.archived": "보관된 chat",
275
275
  "work.active": "활성 대화로 돌아가기",
276
276
  "work.docx": "문서",
277
277
  "work.pdf": "PDF 문서",
@@ -305,6 +305,85 @@ const workKo = {
305
305
  "work.xlsxDescription": "표와 수식 작성 및 편집",
306
306
  "work.pptxDescription": "발표자료 작성 및 편집"
307
307
  };
308
+ const setupFailureHintKo = {
309
+ "setupHint.file-locked": "다른 프로그램이 교체할 파일을 사용 중입니다. 열려 있는 터미널과 Claude·Codex 창을 닫고 다시 시도하세요. 설치된 도구와 로그인은 유지됩니다.",
310
+ "setupHint.npm-missing": "npm을 찾지 못했습니다. Node.js LTS(npm 포함)를 설치한 뒤 다시 시도하세요. Saycode를 다시 시작할 필요는 없습니다.",
311
+ "setupHint.network": "네트워크 또는 프록시 때문에 내려받지 못했습니다. 연결을 확인하고 다시 시도하세요. 회사 프록시를 쓴다면 npm 프록시 설정이 필요할 수 있습니다.",
312
+ "setupHint.permission": "설치 폴더에 쓸 권한이 없습니다. Saycode를 관리자 권한이 아닌 일반 사용자로 실행하고, npm 전역 설치 폴더가 사용자 폴더 안에 있는지 확인하세요.",
313
+ "setupHint.openLogs": "로그 폴더 열기",
314
+ "setupHint.gitMissing": "Git을 찾지 못했습니다. 프로젝트와 작업 사본에 Git이 필요합니다. 설치한 뒤 다시 확인하세요. 다시 시작할 필요는 없습니다.",
315
+ "setupHint.recheck": "다시 확인",
316
+ "setupHint.gitGuide": "Git 설치"
317
+ };
318
+ const usageEntryKo = {
319
+ ...setupFailureHintKo,
320
+ "usageChoice.title": "어떻게 사용하시겠어요?",
321
+ "usageChoice.personal": "개인 사용",
322
+ "usageChoice.personalBody": "나만의 프로젝트를 AI와 함께 만들고 관리하세요.",
323
+ "usageChoice.organization": "조직 사용",
324
+ "usageChoice.organizationBody": "팀원과 프로젝트를 공유하고 함께 개발하세요.",
325
+ "onboarding.page.machine": "이 컴퓨터 등록",
326
+ "registration.registered": "등록됨",
327
+ "registration.required": "등록 필요",
328
+ "registration.checking": "확인 중…",
329
+ "registration.registering": "등록 중…",
330
+ "registration.title": "이 컴퓨터 등록",
331
+ "registration.body": "조직에서 사용할 전용 머신으로 이 컴퓨터를 연결하세요.",
332
+ "registration.finish": "조직 작업 시작",
333
+ "registration.organization": "조직",
334
+ "registration.computer": "컴퓨터",
335
+ "registration.thisComputer": "이 컴퓨터",
336
+ "registration.chooseOrganization": "등록할 조직을 선택하세요.",
337
+ "registration.noOrganization": "가입한 조직이 없어요. 조직에 가입한 계정으로 로그인하거나 조직 관리에서 가입 상태를 확인하세요.",
338
+ "registration.selectFailed": "조직을 전환하지 못했어요. 다시 선택해 주세요.",
339
+ "registration.action": "이 컴퓨터 등록",
340
+ "machineSettings.registerThisComputer": "내 컴퓨터 등록",
341
+ "machineSettings.registerMachine": "머신 등록",
342
+ "registration.linked": "이 컴퓨터가 조직에 연결됐어요.",
343
+ "registration.identityPending": "이 컴퓨터의 조직·전용 머신 유형·사용자 배정을 확인 중입니다. 기존 연결은 자동으로 변경하지 않습니다.",
344
+ "localTools.title": "추가 CLI 도구",
345
+ "localTools.body": "Codex와 Claude의 멀티 계정 도구를 함께 준비합니다.",
346
+ "localTools.unavailable": "이 버전에서 로컬 도구 설치를 사용할 수 없어요.",
347
+ "localTools.checking": "확인 중",
348
+ "localTools.missing": "설치 필요",
349
+ "localTools.installing": "설치 중…",
350
+ "localTools.installed": "설치됨",
351
+ "localTools.failed": "설치 실패",
352
+ "localTools.prerequisite": "사전 준비 필요",
353
+ "localTools.prerequisiteBody": "{command}를 설치하고 다시 시도하세요. Saycode를 다시 시작할 필요는 없습니다.",
354
+ "localTools.installGuide": "설치 안내",
355
+ "localTools.retry": "미완료 도구 다시 설치",
356
+ "localTools.install": "추가 도구 설치",
357
+ "localTools.required": "추가 도구 준비 필요",
358
+ "onboarding.checklist": "온보딩 체크리스트",
359
+ "onboarding.checklistBody": "작업에 필요한 도구를 준비하세요. 선택한 단계부터 나머지 설치를 자동으로 진행합니다.",
360
+ "onboarding.autoStart": "이 단계부터 자동 진행",
361
+ "onboarding.autoStop": "자동 진행 중지",
362
+ "onboarding.autoRetry": "자동 진행 다시 시도",
363
+ "onboarding.autoFailed": "자동 진행을 멈췄어요. {detail}",
364
+ "onboarding.autoNeedsAction": "아래 상태를 확인하고 필요한 준비 후 다시 시도하세요.",
365
+ "onboarding.autoWait.organization": "등록할 조직을 선택하면 이어서 진행합니다.",
366
+ "onboarding.autoWait.identity": "이 컴퓨터의 조직·유형·사용자 연결 확인을 기다리고 있습니다.",
367
+ "onboarding.autoWait.machine": "먼저 이 컴퓨터 등록 단계에서 연결을 완료하세요.",
368
+ "onboarding.autoWait.login": "도구 설치는 완료됐어요. Claude와 Codex 계정에 로그인하면 자동으로 이어집니다.",
369
+ "onboarding.autoWait.platform": "이 플랫폼의 AI 인증 확인은 아직 지원되지 않습니다.",
370
+ "onboarding.autoWait.verification": "설치 후 AI 도구의 실행 상태를 다시 확인하고 있습니다.",
371
+ "onboarding.autoWait.cli": "먼저 Saycode CLI 단계에서 도구 준비를 완료하세요.",
372
+ "onboarding.autoWorking": "{step} 준비 중…"
373
+ };
374
+ const homeTabsKo = {
375
+ "homeTabs.greeting": "{name}님, 안녕하세요",
376
+ "homeTabs.label": "홈 모드",
377
+ "homeTabs.project": "Build",
378
+ "homeTabs.work": "Chat",
379
+ "homeTabs.develop": "Develop",
380
+ "homeTabs.new": "새 기획으로 시작",
381
+ "homeTabs.quick": "새 프로젝트 시작",
382
+ "homeTabs.git": "코드 저장소 가져오기",
383
+ "homeTabs.zip": "ZIP/파일 가져오기",
384
+ "homeTabs.folder": "머신 폴더 사용하기",
385
+ "homeTabs.categories": "프로젝트 범주"
386
+ };
308
387
  const projectRelocationKO = {
309
388
  "projectRelocation.notFound": "이 머신에서 프로젝트 폴더를 확인하지 못했습니다: {path}. 프로젝트를 이 머신으로 복사하거나 프로젝트 설정에서 실제 폴더 경로를 지정하세요.",
310
389
  "projectRelocation.ambiguous": "일치하는 프로젝트 폴더가 여러 개입니다: {paths}. 프로젝트 설정에서 사용할 폴더를 지정하세요.",
@@ -312,7 +391,87 @@ const projectRelocationKO = {
312
391
  "sessionCreation.dirNotFound": "원격 머신에 디렉토리가 없습니다: {directory}",
313
392
  "sessionCreation.workspaceNotSet": "이 머신의 워크스페이스 경로가 설정되지 않았습니다. 머신 워크스페이스를 먼저 설정해주세요."
314
393
  };
394
+ const sessionShareKo = {
395
+ "sessionShare.menuAction": "조직에 공유",
396
+ "sessionShare.dialogTitle": "대화 세션 공유",
397
+ "sessionShare.dialogDescription": "내가 속한 조직에 이 대화의 읽기 전용 스냅샷을 공유합니다.",
398
+ "sessionShare.readOnlyScope": "이 대화와 본문에서 참조한 파일의 공유 시점 사본만 공유되며, 다른 프로젝트 파일과 대화는 공개되지 않습니다.",
399
+ "sessionShare.addOrganization": "공유할 조직",
400
+ "sessionShare.selectOrganization": "조직 선택",
401
+ "sessionShare.noOrganizations": "추가로 공유할 수 있는 소속 조직이 없습니다.",
402
+ "sessionShare.currentOrganizations": "현재 공유 중인 조직",
403
+ "sessionShare.noGrants": "아직 공유된 조직이 없습니다.",
404
+ "sessionShare.revokeOrganization": "{organization} 공유 해제",
405
+ "sessionShare.shareAction": "공유",
406
+ "sessionShare.sharedSuccess": "대화가 {organization} 조직에 공유되었습니다",
407
+ "sessionShare.revokedSuccess": "대화의 조직 공유가 해제되었습니다",
408
+ "sessionShare.copyFailed": "공유 링크를 복사하지 못했습니다",
409
+ "sessionShare.copySuccess": "대화 공유 링크가 복사되었습니다",
410
+ "sessionShare.copyLink": "공유 링크 복사",
411
+ "sessionShare.messengerShareOrganization": "{organization} 메신저로 공유",
412
+ "sessionShare.notFound": "공유된 대화를 열 수 없습니다",
413
+ "sessionShare.notFoundDescription": "공유가 해제되었거나 현재 계정이 대상 조직의 활성 멤버가 아닙니다.",
414
+ "sessionShare.loginRequired": "로그인이 필요합니다",
415
+ "sessionShare.loginDescription": "공유 대상 조직의 Saycode 계정으로 로그인해 주세요.",
416
+ "sessionShare.continueLogin": "로그인하고 계속",
417
+ "sessionShare.switchAccount": "다른 계정으로 로그인",
418
+ "sessionShare.loading": "공유된 대화를 불러오는 중…",
419
+ "sessionShare.readOnly": "읽기 전용",
420
+ "sessionShare.fileUnavailable": "공유되지 않은 파일",
421
+ "sessionShare.workspaceUnavailable": "작업공간 정보를 확인한 뒤 다시 공유해 주세요.",
422
+ "sessionShare.tooLong": "공유할 대화가 너무 깁니다.",
423
+ "sessionShare.invalidRequest": "대화 공유 요청이 올바르지 않습니다.",
424
+ "sessionShare.targetMembershipRequired": "소속된 조직에만 공유할 수 있습니다.",
425
+ "sessionShare.requestFailed": "대화 공유 요청을 처리하지 못했습니다.",
426
+ "sessionShare.shareNotFound": "이 대화의 공유 정보를 찾을 수 없습니다.",
427
+ "sessionShare.publicSection": "링크가 있는 누구나",
428
+ "sessionShare.publicToggle": "로그인 없이 링크로 열람 허용",
429
+ "sessionShare.publicDescription": "켜면 링크를 가진 누구나 로그인 없이 이 대화의 공유 시점 사본을 볼 수 있습니다.",
430
+ "sessionShare.publicWarning": "이 링크를 받은 사람은 계정 없이 대화 전문과 참조된 파일을 볼 수 있습니다. 민감한 내용이 없는지 확인해 주세요.",
431
+ "sessionShare.publicLinkLabel": "공개 링크",
432
+ "sessionShare.publicCopyLink": "공개 링크 복사",
433
+ "sessionShare.publicCopySuccess": "공개 링크가 복사되었습니다",
434
+ "sessionShare.publicEnabledSuccess": "대화가 링크 공개로 전환되었습니다",
435
+ "sessionShare.publicDisabledSuccess": "대화의 링크 공개가 해제되었습니다",
436
+ "sessionShare.publicRevokeHint": "공개를 해제하면 이 링크는 영구히 만료되고, 다시 켜면 새 링크가 발급됩니다.",
437
+ "sessionShare.publicNotFoundDescription": "공개가 해제되었거나 링크가 만료되었습니다.",
438
+ "sessionShare.publicRateLimited": "조회 요청이 너무 많습니다. 잠시 후 다시 열어 주세요.",
439
+ "sessionShare.publicUnavailableTitle": "지금은 대화를 열 수 없습니다",
440
+ "sessionShare.publicUnavailable": "지금은 공유된 대화를 불러올 수 없습니다. 잠시 후 다시 시도해 주세요.",
441
+ "sessionShare.rateLimited": "공유 요청이 너무 잦습니다. 잠시 후 다시 시도해 주세요.",
442
+ "sessionShare.snapshotRefreshScope": "공유하거나 공개를 켤 때마다, 이미 공유된 대상이 보는 사본도 지금 대화 내용으로 함께 갱신됩니다.",
443
+ "sessionShare.publicLiveWhileSharing": "공개 링크가 켜져 있습니다. 지금 조직에 공유하면 링크를 가진 사람이 보는 내용도 지금 대화로 갱신됩니다.",
444
+ "sessionShare.grantsLiveWhilePublishing": "이미 {count}개 조직에 공유 중입니다. 공개를 켜면 해당 조직이 보는 사본도 지금 대화로 갱신됩니다."
445
+ };
446
+ const workAreaKo = {
447
+ "workArea.addPanel": "작업 패널 추가",
448
+ "workArea.diff": "변경",
449
+ "workArea.files": "파일",
450
+ "workArea.terminal": "터미널",
451
+ "workArea.browser": "브라우저",
452
+ "workArea.tools": "작업 도구",
453
+ "workArea.hideTools": "도구 접기",
454
+ "workArea.showTools": "도구 펼치기",
455
+ "workArea.resize": "작업 도구 너비 조절",
456
+ "workArea.changedFiles": "변경된 파일",
457
+ "workArea.noChanges": "현재 작업 폴더에서 변경된 파일이 없습니다.",
458
+ "workArea.selectProject": "파일을 보려면 프로젝트를 선택하세요.",
459
+ "workArea.openFile": "파일 열기",
460
+ "workArea.selectFile": "오른쪽 파일 트리에서 파일을 선택하세요.",
461
+ "workArea.newTerminal": "새 터미널",
462
+ "workArea.noTerminal": "터미널을 열어 현재 작업 폴더에서 명령을 실행하세요.",
463
+ "workArea.filterFiles": "파일 필터…",
464
+ "workArea.viewSource": "소스 보기",
465
+ "workArea.preview": "미리보기",
466
+ "workArea.expandFolders": "폴더 펼치기",
467
+ "workArea.collapseFolders": "폴더 접기",
468
+ "workArea.contentSearch": "내용 검색",
469
+ "workArea.splitDiff": "좌우 비교",
470
+ "workArea.unifiedDiff": "한 줄 비교"
471
+ };
315
472
  const redesignKo = {
473
+ ...sessionShareKo,
474
+ ...workAreaKo,
316
475
  "ux2.pinnedConversations": "핀된 대화",
317
476
  "ux2.pinnedProjects": "핀된 프로젝트",
318
477
  "ux2.selectOrganization": "조직 선택",
@@ -328,6 +487,8 @@ const redesignKo = {
328
487
  "ux2.remainingUsage": "AI 잔여량",
329
488
  "ux2.projectViewOptions": "프로젝트 보기 옵션",
330
489
  "ux2.projectTools": "프로젝트 도구",
490
+ "ux2.pinConversation": "대화 고정",
491
+ "ux2.unpinConversation": "대화 고정 해제",
331
492
  "ux2.sharingExtensions": "공유·메모리 확장",
332
493
  "ux2.conversationFiles": "대화·파일 메뉴",
333
494
  "ux2.allProjects": "전체",
@@ -340,14 +501,10 @@ const redesignKo = {
340
501
  "ux2.setupDetails": "{step} · 설정 방법",
341
502
  "ux2.work": "대화",
342
503
  "ux2.workHint": "프로젝트 전체의 대화와 터미널",
343
- "ux2.createHint": "프로젝트를 어떻게 시작할까요?",
344
504
  "ux2.blank": "새 프로젝트",
345
- "ux2.template": "템플릿에서 시작",
346
505
  "ux2.git": "Git 저장소",
347
506
  "ux2.zip": "ZIP·파일",
348
507
  "ux2.folder": "기존 폴더",
349
- "ux2.machine": "실행 환경",
350
- "ux2.machineHint": "프로젝트와 에이전트가 실행될 머신입니다.",
351
508
  "ux2.addMachine": "머신 추가",
352
509
  "ux2.name": "프로젝트 이름",
353
510
  "ux2.choose": "폴더 선택",
@@ -445,10 +602,10 @@ const machineResourceMetricsKo = {
445
602
  "machineResourceMetrics.unavailable": "측정 불가 — 연결을 확인해 주세요"
446
603
  };
447
604
  const hubSessionKo = {
448
- "hubSession.enable": "이 대화를 프로젝트 허브로",
605
+ "hubSession.enable": "프로젝트 허브로 설정",
449
606
  "hubSession.disable": "프로젝트 허브 해제",
450
607
  "hubSession.hint": "같은 프로젝트의 다른 대화가 턴을 끝내거나 입력을 기다리면 이 대화에 메시지로 알려줍니다",
451
- "hubSession.newSessionLabel": "이 대화를 프로젝트 허브로 시작",
608
+ "hubSession.newSessionLabel": "프로젝트 허브로 설정",
452
609
  "hubSession.description": "프로젝트의 작업 세션들을 관리할 수 있습니다. 프로젝트 당 허브는 1개만 설정이 가능합니다.",
453
610
  "hubSession.badge": "프로젝트 허브",
454
611
  "hubSession.newSessionHint": "다른 대화의 완료·질문을 여기로 모읍니다",
@@ -1281,6 +1438,7 @@ const personalChatsKo = {
1281
1438
  "personalChats.title": "내 채팅",
1282
1439
  "personalChats.newChat": "새 채팅",
1283
1440
  "personalChats.searchPlaceholder": "채팅 검색",
1441
+ "personalChats.sortRecent": "최신 작업순으로 정렬",
1284
1442
  "personalChats.empty": "채팅이 없습니다",
1285
1443
  "personalChats.emptyHint": "프로젝트를 선택하지 않고 채팅을 시작하세요.",
1286
1444
  "personalChats.emptySearch": "검색과 일치하는 채팅이 없습니다.",
@@ -1807,53 +1965,39 @@ const connectionIndicatorKo = {
1807
1965
  "connectionIndicator.restored": "연결 복구",
1808
1966
  "connectionIndicator.aria": "실시간 동기화 연결 상태: {state}"
1809
1967
  };
1810
- const voiceDictationKo = {
1811
- "voice.finishAndSend": "받아쓰고 전송",
1812
- "voice.finishAndSendAria": "녹음을 끝내고 받아쓴 내용을 바로 전송"
1813
- };
1814
1968
  const newSessionProfileKo = {
1815
1969
  "newSession.profile.label": "프로필",
1970
+ "newSession.profile.agentHeading": "사용할 AI",
1971
+ "newSession.profile.savedHeading": "AI 프로필",
1972
+ "newSession.profile.savedHint": "선택하면 AI·모델·작업 환경이 함께 바뀝니다",
1973
+ "newSession.profile.saveSetup": "현재 설정 저장",
1974
+ "newSession.profile.manageSetups": "AI 프로필 관리",
1816
1975
  "newSession.profile.selectAria": "실행 옵션 프로필",
1817
1976
  "newSession.profile.none": "프로필 없음",
1818
- "newSession.profile.save": "현재 조합 저장",
1819
- "newSession.profile.saveAria": "현재 실행 옵션을 프로필로 저장",
1820
1977
  "newSession.profile.executionSettings": "실행 설정",
1821
- "newSession.profile.saveExecutionSettings": "모델·에포트 설정 저장",
1978
+ "newSession.profile.editSettings": "편집",
1979
+ "newSession.profile.saveChanges": "변경사항 저장",
1980
+ "newSession.profile.instructionsField": "추가 지시문",
1981
+ "newSession.profile.badgeIconField": "표식 아이콘",
1982
+ "newSession.profile.badgeColorField": "표식 색상",
1822
1983
  "newSession.profile.worktreeOn": "작업 사본 사용",
1823
1984
  "newSession.profile.worktreeOff": "작업 사본 안 함",
1824
- "newSession.profile.manage": "프로필 관리",
1825
- "newSession.profile.nameLabel": "프로필 이름",
1826
- "newSession.profile.namePlaceholder": "예: 리뷰용",
1827
- "newSession.profile.confirmSave": "저장",
1828
1985
  "newSession.profile.cancel": "취소",
1829
1986
  "newSession.profile.saved": "프로필 설정이 변경되었습니다.",
1830
- "newSession.profile.dirty": "수정됨",
1831
- "newSession.profile.dirtyTitle": "프로필을 적용한 뒤 옵션을 직접 바꿨습니다.",
1832
1987
  "newSession.profile.saveFailed": "프로필을 저장하지 못했습니다.",
1833
- "newSession.profile.managerTitle": "프로필 관리",
1988
+ "newSession.profile.managerTitle": "AI 프로필 관리",
1834
1989
  "newSession.profile.managerEmpty": "저장된 프로필이 없습니다.",
1835
- "newSession.profile.rename": "이름 변경",
1836
1990
  "newSession.profile.delete": "삭제",
1837
1991
  "newSession.profile.close": "닫기",
1838
- "newSession.profile.renameAria": "{name} 이름 변경",
1839
- "newSession.profile.renameApplyAria": "{name} 이름 변경 적용",
1840
1992
  "newSession.profile.deleteAria": "{name} 삭제",
1841
1993
  "newSession.profile.fallbackAgent": "{value} 에이전트를 지금 쓸 수 없어 현재 선택을 유지했습니다.",
1842
1994
  "newSession.profile.fallbackModel": "{value} 모델이 목록에 없어 기본값으로 시작합니다.",
1843
1995
  "newSession.profile.fallbackEffort": "{value} 강도를 이 모델에서 쓸 수 없어 기본값으로 시작합니다.",
1844
1996
  "newSession.profile.fallbackWorktree": "이 프로젝트는 git 저장소가 아니라 작업 사본을 끕니다.",
1845
1997
  // specs/desktop-session-personas T9
1846
- // rename/renameAria 와 같은 규칙 — 가시 텍스트에 이름을 넣으면 버튼 폭이 행마다 달라진다.
1847
- "newSession.profile.editPersona": "페르소나 편집",
1848
- "newSession.profile.editPersonaAria": "{name} 페르소나 편집",
1849
- "newSession.profile.instructionsLabel": "{name} 지시문",
1850
1998
  "newSession.profile.instructionsPlaceholder": "예: 리뷰 관점에서만 답하라",
1851
1999
  "newSession.profile.instructionsTooLong": "지시문이 너무 깁니다 ({max}자 이하로 줄여주세요).",
1852
- "newSession.profile.instructionsSave": "{name} 지시문 저장",
1853
- "newSession.profile.skillsLabel": "배포할 스킬",
1854
- "newSession.profile.badgeIconLabel": "{name} 표식 아이콘",
1855
- "newSession.profile.badgeColorLabel": "{name} 표식 색상",
1856
- "newSession.profile.badgeSave": "{name} 표식 저장"
2000
+ "newSession.profile.skillsLabel": "배포할 스킬"
1857
2001
  };
1858
2002
  const agentBoardBroadcastKo = {
1859
2003
  "agentBoard.broadcastSelected": "선택됨",
@@ -2075,21 +2219,24 @@ const composerAddMenuKo = {
2075
2219
  "shortcuts.action.composerAttachFileDescription": "포커스된 메시지 작성란의 파일 선택기를 엽니다."
2076
2220
  };
2077
2221
  const composerQuickCommandsKo = {
2078
- "composer.quickCommands.title": "자주 사용하는 명령어",
2079
- "composer.quickCommands.emptyDraftHint": "입력창에 메시지를 입력하신 후에 저장할 수 있습니다.",
2222
+ "composer.quickCommands.title": "자주 쓰는 프롬프트",
2223
+ "composer.quickCommands.description": "선택하면 입력창에 추가됩니다",
2224
+ "composer.quickCommands.emptyDraftHint": "입력창에 문장을 쓰면 저장할 수 있습니다.",
2080
2225
  "composer.quickCommands.trigger": "Quick Commands",
2081
- "composer.quickCommands.saveCurrent": "현재 입력을 이 프로젝트의 Quick Command로 저장",
2082
- "composer.quickCommands.saveCurrentGlobal": "현재 입력을 모든 프로젝트의 Quick Command로 저장",
2226
+ "composer.quickCommands.saveScope": "현재 입력 저장",
2227
+ "composer.quickCommands.saveCurrent": "이 프로젝트에 저장",
2228
+ "composer.quickCommands.saveCurrentGlobal": "모든 프로젝트에 저장",
2083
2229
  "composer.quickCommands.storageWriteFailed": "이 기기에 저장하지 못했습니다 — 앱을 다시 시작하면 목록이 사라질 수 있습니다.",
2084
- "composer.quickCommands.empty": "저장된 Quick Command가 없습니다.",
2230
+ "composer.quickCommands.empty": "아직 저장한 프롬프트가 없습니다.",
2085
2231
  "composer.quickCommands.projectScope": "이 프로젝트",
2086
2232
  "composer.quickCommands.globalScope": "모든 프로젝트",
2087
- "composer.quickCommands.remove": '"{label}" 삭제'
2233
+ "composer.quickCommands.remove": '"{label}" 삭제',
2234
+ "composer.quickCommands.rename": '"{label}" 이름 변경'
2088
2235
  };
2089
2236
  const promptHistoryKo = {
2090
2237
  "composer.promptHistory.trigger": "입력 기록",
2091
2238
  "composer.promptHistory.triggerMac": "입력 기록 (⌃R)",
2092
- "composer.promptHistory.search": "보낸 프롬프트 검색",
2239
+ "composer.promptHistory.search": "프롬프트 검색",
2093
2240
  "composer.promptHistory.empty": "아직 보낸 프롬프트가 없습니다.",
2094
2241
  "composer.promptHistory.noMatch": "일치하는 기록이 없습니다.",
2095
2242
  "composer.promptHistory.count": "{count}건 · 이 기기에만 저장",
@@ -2495,7 +2642,6 @@ const catalogExtensionsKo = {
2495
2642
  ...sessionTokenUsageKo,
2496
2643
  ...worktreeSetupKo,
2497
2644
  ...connectionIndicatorKo,
2498
- ...voiceDictationKo,
2499
2645
  ...newSessionProfileKo,
2500
2646
  ...agentBoardBroadcastKo,
2501
2647
  ...judgementEvidenceKo,
@@ -2543,6 +2689,7 @@ const onboardingKo = {
2543
2689
  "login.dialogTitle": "Saycode 계정으로 로그인",
2544
2690
  "login.dialogDescription": "로컬 데이터는 이 컴퓨터에 그대로 남고, 현재 창만 클라우드 작업공간으로 전환됩니다.",
2545
2691
  "login.dialogClose": "로그인 닫기",
2692
+ "login.loginDevServer": "개발 서버에 로그인",
2546
2693
  "guestRecovery.title": "로컬 작업공간을 준비하지 못했어요",
2547
2694
  "guestRecovery.body": "Saycode가 로컬 런타임을 시작하지 못했습니다. 다시 시도하거나 계정으로 로그인해 클라우드 작업공간을 사용하세요.",
2548
2695
  "guestRecovery.retry": "다시 시도",
@@ -2744,6 +2891,8 @@ const recoveryPasskeyKo = {
2744
2891
  };
2745
2892
  const ko = {
2746
2893
  ...workKo,
2894
+ ...usageEntryKo,
2895
+ ...homeTabsKo,
2747
2896
  "orgRouting.sharedInput": "이 입력은 조직의 지정 분류 머신에서 처리했습니다.",
2748
2897
  "orgRouting.title": "조직 공유 자동 모드",
2749
2898
  "orgRouting.ready": "분류 머신 준비됨",
@@ -2839,14 +2988,12 @@ const ko = {
2839
2988
  "happyCliUpdate.checkRetry": "다시 확인",
2840
2989
  "happyCliUpdate.openManager": "머신 보기",
2841
2990
  "happyCliUpdate.retry": "다시 시도",
2991
+ "happyCliUpdate.snoozeOneDay": "하루동안 안보기",
2842
2992
  "happyCliUpdate.dismiss": "닫기",
2843
2993
  "happyCliUpdate.onlineEmpty": "온라인 머신이 없습니다.",
2844
2994
  "happyCliUpdate.showMore": "{count}대 더보기",
2845
2995
  "happyCliUpdate.showLess": "접기",
2846
2996
  "happyCliUpdate.updateAll": "{count}대 모두 업데이트",
2847
- "happyCliUpdate.confirmAll": "{count}대 업데이트",
2848
- "happyCliUpdate.confirmAllNotice": "{count}대의 연결이 잠시 끊길 수 있습니다.",
2849
- "happyCliUpdate.cancel": "취소",
2850
2997
  // Boot screen
2851
2998
  "boot.preparing": "Saycode 준비 중...",
2852
2999
  "boot.stage.credentials": "로그인 상태 확인 중…",
@@ -2898,9 +3045,12 @@ const ko = {
2898
3045
  "account.syncing": "캐시된 워크스페이스를 최신 정보로 동기화하는 중입니다.",
2899
3046
  "sidebar.newProject": "새 프로젝트",
2900
3047
  "sidebar.modeChats": "대화",
2901
- "sidebar.modeProjects": "프로젝트",
3048
+ "sidebar.modeProjects": "Project",
2902
3049
  "sidebar.modeAria": "사이드바 보기",
2903
3050
  "sidebar.primaryNavAria": "주요 탐색",
3051
+ "sidebar.saycodeHome": "Saycode 홈",
3052
+ "sidebar.workBoard": "작업 보드",
3053
+ "sidebar.externalIntegrations": "외부 연동",
2904
3054
  "sidebar.more": "더보기",
2905
3055
  "sidebar.moreAria": "추가 탐색",
2906
3056
  "sidebar.allConversations": "전체 대화",
@@ -2922,7 +3072,6 @@ const ko = {
2922
3072
  "sidebarPanel.newChatAria": "{name} 프로젝트에서 새 대화 시작",
2923
3073
  "home.eyebrow": "워크스페이스 홈",
2924
3074
  "home.newProject": "새 프로젝트",
2925
- "home.searchActive": "‘{query}’ 검색 결과 · 프로젝트 {count}개",
2926
3075
  "detailTab.chat": "대화",
2927
3076
  "detailTab.sessions": "대화 목록",
2928
3077
  "chat.machineOnline": "머신 온라인",
@@ -2954,10 +3103,6 @@ const ko = {
2954
3103
  "newProject.nameLabel": "프로젝트 이름",
2955
3104
  "newProject.existingFolderLabel": "기존 폴더",
2956
3105
  "newProject.choose": "선택",
2957
- "newProject.summaryBlank": "빈 동기화 프로젝트를 만듭니다.",
2958
- "newProject.summaryGit": "프로젝트를 만들고 선택한 머신에서 Git 가져오기를 시작합니다.",
2959
- "newProject.summaryZip": "프로젝트를 만들고 선택한 머신에서 선택한 ZIP/파일을 가져옵니다.",
2960
- "newProject.summaryExistingFolder": "기존 절대 경로 폴더를 동기화 프로젝트로 등록합니다.",
2961
3106
  "newProject.creating": "만드는 중...",
2962
3107
  "newProject.createAction": "프로젝트 만들기",
2963
3108
  "newProject.importAction": "프로젝트 가져오기",
@@ -2983,8 +3128,6 @@ const ko = {
2983
3128
  "composer.attachmentPreviewOpen": "{name} 크게 보기",
2984
3129
  "composer.attachmentPreviewDialog": "첨부 이미지 미리보기",
2985
3130
  "composer.attachmentPreviewClose": "첨부 이미지 미리보기 닫기",
2986
- "composer.voiceLiveTitle": "실시간 음성 인식",
2987
- "composer.voiceLiveHint": "말씀하시면 인식된 문장이 여기에 바로 표시됩니다.",
2988
3131
  "upload.kindImage": "이미지",
2989
3132
  "upload.kindFile": "파일",
2990
3133
  "upload.tooLarge": '"{name}"이(가) 너무 큽니다. 최대 {limit}MB까지 첨부할 수 있습니다.',
@@ -4235,7 +4378,6 @@ const ko = {
4235
4378
  // Session reconnect / interrupt / delete flow
4236
4379
  "session.recreatedButAssignFailed": "대화는 다시 만들었지만 프로젝트 연결 확인에 실패했습니다. {detail}",
4237
4380
  "session.continuedNew": "기존 대화 연결이 끊겨 새 대화로 이어서 보냈습니다.",
4238
- "session.reactivated": "기존 대화를 다시 활성화했습니다.",
4239
4381
  "session.reconnectNoMachine": "대화를 다시 연결할 머신 정보를 찾을 수 없습니다.",
4240
4382
  "session.cannotReconnect": "이 대화는 다시 연결할 수 없어 기존 요청에 답변할 수 없습니다. 새 대화에서 이어가세요.",
4241
4383
  "session.recreateNoProject": "대화를 다시 만들 프로젝트 정보를 찾을 수 없습니다.",
@@ -4420,15 +4562,9 @@ const ko = {
4420
4562
  "machinePicker.label": "머신",
4421
4563
  "machinePicker.addMachine": "머신 추가",
4422
4564
  "machinePicker.noMachines": "등록된 머신이 없습니다. 먼저 머신을 등록해 주세요.",
4423
- "machinePicker.onlyMachine": "{name} · 이 머신에서 시작합니다",
4565
+ "machinePicker.noOnlineMachines": "온라인 머신이 없습니다. 머신을 켜거나 연결해 주세요.",
4424
4566
  "machinePicker.online": "온라인",
4425
4567
  "machinePicker.offline": "지금 꺼져 있음",
4426
- "machinePicker.recommended": "추천",
4427
- "machinePicker.reasonOnlyOnline": "온라인인 유일한 머신이에요",
4428
- "machinePicker.reasonLeastLoaded": "가장 여유 있는 머신이에요",
4429
- "machinePicker.loadLight": "여유 있음",
4430
- "machinePicker.loadModerate": "보통",
4431
- "machinePicker.loadHeavy": "혼잡",
4432
4568
  // Machine dialog / deploy URL bar / project detail / memory layer
4433
4569
  "machineDialog.selectOnline": "새 대화를 시작할 온라인 머신을 선택하세요.",
4434
4570
  "deployUrlBar.copyUrl": "URL 복사",
@@ -4466,7 +4602,6 @@ const ko = {
4466
4602
  "projectSection.communityTitle": "프로젝트 커뮤니티",
4467
4603
  "projectSection.communityLoading": "커뮤니티 프로젝트를 불러오는 중입니다...",
4468
4604
  "projectSection.communityEmpty": "공개된 커뮤니티 프로젝트가 없습니다.",
4469
- "projectSection.searchEmpty": "검색 결과가 없습니다.",
4470
4605
  "preview.tokenFailedStatus": "Preview 토큰 발급 실패 ({status})",
4471
4606
  "preview.tokenFailed": "Preview 토큰 발급에 실패했습니다.",
4472
4607
  "preview.tokenUrlInvalid": "Preview 토큰 URL이 올바르지 않습니다.",
@@ -4555,7 +4690,7 @@ const ko = {
4555
4690
  "chat.noSessionTitle": "대화가 없습니다",
4556
4691
  "chat.noSessionBody": "이 프로젝트에는 아직 연결된 대화가 없습니다.",
4557
4692
  "chat.loadingOlder": "불러오는 중...",
4558
- "chat.loadOlder": "이전 대화 불러오기",
4693
+ "chat.loadOlder": "이전 대화",
4559
4694
  "chat.search.newer": "새로운 결과",
4560
4695
  "chat.search.close": "찾기 닫기",
4561
4696
  "chat.search.partial": "이전 메시지 더 있음",
@@ -4606,11 +4741,6 @@ const ko = {
4606
4741
  "agentActivity.waiting": "응답을 기다리는 중",
4607
4742
  "agentActivity.logLines": "로그 {count}줄",
4608
4743
  "agentActivity.elapsed": "경과 {duration}",
4609
- "agentActivity.took": "{duration} 소요",
4610
- "agentActivity.complete": "응답 완료",
4611
- "agentActivity.refreshAria": "대화 새로고침",
4612
- "agentActivity.refreshTitle": "대화 영역만 새로고침",
4613
- "agentActivity.refresh": "새로고침",
4614
4744
  "toolCall.answerSubmitted": "답변 제출됨",
4615
4745
  "toolCall.originalTool": "원본 도구",
4616
4746
  "toolCall.resultImages": "도구가 돌려준 이미지",
@@ -4647,7 +4777,6 @@ const ko = {
4647
4777
  "templates.required": "시작할 템플릿을 선택해 주세요.",
4648
4778
  "templates.onlineOnly": "템플릿 프로젝트는 온라인 머신에서만 시작할 수 있습니다.",
4649
4779
  "templates.unknown": "선택한 템플릿을 찾을 수 없습니다.",
4650
- "templates.summary": "검증된 템플릿 파일로 프로젝트를 만들고, 첫 프롬프트를 입력창에 채웁니다.",
4651
4780
  "templates.importedNotice": "'{name}' 프로젝트를 템플릿에서 만들었습니다. 파일 {count}개를 준비했고 첫 프롬프트를 입력창에 채웠습니다.",
4652
4781
  "templates.partialNotice": "'{name}' 프로젝트는 생성했지만 템플릿 적용이 완전하지 않습니다. {detail}",
4653
4782
  "templates.galleryLabel": "프로젝트 템플릿",
@@ -4818,7 +4947,7 @@ const ko = {
4818
4947
  "workspace.loadLatestFailed": "최신 워크스페이스 정보를 불러오지 못했습니다.",
4819
4948
  "workspace.refreshFailed": "워크스페이스를 새로고침하지 못했습니다.",
4820
4949
  "workspace.responseStalled": "에이전트가 {seconds}초 넘게 새 출력을 내지 않고 있습니다. 긴 작업(빌드·테스트) 중일 수 있어 응답 대기를 유지합니다.",
4821
- "workspace.syncPausedNetwork": "네트워크 문제로 응답 동기화가 중단되었습니다. 연결 복구 후 대화 새로고침으로 최신 응답을 확인해 주세요.",
4950
+ "workspace.syncPausedNetwork": "네트워크 문제로 응답 동기화가 중단되었습니다. 네트워크 연결 상태를 확인해 주세요.",
4822
4951
  "workspace.syncResumed": "네트워크가 복구되어 응답 동기화가 재개되었습니다.",
4823
4952
  "workspace.syncDelayedNetwork": "네트워크 문제로 응답 동기화가 지연되고 있습니다. 연결이 복구되면 자동으로 이어집니다.",
4824
4953
  "workspace.syncStoppedNoSession": "대화 메시지를 찾을 수 없어 응답 대기를 중지했습니다. 새 대화에서 이어가세요.",
@@ -5063,6 +5192,23 @@ const ko = {
5063
5192
  "connectors.apiKeySaving": "검증 중…",
5064
5193
  "connectors.apiKeyFailed": "API Key를 확인하지 못했습니다. 키와 meetings:read 권한을 확인해 주세요.",
5065
5194
  "connectors.googleOrgOnly": "Google 커넥터는 회사 계정으로만 연결할 수 있습니다.",
5195
+ "integrations.title": "연동",
5196
+ "integrations.description": "즐겨 쓰는 서비스와 Saycode를 연결해 대화에서 활용하세요.",
5197
+ "integrations.localDescription": "이 기기에서 사용할 확장을 설치하고 관리하세요. 온라인 계정 연동은 Cloud 모드에서 사용할 수 있습니다.",
5198
+ "integrations.connected": "연결됨",
5199
+ "integrations.noConnections": "아직 연결된 서비스가 없습니다.",
5200
+ "integrations.available": "사용 가능한 연동",
5201
+ "integrations.search": "연동 검색",
5202
+ "integrations.noResults": "검색 결과가 없습니다.",
5203
+ "integrations.statusFailed": "커넥터 상태를 확인하지 못했습니다. 새로고침해서 다시 시도하세요.",
5204
+ "integrations.confirmDisconnect": "연결 해제 확인",
5205
+ "integrations.provider.notion": "문서와 위키를 검색하고 불러옵니다.",
5206
+ "integrations.provider.slack": "채널과 메시지를 검색하고 읽습니다.",
5207
+ "integrations.provider.google-drive": "Drive 파일을 검색하고 읽습니다.",
5208
+ "integrations.provider.gmail": "메일과 스레드를 검색하고 읽습니다.",
5209
+ "integrations.provider.knoi": "회의와 기록을 검색하고 읽습니다.",
5210
+ "integrations.provider.github": "저장소 가져오기와 PR 작업에 사용합니다.",
5211
+ "integrations.provider.gitlab": "저장소 가져오기와 PR 작업에 사용합니다.",
5066
5212
  "remoteDir.emptyResponse": "머신이 빈 디렉토리 목록 응답을 반환했습니다.",
5067
5213
  "remoteDir.listFailed": "원격 디렉토리 목록을 불러오지 못했습니다.",
5068
5214
  "remoteFile.sha256Failed": "SHA-256를 계산할 수 없습니다 (crypto.subtle 사용 불가).",
@@ -5078,7 +5224,7 @@ const ko = {
5078
5224
  "codexRecovery.limit-reached": "적용한 계정도 사용 한도에 도달했습니다. 여유가 있는 계정으로 로그인한 뒤 다시 적용하세요.",
5079
5225
  "codexRecovery.probe.locked": "이 대화의 암호화 키를 사용할 수 없습니다. Saycode 로그인 상태와 대화 접근 권한을 확인하세요.",
5080
5226
  "codexRecovery.probe.connection": "대화 실행 프로세스에 연결하지 못했습니다. 연결 상태를 확인하고 상태를 다시 조회하세요.",
5081
- "codexRecovery.probe.missing": "이 대화의 실행 프로세스가 복구 요청을 받지 못했습니다. CLI 설치와 별개로 기존 프로세스가 남아 있거나 종료됐을 수 있습니다. 대기 중인 대화라면 대화 계속하기로 재개한 뒤 상태를 다시 확인하세요.",
5227
+ "codexRecovery.probe.missing": "이 대화의 실행 프로세스가 복구 요청을 받지 못했습니다. CLI 설치와 별개로 기존 프로세스가 남아 있거나 종료됐을 수 있습니다. 대기 중인 대화라면 메시지를 보내 재개한 뒤 상태를 다시 확인하세요.",
5082
5228
  "codexRecovery.probe.invalid": "복구 상태 응답을 해석하지 못했습니다. 대화의 암호화 상태와 실행 중인 런타임의 호환성을 확인하세요.",
5083
5229
  "codexRecovery.probe.changed": "조회 중 로그인 또는 대화 암호화 상태가 바뀌었습니다. 상태를 다시 확인하세요.",
5084
5230
  "codexRecovery.continuePrompt": "이어서 진행해줘.",
@@ -5148,14 +5294,8 @@ const ko = {
5148
5294
  ...previewTunnelKo,
5149
5295
  ...recoveryPasskeyKo,
5150
5296
  // Composer / ask-user / workspace defaults + git status (non-hook + App composer)
5151
- "composer.endedSessionNotice": "이 대화는 잠시 대기 중이에요. 메시지를 보내면 자동으로 이어서 계속됩니다.",
5152
5297
  "session.badge.standby": "대기",
5153
5298
  "session.badge.done": "완료",
5154
- "composer.endedSessionAria": "종료된 대화 복구",
5155
- "composer.continueConversation": "대화 계속하기",
5156
- "composer.continuingConversation": "대화 복구 중...",
5157
- "composer.startNewConversation": "새 대화 시작",
5158
- "composer.recoveryFailed": "기존 대화를 다시 열지 못했습니다. 새 대화를 시작해 이어가세요. ({detail})",
5159
5299
  "askUser.otherLabel": "기타 (직접 입력)",
5160
5300
  "askUser.questionFallback": "질문 {index}",
5161
5301
  "age.unknown": "알 수 없음",
@@ -13660,7 +13800,7 @@ function defaultEffortForAgent(agent, model) {
13660
13800
  const newSessionAgents = [
13661
13801
  { id: "claude", label: "Claude", provider: "Anthropic" },
13662
13802
  { id: "codex", label: "Codex", provider: "OpenAI" },
13663
- { id: "opencode", label: "opencode", provider: "opencode" },
13803
+ { id: "opencode", label: "Opencode", provider: "opencode" },
13664
13804
  { id: "grok", label: "Grok", provider: "xAI" }
13665
13805
  ];
13666
13806
  function parseStarterAgent(value2) {
@@ -29858,6 +29998,7 @@ async function captureCliVoicePrompt(context, voiceFile, waitForStop) {
29858
29998
  }
29859
29999
  }
29860
30000
  const USAGE_SETTINGS_NAVIGATION_DESTINATIONS = [
30001
+ "settings_onboarding",
29861
30002
  "settings_profile",
29862
30003
  "settings_system_prompt",
29863
30004
  "settings_personal_memory",
@@ -29927,6 +30068,7 @@ const USAGE_NAVIGATION_DESTINATIONS = [
29927
30068
  "all_conversations",
29928
30069
  "machines",
29929
30070
  "organization_home",
30071
+ "integrations",
29930
30072
  "settings",
29931
30073
  "organization_admin",
29932
30074
  "system_admin",
@@ -33704,17 +33846,19 @@ function createHostController(deps) {
33704
33846
  };
33705
33847
  }
33706
33848
  async function reconcileOne(spec, deps) {
33707
- if (deps.isRevoked(spec.extensionId, spec.version)) return "revoked";
33708
33849
  let current = deps.registry.get(spec.extensionId);
33709
- if (current?.installedVersion !== spec.version) {
33710
- if (await deps.official.versionOf(spec.extensionId) !== spec.version) return "unavailable";
33850
+ const target = current?.installedVersion === spec.version ? spec.version : await deps.official.versionOf(spec.extensionId);
33851
+ if (!target) return "unavailable";
33852
+ if (deps.isRevoked(spec.extensionId, target)) return "revoked";
33853
+ if (current?.installedVersion !== target) {
33711
33854
  const installed = await deps.store.install(await deps.official.archive(spec.extensionId));
33712
- if (installed.id !== spec.extensionId || installed.version !== spec.version) return "failed";
33713
- current = await deps.registry.apply(spec.extensionId, current ? { type: "update-installed", version: spec.version } : { type: "installed", version: spec.version });
33855
+ if (installed.id !== spec.extensionId || installed.version !== target) return "failed";
33856
+ current = await deps.registry.apply(spec.extensionId, current ? { type: "update-installed", version: target } : { type: "installed", version: target });
33714
33857
  }
33715
33858
  if (!current) return "failed";
33716
33859
  if (!current.enabled) current = await deps.registry.apply(spec.extensionId, { type: "enabled" }) ?? current;
33717
- const wanted = new Set(spec.approvedPermissions);
33860
+ const declared = new Set((await deps.store.readInstalledManifest(spec.extensionId, target)).permissions);
33861
+ const wanted = new Set(spec.approvedPermissions.filter((permission) => declared.has(permission)));
33718
33862
  for (const permission of current.approvedPermissions) {
33719
33863
  if (!wanted.has(permission)) await deps.registry.apply(spec.extensionId, { type: "permission-revoked", permission });
33720
33864
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buzzni/saycode-cli",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
4
4
  "description": "Drive Saycode sessions across your machines from the terminal.",
5
5
  "type": "module",
6
6
  "bin": {