@buzzni/saycode-cli 0.9.4 → 0.9.5
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/index.mjs +331 -72
- package/package.json +1 -1
package/index.mjs
CHANGED
|
@@ -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.5";
|
|
53
53
|
const manifest = {
|
|
54
54
|
version: version$3
|
|
55
55
|
};
|
|
@@ -995,6 +995,7 @@ const organizationInstallRecoveryKo = {
|
|
|
995
995
|
"organizationStart.toolDiagnostic.reason.CLAUDE_SETUP_TOKEN_RUNTIME_UNSUPPORTED": "설치된 cswap이 필요한 인증 기능을 지원하지 않아요.",
|
|
996
996
|
"organizationStart.toolDiagnostic.reason.TOOL_PROXY_AUTH_REQUIRED": "회사 프록시가 로그인 인증을 요구해 연결하지 못했어요.",
|
|
997
997
|
"organizationStart.toolDiagnostic.reason.TOOL_PROXY_BLOCKED": "회사 프록시가 다운로드나 패키지 서버 연결을 허용하지 않았어요.",
|
|
998
|
+
"organizationStart.toolDiagnostic.reason.TOOL_EXECUTION_TIMEOUT": "설치된 도구의 실행 확인이 제한 시간 안에 끝나지 않았어요.",
|
|
998
999
|
"organizationStart.toolDiagnostic.action.TOOL_NOT_FOUND": "다시 시도하거나 설치 안내에 따라 준비한 뒤 다시 확인해 주세요.",
|
|
999
1000
|
"organizationStart.toolDiagnostic.action.TOOL_PREREQUISITE_REQUIRED": "표시된 선행 도구를 먼저 준비한 뒤 다시 시도해 주세요.",
|
|
1000
1001
|
"organizationStart.toolDiagnostic.action.TOOL_NETWORK_FAILED": "인터넷·회사 네트워크·프록시를 확인하고 다시 시도해 주세요.",
|
|
@@ -1009,7 +1010,8 @@ const organizationInstallRecoveryKo = {
|
|
|
1009
1010
|
"organizationStart.toolDiagnostic.action.TOOL_INSTALL_FAILED": "다시 시도해 주세요. 반복되면 이 진단을 전달해 주세요.",
|
|
1010
1011
|
"organizationStart.toolDiagnostic.action.CLAUDE_SETUP_TOKEN_RUNTIME_UNSUPPORTED": "다시 시도로 Saycode가 사용하는 인증 도구를 설치해 주세요.",
|
|
1011
1012
|
"organizationStart.toolDiagnostic.action.TOOL_PROXY_AUTH_REQUIRED": "이 진단을 회사 IT 담당자에게 전달해 다운로드 서버를 프록시 인증 예외로 허용해 달라고 요청해 주세요.",
|
|
1012
|
-
"organizationStart.toolDiagnostic.action.TOOL_PROXY_BLOCKED": "이 진단을 회사 IT 담당자에게 전달해 다운로드 서버 접속 허용을 요청해 주세요."
|
|
1013
|
+
"organizationStart.toolDiagnostic.action.TOOL_PROXY_BLOCKED": "이 진단을 회사 IT 담당자에게 전달해 다운로드 서버 접속 허용을 요청해 주세요.",
|
|
1014
|
+
"organizationStart.toolDiagnostic.action.TOOL_EXECUTION_TIMEOUT": "회사 보안 프로그램이 새 실행 파일을 검사하는 중일 수 있어요. 몇 분 뒤 다시 시도하고, 반복되면 이 진단을 IT 담당자에게 전달해 예외 등록을 요청해 주세요."
|
|
1013
1015
|
};
|
|
1014
1016
|
const organizationAccountKeyKo = {
|
|
1015
1017
|
"organizationStart.accountKey.title": "대화 암호화 켜기",
|
|
@@ -1415,6 +1417,20 @@ const usageEntryKo = {
|
|
|
1415
1417
|
"signup.verifyFailed": "인증을 확인하지 못했어요. 연결을 확인하고 다시 시도해 주세요."
|
|
1416
1418
|
};
|
|
1417
1419
|
const homeTabsKo = {
|
|
1420
|
+
"homeStart.checking": "사용 환경을 확인하고 있어요.",
|
|
1421
|
+
"homeStart.lookupFailed": "사용 환경을 확인하지 못했어요.",
|
|
1422
|
+
"homeStart.noMachine": "사용할 작업PC가 없어요.",
|
|
1423
|
+
"homeStart.refreshMachines": "작업PC 목록을 다시 확인해주세요.",
|
|
1424
|
+
"homeStart.machineForbidden": "이 작업PC를 사용할 권한이 없어요.",
|
|
1425
|
+
"homeStart.checkingAi": "AI 연결을 확인하고 있어요.",
|
|
1426
|
+
"homeStart.aiLookupFailed": "AI 연결 상태를 확인하지 못했어요.",
|
|
1427
|
+
"homeStart.noOrganizationAi": "사용할 AI를 연결해주세요.",
|
|
1428
|
+
"homeStart.assignmentNeeded": "사용할 AI를 배정해주세요.",
|
|
1429
|
+
"homeStart.aiConnectionNeeded": "조직 AI 연결 상태를 확인해주세요.",
|
|
1430
|
+
"homeStart.memberAiNeeded": "내 AI를 연결하거나 관리자에게 AI 배정을 요청해주세요.",
|
|
1431
|
+
"homeStart.connectPersonalAi": "내 AI 연결",
|
|
1432
|
+
"homeStart.connectOrganizationAi": "조직 AI 연결",
|
|
1433
|
+
"homeStart.retry": "다시 확인",
|
|
1418
1434
|
"homeTabs.collaboratingTitle": "함께 작업 프로젝트",
|
|
1419
1435
|
"homeTabs.private": "개인",
|
|
1420
1436
|
"homeTabs.lastActivity": "최근 작업 {time}",
|
|
@@ -1491,6 +1507,12 @@ const projectRelocationKO = {
|
|
|
1491
1507
|
"sessionCreation.workspaceNotSet": "이 머신의 워크스페이스 경로가 설정되지 않았습니다. 머신 워크스페이스를 먼저 설정해주세요."
|
|
1492
1508
|
};
|
|
1493
1509
|
const chatSchedulesKo = {
|
|
1510
|
+
"chatSchedules.lifecycleFailed": "예약 정리를 확인하지 못했어요. 대화는 변경하지 않았습니다. 다시 시도해 주세요.",
|
|
1511
|
+
"chatSchedules.deleteImpact": "연결된 예약 {count}개도 함께 취소됩니다.",
|
|
1512
|
+
"chatSchedules.deleteRunning": "실행 처리 중인 예약 {count}개에 중단을 요청합니다.",
|
|
1513
|
+
"chatSchedules.deleteStopHint": "이미 시작한 작업은 실행 PC에 중단을 요청합니다. PC가 오프라인이면 다시 연결될 때 반영됩니다.",
|
|
1514
|
+
"chatSchedules.deleteImpactLoading": "연결된 예약을 확인하고 있어요.",
|
|
1515
|
+
"chatSchedules.deleteImpactError": "연결된 예약을 확인하지 못했어요. 다시 확인한 뒤 삭제해 주세요.",
|
|
1494
1516
|
"chatSchedules.chatTitle": "이 대화의 예약",
|
|
1495
1517
|
"chatSchedules.sharedHint": "예약 메뉴에서도 같은 예약을 확인하고 관리할 수 있어요.",
|
|
1496
1518
|
"chatSchedules.allSchedules": "전체 예약 보기",
|
|
@@ -1546,6 +1568,9 @@ const chatSchedulesKo = {
|
|
|
1546
1568
|
"chatSchedules.newChatHint": "저장하면 선택한 PC의 기본 Chat 폴더에 새 대화를 만들고 예약합니다.",
|
|
1547
1569
|
"chatSchedules.repeat": "반복 일정",
|
|
1548
1570
|
"chatSchedules.targetUnavailable": "이 대화의 작업 PC나 폴더를 확인해 주세요.",
|
|
1571
|
+
"chatSchedules.ordinaryRuntimeHint": "예약은 이 대화의 AI 설정을 사용합니다. AI와 모델은 대화 입력창에서 변경해 주세요.",
|
|
1572
|
+
"chatSchedules.conversationUnsupported": "이 PC의 Saycode CLI를 업데이트한 뒤 예약해 주세요. 일반 대화에 예약 결과를 쌓는 기능이 필요합니다.",
|
|
1573
|
+
"chatSchedules.conversationRecovery": "준비한 대화 세션의 연결 결과를 확인하지 못했어요. 다시 확인하면 같은 세션의 연결을 재확인한 뒤 저장하며, 새 세션을 만들지 않습니다. 창을 닫아도 이어서 확인할 수 있어요.",
|
|
1549
1574
|
"chatSchedules.saveError": "저장하지 못했습니다. 입력한 내용은 유지됩니다. 다시 시도해 주세요.",
|
|
1550
1575
|
"chatSchedules.partialSave": "대화는 만들어졌지만 예약 저장에 실패했습니다. 다시 저장하면 같은 대화에 예약합니다.",
|
|
1551
1576
|
"chatSchedules.saving": "처리 중…",
|
|
@@ -1793,7 +1818,6 @@ const redesignKo = {
|
|
|
1793
1818
|
"ux2.selectOrganization": "조직",
|
|
1794
1819
|
"ux2.selectMachine": "작업PC",
|
|
1795
1820
|
"ux2.repository": "저장소",
|
|
1796
|
-
"ux2.showNotifications": "알림 보이기",
|
|
1797
1821
|
"ux2.showUsage": "AI 잔여량 보이기",
|
|
1798
1822
|
"ux2.showResources": "CPU·메모리 보이기",
|
|
1799
1823
|
"ux2.showUsageHint": "입력창 아래에 남은 AI 사용량을 보여 줍니다.",
|
|
@@ -2042,7 +2066,7 @@ const taskNotificationKo = {
|
|
|
2042
2066
|
const completionInboxKo = {
|
|
2043
2067
|
"completionInbox.recent": "최근 알림",
|
|
2044
2068
|
"completionInbox.unreadCount": "{count}개",
|
|
2045
|
-
"completionInbox.showAll": "
|
|
2069
|
+
"completionInbox.showAll": "전체보기",
|
|
2046
2070
|
"completionInbox.dialogLabel": "알림 센터",
|
|
2047
2071
|
"completionInbox.markAllRead": "모두 읽음",
|
|
2048
2072
|
"completionInbox.clearAll": "모두 지우기",
|
|
@@ -2348,7 +2372,10 @@ const orcaPortKo = {
|
|
|
2348
2372
|
"quickOpen.stateCount": "{count}개",
|
|
2349
2373
|
"quickOpen.stateChipRemove": "{state} 필터 — Backspace로 해제",
|
|
2350
2374
|
"shortcuts.action.attentionJump": "기다리는 세션으로 점프",
|
|
2351
|
-
"shortcuts.action.attentionJumpDescription": "입력을 기다리는 세션으로 이동합니다. 없으면 완료됐지만 아직 확인하지 않은 세션으로, 다시 누르면 다음 세션으로 순환합니다."
|
|
2375
|
+
"shortcuts.action.attentionJumpDescription": "입력을 기다리는 세션으로 이동합니다. 없으면 완료됐지만 아직 확인하지 않은 세션으로, 다시 누르면 다음 세션으로 순환합니다.",
|
|
2376
|
+
"shortcuts.action.previousConversation": "이전 대화",
|
|
2377
|
+
"shortcuts.action.nextConversation": "다음 대화",
|
|
2378
|
+
"shortcuts.action.conversationNavigationDescription": "사이드바 목록 순서로 대화를 이동합니다. 고정 대화는 고정 목록에서 이동합니다."
|
|
2352
2379
|
};
|
|
2353
2380
|
const usageAnalyticsKo = {
|
|
2354
2381
|
"settings.usageAnalytics.enable": "익명 사용 통계 보내기",
|
|
@@ -5355,6 +5382,14 @@ const ko = {
|
|
|
5355
5382
|
...credentialProtectionKo,
|
|
5356
5383
|
...projectSettingsKo,
|
|
5357
5384
|
...managedClaudeKo,
|
|
5385
|
+
"confirmation.title": "확인이 필요합니다",
|
|
5386
|
+
"confirmation.confirm": "확인",
|
|
5387
|
+
"confirmation.archiveTitle": "대화를 보관할까요?",
|
|
5388
|
+
"confirmation.archiveDescription": "보관한 대화는 기본 목록에서 숨겨집니다.\n완료된 대화에서 다시 열 수 있습니다.",
|
|
5389
|
+
"confirmation.archive": "보관",
|
|
5390
|
+
"confirmation.deleteTitle": "대화를 삭제할까요?",
|
|
5391
|
+
"confirmation.deleteDescription": "대화와 메시지가 삭제됩니다.\n이 작업은 되돌릴 수 없습니다.",
|
|
5392
|
+
"confirmation.delete": "삭제",
|
|
5358
5393
|
"assetWorkflow.open": "문서 양식",
|
|
5359
5394
|
"assetWorkflow.unavailable": "선택 가능한 문서 양식 확장이 없습니다. 설정에서 설치하고 권한을 승인해 주세요.",
|
|
5360
5395
|
"assetWorkflow.privateNotAllowed": "개인 양식 원본은 본인 전용 머신의 개인 대화에서만 보낼 수 있습니다. 기존 폴더나 공유·조직 머신에서는 원본 첨부를 빼고 보내 주세요.",
|
|
@@ -6739,13 +6774,12 @@ const ko = {
|
|
|
6739
6774
|
"session.interruptAiFailedDetail": "AI 응답 중단에 실패했습니다{detail}",
|
|
6740
6775
|
"preview.requestFailed": "미리보기 요청을 보낼 수 없습니다.",
|
|
6741
6776
|
"message.unsyncedNoDelete": "동기화되지 않은 메시지는 아직 삭제할 수 없습니다.",
|
|
6742
|
-
"session.deleteConfirm": '"{title}" 대화를 삭제할까요? 이 작업은 되돌릴 수 없습니다.',
|
|
6743
6777
|
"session.demoDeleted": "Demo workspace에서 대화를 삭제했습니다.",
|
|
6744
6778
|
"session.cleanedInaccessible": "이미 삭제되었거나 접근할 수 없는 대화를 목록에서 정리했습니다.",
|
|
6779
|
+
"session.deleteConfirm": '"{title}" 대화를 삭제할까요? 이 작업은 되돌릴 수 없습니다.',
|
|
6745
6780
|
"session.deleted": "대화를 삭제했습니다.",
|
|
6746
6781
|
"session.deleteFailed": "대화를 삭제할 수 없습니다.",
|
|
6747
6782
|
// Session archive / updates / project-settings save / worktree cleanup confirms
|
|
6748
|
-
"session.archiveConfirm": '"{title}" 대화를 완료로 이동할까요? 완료된 대화는 기본 목록에서 숨겨집니다. 언제든 다시 볼 수 있습니다.',
|
|
6749
6783
|
"session.demoArchived": "Demo workspace에서 대화를 완료로 이동했습니다.",
|
|
6750
6784
|
"session.cleanedArchivedInaccessible": "이미 삭제되었거나 접근할 수 없는 대화를 목록에서 완료 처리했습니다.",
|
|
6751
6785
|
"session.archived": "대화를 완료로 이동했습니다.",
|
|
@@ -8571,6 +8605,23 @@ function parseArgs(argv, interactive = false) {
|
|
|
8571
8605
|
throw error;
|
|
8572
8606
|
}
|
|
8573
8607
|
}
|
|
8608
|
+
const AGENT_FAILURE_EXIT_CODE = 3;
|
|
8609
|
+
function isAgentFailure(value2) {
|
|
8610
|
+
return typeof value2 === "object" && value2 !== null && "stdout" in value2;
|
|
8611
|
+
}
|
|
8612
|
+
function line(value2) {
|
|
8613
|
+
return `${JSON.stringify(value2)}
|
|
8614
|
+
`;
|
|
8615
|
+
}
|
|
8616
|
+
function agentOk(payload) {
|
|
8617
|
+
return { stdout: line({ ...payload, ok: true }), exitCode: 0 };
|
|
8618
|
+
}
|
|
8619
|
+
function agentFail(code, detail, extra) {
|
|
8620
|
+
return {
|
|
8621
|
+
stdout: line({ ...extra, ok: false, error: code, ...detail ? { detail } : {} }),
|
|
8622
|
+
exitCode: AGENT_FAILURE_EXIT_CODE
|
|
8623
|
+
};
|
|
8624
|
+
}
|
|
8574
8625
|
const HELP_TEXT = `saycode — drive Saycode sessions across your machines from the terminal
|
|
8575
8626
|
|
|
8576
8627
|
Usage
|
|
@@ -8721,7 +8772,7 @@ function parseRuntimeState(value2) {
|
|
|
8721
8772
|
}
|
|
8722
8773
|
function parseServerAutomationPublic(value2) {
|
|
8723
8774
|
const item = row$1(value2);
|
|
8724
|
-
if (item.payloadVersion !== 1 && item.payloadVersion !== 2 || typeof item.paused !== "boolean") throw new Error("automation-response-invalid");
|
|
8775
|
+
if (item.payloadVersion !== 1 && item.payloadVersion !== 2 && item.payloadVersion !== 4 || typeof item.paused !== "boolean") throw new Error("automation-response-invalid");
|
|
8725
8776
|
const parsed2 = {
|
|
8726
8777
|
id: stringValue$1(item.id),
|
|
8727
8778
|
projectId: stringValue$1(item.projectId),
|
|
@@ -12171,7 +12222,7 @@ class $ZodEncodeError extends Error {
|
|
|
12171
12222
|
}
|
|
12172
12223
|
}
|
|
12173
12224
|
const globalConfig = {};
|
|
12174
|
-
function config(newConfig) {
|
|
12225
|
+
function config$1(newConfig) {
|
|
12175
12226
|
return globalConfig;
|
|
12176
12227
|
}
|
|
12177
12228
|
function getEnumValues(entries2) {
|
|
@@ -12613,7 +12664,7 @@ const _parse = (_Err) => (schema, value2, _ctx, _params) => {
|
|
|
12613
12664
|
throw new $ZodAsyncError();
|
|
12614
12665
|
}
|
|
12615
12666
|
if (result2.issues.length) {
|
|
12616
|
-
const e = new (_params?.Err ?? _Err)(result2.issues.map((iss) => finalizeIssue(iss, ctx, config())));
|
|
12667
|
+
const e = new (_params?.Err ?? _Err)(result2.issues.map((iss) => finalizeIssue(iss, ctx, config$1())));
|
|
12617
12668
|
captureStackTrace(e, _params?.callee);
|
|
12618
12669
|
throw e;
|
|
12619
12670
|
}
|
|
@@ -12625,7 +12676,7 @@ const _parseAsync = (_Err) => async (schema, value2, _ctx, params) => {
|
|
|
12625
12676
|
if (result2 instanceof Promise)
|
|
12626
12677
|
result2 = await result2;
|
|
12627
12678
|
if (result2.issues.length) {
|
|
12628
|
-
const e = new (params?.Err ?? _Err)(result2.issues.map((iss) => finalizeIssue(iss, ctx, config())));
|
|
12679
|
+
const e = new (params?.Err ?? _Err)(result2.issues.map((iss) => finalizeIssue(iss, ctx, config$1())));
|
|
12629
12680
|
captureStackTrace(e, params?.callee);
|
|
12630
12681
|
throw e;
|
|
12631
12682
|
}
|
|
@@ -12639,7 +12690,7 @@ const _safeParse = (_Err) => (schema, value2, _ctx) => {
|
|
|
12639
12690
|
}
|
|
12640
12691
|
return result2.issues.length ? {
|
|
12641
12692
|
success: false,
|
|
12642
|
-
error: new (_Err ?? $ZodError)(result2.issues.map((iss) => finalizeIssue(iss, ctx, config())))
|
|
12693
|
+
error: new (_Err ?? $ZodError)(result2.issues.map((iss) => finalizeIssue(iss, ctx, config$1())))
|
|
12643
12694
|
} : { success: true, data: result2.value };
|
|
12644
12695
|
};
|
|
12645
12696
|
const safeParse$1 = /* @__PURE__ */ _safeParse($ZodRealError);
|
|
@@ -12650,7 +12701,7 @@ const _safeParseAsync = (_Err) => async (schema, value2, _ctx) => {
|
|
|
12650
12701
|
result2 = await result2;
|
|
12651
12702
|
return result2.issues.length ? {
|
|
12652
12703
|
success: false,
|
|
12653
|
-
error: new _Err(result2.issues.map((iss) => finalizeIssue(iss, ctx, config())))
|
|
12704
|
+
error: new _Err(result2.issues.map((iss) => finalizeIssue(iss, ctx, config$1())))
|
|
12654
12705
|
} : { success: true, data: result2.value };
|
|
12655
12706
|
};
|
|
12656
12707
|
const safeParseAsync$1 = /* @__PURE__ */ _safeParseAsync($ZodRealError);
|
|
@@ -13907,7 +13958,7 @@ function handleUnionResults(results, final, inst, ctx) {
|
|
|
13907
13958
|
code: "invalid_union",
|
|
13908
13959
|
input: final.value,
|
|
13909
13960
|
inst,
|
|
13910
|
-
errors: results.map((result2) => result2.issues.map((iss) => finalizeIssue(iss, ctx, config())))
|
|
13961
|
+
errors: results.map((result2) => result2.issues.map((iss) => finalizeIssue(iss, ctx, config$1())))
|
|
13911
13962
|
});
|
|
13912
13963
|
return final;
|
|
13913
13964
|
}
|
|
@@ -14160,7 +14211,7 @@ const $ZodRecord = /* @__PURE__ */ $constructor("$ZodRecord", (inst, def) => {
|
|
|
14160
14211
|
payload.issues.push({
|
|
14161
14212
|
code: "invalid_key",
|
|
14162
14213
|
origin: "record",
|
|
14163
|
-
issues: keyResult.issues.map((iss) => finalizeIssue(iss, ctx, config())),
|
|
14214
|
+
issues: keyResult.issues.map((iss) => finalizeIssue(iss, ctx, config$1())),
|
|
14164
14215
|
input: key,
|
|
14165
14216
|
path: [key],
|
|
14166
14217
|
inst
|
|
@@ -14380,7 +14431,7 @@ const $ZodCatch = /* @__PURE__ */ $constructor("$ZodCatch", (inst, def) => {
|
|
|
14380
14431
|
payload.value = def.catchValue({
|
|
14381
14432
|
...payload,
|
|
14382
14433
|
error: {
|
|
14383
|
-
issues: result3.issues.map((iss) => finalizeIssue(iss, ctx, config()))
|
|
14434
|
+
issues: result3.issues.map((iss) => finalizeIssue(iss, ctx, config$1()))
|
|
14384
14435
|
},
|
|
14385
14436
|
input: payload.value
|
|
14386
14437
|
});
|
|
@@ -14394,7 +14445,7 @@ const $ZodCatch = /* @__PURE__ */ $constructor("$ZodCatch", (inst, def) => {
|
|
|
14394
14445
|
payload.value = def.catchValue({
|
|
14395
14446
|
...payload,
|
|
14396
14447
|
error: {
|
|
14397
|
-
issues: result2.issues.map((iss) => finalizeIssue(iss, ctx, config()))
|
|
14448
|
+
issues: result2.issues.map((iss) => finalizeIssue(iss, ctx, config$1()))
|
|
14398
14449
|
},
|
|
14399
14450
|
input: payload.value
|
|
14400
14451
|
});
|
|
@@ -18860,6 +18911,12 @@ function normalizeConnectors(raw) {
|
|
|
18860
18911
|
}
|
|
18861
18912
|
return out;
|
|
18862
18913
|
}
|
|
18914
|
+
function integrationConnectPageUrl(session, params) {
|
|
18915
|
+
if (session.apiToken === "demo-token") throw new Error("Demo sessions cannot connect external services");
|
|
18916
|
+
const query = new URLSearchParams(params);
|
|
18917
|
+
if (session.userId) query.set("expectedUserId", session.userId);
|
|
18918
|
+
return `${session.apiBaseUrl.replace(/\/+$/, "")}/integrations/connect?${query.toString()}`;
|
|
18919
|
+
}
|
|
18863
18920
|
const PROVIDERS = ["claude", "codex"];
|
|
18864
18921
|
const ROTATION_STATES = [
|
|
18865
18922
|
"stopped",
|
|
@@ -29950,12 +30007,13 @@ function extractPullRequestList(raw) {
|
|
|
29950
30007
|
}
|
|
29951
30008
|
return [];
|
|
29952
30009
|
}
|
|
29953
|
-
function normalizeAutomationSupport(value2) {
|
|
30010
|
+
function normalizeAutomationSupport(value2, allowConversation = false) {
|
|
29954
30011
|
if (typeof value2 !== "object" || value2 === null || Array.isArray(value2)) return void 0;
|
|
29955
30012
|
const capability = value2;
|
|
29956
30013
|
if (typeof capability.rpcAvailable !== "boolean") return void 0;
|
|
29957
30014
|
return {
|
|
29958
30015
|
rpcAvailable: capability.rpcAvailable,
|
|
30016
|
+
...allowConversation && capability.conversation === true ? { conversation: true } : {},
|
|
29959
30017
|
serverBacked: capability.serverBacked === true,
|
|
29960
30018
|
...typeof capability.monitorMode === "boolean" ? { monitorMode: capability.monitorMode } : {},
|
|
29961
30019
|
...typeof capability.hostCommands === "boolean" ? { hostCommands: capability.hostCommands } : {},
|
|
@@ -29982,7 +30040,7 @@ function normalizeMachine(row2, candidateKeys, dataKeyFields = null) {
|
|
|
29982
30040
|
const resources = row2.resources ?? parseMachineResources(daemonState);
|
|
29983
30041
|
const host = row2.host || registry2?.host || (typeof decrypted.host === "string" ? decrypted.host : row2.id.slice(0, 8));
|
|
29984
30042
|
const platform2 = row2.platform || registry2?.platform || (typeof decrypted.platform === "string" ? decrypted.platform : "unknown");
|
|
29985
|
-
const automationSupport = normalizeAutomationSupport(decrypted.automationSupport) ?? normalizeAutomationSupport(registry2?.automationSupport);
|
|
30043
|
+
const automationSupport = normalizeAutomationSupport(decrypted.automationSupport, true) ?? normalizeAutomationSupport(registry2?.automationSupport);
|
|
29986
30044
|
const autonomousQualityGate = decrypted.autonomousQualityGateSupport ?? registry2?.autonomousQualityGateSupport;
|
|
29987
30045
|
const channelFromMetadata = normalizeChannelSupport(decrypted.channelSupport);
|
|
29988
30046
|
const channelFromRegistry = normalizeChannelSupport(registry2?.channelSupport);
|
|
@@ -30044,7 +30102,8 @@ class ApiClient {
|
|
|
30044
30102
|
syncBaseUrl: session.happyBaseUrl,
|
|
30045
30103
|
apiToken: session.token,
|
|
30046
30104
|
syncToken: session.syncToken || session.token,
|
|
30047
|
-
standalone: isStandaloneAuthSession(session)
|
|
30105
|
+
standalone: isStandaloneAuthSession(session),
|
|
30106
|
+
userId: session.userId
|
|
30048
30107
|
});
|
|
30049
30108
|
}
|
|
30050
30109
|
async login(input) {
|
|
@@ -30380,6 +30439,14 @@ class ApiClient {
|
|
|
30380
30439
|
boundary: "api"
|
|
30381
30440
|
});
|
|
30382
30441
|
}
|
|
30442
|
+
async getPersonalChatAutomationImpact(chatId) {
|
|
30443
|
+
const data = await this.request(`/api/personal-chats/${encodeURIComponent(chatId)}/automation-impact`, { boundary: "api" });
|
|
30444
|
+
if (!data || ![data.total, data.paused, data.running].every((value2) => Number.isSafeInteger(value2) && value2 >= 0) || data.paused > data.total) throw new Error("invalid-chat-automation-impact");
|
|
30445
|
+
return data;
|
|
30446
|
+
}
|
|
30447
|
+
async reservePersonalChatSession(chatId, method, input) {
|
|
30448
|
+
return this.request(`/api/personal-chat-collaboration/${encodeURIComponent(chatId)}/start`, { method, boundary: "api", body: JSON.stringify(input) });
|
|
30449
|
+
}
|
|
30383
30450
|
async bindPersonalChatSession(chatId, sessionId) {
|
|
30384
30451
|
const data = await this.request(
|
|
30385
30452
|
`/api/personal-chats/${encodeURIComponent(chatId)}/sessions`,
|
|
@@ -30736,10 +30803,10 @@ class ApiClient {
|
|
|
30736
30803
|
return normalizeGitProviderPage("github", data.repositories, data.hasMore);
|
|
30737
30804
|
}
|
|
30738
30805
|
async startGithubIntegrationConnect() {
|
|
30739
|
-
return this.
|
|
30806
|
+
return { authorizationUrl: integrationConnectPageUrl(this.config, { flow: "github" }) };
|
|
30740
30807
|
}
|
|
30741
30808
|
async startGithubIntegrationInstallation() {
|
|
30742
|
-
return this.
|
|
30809
|
+
return { installUrl: integrationConnectPageUrl(this.config, { flow: "github-install" }) };
|
|
30743
30810
|
}
|
|
30744
30811
|
async searchGitLabIntegrationProjects(search, page = 1) {
|
|
30745
30812
|
const params = new URLSearchParams({ search, page: String(page) });
|
|
@@ -30750,7 +30817,7 @@ class ApiClient {
|
|
|
30750
30817
|
return normalizeGitProviderPage("gitlab", data.projects, data.hasMore);
|
|
30751
30818
|
}
|
|
30752
30819
|
async startGitLabIntegrationConnect() {
|
|
30753
|
-
return this.
|
|
30820
|
+
return { authorizationUrl: integrationConnectPageUrl(this.config, { flow: "gitlab" }) };
|
|
30754
30821
|
}
|
|
30755
30822
|
// specs/desktop-settings-git-accounts — 서버가 토큰을 폐기한다. 응답에 토큰은 없다.
|
|
30756
30823
|
async disconnectGithubIntegration() {
|
|
@@ -30772,12 +30839,7 @@ class ApiClient {
|
|
|
30772
30839
|
}
|
|
30773
30840
|
/** 반환된 URL 은 **시스템 브라우저**로 열어야 한다 — 공급자가 임베드 웹뷰를 거부한다. */
|
|
30774
30841
|
async startConnectorConnect(provider2) {
|
|
30775
|
-
|
|
30776
|
-
`/api/integrations/connectors/${encodeURIComponent(provider2)}/oauth/start?returnTo=${encodeURIComponent("/settings/connectors?from=desktop")}`,
|
|
30777
|
-
{ method: "POST", boundary: "api" }
|
|
30778
|
-
);
|
|
30779
|
-
if (!data.authorizationUrl) throw new Error("authorizationUrl is missing");
|
|
30780
|
-
return data.authorizationUrl;
|
|
30842
|
+
return integrationConnectPageUrl(this.config, { flow: "connector", provider: provider2, returnTo: "/settings/connectors?from=desktop" });
|
|
30781
30843
|
}
|
|
30782
30844
|
async saveConnectorApiKey(provider2, apiKey) {
|
|
30783
30845
|
const data = await this.request(
|
|
@@ -33118,6 +33180,9 @@ class CliRest {
|
|
|
33118
33180
|
this.credential = credential;
|
|
33119
33181
|
this.baseUrl = baseUrl;
|
|
33120
33182
|
}
|
|
33183
|
+
get apiToken() {
|
|
33184
|
+
return this.credential.apiToken;
|
|
33185
|
+
}
|
|
33121
33186
|
get hasApiAccess() {
|
|
33122
33187
|
return !!this.credential.apiToken;
|
|
33123
33188
|
}
|
|
@@ -33367,6 +33432,14 @@ class CliContext {
|
|
|
33367
33432
|
homeDir;
|
|
33368
33433
|
resolver;
|
|
33369
33434
|
apiRest;
|
|
33435
|
+
/** Preserve account API features without replacing the machine sync identity. */
|
|
33436
|
+
async useAccountApi(context) {
|
|
33437
|
+
const accountOrigin = context.credential.credential.serverUrl ?? DEFAULT_SERVER_URL;
|
|
33438
|
+
if (new URL(accountOrigin).origin !== new URL(this.serverUrl).origin || !context.hasApiAccess) return;
|
|
33439
|
+
const workspace = pickDefaultWorkspace(await context.listWorkspaces(), readConfig(context.homeDir).workspaceId ?? null);
|
|
33440
|
+
this.apiRest = context.apiRest;
|
|
33441
|
+
this.activeWorkspace = workspace;
|
|
33442
|
+
}
|
|
33370
33443
|
get hasApiAccess() {
|
|
33371
33444
|
return this.apiRest.hasApiAccess;
|
|
33372
33445
|
}
|
|
@@ -33441,6 +33514,21 @@ async function withTransport(context, run2, providedTransport) {
|
|
|
33441
33514
|
if (!providedTransport) transport.dispose();
|
|
33442
33515
|
}
|
|
33443
33516
|
}
|
|
33517
|
+
async function loadAgentContext(env = process.env) {
|
|
33518
|
+
const happyHome = env.SAYCODE_HAPPY_HOME?.trim() || env.HAPPY_HOME_DIR?.trim();
|
|
33519
|
+
const context = loadContext(happyHome ? { ...env, SAYCODE_HAPPY_HOME: happyHome } : env);
|
|
33520
|
+
if (!happyHome) await context.selectWorkspace();
|
|
33521
|
+
else if (!env.SAYCODE_HAPPY_HOME?.trim()) {
|
|
33522
|
+
try {
|
|
33523
|
+
const account = loadContext(env);
|
|
33524
|
+
if (account.credential.source === "saycode" && account.hasApiAccess && account.serverUrl === context.serverUrl) {
|
|
33525
|
+
await context.useAccountApi(account);
|
|
33526
|
+
}
|
|
33527
|
+
} catch {
|
|
33528
|
+
}
|
|
33529
|
+
}
|
|
33530
|
+
return context;
|
|
33531
|
+
}
|
|
33444
33532
|
function askHidden(question) {
|
|
33445
33533
|
return new Promise((resolve2) => {
|
|
33446
33534
|
process.stdout.write(question);
|
|
@@ -34821,7 +34909,7 @@ function startCliModelCatalogForContext(context) {
|
|
|
34821
34909
|
return startCliModelCatalog({
|
|
34822
34910
|
homeDir: context.homeDir,
|
|
34823
34911
|
serverUrl: context.serverUrl,
|
|
34824
|
-
apiToken: context.
|
|
34912
|
+
apiToken: context.rest.apiToken,
|
|
34825
34913
|
fetchCatalog: (timeoutMs) => context.rest.getAgentModelCatalog(timeoutMs)
|
|
34826
34914
|
});
|
|
34827
34915
|
}
|
|
@@ -39811,23 +39899,6 @@ function waitForSessionState(options) {
|
|
|
39811
39899
|
options.signal?.addEventListener("abort", onAbort);
|
|
39812
39900
|
});
|
|
39813
39901
|
}
|
|
39814
|
-
const AGENT_FAILURE_EXIT_CODE = 3;
|
|
39815
|
-
function isAgentFailure(value2) {
|
|
39816
|
-
return typeof value2 === "object" && value2 !== null && "stdout" in value2;
|
|
39817
|
-
}
|
|
39818
|
-
function line(value2) {
|
|
39819
|
-
return `${JSON.stringify(value2)}
|
|
39820
|
-
`;
|
|
39821
|
-
}
|
|
39822
|
-
function agentOk(payload) {
|
|
39823
|
-
return { stdout: line({ ...payload, ok: true }), exitCode: 0 };
|
|
39824
|
-
}
|
|
39825
|
-
function agentFail(code, detail, extra) {
|
|
39826
|
-
return {
|
|
39827
|
-
stdout: line({ ...extra, ok: false, error: code, ...detail ? { detail } : {} }),
|
|
39828
|
-
exitCode: AGENT_FAILURE_EXIT_CODE
|
|
39829
|
-
};
|
|
39830
|
-
}
|
|
39831
39902
|
const DEFAULT_PIN_INTERVAL_MS = 3e4;
|
|
39832
39903
|
const DEFAULT_EFFECT_TIMEOUT_MS = 5e3;
|
|
39833
39904
|
function sessionSummary(session) {
|
|
@@ -41298,10 +41369,10 @@ function serverLogWriter(layout, name) {
|
|
|
41298
41369
|
};
|
|
41299
41370
|
}
|
|
41300
41371
|
const happyCliPackageName = "@buzzni/happy-cli";
|
|
41301
|
-
const happyCliVersion = "1.1.10-aplus.
|
|
41302
|
-
const happyCliTag = "happy-cli-v1.1.10-aplus.
|
|
41303
|
-
const vendorCommit = "
|
|
41304
|
-
const saycodeCliVersion = "0.9.
|
|
41372
|
+
const happyCliVersion = "1.1.10-aplus.323";
|
|
41373
|
+
const happyCliTag = "happy-cli-v1.1.10-aplus.323";
|
|
41374
|
+
const vendorCommit = "c0714f0d9ce4b3d279300163103e7461c8a38d3a";
|
|
41375
|
+
const saycodeCliVersion = "0.9.4";
|
|
41305
41376
|
const happyServerVersion = "0.1.2";
|
|
41306
41377
|
const releaseFeatures = { "mcpRuntimeRecovery": { "enabled": true, "releaseState": "released", "sourceBranch": "main", "sourceHead": "a79a10e288cf7775cb15955f716693c6a7df1640", "requiredCommit": "975e32cf" } };
|
|
41307
41378
|
const pin = {
|
|
@@ -42050,6 +42121,11 @@ function windowsCommandFallbacks(command, env) {
|
|
|
42050
42121
|
}
|
|
42051
42122
|
async function findWindowsCommand(command, deps) {
|
|
42052
42123
|
await deps.refreshPath();
|
|
42124
|
+
const pinned = await deps.pinned?.(command);
|
|
42125
|
+
if (pinned) {
|
|
42126
|
+
deps.remember([win32.dirname(pinned)]);
|
|
42127
|
+
return pinned;
|
|
42128
|
+
}
|
|
42053
42129
|
const onPath = findOnWindowsPath(command, deps.path(), deps.exists);
|
|
42054
42130
|
const native = (file) => !!file && /\.(exe|com)$/i.test(file);
|
|
42055
42131
|
const fallback = native(onPath) ? null : windowsCommandFallbacks(command, deps.env).find((file) => deps.exists(file)) ?? null;
|
|
@@ -42057,6 +42133,35 @@ async function findWindowsCommand(command, deps) {
|
|
|
42057
42133
|
if (found) deps.remember([win32.dirname(found)]);
|
|
42058
42134
|
return found;
|
|
42059
42135
|
}
|
|
42136
|
+
const installRoot = "Programs\\Saycode-Tools";
|
|
42137
|
+
const tools = [{ "id": "node", "command": "npm", "label": "Node.js", "version": "22.23.1", "executable": "node.exe", "pathDirs": ["."], "userPathEntries": ["%APPDATA%\\npm"], "files": { "node_modules/npm/npmrc": "prefix=${APPDATA}\\npm\n" }, "versionArgs": ["--version"], "versionOutput": "v22.23.1", "targets": { "x64": { "url": "https://nodejs.org/dist/v22.23.1/node-v22.23.1-win-x64.zip", "sha256": "7df0bc9375723f4a86b3aa1b7cc73342423d9677a8df4538aca31a049e309c29", "archiveRoot": "node-v22.23.1-win-x64" }, "arm64": { "url": "https://nodejs.org/dist/v22.23.1/node-v22.23.1-win-arm64.zip", "sha256": "b470fdfe3502c05151656e06d495e3f47544f2ee8b1d9c8705090f2dd5996bd0", "archiveRoot": "node-v22.23.1-win-arm64" } } }, { "id": "uv", "command": "uv", "label": "uv", "version": "0.12.21", "executable": "uv.exe", "pathDirs": ["."], "userPathEntries": ["%USERPROFILE%\\.local\\bin"], "versionArgs": ["--version"], "versionOutput": "uv 0.12.21", "targets": { "x64": { "url": "https://github.com/astral-sh/uv/releases/download/0.12.21/uv-x86_64-pc-windows-msvc.zip", "sha256": "5d223efa0bf00208c3853246af09420419dfbd352536aa6bb8163d6170e23890", "archiveRoot": null, "fallbacks": [{ "url": "https://files.pythonhosted.org/packages/2a/06/bda383b338dd21bcd74c9b4ba47301315573fdb5aba46fe40835f8299482/uv-0.12.21-py3-none-win_amd64.whl", "sha256": "8c7c3eb32d84c711906dedd09df7379cf4d9f5bb84b8e58a1244ca0a8a1209d4", "archiveRoot": "uv-0.12.21.data/scripts", "subtreeOnly": true }] }, "arm64": { "url": "https://github.com/astral-sh/uv/releases/download/0.12.21/uv-aarch64-pc-windows-msvc.zip", "sha256": "93ed53b94e9cec000cacdfd18ca67bc4cb2b6a5f5ec041edd7f2a3dae365ce79", "archiveRoot": null, "fallbacks": [{ "url": "https://files.pythonhosted.org/packages/2c/76/1b6478ff9dcc3b58b2025828e00f06bac4915b7442c8254d5b6265707561/uv-0.12.21-py3-none-win_arm64.whl", "sha256": "79dc0c11e7f169f1b32cf6838b6a0d651ba054cc8013e0b2e5fe34392c1d1528", "archiveRoot": "uv-0.12.21.data/scripts", "subtreeOnly": true }] } } }, { "id": "git", "command": "git", "label": "Git (MinGit)", "version": "2.56.0", "executable": "cmd/git.exe", "pathDirs": ["cmd"], "versionArgs": ["--version"], "versionOutput": "git version 2.56.0", "targets": { "x64": { "url": "https://github.com/git-for-windows/git/releases/download/v2.56.0.windows.1/MinGit-2.56.0-64-bit.zip", "sha256": "064b440ff870ed5198527e8f3a92cdf5bd2fd0fedf5e718af95e3fdaddeff718", "archiveRoot": null }, "arm64": { "url": "https://github.com/git-for-windows/git/releases/download/v2.56.0.windows.1/MinGit-2.56.0-arm64.zip", "sha256": "cb3b0f2d486ea52673227151a5baf5bc13861ff80e74e94e46d614d1bfcd5c06", "archiveRoot": null } } }];
|
|
42138
|
+
const config = {
|
|
42139
|
+
installRoot,
|
|
42140
|
+
tools
|
|
42141
|
+
};
|
|
42142
|
+
const windowsToolsInstallRoot = () => join(process.env.LOCALAPPDATA ?? join(process.env.USERPROFILE ?? "", "AppData", "Local"), ...config.installRoot.split("\\"));
|
|
42143
|
+
const exists$1 = (path2) => access(path2).then(() => true, () => false);
|
|
42144
|
+
const pathEntriesOf = (tool, dir) => tool.pathDirs.map((relative2) => relative2 === "." ? dir : join(dir, ...relative2.split("/")));
|
|
42145
|
+
async function hasCommand(tool, dir) {
|
|
42146
|
+
for (const folder of pathEntriesOf(tool, dir)) for (const extension2 of [".exe", ".cmd"]) if (await exists$1(join(folder, tool.command + extension2))) return true;
|
|
42147
|
+
return false;
|
|
42148
|
+
}
|
|
42149
|
+
async function installDirs(tool, installRoot2) {
|
|
42150
|
+
const base2 = `${tool.id}-${tool.version}`;
|
|
42151
|
+
const names = await readdir(installRoot2).catch(() => []);
|
|
42152
|
+
const alternates = names.map((name) => name.startsWith(`${base2}-`) ? Number(name.slice(base2.length + 1)) : NaN).filter((n) => Number.isInteger(n) && n >= 2).sort((a, b) => a - b);
|
|
42153
|
+
return [...names.includes(base2) ? [base2] : [], ...alternates.map((n) => `${base2}-${n}`)].map((name) => join(installRoot2, name));
|
|
42154
|
+
}
|
|
42155
|
+
async function activeInstallDir(tool, installRoot2) {
|
|
42156
|
+
for (const dir of await installDirs(tool, installRoot2)) if (await hasCommand(tool, dir)) return dir;
|
|
42157
|
+
return null;
|
|
42158
|
+
}
|
|
42159
|
+
async function pinnedToolCommand(command, installRoot2 = windowsToolsInstallRoot()) {
|
|
42160
|
+
const tool = config.tools.find((entry) => entry.command === command), dir = tool && await activeInstallDir(tool, installRoot2);
|
|
42161
|
+
for (const folder of tool && dir ? pathEntriesOf(tool, dir) : []) if (await exists$1(join(folder, `${command}.exe`))) return join(folder, `${command}.exe`);
|
|
42162
|
+
return null;
|
|
42163
|
+
}
|
|
42164
|
+
const pinnedFirst = (command) => command === "uv" ? pinnedToolCommand(command) : Promise.resolve(null);
|
|
42060
42165
|
const discoveredPaths = /* @__PURE__ */ new Set();
|
|
42061
42166
|
function commandEnvironment(env, paths = [], platform2 = process.platform, persisted = windowsPersistedPath.cached()) {
|
|
42062
42167
|
const next = { ...env }, windows = platform2 === "win32";
|
|
@@ -42066,6 +42171,7 @@ function commandEnvironment(env, paths = [], platform2 = process.platform, persi
|
|
|
42066
42171
|
const entries2 = keys2.flatMap((name) => (next[name] ?? "").split(delimiter2)).filter(Boolean);
|
|
42067
42172
|
for (const name of keys2) delete next[name];
|
|
42068
42173
|
next[key] = [.../* @__PURE__ */ new Set([...windows ? mergeWindowsPathEntries(entries2, persisted ?? []) : entries2, ...discoveredPaths, ...paths])].join(delimiter2);
|
|
42174
|
+
if (windows && next.NODE_USE_SYSTEM_CA === void 0) next.NODE_USE_SYSTEM_CA = "1";
|
|
42069
42175
|
return next;
|
|
42070
42176
|
}
|
|
42071
42177
|
function rememberCommandPaths(paths) {
|
|
@@ -42107,6 +42213,7 @@ async function findCommand(command) {
|
|
|
42107
42213
|
exists: existsSync,
|
|
42108
42214
|
env: process.env,
|
|
42109
42215
|
remember: rememberCommandPaths,
|
|
42216
|
+
pinned: pinnedFirst,
|
|
42110
42217
|
path: () => {
|
|
42111
42218
|
const env = commandEnvironment(process.env);
|
|
42112
42219
|
return env.Path ?? env.PATH ?? "";
|
|
@@ -54020,9 +54127,10 @@ const result = (status, body) => ({ handled: true, status, body });
|
|
|
54020
54127
|
const invalid = (message) => result(400, { error: message });
|
|
54021
54128
|
const safeId = (value2) => typeof value2 === "string" && /^[\w-]+$/.test(value2);
|
|
54022
54129
|
class StandaloneWork {
|
|
54023
|
-
constructor(storeDir, userId, text2) {
|
|
54130
|
+
constructor(storeDir, userId, text2, automations) {
|
|
54024
54131
|
this.userId = userId;
|
|
54025
54132
|
this.text = text2;
|
|
54133
|
+
this.automations = automations;
|
|
54026
54134
|
this.file = join(storeDir, "work.json");
|
|
54027
54135
|
}
|
|
54028
54136
|
lock = Promise.resolve();
|
|
@@ -54104,11 +54212,20 @@ class StandaloneWork {
|
|
|
54104
54212
|
return result(200, { chat: chat2 });
|
|
54105
54213
|
}
|
|
54106
54214
|
}
|
|
54107
|
-
const match = url2.pathname.match(/^\/api\/personal-chats\/([\w-]+)(?:\/(pin|archive|unarchive|sessions|runtime-config))?$/);
|
|
54215
|
+
const match = url2.pathname.match(/^\/api\/personal-chats\/([\w-]+)(?:\/(pin|archive|unarchive|sessions|runtime-config|automation-impact))?$/);
|
|
54108
54216
|
if (!match) return result(404, { error: "Not found" });
|
|
54109
54217
|
const chat = store.chats.find((item) => item.id === match[1]);
|
|
54110
54218
|
if (!chat) return result(404, { error: "Work not found" });
|
|
54111
54219
|
const action = match[2];
|
|
54220
|
+
if (method === "GET" && action === "automation-impact" || method === "DELETE" && !action || method === "POST" && (action === "archive" || action === "unarchive")) {
|
|
54221
|
+
if (!this.automations) return result(503, { error: this.text("chatSchedules.lifecycleFailed") });
|
|
54222
|
+
try {
|
|
54223
|
+
if (action === "automation-impact") return result(200, await this.automations.impact(chat));
|
|
54224
|
+
await this.automations.transition(chat, method === "DELETE" ? "deleted" : action === "archive" ? "archived" : "active");
|
|
54225
|
+
} catch {
|
|
54226
|
+
return result(503, { error: this.text("chatSchedules.lifecycleFailed") });
|
|
54227
|
+
}
|
|
54228
|
+
}
|
|
54112
54229
|
if (method === "GET" && !action) return result(200, { chat });
|
|
54113
54230
|
if (method === "DELETE" && !action) {
|
|
54114
54231
|
store.chats = store.chats.filter((item) => item.id !== chat.id);
|
|
@@ -54149,6 +54266,35 @@ class StandaloneWork {
|
|
|
54149
54266
|
return result(200, { chat });
|
|
54150
54267
|
}
|
|
54151
54268
|
}
|
|
54269
|
+
function standaloneWorkAutomations(input) {
|
|
54270
|
+
const request2 = async (chat, state) => {
|
|
54271
|
+
if (chat.userId !== input.userId || !input.secret || Buffer.byteLength(input.secret) < 32) throw new Error("CHAT_AUTOMATION_LIFECYCLE_UNAVAILABLE");
|
|
54272
|
+
const projectId = `chat:${chat.id}`, now = Date.now();
|
|
54273
|
+
const payload = Buffer.from(JSON.stringify({
|
|
54274
|
+
version: 1,
|
|
54275
|
+
projectId,
|
|
54276
|
+
actorUserId: input.userId,
|
|
54277
|
+
state,
|
|
54278
|
+
bearerHash: createHash("sha256").update(input.token).digest("hex"),
|
|
54279
|
+
issuedAt: now,
|
|
54280
|
+
expiresAt: now + 3e4
|
|
54281
|
+
})).toString("base64url");
|
|
54282
|
+
const proof = `CAL1.${payload}.${createHmac("sha256", input.secret).update("happy-chat-lifecycle-v1\0").update(payload).digest("base64url")}`;
|
|
54283
|
+
const response2 = await fetch(`${input.serverUrl.replace(/\/+$/, "")}/v1/projects/${encodeURIComponent(projectId)}/${state === "impact" ? "automation-impact" : "automation-lifecycle"}`, {
|
|
54284
|
+
method: state === "impact" ? "GET" : "POST",
|
|
54285
|
+
headers: { Authorization: `Bearer ${input.token}`, "Content-Type": "application/json", "x-chat-automation-proof": proof },
|
|
54286
|
+
...state === "impact" ? {} : { body: JSON.stringify({ state }) },
|
|
54287
|
+
signal: AbortSignal.timeout(1e4)
|
|
54288
|
+
});
|
|
54289
|
+
if (!response2.ok) throw new Error("CHAT_AUTOMATION_LIFECYCLE_UNAVAILABLE");
|
|
54290
|
+
const data = await response2.json();
|
|
54291
|
+
if (!data || ![data.total, data.paused, data.running].every((value2) => Number.isSafeInteger(value2) && value2 >= 0) || data.paused > data.total) throw new Error("invalid-chat-automation-impact");
|
|
54292
|
+
return data;
|
|
54293
|
+
};
|
|
54294
|
+
return { impact: (chat) => request2(chat, "impact"), transition: async (chat, state) => {
|
|
54295
|
+
await request2(chat, state);
|
|
54296
|
+
} };
|
|
54297
|
+
}
|
|
54152
54298
|
const nodeFs = { writeFile, rename, rm };
|
|
54153
54299
|
async function preserveCorruptStore(file, contents, fs2 = nodeFs) {
|
|
54154
54300
|
const backup = `${file}.corrupt.bak`;
|
|
@@ -55664,6 +55810,7 @@ const organizationInstallRecoveryEn = {
|
|
|
55664
55810
|
"organizationStart.toolDiagnostic.reason.CLAUDE_SETUP_TOKEN_RUNTIME_UNSUPPORTED": "The installed cswap does not support the required authentication capability.",
|
|
55665
55811
|
"organizationStart.toolDiagnostic.reason.TOOL_PROXY_AUTH_REQUIRED": "The company proxy asked for sign-in authentication, so the connection failed.",
|
|
55666
55812
|
"organizationStart.toolDiagnostic.reason.TOOL_PROXY_BLOCKED": "The company proxy did not allow the connection to the download or package server.",
|
|
55813
|
+
"organizationStart.toolDiagnostic.reason.TOOL_EXECUTION_TIMEOUT": "The run check of the installed tool did not finish in time.",
|
|
55667
55814
|
"organizationStart.toolDiagnostic.action.TOOL_NOT_FOUND": "Retry, or install the tool using the guide and check again.",
|
|
55668
55815
|
"organizationStart.toolDiagnostic.action.TOOL_PREREQUISITE_REQUIRED": "Prepare the listed prerequisite first, then retry.",
|
|
55669
55816
|
"organizationStart.toolDiagnostic.action.TOOL_NETWORK_FAILED": "Check the internet, company network and proxy, then retry.",
|
|
@@ -55678,7 +55825,8 @@ const organizationInstallRecoveryEn = {
|
|
|
55678
55825
|
"organizationStart.toolDiagnostic.action.TOOL_INSTALL_FAILED": "Retry. If it repeats, share this diagnostic.",
|
|
55679
55826
|
"organizationStart.toolDiagnostic.action.CLAUDE_SETUP_TOKEN_RUNTIME_UNSUPPORTED": "Retry to install the authentication tool used by Saycode.",
|
|
55680
55827
|
"organizationStart.toolDiagnostic.action.TOOL_PROXY_AUTH_REQUIRED": "Share this diagnostic with IT and ask them to exempt the download server from proxy authentication.",
|
|
55681
|
-
"organizationStart.toolDiagnostic.action.TOOL_PROXY_BLOCKED": "Share this diagnostic with IT and ask them to allow access to the download server."
|
|
55828
|
+
"organizationStart.toolDiagnostic.action.TOOL_PROXY_BLOCKED": "Share this diagnostic with IT and ask them to allow access to the download server.",
|
|
55829
|
+
"organizationStart.toolDiagnostic.action.TOOL_EXECUTION_TIMEOUT": "Company security software may still be scanning the new executable. Retry in a few minutes. If it repeats, share this diagnostic with IT and ask for an exception."
|
|
55682
55830
|
};
|
|
55683
55831
|
const organizationAccountKeyEn = {
|
|
55684
55832
|
"organizationStart.accountKey.title": "Turn on conversation encryption",
|
|
@@ -56084,6 +56232,20 @@ const usageEntryEn = {
|
|
|
56084
56232
|
"signup.verifyFailed": "Could not verify the code. Check your connection and try again."
|
|
56085
56233
|
};
|
|
56086
56234
|
const homeTabsEn = {
|
|
56235
|
+
"homeStart.checking": "Checking your work environment.",
|
|
56236
|
+
"homeStart.lookupFailed": "Could not check your work environment.",
|
|
56237
|
+
"homeStart.noMachine": "No work PC is available.",
|
|
56238
|
+
"homeStart.refreshMachines": "Refresh the work PC list.",
|
|
56239
|
+
"homeStart.machineForbidden": "You do not have access to this work PC.",
|
|
56240
|
+
"homeStart.checkingAi": "Checking the AI connection.",
|
|
56241
|
+
"homeStart.aiLookupFailed": "Could not check the AI connection.",
|
|
56242
|
+
"homeStart.noOrganizationAi": "Connect an AI to get started.",
|
|
56243
|
+
"homeStart.assignmentNeeded": "Assign an AI to use.",
|
|
56244
|
+
"homeStart.aiConnectionNeeded": "Check your organization AI connection.",
|
|
56245
|
+
"homeStart.memberAiNeeded": "Connect your AI or ask your administrator to assign one.",
|
|
56246
|
+
"homeStart.connectPersonalAi": "Connect my AI",
|
|
56247
|
+
"homeStart.connectOrganizationAi": "Connect organization AI",
|
|
56248
|
+
"homeStart.retry": "Check again",
|
|
56087
56249
|
"homeTabs.collaboratingTitle": "Collaborating projects",
|
|
56088
56250
|
"homeTabs.private": "Personal",
|
|
56089
56251
|
"homeTabs.lastActivity": "Last activity {time}",
|
|
@@ -56160,6 +56322,12 @@ const projectRelocationEN = {
|
|
|
56160
56322
|
"sessionCreation.workspaceNotSet": "This machine’s workspace path is not set. Please set the machine workspace first."
|
|
56161
56323
|
};
|
|
56162
56324
|
const chatSchedulesEn = {
|
|
56325
|
+
"chatSchedules.lifecycleFailed": "Could not confirm schedule cleanup. The conversation was not changed. Please retry.",
|
|
56326
|
+
"chatSchedules.deleteImpact": "The {count} linked schedules will also be cancelled.",
|
|
56327
|
+
"chatSchedules.deleteRunning": "Stop requests will be sent for {count} schedules being processed.",
|
|
56328
|
+
"chatSchedules.deleteStopHint": "Started work receives a stop request on its execution PC. Offline PCs apply cancellation when they reconnect.",
|
|
56329
|
+
"chatSchedules.deleteImpactLoading": "Checking linked schedules…",
|
|
56330
|
+
"chatSchedules.deleteImpactError": "Could not check linked schedules. Retry before deleting.",
|
|
56163
56331
|
"chatSchedules.chatTitle": "Schedules for this chat",
|
|
56164
56332
|
"chatSchedules.sharedHint": "These same tasks are also available in the schedules menu.",
|
|
56165
56333
|
"chatSchedules.allSchedules": "View all schedules",
|
|
@@ -56215,6 +56383,9 @@ const chatSchedulesEn = {
|
|
|
56215
56383
|
"chatSchedules.newChatHint": "Saving creates a conversation in the selected computer’s default Chat folder and schedules the task.",
|
|
56216
56384
|
"chatSchedules.repeat": "Repeat",
|
|
56217
56385
|
"chatSchedules.targetUnavailable": "Check this conversation’s computer and folder.",
|
|
56386
|
+
"chatSchedules.ordinaryRuntimeHint": "Schedules use this conversation’s AI settings. Change the AI and model in the conversation composer.",
|
|
56387
|
+
"chatSchedules.conversationUnsupported": "Update Saycode CLI on this PC before scheduling. This feature appends scheduled results to an ordinary conversation.",
|
|
56388
|
+
"chatSchedules.conversationRecovery": "The prepared conversation session's connection is unconfirmed. Retry verifies the same session before saving and does not create another session. You can close this window and continue checking later.",
|
|
56218
56389
|
"chatSchedules.saveError": "Could not save. Your input is preserved. Try again.",
|
|
56219
56390
|
"chatSchedules.partialSave": "The conversation was created but scheduling failed. Save again to schedule in that same conversation.",
|
|
56220
56391
|
"chatSchedules.saving": "Working…",
|
|
@@ -56462,7 +56633,6 @@ const redesignEn = {
|
|
|
56462
56633
|
"ux2.selectOrganization": "Select organization",
|
|
56463
56634
|
"ux2.selectMachine": "Select machine",
|
|
56464
56635
|
"ux2.repository": "Repository",
|
|
56465
|
-
"ux2.showNotifications": "Show notifications",
|
|
56466
56636
|
"ux2.showUsage": "Show AI remaining usage",
|
|
56467
56637
|
"ux2.showResources": "Show CPU & memory",
|
|
56468
56638
|
"ux2.showUsageHint": "Shows the AI usage left below the message box.",
|
|
@@ -57017,7 +57187,10 @@ const orcaPortEn = {
|
|
|
57017
57187
|
"quickOpen.stateCount": "{count} matches",
|
|
57018
57188
|
"quickOpen.stateChipRemove": "{state} filter — Backspace to remove",
|
|
57019
57189
|
"shortcuts.action.attentionJump": "Jump to the session waiting on you",
|
|
57020
|
-
"shortcuts.action.attentionJumpDescription": "Jumps to a session waiting for your input, or to a finished session you have not read yet. Press again to cycle to the next one."
|
|
57190
|
+
"shortcuts.action.attentionJumpDescription": "Jumps to a session waiting for your input, or to a finished session you have not read yet. Press again to cycle to the next one.",
|
|
57191
|
+
"shortcuts.action.previousConversation": "Previous conversation",
|
|
57192
|
+
"shortcuts.action.nextConversation": "Next conversation",
|
|
57193
|
+
"shortcuts.action.conversationNavigationDescription": "Navigate conversations in sidebar order, using the pinned list for pinned conversations."
|
|
57021
57194
|
};
|
|
57022
57195
|
const usageAnalyticsEn = {
|
|
57023
57196
|
"settings.usageAnalytics.enable": "Send anonymous usage statistics",
|
|
@@ -60024,6 +60197,14 @@ const en = {
|
|
|
60024
60197
|
...credentialProtectionEn,
|
|
60025
60198
|
...projectSettingsEn,
|
|
60026
60199
|
...managedClaudeEn,
|
|
60200
|
+
"confirmation.title": "Confirmation required",
|
|
60201
|
+
"confirmation.confirm": "Confirm",
|
|
60202
|
+
"confirmation.archiveTitle": "Archive this conversation?",
|
|
60203
|
+
"confirmation.archiveDescription": "Archived conversations are hidden from the default list.\nYou can reopen them from completed conversations.",
|
|
60204
|
+
"confirmation.archive": "Archive",
|
|
60205
|
+
"confirmation.deleteTitle": "Delete this conversation?",
|
|
60206
|
+
"confirmation.deleteDescription": "The conversation and its messages will be deleted.\nThis action cannot be undone.",
|
|
60207
|
+
"confirmation.delete": "Delete",
|
|
60027
60208
|
"assetWorkflow.open": "Document templates",
|
|
60028
60209
|
"assetWorkflow.unavailable": "No document template extension is available. Install one and approve its permissions in Settings.",
|
|
60029
60210
|
"assetWorkflow.privateNotAllowed": "Personal template originals can only be sent in a personal chat on a machine only you use. Remove the original attachment to send from an existing folder or a shared or organization machine.",
|
|
@@ -61360,12 +61541,11 @@ const en = {
|
|
|
61360
61541
|
"session.interruptAiFailedDetail": "Failed to interrupt the AI response{detail}",
|
|
61361
61542
|
"preview.requestFailed": "Could not send the preview request.",
|
|
61362
61543
|
"message.unsyncedNoDelete": "Unsynced messages cannot be deleted yet.",
|
|
61363
|
-
"session.deleteConfirm": 'Delete the "{title}" session? This action cannot be undone.',
|
|
61364
61544
|
"session.demoDeleted": "Deleted the session from the demo workspace.",
|
|
61365
61545
|
"session.cleanedInaccessible": "Cleaned up an already-deleted or inaccessible session from the list.",
|
|
61546
|
+
"session.deleteConfirm": 'Delete the "{title}" session? This action cannot be undone.',
|
|
61366
61547
|
"session.deleted": "Deleted the session.",
|
|
61367
61548
|
"session.deleteFailed": "Could not delete the session.",
|
|
61368
|
-
"session.archiveConfirm": 'Archive the "{title}" session? Archived sessions are hidden from the default list.',
|
|
61369
61549
|
"session.demoArchived": "Archived the session in the demo workspace.",
|
|
61370
61550
|
"session.cleanedArchivedInaccessible": "Archived an already-deleted or inaccessible session from the list.",
|
|
61371
61551
|
"session.archived": "Archived the session.",
|
|
@@ -63334,6 +63514,7 @@ const organizationInstallRecoveryZh = {
|
|
|
63334
63514
|
"organizationStart.toolDiagnostic.reason.CLAUDE_SETUP_TOKEN_RUNTIME_UNSUPPORTED": "已安装的 cswap 不支持所需认证功能。",
|
|
63335
63515
|
"organizationStart.toolDiagnostic.reason.TOOL_PROXY_AUTH_REQUIRED": "公司代理要求登录认证,因此无法连接。",
|
|
63336
63516
|
"organizationStart.toolDiagnostic.reason.TOOL_PROXY_BLOCKED": "公司代理不允许连接下载或软件包服务器。",
|
|
63517
|
+
"organizationStart.toolDiagnostic.reason.TOOL_EXECUTION_TIMEOUT": "已安装工具的运行检查未在时限内完成。",
|
|
63337
63518
|
"organizationStart.toolDiagnostic.action.TOOL_NOT_FOUND": "请重试,或按指南安装后再次检查。",
|
|
63338
63519
|
"organizationStart.toolDiagnostic.action.TOOL_PREREQUISITE_REQUIRED": "请先准备所列前置工具,然后重试。",
|
|
63339
63520
|
"organizationStart.toolDiagnostic.action.TOOL_NETWORK_FAILED": "请检查互联网、公司网络和代理,然后重试。",
|
|
@@ -63348,7 +63529,8 @@ const organizationInstallRecoveryZh = {
|
|
|
63348
63529
|
"organizationStart.toolDiagnostic.action.TOOL_INSTALL_FAILED": "请重试;若重复发生,请提供此诊断。",
|
|
63349
63530
|
"organizationStart.toolDiagnostic.action.CLAUDE_SETUP_TOKEN_RUNTIME_UNSUPPORTED": "请重试以安装 Saycode 使用的认证工具。",
|
|
63350
63531
|
"organizationStart.toolDiagnostic.action.TOOL_PROXY_AUTH_REQUIRED": "请将此诊断提供给 IT,请求将下载服务器设为代理认证例外。",
|
|
63351
|
-
"organizationStart.toolDiagnostic.action.TOOL_PROXY_BLOCKED": "请将此诊断提供给 IT,请求允许访问下载服务器。"
|
|
63532
|
+
"organizationStart.toolDiagnostic.action.TOOL_PROXY_BLOCKED": "请将此诊断提供给 IT,请求允许访问下载服务器。",
|
|
63533
|
+
"organizationStart.toolDiagnostic.action.TOOL_EXECUTION_TIMEOUT": "公司安全软件可能仍在扫描新的可执行文件。请几分钟后重试;若重复发生,请将此诊断提供给 IT 并请求添加例外。"
|
|
63352
63534
|
};
|
|
63353
63535
|
const organizationAccountKeyZh = {
|
|
63354
63536
|
"organizationStart.accountKey.title": "开启对话加密",
|
|
@@ -63754,6 +63936,20 @@ const usageEntryZh = {
|
|
|
63754
63936
|
"signup.verifyFailed": "无法验证验证码。请检查网络连接后重试。"
|
|
63755
63937
|
};
|
|
63756
63938
|
const homeTabsZh = {
|
|
63939
|
+
"homeStart.checking": "正在检查工作环境。",
|
|
63940
|
+
"homeStart.lookupFailed": "无法检查工作环境。",
|
|
63941
|
+
"homeStart.noMachine": "没有可用的工作电脑。",
|
|
63942
|
+
"homeStart.refreshMachines": "请刷新工作电脑列表。",
|
|
63943
|
+
"homeStart.machineForbidden": "你没有权限使用此工作电脑。",
|
|
63944
|
+
"homeStart.checkingAi": "正在检查 AI 连接。",
|
|
63945
|
+
"homeStart.aiLookupFailed": "无法检查 AI 连接。",
|
|
63946
|
+
"homeStart.noOrganizationAi": "请连接可使用的 AI。",
|
|
63947
|
+
"homeStart.assignmentNeeded": "请分配可使用的 AI。",
|
|
63948
|
+
"homeStart.aiConnectionNeeded": "请检查组织 AI 的连接状态。",
|
|
63949
|
+
"homeStart.memberAiNeeded": "请连接自己的 AI,或联系管理员分配 AI。",
|
|
63950
|
+
"homeStart.connectPersonalAi": "连接我的 AI",
|
|
63951
|
+
"homeStart.connectOrganizationAi": "连接组织 AI",
|
|
63952
|
+
"homeStart.retry": "重新检查",
|
|
63757
63953
|
"homeTabs.collaboratingTitle": "协作项目",
|
|
63758
63954
|
"homeTabs.private": "个人",
|
|
63759
63955
|
"homeTabs.lastActivity": "最近工作 {time}",
|
|
@@ -63830,6 +64026,12 @@ const projectRelocationZH = {
|
|
|
63830
64026
|
"sessionCreation.workspaceNotSet": "此机器的工作区路径尚未设置。请先设置机器工作区。"
|
|
63831
64027
|
};
|
|
63832
64028
|
const chatSchedulesZh = {
|
|
64029
|
+
"chatSchedules.lifecycleFailed": "无法确认预约清理结果。对话尚未更改,请重试。",
|
|
64030
|
+
"chatSchedules.deleteImpact": "关联的 {count} 个预约也将取消。",
|
|
64031
|
+
"chatSchedules.deleteRunning": "将请求停止正在处理的 {count} 个预约。",
|
|
64032
|
+
"chatSchedules.deleteStopHint": "已开始的任务会向执行电脑发送停止请求。离线电脑将在重新连接时应用取消操作。",
|
|
64033
|
+
"chatSchedules.deleteImpactLoading": "正在检查关联预约…",
|
|
64034
|
+
"chatSchedules.deleteImpactError": "无法检查关联预约。请重试后再删除。",
|
|
63833
64035
|
"chatSchedules.chatTitle": "此对话的预约",
|
|
63834
64036
|
"chatSchedules.sharedHint": "您也可以在预约菜单中查看和管理相同的预约。",
|
|
63835
64037
|
"chatSchedules.allSchedules": "查看所有预约",
|
|
@@ -63885,6 +64087,9 @@ const chatSchedulesZh = {
|
|
|
63885
64087
|
"chatSchedules.newChatHint": "保存后在所选电脑的默认 Chat 文件夹中创建对话并安排任务。",
|
|
63886
64088
|
"chatSchedules.repeat": "重复计划",
|
|
63887
64089
|
"chatSchedules.targetUnavailable": "请检查此对话的电脑和文件夹。",
|
|
64090
|
+
"chatSchedules.ordinaryRuntimeHint": "预约使用此对话的 AI 设置。请在对话输入框中更改 AI 和模型。",
|
|
64091
|
+
"chatSchedules.conversationUnsupported": "请先更新此电脑上的 Saycode CLI,再设置预约。此功能需要支持将预约结果追加到普通对话。",
|
|
64092
|
+
"chatSchedules.conversationRecovery": "尚未确认已准备的对话会话是否连接成功。再次确认会检查同一会话后再保存,不会创建新会话。关闭此窗口后也可以继续确认。",
|
|
63888
64093
|
"chatSchedules.saveError": "无法保存,输入已保留,请重试。",
|
|
63889
64094
|
"chatSchedules.partialSave": "已创建对话,但任务保存失败。再次保存会在同一对话中安排任务。",
|
|
63890
64095
|
"chatSchedules.saving": "处理中…",
|
|
@@ -64132,7 +64337,6 @@ const redesignZh = {
|
|
|
64132
64337
|
"ux2.selectOrganization": "选择组织",
|
|
64133
64338
|
"ux2.selectMachine": "选择机器",
|
|
64134
64339
|
"ux2.repository": "仓库",
|
|
64135
|
-
"ux2.showNotifications": "显示通知",
|
|
64136
64340
|
"ux2.showUsage": "显示 AI 剩余额度",
|
|
64137
64341
|
"ux2.showResources": "显示 CPU 和内存",
|
|
64138
64342
|
"ux2.showUsageHint": "在输入框下方显示剩余的 AI 用量。",
|
|
@@ -64687,7 +64891,10 @@ const orcaPortZh = {
|
|
|
64687
64891
|
"quickOpen.stateCount": "{count} 个",
|
|
64688
64892
|
"quickOpen.stateChipRemove": "{state} 筛选 — 按 Backspace 取消",
|
|
64689
64893
|
"shortcuts.action.attentionJump": "跳转到等待中的会话",
|
|
64690
|
-
"shortcuts.action.attentionJumpDescription": "跳转到等待你输入的会话;若没有,则跳转到已完成但尚未查看的会话。再次按下可循环到下一个。"
|
|
64894
|
+
"shortcuts.action.attentionJumpDescription": "跳转到等待你输入的会话;若没有,则跳转到已完成但尚未查看的会话。再次按下可循环到下一个。",
|
|
64895
|
+
"shortcuts.action.previousConversation": "上一个对话",
|
|
64896
|
+
"shortcuts.action.nextConversation": "下一个对话",
|
|
64897
|
+
"shortcuts.action.conversationNavigationDescription": "按侧边栏顺序切换对话,置顶对话在置顶列表中切换。"
|
|
64691
64898
|
};
|
|
64692
64899
|
const usageAnalyticsZh = {
|
|
64693
64900
|
"settings.usageAnalytics.enable": "发送匿名使用统计",
|
|
@@ -67694,6 +67901,14 @@ const zh = {
|
|
|
67694
67901
|
...credentialProtectionZh,
|
|
67695
67902
|
...projectSettingsZh,
|
|
67696
67903
|
...managedClaudeZh,
|
|
67904
|
+
"confirmation.title": "需要确认",
|
|
67905
|
+
"confirmation.confirm": "确认",
|
|
67906
|
+
"confirmation.archiveTitle": "归档此对话?",
|
|
67907
|
+
"confirmation.archiveDescription": "归档的对话将从默认列表中隐藏。\n可以从已完成的对话中重新打开。",
|
|
67908
|
+
"confirmation.archive": "归档",
|
|
67909
|
+
"confirmation.deleteTitle": "删除此对话?",
|
|
67910
|
+
"confirmation.deleteDescription": "对话及其消息将被删除。\n此操作无法撤销。",
|
|
67911
|
+
"confirmation.delete": "删除",
|
|
67697
67912
|
"assetWorkflow.open": "文档模板",
|
|
67698
67913
|
"assetWorkflow.unavailable": "没有可用的文档模板扩展。请在设置中安装并授权。",
|
|
67699
67914
|
"assetWorkflow.privateNotAllowed": "个人模板原件只能在仅供你使用的机器上的个人对话中发送。在已有文件夹或共享、组织机器中发送时,请移除原件附件。",
|
|
@@ -69030,12 +69245,11 @@ const zh = {
|
|
|
69030
69245
|
"session.interruptAiFailedDetail": "中断 AI 响应失败{detail}",
|
|
69031
69246
|
"preview.requestFailed": "无法发送预览请求。",
|
|
69032
69247
|
"message.unsyncedNoDelete": "尚未同步的消息暂时无法删除。",
|
|
69033
|
-
"session.deleteConfirm": "要删除会话 “{title}” 吗?此操作无法撤销。",
|
|
69034
69248
|
"session.demoDeleted": "已从演示工作区删除会话。",
|
|
69035
69249
|
"session.cleanedInaccessible": "已从列表中清理一个已删除或无法访问的会话。",
|
|
69250
|
+
"session.deleteConfirm": "要删除会话 “{title}” 吗?此操作无法撤销。",
|
|
69036
69251
|
"session.deleted": "已删除会话。",
|
|
69037
69252
|
"session.deleteFailed": "无法删除会话。",
|
|
69038
|
-
"session.archiveConfirm": "要归档会话 “{title}” 吗?归档的会话会从默认列表中隐藏。",
|
|
69039
69253
|
"session.demoArchived": "已在演示工作区归档会话。",
|
|
69040
69254
|
"session.cleanedArchivedInaccessible": "已从列表中归档一个已删除或无法访问的会话。",
|
|
69041
69255
|
"session.archived": "已归档会话。",
|
|
@@ -71004,6 +71218,7 @@ const organizationInstallRecoveryJa = {
|
|
|
71004
71218
|
"organizationStart.toolDiagnostic.reason.CLAUDE_SETUP_TOKEN_RUNTIME_UNSUPPORTED": "インストール済みcswapは必要な認証機能に対応していません。",
|
|
71005
71219
|
"organizationStart.toolDiagnostic.reason.TOOL_PROXY_AUTH_REQUIRED": "会社のプロキシがサインイン認証を求めたため、接続できませんでした。",
|
|
71006
71220
|
"organizationStart.toolDiagnostic.reason.TOOL_PROXY_BLOCKED": "会社のプロキシがダウンロードまたはパッケージサーバーへの接続を許可しませんでした。",
|
|
71221
|
+
"organizationStart.toolDiagnostic.reason.TOOL_EXECUTION_TIMEOUT": "インストール済みツールの実行確認が制限時間内に終わりませんでした。",
|
|
71007
71222
|
"organizationStart.toolDiagnostic.action.TOOL_NOT_FOUND": "再試行するか、ガイドに従ってインストール後に再確認してください。",
|
|
71008
71223
|
"organizationStart.toolDiagnostic.action.TOOL_PREREQUISITE_REQUIRED": "表示された前提ツールを準備してから再試行してください。",
|
|
71009
71224
|
"organizationStart.toolDiagnostic.action.TOOL_NETWORK_FAILED": "インターネット・社内ネットワーク・プロキシを確認して再試行してください。",
|
|
@@ -71018,7 +71233,8 @@ const organizationInstallRecoveryJa = {
|
|
|
71018
71233
|
"organizationStart.toolDiagnostic.action.TOOL_INSTALL_FAILED": "再試行してください。繰り返す場合は診断を共有してください。",
|
|
71019
71234
|
"organizationStart.toolDiagnostic.action.CLAUDE_SETUP_TOKEN_RUNTIME_UNSUPPORTED": "再試行してSaycode用の認証ツールをインストールしてください。",
|
|
71020
71235
|
"organizationStart.toolDiagnostic.action.TOOL_PROXY_AUTH_REQUIRED": "この診断をIT担当者に伝え、ダウンロードサーバーをプロキシ認証の例外にするよう依頼してください。",
|
|
71021
|
-
"organizationStart.toolDiagnostic.action.TOOL_PROXY_BLOCKED": "この診断をIT担当者に伝え、ダウンロードサーバーへの接続許可を依頼してください。"
|
|
71236
|
+
"organizationStart.toolDiagnostic.action.TOOL_PROXY_BLOCKED": "この診断をIT担当者に伝え、ダウンロードサーバーへの接続許可を依頼してください。",
|
|
71237
|
+
"organizationStart.toolDiagnostic.action.TOOL_EXECUTION_TIMEOUT": "会社のセキュリティソフトが新しい実行ファイルを検査中の可能性があります。数分後に再試行し、繰り返す場合はこの診断をIT担当者に伝えて例外登録を依頼してください。"
|
|
71022
71238
|
};
|
|
71023
71239
|
const organizationAccountKeyJa = {
|
|
71024
71240
|
"organizationStart.accountKey.title": "会話の暗号化をオンにする",
|
|
@@ -71424,6 +71640,20 @@ const usageEntryJa = {
|
|
|
71424
71640
|
"signup.verifyFailed": "認証を確認できませんでした。接続を確認して再試行してください。"
|
|
71425
71641
|
};
|
|
71426
71642
|
const homeTabsJa = {
|
|
71643
|
+
"homeStart.checking": "作業環境を確認しています。",
|
|
71644
|
+
"homeStart.lookupFailed": "作業環境を確認できませんでした。",
|
|
71645
|
+
"homeStart.noMachine": "使用できる作業PCがありません。",
|
|
71646
|
+
"homeStart.refreshMachines": "作業PCの一覧を再確認してください。",
|
|
71647
|
+
"homeStart.machineForbidden": "この作業PCを使用する権限がありません。",
|
|
71648
|
+
"homeStart.checkingAi": "AIの接続を確認しています。",
|
|
71649
|
+
"homeStart.aiLookupFailed": "AIの接続を確認できませんでした。",
|
|
71650
|
+
"homeStart.noOrganizationAi": "使用するAIを接続してください。",
|
|
71651
|
+
"homeStart.assignmentNeeded": "使用するAIを割り当ててください。",
|
|
71652
|
+
"homeStart.aiConnectionNeeded": "組織AIの接続状態を確認してください。",
|
|
71653
|
+
"homeStart.memberAiNeeded": "自分のAIを接続するか、管理者にAIの割り当てを依頼してください。",
|
|
71654
|
+
"homeStart.connectPersonalAi": "自分のAIを接続",
|
|
71655
|
+
"homeStart.connectOrganizationAi": "組織AIを接続",
|
|
71656
|
+
"homeStart.retry": "再確認",
|
|
71427
71657
|
"homeTabs.collaboratingTitle": "共同作業プロジェクト",
|
|
71428
71658
|
"homeTabs.private": "個人",
|
|
71429
71659
|
"homeTabs.lastActivity": "最終作業 {time}",
|
|
@@ -71500,6 +71730,12 @@ const projectRelocationJA = {
|
|
|
71500
71730
|
"sessionCreation.workspaceNotSet": "このマシンのワークスペースパスが設定されていません。先にマシンのワークスペースを設定してください。"
|
|
71501
71731
|
};
|
|
71502
71732
|
const chatSchedulesJa = {
|
|
71733
|
+
"chatSchedules.lifecycleFailed": "予約の整理を確認できませんでした。会話は変更していません。もう一度お試しください。",
|
|
71734
|
+
"chatSchedules.deleteImpact": "関連する予約{count}件もキャンセルされます。",
|
|
71735
|
+
"chatSchedules.deleteRunning": "処理中の予約{count}件に停止を要求します。",
|
|
71736
|
+
"chatSchedules.deleteStopHint": "開始済みの作業には実行PCへ停止を要求します。オフラインのPCには再接続時に反映されます。",
|
|
71737
|
+
"chatSchedules.deleteImpactLoading": "関連する予約を確認しています。",
|
|
71738
|
+
"chatSchedules.deleteImpactError": "関連する予約を確認できませんでした。再確認してから削除してください。",
|
|
71503
71739
|
"chatSchedules.chatTitle": "このチャットの予約",
|
|
71504
71740
|
"chatSchedules.sharedHint": "予約メニューでも同じ予約を確認・管理できます。",
|
|
71505
71741
|
"chatSchedules.allSchedules": "すべての予約を見る",
|
|
@@ -71555,6 +71791,9 @@ const chatSchedulesJa = {
|
|
|
71555
71791
|
"chatSchedules.newChatHint": "保存すると選択したPCの既定Chatフォルダーに会話を作成し予約します。",
|
|
71556
71792
|
"chatSchedules.repeat": "繰り返し",
|
|
71557
71793
|
"chatSchedules.targetUnavailable": "会話の作業PCとフォルダーを確認してください。",
|
|
71794
|
+
"chatSchedules.ordinaryRuntimeHint": "予約はこの会話のAI設定を使用します。AIとモデルは会話の入力欄で変更してください。",
|
|
71795
|
+
"chatSchedules.conversationUnsupported": "このPCのSaycode CLIを更新してから予約してください。通常の会話に予約結果を追加する機能が必要です。",
|
|
71796
|
+
"chatSchedules.conversationRecovery": "準備した会話セッションの接続結果を確認できませんでした。再確認では同じセッションの接続を確認してから保存し、新しいセッションは作成しません。この画面を閉じても後で確認を続けられます。",
|
|
71558
71797
|
"chatSchedules.saveError": "保存できませんでした。入力内容は保持されています。再試行してください。",
|
|
71559
71798
|
"chatSchedules.partialSave": "会話は作成されましたが予約に失敗しました。再保存すると同じ会話に予約します。",
|
|
71560
71799
|
"chatSchedules.saving": "処理中…",
|
|
@@ -71802,7 +72041,6 @@ const redesignJa = {
|
|
|
71802
72041
|
"ux2.selectOrganization": "組織を選択",
|
|
71803
72042
|
"ux2.selectMachine": "マシンを選択",
|
|
71804
72043
|
"ux2.repository": "リポジトリ",
|
|
71805
|
-
"ux2.showNotifications": "通知を表示",
|
|
71806
72044
|
"ux2.showUsage": "AI 残量を表示",
|
|
71807
72045
|
"ux2.showResources": "CPU・メモリを表示",
|
|
71808
72046
|
"ux2.showUsageHint": "入力欄の下に残りのAI利用量を表示します。",
|
|
@@ -72357,7 +72595,10 @@ const orcaPortJa = {
|
|
|
72357
72595
|
"quickOpen.stateCount": "{count}件",
|
|
72358
72596
|
"quickOpen.stateChipRemove": "{state} フィルター — Backspace で解除",
|
|
72359
72597
|
"shortcuts.action.attentionJump": "待機中のセッションへジャンプ",
|
|
72360
|
-
"shortcuts.action.attentionJumpDescription": "入力待ちのセッションへ移動します。なければ完了済みで未確認のセッションへ、もう一度押すと次のセッションへ循環します。"
|
|
72598
|
+
"shortcuts.action.attentionJumpDescription": "入力待ちのセッションへ移動します。なければ完了済みで未確認のセッションへ、もう一度押すと次のセッションへ循環します。",
|
|
72599
|
+
"shortcuts.action.previousConversation": "前の会話",
|
|
72600
|
+
"shortcuts.action.nextConversation": "次の会話",
|
|
72601
|
+
"shortcuts.action.conversationNavigationDescription": "サイドバーの順序で会話を移動します。固定した会話は固定リスト内で移動します。"
|
|
72361
72602
|
};
|
|
72362
72603
|
const usageAnalyticsJa = {
|
|
72363
72604
|
"settings.usageAnalytics.enable": "匿名の利用統計を送信する",
|
|
@@ -75364,6 +75605,14 @@ const ja = {
|
|
|
75364
75605
|
...credentialProtectionJa,
|
|
75365
75606
|
...projectSettingsJa,
|
|
75366
75607
|
...managedClaudeJa,
|
|
75608
|
+
"confirmation.title": "確認が必要です",
|
|
75609
|
+
"confirmation.confirm": "確認",
|
|
75610
|
+
"confirmation.archiveTitle": "会話をアーカイブしますか?",
|
|
75611
|
+
"confirmation.archiveDescription": "アーカイブした会話は通常の一覧から非表示になります。\n完了した会話から再び開けます。",
|
|
75612
|
+
"confirmation.archive": "アーカイブ",
|
|
75613
|
+
"confirmation.deleteTitle": "会話を削除しますか?",
|
|
75614
|
+
"confirmation.deleteDescription": "会話とメッセージが削除されます。\nこの操作は取り消せません。",
|
|
75615
|
+
"confirmation.delete": "削除",
|
|
75367
75616
|
"assetWorkflow.open": "文書テンプレート",
|
|
75368
75617
|
"assetWorkflow.unavailable": "利用できる文書テンプレート拡張がありません。設定でインストールし権限を承認してください。",
|
|
75369
75618
|
"assetWorkflow.privateNotAllowed": "個人テンプレートの原本は、自分専用マシンの個人チャットでのみ送信できます。既存フォルダーや共有・組織マシンでは原本の添付を外して送信してください。",
|
|
@@ -76700,12 +76949,11 @@ const ja = {
|
|
|
76700
76949
|
"session.interruptAiFailedDetail": "AI 応答の中断に失敗しました{detail}",
|
|
76701
76950
|
"preview.requestFailed": "プレビューリクエストを送信できません。",
|
|
76702
76951
|
"message.unsyncedNoDelete": "同期されていないメッセージはまだ削除できません。",
|
|
76703
|
-
"session.deleteConfirm": "「{title}」セッションを削除しますか?この操作は取り消せません。",
|
|
76704
76952
|
"session.demoDeleted": "デモワークスペースからセッションを削除しました。",
|
|
76705
76953
|
"session.cleanedInaccessible": "すでに削除済み、またはアクセスできないセッションを一覧から整理しました。",
|
|
76954
|
+
"session.deleteConfirm": "「{title}」セッションを削除しますか?この操作は取り消せません。",
|
|
76706
76955
|
"session.deleted": "セッションを削除しました。",
|
|
76707
76956
|
"session.deleteFailed": "セッションを削除できません。",
|
|
76708
|
-
"session.archiveConfirm": "「{title}」セッションをアーカイブしますか?アーカイブしたセッションは既定の一覧から非表示になります。",
|
|
76709
76957
|
"session.demoArchived": "デモワークスペースでセッションをアーカイブしました。",
|
|
76710
76958
|
"session.cleanedArchivedInaccessible": "すでに削除済み、またはアクセスできないセッションを一覧からアーカイブ処理しました。",
|
|
76711
76959
|
"session.archived": "セッションをアーカイブしました。",
|
|
@@ -77984,7 +78232,7 @@ class StandaloneApiShim {
|
|
|
77984
78232
|
constructor(config2) {
|
|
77985
78233
|
this.config = config2;
|
|
77986
78234
|
this.workTemplates = new StandaloneWorkTemplates(config2.storeDir);
|
|
77987
|
-
this.work = new StandaloneWork(config2.storeDir, config2.userId, config2.text ?? ((key, params) => translate("en", key, params)));
|
|
78235
|
+
this.work = new StandaloneWork(config2.storeDir, config2.userId, config2.text ?? ((key, params) => translate("en", key, params)), standaloneWorkAutomations({ serverUrl: config2.happyServerUrl, token: config2.happyToken, secret: config2.automationLifecycleSecret, userId: config2.userId }));
|
|
77988
78236
|
const getValidProjectIds = async () => {
|
|
77989
78237
|
const snapshot = await this.loadProjectsSnapshot();
|
|
77990
78238
|
return snapshot.valid && !this.projectIdsUnknown ? new Set(snapshot.store.projects.map((project) => project.id)) : null;
|
|
@@ -83818,6 +84066,7 @@ async function runServer(args, print) {
|
|
|
83818
84066
|
machineServerUrl: exposure.advertiseOrigin,
|
|
83819
84067
|
happyToken: account.syncToken,
|
|
83820
84068
|
happySecret: secrets.accountSeedBase64,
|
|
84069
|
+
automationLifecycleSecret: secrets.masterSecret,
|
|
83821
84070
|
userId: "standalone-local",
|
|
83822
84071
|
username: userInfo().username,
|
|
83823
84072
|
machinePlatform: process.platform,
|
|
@@ -85118,8 +85367,8 @@ function parseExtensionProjectTools(value2, apiVersion) {
|
|
|
85118
85367
|
command: id$1(entry.command, `${path2}.command`)
|
|
85119
85368
|
}));
|
|
85120
85369
|
}
|
|
85121
|
-
function assertExtensionProjectToolTargets(extensionId,
|
|
85122
|
-
for (const [index, tool] of
|
|
85370
|
+
function assertExtensionProjectToolTargets(extensionId, tools2, commands) {
|
|
85371
|
+
for (const [index, tool] of tools2.entries()) {
|
|
85123
85372
|
const path2 = `manifest.contributes.projectTools[${index}]`;
|
|
85124
85373
|
if (!tool.id.startsWith(`${extensionId}.`)) fail$7(`${path2}.id`, "expected an id declared by the same extension");
|
|
85125
85374
|
const command = tool.command.startsWith(`${extensionId}.`) ? commands.find((candidate) => candidate.id === tool.command) : void 0;
|
|
@@ -103450,7 +103699,17 @@ Run \`saycode --help\` for usage.
|
|
|
103450
103699
|
return runServerCommand(parsed2, (text2) => out.raw(text2.replace(/\n$/, "")));
|
|
103451
103700
|
case "agent": {
|
|
103452
103701
|
const { command: _command, ...args } = parsed2;
|
|
103453
|
-
|
|
103702
|
+
let agentContext;
|
|
103703
|
+
try {
|
|
103704
|
+
agentContext = await loadAgentContext();
|
|
103705
|
+
} catch {
|
|
103706
|
+
const failure = agentFail(
|
|
103707
|
+
parsed2.verb === "spawn" ? "spawn_failed" : "not_agent_env",
|
|
103708
|
+
"Agent runtime initialization failed. Check the runtime home credentials and connection; no fallback identity was used."
|
|
103709
|
+
);
|
|
103710
|
+
out.raw(failure.stdout.trimEnd());
|
|
103711
|
+
return failure.exitCode;
|
|
103712
|
+
}
|
|
103454
103713
|
const output = await withTransport(
|
|
103455
103714
|
agentContext,
|
|
103456
103715
|
(transport) => runAgentCommand(createAgentRuntime(agentContext, transport), args)
|