From cfe7c516a23cd6568f4c8971d09b2c59c48f4038 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 18:04:45 +0000 Subject: [PATCH 1/4] release: v1.4.61 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6c9f4377c19..c8abe6ee0d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "orca", - "version": "1.4.61-rc.2", + "version": "1.4.61", "description": "Next-gen IDE for parallel agentic development", "homepage": "https://github.com/stablyai/orca", "author": "stablyai", From 5d6254d769ba1eaa48235d69cd58e16a2ecba880 Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Thu, 11 Jun 2026 11:22:00 -0700 Subject: [PATCH 2/4] Clarify nested import group copy (#5202) --- src/main/ipc/pty.test.ts | 83 ++++++------- .../components/mobile/MobileBrandIcons.tsx | 16 +++ .../src/components/mobile/MobileHero.tsx | 72 +---------- .../src/components/mobile/MobileHeroIntro.tsx | 56 +++++++++ .../onboarding/GhosttyDiscoveryRow.tsx | 93 +++++++++++++++ .../src/components/onboarding/ThemeStep.tsx | 92 +------------- .../right-sidebar/HostedReviewActions.tsx | 73 +++--------- .../HostedReviewStateActions.tsx | 84 +++++++++++++ .../components/settings/McpConfigSection.tsx | 19 +-- .../settings/McpMissingConfigList.tsx | 30 +++++ .../sidebar/AddRepoDialogStepContent.test.tsx | 8 +- .../sidebar/AddRepoNestedImportStep.test.tsx | 60 ++++++++-- .../sidebar/AddRepoNestedImportStep.tsx | 54 ++++----- .../sidebar/FolderWorkspaceComposerDialog.tsx | 15 +-- .../WorktreeList.lineage-child-card.test.ts | 21 +++- ...ktreeList.lineage-child-real-card.test.tsx | 11 ++ .../folder-workspace-composer-submit.test.ts | 91 ++++++++++++++ .../folder-workspace-composer-submit.ts | 16 ++- .../src/components/stats/ClaudeUsagePane.tsx | 106 +---------------- .../stats/ClaudeUsageRecentSessionsTable.tsx | 81 +++++++++++++ .../src/components/stats/CodexUsagePane.tsx | 107 +---------------- .../stats/CodexUsageRecentSessionsTable.tsx | 75 ++++++++++++ .../components/stats/OpenCodeUsagePane.tsx | 112 +----------------- .../OpenCodeUsageRecentSessionsTable.tsx | 74 ++++++++++++ .../src/components/stats/usage-formatters.ts | 36 ++++++ src/renderer/src/i18n/locales/en.json | 11 +- src/renderer/src/i18n/locales/es.json | 11 +- src/renderer/src/i18n/locales/ja.json | 11 +- src/renderer/src/i18n/locales/ko.json | 13 +- src/renderer/src/i18n/locales/zh.json | 13 +- 30 files changed, 859 insertions(+), 685 deletions(-) create mode 100644 src/renderer/src/components/mobile/MobileBrandIcons.tsx create mode 100644 src/renderer/src/components/mobile/MobileHeroIntro.tsx create mode 100644 src/renderer/src/components/onboarding/GhosttyDiscoveryRow.tsx create mode 100644 src/renderer/src/components/right-sidebar/HostedReviewStateActions.tsx create mode 100644 src/renderer/src/components/settings/McpMissingConfigList.tsx create mode 100644 src/renderer/src/components/sidebar/folder-workspace-composer-submit.test.ts create mode 100644 src/renderer/src/components/stats/ClaudeUsageRecentSessionsTable.tsx create mode 100644 src/renderer/src/components/stats/CodexUsageRecentSessionsTable.tsx create mode 100644 src/renderer/src/components/stats/OpenCodeUsageRecentSessionsTable.tsx create mode 100644 src/renderer/src/components/stats/usage-formatters.ts diff --git a/src/main/ipc/pty.test.ts b/src/main/ipc/pty.test.ts index 51e3cf15a3c..a165d4d3c45 100644 --- a/src/main/ipc/pty.test.ts +++ b/src/main/ipc/pty.test.ts @@ -546,14 +546,14 @@ describe('registerPtyHandlers', () => { } } - function spawnAndGetCall(args?: { + async function spawnAndGetCall(args?: { cwd?: string env?: Record command?: string - }): [string, string[], { cwd: string; env: Record }] { + }): Promise<[string, string[], { cwd: string; env: Record }]> { handlers.clear() registerPtyHandlers(mainWindow as never) - handlers.get('pty:spawn')!(null, { + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24, ...args @@ -3811,11 +3811,11 @@ describe('registerPtyHandlers', () => { delete process.env.PYTHONUTF8 }) - it('passes chcp 65001 to cmd.exe for UTF-8 console output', () => { + it('passes chcp 65001 to cmd.exe for UTF-8 console output', async () => { process.env.COMSPEC = 'C:\\Windows\\system32\\cmd.exe' registerPtyHandlers(mainWindow as never) - handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) expect(spawnMock).toHaveBeenCalledWith( 'C:\\Windows\\system32\\cmd.exe', @@ -3824,11 +3824,11 @@ describe('registerPtyHandlers', () => { ) }) - it('sets Console encoding for powershell.exe', () => { + it('sets Console encoding for powershell.exe', async () => { process.env.COMSPEC = 'C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe' registerPtyHandlers(mainWindow as never) - handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) expect(spawnMock).toHaveBeenCalledWith( 'C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', @@ -3837,11 +3837,11 @@ describe('registerPtyHandlers', () => { ) }) - it('sets Console encoding for pwsh.exe', () => { + it('sets Console encoding for pwsh.exe', async () => { process.env.COMSPEC = 'C:\\Program Files\\PowerShell\\7\\pwsh.exe' registerPtyHandlers(mainWindow as never) - handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) expect(spawnMock).toHaveBeenCalledWith( 'C:\\Program Files\\PowerShell\\7\\pwsh.exe', @@ -3850,34 +3850,34 @@ describe('registerPtyHandlers', () => { ) }) - it('sets PYTHONUTF8=1 in the spawn environment on Windows', () => { + it('sets PYTHONUTF8=1 in the spawn environment on Windows', async () => { process.env.COMSPEC = 'C:\\Windows\\system32\\cmd.exe' registerPtyHandlers(mainWindow as never) - handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) const spawnCall = spawnMock.mock.calls.at(-1)! const env = spawnCall[2].env as Record expect(env.PYTHONUTF8).toBe('1') }) - it('does not override an existing PYTHONUTF8 value', () => { + it('does not override an existing PYTHONUTF8 value', async () => { process.env.COMSPEC = 'C:\\Windows\\system32\\cmd.exe' process.env.PYTHONUTF8 = '0' registerPtyHandlers(mainWindow as never) - handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) const spawnCall = spawnMock.mock.calls.at(-1)! const env = spawnCall[2].env as Record expect(env.PYTHONUTF8).toBe('0') }) - it('launches Git Bash from COMSPEC as an interactive login shell', () => { + it('launches Git Bash from COMSPEC as an interactive login shell', async () => { process.env.COMSPEC = 'C:\\Program Files\\Git\\bin\\bash.exe' registerPtyHandlers(mainWindow as never) - handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) expect(spawnMock).toHaveBeenCalledWith( 'C:\\Program Files\\Git\\bin\\bash.exe', @@ -3888,7 +3888,7 @@ describe('registerPtyHandlers', () => { ) }) - it('uses terminalWindowsShell setting over COMSPEC when provided', () => { + it('uses terminalWindowsShell setting over COMSPEC when provided', async () => { // Why: COMSPEC always points to cmd.exe on stock Windows, so without the // setting the terminal would ignore the user's shell preference. process.env.COMSPEC = 'C:\\Windows\\system32\\cmd.exe' @@ -3902,7 +3902,7 @@ describe('registerPtyHandlers', () => { terminalWindowsShell: 'powershell.exe' }) as never ) - handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) expect(spawnMock).toHaveBeenCalledWith( 'powershell.exe', @@ -3911,7 +3911,7 @@ describe('registerPtyHandlers', () => { ) }) - it('spawns powershell.exe when PowerShell family keeps the inbox implementation', () => { + it('spawns powershell.exe when PowerShell family keeps the inbox implementation', async () => { process.env.COMSPEC = 'C:\\Windows\\system32\\cmd.exe' registerPtyHandlers( @@ -3924,7 +3924,7 @@ describe('registerPtyHandlers', () => { terminalWindowsPowerShellImplementation: 'powershell.exe' }) as never ) - handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) expect(spawnMock).toHaveBeenCalledWith( 'powershell.exe', @@ -3933,7 +3933,7 @@ describe('registerPtyHandlers', () => { ) }) - it('spawns pwsh.exe when PowerShell 7 is selected and available', () => { + it('spawns pwsh.exe when PowerShell 7 is selected and available', async () => { process.env.COMSPEC = 'C:\\Windows\\system32\\cmd.exe' isPwshAvailableMock.mockReturnValue(true) @@ -3947,12 +3947,12 @@ describe('registerPtyHandlers', () => { terminalWindowsPowerShellImplementation: 'pwsh.exe' }) as never ) - handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) expect(spawnMock).toHaveBeenCalledWith('pwsh.exe', POWERSHELL_OSC133_ARGS, expect.any(Object)) }) - it('falls back to powershell.exe when PowerShell 7 is selected but unavailable', () => { + it('falls back to powershell.exe when PowerShell 7 is selected but unavailable', async () => { process.env.COMSPEC = 'C:\\Windows\\system32\\cmd.exe' isPwshAvailableMock.mockReturnValue(false) @@ -3966,7 +3966,7 @@ describe('registerPtyHandlers', () => { terminalWindowsPowerShellImplementation: 'pwsh.exe' }) as never ) - handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) expect(spawnMock).toHaveBeenCalledWith( 'powershell.exe', @@ -3975,7 +3975,7 @@ describe('registerPtyHandlers', () => { ) }) - it('falls back to powershell.exe when shellOverride requests pwsh.exe but pwsh is unavailable', () => { + it('falls back to powershell.exe when shellOverride requests pwsh.exe but pwsh is unavailable', async () => { process.env.COMSPEC = 'C:\\Windows\\system32\\cmd.exe' isPwshAvailableMock.mockReturnValue(false) @@ -3989,7 +3989,7 @@ describe('registerPtyHandlers', () => { terminalWindowsPowerShellImplementation: 'pwsh.exe' }) as never ) - handlers.get('pty:spawn')!(null, { cols: 80, rows: 24, shellOverride: 'pwsh.exe' }) + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24, shellOverride: 'pwsh.exe' }) expect(spawnMock).toHaveBeenCalledWith( 'powershell.exe', @@ -3998,7 +3998,7 @@ describe('registerPtyHandlers', () => { ) }) - it('ignores the PowerShell implementation setting for cmd.exe', () => { + it('ignores the PowerShell implementation setting for cmd.exe', async () => { process.env.COMSPEC = 'C:\\Windows\\system32\\powershell.exe' isPwshAvailableMock.mockReturnValue(true) @@ -4012,7 +4012,7 @@ describe('registerPtyHandlers', () => { terminalWindowsPowerShellImplementation: 'pwsh.exe' }) as never ) - handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) expect(spawnMock).toHaveBeenCalledWith( 'cmd.exe', @@ -4021,7 +4021,7 @@ describe('registerPtyHandlers', () => { ) }) - it('ignores the PowerShell implementation setting for wsl.exe', () => { + it('ignores the PowerShell implementation setting for wsl.exe', async () => { process.env.COMSPEC = 'C:\\Windows\\system32\\powershell.exe' isPwshAvailableMock.mockReturnValue(true) @@ -4035,7 +4035,7 @@ describe('registerPtyHandlers', () => { terminalWindowsPowerShellImplementation: 'pwsh.exe' }) as never ) - handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24 }) const spawnOptions = spawnMock.mock.calls.at(-1)?.[2] as { env: Record } expect(spawnMock).toHaveBeenCalledWith('wsl.exe', expect.any(Array), expect.any(Object)) @@ -4043,7 +4043,7 @@ describe('registerPtyHandlers', () => { expect(spawnOptions.env.ORCA_CODEX_HOME).toBeUndefined() }) - it('keeps shellOverride priority for one-off tabs', () => { + it('keeps shellOverride priority for one-off tabs', async () => { process.env.COMSPEC = 'C:\\Windows\\system32\\cmd.exe' isPwshAvailableMock.mockReturnValue(false) @@ -4057,7 +4057,7 @@ describe('registerPtyHandlers', () => { terminalWindowsPowerShellImplementation: 'pwsh.exe' }) as never ) - handlers.get('pty:spawn')!(null, { + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24, shellOverride: 'wsl.exe' @@ -4113,7 +4113,7 @@ describe('registerPtyHandlers', () => { } }) - it('spawns a plain POSIX login shell and queues startup commands for the live session', () => { + it('spawns a plain POSIX login shell and queues startup commands for the live session', async () => { const originalPlatform = process.platform const originalShell = process.env.SHELL const originalZdotdir = process.env.ZDOTDIR @@ -4126,7 +4126,10 @@ describe('registerPtyHandlers', () => { delete process.env.ZDOTDIR try { - const [shell, args, options] = spawnAndGetCall({ cwd: '/tmp', command: 'printf "hello"' }) + const [shell, args, options] = await spawnAndGetCall({ + cwd: '/tmp', + command: 'printf "hello"' + }) expect(shell).toBe('/bin/zsh') expect(args).toEqual(['-l']) expect(options.env.ZDOTDIR).toBe('/tmp/orca-user-data/shell-ready/zsh') @@ -4149,7 +4152,7 @@ describe('registerPtyHandlers', () => { } }) - it('uses the POSIX shell wrapper so OpenCode config survives shell startup files', () => { + it('uses the POSIX shell wrapper so OpenCode config survives shell startup files', async () => { const originalPlatform = process.platform const originalShell = process.env.SHELL @@ -4160,7 +4163,7 @@ describe('registerPtyHandlers', () => { process.env.SHELL = '/bin/zsh' try { - const [shell, args, options] = spawnAndGetCall({ cwd: '/tmp' }) + const [shell, args, options] = await spawnAndGetCall({ cwd: '/tmp' }) expect(shell).toBe('/bin/zsh') expect(args).toEqual(['-l']) expect(options.env.OPENCODE_CONFIG_DIR).toBe('/tmp/orca-opencode-config') @@ -4180,7 +4183,7 @@ describe('registerPtyHandlers', () => { } }) - it('uses the POSIX shell wrapper so Pi config survives shell startup files', () => { + it('uses the POSIX shell wrapper so Pi config survives shell startup files', async () => { const originalPlatform = process.platform const originalShell = process.env.SHELL @@ -4196,7 +4199,7 @@ describe('registerPtyHandlers', () => { })) try { - const [shell, args, options] = spawnAndGetCall({ + const [shell, args, options] = await spawnAndGetCall({ cwd: '/tmp', env: { PI_CODING_AGENT_DIR: '/tmp/user-pi-agent' } }) @@ -4233,7 +4236,7 @@ describe('registerPtyHandlers', () => { process.env.SHELL = '/bin/bash' try { - spawnAndGetCall({ cwd: '/tmp', command: 'echo hello' }) + await spawnAndGetCall({ cwd: '/tmp', command: 'echo hello' }) const { getBashShellReadyRcfileContent } = await import('./pty') const bashRcContent = getBashShellReadyRcfileContent() @@ -4259,7 +4262,7 @@ describe('registerPtyHandlers', () => { try { registerPtyHandlers(mainWindow as never) - handlers.get('pty:spawn')!(null, { + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24, cwd: '/tmp', @@ -4288,7 +4291,7 @@ describe('registerPtyHandlers', () => { try { registerPtyHandlers(mainWindow as never) - handlers.get('pty:spawn')!(null, { + await handlers.get('pty:spawn')!(null, { cols: 80, rows: 24, cwd: '/tmp', diff --git a/src/renderer/src/components/mobile/MobileBrandIcons.tsx b/src/renderer/src/components/mobile/MobileBrandIcons.tsx new file mode 100644 index 00000000000..f32e8d3922f --- /dev/null +++ b/src/renderer/src/components/mobile/MobileBrandIcons.tsx @@ -0,0 +1,16 @@ +// Why: these are exact filled brand paths, not generic line approximations. +export function IosBrandIcon(): React.JSX.Element { + return ( + + + + ) +} + +export function AndroidLogo(): React.JSX.Element { + return ( + + + + ) +} diff --git a/src/renderer/src/components/mobile/MobileHero.tsx b/src/renderer/src/components/mobile/MobileHero.tsx index 74a50de9d57..0c4ed3cf98f 100644 --- a/src/renderer/src/components/mobile/MobileHero.tsx +++ b/src/renderer/src/components/mobile/MobileHero.tsx @@ -2,6 +2,8 @@ import { ArrowLeft, ArrowRight, Copy, RefreshCw, Smartphone, Trash2 } from 'luci import { cn } from '../../lib/utils' import type { MobileNetworkInterface } from '../settings/mobile-network-interface-selection' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select' +import { AndroidLogo, IosBrandIcon } from './MobileBrandIcons' +export { HeroIntro } from './MobileHeroIntro' import { translate } from '@/i18n/i18n' export type Platform = 'ios' | 'android' @@ -26,59 +28,6 @@ function getDeviceLabel(): string { return 'computer' } -export function HeroIntro({ onStart }: { onStart: () => void }): React.JSX.Element { - return ( -
-
- - {translate('auto.components.mobile.MobileHero.5410d55d79', 'Orca Mobile')} - -
-

- {translate( - 'auto.components.mobile.MobileHero.cd4e5e816f', - 'Your workspaces, in your pocket.' - )} -

-

- {translate( - 'auto.components.mobile.MobileHero.b4ccce5cb7', - "Control Orca from your phone. Check on agents, review changes, and kick off tasks while you're away from your desk." - )} -

-
- - {translate('auto.components.mobile.MobileHero.da1d5e5ed0', 'Available on')} - - - - {translate('auto.components.mobile.MobileHero.711e6f4b47', 'iOS')} - - - - {translate('auto.components.mobile.MobileHero.ac1eb64952', 'Android')} - -
-
- -
-
- ) -} - type HeroPairedProps = { devices: readonly PairedDevice[] onPairAnother: () => void @@ -424,20 +373,3 @@ export function HeroFlow({ ) } - -// Why: these are exact filled brand paths, not generic line approximations. -function IosBrandIcon(): React.JSX.Element { - return ( - - - - ) -} - -function AndroidLogo(): React.JSX.Element { - return ( - - - - ) -} diff --git a/src/renderer/src/components/mobile/MobileHeroIntro.tsx b/src/renderer/src/components/mobile/MobileHeroIntro.tsx new file mode 100644 index 00000000000..d38c255785e --- /dev/null +++ b/src/renderer/src/components/mobile/MobileHeroIntro.tsx @@ -0,0 +1,56 @@ +import { ArrowRight } from 'lucide-react' +import { AndroidLogo, IosBrandIcon } from './MobileBrandIcons' +import { translate } from '@/i18n/i18n' + +export function HeroIntro({ onStart }: { onStart: () => void }): React.JSX.Element { + return ( +
+
+ + {translate('auto.components.mobile.MobileHero.5410d55d79', 'Orca Mobile')} + +
+

+ {translate( + 'auto.components.mobile.MobileHero.cd4e5e816f', + 'Your workspaces, in your pocket.' + )} +

+

+ {translate( + 'auto.components.mobile.MobileHero.b4ccce5cb7', + "Control Orca from your phone. Check on agents, review changes, and kick off tasks while you're away from your desk." + )} +

+
+ + {translate('auto.components.mobile.MobileHero.da1d5e5ed0', 'Available on')} + + + + {translate('auto.components.mobile.MobileHero.711e6f4b47', 'iOS')} + + + + {translate('auto.components.mobile.MobileHero.ac1eb64952', 'Android')} + +
+
+ +
+
+ ) +} diff --git a/src/renderer/src/components/onboarding/GhosttyDiscoveryRow.tsx b/src/renderer/src/components/onboarding/GhosttyDiscoveryRow.tsx new file mode 100644 index 00000000000..9a24547251e --- /dev/null +++ b/src/renderer/src/components/onboarding/GhosttyDiscoveryRow.tsx @@ -0,0 +1,93 @@ +import { Check } from 'lucide-react' +import type { GhosttyImportPreview } from '../../../../shared/types' +import ghosttyIcon from '../../../../../resources/ghostty.svg' +import { translate } from '@/i18n/i18n' +import type { DiscoveryState } from './ThemeStep' + +export function GhosttyDiscoveryRow({ + discovery, + importing, + disabled, + onImport +}: { + discovery: DiscoveryState + importing: boolean + disabled: boolean + onImport: (preview: GhosttyImportPreview) => void +}) { + // Why: 'idle' is the pre-effect state that persists on non-Mac (the + // discovery effect short-circuits there), so render nothing instead of + // showing the dashed-border "Looking for a Ghostty config..." placeholder. + if (discovery.status === 'absent' || discovery.status === 'idle') { + return null + } + + if (discovery.status === 'detecting') { + return ( +
+ + {translate( + 'auto.components.onboarding.ThemeStep.2c3aa538f8', + 'Looking for a Ghostty config...' + )} +
+ ) + } + + if (discovery.status === 'imported') { + return ( +
+ + + + {translate('auto.components.onboarding.ThemeStep.78b6386140', 'Imported from Ghostty.')} + + {discovery.fields.length > 0 && ( + {discovery.fields.join(' · ')} + )} + +
+ ) + } + + const { preview, fields } = discovery + return ( +
+ +
+
+ + {translate( + 'auto.components.onboarding.ThemeStep.7ee9234e54', + 'Ghostty config detected.' + )} + {' '} + + {translate('auto.components.onboarding.ThemeStep.248c812283', 'Import')}{' '} + {fields.length > 0 + ? fields.map((f) => f.toLowerCase()).join(', ') + : translate('auto.components.onboarding.ThemeStep.906c4373fe', 'settings')} + ? + +
+ {preview.configPath && ( +
+ {preview.configPath} +
+ )} +
+ +
+ ) +} diff --git a/src/renderer/src/components/onboarding/ThemeStep.tsx b/src/renderer/src/components/onboarding/ThemeStep.tsx index bb00668dc3a..ad4217aca52 100644 --- a/src/renderer/src/components/onboarding/ThemeStep.tsx +++ b/src/renderer/src/components/onboarding/ThemeStep.tsx @@ -4,12 +4,12 @@ import { toast } from 'sonner' import { cn } from '@/lib/utils' import { track } from '@/lib/telemetry' import { useMountedRef } from '@/hooks/useMountedRef' +import { GhosttyDiscoveryRow } from './GhosttyDiscoveryRow' import type { DiscoveryStatusEmitted, GhosttyImportPreview, GlobalSettings } from '../../../../shared/types' -import ghosttyIcon from '../../../../../resources/ghostty.svg' import { translate } from '@/i18n/i18n' type ThemeStepProps = { @@ -34,7 +34,7 @@ export function applyOnboardingThemeSelection( // remaining states are exactly `DiscoveryStatusEmitted`, which is the // schema-side enum the compile-time guard in // `src/shared/telemetry-events.ts` locks against. -type DiscoveryState = +export type DiscoveryState = | { status: 'idle' } | { status: 'detecting' } | { status: 'found'; preview: GhosttyImportPreview; fields: string[] } @@ -273,94 +273,6 @@ export function ThemeStep({ theme, onThemeChange, settings, updateSettings }: Th ) } -function GhosttyDiscoveryRow({ - discovery, - importing, - disabled, - onImport -}: { - discovery: DiscoveryState - importing: boolean - disabled: boolean - onImport: (preview: GhosttyImportPreview) => void -}) { - // Why: 'idle' is the pre-effect state that persists on non-Mac (the - // discovery effect short-circuits there), so render nothing instead of - // showing the dashed-border "Looking for a Ghostty config…" placeholder. - if (discovery.status === 'absent' || discovery.status === 'idle') { - return null - } - - if (discovery.status === 'detecting') { - return ( -
- - {translate( - 'auto.components.onboarding.ThemeStep.2c3aa538f8', - 'Looking for a Ghostty config…' - )} -
- ) - } - - if (discovery.status === 'imported') { - return ( -
- - - - {translate('auto.components.onboarding.ThemeStep.78b6386140', 'Imported from Ghostty.')} - - {discovery.fields.length > 0 && ( - {discovery.fields.join(' · ')} - )} - -
- ) - } - - const { preview, fields } = discovery - return ( -
- -
-
- - {translate( - 'auto.components.onboarding.ThemeStep.7ee9234e54', - 'Ghostty config detected.' - )} - {' '} - - {translate('auto.components.onboarding.ThemeStep.248c812283', 'Import')}{' '} - {fields.length > 0 - ? fields.map((f) => f.toLowerCase()).join(', ') - : translate('auto.components.onboarding.ThemeStep.906c4373fe', 'settings')} - ? - -
- {preview.configPath && ( -
- {preview.configPath} -
- )} -
- -
- ) -} - function ChromePreview({ variant }: { variant: GlobalSettings['theme'] }) { if (variant === 'system') { return ( diff --git a/src/renderer/src/components/right-sidebar/HostedReviewActions.tsx b/src/renderer/src/components/right-sidebar/HostedReviewActions.tsx index 1338b5586e6..ff88e8545c2 100644 --- a/src/renderer/src/components/right-sidebar/HostedReviewActions.tsx +++ b/src/renderer/src/components/right-sidebar/HostedReviewActions.tsx @@ -1,12 +1,5 @@ import React, { useCallback, useMemo, useState } from 'react' -import { - LoaderCircle, - GitMerge, - ChevronDown, - Trash2, - GitPullRequestClosed, - CircleDot -} from 'lucide-react' +import { LoaderCircle, GitMerge, ChevronDown, GitPullRequestClosed } from 'lucide-react' import { toast } from 'sonner' import { useAppStore } from '@/store' import { cn } from '@/lib/utils' @@ -27,6 +20,11 @@ import type { GitHubPRMergeMethod } from '../../../../shared/types' import { resolveGitHubPRMergeMethods } from '../../../../shared/github-pr-merge-methods' import { runWorktreeDelete } from '../sidebar/delete-worktree-flow' import { presentGitLabMRMergeState } from './gitlab-mr-merge-state' +import { + ClosedReviewActions, + HostedReviewActionError, + MergedReviewActions +} from './HostedReviewStateActions' import { translate } from '@/i18n/i18n' type HostedReviewActionInfo = Pick< @@ -376,65 +374,28 @@ export default function HostedReviewActions({ - {actionError &&
{actionError}
} + ) } if (review.state === 'closed') { return ( -
- - {actionError &&
{actionError}
} -
+ void handleReopenReview()} + /> ) } if (review.state === 'merged') { return ( - + ) } diff --git a/src/renderer/src/components/right-sidebar/HostedReviewStateActions.tsx b/src/renderer/src/components/right-sidebar/HostedReviewStateActions.tsx new file mode 100644 index 00000000000..5ac25e3d4bc --- /dev/null +++ b/src/renderer/src/components/right-sidebar/HostedReviewStateActions.tsx @@ -0,0 +1,84 @@ +import { CircleDot, LoaderCircle, Trash2 } from 'lucide-react' +import { Button } from '@/components/ui/button' +import { translate } from '@/i18n/i18n' + +export function HostedReviewActionError({ + message +}: { + message: string | null +}): React.JSX.Element | null { + return message ?
{message}
: null +} + +export function ClosedReviewActions({ + shortLabel, + stateUpdating, + actionError, + onReopenReview +}: { + shortLabel: string + stateUpdating: 'open' | 'closed' | null + actionError: string | null + onReopenReview: () => void +}): React.JSX.Element { + return ( +
+ + +
+ ) +} + +export function MergedReviewActions({ + isDeletingWorktree, + onDeleteWorktree +}: { + isDeletingWorktree: boolean + onDeleteWorktree: () => void +}): React.JSX.Element { + return ( + + ) +} diff --git a/src/renderer/src/components/settings/McpConfigSection.tsx b/src/renderer/src/components/settings/McpConfigSection.tsx index bbad0996cf1..541233c283c 100644 --- a/src/renderer/src/components/settings/McpConfigSection.tsx +++ b/src/renderer/src/components/settings/McpConfigSection.tsx @@ -20,6 +20,7 @@ import { extractIpcErrorMessage } from '../../lib/ipc-error' import { Button } from '../ui/button' import { isWindowsUserAgent } from '../terminal-pane/pane-helpers' import { McpConfigFileRow, type LoadedMcpConfigInspection } from './McpConfigFileRow' +import { McpMissingConfigList } from './McpMissingConfigList' import { translate } from '@/i18n/i18n' type McpConfigSectionProps = { @@ -410,23 +411,7 @@ export function McpConfigSection({ repo }: McpConfigSectionProps): React.JSX.Ele )} - {missingConfigs.length > 0 && !inspectionUnavailable ? ( -
-

- {translate('auto.components.settings.McpConfigSection.4d16a0d9ac', 'Checked')} -

-
- {missingConfigs.map((config) => ( - - {config.candidate.relativePath} - - ))} -
-
- ) : null} + {!inspectionUnavailable ? : null} diff --git a/src/renderer/src/components/settings/McpMissingConfigList.tsx b/src/renderer/src/components/settings/McpMissingConfigList.tsx new file mode 100644 index 00000000000..ba0641d0aff --- /dev/null +++ b/src/renderer/src/components/settings/McpMissingConfigList.tsx @@ -0,0 +1,30 @@ +import type { LoadedMcpConfigInspection } from './McpConfigFileRow' +import { translate } from '@/i18n/i18n' + +export function McpMissingConfigList({ + missingConfigs +}: { + missingConfigs: LoadedMcpConfigInspection[] +}): React.JSX.Element | null { + if (missingConfigs.length === 0) { + return null + } + + return ( +
+

+ {translate('auto.components.settings.McpConfigSection.4d16a0d9ac', 'Checked')} +

+
+ {missingConfigs.map((config) => ( + + {config.candidate.relativePath} + + ))} +
+
+ ) +} diff --git a/src/renderer/src/components/sidebar/AddRepoDialogStepContent.test.tsx b/src/renderer/src/components/sidebar/AddRepoDialogStepContent.test.tsx index e84572d28c8..f422bb391f1 100644 --- a/src/renderer/src/components/sidebar/AddRepoDialogStepContent.test.tsx +++ b/src/renderer/src/components/sidebar/AddRepoDialogStepContent.test.tsx @@ -106,8 +106,8 @@ describe('AddRepoDialogStepContent nested imports', () => { const html = renderNestedStep(0) expect(html).toContain('Is this a monorepo?') - expect(html).toContain('aria-label="Monorepo name"') - expect(html).toContain('Yes, import as monorepo') + expect(html).toContain('aria-label="Group name"') + expect(html).toContain('Import as group') expect(html).toContain('No, import separately') expect(html).not.toContain('>Import') }) @@ -116,8 +116,8 @@ describe('AddRepoDialogStepContent nested imports', () => { const html = renderNestedStep(1) expect(html).toContain('Is this a monorepo?') - expect(html).toContain('aria-label="Monorepo name"') - expect(html).toContain('Yes, import as monorepo') + expect(html).toContain('aria-label="Group name"') + expect(html).toContain('Import as group') expect(html).toContain('No, import separately') expect(html).not.toContain('>Import') }) diff --git a/src/renderer/src/components/sidebar/AddRepoNestedImportStep.test.tsx b/src/renderer/src/components/sidebar/AddRepoNestedImportStep.test.tsx index 7f542c597ce..47d8ecd691a 100644 --- a/src/renderer/src/components/sidebar/AddRepoNestedImportStep.test.tsx +++ b/src/renderer/src/components/sidebar/AddRepoNestedImportStep.test.tsx @@ -1,6 +1,6 @@ // @vitest-environment happy-dom -import { act, type ComponentProps } from 'react' +import { act, useState, type ComponentProps } from 'react' import { createRoot, type Root } from 'react-dom/client' import { renderToStaticMarkup } from 'react-dom/server' import { afterEach, describe, expect, it, vi } from 'vitest' @@ -78,13 +78,13 @@ describe('AddRepoNestedImportStep', () => { expect(html).toContain('Import repositories from folder') expect(html).toContain('Found 3 repositories in') expect(html).toContain('/workspace/platform') - expect(html).toContain('aria-label="Monorepo name"') - expect(html).toContain('aria-label="What is a monorepo name?"') + expect(html).toContain('aria-label="Group name"') + expect(html).not.toContain('What is a') expect(html).toContain('Is this a monorepo?') - expect(html).toContain('Choose this if these projects belong together') + expect(html).toContain('Import them as a group if they're a monorepo') expect(html).toContain('Orca will group them and let you work from the parent folder') expect(html).toContain('No, import separately') - expect(html).toContain('Yes, import as monorepo') + expect(html).toContain('Import as group') expect(html).toContain('payments/api') expect(html).toContain('billing/api') expect(html).not.toContain('disabled=""') @@ -97,9 +97,9 @@ describe('AddRepoNestedImportStep', () => { expect(html).toContain('Is this a monorepo?') expect(html).toContain('No, import separately') - expect(html).toContain('Yes, import as monorepo') + expect(html).toContain('Import as group') expect(html).toMatch(/]*disabled=""[^>]*>No, import separately<\/button>/) - expect(html).toMatch(/]*disabled=""[^>]*>Yes, import as monorepo<\/button>/) + expect(html).toMatch(/]*disabled=""[^>]*>Import as group<\/button>/) }) it('maps the monorepo choice to grouped import and the non-monorepo choice to separate import', () => { @@ -130,11 +130,55 @@ describe('AddRepoNestedImportStep', () => { }) act(() => { - findButton(host, 'Yes, import as monorepo').click() + findButton(host, 'Import as group').click() findButton(host, 'No, import separately').click() }) expect(onImport).toHaveBeenNthCalledWith(1, 'group') expect(onImport).toHaveBeenNthCalledWith(2, 'separate') }) + + it('shows progress only on the clicked import action', () => { + const onImport = vi.fn() + const host = document.createElement('div') + container = host + document.body.appendChild(host) + root = createRoot(host) + + function Harness(): React.JSX.Element { + const [isAdding, setIsAdding] = useState(false) + return ( + + + repo.path))} + isAdding={isAdding} + scanInProgress={false} + onGroupNameChange={vi.fn()} + onSelectedPathsChange={vi.fn()} + onImport={(mode) => { + onImport(mode) + setIsAdding(true) + }} + onStopScan={vi.fn()} + /> + + + ) + } + + act(() => { + root?.render() + }) + + act(() => { + findButton(host, 'Import as group').click() + }) + + expect(onImport).toHaveBeenCalledWith('group') + expect(findButton(host, 'Import as group').querySelector('.animate-spin')).not.toBeNull() + expect(findButton(host, 'No, import separately').querySelector('.animate-spin')).toBeNull() + }) }) diff --git a/src/renderer/src/components/sidebar/AddRepoNestedImportStep.tsx b/src/renderer/src/components/sidebar/AddRepoNestedImportStep.tsx index 76a1a2caf69..4de4a9b469f 100644 --- a/src/renderer/src/components/sidebar/AddRepoNestedImportStep.tsx +++ b/src/renderer/src/components/sidebar/AddRepoNestedImportStep.tsx @@ -1,5 +1,5 @@ -import { useId, type Dispatch, type SetStateAction } from 'react' -import { CircleHelp, CircleStop, Loader2 } from 'lucide-react' +import { useEffect, useId, useState, type Dispatch, type SetStateAction } from 'react' +import { CircleStop, Loader2 } from 'lucide-react' import { DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' @@ -36,6 +36,20 @@ export function AddRepoNestedImportStep({ }: AddRepoNestedImportStepProps): React.JSX.Element { const folderName = getRuntimePathBasename(scan.selectedPath) || scan.selectedPath const groupNameInputId = useId() + const [pendingImportMode, setPendingImportMode] = useState<'group' | 'separate' | null>(null) + const showSeparateSpinner = isAdding && pendingImportMode === 'separate' + const showGroupSpinner = isAdding && pendingImportMode === 'group' + + useEffect(() => { + if (!isAdding) { + setPendingImportMode(null) + } + }, [isAdding]) + + const handleImport = (mode: 'group' | 'separate'): void => { + setPendingImportMode(mode) + onImport(mode) + } const repoCountLabel = scan.repos.length === 1 ? translate('auto.components.sidebar.AddRepoNestedImportStep.8401a7a0d0', '1 repository') @@ -97,7 +111,7 @@ export function AddRepoNestedImportStep({

{translate( 'auto.components.sidebar.AddRepoNestedImportStep.d75170194e', - 'Choose this if these projects belong together. Orca will group them and let you work from the parent folder.' + "Import them as a group if they're a monorepo or otherwise belong together. Orca will group them and let you work from the parent folder." )}

@@ -106,37 +120,15 @@ export function AddRepoNestedImportStep({ - - - - - - {translate( - 'auto.components.sidebar.AddRepoNestedImportStep.b20bb7c24f', - 'Keeps these repos together in one group. Best for related repos like microservices.' - )} - - onGroupNameChange(event.target.value)} @@ -147,22 +139,24 @@ export function AddRepoNestedImportStep({
diff --git a/src/renderer/src/components/sidebar/FolderWorkspaceComposerDialog.tsx b/src/renderer/src/components/sidebar/FolderWorkspaceComposerDialog.tsx index ab09a653274..3ec00563c1c 100644 --- a/src/renderer/src/components/sidebar/FolderWorkspaceComposerDialog.tsx +++ b/src/renderer/src/components/sidebar/FolderWorkspaceComposerDialog.tsx @@ -335,17 +335,10 @@ export function FolderWorkspaceComposerDialog({ repoId={repoId} selectedRepoIsGit={true} onRepoChange={handleRepoChange} - primaryActionLabel={ - quickAgent - ? translate( - 'auto.components.sidebar.FolderWorkspaceComposerDialog.createStart', - 'Create & Start Agent' - ) - : translate( - 'auto.components.sidebar.FolderWorkspaceComposerDialog.create', - 'Create Workspace' - ) - } + primaryActionLabel={translate( + 'auto.components.sidebar.FolderWorkspaceComposerDialog.create', + 'Create workspace' + )} projectLabel={translate( 'auto.components.sidebar.FolderWorkspaceComposerDialog.sourceProject', 'Task Source' diff --git a/src/renderer/src/components/sidebar/WorktreeList.lineage-child-card.test.ts b/src/renderer/src/components/sidebar/WorktreeList.lineage-child-card.test.ts index b7235e6e1e5..44b3fde787e 100644 --- a/src/renderer/src/components/sidebar/WorktreeList.lineage-child-card.test.ts +++ b/src/renderer/src/components/sidebar/WorktreeList.lineage-child-card.test.ts @@ -15,6 +15,16 @@ type WorktreeListComponent = React.ComponentType<{ let WorktreeList: WorktreeListComponent +function makeFolderWorkspacePathStatusMockState(): Record { + return { + fetchFolderWorkspacePathStatus: vi.fn(), + folderWorkspaces: [], + folderWorkspacePathStatuses: {}, + getFolderWorkspacePathStatusCacheKey: (request: unknown) => JSON.stringify(request), + getFreshFolderWorkspacePathStatus: () => null + } +} + vi.mock('@/store', () => { const useAppStore = ((selector: (state: Record) => unknown) => selector(mockStore.state)) as (( @@ -306,6 +316,7 @@ function setLineageFixtureState( grandchild.isUnread = unreadWorktreeIds.has(grandchild.id) mockStore.state = { + ...makeFolderWorkspacePathStatusMockState(), activeModal: '', activeView: 'terminal', activeWorktreeId: null, @@ -385,6 +396,7 @@ function setProjectGroupWithoutWorktreeRowsState(filterRepoIds: string[] = []): } mockStore.state = { + ...makeFolderWorkspacePathStatusMockState(), activeModal: '', activeView: 'terminal', activeWorktreeId: null, @@ -444,6 +456,7 @@ function setEmptyUngroupedProjectState(filterRepoIds: string[] = []): void { } mockStore.state = { + ...makeFolderWorkspacePathStatusMockState(), activeModal: '', activeView: 'terminal', activeWorktreeId: null, @@ -668,7 +681,7 @@ describe('WorktreeList lineage child card renderer', () => { const markup = await renderWorktreeListMarkup() expect(getOptionOpeningTag(markup, 'child')).toContain('padding-left:14px') - expect(getCardOpeningTag(markup, 'child')).toContain('data-content-indent="20"') + expect(getCardOpeningTag(markup, 'child')).toContain('data-content-indent="6"') expect(getCardOpeningTag(markup, 'child')).toContain('data-flush-surface="true"') }) @@ -677,7 +690,7 @@ describe('WorktreeList lineage child card renderer', () => { const markup = await renderWorktreeListMarkup() expect(getOptionOpeningTag(markup, 'child')).toContain('padding-left:14px') - expect(getCardOpeningTag(markup, 'child')).toContain('data-content-indent="38"') + expect(getCardOpeningTag(markup, 'child')).toContain('data-content-indent="24"') expect(getCardOpeningTag(markup, 'child')).toContain('data-flush-surface="true"') }) @@ -687,8 +700,8 @@ describe('WorktreeList lineage child card renderer', () => { const parentRow = getOptionOpeningTag(markup, 'parent') - expect(parentRow).not.toContain('padding-left') - expect(getCardOpeningTag(markup, 'parent')).toContain('data-content-indent="38"') + expect(parentRow).toContain('padding-left:14px') + expect(getCardOpeningTag(markup, 'parent')).toContain('data-content-indent="24"') expect(getCardOpeningTag(markup, 'parent')).toContain('data-flush-surface="true"') }) }) diff --git a/src/renderer/src/components/sidebar/WorktreeList.lineage-child-real-card.test.tsx b/src/renderer/src/components/sidebar/WorktreeList.lineage-child-real-card.test.tsx index 9130c45a0f6..dc91cf0c9c4 100644 --- a/src/renderer/src/components/sidebar/WorktreeList.lineage-child-real-card.test.tsx +++ b/src/renderer/src/components/sidebar/WorktreeList.lineage-child-real-card.test.tsx @@ -31,6 +31,16 @@ type WorktreeListComponent = React.ComponentType<{ let WorktreeList: WorktreeListComponent +function makeFolderWorkspacePathStatusMockState(): Record { + return { + fetchFolderWorkspacePathStatus: vi.fn(), + folderWorkspaces: [], + folderWorkspacePathStatuses: {}, + getFolderWorkspacePathStatusCacheKey: (request: unknown) => JSON.stringify(request), + getFreshFolderWorkspacePathStatus: () => null + } +} + vi.mock('@/store', () => { const useAppStore = ((selector: (state: Record) => unknown) => selector(mockStore.state)) as (( @@ -224,6 +234,7 @@ function setLineageState(options: { deletingChild?: boolean } = {}): void { } }) mockStore.state = { + ...makeFolderWorkspacePathStatusMockState(), activeModal: '', activeView: 'terminal', activeWorktreeId: null, diff --git a/src/renderer/src/components/sidebar/folder-workspace-composer-submit.test.ts b/src/renderer/src/components/sidebar/folder-workspace-composer-submit.test.ts new file mode 100644 index 00000000000..3c2b4690c3c --- /dev/null +++ b/src/renderer/src/components/sidebar/folder-workspace-composer-submit.test.ts @@ -0,0 +1,91 @@ +// @vitest-environment happy-dom + +import { afterEach, describe, expect, it, vi } from 'vitest' +import type { FolderWorkspace, ProjectGroup } from '../../../../shared/types' + +const mocks = vi.hoisted(() => ({ + activateAndRevealFolderWorkspace: vi.fn() +})) + +vi.mock('@/lib/worktree-activation', () => ({ + activateAndRevealFolderWorkspace: mocks.activateAndRevealFolderWorkspace +})) + +import { submitFolderWorkspaceCreate } from './folder-workspace-composer-submit' + +function makeProjectGroup(): ProjectGroup { + return { + id: 'group-1', + name: 'Platform', + parentPath: '/repo/platform', + parentGroupId: null, + createdFrom: 'folder-scan', + tabOrder: 0, + isCollapsed: false, + color: null, + createdAt: 1, + updatedAt: 1 + } +} + +function makeFolderWorkspace(): FolderWorkspace { + return { + id: 'folder-workspace-1', + projectGroupId: 'group-1', + name: 'hi', + folderPath: '/repo/platform/hi', + linkedTask: null, + comment: '', + isArchived: false, + isUnread: false, + isPinned: false, + sortOrder: 0, + lastActivityAt: 1, + createdAt: 1, + updatedAt: 1 + } +} + +describe('submitFolderWorkspaceCreate', () => { + afterEach(() => { + mocks.activateAndRevealFolderWorkspace.mockReset() + vi.restoreAllMocks() + }) + + it('closes the composer after creation even when reveal fails', async () => { + const createFolderWorkspace = vi.fn(async () => makeFolderWorkspace()) + const onOpenChange = vi.fn() + const consoleError = vi.spyOn(console, 'error').mockImplementation(() => {}) + mocks.activateAndRevealFolderWorkspace.mockImplementation(() => { + throw new Error('activation failed') + }) + + await submitFolderWorkspaceCreate({ + projectGroup: makeProjectGroup(), + name: 'hi', + lastAutoName: '', + linkedWorkItem: null, + note: '', + quickAgent: null, + autoRenameBranchFromWork: false, + agentCmdOverrides: {}, + createFolderWorkspace, + onOpenChange + }) + + expect(createFolderWorkspace).toHaveBeenCalledWith({ + projectGroupId: 'group-1', + name: 'hi', + linkedTask: null + }) + expect(onOpenChange).toHaveBeenCalledWith(false) + expect(mocks.activateAndRevealFolderWorkspace).toHaveBeenCalledWith( + 'folder-workspace-1', + undefined + ) + expect(consoleError).toHaveBeenCalledWith( + 'Failed to activate folder workspace after create:', + expect.any(Error) + ) + }) +}) diff --git a/src/renderer/src/components/sidebar/folder-workspace-composer-submit.ts b/src/renderer/src/components/sidebar/folder-workspace-composer-submit.ts index 8bddb367c2d..b4f1913e7b4 100644 --- a/src/renderer/src/components/sidebar/folder-workspace-composer-submit.ts +++ b/src/renderer/src/components/sidebar/folder-workspace-composer-submit.ts @@ -4,6 +4,7 @@ import { type LinkedWorkItemSummary } from '@/lib/new-workspace' import { getLinkedWorkItemPromptContext } from '@/lib/linked-work-item-context' +import { isOrcaCliAvailableForLaunch } from '@/lib/orca-cli-launch-availability' import { buildAgentStartupPlan } from '@/lib/tui-agent-startup' import { tuiAgentToAgentKind } from '@/lib/telemetry' import { activateAndRevealFolderWorkspace } from '@/lib/worktree-activation' @@ -67,7 +68,12 @@ export async function submitFolderWorkspaceCreate({ return } - const linkedPromptContext = getLinkedWorkItemPromptContext(linkedWorkItem) + const linearCliAvailable = linkedWorkItem?.linearIdentifier + ? await isOrcaCliAvailableForLaunch({ remote: projectGroup.connectionId != null }) + : false + const linkedPromptContext = getLinkedWorkItemPromptContext(linkedWorkItem, { + cliAvailable: linearCliAvailable + }) const startupPrompt = buildAgentPromptWithContext( note, [], @@ -95,6 +101,12 @@ export async function submitFolderWorkspaceCreate({ } } : undefined - activateAndRevealFolderWorkspace(workspace.id, startup ? { startup } : undefined) onOpenChange(false) + try { + activateAndRevealFolderWorkspace(workspace.id, startup ? { startup } : undefined) + } catch (error) { + // Why: creation already succeeded. Do not leave the completed create modal + // open if the follow-up reveal/startup path hits a transient issue. + console.error('Failed to activate folder workspace after create:', error) + } } diff --git a/src/renderer/src/components/stats/ClaudeUsagePane.tsx b/src/renderer/src/components/stats/ClaudeUsagePane.tsx index d7fb5d00b7c..0beae4aada1 100644 --- a/src/renderer/src/components/stats/ClaudeUsagePane.tsx +++ b/src/renderer/src/components/stats/ClaudeUsagePane.tsx @@ -25,8 +25,10 @@ import { import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip' import { ClaudeUsageDailyChart } from './ClaudeUsageDailyChart' import { ClaudeUsageLoadingState } from './ClaudeUsageLoadingState' +import { ClaudeUsageRecentSessionsTable } from './ClaudeUsageRecentSessionsTable' import { ShareUsageButton } from './ShareUsageButton' import { StatCard } from './StatCard' +import { formatCost, formatTokens, formatUpdatedAt } from './usage-formatters' import { translate } from '@/i18n/i18n' const RANGE_OPTIONS: ClaudeUsageRange[] = ['7d', '30d', '90d', 'all'] @@ -47,43 +49,6 @@ const RANGE_LABELS: Record = { all: 'All time' } -function formatTokens(value: number): string { - if (value >= 1_000_000) { - return `${(value / 1_000_000).toFixed(1)}M` - } - if (value >= 1_000) { - return `${(value / 1_000).toFixed(1)}k` - } - return value.toLocaleString() -} - -function formatCost(value: number | null): string { - if (value === null) { - return 'n/a' - } - return value < 0.01 ? `$${value.toFixed(4)}` : `$${value.toFixed(2)}` -} - -function formatUpdatedAt(timestamp: number | null): string { - if (!timestamp) { - return 'Not scanned yet' - } - return `Updated ${new Date(timestamp).toLocaleString()}` -} - -function formatSessionTime(timestamp: string): string { - const parsed = new Date(timestamp) - if (Number.isNaN(parsed.getTime())) { - return timestamp - } - return parsed.toLocaleString(undefined, { - month: 'short', - day: 'numeric', - hour: 'numeric', - minute: '2-digit' - }) -} - export function ClaudeUsagePane(): React.JSX.Element { const scanState = useAppStore((state) => state.claudeUsageScanState) const summary = useAppStore((state) => state.claudeUsageSummary) @@ -412,72 +377,7 @@ export function ClaudeUsagePane(): React.JSX.Element { -
-
-

- {translate('auto.components.stats.ClaudeUsagePane.7e76c84153', 'Recent sessions')} -

-

- {translate('auto.components.stats.ClaudeUsagePane.abfc4a4943', 'Cache reuse rate:')}{' '} - {summary?.cacheReuseRate !== null && summary?.cacheReuseRate !== undefined - ? `${Math.round(summary.cacheReuseRate * 100)}%` - : translate('auto.components.stats.ClaudeUsagePane.7765a4c3e1', 'n/a')} -

-
-
- - - - - - - - - - - - - - {recentSessions.map((row) => ( - - - - - - - - - - ))} - -
- {translate('auto.components.stats.ClaudeUsagePane.01476891c7', 'Last active')} - - {translate('auto.components.stats.ClaudeUsagePane.c17bed0416', 'Project')} - - {translate('auto.components.stats.ClaudeUsagePane.1afc25eb06', 'Model')} - - {translate('auto.components.stats.ClaudeUsagePane.0f03975d59', 'Turns')} - - {translate('auto.components.stats.ClaudeUsagePane.faf3444859', 'Input')} - - {translate('auto.components.stats.ClaudeUsagePane.a8b7487ff7', 'Output')} - - {translate('auto.components.stats.ClaudeUsagePane.21ea00bfa8', 'Cache')} -
- {formatSessionTime(row.lastActiveAt)} - {row.projectLabel} - {row.model ?? - translate('auto.components.stats.ClaudeUsagePane.cfe2282ffa', 'Unknown')} - {row.turns} - {formatTokens(row.inputTokens)} - - {formatTokens(row.outputTokens)} - - {formatTokens(row.cacheReadTokens + row.cacheWriteTokens)} -
-
-
+ )} diff --git a/src/renderer/src/components/stats/ClaudeUsageRecentSessionsTable.tsx b/src/renderer/src/components/stats/ClaudeUsageRecentSessionsTable.tsx new file mode 100644 index 00000000000..57752c46515 --- /dev/null +++ b/src/renderer/src/components/stats/ClaudeUsageRecentSessionsTable.tsx @@ -0,0 +1,81 @@ +import type { + ClaudeUsageSessionRow, + ClaudeUsageSummary +} from '../../../../shared/claude-usage-types' +import { translate } from '@/i18n/i18n' +import { formatSessionTime, formatTokens } from './usage-formatters' + +export function ClaudeUsageRecentSessionsTable({ + recentSessions, + summary +}: { + recentSessions: ClaudeUsageSessionRow[] + summary: ClaudeUsageSummary | null +}): React.JSX.Element { + return ( +
+
+

+ {translate('auto.components.stats.ClaudeUsagePane.7e76c84153', 'Recent sessions')} +

+

+ {translate('auto.components.stats.ClaudeUsagePane.abfc4a4943', 'Cache reuse rate:')}{' '} + {summary?.cacheReuseRate !== null && summary?.cacheReuseRate !== undefined + ? `${Math.round(summary.cacheReuseRate * 100)}%` + : translate('auto.components.stats.ClaudeUsagePane.7765a4c3e1', 'n/a')} +

+
+
+ + + + + + + + + + + + + + {recentSessions.map((row) => ( + + + + + + + + + + ))} + +
+ {translate('auto.components.stats.ClaudeUsagePane.01476891c7', 'Last active')} + + {translate('auto.components.stats.ClaudeUsagePane.c17bed0416', 'Project')} + + {translate('auto.components.stats.ClaudeUsagePane.1afc25eb06', 'Model')} + + {translate('auto.components.stats.ClaudeUsagePane.0f03975d59', 'Turns')} + + {translate('auto.components.stats.ClaudeUsagePane.faf3444859', 'Input')} + + {translate('auto.components.stats.ClaudeUsagePane.a8b7487ff7', 'Output')} + + {translate('auto.components.stats.ClaudeUsagePane.21ea00bfa8', 'Cache')} +
+ {formatSessionTime(row.lastActiveAt)} + {row.projectLabel} + {row.model ?? + translate('auto.components.stats.ClaudeUsagePane.cfe2282ffa', 'Unknown')} + {row.turns}{formatTokens(row.inputTokens)} + {formatTokens(row.outputTokens)} + + {formatTokens(row.cacheReadTokens + row.cacheWriteTokens)} +
+
+
+ ) +} diff --git a/src/renderer/src/components/stats/CodexUsagePane.tsx b/src/renderer/src/components/stats/CodexUsagePane.tsx index 58f46830ef3..8df30ccba81 100644 --- a/src/renderer/src/components/stats/CodexUsagePane.tsx +++ b/src/renderer/src/components/stats/CodexUsagePane.tsx @@ -24,8 +24,10 @@ import { import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip' import { ClaudeUsageLoadingState } from './ClaudeUsageLoadingState' import { CodexUsageDailyChart } from './CodexUsageDailyChart' +import { CodexUsageRecentSessionsTable } from './CodexUsageRecentSessionsTable' import { ShareUsageButton } from './ShareUsageButton' import { StatCard } from './StatCard' +import { formatCost, formatTokens, formatUpdatedAt } from './usage-formatters' import { translate } from '@/i18n/i18n' const RANGE_OPTIONS: CodexUsageRange[] = ['7d', '30d', '90d', 'all'] @@ -46,43 +48,6 @@ const RANGE_LABELS: Record = { all: 'All time' } -function formatTokens(value: number): string { - if (value >= 1_000_000) { - return `${(value / 1_000_000).toFixed(1)}M` - } - if (value >= 1_000) { - return `${(value / 1_000).toFixed(1)}k` - } - return value.toLocaleString() -} - -function formatCost(value: number | null): string { - if (value === null) { - return 'n/a' - } - return value < 0.01 ? `$${value.toFixed(4)}` : `$${value.toFixed(2)}` -} - -function formatUpdatedAt(timestamp: number | null): string { - if (!timestamp) { - return 'Not scanned yet' - } - return `Updated ${new Date(timestamp).toLocaleString()}` -} - -function formatSessionTime(timestamp: string): string { - const parsed = new Date(timestamp) - if (Number.isNaN(parsed.getTime())) { - return timestamp - } - return parsed.toLocaleString(undefined, { - month: 'short', - day: 'numeric', - hour: 'numeric', - minute: '2-digit' - }) -} - export function CodexUsagePane(): React.JSX.Element { const scanState = useAppStore((state) => state.codexUsageScanState) const summary = useAppStore((state) => state.codexUsageSummary) @@ -396,73 +361,7 @@ export function CodexUsagePane(): React.JSX.Element { -
-
-

- {translate('auto.components.stats.CodexUsagePane.0cb0983c07', 'Recent sessions')} -

-

- {translate( - 'auto.components.stats.CodexUsagePane.0bd8655475', - 'Most recent local Codex sessions in this scope.' - )} -

-
-
- - - - - - - - - - - - - - {recentSessions.map((row) => ( - - - - - - - - - - ))} - -
- {translate('auto.components.stats.CodexUsagePane.0c36b100be', 'Last active')} - - {translate('auto.components.stats.CodexUsagePane.1a65900aea', 'Project')} - - {translate('auto.components.stats.CodexUsagePane.c2478bcc3c', 'Model')} - - {translate('auto.components.stats.CodexUsagePane.bd0822ca47', 'Events')} - - {translate('auto.components.stats.CodexUsagePane.3acc582214', 'Input')} - - {translate('auto.components.stats.CodexUsagePane.bbd20344b8', 'Output')} - - {translate('auto.components.stats.CodexUsagePane.e0b988599d', 'Total')} -
- {formatSessionTime(row.lastActiveAt)} - {row.projectLabel} - {row.model ?? - translate('auto.components.stats.CodexUsagePane.bf6cf2d4dd', 'Unknown')} - {row.hasInferredPricing ? ' *' : ''} - {row.events} - {formatTokens(row.inputTokens)} - - {formatTokens(row.outputTokens)} - - {formatTokens(row.totalTokens)} -
-
-
+ )} diff --git a/src/renderer/src/components/stats/CodexUsageRecentSessionsTable.tsx b/src/renderer/src/components/stats/CodexUsageRecentSessionsTable.tsx new file mode 100644 index 00000000000..f5ee1a7a430 --- /dev/null +++ b/src/renderer/src/components/stats/CodexUsageRecentSessionsTable.tsx @@ -0,0 +1,75 @@ +import type { CodexUsageSessionRow } from '../../../../shared/codex-usage-types' +import { translate } from '@/i18n/i18n' +import { formatSessionTime, formatTokens } from './usage-formatters' + +export function CodexUsageRecentSessionsTable({ + recentSessions +}: { + recentSessions: CodexUsageSessionRow[] +}): React.JSX.Element { + return ( +
+
+

+ {translate('auto.components.stats.CodexUsagePane.0cb0983c07', 'Recent sessions')} +

+

+ {translate( + 'auto.components.stats.CodexUsagePane.0bd8655475', + 'Most recent local Codex sessions in this scope.' + )} +

+
+
+ + + + + + + + + + + + + + {recentSessions.map((row) => ( + + + + + + + + + + ))} + +
+ {translate('auto.components.stats.CodexUsagePane.0c36b100be', 'Last active')} + + {translate('auto.components.stats.CodexUsagePane.1a65900aea', 'Project')} + + {translate('auto.components.stats.CodexUsagePane.c2478bcc3c', 'Model')} + + {translate('auto.components.stats.CodexUsagePane.bd0822ca47', 'Events')} + + {translate('auto.components.stats.CodexUsagePane.3acc582214', 'Input')} + + {translate('auto.components.stats.CodexUsagePane.bbd20344b8', 'Output')} + + {translate('auto.components.stats.CodexUsagePane.e0b988599d', 'Total')} +
+ {formatSessionTime(row.lastActiveAt)} + {row.projectLabel} + {row.model ?? + translate('auto.components.stats.CodexUsagePane.bf6cf2d4dd', 'Unknown')} + {row.hasInferredPricing ? ' *' : ''} + {row.events}{formatTokens(row.inputTokens)} + {formatTokens(row.outputTokens)} + {formatTokens(row.totalTokens)}
+
+
+ ) +} diff --git a/src/renderer/src/components/stats/OpenCodeUsagePane.tsx b/src/renderer/src/components/stats/OpenCodeUsagePane.tsx index b21dfb5dbf3..721cc3e3fae 100644 --- a/src/renderer/src/components/stats/OpenCodeUsagePane.tsx +++ b/src/renderer/src/components/stats/OpenCodeUsagePane.tsx @@ -27,7 +27,9 @@ import { import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip' import { ClaudeUsageLoadingState } from './ClaudeUsageLoadingState' import { CodexUsageDailyChart } from './CodexUsageDailyChart' +import { OpenCodeUsageRecentSessionsTable } from './OpenCodeUsageRecentSessionsTable' import { StatCard } from './StatCard' +import { formatCost, formatTokens, formatUpdatedAt } from './usage-formatters' import { translate } from '@/i18n/i18n' const RANGE_OPTIONS: OpenCodeUsageRange[] = ['7d', '30d', '90d', 'all'] @@ -51,43 +53,6 @@ const RANGE_LABELS: Record = { all: 'All time' } -function formatTokens(value: number): string { - if (value >= 1_000_000) { - return `${(value / 1_000_000).toFixed(1)}M` - } - if (value >= 1_000) { - return `${(value / 1_000).toFixed(1)}k` - } - return value.toLocaleString() -} - -function formatCost(value: number | null): string { - if (value === null) { - return 'n/a' - } - return value < 0.01 ? `$${value.toFixed(4)}` : `$${value.toFixed(2)}` -} - -function formatUpdatedAt(timestamp: number | null): string { - if (!timestamp) { - return 'Not scanned yet' - } - return `Updated ${new Date(timestamp).toLocaleString()}` -} - -function formatSessionTime(timestamp: string): string { - const parsed = new Date(timestamp) - if (Number.isNaN(parsed.getTime())) { - return timestamp - } - return parsed.toLocaleString(undefined, { - month: 'short', - day: 'numeric', - hour: 'numeric', - minute: '2-digit' - }) -} - export function OpenCodeUsagePane(): React.JSX.Element { const scanState = useAppStore((state) => state.openCodeUsageScanState) const summary = useAppStore((state) => state.openCodeUsageSummary) @@ -422,78 +387,7 @@ export function OpenCodeUsagePane(): React.JSX.Element { -
-
-

- {translate('auto.components.stats.OpenCodeUsagePane.4799177b1c', 'Recent sessions')} -

-

- {translate( - 'auto.components.stats.OpenCodeUsagePane.81817a641a', - 'Most recent local OpenCode sessions in this scope.' - )} -

-
-
- - - - - - - - - - - - - - {recentSessions.map((row) => ( - - - - - - - - - - ))} - -
- {translate( - 'auto.components.stats.OpenCodeUsagePane.d97bdf6e27', - 'Last active' - )} - - {translate('auto.components.stats.OpenCodeUsagePane.a4738de041', 'Project')} - - {translate('auto.components.stats.OpenCodeUsagePane.08c78441b7', 'Model')} - - {translate('auto.components.stats.OpenCodeUsagePane.d416f5cf92', 'Events')} - - {translate('auto.components.stats.OpenCodeUsagePane.0f2f266c9d', 'Input')} - - {translate('auto.components.stats.OpenCodeUsagePane.dfc4513657', 'Output')} - - {translate('auto.components.stats.OpenCodeUsagePane.349f7c3f5c', 'Total')} -
- {formatSessionTime(row.lastActiveAt)} - {row.projectLabel} - {row.model ?? - translate( - 'auto.components.stats.OpenCodeUsagePane.362231082f', - 'Unknown' - )} - {row.events} - {formatTokens(row.inputTokens)} - - {formatTokens(row.outputTokens)} - - {formatTokens(row.totalTokens)} -
-
-
+ )} diff --git a/src/renderer/src/components/stats/OpenCodeUsageRecentSessionsTable.tsx b/src/renderer/src/components/stats/OpenCodeUsageRecentSessionsTable.tsx new file mode 100644 index 00000000000..ad8e3a38152 --- /dev/null +++ b/src/renderer/src/components/stats/OpenCodeUsageRecentSessionsTable.tsx @@ -0,0 +1,74 @@ +import type { OpenCodeUsageSessionRow } from '../../../../shared/opencode-usage-types' +import { translate } from '@/i18n/i18n' +import { formatSessionTime, formatTokens } from './usage-formatters' + +export function OpenCodeUsageRecentSessionsTable({ + recentSessions +}: { + recentSessions: OpenCodeUsageSessionRow[] +}): React.JSX.Element { + return ( +
+
+

+ {translate('auto.components.stats.OpenCodeUsagePane.4799177b1c', 'Recent sessions')} +

+

+ {translate( + 'auto.components.stats.OpenCodeUsagePane.81817a641a', + 'Most recent local OpenCode sessions in this scope.' + )} +

+
+
+ + + + + + + + + + + + + + {recentSessions.map((row) => ( + + + + + + + + + + ))} + +
+ {translate('auto.components.stats.OpenCodeUsagePane.d97bdf6e27', 'Last active')} + + {translate('auto.components.stats.OpenCodeUsagePane.a4738de041', 'Project')} + + {translate('auto.components.stats.OpenCodeUsagePane.08c78441b7', 'Model')} + + {translate('auto.components.stats.OpenCodeUsagePane.d416f5cf92', 'Events')} + + {translate('auto.components.stats.OpenCodeUsagePane.0f2f266c9d', 'Input')} + + {translate('auto.components.stats.OpenCodeUsagePane.dfc4513657', 'Output')} + + {translate('auto.components.stats.OpenCodeUsagePane.349f7c3f5c', 'Total')} +
+ {formatSessionTime(row.lastActiveAt)} + {row.projectLabel} + {row.model ?? + translate('auto.components.stats.OpenCodeUsagePane.362231082f', 'Unknown')} + {row.events}{formatTokens(row.inputTokens)} + {formatTokens(row.outputTokens)} + {formatTokens(row.totalTokens)}
+
+
+ ) +} diff --git a/src/renderer/src/components/stats/usage-formatters.ts b/src/renderer/src/components/stats/usage-formatters.ts new file mode 100644 index 00000000000..ae3345a1e60 --- /dev/null +++ b/src/renderer/src/components/stats/usage-formatters.ts @@ -0,0 +1,36 @@ +export function formatTokens(value: number): string { + if (value >= 1_000_000) { + return `${(value / 1_000_000).toFixed(1)}M` + } + if (value >= 1_000) { + return `${(value / 1_000).toFixed(1)}k` + } + return value.toLocaleString() +} + +export function formatCost(value: number | null): string { + if (value === null) { + return 'n/a' + } + return value < 0.01 ? `$${value.toFixed(4)}` : `$${value.toFixed(2)}` +} + +export function formatUpdatedAt(timestamp: number | null): string { + if (!timestamp) { + return 'Not scanned yet' + } + return `Updated ${new Date(timestamp).toLocaleString()}` +} + +export function formatSessionTime(timestamp: string): string { + const parsed = new Date(timestamp) + if (Number.isNaN(parsed.getTime())) { + return timestamp + } + return parsed.toLocaleString(undefined, { + month: 'short', + day: 'numeric', + hour: 'numeric', + minute: '2-digit' + }) +} diff --git a/src/renderer/src/i18n/locales/en.json b/src/renderer/src/i18n/locales/en.json index 3aa1f5c4c5c..74a6e581faa 100644 --- a/src/renderer/src/i18n/locales/en.json +++ b/src/renderer/src/i18n/locales/en.json @@ -3067,7 +3067,6 @@ "2f8298f3c3": "Stop scan", "c157f31a95": "Import as group", "40199ef7b3": "Group name", - "b20bb7c24f": "Keeps these repos together in one group. Best for related repos like microservices.", "787412361a": "What is a group name?", "5f857ba8e6": "in", "4df0d08cc5": "Found", @@ -3076,11 +3075,10 @@ "cf9d382ca1": "Import", "220dd32d83": "Scanning...", "fb33359f69": "Is this a monorepo?", - "d75170194e": "Choose this if these projects belong together. Orca will group them and let you work from the parent folder.", - "39d51212cc": "Monorepo name", - "e907ec8935": "What is a monorepo name?", + "d75170194e": "Import them as a group if they're a monorepo or otherwise belong together. Orca will group them and let you work from the parent folder.", + "39d51212cc": "Group name", "aa0247680d": "No, import separately", - "a0bc4d1f8e": "Yes, import as monorepo", + "a0bc4d1f8e": "Import as group", "8401a7a0d0": "1 repository", "d4f1df62ef": "{{value0}} repositories", "b4263a2ac4": "Found {{value0}} in {{value1}}.", @@ -3812,8 +3810,7 @@ "connectFailed": "Failed to connect to project.", "noRepos": "Add a Git project under this folder to attach GitHub or GitLab tasks.", "title": "Create Folder Workspace", - "createStart": "Create & Start Agent", - "create": "Create Workspace", + "create": "Create workspace", "sourceProject": "Task Source", "chooseSourceProject": "Choose task source" } diff --git a/src/renderer/src/i18n/locales/es.json b/src/renderer/src/i18n/locales/es.json index 2b241f59aa3..81cb458554c 100644 --- a/src/renderer/src/i18n/locales/es.json +++ b/src/renderer/src/i18n/locales/es.json @@ -3067,7 +3067,6 @@ "2f8298f3c3": "Detener escaneo", "c157f31a95": "Importar como grupo", "40199ef7b3": "Nombre del grupo", - "b20bb7c24f": "Mantiene estos repos juntos en un grupo. Lo mejor para repos relacionados como microservicios.", "787412361a": "¿Qué es el nombre de un grupo?", "5f857ba8e6": "en", "4df0d08cc5": "Encontró", @@ -3076,11 +3075,10 @@ "cf9d382ca1": "Importar", "220dd32d83": "Exploración...", "fb33359f69": "¿Es esto un monorepo?", - "d75170194e": "Elige esto si estos proyectos pertenecen juntos. Orca los agrupará y te permitirá trabajar desde la carpeta principal.", - "39d51212cc": "Nombre del monorepo", - "e907ec8935": "¿Qué es un nombre de monorepo?", + "d75170194e": "Impórtalos como grupo si son un monorepo o si pertenecen juntos. Orca los agrupará y te permitirá trabajar desde la carpeta principal.", + "39d51212cc": "Nombre del grupo", "aa0247680d": "No, importar por separado", - "a0bc4d1f8e": "Sí, importar como monorepo", + "a0bc4d1f8e": "Importar como grupo", "8401a7a0d0": "1 repositorio", "d4f1df62ef": "{{value0}} repositorios", "b4263a2ac4": "Se encontraron {{value0}} en {{value1}}.", @@ -3812,8 +3810,7 @@ "connectFailed": "Failed to connect to project.", "noRepos": "Add a Git project under this folder to attach GitHub or GitLab tasks.", "title": "Create Folder Workspace", - "createStart": "Create & Start Agent", - "create": "Create Workspace", + "create": "Create workspace", "sourceProject": "Task Source", "chooseSourceProject": "Choose task source" } diff --git a/src/renderer/src/i18n/locales/ja.json b/src/renderer/src/i18n/locales/ja.json index 9d09ce974ae..ee4e4641594 100644 --- a/src/renderer/src/i18n/locales/ja.json +++ b/src/renderer/src/i18n/locales/ja.json @@ -3048,7 +3048,6 @@ "2f8298f3c3": "スキャンの停止", "c157f31a95": "グループとしてインポート", "40199ef7b3": "グループ名", - "b20bb7c24f": "これらの repos を 1 つのグループにまとめます。マイクロサービスなどの関連 repos に最適です。", "787412361a": "グループ名とは何ですか?", "5f857ba8e6": "で", "4df0d08cc5": "見つかった", @@ -3057,11 +3056,10 @@ "cf9d382ca1": "輸入", "220dd32d83": "走査...", "fb33359f69": "これはモノレポですか?", - "d75170194e": "これらのプロジェクトがまとまっている場合は、これを選択してください。Orca がグループ化し、親フォルダーから作業できるようにします。", - "39d51212cc": "モノレポ名", - "e907ec8935": "モノレポ名とは何ですか?", + "d75170194e": "モノレポ、または一緒に扱うべきプロジェクトの場合は、グループとしてインポートします。Orca がグループ化し、親フォルダーから作業できるようにします。", + "39d51212cc": "グループ名", "aa0247680d": "いいえ、個別にインポート", - "a0bc4d1f8e": "はい、モノレポとしてインポート", + "a0bc4d1f8e": "グループとしてインポート", "8401a7a0d0": "1 個のリポジトリ", "d4f1df62ef": "{{value0}} 個のリポジトリ", "b4263a2ac4": "{{value1}} で {{value0}} が見つかりました。", @@ -3812,8 +3810,7 @@ "connectFailed": "Failed to connect to project.", "noRepos": "Add a Git project under this folder to attach GitHub or GitLab tasks.", "title": "Create Folder Workspace", - "createStart": "Create & Start Agent", - "create": "Create Workspace", + "create": "Create workspace", "sourceProject": "Task Source", "chooseSourceProject": "Choose task source" } diff --git a/src/renderer/src/i18n/locales/ko.json b/src/renderer/src/i18n/locales/ko.json index bdaa1af36f8..cece5c20d18 100644 --- a/src/renderer/src/i18n/locales/ko.json +++ b/src/renderer/src/i18n/locales/ko.json @@ -3048,7 +3048,6 @@ "2f8298f3c3": "스캔 중지", "c157f31a95": "그룹으로 가져오기", "40199ef7b3": "그룹 이름", - "b20bb7c24f": "이러한 repos를 하나의 그룹에 함께 유지합니다. 마이크로서비스와 같은 관련 repos 에 가장 적합합니다.", "787412361a": "그룹 이름은 무엇입니까?", "5f857ba8e6": "~에", "4df0d08cc5": "발견됨", @@ -3057,11 +3056,10 @@ "cf9d382ca1": "수입", "220dd32d83": "스캐닝...", "fb33359f69": "이 폴더가 모노레포인가요?", - "d75170194e": "이 프로젝트들이 함께 속한다면 이것을 선택하세요. Orca가 그룹으로 묶고 상위 폴더에서 작업할 수 있게 합니다.", - "39d51212cc": "모노레포 이름", - "e907ec8935": "모노레포 이름이란 무엇인가요?", + "d75170194e": "모노레포이거나 함께 속한 프로젝트라면 그룹으로 가져오세요. Orca가 그룹으로 묶고 상위 폴더에서 작업할 수 있게 합니다.", + "39d51212cc": "그룹 이름", "aa0247680d": "아니요, 별도로 가져오기", - "a0bc4d1f8e": "예, 모노레포로 가져오기", + "a0bc4d1f8e": "그룹으로 가져오기", "8401a7a0d0": "저장소 1개", "d4f1df62ef": "저장소 {{value0}}개", "b4263a2ac4": "{{value1}}에서 {{value0}}을(를) 찾았습니다.", @@ -3580,7 +3578,7 @@ "c1f4a31623": "{{value0}}개 하위 워크스페이스 표시", "e97297cb75": "{{value0}}개 하위 워크스페이스 숨기기", "0cd15956d4": "{{value0}}개 하위 워크스페이스 숨기기", - "bd37a57ac8": "Create workspace for {{value0}}", + "bd37a57ac8": "{{value0}}에 대한 워크스페이스 만들기", "b667b59632": "Some projects could not be removed from Orca", "f94466bc39": "{{value0}} of {{value1}} contained project{{value2}} remained after deleting the group.", "groupDeleteFailed": "Failed to delete group", @@ -3812,8 +3810,7 @@ "connectFailed": "Failed to connect to project.", "noRepos": "Add a Git project under this folder to attach GitHub or GitLab tasks.", "title": "Create Folder Workspace", - "createStart": "Create & Start Agent", - "create": "Create Workspace", + "create": "워크스페이스 만들기", "sourceProject": "Task Source", "chooseSourceProject": "Choose task source" } diff --git a/src/renderer/src/i18n/locales/zh.json b/src/renderer/src/i18n/locales/zh.json index cf83bcf754b..e257e257c4b 100644 --- a/src/renderer/src/i18n/locales/zh.json +++ b/src/renderer/src/i18n/locales/zh.json @@ -3048,7 +3048,6 @@ "2f8298f3c3": "停止扫描", "c157f31a95": "作为组导入", "40199ef7b3": "团体名称", - "b20bb7c24f": "将这些 repos 放在一组中。最适合微服务等相关 repos。", "787412361a": "什么是群组名称?", "5f857ba8e6": "在", "4df0d08cc5": "成立", @@ -3057,11 +3056,10 @@ "cf9d382ca1": "导入", "220dd32d83": "扫描...", "fb33359f69": "这是 Monorepo 吗?", - "d75170194e": "如果这些项目属于同一组,请选择此项。Orca 会将它们分组,并让你从父文件夹开始工作。", - "39d51212cc": "Monorepo 名称", - "e907ec8935": "什么是 Monorepo 名称?", + "d75170194e": "如果它们是 Monorepo,或本来就应该放在一起,请将它们作为组导入。Orca 会将它们分组,并让你从父文件夹开始工作。", + "39d51212cc": "组名称", "aa0247680d": "否,单独导入", - "a0bc4d1f8e": "是,作为 Monorepo 导入", + "a0bc4d1f8e": "作为组导入", "8401a7a0d0": "1 个仓库", "d4f1df62ef": "{{value0}} 个仓库", "b4263a2ac4": "在 {{value1}} 中找到 {{value0}}。", @@ -3580,7 +3578,7 @@ "c1f4a31623": "显示 {{value0}} 个子工作区", "e97297cb75": "隐藏 {{value0}} 个子工作区", "0cd15956d4": "隐藏 {{value0}} 个子工作区", - "bd37a57ac8": "Create workspace for {{value0}}", + "bd37a57ac8": "为 {{value0}} 创建工作区", "b667b59632": "Some projects could not be removed from Orca", "f94466bc39": "{{value0}} of {{value1}} contained project{{value2}} remained after deleting the group.", "groupDeleteFailed": "Failed to delete group", @@ -3812,8 +3810,7 @@ "connectFailed": "Failed to connect to project.", "noRepos": "Add a Git project under this folder to attach GitHub or GitLab tasks.", "title": "Create Folder Workspace", - "createStart": "Create & Start Agent", - "create": "Create Workspace", + "create": "创建工作区", "sourceProject": "Task Source", "chooseSourceProject": "Choose task source" } From 5cd8b26b15786bf7d02aced219be01ad5156011b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 18:32:56 +0000 Subject: [PATCH 3/4] release: v1.4.62 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c8abe6ee0d3..a10c6a6f3bd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "orca", - "version": "1.4.61", + "version": "1.4.62", "description": "Next-gen IDE for parallel agentic development", "homepage": "https://github.com/stablyai/orca", "author": "stablyai", From b4c304edc8cd019fee5103b36222e9b2d03998a0 Mon Sep 17 00:00:00 2001 From: Mantaroh Yoshinaga Date: Fri, 12 Jun 2026 03:40:17 +0900 Subject: [PATCH 4/4] fix(i18n): correct mistranslated Japanese (ja) UI strings (#5191) --- config/scripts/locale-ja-value-overrides.mjs | 72 +++- config/scripts/locale-key-overrides.mjs | 2 + config/scripts/locale-translation-policy.mjs | 70 +++- src/renderer/src/i18n/locales/ja.json | 382 +++++++++---------- 4 files changed, 333 insertions(+), 193 deletions(-) diff --git a/config/scripts/locale-ja-value-overrides.mjs b/config/scripts/locale-ja-value-overrides.mjs index 5fbe63ef235..5ea0babf420 100644 --- a/config/scripts/locale-ja-value-overrides.mjs +++ b/config/scripts/locale-ja-value-overrides.mjs @@ -153,5 +153,75 @@ export const JA_VALUE_OVERRIDES = { 'Enter a commit message to commit': 'コミットメッセージを入力してコミット', 'Choose parent folder...': '親フォルダーを選択...', 'Check for stuck work, stale generated files, failing validation, and anything that needs human attention. Report only actionable issues.': - 'スタックした作業、古い生成ファイル、検証の失敗、および人間の対応が必要なものがないか確認してください。対応が必要なイシューのみを報告してください。' + 'スタックした作業、古い生成ファイル、検証の失敗、および人間の対応が必要なものがないか確認してください。対応が必要なイシューのみを報告してください。', + // Round 6: homograph/term mistranslations surfaced by a full ja.json audit. + // Why: machine translation rendered UI terms as unrelated everyday words. + Smart: 'スマート', + Jobs: 'ジョブ', + Bold: '太字', + Strike: '取り消し線', + thread: 'スレッド', + Lead: 'リード', + Assignees: '担当者', + 'Assignees:': '担当者:', + Origin: 'オリジン', + Force: '強制', + Kind: '種類', + Address: 'アドレス', + Mouse: 'マウス', + Home: 'ホーム', + Move: '移動', + Change: '変更', + Conflicts: '競合', + conflict: '競合', + 'unresolved conflict': '未解決の競合', + 'Next match': '次の一致', + 'Previous match': '前の一致', + 'No matches': '一致なし', + 'New Issue': '新規イシュー', + 'Issue title': 'イシューのタイトル', + 'Sub-issue title': 'サブイシューのタイトル', + Merged: 'マージ済み', + Behind: '遅れ', + 'Head branch': 'ヘッドブランチ', + Import: 'インポート', + 'Import…': 'インポート…', + 'Import...': 'インポート...', + 'Re-import': '再インポート', + Local: 'ローカル', + local: 'ローカル', + 'Scanning...': 'スキャン中...', + Sparse: 'スパース', + sparse: 'スパース', + connection: '接続', + 'Est. cost': '推定コスト', + 'Est. API-equivalent cost': 'API 相当の推定コスト', + 'Est. spend': '推定費用', + Spend: '費用', + 'new markdown': '新規 markdown', + working: '実行中', + 'Working…': '処理中…', + On: 'オン', + Hold: 'ホールド', + 'Keep alive until reset': 'リセットされるまで維持', + Forward: '進む', + Fresh: '新規', + Gone: '削除済み', + Ding: 'ディン', + 'Take back': '操作を取り戻す', + 'Mobile driving': 'モバイルで操作中', + 'Mobile is driving this browser': 'モバイルがこのブラウザを操作しています', + 'Wants to run': '実行をリクエスト中', + 'No states found': 'ステータスが見つかりません', + 'Loading states': 'ステータスを読み込み中', + vibrancy: '透過効果', + ligature: '合字', + Zinc: 'ジンク', + Rose: 'ローズ', + import: 'インポート', + mouse: 'マウス', + 'Open job in GitLab': 'GitLab でジョブを開く', + 'Showing first 100 jobs': '最初の 100 件のジョブを表示しています', + 'Imported from Ghostty.': 'Ghostty からインポートしました。', + 'Claude Accounts': 'Claude アカウント' } diff --git a/config/scripts/locale-key-overrides.mjs b/config/scripts/locale-key-overrides.mjs index eeb60e93039..127930312cb 100644 --- a/config/scripts/locale-key-overrides.mjs +++ b/config/scripts/locale-key-overrides.mjs @@ -590,5 +590,7 @@ export const LOCALE_KEY_OVERRIDES = { zh: '已添加评审评论。', ja: 'レビューコメントを追加しました。' }, + // Port forwarding "Forward" is 転送, not the browser-navigation 進む. + 'auto.components.right.sidebar.PortsPanel.c9d106547a': { ja: '転送' }, ...KO_KEY_OVERRIDES } diff --git a/config/scripts/locale-translation-policy.mjs b/config/scripts/locale-translation-policy.mjs index cf6bc7ccf66..5d49b58eb20 100644 --- a/config/scripts/locale-translation-policy.mjs +++ b/config/scripts/locale-translation-policy.mjs @@ -82,7 +82,75 @@ export const NEVER_TRANSLATE_VALUES = new Set([ 'Nautilus', 'GitHub', 'no_proxy', - 'Beta' + 'Beta', + // Round 6: product/tool names, language names, and code tokens that machine + // translation wrongly localized (e.g. tailscale→尾鱗, Swift→迅速, yarn→糸). + 'Tailscale', + 'tailscale', + 'Ghostty', + 'ghostty', + 'pwsh', + 'yarn', + 'Kagi', + 'kagi', + 'Bitbucket', + 'bitbucket', + 'GNOME', + 'gnome', + 'iCloud', + 'icloud', + 'ripgrep', + 'PowerShell', + 'powershell', + 'Mermaid', + 'mermaid', + 'Swift', + 'swift', + 'Rust', + 'rust', + 'Java', + 'java', + 'Go', + 'Python', + 'python', + 'Kotlin', + 'kotlin', + 'Ruby', + 'ruby', + 'Bash', + 'bash', + 'GraphQL', + 'graphql', + 'ide', + 'IDE', + 'ui', + 'UI', + 'otlp', + 'OTLP', + 'calt', + 'ai', + 'AI', + 'ci', + 'REST', + 'rest', + 'yaml', + 'yml', + 'true', + 'false', + '/home/user', + '/home/user/project', + '/path/to/destination', + '.orca/issue-command', + 'PLAN.md', + 'feat/mobile-page', + 'sk-...', + 'main', + 'master', + 'HEAD', + 'lint', + 'MD', + '/home/user/projects', + 'Claude Code' ]) export const BRAND_MISTRANSLATIONS = { diff --git a/src/renderer/src/i18n/locales/ja.json b/src/renderer/src/i18n/locales/ja.json index ee4e4641594..ebb3e6827f1 100644 --- a/src/renderer/src/i18n/locales/ja.json +++ b/src/renderer/src/i18n/locales/ja.json @@ -626,7 +626,7 @@ "ecffebc251": "チェックが見つかりませんでした", "5dddefdf58": "GitHub で開く", "744197c84d": "このチェックではインライン出力は使用できません。", - "08d072664d": "求人", + "08d072664d": "ジョブ", "96d8f36798": "注釈", "485609c4f2": "チェック #", "0f478f5efa": "完了", @@ -737,7 +737,7 @@ "ce8a85d209": "デフォルト", "924c2fe05e": "破壊的な", "e2bf3e41a9": "コメント", - "28d0d3374f": "糸", + "28d0d3374f": "スレッド", "080d071d48": "@{{value0}} に返信", "86f809e2ce": "このレビュー スレッドに返信する", "136542c9ba": ":L{{value0}}", @@ -802,7 +802,7 @@ "d600c2619a": "ログの読み込み中", "028bde664e": "隠れる", "2f9b27f838": "ジョブログ", - "032ae1312b": "GitLab で求人を開く", + "032ae1312b": "GitLab でジョブを開く", "fa3e042203": "再試行", "f23ea85341": "解決済み", "4186685c78": "再開する", @@ -882,9 +882,9 @@ "d6b2f3d35b": "番号付きリスト", "c82917e06e": "箇条書きリスト", "ad1869bd54": "インラインコード", - "28fd951b83": "ストライク", + "28fd951b83": "取り消し線", "5666b4493d": "イタリック", - "caa88f50d0": "大胆な", + "caa88f50d0": "太字", "dddaa7a0a6": "見出し2", "e3f741d258": "見出し1", "68a41d5665": "本文", @@ -894,7 +894,7 @@ }, "LinearIssueTextEditor": { "947ba2d6f4": "保存する", - "04d73b72dc": "号名", + "04d73b72dc": "イシューのタイトル", "e8ff595db3": "{{value0}} を更新できませんでした", "1e08a1ec80": "タイトルは必須です", "00fa439dc7": "タイトル", @@ -924,7 +924,7 @@ "f9d4ef9807": "プロジェクトが更新されました", "38b80780c2": "プロジェクトのロードに失敗しました", "42589845bc": "作成", - "c182e02de5": "サブ号のタイトル", + "c182e02de5": "サブイシューのタイトル", "8c55d6696a": "サブイシューを追加する", "b25e453c9d": "サブイシューの作成に失敗しました", "aeed19d003": "{{value0}} を作成しました", @@ -961,8 +961,8 @@ "b5675b0694": "保存", "ceeb8c6153": "クリア", "fbb90300e2": "カスタム見積り", - "780ea6ed89": "州が見つかりません", - "59b6cd3706": "ロード状態", + "780ea6ed89": "ステータスが見つかりません", + "59b6cd3706": "ステータスを読み込み中", "64bfffc4dd": "ラベル", "dd304de85a": "プロパティ", "0be31fef8e": "推定値は負でない整数でなければなりません", @@ -995,7 +995,7 @@ "92e34f0311": "ローカル設定", "326a578923": "orca.yaml + ローカル", "2132b670da": "両方", - "0e587e31fb": "ヤムル", + "0e587e31fb": "yaml", "ac3748dcda": "名前または「作成元」", "f660aa1454": "接続中", "7711ad5122": "ローカルセットアップコマンド", @@ -1048,7 +1048,7 @@ "a053bdd082": "AI で失敗したチェックを修正する", "1b14d0a69c": "GitHub で開く", "1550675e5f": "このチェックではインライン出力は使用できません。", - "7720c9c3f5": "求人", + "7720c9c3f5": "ジョブ", "8432d17901": "注釈", "f01bf79a79": "チェック #", "000f90afcf": "完了", @@ -1155,7 +1155,7 @@ "19f19560d5": "破壊的な", "aae99c6c04": "PR", "e01e34f5fa": "コメント", - "345b68254c": "糸", + "345b68254c": "スレッド", "31a7b202f2": "@{{value0}} に返信", "408e634fbb": "このレビュー スレッドに返信する", "34b9f7c264": ":L{{value0}}", @@ -1172,7 +1172,7 @@ "7f964a365a": "レビュアーを削除" }, "QuickOpen": { - "1dbd3f59ff": "動く", + "1dbd3f59ff": "移動", "73b2c581f1": "閉じる", "95fccbae88": "ESC", "61b1c871a6": "オープン", @@ -1184,7 +1184,7 @@ "ec31e058f7": "ファイルに移動", "73b44e7bde": "インストールコマンドのコピー", "1cf8561ab4": "リモートで、gitignore 対応の高速リストを有効にします。", - "5d80dc39bb": "リップレップ", + "5d80dc39bb": "ripgrep", "2ca749c15d": "インストール", "4725b0e931": "クイック オープン スキャンが大きすぎます (", "b227d88520": "{{value0}} ファイルが見つかりました", @@ -1249,9 +1249,9 @@ "d2a876ca53": "担当者", "154b0fa623": "状態", "9bc8aea407": "説明を追加...", - "d9151fd4e9": "号名", + "d9151fd4e9": "イシューのタイトル", "4f3cb99f41": "チームを切り替える", - "c11105dac5": "新刊", + "c11105dac5": "新規イシュー", "1b59a07674": "作成...", "cf72580c04": "説明を書いたり、プロジェクトの概要を書いたり、アイデアを集めたり...", "2ea1c701b6": "対象日", @@ -1261,7 +1261,7 @@ "af9e877f30": "ラベルなし", "d6cda23ef1": "メンバー", "cfaadb6b22": "リードなし", - "34da8ac06c": "鉛", + "34da8ac06c": "リード", "579f98afcd": "短い要約を追加...", "ecbcc83140": "プロジェクト名", "b6795e65fd": "閉じる", @@ -1412,8 +1412,8 @@ "5ebff3a0aa": "なし", "d09bf34db7": "クローズ", "1c893195ac": "状態の更新に失敗しました", - "afc68824ff": "州が見つかりません", - "cc13109b5d": "ロード状態", + "afc68824ff": "ステータスが見つかりません", + "cc13109b5d": "ステータスを読み込み中", "d45a910c4a": "Linear状態を {{value0}} から変更します", "d8a517ad89": "識別子", "50387522d7": "グループ化なし", @@ -1433,7 +1433,7 @@ "7698af5263": "私の", "94f0339621": "私に割り当てられました", "c2268a9982": "全て", - "37a82eaaf8": "合併しました", + "37a82eaaf8": "マージ済み", "887efe9140": "接続", "a70153f583": "接続する", "6459faa8b3": "エラー", @@ -1518,8 +1518,8 @@ }, "TerminalSearch": { "db234b7519": "閉じる", - "7cb40c04eb": "次の試合", - "0f3066256e": "前回の試合", + "7cb40c04eb": "次の一致", + "0f3066256e": "前の一致", "42e466b9f1": "正規表現", "90c61387d9": "大文字と小文字を区別", "e07012f26e": "検索..." @@ -1561,7 +1561,7 @@ "522df222b9": "スピナー" }, "WorktreeJumpPalette": { - "ac037cfac2": "動く", + "ac037cfac2": "移動", "75499e01d9": "閉じる", "66b5a67bee": "ESC", "45def60329": "オープン", @@ -1610,9 +1610,9 @@ "1766eb46ba": "GitHub がこのPRがブロックされていると報告しています", "bf5e4c6c92": "ブロック中", "c614e2660a": "マージする前にブランチを更新する", - "039c072f94": "後ろに", + "039c072f94": "遅れ", "b37d45bca9": "GitHub がマージ競合を報告", - "7e8bbe3cd7": "紛争", + "7e8bbe3cd7": "競合", "09896aad26": "この PR ではマージ ステータスを利用できません", "bd4f27b50e": "マージ", "35ec24bc43": "このベース ブランチは GitHub マージ キューを使用します", @@ -1625,7 +1625,7 @@ "820fd21663": "このPRは終了しました", "4f976d3450": "クローズ", "62eb8d39da": "このPRはすでにマージされています", - "83ecdbb4a6": "合併しました", + "83ecdbb4a6": "マージ済み", "331ebe1170": "このPRを GitHub マージ キューに追加します", "b169f943e1": "準備ができたらマージ", "62703b1dc4": "このPRでは GitHub 自動マージが有効になっています", @@ -1739,7 +1739,7 @@ "dialog": { "AssigneesEditor": { "529fec247b": "読み込み中…", - "98914e6b36": "譲受人:", + "98914e6b36": "担当者:", "94a4e6e4fa": "なし" }, "Comments": { @@ -1779,7 +1779,7 @@ "d6aeb2012b": "からのイシューを表示しています", "787c970baf": "イシューソース", "643d7e9496": "上流", - "51d1608920": "起源", + "51d1608920": "オリジン", "cdc9bd64fa": "コンパクト", "30b2c9df91": "上流" }, @@ -1819,7 +1819,7 @@ "2b2f019091": "どの州でも", "0fd3249e2e": "クローズ", "d78b60b5c2": "オープン", - "bd162b7d5a": "合併しました", + "bd162b7d5a": "マージ済み", "2e639b84fa": "レビュアー", "712c5abdbf": "ラベル", "4e50c7bc03": "担当者", @@ -1839,11 +1839,11 @@ "6da1858354": "左 · リセット", "f42790d150": "の", "01f7323e58": "グラフQL API", - "1daf0f22a9": "グラフQL", + "1daf0f22a9": "GraphQL", "1f2f28a4de": "検索API", "c377a4f06a": "検索", "c392c749a6": "REST API", - "bb227706a6": "休む" + "bb227706a6": "REST" } } } @@ -1883,7 +1883,7 @@ "c5f79616c3": "チーム", "25a2196732": "ターゲット", "3fb6473111": "始める", - "111bef9aa8": "鉛", + "111bef9aa8": "リード", "3be47aed6f": "優先度", "f5ef24cf46": "健康", "9ddb58edbd": "状態", @@ -1939,7 +1939,7 @@ "options": { "e38b0a2e68": "ビープ", "0acd3d384e": "カタカタ", - "79919c832d": "丁", + "79919c832d": "ディン", "2b44847d8d": "ブロップ", "020826ef17": "ソナー", "588c90487d": "ブリップ", @@ -2118,8 +2118,8 @@ "78b79d854d": "Terminal を閉じますか?" }, "MobileDriverOverlay": { - "c6460cf584": "取り戻す", - "c44659e09f": "移動運転", + "c6460cf584": "操作を取り戻す", + "c44659e09f": "モバイルで操作中", "7cffad954c": "折りたたむ", "3eed73394f": "キーボードが一時停止しています", "faa367dc74": "この terminal はモバイル アプリに合わせたサイズになっています" @@ -2332,7 +2332,7 @@ "d1afac112b": "WSL", "efb33546ff": "Git Bash", "1a8af49530": "CMDプロンプト", - "2148f65e04": "パワーシェル", + "2148f65e04": "PowerShell", "ab589350e5": "{{value0}} の起動コマンドを構築できませんでした。" }, "TabBarCreateEntry": { @@ -2389,7 +2389,7 @@ "cce7ef1d2c": "web", "5f17fb9d0c": "markdown", "44caaf7b36": "md", - "fb50e3d874": "new markdown", + "fb50e3d874": "新規 markdown", "6d8b6b4117": "new file", "b330f72434": "mark", "37ff3ddca1": "open markdown", @@ -2508,7 +2508,7 @@ "bc5a3fd41a": "部分的", "3d0128b105": "接続されています", "fd9a3c600e": "エラー", - "fbb3f9f05e": "コンフリクト", + "fbb3f9f05e": "競合", "95e4ff5b4b": "押す", "63a2b965f6": "引っ張る" }, @@ -2617,8 +2617,8 @@ "eee5240810": "ワークスペースが削除されました", "9afc97f9a3": "ワークスペースが削除されました", "792a214457": "ワークスペースの削除", - "a998501630": "力", - "9155381019": "まばらな", + "a998501630": "強制", + "9155381019": "スパース", "f39d291997": "選択", "16988df079": "ファイルが見つかりませんでした。", "b25c2c1086": "最上位の項目", @@ -2726,7 +2726,7 @@ "c3fdbc5474": "最上位モデル:", "0f394c24e3": "モデル別", "51ae85fa00": "キャッシュの再利用率は、キャッシュ読み取りトークン / (入力トークン + キャッシュ読み取りトークン) として計算されます。", - "b26d4ddb58": "EST(東部基準時。 API相当コスト", + "b26d4ddb58": "API 相当の推定コスト", "0f3e696ca9": "セッション/ターン", "8cc23be4a3": "ゼロキャッシュ読み取りターン", "1634c4f404": "キャッシュ再利用率", @@ -2776,7 +2776,7 @@ "95d2d89285": "最上位モデル:", "5a0d1d69cd": "モデル別", "94ac1f1ee7": "見やすくするために推論トークンが表示されていますが、コストはキャッシュされていない入力、キャッシュされた入力、および出力からのみ計算されます。", - "1a18fbd56b": "EST(東部基準時。 API相当コスト", + "1a18fbd56b": "API 相当の推定コスト", "907b31865f": "セッション/イベント", "6e18146e9b": "推論出力", "a9ac0f423a": "キャッシュされた入力", @@ -2850,7 +2850,7 @@ "66c83284cf": "デイリートークン", "b760c0b622": "最上位モデル", "2d9eb39264": "総トークン数", - "beb6f24f37": "EST(東部基準時。料金", + "beb6f24f37": "推定コスト", "da62578d9d": "使用法", "0eb31e79ee": "OrcaIDE", "960324e9b8": "イベント", @@ -2879,7 +2879,7 @@ "60002bb22f": "ローカルの Claude、Codex、または OpenCode の使用法はまだ見つかりません。概要は、次の agent セッションがトークン ログを書き込んだ後に表示されます。", "70f36452d4": "キャッシュシェア", "327603fe8b": "アクティブ日数", - "0eaf937335": "EST(東部基準時。料金", + "0eaf937335": "推定コスト", "3887b94ce5": "総トークン数", "2d13e57f72": "OpenCodeを有効にする", "2f1ee2878b": "Codexを有効にする", @@ -2991,7 +2991,7 @@ "984405683f": "プラグイン", "4d177feabd": "同梱", "aa59462502": "リポジトリ", - "571c5818c1": "家", + "571c5818c1": "ホーム", "0bc1379f4c": "すべてのソース", "38e0951c3a": "Agent のスキル", "fb6bf60b52": "Claude", @@ -3009,10 +3009,10 @@ "ab5b777350": "ローカル ホーム、リポジトリ、バンドル、プラグイン スキル フォルダを確認しました。", "08a321a984": "検索またはフィルターを調整します。", "4acd6d68ec": "ローカルスキルが見つかりません", - "6a62a0168c": "一致しません", + "6a62a0168c": "一致なし", "cd7893fbc1": "スキャンスキル", "35b9a724a0": "利用可能", - "0c74e7ff34": "地元" + "0c74e7ff34": "ローカル" } }, "sidebar": { @@ -3053,8 +3053,8 @@ "4df0d08cc5": "見つかった", "8db50afe1a": "フォルダーからリポジトリをインポートする", "5b2e6fe3c8": "個別にインポート", - "cf9d382ca1": "輸入", - "220dd32d83": "走査...", + "cf9d382ca1": "インポート", + "220dd32d83": "スキャン中...", "fb33359f69": "これはモノレポですか?", "d75170194e": "モノレポ、または一緒に扱うべきプロジェクトの場合は、グループとしてインポートします。Orca がグループ化し、親フォルダーから作業できるようにします。", "39d51212cc": "グループ名", @@ -3067,7 +3067,7 @@ }, "AddRepoRemoteStep": { "5b205b5281": "スキャンの停止", - "6680289908": "/ホーム/ユーザー/プロジェクト", + "6680289908": "/home/user/project", "ef410aa881": "リモートパス", "0416bde073": "設定を追加", "df6fbcf880": "SSH ターゲットが構成されていません。", @@ -3084,7 +3084,7 @@ "e1710bf831": "フォルダーとして開く", "8da4d1a5be": "Gitプロジェクトの追加", "ac66a3ed2d": "サーバーのファイルシステムを参照する", - "92d25420a0": "/ホーム/ユーザー/プロジェクト", + "92d25420a0": "/home/user/project", "867692f505": "サーバーパス", "423b5d3d31": "選択したランタイム サーバーに既に存在する Git リポジトリまたはフォルダーを追加します。", "3d0c035483": "サーバープロジェクトを開く", @@ -3114,7 +3114,7 @@ "AddRepoSteps": { "569326d9cc": "フォルダーを選択", "a93ef169b5": "サーバーのファイルシステムを参照する", - "2ce3f6edf8": "/パス/宛先/宛先", + "2ce3f6edf8": "/path/to/destination", "04a4c4e84a": "クローンの場所", "b698a4a29d": "https://github.com/user/repo.git", "3d4acbe693": "Git URL", @@ -3137,10 +3137,10 @@ }, "CreateProjectLocationField": { "95548e33bf": "親フォルダーを選択...", - "632b456b1b": "変化", + "632b456b1b": "変更", "afaf54f245": "親フォルダーを変更する", "f520f83a97": "サーバーのファイルシステムを参照する", - "2a20a603a3": "/ホーム/ユーザー/プロジェクト", + "2a20a603a3": "/home/user/projects", "134e37f711": "位置", "b589b77997": "ディレクトリに移動し、「選択」をクリックして選択します。" }, @@ -3461,7 +3461,7 @@ "6f09f58541": "ワークスペースの削除", "0777de5970": "プライマリ ワークツリー (元のクローン ディレクトリ)", "0f33af979b": "部分的なチェックアウト。これらのパスの外にあるファイルはディスク上にありません。", - "4f964d5e8c": "まばらな", + "4f964d5e8c": "スパース", "7d517f82e2": "主要な", "c6833b5187": "最初の agent メッセージから名前が変更されます", "f62a3dadbc": "名前変更が保留中", @@ -3622,7 +3622,7 @@ }, "WorktreeVisibilityDialog": { "83a5ba8dd1": "Orca 以外のワークツリー", - "f1f71b9f02": "輸入", + "f1f71b9f02": "インポート", "759371df43": "隠れる", "25ddf19920": "{{value0}} をインポートできます", "8372e4bbd9": "現在表示されている{{value0}}", @@ -3746,8 +3746,8 @@ "1a9383112b": "Conductor 進捗", "caebe3c10f": "Conductor レビュー", "895f381714": "Conductor 完了", - "caabd5ca85": "亜鉛", - "7adb43ecf0": "薔薇", + "caabd5ca85": "ジンク", + "7adb43ecf0": "ローズ", "ddf25b6262": "エメラルド", "7cebab6d4a": "アンバー", "1b81da243a": "バイオレット", @@ -3901,7 +3901,7 @@ "3455cf43fa": "Claudeのログイン。", "fcc4093fc1": "現在の {{value0}} Codex ログインを使用します。", "79e484c3b2": "共有Claude認証ファイル用のオプションのアカウント スイッチャー。", - "8bbfd74556": "Claude・アカウント", + "8bbfd74556": "Claude アカウント", "72b36ea174": "オプション。 Orca は通常の Claude ログインを使用できます。チャット セッションを移動せずにすばやく切り替えたい場合にのみアカウントを追加。", "26ef4b55be": "Claude", "2743cdc0af": "Claudeアカウントの更新に失敗しました。", @@ -4117,7 +4117,7 @@ "64898ecdab": "作成", "7b649a578a": "作成…", "4399c77caa": "デフォルト", - "4af9a17947": "かぎ" + "4af9a17947": "kagi" }, "BrowserProfileRow": { "8e636cae25": "プロファイル「{{value0}}」が削除されました。", @@ -4170,8 +4170,8 @@ "2ea4617e3a": "{{value1}}{{value2}} から {{value0}} クッキーをインポートしました。", "721aee31b4": "Orca CLIをPATHに登録しました。", "180a9abf3a": "CLI ステータスのロードに失敗しました。", - "2ccfc9cff8": "輸入", - "0462565413": "逆輸入", + "2ccfc9cff8": "インポート", + "0462565413": "再インポート", "de9b2f32f3": "有効化", "ad8cb0ee22": "パスを修正する", "0289434ed6": "有効", @@ -4255,7 +4255,7 @@ "34d0348e34": "生成する", "8cd2be0948": "メッセージ", "ca433708cb": "commit", - "0b7eafe55f": "あい", + "0b7eafe55f": "ai", "2c5436c018": "開く", "6c84ba6de3": "テンプレート", "ebed4d2a29": "下書き", @@ -4529,13 +4529,13 @@ "8a527d48e3": "gitlab", "aa204f185f": "現在の GitHub CLI REST、Search、および GraphQL のレート制限。", "612a440e57": "GitHub API の予算", - "2cde9044a8": "グラフキュール", + "2cde9044a8": "graphql", "36e3de3619": "古い歴史と比較することから。ブランチに commits されていない変更またはローカルのみの commits がある場合、Orca は更新をスキップします。", "d072a12995": "git diff main...HEAD", "db3a127eb1": "。これにより、次のようなコマンドが保持されます", - "3ae3de8898": "マスター", + "3ae3de8898": "master", "5bf885be48": "または", - "ffba483bae": "主要", + "ffba483bae": "main", "976afc6b3e": "ワークスペースを作成すると、Orca はリモート ベースを更新し、一致するローカル ブランチを安全に早送りします。", "1ec5c91e1d": "ブランチ名に Git ユーザー名を使用するか、カスタム プレフィックスを使用するか、プレフィックスを使用しないかを選択します。", "330f584b50": "ブランチプレフィックス", @@ -4591,7 +4591,7 @@ "44cde4aa01": "ORCA_BITBUCKET_API_TOKEN", "a6c2816115": "そして", "b8a7efb3f6": "ORCA_BITBUCKET_EMAIL", - "8489c0aa49": "ビットバケット", + "8489c0aa49": "Bitbucket", "e74de656ce": "glab認証ログイン", "05e5245af7": "GitLab CLI はインストールされていますが、認証されていません。terminal で次のコマンドを実行します。", "a83cac5726": "GitLab CLI をインストールする", @@ -4749,7 +4749,7 @@ "87985ba6f5": "このネットワーク インターフェイス メニューで、Tailscale アドレス (通常は 100.x.y.z IP) を選択します。", "1f7c26d36a": "両方のデバイスで同じテールネットにサインインします。", "668016be7a": "コンピューターとスマートフォンで。", - "1dc87a7fbc": "テールスケール", + "1dc87a7fbc": "Tailscale", "51d29927eb": "インストール", "9fc5d203ff": "Orca Mobile はこのコンピュータに直接接続します。同じローカル ネットワークから離れた場所で使用するには、コンピューターとスマートフォンを同じプライベート オーバーレイ ネットワーク上に配置し、そのネットワーク アドレスを選択して QR コードを生成します。", "39fad211d9": "テールネットを使用して Wi-Fi の外部に接続する", @@ -4826,7 +4826,7 @@ "fa83512e48": "キーの保存", "07b26f2742": "クリアキー", "d246b2bdb3": "ローカル ランタイム キーは、利用可能な場合は Electron 暗号化ストレージを使用して ~/.orca に保存されます。", - "c3380e4ca5": "スク...", + "c3380e4ca5": "sk-...", "2f797018f0": "APIキーが設定されました", "16015322f9": "APIキー", "07ed3e512e": "音声は、OpenAI 音声モデルが選択されている場合にのみ OpenAI に送信されます。", @@ -4930,7 +4930,7 @@ "fe904ac984": "匿名の使用状況データを共有する", "77410e0566": "プライバシーポリシー", "8bfdd23a88": "次に何を構築するかを考えるのに協力してください。 Orca は、使用した機能と問題が発生した場所の匿名のカウントを送信します。", - "afec8b03be": "シ" + "afec8b03be": "ci" }, "QuickCommandsPane": { "8764c6e9e4": "{{value0}} を削除", @@ -4988,7 +4988,7 @@ "5d940bde5c": "ローカルスクリプトを追加", "8c2893fae0": "単一のシェル スクリプトとして実行されます。このマシンに保存されます。", "40a446ae16": "- あなただけのために、このマシンで", - "2d03a514db": "地元", + "2d03a514db": "ローカル", "7e4427b4a2": "変えること。", "b113344b6a": "編集", "f828e1de19": "- チームと共有", @@ -5105,14 +5105,14 @@ }, "RepositorySourceControlAiEnablement": { "84233d1bb3": "オフ", - "bea897eec2": "の上", + "bea897eec2": "オン", "62511a575d": "グローバルを使用する", "30ae6dcce8": "グローバルデフォルトは", "cf5959c834": "ソース管理 AI が有効になっている" }, "RepositorySourceControlAiHostedReviewDefaults": { "053ccfbf52": "オフ", - "777443bf89": "の上", + "777443bf89": "オン", "ffc3b26b26": "グローバルを使用する", "a68849a859": "グローバルデフォルトは", "aa6ee4b7d6": "ホスト型レビュー作成のデフォルト", @@ -5426,7 +5426,7 @@ "SshPane": { "c0f1c80166": "SSH ターゲットが構成されていません。", "639ceb3698": "ターゲットの追加", - "51d7dba44d": "輸入", + "51d7dba44d": "インポート", "a7d28dff81": "Orca で接続するリモート ホストを追加します。", "94c5284560": "ターゲット", "f495689b82": "インポートに失敗しました", @@ -5494,7 +5494,7 @@ "1b19b00e93": "(7日間)。", "137e88ce8d": "切断後にリレーが terminals を存続させる期間。デフォルト: 10800 (3 時間)。最大:", "b574994adc": "リモート terminals は、終了するかリレーをリセットするまで使用可能です。", - "71fc546097": "リセットされるまで生き続ける", + "71fc546097": "リセットされるまで維持", "92f80edbfd": "リレー猶予期間 (秒)", "feae1d1e69": "オプション。 ProxyJump / ssh -J と同等。", "11bcb4507a": "バスティオン.example.com", @@ -5551,7 +5551,7 @@ "70beb1bbc7": "プレビュー", "31f6e61085": "リガチャーは現在、", "870377082f": "オフ", - "84bd22f2cd": "の上", + "84bd22f2cd": "オン", "bc9ff84d61": "自動", "be8da35e7f": "フォントの合字", "4b1f29598e": "自動 - 「{{value0}}」では無効になります。", @@ -5629,7 +5629,7 @@ "8eefeaa3da": "フォーカスはマウスに追従します", "96fe15def8": "terminal ペインのマウスとクリップボードの動作。", "45721f3e67": "Terminal の相互作用", - "9c0b1c1792": "の上", + "9c0b1c1792": "オン", "c1fc9e9444": "GPU アクセラレーション", "e0996d141a": "自動では、サポートされていないレンダラーまたは危険なレンダラーに対して DOM フォールバックを使用して、WebGL を試行します。", "7eaccc1424": "WebGL は terminal ペインに対して常に試行されます。", @@ -5645,14 +5645,14 @@ "b637dd57a7": "WSL", "f61ac77f16": "Git Bash", "0f1b8669e6": "コマンドプロンプト", - "eb7fc4d98a": "パワーシェル", + "eb7fc4d98a": "PowerShell", "27e301f22c": "デフォルトのシェル", "09bf02de9a": "新規 terminals ペインを開くときに使用されるシェル。新規 terminals に対して有効になります。", "bd68f3170d": "Windows 上の新規 terminal ペインのデフォルト シェルを選択します。", "a55eee649f": "Windows 上の新規 terminal ペインのデフォルト シェル。", "87e678a8af": "Windows シェル", - "05efc0bada": "真実", - "348246b06f": "間違い", + "05efc0bada": "true", + "348246b06f": "false", "5936387ddd": "自動", "adbafefe56": "カスタム", "16753eea48": "Windows では、右クリックしてクリップボードを貼り付けます。 Ctrl キーを押しながら右クリックすると、コンテキスト メニューが開きます。", @@ -5784,7 +5784,7 @@ "d504ab05f0": "ストリーミング", "fbe5990716": "モデルの選択", "e24f7d43d2": "音声モデルを選択します。ローカル モデルはオフラインで実行されます。クラウド モデルには API キーが必要です。", - "174da92062": "所有", + "174da92062": "ホールド", "118b3c2dee": "トグル", "901985625d": "トグル", "ad5d036ecc": "マイクの許可を要求できませんでした。音声ディクテーションが有効になっていませんでした。", @@ -5871,7 +5871,7 @@ "17c5d244eb": "Codexアカウント", "e14049e1a8": "claude", "dd75a73991": "共有チャット コンテキストを維持しながら、Claudeのオプションのアカウント切り替え。", - "75682e1b62": "Claude・アカウント", + "75682e1b62": "Claude アカウント", "e02c136ad0": "認証", "9f70aa706c": "プロバイダー", "488a7e9206": "リナックス", @@ -5931,7 +5931,7 @@ "dbc8aca6b0": "スリープ", "845ad9128a": "電源", "48f84d10f1": "実行中", - "affbf130f6": "作業中", + "affbf130f6": "実行中", "0d1c334987": "蓋", "ff8de8a2ad": "ディスプレイ", "0d752916f8": "フック", @@ -5999,9 +5999,9 @@ "bce3ac317a": "git", "7164edf71a": "ファイル エクスプローラーで .gitignore と一致する Dim ファイル。", "f8129fb544": "Git で無視されたファイルを表示する", - "2f12e1aa3a": "ウイ", + "2f12e1aa3a": "ui", "5095258df2": "インターフェース", - "fab91464dd": "いで", + "fab91464dd": "ide", "8b36fb3f64": "タイポグラフィ", "a0e09aed9c": "書体", "24094af355": "フォント", @@ -6034,7 +6034,7 @@ "81ef5abc2f": "CPU、メモリ、terminal セッション、ワークスペース ディスクの使用状況をステータス バーに表示します。", "7cf005b29f": "リソースマネージャー", "fe192b060e": "ホスト", - "f4997e0f8a": "繋がり", + "f4997e0f8a": "接続", "a278406ed5": "リモート", "6ecad74eb3": "ssh", "f17d66d0d2": "アクティブな SSH 接続ステータスをステータス バーに表示します。", @@ -6104,7 +6104,7 @@ "75a0d435b7": "クロム", "854ef6ce83": "ログイン", "3910a41f32": "認証", - "2e7f951773": "輸入", + "2e7f951773": "インポート", "66dd641a47": "セッション", "29193a51d5": "クッキー", "2d2d995c58": "ブラウザ", @@ -6131,7 +6131,7 @@ "8b8ed06e4b": "オムニボックス", "3538b3aaeb": "トークン", "0732ebe6fb": "プライベート", - "e1c2a57f07": "かぎ", + "e1c2a57f07": "kagi", "ad40e75d13": "ビング", "1f8153acfb": "アヒルアヒル", "8a489aab8d": "グーグル", @@ -6161,7 +6161,7 @@ "088e7a9012": "クロム", "96ce3d2de2": "認証", "48557f639c": "ログイン", - "d5ad1f7aad": "輸入", + "d5ad1f7aad": "インポート", "02837ee497": "セッション", "fb8178824f": "クッキー", "ba4eb53b72": "ブラウザの使用", @@ -6204,7 +6204,7 @@ "d32936bb2a": "ブランチ", "127d512e75": "commit", "d22a6459e4": "衝突", - "53e8504fb2": "シ", + "53e8504fb2": "ci", "c46e665f7e": "チェック", "37c65bbb44": "修正", "402f101af8": "プロンプト", @@ -6220,7 +6220,7 @@ "542e1a00a7": "codex", "f121bec167": "claude", "93e5210da8": "メッセージ", - "c33cb1b982": "あい", + "c33cb1b982": "ai", "0b946b2abe": "ソース管理の commit、PR、ブランチ名、および修正操作の操作 レシピを追加します。", "24dbdfca78": "ソース管理 AI 操作を表示する" } @@ -6252,7 +6252,7 @@ "c4a4a02ea4": "USB", "fa3239cd42": "ローカルネットワーク", "acad3d4743": "terminal セッションから使用されるデバイスおよびローカル ネットワーク ツールを許可します。", - "3e0131e45d": "アイクラウド", + "3e0131e45d": "icloud", "ce07159ff5": "デスクトップ", "a0c19119fb": "ダウンロード", "4438f81bfa": "書類", @@ -6507,7 +6507,7 @@ "4808f065b3": "gitlab", "2b4a72885d": "現在の GitLab CLI REST レート制限ヘッダー (利用可能な場合)。", "83ecb3f470": "GitLab API の予算", - "65b69d9f80": "グラフキュール", + "65b69d9f80": "graphql", "1139f61512": "現在の GitHub CLI REST、Search、および GraphQL のレート制限。", "ff86e354c4": "GitHub API の予算", "035134fcd9": "ワークツリー", @@ -6520,8 +6520,8 @@ "c41e345153": "メインの後ろ", "6ee3cfff02": "git diff", "564942ffc5": "原点/メイン", - "28192e3a63": "マスター", - "e3e9adde59": "主要", + "28192e3a63": "master", + "e3e9adde59": "main", "0e993bf00f": "ワークスペースを作成すると、Orca はリモート ベースを更新し、メインやマスターなどの一致するローカル ブランチを安全に早送りします。これにより、 git diff main...HEAD などのコマンドが古い履歴と比較されなくなります。ブランチに commits されていない変更またはローカルのみの commits がある場合、Orca は更新をスキップします。", "f8bda25f29": "ローカルメインを最新の状態に保つ", "769ddd7f81": "カスタム", @@ -6573,7 +6573,7 @@ "b38b5d27f1": "Azure DevOps", "7b1f3984bb": "トークン環境変数による Azure DevOps Repos 認証。", "af6611fa6e": "Azure DevOps 連携", - "50d20817f7": "ビットバケット", + "50d20817f7": "bitbucket", "c97d58a0f3": "API トークン環境変数を介した Bitbucket クラウド認証。", "67a2a0e868": "Bitbucket 連携", "371ee914d2": "MR", @@ -6682,7 +6682,7 @@ "d0c89bc4a9": "かぶせる", "87711f4b8f": "VPN", "16bff559a0": "テールネット", - "c690e3ee38": "尾鱗", + "c690e3ee38": "tailscale", "a023683767": "インターフェース", "7b37c2e557": "ネットワーク", "3190ef67a4": "モバイル ペアリングに使用するネットワーク アドレスを選択します。", @@ -6792,7 +6792,7 @@ "d8191ae5ca": "環境変数", "94e04427f6": "環境", "664f1a8984": "継続的インテグレーション", - "5854a5c752": "シ", + "5854a5c752": "ci", "69637f4dc4": "orca_telemetry_disabled", "058550f6bc": "追跡しない", "83a6cd79b3": "追跡しない", @@ -6800,7 +6800,7 @@ "e058a3c98d": "テレメトリ環境変数", "1686c07fee": "サポート", "4a583f3a2f": "オープンテレメトリー", - "9ea93ce3d6": "オットルプ", + "9ea93ce3d6": "otlp", "685c68a81f": "ログ", "40de3c2f19": "トレース", "c0494ff48a": "診断", @@ -6824,7 +6824,7 @@ "quick": { "commands": { "search": { - "3c316e6ef8": "糸", + "3c316e6ef8": "yarn", "b86c727100": "npm", "b949a7c0a0": "pnpm", "0b78c4a165": "起動", @@ -6846,7 +6846,7 @@ }, "repository": { "search": { - "bc7e504b8e": ".orca/イシューコマンド", + "bc7e504b8e": ".orca/issue-command", "603c68b68c": "orca.yaml", "9dc60d7f6d": "github", "ec70364df2": "ワークフロー", @@ -6864,12 +6864,12 @@ "f1e1bfa89f": "ソース", "1d90a6cfbb": "両方", "fcb8fa8144": "共有", - "0432d2fb7c": "地元", + "0432d2fb7c": "ローカル", "ed269fad69": "コマンドソース", "19f58d6d89": "詳細設定", "d141897c90": "コマンド ソースと orca.yaml の詳細。", "cc11699c3d": "詳細設定", - "bf460fded8": "ヤムル", + "bf460fded8": "yaml", "9cad92fe77": "orca.yaml フック", "6b80f7d3c8": "ローカル設定スクリプト", "a1a4c51d58": "アーカイブコマンド", @@ -6906,7 +6906,7 @@ "8068d8d0f1": "PR", "5ff7fe1ade": "PR", "eec39b3de6": "commit メッセージ", - "cfad7ce5f3": "あい", + "cfad7ce5f3": "ai", "a47f51127e": "ソース管理", "6cc5c65e64": "プロジェクト固有の git 生成のオーバーライド。", "eec3995dc6": "Git AI Author", @@ -6921,7 +6921,7 @@ "9f5ae26ccd": "プリセット", "095fca94fe": "プリセット", "aa42616e3d": "チェックアウト", - "4f3c0230c2": "まばらな", + "4f3c0230c2": "スパース", "90a331fd68": "スパースワークツリー作成用に保存されたディレクトリセット。", "1f0f20bbb6": "スパースチェックアウトプリセット", "4733ec2395": "../ワークツリー", @@ -6976,7 +6976,7 @@ "ca6a0c2df7": "ショートカット", "4811a8264a": "terminal ファースト", "afda131738": "orca first", - "0ecfc47434": "コンフリクト", + "0ecfc47434": "競合", "0f8cb15582": "agent", "f1adebbe8c": "シェル", "7f1b38f59a": "トゥイ", @@ -6989,14 +6989,14 @@ "ssh": { "search": { "d41f296f64": "ピング", - "237b391f7c": "繋がり", + "237b391f7c": "接続", "8cb870b109": "テスト", "7efd17e816": "ssh", "96ca5d9a0b": "SSH ターゲットへの接続をテストします。", "a3058f3605": "テスト接続", "2cd40ba0d0": "ホスト", "5220501141": "構成", - "3b12e064a4": "輸入", + "3b12e064a4": "インポート", "7f251a45a8": "~/.ssh/config からホストをインポートします。", "41a3127094": "SSH 構成からインポート", "f9493b80c0": "サーバ", @@ -7043,7 +7043,7 @@ "62d1208b90": "オシレーター52", "459fea094a": "terminal 内のプログラムを OSC 52 (SSH 経由を含む) 経由でシステム クリップボードにコピーします。", "74db8721e4": "TUI クリップボードへの書き込みを許可する (OSC 52)", - "4043e294d2": "ノーム", + "4043e294d2": "gnome", "cf83ac3dbd": "リナックス", "737cef6de1": "×11", "e87c6d776d": "自動", @@ -7077,7 +7077,7 @@ "6eaf7ee0e4": "cursor", "34fe1af39d": "タイピング", "ee611ae238": "非表示", - "ea364ce6e4": "ねずみ", + "ea364ce6e4": "マウス", "77201c0bb2": "terminal に入力するときにマウス カーソルを非表示にします。", "d1fe5f99ff": "入力中にマウスを非表示にする", "f25d948664": "マージン", @@ -7087,7 +7087,7 @@ "692c4ad032": "垂直パディング", "75691e4911": "terminal グリッドの周囲の水平方向のパディング (ピクセル単位)。", "b4f182f24d": "水平方向のパディング", - "6c2f9f05c8": "活気", + "6c2f9f05c8": "透過効果", "4f7f8f28ca": "透明性", "f6dd9ff606": "背景", "71eb45e293": "ぼかし", @@ -7116,8 +7116,8 @@ "6f5d486a68": "セッションの管理", "10f9fb6fea": "設定", "2ade3ea490": "構成", - "fd752b3cac": "輸入", - "82b63d07fe": "幽霊っぽい", + "fd752b3cac": "インポート", + "82b63d07fe": "ghostty", "73e9422f19": "サポートされている Ghostty terminal 設定の 1 回限りのインポート。", "a979df0083": "Ghostty からインポート", "warp_import": { @@ -7212,12 +7212,12 @@ "8f9f953de7": "terminal が xterm.js WebGL レンダリングを使用するかどうかを制御します。レンダラーがサポートされている場合、自動は WebGL を試行します。ソフトウェアまたは不明な GPU レンダラーには保守的なフォールバックが使用されます。", "13a2502dfc": "GPU アクセラレーション", "d5e6c7fab1": "フォント特性", - "a16224d16a": "カルト", + "a16224d16a": "calt", "6ded6297fe": "ヨセフカ", "e3aeea308e": "カスカディアコード", "35c2311a33": "ジェットブレインモノ", "7f7640c29e": "フィラコード", - "7ab424c4d3": "結紮", + "7ab424c4d3": "合字", "afc8d5f790": "合字", "103cdb862f": "タイポグラフィ", "893aa92997": "同梱されているフォントのプログラミング合字 (例: => → ≠ ≥) をレンダリングします。 「自動」では、既知の合字フォント (Fira Code、JetBrains Mono、Cascadia Code、Iosevka など) に対してのみ合字が有効になります。", @@ -7255,14 +7255,14 @@ "1f402b3651": "WSLの配布", "d57f870938": "詳細設定", "4af2f7526e": "バージョン", - "d414022016": "うわー", + "d414022016": "pwsh", "768613e483": "パワーシェル7", "f9162f0b8e": "ウィンドウズパワーシェル", - "2d99cd91be": "パワーシェル", + "2d99cd91be": "powershell", "41a69bc24d": "PowerShell シェル オプションで、新規 terminal ペインに対して Windows PowerShell を起動するか PowerShell 7+ を起動するかを選択します。", "860e0e6402": "PowerShellのバージョン", "07ec155fb6": "bash.exe", - "5a2db98d23": "バッシュ", + "5a2db98d23": "bash", "591912177b": "git bash", "12519edb5d": "コマンドプロンプト", "6cd20b9e64": "cmd", @@ -7502,10 +7502,10 @@ "02b2ce911f": "説明 (オプション)", "1cd53359db": "説明", "68314b4369": "タイトル", - "694550a610": "主要", + "694550a610": "main", "0fad57a14c": "リモート ブランチを検索するか、ブランチ名を入力します。", "8584ccb43c": "ベースブランチ", - "6f5f1962b6": "本ブランチ", + "6f5f1962b6": "ヘッドブランチ", "b504b3ceb1": "ホストされたレビューを作成する前に詳細を確認してください。", "f658ff2455": "ホストされたレビューを作成する前に、ターゲットブランチと {{value0}} の詳細を確認してください。", "b7f43474d7": "{{value0}} を作成する", @@ -7613,7 +7613,7 @@ "d57545ff92": "リモートと同じ", "b950b1948b": "ローカルポート", "9e5a4118b0": "リモートポート", - "c9d106547a": "フォワード", + "c9d106547a": "転送", "c7e920aa7c": "{{value0}} として公開", "e740075063": "削除", "b3548e59f4": "編集", @@ -7636,9 +7636,9 @@ "57d930fa45": "PID", "5dd86dcf2f": "プロセス", "b1ff94fa27": "プロトコル", - "729be0b4e5": "親切", + "729be0b4e5": "種類", "0f1d8cd324": "バインド", - "1c1c18cefc": "住所", + "1c1c18cefc": "アドレス", "f9528da632": "プロセスの停止", "a223459512": "詳細を表示", "bdac206faf": "詳細をコピーする", @@ -7665,7 +7665,7 @@ "d32820d3e2": "外部の", "4db4b5e435": "その他のワークスペース", "38b16cfbef": "ポートが検出されませんでした", - "0d63d94db3": "走査...", + "0d63d94db3": "スキャン中...", "935dda7718": "アクティブなワークスペース", "740aca88ab": "ワークスペースのポートスキャンに失敗しました。", "5be4f7f727": "ポート {{value0}} メニュー", @@ -7702,7 +7702,7 @@ "1406954883": "すべてのメモをクリアします...", "cc05b2d088": "ファイルエクスプローラーで開く", "03194cfff4": "ここで開いた競合から派生したローカル セッション状態。", - "413a3ba113": "コンフリクト", + "413a3ba113": "競合", "27a50fe970": "競合をレビューする", "f6cb48b6fe": "AIで解決する", "3eeccbb221": "解決されたファイルは、ライブ競合状態を抜けた後、通常の変更に戻ります。", @@ -7744,7 +7744,7 @@ "4f76c0a9de": "ベースブランチは head ブランチとは異なる必要があります。", "c5e4175139": "その他の {{value0}} とリモート操作", "78ddfd0bb4": "下書きとして作成", - "e64a632456": "主要", + "e64a632456": "main", "6055949c50": "{{value0}} ベース ブランチ", "1f7119f604": "ベース", "9484270f45": "タイトルと説明を生成中…", @@ -7804,7 +7804,7 @@ "c105a61960": "マージ", "d7a5942e41": "{{value0}}: {{value1}} は未解決です", "c56ba7fa06": "差分", - "94c42b252e": "医学博士", + "94c42b252e": "MD", "e59bca888a": "markdown", "b6922abb13": "ブランチ比較をロードできません。", "715d229c86": "ブランチ比較は使用できません", @@ -7944,7 +7944,7 @@ "d713f500b2": "ログテール (最後の 200 行)", "a916648574": "詳細を開く", "07eccfa397": "このチェックの詳細はありません。", - "49731703ea": "求人", + "49731703ea": "ジョブ", "f2fe8a4e8f": "注釈", "d098e5529a": "出力", "2dd5ddabc4": "ワークフロー #", @@ -7954,7 +7954,7 @@ "a54ae21c6f": "状態:", "e4e3af15ee": "詳細を表示", "2524d1fb83": "ログテールで詳細を確認できます。", - "a2fb3f4408": "最初の 100 件の求人を表示しています", + "a2fb3f4408": "最初の 100 件のジョブを表示しています", "df137989b3": "最初の 20 個の注釈を表示", "1f2b980522": "チェックの詳細を読み込んでいます…", "0c96cd25e5": "解決する", @@ -7974,7 +7974,7 @@ "7440d09d2c": "会話を開始する", "b37ebdc51c": "コメントはできません。", "90206b6353": "コメント", - "95ad090b01": "糸", + "95ad090b01": "スレッド", "365254cc1b": "未解決", "7f793b571d": "ドラッグしてチェックのサイズを変更します", "ee07b33924": "未知", @@ -8020,13 +8020,13 @@ "b41fbc180c": "GitLab は、この MR はマージできるが、一部のパイプライン ジョブが失敗したと言っています", "49ac4fec10": "チェックに失敗しました", "22b7e50621": "GitLab がマージ競合を報告", - "96b05e374c": "紛争", + "96b05e374c": "競合", "d63bb6f76e": "この MR はまだ下書きです", "b2715092c6": "下書き", "2388413f28": "この MR はクローズされています", "88d044c42f": "クローズ", "ee482a2bad": "この MR はすでにマージされています", - "fae95ae20d": "合併しました" + "fae95ae20d": "マージ済み" } } } @@ -8060,7 +8060,7 @@ "d6d9c3c947": "引用", "f49e0a21e0": "コード", "542bf6a7e2": "イタリック", - "256300f8ea": "大胆な", + "256300f8ea": "太字", "87aff03d63": "送信中..." } } @@ -8172,7 +8172,7 @@ "8adb953095": "操作が失敗しました" }, "GitHistoryGraphSvg": { - "47eff48230": "頭" + "47eff48230": "HEAD" }, "create": { "pull": { @@ -8451,7 +8451,7 @@ "f4e9c8dcf8": "フォルダーを参照する", "e8214aa632": "フォルダーとして開く", "3863747c56": "Gitプロジェクトの追加", - "2ebbc26343": "/ホーム/ユーザー/プロジェクト", + "2ebbc26343": "/home/user/project", "466108ab89": "ランタイムサーバー上に存在するパスを入力します。", "8cab104e3c": "サーバープロジェクトを開く", "2d20200346": "リポジトリのインポート", @@ -8460,12 +8460,12 @@ "c7af322fc3": "スキャンを停止する", "c3d9d44ca2": "スキャンの停止", "cf23006ba7": "ランタイムサーバー", - "7ec3f48820": "/ホーム/ユーザー", + "7ec3f48820": "/home/user", "2e6438dd34": "{{value0}}このフォルダー内で {{value1}} {{value2}} が見つかりました。" }, "ThemeStep": { "a4b254779d": "macOSのオプションキー", - "6c51398942": "ねずみ", + "6c51398942": "マウス", "8ca01945f2": "ディバイダー", "b3a99a2d29": "ウィンドウ", "86c0f1caa2": "パディング", @@ -8473,9 +8473,9 @@ "c021e9dddd": "テーマパレット", "ab2a583a97": "Cursor", "cc1858e19e": "フォント", - "248c812283": "輸入", + "248c812283": "インポート", "7ee9234e54": "Ghostty 構成が検出されました。", - "78b6386140": "ゴーストティから輸入しました。", + "78b6386140": "Ghostty からインポートしました。", "2c3aa538f8": "Ghostty 設定を検索中…", "94b9dc561d": "設定→Terminal", "dd5c16ad1b": "フォント、カーソル、パレットを含むその他の terminal オプション", @@ -8524,10 +8524,10 @@ "2cfc6be192": "GitLab", "7a47af0565": "Linear", "0a180280bd": "GitHub", - "b3c60c2b7c": "頭いい", + "b3c60c2b7c": "スマート", "26824f60dd": "全て", "6fad211c66": "クローズ", - "2319d87718": "合併しました", + "2319d87718": "マージ済み", "622864b52a": "オープン", "fda67f0b61": "現在のプロジェクト", "3e8bb1176a": "設定で Linear を接続してイシューを検索します。", @@ -8623,7 +8623,7 @@ "d047197480": "GitHub · Linear", "a4c3f7b7aa": "タスク", "d33d7a9c29": "orca  ·  feat/mobile-page", - "25d6e8a491": "偉業/モバイルページ", + "25d6e8a491": "feat/mobile-page", "c791677f2f": "再開する", "cf3f98fa3f": "切断されました", "091355da3d": "M1ミニ・ホーム", @@ -8654,7 +8654,7 @@ "1d448b69f7": "合格", "d39445686a": "src/transport/host-store.test.ts", "a6e7cdc688": "pnpm テスト --フィルターモバイル", - "21b67dfc92": "バッシュ", + "21b67dfc92": "Bash", "d6d1041a1c": "⎿ ペアスキャンスライドを terminal セッションに置き換えました", "336c0e070e": "mobile/orca-mobile-sidebar-mock-v3.html", "6d4ebd5833": "編集", @@ -8663,12 +8663,12 @@ "2c10d43745": "claude", "e0f98be657": "orca/feat-mobile-page", "2defc05141": "開発@マック", - "da121ba48d": "計画.md", + "da121ba48d": "PLAN.md", "e4befee569": "シェル", "606aa93192": "ファイル", "94febb0976": "ソース管理", "8d6516312d": "2 terminals · claude active", - "8432787c4e": "偉業/モバイルページ", + "8432787c4e": "feat/mobile-page", "8fd998acd3": "戻る" }, "WorktreeListSlide": { @@ -8790,7 +8790,7 @@ "25f15c2219": "プロ", "59ae327405": "スターター", "9e0f530390": "価格設定", - "0ce7c24b4d": "働く…", + "0ce7c24b4d": "処理中…", "f2034c4930": ">", "6e4616d039": "Claude", "0f8481e1a7": "Claudeに送る", @@ -8818,7 +8818,7 @@ "79445f7512": "アプリでメモを承認する", "99a8624bcb": ">", "2adb561b44": "Claudeコードセッションが開始されました", - "94787f01f8": "Claude・コード", + "94787f01f8": "Claude Code", "9cddfe96b2": "ローカルアプリ", "9634d870d1": "承認する", "3cc2df3671": "完了", @@ -8922,7 +8922,7 @@ }, "ReviewNotesAnimatedVisual": { "5dbd27c4c2": "Codex", - "09094f25e2": "Claude・コード", + "09094f25e2": "Claude Code", "294aaff104": "メモの送信先", "ea4e45b71b": "メモを追加", "271ea0cbf3": "キャンセル", @@ -8938,7 +8938,7 @@ "fb1a856b6d": "開く", "7a8b896e11": "コメント", "ca36f7b27c": "通過", - "25f6838e43": "糸くず", + "25f6838e43": "lint", "2ef0b97954": "タイプチェック", "8ed213397c": "ランニング", "d340c052fb": "確認する", @@ -8958,7 +8958,7 @@ "3774b80eae": "説明", "07da9245cc": "PRのタイトル", "54a093c52d": "タイトル", - "3b9b96d6a6": "主要", + "3b9b96d6a6": "main", "ce7d5d3a18": "ベースブランチ", "e4473d438f": "AIで生成", "c30cd930ff": "PRの作成", @@ -9075,7 +9075,7 @@ "2f549fc0ba": "src/auth/session.test.ts", "139e3d7458": "更新されました", "7b26349cb2": "pnpm 移行最新", - "78f0318ac1": "走りたい", + "78f0318ac1": "実行をリクエスト中", "79971d1539": "認証フローを再設計する" }, "UsageAccountsCard": { @@ -9101,7 +9101,7 @@ }, "orchestration": { "cards": { - "da6f1f97c9": "働く" + "da6f1f97c9": "実行中" } } } @@ -9109,7 +9109,7 @@ "FeatureTourWorkspaceCard": { "a23ed9da7f": "codex", "2f33dc932b": "claude", - "9220794f6a": "働く" + "9220794f6a": "実行中" }, "ReviewAnimatedVisual": { "8df4d52b68": "プレビュー", @@ -9144,7 +9144,7 @@ "connect": { "integration": { "step": { - "0f47ff17c6": "Change", + "0f47ff17c6": "変更", "5538eb6743": "Done", "open_step": "Open", "close_step": "Close" @@ -9220,11 +9220,11 @@ "pane": { "toolbar": { "06e10d7356": "エミュレータをシャットダウンする", - "e7a0d1897e": "家", + "e7a0d1897e": "ホーム", "6bd8dff42a": "回転", "3d836b879c": "エミュレータの選択", "81b3571a07": "接続", - "868c0f2938": "働く…" + "868c0f2938": "処理中…" } }, "screen": { @@ -9291,7 +9291,7 @@ "b6c3b84476": "ファイルツリーを表示", "39f8007549": "競合をレビューする", "39e73e7181": "はこの差分ビューから除外されました。", - "689b99f8ad": "未解決の紛争", + "689b99f8ad": "未解決の競合", "820ec01f24": "競合したファイルは個別にレビューされます", "fd8892b120": "表示に変更はありません", "eb5f40e49c": "通常の双方向 diff パイプラインは競合に対して安全ではないため、この diff ビューでは未解決の競合が除外されます。", @@ -9313,7 +9313,7 @@ "f338288514": "競合するコンテンツを読み込んでいます...", "90d576adb2": "更新", "a1ce36f77d": "スナップショットがキャプチャされた場所", - "4be41eaafc": "未解決の紛争", + "4be41eaafc": "未解決の競合", "c8ca989aea": "ファイルツリーを表示", "58ad5ad431": "閉じる", "28e7db4a90": "ソース管理", @@ -9330,7 +9330,7 @@ "3449521a8c": "このスナップショットには競合はありません。", "a54551c5a6": "ファイルツリーを折りたたむ", "99496bab6e": "ファイル", - "496e28a932": "消えた", + "496e28a932": "削除済み", "8528a5eaf5": "解決済み", "69d4e210bb": "未解決" }, @@ -9460,8 +9460,8 @@ "322afab6ff": "レビューノート", "0f9969a159": "最初のレビューノートにジャンプ", "12052c639c": "検索を閉じる", - "b42c41bd0d": "次の試合", - "1febd97f5c": "前回の試合", + "b42c41bd0d": "次の一致", + "1febd97f5c": "前の一致", "ec77985138": "markdown プレビューで検索", "517aea303b": "プレビューで検索", "f961e94057": "agent 用のメモをコピーする", @@ -9512,10 +9512,10 @@ }, "PdfFind": { "cd65b1d6b0": "閉じる", - "eeba2547a1": "次の試合", - "30de726ad0": "前回の試合", + "eeba2547a1": "次の一致", + "30de726ad0": "前の一致", "2fc3ba0ea8": "ページ内で検索...", - "d080ab37d6": "一致しません", + "d080ab37d6": "一致なし", "db56fcd6d2": "{{value0}}/{{value1}}" }, "PdfViewer": { @@ -9543,26 +9543,26 @@ "74eab1d9b2": "YAML", "5ef5605cb7": "XML", "88d777bc07": "TypeScript", - "9e384d48dc": "迅速", + "9e384d48dc": "Swift", "3009f722b9": "SQL", "d01f55be57": "シェル", "5af8251002": "SCSS", - "e72e6b03f4": "さび", - "96182a2f64": "ルビー", - "2391f9cda9": "パイソン", - "89d6cc14fb": "マーメイド", + "e72e6b03f4": "Rust", + "96182a2f64": "Ruby", + "2391f9cda9": "Python", + "89d6cc14fb": "Mermaid", "983b9576b4": "Markdown", - "bcb236e2d8": "コトリン", + "bcb236e2d8": "Kotlin", "78eba32de4": "JSON", "a209c57063": "JavaScript", - "36536ad539": "ジャワ", + "36536ad539": "Java", "8c4a3fa02d": "HTML", - "706fd85738": "グラフQL", - "edfcc64182": "行く", + "706fd85738": "GraphQL", + "edfcc64182": "Go", "bf6ee5caaa": "差分", "026653f21f": "CSS", "4daed43ae3": "C++", - "4227cf50fe": "バッシュ", + "4227cf50fe": "Bash", "13822cdfda": "プレーンテキスト" }, "RichMarkdownDocLinkMenu": { @@ -9598,8 +9598,8 @@ }, "RichMarkdownSearchBar": { "de68b75bde": "検索を閉じる", - "f7bcecbe26": "次の試合", - "32ae8d7d57": "前回の試合", + "f7bcecbe26": "次の一致", + "32ae8d7d57": "前の一致", "158c645829": "リッチ markdown エディタで検索", "98b89276f3": "リッチエディターで検索", "a86958d508": "結果はありません" @@ -9618,9 +9618,9 @@ "f97031be09": "チェックリスト", "31630ed66e": "番号付きリスト", "5d1539e5a9": "箇条書きリスト", - "0bea19a988": "ストライク", + "0bea19a988": "取り消し線", "6b4ccf9493": "イタリック", - "4f9e789fe0": "大胆な", + "4f9e789fe0": "太字", "cf5817d827": "見出し 3", "d34a2021c8": "見出し2", "abb5100a3d": "見出し1", @@ -9833,7 +9833,7 @@ "newBrowserTab": "新規ブラウザタブ", "openBrowser": "ブラウザを開く", "browserTab": "ブラウザタブ", - "newMarkdown": "新規値下げ", + "newMarkdown": "新規 markdown", "newMarkdownFile": "新規 markdown ファイル", "newMark": "新規マーク", "newFile": "新規ファイル", @@ -9860,10 +9860,10 @@ "pane": { "BrowserFind": { "c9d5f63fdc": "閉じる", - "5c0c02ae76": "次の試合", - "ca7aebbd7f": "前回の試合", + "5c0c02ae76": "次の一致", + "ca7aebbd7f": "前の一致", "636a69cd66": "ページ内で検索...", - "7baca7b1b8": "一致しません", + "7baca7b1b8": "一致なし", "fc63f336aa": "{{value0}}/{{value1}}" }, "BrowserImportHintButton": { @@ -9871,18 +9871,18 @@ "77351d22f5": "ブラウザの設定", "e0e125e074": "ファイルから…", "0c6d254eca": "{{value0}} から", - "244266c122": "輸入…", + "244266c122": "インポート…", "e52a955e6f": "これは、[設定] > [ブラウザ] でいつでも見つけることができます。", "4f5ffaa6a1": "ブラウザデータをインポートする", - "b24fef25be": "輸入", + "b24fef25be": "インポート", "02e89014c5": "{{value1}}{{value2}} から {{value0}} クッキーをインポートしました。", "d40d584769": "ファイルから {{value0}} 個の Cookie をインポートしました。" }, "BrowserMobileDriverOverlay": { - "a6914ee43f": "取り戻す", + "a6914ee43f": "操作を取り戻す", "f4ecd61552": "このタブはスマートフォンから制御されています。持ち帰ってデスクトップで使用します。", "d9768ec642": "ブラウザ入力が一時停止されています", - "20539eca03": "モバイルがこのブラウザを推進している" + "20539eca03": "モバイルがこのブラウザを操作しています" }, "BrowserPane": { "1ded0d3168": "スクリーンショットをコピー", @@ -9913,7 +9913,7 @@ "1b179ab561": "ページの URL をコピー", "f7ab83f7ed": "デフォルトのブラウザでページを開く", "0e080d820e": "リロード", - "250a9b3e42": "フォワード", + "250a9b3e42": "進む", "40edfa75cb": "戻る", "efb0e8f7f3": "リンクアドレスをコピーする", "8ce4f6b12e": "デフォルトのブラウザでリンクを開く", @@ -9931,7 +9931,7 @@ "d2a7092e6e": "注釈コメント", "b472c5fe03": "ブラウザの注釈を追加する", "b5ba6085de": "質問", - "143204e423": "変化", + "143204e423": "変更", "e7ca5a098c": "成功", "d51ef37351": "コピー", "6f4ab3592b": "コピーされました", @@ -10023,7 +10023,7 @@ "007c8ad874": "プロンプト", "a1d52c2189": "使用範囲", "449fc83bf7": "トークン", - "401f40ae79": "EST(東部基準時。過ごす", + "401f40ae79": "推定費用", "a7c312430d": "最後の実行", "2df8970cd5": "Agent", "e353ab9516": "事前チェック", @@ -10102,7 +10102,7 @@ "402651bfb6": "まだ実行はありません。", "9974a2b429": "状態", "13988187b3": "トークン", - "86a248187e": "過ごす", + "86a248187e": "費用", "149c0b49c7": "ワークスペース", "8faaa00726": "走る", "53fc5f07ab": "実行履歴", @@ -10126,7 +10126,7 @@ }, "AutomationSessionField": { "f3c76dce51": "再利用", - "c90888ee94": "新鮮な", + "c90888ee94": "新規", "b675112193": "再利用は、今後の実行を前のライブ オートメーション セッションに送信します。そのセッションが終了すると、Orca は新しいセッションを開始します。", "4bdce31f37": "セッション再利用のヘルプ", "5ad314118e": "セッション"