fix(ssh): say "Orca on <host>" instead of "managed server" in the UI (#31099)

* fix(ssh): say where Orca runs instead of "managed server" in the UI

Users read "managed server" as hosting run by someone else, so they declined
moving their SSH hosts. Every user-facing string now says "Orca on <host>" or
"this host's Orca server", in all six locales; Settings > "Orca on your SSH
hosts" and the setup line say the code and files stay where they are and only
Orca's list of projects, tabs and terminals moves to the host. CLI command names,
logs and identifiers are unchanged.

Fixes #30880

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(ssh): reassure only when something moves; name the host's label in its row

Review follow-ups: the reassurance shows only while Orca sets itself up or
moves a host, not on every reconnect; the converting line no longer repeats it;
the row names the SSH host's current label; the section description and the
Move anyway dialog stop repeating themselves; translate the Restart dialog's
buttons; drop "managed" from the remaining raw causes and the external
automation refusal.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Neil
2026-10-20 04:18:08 -07:00
committed by GitHub
co-authored by Claude
parent d9a89dcb0c
commit 0ee13f831d
65 changed files with 528 additions and 338 deletions
+4 -2
View File
@@ -35,6 +35,8 @@ When creating a worktree, choose an SSH target instead of Local. Orca will:
- Run agents remotely through the SSH connection.
- Sync file events so the editor, diff, and browser still feel local.
On the first connect, Orca installs itself on the host over your own SSH connection; Settings lists these under **Orca on your SSH hosts**. Your code and files stay where they are. Only Orca's list of projects, tabs and terminals moves to the host.
## Advanced connection options
Open **Settings → SSH**, edit a target, and expand **Advanced Connection** when the host needs a proxy, jump host, or SSH multiplexing override. Orca enables **Reuse SSH connection for faster setup** by default, which uses OpenSSH connection reuse on macOS and Linux so setup commands do not each pay a fresh SSH handshake. Turn it off only for hosts whose SSH policy rejects multiplexed sessions.
@@ -101,9 +103,9 @@ For remote worktrees, the right sidebar shows a **Ports** tab (toggle with `Cmd+
## macOS hosts: local network access
On macOS 15 and later, a terminal on an SSH host can lose access to devices on the host's local network (for example `kubectl`, Homebrew `node` or `python`, or `.local` names fail with `no route to host`). macOS credits network access to the SSH session that started Orca's managed server, and when that session ends, programs started from the server's terminals are blocked. Apple's own tools such as `/usr/bin/curl` keep working, and loopback connections are unaffected. Full Disk Access granted through **Allow full disk access for remote users** may stop working the same way.
On macOS 15 and later, a terminal on an SSH host can lose access to devices on the host's local network (for example `kubectl`, Homebrew `node` or `python`, or `.local` names fail with `no route to host`). macOS credits network access to the SSH session that started Orca's server on the host, and when that session ends, programs started from the server's terminals are blocked. Apple's own tools such as `/usr/bin/curl` keep working, and loopback connections are unaffected. Full Disk Access granted through **Allow full disk access for remote users** may stop working the same way.
When Orca sees that this happened, the host's status in **Settings → SSH** says so and offers **Restart managed server…**, which starts the server again from your current connection. Orca restarts it only when no terminals are running on the host, because terminals that are still open keep the lost access. Close them first.
When Orca sees that this happened, the host's status in **Settings → SSH** says so and offers **Restart Orca’s server…**, which starts the server again from your current connection. Orca restarts it only when no terminals are running on the host, because terminals that are still open keep the lost access. Close them first.
To avoid the problem altogether, an administrator on the host can exempt local address ranges from the Local Network check (macOS 15.5 and later; see Apple's [TN3179](https://developer.apple.com/documentation/technotes/tn3179-understanding-local-network-privacy)). The exemption applies to every app on that Mac for the listed ranges:
+2 -2
View File
@@ -4,7 +4,7 @@ import { GLOBAL_FLAGS } from '../args'
const SELECTOR_NOTE =
'--environment names a managed Orca server this machine deployed over SSH (see `orca environment list`); it is a selector here, not a routing flag.'
const DESKTOP_NOTE =
'Runs on this machine’s Orca desktop app, the same action as Settings > Managed servers. A runtime without the SSH registry (headless `orca serve`) refuses it.'
'Runs on this machine’s Orca desktop app, the same action as Settings > Orca on your SSH hosts. A runtime without the SSH registry (headless `orca serve`) refuses it.'
export const MANAGED_SERVER_COMMAND_SPECS: CommandSpec[] = [
{
@@ -42,7 +42,7 @@ export const MANAGED_SERVER_COMMAND_SPECS: CommandSpec[] = [
'orca environment recover --environment <selector> [--accept-changed-state --yes] [--json]',
allowedFlags: [...GLOBAL_FLAGS, 'accept-changed-state', 'yes'],
notes: [
'When a rejected build changed profile state, recover refuses rather than restart the previous build over it. --accept-changed-state --yes restores the prelaunch snapshot instead, the same as Restore in Settings > Managed servers; what the rejected build changed is discarded.',
'When a rejected build changed profile state, recover refuses rather than restart the previous build over it. --accept-changed-state --yes restores the prelaunch snapshot instead, the same as Restore in Settings > Orca on your SSH hosts; what the rejected build changed is discarded.',
SELECTOR_NOTE,
DESKTOP_NOTE
],
@@ -34,7 +34,7 @@ export function registerOrcadDeltaMoveHandlers(getUserDataPath: () => string): v
(entry) => entry.id === target.orcadFence?.environmentId
)
if (!environment) {
throw new Error('The managed Orca server for this host is no longer registered.')
throw new Error('This host’s Orca server is no longer registered.')
}
const result = await runOrcadDeltaMove({
userDataPath,
@@ -84,21 +84,21 @@ describe('SSH target CRUD against managed orcad targets', () => {
it('refuses to remove a managed host, pointing at Stop instead', async () => {
await expect(handler('ssh:removeTarget')(null, { id: 'ssh-1' })).rejects.toThrow(
'Settings › Managed servers'
'Settings › Orca on your SSH hosts'
)
mocks.state.target = {
...target,
orcadProvisioning: { requestId: 'request-1', name: 'Managed' }
}
await expect(handler('ssh:removeTarget')(null, { id: 'ssh-1' })).rejects.toThrow(
'managed Orca server'
'Orca runs on this host'
)
expect(mocks.remove).not.toHaveBeenCalled()
})
it('gives paired clients the same rules: a managed host is refused there too', async () => {
const mutations = mocks.setMutations.mock.calls.at(-1)?.[0]
await expect(mutations.remove('ssh-1')).rejects.toThrow('Settings › Managed servers')
await expect(mutations.remove('ssh-1')).rejects.toThrow('Settings › Orca on your SSH hosts')
mutations.update('ssh-1', { host: 'elsewhere', generation: 9 })
expect(mocks.updateTarget).toHaveBeenCalledWith('ssh-1', { host: 'elsewhere' })
expect(mocks.remove).not.toHaveBeenCalled()
+1 -1
View File
@@ -100,7 +100,7 @@ export function assertNotManagedServerHost(targetId: string): void {
const target = getSshTargetRegistryStore()!.getTarget(targetId)
if (target && isManagedOrcadSshTarget(target)) {
throw new Error(
'This host runs a managed Orca server. Use Stop… under Settings › Managed servers to stop the server and remove it first, or Forget… there if the host is gone.'
'Orca runs on this host. Use Stop… under Settings › Orca on your SSH hosts to stop it and remove it from the host first, or Forget… there if the host is gone.'
)
}
}
@@ -52,7 +52,7 @@ export async function orcadActivationFenceRefusal(
}
: {
code: ORCAD_ACTIVATION_FENCE_BUSY_CODE,
reason: `Another run is changing this host's managed server, so the ${attempt} did not start. It is retried on a later connect.`
reason: `Another run is changing this host’s Orca server, so the ${attempt} did not start. It is retried on a later connect.`
}
}
@@ -60,7 +60,7 @@ export async function resolveOrcadRemoteContext<Target extends OrcadHostTarget =
): Promise<OrcadRemoteContext<Target>> {
const host = detectedHost ?? (await detectRemoteHostPlatform(connection, { signal }))
if (!host) {
throw new OrcadHostUnsupportedError('This SSH host platform is not supported by managed orcad.')
throw new OrcadHostUnsupportedError('Orca’s server doesn’t support this SSH host’s platform.')
}
const remote = { conn: connection, host, signal }
const { orcadHome: remoteHome, userDataDir } = await resolveOrcadMachineHome(
@@ -80,7 +80,7 @@ export function restartManagedOrcadEnvironment(
return withManagedOrcadLifecycle(userDataPath, selector, async ({ environment, deployment }) => {
const context = await resolveLinkedOrcadContext(environment, deployment)
if (!context.activationRecord.active) {
return { outcome: 'not-restarted', reason: 'This host has no activated managed server.' }
return { outcome: 'not-restarted', reason: 'This host has no activated Orca server.' }
}
// Why release: a finished automation shell no client used must not hold the restart back.
const census = await collectManagedTerminalCensus(
@@ -113,7 +113,7 @@ export function restartManagedOrcadEnvironment(
reason:
wake.outcome === 'recovery-refused'
? wake.reason
: `The managed server stopped but did not start again (${wake.outcome}); reconnect to start it.`
: `This host’s Orca server stopped but did not start again (${wake.outcome}); reconnect to start it.`
}
}
// The started server may have bound another port than the forward in use.
@@ -133,7 +133,7 @@ export function restartManagedOrcadEnvironment(
return {
outcome: 'not-restarted',
reason:
'The managed server restarted, but its terminals still belong to an SSH session ' +
'This host’s Orca server restarted, but its terminals still belong to an SSH session ' +
'that has ended: its terminal daemon was still running, or this connection opens a ' +
'new SSH session for each command. Turn on SSH connection reuse for this host if ' +
'it is off, then restart again.'
@@ -158,7 +158,7 @@ async function stopRetiringIdleDaemon(
// Re-read under the fence: another client may have changed the active slot.
const active = (await readOrcadActivationRecord(slot)).active
if (!active) {
return { state: 'kept', reason: 'This host has no activated managed server.' }
return { state: 'kept', reason: 'This host has no activated Orca server.' }
}
const target = await readRemoteOrcadManagedStopTarget(slot, active)
if (target.state === 'refused') {
@@ -173,7 +173,7 @@ async function stopRetiringIdleDaemon(
state: 'daemon-kept',
version: active,
reason:
'The managed server restarted, but its terminal daemon kept running because a terminal ' +
'This host’s Orca server restarted, but its terminal daemon kept running because a terminal ' +
'was open at the stop, so terminals may still lack local network access.'
}
case 'unsettled':
@@ -31,7 +31,7 @@ export function requireManagedOrcadInfrastructure() {
const targetStore = requireManagedOrcadTargetStore()
const connectionManager = getSshConnectionManager()
if (!connectionManager) {
throw new Error('SSH is unavailable on this client; the managed Orca server is unverifiable.')
throw new Error('SSH is unavailable on this client; this host’s Orca server is unverifiable.')
}
return { connectionManager, targetStore, claims: targetStore.getOrcadRuntimeClaims() }
}
@@ -39,7 +39,7 @@ export function requireManagedOrcadInfrastructure() {
export function requireManagedOrcadTargetStore() {
const targetStore = getSshTargetRegistryStore()
if (!targetStore) {
throw new Error('SSH target state is unavailable; the managed Orca server is unverifiable.')
throw new Error('SSH target state is unavailable; this host’s Orca server is unverifiable.')
}
return targetStore
}
@@ -68,7 +68,7 @@ export async function resolveLinkedOrcadContext(
target.generation !== deployment.sshTargetGeneration ||
getManagedOrcadFenceEnvironmentId(target) !== environment.id
) {
throw new Error('The managed Orca server SSH registration is no longer valid.')
throw new Error('The SSH registration for this host’s Orca server is no longer valid.')
}
const connection = await connectionManager.connect(target)
return resolveOrcadRemoteContext(target, sshOrcadHostTransport(connection), signal)
@@ -36,8 +36,7 @@ export const MANAGED_ORCAD_FENCED_DETAIL =
'An update, rollback or recovery holds this host; it was not started.'
/** The host has no active version, e.g. another desktop stopped it; a connect redeploys it. */
export const MANAGED_ORCAD_NOT_ACTIVATED_DETAIL =
'This host has no activated managed server to start.'
export const MANAGED_ORCAD_NOT_ACTIVATED_DETAIL = 'This host has no activated Orca server to start.'
const PROBE_TIMEOUT_MS = 5_000
// Why: a connect checks right after its fresh tunnel did; one verdict serves both, on that
@@ -155,7 +154,7 @@ async function wakeIfStopped(
if (await input.probe(input.environment, PROBE_TIMEOUT_MS)) {
return { state: 'serving' }
}
const detail = 'The managed Orca server process is live but is not answering.'
const detail = 'This host’s Orca server process is live but is not answering.'
console.warn(`[ssh] The managed Orca server on ${label} is not answering: ${detail}`)
return { state: 'unverifiable', detail }
}
@@ -88,14 +88,14 @@ export function resolveManagedTunnelBinding(
const targetStore = dependencies.getTargetStore()
const connectionManager = dependencies.getConnectionManager()
if (!targetStore || !connectionManager) {
throw new Error('SSH is unavailable on this client; the managed Orca server is unverifiable.')
throw new Error('SSH is unavailable on this client; this host’s Orca server is unverifiable.')
}
const target = targetStore.getTarget(deployment.sshTargetId)
if (!target || target.generation !== deployment.sshTargetGeneration) {
throw new Error('The SSH registration for this managed Orca server was removed or re-created.')
throw new Error('The SSH registration for this host’s Orca server was removed or re-created.')
}
if (getManagedOrcadFenceEnvironmentId(target) !== environment.id) {
throw new Error('The SSH target is no longer owned by this managed Orca server.')
throw new Error('The SSH target is no longer owned by this host’s Orca server.')
}
return { deployment, targetStore, connectionManager, target }
}
@@ -38,7 +38,7 @@ export class OrcadManagedIdentityError extends Error {
constructor(remotePort: number, detail: string) {
super(
`${ORCAD_IDENTITY_MISMATCH_CODE}: the server on remote port ${remotePort} is not this ` +
`managed Orca server (another Orca may be using that port): ${detail}`
`host’s Orca server (another Orca may be using that port): ${detail}`
)
this.name = 'OrcadManagedIdentityError'
}
@@ -51,7 +51,7 @@ export class OrcadManagedPairingRejectedError extends Error {
readonly code = ORCAD_PAIRING_REJECTED_CODE
constructor(detail: string) {
super(
`${ORCAD_PAIRING_REJECTED_CODE}: the managed Orca server on this host no longer accepts ` +
`${ORCAD_PAIRING_REJECTED_CODE}: this host’s Orca server no longer accepts ` +
`this desktop's pairing (its saved devices were reset, or this desktop was removed ` +
`there), so reconnecting alone won't restore access: ${detail}`
)
@@ -140,7 +140,7 @@ export function deployedOrcadTunnelChecks(
? verifyOrcadPairingIdentity(pairedRuntimeConnectionFromOffer(pairing), {
runtimeId: readiness.runtimeId || null
})
: { verdict: 'foreign', detail: 'The managed Orca server published an invalid pairing.' }
: { verdict: 'foreign', detail: 'This host’s Orca server published an invalid pairing.' }
}
}
}
@@ -154,7 +154,7 @@ export class OrcadManagedTunnelManager {
connection,
forwards: this.forwards,
localPort: 0,
label: 'Managed Orca server',
label: 'Orca on this host',
remotePort,
rereadRemotePort: checks.rereadRemotePort,
verify: checks.verify,
@@ -294,7 +294,7 @@ export class OrcadManagedTunnelManager {
connection,
forwards: this.forwards,
localPort: deployment.localPort,
label: `Managed Orca server: ${environment.name}`,
label: `Orca on ${environment.name}`,
...checks,
stillCurrent: () => stillOwned() && connection.getConnectGeneration() === transportGeneration
})
@@ -211,7 +211,7 @@ export class OrcadManagedTunnelResumeRecovery {
connection: active.connection,
forwards: this.dependencies.forwards,
localPort: deployment.localPort,
label: `Managed Orca server: ${current.environment.name}`,
label: `Orca on ${current.environment.name}`,
...checks,
stillCurrent
})
@@ -27,7 +27,7 @@ export async function checkManagedTunnelServing(input: {
const active = tunnels.get(environment.id)
const target = active && input.getTarget(active.targetId)
if (!active || !target || !input.ensureServing) {
return { state: 'unverifiable', detail: 'The managed server tunnel is not up.' }
return { state: 'unverifiable', detail: 'The tunnel to this host’s Orca server is not up.' }
}
const serving = await input.ensureServing({
environment,
@@ -134,7 +134,7 @@ export class OrcadManagedTunnelTransportProvider implements SshPortForwardProvid
this.bridgedGenerations.set(conn, generation)
if (!this.dependencies.stdio.canHandle(conn)) {
throw new Error(
`The managed Orca server tunnel has no route: ${forwardFailure}, and there is no stdio bridge.`
`The tunnel to this host’s Orca server has no route: ${forwardFailure}, and there is no stdio bridge.`
)
}
// Why: a closed `ssh -L` (ours, or one an earlier Orca orphaned) may still hold the port.
@@ -16,7 +16,7 @@ import { createCancelledConnectAttemptError } from '../../ssh/ssh-connect-attemp
function createEnvironment(linkKind: 'orcadDeployment' | 'sshAccess'): KnownRuntimeEnvironment {
const paired = createEnvironmentFromPairingOffer({
id: 'environment-1',
name: 'Managed server',
name: 'Builder',
now: 1,
offer: {
v: PAIRING_OFFER_VERSION,
@@ -47,7 +47,7 @@ function createEnvironment(linkKind: 'orcadDeployment' | 'sshAccess'): KnownRunt
function setup(overrides: Partial<SshTarget> = {}, targeting?: OrcadManagedTunnelTargeting) {
const target: SshTarget = {
id: 'ssh-1',
label: 'Managed server',
label: 'Builder',
host: 'example.com',
port: 22,
username: 'deploy',
@@ -244,7 +244,7 @@ describe.each(['orcadDeployment', 'sshAccess'] as const)(
46_768,
'127.0.0.1',
6_768,
'Managed Orca server: Managed server'
'Orca on Builder'
)
})
@@ -289,7 +289,7 @@ describe.each(['orcadDeployment', 'sshAccess'] as const)(
46_768,
'127.0.0.1',
after,
'Managed Orca server: Managed server'
'Orca on Builder'
)
})
@@ -586,7 +586,7 @@ describe.each(['orcadDeployment', 'sshAccess'] as const)(
46_768,
'127.0.0.1',
6_768,
'Managed Orca server: Managed server'
'Orca on Builder'
)
await state.manager.ensure(environment())
@@ -717,7 +717,7 @@ describe('OrcadManagedTunnelManager bound port', () => {
46_768,
'127.0.0.1',
58_520,
'Managed Orca server: Managed server'
'Orca on Builder'
)
expect(state.verifyIdentity).toHaveBeenCalledOnce()
})
@@ -736,7 +736,7 @@ describe('OrcadManagedTunnelManager bound port', () => {
46_768,
'127.0.0.1',
58_520,
'Managed Orca server: Managed server'
'Orca on Builder'
)
expect(state.ensureServing).toHaveBeenLastCalledWith(
expect.objectContaining({ remotePort: 58_520 })
@@ -762,7 +762,7 @@ describe('OrcadManagedTunnelManager bound port', () => {
46_768,
'127.0.0.1',
58_520,
'Managed Orca server: Managed server'
'Orca on Builder'
)
})
@@ -188,11 +188,7 @@ async function fenceOrResume(
(environment) => getOrcadSshDeployment(environment)?.sshTargetId === target.id
)
if (converted) {
return refuse(
'live',
'orcad_migration_already_managed',
'This SSH host is already a managed server.'
)
return refuse('live', 'orcad_migration_already_managed', 'Orca already runs on this SSH host.')
}
// The fence re-checks leases once it holds.
const terminalProof = await source.assessTerminals()
@@ -95,10 +95,10 @@ export async function createManagedOrcadEnvironment(
await claims.flush(args.signal)
const targetGeneration = claimed.generation
if (targetGeneration === undefined) {
throw new Error('The managed Orca SSH registration has no durable generation.')
throw new Error('The SSH registration for this host’s Orca server has no durable generation.')
}
if (registered && getOrcadSshDeployment(registered)?.sshTargetGeneration !== targetGeneration) {
throw new Error('The saved managed Orca server has a stale SSH target generation.')
throw new Error('The saved Orca server for this host has a stale SSH target generation.')
}
let environmentRegistered = false
try {
@@ -121,7 +121,7 @@ export async function createManagedOrcadEnvironment(
const current = await ensureOrcadManagedTunnel(userDataPath, registered.id)
const activeVersion = context.activationRecord.active
if (!activeVersion) {
throw new Error('The managed Orca server has no active runtime version.')
throw new Error('This host’s Orca server has no active runtime version.')
}
return {
outcome: 'already-current',
@@ -83,7 +83,7 @@ export function parseInitialOrcadActivationAdmission(
code: 'orcad_initial_runtime_live',
reason:
`An unmanaged runtime owner is still live according to ${live[1]} (pid ${live[2]}). ` +
'Stop that Orca runtime before converting this data root to managed orcad.'
'Stop that Orca runtime before converting this data root to Orca’s server on the host.'
}
}
const record = /^UNVERIFIABLE ([^ ]+)$/u.exec(result)?.[1] ?? 'owner record'
@@ -21,7 +21,7 @@ export function orcadMigrationConflictGuidance(error: unknown): string | null {
if (terminals) {
return (
`Terminals an older version of Orca started in ${terminals[1]} are still running, and this ` +
'host’s managed server already has that project from another Orca desktop. Close them or ' +
'host’s Orca server already has that project from another Orca desktop. Close them or ' +
'end them on the host, then reconnect, or remove that project from this desktop and ' +
'connect again.'
)
@@ -31,7 +31,7 @@ export function orcadMigrationConflictGuidance(error: unknown): string | null {
return (
'A terminal an older version of Orca started on this host is still running, and Orca can’t ' +
'tell which project it belongs to. Close it or end it on the host, ' +
`then reconnect. Or, to use this host’s managed server’s copy of ${unowned[1]}, remove that ` +
`then reconnect. Or, to use this host’s Orca server’s copy of ${unowned[1]}, remove that ` +
'project from this desktop and connect again.'
)
}
@@ -43,19 +43,19 @@ export function orcadMigrationConflictGuidance(error: unknown): string | null {
switch (kind) {
case 'repository_path':
return (
`This host’s managed server already has a project at ${subject}, which another Orca desktop ` +
`This host’s Orca server already has a project at ${subject}, which another Orca desktop ` +
'added while this one was moving it. Retrying won’t clear it. To use the server’s project, ' +
`remove that project from this desktop and connect again. (${code})`
)
case 'repository_id':
return (
'This host’s managed server already has one of this desktop’s projects with different ' +
'This host’s Orca server already has one of this desktop’s projects with different ' +
'settings. Retrying won’t clear it. To use the server’s copy, remove that project from this ' +
`desktop and connect again. (${code})`
)
default:
return (
'This host’s managed server already holds different saved state for something this desktop ' +
'This host’s Orca server already holds different saved state for something this desktop ' +
'is moving, so nothing was moved and this desktop keeps its projects. Retrying won’t clear ' +
`it. (${code})`
)
@@ -273,7 +273,7 @@ function committedRefusal(): OrcadMigrationAbortResult {
return {
outcome: 'refused',
code: 'orcad_migration_committed_source_cannot_be_released',
reason: 'The managed server already holds this migration; it can only move forward.'
reason: 'This host’s Orca server already holds this migration; it can only move forward.'
}
}
+2 -2
View File
@@ -235,9 +235,9 @@ export async function releaseUndeployedMigrationFence(args: {
function fenceStateReason(state: OrcadMigrationFenceState): string {
switch (state.state) {
case 'owned-by-deploy':
return 'This SSH host already belongs to a managed server.'
return 'Orca already runs on this SSH host.'
case 'fenced-unverifiable':
return 'This SSH host is held for a migration whose record is missing. Recover it from the managed server first.'
return 'This SSH host is held for a migration whose record is missing. Recover it from this host’s Orca server first.'
case 'stale-journal':
return 'A migration record names this SSH host but its fence is gone. Resolve that migration first.'
case 'fenced':
+1 -1
View File
@@ -88,7 +88,7 @@ export function createOrcadSshHost(
outcome: 'pending',
reason:
'This host already has Orca projects, so it was restored as a direct SSH host. ' +
'A managed server can only be created on an empty host.'
'Orca can only be set up on an empty host.'
}
}
}
+2 -2
View File
@@ -35,7 +35,7 @@ export async function resolveOrcadStdioBridge(
): Promise<OrcadStdioBridge> {
const host = await detectRemoteHostPlatform(conn)
if (!host) {
throw new OrcadHostUnsupportedError('This SSH host platform is not supported by managed orcad.')
throw new OrcadHostUnsupportedError('Orca’s server doesn’t support this SSH host’s platform.')
}
if (!isWindowsRemoteHost(host)) {
return { command: orcadPosixStdioBridgeCommand(port), mode: 'raw', wrapCommand: true }
@@ -106,7 +106,7 @@ export async function checkOrcadStdioBridge(
}
const unavailable = (detail: string): Error =>
new OrcadStdioBridgeUnavailableError(
`The SSH host could not run the managed Orca server's stdio bridge: ${detail}`
`The SSH host could not run the stdio bridge for this host’s Orca server: ${detail}`
)
decoder.on('signal', (signal: OrcadStdioBridgeSignal) => {
settle(signal === 'no-node' ? unavailable('no pinned Node runtime') : 'running')
+1 -1
View File
@@ -82,7 +82,7 @@ export async function requestOrcadTerminalCensus(
!status.ok ||
!status.result.capabilities?.includes(ORCAD_TERMINAL_CENSUS_RUNTIME_CAPABILITY)
) {
throw new Error('The managed Orca server does not report a terminal census.')
throw new Error('This host’s Orca server does not report a terminal census.')
}
},
undefined,
+3 -3
View File
@@ -9,21 +9,21 @@ export function tunneledOrcadPairingCode(
): string {
if (!pairedOffer && !readiness.pairing.available) {
throw new Error(
`The managed Orca server did not publish a pairing offer: ${readiness.pairing.guidance}`
`This host’s Orca server did not publish a pairing offer: ${readiness.pairing.guidance}`
)
}
// An enrolled client keeps its grant; startup offers are for new clients.
const offer =
pairedOffer ?? (readiness.pairing.available ? parsePairingCode(readiness.pairing.url) : null)
if (!offer) {
throw new Error('The managed Orca server published an invalid pairing offer.')
throw new Error('This host’s Orca server published an invalid pairing offer.')
}
const endpoint = new URL(offer.endpoint)
if (
(endpoint.protocol !== 'ws:' && endpoint.protocol !== 'wss:') ||
classifyRemotePairingHostname(endpoint.hostname) !== 'loopback'
) {
throw new Error('The managed Orca server pairing endpoint is not loopback-only.')
throw new Error('The pairing endpoint of this host’s Orca server is not loopback-only.')
}
endpoint.hostname = '127.0.0.1'
endpoint.port = String(localPort)
+2 -2
View File
@@ -24,7 +24,7 @@ export function unservedServerStatus(
}
const HELD_MOVE_MESSAGE =
'Orca paused moving this host’s projects to its managed server because it couldn’t confirm the server’s copy. Nothing is lost: the host keeps its projects and stays locked until the move finishes. Connect again to resume. If the server can’t come back, stop or forget it in Settings > Managed servers.'
'Orca paused moving this host’s projects to its Orca server because it couldn’t confirm the server’s copy. Nothing is lost: the host keeps its projects and stays locked until the move finishes. Connect again to resume. If the server can’t come back, stop or forget it in Settings > Orca on your SSH hosts.'
const NOEXEC_MESSAGE =
'This host doesn’t allow running programs from ~/.orca-remote, so Orca can’t start its server there. This usually means the home folder is mounted with noexec. Ask the host’s administrator to allow running programs there, then connect again.'
@@ -57,7 +57,7 @@ export function unservedHostServerMessage(decision: UnservedDecision): string {
case 'refused':
return decision.detail ?? 'Orca couldn’t set up its server on this host.'
case 'source_changed':
return 'An older version of Orca changed this host’s projects. Move those changes to its managed server in SSH Hosts settings to continue.'
return 'An older version of Orca changed this host’s projects. Move those changes to this host’s Orca server in SSH Hosts settings to continue.'
case 'deferred':
case 'failed':
if (decision.contactLost) {
@@ -262,7 +262,7 @@ export function orcadTargetBlockerMessage(
return 'This SSH target is held for this server, but no record explains why. Recover the server before reusing the host.'
case 'orcad_migration_direct_ssh_repositories':
case 'orcad_migration_direct_ssh_folder_workspaces':
return 'This SSH target owns repositories or folder workspaces. A managed server can only be created on a host with no direct SSH projects yet; keep this host in direct SSH mode.'
return 'This SSH target owns repositories or folder workspaces. Orca can only be set up on a host with no direct SSH projects yet; keep this host in direct SSH mode.'
case 'orcad_migration_direct_ssh_terminal_leases':
return 'This SSH target still owns terminal sessions. Close them before converting the host.'
case 'orcad_migration_saved_port_forwards':
@@ -153,7 +153,7 @@ export function dependentStateMessage(dependencies: OrcadMigrationDependency[]):
({ kind, count, names }) => `${kind} ×${count}${names?.length ? ` (${names.join(', ')})` : ''}`
)
return (
'This SSH target is still referenced by saved Orca state that a managed server cannot take ' +
'This SSH target is still referenced by saved Orca state that this host’s Orca server cannot take ' +
`over yet: ${parts.join('; ')}. Remove it, or keep this host in direct SSH mode.`
)
}
+1 -1
View File
@@ -118,7 +118,7 @@ async function launchOverTransport(
const kernel = await execCommand(conn, 'uname -r', { signal })
if (isWsl1KernelRelease(kernel)) {
throw new OrcadHostUnsupportedError(
`The WSL 1 distro ${name} is not supported by managed orcad. ` +
`The WSL 1 distro ${name} isn’t supported by Orca’s server. ` +
`Convert it with: wsl --set-version ${name} 2`
)
}
@@ -73,6 +73,7 @@ const button = (container: HTMLElement, label: string) =>
describe('managed server row', () => {
it('reports unknown terminals, the running migration and the deferred update', async () => {
const { container } = await render()
expect(container.textContent).toContain('Orca on Builder')
expect(container.textContent).toContain('Running terminals: unknown')
expect(container.textContent).toContain('Migration: Copy staged')
expect(container.textContent).toContain('Update to 1.3.0 deferred.')
@@ -29,6 +29,8 @@ type ManagedServerAction =
type ManagedServerRowProps = {
api: ManagedOrcadPreloadApi
environment: PublicKnownRuntimeEnvironment
/** The SSH host's current label; a manually deployed server's own name can differ from it. */
hostLabel?: string
onChanged: () => void
}
@@ -60,6 +62,7 @@ function versionLabel(
export function ManagedServerRow({
api,
environment,
hostLabel,
onChanged
}: ManagedServerRowProps): React.JSX.Element {
const mountedRef = useMountedRef()
@@ -141,7 +144,11 @@ export function ManagedServerRow({
return (
<div className="space-y-2 px-4 py-3">
<div className="flex min-w-0 items-center gap-2">
<div className="truncate text-sm font-medium">{environment.name}</div>
<div className="truncate text-sm font-medium">
{translate('auto.components.settings.managedServers.row.title', 'Orca on {{host}}', {
host: hostLabel ?? environment.name
})}
</div>
<span className="shrink-0 text-[11px] text-muted-foreground">
{versionLabel(status, statusError)}
</span>
@@ -121,12 +121,18 @@ export function ManagedServersSection({
<div className="space-y-4" data-settings-section="managed-servers">
<div className="space-y-0.5">
<div className="text-sm font-medium">
{translate('auto.components.settings.managedServers.title', 'Managed servers')}
{translate('auto.components.settings.managedServers.title', 'Orca on your SSH hosts')}
</div>
<p className="text-xs text-muted-foreground">
{translate(
'auto.components.settings.managedServers.description',
'Orca installs and runs a server on an empty SSH host and keeps it up to date.'
'Orca installs itself on an empty SSH host and keeps itself up to date.'
)}
</p>
<p className="text-xs text-muted-foreground">
{translate(
'auto.components.settings.managedServers.reassurance',
'Runs on each host, reached over your own SSH connection. Your code and files stay where they are. Only Orca’s list of projects, tabs and terminals moves to the host.'
)}
</p>
{loadFailed ? (
@@ -203,6 +209,11 @@ export function ManagedServersSection({
key={environment.id}
api={api}
environment={environment}
hostLabel={
targets.find(
(target) => target.id === getOrcadSshDeployment(environment)?.sshTargetId
)?.label
}
onChanged={onChanged}
/>
))}
@@ -80,7 +80,7 @@ export function SshHostChangedActions({
<DialogDescription>
{translate(
'auto.components.settings.keepServer.description',
'This host goes back to its managed server as it is. What the older version of Orca added or changed here is not moved; it stays only in this computer’s saved settings until they are cleaned up.'
'This host keeps using its Orca server as it is. What the older version of Orca added or changed here is not moved; it stays only in this computer’s saved settings until they are cleaned up.'
)}
</DialogDescription>
</DialogHeader>
@@ -95,7 +95,7 @@ export function SshHostDeltaMoveDialog({
<DialogDescription>
{translate(
'auto.components.settings.deltaMove.description',
'An older version of Orca changed this host after it moved to its managed server. This adds what it created to the server; it never merges over what the server already has.'
'An older version of Orca changed this host after its projects moved to Orca on the host. This adds what it created to the server; it never merges over what the server already has.'
)}
</DialogDescription>
</DialogHeader>
@@ -73,6 +73,7 @@ describe('Move anyway', () => {
await act(async () => button(container, 'Move anyway…').click())
expect(container.textContent).toContain('unsaved changes to /etc/hosts')
expect(container.textContent).toContain('Unsaved edits are kept, never deleted.')
expect(container.textContent).toContain('Your code and files stay where they are.')
await act(async () => button(container, 'Move anyway').click())
expect(allowMoveLeavingBehind).toHaveBeenCalledWith({ sshTargetId: 'ssh-1' })
expect(connect).toHaveBeenCalledWith({ targetId: 'ssh-1' })
@@ -2,6 +2,7 @@ import { useState } from 'react'
import type { SshManagedServerStatus, SshTarget } from '../../../../shared/ssh-types'
import { useMountedRef } from '@/hooks/useMountedRef'
import { translate } from '@/i18n/i18n'
import { sshHostServerReassurance } from '@/ssh/ssh-host-server-setup-copy'
import { Button } from '../ui/button'
import {
Dialog,
@@ -72,11 +73,17 @@ export function SshHostMoveAnywayAction({
<DialogTitle>
{translate('auto.components.settings.moveAnyway.title', 'Move this host anyway')}
</DialogTitle>
<DialogDescription>
{translate(
'auto.components.settings.moveAnyway.description',
'Orca moves this host to its managed server without the saved items below. They stay on this computer and don’t appear on the managed server. Unsaved edits are kept, never deleted.'
)}
<DialogDescription asChild>
<div className="space-y-2">
<p>
{translate(
'auto.components.settings.moveAnyway.description',
'Orca sets itself up on {{host}} without the saved items below. They stay on this computer and don’t appear on {{host}}. Unsaved edits are kept, never deleted.',
{ host: target.label }
)}
</p>
<p>{sshHostServerReassurance(target.label)}</p>
</div>
</DialogDescription>
</DialogHeader>
{status.detail ? (
@@ -62,7 +62,7 @@ describe('Restart managed server', () => {
it('confirms first, then restarts and refreshes', async () => {
const onChanged = vi.fn()
const container = await render(ended, onChanged)
await act(async () => button(container, 'Restart managed server…').click())
await act(async () => button(container, 'Restart Orca’s server…').click())
expect(restart).not.toHaveBeenCalled()
expect(container.textContent).toContain('no terminals are running')
await act(async () => button(container, 'Restart').click())
@@ -78,7 +78,7 @@ describe('Restart managed server', () => {
restart.mockResolvedValueOnce(result)
const onChanged = vi.fn()
const container = await render(ended, onChanged)
await act(async () => button(container, 'Restart managed server…').click())
await act(async () => button(container, 'Restart Orca’s server…').click())
await act(async () => button(container, 'Restart').click())
expect(container.textContent).toContain(text)
expect(onChanged).not.toHaveBeenCalled()
@@ -67,18 +67,18 @@ export function SshHostRestartServerAction({
setOpen(true)
}}
>
{translate('auto.components.settings.restartServer.action', 'Restart managed server…')}
{translate('auto.components.settings.restartServer.action', 'Restart Orca’s server…')}
</Button>
<Dialog open={open} onOpenChange={(next) => !next && !busy && setOpen(false)}>
<DialogContent showCloseButton={!busy}>
<DialogHeader>
<DialogTitle>
{translate('auto.components.settings.restartServer.title', 'Restart managed server')}
{translate('auto.components.settings.restartServer.title', 'Restart Orca’s server')}
</DialogTitle>
<DialogDescription>
{translate(
'auto.components.settings.restartServer.description',
'Orca restarts this host’s managed server from your current connection. It restarts only when no terminals are running on the host, because terminals that are still open keep the lost access. Close them first.'
'Orca restarts its server on this host from your current connection. It restarts only when no terminals are running on the host, because terminals that are still open stay cut off. Close them first.'
)}
</DialogDescription>
</DialogHeader>
@@ -104,12 +104,12 @@ function refusalText(result: Exclude<OrcadManagedRestartResult, { outcome: 'rest
if (result.liveSessions === null) {
return translate(
'auto.components.settings.restartServer.terminalsUnknown',
'Orca couldn’t confirm whether terminals are running on this host, so it didn’t restart the managed server.'
'Orca couldn’t confirm whether terminals are running on this host, so it didn’t restart Orca’s server.'
)
}
return translate(
'auto.components.settings.restartServer.terminalsRunning',
'{{count}} terminals are still running on this host. Close them, then restart the managed server.',
'{{count}} terminals are still running on this host. Close them, then restart Orca’s server.',
{ count: result.liveSessions }
)
}
@@ -45,7 +45,7 @@ export function SshManagedHostRemoveDialog({
<DialogDescription>
{translate(
'auto.components.settings.sshManagedHostRemove.description',
'{{label}} runs a managed Orca server. Under Managed servers, use Stop… to remove the server from the host, or Forget… if the host is gone. Then you can remove this SSH host.',
'Orca runs on {{label}}. Under Orca on your SSH hosts, use Stop… to remove Orca from the host, or Forget… if the host is gone. Then you can remove this SSH host.',
{ label: label ?? '' }
)}
</DialogDescription>
@@ -57,7 +57,7 @@ export function SshManagedHostRemoveDialog({
<Button onClick={openManagedServers}>
{translate(
'auto.components.settings.sshManagedHostRemove.open',
'Open Managed servers'
'Open Orca on your SSH hosts'
)}
</Button>
</DialogFooter>
@@ -165,9 +165,9 @@ describe('removing a managed server host', () => {
})
expect(mocks.requestRemove).not.toHaveBeenCalled()
expect(removeTarget).not.toHaveBeenCalled()
expect(document.body.textContent).toContain('Build box runs a managed Orca server')
expect(document.body.textContent).toContain('Orca runs on Build box')
const open = Array.from(document.body.querySelectorAll('button')).find(
(button) => button.textContent === 'Open Managed servers'
(button) => button.textContent === 'Open Orca on your SSH hosts'
)
await act(async () => {
open?.click()
@@ -39,6 +39,7 @@ export function SshTargetServerStatus({
>
{line.text}
</p>
{line.hint ? <p className="px-1 text-xs text-muted-foreground">{line.hint}</p> : null}
{line.detail ? (
<Collapsible>
{/* Why one row: the recovery sits beside Details, so it reads as part of this failure. */}
@@ -68,7 +68,7 @@ export function conversionBlockerLabel(blocker: OrcadMigrationBlocker): string {
case 'orcad_migration_owner_unrecorded':
return translate(
'auto.components.settings.managedServers.blocker.owned',
'This SSH host already belongs to a managed server.'
'Orca already runs on this SSH host.'
)
case 'orcad_migration_direct_ssh_repositories':
case 'orcad_migration_direct_ssh_folder_workspaces':
@@ -74,9 +74,14 @@ export const getRuntimeEnvironmentsSearchEntry = createLocalizedCatalog(
),
...translateSearchKeyword(
'auto.components.settings.managedServers.search.title',
'Managed servers'
'Orca on your SSH hosts'
),
...translateSearchKeyword('auto.components.settings.managedServers.search.keywordSsh', 'ssh'),
// Why: the section's former name, so users who knew it can still find it.
...translateSearchKeyword(
'auto.components.settings.managedServers.search.keywordFormerName',
'managed servers'
),
// Why: Share this host mounts the machine name field, so its keywords open this pane.
...getMachineNameSearchKeywords()
]
@@ -55,7 +55,7 @@ export function applySshManagedServerTransition(
toast.error(
translate(
'auto.hooks.ipcEvents.sshManagedServer.refusedBlocked',
'This SSH host could not move to a managed Orca server. SSH Hosts in Settings shows why.'
'Orca couldn’t set itself up on this SSH host. SSH Hosts in Settings shows why.'
)
)
}
+41 -37
View File
@@ -1465,7 +1465,7 @@
},
"ipcEvents": {
"sshManagedServer": {
"refusedBlocked": "This SSH host could not move to a managed Orca server. SSH Hosts in Settings shows why."
"refusedBlocked": "Orca couldn’t set itself up on this SSH host. SSH Hosts in Settings shows why."
}
}
},
@@ -12715,8 +12715,8 @@
"body": "{{credential}} is stored unencrypted — this system has no OS keyring Orca can use. Anyone who can read your disk or a backup of it can read the credential. Install and unlock gnome-keyring or kwallet, then save it again to seal it."
},
"sshManagedHostRemove": {
"description": "{{label}} runs a managed Orca server. Under Managed servers, use Stop… to remove the server from the host, or Forget… if the host is gone. Then you can remove this SSH host.",
"open": "Open Managed servers"
"description": "Orca runs on {{label}}. Under Orca on your SSH hosts, use Stop… to remove Orca from the host, or Forget… if the host is gone. Then you can remove this SSH host.",
"open": "Open Orca on your SSH hosts"
},
"managedServers": {
"row": {
@@ -12738,10 +12738,11 @@
"forget": "Forget…",
"confirmForget": "Forget on this desktop",
"keepLinked": "Keep linked",
"forgetDescription": "Unlinks this server here without contacting its host. If the host comes back, the server may still be running there."
"forgetDescription": "Unlinks this server here without contacting its host. If the host comes back, the server may still be running there.",
"title": "Orca on {{host}}"
},
"title": "Managed servers",
"description": "Orca installs and runs a server on an empty SSH host and keeps it up to date.",
"title": "Orca on your SSH hosts",
"description": "Orca installs itself on an empty SSH host and keeps itself up to date.",
"deploy": {
"host": "SSH host",
"hostPlaceholder": "Choose an empty SSH host",
@@ -12766,8 +12767,9 @@
"cancelLink": "Cancel"
},
"search": {
"title": "Managed servers",
"keywordSsh": "ssh"
"title": "Orca on your SSH hosts",
"keywordSsh": "ssh",
"keywordFormerName": "managed servers"
},
"phase": {
"fenced": "Host locked",
@@ -12786,7 +12788,7 @@
},
"blocker": {
"notFound": "The SSH host is gone.",
"owned": "This SSH host already belongs to a managed server.",
"owned": "Orca already runs on this SSH host.",
"catalog": "Projects on this host cannot move yet.",
"terminals": "Terminals on this host are still running ({{count}}). Close them first.",
"portForwards": "Saved port forwards stay with the SSH host.",
@@ -12816,17 +12818,18 @@
"migration": "Not done: a move onto this server is unfinished. Resume it first.",
"deferred": "Not done yet: the server isn’t ready for this. Try again later.",
"failed": "Orca couldn’t finish this on the server. Try again."
}
},
"reassurance": "Runs on each host, reached over your own SSH connection. Your code and files stay where they are. Only Orca’s list of projects, tabs and terminals moves to the host."
},
"sshHostServer": {
"sourceChanged": "An older version of Orca changed this host’s projects. Move those changes to its managed server, or keep the server’s version, to connect again.",
"deploying": "Setting up a managed Orca server…",
"converting": "Moving this host’s projects to its managed Orca server…",
"connecting": "Connecting to the managed Orca server…",
"updating": "Updating managed server…",
"starting": "Starting managed server…",
"notServing": "Orca couldn’t confirm that the managed server is answering.",
"hostNewer": "Runs a managed Orca server from a newer Orca; it keeps that version.",
"sourceChanged": "An older version of Orca changed this host’s projects. Move those changes to this host’s Orca server, or keep the server’s version, to connect again.",
"deploying": "Setting up Orca on {{host}}…",
"converting": "Moving to Orca on {{host}}…",
"connecting": "Connecting to Orca on {{host}}…",
"updating": "Updating Orca on {{host}}…",
"starting": "Starting Orca on {{host}}…",
"notServing": "Orca couldn’t confirm that its server on {{host}} is answering.",
"hostNewer": "Runs a newer version of Orca’s server than this app; it keeps that version.",
"failureDetails": "Details",
"cause": {
"unsupportedHost": "Orca has no server build for this system",
@@ -12836,15 +12839,15 @@
"securitySoftware": "security software changed the server’s runtime",
"nativePreflight": "the host is missing system libraries the server needs"
},
"updateDeferredLater": "Runs a managed Orca server; it updates on a later connect.",
"updateFailedPrevious": "Runs a managed Orca server on its previous version; updating it failed.",
"refusedBlocked": "Not moved to a managed server: something on this host stops the move.",
"updateDeferredLater": "Runs Orca’s server; it updates on a later connect.",
"updateFailedPrevious": "Runs Orca’s server on its previous version; updating it failed.",
"refusedBlocked": "Orca isn’t set up on this host yet: something on the host stops the move.",
"unsupported": "This host isn’t supported by this version of Orca ({{reason}}). To keep using it, install an older version of Orca.",
"unsupportedUnknown": "This host isn’t supported by this version of Orca. To keep using it, install an older version of Orca.",
"tunnelUnsupported": "This host isn’t supported by this version of Orca: its SSH server doesn’t allow port forwarding, and Orca couldn’t reach its server through the SSH session either. To keep using it, install an older version of Orca.",
"setupRetry": "Orca couldn’t start its server on this host. Try connecting again.",
"moveHeld": "Orca paused moving this host’s projects to its managed server because it couldn’t confirm the server’s copy. Nothing is lost: the host keeps its projects and stays locked until the move finishes. Connect again to resume. If the server can’t come back, stop or forget it in Settings > Managed servers.",
"olderTerminalsBridged": "Not moved to a managed server yet: terminals started by an older version of Orca are still running in this host’s projects. They keep working here. Close them or end them on the host, then reconnect.",
"moveHeld": "Orca paused moving this host’s projects to its Orca server because it couldn’t confirm the server’s copy. Nothing is lost: the host keeps its projects and stays locked until the move finishes. Connect again to resume. If the server can’t come back, stop or forget it in Settings > Orca on your SSH hosts.",
"olderTerminalsBridged": "Orca isn’t set up on this host yet: terminals started by an older version of Orca are still running in this host’s projects. They keep working here. Close them or end them on the host, then reconnect.",
"olderTerminalsUncounted": "Terminals started by an older version of Orca are still running on this host, and they don’t stop on their own. Close them in that version of Orca or end them on the host, then reconnect.",
"olderTerminalsUnverifiable": "Orca couldn’t confirm that terminals started by an older version of Orca have exited. Reconnect to try again.",
"olderTerminals_one": "{{count}} terminal started by an older version of Orca is still running on this host, and it doesn’t stop on its own. Close it in that version of Orca or end it on the host, then reconnect.",
@@ -12854,16 +12857,17 @@
"linkedProjects_other": "This host’s Orca server already had {{paths}}, so this desktop now uses the server’s copy. This desktop’s tabs and {{count}} automations there were not moved, and worktrees it created there show as external worktrees.",
"linkedProjects": "This host’s Orca server already had {{paths}}, so this desktop now uses the server’s copy. This desktop’s tabs and {{count}} automations there were not moved, and worktrees it created there show as external worktrees.",
"linkedProjectsNoAutomations": "This host’s Orca server already had {{paths}}, so this desktop now uses the server’s copy. This desktop’s tabs there were not moved, and worktrees it created there show as external worktrees.",
"launchSessionEnded": "Terminals on this Mac may have lost local network access because the SSH session that started the managed server ended. Restart the managed server to restore it.",
"behindRolledBack": "Runs an older managed Orca server than this app; the last update was rolled back. Use Update server to try again.",
"behindNoTemplate": "Runs a managed Orca server this app can’t update; this build has no server for this host.",
"behindMigrating": "Runs a managed Orca server that updates after its project move finishes.",
"behindCheckFailed": "Runs a managed Orca server; Orca couldn’t check whether it is behind this app.",
"launchSessionEnded": "Terminals on this Mac may have lost local network access because the SSH session that started this host’s Orca server ended. Restart Orca’s server to restore it.",
"behindRolledBack": "Runs an older version of Orca’s server than this app; the last update was rolled back. Use Update server to try again.",
"behindNoTemplate": "Runs a version of Orca’s server this app can’t update; this build has no server for this host.",
"behindMigrating": "Runs Orca’s server, which updates after its project move finishes.",
"behindCheckFailed": "Runs Orca’s server; Orca couldn’t check whether it is behind this app.",
"runtimeNoexec": "This host doesn’t allow running programs from ~/.orca-remote, so Orca can’t start its server there. This usually means the home folder is mounted with noexec. Ask the host’s administrator to allow running programs there, then connect again.",
"setupContactLost": "Orca lost contact with this host while setting up its server. Nothing on the host was stopped. Connect again to continue.",
"nodeDownloadBlocked": "Neither this computer nor this host could download Node.js, which Orca’s server needs. Use a Node.js mirror, or check the network on both machines.",
"nodeDownloadBlockedNoMirror": "Neither this computer nor this host could download Node.js, which Orca’s server needs. Check the network or proxy on both machines, then connect again.",
"nodeDownloadBlockedMirrorTried": "Neither this computer nor this host could download Node.js, including from the Node.js download mirror. Check the mirror setting, then connect again."
"nodeDownloadBlockedMirrorTried": "Neither this computer nor this host could download Node.js, including from the Node.js download mirror. Check the mirror setting, then connect again.",
"reassurance": "Runs on {{host}}, reached over your own SSH connection. Your code and files stay where they are. Only Orca’s list of projects, tabs and terminals moves to {{host}}."
},
"ZcodeCliSetupSection": {
"title": "Use GLM with ZCode",
@@ -12928,7 +12932,7 @@
"deltaMove": {
"action": "Move the new projects…",
"title": "Move the new projects",
"description": "An older version of Orca changed this host after it moved to its managed server. This adds what it created to the server; it never merges over what the server already has.",
"description": "An older version of Orca changed this host after its projects moved to Orca on the host. This adds what it created to the server; it never merges over what the server already has.",
"added": "Added to the server",
"nothingNew": "Nothing new to add.",
"notReflected": "Changed or removed on the older version; the server keeps its own copy",
@@ -12943,14 +12947,14 @@
"keepServer": {
"action": "Keep the server’s version…",
"title": "Keep the server’s version",
"description": "This host goes back to its managed server as it is. What the older version of Orca added or changed here is not moved; it stays only in this computer’s saved settings until they are cleaned up.",
"description": "This host keeps using its Orca server as it is. What the older version of Orca added or changed here is not moved; it stays only in this computer’s saved settings until they are cleaned up.",
"cancel": "Cancel",
"confirm": "Keep the server’s version"
},
"moveAnyway": {
"action": "Move anyway…",
"title": "Move this host anyway",
"description": "Orca moves this host to its managed server without the saved items below. They stay on this computer and don’t appear on the managed server. Unsaved edits are kept, never deleted.",
"description": "Orca sets itself up on {{host}} without the saved items below. They stay on this computer and don’t appear on {{host}}. Unsaved edits are kept, never deleted.",
"cancel": "Cancel",
"confirm": "Move anyway"
},
@@ -12984,13 +12988,13 @@
"turnOn": "Turn on in Experimental"
},
"restartServer": {
"action": "Restart managed server…",
"title": "Restart managed server",
"description": "Orca restarts this host’s managed server from your current connection. It restarts only when no terminals are running on the host, because terminals that are still open keep the lost access. Close them first.",
"action": "Restart Orca’s server…",
"title": "Restart Orca’s server",
"description": "Orca restarts its server on this host from your current connection. It restarts only when no terminals are running on the host, because terminals that are still open stay cut off. Close them first.",
"cancel": "Cancel",
"confirm": "Restart",
"terminalsUnknown": "Orca couldn’t confirm whether terminals are running on this host, so it didn’t restart the managed server.",
"terminalsRunning": "{{count}} terminals are still running on this host. Close them, then restart the managed server."
"terminalsUnknown": "Orca couldn’t confirm whether terminals are running on this host, so it didn’t restart Orca’s server.",
"terminalsRunning": "{{count}} terminals are still running on this host. Close them, then restart Orca’s server."
},
"RuntimeRepairDialog": {
"title": "Re-pair {{name}}",
+45 -27
View File
@@ -1266,7 +1266,7 @@
},
"ipcEvents": {
"sshManagedServer": {
"refusedBlocked": "Este host SSH no pudo moverse a un servidor Orca gestionado. Hosts SSH en Ajustes muestra por qué."
"refusedBlocked": "Orca no pudo instalarse en este host SSH. Hosts SSH en Ajustes muestra por qué."
}
}
},
@@ -12478,8 +12478,8 @@
"body": "{{credential}} se almacena sin cifrar: este sistema no tiene ningún conjunto de claves del sistema operativo que Orca pueda usar. Cualquiera que pueda leer su disco o una copia de seguridad del mismo puede leer la credencial. Instale y desbloquee gnome-keyring o kwallet, luego guárdelo nuevamente para sellarlo."
},
"sshManagedHostRemove": {
"description": "{{label}} ejecuta un servidor Orca gestionado. En Servidores gestionados, usa Detener… para quitar el servidor del host, u Olvidar… si el host ya no existe. Después podrás eliminar este host SSH.",
"open": "Abrir Servidores gestionados"
"description": "Orca se ejecuta en {{label}}. En Orca en tus hosts SSH, usa Detener… para quitar Orca del host, u Olvidar… si el host ya no existe. Después podrás eliminar este host SSH.",
"open": "Abrir Orca en tus hosts SSH"
},
"managedServers": {
"row": {
@@ -12501,10 +12501,11 @@
"forget": "Olvidar…",
"confirmForget": "Olvidar en este escritorio",
"keepLinked": "Mantener vinculado",
"forgetDescription": "Desvincula este servidor aquí sin contactar con su host. Si el host vuelve, es posible que el servidor siga ejecutándose allí."
"forgetDescription": "Desvincula este servidor aquí sin contactar con su host. Si el host vuelve, es posible que el servidor siga ejecutándose allí.",
"title": "Orca en {{host}}"
},
"title": "Servidores gestionados",
"description": "Orca instala y ejecuta un servidor en un host SSH vacío y lo mantiene actualizado.",
"title": "Orca en tus hosts SSH",
"description": "Orca se instala en un host SSH vacío y se mantiene actualizado.",
"deploy": {
"host": "Host SSH",
"hostPlaceholder": "Elige un host SSH vacío",
@@ -12529,8 +12530,9 @@
"cancelLink": "Cancelar"
},
"search": {
"title": "Servidores gestionados",
"keywordSsh": "ssh"
"title": "Orca en tus hosts SSH",
"keywordSsh": "ssh",
"keywordFormerName": "servidores gestionados"
},
"phase": {
"fenced": "Host bloqueado",
@@ -12549,7 +12551,7 @@
},
"blocker": {
"notFound": "El host SSH ya no existe.",
"owned": "Este host SSH ya pertenece a un servidor gestionado.",
"owned": "Orca ya se ejecuta en este host SSH.",
"catalog": "Los proyectos de este host aún no se pueden mover.",
"terminals": "Los terminales de este host siguen en ejecución ({{count}}). Ciérralos primero.",
"portForwards": "Los reenvíos de puertos guardados se quedan con el host SSH.",
@@ -12579,17 +12581,18 @@
"migration": "No se hizo: un movimiento a este servidor quedó sin terminar. Reanúdalo primero.",
"deferred": "Aún no se hizo: el servidor no está listo para esto. Inténtalo más tarde.",
"failed": "Orca no pudo completar esto en el servidor. Inténtalo de nuevo."
}
},
"reassurance": "Se ejecuta en cada host y se accede a través de tu propia conexión SSH. Tu código y tus archivos se quedan donde están. Solo la lista de proyectos, pestañas y terminales de Orca pasa al host."
},
"sshHostServer": {
"sourceChanged": "Una versión anterior de Orca cambió los proyectos de este host. Mueve esos cambios a su servidor gestionado o conserva la versión del servidor para volver a conectarte.",
"deploying": "Configurando un servidor Orca gestionado…",
"converting": "Moviendo los proyectos de este host a su servidor Orca gestionado…",
"connecting": "Conectando al servidor Orca gestionado…",
"updating": "Actualizando el servidor gestionado…",
"starting": "Iniciando el servidor gestionado…",
"notServing": "Orca no pudo confirmar que el servidor gestionado esté respondiendo.",
"hostNewer": "Ejecuta un servidor Orca gestionado de una versión más reciente de Orca; conserva esa versión.",
"sourceChanged": "Una versión anterior de Orca cambió los proyectos de este host. Mueve esos cambios al servidor de Orca de este host o conserva la versión del servidor para volver a conectarte.",
"deploying": "Configurando Orca en {{host}}…",
"converting": "Pasando a Orca en {{host}}…",
"connecting": "Conectando con Orca en {{host}}…",
"updating": "Actualizando Orca en {{host}}…",
"starting": "Iniciando Orca en {{host}}…",
"notServing": "Orca no pudo confirmar que su servidor en {{host}} esté respondiendo.",
"hostNewer": "Ejecuta una versión del servidor de Orca más reciente que esta app; conserva esa versión.",
"failureDetails": "Detalles",
"cause": {
"unsupportedHost": "Orca no tiene una compilación de servidor para este sistema",
@@ -12599,15 +12602,15 @@
"securitySoftware": "el software de seguridad modificó el runtime del servidor",
"nativePreflight": "al host le faltan bibliotecas del sistema que el servidor necesita"
},
"updateDeferredLater": "Ejecuta un servidor Orca gestionado; se actualizará en una conexión posterior.",
"updateFailedPrevious": "Ejecuta un servidor Orca gestionado en su versión anterior; no se pudo actualizar.",
"refusedBlocked": "No se movió a un servidor gestionado: algo en este host impide el movimiento.",
"updateDeferredLater": "Ejecuta el servidor de Orca; se actualizará en una conexión posterior.",
"updateFailedPrevious": "Ejecuta el servidor de Orca en su versión anterior; no se pudo actualizar.",
"refusedBlocked": "Orca aún no está configurado en este host: algo en el host impide el traslado.",
"unsupported": "Esta versión de Orca no admite este host ({{reason}}). Para seguir usándolo, instala una versión anterior de Orca.",
"unsupportedUnknown": "Esta versión de Orca no admite este host. Para seguir usándolo, instala una versión anterior de Orca.",
"tunnelUnsupported": "Esta versión de Orca no admite este host: su servidor SSH no permite el reenvío de puertos y Orca tampoco pudo llegar a su servidor a través de la sesión SSH. Para seguir usándolo, instala una versión anterior de Orca.",
"setupRetry": "Orca no pudo iniciar su servidor en este host. Intenta conectarte de nuevo.",
"moveHeld": "Orca pausó el traslado de los proyectos de este host a su servidor gestionado porque no pudo confirmar la copia del servidor. No se pierde nada: el host conserva sus proyectos y queda bloqueado hasta que termine el traslado. Conéctate de nuevo para reanudarlo. Si el servidor no puede volver, detenlo u olvídalo en Configuración > Servidores gestionados.",
"olderTerminalsBridged": "Aún no se ha movido a un servidor administrado: los terminales iniciados por una versión anterior de Orca siguen ejecutándose en los proyectos de este host. Siguen funcionando aquí. Ciérralos o termínalos en el host y vuelve a conectarte.",
"moveHeld": "Orca pausó el traslado de los proyectos de este host al servidor de Orca del host porque no pudo confirmar la copia del servidor. No se pierde nada: el host conserva sus proyectos y queda bloqueado hasta que termine el traslado. Conéctate de nuevo para reanudarlo. Si el servidor no puede volver, detenlo u olvídalo en Ajustes > Orca en tus hosts SSH.",
"olderTerminalsBridged": "Orca aún no está configurado en este host: los terminales iniciados por una versión anterior de Orca siguen ejecutándose en los proyectos de este host. Siguen funcionando aquí. Ciérralos o termínalos en el host y vuelve a conectarte.",
"olderTerminalsUncounted": "Los terminales iniciados por una versión anterior de Orca siguen ejecutándose en este host y no se detienen solos. Ciérralos en esa versión de Orca o termínalos en el host y vuelve a conectarte.",
"olderTerminalsUnverifiable": "Orca no pudo confirmar que los terminales iniciados por una versión anterior de Orca hayan terminado. Vuelve a conectarte para intentarlo de nuevo.",
"olderTerminals_one": "{{count}} terminal iniciado por una versión anterior de Orca sigue ejecutándose en este host y no se detiene solo. Ciérralo en esa versión de Orca o termínalo en el host y vuelve a conectarte.",
@@ -12619,12 +12622,18 @@
"linkedProjectsNoAutomations": "El servidor Orca de este host ya tenía {{paths}}, así que este escritorio ahora usa la copia del servidor. Las pestañas de este escritorio allí no se movieron, y los worktrees que creó allí aparecen como worktrees externos.",
"nodeDownloadBlocked": "Ni este equipo ni este host pudieron descargar Node.js, que el servidor de Orca necesita. Usa un mirror de Node.js o revisa la red en ambas máquinas.",
"nodeDownloadBlockedNoMirror": "Ni este equipo ni este host pudieron descargar Node.js, que el servidor de Orca necesita. Revisa la red o el proxy en ambas máquinas y vuelve a conectar.",
"nodeDownloadBlockedMirrorTried": "Ni este equipo ni este host pudieron descargar Node.js, tampoco desde el mirror de descarga de Node.js. Revisa el ajuste del mirror y vuelve a conectar."
"nodeDownloadBlockedMirrorTried": "Ni este equipo ni este host pudieron descargar Node.js, tampoco desde el mirror de descarga de Node.js. Revisa el ajuste del mirror y vuelve a conectar.",
"reassurance": "Se ejecuta en {{host}} y se accede a través de tu propia conexión SSH. Tu código y tus archivos se quedan donde están. Solo la lista de proyectos, pestañas y terminales de Orca pasa a {{host}}.",
"launchSessionEnded": "Es posible que los terminales de este Mac hayan perdido el acceso a la red local porque terminó la sesión SSH que inició el servidor de Orca de este host. Reinicia el servidor de Orca para restaurarlo.",
"behindRolledBack": "Ejecuta una versión del servidor de Orca más antigua que esta app; la última actualización se revirtió. Usa Actualizar servidor para intentarlo de nuevo.",
"behindNoTemplate": "Ejecuta una versión del servidor de Orca que esta app no puede actualizar; esta compilación no incluye un servidor para este host.",
"behindMigrating": "Ejecuta el servidor de Orca, que se actualizará cuando termine el traslado de sus proyectos.",
"behindCheckFailed": "Ejecuta el servidor de Orca; Orca no pudo comprobar si está por detrás de esta app."
},
"deltaMove": {
"action": "Mover los proyectos nuevos…",
"title": "Mover los proyectos nuevos",
"description": "Una versión anterior de Orca modificó este host después de que se moviera a su servidor gestionado. Esto agrega al servidor lo que creó; nunca sobrescribe lo que el servidor ya tiene.",
"description": "Una versión anterior de Orca modificó este host después de que sus proyectos pasaran al servidor de Orca del host. Esto agrega al servidor lo que creó; nunca sobrescribe lo que el servidor ya tiene.",
"added": "Agregado al servidor",
"nothingNew": "No hay nada nuevo que agregar.",
"notReflected": "Modificado o eliminado en la versión anterior; el servidor conserva su propia copia",
@@ -12639,14 +12648,14 @@
"keepServer": {
"action": "Conservar la versión del servidor…",
"title": "Conservar la versión del servidor",
"description": "Este host vuelve a su servidor gestionado tal como está. Lo que la versión anterior de Orca agregó o cambió aquí no se mueve; permanece solo en los ajustes guardados de esta computadora hasta que se limpien.",
"description": "Este host sigue usando su servidor de Orca tal como está. Lo que la versión anterior de Orca agregó o cambió aquí no se mueve; permanece solo en los ajustes guardados de esta computadora hasta que se limpien.",
"cancel": "Cancelar",
"confirm": "Conservar la versión del servidor"
},
"moveAnyway": {
"action": "Mover de todos modos…",
"title": "Mover este host de todos modos",
"description": "Orca mueve este host a su servidor gestionado sin los elementos guardados que aparecen abajo. Se quedan en este equipo y no aparecen en el servidor gestionado. Las ediciones sin guardar se conservan; nunca se eliminan.",
"description": "Orca se instala en {{host}} sin los elementos guardados que aparecen abajo. Se quedan en este equipo y no aparecen en {{host}}. Las ediciones sin guardar se conservan; nunca se eliminan.",
"cancel": "Cancelar",
"confirm": "Mover de todos modos"
},
@@ -12727,6 +12736,15 @@
"query": "La URL del mirror no puede tener una consulta ni un fragmento.",
"invalid": "Introduce una URL de mirror válida."
}
},
"restartServer": {
"action": "Reiniciar el servidor de Orca…",
"title": "Reiniciar el servidor de Orca",
"description": "Orca reinicia su servidor en este host desde tu conexión actual. Solo se reinicia cuando no hay terminales en ejecución en el host, porque los terminales que siguen abiertos se quedan sin acceso. Ciérralos primero.",
"terminalsUnknown": "Orca no pudo confirmar si hay terminales en ejecución en este host, así que no reinició el servidor de Orca.",
"terminalsRunning": "{{count}} terminales siguen en ejecución en este host. Ciérralos y luego reinicia el servidor de Orca.",
"cancel": "Cancelar",
"confirm": "Reiniciar"
}
},
"right": {
+45 -27
View File
@@ -1371,7 +1371,7 @@
},
"ipcEvents": {
"sshManagedServer": {
"refusedBlocked": "Cet hôte SSH n'a pas pu basculer vers un serveur Orca géré. La section Hôtes SSH des Paramètres en indique la raison."
"refusedBlocked": "Orca n’a pas pu s’installer sur cet hôte SSH. La section Hôtes SSH des Paramètres en indique la raison."
}
}
},
@@ -12591,8 +12591,8 @@
"keyOnHostDescription": "Collez la clé API depuis la page API Keys de la console sélectionnée. Elle est enregistrée sur {{host}} et envoyée depuis cet hôte uniquement à ce site pour actualiser l’utilisation."
},
"sshManagedHostRemove": {
"description": "{{label}} exécute un serveur Orca géré. Dans Serveurs gérés, utilisez Arrêter… pour retirer le serveur de l’hôte, ou Oublier… si l’hôte n’existe plus. Vous pourrez ensuite supprimer cet hôte SSH.",
"open": "Ouvrir Serveurs gérés"
"description": "Orca s’exécute sur {{label}}. Dans Orca sur vos hôtes SSH, utilisez Arrêter… pour retirer Orca de l’hôte, ou Oublier… si l’hôte n’existe plus. Vous pourrez ensuite supprimer cet hôte SSH.",
"open": "Ouvrir Orca sur vos hôtes SSH"
},
"managedServers": {
"row": {
@@ -12614,10 +12614,11 @@
"forget": "Oublier…",
"confirmForget": "Oublier sur ce poste",
"keepLinked": "Garder lié",
"forgetDescription": "Dissocie ce serveur ici sans contacter son hôte. Si l'hôte revient, le serveur y tourne peut-être encore."
"forgetDescription": "Dissocie ce serveur ici sans contacter son hôte. Si l'hôte revient, le serveur y tourne peut-être encore.",
"title": "Orca sur {{host}}"
},
"title": "Serveurs gérés",
"description": "Orca installe et exécute un serveur sur un hôte SSH vide, et le maintient à jour.",
"title": "Orca sur vos hôtes SSH",
"description": "Orca s’installe sur un hôte SSH vide et se maintient à jour.",
"deploy": {
"host": "Hôte SSH",
"hostPlaceholder": "Choisissez un hôte SSH vide",
@@ -12642,8 +12643,9 @@
"cancelLink": "Annuler"
},
"search": {
"title": "Serveurs gérés",
"keywordSsh": "ssh"
"title": "Orca sur vos hôtes SSH",
"keywordSsh": "ssh",
"keywordFormerName": "serveurs gérés"
},
"phase": {
"fenced": "Hôte verrouillé",
@@ -12662,7 +12664,7 @@
},
"blocker": {
"notFound": "L'hôte SSH n'existe plus.",
"owned": "Cet hôte SSH appartient déjà à un serveur géré.",
"owned": "Orca s’exécute déjà sur cet hôte SSH.",
"catalog": "Les projets de cet hôte ne peuvent pas encore être déplacés.",
"terminals": "Des terminaux sont encore en cours sur cet hôte ({{count}}). Fermez-les d'abord.",
"portForwards": "Les redirections de port enregistrées restent liées à l'hôte SSH.",
@@ -12692,17 +12694,18 @@
"migration": "Non effectué : un déplacement vers ce serveur est inachevé. Reprenez-le d'abord.",
"deferred": "Pas encore effectué : le serveur n'est pas prêt pour cela. Réessayez plus tard.",
"failed": "Orca n'a pas pu terminer cette action sur le serveur. Réessayez."
}
},
"reassurance": "S’exécute sur chaque hôte, accessible via votre propre connexion SSH. Votre code et vos fichiers restent où ils sont. Seule la liste des projets, onglets et terminaux d’Orca passe sur l’hôte."
},
"sshHostServer": {
"sourceChanged": "Une version plus ancienne d'Orca a modifié les projets de cet hôte. Déplacez ces modifications vers son serveur géré, ou conservez la version du serveur, pour vous reconnecter.",
"deploying": "Configuration d'un serveur Orca géré…",
"converting": "Déplacement des projets de cet hôte vers son serveur Orca géré…",
"connecting": "Connexion au serveur Orca géré…",
"updating": "Mise à jour du serveur géré…",
"starting": "Démarrage du serveur géré…",
"notServing": "Orca n’a pas pu confirmer que le serveur géré répond.",
"hostNewer": "Exécute un serveur Orca géré issu d'une version plus récente d'Orca ; il conserve cette version.",
"sourceChanged": "Une version plus ancienne d’Orca a modifié les projets de cet hôte. Déplacez ces modifications vers le serveur Orca de cet hôte, ou conservez la version du serveur, pour vous reconnecter.",
"deploying": "Configuration d’Orca sur {{host}}…",
"converting": "Passage à Orca sur {{host}}…",
"connecting": "Connexion à Orca sur {{host}}…",
"updating": "Mise à jour d’Orca sur {{host}}…",
"starting": "Démarrage d’Orca sur {{host}}…",
"notServing": "Orca n’a pas pu confirmer que son serveur sur {{host}} répond.",
"hostNewer": "Exécute une version du serveur Orca plus récente que cette app ; il conserve cette version.",
"failureDetails": "Détails",
"cause": {
"unsupportedHost": "Orca n'a pas de build de serveur pour ce système",
@@ -12712,15 +12715,15 @@
"securitySoftware": "un logiciel de sécurité a modifié le runtime du serveur",
"nativePreflight": "il manque à l'hôte des bibliothèques système dont le serveur a besoin"
},
"updateDeferredLater": "Exécute un serveur Orca géré ; il se met à jour lors d'une prochaine connexion.",
"updateFailedPrevious": "Exécute un serveur Orca géré sur sa version précédente ; sa mise à jour a échoué.",
"refusedBlocked": "Non basculé vers un serveur géré : un élément de cet hôte bloque le déplacement.",
"updateDeferredLater": "Exécute le serveur Orca ; il se met à jour lors d’une prochaine connexion.",
"updateFailedPrevious": "Exécute le serveur Orca sur sa version précédente ; sa mise à jour a échoué.",
"refusedBlocked": "Orca n’est pas encore installé sur cet hôte : un élément de l’hôte bloque le déplacement.",
"unsupported": "Cette version d’Orca ne prend pas en charge cet hôte ({{reason}}). Pour continuer à l’utiliser, installez une version antérieure d’Orca.",
"unsupportedUnknown": "Cette version d’Orca ne prend pas en charge cet hôte. Pour continuer à l’utiliser, installez une version antérieure d’Orca.",
"tunnelUnsupported": "Cette version d’Orca ne prend pas en charge cet hôte : son serveur SSH n’autorise pas le transfert de port, et Orca n’a pas non plus pu joindre son serveur via la session SSH. Pour continuer à l’utiliser, installez une version antérieure d’Orca.",
"setupRetry": "Orca n’a pas pu démarrer son serveur sur cet hôte. Réessayez de vous connecter.",
"moveHeld": "Orca a mis en pause le déplacement des projets de cet hôte vers son serveur géré, car il n’a pas pu confirmer la copie du serveur. Rien n’est perdu : l’hôte conserve ses projets et reste verrouillé jusqu’à la fin du déplacement. Reconnectez-vous pour reprendre. Si le serveur ne peut pas revenir, arrêtez-le ou oubliez-le dans Réglages > Serveurs gérés.",
"olderTerminalsBridged": "Pas encore déplacé vers un serveur géré : des terminaux lancés par une version antérieure d’Orca sont toujours en cours d’exécution dans les projets de cet hôte. Ils continuent de fonctionner ici. Fermez-les ou arrêtez-les sur l’hôte, puis reconnectez-vous.",
"moveHeld": "Orca a mis en pause le déplacement des projets de cet hôte vers le serveur Orca de l’hôte, car il n’a pas pu confirmer la copie du serveur. Rien n’est perdu : l’hôte conserve ses projets et reste verrouillé jusqu’à la fin du déplacement. Reconnectez-vous pour reprendre. Si le serveur ne peut pas revenir, arrêtez-le ou oubliez-le dans Paramètres > Orca sur vos hôtes SSH.",
"olderTerminalsBridged": "Orca n’est pas encore installé sur cet hôte : des terminaux lancés par une version antérieure d’Orca sont toujours en cours d’exécution dans les projets de cet hôte. Ils continuent de fonctionner ici. Fermez-les ou arrêtez-les sur l’hôte, puis reconnectez-vous.",
"olderTerminalsUncounted": "Des terminaux lancés par une version antérieure d’Orca sont toujours en cours d’exécution sur cet hôte et ne s’arrêtent pas d’eux-mêmes. Fermez-les dans cette version d’Orca ou arrêtez-les sur l’hôte, puis reconnectez-vous.",
"olderTerminalsUnverifiable": "Orca n’a pas pu confirmer que les terminaux lancés par une version antérieure d’Orca sont terminés. Reconnectez-vous pour réessayer.",
"olderTerminals_one": "{{count}} terminal lancé par une version antérieure d’Orca est toujours en cours d’exécution sur cet hôte et ne s’arrête pas de lui-même. Fermez-le dans cette version d’Orca ou arrêtez-le sur l’hôte, puis reconnectez-vous.",
@@ -12732,12 +12735,18 @@
"linkedProjectsNoAutomations": "Le serveur Orca de cet hôte avait déjà {{paths}} ; ce bureau utilise donc maintenant la copie du serveur. Les onglets de ce bureau à cet endroit n’ont pas été déplacés, et les worktrees qu’il y a créés apparaissent comme worktrees externes.",
"nodeDownloadBlocked": "Ni cet ordinateur ni cet hôte n’ont pu télécharger Node.js, dont le serveur Orca a besoin. Utilisez un miroir Node.js ou vérifiez le réseau sur les deux machines.",
"nodeDownloadBlockedNoMirror": "Ni cet ordinateur ni cet hôte n’ont pu télécharger Node.js, dont le serveur Orca a besoin. Vérifiez le réseau ou le proxy sur les deux machines, puis reconnectez-vous.",
"nodeDownloadBlockedMirrorTried": "Ni cet ordinateur ni cet hôte n’ont pu télécharger Node.js, y compris depuis le miroir de téléchargement Node.js. Vérifiez le paramètre du miroir, puis reconnectez-vous."
"nodeDownloadBlockedMirrorTried": "Ni cet ordinateur ni cet hôte n’ont pu télécharger Node.js, y compris depuis le miroir de téléchargement Node.js. Vérifiez le paramètre du miroir, puis reconnectez-vous.",
"reassurance": "S’exécute sur {{host}}, accessible via votre propre connexion SSH. Votre code et vos fichiers restent où ils sont. Seule la liste des projets, onglets et terminaux d’Orca passe sur {{host}}.",
"launchSessionEnded": "Les terminaux de ce Mac ont peut-être perdu l’accès au réseau local, car la session SSH qui a démarré le serveur Orca de cet hôte s’est terminée. Redémarrez le serveur Orca pour le rétablir.",
"behindRolledBack": "Exécute une version du serveur Orca plus ancienne que cette app ; la dernière mise à jour a été annulée. Utilisez Mettre à jour le serveur pour réessayer.",
"behindNoTemplate": "Exécute une version du serveur Orca que cette app ne peut pas mettre à jour ; cette version d’Orca n’inclut pas de serveur pour cet hôte.",
"behindMigrating": "Exécute le serveur Orca, qui se mettra à jour une fois le déplacement de ses projets terminé.",
"behindCheckFailed": "Exécute le serveur Orca ; Orca n’a pas pu vérifier s’il est en retard sur cette app."
},
"deltaMove": {
"action": "Déplacer les nouveaux projets…",
"title": "Déplacer les nouveaux projets",
"description": "Une version plus ancienne d'Orca a modifié cet hôte après son déplacement vers son serveur géré. Cela ajoute au serveur ce qu'elle a créé ; rien n'est jamais fusionné par-dessus ce que le serveur contient déjà.",
"description": "Une version plus ancienne d’Orca a modifié cet hôte après le transfert de ses projets vers le serveur Orca de l’hôte. Cela ajoute au serveur ce qu’elle a créé ; rien n’est jamais fusionné par-dessus ce que le serveur contient déjà.",
"added": "Ajouté au serveur",
"nothingNew": "Rien de nouveau à ajouter.",
"notReflected": "Modifié ou supprimé sur la version plus ancienne ; le serveur conserve sa propre copie",
@@ -12752,14 +12761,14 @@
"keepServer": {
"action": "Conserver la version du serveur…",
"title": "Conserver la version du serveur",
"description": "Cet hôte revient à son serveur géré tel quel. Ce que la version plus ancienne d'Orca a ajouté ou modifié ici n'est pas déplacé ; cela reste uniquement dans les paramètres enregistrés de cet ordinateur jusqu'à leur nettoyage.",
"description": "Cet hôte continue d’utiliser son serveur Orca tel quel. Ce que la version plus ancienne d’Orca a ajouté ou modifié ici n’est pas déplacé ; cela reste uniquement dans les paramètres enregistrés de cet ordinateur jusqu’à leur nettoyage.",
"cancel": "Annuler",
"confirm": "Conserver la version du serveur"
},
"moveAnyway": {
"action": "Déplacer quand même…",
"title": "Déplacer cet hôte quand même",
"description": "Orca déplace cet hôte vers son serveur géré sans les éléments enregistrés ci-dessous. Ils restent sur cet ordinateur et n’apparaissent pas sur le serveur géré. Les modifications non enregistrées sont conservées, jamais supprimées.",
"description": "Orca s’installe sur {{host}} sans les éléments enregistrés ci-dessous. Ils restent sur cet ordinateur et n’apparaissent pas sur {{host}}. Les modifications non enregistrées sont conservées, jamais supprimées.",
"cancel": "Annuler",
"confirm": "Déplacer quand même"
},
@@ -12840,6 +12849,15 @@
"query": "L’URL du miroir ne peut pas contenir de requête ni de fragment.",
"invalid": "Saisissez une URL de miroir valide."
}
},
"restartServer": {
"action": "Redémarrer le serveur Orca…",
"title": "Redémarrer le serveur Orca",
"description": "Orca redémarre son serveur sur cet hôte depuis votre connexion actuelle. Il ne redémarre que si aucun terminal n’est en cours d’exécution sur l’hôte, car les terminaux encore ouverts restent privés d’accès. Fermez-les d’abord.",
"terminalsUnknown": "Orca n’a pas pu confirmer si des terminaux sont en cours d’exécution sur cet hôte, il n’a donc pas redémarré le serveur Orca.",
"terminalsRunning": "{{count}} terminaux sont toujours en cours d’exécution sur cet hôte. Fermez-les, puis redémarrez le serveur Orca.",
"cancel": "Annuler",
"confirm": "Redémarrer"
}
},
"right": {
+45 -27
View File
@@ -1267,7 +1267,7 @@
},
"ipcEvents": {
"sshManagedServer": {
"refusedBlocked": "この SSH ホストを管理対象の Orca サーバーに移動できませんでした。理由は設定の [SSH ホスト] で確認できます。"
"refusedBlocked": "この SSH ホストに Orca をセットアップできませんでした。理由は設定の [SSH ホスト] で確認できます。"
}
}
},
@@ -12483,8 +12483,8 @@
"keyOnHostDescription": "選択したコンソールの API Keys ページから API キーを貼り付けてください。{{host}} に保存され、使用量の更新時にそこからそのサイトにのみ送信されます。"
},
"sshManagedHostRemove": {
"description": "{{label}} では管理対象の Orca サーバーが実行されています。管理対象サーバーで「停止…」を使ってホストからサーバーを削除するか、ホストがもう存在しない場合は「登録を解除…」を使ってください。その後、この SSH ホストを削除できます。",
"open": "管理対象サーバーを開く"
"description": "{{label}} では Orca が動作しています。[SSH ホスト上の Orca] で「停止…」を使ってホストから Orca を削除するか、ホストがもう存在しない場合は「登録を解除…」を使ってください。その後、この SSH ホストを削除できます。",
"open": "SSH ホスト上の Orca を開く"
},
"managedServers": {
"row": {
@@ -12506,10 +12506,11 @@
"forget": "登録を解除…",
"confirmForget": "このデスクトップから登録を解除",
"keepLinked": "リンクを維持",
"forgetDescription": "ホストに接続せずに、このサーバーのリンクをここで解除します。ホストが復帰した場合、サーバーはまだそこで動作している可能性があります。"
"forgetDescription": "ホストに接続せずに、このサーバーのリンクをここで解除します。ホストが復帰した場合、サーバーはまだそこで動作している可能性があります。",
"title": "{{host}} 上の Orca"
},
"title": "管理対象サーバー",
"description": "Orca は空の SSH ホストにサーバーをインストールして実行し、最新の状態に保ちます。",
"title": "SSH ホスト上の Orca",
"description": "Orca は空の SSH ホストに自身をインストールし、常に最新の状態を保ちます。",
"deploy": {
"host": "SSH ホスト",
"hostPlaceholder": "空の SSH ホストを選択",
@@ -12534,8 +12535,9 @@
"cancelLink": "キャンセル"
},
"search": {
"title": "管理対象サーバー",
"keywordSsh": "ssh"
"title": "SSH ホスト上の Orca",
"keywordSsh": "ssh",
"keywordFormerName": "管理対象サーバー"
},
"phase": {
"fenced": "ホストのロック完了",
@@ -12554,7 +12556,7 @@
},
"blocker": {
"notFound": "SSH ホストが存在しません。",
"owned": "この SSH ホストはすでに管理対象サーバーに属しています。",
"owned": "この SSH ホストではすでに Orca が動作しています。",
"catalog": "このホスト上のプロジェクトはまだ移動できません。",
"terminals": "このホスト上のターミナルがまだ実行中です({{count}})。先に閉じてください。",
"portForwards": "保存済みのポート転送は SSH ホストに残ります。",
@@ -12584,17 +12586,18 @@
"migration": "未完了: このサーバーへの移動が終わっていません。先に再開してください。",
"deferred": "まだ未完了です: サーバーはこの操作の準備ができていません。しばらくしてから、もう一度お試しください。",
"failed": "Orca はサーバー上でこれを完了できませんでした。もう一度お試しください。"
}
},
"reassurance": "各ホスト上で動作し、あなた自身の SSH 接続を通じて利用します。コードやファイルは今の場所から動きません。ホストに移るのは、Orca のプロジェクト、タブ、ターミナルの一覧だけです。"
},
"sshHostServer": {
"sourceChanged": "古いバージョンの Orca がこのホストのプロジェクトを変更しました。再接続するには、その変更を管理対象サーバーに移動するか、サーバーのバージョンを維持してください。",
"deploying": "管理対象の Orca サーバーをセットアップ中…",
"converting": "このホストのプロジェクトを管理対象の Orca サーバーに移動中…",
"connecting": "管理対象の Orca サーバーに接続中…",
"updating": "管理対象サーバーを更新中…",
"starting": "管理対象サーバーを起動中…",
"notServing": "Orca は管理対象サーバーが応答していることを確認できませんでした。",
"hostNewer": "より上位バージョンの Orca で管理対象 Orca サーバーを実行しています。そのバージョンが維持されます。",
"sourceChanged": "古いバージョンの Orca がこのホストのプロジェクトを変更しました。再接続するには、その変更をこのホストの Orca サーバーに移動するか、サーバーのバージョンを維持してください。",
"deploying": "{{host}} に Orca をセットアップ中…",
"converting": "{{host}} 上の Orca に移行中…",
"connecting": "{{host}} 上の Orca に接続中…",
"updating": "{{host}} 上の Orca を更新中…",
"starting": "{{host}} 上の Orca を起動中…",
"notServing": "Orca は {{host}} 上のサーバーが応答していることを確認できませんでした。",
"hostNewer": "このアプリより新しい Orca サーバーを実行しています。そのバージョンが維持されます。",
"failureDetails": "詳細",
"cause": {
"unsupportedHost": "Orca にはこのシステム用のサーバービルドがありません",
@@ -12604,15 +12607,15 @@
"securitySoftware": "セキュリティソフトウェアがサーバーのランタイムを変更しました",
"nativePreflight": "ホストにサーバーが必要とするシステムライブラリがありません"
},
"updateDeferredLater": "管理対象の Orca サーバーを実行しています。次回の接続時に更新されます。",
"updateFailedPrevious": "管理対象の Orca サーバーを以前のバージョンで実行しています。更新に失敗しました。",
"refusedBlocked": "管理対象サーバーに移動されませんでした: このホスト上の何かが移動を妨げています。",
"updateDeferredLater": "Orca サーバーを実行しています。次回の接続時に更新されます。",
"updateFailedPrevious": "Orca サーバーを以前のバージョンで実行しています。更新に失敗しました。",
"refusedBlocked": "このホストにはまだ Orca がセットアップされていません: ホスト上の何かが移動を妨げています。",
"unsupported": "このバージョンの Orca はこのホストをサポートしていません({{reason}})。引き続き使用するには、以前のバージョンの Orca をインストールしてください。",
"unsupportedUnknown": "このバージョンの Orca はこのホストをサポートしていません。引き続き使用するには、以前のバージョンの Orca をインストールしてください。",
"tunnelUnsupported": "このバージョンの Orca はこのホストをサポートしていません。ホストの SSH サーバーがポート転送を許可しておらず、SSH セッション経由でも Orca のサーバーに接続できませんでした。引き続き使用するには、以前のバージョンの Orca をインストールしてください。",
"setupRetry": "Orca はこのホストでサーバーを起動できませんでした。もう一度接続してください。",
"moveHeld": "サーバー側のコピーを確認できなかったため、Orca はこのホストのプロジェクトを管理対象サーバーへ移動する処理を一時停止しました。データは失われていません。移動が完了するまで、ホストはプロジェクトを保持したままロックされます。再接続すると再開します。サーバーが復帰できない場合は、設定 > 管理対象サーバーで停止するか登録を解除してください。",
"olderTerminalsBridged": "まだ管理サーバーに移行していません。以前のバージョンの Orca で開始されたターミナルがこのホストのプロジェクトでまだ実行中です。ターミナルはここで引き続き使えます。閉じるかホスト上で終了してから再接続してください。",
"moveHeld": "サーバー側のコピーを確認できなかったため、Orca はこのホストのプロジェクトをホスト上の Orca サーバーへ移動する処理を一時停止しました。データは失われていません。移動が完了するまで、ホストはプロジェクトを保持したままロックされます。再接続すると再開します。サーバーが復帰できない場合は、設定 > SSH ホスト上の Orca で停止するか登録を解除してください。",
"olderTerminalsBridged": "このホストにはまだ Orca がセットアップされていません。以前のバージョンの Orca で開始されたターミナルがこのホストのプロジェクトでまだ実行中です。ターミナルはここで引き続き使えます。閉じるかホスト上で終了してから再接続してください。",
"olderTerminalsUncounted": "以前のバージョンの Orca で開始されたターミナルがこのホストでまだ実行中で、自動では終了しません。そのバージョンの Orca で閉じるか、ホスト上で終了してから再接続してください。",
"olderTerminalsUnverifiable": "以前のバージョンの Orca で開始されたターミナルが終了したことを確認できませんでした。再接続してもう一度お試しください。",
"olderTerminals_one": "以前のバージョンの Orca で開始された {{count}} 個のターミナルがこのホストでまだ実行中で、自動では終了しません。そのバージョンの Orca で閉じるか、ホスト上で終了してから再接続してください。",
@@ -12624,12 +12627,18 @@
"linkedProjectsNoAutomations": "このホストの Orca サーバーには {{paths}} が既にあったため、このデスクトップはサーバーのコピーを使用します。このデスクトップのタブは移動されず、ここで作成したワークツリーは外部ワークツリーとして表示されます。",
"nodeDownloadBlocked": "Orca のサーバーに必要な Node.js を、このコンピュータとこのホストのどちらもダウンロードできませんでした。Node.js のミラーを使うか、両方のマシンのネットワークを確認してください。",
"nodeDownloadBlockedNoMirror": "Orca のサーバーに必要な Node.js を、このコンピュータとこのホストのどちらもダウンロードできませんでした。両方のマシンのネットワークまたはプロキシを確認してから、もう一度接続してください。",
"nodeDownloadBlockedMirrorTried": "このコンピュータとこのホストのどちらも、Node.js のダウンロードミラーを含めて Node.js をダウンロードできませんでした。ミラーの設定を確認してから、もう一度接続してください。"
"nodeDownloadBlockedMirrorTried": "このコンピュータとこのホストのどちらも、Node.js のダウンロードミラーを含めて Node.js をダウンロードできませんでした。ミラーの設定を確認してから、もう一度接続してください。",
"reassurance": "{{host}} 上で動作し、あなた自身の SSH 接続を通じて利用します。コードやファイルは今の場所から動きません。{{host}} に移るのは、Orca のプロジェクト、タブ、ターミナルの一覧だけです。",
"launchSessionEnded": "このホストの Orca サーバーを起動した SSH セッションが終了したため、この Mac のターミナルがローカルネットワークにアクセスできなくなっている可能性があります。Orca サーバーを再起動すると復元されます。",
"behindRolledBack": "このアプリより古い Orca サーバーを実行しています。前回の更新はロールバックされました。[サーバーを更新] で再試行してください。",
"behindNoTemplate": "このアプリでは更新できない Orca サーバーを実行しています。このビルドにはこのホスト用のサーバーが含まれていません。",
"behindMigrating": "Orca サーバーを実行しています。プロジェクトの移動が完了した後に更新されます。",
"behindCheckFailed": "Orca サーバーを実行しています。Orca はこのアプリより古いかどうかを確認できませんでした。"
},
"deltaMove": {
"action": "新規プロジェクトを移動…",
"title": "新規プロジェクトを移動",
"description": "このホストは、管理対象サーバーに移動したあとに古いバージョンの Orca によって変更されました。これは作成されたものをサーバーに追加するもので、サーバーにすでにあるものをマージして上書きすることはありません。",
"description": "このホストのプロジェクトがホスト上の Orca サーバーに移動したあとに、古いバージョンの Orca がこのホストを変更しました。これは作成されたものをサーバーに追加するもので、サーバーにすでにあるものをマージして上書きすることはありません。",
"added": "サーバーに追加されました",
"nothingNew": "新規に追加するものはありません。",
"notReflected": "古いバージョンで変更または削除されました。サーバーは自身のコピーを保持します",
@@ -12644,14 +12653,14 @@
"keepServer": {
"action": "サーバーのバージョンを保持…",
"title": "サーバーのバージョンを保持",
"description": "このホストはそのまま管理対象サーバーに戻ります。古いバージョンの Orca がここに追加または変更したものは移動されず、クリーンアップされるまでこのコンピュータの保存済み設定にのみ残ります。",
"description": "このホストは現在の Orca サーバーをそのまま使い続けます。古いバージョンの Orca がここに追加または変更したものは移動されず、クリーンアップされるまでこのコンピュータの保存済み設定にのみ残ります。",
"cancel": "キャンセル",
"confirm": "サーバーのバージョンを保持"
},
"moveAnyway": {
"action": "それでも移行…",
"title": "このホストをそれでも移行",
"description": "Orca はこのホストを管理サーバーへ移行しますが、以下の保存済み項目は含めません。これらはこのコンピューターに残り、管理サーバーには表示されません。未保存の編集は保持され、削除されることはありません。",
"description": "Orca は以下の保存済み項目を含めずに {{host}} に自身をセットアップします。これらはこのコンピューターに残り、{{host}} には表示されません。未保存の編集は保持され、削除されることはありません。",
"cancel": "キャンセル",
"confirm": "それでも移行"
},
@@ -12732,6 +12741,15 @@
"query": "ミラーの URL にクエリやフラグメントは含められません。",
"invalid": "有効なミラーの URL を入力してください。"
}
},
"restartServer": {
"action": "Orca サーバーを再起動…",
"title": "Orca サーバーを再起動",
"description": "Orca は現在の接続からこのホストの Orca サーバーを再起動します。開いたままのターミナルはアクセスが切れたままになるため、ホスト上でターミナルが実行されていない場合にのみ再起動します。先に閉じてください。",
"terminalsUnknown": "このホストでターミナルが実行中かどうかを確認できなかったため、Orca サーバーを再起動しませんでした。",
"terminalsRunning": "このホストでは {{count}} 個のターミナルがまだ実行中です。閉じてから Orca サーバーを再起動してください。",
"cancel": "キャンセル",
"confirm": "再起動"
}
},
"right": {
+45 -27
View File
@@ -1267,7 +1267,7 @@
},
"ipcEvents": {
"sshManagedServer": {
"refusedBlocked": "이 SSH 호스트는 관리형 Orca 서버로 이동할 수 없습니다. 이유는 설정의 SSH 호스트에서 확인할 수 있습니다."
"refusedBlocked": "이 SSH 호스트에 Orca를 설정할 수 없습니다. 이유는 설정의 SSH 호스트에서 확인할 수 있습니다."
}
}
},
@@ -12483,8 +12483,8 @@
"keyOnHostDescription": "선택한 콘솔의 API Keys 페이지에서 API 키를 붙여 넣으세요. {{host}}에 저장되며, 사용량을 새로 고칠 때 그곳에서 해당 사이트로만 전송됩니다."
},
"sshManagedHostRemove": {
"description": "{{label}}에서 관리형 Orca 서버가 실행 중입니다. 관리형 서버에서 중지…를 사용해 호스트에서 서버를 제거하거나, 호스트가 없어졌다면 잊기…를 사용하세요. 그런 다음 이 SSH 호스트를 제거할 수 있습니다.",
"open": "관리형 서버 열기"
"description": "{{label}}에서 Orca가 실행 중입니다. SSH 호스트의 Orca에서 중지…를 사용해 호스트에서 Orca를 제거하거나, 호스트가 없어졌다면 잊기…를 사용하세요. 그런 다음 이 SSH 호스트를 제거할 수 있습니다.",
"open": "SSH 호스트의 Orca 열기"
},
"managedServers": {
"row": {
@@ -12506,10 +12506,11 @@
"forget": "잊기…",
"confirmForget": "이 데스크톱에서 잊기",
"keepLinked": "연결 유지",
"forgetDescription": "호스트에 연결하지 않고 여기서 이 서버의 연결을 해제합니다. 호스트가 다시 살아나면 서버가 그곳에서 계속 실행 중일 수 있습니다."
"forgetDescription": "호스트에 연결하지 않고 여기서 이 서버의 연결을 해제합니다. 호스트가 다시 살아나면 서버가 그곳에서 계속 실행 중일 수 있습니다.",
"title": "{{host}}의 Orca"
},
"title": "관리형 서버",
"description": "Orca는 빈 SSH 호스트에 서버를 설치하고 실행하며 최신 상태로 유지합니다.",
"title": "SSH 호스트의 Orca",
"description": "Orca는 빈 SSH 호스트에 자신을 설치하고 스스로 최신 상태를 유지합니다.",
"deploy": {
"host": "SSH 호스트",
"hostPlaceholder": "빈 SSH 호스트를 선택하세요",
@@ -12534,8 +12535,9 @@
"cancelLink": "취소"
},
"search": {
"title": "관리형 서버",
"keywordSsh": "ssh"
"title": "SSH 호스트의 Orca",
"keywordSsh": "ssh",
"keywordFormerName": "관리형 서버"
},
"phase": {
"fenced": "호스트 잠김",
@@ -12554,7 +12556,7 @@
},
"blocker": {
"notFound": "SSH 호스트가 사라졌습니다.",
"owned": "이 SSH 호스트는 이미 관리형 서버에 속해 있습니다.",
"owned": "이 SSH 호스트에서는 이미 Orca가 실행 중입니다.",
"catalog": "이 호스트의 프로젝트는 아직 이동할 수 없습니다.",
"terminals": "이 호스트의 터미널이 아직 실행 중입니다({{count}}개). 먼저 닫으세요.",
"portForwards": "저장된 포트 포워딩은 SSH 호스트에 그대로 남습니다.",
@@ -12584,17 +12586,18 @@
"migration": "완료되지 않음: 이 서버로의 이동이 끝나지 않았습니다. 먼저 재개하세요.",
"deferred": "아직 완료되지 않음: 서버가 아직 준비되지 않았습니다. 나중에 다시 시도하세요.",
"failed": "Orca가 서버에서 이 작업을 완료하지 못했습니다. 다시 시도하세요."
}
},
"reassurance": "각 호스트에서 실행되며 사용자 본인의 SSH 연결로 접속합니다. 코드와 파일은 지금 있는 곳에 그대로 있습니다. 호스트로 옮겨지는 것은 Orca의 프로젝트, 탭, 터미널 목록뿐입니다."
},
"sshHostServer": {
"sourceChanged": "이전 버전의 Orca가 이 호스트의 프로젝트를 변경했습니다. 다시 연결하려면 해당 변경 사항을 관리형 서버로 이동하거나 서버 버전을 유지하세요.",
"deploying": "관리형 Orca 서버 설정 중…",
"converting": "이 호스트의 프로젝트를 관리형 Orca 서버로 이동하는 중…",
"connecting": "관리형 Orca 서버에 연결 중…",
"updating": "관리형 서버 업데이트 중…",
"starting": "관리형 서버 시작 중…",
"notServing": "Orca가 관리형 서버의 응답 여부를 확인하지 못했습니다.",
"hostNewer": "더 새로운 Orca의 관리형 Orca 서버를 실행합니다. 해당 버전을 유지합니다.",
"sourceChanged": "이전 버전의 Orca가 이 호스트의 프로젝트를 변경했습니다. 다시 연결하려면 해당 변경 사항을 이 호스트의 Orca 서버로 이동하거나 서버 버전을 유지하세요.",
"deploying": "{{host}}에 Orca 설정 중…",
"converting": "{{host}}의 Orca로 옮기는 중…",
"connecting": "{{host}}의 Orca에 연결 중…",
"updating": "{{host}}의 Orca 업데이트 중…",
"starting": "{{host}}의 Orca 시작 중…",
"notServing": "Orca가 {{host}}의 서버 응답 여부를 확인하지 못했습니다.",
"hostNewer": "이 앱보다 새로운 Orca 서버를 실행합니다. 해당 버전을 유지합니다.",
"failureDetails": "세부 정보",
"cause": {
"unsupportedHost": "Orca에는 이 시스템용 서버 빌드가 없습니다",
@@ -12604,15 +12607,15 @@
"securitySoftware": "보안 소프트웨어가 서버 런타임을 변경했습니다",
"nativePreflight": "호스트에 서버에 필요한 시스템 라이브러리가 없습니다"
},
"updateDeferredLater": "관리형 Orca 서버를 실행합니다. 다음 연결 시 업데이트됩니다.",
"updateFailedPrevious": "관리형 Orca 서버를 이전 버전으로 실행합니다. 업데이트에 실패했습니다.",
"refusedBlocked": "관리형 서버로 이동하지 않음: 이 호스트의 무언가가 이동을 막고 있습니다.",
"updateDeferredLater": "Orca 서버를 실행합니다. 다음 연결 시 업데이트됩니다.",
"updateFailedPrevious": "Orca 서버를 이전 버전으로 실행합니다. 업데이트에 실패했습니다.",
"refusedBlocked": "아직 이 호스트에 Orca가 설정되지 않음: 호스트의 무언가가 이동을 막고 있습니다.",
"unsupported": "이 버전의 Orca는 이 호스트를 지원하지 않습니다({{reason}}). 계속 사용하려면 이전 버전의 Orca를 설치하세요.",
"unsupportedUnknown": "이 버전의 Orca는 이 호스트를 지원하지 않습니다. 계속 사용하려면 이전 버전의 Orca를 설치하세요.",
"tunnelUnsupported": "이 버전의 Orca는 이 호스트를 지원하지 않습니다. 호스트의 SSH 서버가 포트 포워딩을 허용하지 않으며, SSH 세션을 통해서도 Orca 서버에 연결할 수 없었습니다. 계속 사용하려면 이전 버전의 Orca를 설치하세요.",
"setupRetry": "Orca가 이 호스트에서 서버를 시작하지 못했습니다. 다시 연결해 보세요.",
"moveHeld": "서버의 사본을 확인하지 못해 Orca가 이 호스트의 프로젝트를 관리형 서버로 옮기는 작업을 일시 중지했습니다. 손실된 것은 없습니다. 이동이 끝날 때까지 호스트는 프로젝트를 유지한 채 잠겨 있습니다. 다시 연결하면 재개됩니다. 서버를 되살릴 수 없다면 설정 > 관리형 서버에서 중지하거나 잊기를 선택하세요.",
"olderTerminalsBridged": "아직 관리 서버로 옮기지 않았습니다. 이전 버전의 Orca에서 시작한 터미널이 이 호스트의 프로젝트에서 아직 실행 중입니다. 터미널은 여기에서 계속 작동합니다. 닫거나 호스트에서 종료한 후 다시 연결하세요.",
"moveHeld": "서버의 사본을 확인하지 못해 Orca가 이 호스트의 프로젝트를 호스트의 Orca 서버로 옮기는 작업을 일시 중지했습니다. 손실된 것은 없습니다. 이동이 끝날 때까지 호스트는 프로젝트를 유지한 채 잠겨 있습니다. 다시 연결하면 재개됩니다. 서버를 되살릴 수 없다면 설정 > SSH 호스트의 Orca에서 중지하거나 잊기를 선택하세요.",
"olderTerminalsBridged": "아직 이 호스트에 Orca가 설정되지 않았습니다. 이전 버전의 Orca에서 시작한 터미널이 이 호스트의 프로젝트에서 아직 실행 중입니다. 터미널은 여기에서 계속 작동합니다. 닫거나 호스트에서 종료한 후 다시 연결하세요.",
"olderTerminalsUncounted": "이전 버전의 Orca에서 시작한 터미널이 이 호스트에서 아직 실행 중이며 저절로 종료되지 않습니다. 해당 버전의 Orca에서 닫거나 호스트에서 종료한 후 다시 연결하세요.",
"olderTerminalsUnverifiable": "이전 버전의 Orca에서 시작한 터미널이 종료되었는지 확인할 수 없습니다. 다시 연결하여 다시 시도하세요.",
"olderTerminals_one": "이전 버전의 Orca에서 시작한 터미널 {{count}}개가 이 호스트에서 아직 실행 중이며 저절로 종료되지 않습니다. 해당 버전의 Orca에서 닫거나 호스트에서 종료한 후 다시 연결하세요.",
@@ -12624,12 +12627,18 @@
"linkedProjectsNoAutomations": "이 호스트의 Orca 서버에 {{paths}}이(가) 이미 있어 이 데스크톱은 이제 서버의 사본을 사용합니다. 이 데스크톱의 탭은 이동되지 않았으며, 여기서 만든 워크트리는 외부 워크트리로 표시됩니다.",
"nodeDownloadBlocked": "이 컴퓨터와 이 호스트 모두 Orca 서버에 필요한 Node.js를 다운로드하지 못했습니다. Node.js 미러를 사용하거나 두 컴퓨터의 네트워크를 확인하세요.",
"nodeDownloadBlockedNoMirror": "이 컴퓨터와 이 호스트 모두 Orca 서버에 필요한 Node.js를 다운로드하지 못했습니다. 두 컴퓨터의 네트워크나 프록시를 확인한 뒤 다시 연결하세요.",
"nodeDownloadBlockedMirrorTried": "이 컴퓨터와 이 호스트 모두 Node.js 다운로드 미러를 포함해 Node.js를 다운로드하지 못했습니다. 미러 설정을 확인한 뒤 다시 연결하세요."
"nodeDownloadBlockedMirrorTried": "이 컴퓨터와 이 호스트 모두 Node.js 다운로드 미러를 포함해 Node.js를 다운로드하지 못했습니다. 미러 설정을 확인한 뒤 다시 연결하세요.",
"reassurance": "{{host}}에서 실행되며 사용자 본인의 SSH 연결로 접속합니다. 코드와 파일은 지금 있는 곳에 그대로 있습니다. {{host}}에 옮겨지는 것은 Orca의 프로젝트, 탭, 터미널 목록뿐입니다.",
"launchSessionEnded": "이 호스트의 Orca 서버를 시작한 SSH 세션이 종료되어 이 Mac의 터미널이 로컬 네트워크에 접근하지 못할 수 있습니다. Orca 서버를 다시 시작하면 복원됩니다.",
"behindRolledBack": "이 앱보다 오래된 Orca 서버를 실행합니다. 마지막 업데이트가 롤백되었습니다. 서버 업데이트를 사용해 다시 시도하세요.",
"behindNoTemplate": "이 앱이 업데이트할 수 없는 Orca 서버를 실행합니다. 이 빌드에는 이 호스트용 서버가 없습니다.",
"behindMigrating": "Orca 서버를 실행합니다. 프로젝트 이동이 끝나면 업데이트됩니다.",
"behindCheckFailed": "Orca 서버를 실행합니다. Orca가 이 앱보다 뒤처졌는지 확인하지 못했습니다."
},
"deltaMove": {
"action": "새 프로젝트 이동…",
"title": "새 프로젝트 이동",
"description": "이전 버전의 Orca가 이 호스트가 관리형 서버로 이동한 뒤에 변경했습니다. 생성된 항목을 서버에 추가하며, 서버에 이미 있는 내용 위에 병합하지는 않습니다.",
"description": "이 호스트의 프로젝트가 호스트의 Orca 서버로 이동한 뒤에 이전 버전의 Orca가 이 호스트를 변경했습니다. 생성된 항목을 서버에 추가하며, 서버에 이미 있는 내용 위에 병합하지는 않습니다.",
"added": "서버에 추가됨",
"nothingNew": "추가할 새 항목이 없습니다.",
"notReflected": "이전 버전에서 변경되거나 제거됨. 서버는 자체 복사본을 유지합니다.",
@@ -12644,14 +12653,14 @@
"keepServer": {
"action": "서버 버전 유지…",
"title": "서버 버전 유지",
"description": "이 호스트는 현재 상태 그대로 관리형 서버로 돌아갑니다. 이전 버전의 Orca가 여기에서 추가하거나 변경한 내용은 이동되지 않으며, 정리될 때까지 이 컴퓨터의 저장된 설정에만 남습니다.",
"description": "이 호스트는 현재의 Orca 서버를 그대로 계속 사용합니다. 이전 버전의 Orca가 여기에서 추가하거나 변경한 내용은 이동되지 않으며, 정리될 때까지 이 컴퓨터의 저장된 설정에만 남습니다.",
"cancel": "취소",
"confirm": "서버 버전 유지"
},
"moveAnyway": {
"action": "그래도 이동…",
"title": "이 호스트를 그래도 이동",
"description": "Orca는 아래에 저장된 항목을 제외하고 이 호스트를 관리형 서버로 이동합니다. 이 항목들은 이 컴퓨터에 남아 있으며 관리형 서버에는 표시되지 않습니다. 저장하지 않은 편집은 보존되며 절대 삭제되지 않습니다.",
"description": "Orca는 아래에 저장된 항목을 제외하고 {{host}}에 자신을 설정합니다. 이 항목들은 이 컴퓨터에 남아 있으며 {{host}}에는 표시되지 않습니다. 저장하지 않은 편집은 보존되며 절대 삭제되지 않습니다.",
"cancel": "취소",
"confirm": "그래도 이동"
},
@@ -12732,6 +12741,15 @@
"query": "미러 URL에는 쿼리나 프래그먼트를 넣을 수 없습니다.",
"invalid": "올바른 미러 URL을 입력하세요."
}
},
"restartServer": {
"action": "Orca 서버 다시 시작…",
"title": "Orca 서버 다시 시작",
"description": "Orca는 현재 연결에서 이 호스트의 Orca 서버를 다시 시작합니다. 열려 있는 터미널은 계속 접근이 막힌 상태로 남으므로, 호스트에서 실행 중인 터미널이 없을 때만 다시 시작합니다. 먼저 터미널을 닫으세요.",
"terminalsUnknown": "이 호스트에서 터미널이 실행 중인지 확인하지 못해 Orca 서버를 다시 시작하지 않았습니다.",
"terminalsRunning": "이 호스트에서 터미널 {{count}}개가 아직 실행 중입니다. 닫은 후 Orca 서버를 다시 시작하세요.",
"cancel": "취소",
"confirm": "다시 시작"
}
},
"right": {
+45 -27
View File
@@ -1267,7 +1267,7 @@
},
"ipcEvents": {
"sshManagedServer": {
"refusedBlocked": "此 SSH 主机无法迁移到受管的 Orca 服务器。设置中的“SSH 主机”会显示原因。"
"refusedBlocked": "无法在此 SSH 主机上设置 Orca。设置中的“SSH 主机”会显示原因。"
}
}
},
@@ -12497,8 +12497,8 @@
"body": "{{credential}} 未加密存储 — 该系统没有 Orca 可以使用的操作系统密钥环。任何可以读取您的磁盘或其备份的人都可以读取该凭据。安装并解锁 gnome-keyring 或 kwallet,然后再次保存以密封它。"
},
"sshManagedHostRemove": {
"description": "{{label}} 运行着一个受管的 Orca 服务器。请在“受管服务器”中使用“停止…”从主机移除该服务器;如果主机已不存在,请使用“忘记…”。之后即可移除此 SSH 主机。",
"open": "打开受管服务器"
"description": "Orca 正在 {{label}} 上运行。请在“SSH 主机上的 Orca”中使用“停止…”从主机移除 Orca;如果主机已不存在,请使用“忘记…”。之后即可移除此 SSH 主机。",
"open": "打开“SSH 主机上的 Orca”"
},
"managedServers": {
"row": {
@@ -12520,10 +12520,11 @@
"forget": "忘记…",
"confirmForget": "在此桌面上忘记",
"keepLinked": "保持关联",
"forgetDescription": "在此处取消关联此服务器,而不联系其主机。如果主机恢复,服务器可能仍在那里运行。"
"forgetDescription": "在此处取消关联此服务器,而不联系其主机。如果主机恢复,服务器可能仍在那里运行。",
"title": "{{host}} 上的 Orca"
},
"title": "受管服务器",
"description": "Orca 会在空的 SSH 主机上安装并运行服务器,并使其保持最新。",
"title": "SSH 主机上的 Orca",
"description": "Orca 会将自身安装到空的 SSH 主机上,并自动保持最新。",
"deploy": {
"host": "SSH 主机",
"hostPlaceholder": "选择一个空的 SSH 主机",
@@ -12548,8 +12549,9 @@
"cancelLink": "取消"
},
"search": {
"title": "受管服务器",
"keywordSsh": "ssh"
"title": "SSH 主机上的 Orca",
"keywordSsh": "ssh",
"keywordFormerName": "受管服务器"
},
"phase": {
"fenced": "主机已锁定",
@@ -12568,7 +12570,7 @@
},
"blocker": {
"notFound": "该 SSH 主机已不存在。",
"owned": "此 SSH 主机已属于一个受管服务器。",
"owned": "Orca 已在此 SSH 主机上运行。",
"catalog": "此主机上的项目尚无法迁移。",
"terminals": "此主机上的终端仍在运行({{count}})。请先关闭它们。",
"portForwards": "已保存的端口转发会保留在 SSH 主机上。",
@@ -12598,17 +12600,18 @@
"migration": "未完成:迁移到此服务器的操作尚未完成。请先继续该操作。",
"deferred": "尚未完成:服务器尚未准备好执行此操作。请稍后重试。",
"failed": "Orca 无法在服务器上完成此操作。请重试。"
}
},
"reassurance": "在各个主机上运行,通过你自己的 SSH 连接访问。你的代码和文件留在原处。只有 Orca 的项目、标签页和终端列表会移到该主机。"
},
"sshHostServer": {
"sourceChanged": "较旧版本的 Orca 更改了此主机的项目。要重新连接,请将这些更改迁移到其受管服务器,或保留服务器版本。",
"deploying": "正在设置受管的 Orca 服务器…",
"converting": "正在将此主机的项目迁移到其受管的 Orca 服务器…",
"connecting": "正在连接到受管的 Orca 服务器…",
"updating": "正在更新受管服务器…",
"starting": "正在启动受管服务器…",
"notServing": "Orca 无法确认受管服务器是否正在响应。",
"hostNewer": "运行来自较新版本 Orca 的受管 Orca 服务器;它会保留该版本。",
"sourceChanged": "较旧版本的 Orca 更改了此主机的项目。要重新连接,请将这些更改迁移到此主机上的 Orca 服务器,或保留服务器版本。",
"deploying": "正在 {{host}} 上设置 Orca…",
"converting": "正在迁移到 {{host}} 上的 Orca…",
"connecting": "正在连接到 {{host}} 上的 Orca…",
"updating": "正在更新 {{host}} 上的 Orca…",
"starting": "正在启动 {{host}} 上的 Orca…",
"notServing": "Orca 无法确认其在 {{host}} 上的服务器是否正在响应。",
"hostNewer": "运行的 Orca 服务器比此应用新;它会保留该版本。",
"failureDetails": "详情",
"cause": {
"unsupportedHost": "Orca 没有适用于此系统的服务器构建",
@@ -12618,15 +12621,15 @@
"securitySoftware": "安全软件更改了服务器的运行时",
"nativePreflight": "主机缺少服务器所需的系统库"
},
"updateDeferredLater": "运行受管的 Orca 服务器;它会在下次连接时更新。",
"updateFailedPrevious": "在其先前版本上运行受管的 Orca 服务器;更新失败。",
"refusedBlocked": "未迁移到受管服务器:此主机上的某些因素阻止了迁移。",
"updateDeferredLater": "运行 Orca 服务器;它会在下次连接时更新。",
"updateFailedPrevious": "在其先前版本上运行 Orca 服务器;更新失败。",
"refusedBlocked": "此主机尚未设置 Orca:主机上的某些因素阻止了迁移。",
"unsupported": "此版本的 Orca 不支持此主机({{reason}})。如需继续使用,请安装旧版本的 Orca。",
"unsupportedUnknown": "此版本的 Orca 不支持此主机。如需继续使用,请安装旧版本的 Orca。",
"tunnelUnsupported": "此版本的 Orca 不支持此主机:其 SSH 服务器不允许端口转发,Orca 也无法通过 SSH 会话连接到其服务器。如需继续使用,请安装旧版本的 Orca。",
"setupRetry": "Orca 无法在此主机上启动其服务器。请重新连接。",
"moveHeld": "由于无法确认服务器上的副本,Orca 已暂停将此主机的项目迁移到其受管服务器。没有任何数据丢失:在迁移完成之前,主机会保留其项目并保持锁定。重新连接即可继续。如果服务器无法恢复,请在“设置 > 受管服务器”中停止或忘记它。",
"olderTerminalsBridged": "尚未迁移到托管服务器:由旧版本 Orca 启动的终端仍在此主机的项目中运行。它们在这里仍可正常使用。请关闭它们或在主机上结束它们,然后重新连接。",
"moveHeld": "由于无法确认服务器上的副本,Orca 已暂停将此主机的项目迁移到主机上的 Orca 服务器。没有任何数据丢失:在迁移完成之前,主机会保留其项目并保持锁定。重新连接即可继续。如果服务器无法恢复,请在“设置 > SSH 主机上的 Orca”中停止或忘记它。",
"olderTerminalsBridged": "此主机尚未设置 Orca:由旧版本 Orca 启动的终端仍在此主机的项目中运行。它们在这里仍可正常使用。请关闭它们或在主机上结束它们,然后重新连接。",
"olderTerminalsUncounted": "由旧版本 Orca 启动的终端仍在此主机上运行,且不会自行停止。请在该版本的 Orca 中关闭它们,或在主机上结束它们,然后重新连接。",
"olderTerminalsUnverifiable": "Orca 无法确认由旧版本 Orca 启动的终端是否已退出。请重新连接后重试。",
"olderTerminals_one": "由旧版本 Orca 启动的 {{count}} 个终端仍在此主机上运行,且不会自行停止。请在该版本的 Orca 中关闭它们,或在主机上结束它们,然后重新连接。",
@@ -12638,12 +12641,18 @@
"linkedProjectsNoAutomations": "此主机的 Orca 服务器已有 {{paths}},因此此桌面现在使用服务器的副本。此桌面在那里的标签页未被迁移,它在那里创建的工作树会显示为外部工作树。",
"nodeDownloadBlocked": "这台电脑和这台主机都无法下载 Orca 服务器所需的 Node.js。请使用 Node.js 镜像,或检查两台机器的网络。",
"nodeDownloadBlockedNoMirror": "这台电脑和这台主机都无法下载 Orca 服务器所需的 Node.js。请检查两台机器的网络或代理,然后重新连接。",
"nodeDownloadBlockedMirrorTried": "这台电脑和这台主机都无法下载 Node.js,包括从 Node.js 下载镜像下载。请检查镜像设置,然后重新连接。"
"nodeDownloadBlockedMirrorTried": "这台电脑和这台主机都无法下载 Node.js,包括从 Node.js 下载镜像下载。请检查镜像设置,然后重新连接。",
"reassurance": "在 {{host}} 上运行,通过你自己的 SSH 连接访问。你的代码和文件留在原处。只有 Orca 的项目、标签页和终端列表会移到 {{host}}。",
"launchSessionEnded": "启动此主机上 Orca 服务器的 SSH 会话已结束,因此这台 Mac 上的终端可能已失去本地网络访问权限。重启 Orca 服务器即可恢复。",
"behindRolledBack": "运行的 Orca 服务器比此应用旧;上次更新已回滚。请使用“更新服务器”重试。",
"behindNoTemplate": "运行的 Orca 服务器无法由此应用更新;此版本没有适用于此主机的服务器。",
"behindMigrating": "运行 Orca 服务器,它会在项目迁移完成后更新。",
"behindCheckFailed": "运行 Orca 服务器;Orca 无法检查它是否落后于此应用。"
},
"deltaMove": {
"action": "迁移新项目…",
"title": "迁移新项目",
"description": "较旧版本的 Orca 在此主机迁移到其受管服务器后对其进行了更改。这会将它所创建的内容添加到服务器;绝不会覆盖服务器已有的内容。",
"description": "此主机的项目迁移到主机上的 Orca 服务器后,较旧版本的 Orca 又更改了此主机。这会将它所创建的内容添加到服务器;绝不会覆盖服务器已有的内容。",
"added": "已添加到服务器",
"nothingNew": "没有可添加的新内容。",
"notReflected": "在较旧版本上已更改或移除;服务器会保留自己的副本",
@@ -12658,14 +12667,14 @@
"keepServer": {
"action": "保留服务器的版本…",
"title": "保留服务器的版本",
"description": "此主机将按原样恢复为使用其受管服务器。较旧版本的 Orca 在此处添加或更改的内容不会被迁移;它们只会保留在这台电脑保存的设置中,直到被清理。",
"description": "此主机将按原样继续使用其 Orca 服务器。较旧版本的 Orca 在此处添加或更改的内容不会被迁移;它们只会保留在这台电脑保存的设置中,直到被清理。",
"cancel": "取消",
"confirm": "保留服务器的版本"
},
"moveAnyway": {
"action": "仍要迁移…",
"title": "仍要迁移此主机",
"description": "Orca 会将此主机迁移到其受管服务器,但不包含下列已保存的项目。它们会保留在这台电脑上,不会出现在受管服务器上。未保存的编辑会被保留,绝不会被删除。",
"description": "Orca 会在 {{host}} 上完成设置,但不包含下列已保存的项目。它们会保留在这台电脑上,不会出现在 {{host}} 上。未保存的编辑会被保留,绝不会被删除。",
"cancel": "取消",
"confirm": "仍要迁移"
},
@@ -12732,6 +12741,15 @@
"query": "镜像 URL 不能包含查询或片段。",
"invalid": "请输入有效的镜像 URL。"
}
},
"restartServer": {
"action": "重启 Orca 服务器…",
"title": "重启 Orca 服务器",
"description": "Orca 会通过你当前的连接重启此主机上的 Orca 服务器。只有在主机上没有正在运行的终端时才会重启,因为仍然打开的终端会一直无法访问。请先关闭它们。",
"terminalsUnknown": "Orca 无法确认此主机上是否有终端正在运行,因此没有重启 Orca 服务器。",
"terminalsRunning": "此主机上仍有 {{count}} 个终端在运行。请关闭它们,然后重启 Orca 服务器。",
"cancel": "取消",
"confirm": "重启"
}
},
"right": {
@@ -11,7 +11,7 @@ export function bridgedTerminalsLine(detail: string | undefined): SshHostServerS
tone: 'warning',
text: translate(
'auto.components.settings.sshHostServer.olderTerminalsBridged',
'Not moved to a managed server yet: terminals started by an older version of Orca are still running in this host’s projects. They keep working here. Close them or end them on the host, then reconnect.'
'Orca isn’t set up on this host yet: terminals started by an older version of Orca are still running in this host’s projects. They keep working here. Close them or end them on the host, then reconnect.'
),
...(detail ? { detail } : {})
}
@@ -7,7 +7,7 @@ export function launchSessionEndedLine(): SshHostServerStatusLine {
tone: 'warning',
text: translate(
'auto.components.settings.sshHostServer.launchSessionEnded',
'Terminals on this Mac may have lost local network access because the SSH session that started the managed server ended. Restart the managed server to restore it.'
'Terminals on this Mac may have lost local network access because the SSH session that started this host’s Orca server ended. Restart Orca’s server to restore it.'
)
}
}
@@ -44,7 +44,7 @@ describe('Node.js mirror recovery for a setup that could not download Node', ()
})
it('names the blocked download on the host row and in the connect toast', () => {
const line = sshHostServerStatusLine({}, { managedServer: blocked('unset') })
const line = sshHostServerStatusLine({ label: 'Box' }, { managedServer: blocked('unset') })
expect(line).toEqual({
tone: 'destructive',
text: expect.stringContaining('Use a Node.js mirror'),
@@ -54,16 +54,20 @@ describe('Node.js mirror recovery for a setup that could not download Node', ()
'Check the mirror setting'
)
expect(
sshHostServerStatusLine({}, { managedServer: blocked('unsupported') })?.text
sshHostServerStatusLine({ label: 'Box' }, { managedServer: blocked('unsupported') })?.text
).not.toContain('mirror')
})
it('keeps the held-move and lost-contact lines ahead of the download', () => {
expect(
sshHostServerStatusLine({}, { managedServer: blocked('unset', { held: true }) })?.text
sshHostServerStatusLine({ label: 'Box' }, { managedServer: blocked('unset', { held: true }) })
?.text
).toContain('paused moving')
expect(
sshHostServerStatusLine({}, { managedServer: blocked('unset', { contactLost: true }) })?.text
sshHostServerStatusLine(
{ label: 'Box' },
{ managedServer: blocked('unset', { contactLost: true }) }
)?.text
).toContain('lost contact')
})
})
@@ -0,0 +1,50 @@
/** What the SSH host card says while Orca sets itself up on a host. */
import type { SSH_MANAGED_SERVER_PHASES } from '../../../shared/ssh-types'
import { translate } from '@/i18n/i18n'
/** Users read "server" as someone else's machine; this says where Orca runs and what moves. */
export function sshHostServerReassurance(host: string): string {
return translate(
'auto.components.settings.sshHostServer.reassurance',
'Runs on {{host}}, reached over your own SSH connection. Your code and files stay where they are. Only Orca’s list of projects, tabs and terminals moves to {{host}}.',
{ host }
)
}
export function settingUpLabel(
phase: (typeof SSH_MANAGED_SERVER_PHASES)[number],
host: string
): string {
switch (phase) {
case 'deploying':
return translate(
'auto.components.settings.sshHostServer.deploying',
'Setting up Orca on {{host}}…',
{ host }
)
case 'converting':
return translate(
'auto.components.settings.sshHostServer.converting',
'Moving to Orca on {{host}}…',
{ host }
)
case 'connecting':
return translate(
'auto.components.settings.sshHostServer.connecting',
'Connecting to Orca on {{host}}…',
{ host }
)
case 'updating':
return translate(
'auto.components.settings.sshHostServer.updating',
'Updating Orca on {{host}}…',
{ host }
)
case 'starting':
return translate(
'auto.components.settings.sshHostServer.starting',
'Starting Orca on {{host}}…',
{ host }
)
}
}
@@ -2,18 +2,32 @@ import { describe, expect, it } from 'vitest'
import type { SshManagedServerUpdateNote } from '../../../shared/ssh-types'
import { sshConnectFailureText, sshHostServerStatusLine } from './ssh-host-server-status-copy'
const plain = {}
const plain = { label: 'Box' }
describe('SSH host server status line', () => {
it('says nothing for a plain host before any decision', () => {
expect(sshHostServerStatusLine(plain, undefined)).toBeNull()
})
it('names the host while setting up and says the code stays where it is', () => {
expect(
sshHostServerStatusLine(plain, { managedServer: { kind: 'setting-up', phase: 'converting' } })
).toEqual({
tone: 'muted',
text: 'Moving to Orca on Box…',
hint: 'Runs on Box, reached over your own SSH connection. Your code and files stay where they are. Only Orca’s list of projects, tabs and terminals moves to Box.'
})
// A reconnect of a host that already moved starts its server; nothing moves then.
expect(
sshHostServerStatusLine(plain, { managedServer: { kind: 'setting-up', phase: 'starting' } })
).toEqual({ tone: 'muted', text: 'Starting Orca on Box…' })
})
it('shows startup progress and preserves the cause of unverifiable server contact', () => {
expect(
sshHostServerStatusLine(plain, { managedServer: { kind: 'setting-up', phase: 'starting' } })
?.text
).toBe('Starting managed server…')
).toBe('Starting Orca on Box…')
const detail = 'orcad did not become ready.\nLast lines of orcad.log:\nboom'
expect(
sshHostServerStatusLine(plain, {
@@ -25,13 +39,13 @@ describe('SSH host server status line', () => {
})
).toEqual({
tone: 'warning',
text: 'Orca couldn’t confirm that the managed server is answering.',
text: 'Orca couldn’t confirm that its server on Box is answering.',
detail
})
})
it.each([
'The managed Orca server process is live but is not answering.',
'This host’s Orca server process is live but is not answering.',
'SSH operation was cancelled',
'SSH transport closed before the server answered'
])('does not infer process exit from unverifiable contact: %s', (detail) => {
@@ -46,7 +60,7 @@ describe('SSH host server status line', () => {
})
).toEqual({
tone: 'warning',
text: 'Orca couldn’t confirm that the managed server is answering.',
text: 'Orca couldn’t confirm that its server on Box is answering.',
detail
})
})
@@ -58,7 +72,7 @@ describe('SSH host server status line', () => {
})
).toEqual({
tone: 'warning',
text: 'Terminals on this Mac may have lost local network access because the SSH session that started the managed server ended. Restart the managed server to restore it.'
text: 'Terminals on this Mac may have lost local network access because the SSH session that started this host’s Orca server ended. Restart Orca’s server to restore it.'
})
})
@@ -66,12 +80,12 @@ describe('SSH host server status line', () => {
expect(
sshHostServerStatusLine(plain, { managedServer: { kind: 'setting-up', phase: 'updating' } })
?.text
).toBe('Updating managed server…')
).toBe('Updating Orca on Box…')
const managed = (update: SshManagedServerUpdateNote) =>
sshHostServerStatusLine(plain, {
managedServer: { kind: 'managed', environmentId: 'e', update }
})
expect(managed({ state: 'host-newer' })?.text).toContain('from a newer Orca')
expect(managed({ state: 'host-newer' })?.text).toContain('newer version of Orca’s server')
expect(managed({ state: 'deferred', detail: '2 terminals are running.' })).toMatchObject({
tone: 'muted',
detail: '2 terminals are running.'
@@ -117,22 +131,33 @@ describe('SSH host server status line', () => {
})
it('keeps durable reasons visible without a live state', () => {
expect(sshHostServerStatusLine({ orcadFence: { environmentId: 'e' } }, undefined)).toBeNull()
expect(
sshHostServerStatusLine({ label: 'Box', orcadFence: { environmentId: 'e' } }, undefined)
).toBeNull()
expect(
sshHostServerStatusLine(
{ orcadFence: { environmentId: 'e', sourceChangedAt: '2026-10-05T00:00:00Z' } },
{
label: 'Box',
orcadFence: { environmentId: 'e', sourceChangedAt: '2026-10-05T00:00:00Z' }
},
{ managedServer: { kind: 'managed', environmentId: 'e' } }
)
).toMatchObject({ tone: 'warning' })
expect(
sshHostServerStatusLine(
{ managedServerUnavailable: { reason: 'native_preflight', appVersion: '1.5.0' } },
{
label: 'Box',
managedServerUnavailable: { reason: 'native_preflight', appVersion: '1.5.0' }
},
undefined
)?.text
).toContain('missing system libraries')
expect(
sshHostServerStatusLine(
{ managedServerUnavailable: { reason: 'future_reason', appVersion: '1.5.0' } },
{
label: 'Box',
managedServerUnavailable: { reason: 'future_reason', appVersion: '1.5.0' }
},
undefined
)
).toMatchObject({ text: expect.not.stringContaining('future_reason'), detail: 'future_reason' })
@@ -167,7 +192,10 @@ describe('SSH host server status line', () => {
}
})
const recorded = sshHostServerStatusLine(
{ managedServerUnavailable: { reason: 'ssh_tunnel_unavailable', appVersion: '1.5.0' } },
{
label: 'Box',
managedServerUnavailable: { reason: 'ssh_tunnel_unavailable', appVersion: '1.5.0' }
},
undefined
)
for (const line of [live, recorded]) {
@@ -258,7 +286,7 @@ describe('SSH host server status line', () => {
text: expect.stringContaining('Nothing is lost'),
detail
})
expect(sshConnectFailureText(state, 'raw')).toContain('Settings > Managed servers')
expect(sshConnectFailureText(state, 'raw')).toContain('Settings > Orca on your SSH hosts')
})
it('puts an unserved host’s translated reason in the connect toast', () => {
@@ -271,7 +299,7 @@ describe('SSH host server status line', () => {
it('says a host an older Orca changed is blocked until moved, not served by the relay', () => {
const changed = sshHostServerStatusLine(
{ orcadFence: { environmentId: 'e', sourceChangedAt: '2026-10-05T00:00:00Z' } },
{ label: 'Box', orcadFence: { environmentId: 'e', sourceChangedAt: '2026-10-05T00:00:00Z' } },
undefined
)
const unserved = sshConnectFailureText(
@@ -1,6 +1,5 @@
/** User-facing words for whether an SSH host's managed server serves it; all go through the catalog. */
import type {
SSH_MANAGED_SERVER_PHASES,
SshConnectionState,
SshManagedServerLinkedProject,
SshTarget
@@ -11,16 +10,19 @@ import { launchSessionEndedLine } from './ssh-host-launch-session-copy'
import { bridgedTerminalsLine } from './ssh-host-bridged-terminals-copy'
import { managedUpdateLine, withDetail } from './ssh-host-server-update-copy'
import { blockedNodeDownload, nodeDownloadBlockedText } from './ssh-host-node-download-copy'
import { settingUpLabel, sshHostServerReassurance } from './ssh-host-server-setup-copy'
export type SshHostServerStatusLine = {
text: string
tone: 'muted' | 'warning' | 'destructive'
/** Main's untranslated cause, with the host's orcad.log tail when there is one; shown on request. */
detail?: string
/** A muted second line, e.g. what moving onto the host does and doesn't touch. */
hint?: string
}
export function sshHostServerStatusLine(
target: Pick<SshTarget, 'orcadFence' | 'managedServerUnavailable'>,
target: Pick<SshTarget, 'label' | 'orcadFence' | 'managedServerUnavailable'>,
state: Pick<SshConnectionState, 'managedServer'> | undefined
): SshHostServerStatusLine | null {
const status = state?.managedServer
@@ -32,7 +34,8 @@ export function sshHostServerStatusLine(
tone: 'warning',
text: translate(
'auto.components.settings.sshHostServer.notServing',
'Orca couldn’t confirm that the managed server is answering.'
'Orca couldn’t confirm that its server on {{host}} is answering.',
{ host: target.label }
),
detail: status.serving.detail
}
@@ -51,7 +54,14 @@ export function sshHostServerStatusLine(
return null
}
if (status?.kind === 'setting-up') {
return { tone: 'muted', text: settingUpLabel(status.phase) }
return {
tone: 'muted',
text: settingUpLabel(status.phase, target.label),
// Why only these phases: `starting` and `connecting` run on every reconnect, when nothing moves.
...(status.phase === 'deploying' || status.phase === 'converting'
? { hint: sshHostServerReassurance(target.label) }
: {})
}
}
if (status?.kind === 'relay') {
// An unverifiable bridged terminal keeps the unverifiable line: nothing proves it still answers.
@@ -93,7 +103,7 @@ function sourceChangedLine(): SshHostServerStatusLine {
tone: 'warning',
text: translate(
'auto.components.settings.sshHostServer.sourceChanged',
'An older version of Orca changed this host’s projects. Move those changes to its managed server, or keep the server’s version, to connect again.'
'An older version of Orca changed this host’s projects. Move those changes to this host’s Orca server, or keep the server’s version, to connect again.'
)
}
}
@@ -205,7 +215,7 @@ function heldMoveLine(): SshHostServerStatusLine {
tone: 'warning',
text: translate(
'auto.components.settings.sshHostServer.moveHeld',
'Orca paused moving this host’s projects to its managed server because it couldn’t confirm the server’s copy. Nothing is lost: the host keeps its projects and stays locked until the move finishes. Connect again to resume. If the server can’t come back, stop or forget it in Settings > Managed servers.'
'Orca paused moving this host’s projects to its Orca server because it couldn’t confirm the server’s copy. Nothing is lost: the host keeps its projects and stays locked until the move finishes. Connect again to resume. If the server can’t come back, stop or forget it in Settings > Orca on your SSH hosts.'
)
}
}
@@ -233,36 +243,6 @@ function linkedProjectsLine(
}
}
function settingUpLabel(phase: (typeof SSH_MANAGED_SERVER_PHASES)[number]): string {
switch (phase) {
case 'deploying':
return translate(
'auto.components.settings.sshHostServer.deploying',
'Setting up a managed Orca server…'
)
case 'converting':
return translate(
'auto.components.settings.sshHostServer.converting',
'Moving this host’s projects to its managed Orca server…'
)
case 'connecting':
return translate(
'auto.components.settings.sshHostServer.connecting',
'Connecting to the managed Orca server…'
)
case 'updating':
return translate(
'auto.components.settings.sshHostServer.updating',
'Updating managed server…'
)
case 'starting':
return translate(
'auto.components.settings.sshHostServer.starting',
'Starting managed server…'
)
}
}
function unservedLine(
status: Extract<NonNullable<SshConnectionState['managedServer']>, { kind: 'relay' }>
): SshHostServerStatusLine {
@@ -300,7 +280,7 @@ function unservedLine(
tone: 'destructive',
text: translate(
'auto.components.settings.sshHostServer.refusedBlocked',
'Not moved to a managed server: something on this host stops the move.'
'Orca isn’t set up on this host yet: something on the host stops the move.'
),
...withDetail(status.detail)
}
@@ -10,7 +10,7 @@ export function managedUpdateLine(update: SshManagedServerUpdateNote): SshHostSe
tone: 'muted',
text: translate(
'auto.components.settings.sshHostServer.hostNewer',
'Runs a managed Orca server from a newer Orca; it keeps that version.'
'Runs a newer version of Orca’s server than this app; it keeps that version.'
)
}
case 'deferred':
@@ -18,7 +18,7 @@ export function managedUpdateLine(update: SshManagedServerUpdateNote): SshHostSe
tone: 'muted',
text: translate(
'auto.components.settings.sshHostServer.updateDeferredLater',
'Runs a managed Orca server; it updates on a later connect.'
'Runs Orca’s server; it updates on a later connect.'
),
...withDetail(update.detail)
}
@@ -27,7 +27,7 @@ export function managedUpdateLine(update: SshManagedServerUpdateNote): SshHostSe
tone: 'warning',
text: translate(
'auto.components.settings.sshHostServer.updateFailedPrevious',
'Runs a managed Orca server on its previous version; updating it failed.'
'Runs Orca’s server on its previous version; updating it failed.'
),
...withDetail(update.detail)
}
@@ -36,7 +36,7 @@ export function managedUpdateLine(update: SshManagedServerUpdateNote): SshHostSe
tone: 'warning',
text: translate(
'auto.components.settings.sshHostServer.behindRolledBack',
'Runs an older managed Orca server than this app; the last update was rolled back. Use Update server to try again.'
'Runs an older version of Orca’s server than this app; the last update was rolled back. Use Update server to try again.'
)
}
case 'no-template':
@@ -44,7 +44,7 @@ export function managedUpdateLine(update: SshManagedServerUpdateNote): SshHostSe
tone: 'muted',
text: translate(
'auto.components.settings.sshHostServer.behindNoTemplate',
'Runs a managed Orca server this app can’t update; this build has no server for this host.'
'Runs a version of Orca’s server this app can’t update; this build has no server for this host.'
)
}
case 'migrating':
@@ -52,7 +52,7 @@ export function managedUpdateLine(update: SshManagedServerUpdateNote): SshHostSe
tone: 'muted',
text: translate(
'auto.components.settings.sshHostServer.behindMigrating',
'Runs a managed Orca server that updates after its project move finishes.'
'Runs Orca’s server, which updates after its project move finishes.'
)
}
case 'check-failed':
@@ -60,7 +60,7 @@ export function managedUpdateLine(update: SshManagedServerUpdateNote): SshHostSe
tone: 'warning',
text: translate(
'auto.components.settings.sshHostServer.behindCheckFailed',
'Runs a managed Orca server; Orca couldn’t check whether it is behind this app.'
'Runs Orca’s server; Orca couldn’t check whether it is behind this app.'
),
...withDetail(update.detail)
}
+1 -1
View File
@@ -51,7 +51,7 @@ const SCOPE_MESSAGES: Record<ExternalAutomationScopeCode, string> = {
[EXTERNAL_AUTOMATION_SCOPE_CODES.authorityNotSupported]:
'External automation managers are available only on this computer and its SSH hosts.',
[EXTERNAL_AUTOMATION_SCOPE_CODES.targetHidden]:
'That host is managed by Orca and does not expose external automations.'
'Orca runs on that host, so it does not expose external automations.'
}
/**
@@ -102,10 +102,12 @@ describe('managed orcad environment store', () => {
it('keeps a managed server from being removed or re-paired outside its lifecycle', () => {
add()
expect(() => removeEnvironment(userDataPath, 'Managed')).toThrow('managed by Orca over SSH')
expect(() => removeEnvironment(userDataPath, 'Managed')).toThrow(
'Orca runs this server on an SSH host for you'
)
expect(() =>
updateEnvironmentFromPairingCode(userDataPath, 'Managed', { pairingCode: pairingCode() })
).toThrow('managed by Orca over SSH')
).toThrow('Orca runs this server on an SSH host for you')
expect(listEnvironments(userDataPath)).toHaveLength(1)
})
@@ -81,7 +81,7 @@ export function addManagedOrcadEnvironment(
if (!registered?.orcadDeployment) {
throw new RuntimeEnvironmentStoreError(
'runtime_error',
'The managed server was saved without its deployment link.'
'This host’s Orca server was saved without its deployment link.'
)
}
return registered
@@ -10,7 +10,7 @@ export function assertNoIndependentSshAccess(environment: KnownRuntimeEnvironmen
if (environment.orcadDeployment) {
throw new RuntimeEnvironmentStoreError(
'invalid_argument',
'This server is managed by Orca over SSH; its pairing cannot be replaced or removed here. To decommission it, run `orca environment stop --environment <name> --yes` or use Settings > Managed servers; for a host that is gone, run `orca environment forget --environment <name> --yes`.'
'Orca runs this server on an SSH host for you; its pairing cannot be replaced or removed here. To decommission it, run `orca environment stop --environment <name> --yes` or use Settings > Orca on your SSH hosts; for a host that is gone, run `orca environment forget --environment <name> --yes`.'
)
}
if (environment.pendingSshAccessOperation) {
+1 -1
View File
@@ -106,7 +106,7 @@ export type SshTarget = {
*/
/** Main-owned: managed orcad can't run on this host; retried once this app version changes. */
managedServerUnavailable?: { reason: string; appVersion: string }
/** Main-owned: the one-time "move now" offer was shown under this app version. */
/** Retired with the move offer (hosts convert on connect); kept so a downgraded build doesn't re-offer. */
managedServerMoveOffered?: { appVersion: string }
/**
* Main-owned: the user confirmed "Move anyway", so saved state the move can't carry stays in this
@@ -402,7 +402,9 @@ test('@orcad-cli-managed an empty Windows host deploys, serves CLI terminals thr
'--json'
])
expect(refused.code, refused.stdout).not.toBe(0)
expect(`${refused.stdout}${refused.stderr}`).toContain('managed by Orca over SSH')
expect(`${refused.stdout}${refused.stderr}`).toContain(
'Orca runs this server on an SSH host for you'
)
expect(`${refused.stdout}${refused.stderr}`).toContain('orca environment stop')
const unconfirmed = await runCompiledOrcaCli(userData, [
'environment',