+
+ {t('auto.components.cloudWorkspaces.loading', 'Loading cloud workspaces')}
+
{[0, 1, 2].map((i) => (
// Same height and columns as a real row (status, title + meta, cost, last active, ⋯).
diff --git a/src/renderer/src/components/cloud-workspaces/cloud-workspace-errors.ts b/src/renderer/src/components/cloud-workspaces/cloud-workspace-errors.ts
index 86ee8b87f5b..1c20c71ed70 100644
--- a/src/renderer/src/components/cloud-workspaces/cloud-workspace-errors.ts
+++ b/src/renderer/src/components/cloud-workspaces/cloud-workspace-errors.ts
@@ -54,3 +54,38 @@ export function describeError(error: string, reason?: string, t: Translate = tra
'Something went wrong. Nothing was changed. Try again.'
)
}
+
+/**
+ * The same messages for an inline error that already carries the action button (Retry or Sign
+ * in), so the body does not repeat "Try again." or "Sign in again.".
+ */
+export function describeInlineError(
+ error: string,
+ reason?: string,
+ t: Translate = translate
+): string {
+ if (error === 'unauthorized') {
+ return t('auto.components.cloudWorkspaces.errorUnauthorizedInline', 'Your Orca Cloud session expired.')
+ }
+ if (error === 'timeout' || error === 'unavailable' || error === 'provider_unavailable') {
+ return t(
+ 'auto.components.cloudWorkspaces.errorUnreachableInline',
+ "Orca Cloud isn't reachable right now. Nothing was changed."
+ )
+ }
+ if (error === 'conflict' && reason !== 'too_many_devices') {
+ return t(
+ 'auto.components.cloudWorkspaces.errorConflictInline',
+ 'This workspace is still starting or going to sleep. Nothing was changed.'
+ )
+ }
+ if (
+ error === 'not_found' ||
+ error === 'entitlement_denied' ||
+ error === 'forbidden' ||
+ error === 'conflict'
+ ) {
+ return describeError(error, reason, t)
+ }
+ return t('auto.components.cloudWorkspaces.errorUnknownInline', 'Something went wrong. Nothing was changed.')
+}
diff --git a/src/renderer/src/components/cloud-workspaces/cloud-workspace-format.ts b/src/renderer/src/components/cloud-workspaces/cloud-workspace-format.ts
index 1d8e14b996a..fa2497f9d2b 100644
--- a/src/renderer/src/components/cloud-workspaces/cloud-workspace-format.ts
+++ b/src/renderer/src/components/cloud-workspaces/cloud-workspace-format.ts
@@ -148,10 +148,21 @@ export function presenceSummary(
intlLocale: string = getIntlLocale()
): string {
const clauses = members.map((p) => {
+ // "You" takes its own verb form; it is never slotted into "{{name}} is …".
+ if (p.userId === selfId) {
+ return p.state === 'typing'
+ ? t('auto.components.cloudWorkspaces.youAreTyping', 'You are typing')
+ : t('auto.components.cloudWorkspaces.youAreViewing', 'You are viewing')
+ }
const value0 = memberName(directory, p.userId, selfId, t)
return p.state === 'typing'
? t('auto.components.cloudWorkspaces.memberTyping', '{{value0}} is typing', { value0 })
: t('auto.components.cloudWorkspaces.memberViewing', '{{value0}} is viewing', { value0 })
})
- return new Intl.ListFormat(intlLocale, { style: 'long', type: 'conjunction' }).format(clauses)
+ return formatNameList(clauses, intlLocale)
+}
+
+/** "Grace, Linus and Mae" in the UI locale, never hand-joined. */
+export function formatNameList(names: string[], intlLocale: string = getIntlLocale()): string {
+ return new Intl.ListFormat(intlLocale, { style: 'long', type: 'conjunction' }).format(names)
}
diff --git a/src/renderer/src/i18n/locales/en.json b/src/renderer/src/i18n/locales/en.json
index ddba069f092..805ce3ed926 100644
--- a/src/renderer/src/i18n/locales/en.json
+++ b/src/renderer/src/i18n/locales/en.json
@@ -20190,17 +20190,21 @@
"environmentName": "{{value0}} (cloud)",
"errorConcurrencyLimit": "You're at your team's limit of running sandboxes. Put one to sleep or delete it, then try again.",
"errorConflict": "This workspace is still starting or going to sleep. Nothing was changed. Try again in a moment.",
+ "errorConflictInline": "This workspace is still starting or going to sleep. Nothing was changed.",
"errorEntitlementDenied": "Your team's plan can't start this workspace right now. Your files are safe. Ask an owner or admin to check the plan.",
"errorForbidden": "Only the workspace owner or a team admin can do that. Ask an owner or admin to make the change.",
"errorNotFound": "This workspace is private, archived or no longer exists.",
"errorTooManyDevices": "Too many of your computers are connected to this workspace. Disconnect one, then try again.",
"errorUnauthorized": "Your Orca Cloud session expired. Sign in again.",
+ "errorUnauthorizedInline": "Your Orca Cloud session expired.",
"errorUnknown": "Something went wrong. Nothing was changed. Try again.",
+ "errorUnknownInline": "Something went wrong. Nothing was changed.",
"errorUnreachable": "Orca Cloud isn't reachable right now. Nothing was changed. Try again.",
+ "errorUnreachableInline": "Orca Cloud isn't reachable right now. Nothing was changed.",
"filterByOwner": "Filter by owner",
"filterByRepository": "Filter by repository",
- "follow": "Follow",
- "followMember": "Follow {{value0}}",
+ "goToChat": "Go to {{value0}}'s chat",
+ "goToTeammateChat": "Go to a teammate's chat",
"heading": "Cloud workspaces",
"hoursAgo": "{{value0}}h ago",
"inAnyRepo": "In any repo",
@@ -20210,12 +20214,17 @@
"listMeta_one": "{{count}} workspace · {{cost}}",
"listMeta_other": "{{count}} workspaces · {{cost}}",
"loading": "Loading cloud workspaces",
+ "makeOwner": "Make owner",
"makePrivate": "Make private",
+ "makePrivateDisconnects": "{{names}} will be disconnected.",
+ "makePrivateNobody": "No teammates are connected right now. Only the owner will be able to open it.",
+ "makePrivateTitle": "Make {{title}} private?",
"memberTyping": "{{value0}} is typing",
"memberViewing": "{{value0}} is viewing",
"memberYou": "{{value0}} (you)",
"minutesAgo": "{{value0}}m ago",
"modelTokensCost": "Model tokens {{value0}}",
+ "moreMembers": "{{count}} more",
"move": "Move",
"moveToSection": "Move to section",
"newSection": "New section",
@@ -20225,10 +20234,16 @@
"nowPrivate": "Now private. Teammates’ devices were disconnected.",
"open": "Open",
"openFailed": "Couldn't open the workspace. Your files are safe. Try again.",
+ "openedFromLink": "Opened from link: {{title}}",
"opening": "Opening",
"ownerChanged": "Owner changed",
"private": "Private",
+ "privateTooltip": "Private — only {{name}} can open it",
+ "privateTooltipYou": "Private — only you can see it",
+ "reassignBody": "They can then share, archive or hand it on.",
+ "reassignLosesManagement": "You won't be able to manage this workspace after this.",
"reassignOwner": "Reassign owner",
+ "reassignTitle": "Make {{name}} the owner?",
"refresh": "Refresh cloud workspaces",
"restored": "Restored",
"retry": "Retry",
@@ -20236,6 +20251,7 @@
"rowDescription": "Cost {{cost}}. Last active {{lastActive}}. {{visibility}}.",
"rowDescriptionWithPresence": "Cost {{cost}}. Last active {{lastActive}}. {{visibility}}. {{presence}}.",
"rowLabel": "{{value0}}, {{value1}}, owned by {{value2}}",
+ "rowLabelOwnedByYou": "{{title}}, {{status}}, owned by you",
"sandboxHoursCost_one": "{{hours}} sandbox hour × {{rate}}/hour = {{cost}}",
"sandboxHoursCost_other": "{{hours}} sandbox hours × {{rate}}/hour = {{cost}}",
"scopeMine": "Mine",
@@ -20249,6 +20265,7 @@
"sharedWithTeam": "Shared with team",
"sharedWithYourTeam": "Shared with your team",
"showArchived": "Show archived",
+ "signIn": "Sign in",
"statusArchived": "Archived",
"statusAsleep": "Asleep",
"statusCouldntStart": "Couldn't start",
@@ -20261,7 +20278,9 @@
"whoseWorkspaces": "Whose workspaces",
"workspaceFallback": "workspace",
"workspaceLinkCopied": "Workspace link copied",
- "you": "You"
+ "you": "You",
+ "youAreTyping": "You are typing",
+ "youAreViewing": "You are viewing"
},
"orcaCloud": {
"QueuedPrompt": {