@buzzni/saycode-cli 0.9.0 → 0.9.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.
- package/channel-extension-host.mjs +22 -2
- package/index.mjs +437 -107
- package/package.json +1 -1
package/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createInterface } from "node:readline";
|
|
3
3
|
import { homedir, tmpdir, platform, totalmem, freemem, cpus, userInfo, hostname as hostname$1 } from "node:os";
|
|
4
|
-
import fs, { readFileSync, mkdirSync, writeFileSync, rmSync, chmodSync, constants as constants$3, existsSync, realpathSync, createWriteStream,
|
|
4
|
+
import fs, { readFileSync, mkdirSync, writeFileSync, rmSync, chmodSync, constants as constants$3, appendFileSync, existsSync, realpathSync, createWriteStream, openSync, fstatSync, readSync, closeSync, accessSync, statSync } from "node:fs";
|
|
5
5
|
import path$1, { dirname, join, basename, extname, delimiter, win32, resolve, sep, relative, isAbsolute } from "node:path";
|
|
6
6
|
import { createHash, randomUUID, randomBytes, generateKeyPairSync, sign, createHmac, timingSafeEqual, createPublicKey, verify } from "node:crypto";
|
|
7
7
|
import require$$0$5, { Buffer as Buffer$1 } from "buffer";
|
|
@@ -49,7 +49,7 @@ function _mergeNamespaces(n, m) {
|
|
|
49
49
|
}
|
|
50
50
|
return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { value: "Module" }));
|
|
51
51
|
}
|
|
52
|
-
const version$3 = "0.9.
|
|
52
|
+
const version$3 = "0.9.2";
|
|
53
53
|
const manifest = {
|
|
54
54
|
version: version$3
|
|
55
55
|
};
|
|
@@ -427,9 +427,6 @@ const chatWorkKo = {
|
|
|
427
427
|
"trialStarter.tips.title": "연동하여 내 메일 문서를 채팅에서 작업해보세요.",
|
|
428
428
|
"trialStarter.upload.action": "내 파일 올리기",
|
|
429
429
|
"trialStarter.upload.hint": "워드·엑셀·PDF 그대로",
|
|
430
|
-
"chatWork.replaceTitle": "예시로 바꿀까요?",
|
|
431
|
-
"chatWork.replaceBody": "작성한 내용은 예시로 바뀌고, 내 파일은 그대로 남아요.",
|
|
432
|
-
"chatWork.replace": "예시로 바꾸기",
|
|
433
430
|
"chatWork.cancel": "취소",
|
|
434
431
|
"chatWork.preparing": "샘플 준비 중…",
|
|
435
432
|
"chatWork.sampleFailed": "샘플을 준비하지 못했어요. 다시 선택하거나 내 파일을 올려 주세요.",
|
|
@@ -1060,6 +1057,10 @@ const organizationStartKo = {
|
|
|
1060
1057
|
"organizationStart.diagnostic.action.publicMissing": "조직 관리자에게 공용 인증 등록을 확인해 달라고 요청한 뒤 다시 연결해주세요.",
|
|
1061
1058
|
"organizationStart.diagnostic.reason.publicApply": "회사 공용 AI 인증을 이 컴퓨터에 적용하지 못했어요.",
|
|
1062
1059
|
"organizationStart.diagnostic.action.publicApply": "네트워크 연결을 확인하고 다시 연결해주세요. 계속 실패하면 진단 정보를 조직 관리자에게 전달해주세요.",
|
|
1060
|
+
"organizationStart.diagnostic.reason.notDedicated": "이 PC가 이 계정의 조직 전용 PC로 등록되어 있지 않아요.",
|
|
1061
|
+
"organizationStart.diagnostic.action.notDedicated": "조직 관리자에게 조직 관리 → PC에서 이 PC를 이 계정의 전용 PC로 다시 등록해 달라고 요청해주세요.",
|
|
1062
|
+
"organizationStart.diagnostic.reason.registrationChanged": "이 PC의 조직 등록이 바뀌었거나 삭제되어 이 계정으로 연결할 수 없어요.",
|
|
1063
|
+
"organizationStart.diagnostic.action.registrationChanged": "조직 관리자에게 조직 관리 → PC에서 이 PC의 등록을 확인해 달라고 요청한 뒤 다시 시도해주세요.",
|
|
1063
1064
|
"organizationStart.diagnostic.reason.publicVerify": "공용 인증을 적용했지만 AI 인증 사용을 확인하지 못했어요.",
|
|
1064
1065
|
"organizationStart.diagnostic.action.publicVerify": "조직 관리자에게 최신 공용 인증 복구를 요청한 뒤 다시 연결해주세요."
|
|
1065
1066
|
};
|
|
@@ -1297,6 +1298,8 @@ const chatSchedulesKo = {
|
|
|
1297
1298
|
"chatSchedules.navigation": "예약",
|
|
1298
1299
|
"chatSchedules.new": "새 예약",
|
|
1299
1300
|
"chatSchedules.edit": "편집",
|
|
1301
|
+
"chatSchedules.partialRead": "일부 예약을 확인하지 못했어요. 다시 확인해 주세요.",
|
|
1302
|
+
"chatSchedules.resumeDraft": "이어서 작성",
|
|
1300
1303
|
"chatSchedules.retry": "다시 확인",
|
|
1301
1304
|
"chatSchedules.loading": "예약 작업을 불러오는 중…",
|
|
1302
1305
|
"chatSchedules.loadError": "예약을 불러오지 못했습니다. 다시 확인해 주세요.",
|
|
@@ -1677,7 +1680,7 @@ const machineUsageClaudeKo = {
|
|
|
1677
1680
|
"machineUsage.coverageUnknown": "모델 한도 미확인",
|
|
1678
1681
|
"machineUsage.notObserved": "아직 확인되지 않음",
|
|
1679
1682
|
"machineUsage.scopeDiagnosis": "사용량 권한 진단 필요",
|
|
1680
|
-
"machineUsage.
|
|
1683
|
+
"machineUsage.organizationAccount": "조직계정",
|
|
1681
1684
|
"machineUsage.probeTitle": "개인 사용량 확인",
|
|
1682
1685
|
"machineUsage.probeCentral": "조직 사용량은 자동으로 확인해요. 여기서는 켜거나 새로고침할 수 없어요.",
|
|
1683
1686
|
"machineUsage.probeUpdateRequired": "사용량을 확인하려면 작업PC의 도구 버전과 계정 연결을 확인해 주세요.",
|
|
@@ -2672,6 +2675,7 @@ const personalChatsKo = {
|
|
|
2672
2675
|
"personalChats.automationSaved": "자동화 설정이 저장되었습니다",
|
|
2673
2676
|
"personalChats.automationDeleted": "자동화가 삭제되었습니다",
|
|
2674
2677
|
"personalChats.title": "내 채팅",
|
|
2678
|
+
"personalChats.compose": "새 채팅 작성",
|
|
2675
2679
|
"personalChats.newChat": "새 대화",
|
|
2676
2680
|
"personalChats.searchPlaceholder": "채팅 검색",
|
|
2677
2681
|
"personalChats.sortRecent": "최신 작업순으로 정렬",
|
|
@@ -2977,7 +2981,33 @@ const collaborationMachineKo = {
|
|
|
2977
2981
|
"collaboration.pcOffline": "작업PC가 오프라인입니다. 읽기 권한이 있는 기존 대화는 볼 수 있지만 새 실행에는 PC 연결이 필요합니다.",
|
|
2978
2982
|
"collaboration.pcUnavailable": "작업PC 정보를 확인하지 못했습니다. 기존 대화 열람과 새 실행 권한은 다릅니다. 소유자에게 PC 연결·접근 설정을 확인해 주세요.",
|
|
2979
2983
|
"collaboration.dedicatedPcUnavailable": "전용 PC에서는 함께 작업할 수 없습니다.",
|
|
2980
|
-
"collaboration.personalPcUnavailable": "개인 PC에서는 함께 작업할 수 없습니다."
|
|
2984
|
+
"collaboration.personalPcUnavailable": "개인 PC에서는 함께 작업할 수 없습니다.",
|
|
2985
|
+
"machineSharing.title": "PC 공유 설정",
|
|
2986
|
+
"machineSharing.share": "공용으로 변경",
|
|
2987
|
+
"machineSharing.dedicated": "전용으로 변경",
|
|
2988
|
+
"machineSharing.save": "저장",
|
|
2989
|
+
"machineSharing.saving": "저장 중…",
|
|
2990
|
+
"machineSharing.accessHeading": "PC 사용 가능 사용자",
|
|
2991
|
+
"machineSharing.shareHelp": "공용으로 변경하면 우선 나만 사용할 수 있습니다.",
|
|
2992
|
+
"machineSharing.selectedHelp": "허용한 사용자는 이 PC에서 작업을 실행할 수 있습니다.",
|
|
2993
|
+
"machineSharing.confirmInvite": "PC 접근 권한을 추가하고 초대할까요?",
|
|
2994
|
+
"machineSharing.confirmInviteHelp": "선택한 사용자가 이 PC를 사용할 수 있게 됩니다. 프로젝트에는 초대 수락 후 참여합니다.",
|
|
2995
|
+
"machineSharing.grantAndInvite": "권한 추가 후 초대",
|
|
2996
|
+
"machineSharing.accessGranted": "PC 접근 권한은 추가됐습니다. 실패한 프로젝트 초대는 다시 시도해 주세요.",
|
|
2997
|
+
"machineSharing.stateChanged": "PC 설정이 변경됐습니다. 다시 확인해 주세요.",
|
|
2998
|
+
"machineSharing.aiAuthRequired": "이 PC의 AI 인증을 공용으로 전환할 수 없습니다.",
|
|
2999
|
+
"machineSharing.projectConflict": "함께 작업 중인 사용자가 있어 접근 권한을 줄일 수 없습니다.",
|
|
3000
|
+
"machineSharing.membersUnavailable": "참여자를 확인하지 못했습니다. 잠시 후 다시 시도해 주세요.",
|
|
3001
|
+
"machineSharing.runtimeUnavailable": "PC 연결을 확인한 뒤 다시 시도해 주세요.",
|
|
3002
|
+
"machineSharing.ownerRequired": "PC 소유자나 머신 관리자에게 접근 권한 추가를 요청해 주세요.",
|
|
3003
|
+
"machineSharing.serverUnavailable": "공유 설정을 사용할 수 없습니다. 서버 업데이트를 확인해 주세요.",
|
|
3004
|
+
"machineSharing.requestFailed": "공유 설정 결과를 확인하지 못했습니다. 다시 확인해 주세요.",
|
|
3005
|
+
"machineSharing.loadFailed": "공유 설정을 불러오지 못했습니다.",
|
|
3006
|
+
"machineSharing.retry": "다시 확인",
|
|
3007
|
+
"machineSharing.cancel": "취소",
|
|
3008
|
+
"machineSharing.close": "닫기",
|
|
3009
|
+
"machineSharing.allMembers": "전체 조직 멤버",
|
|
3010
|
+
"machineSharing.convertFirst": "공용으로 변경한 뒤 함께 작업할 수 있습니다."
|
|
2981
3011
|
};
|
|
2982
3012
|
const collaborationKo = {
|
|
2983
3013
|
...collaborationMachineKo,
|
|
@@ -3164,7 +3194,39 @@ const projectScopeKo = {
|
|
|
3164
3194
|
"projectScope.grantRevoked": "파일 접근 권한을 철회하고 세션을 다시 시작했습니다.",
|
|
3165
3195
|
"projectScope.daemonUpgradeRequired": "Aplus CLI 업데이트 후 다시 시도해 주세요."
|
|
3166
3196
|
};
|
|
3197
|
+
const machineSettingsLabelsKo = {
|
|
3198
|
+
"machineSettings.listRefreshed": "작업PC 목록을 새로 불러왔어요.",
|
|
3199
|
+
"machineSettings.codeGenerated": "등록 코드를 만들었어요.",
|
|
3200
|
+
"machineSettings.nameSaved": "작업PC 이름을 저장했어요.",
|
|
3201
|
+
"machineSettings.nameCleared": "작업PC 이름을 지웠어요.",
|
|
3202
|
+
"machineSettings.nameSaveFailed": "작업PC 이름을 저장하지 못했어요.",
|
|
3203
|
+
"machineSettings.removed": "{name}을(를) 목록에서 삭제했어요.",
|
|
3204
|
+
"machineSettings.zrokStopped": "zrok 공유를 멈췄어요.",
|
|
3205
|
+
"machineSettings.zrokStart": "zrok 시작",
|
|
3206
|
+
"machineSettings.zrokStarting": "zrok 시작 중",
|
|
3207
|
+
"machineSettings.zrokStop": "zrok 멈추기",
|
|
3208
|
+
"machineSettings.externalServerUrl": "외부 서버 주소",
|
|
3209
|
+
"machineSettings.externalServerUrlPlaceholder": "{url}의 zrok 주소",
|
|
3210
|
+
"machineSettings.liveModeOnly": "작업PC 등록과 삭제는 실제 연결에서만 할 수 있어요.",
|
|
3211
|
+
"machineSettings.issuedCodes": "발급한 코드",
|
|
3212
|
+
"machineSettings.generateCode": "등록 코드 만들기",
|
|
3213
|
+
"machineSettings.registrationCode": "등록 코드",
|
|
3214
|
+
"machineSettings.expiresAt": "{time}에 만료",
|
|
3215
|
+
"machineSettings.expired": "만료됨",
|
|
3216
|
+
"machineSettings.copyCommand": "명령 복사",
|
|
3217
|
+
"machineSettings.commandCopied": "복사됨",
|
|
3218
|
+
"machineSettings.loadingCodes": "코드를 불러오는 중…",
|
|
3219
|
+
"machineSettings.loadingMachines": "작업PC를 불러오는 중…",
|
|
3220
|
+
"machineSettings.emptyTitle": "작업PC 없음",
|
|
3221
|
+
"machineSettings.emptyOrganization": "선택한 조직에서 쓸 수 있는 작업PC가 없어요.",
|
|
3222
|
+
"machineSettings.emptyWorkspace": "현재 작업공간에서 쓸 수 있는 작업PC가 없어요.",
|
|
3223
|
+
"machineSettings.rename": "이름 변경",
|
|
3224
|
+
"machineSettings.delete": "삭제",
|
|
3225
|
+
"machineSettings.confirmDelete": "삭제 확인",
|
|
3226
|
+
"machineSettings.organization": "조직"
|
|
3227
|
+
};
|
|
3167
3228
|
const machineSettingsConsoleKo = {
|
|
3229
|
+
...machineSettingsLabelsKo,
|
|
3168
3230
|
"machineConsole.showDetails": "작업PC 상세 정보 보이기",
|
|
3169
3231
|
"machineConsole.showDetailsHint": "작업PC 선택 목록에서 마우스를 올리거나 키보드로 이동하면 상세 정보를 보여 줍니다.",
|
|
3170
3232
|
"machineConsole.environmentStatus": "환경·상태",
|
|
@@ -3276,6 +3338,8 @@ const newSessionProfileKo = {
|
|
|
3276
3338
|
"newSession.profile.none": "프로필 없음",
|
|
3277
3339
|
"newSession.profile.executionSettings": "실행 설정",
|
|
3278
3340
|
"newSession.profile.editSettings": "편집",
|
|
3341
|
+
"newSession.profile.saving": "저장 중…",
|
|
3342
|
+
"newSession.profile.temporarySelection": "현재 환경에 맞춰 표시 중이며, AI·모델·강도를 직접 바꾸기 전까지 저장된 선택은 유지됩니다.",
|
|
3279
3343
|
"newSession.profile.saveChanges": "변경사항 저장",
|
|
3280
3344
|
"newSession.profile.instructionsField": "추가 지시문",
|
|
3281
3345
|
"newSession.profile.badgeIconField": "표식 아이콘",
|
|
@@ -4048,14 +4112,12 @@ const agentBrowserConsoleKo = {
|
|
|
4048
4112
|
"browserPanel.agentBrowserUnauthorized": "로그인이 만료되었습니다. 다시 로그인한 뒤 콘솔을 여세요.",
|
|
4049
4113
|
"browserPanel.agentBrowserExpired": "콘솔 접근 권한이 만료되었습니다. AI 브라우저 작업 콘솔을 다시 여세요.",
|
|
4050
4114
|
"browserPanel.agentBrowserFailed": "AI 브라우저 콘솔 권한을 받지 못했습니다. 잠시 뒤 다시 시도하세요.",
|
|
4051
|
-
"agentBrowser.chat.showNotice": "AI 브라우저
|
|
4052
|
-
"agentBrowser.chat.showNoticeHint": "대화
|
|
4053
|
-
"agentBrowser.chat.title": "AI 브라우저",
|
|
4115
|
+
"agentBrowser.chat.showNotice": "AI 브라우저 버튼 보이기",
|
|
4116
|
+
"agentBrowser.chat.showNoticeHint": "대화 오른쪽 위에 AI 브라우저 열기 버튼을 보여 줍니다.",
|
|
4054
4117
|
"agentBrowser.chat.notice": "로그인이나 승인이 필요하면 AI 브라우저 콘솔에서 직접 처리할 수 있어요.",
|
|
4055
4118
|
"agentBrowser.chat.ownersBrowser": "이 대화의 브라우저 작업은 대화를 만든 사람의 로그인으로 실행됩니다.",
|
|
4056
4119
|
"agentBrowser.chat.ownersBrowserNamed": "이 대화의 브라우저 작업은 {name}님의 로그인으로 실행됩니다.",
|
|
4057
|
-
"agentBrowser.chat.open": "브라우저
|
|
4058
|
-
"agentBrowser.chat.dismiss": "AI 브라우저 안내 닫기",
|
|
4120
|
+
"agentBrowser.chat.open": "AI 브라우저 열기",
|
|
4059
4121
|
"agentBrowser.chat.modeMismatch": "작업PC의 AI 브라우저 설정이 공용·전용 구분과 맞지 않아 브라우저를 사용할 수 없어요. 관리자에게 작업PC 설정 확인을 요청해 주세요.",
|
|
4060
4122
|
"agentBrowser.confirm.title": "다른 사람의 로그인으로 실행됩니다",
|
|
4061
4123
|
"agentBrowser.confirm.titleNamed": "{name}님의 로그인으로 실행됩니다",
|
|
@@ -4374,7 +4436,7 @@ const designGuideComponentKo = {
|
|
|
4374
4436
|
"designGuide.components.tabs.rule2": "선택된 탭과 hover는 accent 면으로 구분합니다. 파란 밑줄을 쓰지 않습니다.",
|
|
4375
4437
|
"designGuide.components.tabs.rule3": "모든 탭에 닫기 버튼(24px)을 둡니다. 탭이 많으면 줄을 바꾸지 않고 가로로 스크롤합니다.",
|
|
4376
4438
|
"designGuide.components.tabs.rule4": "새 탭 버튼은 탭 행 끝에 28px 아이콘 버튼으로 둡니다. 중앙 대화 탭 행은 새 대화 작성 아이콘(SquarePen), 우측 도구 탭 행은 추가 메뉴 아이콘(…)을 씁니다. 방향키로 탭 사이를 옮길 수 있습니다.",
|
|
4377
|
-
"designGuide.components.tabs.rule5": "
|
|
4439
|
+
"designGuide.components.tabs.rule5": "Project 화면에는 모든 사용자에게 Build·Develop 36px 알약 탭을 표시하고 선택 표시는 260ms 동안 이동합니다. Chat은 사이드바 메뉴에서 별도의 입력 화면으로 엽니다.",
|
|
4378
4440
|
"designGuide.components.tabs.rule6": "중앙 대화 탭과 우측 도구 탭은 끌어서 순서를 바꿀 수 있습니다. Cmd+W는 마지막으로 누르거나 포커스한 탭을 닫기 버튼과 같은 방식으로 닫고, 마지막 탭이어도 창은 닫지 않습니다. 닫기 버튼 툴팁에 이 단축키를 적습니다.",
|
|
4379
4441
|
"designGuide.components.tabs.note": "작업 탭 행은 WorkspaceHost 안에서 작업 상태와 함께 그려져 따로 렌더할 수 없습니다. 같은 클래스로 모양만 보여 주고, 2단계에서 탭 행을 부품으로 나누면 실물로 바꿉니다. 지금 탭 모서리는 7px, 닫기 버튼은 5px이라 모서리 단계와 다릅니다. 우측 도구 탭(.workspace-tool-tab)은 값은 같지만 클래스가 따로 있어 2단계에서 한 부품으로 묶습니다.",
|
|
4380
4442
|
"designGuide.components.listRows": "목록 행",
|
|
@@ -4383,7 +4445,7 @@ const designGuideComponentKo = {
|
|
|
4383
4445
|
"designGuide.components.listRows.rule2": "행 끝에는 추가 메뉴(…)와 고정 버튼만 둡니다. 이름 변경, 보관, 복사, 삭제는 추가 메뉴 안에 있습니다. 두 버튼은 hover나 키보드 포커스 때만 보이고, 숨어 있을 때는 제목 자리를 차지하지 않습니다. 대화 목록(Project, Chat)은 행 앞 대화 아이콘을 두지 않고, Chat 목록에서 고정된 행의 핀은 늘 보여 줍니다.",
|
|
4384
4446
|
"designGuide.components.listRows.rule3": "행 제목은 한 줄로 줄이고, 전체 이름은 hover 툴팁으로 보여 줍니다.",
|
|
4385
4447
|
"designGuide.components.listRows.rule4": "끌어서 순서를 바꿀 때는 놓일 자리에 2px 브랜드색 선을 그리고, 실제로 놓이는 자리와 맞춥니다.",
|
|
4386
|
-
"designGuide.components.listRows.rule5": "사이드바
|
|
4448
|
+
"designGuide.components.listRows.rule5": "사이드바 상단 주요 메뉴(Chat, Project, 작업보드, 예약, 외부 연동)는 44px 행, 15px 글자, 18px 아이콘을 사용합니다. 작업보드와 예약은 표시 설정에 따라 나타납니다. 호버·선택은 옅은 브랜드색 배경으로 구분하고, Chat·Project 상세에서는 상단 메뉴 대신 현재 목록 항목만 선택 표시합니다.",
|
|
4387
4449
|
"designGuide.components.toasts": "전역 알림",
|
|
4388
4450
|
"designGuide.components.toasts.intro": "어느 화면에서 일어난 일이든 창 위쪽 가운데에 띄우는 알림입니다. 버튼을 누르면 실제 알림이 뜹니다.",
|
|
4389
4451
|
"designGuide.components.toasts.rule1": "모든 토스트는 공통 FloatingNotice와 이 실제 예제를 사용합니다. 창 상단 중앙에 표시하고 빈 text로 숨겨 퇴장 효과를 유지합니다.",
|
|
@@ -4912,6 +4974,9 @@ const machineSetupKo = {
|
|
|
4912
4974
|
"machineSetup.installTitle": "CLI 설치",
|
|
4913
4975
|
"machineSetup.cloudTitle": "Saycode 클라우드",
|
|
4914
4976
|
"machineSetup.standaloneTitle": "이 컴퓨터 연결",
|
|
4977
|
+
"machineSetup.selfHostTitle": "이 서버에 작업PC 연결",
|
|
4978
|
+
"machineSetup.pairingCode": "연결 코드",
|
|
4979
|
+
"machineSetup.selfHostHelp": "새 작업PC에서 로그인 명령을 실행하면 연결 코드가 나옵니다. 서버에서 그 코드를 승인한 뒤 새 작업PC에서 데몬을 시작하세요.",
|
|
4915
4980
|
"machineSetup.serverAddress": "서버 주소",
|
|
4916
4981
|
"machineSetup.authHelp": "happy auth login을 실행하면 모바일 앱 또는 웹 URL을 통해 작업PC를 등록할 수 있습니다.",
|
|
4917
4982
|
"machineSetup.organizationHelp": "조직 전용·공용 PC는 아래에서 발급한 명령을 새 작업PC에서 실행해 등록하세요."
|
|
@@ -5058,9 +5123,7 @@ const ko = {
|
|
|
5058
5123
|
"networkDataSaver.deferred.memory": "Memory Layer 대화 백필",
|
|
5059
5124
|
"networkDataSaver.deferred.gitPr": "백그라운드 Git 및 PR 새로고침",
|
|
5060
5125
|
"happyCliUpdate.title": "Aplus CLI 업데이트",
|
|
5061
|
-
"happyCliUpdate.checkTitle": "Aplus CLI 업데이트",
|
|
5062
5126
|
"happyCliUpdate.managerTitle": "Aplus CLI 업데이트",
|
|
5063
|
-
"happyCliUpdate.impact": "업데이트 중 머신 연결이 잠시 끊길 수 있습니다.",
|
|
5064
5127
|
"happyCliUpdate.update": "업데이트",
|
|
5065
5128
|
"happyCliUpdate.updating": "업데이트 중…",
|
|
5066
5129
|
"happyCliUpdate.updated": "업데이트됨",
|
|
@@ -6936,6 +6999,7 @@ const ko = {
|
|
|
6936
6999
|
"runtimeEvent.claudeNotFound": "Claude Code를 시작하지 못했어요. 이 작업PC에서 실행 파일을 찾지 못했어요. 이 작업PC에 happy-cli를 다시 설치해 주세요.",
|
|
6937
7000
|
"runtimeEvent.claudeStoppedBySignal": "Claude Code를 시작하지 못했어요. 예기치 않게 멈췄어요({signal}). 이 작업PC의 daemon 로그를 확인해 주세요.",
|
|
6938
7001
|
"runtimeEvent.claudeCouldNotStart": "이 작업PC에서 Claude Code를 시작하지 못했어요. 자세한 내용은 이 작업PC의 daemon 로그를 확인해 주세요.",
|
|
7002
|
+
"runtimeEvent.claudeNotSignedIn": "이 작업PC에서 Claude Code에 로그인되어 있지 않아요. 이 작업PC의 daemon을 실행하는 사용자로 로그인한 뒤(`claude` 실행 후 /login) 메시지를 다시 보내 주세요.",
|
|
6939
7003
|
"runtimeEvent.compactionCompleted": "대화 요약을 마쳤습니다. 이제 요약본을 맥락으로 이어갑니다.",
|
|
6940
7004
|
"runtimeEvent.codexError": "Codex 오류: {detail}",
|
|
6941
7005
|
"runtimeEvent.codexNoImages": "Codex 로 보낼 수 있는 이미지가 없었습니다.",
|
|
@@ -8261,6 +8325,21 @@ In a chat
|
|
|
8261
8325
|
/model · /effort · /voice [path] · /detach · /exit live chat commands
|
|
8262
8326
|
|
|
8263
8327
|
Leaving never stops a remote session — it keeps running on the machine.`;
|
|
8328
|
+
const record$i = (value2) => !!value2 && typeof value2 === "object" && !Array.isArray(value2);
|
|
8329
|
+
const ids = (value2) => Array.isArray(value2) && value2.length <= 1e3 && value2.every((id2) => typeof id2 === "string" && id2.trim().length > 0);
|
|
8330
|
+
function parseMachineSharing(value2) {
|
|
8331
|
+
if (!record$i(value2) || !record$i(value2.machine)) throw new Error("Invalid machine sharing response");
|
|
8332
|
+
const m = value2.machine;
|
|
8333
|
+
if (typeof value2.revision !== "string" || !value2.revision || !["canShare", "canMakeDedicated", "canManageAccess"].every((key) => typeof value2[key] === "boolean") || !["machineId", "ownerId", "companyId", "infraMode"].every((key) => typeof m[key] === "string" && !!m[key]) || !["dedicated", "shared"].includes(String(m.type)) || !ids(m.accessList) || m.accessList.length === 0 || m.accessList.includes("*") && m.accessList.length !== 1 || m.assignedUserId != null && typeof m.assignedUserId !== "string" || value2.missingUserIds !== void 0 && !ids(value2.missingUserIds)) throw new Error("Invalid machine sharing response");
|
|
8334
|
+
return {
|
|
8335
|
+
machine: m,
|
|
8336
|
+
revision: value2.revision,
|
|
8337
|
+
canShare: value2.canShare,
|
|
8338
|
+
canMakeDedicated: value2.canMakeDedicated,
|
|
8339
|
+
canManageAccess: value2.canManageAccess,
|
|
8340
|
+
missingUserIds: value2.missingUserIds ?? []
|
|
8341
|
+
};
|
|
8342
|
+
}
|
|
8264
8343
|
const BASE64_PATTERN$3 = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
|
|
8265
8344
|
function versionedAutomationBase64(value2, maxBytes, exactBytes) {
|
|
8266
8345
|
if (typeof value2 !== "string" || !value2 || value2.length > Math.ceil(maxBytes / 3) * 4 || !BASE64_PATTERN$3.test(value2)) {
|
|
@@ -13387,14 +13466,14 @@ const $ZodObjectJIT = /* @__PURE__ */ $constructor("$ZodObjectJIT", (inst, def)
|
|
|
13387
13466
|
return `shape[${k}]._zod.run({ value: input[${k}], issues: [] }, ctx)`;
|
|
13388
13467
|
};
|
|
13389
13468
|
doc.write(`const input = payload.value;`);
|
|
13390
|
-
const
|
|
13469
|
+
const ids2 = /* @__PURE__ */ Object.create(null);
|
|
13391
13470
|
let counter = 0;
|
|
13392
13471
|
for (const key of normalized.keys) {
|
|
13393
|
-
|
|
13472
|
+
ids2[key] = `key_${counter++}`;
|
|
13394
13473
|
}
|
|
13395
13474
|
doc.write(`const newResult = {};`);
|
|
13396
13475
|
for (const key of normalized.keys) {
|
|
13397
|
-
const id2 =
|
|
13476
|
+
const id2 = ids2[key];
|
|
13398
13477
|
const k = esc(key);
|
|
13399
13478
|
doc.write(`const ${id2} = ${parseStr(key)};`);
|
|
13400
13479
|
doc.write(`
|
|
@@ -19465,6 +19544,7 @@ const CLAUDE_PROVIDER_PATTERN = /rate.?limit|too many requests|overloaded|model[
|
|
|
19465
19544
|
const INACTIVITY_PREFIX = "stopped automatically";
|
|
19466
19545
|
const PROCESS_EXITED_NOTICE = "process exited unexpectedly";
|
|
19467
19546
|
const CLAUDE_OAUTH_FAILURE = /^Failed to authenticate\. API Error: 401 OAuth access token is invalid\.$/i;
|
|
19547
|
+
const CLAUDE_NOT_SIGNED_IN = /^(?:Not logged in · Please run \/login|Claude Code is not signed in on this machine\.)/i;
|
|
19468
19548
|
const CLAUDE_SUBSCRIPTION_REFUSAL = /^Your organization has disabled Claude subscription access for Claude Code(?:\s*[·.—-]\s*Use an Anthropic API key instead, or ask your admin to enable access)?\.?$/i;
|
|
19469
19549
|
function unsupportedModelSurface(text2) {
|
|
19470
19550
|
if (detectModelLimitNotice(text2) || text2.toLowerCase().includes("requires a newer version of codex")) return null;
|
|
@@ -19480,7 +19560,7 @@ function messageErrorSurface(message) {
|
|
|
19480
19560
|
if (message.role !== "agent" || message.thinking || message.toolCall) return null;
|
|
19481
19561
|
const text2 = message.content?.trim() ?? "";
|
|
19482
19562
|
if (CLAUDE_SUBSCRIPTION_REFUSAL.test(text2)) return { layer: "auth", code: "subscription_access_disabled", retryable: false };
|
|
19483
|
-
if (CLAUDE_OAUTH_FAILURE.test(text2)) return { layer: "auth", code: "auth_failed", retryable: false };
|
|
19563
|
+
if (CLAUDE_OAUTH_FAILURE.test(text2) || CLAUDE_NOT_SIGNED_IN.test(text2)) return { layer: "auth", code: "auth_failed", retryable: false };
|
|
19484
19564
|
return /^(you['’]ve|you have) reached your [a-z0-9.-]+ limit\./i.test(text2) && detectModelLimitNotice(text2) ? { layer: "provider", code: "model_limit", retryable: true } : null;
|
|
19485
19565
|
}
|
|
19486
19566
|
function classifyErrorSurface(rawText) {
|
|
@@ -19490,7 +19570,7 @@ function classifyErrorSurface(rawText) {
|
|
|
19490
19570
|
if (text2 === "") return null;
|
|
19491
19571
|
const lower = text2.toLowerCase();
|
|
19492
19572
|
if (CLAUDE_SUBSCRIPTION_REFUSAL.test(text2)) return { layer: "auth", code: "subscription_access_disabled", retryable: false };
|
|
19493
|
-
if (CLAUDE_OAUTH_FAILURE.test(text2)) return { layer: "auth", code: "auth_failed", retryable: false };
|
|
19573
|
+
if (CLAUDE_OAUTH_FAILURE.test(text2) || CLAUDE_NOT_SIGNED_IN.test(text2)) return { layer: "auth", code: "auth_failed", retryable: false };
|
|
19494
19574
|
if (detectModelLimitNotice(text2)) {
|
|
19495
19575
|
return { layer: "provider", code: "model_limit", retryable: true };
|
|
19496
19576
|
}
|
|
@@ -19527,6 +19607,8 @@ const KNOWN_NOTICES = [
|
|
|
19527
19607
|
["Claude Code could not start: it refuses to run with permission prompts skipped as root. Run this machine's daemon as a regular user.", "runtimeEvent.claudeRootRefused"],
|
|
19528
19608
|
["Claude Code could not start: its executable could not be found on this machine. Reinstall happy-cli on it.", "runtimeEvent.claudeNotFound"],
|
|
19529
19609
|
["Claude Code could not start on this machine. Check this machine's daemon log for details.", "runtimeEvent.claudeCouldNotStart"],
|
|
19610
|
+
// happy-cli `CLAUDE_NOT_SIGNED_IN_NOTICE` (R36).
|
|
19611
|
+
["Claude Code is not signed in on this machine. Sign in as the user that runs this machine's daemon (run `claude`, then /login) and send the message again.", "runtimeEvent.claudeNotSignedIn"],
|
|
19530
19612
|
["No supported images were available to send to Codex.", "runtimeEvent.codexNoImages"],
|
|
19531
19613
|
[
|
|
19532
19614
|
"Force-stopped active task after interrupt timeout. Codex backend was restarted and the previous thread was resumed.",
|
|
@@ -29138,25 +29220,25 @@ const MAX_CACHED_BODY_AGE_MS = 10 * 6e4;
|
|
|
29138
29220
|
const SESSION_ROW_CACHE_IDLE_MS = 10 * 6e4;
|
|
29139
29221
|
const rowsByScope = /* @__PURE__ */ new Map();
|
|
29140
29222
|
const versionUnsupportedUntilByScope = /* @__PURE__ */ new Map();
|
|
29141
|
-
async function lookupSessionRowsIncremental(
|
|
29142
|
-
if (
|
|
29143
|
-
const remember = (rows2) => rememberRows(deps.scope,
|
|
29223
|
+
async function lookupSessionRowsIncremental(ids2, deps) {
|
|
29224
|
+
if (ids2.length === 0) return [];
|
|
29225
|
+
const remember = (rows2) => rememberRows(deps.scope, ids2, rows2, deps.now());
|
|
29144
29226
|
if (deps.now() < (versionUnsupportedUntilByScope.get(deps.scope) ?? 0)) {
|
|
29145
|
-
return remember(stamp(await deps.fetchFull(
|
|
29227
|
+
return remember(stamp(await deps.fetchFull(ids2), deps.now()));
|
|
29146
29228
|
}
|
|
29147
|
-
const versions = await deps.fetchVersions(
|
|
29229
|
+
const versions = await deps.fetchVersions(ids2);
|
|
29148
29230
|
if (versions === null) {
|
|
29149
29231
|
{
|
|
29150
29232
|
versionUnsupportedUntilByScope.set(deps.scope, deps.now() + VERSION_PROJECTION_RETRY_MS);
|
|
29151
29233
|
}
|
|
29152
|
-
return remember(stamp(await deps.fetchFull(
|
|
29234
|
+
return remember(stamp(await deps.fetchFull(ids2), deps.now()));
|
|
29153
29235
|
}
|
|
29154
29236
|
if (versions.some(isFullRow)) {
|
|
29155
29237
|
return remember(stamp(versions.filter(isFullRow), deps.now()));
|
|
29156
29238
|
}
|
|
29157
29239
|
const cached2 = rowsByScope.get(deps.scope);
|
|
29158
29240
|
const seenAt = deps.now();
|
|
29159
|
-
const requested = new Set(
|
|
29241
|
+
const requested = new Set(ids2);
|
|
29160
29242
|
const plan = versions.flatMap((row2) => {
|
|
29161
29243
|
const id2 = row2 && typeof row2.id === "string" ? row2.id : null;
|
|
29162
29244
|
if (!id2 || !requested.has(id2)) return [];
|
|
@@ -29224,7 +29306,9 @@ function parseVersionRow(row2) {
|
|
|
29224
29306
|
const machineRegistryCache = /* @__PURE__ */ new Map();
|
|
29225
29307
|
const MACHINE_REGISTRY_CACHE_TTL_MS = 10 * 6e4;
|
|
29226
29308
|
const MACHINE_REGISTRY_CACHE_MAX_ENTRIES = 32;
|
|
29309
|
+
let machineRegistryCacheGeneration = 0;
|
|
29227
29310
|
function clearMachineRegistryCache() {
|
|
29311
|
+
machineRegistryCacheGeneration++;
|
|
29228
29312
|
machineRegistryCache.clear();
|
|
29229
29313
|
}
|
|
29230
29314
|
const TRANSCRIPTION_PATH = "/api/transcriptions";
|
|
@@ -30497,6 +30581,18 @@ class ApiClient {
|
|
|
30497
30581
|
);
|
|
30498
30582
|
return parseProjectMembersPayload(data);
|
|
30499
30583
|
}
|
|
30584
|
+
async getMachineSharing(machineId, userIds = []) {
|
|
30585
|
+
const query = new URLSearchParams({ machineId });
|
|
30586
|
+
for (const id2 of userIds) query.append("userId", id2);
|
|
30587
|
+
return parseMachineSharing(await this.request(`/api/machines/sharing?${query}`, { boundary: "api" }));
|
|
30588
|
+
}
|
|
30589
|
+
async changeMachineSharing(machineId, command) {
|
|
30590
|
+
try {
|
|
30591
|
+
return parseMachineSharing(await this.request("/api/machines/sharing", { boundary: "api", method: "POST", body: JSON.stringify({ machineId, ...command }), timeoutMs: 35e3 }));
|
|
30592
|
+
} finally {
|
|
30593
|
+
clearMachineRegistryCache();
|
|
30594
|
+
}
|
|
30595
|
+
}
|
|
30500
30596
|
async getCompanyMemberDirectoryPage(companyId, cursor) {
|
|
30501
30597
|
const data = await this.request(buildCompanyMemberDirectoryPath(companyId, cursor), { boundary: "api" });
|
|
30502
30598
|
return parseCompanyMemberDirectoryPage(data);
|
|
@@ -30925,6 +31021,7 @@ class ApiClient {
|
|
|
30925
31021
|
if (machineIds.length === 0) return {};
|
|
30926
31022
|
const cacheKey = `${this.config.apiToken ?? ""}\0${[...machineIds].sort().join(",")}`;
|
|
30927
31023
|
const now = Date.now();
|
|
31024
|
+
const generation = machineRegistryCacheGeneration;
|
|
30928
31025
|
const cached2 = machineRegistryCache.get(cacheKey);
|
|
30929
31026
|
if (cached2 && now - cached2.at < MACHINE_REGISTRY_CACHE_TTL_MS) return cached2.value;
|
|
30930
31027
|
try {
|
|
@@ -30934,7 +31031,7 @@ class ApiClient {
|
|
|
30934
31031
|
);
|
|
30935
31032
|
const value2 = indexMachineRegistry(Array.isArray(data) ? data : data.machines ?? []);
|
|
30936
31033
|
if (machineRegistryCache.size >= MACHINE_REGISTRY_CACHE_MAX_ENTRIES) machineRegistryCache.clear();
|
|
30937
|
-
machineRegistryCache.set(cacheKey, { at: now, value: value2 });
|
|
31034
|
+
if (generation === machineRegistryCacheGeneration) machineRegistryCache.set(cacheKey, { at: now, value: value2 });
|
|
30938
31035
|
return value2;
|
|
30939
31036
|
} catch (error) {
|
|
30940
31037
|
console.warn("[machines] registry enrichment failed; falling back to hostnames", error);
|
|
@@ -31114,37 +31211,37 @@ class ApiClient {
|
|
|
31114
31211
|
hasNext: data.hasNext === true
|
|
31115
31212
|
};
|
|
31116
31213
|
}
|
|
31117
|
-
async lookupSessionSeqs(
|
|
31118
|
-
if (
|
|
31214
|
+
async lookupSessionSeqs(ids2, tokenOverride) {
|
|
31215
|
+
if (ids2.length === 0) return [];
|
|
31119
31216
|
const data = await this.request("/v2/sessions/lookup", {
|
|
31120
31217
|
method: "POST",
|
|
31121
31218
|
boundary: "sync",
|
|
31122
31219
|
tokenOverride,
|
|
31123
|
-
body: JSON.stringify({ ids, projection: "seq" })
|
|
31220
|
+
body: JSON.stringify({ ids: ids2, projection: "seq" })
|
|
31124
31221
|
});
|
|
31125
|
-
const requested = new Set(
|
|
31222
|
+
const requested = new Set(ids2);
|
|
31126
31223
|
return (data.sessions ?? []).flatMap((row2) => row2 && typeof row2.id === "string" && requested.has(row2.id) && typeof row2.seq === "number" && Number.isSafeInteger(row2.seq) && row2.seq >= 0 ? [{ id: row2.id, seq: row2.seq }] : []);
|
|
31127
31224
|
}
|
|
31128
|
-
async lookupApiSessions(
|
|
31129
|
-
if (
|
|
31225
|
+
async lookupApiSessions(ids2, tokenOverride) {
|
|
31226
|
+
if (ids2.length === 0) return [];
|
|
31130
31227
|
const data = await this.request("/v2/sessions/lookup", {
|
|
31131
31228
|
method: "POST",
|
|
31132
31229
|
boundary: "sync",
|
|
31133
31230
|
tokenOverride,
|
|
31134
|
-
body: JSON.stringify({ ids })
|
|
31231
|
+
body: JSON.stringify({ ids: ids2 })
|
|
31135
31232
|
});
|
|
31136
31233
|
return data.sessions ?? [];
|
|
31137
31234
|
}
|
|
31138
|
-
async lookupSessions(candidateKeys,
|
|
31235
|
+
async lookupSessions(candidateKeys, ids2, tokenOverride, accountPrivateKey = null) {
|
|
31139
31236
|
const boundaryGeneration2 = sessionDekRegistryGeneration();
|
|
31140
|
-
const rows = await this.lookupApiSessions(
|
|
31237
|
+
const rows = await this.lookupApiSessions(ids2, tokenOverride);
|
|
31141
31238
|
await preDecryptSessionHeaders(rows, accountPrivateKey, boundaryGeneration2);
|
|
31142
31239
|
return rows.map((row2) => apiSessionToSession(row2, candidateKeys));
|
|
31143
31240
|
}
|
|
31144
31241
|
/** Runtime poll only: bodies are refetched only when a version or key presence moved. */
|
|
31145
|
-
async lookupSessionsForRuntime(candidateKeys,
|
|
31242
|
+
async lookupSessionsForRuntime(candidateKeys, ids2, tokenOverride, accountPrivateKey = null) {
|
|
31146
31243
|
const boundaryGeneration2 = sessionDekRegistryGeneration();
|
|
31147
|
-
const rows = await lookupSessionRowsIncremental(
|
|
31244
|
+
const rows = await lookupSessionRowsIncremental(ids2, {
|
|
31148
31245
|
scope: `${this.config.syncBaseUrl}\0${tokenOverride ?? this.config.syncToken ?? ""}`,
|
|
31149
31246
|
fetchVersions: (chunk) => this.request("/v2/sessions/lookup", {
|
|
31150
31247
|
method: "POST",
|
|
@@ -32542,8 +32639,8 @@ class CliRest {
|
|
|
32542
32639
|
return data.sessions ?? [];
|
|
32543
32640
|
}
|
|
32544
32641
|
/** Rows for the given ids, however old: the list above stops at the latest 150. */
|
|
32545
|
-
async lookupSessions(
|
|
32546
|
-
const data = await this.request("/v2/sessions/lookup", { method: "POST", body: JSON.stringify({ ids }) });
|
|
32642
|
+
async lookupSessions(ids2) {
|
|
32643
|
+
const data = await this.request("/v2/sessions/lookup", { method: "POST", body: JSON.stringify({ ids: ids2 }) });
|
|
32547
32644
|
return data.sessions ?? [];
|
|
32548
32645
|
}
|
|
32549
32646
|
async recentMessages(sessionId, limit, afterSeq) {
|
|
@@ -33046,6 +33143,10 @@ function renderTurnEnd(status, reason) {
|
|
|
33046
33143
|
const TOOL_SUMMARY_MAX_LENGTH = 80;
|
|
33047
33144
|
const TOOL_PROGRESS_VISIBLE_LINES = 3;
|
|
33048
33145
|
const TOOL_SUMMARY_KEYS = ["command", "file_path", "path", "pattern", "query", "url", "prompt"];
|
|
33146
|
+
const TITLE_TOOL = "mcp__happy__change_title";
|
|
33147
|
+
function isInternalTitleCall(name, args) {
|
|
33148
|
+
return name === TITLE_TOOL || name === "ToolSearch" && args.query === `select:${TITLE_TOOL}`;
|
|
33149
|
+
}
|
|
33049
33150
|
function truncate(value2, max) {
|
|
33050
33151
|
if (value2.length <= max) return value2;
|
|
33051
33152
|
return `${value2.slice(0, max - 1)}…`;
|
|
@@ -33075,6 +33176,10 @@ function renderSessionEvent(ev, envelopeRole, progressByCall, options) {
|
|
|
33075
33176
|
case "service":
|
|
33076
33177
|
return textLines(ev.text, "status");
|
|
33077
33178
|
case "tool-call-start": {
|
|
33179
|
+
if (isInternalTitleCall(ev.name, ev.args)) {
|
|
33180
|
+
progressByCall.set(ev.call, { shown: 0, hidden: 0, lastHidden: null, muted: true });
|
|
33181
|
+
return [];
|
|
33182
|
+
}
|
|
33078
33183
|
progressByCall.set(ev.call, { shown: 0, hidden: 0, lastHidden: null });
|
|
33079
33184
|
const summary = summarizeToolArgs(ev.args) ?? (ev.description?.trim() || null);
|
|
33080
33185
|
return [{ style: "tool", text: summary ? `⏺ ${ev.name}(${summary})` : `⏺ ${ev.name}` }];
|
|
@@ -33082,6 +33187,7 @@ function renderSessionEvent(ev, envelopeRole, progressByCall, options) {
|
|
|
33082
33187
|
case "tool-call-progress": {
|
|
33083
33188
|
const state = progressByCall.get(ev.call) ?? { shown: 0, hidden: 0, lastHidden: null };
|
|
33084
33189
|
progressByCall.set(ev.call, state);
|
|
33190
|
+
if (state.muted) return [];
|
|
33085
33191
|
const lines = [];
|
|
33086
33192
|
for (const line2 of ev.lines) {
|
|
33087
33193
|
if (ev.stream === "stderr") lines.push({ style: "error", text: ` │ ${line2}` });
|
|
@@ -40428,8 +40534,8 @@ const processEvidence = (error) => {
|
|
|
40428
40534
|
const { code, stderr } = error ?? {};
|
|
40429
40535
|
if (typeof code === "string" && /^[A-Z][A-Z0-9_]{1,31}$/.test(code)) return `PowerShell could not start: ${code}`;
|
|
40430
40536
|
if (typeof code !== "number") return "";
|
|
40431
|
-
const
|
|
40432
|
-
return [`PowerShell exit ${code}`, ...
|
|
40537
|
+
const ids2 = [...String(stderr ?? "").replace(/_x[0-9A-Fa-f]{4}_/g, " ").matchAll(/FullyQualifiedErrorId\s*:\s*([A-Za-z][\w.,-]{0,79})/g)].map((match) => match[1]).slice(0, 3);
|
|
40538
|
+
return [`PowerShell exit ${code}`, ...ids2].join(", ");
|
|
40433
40539
|
};
|
|
40434
40540
|
async function runAclProtection(run2, mode2) {
|
|
40435
40541
|
let reason = "";
|
|
@@ -40603,12 +40709,23 @@ async function serverLockHolder(layout) {
|
|
|
40603
40709
|
const pid = typeof holder?.pid === "number" ? holder.pid : null;
|
|
40604
40710
|
return pid !== null && processIsAlive(pid) ? pid : null;
|
|
40605
40711
|
}
|
|
40712
|
+
function serverLogWriter(layout, name) {
|
|
40713
|
+
const file = join(layout.logsDir, `${name}.log`);
|
|
40714
|
+
return (line2) => {
|
|
40715
|
+
try {
|
|
40716
|
+
mkdirSync(layout.logsDir, { recursive: true, mode: 448 });
|
|
40717
|
+
appendFileSync(file, `${(/* @__PURE__ */ new Date()).toISOString()} ${line2}
|
|
40718
|
+
`, { mode: 384 });
|
|
40719
|
+
} catch {
|
|
40720
|
+
}
|
|
40721
|
+
};
|
|
40722
|
+
}
|
|
40606
40723
|
const happyCliPackageName = "@buzzni/happy-cli";
|
|
40607
|
-
const happyCliVersion = "1.1.10-aplus.
|
|
40608
|
-
const happyCliTag = "happy-cli-v1.1.10-aplus.
|
|
40609
|
-
const vendorCommit = "
|
|
40724
|
+
const happyCliVersion = "1.1.10-aplus.318";
|
|
40725
|
+
const happyCliTag = "happy-cli-v1.1.10-aplus.318";
|
|
40726
|
+
const vendorCommit = "236706106627e00c5b212fab7f9f98ce3ea05d97";
|
|
40610
40727
|
const saycodeCliVersion = "0.8.2";
|
|
40611
|
-
const happyServerVersion = "0.1.
|
|
40728
|
+
const happyServerVersion = "0.1.2";
|
|
40612
40729
|
const releaseFeatures = { "mcpRuntimeRecovery": { "enabled": true, "releaseState": "released", "sourceBranch": "main", "sourceHead": "a79a10e288cf7775cb15955f716693c6a7df1640", "requiredCommit": "975e32cf" } };
|
|
40613
40730
|
const pin = {
|
|
40614
40731
|
happyCliPackageName,
|
|
@@ -54198,8 +54315,8 @@ function isMachineTokensStoreValid(value2) {
|
|
|
54198
54315
|
return normalizeMachineTokensStore(value2).tokens.length === candidate.tokens.length;
|
|
54199
54316
|
}
|
|
54200
54317
|
function attachStandaloneLocalMachineRegistry(machine, localMachineId, ownerId, resources) {
|
|
54201
|
-
if (!localMachineId || machine.id !== localMachineId) return machine;
|
|
54202
54318
|
const existing = machine.registry && typeof machine.registry === "object" && !Array.isArray(machine.registry) ? machine.registry : {};
|
|
54319
|
+
if (!localMachineId || machine.id !== localMachineId) return { ...machine, registry: { ...existing, ownerId, type: "personal" } };
|
|
54203
54320
|
const existingWorkspaceRoot = typeof existing.workspaceRoot === "string" ? existing.workspaceRoot.trim() : process.env.HAPPY_WORKSPACE_ROOT?.trim() ?? "";
|
|
54204
54321
|
return {
|
|
54205
54322
|
...machine,
|
|
@@ -54402,9 +54519,6 @@ const chatWorkEn = {
|
|
|
54402
54519
|
"trialStarter.tips.title": "Connect to work with your email and documents in chat.",
|
|
54403
54520
|
"trialStarter.upload.action": "Upload my file",
|
|
54404
54521
|
"trialStarter.upload.hint": "Word, Excel or PDF as is",
|
|
54405
|
-
"chatWork.replaceTitle": "Replace your draft?",
|
|
54406
|
-
"chatWork.replaceBody": "Your files stay attached. Only the draft is replaced.",
|
|
54407
|
-
"chatWork.replace": "Use example",
|
|
54408
54522
|
"chatWork.cancel": "Cancel",
|
|
54409
54523
|
"chatWork.preparing": "Preparing samples…",
|
|
54410
54524
|
"chatWork.sampleFailed": "Could not prepare samples. Try again or add your files.",
|
|
@@ -55035,6 +55149,10 @@ const organizationStartEn = {
|
|
|
55035
55149
|
"organizationStart.diagnostic.action.publicMissing": "Ask your organization administrator to check the shared credentials, then reconnect.",
|
|
55036
55150
|
"organizationStart.diagnostic.reason.publicApply": "Company shared AI credentials could not be applied to this computer.",
|
|
55037
55151
|
"organizationStart.diagnostic.action.publicApply": "Check the network and reconnect. If it keeps failing, send diagnostics to your administrator.",
|
|
55152
|
+
"organizationStart.diagnostic.reason.notDedicated": "This PC is not registered as this account's dedicated organization PC.",
|
|
55153
|
+
"organizationStart.diagnostic.action.notDedicated": "Ask your organization administrator to register this PC again as your dedicated PC under Organization admin → PCs.",
|
|
55154
|
+
"organizationStart.diagnostic.reason.registrationChanged": "This PC's organization registration was changed or deleted, so it cannot connect with this account.",
|
|
55155
|
+
"organizationStart.diagnostic.action.registrationChanged": "Ask your organization administrator to check this PC's registration under Organization admin → PCs, then try again.",
|
|
55038
55156
|
"organizationStart.diagnostic.reason.publicVerify": "Shared credentials were applied, but usable AI authentication was not confirmed.",
|
|
55039
55157
|
"organizationStart.diagnostic.action.publicVerify": "Ask your administrator to restore the latest shared credentials, then reconnect."
|
|
55040
55158
|
};
|
|
@@ -55272,6 +55390,8 @@ const chatSchedulesEn = {
|
|
|
55272
55390
|
"chatSchedules.navigation": "Schedules",
|
|
55273
55391
|
"chatSchedules.new": "New task",
|
|
55274
55392
|
"chatSchedules.edit": "Edit",
|
|
55393
|
+
"chatSchedules.partialRead": "Some tasks could not be read. Please try again.",
|
|
55394
|
+
"chatSchedules.resumeDraft": "Resume draft",
|
|
55275
55395
|
"chatSchedules.retry": "Try again",
|
|
55276
55396
|
"chatSchedules.loading": "Loading scheduled tasks…",
|
|
55277
55397
|
"chatSchedules.loadError": "Could not load tasks. Try again.",
|
|
@@ -55652,7 +55772,7 @@ const machineUsageClaudeEn = {
|
|
|
55652
55772
|
"machineUsage.coverageUnknown": "model limits unknown",
|
|
55653
55773
|
"machineUsage.notObserved": "not observed yet",
|
|
55654
55774
|
"machineUsage.scopeDiagnosis": "usage scope diagnosis required",
|
|
55655
|
-
"machineUsage.
|
|
55775
|
+
"machineUsage.organizationAccount": "Organization account",
|
|
55656
55776
|
"machineUsage.probeTitle": "Personal usage observations",
|
|
55657
55777
|
"machineUsage.probeCentral": "Organization usage is provided by the central collector. Local consent and refresh are unavailable.",
|
|
55658
55778
|
"machineUsage.probeUpdateRequired": "Update the machine runtime or resolve this account reference to enable personal observations.",
|
|
@@ -56647,6 +56767,7 @@ const personalChatsEn = {
|
|
|
56647
56767
|
"personalChats.automationSaved": "Automation settings saved",
|
|
56648
56768
|
"personalChats.automationDeleted": "Automation deleted",
|
|
56649
56769
|
"personalChats.title": "Personal Chats",
|
|
56770
|
+
"personalChats.compose": "Compose a new chat",
|
|
56650
56771
|
"personalChats.newChat": "New chat",
|
|
56651
56772
|
"personalChats.searchPlaceholder": "Search chats",
|
|
56652
56773
|
"personalChats.sortRecent": "Sort by recent activity",
|
|
@@ -56952,7 +57073,33 @@ const collaborationMachineEn = {
|
|
|
56952
57073
|
"collaboration.pcOffline": "The project PC is offline. Existing conversations with read access remain available; new runs need the PC to reconnect.",
|
|
56953
57074
|
"collaboration.pcUnavailable": "Project PC information could not be verified. Reading existing conversations and starting new work have separate permissions. Ask the owner to check PC access and connection.",
|
|
56954
57075
|
"collaboration.dedicatedPcUnavailable": "Collaboration is unavailable on dedicated PCs.",
|
|
56955
|
-
"collaboration.personalPcUnavailable": "Collaboration is unavailable on personal PCs."
|
|
57076
|
+
"collaboration.personalPcUnavailable": "Collaboration is unavailable on personal PCs.",
|
|
57077
|
+
"machineSharing.title": "PC sharing settings",
|
|
57078
|
+
"machineSharing.share": "Make shared",
|
|
57079
|
+
"machineSharing.dedicated": "Make dedicated",
|
|
57080
|
+
"machineSharing.save": "Save",
|
|
57081
|
+
"machineSharing.saving": "Saving…",
|
|
57082
|
+
"machineSharing.accessHeading": "Users with PC access",
|
|
57083
|
+
"machineSharing.shareHelp": "Sharing starts with access for you only.",
|
|
57084
|
+
"machineSharing.selectedHelp": "Allowed users can run work on this PC.",
|
|
57085
|
+
"machineSharing.confirmInvite": "Grant PC access and invite?",
|
|
57086
|
+
"machineSharing.confirmInviteHelp": "Selected users will be able to use this PC. They join the project after accepting the invitation.",
|
|
57087
|
+
"machineSharing.grantAndInvite": "Grant access and invite",
|
|
57088
|
+
"machineSharing.accessGranted": "PC access was granted. Retry any failed project invitations.",
|
|
57089
|
+
"machineSharing.stateChanged": "PC settings changed. Check again.",
|
|
57090
|
+
"machineSharing.aiAuthRequired": "This PC’s AI credentials cannot be converted to shared use.",
|
|
57091
|
+
"machineSharing.projectConflict": "Existing collaborators would lose access.",
|
|
57092
|
+
"machineSharing.membersUnavailable": "Could not verify project members. Try again shortly.",
|
|
57093
|
+
"machineSharing.runtimeUnavailable": "Check the PC connection and try again.",
|
|
57094
|
+
"machineSharing.ownerRequired": "Ask the PC owner or machine administrator to grant access.",
|
|
57095
|
+
"machineSharing.serverUnavailable": "Sharing settings are unavailable. Check the server update.",
|
|
57096
|
+
"machineSharing.requestFailed": "Could not confirm the sharing result. Check again.",
|
|
57097
|
+
"machineSharing.loadFailed": "Could not load sharing settings.",
|
|
57098
|
+
"machineSharing.retry": "Check again",
|
|
57099
|
+
"machineSharing.cancel": "Cancel",
|
|
57100
|
+
"machineSharing.close": "Close",
|
|
57101
|
+
"machineSharing.allMembers": "All organization members",
|
|
57102
|
+
"machineSharing.convertFirst": "Make this PC shared to collaborate."
|
|
56956
57103
|
};
|
|
56957
57104
|
const collaborationEn = {
|
|
56958
57105
|
...collaborationMachineEn,
|
|
@@ -57139,7 +57286,39 @@ const projectScopeEn = {
|
|
|
57139
57286
|
"projectScope.grantRevoked": "File access was revoked and the session restarted.",
|
|
57140
57287
|
"projectScope.daemonUpgradeRequired": "Update Aplus CLI, then try again."
|
|
57141
57288
|
};
|
|
57289
|
+
const machineSettingsLabelsEn = {
|
|
57290
|
+
"machineSettings.listRefreshed": "Machine list refreshed.",
|
|
57291
|
+
"machineSettings.codeGenerated": "Registration code generated.",
|
|
57292
|
+
"machineSettings.nameSaved": "Machine name saved.",
|
|
57293
|
+
"machineSettings.nameCleared": "Machine name cleared.",
|
|
57294
|
+
"machineSettings.nameSaveFailed": "Could not save the machine name.",
|
|
57295
|
+
"machineSettings.removed": "{name} was removed.",
|
|
57296
|
+
"machineSettings.zrokStopped": "zrok share stopped.",
|
|
57297
|
+
"machineSettings.zrokStart": "Start zrok",
|
|
57298
|
+
"machineSettings.zrokStarting": "Starting zrok",
|
|
57299
|
+
"machineSettings.zrokStop": "Stop zrok",
|
|
57300
|
+
"machineSettings.externalServerUrl": "External server URL",
|
|
57301
|
+
"machineSettings.externalServerUrlPlaceholder": "zrok URL for {url}",
|
|
57302
|
+
"machineSettings.liveModeOnly": "Machine registration and deletion are available in live mode.",
|
|
57303
|
+
"machineSettings.issuedCodes": "Issued codes",
|
|
57304
|
+
"machineSettings.generateCode": "Generate code",
|
|
57305
|
+
"machineSettings.registrationCode": "Registration code",
|
|
57306
|
+
"machineSettings.expiresAt": "Expires {time}",
|
|
57307
|
+
"machineSettings.expired": "Expired",
|
|
57308
|
+
"machineSettings.copyCommand": "Copy command",
|
|
57309
|
+
"machineSettings.commandCopied": "Copied",
|
|
57310
|
+
"machineSettings.loadingCodes": "Loading codes…",
|
|
57311
|
+
"machineSettings.loadingMachines": "Loading machines…",
|
|
57312
|
+
"machineSettings.emptyTitle": "No machines",
|
|
57313
|
+
"machineSettings.emptyOrganization": "No machines are available for the selected organization.",
|
|
57314
|
+
"machineSettings.emptyWorkspace": "No machines are available in the current workspace.",
|
|
57315
|
+
"machineSettings.rename": "Rename",
|
|
57316
|
+
"machineSettings.delete": "Delete",
|
|
57317
|
+
"machineSettings.confirmDelete": "Confirm delete",
|
|
57318
|
+
"machineSettings.organization": "Organization"
|
|
57319
|
+
};
|
|
57142
57320
|
const machineSettingsConsoleEn = {
|
|
57321
|
+
...machineSettingsLabelsEn,
|
|
57143
57322
|
"machineConsole.showDetails": "Show machine details",
|
|
57144
57323
|
"machineConsole.showDetailsHint": "Show details when hovering over or focusing a machine in the machine picker.",
|
|
57145
57324
|
"machineConsole.environmentStatus": "Environment",
|
|
@@ -57251,6 +57430,8 @@ const newSessionProfileEn = {
|
|
|
57251
57430
|
"newSession.profile.none": "No profile",
|
|
57252
57431
|
"newSession.profile.executionSettings": "Execution settings",
|
|
57253
57432
|
"newSession.profile.editSettings": "Edit",
|
|
57433
|
+
"newSession.profile.saving": "Saving…",
|
|
57434
|
+
"newSession.profile.temporarySelection": "Shown for the current environment. Your saved selection stays unchanged until you choose an AI, model, or effort.",
|
|
57254
57435
|
"newSession.profile.saveChanges": "Save changes",
|
|
57255
57436
|
"newSession.profile.instructionsField": "Extra instructions",
|
|
57256
57437
|
"newSession.profile.badgeIconField": "Badge icon",
|
|
@@ -58023,14 +58204,12 @@ const agentBrowserConsoleEn = {
|
|
|
58023
58204
|
"browserPanel.agentBrowserUnauthorized": "Your sign-in has expired. Sign in again, then open the console.",
|
|
58024
58205
|
"browserPanel.agentBrowserExpired": "Console access has expired. Open the AI Browser task console again.",
|
|
58025
58206
|
"browserPanel.agentBrowserFailed": "Could not get access to the AI Browser console. Try again shortly.",
|
|
58026
|
-
"agentBrowser.chat.showNotice": "Show AI Browser
|
|
58027
|
-
"agentBrowser.chat.showNoticeHint": "Show the
|
|
58028
|
-
"agentBrowser.chat.title": "AI Browser",
|
|
58207
|
+
"agentBrowser.chat.showNotice": "Show AI Browser button",
|
|
58208
|
+
"agentBrowser.chat.showNoticeHint": "Show the Open AI Browser button at the top right of conversations.",
|
|
58029
58209
|
"agentBrowser.chat.notice": "When a login or approval is needed, you can handle it yourself in the AI Browser console.",
|
|
58030
58210
|
"agentBrowser.chat.ownersBrowser": "Browser tasks in this chat run with the logins of the person who started it.",
|
|
58031
58211
|
"agentBrowser.chat.ownersBrowserNamed": "Browser tasks in this chat run with {name}'s logins.",
|
|
58032
|
-
"agentBrowser.chat.open": "Open
|
|
58033
|
-
"agentBrowser.chat.dismiss": "Dismiss AI Browser notice",
|
|
58212
|
+
"agentBrowser.chat.open": "Open AI Browser",
|
|
58034
58213
|
"agentBrowser.chat.modeMismatch": "This machine's AI Browser was installed for a different mode (shared/dedicated) than its machine type, so the browser is unavailable. Ask an administrator to check the machine's settings.",
|
|
58035
58214
|
"agentBrowser.confirm.title": "This runs with someone else's logins",
|
|
58036
58215
|
"agentBrowser.confirm.titleNamed": "This runs with {name}'s logins",
|
|
@@ -58349,7 +58528,7 @@ const designGuideComponentEn = {
|
|
|
58349
58528
|
"designGuide.components.tabs.rule2": "The selected tab and hover use the accent surface. Do not use a blue underline.",
|
|
58350
58529
|
"designGuide.components.tabs.rule3": "Every tab has a close button (24px). When there are many tabs, the row scrolls sideways instead of wrapping.",
|
|
58351
58530
|
"designGuide.components.tabs.rule4": "The new tab button is a 28px icon button at the end of the row: a compose icon (SquarePen) in the center conversation row and a more menu icon (…) in the right tool row. Arrow keys move between tabs.",
|
|
58352
|
-
"designGuide.components.tabs.rule5": "
|
|
58531
|
+
"designGuide.components.tabs.rule5": "Project shows 36px pill tabs for Build and Develop to all users. Their selection mark slides over 260ms. Chat opens its own composer from the sidebar menu.",
|
|
58353
58532
|
"designGuide.components.tabs.rule6": "Center chat tabs and right tool tabs can be dragged to reorder. Cmd+W closes the tab last clicked or focused the same way as its close button, and never closes the window, even on the last tab. The close button tooltip names this shortcut.",
|
|
58354
58533
|
"designGuide.components.tabs.note": "The work tab bar is drawn inside WorkspaceHost together with the workspace state, so it cannot render on its own. This shows the look with the same classes; once phase 2 splits the tab bar into a component, the real one replaces it. Today tabs use a 7px radius and close buttons 5px, which are off the radius steps. The right tool tabs (.workspace-tool-tab) share the values but have their own classes; phase 2 merges them into one component.",
|
|
58355
58534
|
"designGuide.components.listRows": "List rows",
|
|
@@ -58358,7 +58537,7 @@ const designGuideComponentEn = {
|
|
|
58358
58537
|
"designGuide.components.listRows.rule2": "A row ends with only a more menu (…) and a pin button; rename, archive, copy, and delete live in the more menu. Both buttons appear only on hover or keyboard focus, and take no title space while hidden. Conversation lists (Project and Chat) have no leading conversation icon, and the Chat list always shows the pin on pinned rows.",
|
|
58359
58538
|
"designGuide.components.listRows.rule3": "Row titles are cut to one line, and the full name shows in the hover tooltip.",
|
|
58360
58539
|
"designGuide.components.listRows.rule4": "While dragging to reorder, draw a 2px brand-color line where the row will land, matching the actual drop position.",
|
|
58361
|
-
"designGuide.components.listRows.rule5": "The primary
|
|
58540
|
+
"designGuide.components.listRows.rule5": "The primary sidebar menus (Chat, Project, work board, scheduled tasks, integrations) use 44px rows, 15px text, and 18px icons. Work board and scheduled tasks follow their display settings. Hover and selection use a subtle brand-color background. In Chat and Project details, only the current list item is selected; the top menus remain unselected.",
|
|
58362
58541
|
"designGuide.components.toasts": "Global notices",
|
|
58363
58542
|
"designGuide.components.toasts.intro": "Notices shown at the top center of the window, whichever screen they come from. The buttons show real notices.",
|
|
58364
58543
|
"designGuide.components.toasts.rule1": "Use the shared FloatingNotice and this live example for every toast. Show it at the top center and hide it with empty text so its exit can finish.",
|
|
@@ -58887,6 +59066,9 @@ const machineSetupEn = {
|
|
|
58887
59066
|
"machineSetup.installTitle": "Install the CLI",
|
|
58888
59067
|
"machineSetup.cloudTitle": "Saycode Cloud",
|
|
58889
59068
|
"machineSetup.standaloneTitle": "Standalone server",
|
|
59069
|
+
"machineSetup.selfHostTitle": "Connect a machine to this server",
|
|
59070
|
+
"machineSetup.pairingCode": "connection code",
|
|
59071
|
+
"machineSetup.selfHostHelp": "The sign-in command on the new machine shows a connection code. Approve that code on the server, then start the daemon on the new machine.",
|
|
58890
59072
|
"machineSetup.serverAddress": "server URL",
|
|
58891
59073
|
"machineSetup.authHelp": "Run happy auth login to register the machine through the mobile app or the displayed web URL.",
|
|
58892
59074
|
"machineSetup.organizationHelp": "Register dedicated or shared organization machines by running the command issued below on the new machine."
|
|
@@ -59032,9 +59214,7 @@ const en = {
|
|
|
59032
59214
|
"networkDataSaver.deferred.memory": "Memory Layer conversation backfill",
|
|
59033
59215
|
"networkDataSaver.deferred.gitPr": "Background Git and PR refreshes",
|
|
59034
59216
|
"happyCliUpdate.title": "Aplus CLI update",
|
|
59035
|
-
"happyCliUpdate.checkTitle": "Aplus CLI update",
|
|
59036
59217
|
"happyCliUpdate.managerTitle": "Aplus CLI update",
|
|
59037
|
-
"happyCliUpdate.impact": "Machine connections may pause during the update.",
|
|
59038
59218
|
"happyCliUpdate.update": "Update",
|
|
59039
59219
|
"happyCliUpdate.updating": "Updating…",
|
|
59040
59220
|
"happyCliUpdate.updated": "Updated",
|
|
@@ -60846,6 +61026,7 @@ const en = {
|
|
|
60846
61026
|
"runtimeEvent.claudeNotFound": "Claude Code could not start: its executable could not be found on this machine. Reinstall happy-cli on it.",
|
|
60847
61027
|
"runtimeEvent.claudeStoppedBySignal": "Claude Code could not start: it stopped unexpectedly ({signal}). Check this machine's daemon log.",
|
|
60848
61028
|
"runtimeEvent.claudeCouldNotStart": "Claude Code could not start on this machine. Check this machine's daemon log for details.",
|
|
61029
|
+
"runtimeEvent.claudeNotSignedIn": "Claude Code is not signed in on this machine. Sign in as the user that runs this machine's daemon (run `claude`, then /login) and send the message again.",
|
|
60849
61030
|
"runtimeEvent.compactionCompleted": "Finished summarizing. The conversation continues from that summary.",
|
|
60850
61031
|
"runtimeEvent.codexError": "Codex error: {detail}",
|
|
60851
61032
|
"runtimeEvent.codexNoImages": "There were no images that could be sent to Codex.",
|
|
@@ -61674,9 +61855,6 @@ const chatWorkZh = {
|
|
|
61674
61855
|
"trialStarter.tips.title": "连接后,即可在聊天中处理自己的邮件和文档。",
|
|
61675
61856
|
"trialStarter.upload.action": "添加自己的文件",
|
|
61676
61857
|
"trialStarter.upload.hint": "Word、Excel、PDF 均可",
|
|
61677
|
-
"chatWork.replaceTitle": "替换为示例?",
|
|
61678
|
-
"chatWork.replaceBody": "只替换输入内容,您的文件会保留。",
|
|
61679
|
-
"chatWork.replace": "使用示例",
|
|
61680
61858
|
"chatWork.cancel": "取消",
|
|
61681
61859
|
"chatWork.preparing": "正在准备示例…",
|
|
61682
61860
|
"chatWork.sampleFailed": "无法准备示例。请重试或添加自己的文件。",
|
|
@@ -62307,6 +62485,10 @@ const organizationStartZh = {
|
|
|
62307
62485
|
"organizationStart.diagnostic.action.publicMissing": "请组织管理员确认共享认证已注册,然后重新连接。",
|
|
62308
62486
|
"organizationStart.diagnostic.reason.publicApply": "无法将公司的共享 AI 认证应用到此电脑。",
|
|
62309
62487
|
"organizationStart.diagnostic.action.publicApply": "请检查网络后重新连接。如果持续失败,请将诊断信息发送给组织管理员。",
|
|
62488
|
+
"organizationStart.diagnostic.reason.notDedicated": "此电脑未登记为该账号的组织专用电脑。",
|
|
62489
|
+
"organizationStart.diagnostic.action.notDedicated": "请联系组织管理员,在 组织管理 → 电脑 中将此电脑重新登记为你的专用电脑。",
|
|
62490
|
+
"organizationStart.diagnostic.reason.registrationChanged": "此电脑的组织登记已被更改或删除,无法用此账号连接。",
|
|
62491
|
+
"organizationStart.diagnostic.action.registrationChanged": "请联系组织管理员在 组织管理 → 电脑 中检查此电脑的登记,然后重试。",
|
|
62310
62492
|
"organizationStart.diagnostic.reason.publicVerify": "共享认证已应用,但未能确认 AI 认证可用。",
|
|
62311
62493
|
"organizationStart.diagnostic.action.publicVerify": "请组织管理员恢复最新共享认证,然后重新连接。"
|
|
62312
62494
|
};
|
|
@@ -62544,6 +62726,8 @@ const chatSchedulesZh = {
|
|
|
62544
62726
|
"chatSchedules.navigation": "计划",
|
|
62545
62727
|
"chatSchedules.new": "新建任务",
|
|
62546
62728
|
"chatSchedules.edit": "编辑",
|
|
62729
|
+
"chatSchedules.partialRead": "部分预约无法读取。请重试。",
|
|
62730
|
+
"chatSchedules.resumeDraft": "继续填写",
|
|
62547
62731
|
"chatSchedules.retry": "重试",
|
|
62548
62732
|
"chatSchedules.loading": "正在加载计划任务…",
|
|
62549
62733
|
"chatSchedules.loadError": "无法加载任务,请重试。",
|
|
@@ -62924,7 +63108,7 @@ const machineUsageClaudeZh = {
|
|
|
62924
63108
|
"machineUsage.coverageUnknown": "模型额度未知",
|
|
62925
63109
|
"machineUsage.notObserved": "尚未观测",
|
|
62926
63110
|
"machineUsage.scopeDiagnosis": "需要诊断用量权限",
|
|
62927
|
-
"machineUsage.
|
|
63111
|
+
"machineUsage.organizationAccount": "组织账号",
|
|
62928
63112
|
"machineUsage.probeTitle": "个人用量观测",
|
|
62929
63113
|
"machineUsage.probeCentral": "组织用量由中央收集器提供。不提供本地同意和刷新操作。",
|
|
62930
63114
|
"machineUsage.probeUpdateRequired": "启用个人观测需要更新机器运行时或确认账户引用。",
|
|
@@ -63919,6 +64103,7 @@ const personalChatsZh = {
|
|
|
63919
64103
|
"personalChats.automationSaved": "自动化设置已保存",
|
|
63920
64104
|
"personalChats.automationDeleted": "自动化已删除",
|
|
63921
64105
|
"personalChats.title": "我的对话",
|
|
64106
|
+
"personalChats.compose": "撰写新对话",
|
|
63922
64107
|
"personalChats.newChat": "新对话",
|
|
63923
64108
|
"personalChats.searchPlaceholder": "搜索对话",
|
|
63924
64109
|
"personalChats.sortRecent": "按最近活动排序",
|
|
@@ -64224,7 +64409,33 @@ const collaborationMachineZh = {
|
|
|
64224
64409
|
"collaboration.pcOffline": "工作电脑已离线。拥有读取权限的现有对话仍可查看;新的运行需要电脑连接。",
|
|
64225
64410
|
"collaboration.pcUnavailable": "无法确认工作电脑信息。阅读现有对话和启动新任务的权限不同。请联系所有者检查电脑访问设置与连接。",
|
|
64226
64411
|
"collaboration.dedicatedPcUnavailable": "专用电脑不支持协作。",
|
|
64227
|
-
"collaboration.personalPcUnavailable": "个人电脑不支持协作。"
|
|
64412
|
+
"collaboration.personalPcUnavailable": "个人电脑不支持协作。",
|
|
64413
|
+
"machineSharing.title": "PC 共享设置",
|
|
64414
|
+
"machineSharing.share": "改为共享",
|
|
64415
|
+
"machineSharing.dedicated": "改为专用",
|
|
64416
|
+
"machineSharing.save": "保存",
|
|
64417
|
+
"machineSharing.saving": "正在保存…",
|
|
64418
|
+
"machineSharing.accessHeading": "可使用 PC 的用户",
|
|
64419
|
+
"machineSharing.shareHelp": "改为共享后,最初只有你可以使用。",
|
|
64420
|
+
"machineSharing.selectedHelp": "获准用户可以在此 PC 上运行任务。",
|
|
64421
|
+
"machineSharing.confirmInvite": "添加 PC 访问权限并邀请?",
|
|
64422
|
+
"machineSharing.confirmInviteHelp": "所选用户将能使用此 PC。接受邀请后才会加入项目。",
|
|
64423
|
+
"machineSharing.grantAndInvite": "添加权限并邀请",
|
|
64424
|
+
"machineSharing.accessGranted": "已添加 PC 访问权限。请重试失败的项目邀请。",
|
|
64425
|
+
"machineSharing.stateChanged": "PC 设置已更改,请重新确认。",
|
|
64426
|
+
"machineSharing.aiAuthRequired": "此 PC 的 AI 凭据无法转换为共享使用。",
|
|
64427
|
+
"machineSharing.projectConflict": "现有协作者会失去访问权限,无法减少权限。",
|
|
64428
|
+
"machineSharing.membersUnavailable": "无法确认项目成员,请稍后重试。",
|
|
64429
|
+
"machineSharing.runtimeUnavailable": "请确认 PC 连接后重试。",
|
|
64430
|
+
"machineSharing.ownerRequired": "请联系 PC 所有者或机器管理员添加访问权限。",
|
|
64431
|
+
"machineSharing.serverUnavailable": "共享设置不可用,请检查服务器更新。",
|
|
64432
|
+
"machineSharing.requestFailed": "无法确认共享设置结果,请重新确认。",
|
|
64433
|
+
"machineSharing.loadFailed": "无法加载共享设置。",
|
|
64434
|
+
"machineSharing.retry": "重新确认",
|
|
64435
|
+
"machineSharing.cancel": "取消",
|
|
64436
|
+
"machineSharing.close": "关闭",
|
|
64437
|
+
"machineSharing.allMembers": "全部组织成员",
|
|
64438
|
+
"machineSharing.convertFirst": "改为共享 PC 后即可协作。"
|
|
64228
64439
|
};
|
|
64229
64440
|
const collaborationZh = {
|
|
64230
64441
|
...collaborationMachineZh,
|
|
@@ -64411,7 +64622,39 @@ const projectScopeZh = {
|
|
|
64411
64622
|
"projectScope.grantRevoked": "文件访问权限已撤销,会话已重新启动。",
|
|
64412
64623
|
"projectScope.daemonUpgradeRequired": "请更新 Aplus CLI 后重试。"
|
|
64413
64624
|
};
|
|
64625
|
+
const machineSettingsLabelsZh = {
|
|
64626
|
+
"machineSettings.listRefreshed": "已刷新电脑列表。",
|
|
64627
|
+
"machineSettings.codeGenerated": "已生成注册码。",
|
|
64628
|
+
"machineSettings.nameSaved": "已保存电脑名称。",
|
|
64629
|
+
"machineSettings.nameCleared": "已清除电脑名称。",
|
|
64630
|
+
"machineSettings.nameSaveFailed": "无法保存电脑名称。",
|
|
64631
|
+
"machineSettings.removed": "已删除 {name}。",
|
|
64632
|
+
"machineSettings.zrokStopped": "已停止 zrok 共享。",
|
|
64633
|
+
"machineSettings.zrokStart": "启动 zrok",
|
|
64634
|
+
"machineSettings.zrokStarting": "正在启动 zrok",
|
|
64635
|
+
"machineSettings.zrokStop": "停止 zrok",
|
|
64636
|
+
"machineSettings.externalServerUrl": "外部服务器地址",
|
|
64637
|
+
"machineSettings.externalServerUrlPlaceholder": "{url} 的 zrok 地址",
|
|
64638
|
+
"machineSettings.liveModeOnly": "只能在实时模式下注册和删除电脑。",
|
|
64639
|
+
"machineSettings.issuedCodes": "已发放的代码",
|
|
64640
|
+
"machineSettings.generateCode": "生成注册码",
|
|
64641
|
+
"machineSettings.registrationCode": "注册码",
|
|
64642
|
+
"machineSettings.expiresAt": "{time} 过期",
|
|
64643
|
+
"machineSettings.expired": "已过期",
|
|
64644
|
+
"machineSettings.copyCommand": "复制命令",
|
|
64645
|
+
"machineSettings.commandCopied": "已复制",
|
|
64646
|
+
"machineSettings.loadingCodes": "正在加载代码…",
|
|
64647
|
+
"machineSettings.loadingMachines": "正在加载电脑…",
|
|
64648
|
+
"machineSettings.emptyTitle": "没有电脑",
|
|
64649
|
+
"machineSettings.emptyOrganization": "所选组织中没有可用的电脑。",
|
|
64650
|
+
"machineSettings.emptyWorkspace": "当前工作空间中没有可用的电脑。",
|
|
64651
|
+
"machineSettings.rename": "重命名",
|
|
64652
|
+
"machineSettings.delete": "删除",
|
|
64653
|
+
"machineSettings.confirmDelete": "确认删除",
|
|
64654
|
+
"machineSettings.organization": "组织"
|
|
64655
|
+
};
|
|
64414
64656
|
const machineSettingsConsoleZh = {
|
|
64657
|
+
...machineSettingsLabelsZh,
|
|
64415
64658
|
"machineConsole.showDetails": "显示机器详细信息",
|
|
64416
64659
|
"machineConsole.showDetailsHint": "在机器选择列表中悬停或用键盘聚焦时显示详细信息。",
|
|
64417
64660
|
"machineConsole.environmentStatus": "环境·状态",
|
|
@@ -64523,6 +64766,8 @@ const newSessionProfileZh = {
|
|
|
64523
64766
|
"newSession.profile.none": "无配置",
|
|
64524
64767
|
"newSession.profile.executionSettings": "执行设置",
|
|
64525
64768
|
"newSession.profile.editSettings": "编辑",
|
|
64769
|
+
"newSession.profile.saving": "正在保存…",
|
|
64770
|
+
"newSession.profile.temporarySelection": "按当前环境显示。在您手动更改 AI、模型或推理强度之前,已保存的选择将保持不变。",
|
|
64526
64771
|
"newSession.profile.saveChanges": "保存更改",
|
|
64527
64772
|
"newSession.profile.instructionsField": "附加指令",
|
|
64528
64773
|
"newSession.profile.badgeIconField": "标记图标",
|
|
@@ -65295,14 +65540,12 @@ const agentBrowserConsoleZh = {
|
|
|
65295
65540
|
"browserPanel.agentBrowserUnauthorized": "登录已过期。请重新登录后再打开控制台。",
|
|
65296
65541
|
"browserPanel.agentBrowserExpired": "控制台访问权限已过期。请重新打开AI 浏览器任务控制台。",
|
|
65297
65542
|
"browserPanel.agentBrowserFailed": "无法获取AI 浏览器控制台权限。请稍后重试。",
|
|
65298
|
-
"agentBrowser.chat.showNotice": "显示 AI
|
|
65299
|
-
"agentBrowser.chat.showNoticeHint": "
|
|
65300
|
-
"agentBrowser.chat.title": "AI 浏览器",
|
|
65543
|
+
"agentBrowser.chat.showNotice": "显示 AI 浏览器按钮",
|
|
65544
|
+
"agentBrowser.chat.showNoticeHint": "在对话右上角显示打开 AI 浏览器按钮。",
|
|
65301
65545
|
"agentBrowser.chat.notice": "需要登录或审批时,可以在AI 浏览器控制台中亲自处理。",
|
|
65302
65546
|
"agentBrowser.chat.ownersBrowser": "此对话的浏览器任务使用对话创建者的登录状态执行。",
|
|
65303
65547
|
"agentBrowser.chat.ownersBrowserNamed": "此对话的浏览器任务使用 {name} 的登录状态执行。",
|
|
65304
|
-
"agentBrowser.chat.open": "
|
|
65305
|
-
"agentBrowser.chat.dismiss": "关闭AI 浏览器提示",
|
|
65548
|
+
"agentBrowser.chat.open": "打开 AI 浏览器",
|
|
65306
65549
|
"agentBrowser.chat.modeMismatch": "此机器的AI 浏览器安装模式(共享/专用)与机器类型不一致,无法使用浏览器。请联系管理员检查机器设置。",
|
|
65307
65550
|
"agentBrowser.confirm.title": "将使用他人的登录状态执行",
|
|
65308
65551
|
"agentBrowser.confirm.titleNamed": "将使用 {name} 的登录状态执行",
|
|
@@ -65621,7 +65864,7 @@ const designGuideComponentZh = {
|
|
|
65621
65864
|
"designGuide.components.tabs.rule2": "选中的标签和悬停使用 accent 面区分。不使用蓝色下划线。",
|
|
65622
65865
|
"designGuide.components.tabs.rule3": "每个标签都有关闭按钮(24px)。标签较多时不换行,而是横向滚动。",
|
|
65623
65866
|
"designGuide.components.tabs.rule4": "新建标签按钮用 28px 图标按钮放在标签行末尾。中间对话标签行使用新建对话图标(SquarePen),右侧工具标签行使用更多菜单图标(…)。可以用方向键在标签之间移动。",
|
|
65624
|
-
"designGuide.components.tabs.rule5": "
|
|
65867
|
+
"designGuide.components.tabs.rule5": "Project 为所有用户显示 Build 和 Develop 的36px胶囊标签,选中标记在260ms内滑动。Chat 从侧边栏菜单打开独立的输入界面。",
|
|
65625
65868
|
"designGuide.components.tabs.rule6": "中间的对话标签和右侧的工具标签可以拖动调整顺序。Cmd+W 会以与关闭按钮相同的方式关闭最后点击或聚焦的标签,即使是最后一个标签也不会关闭窗口。关闭按钮的提示中写明这个快捷键。",
|
|
65626
65869
|
"designGuide.components.tabs.note": "工作标签行在 WorkspaceHost 中与工作状态一起绘制,无法单独渲染。这里用相同的类只展示外观,第二阶段把标签行拆成组件后再换成真实组件。目前标签圆角为 7px,关闭按钮为 5px,与圆角等级不一致。右侧工具标签(.workspace-tool-tab)数值相同,但使用单独的类,第二阶段将合并为一个组件。",
|
|
65627
65870
|
"designGuide.components.listRows": "列表行",
|
|
@@ -65630,7 +65873,7 @@ const designGuideComponentZh = {
|
|
|
65630
65873
|
"designGuide.components.listRows.rule2": "行末只放更多菜单(…)和置顶按钮。重命名、归档、复制和删除都在更多菜单中。两个按钮只在悬停或键盘聚焦时显示,隐藏时不占用标题空间。对话列表(Project 和 Chat)的行首不放对话图标,Chat 列表中已置顶的行始终显示置顶图标。",
|
|
65631
65874
|
"designGuide.components.listRows.rule3": "行标题截断为一行,完整名称通过悬停提示显示。",
|
|
65632
65875
|
"designGuide.components.listRows.rule4": "拖动调整顺序时,在将要放下的位置画一条 2px 的品牌色线,并与实际放下的位置一致。",
|
|
65633
|
-
"designGuide.components.listRows.rule5": "侧边栏顶部的主要菜单(
|
|
65876
|
+
"designGuide.components.listRows.rule5": "侧边栏顶部的主要菜单(Chat、Project、工作看板、预约、外部集成)使用 44px 的行、15px 的文字和 18px 的图标。工作看板和预约按显示设置显示。悬停和选中状态使用淡品牌色背景;在 Chat 和 Project 详情中,仅选中当前列表项,顶部菜单保持未选中。",
|
|
65634
65877
|
"designGuide.components.toasts": "全局通知",
|
|
65635
65878
|
"designGuide.components.toasts.intro": "无论在哪个界面发生,都显示在窗口顶部中间的通知。点击按钮会显示真实的通知。",
|
|
65636
65879
|
"designGuide.components.toasts.rule1": "所有 Toast 都使用公共 FloatingNotice 和此实际示例。显示在顶部中央,通过空 text 隐藏,让退出效果完成。",
|
|
@@ -66159,6 +66402,9 @@ const machineSetupZh = {
|
|
|
66159
66402
|
"machineSetup.installTitle": "安装 CLI",
|
|
66160
66403
|
"machineSetup.cloudTitle": "Saycode 云端",
|
|
66161
66404
|
"machineSetup.standaloneTitle": "独立服务器",
|
|
66405
|
+
"machineSetup.selfHostTitle": "将电脑连接到此服务器",
|
|
66406
|
+
"machineSetup.pairingCode": "连接码",
|
|
66407
|
+
"machineSetup.selfHostHelp": "在新电脑上运行登录命令后会显示连接码。请在服务器上批准该连接码,然后在新电脑上启动守护进程。",
|
|
66162
66408
|
"machineSetup.serverAddress": "服务器地址",
|
|
66163
66409
|
"machineSetup.authHelp": "运行 happy auth login 后,可以通过移动应用或显示的网页 URL 注册机器。",
|
|
66164
66410
|
"machineSetup.organizationHelp": "请在新机器上运行下方生成的命令,注册组织专用或共享机器。"
|
|
@@ -66304,9 +66550,7 @@ const zh = {
|
|
|
66304
66550
|
"networkDataSaver.deferred.memory": "Memory Layer对话回填",
|
|
66305
66551
|
"networkDataSaver.deferred.gitPr": "后台Git和PR刷新",
|
|
66306
66552
|
"happyCliUpdate.title": "Aplus CLI 更新",
|
|
66307
|
-
"happyCliUpdate.checkTitle": "Aplus CLI 更新",
|
|
66308
66553
|
"happyCliUpdate.managerTitle": "Aplus CLI 更新",
|
|
66309
|
-
"happyCliUpdate.impact": "更新期间机器连接可能会短暂中断。",
|
|
66310
66554
|
"happyCliUpdate.update": "更新",
|
|
66311
66555
|
"happyCliUpdate.updating": "正在更新…",
|
|
66312
66556
|
"happyCliUpdate.updated": "已更新",
|
|
@@ -68085,6 +68329,7 @@ const zh = {
|
|
|
68085
68329
|
"runtimeEvent.claudeNotFound": "无法启动 Claude Code:在这台机器上找不到可执行文件。请在这台机器上重新安装 happy-cli。",
|
|
68086
68330
|
"runtimeEvent.claudeStoppedBySignal": "无法启动 Claude Code:它意外停止了({signal})。请查看这台机器的 daemon 日志。",
|
|
68087
68331
|
"runtimeEvent.claudeCouldNotStart": "无法在这台机器上启动 Claude Code。详情请查看这台机器的 daemon 日志。",
|
|
68332
|
+
"runtimeEvent.claudeNotSignedIn": "这台机器上的 Claude Code 尚未登录。请以运行这台机器 daemon 的用户登录(运行 `claude` 后执行 /login),然后重新发送消息。",
|
|
68088
68333
|
"runtimeEvent.compactionCompleted": "对话摘要已完成,之后将以该摘要作为上下文继续。",
|
|
68089
68334
|
"runtimeEvent.codexError": "Codex 错误:{detail}",
|
|
68090
68335
|
"runtimeEvent.codexNoImages": "没有可发送给 Codex 的图片。",
|
|
@@ -68946,9 +69191,6 @@ const chatWorkJa = {
|
|
|
68946
69191
|
"trialStarter.tips.title": "連携すると、メールや文書をチャットで扱えます。",
|
|
68947
69192
|
"trialStarter.upload.action": "ファイルをアップロード",
|
|
68948
69193
|
"trialStarter.upload.hint": "Word・Excel・PDF はそのまま",
|
|
68949
|
-
"chatWork.replaceTitle": "例に置き換えますか?",
|
|
68950
|
-
"chatWork.replaceBody": "入力内容のみ置き換えます。自分のファイルは残ります。",
|
|
68951
|
-
"chatWork.replace": "例を使う",
|
|
68952
69194
|
"chatWork.cancel": "キャンセル",
|
|
68953
69195
|
"chatWork.preparing": "サンプル準備中…",
|
|
68954
69196
|
"chatWork.sampleFailed": "準備できませんでした。再試行するか自分のファイルを追加してください。",
|
|
@@ -69579,6 +69821,10 @@ const organizationStartJa = {
|
|
|
69579
69821
|
"organizationStart.diagnostic.action.publicMissing": "組織管理者に共有認証の登録を確認してもらい、再接続してください。",
|
|
69580
69822
|
"organizationStart.diagnostic.reason.publicApply": "会社の共有AI認証をこのコンピューターに適用できませんでした。",
|
|
69581
69823
|
"organizationStart.diagnostic.action.publicApply": "ネットワークを確認して再接続してください。失敗が続く場合は診断情報を組織管理者に送ってください。",
|
|
69824
|
+
"organizationStart.diagnostic.reason.notDedicated": "このPCはこのアカウントの組織専用PCとして登録されていません。",
|
|
69825
|
+
"organizationStart.diagnostic.action.notDedicated": "組織管理者に、組織管理 → PC でこのPCをこのアカウントの専用PCとして再登録するよう依頼してください。",
|
|
69826
|
+
"organizationStart.diagnostic.reason.registrationChanged": "このPCの組織登録が変更または削除されたため、このアカウントで接続できません。",
|
|
69827
|
+
"organizationStart.diagnostic.action.registrationChanged": "組織管理者に、組織管理 → PC でこのPCの登録を確認するよう依頼してから、もう一度お試しください。",
|
|
69582
69828
|
"organizationStart.diagnostic.reason.publicVerify": "共有認証を適用しましたが、AI認証の利用を確認できませんでした。",
|
|
69583
69829
|
"organizationStart.diagnostic.action.publicVerify": "組織管理者に最新の共有認証の復旧を依頼してから再接続してください。"
|
|
69584
69830
|
};
|
|
@@ -69816,6 +70062,8 @@ const chatSchedulesJa = {
|
|
|
69816
70062
|
"chatSchedules.navigation": "予約",
|
|
69817
70063
|
"chatSchedules.new": "新規予約",
|
|
69818
70064
|
"chatSchedules.edit": "編集",
|
|
70065
|
+
"chatSchedules.partialRead": "一部の予約を確認できませんでした。もう一度確認してください。",
|
|
70066
|
+
"chatSchedules.resumeDraft": "入力を再開",
|
|
69819
70067
|
"chatSchedules.retry": "再確認",
|
|
69820
70068
|
"chatSchedules.loading": "予約タスクを読み込み中…",
|
|
69821
70069
|
"chatSchedules.loadError": "予約を読み込めませんでした。再確認してください。",
|
|
@@ -70196,7 +70444,7 @@ const machineUsageClaudeJa = {
|
|
|
70196
70444
|
"machineUsage.coverageUnknown": "モデル制限不明",
|
|
70197
70445
|
"machineUsage.notObserved": "未観測",
|
|
70198
70446
|
"machineUsage.scopeDiagnosis": "使用量権限の診断が必要",
|
|
70199
|
-
"machineUsage.
|
|
70447
|
+
"machineUsage.organizationAccount": "組織アカウント",
|
|
70200
70448
|
"machineUsage.probeTitle": "個人の使用量観測",
|
|
70201
70449
|
"machineUsage.probeCentral": "組織の使用量は中央コレクターが提供します。ローカルの同意と更新は利用できません。",
|
|
70202
70450
|
"machineUsage.probeUpdateRequired": "個人の観測にはマシンランタイムの更新またはアカウント参照の確認が必要です。",
|
|
@@ -71191,6 +71439,7 @@ const personalChatsJa = {
|
|
|
71191
71439
|
"personalChats.automationSaved": "自動化の設定を保存しました",
|
|
71192
71440
|
"personalChats.automationDeleted": "自動化を削除しました",
|
|
71193
71441
|
"personalChats.title": "マイチャット",
|
|
71442
|
+
"personalChats.compose": "新しいチャットを作成",
|
|
71194
71443
|
"personalChats.newChat": "新しいチャット",
|
|
71195
71444
|
"personalChats.searchPlaceholder": "チャットを検索",
|
|
71196
71445
|
"personalChats.sortRecent": "最近のアクティビティ順に並べ替え",
|
|
@@ -71496,7 +71745,33 @@ const collaborationMachineJa = {
|
|
|
71496
71745
|
"collaboration.pcOffline": "作業PCはオフラインです。閲覧権限のある既存の会話は読めますが、新しい実行にはPCの接続が必要です。",
|
|
71497
71746
|
"collaboration.pcUnavailable": "作業PC情報を確認できませんでした。会話の閲覧と新しい実行の権限は異なります。所有者にPCのアクセス設定と接続を確認してください。",
|
|
71498
71747
|
"collaboration.dedicatedPcUnavailable": "専用PCでは共同作業できません。",
|
|
71499
|
-
"collaboration.personalPcUnavailable": "個人PCでは共同作業できません。"
|
|
71748
|
+
"collaboration.personalPcUnavailable": "個人PCでは共同作業できません。",
|
|
71749
|
+
"machineSharing.title": "PCの共有設定",
|
|
71750
|
+
"machineSharing.share": "共用に変更",
|
|
71751
|
+
"machineSharing.dedicated": "専用に変更",
|
|
71752
|
+
"machineSharing.save": "保存",
|
|
71753
|
+
"machineSharing.saving": "保存中…",
|
|
71754
|
+
"machineSharing.accessHeading": "PCを利用できるユーザー",
|
|
71755
|
+
"machineSharing.shareHelp": "共用への変更直後は自分だけが利用できます。",
|
|
71756
|
+
"machineSharing.selectedHelp": "許可したユーザーはこのPCで作業を実行できます。",
|
|
71757
|
+
"machineSharing.confirmInvite": "PCのアクセス権を追加して招待しますか?",
|
|
71758
|
+
"machineSharing.confirmInviteHelp": "選択したユーザーはこのPCを利用できます。プロジェクトには招待承認後に参加します。",
|
|
71759
|
+
"machineSharing.grantAndInvite": "権限を追加して招待",
|
|
71760
|
+
"machineSharing.accessGranted": "PCのアクセス権を追加しました。失敗したプロジェクト招待を再試行してください。",
|
|
71761
|
+
"machineSharing.stateChanged": "PCの設定が変わりました。再確認してください。",
|
|
71762
|
+
"machineSharing.aiAuthRequired": "このPCのAI認証は共用に変更できません。",
|
|
71763
|
+
"machineSharing.projectConflict": "共同作業中のユーザーがいるためアクセス権を減らせません。",
|
|
71764
|
+
"machineSharing.membersUnavailable": "参加者を確認できませんでした。後でもう一度お試しください。",
|
|
71765
|
+
"machineSharing.runtimeUnavailable": "PCの接続を確認して再試行してください。",
|
|
71766
|
+
"machineSharing.ownerRequired": "PCの所有者またはマシン管理者にアクセス権の追加を依頼してください。",
|
|
71767
|
+
"machineSharing.serverUnavailable": "共有設定を利用できません。サーバーの更新を確認してください。",
|
|
71768
|
+
"machineSharing.requestFailed": "共有設定の結果を確認できませんでした。再確認してください。",
|
|
71769
|
+
"machineSharing.loadFailed": "共有設定を読み込めませんでした。",
|
|
71770
|
+
"machineSharing.retry": "再確認",
|
|
71771
|
+
"machineSharing.cancel": "キャンセル",
|
|
71772
|
+
"machineSharing.close": "閉じる",
|
|
71773
|
+
"machineSharing.allMembers": "組織の全メンバー",
|
|
71774
|
+
"machineSharing.convertFirst": "共用に変更すると共同作業できます。"
|
|
71500
71775
|
};
|
|
71501
71776
|
const collaborationJa = {
|
|
71502
71777
|
...collaborationMachineJa,
|
|
@@ -71683,7 +71958,39 @@ const projectScopeJa = {
|
|
|
71683
71958
|
"projectScope.grantRevoked": "ファイルアクセスを取り消してセッションを再起動しました。",
|
|
71684
71959
|
"projectScope.daemonUpgradeRequired": "Aplus CLI を更新してから、もう一度お試しください。"
|
|
71685
71960
|
};
|
|
71961
|
+
const machineSettingsLabelsJa = {
|
|
71962
|
+
"machineSettings.listRefreshed": "マシン一覧を更新しました。",
|
|
71963
|
+
"machineSettings.codeGenerated": "登録コードを作成しました。",
|
|
71964
|
+
"machineSettings.nameSaved": "マシン名を保存しました。",
|
|
71965
|
+
"machineSettings.nameCleared": "マシン名を消去しました。",
|
|
71966
|
+
"machineSettings.nameSaveFailed": "マシン名を保存できませんでした。",
|
|
71967
|
+
"machineSettings.removed": "{name}を削除しました。",
|
|
71968
|
+
"machineSettings.zrokStopped": "zrok共有を停止しました。",
|
|
71969
|
+
"machineSettings.zrokStart": "zrokを開始",
|
|
71970
|
+
"machineSettings.zrokStarting": "zrokを開始中",
|
|
71971
|
+
"machineSettings.zrokStop": "zrokを停止",
|
|
71972
|
+
"machineSettings.externalServerUrl": "外部サーバーURL",
|
|
71973
|
+
"machineSettings.externalServerUrlPlaceholder": "{url}のzrok URL",
|
|
71974
|
+
"machineSettings.liveModeOnly": "マシンの登録と削除はライブモードでのみ利用できます。",
|
|
71975
|
+
"machineSettings.issuedCodes": "発行したコード",
|
|
71976
|
+
"machineSettings.generateCode": "登録コードを作成",
|
|
71977
|
+
"machineSettings.registrationCode": "登録コード",
|
|
71978
|
+
"machineSettings.expiresAt": "{time}に期限切れ",
|
|
71979
|
+
"machineSettings.expired": "期限切れ",
|
|
71980
|
+
"machineSettings.copyCommand": "コマンドをコピー",
|
|
71981
|
+
"machineSettings.commandCopied": "コピーしました",
|
|
71982
|
+
"machineSettings.loadingCodes": "コードを読み込み中…",
|
|
71983
|
+
"machineSettings.loadingMachines": "マシンを読み込み中…",
|
|
71984
|
+
"machineSettings.emptyTitle": "マシンがありません",
|
|
71985
|
+
"machineSettings.emptyOrganization": "選択した組織で使えるマシンがありません。",
|
|
71986
|
+
"machineSettings.emptyWorkspace": "現在のワークスペースで使えるマシンがありません。",
|
|
71987
|
+
"machineSettings.rename": "名前を変更",
|
|
71988
|
+
"machineSettings.delete": "削除",
|
|
71989
|
+
"machineSettings.confirmDelete": "削除を確認",
|
|
71990
|
+
"machineSettings.organization": "組織"
|
|
71991
|
+
};
|
|
71686
71992
|
const machineSettingsConsoleJa = {
|
|
71993
|
+
...machineSettingsLabelsJa,
|
|
71687
71994
|
"machineConsole.showDetails": "マシンの詳細を表示",
|
|
71688
71995
|
"machineConsole.showDetailsHint": "マシン選択でカーソルを合わせるかキーボードで移動すると詳細を表示します。",
|
|
71689
71996
|
"machineConsole.environmentStatus": "環境・状態",
|
|
@@ -71795,6 +72102,8 @@ const newSessionProfileJa = {
|
|
|
71795
72102
|
"newSession.profile.none": "プロファイルなし",
|
|
71796
72103
|
"newSession.profile.executionSettings": "実行設定",
|
|
71797
72104
|
"newSession.profile.editSettings": "編集",
|
|
72105
|
+
"newSession.profile.saving": "保存中…",
|
|
72106
|
+
"newSession.profile.temporarySelection": "現在の環境に合わせて表示しています。AI・モデル・推論強度を直接変更するまで、保存した選択は保持されます。",
|
|
71798
72107
|
"newSession.profile.saveChanges": "変更を保存",
|
|
71799
72108
|
"newSession.profile.instructionsField": "追加の指示",
|
|
71800
72109
|
"newSession.profile.badgeIconField": "バッジアイコン",
|
|
@@ -72567,14 +72876,12 @@ const agentBrowserConsoleJa = {
|
|
|
72567
72876
|
"browserPanel.agentBrowserUnauthorized": "ログインの有効期限が切れました。再度ログインしてからコンソールを開いてください。",
|
|
72568
72877
|
"browserPanel.agentBrowserExpired": "コンソールへのアクセス権限が期限切れです。AIブラウザのタスクコンソールを開き直してください。",
|
|
72569
72878
|
"browserPanel.agentBrowserFailed": "AIブラウザのコンソール権限を取得できませんでした。しばらくしてから再試行してください。",
|
|
72570
|
-
"agentBrowser.chat.showNotice": "AI
|
|
72571
|
-
"agentBrowser.chat.showNoticeHint": "
|
|
72572
|
-
"agentBrowser.chat.title": "AIブラウザ",
|
|
72879
|
+
"agentBrowser.chat.showNotice": "AIブラウザのボタンを表示",
|
|
72880
|
+
"agentBrowser.chat.showNoticeHint": "会話の右上にAIブラウザを開くボタンを表示します。",
|
|
72573
72881
|
"agentBrowser.chat.notice": "ログインや承認が必要なときは、AIブラウザのコンソールで直接対応できます。",
|
|
72574
72882
|
"agentBrowser.chat.ownersBrowser": "この会話のブラウザ作業は、会話を作成した人のログインで実行されます。",
|
|
72575
72883
|
"agentBrowser.chat.ownersBrowserNamed": "この会話のブラウザ作業は {name} さんのログインで実行されます。",
|
|
72576
|
-
"agentBrowser.chat.open": "
|
|
72577
|
-
"agentBrowser.chat.dismiss": "AIブラウザの案内を閉じる",
|
|
72884
|
+
"agentBrowser.chat.open": "AIブラウザを開く",
|
|
72578
72885
|
"agentBrowser.chat.modeMismatch": "このマシンのAIブラウザのインストールモード(共有/専用)がマシン種別と異なるため、ブラウザを使えません。管理者にマシン設定の確認を依頼してください。",
|
|
72579
72886
|
"agentBrowser.confirm.title": "他の人のログインで実行されます",
|
|
72580
72887
|
"agentBrowser.confirm.titleNamed": "{name} さんのログインで実行されます",
|
|
@@ -72893,7 +73200,7 @@ const designGuideComponentJa = {
|
|
|
72893
73200
|
"designGuide.components.tabs.rule2": "選択中のタブとホバーは accent の面で区別します。青い下線は使いません。",
|
|
72894
73201
|
"designGuide.components.tabs.rule3": "すべてのタブに閉じるボタン(24px)を置きます。タブが多いときは折り返さず横にスクロールします。",
|
|
72895
73202
|
"designGuide.components.tabs.rule4": "新しいタブのボタンはタブ行の最後に28pxのアイコンボタンで置きます。中央の会話タブ行は新しい会話の作成アイコン(SquarePen)、右側のツールタブ行はその他のメニューのアイコン(…)を使います。矢印キーでタブ間を移動できます。",
|
|
72896
|
-
"designGuide.components.tabs.rule5": "
|
|
73203
|
+
"designGuide.components.tabs.rule5": "Project ではすべてのユーザーに Build・Develop の36pxピル型タブを表示し、選択表示は260msで移動します。Chat はサイドバーメニューから専用の入力画面を開きます。",
|
|
72897
73204
|
"designGuide.components.tabs.rule6": "中央の会話タブと右側のツールタブはドラッグで順序を変えられます。Cmd+W は最後にクリックまたはフォーカスしたタブを閉じるボタンと同じ方法で閉じ、最後のタブでもウィンドウは閉じません。閉じるボタンのツールチップにこのショートカットを書きます。",
|
|
72898
73205
|
"designGuide.components.tabs.note": "作業タブの行は WorkspaceHost の中で作業の状態と一緒に描かれるため、単独で描画できません。同じクラスで見た目だけを示し、ステップ2でタブ行を部品に分けたら実物に置き換えます。現在のタブの角の丸みは7px、閉じるボタンは5pxで、角の丸みの段階と異なります。右のツールタブ(.workspace-tool-tab)は値は同じですがクラスが別のため、ステップ2で1つの部品にまとめます。",
|
|
72899
73206
|
"designGuide.components.listRows": "リストの行",
|
|
@@ -72902,7 +73209,7 @@ const designGuideComponentJa = {
|
|
|
72902
73209
|
"designGuide.components.listRows.rule2": "行の端にはその他のメニュー(…)と固定ボタンだけを置きます。名前の変更、アーカイブ、コピー、削除はその他のメニューの中にあります。2つのボタンはホバーかキーボードフォーカスのときだけ表示し、隠れている間はタイトルの場所を取りません。会話一覧(Project、Chat)は行頭の会話アイコンを置かず、Chat 一覧では固定した行のピンを常に表示します。",
|
|
72903
73210
|
"designGuide.components.listRows.rule3": "行のタイトルは1行に収め、全体の名前はホバーのツールチップで示します。",
|
|
72904
73211
|
"designGuide.components.listRows.rule4": "ドラッグで並べ替えるときは、置かれる位置に2pxのブランド色の線を描き、実際に置かれる位置と一致させます。",
|
|
72905
|
-
"designGuide.components.listRows.rule5": "
|
|
73212
|
+
"designGuide.components.listRows.rule5": "サイドバー上部の主要メニュー(Chat、Project、作業ボード、予約、外部連携)は44pxの行、15pxの文字、18pxのアイコンを使用します。作業ボードと予約は表示設定に従います。ホバーと選択は淡いブランド色の背景で示し、Chat・Projectの詳細では上部メニューではなく現在のリスト項目だけを選択表示します。",
|
|
72906
73213
|
"designGuide.components.toasts": "全体の通知",
|
|
72907
73214
|
"designGuide.components.toasts.intro": "どの画面で起きたことでも、ウィンドウ上部の中央に出す通知です。ボタンを押すと実際の通知が出ます。",
|
|
72908
73215
|
"designGuide.components.toasts.rule1": "すべてのトーストに共通の FloatingNotice とこの実例を使います。上部中央に表示し、空の text で非表示にして退場効果を完了させます。",
|
|
@@ -73431,6 +73738,9 @@ const machineSetupJa = {
|
|
|
73431
73738
|
"machineSetup.installTitle": "CLIをインストール",
|
|
73432
73739
|
"machineSetup.cloudTitle": "Saycodeクラウド",
|
|
73433
73740
|
"machineSetup.standaloneTitle": "スタンドアロンサーバー",
|
|
73741
|
+
"machineSetup.selfHostTitle": "このサーバーにマシンを接続",
|
|
73742
|
+
"machineSetup.pairingCode": "接続コード",
|
|
73743
|
+
"machineSetup.selfHostHelp": "新しいマシンでログインコマンドを実行すると接続コードが表示されます。サーバーでそのコードを承認してから、新しいマシンでデーモンを起動してください。",
|
|
73434
73744
|
"machineSetup.serverAddress": "サーバーURL",
|
|
73435
73745
|
"machineSetup.authHelp": "happy auth loginを実行すると、モバイルアプリまたは表示されたWeb URLからマシンを登録できます。",
|
|
73436
73746
|
"machineSetup.organizationHelp": "組織の専用・共有マシンは、以下で発行するコマンドを新しいマシンで実行して登録してください。"
|
|
@@ -73576,9 +73886,7 @@ const ja = {
|
|
|
73576
73886
|
"networkDataSaver.deferred.memory": "Memory Layerの会話バックフィル",
|
|
73577
73887
|
"networkDataSaver.deferred.gitPr": "バックグラウンドのGit・PR更新",
|
|
73578
73888
|
"happyCliUpdate.title": "Aplus CLI 更新",
|
|
73579
|
-
"happyCliUpdate.checkTitle": "Aplus CLI 更新",
|
|
73580
73889
|
"happyCliUpdate.managerTitle": "Aplus CLI 更新",
|
|
73581
|
-
"happyCliUpdate.impact": "更新中はマシン接続が一時的に切れる場合があります。",
|
|
73582
73890
|
"happyCliUpdate.update": "更新",
|
|
73583
73891
|
"happyCliUpdate.updating": "更新中…",
|
|
73584
73892
|
"happyCliUpdate.updated": "更新済み",
|
|
@@ -75357,6 +75665,7 @@ const ja = {
|
|
|
75357
75665
|
"runtimeEvent.claudeNotFound": "Claude Codeを起動できませんでした。このマシンで実行ファイルが見つかりません。このマシンにhappy-cliを再インストールしてください。",
|
|
75358
75666
|
"runtimeEvent.claudeStoppedBySignal": "Claude Codeを起動できませんでした。予期せず停止しました({signal})。このマシンのdaemonログを確認してください。",
|
|
75359
75667
|
"runtimeEvent.claudeCouldNotStart": "このマシンでClaude Codeを起動できませんでした。詳しくはこのマシンのdaemonログを確認してください。",
|
|
75668
|
+
"runtimeEvent.claudeNotSignedIn": "このマシンではClaude Codeにログインしていません。このマシンのdaemonを実行しているユーザーでログインしてから(`claude`を実行して/login)、メッセージをもう一度送信してください。",
|
|
75360
75669
|
"runtimeEvent.compactionCompleted": "会話の要約が完了しました。これ以降は要約をコンテキストとして続けます。",
|
|
75361
75670
|
"runtimeEvent.codexError": "Codex エラー: {detail}",
|
|
75362
75671
|
"runtimeEvent.codexNoImages": "Codex に送れる画像がありませんでした。",
|
|
@@ -76820,6 +77129,7 @@ async function installSystemdUnit(path2, unit, systemctl = exec) {
|
|
|
76820
77129
|
const failure = error;
|
|
76821
77130
|
throw new Error(describeUserManagerFailure({ code: failure.code, detail: failure.detail ?? failure.message ?? String(error) }));
|
|
76822
77131
|
});
|
|
77132
|
+
await mkdir(dirname(path2), { recursive: true });
|
|
76823
77133
|
const previous = existsSync(path2) ? await readFile(path2, "utf8") : null;
|
|
76824
77134
|
const wasEnabled = previous !== null && await user("is-enabled", SYSTEMD_UNIT_NAME).then((out) => out.trim() === "enabled", () => false);
|
|
76825
77135
|
const wasActive = previous !== null && await user("is-active", SYSTEMD_UNIT_NAME).then((out) => out.trim() === "active", () => false);
|
|
@@ -76847,12 +77157,12 @@ function serviceDefinitionPath(platform2) {
|
|
|
76847
77157
|
async function installService(platform2, definition) {
|
|
76848
77158
|
await mkdir(dirname(definition.logFile), { recursive: true, mode: 448 });
|
|
76849
77159
|
const path2 = serviceDefinitionPath(platform2);
|
|
76850
|
-
await mkdir(dirname(path2), { recursive: true });
|
|
76851
77160
|
if (platform2 === "linux") {
|
|
76852
77161
|
await installSystemdUnit(path2, systemdUserUnit(definition));
|
|
76853
77162
|
const linger = await exec("loginctl", ["show-user", userInfo().username, "--property=Linger", "--value"]).catch(() => "");
|
|
76854
77163
|
return { path: path2, lingerEnabled: linger.trim() === "" ? null : linger.trim() === "yes" };
|
|
76855
77164
|
}
|
|
77165
|
+
await mkdir(dirname(path2), { recursive: true });
|
|
76856
77166
|
await writeFile(path2, launchAgentPlist(definition));
|
|
76857
77167
|
await exec("launchctl", ["bootout", `${launchDomain()}/${LAUNCH_AGENT_LABEL}`]).catch(() => "");
|
|
76858
77168
|
await exec("launchctl", ["bootstrap", launchDomain(), path2]);
|
|
@@ -81855,7 +82165,7 @@ async function runServer(args, print) {
|
|
|
81855
82165
|
throw error;
|
|
81856
82166
|
}
|
|
81857
82167
|
await Promise.all([layout.logsDir, layout.shimStoreDir, layout.happyHomeDir].map((dir) => mkdir(dir, { recursive: true, mode: 448 })));
|
|
81858
|
-
configureProcessLedger({ userDataDir: join(layout.root, "ledger") });
|
|
82168
|
+
configureProcessLedger({ userDataDir: join(layout.root, "ledger"), log: serverLogWriter(layout, "process-ledger") });
|
|
81859
82169
|
const server2 = new StandaloneServerManager(runtime.serverPackageDir, {
|
|
81860
82170
|
dataDir: layout.dataDir,
|
|
81861
82171
|
pgliteDir: layout.pgliteDir,
|
|
@@ -83209,6 +83519,23 @@ const EXTENSION_PANEL_SURFACE_SIZES = ["compact", "standard", "wide"];
|
|
|
83209
83519
|
function isExtensionPanelSurfaceSize(value2) {
|
|
83210
83520
|
return EXTENSION_PANEL_SURFACE_SIZES.some((size) => size === value2);
|
|
83211
83521
|
}
|
|
83522
|
+
function parseExtensionProjectTools(value2, apiVersion) {
|
|
83523
|
+
if (apiVersion < 3) fail$7("manifest.contributes.projectTools", "requires Extension API version 3");
|
|
83524
|
+
return contributionList(value2, "manifest.contributes.projectTools", ["id", "title", "command"], (entry, path2) => ({
|
|
83525
|
+
id: id$1(entry.id, `${path2}.id`),
|
|
83526
|
+
title: string(entry.title, `${path2}.title`),
|
|
83527
|
+
command: id$1(entry.command, `${path2}.command`)
|
|
83528
|
+
}));
|
|
83529
|
+
}
|
|
83530
|
+
function assertExtensionProjectToolTargets(extensionId, tools, commands) {
|
|
83531
|
+
for (const [index, tool] of tools.entries()) {
|
|
83532
|
+
const path2 = `manifest.contributes.projectTools[${index}]`;
|
|
83533
|
+
if (!tool.id.startsWith(`${extensionId}.`)) fail$7(`${path2}.id`, "expected an id declared by the same extension");
|
|
83534
|
+
const command = tool.command.startsWith(`${extensionId}.`) ? commands.find((candidate) => candidate.id === tool.command) : void 0;
|
|
83535
|
+
if (!command) fail$7(`${path2}.command`, "expected a command declared by the same extension");
|
|
83536
|
+
if (!command.panelId) fail$7(`${path2}.command`, "expected a command that opens a panel");
|
|
83537
|
+
}
|
|
83538
|
+
}
|
|
83212
83539
|
const EXTENSION_ARTIFACT_ACTION_OPERATIONS = ["publishPublic"];
|
|
83213
83540
|
const EXTENSION_ARTIFACT_SOURCE_TYPES = ["project-file", "personal-chat-file"];
|
|
83214
83541
|
const ID_PATTERN$2 = /^[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$/;
|
|
@@ -83697,7 +84024,7 @@ const EXTENSION_PERMISSIONS = [
|
|
|
83697
84024
|
const SAYCODE_EXTENSION_API_VERSION = 3;
|
|
83698
84025
|
const SAYCODE_EXTENSION_MINIMUM_API_VERSION = 2;
|
|
83699
84026
|
const MAX_EXTENSION_API_WINDOW_WIDTH = 2;
|
|
83700
|
-
const SAYCODE_EXTENSION_ENGINE_VERSION = "1.
|
|
84027
|
+
const SAYCODE_EXTENSION_ENGINE_VERSION = "1.2.0";
|
|
83701
84028
|
const SAYCODE_CHANNEL_API_VERSION = CHANNEL_API_VERSION;
|
|
83702
84029
|
const SAYCODE_CHANNEL_MINIMUM_API_VERSION = CHANNEL_MINIMUM_API_VERSION;
|
|
83703
84030
|
class UnsupportedChannelApiVersionError2 extends Error {
|
|
@@ -83720,7 +84047,7 @@ const SEMVER_PATTERN$1 = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)
|
|
|
83720
84047
|
const ENGINE_RANGE_PATTERN = /^(?:\^|~|>=|<=|>|<)?\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
|
|
83721
84048
|
const ENTRYPOINT_PATTERN = /\.(?:cjs|mjs|js)$/;
|
|
83722
84049
|
const LOCALE_PATTERN = /^[a-z]{2,3}(?:-[A-Z]{2})?$/;
|
|
83723
|
-
const CONTRIBUTION_KEYS = /* @__PURE__ */ new Set(["commands", "settings", "panels", "projectTemplates", "machineActions", "artifactActions", "channels"]);
|
|
84050
|
+
const CONTRIBUTION_KEYS = /* @__PURE__ */ new Set(["commands", "settings", "panels", "projectTemplates", "machineActions", "projectTools", "artifactActions", "channels"]);
|
|
83724
84051
|
const V2_PERMISSIONS = /* @__PURE__ */ new Set([
|
|
83725
84052
|
"browserViewer.open",
|
|
83726
84053
|
"browserViewer.install",
|
|
@@ -83927,22 +84254,24 @@ function parseContributions(value2, apiVersion, channelApiVersion) {
|
|
|
83927
84254
|
}
|
|
83928
84255
|
);
|
|
83929
84256
|
}
|
|
84257
|
+
if (parsed2.projectTools !== void 0) result2.projectTools = parseExtensionProjectTools(parsed2.projectTools, apiVersion);
|
|
83930
84258
|
if (parsed2.artifactActions !== void 0) {
|
|
83931
84259
|
result2.artifactActions = parseExtensionArtifactActions(parsed2.artifactActions);
|
|
83932
84260
|
}
|
|
83933
84261
|
if (parsed2.channels !== void 0) {
|
|
83934
84262
|
result2.channels = parseExtensionChannelContributions(parsed2.channels);
|
|
83935
84263
|
}
|
|
83936
|
-
const
|
|
84264
|
+
const ids2 = [
|
|
83937
84265
|
...result2.commands ?? [],
|
|
83938
84266
|
...result2.settings ?? [],
|
|
83939
84267
|
...result2.panels ?? [],
|
|
83940
84268
|
...result2.projectTemplates ?? [],
|
|
83941
84269
|
...result2.machineActions ?? [],
|
|
84270
|
+
...result2.projectTools ?? [],
|
|
83942
84271
|
...result2.artifactActions ?? [],
|
|
83943
84272
|
...result2.channels ?? []
|
|
83944
84273
|
].map((entry) => entry.id);
|
|
83945
|
-
if (new Set(
|
|
84274
|
+
if (new Set(ids2).size !== ids2.length) fail$7("manifest.contributes", "duplicate contribution id");
|
|
83946
84275
|
return result2;
|
|
83947
84276
|
}
|
|
83948
84277
|
function parseExtensionManifest(value2, options) {
|
|
@@ -84042,6 +84371,7 @@ function parseExtensionManifest(value2, options) {
|
|
|
84042
84371
|
);
|
|
84043
84372
|
}
|
|
84044
84373
|
}
|
|
84374
|
+
assertExtensionProjectToolTargets(parsedId, contributes.projectTools ?? [], contributes.commands ?? []);
|
|
84045
84375
|
return {
|
|
84046
84376
|
id: parsedId,
|
|
84047
84377
|
version: version2,
|
|
@@ -84919,7 +85249,7 @@ function allowedEnvelope(value2) {
|
|
|
84919
85249
|
if (Object.keys(event).some((key) => !permitted.has(key))) return null;
|
|
84920
85250
|
if (!id(event.permissionId) || !id(event.turnId) || !id(event.channelRequestId) || !id(event.runtimeId)) return null;
|
|
84921
85251
|
if (typeof event.createdAt !== "number" || !Number.isInteger(event.createdAt) || event.createdAt < 0) return null;
|
|
84922
|
-
const
|
|
85252
|
+
const ids2 = {
|
|
84923
85253
|
permissionId: event.permissionId,
|
|
84924
85254
|
turnId: event.turnId,
|
|
84925
85255
|
channelRequestId: event.channelRequestId,
|
|
@@ -84928,12 +85258,12 @@ function allowedEnvelope(value2) {
|
|
|
84928
85258
|
};
|
|
84929
85259
|
if (event.t === "channel-permission") {
|
|
84930
85260
|
if (event.kind !== "generic" && event.kind !== "desktop-only") return null;
|
|
84931
|
-
ev = { t: "channel-permission", ...
|
|
85261
|
+
ev = { t: "channel-permission", ...ids2, kind: event.kind };
|
|
84932
85262
|
} else {
|
|
84933
85263
|
if (event.reason !== "answered" && event.reason !== "aborted" && event.reason !== "reset") {
|
|
84934
85264
|
return null;
|
|
84935
85265
|
}
|
|
84936
|
-
ev = { t: "channel-permission-withdrawn", ...
|
|
85266
|
+
ev = { t: "channel-permission-withdrawn", ...ids2, reason: event.reason };
|
|
84937
85267
|
}
|
|
84938
85268
|
} else if (event.t === "tool-call-end" && id(event.backgroundTaskId)) {
|
|
84939
85269
|
ev = { t: "tool-call-end", call: "[background-task]", backgroundTaskId: event.backgroundTaskId };
|
|
@@ -94947,8 +95277,8 @@ async function loadSession(auth, sessionId) {
|
|
|
94947
95277
|
}
|
|
94948
95278
|
async function owningProjectId(auth, sessionId, allowedProjectIds) {
|
|
94949
95279
|
for (const projectId of allowedProjectIds) {
|
|
94950
|
-
const
|
|
94951
|
-
if (
|
|
95280
|
+
const ids2 = await client(auth).getProjectSessionIds(projectId);
|
|
95281
|
+
if (ids2.includes(sessionId)) return projectId;
|
|
94952
95282
|
}
|
|
94953
95283
|
return null;
|
|
94954
95284
|
}
|
|
@@ -95015,16 +95345,16 @@ function createChannelSessionOperations(deps = {}) {
|
|
|
95015
95345
|
),
|
|
95016
95346
|
isOwnPersonalChat: (auth, sessionId) => isOwnPersonalChatSession(auth, sessionId),
|
|
95017
95347
|
listSessions: async (auth, projectIds) => {
|
|
95018
|
-
const
|
|
95348
|
+
const ids2 = [];
|
|
95019
95349
|
for (const projectId of projectIds) {
|
|
95020
95350
|
const projectSessionIds = await client(auth).getProjectSessionIds(projectId).catch(() => []);
|
|
95021
|
-
for (const id2 of projectSessionIds) if (!
|
|
95022
|
-
if (
|
|
95351
|
+
for (const id2 of projectSessionIds) if (!ids2.includes(id2)) ids2.push(id2);
|
|
95352
|
+
if (ids2.length >= MAX_CATALOG_SESSIONS) break;
|
|
95023
95353
|
}
|
|
95024
|
-
if (
|
|
95354
|
+
if (ids2.length === 0) return [];
|
|
95025
95355
|
return client(auth).lookupSessions(
|
|
95026
95356
|
deriveCandidateKeys(auth),
|
|
95027
|
-
|
|
95357
|
+
ids2.slice(0, MAX_CATALOG_SESSIONS),
|
|
95028
95358
|
void 0,
|
|
95029
95359
|
accountPrivateKeyBytes(auth)
|
|
95030
95360
|
);
|