From 1fac73575f7d507185bf48aa2bf905a8c1a3a7cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20=C5=A0=C4=87eki=C4=87?= <4062236+iscekic@users.noreply.github.com> Date: Sat, 24 Oct 2026 15:48:23 +0000 Subject: [PATCH 1/8] fix(cloud-agent-sdk): validate message time and permission scope at the event boundary The message.updated boundary now validates the identity, role and time the SDK reads, and the session's streaming check reads the assistant completion time defensively so a stored row without it cannot throw inside the transcript atoms. A permission request keeps patterns, metadata and always only when they parse, so a request whose scope cannot be read is not forwarded. Tests cover both events, the mirrored replay schema, and a stored assistant row with no readable time. --- .../src/cloud-agent-transport.test.ts | 2 +- .../src/fixture-runner.test.ts | 27 +++--- .../cloud-agent-sdk/src/normalizer.test.ts | 86 +++++++++++++++++-- packages/cloud-agent-sdk/src/normalizer.ts | 2 + packages/cloud-agent-sdk/src/schemas.ts | 53 ++++++++++-- .../src/session-manager.test.ts | 64 ++++++++++++++ .../cloud-agent-sdk/src/session-manager.ts | 18 +++- 7 files changed, 221 insertions(+), 31 deletions(-) diff --git a/packages/cloud-agent-sdk/src/cloud-agent-transport.test.ts b/packages/cloud-agent-sdk/src/cloud-agent-transport.test.ts index 72a6f0dfea0..1ea366a0405 100644 --- a/packages/cloud-agent-sdk/src/cloud-agent-transport.test.ts +++ b/packages/cloud-agent-sdk/src/cloud-agent-transport.test.ts @@ -479,7 +479,7 @@ describe('CloudAgentTransport event routing', () => { ['question.asked', { id: 'request-1' }], ['question.replied', { requestID: 'request-1' }], ['question.rejected', { requestID: 'request-1' }], - ['permission.asked', { id: 'request-1', permission: 'bash' }], + ['permission.asked', { id: 'request-1', permission: 'bash', patterns: [], metadata: {}, always: [] }], ['permission.replied', { requestID: 'request-1' }], ])( 'suppresses historical %s until connected, then delivers current interactions', diff --git a/packages/cloud-agent-sdk/src/fixture-runner.test.ts b/packages/cloud-agent-sdk/src/fixture-runner.test.ts index 86c75046de4..08ac4bebe17 100644 --- a/packages/cloud-agent-sdk/src/fixture-runner.test.ts +++ b/packages/cloud-agent-sdk/src/fixture-runner.test.ts @@ -1,16 +1,15 @@ -import * as z from 'zod'; - import { allFixtures } from './__fixtures__'; import { sessionReplay } from './__fixtures__/session-replay'; import { messageUpdatedDataSchema } from './schemas'; import { createTestSession } from './test-helpers'; -const messageTimeSchema = messageUpdatedDataSchema.extend({ - info: messageUpdatedDataSchema.shape.info.extend({ - role: z.string(), - time: z.object({ created: z.number() }), - }), -}); +/** The `created` a parsed message info carries, read the way the transcript does. */ +function createdTimeOf(info: Record | undefined): number | undefined { + const time = info?.['time']; + if (typeof time !== 'object' || time === null) return undefined; + if (!('created' in time)) return undefined; + return typeof time.created === 'number' ? time.created : undefined; +} describe.each(allFixtures)('fixture: $name', ({ description, events, expected }) => { it(description, () => { @@ -51,16 +50,18 @@ describe('session replay fixture', () => { ) { return []; } - const result = messageTimeSchema.safeParse(event.data.properties); + // The captured payload is parsed by the production boundary, not a + // local extension: a change that rejects a real message event fails here. + const result = messageUpdatedDataSchema.safeParse(event.data.properties); return result.success ? [result.data.info] : []; }) .filter(info => info.sessionID === 'ses_00000000000000000000000001'); const rootUserEvent = rootMessageEvents.find(info => info.role === 'user'); const rootAssistantEvent = rootMessageEvents.find(info => info.role === 'assistant'); - expect(rootUserEvent?.time.created).toBe(1_772_214_640_111); - expect(rootAssistantEvent?.time.created).toBe(1_772_214_640_377); - expect(rootUserEvent?.time.created).toBeGreaterThanOrEqual(1_000_000_000_000); - expect(rootAssistantEvent?.time.created).toBeLessThan(10_000_000_000_000); + expect(createdTimeOf(rootUserEvent)).toBe(1_772_214_640_111); + expect(createdTimeOf(rootAssistantEvent)).toBe(1_772_214_640_377); + expect(createdTimeOf(rootUserEvent)).toBeGreaterThanOrEqual(1_000_000_000_000); + expect(createdTimeOf(rootAssistantEvent)).toBeLessThan(10_000_000_000_000); }); }); diff --git a/packages/cloud-agent-sdk/src/normalizer.test.ts b/packages/cloud-agent-sdk/src/normalizer.test.ts index 43a20cc7fdd..71ba018bf9b 100644 --- a/packages/cloud-agent-sdk/src/normalizer.test.ts +++ b/packages/cloud-agent-sdk/src/normalizer.test.ts @@ -95,12 +95,58 @@ describe('normalize', () => { id: 'msg-1', sessionID: 'ses-1', role: 'assistant', - parts: [], + time: { created: 1 }, }; const result = normalize(createRaw('message.updated', { info })); expect(result).toEqual({ type: 'message.updated', info }); }); + it('returns null when info carries no role', () => { + expect( + normalize(createRaw('message.updated', { info: { id: 'msg-1', sessionID: 'ses-1' } })) + ).toBeNull(); + }); + + it.each(['', 42, null])('returns null when info.role is %p', role => { + const info = { id: 'msg-1', sessionID: 'ses-1', role }; + expect(normalize(createRaw('message.updated', { info }))).toBeNull(); + }); + + it.each([undefined, null, 'today', {}, { created: '1' }])( + 'returns null when info.time is %p', + time => { + const info = { id: 'msg-1', sessionID: 'ses-1', role: 'assistant', time }; + expect(normalize(createRaw('message.updated', { info }))).toBeNull(); + } + ); + + it('returns null when info.time.completed is not a number', () => { + const info = { + id: 'msg-1', + sessionID: 'ses-1', + role: 'assistant', + time: { created: 1, completed: 'soon' }, + }; + expect(normalize(createRaw('message.updated', { info }))).toBeNull(); + }); + + it('keeps a user message that carries its created time', () => { + const info = { id: 'msg-1', sessionID: 'ses-1', role: 'user', time: { created: 2 } }; + expect(normalize(createRaw('message.updated', { info }))).toEqual({ + type: 'message.updated', + info, + }); + }); + + it('keeps a role this SDK does not know yet when the time is readable', () => { + // The role set can grow on the wire; only the assistant branch is read. + const info = { id: 'msg-1', sessionID: 'ses-1', role: 'system', time: { created: 3 } }; + expect(normalize(createRaw('message.updated', { info }))).toEqual({ + type: 'message.updated', + info, + }); + }); + it('returns null when info is missing', () => { expect(normalize(createRaw('message.updated', {}))).toBeNull(); }); @@ -1201,17 +1247,34 @@ describe('normalize', () => { }); }); - it('normalizes permission.asked with minimal fields', () => { - const data = { id: 'perm-2', permission: 'write' }; - const result = normalize(createRaw('permission.asked', data)); - expect(result).toEqual({ - type: 'permission.asked', - requestId: 'perm-2', + it('skips permission.asked whose scope fields are not the declared shapes', () => { + const malformed: Array> = [ + { patterns: 'src/**' }, + { patterns: [1] }, + { metadata: ['command'] }, + { metadata: null }, + { always: 'bash' }, + ]; + + for (const scope of malformed) { + const data = { id: 'perm-2', permission: 'write', ...scope }; + expect(normalize(createRaw('permission.asked', data))).toBeNull(); + } + }); + + it('skips permission.asked that omits a scope field', () => { + const complete: Record = { + id: 'perm-2', permission: 'write', - patterns: [], + patterns: ['**/*'], metadata: {}, always: [], - }); + }; + + for (const field of ['patterns', 'metadata', 'always']) { + const { [field]: _omitted, ...data } = complete; + expect(normalize(createRaw('permission.asked', data))).toBeNull(); + } }); it('skips permission.asked without id', () => { @@ -2507,6 +2570,11 @@ describe('normalizeCliEvent', () => { }); }); + it('returns null for a CLI message.updated whose assistant time is unreadable', () => { + const info = { id: 'msg-1', sessionID: 'ses-1', role: 'assistant' }; + expect(normalizeCliEvent('message.updated', { info })).toBeNull(); + }); + it('normalizes message.part.updated without envelope', () => { const part = { id: 'p-1', diff --git a/packages/cloud-agent-sdk/src/normalizer.ts b/packages/cloud-agent-sdk/src/normalizer.ts index cb34f2a3767..7093601674b 100644 --- a/packages/cloud-agent-sdk/src/normalizer.ts +++ b/packages/cloud-agent-sdk/src/normalizer.ts @@ -468,6 +468,8 @@ function normalizeInnerEvent(eventType: string, data: unknown): NormalizedEvent case 'permission.asked': { const r = permissionAskedDataSchema.safeParse(data); + // A request whose scope does not parse is malformed: forwarding an empty + // scope would offer an approval for settings the app never read. if (!r.success) return null; return { type: 'permission.asked', diff --git a/packages/cloud-agent-sdk/src/schemas.ts b/packages/cloud-agent-sdk/src/schemas.ts index 15c53391444..55edfab7f47 100644 --- a/packages/cloud-agent-sdk/src/schemas.ts +++ b/packages/cloud-agent-sdk/src/schemas.ts @@ -699,9 +699,39 @@ export const kilocodePayloadSchema = z.object({ }); export type KilocodePayload = z.infer; -export const messageUpdatedDataSchema = z.object({ - info: z.object({ id: z.string(), sessionID: z.string() }).passthrough(), -}); +/** + * The time a message carries on the wire: `created` on every message, and the + * assistant's `completed` once the turn finishes. Both the transcript's + * timestamp and the streaming check read it, so a payload without a readable + * `created` has nothing to render. + */ +const wireMessageTimeSchema = z + .object({ created: z.number(), completed: z.number().optional() }) + .passthrough(); + +/** + * The message fields this SDK reads, at the single validation boundary: the + * identity, the `role` consumers branch on, and the `time` they render. The + * generated `Message` union declares all three, but only this schema makes them + * true for a payload that arrives from the wire or a replay. + * + * The role is a non-empty string rather than the two literals of the union: a + * newer CLI may send a role this SDK does not know, and such a message must + * still parse (no reader branches on it). Everything else passes through — the + * union is wider than what the SDK itself reads, and the transcript renders + * whatever the CLI sent. + * + * Mirrored for the history/replay shape in `sessionSnapshotSchema`. + */ +const wireMessageInfoSchema = z + .object({ id: z.string(), sessionID: z.string(), role: z.string().min(1) }) + .passthrough() + .refine(info => wireMessageTimeSchema.safeParse(info['time']).success, { + message: 'a message requires a time with a numeric created', + path: ['time'], + }); + +export const messageUpdatedDataSchema = z.object({ info: wireMessageInfoSchema }); export type MessageUpdatedData = z.infer; /** @@ -887,13 +917,22 @@ export const questionRejectedDataSchema = z.object({ }); export type QuestionRejectedData = z.infer; +/** + * A permission request as it arrives from the wire or a pending-interaction + * replay. `id` and `permission` identify the request; `patterns`, `metadata` + * and `always` are the scope the consent surface shows before an allow + * decision, so each is required and kept only when it parses. A request whose + * scope is not the declared shape fails here and is never forwarded with an + * empty or partial scope — an approval must never be offered for a scope the + * app could not read. + */ export const permissionAskedDataSchema = z.object({ id: z.string().min(1), permission: z.string(), tool: z.object({ callID: z.string() }).optional(), - patterns: z.array(z.string()).catch([]), - metadata: z.record(z.string(), z.unknown()).catch({}), - always: z.array(z.string()).catch([]), + patterns: z.array(z.string()), + metadata: z.record(z.string(), z.unknown()), + always: z.array(z.string()), }); export type PermissionAskedData = z.infer; @@ -1157,7 +1196,7 @@ export const sessionSnapshotSchema = z.object({ info: z.object({ id: z.unknown() }).passthrough(), messages: z.array( z.object({ - info: z.object({ id: z.string() }).passthrough(), + info: wireMessageInfoSchema, parts: z.array(wireMessagePartSchema), }) ), diff --git a/packages/cloud-agent-sdk/src/session-manager.test.ts b/packages/cloud-agent-sdk/src/session-manager.test.ts index 2ca24b2eb5e..aa59d5d77ac 100644 --- a/packages/cloud-agent-sdk/src/session-manager.test.ts +++ b/packages/cloud-agent-sdk/src/session-manager.test.ts @@ -4522,6 +4522,70 @@ describe('createSessionManager', () => { expect((dynamicAfter[0]?.parts[0] as TextPart | undefined)?.text).toBe('hello'); }); + it('settles a stored assistant row whose time cannot be read', async () => { + const config = createMockConfig(); + const mgr = createSessionManager(config); + + mockSession.connect.mockImplementation(() => { + mockSessionCallbacks.onSessionCreated?.({ id: 'ses-root' }); + }); + + await mgr.switchSession(kiloId('ses-root')); + if (!latestStorage) throw new Error('expected session storage'); + + // A replayed row is not parsed by the per-event schema, and the generated + // `AssistantMessage` declares `time`; the omission is the fixture. + const { time: _removed, ...withoutTime } = createStoredAssistantMessage( + 'msg-unreadable', + 'ses-root' + ).info; + const unreadable = withoutTime as AssistantMessage; + latestStorage.upsertMessage(unreadable); + + let staticRows: StoredMessage[] = []; + let dynamicRows: StoredMessage[] = []; + expect(() => { + staticRows = atomValue(config.store, mgr.atoms.staticMessages); + dynamicRows = atomValue(config.store, mgr.atoms.dynamicMessages); + }).not.toThrow(); + expect(staticRows.map(message => message.info.id)).toEqual([unreadable.id]); + expect(dynamicRows).toEqual([]); + }); + + it('keeps a stored assistant row with a running part streaming when its time is unreadable', async () => { + const config = createMockConfig(); + const mgr = createSessionManager(config); + + mockSession.connect.mockImplementation(() => { + mockSessionCallbacks.onSessionCreated?.({ id: 'ses-root' }); + }); + + await mgr.switchSession(kiloId('ses-root')); + if (!latestStorage) throw new Error('expected session storage'); + + const { time: _removed, ...withoutTime } = createStoredAssistantMessage( + 'msg-unreadable', + 'ses-root' + ).info; + const unreadable = withoutTime as AssistantMessage; + latestStorage.upsertMessage(unreadable); + latestStorage.upsertPart( + unreadable.id, + stubTextPart({ + id: 'part-running', + sessionID: 'ses-root', + messageID: unreadable.id, + text: 'partial', + time: { start: 5 }, + }) + ); + + const staticRows = atomValue(config.store, mgr.atoms.staticMessages); + const dynamicRows = atomValue(config.store, mgr.atoms.dynamicMessages); + expect(staticRows).toEqual([]); + expect(dynamicRows.map(message => message.info.id)).toEqual([unreadable.id]); + }); + it('keeps root message arrays stable across a child-only delta', async () => { const config = createMockConfig(); const mgr = createSessionManager(config); diff --git a/packages/cloud-agent-sdk/src/session-manager.ts b/packages/cloud-agent-sdk/src/session-manager.ts index d89b91f49fe..624afc82ecd 100644 --- a/packages/cloud-agent-sdk/src/session-manager.ts +++ b/packages/cloud-agent-sdk/src/session-manager.ts @@ -61,6 +61,7 @@ import type { FilePart, TextPart, UserMessage, + AssistantMessage, OlderMessagesError, PreparationAttempt, SessionCommit, @@ -746,9 +747,24 @@ function formatError(err: unknown): string { return formatErrorDetail(err).message; } +/** + * Whether an assistant message's `time` still says the turn is running. + * + * The generated `AssistantMessage` declares `time`, but a replayed or stored + * row is not parsed by the per-event schema, so the field can be absent or of + * the wrong shape even though the type says otherwise. An unreadable `time` is + * not evidence of an unfinished turn: it returns false and the parts below are + * the only remaining signal. + */ +function assistantTurnIncomplete(info: AssistantMessage): boolean { + const time: unknown = info.time; + if (typeof time !== 'object' || time === null) return false; + return !('completed' in time); +} + function isMessageStreaming(msg: StoredMessage): boolean { if (msg.info.role === 'assistant' && msg.info.error) return false; - if (msg.info.role === 'assistant' && !msg.info.time.completed) return true; + if (msg.info.role === 'assistant' && assistantTurnIncomplete(msg.info)) return true; return msg.parts.some(part => { if (part.type === 'text' || part.type === 'reasoning') return part.time !== undefined && part.time.end === undefined; From 9df0612439bbf135e177d1caed23d842e1f933e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20=C5=A0=C4=87eki=C4=87?= <4062236+iscekic@users.noreply.github.com> Date: Sat, 24 Oct 2026 15:54:42 +0000 Subject: [PATCH 2/8] test(cloud-agent-sdk): format the transport fixture update --- packages/cloud-agent-sdk/src/cloud-agent-transport.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/cloud-agent-sdk/src/cloud-agent-transport.test.ts b/packages/cloud-agent-sdk/src/cloud-agent-transport.test.ts index 1ea366a0405..192e1fb29fe 100644 --- a/packages/cloud-agent-sdk/src/cloud-agent-transport.test.ts +++ b/packages/cloud-agent-sdk/src/cloud-agent-transport.test.ts @@ -479,7 +479,10 @@ describe('CloudAgentTransport event routing', () => { ['question.asked', { id: 'request-1' }], ['question.replied', { requestID: 'request-1' }], ['question.rejected', { requestID: 'request-1' }], - ['permission.asked', { id: 'request-1', permission: 'bash', patterns: [], metadata: {}, always: [] }], + [ + 'permission.asked', + { id: 'request-1', permission: 'bash', patterns: [], metadata: {}, always: [] }, + ], ['permission.replied', { requestID: 'request-1' }], ])( 'suppresses historical %s until connected, then delivers current interactions', From d86442f09ccd7901caf323ba83735dbc9d869036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20=C5=A0=C4=87eki=C4=87?= <4062236+iscekic@users.noreply.github.com> Date: Sat, 24 Oct 2026 16:11:37 +0000 Subject: [PATCH 3/8] test(cloud-agent-sdk): exercise the role field on its own The role cases now include a valid time so each one exercises the role field. --- packages/cloud-agent-sdk/src/normalizer.test.ts | 11 +++++++---- packages/cloud-agent-sdk/src/schemas.ts | 6 ------ 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/cloud-agent-sdk/src/normalizer.test.ts b/packages/cloud-agent-sdk/src/normalizer.test.ts index 71ba018bf9b..5cd4d4e8ea2 100644 --- a/packages/cloud-agent-sdk/src/normalizer.test.ts +++ b/packages/cloud-agent-sdk/src/normalizer.test.ts @@ -103,12 +103,16 @@ describe('normalize', () => { it('returns null when info carries no role', () => { expect( - normalize(createRaw('message.updated', { info: { id: 'msg-1', sessionID: 'ses-1' } })) + normalize( + createRaw('message.updated', { + info: { id: 'msg-1', sessionID: 'ses-1', time: { created: 1 } }, + }) + ) ).toBeNull(); }); it.each(['', 42, null])('returns null when info.role is %p', role => { - const info = { id: 'msg-1', sessionID: 'ses-1', role }; + const info = { id: 'msg-1', sessionID: 'ses-1', role, time: { created: 1 } }; expect(normalize(createRaw('message.updated', { info }))).toBeNull(); }); @@ -138,8 +142,7 @@ describe('normalize', () => { }); }); - it('keeps a role this SDK does not know yet when the time is readable', () => { - // The role set can grow on the wire; only the assistant branch is read. + it('keeps a message whose role is not user or assistant', () => { const info = { id: 'msg-1', sessionID: 'ses-1', role: 'system', time: { created: 3 } }; expect(normalize(createRaw('message.updated', { info }))).toEqual({ type: 'message.updated', diff --git a/packages/cloud-agent-sdk/src/schemas.ts b/packages/cloud-agent-sdk/src/schemas.ts index 55edfab7f47..b9890ea242c 100644 --- a/packages/cloud-agent-sdk/src/schemas.ts +++ b/packages/cloud-agent-sdk/src/schemas.ts @@ -715,12 +715,6 @@ const wireMessageTimeSchema = z * generated `Message` union declares all three, but only this schema makes them * true for a payload that arrives from the wire or a replay. * - * The role is a non-empty string rather than the two literals of the union: a - * newer CLI may send a role this SDK does not know, and such a message must - * still parse (no reader branches on it). Everything else passes through — the - * union is wider than what the SDK itself reads, and the transcript renders - * whatever the CLI sent. - * * Mirrored for the history/replay shape in `sessionSnapshotSchema`. */ const wireMessageInfoSchema = z From b863b86ad4b08ba0ff846926f170cfa7cd53f0bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20=C5=A0=C4=87eki=C4=87?= <4062236+iscekic@users.noreply.github.com> Date: Sat, 24 Oct 2026 18:21:26 +0000 Subject: [PATCH 4/8] fix(cloud-agent-sdk): check replayed history rows against the message schema Replay hands a stored page straight to the chat processor, so every replay path now checks each row against the same message schema the live wire uses. A row that does not satisfy it is skipped together with its parts, and the rest of the page is still emitted. The streaming check reads the completion stamp directly: every row that enters storage satisfies the message contract. --- .../src/session-manager.test.ts | 64 ------------------- .../cloud-agent-sdk/src/session-manager.ts | 18 +----- .../cloud-agent-sdk/src/snapshot-page.test.ts | 39 ++++++++++- packages/cloud-agent-sdk/src/snapshot-page.ts | 10 +++ 4 files changed, 49 insertions(+), 82 deletions(-) diff --git a/packages/cloud-agent-sdk/src/session-manager.test.ts b/packages/cloud-agent-sdk/src/session-manager.test.ts index aa59d5d77ac..2ca24b2eb5e 100644 --- a/packages/cloud-agent-sdk/src/session-manager.test.ts +++ b/packages/cloud-agent-sdk/src/session-manager.test.ts @@ -4522,70 +4522,6 @@ describe('createSessionManager', () => { expect((dynamicAfter[0]?.parts[0] as TextPart | undefined)?.text).toBe('hello'); }); - it('settles a stored assistant row whose time cannot be read', async () => { - const config = createMockConfig(); - const mgr = createSessionManager(config); - - mockSession.connect.mockImplementation(() => { - mockSessionCallbacks.onSessionCreated?.({ id: 'ses-root' }); - }); - - await mgr.switchSession(kiloId('ses-root')); - if (!latestStorage) throw new Error('expected session storage'); - - // A replayed row is not parsed by the per-event schema, and the generated - // `AssistantMessage` declares `time`; the omission is the fixture. - const { time: _removed, ...withoutTime } = createStoredAssistantMessage( - 'msg-unreadable', - 'ses-root' - ).info; - const unreadable = withoutTime as AssistantMessage; - latestStorage.upsertMessage(unreadable); - - let staticRows: StoredMessage[] = []; - let dynamicRows: StoredMessage[] = []; - expect(() => { - staticRows = atomValue(config.store, mgr.atoms.staticMessages); - dynamicRows = atomValue(config.store, mgr.atoms.dynamicMessages); - }).not.toThrow(); - expect(staticRows.map(message => message.info.id)).toEqual([unreadable.id]); - expect(dynamicRows).toEqual([]); - }); - - it('keeps a stored assistant row with a running part streaming when its time is unreadable', async () => { - const config = createMockConfig(); - const mgr = createSessionManager(config); - - mockSession.connect.mockImplementation(() => { - mockSessionCallbacks.onSessionCreated?.({ id: 'ses-root' }); - }); - - await mgr.switchSession(kiloId('ses-root')); - if (!latestStorage) throw new Error('expected session storage'); - - const { time: _removed, ...withoutTime } = createStoredAssistantMessage( - 'msg-unreadable', - 'ses-root' - ).info; - const unreadable = withoutTime as AssistantMessage; - latestStorage.upsertMessage(unreadable); - latestStorage.upsertPart( - unreadable.id, - stubTextPart({ - id: 'part-running', - sessionID: 'ses-root', - messageID: unreadable.id, - text: 'partial', - time: { start: 5 }, - }) - ); - - const staticRows = atomValue(config.store, mgr.atoms.staticMessages); - const dynamicRows = atomValue(config.store, mgr.atoms.dynamicMessages); - expect(staticRows).toEqual([]); - expect(dynamicRows.map(message => message.info.id)).toEqual([unreadable.id]); - }); - it('keeps root message arrays stable across a child-only delta', async () => { const config = createMockConfig(); const mgr = createSessionManager(config); diff --git a/packages/cloud-agent-sdk/src/session-manager.ts b/packages/cloud-agent-sdk/src/session-manager.ts index 624afc82ecd..d89b91f49fe 100644 --- a/packages/cloud-agent-sdk/src/session-manager.ts +++ b/packages/cloud-agent-sdk/src/session-manager.ts @@ -61,7 +61,6 @@ import type { FilePart, TextPart, UserMessage, - AssistantMessage, OlderMessagesError, PreparationAttempt, SessionCommit, @@ -747,24 +746,9 @@ function formatError(err: unknown): string { return formatErrorDetail(err).message; } -/** - * Whether an assistant message's `time` still says the turn is running. - * - * The generated `AssistantMessage` declares `time`, but a replayed or stored - * row is not parsed by the per-event schema, so the field can be absent or of - * the wrong shape even though the type says otherwise. An unreadable `time` is - * not evidence of an unfinished turn: it returns false and the parts below are - * the only remaining signal. - */ -function assistantTurnIncomplete(info: AssistantMessage): boolean { - const time: unknown = info.time; - if (typeof time !== 'object' || time === null) return false; - return !('completed' in time); -} - function isMessageStreaming(msg: StoredMessage): boolean { if (msg.info.role === 'assistant' && msg.info.error) return false; - if (msg.info.role === 'assistant' && assistantTurnIncomplete(msg.info)) return true; + if (msg.info.role === 'assistant' && !msg.info.time.completed) return true; return msg.parts.some(part => { if (part.type === 'text' || part.type === 'reasoning') return part.time !== undefined && part.time.end === undefined; diff --git a/packages/cloud-agent-sdk/src/snapshot-page.test.ts b/packages/cloud-agent-sdk/src/snapshot-page.test.ts index 7455521bd77..04521c493e4 100644 --- a/packages/cloud-agent-sdk/src/snapshot-page.test.ts +++ b/packages/cloud-agent-sdk/src/snapshot-page.test.ts @@ -4,7 +4,7 @@ import type { MessageInfo, Part, SessionSnapshot, SessionSnapshotPage, ToolPart function storedMessage(id: string): SessionSnapshot['messages'][number] { return { - info: { id, sessionID: 'ses-1', role: 'assistant' } as MessageInfo, + info: { id, sessionID: 'ses-1', role: 'assistant', time: { created: 1 } } as MessageInfo, parts: [], }; } @@ -62,6 +62,43 @@ describe('replayStoredMessages', () => { expect(events[2]).toEqual({ type: 'message.part.updated', part: toolPart, time: 7 }); }); + it('skips a row the transcript cannot describe, and its parts, without dropping the page', () => { + const good = storedMessage('msg-1'); + good.parts = [textPart('part-1a', 'msg-1')]; + const unreadable = storedMessage('msg-2'); + unreadable.info = { id: 'msg-2', sessionID: 'ses-1', role: 'assistant' } as MessageInfo; + unreadable.parts = [textPart('part-2a', 'msg-2')]; + const after = storedMessage('msg-3'); + after.parts = [textPart('part-3a', 'msg-3')]; + + const events: ChatEvent[] = []; + replayStoredMessages([good, unreadable, after], event => events.push(event)); + + expect(events.map(event => event.type)).toEqual([ + 'message.updated', + 'message.part.updated', + 'message.updated', + 'message.part.updated', + ]); + expect(events[0]).toEqual({ type: 'message.updated', info: good.info }); + expect(events[2]).toEqual({ type: 'message.updated', info: after.info }); + expect(events).not.toContainEqual({ type: 'message.updated', info: unreadable.info }); + expect(events).not.toContainEqual({ type: 'message.part.updated', part: unreadable.parts[0] }); + }); + + it('skips a row whose time carries no numeric creation stamp', () => { + const row = storedMessage('msg-1'); + row.info = { + ...row.info, + time: { created: null }, + } as unknown as MessageInfo; + + const events: ChatEvent[] = []; + replayStoredMessages([row], event => events.push(event)); + + expect(events).toEqual([]); + }); + it('emits nothing for an empty page', () => { const events: ChatEvent[] = []; replayStoredMessages([], event => events.push(event)); diff --git a/packages/cloud-agent-sdk/src/snapshot-page.ts b/packages/cloud-agent-sdk/src/snapshot-page.ts index 87df63f59c2..0881d01f2ee 100644 --- a/packages/cloud-agent-sdk/src/snapshot-page.ts +++ b/packages/cloud-agent-sdk/src/snapshot-page.ts @@ -1,4 +1,5 @@ import type { ChatEvent } from './normalizer'; +import { messageUpdatedDataSchema } from './schemas'; import type { SessionSnapshot, SessionSnapshotPage, SessionSnapshotPageOutcome } from './types'; import { partSettledAt } from './part-utils'; import type { TransportSink } from './transport'; @@ -23,12 +24,21 @@ export function snapshotPageFromSnapshot(snapshot: SessionSnapshot): SessionSnap * Emit a stored transcript's messages in render order. A settled tool part * carries the `time.end` its lifecycle merge orders it by; nothing else * carries an event time. + * + * Replay is the counterpart of the per-event boundary: the transports hand a + * stored page straight to the sink, so no event schema runs on it. Each row is + * therefore checked against the same message contract the live wire uses, and a + * row the transcript cannot describe — no readable `time` for its timestamp and + * streaming state, no `role` for its branch — is skipped together with its + * parts instead of being handed to readers. One bad row must not cost the rest + * of the page. */ export function replayStoredMessages( messages: SessionSnapshot['messages'], emit: (event: ChatEvent) => void ): void { for (const msg of messages) { + if (!messageUpdatedDataSchema.safeParse({ info: msg.info }).success) continue; emit({ type: 'message.updated', info: msg.info }); for (const part of msg.parts) { From 9afd18244f5c5a1300ced80a1b33b9d79cb9490f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20=C5=A0=C4=87eki=C4=87?= <4062236+iscekic@users.noreply.github.com> Date: Sat, 24 Oct 2026 23:37:27 +0000 Subject: [PATCH 5/8] fix(cloud-agent-sdk): keep an unreadable permission request visible as a notice --- ...mission-unreadable-notice.mounted.test.tsx | 58 ++++++++++++ .../agents/permission-unreadable-notice.tsx | 29 ++++++ .../agents/session-detail-content.test.ts | 36 ++++++++ .../agents/session-detail-content.tsx | 4 + .../agents/session-detail-queue.test.ts | 1 + apps/mobile/src/i18n/locales/af.json | 4 +- apps/mobile/src/i18n/locales/am.json | 4 +- apps/mobile/src/i18n/locales/ar.json | 4 +- apps/mobile/src/i18n/locales/az.json | 4 +- apps/mobile/src/i18n/locales/be.json | 4 +- apps/mobile/src/i18n/locales/bg.json | 4 +- apps/mobile/src/i18n/locales/bn.json | 4 +- apps/mobile/src/i18n/locales/bs.json | 4 +- apps/mobile/src/i18n/locales/ca.json | 4 +- apps/mobile/src/i18n/locales/ckb.json | 4 +- apps/mobile/src/i18n/locales/cs.json | 4 +- apps/mobile/src/i18n/locales/cy.json | 4 +- apps/mobile/src/i18n/locales/da.json | 4 +- apps/mobile/src/i18n/locales/de.json | 4 +- apps/mobile/src/i18n/locales/el.json | 4 +- apps/mobile/src/i18n/locales/en.json | 4 +- apps/mobile/src/i18n/locales/es.json | 4 +- apps/mobile/src/i18n/locales/et.json | 4 +- apps/mobile/src/i18n/locales/eu.json | 4 +- apps/mobile/src/i18n/locales/fa.json | 4 +- apps/mobile/src/i18n/locales/fi.json | 4 +- apps/mobile/src/i18n/locales/fil.json | 4 +- apps/mobile/src/i18n/locales/fr.json | 4 +- apps/mobile/src/i18n/locales/ga.json | 4 +- apps/mobile/src/i18n/locales/gl.json | 4 +- apps/mobile/src/i18n/locales/gu.json | 4 +- apps/mobile/src/i18n/locales/ha.json | 4 +- apps/mobile/src/i18n/locales/he.json | 4 +- apps/mobile/src/i18n/locales/hi.json | 4 +- apps/mobile/src/i18n/locales/hr.json | 4 +- apps/mobile/src/i18n/locales/ht.json | 4 +- apps/mobile/src/i18n/locales/hu.json | 4 +- apps/mobile/src/i18n/locales/hy.json | 4 +- apps/mobile/src/i18n/locales/id.json | 4 +- apps/mobile/src/i18n/locales/ig.json | 4 +- apps/mobile/src/i18n/locales/is.json | 4 +- apps/mobile/src/i18n/locales/it.json | 4 +- apps/mobile/src/i18n/locales/ja.json | 4 +- apps/mobile/src/i18n/locales/ka.json | 4 +- apps/mobile/src/i18n/locales/kk.json | 4 +- apps/mobile/src/i18n/locales/km.json | 4 +- apps/mobile/src/i18n/locales/kn.json | 4 +- apps/mobile/src/i18n/locales/ko.json | 4 +- apps/mobile/src/i18n/locales/lo.json | 4 +- apps/mobile/src/i18n/locales/lt.json | 4 +- apps/mobile/src/i18n/locales/lv.json | 4 +- apps/mobile/src/i18n/locales/mg.json | 4 +- apps/mobile/src/i18n/locales/mi.json | 4 +- apps/mobile/src/i18n/locales/mk.json | 4 +- apps/mobile/src/i18n/locales/ml.json | 4 +- apps/mobile/src/i18n/locales/mn.json | 4 +- apps/mobile/src/i18n/locales/mr.json | 4 +- apps/mobile/src/i18n/locales/ms.json | 4 +- apps/mobile/src/i18n/locales/mt.json | 4 +- apps/mobile/src/i18n/locales/my.json | 4 +- apps/mobile/src/i18n/locales/nb.json | 4 +- apps/mobile/src/i18n/locales/ne.json | 4 +- apps/mobile/src/i18n/locales/nl.json | 4 +- apps/mobile/src/i18n/locales/om.json | 4 +- apps/mobile/src/i18n/locales/or.json | 4 +- apps/mobile/src/i18n/locales/pa.json | 4 +- apps/mobile/src/i18n/locales/pl.json | 4 +- apps/mobile/src/i18n/locales/ps.json | 4 +- apps/mobile/src/i18n/locales/pt-BR.json | 4 +- apps/mobile/src/i18n/locales/pt.json | 4 +- apps/mobile/src/i18n/locales/ro.json | 4 +- apps/mobile/src/i18n/locales/ru.json | 4 +- apps/mobile/src/i18n/locales/si.json | 4 +- apps/mobile/src/i18n/locales/sk.json | 4 +- apps/mobile/src/i18n/locales/sl.json | 4 +- apps/mobile/src/i18n/locales/so.json | 4 +- apps/mobile/src/i18n/locales/sq.json | 4 +- apps/mobile/src/i18n/locales/sr.json | 4 +- apps/mobile/src/i18n/locales/sv.json | 4 +- apps/mobile/src/i18n/locales/sw.json | 4 +- apps/mobile/src/i18n/locales/ta.json | 4 +- apps/mobile/src/i18n/locales/te.json | 4 +- apps/mobile/src/i18n/locales/th.json | 4 +- apps/mobile/src/i18n/locales/tr.json | 4 +- apps/mobile/src/i18n/locales/uk.json | 4 +- apps/mobile/src/i18n/locales/ur.json | 4 +- apps/mobile/src/i18n/locales/uz.json | 4 +- apps/mobile/src/i18n/locales/vi.json | 4 +- apps/mobile/src/i18n/locales/yo.json | 4 +- apps/mobile/src/i18n/locales/zh-Hans.json | 4 +- apps/mobile/src/i18n/locales/zh-Hant.json | 4 +- apps/mobile/src/i18n/locales/zu.json | 4 +- .../cloud-agent-next/CloudChatPage.tsx | 7 ++ .../PermissionUnreadableNotice.test.ts | 24 +++++ .../PermissionUnreadableNotice.tsx | 27 ++++++ .../src/cloud-agent-transport.ts | 1 + packages/cloud-agent-sdk/src/index.ts | 1 + .../cloud-agent-sdk/src/normalizer.test.ts | 20 ++++- packages/cloud-agent-sdk/src/normalizer.ts | 39 +++++--- packages/cloud-agent-sdk/src/schemas.ts | 13 +++ .../cloud-agent-sdk/src/service-state.test.ts | 90 +++++++++++++++++++ packages/cloud-agent-sdk/src/service-state.ts | 28 ++++++ .../src/session-manager.test.ts | 39 ++++++++ .../cloud-agent-sdk/src/session-manager.ts | 24 +++++ .../cloud-agent-sdk/src/status-copy.test.ts | 1 + packages/cloud-agent-sdk/src/types.ts | 11 +++ 106 files changed, 699 insertions(+), 102 deletions(-) create mode 100644 apps/mobile/src/components/agents/permission-unreadable-notice.mounted.test.tsx create mode 100644 apps/mobile/src/components/agents/permission-unreadable-notice.tsx create mode 100644 apps/web/src/components/cloud-agent-next/PermissionUnreadableNotice.test.ts create mode 100644 apps/web/src/components/cloud-agent-next/PermissionUnreadableNotice.tsx diff --git a/apps/mobile/src/components/agents/permission-unreadable-notice.mounted.test.tsx b/apps/mobile/src/components/agents/permission-unreadable-notice.mounted.test.tsx new file mode 100644 index 00000000000..ed97a3865ce --- /dev/null +++ b/apps/mobile/src/components/agents/permission-unreadable-notice.mounted.test.tsx @@ -0,0 +1,58 @@ +import { createElement } from 'react'; +import type * as ReactI18next from 'react-i18next'; +import { describe, expect, it, vi } from 'vitest'; +import { act, TestRenderer } from '@/test/renderer'; + +import { i18n } from '@/i18n'; +import { PermissionUnreadableNotice } from './permission-unreadable-notice'; + +vi.mock('react-i18next', async importOriginal => { + const actual = await importOriginal(); + return { ...actual, useTranslation: () => ({ t: actual.getI18n().t.bind(actual.getI18n()) }) }; +}); +vi.mock('react-native', () => ({ View: 'View' })); +vi.mock('@/components/ui/text', () => ({ Text: 'Text' })); + +async function renderNotice() { + const rendererRef: { current: TestRenderer.ReactTestRenderer | undefined } = { + current: undefined, + }; + await act(async () => { + await vi.waitFor(() => { + expect(i18n.t('agentChat.permissionCard.unreadableTitle')).toBe( + 'Permission request could not be read' + ); + }); + rendererRef.current = TestRenderer.create(createElement(PermissionUnreadableNotice)); + }); + const renderer = rendererRef.current; + if (!renderer) { + throw new Error('renderer was not created'); + } + return renderer; +} + +describe('PermissionUnreadableNotice mounted', () => { + it('explains that the request cannot be shown and points at the CLI', async () => { + const renderer = await renderNotice(); + + const text = renderer.root + .findAll(node => typeof node.props.children === 'string') + .map(node => node.props.children as string) + .join(' '); + + expect(text).toContain('Permission request could not be read'); + expect(text).toContain('The agent is waiting for a permission decision this app cannot show.'); + expect(text).toContain('answer the request in the CLI'); + }); + + it('carries the notice as an alert and renders no decision action', async () => { + const renderer = await renderNotice(); + + const alerts = renderer.root.findAll(node => node.props.accessibilityRole === 'alert'); + expect(alerts).toHaveLength(1); + expect( + renderer.root.findAll(node => node.props.accessibilityRole === 'button') + ).toHaveLength(0); + }); +}); diff --git a/apps/mobile/src/components/agents/permission-unreadable-notice.tsx b/apps/mobile/src/components/agents/permission-unreadable-notice.tsx new file mode 100644 index 00000000000..3cb075149a5 --- /dev/null +++ b/apps/mobile/src/components/agents/permission-unreadable-notice.tsx @@ -0,0 +1,29 @@ +import { useTranslation } from 'react-i18next'; +import { View } from 'react-native'; + +import { Text } from '@/components/ui/text'; + +/** + * Shown while the agent waits on a permission request this app cannot read. No + * consent card is rendered, because a card would describe a scope the boundary + * never parsed; the CLI can still answer the request, so the notice points the + * user there instead of leaving the run stalled without explanation. + */ +export function PermissionUnreadableNotice() { + const { t } = useTranslation(); + + return ( + + + {t('agentChat.permissionCard.unreadableTitle')} + + + {t('agentChat.permissionCard.unreadableBody')} + + + ); +} diff --git a/apps/mobile/src/components/agents/session-detail-content.test.ts b/apps/mobile/src/components/agents/session-detail-content.test.ts index 6df5615638a..28d552c85b1 100644 --- a/apps/mobile/src/components/agents/session-detail-content.test.ts +++ b/apps/mobile/src/components/agents/session-detail-content.test.ts @@ -27,6 +27,7 @@ import { type StandalonePermission, type StoredMessage, type ToolPart, + type UnreadablePermissionState, } from '@kilocode/cloud-agent-sdk'; import { cloudAgentId, kiloId, stubTextPart } from '@kilocode/cloud-agent-sdk/test-helpers'; @@ -43,6 +44,7 @@ import { } from '@/components/agents/exit-remote-session-with-feedback'; import { RemoteSessionExitFailure } from '@/components/agents/remote-session-exit-failure'; import { PermissionCard } from '@/components/agents/permission-card'; +import { PermissionUnreadableNotice } from '@/components/agents/permission-unreadable-notice'; import { setSessionAutoApproveEnabled } from '@/components/agents/session-auto-approve'; import { isSessionGoalCollapsed, @@ -2354,6 +2356,40 @@ describe('session detail per-session auto-approve', () => { }); }); +describe('session detail unreadable permission notice', () => { + const waiting: readonly UnreadablePermissionState[] = [{ requestId: 'perm-1' }]; + const none: readonly UnreadablePermissionState[] = []; + + it('explains the waiting request and keeps the composer usable', async () => { + const view = await mountDetails([]); + act(() => { + view.store.set(view.manager.atoms.unreadablePermissions, waiting); + }); + + expect(view.renderer.root.findAllByType(PermissionUnreadableNotice)).toHaveLength(1); + expect(view.renderer.root.findAllByType(PermissionCard)).toHaveLength(0); + expect(renderedText(view.renderer.root)).toContain( + 'The agent is waiting for a permission decision this app cannot show.' + ); + + const composer = view.renderer.root.findAll(node => Object.is(node.type, 'ChatComposer')); + expect(composer).toHaveLength(1); + expect(composer[0]?.parent?.parent?.props.className ?? '').not.toContain('hidden'); + }); + + it('renders nothing once the request is answered', async () => { + const view = await mountDetails([]); + act(() => { + view.store.set(view.manager.atoms.unreadablePermissions, waiting); + }); + act(() => { + view.store.set(view.manager.atoms.unreadablePermissions, none); + }); + + expect(view.renderer.root.findAllByType(PermissionUnreadableNotice)).toHaveLength(0); + }); +}); + describe.each([true, false])('session detail return with history=%s', hasHistory => { beforeEach(() => { if (hasHistory) { diff --git a/apps/mobile/src/components/agents/session-detail-content.tsx b/apps/mobile/src/components/agents/session-detail-content.tsx index 0501d930ea5..8ab77c468c8 100644 --- a/apps/mobile/src/components/agents/session-detail-content.tsx +++ b/apps/mobile/src/components/agents/session-detail-content.tsx @@ -43,6 +43,7 @@ import { MessageErrorBoundary } from '@/components/agents/message-error-boundary import { ModelPickerSelectionScopeProvider } from '@/components/agents/model-selector'; import { nextHeldQueuedIds } from '@/components/agents/queued-badge-hold'; import { PermissionCard } from '@/components/agents/permission-card'; +import { PermissionUnreadableNotice } from '@/components/agents/permission-unreadable-notice'; import { QuestionCard } from '@/components/agents/question-card'; import { type ContextSheetIdentity, @@ -327,6 +328,7 @@ export function SessionDetailContent({ const activeSuggestion = useAtomValue(manager.atoms.activeSuggestion); const pendingQuestions = useAtomValue(manager.atoms.pendingQuestions); const pendingPermissions = useAtomValue(manager.atoms.pendingPermissions); + const unreadablePermissions = useAtomValue(manager.atoms.unreadablePermissions); const totalCost = useAtomValue(manager.atoms.totalCost); const { totalMicrodollars, breakdownCostUsd } = selectSessionCostInputs( fetchedData?.kiloSessionId === sessionId ? fetchedData.totalCostMicrodollars : null, @@ -2563,6 +2565,8 @@ export function SessionDetailContent({ ) : null} + {unreadablePermissions.length > 0 ? : null} + {blockingInteraction === 'question' && activeQuestion ? ( new Map() }, childSessionHydrationState: { value: () => ({ status: 'idle' }) }, diff --git a/apps/mobile/src/i18n/locales/af.json b/apps/mobile/src/i18n/locales/af.json index a6e49cd6635..6ac0c2fbd75 100644 --- a/apps/mobile/src/i18n/locales/af.json +++ b/apps/mobile/src/i18n/locales/af.json @@ -2578,7 +2578,9 @@ "retrying": "Probeer weer…", "retryDeny": "Probeer weer weier", "retryAllowOnce": "Probeer weer laat een keer toe", - "retryAlwaysAllow": "Probeer weer laat altyd toe" + "retryAlwaysAllow": "Probeer weer laat altyd toe", + "unreadableTitle": "Toestemmingsversoek kon nie gelees word nie", + "unreadableBody": "Die agent wag op 'n toestemmingsbeslissing wat hierdie app nie kan wys nie. Dateer die app of die CLI op, of beantwoord die versoek in die CLI om voort te gaan." }, "questionCard": { "title": "Agent benodig insette", diff --git a/apps/mobile/src/i18n/locales/am.json b/apps/mobile/src/i18n/locales/am.json index 6a0d9710472..12fcec5ea12 100644 --- a/apps/mobile/src/i18n/locales/am.json +++ b/apps/mobile/src/i18n/locales/am.json @@ -2578,7 +2578,9 @@ "retrying": "እንደገና በመሞከር ላይ…", "retryDeny": "ላለመፍቀድ እንደገና ይሞክሩ", "retryAllowOnce": "አንድ ጊዜ ለመፍቀድ እንደገና ይሞክሩ", - "retryAlwaysAllow": "ሁልጊዜ ለመፍቀድ እንደገና ይሞክሩ" + "retryAlwaysAllow": "ሁልጊዜ ለመፍቀድ እንደገና ይሞክሩ", + "unreadableTitle": "የፈቃድ ጥያቄ ማንበብ አልተቻለም", + "unreadableBody": "ወኪሉ ይህ መተግበሪያ ማሳየት የማይችለውን የፈቃድ ውሳኔ በመጠበቅ ላይ ነው። ለመቀጠል መተግበሪያውን ወይም CLI-ን ያሻሽሉ፣ ወይም ጥያቄውን በ CLI ውስጥ ይመልሱ።" }, "questionCard": { "title": "ወኪሉ መልስ ይፈልጋል", diff --git a/apps/mobile/src/i18n/locales/ar.json b/apps/mobile/src/i18n/locales/ar.json index d2c40d5addf..4255d85aa82 100644 --- a/apps/mobile/src/i18n/locales/ar.json +++ b/apps/mobile/src/i18n/locales/ar.json @@ -2122,7 +2122,9 @@ "retrying": "جارٍ إعادة المحاولة…", "retryDeny": "إعادة محاولة الرفض", "retryAllowOnce": "إعادة محاولة السماح لمرة واحدة", - "retryAlwaysAllow": "إعادة محاولة السماح دائمًا" + "retryAlwaysAllow": "إعادة محاولة السماح دائمًا", + "unreadableTitle": "تعذّرت قراءة طلب الإذن", + "unreadableBody": "الوكيل في انتظار قرار إذن لا يستطيع هذا التطبيق عرضه. حدّث التطبيق أو CLI، أو أجب عن الطلب في CLI للمتابعة." }, "questionCard": { "title": "الوكيل بحاجة إلى إجابتك", diff --git a/apps/mobile/src/i18n/locales/az.json b/apps/mobile/src/i18n/locales/az.json index d34ec75024d..1007cd14798 100644 --- a/apps/mobile/src/i18n/locales/az.json +++ b/apps/mobile/src/i18n/locales/az.json @@ -2578,7 +2578,9 @@ "retrying": "Yenidən cəhd edilir…", "retryDeny": "Yenidən rədd etməyə çalış", "retryAllowOnce": "Yenidən bir dəfə icazə verməyə çalış", - "retryAlwaysAllow": "Yenidən həmişə icazə verməyə çalış" + "retryAlwaysAllow": "Yenidən həmişə icazə verməyə çalış", + "unreadableTitle": "İcazə tələbi oxuna bilmədi", + "unreadableBody": "Agent bu tətbiqin göstərə bilmədiyi icazə qərarını gözləyir. Davam etmək üçün tətbiqi və ya CLI-ni yeniləyin, yaxud tələbə CLI-də cavab verin." }, "questionCard": { "title": "Agent cavab gözləyir", diff --git a/apps/mobile/src/i18n/locales/be.json b/apps/mobile/src/i18n/locales/be.json index d3fbe369cf1..96b61c8354e 100644 --- a/apps/mobile/src/i18n/locales/be.json +++ b/apps/mobile/src/i18n/locales/be.json @@ -2650,7 +2650,9 @@ "retrying": "Паўторная спроба…", "retryDeny": "Паспрабаваць адмовіць яшчэ раз", "retryAllowOnce": "Паспрабаваць дазволіць адзін раз яшчэ раз", - "retryAlwaysAllow": "Паспрабаваць дазваляць заўсёды яшчэ раз" + "retryAlwaysAllow": "Паспрабаваць дазваляць заўсёды яшчэ раз", + "unreadableTitle": "Не ўдалося прачытаць запыт на дазвол", + "unreadableBody": "Агент чакае рашэння аб дазволе, якое гэта праграма не можа паказаць. Абнавіце праграму або CLI ці адкажыце на запыт у CLI, каб працягнуць." }, "questionCard": { "title": "Агенту патрэбны адказ", diff --git a/apps/mobile/src/i18n/locales/bg.json b/apps/mobile/src/i18n/locales/bg.json index 2dcf7bc897c..af1612e0186 100644 --- a/apps/mobile/src/i18n/locales/bg.json +++ b/apps/mobile/src/i18n/locales/bg.json @@ -2578,7 +2578,9 @@ "retrying": "Повторен опит…", "retryDeny": "Опитай да откажеш отново", "retryAllowOnce": "Опитай да разрешиш веднъж отново", - "retryAlwaysAllow": "Опитай да разрешаваш винаги отново" + "retryAlwaysAllow": "Опитай да разрешаваш винаги отново", + "unreadableTitle": "Заявката за разрешение не може да бъде прочетена", + "unreadableBody": "Агентът чака решение за разрешение, което това приложение не може да покаже. Актуализирайте приложението или CLI, или отговорете на заявката в CLI, за да продължите." }, "questionCard": { "title": "Агентът очаква отговор", diff --git a/apps/mobile/src/i18n/locales/bn.json b/apps/mobile/src/i18n/locales/bn.json index 7a86f2c3f0f..96aa6427f33 100644 --- a/apps/mobile/src/i18n/locales/bn.json +++ b/apps/mobile/src/i18n/locales/bn.json @@ -2578,7 +2578,9 @@ "retrying": "আবার চেষ্টা করা হচ্ছে…", "retryDeny": "অনুমতি না দেওয়ার জন্য আবার চেষ্টা করুন", "retryAllowOnce": "একবার অনুমতি দেওয়ার জন্য আবার চেষ্টা করুন", - "retryAlwaysAllow": "সবসময় অনুমতি দেওয়ার জন্য আবার চেষ্টা করুন" + "retryAlwaysAllow": "সবসময় অনুমতি দেওয়ার জন্য আবার চেষ্টা করুন", + "unreadableTitle": "অনুমতির অনুরোধ পড়া যায়নি", + "unreadableBody": "এজেন্ট একটি অনুমতির সিদ্ধান্তের জন্য অপেক্ষা করছে, কিন্তু এই অ্যাপ সেই অনুরোধটি দেখাতে পারে না। চালিয়ে যেতে অ্যাপ বা CLI আপডেট করুন, অথবা CLI-তে অনুরোধটির উত্তর দিন।" }, "questionCard": { "title": "এজেন্টের আপনার উত্তর প্রয়োজন", diff --git a/apps/mobile/src/i18n/locales/bs.json b/apps/mobile/src/i18n/locales/bs.json index 20d3b2081b9..f9cc00bf1b6 100644 --- a/apps/mobile/src/i18n/locales/bs.json +++ b/apps/mobile/src/i18n/locales/bs.json @@ -2614,7 +2614,9 @@ "retrying": "Ponovni pokušaj…", "retryDeny": "Pokušaj ponovo odbiti", "retryAllowOnce": "Pokušaj ponovo dozvoliti jednom", - "retryAlwaysAllow": "Pokušaj ponovo uvijek dozvoliti" + "retryAlwaysAllow": "Pokušaj ponovo uvijek dozvoliti", + "unreadableTitle": "Zahtjev za dozvolu nije moguće pročitati", + "unreadableBody": "Agent čeka odluku o dozvoli koju ova aplikacija ne može prikazati. Ažurirajte aplikaciju ili CLI, ili odgovorite na zahtjev u CLI-ju da biste nastavili." }, "questionCard": { "title": "Agent traži odgovor", diff --git a/apps/mobile/src/i18n/locales/ca.json b/apps/mobile/src/i18n/locales/ca.json index a7b33378cda..c9f18823a88 100644 --- a/apps/mobile/src/i18n/locales/ca.json +++ b/apps/mobile/src/i18n/locales/ca.json @@ -2614,7 +2614,9 @@ "retrying": "Tornant-ho a provar…", "retryDeny": "Torna a provar de denegar", "retryAllowOnce": "Torna a provar de permetre-ho una vegada", - "retryAlwaysAllow": "Torna a provar de permetre-ho sempre" + "retryAlwaysAllow": "Torna a provar de permetre-ho sempre", + "unreadableTitle": "No s'ha pogut llegir la sol·licitud de permís", + "unreadableBody": "L'agent està esperant una decisió de permís que aquesta aplicació no pot mostrar. Actualitzeu l'aplicació o el CLI, o responeu la sol·licitud al CLI per continuar." }, "questionCard": { "title": "L'agent necessita una resposta", diff --git a/apps/mobile/src/i18n/locales/ckb.json b/apps/mobile/src/i18n/locales/ckb.json index 33a53e46f0b..36501528269 100644 --- a/apps/mobile/src/i18n/locales/ckb.json +++ b/apps/mobile/src/i18n/locales/ckb.json @@ -2578,7 +2578,9 @@ "retrying": "دووبارە هەوڵدان…", "retryDeny": "دووبارە هەوڵدان بۆ ڕەتکردنەوە", "retryAllowOnce": "دووبارە هەوڵدان بۆ ڕێگەپێدان بۆ یەک جار", - "retryAlwaysAllow": "دووبارە هەوڵدان بۆ ڕێگەپێدانی هەمیشەیی" + "retryAlwaysAllow": "دووبارە هەوڵدان بۆ ڕێگەپێدانی هەمیشەیی", + "unreadableTitle": "داواکاری مۆڵەت نەتوانرا بخوێنرێتەوە", + "unreadableBody": "ئەجێنت چاوەڕوانی بڕیارێکی مۆڵەتە کە ئەم ئەپە ناتوانێت پیشانی بدات. ئەپە یان CLI نوێ بکەرەوە، یان داوایەکە لە CLI وەڵام بدەوە بۆ بەردەوامبوون." }, "questionCard": { "title": "ئەجێنتەکە پێویستی بە وەڵامە", diff --git a/apps/mobile/src/i18n/locales/cs.json b/apps/mobile/src/i18n/locales/cs.json index fbdc0c27d6f..a4d957ca46a 100644 --- a/apps/mobile/src/i18n/locales/cs.json +++ b/apps/mobile/src/i18n/locales/cs.json @@ -2650,7 +2650,9 @@ "retrying": "Opakování…", "retryDeny": "Zamítnout znovu", "retryAllowOnce": "Povolit jen tentokrát znovu", - "retryAlwaysAllow": "Vždy povolit znovu" + "retryAlwaysAllow": "Vždy povolit znovu", + "unreadableTitle": "Požadavek na oprávnění nelze načíst", + "unreadableBody": "Agent čeká na rozhodnutí o oprávnění, které tato aplikace nedokáže zobrazit. Aktualizujte aplikaci nebo CLI, případně odpovězte na žádost v CLI a pokračujte." }, "questionCard": { "title": "Agent potřebuje odpověď", diff --git a/apps/mobile/src/i18n/locales/cy.json b/apps/mobile/src/i18n/locales/cy.json index 58908b2f8bc..7e35bf6f3f9 100644 --- a/apps/mobile/src/i18n/locales/cy.json +++ b/apps/mobile/src/i18n/locales/cy.json @@ -2722,7 +2722,9 @@ "retrying": "Yn ceisio eto…", "retryDeny": "Ceisio gwrthod eto", "retryAllowOnce": "Ceisio caniatáu unwaith eto", - "retryAlwaysAllow": "Ceisio caniatáu bob tro eto" + "retryAlwaysAllow": "Ceisio caniatáu bob tro eto", + "unreadableTitle": "Methwyd darllen y cais am ganiatâd", + "unreadableBody": "Mae'r asiant yn aros am benderfyniad ganiatâd na all yr ap hwn ei ddangos. Diweddarwch yr ap neu'r CLI, neu atebwch y cais yn y CLI i barhau." }, "questionCard": { "title": "Mae angen mewnbwn ar yr asiant", diff --git a/apps/mobile/src/i18n/locales/da.json b/apps/mobile/src/i18n/locales/da.json index 6a2beb51d96..c2034bacac1 100644 --- a/apps/mobile/src/i18n/locales/da.json +++ b/apps/mobile/src/i18n/locales/da.json @@ -2578,7 +2578,9 @@ "retrying": "Prøver igen…", "retryDeny": "Prøv at afvise igen", "retryAllowOnce": "Prøv at tillade én gang igen", - "retryAlwaysAllow": "Prøv at tillade altid igen" + "retryAlwaysAllow": "Prøv at tillade altid igen", + "unreadableTitle": "Tilladelsesanmodning kunne ikke læses", + "unreadableBody": "Agenten venter på en tilladelsesafgørelse, som denne app ikke kan vise. Opdater appen eller CLI'en, eller besvar anmodningen i CLI'en for at fortsætte." }, "questionCard": { "title": "Agenten har brug for svar", diff --git a/apps/mobile/src/i18n/locales/de.json b/apps/mobile/src/i18n/locales/de.json index 2dad6938204..b4b3f54209f 100644 --- a/apps/mobile/src/i18n/locales/de.json +++ b/apps/mobile/src/i18n/locales/de.json @@ -2054,7 +2054,9 @@ "retrying": "Erneuter Versuch…", "retryDeny": "Erneut verweigern", "retryAllowOnce": "Erneut einmal erlauben", - "retryAlwaysAllow": "Erneut immer erlauben" + "retryAlwaysAllow": "Erneut immer erlauben", + "unreadableTitle": "Berechtigungsanfrage konnte nicht gelesen werden", + "unreadableBody": "Der Agent wartet auf eine Berechtigungsentscheidung, die diese App nicht anzeigen kann. Aktualisiere die App oder die CLI oder beantworte die Anfrage in der CLI, um fortzufahren." }, "questionCard": { "title": "Der Agent braucht deine Antwort", diff --git a/apps/mobile/src/i18n/locales/el.json b/apps/mobile/src/i18n/locales/el.json index 6ef0405e565..6563e9f58b5 100644 --- a/apps/mobile/src/i18n/locales/el.json +++ b/apps/mobile/src/i18n/locales/el.json @@ -2578,7 +2578,9 @@ "retrying": "Επανάληψη…", "retryDeny": "Επανάληψη άρνησης", "retryAllowOnce": "Επανάληψη άδειας για μία φορά", - "retryAlwaysAllow": "Επανάληψη άδειας πάντα" + "retryAlwaysAllow": "Επανάληψη άδειας πάντα", + "unreadableTitle": "Δεν ήταν δυνατή η ανάγνωση του αιτήματος άδειας", + "unreadableBody": "Ο agent περιμένει μια απόφαση άδειας που αυτή η εφαρμογή δεν μπορεί να εμφανίσει. Ενημερώστε την εφαρμογή ή το CLI, ή απαντήστε στο αίτημα μέσω του CLI για να συνεχίσετε." }, "questionCard": { "title": "Ο πράκτορας χρειάζεται απάντηση", diff --git a/apps/mobile/src/i18n/locales/en.json b/apps/mobile/src/i18n/locales/en.json index 84e21ada242..e51172f4117 100644 --- a/apps/mobile/src/i18n/locales/en.json +++ b/apps/mobile/src/i18n/locales/en.json @@ -2691,7 +2691,9 @@ "retrying": "Retrying…", "retryDeny": "Retry deny", "retryAllowOnce": "Retry allow once", - "retryAlwaysAllow": "Retry always allow" + "retryAlwaysAllow": "Retry always allow", + "unreadableTitle": "Permission request could not be read", + "unreadableBody": "The agent is waiting for a permission decision this app cannot show. Update the app or the CLI, or answer the request in the CLI to continue." }, "questionCard": { "title": "Agent needs input", diff --git a/apps/mobile/src/i18n/locales/es.json b/apps/mobile/src/i18n/locales/es.json index 0f8aa097dc0..ece4d03287d 100644 --- a/apps/mobile/src/i18n/locales/es.json +++ b/apps/mobile/src/i18n/locales/es.json @@ -2071,7 +2071,9 @@ "retrying": "Reintentando…", "retryDeny": "Volver a intentar denegar", "retryAllowOnce": "Volver a intentar permitir una vez", - "retryAlwaysAllow": "Volver a intentar permitir siempre" + "retryAlwaysAllow": "Volver a intentar permitir siempre", + "unreadableTitle": "No se pudo leer la solicitud de permiso", + "unreadableBody": "El agente está esperando una decisión de permiso que esta aplicación no puede mostrar. Actualiza la aplicación o la CLI, o responde a la solicitud en la CLI para continuar." }, "questionCard": { "title": "El agente necesita una respuesta", diff --git a/apps/mobile/src/i18n/locales/et.json b/apps/mobile/src/i18n/locales/et.json index 682c5a63326..cdf2e37b86c 100644 --- a/apps/mobile/src/i18n/locales/et.json +++ b/apps/mobile/src/i18n/locales/et.json @@ -2578,7 +2578,9 @@ "retrying": "Uuesti proovimine…", "retryDeny": "Proovi keelamist uuesti", "retryAllowOnce": "Proovi lubamist üks kord uuesti", - "retryAlwaysAllow": "Proovi lubamist alati uuesti" + "retryAlwaysAllow": "Proovi lubamist alati uuesti", + "unreadableTitle": "Lubamistaotlust ei saanud lugeda", + "unreadableBody": "Agent ootab luba puudutavat otsust, mida see rakendus ei saa näidata. Uuenda rakendust või CLI-t või vasta taotlusele CLI-s, et jätkata." }, "questionCard": { "title": "Agent vajab vastust", diff --git a/apps/mobile/src/i18n/locales/eu.json b/apps/mobile/src/i18n/locales/eu.json index 6778ed8992d..3d1db3198d0 100644 --- a/apps/mobile/src/i18n/locales/eu.json +++ b/apps/mobile/src/i18n/locales/eu.json @@ -2578,7 +2578,9 @@ "retrying": "Berriro saiatzen…", "retryDeny": "Saiatu berriro ukatzen", "retryAllowOnce": "Saiatu berriro behin bakarrik baimetzen", - "retryAlwaysAllow": "Saiatu berriro beti baimetzen" + "retryAlwaysAllow": "Saiatu berriro beti baimetzen", + "unreadableTitle": "Baimen-eskaera ezin izan da irakurri", + "unreadableBody": "Agentea baimen-erabakiaren zain dago, baina aplikazio honek ezin du eskaera hori erakutsi. Eguneratu aplikazioa edo CLI-a, edo erantzun eskaerari CLI-n jarraitzeko." }, "questionCard": { "title": "Agenteak zure erantzuna behar du", diff --git a/apps/mobile/src/i18n/locales/fa.json b/apps/mobile/src/i18n/locales/fa.json index b031dec0335..6ff3ca9da82 100644 --- a/apps/mobile/src/i18n/locales/fa.json +++ b/apps/mobile/src/i18n/locales/fa.json @@ -2578,7 +2578,9 @@ "retrying": "در حال تلاش دوباره…", "retryDeny": "تلاش دوباره برای رد کردن", "retryAllowOnce": "تلاش دوباره برای اجازه برای یک بار", - "retryAlwaysAllow": "تلاش دوباره برای اجازه همیشگی" + "retryAlwaysAllow": "تلاش دوباره برای اجازه همیشگی", + "unreadableTitle": "درخواست مجوز خوانده نشد", + "unreadableBody": "عامل منتظر تصمیم مجوزی است که این برنامه نمیتواند آن را نمایش دهد. برنامه یا CLI را بهروزرسانی کن، یا برای ادامه به درخواست در CLI پاسخ بده." }, "questionCard": { "title": "نیاز عامل به پاسخ شما", diff --git a/apps/mobile/src/i18n/locales/fi.json b/apps/mobile/src/i18n/locales/fi.json index cf54a9d176c..7e7ed0ce380 100644 --- a/apps/mobile/src/i18n/locales/fi.json +++ b/apps/mobile/src/i18n/locales/fi.json @@ -2578,7 +2578,9 @@ "retrying": "Yritetään uudelleen…", "retryDeny": "Yritä kieltää uudelleen", "retryAllowOnce": "Yritä salli kerran uudelleen", - "retryAlwaysAllow": "Yritä salli aina uudelleen" + "retryAlwaysAllow": "Yritä salli aina uudelleen", + "unreadableTitle": "Lupapyyntöä ei voitu lukea", + "unreadableBody": "Agentti odottaa lupapäätöstä, jota tämä sovellus ei voi näyttää. Päivitä sovellus tai CLI tai vastaa pyyntöön CLI:ssä jatkaaksesi." }, "questionCard": { "title": "Agentti tarvitsee vastauksesi", diff --git a/apps/mobile/src/i18n/locales/fil.json b/apps/mobile/src/i18n/locales/fil.json index f4845168d33..098299e7cb7 100644 --- a/apps/mobile/src/i18n/locales/fil.json +++ b/apps/mobile/src/i18n/locales/fil.json @@ -2578,7 +2578,9 @@ "retrying": "Muling sinusubukan…", "retryDeny": "Subukang tanggihan muli", "retryAllowOnce": "Subukang payagan nang isang beses muli", - "retryAlwaysAllow": "Subukang laging payagan muli" + "retryAlwaysAllow": "Subukang laging payagan muli", + "unreadableTitle": "Hindi mabasa ang hiling ng pahintulot", + "unreadableBody": "Naghihintay ang agent ng desisyon sa pahintulot na hindi maipakita ng app na ito. I-update ang app o ang CLI, o sagutin ang hiling sa CLI upang magpatuloy." }, "questionCard": { "title": "Kailangan ng ahente ng sagot", diff --git a/apps/mobile/src/i18n/locales/fr.json b/apps/mobile/src/i18n/locales/fr.json index 9c2f0f0f4df..513d3052c93 100644 --- a/apps/mobile/src/i18n/locales/fr.json +++ b/apps/mobile/src/i18n/locales/fr.json @@ -1970,7 +1970,9 @@ "retrying": "Nouvel essai…", "retryDeny": "Réessayer de refuser", "retryAllowOnce": "Réessayer d'autoriser une fois", - "retryAlwaysAllow": "Réessayer de toujours autoriser" + "retryAlwaysAllow": "Réessayer de toujours autoriser", + "unreadableTitle": "Impossible de lire la demande d'autorisation", + "unreadableBody": "L'agent attend une décision d'autorisation que cette application ne peut pas afficher. Mettez à jour l'application ou le CLI, ou répondez à la demande dans le CLI pour continuer." }, "questionCard": { "title": "Réponse attendue par l'agent", diff --git a/apps/mobile/src/i18n/locales/ga.json b/apps/mobile/src/i18n/locales/ga.json index 32b42b7d374..ea82900dd75 100644 --- a/apps/mobile/src/i18n/locales/ga.json +++ b/apps/mobile/src/i18n/locales/ga.json @@ -2686,7 +2686,9 @@ "retrying": "Ag triail arís…", "retryDeny": "Bain triail eile as diúltú", "retryAllowOnce": "Bain triail eile as ceadú uair amháin", - "retryAlwaysAllow": "Bain triail eile as ceadú i gcónaí" + "retryAlwaysAllow": "Bain triail eile as ceadú i gcónaí", + "unreadableTitle": "Níorbh fhéidir an t-iarratas ceada a léamh", + "unreadableBody": "Tá an gníomhaire ag fanacht le cinneadh ceada nach féidir leis an aip seo a thaispeáint. Nuashonraigh an aip nó an CLI, nó freagair an t-iarratas sa CLI chun leanúint ar aghaidh." }, "questionCard": { "title": "Tá ionchur ag teastáil ón ngníomhaire", diff --git a/apps/mobile/src/i18n/locales/gl.json b/apps/mobile/src/i18n/locales/gl.json index 211b877c7f6..9c38b01efc4 100644 --- a/apps/mobile/src/i18n/locales/gl.json +++ b/apps/mobile/src/i18n/locales/gl.json @@ -2578,7 +2578,9 @@ "retrying": "Tentándoo de novo…", "retryDeny": "Volver tentar denegar", "retryAllowOnce": "Volver tentar permitir unha vez", - "retryAlwaysAllow": "Volver tentar permitir sempre" + "retryAlwaysAllow": "Volver tentar permitir sempre", + "unreadableTitle": "Non se puido ler a solicitude de permiso", + "unreadableBody": "O agente está agardando unha decisión de permiso que esta aplicación non pode amosar. Actualiza a aplicación ou a CLI, ou responde á solicitude na CLI para continuar." }, "questionCard": { "title": "O axente precisa unha resposta", diff --git a/apps/mobile/src/i18n/locales/gu.json b/apps/mobile/src/i18n/locales/gu.json index d84650f0a71..ff3eca1ab98 100644 --- a/apps/mobile/src/i18n/locales/gu.json +++ b/apps/mobile/src/i18n/locales/gu.json @@ -2578,7 +2578,9 @@ "retrying": "ફરી પ્રયાસ થઈ રહ્યો છે…", "retryDeny": "નકારવાનો ફરી પ્રયાસ કરો", "retryAllowOnce": "એકવાર મંજૂરી આપવાનો ફરી પ્રયાસ કરો", - "retryAlwaysAllow": "હંમેશા મંજૂરી આપવાનો ફરી પ્રયાસ કરો" + "retryAlwaysAllow": "હંમેશા મંજૂરી આપવાનો ફરી પ્રયાસ કરો", + "unreadableTitle": "પરવાનગી વિનંતી વાંચી શકાઈ નથી", + "unreadableBody": "એજન્ટ પરવાનગીના નિર્ણયની રાહમાં છે જે આ એપ બતાવી શકતી નથી. ચાલુ રાખવા માટે એપ અથવા CLI અપડેટ કરો, અથવા CLI માં વિનંતીનો જવાબ આપો." }, "questionCard": { "title": "એજન્ટને તમારો જવાબ જોઈએ છે", diff --git a/apps/mobile/src/i18n/locales/ha.json b/apps/mobile/src/i18n/locales/ha.json index 328932eb78e..a2796ebf2be 100644 --- a/apps/mobile/src/i18n/locales/ha.json +++ b/apps/mobile/src/i18n/locales/ha.json @@ -2578,7 +2578,9 @@ "retrying": "Ana sake gwadawa…", "retryDeny": "Sake gwada ƙi", "retryAllowOnce": "Sake gwada ba da izini sau ɗaya", - "retryAlwaysAllow": "Sake gwada ba da izini koyaushe" + "retryAlwaysAllow": "Sake gwada ba da izini koyaushe", + "unreadableTitle": "Ba a iya karanta buƙatar izini", + "unreadableBody": "Wakilin yana jiran shawarar izini da wannan manhajar ba za ta iya nunawa ba. Sabunta manhajar ko CLI, ko kuma amsa buƙatar a cikin CLI domin ci gaba." }, "questionCard": { "title": "Wakili yana buƙatar bayani", diff --git a/apps/mobile/src/i18n/locales/he.json b/apps/mobile/src/i18n/locales/he.json index d787ff79ecc..9733cd3bbe7 100644 --- a/apps/mobile/src/i18n/locales/he.json +++ b/apps/mobile/src/i18n/locales/he.json @@ -2071,7 +2071,9 @@ "retrying": "מנסה שוב…", "retryDeny": "ניסיון דחייה נוסף", "retryAllowOnce": "ניסיון הרשאה חד-פעמית נוסף", - "retryAlwaysAllow": "ניסיון הרשאה קבועה נוסף" + "retryAlwaysAllow": "ניסיון הרשאה קבועה נוסף", + "unreadableTitle": "לא ניתן לקרוא את בקשת ההרשאה", + "unreadableBody": "הסוכן ממתין להחלטת הרשאה שאין באפשרות האפליקציה הזו להציג. יש לעדכן את האפליקציה או את ה-CLI, או להשיב לבקשה ב-CLI כדי להמשיך." }, "questionCard": { "title": "הסוכן ממתין לתשובה", diff --git a/apps/mobile/src/i18n/locales/hi.json b/apps/mobile/src/i18n/locales/hi.json index a814affc4b7..a28c88e2383 100644 --- a/apps/mobile/src/i18n/locales/hi.json +++ b/apps/mobile/src/i18n/locales/hi.json @@ -2027,7 +2027,9 @@ "retrying": "फिर से कोशिश हो रही है…", "retryDeny": "अस्वीकार करने की फिर से कोशिश करें", "retryAllowOnce": "एक बार अनुमति देने की फिर से कोशिश करें", - "retryAlwaysAllow": "हमेशा अनुमति देने की फिर से कोशिश करें" + "retryAlwaysAllow": "हमेशा अनुमति देने की फिर से कोशिश करें", + "unreadableTitle": "अनुमति अनुरोध पढ़ा नहीं जा सका", + "unreadableBody": "एजेंट एक अनुमति निर्णय की प्रतीक्षा कर रहा है, जिसे यह ऐप दिखा नहीं सकता। ऐप या CLI अपडेट करें, या जारी रखने के लिए CLI में अनुरोध का उत्तर दें।" }, "questionCard": { "title": "एजेंट को आपका उत्तर चाहिए", diff --git a/apps/mobile/src/i18n/locales/hr.json b/apps/mobile/src/i18n/locales/hr.json index 3e03fefa0c0..3a44d4f81d7 100644 --- a/apps/mobile/src/i18n/locales/hr.json +++ b/apps/mobile/src/i18n/locales/hr.json @@ -2614,7 +2614,9 @@ "retrying": "Ponovni pokušaj…", "retryDeny": "Pokušaj ponovno odbiti", "retryAllowOnce": "Pokušaj ponovno dopustiti jednom", - "retryAlwaysAllow": "Pokušaj ponovno uvijek dopustiti" + "retryAlwaysAllow": "Pokušaj ponovno uvijek dopustiti", + "unreadableTitle": "Zahtjev za dopuštenje nije moguće pročitati", + "unreadableBody": "Agent čeka odluku o dopuštenju koju ova aplikacija ne može prikazati. Ažurirajte aplikaciju ili CLI ili odgovorite na zahtjev u CLI-ju kako biste nastavili." }, "questionCard": { "title": "Agent treba odgovor", diff --git a/apps/mobile/src/i18n/locales/ht.json b/apps/mobile/src/i18n/locales/ht.json index 301ed8a8527..e10344df06b 100644 --- a/apps/mobile/src/i18n/locales/ht.json +++ b/apps/mobile/src/i18n/locales/ht.json @@ -2578,7 +2578,9 @@ "retrying": "Ap eseye ankò…", "retryDeny": "Eseye refize ankò", "retryAllowOnce": "Eseye pèmèt yon sèl fwa ankò", - "retryAlwaysAllow": "Eseye toujou pèmèt ankò" + "retryAlwaysAllow": "Eseye toujou pèmèt ankò", + "unreadableTitle": "Demann pèmisyon an pa t ka li", + "unreadableBody": "Ajan an ap tann yon desizyon pèmisyon a, men aplikasyon sa a pa ka montre demann lan. Mete aplikasyon an oswa CLI a ajou, oswa reponn demann lan nan CLI a pou w ka kontinye." }, "questionCard": { "title": "Ajan an bezwen yon repons", diff --git a/apps/mobile/src/i18n/locales/hu.json b/apps/mobile/src/i18n/locales/hu.json index 538fe36ccda..b77ef6fb100 100644 --- a/apps/mobile/src/i18n/locales/hu.json +++ b/apps/mobile/src/i18n/locales/hu.json @@ -2578,7 +2578,9 @@ "retrying": "Újrapróbálás…", "retryDeny": "Megtagadás újrapróbálása", "retryAllowOnce": "Egyszeri engedélyezés újrapróbálása", - "retryAlwaysAllow": "Mindig engedélyezés újrapróbálása" + "retryAlwaysAllow": "Mindig engedélyezés újrapróbálása", + "unreadableTitle": "Nem sikerült beolvasni az engedélykérést", + "unreadableBody": "Az ügynök egy engedélyezési döntésre vár, amelyet ez az alkalmazás nem tud megjeleníteni. Frissítse az alkalmazást vagy a CLI-t, illetve válaszoljon a kérésre a CLI-ben a folytatáshoz." }, "questionCard": { "title": "Az ügynök válaszra vagy jóváhagyásra vár", diff --git a/apps/mobile/src/i18n/locales/hy.json b/apps/mobile/src/i18n/locales/hy.json index ab0290ea24f..cf2010985c4 100644 --- a/apps/mobile/src/i18n/locales/hy.json +++ b/apps/mobile/src/i18n/locales/hy.json @@ -2578,7 +2578,9 @@ "retrying": "Կրկնափորձ…", "retryDeny": "Կրկին փորձել մերժել", "retryAllowOnce": "Կրկին փորձել մեկ անգամ թույլատրել", - "retryAlwaysAllow": "Կրկին փորձել միշտ թույլատրել" + "retryAlwaysAllow": "Կրկին փորձել միշտ թույլատրել", + "unreadableTitle": "Թույլտվության հարցումը հնարավոր չէ կարդալ", + "unreadableBody": "Գործակալը սպասում է թույլտվության որոշման, որը այս հավելվածը չի կարող ցուցադրել։ Թարմացրեք հավելվածը կամ CLI-ը, կամ պատասխանեք հարցմանը CLI-ում՝ շարունակելու համար։" }, "questionCard": { "title": "Գործակալը պատասխանի է սպասում", diff --git a/apps/mobile/src/i18n/locales/id.json b/apps/mobile/src/i18n/locales/id.json index 2d586ea3dcc..b3fb56b4d89 100644 --- a/apps/mobile/src/i18n/locales/id.json +++ b/apps/mobile/src/i18n/locales/id.json @@ -2054,7 +2054,9 @@ "retrying": "Mencoba lagi…", "retryDeny": "Coba tolak lagi", "retryAllowOnce": "Coba izinkan sekali lagi", - "retryAlwaysAllow": "Coba selalu izinkan lagi" + "retryAlwaysAllow": "Coba selalu izinkan lagi", + "unreadableTitle": "Permintaan izin tidak dapat dibaca", + "unreadableBody": "Agen sedang menunggu keputusan izin yang tidak dapat ditampilkan oleh aplikasi ini. Perbarui aplikasi atau CLI, atau jawab permintaan tersebut di CLI untuk melanjutkan." }, "questionCard": { "title": "Agen membutuhkan masukan", diff --git a/apps/mobile/src/i18n/locales/ig.json b/apps/mobile/src/i18n/locales/ig.json index 878f4f750a3..f681380d0ab 100644 --- a/apps/mobile/src/i18n/locales/ig.json +++ b/apps/mobile/src/i18n/locales/ig.json @@ -2578,7 +2578,9 @@ "retrying": "Na-anwa ọzọ…", "retryDeny": "Nwaa ịjụ ọzọ", "retryAllowOnce": "Nwaa ikwe naanị otu ugboro ọzọ", - "retryAlwaysAllow": "Nwaa ikwe mgbe niile ọzọ" + "retryAlwaysAllow": "Nwaa ikwe mgbe niile ọzọ", + "unreadableTitle": "Enweghị ike ịgụ arịrịọ ikike", + "unreadableBody": "Onye nnọchite na-eche mkpebi ikike nke ngwa a enweghị ike igosi. Melite ngwa ma ọ bụ CLI ahụ, ma ọ bụ zaa arịrịọ ahụ na CLI ka ị gaa n'ihu." }, "questionCard": { "title": "Onye nnọchi anya chọrọ azịza", diff --git a/apps/mobile/src/i18n/locales/is.json b/apps/mobile/src/i18n/locales/is.json index df65508082a..9a280011198 100644 --- a/apps/mobile/src/i18n/locales/is.json +++ b/apps/mobile/src/i18n/locales/is.json @@ -2578,7 +2578,9 @@ "retrying": "Reynir aftur…", "retryDeny": "Reyna að hafna aftur", "retryAllowOnce": "Reyna að leyfa einu sinni aftur", - "retryAlwaysAllow": "Reyna að leyfa alltaf aftur" + "retryAlwaysAllow": "Reyna að leyfa alltaf aftur", + "unreadableTitle": "Ekki tókst að lesa heimildarbeiðni", + "unreadableBody": "Agentinn bíður eftir heimildarákvörðun sem þetta forrit getur ekki sýnt. Uppfærðu forritið eða CLI, eða svaraðu beiðninni í CLI til að halda áfram." }, "questionCard": { "title": "Fulltrúinn þarf svar", diff --git a/apps/mobile/src/i18n/locales/it.json b/apps/mobile/src/i18n/locales/it.json index e9906e254ad..b971f2a0b7f 100644 --- a/apps/mobile/src/i18n/locales/it.json +++ b/apps/mobile/src/i18n/locales/it.json @@ -2039,7 +2039,9 @@ "retrying": "Nuovo tentativo…", "retryDeny": "Riprova a negare", "retryAllowOnce": "Riprova a consentire una volta", - "retryAlwaysAllow": "Riprova a consentire sempre" + "retryAlwaysAllow": "Riprova a consentire sempre", + "unreadableTitle": "Impossibile leggere la richiesta di autorizzazione", + "unreadableBody": "L'agente è in attesa di una decisione di autorizzazione che questa app non può mostrare. Aggiorna l'app o la CLI, oppure rispondi alla richiesta nella CLI per continuare." }, "questionCard": { "title": "Richiesta dell'agente", diff --git a/apps/mobile/src/i18n/locales/ja.json b/apps/mobile/src/i18n/locales/ja.json index 606ba5cae54..18c8f955cd7 100644 --- a/apps/mobile/src/i18n/locales/ja.json +++ b/apps/mobile/src/i18n/locales/ja.json @@ -2054,7 +2054,9 @@ "retrying": "再試行中…", "retryDeny": "拒否を再試行", "retryAllowOnce": "1回だけ許可を再試行", - "retryAlwaysAllow": "常に許可を再試行" + "retryAlwaysAllow": "常に許可を再試行", + "unreadableTitle": "許可のリクエストを読み取れませんでした", + "unreadableBody": "エージェントは許可の判断を待っていますが、このアプリではそのリクエストを表示できません。アプリまたはCLIを更新するか、CLIでリクエストに回答して続行してください。" }, "questionCard": { "title": "エージェントからの質問", diff --git a/apps/mobile/src/i18n/locales/ka.json b/apps/mobile/src/i18n/locales/ka.json index 3f1d44d37c2..6b075d1caba 100644 --- a/apps/mobile/src/i18n/locales/ka.json +++ b/apps/mobile/src/i18n/locales/ka.json @@ -2578,7 +2578,9 @@ "retrying": "ხელახლა ცდა…", "retryDeny": "უარყოფის ხელახლა ცდა", "retryAllowOnce": "ერთჯერადი დაშვების ხელახლა ცდა", - "retryAlwaysAllow": "ყოველთვის დაშვების ხელახლა ცდა" + "retryAlwaysAllow": "ყოველთვის დაშვების ხელახლა ცდა", + "unreadableTitle": "ნებართვის მოთხოვნის წაკითხვა ვერ მოხერხდა", + "unreadableBody": "აგენტი ელოდება ნებართვის გადაწყვეტილებას, რომლის ჩვენებასაც ეს აპლიკაცია ვერ ახერხებს. განაახლეთ აპლიკაცია ან CLI, ან უპასუხეთ მოთხოვნას CLI-ში, რათა გააგრძელოთ." }, "questionCard": { "title": "აგენტი პასუხს ელოდება", diff --git a/apps/mobile/src/i18n/locales/kk.json b/apps/mobile/src/i18n/locales/kk.json index 184934f2bd9..19de01ca5b7 100644 --- a/apps/mobile/src/i18n/locales/kk.json +++ b/apps/mobile/src/i18n/locales/kk.json @@ -2578,7 +2578,9 @@ "retrying": "Қайталануда…", "retryDeny": "Рұқсат бермеуді қайталау", "retryAllowOnce": "Бір рет рұқсат етуді қайталау", - "retryAlwaysAllow": "Әрқашан рұқсат етуді қайталау" + "retryAlwaysAllow": "Әрқашан рұқсат етуді қайталау", + "unreadableTitle": "Рұқсат сұрауын оқу мүмкін болмады", + "unreadableBody": "Агент рұқсат шешімін күтіп тұр, бірақ бұл қолданба сол сұрауды көрсете алмайды. Жалғастыру үшін қолданбаны немесе CLI-ды жаңартыңыз, не сұрауға CLI ішінде жауап беріңіз." }, "questionCard": { "title": "Агентке жауап қажет", diff --git a/apps/mobile/src/i18n/locales/km.json b/apps/mobile/src/i18n/locales/km.json index c49bd289c31..ec6f51d2d04 100644 --- a/apps/mobile/src/i18n/locales/km.json +++ b/apps/mobile/src/i18n/locales/km.json @@ -2578,7 +2578,9 @@ "retrying": "កំពុងព្យាយាមម្តងទៀត…", "retryDeny": "ព្យាយាមបដិសេធម្តងទៀត", "retryAllowOnce": "ព្យាយាមអនុញ្ញាតតែម្តងម្តងទៀត", - "retryAlwaysAllow": "ព្យាយាមអនុញ្ញាតជានិច្ចម្តងទៀត" + "retryAlwaysAllow": "ព្យាយាមអនុញ្ញាតជានិច្ចម្តងទៀត", + "unreadableTitle": "មិនអាចអានសំណើសុំការអនុញ្ញាតបានទេ", + "unreadableBody": "ភ្នាក់ងារកំពុងរង់ចាំការសម្រេចចិត្តអំពីការអនុញ្ញាត ដែលកម្មវិធីនេះមិនអាចបង្ហាញបានទេ។ សូមធ្វើបច្ចុប្បន្នភាពកម្មវិធី ឬ CLI ឬឆ្លើយសំណើនៅក្នុង CLI ដើម្បីបន្ត។" }, "questionCard": { "title": "ភ្នាក់ងារត្រូវការការបញ្ចូលពីអ្នក", diff --git a/apps/mobile/src/i18n/locales/kn.json b/apps/mobile/src/i18n/locales/kn.json index c605ea39f38..9c05b135f2e 100644 --- a/apps/mobile/src/i18n/locales/kn.json +++ b/apps/mobile/src/i18n/locales/kn.json @@ -2578,7 +2578,9 @@ "retrying": "ಮತ್ತೆ ಪ್ರಯತ್ನಿಸುತ್ತಿದೆ…", "retryDeny": "ನಿರಾಕರಿಸಲು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ", "retryAllowOnce": "ಒಮ್ಮೆ ಅನುಮತಿಸಲು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ", - "retryAlwaysAllow": "ಯಾವಾಗಲೂ ಅನುಮತಿಸಲು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ" + "retryAlwaysAllow": "ಯಾವಾಗಲೂ ಅನುಮತಿಸಲು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ", + "unreadableTitle": "ಅನುಮತಿ ವಿನಂತಿಯನ್ನು ಓದಲಾಗಲಿಲ್ಲ", + "unreadableBody": "ಏಜೆಂಟ್ ಈ ಆ್ಯಪ್ ತೋರಿಸಲಾಗದ ಅನುಮತಿ ನಿರ್ಧಾರಕ್ಕಾಗಿ ಕಾಯುತ್ತಿದೆ. ಮುಂದುವರಿಯಲು ಆ್ಯಪ್ ಅಥವಾ CLI ಅನ್ನು ನವೀಕರಿಸಿ, ಅಥವಾ CLI ನಲ್ಲಿ ವಿನಂತಿಗೆ ಉತ್ತರಿಸಿ." }, "questionCard": { "title": "ಏಜೆಂಟ್‌ಗೆ ನಿಮ್ಮ ಉತ್ತರ ಬೇಕಿದೆ", diff --git a/apps/mobile/src/i18n/locales/ko.json b/apps/mobile/src/i18n/locales/ko.json index e336148de62..70a84e6baa6 100644 --- a/apps/mobile/src/i18n/locales/ko.json +++ b/apps/mobile/src/i18n/locales/ko.json @@ -2054,7 +2054,9 @@ "retrying": "다시 시도 중…", "retryDeny": "거부 다시 시도", "retryAllowOnce": "이번만 허용 다시 시도", - "retryAlwaysAllow": "항상 허용 다시 시도" + "retryAlwaysAllow": "항상 허용 다시 시도", + "unreadableTitle": "권한 요청을 읽을 수 없음", + "unreadableBody": "에이전트가 권한 결정을 기다리고 있지만 이 앱에서는 해당 요청을 표시할 수 없습니다. 앱이나 CLI를 업데이트하거나 CLI에서 요청에 응답해 계속 진행하세요." }, "questionCard": { "title": "에이전트의 질문", diff --git a/apps/mobile/src/i18n/locales/lo.json b/apps/mobile/src/i18n/locales/lo.json index ea1dc311989..920d9791ef9 100644 --- a/apps/mobile/src/i18n/locales/lo.json +++ b/apps/mobile/src/i18n/locales/lo.json @@ -2578,7 +2578,9 @@ "retrying": "ກຳລັງລອງໃໝ່…", "retryDeny": "ລອງບໍ່ອະນຸຍາດໃໝ່", "retryAllowOnce": "ລອງອະນຸຍາດສະເພາະຄັ້ງນີ້ໃໝ່", - "retryAlwaysAllow": "ລອງອະນຸຍາດທຸກຄັ້ງໃໝ່" + "retryAlwaysAllow": "ລອງອະນຸຍາດທຸກຄັ້ງໃໝ່", + "unreadableTitle": "ບໍ່ສາມາດອ່ານຄຳຮ້ອງຂໍອະນຸຍາດໄດ້", + "unreadableBody": "ຕົວແທນກຳລັງລໍຖ້າການຕັດສິນອະນຸຍາດທີ່ແອັບນີ້ບໍ່ສາມາດສະແດງໄດ້. ກະລຸນາອັບເດດແອັບ ຫຼື CLI, ຫຼືຕອບຄຳຮ້ອງໃນ CLI ເພື່ອສືບຕໍ່." }, "questionCard": { "title": "ເອເຈນຕ້ອງການຄຳຕອບ", diff --git a/apps/mobile/src/i18n/locales/lt.json b/apps/mobile/src/i18n/locales/lt.json index 5e39d338cf0..1ce9f393404 100644 --- a/apps/mobile/src/i18n/locales/lt.json +++ b/apps/mobile/src/i18n/locales/lt.json @@ -2650,7 +2650,9 @@ "retrying": "Bandoma iš naujo…", "retryDeny": "Bandyti neleisti iš naujo", "retryAllowOnce": "Bandyti leisti vieną kartą iš naujo", - "retryAlwaysAllow": "Bandyti visada leisti iš naujo" + "retryAlwaysAllow": "Bandyti visada leisti iš naujo", + "unreadableTitle": "Nepavyko nuskaityti leidimo užklausos", + "unreadableBody": "Agentas laukia sprendimo dėl leidimo, kurio ši programa negali parodyti. Atnaujinkite programą arba CLI arba atsakykite į užklausą CLI, kad galėtumėte tęsti." }, "questionCard": { "title": "Agentui reikia atsakymo", diff --git a/apps/mobile/src/i18n/locales/lv.json b/apps/mobile/src/i18n/locales/lv.json index 2d96e261fe2..6083ba0333f 100644 --- a/apps/mobile/src/i18n/locales/lv.json +++ b/apps/mobile/src/i18n/locales/lv.json @@ -2614,7 +2614,9 @@ "retrying": "Mēģina vēlreiz…", "retryDeny": "Mēģināt liegt vēlreiz", "retryAllowOnce": "Mēģināt atļaut vienreiz vēlreiz", - "retryAlwaysAllow": "Mēģināt vienmēr atļaut vēlreiz" + "retryAlwaysAllow": "Mēģināt vienmēr atļaut vēlreiz", + "unreadableTitle": "Atļaujas pieprasījumu nevarēja nolasīt", + "unreadableBody": "Aģents gaida atļaujas lēmumu, ko šī lietotne nevar parādīt. Atjaunināt lietotni vai CLI, vai atbildēt uz pieprasījumu CLI, lai turpinātu." }, "questionCard": { "title": "Aģents gaida atbildi", diff --git a/apps/mobile/src/i18n/locales/mg.json b/apps/mobile/src/i18n/locales/mg.json index 6cfd571a05b..2d5c574144f 100644 --- a/apps/mobile/src/i18n/locales/mg.json +++ b/apps/mobile/src/i18n/locales/mg.json @@ -2578,7 +2578,9 @@ "retrying": "Manandrana indray…", "retryDeny": "Andramo lavino indray", "retryAllowOnce": "Andramo avelao indray mandeha indray", - "retryAlwaysAllow": "Andramo avelao foana indray" + "retryAlwaysAllow": "Andramo avelao foana indray", + "unreadableTitle": "Tsy afaka novakiana ny fangatahana alalana", + "unreadableBody": "Miandry fanapahan-kevitra momba ny alalana ny agent fa tsy afaka asehon'ity rindrankajy ity io fangatahana io. Havaozy ny rindrankajy na ny CLI, na valio ao amin'ny CLI ny fangatahana mba hahafahana manohy." }, "questionCard": { "title": "Mila valiny ny mpanampy", diff --git a/apps/mobile/src/i18n/locales/mi.json b/apps/mobile/src/i18n/locales/mi.json index e36d0d7a3b7..d75c9bb1c7b 100644 --- a/apps/mobile/src/i18n/locales/mi.json +++ b/apps/mobile/src/i18n/locales/mi.json @@ -2578,7 +2578,9 @@ "retrying": "Kei te whakamātau anō…", "retryDeny": "Whakamātau anō ki te whakakāhoretia", "retryAllowOnce": "Whakamātau anō ki te whakaaetia mō tēnei wā anake", - "retryAlwaysAllow": "Whakamātau anō ki te whakaaetia i ngā wā katoa" + "retryAlwaysAllow": "Whakamātau anō ki te whakaaetia i ngā wā katoa", + "unreadableTitle": "Kāore i taea te pānui te tono whakaaetanga", + "unreadableBody": "E tatari ana te māngai ki tētahi whakataunga whakaaetanga kāore e taea e tēnei taupānga te whakaatu. Whakahōuhia te taupānga, te CLI rānei, whakautua rānei te tono ki te CLI kia haere tonu ai." }, "questionCard": { "title": "E hiahia ana te māngai ki tō whakautu", diff --git a/apps/mobile/src/i18n/locales/mk.json b/apps/mobile/src/i18n/locales/mk.json index 4c47a2c284e..0901ae84c3f 100644 --- a/apps/mobile/src/i18n/locales/mk.json +++ b/apps/mobile/src/i18n/locales/mk.json @@ -2578,7 +2578,9 @@ "retrying": "Повторен обид…", "retryDeny": "Повтори го одбивањето", "retryAllowOnce": "Повтори го дозволувањето еднаш", - "retryAlwaysAllow": "Повтори го дозволувањето секогаш" + "retryAlwaysAllow": "Повтори го дозволувањето секогаш", + "unreadableTitle": "Барањето за дозвола не можеше да се прочита", + "unreadableBody": "Агентот чека одлука за дозвола што оваа апликација не може да ја прикаже. Ажурирајте ја апликацијата или CLI, или одговорете на барањето во CLI за да продолжите." }, "questionCard": { "title": "Агентот чека одговор", diff --git a/apps/mobile/src/i18n/locales/ml.json b/apps/mobile/src/i18n/locales/ml.json index 335bf73e4be..8d1ac648d20 100644 --- a/apps/mobile/src/i18n/locales/ml.json +++ b/apps/mobile/src/i18n/locales/ml.json @@ -2578,7 +2578,9 @@ "retrying": "വീണ്ടും ശ്രമിക്കുന്നു…", "retryDeny": "നിഷേധിക്കാൻ വീണ്ടും ശ്രമിക്കുക", "retryAllowOnce": "ഈ തവണ അനുവദിക്കാൻ വീണ്ടും ശ്രമിക്കുക", - "retryAlwaysAllow": "എപ്പോഴും അനുവദിക്കാൻ വീണ്ടും ശ്രമിക്കുക" + "retryAlwaysAllow": "എപ്പോഴും അനുവദിക്കാൻ വീണ്ടും ശ്രമിക്കുക", + "unreadableTitle": "അനുമതി അഭ്യർത്ഥന വായിക്കാനായില്ല", + "unreadableBody": "ഈ ആപ്പിന് കാണിക്കാനാകാത്ത ഒരു അനുമതി തീരുമാനത്തിനായി ഏജന്റ് കാത്തിരിക്കുകയാണ്. തുടരാൻ ആപ്പോ CLI-യോ അപ്ഡേറ്റ് ചെയ്യുക, അല്ലെങ്കിൽ CLI-യിൽ അഭ്യർത്ഥനയ്ക്ക് മറുപടി നൽകുക." }, "questionCard": { "title": "ഏജന്റിന് മറുപടി ആവശ്യമാണ്", diff --git a/apps/mobile/src/i18n/locales/mn.json b/apps/mobile/src/i18n/locales/mn.json index 0154a7fccc3..d4099621230 100644 --- a/apps/mobile/src/i18n/locales/mn.json +++ b/apps/mobile/src/i18n/locales/mn.json @@ -2578,7 +2578,9 @@ "retrying": "Дахин оролдож байна…", "retryDeny": "Татгалзахыг дахин оролдох", "retryAllowOnce": "Нэг удаа зөвшөөрөхийг дахин оролдох", - "retryAlwaysAllow": "Үргэлж зөвшөөрөхийг дахин оролдох" + "retryAlwaysAllow": "Үргэлж зөвшөөрөхийг дахин оролдох", + "unreadableTitle": "Зөвшөөрлийн хүсэлтийг уншиж чадсангүй", + "unreadableBody": "Агент зөвшөөрлийн шийдвэрийг хүлээж байгаа боловч энэ апп тухайн хүсэлтийг харуулж чадахгүй байна. Апп эсвэл CLI-г шинэчилнэ үү, эсвэл үргэлжлүүлэхийн тулд хүсэлтэд CLI дээр хариулна уу." }, "questionCard": { "title": "Агент хариулт хүлээж байна", diff --git a/apps/mobile/src/i18n/locales/mr.json b/apps/mobile/src/i18n/locales/mr.json index 975e503e1e2..ef73fbe0866 100644 --- a/apps/mobile/src/i18n/locales/mr.json +++ b/apps/mobile/src/i18n/locales/mr.json @@ -2578,7 +2578,9 @@ "retrying": "पुन्हा प्रयत्न करत आहे…", "retryDeny": "नाकारण्याचा पुन्हा प्रयत्न करा", "retryAllowOnce": "एकदा परवानगी देण्याचा पुन्हा प्रयत्न करा", - "retryAlwaysAllow": "नेहमी परवानगी देण्याचा पुन्हा प्रयत्न करा" + "retryAlwaysAllow": "नेहमी परवानगी देण्याचा पुन्हा प्रयत्न करा", + "unreadableTitle": "परवानगी विनंती वाचता आली नाही", + "unreadableBody": "एजंट ही परवानगी विनंती पाहू शकत नाही अशा निर्णयाची वाट पाहत आहे. पुढे जाण्यासाठी अ‍ॅप किंवा CLI अद्ययावत करा, किंवा CLI मध्येच या विनंतीचे उत्तर द्या." }, "questionCard": { "title": "एजंटला तुमचे उत्तर हवे आहे", diff --git a/apps/mobile/src/i18n/locales/ms.json b/apps/mobile/src/i18n/locales/ms.json index 1591c879719..6108f73609c 100644 --- a/apps/mobile/src/i18n/locales/ms.json +++ b/apps/mobile/src/i18n/locales/ms.json @@ -2578,7 +2578,9 @@ "retrying": "Mencuba semula…", "retryDeny": "Cuba tolak semula", "retryAllowOnce": "Cuba benarkan sekali semula", - "retryAlwaysAllow": "Cuba sentiasa benarkan semula" + "retryAlwaysAllow": "Cuba sentiasa benarkan semula", + "unreadableTitle": "Permintaan kebenaran tidak dapat dibaca", + "unreadableBody": "Ejen sedang menunggu keputusan kebenaran yang tidak dapat ditunjukkan oleh aplikasi ini. Kemas kini aplikasi atau CLI, atau jawab permintaan itu dalam CLI untuk meneruskan." }, "questionCard": { "title": "Ejen memerlukan maklumat", diff --git a/apps/mobile/src/i18n/locales/mt.json b/apps/mobile/src/i18n/locales/mt.json index 6f5293eddea..c57a53ff6e5 100644 --- a/apps/mobile/src/i18n/locales/mt.json +++ b/apps/mobile/src/i18n/locales/mt.json @@ -2686,7 +2686,9 @@ "retrying": "Qed jerġa' jipprova…", "retryDeny": "Erġa' pprova tiċħad", "retryAllowOnce": "Erġa' pprova tippermetti darba biss", - "retryAlwaysAllow": "Erġa' pprova tippermetti dejjem" + "retryAlwaysAllow": "Erġa' pprova tippermetti dejjem", + "unreadableTitle": "It-talba għall-permess ma setgħetx inqrat", + "unreadableBody": "L-agent qed jistenna deċiżjoni dwar il-permess li din l-app ma tistax turi. Aġġorna l-app jew il-CLI, jew wieġeb it-talba fil-CLI biex tkompli." }, "questionCard": { "title": "L-aġent jeħtieġ it-tweġiba tiegħek", diff --git a/apps/mobile/src/i18n/locales/my.json b/apps/mobile/src/i18n/locales/my.json index c47a4001acf..9c6f8ab8435 100644 --- a/apps/mobile/src/i18n/locales/my.json +++ b/apps/mobile/src/i18n/locales/my.json @@ -2578,7 +2578,9 @@ "retrying": "ထပ်ကြိုးစားနေသည်…", "retryDeny": "ငြင်းပယ်ရန် ထပ်ကြိုးစားပါ", "retryAllowOnce": "တစ်ကြိမ်သာ ခွင့်ပြုရန် ထပ်ကြိုးစားပါ", - "retryAlwaysAllow": "အမြဲ ခွင့်ပြုရန် ထပ်ကြိုးစားပါ" + "retryAlwaysAllow": "အမြဲ ခွင့်ပြုရန် ထပ်ကြိုးစားပါ", + "unreadableTitle": "ခွင့်ပြုချက် တောင်းဆိုမှုကို ဖတ်၍မရပါ", + "unreadableBody": "ဤအက်ပ်တွင် ပြသ၍မရသော ခွင့်ပြုချက် ဆုံးဖြတ်ချက်ကို agent က စောင့်နေပါသည်။ ဆက်လုပ်ရန် အက်ပ် သို့မဟုတ် CLI ကို အပ်ဒိတ်လုပ်ပါ၊ သို့မဟုတ် CLI တွင် တောင်းဆိုမှုကို ဖြေကြားပါ။" }, "questionCard": { "title": "အေးဂျင့်က အဖြေလိုအပ်နေသည်", diff --git a/apps/mobile/src/i18n/locales/nb.json b/apps/mobile/src/i18n/locales/nb.json index 94ff8271e08..db3c9556a87 100644 --- a/apps/mobile/src/i18n/locales/nb.json +++ b/apps/mobile/src/i18n/locales/nb.json @@ -2578,7 +2578,9 @@ "retrying": "Prøver på nytt…", "retryDeny": "Prøv å nekte på nytt", "retryAllowOnce": "Prøv å tillate én gang på nytt", - "retryAlwaysAllow": "Prøv å tillate alltid på nytt" + "retryAlwaysAllow": "Prøv å tillate alltid på nytt", + "unreadableTitle": "Tillatelsesforespørselen kunne ikke leses", + "unreadableBody": "Agenten venter på en tillatelsesbeslutning som denne appen ikke kan vise. Oppdater appen eller CLI, eller svar på forespørselen i CLI for å fortsette." }, "questionCard": { "title": "Agenten trenger svar", diff --git a/apps/mobile/src/i18n/locales/ne.json b/apps/mobile/src/i18n/locales/ne.json index 8d3330c8550..365b62acd49 100644 --- a/apps/mobile/src/i18n/locales/ne.json +++ b/apps/mobile/src/i18n/locales/ne.json @@ -2578,7 +2578,9 @@ "retrying": "पुनः प्रयास गर्दै…", "retryDeny": "अस्वीकार गर्न पुनः प्रयास गर्नुहोस्", "retryAllowOnce": "एक पटक अनुमति दिन पुनः प्रयास गर्नुहोस्", - "retryAlwaysAllow": "सधैँ अनुमति दिन पुनः प्रयास गर्नुहोस्" + "retryAlwaysAllow": "सधैँ अनुमति दिन पुनः प्रयास गर्नुहोस्", + "unreadableTitle": "अनुमति अनुरोध पढ्न सकिएन", + "unreadableBody": "एजेन्टले अनुमति निर्णयको प्रतीक्षा गर्दैछ, जुन यो एपले देखाउन सक्दैन। कृपया एप वा CLI अद्यावधिक गर्नुहोस्, वा जारी राख्न CLI मै अनुरोधको जवाफ दिनुहोस्।" }, "questionCard": { "title": "एजेन्टलाई उत्तर चाहिएको छ", diff --git a/apps/mobile/src/i18n/locales/nl.json b/apps/mobile/src/i18n/locales/nl.json index 7068743475a..e3fc3192deb 100644 --- a/apps/mobile/src/i18n/locales/nl.json +++ b/apps/mobile/src/i18n/locales/nl.json @@ -2054,7 +2054,9 @@ "retrying": "Opnieuw proberen…", "retryDeny": "Opnieuw weigeren", "retryAllowOnce": "Opnieuw eenmalig toestaan", - "retryAlwaysAllow": "Opnieuw altijd toestaan" + "retryAlwaysAllow": "Opnieuw altijd toestaan", + "unreadableTitle": "Toestemmingsverzoek kon niet worden gelezen", + "unreadableBody": "De agent wacht op een toestemmingsbeslissing die deze app niet kan tonen. Werk de app of de CLI bij, of beantwoord het verzoek in de CLI om door te gaan." }, "questionCard": { "title": "Invoer voor de agent nodig", diff --git a/apps/mobile/src/i18n/locales/om.json b/apps/mobile/src/i18n/locales/om.json index 9938e15cf98..e194f5b02e3 100644 --- a/apps/mobile/src/i18n/locales/om.json +++ b/apps/mobile/src/i18n/locales/om.json @@ -2578,7 +2578,9 @@ "retrying": "Deebi'ee yaalaa jira…", "retryDeny": "Diduuf deebi'ii yaali", "retryAllowOnce": "Al tokko hayyamuuf deebi'ii yaali", - "retryAlwaysAllow": "Yeroo hunda hayyamuuf deebi'ii yaali" + "retryAlwaysAllow": "Yeroo hunda hayyamuuf deebi'ii yaali", + "unreadableTitle": "Gaaffiin hayyamaa dubbifamuu hin dandeenye", + "unreadableBody": "Ajentiin murtii hayyamaa eeggachaa jira; appiin kun sana agarsiisuu hin danda'u. Appii ykn CLI haaromsi, ykn itti fufuuf gaaffii CLI keessatti deebisi." }, "questionCard": { "title": "Ergamaan deebii barbaada", diff --git a/apps/mobile/src/i18n/locales/or.json b/apps/mobile/src/i18n/locales/or.json index 32664065bef..1d2f8ea1a6c 100644 --- a/apps/mobile/src/i18n/locales/or.json +++ b/apps/mobile/src/i18n/locales/or.json @@ -2578,7 +2578,9 @@ "retrying": "ପୁଣି ଚେଷ୍ଟା ହେଉଛି…", "retryDeny": "ଅସ୍ୱୀକାର କରିବାକୁ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ", "retryAllowOnce": "ଏଥର ଅନୁମତି ଦେବାକୁ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ", - "retryAlwaysAllow": "ସର୍ବଦା ଅନୁମତି ଦେବାକୁ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ" + "retryAlwaysAllow": "ସର୍ବଦା ଅନୁମତି ଦେବାକୁ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ", + "unreadableTitle": "ଅନୁମତି ଅନୁରୋଧ ପଢ଼ାଯାଇପାରିଲା ନାହିଁ", + "unreadableBody": "ଏଜେଣ୍ଟ ଏକ ଅନୁମତି ନିଷ୍ପତ୍ତି ଅପେକ୍ଷାରେ ଅଛି ଯାହା ଏହି ଆପ୍ ଦେଖାଇପାରିବ ନାହିଁ। ଜାରି ରଖିବା ପାଇଁ ଆପ୍ କିମ୍ବା CLI ଅପଡେଟ୍ କରନ୍ତୁ, କିମ୍ବା CLI ରେ ଅନୁରୋଧର ଉତ୍ତର ଦିଅନ୍ତୁ।" }, "questionCard": { "title": "ଏଜେଣ୍ଟକୁ ଆପଣଙ୍କ ଉତ୍ତର ଦରକାର", diff --git a/apps/mobile/src/i18n/locales/pa.json b/apps/mobile/src/i18n/locales/pa.json index 884029537c6..f80ea587a98 100644 --- a/apps/mobile/src/i18n/locales/pa.json +++ b/apps/mobile/src/i18n/locales/pa.json @@ -2578,7 +2578,9 @@ "retrying": "ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…", "retryDeny": "ਇਨਕਾਰ ਕਰਨ ਦੀ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ", "retryAllowOnce": "ਇੱਕ ਵਾਰ ਇਜਾਜ਼ਤ ਦੇਣ ਦੀ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ", - "retryAlwaysAllow": "ਹਮੇਸ਼ਾ ਇਜਾਜ਼ਤ ਦੇਣ ਦੀ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ" + "retryAlwaysAllow": "ਹਮੇਸ਼ਾ ਇਜਾਜ਼ਤ ਦੇਣ ਦੀ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ", + "unreadableTitle": "ਇਜਾਜ਼ਤ ਬੇਨਤੀ ਪੜ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕੀ", + "unreadableBody": "ਏਜੰਟ ਇੱਕ ਇਜਾਜ਼ਤ ਦੇ ਫੈਸਲੇ ਦੀ ਉਡੀਕ ਕਰ ਰਿਹਾ ਹੈ ਜੋ ਇਹ ਐਪ ਦਿਖਾ ਨਹੀਂ ਸਕਦੀ। ਜਾਰੀ ਰੱਖਣ ਲਈ ਐਪ ਜਾਂ CLI ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ, ਜਾਂ CLI ਵਿੱਚ ਬੇਨਤੀ ਦਾ ਜਵਾਬ ਦਿਓ।" }, "questionCard": { "title": "ਏਜੰਟ ਨੂੰ ਤੁਹਾਡੇ ਜਵਾਬ ਦੀ ਲੋੜ ਹੈ", diff --git a/apps/mobile/src/i18n/locales/pl.json b/apps/mobile/src/i18n/locales/pl.json index 4f14fa44168..54f92bb4f8c 100644 --- a/apps/mobile/src/i18n/locales/pl.json +++ b/apps/mobile/src/i18n/locales/pl.json @@ -2088,7 +2088,9 @@ "retrying": "Ponawianie…", "retryDeny": "Ponów odmowę", "retryAllowOnce": "Ponów zezwolenie tylko tym razem", - "retryAlwaysAllow": "Ponów zezwalanie zawsze" + "retryAlwaysAllow": "Ponów zezwalanie zawsze", + "unreadableTitle": "Nie można odczytać prośby o zgodę", + "unreadableBody": "Agent czeka na decyzję o zgodzie, której ta aplikacja nie może pokazać. Zaktualizuj aplikację lub CLI albo odpowiedz na prośbę w CLI, aby kontynuować." }, "questionCard": { "title": "Agent czeka na odpowiedź", diff --git a/apps/mobile/src/i18n/locales/ps.json b/apps/mobile/src/i18n/locales/ps.json index 1098a9dae9c..ce903804e52 100644 --- a/apps/mobile/src/i18n/locales/ps.json +++ b/apps/mobile/src/i18n/locales/ps.json @@ -2578,7 +2578,9 @@ "retrying": "بیا هڅه روانه ده…", "retryDeny": "د رد بیا هڅه وکړئ", "retryAllowOnce": "د یو ځل اجازې بیا هڅه وکړئ", - "retryAlwaysAllow": "د تل اجازې بیا هڅه وکړئ" + "retryAlwaysAllow": "د تل اجازې بیا هڅه وکړئ", + "unreadableTitle": "د اجازې غوښتنه ونه لوستل شوه", + "unreadableBody": "اجنټ د اجازې د پرېکړې په تمه دی چې دا اپلیکیشن یې ښودلی نشي. اپلیکیشن یا CLI تازه کړئ، یا د دوام لپاره په CLI کې غوښتنې ته ځواب ورکړئ." }, "questionCard": { "title": "ایجنټ ځواب ته اړتیا لري", diff --git a/apps/mobile/src/i18n/locales/pt-BR.json b/apps/mobile/src/i18n/locales/pt-BR.json index 752e8463b49..ccebed6d025 100644 --- a/apps/mobile/src/i18n/locales/pt-BR.json +++ b/apps/mobile/src/i18n/locales/pt-BR.json @@ -2039,7 +2039,9 @@ "retrying": "Tentando novamente…", "retryDeny": "Tentar negar novamente", "retryAllowOnce": "Tentar permitir uma vez novamente", - "retryAlwaysAllow": "Tentar permitir sempre novamente" + "retryAlwaysAllow": "Tentar permitir sempre novamente", + "unreadableTitle": "Não foi possível ler a solicitação de permissão", + "unreadableBody": "O agente está aguardando uma decisão de permissão que este app não consegue exibir. Atualize o app ou o CLI, ou responda à solicitação no CLI para continuar." }, "questionCard": { "title": "O agente precisa de uma resposta", diff --git a/apps/mobile/src/i18n/locales/pt.json b/apps/mobile/src/i18n/locales/pt.json index 4f0f4a5abd0..ec740d772bb 100644 --- a/apps/mobile/src/i18n/locales/pt.json +++ b/apps/mobile/src/i18n/locales/pt.json @@ -2614,7 +2614,9 @@ "retrying": "A tentar novamente…", "retryDeny": "Tentar negar novamente", "retryAllowOnce": "Tentar permitir uma vez novamente", - "retryAlwaysAllow": "Tentar permitir sempre novamente" + "retryAlwaysAllow": "Tentar permitir sempre novamente", + "unreadableTitle": "Não foi possível ler o pedido de permissão", + "unreadableBody": "O agente está à espera de uma decisão de permissão que esta aplicação não consegue mostrar. Atualize a aplicação ou o CLI, ou responda ao pedido no CLI para continuar." }, "questionCard": { "title": "Resposta necessária", diff --git a/apps/mobile/src/i18n/locales/ro.json b/apps/mobile/src/i18n/locales/ro.json index 0cd7e37d1ef..761d7cc1ae1 100644 --- a/apps/mobile/src/i18n/locales/ro.json +++ b/apps/mobile/src/i18n/locales/ro.json @@ -2614,7 +2614,9 @@ "retrying": "Se reîncearcă…", "retryDeny": "Încearcă din nou să refuzi", "retryAllowOnce": "Încearcă din nou să permiți o singură dată", - "retryAlwaysAllow": "Încearcă din nou să permiți întotdeauna" + "retryAlwaysAllow": "Încearcă din nou să permiți întotdeauna", + "unreadableTitle": "Cererea de permisiune nu a putut fi citită", + "unreadableBody": "Agentul așteaptă o decizie de permisiune pe care această aplicație nu o poate afișa. Actualizează aplicația sau CLI-ul, ori răspunde la cerere în CLI pentru a continua." }, "questionCard": { "title": "Răspuns necesar pentru agent", diff --git a/apps/mobile/src/i18n/locales/ru.json b/apps/mobile/src/i18n/locales/ru.json index 36a99ba01a3..8dc0c0f9343 100644 --- a/apps/mobile/src/i18n/locales/ru.json +++ b/apps/mobile/src/i18n/locales/ru.json @@ -2088,7 +2088,9 @@ "retrying": "Повторная попытка…", "retryDeny": "Запретить ещё раз", "retryAllowOnce": "Разрешить один раз ещё раз", - "retryAlwaysAllow": "Всегда разрешать ещё раз" + "retryAlwaysAllow": "Всегда разрешать ещё раз", + "unreadableTitle": "Не удалось прочитать запрос разрешения", + "unreadableBody": "Агент ожидает решения о разрешении, которое это приложение не может показать. Обновите приложение или CLI, либо ответьте на запрос в CLI, чтобы продолжить." }, "questionCard": { "title": "Агенту нужен ответ", diff --git a/apps/mobile/src/i18n/locales/si.json b/apps/mobile/src/i18n/locales/si.json index 8d62fd2676c..e6d9b6b3446 100644 --- a/apps/mobile/src/i18n/locales/si.json +++ b/apps/mobile/src/i18n/locales/si.json @@ -2578,7 +2578,9 @@ "retrying": "නැවත උත්සාහ කරමින්…", "retryDeny": "ප්‍රතික්ෂේප කිරීමට නැවත උත්සාහ කරන්න", "retryAllowOnce": "එක් වරක් පමණක් ඉඩ දීමට නැවත උත්සාහ කරන්න", - "retryAlwaysAllow": "සැමවිටම ඉඩ දීමට නැවත උත්සාහ කරන්න" + "retryAlwaysAllow": "සැමවිටම ඉඩ දීමට නැවත උත්සාහ කරන්න", + "unreadableTitle": "අවසර ඉල්ලීම කියවිය නොහැකි විය", + "unreadableBody": "මෙම යෙදුමට පෙන්විය නොහැකි අවසර තීරණයක් සඳහා agent රැඳී සිටී. ඉදිරියට යාමට යෙදුම හෝ CLI යාවත්කාලීන කරන්න, නැතහොත් CLI තුළ ඉල්ලීමට පිළිතුරු දෙන්න." }, "questionCard": { "title": "නියෝජිතයාට ඔබේ පිළිතුර අවශ්‍යයි", diff --git a/apps/mobile/src/i18n/locales/sk.json b/apps/mobile/src/i18n/locales/sk.json index 30f8bf9b68a..967709e63aa 100644 --- a/apps/mobile/src/i18n/locales/sk.json +++ b/apps/mobile/src/i18n/locales/sk.json @@ -2650,7 +2650,9 @@ "retrying": "Skúša sa znova…", "retryDeny": "Skúsiť zamietnuť znova", "retryAllowOnce": "Skúsiť povoliť tentoraz znova", - "retryAlwaysAllow": "Skúsiť vždy povoliť znova" + "retryAlwaysAllow": "Skúsiť vždy povoliť znova", + "unreadableTitle": "Žiadosť o povolenie sa nepodarilo prečítať", + "unreadableBody": "Agent čaká na rozhodnutie o povolení, ktoré táto aplikácia nedokáže zobraziť. Aktualizujte aplikáciu alebo CLI, prípadne odpovedzte na žiadosť v CLI, aby ste mohli pokračovať." }, "questionCard": { "title": "Agent potrebuje odpoveď", diff --git a/apps/mobile/src/i18n/locales/sl.json b/apps/mobile/src/i18n/locales/sl.json index 9564703661e..7ca44dfdb6c 100644 --- a/apps/mobile/src/i18n/locales/sl.json +++ b/apps/mobile/src/i18n/locales/sl.json @@ -2650,7 +2650,9 @@ "retrying": "Ponovni poskus…", "retryDeny": "Znova zavrni", "retryAllowOnce": "Znova dovoli enkrat", - "retryAlwaysAllow": "Znova vedno dovoli" + "retryAlwaysAllow": "Znova vedno dovoli", + "unreadableTitle": "Zahteve za dovoljenje ni bilo mogoče prebrati", + "unreadableBody": "Agent čaka na odločitev o dovoljenju, ki je ta aplikacija ne more prikazati. Posodobite aplikacijo ali CLI ali pa na zahtevo odgovorite v CLI, da nadaljujete." }, "questionCard": { "title": "Agent potrebuje tvoj odgovor", diff --git a/apps/mobile/src/i18n/locales/so.json b/apps/mobile/src/i18n/locales/so.json index a7ce347dc16..425cbe0228e 100644 --- a/apps/mobile/src/i18n/locales/so.json +++ b/apps/mobile/src/i18n/locales/so.json @@ -2578,7 +2578,9 @@ "retrying": "Mar kale ayaa la isku dayayaa…", "retryDeny": "Mar kale isku day inaad diiddo", "retryAllowOnce": "Mar kale isku day inaad oggolaato hal mar", - "retryAlwaysAllow": "Mar kale isku day inaad had iyo jeer oggolaato" + "retryAlwaysAllow": "Mar kale isku day inaad had iyo jeer oggolaato", + "unreadableTitle": "Codsi oggolaansho lama akhriyi karin", + "unreadableBody": "Wakiilka ayaa sugaya go'aan oggolaansho oo abkani ma muujin karo. Cusboonaysii abka ama CLI, ama ka jawaab codsiga CLI si aad u sii socoto." }, "questionCard": { "title": "Wakiilku wuxuu u baahan yahay jawaab", diff --git a/apps/mobile/src/i18n/locales/sq.json b/apps/mobile/src/i18n/locales/sq.json index 90d9f675d6d..657734a1c7d 100644 --- a/apps/mobile/src/i18n/locales/sq.json +++ b/apps/mobile/src/i18n/locales/sq.json @@ -2578,7 +2578,9 @@ "retrying": "Duke u provuar përsëri…", "retryDeny": "Provo ta refuzosh përsëri", "retryAllowOnce": "Provo ta lejosh një herë përsëri", - "retryAlwaysAllow": "Provo ta lejosh gjithmonë përsëri" + "retryAlwaysAllow": "Provo ta lejosh gjithmonë përsëri", + "unreadableTitle": "Kërkesa për leje nuk mund të lexohej", + "unreadableBody": "Agjenti po pret një vendim për leje që ky aplikacion nuk mund ta shfaqë. Përditëso aplikacionin ose CLI, ose përgjigju kërkesës në CLI për të vazhduar." }, "questionCard": { "title": "Agjenti kërkon përgjigjen tënde", diff --git a/apps/mobile/src/i18n/locales/sr.json b/apps/mobile/src/i18n/locales/sr.json index 40796ffaf95..0fe6bf81ac9 100644 --- a/apps/mobile/src/i18n/locales/sr.json +++ b/apps/mobile/src/i18n/locales/sr.json @@ -2614,7 +2614,9 @@ "retrying": "Ponovni pokušaj…", "retryDeny": "Pokušaj ponovo da odbiješ", "retryAllowOnce": "Pokušaj ponovo da dozvoliš jednom", - "retryAlwaysAllow": "Pokušaj ponovo da uvek dozvoliš" + "retryAlwaysAllow": "Pokušaj ponovo da uvek dozvoliš", + "unreadableTitle": "Zahtev za dozvolu nije mogao da se pročita", + "unreadableBody": "Agent čeka odluku o dozvoli koju ova aplikacija ne može da prikaže. Ažurirajte aplikaciju ili CLI, ili odgovorite na zahtev u CLI-ju da biste nastavili." }, "questionCard": { "title": "Agent čeka odgovor", diff --git a/apps/mobile/src/i18n/locales/sv.json b/apps/mobile/src/i18n/locales/sv.json index 0e05616193f..0dc42dfcdff 100644 --- a/apps/mobile/src/i18n/locales/sv.json +++ b/apps/mobile/src/i18n/locales/sv.json @@ -2578,7 +2578,9 @@ "retrying": "Försöker igen…", "retryDeny": "Försök neka igen", "retryAllowOnce": "Försök tillåta en gång igen", - "retryAlwaysAllow": "Försök tillåta alltid igen" + "retryAlwaysAllow": "Försök tillåta alltid igen", + "unreadableTitle": "Behörighetsförfrågan kunde inte läsas", + "unreadableBody": "Agenten väntar på ett beslut om behörighet som den här appen inte kan visa. Uppdatera appen eller CLI, eller svara på förfrågan i CLI för att fortsätta." }, "questionCard": { "title": "Agenten behöver inmatning", diff --git a/apps/mobile/src/i18n/locales/sw.json b/apps/mobile/src/i18n/locales/sw.json index 1c5b4c52d62..445195c276e 100644 --- a/apps/mobile/src/i18n/locales/sw.json +++ b/apps/mobile/src/i18n/locales/sw.json @@ -2578,7 +2578,9 @@ "retrying": "Inajaribu tena…", "retryDeny": "Jaribu tena kukataa", "retryAllowOnce": "Jaribu tena kuruhusu mara moja", - "retryAlwaysAllow": "Jaribu tena kuruhusu daima" + "retryAlwaysAllow": "Jaribu tena kuruhusu daima", + "unreadableTitle": "Ombi la ruhusa halikuweza kusomwa", + "unreadableBody": "Wakala anasubiri uamuzi wa ruhusa ambao programu hii haiwezi kuonyesha. Sasisha programu au CLI, au jibu ombi hilo kwenye CLI ili kuendelea." }, "questionCard": { "title": "Wakala anahitaji jibu", diff --git a/apps/mobile/src/i18n/locales/ta.json b/apps/mobile/src/i18n/locales/ta.json index 86697cbe809..5a74858a5bf 100644 --- a/apps/mobile/src/i18n/locales/ta.json +++ b/apps/mobile/src/i18n/locales/ta.json @@ -2578,7 +2578,9 @@ "retrying": "மீண்டும் முயற்சிக்கிறது…", "retryDeny": "மீண்டும் மறுக்க முயற்சிக்கவும்", "retryAllowOnce": "மீண்டும் ஒருமுறை அனுமதிக்க முயற்சிக்கவும்", - "retryAlwaysAllow": "மீண்டும் எப்போதும் அனுமதிக்க முயற்சிக்கவும்" + "retryAlwaysAllow": "மீண்டும் எப்போதும் அனுமதிக்க முயற்சிக்கவும்", + "unreadableTitle": "அனுமதிக் கோரிக்கையைப் படிக்க முடியவில்லை", + "unreadableBody": "இந்தச் செயலி காட்ட முடியாத ஒரு அனுமதி முடிவுக்காக முகவர் காத்திருக்கிறது. செயலியையோ CLI-ஐயோ புதுப்பிக்கவும், அல்லது தொடர CLI-இல் கோரிக்கைக்கு பதிலளிக்கவும்." }, "questionCard": { "title": "ஏஜென்ட்டுக்கு உங்கள் பதில் தேவை", diff --git a/apps/mobile/src/i18n/locales/te.json b/apps/mobile/src/i18n/locales/te.json index 567e3ad42c9..cf925a98726 100644 --- a/apps/mobile/src/i18n/locales/te.json +++ b/apps/mobile/src/i18n/locales/te.json @@ -2578,7 +2578,9 @@ "retrying": "మళ్లీ ప్రయత్నిస్తోంది…", "retryDeny": "నిరాకరించడానికి మళ్లీ ప్రయత్నించండి", "retryAllowOnce": "ఒకసారి అనుమతించడానికి మళ్లీ ప్రయత్నించండి", - "retryAlwaysAllow": "ఎల్లప్పుడూ అనుమతించడానికి మళ్లీ ప్రయత్నించండి" + "retryAlwaysAllow": "ఎల్లప్పుడూ అనుమతించడానికి మళ్లీ ప్రయత్నించండి", + "unreadableTitle": "అనుమతి అభ్యర్థనను చదవలేకపోయింది", + "unreadableBody": "ఏజెంట్ ఈ యాప్ చూపించలేని అనుమతి నిర్ణయం కోసం వేచి ఉంది. కొనసాగించడానికి యాప్ను లేదా CLIని నవీకరించండి, లేదా CLIలో ఆ అభ్యర్థనకు సమాధానం ఇవ్వండి." }, "questionCard": { "title": "ఏజెంట్‌కు మీ సమాధానం అవసరం", diff --git a/apps/mobile/src/i18n/locales/th.json b/apps/mobile/src/i18n/locales/th.json index 1a0b2c7ade3..d794e9d8be6 100644 --- a/apps/mobile/src/i18n/locales/th.json +++ b/apps/mobile/src/i18n/locales/th.json @@ -2578,7 +2578,9 @@ "retrying": "กำลังลองอีกครั้ง…", "retryDeny": "ลองปฏิเสธอีกครั้ง", "retryAllowOnce": "ลองอนุญาตเฉพาะครั้งนี้อีกครั้ง", - "retryAlwaysAllow": "ลองอนุญาตเสมออีกครั้ง" + "retryAlwaysAllow": "ลองอนุญาตเสมออีกครั้ง", + "unreadableTitle": "อ่านคำขออนุญาตไม่ได้", + "unreadableBody": "เอเจนต์กำลังรอการตัดสินใจเรื่องสิทธิ์ที่แอปนี้ไม่สามารถแสดงได้ โปรดอัปเดตแอปหรือ CLI หรือตอบคำขอใน CLI เพื่อดำเนินการต่อ" }, "questionCard": { "title": "เอเจนต์ต้องการข้อมูลเพิ่มเติม", diff --git a/apps/mobile/src/i18n/locales/tr.json b/apps/mobile/src/i18n/locales/tr.json index 6298a244f7a..d90972d6445 100644 --- a/apps/mobile/src/i18n/locales/tr.json +++ b/apps/mobile/src/i18n/locales/tr.json @@ -2054,7 +2054,9 @@ "retrying": "Tekrar deneniyor…", "retryDeny": "Reddetmeyi tekrar dene", "retryAllowOnce": "Bir kez izin vermeyi tekrar dene", - "retryAlwaysAllow": "Her zaman izin vermeyi tekrar dene" + "retryAlwaysAllow": "Her zaman izin vermeyi tekrar dene", + "unreadableTitle": "İzin isteği okunamadı", + "unreadableBody": "Aracı, bu uygulamanın gösteremediği bir izin kararını bekliyor. Devam etmek için uygulamayı veya CLI'yi güncelle ya da isteği CLI'de yanıtla." }, "questionCard": { "title": "Ajan yanıt bekliyor", diff --git a/apps/mobile/src/i18n/locales/uk.json b/apps/mobile/src/i18n/locales/uk.json index c70bebb29c6..7fdcc463d58 100644 --- a/apps/mobile/src/i18n/locales/uk.json +++ b/apps/mobile/src/i18n/locales/uk.json @@ -2088,7 +2088,9 @@ "retrying": "Повторна спроба…", "retryDeny": "Спробувати не дозволяти ще раз", "retryAllowOnce": "Спробувати дозволити один раз ще раз", - "retryAlwaysAllow": "Спробувати завжди дозволяти ще раз" + "retryAlwaysAllow": "Спробувати завжди дозволяти ще раз", + "unreadableTitle": "Не вдалося прочитати запит на дозвіл", + "unreadableBody": "Агент очікує рішення щодо дозволу, який цей застосунок не може показати. Оновіть застосунок або CLI, чи дайте відповідь на запит у CLI, щоб продовжити." }, "questionCard": { "title": "Агенту потрібна відповідь", diff --git a/apps/mobile/src/i18n/locales/ur.json b/apps/mobile/src/i18n/locales/ur.json index 786341c158e..655ed933e6d 100644 --- a/apps/mobile/src/i18n/locales/ur.json +++ b/apps/mobile/src/i18n/locales/ur.json @@ -2578,7 +2578,9 @@ "retrying": "دوبارہ کوشش ہو رہی ہے…", "retryDeny": "اجازت نہ دینے کی دوبارہ کوشش کریں", "retryAllowOnce": "ایک بار اجازت دینے کی دوبارہ کوشش کریں", - "retryAlwaysAllow": "ہمیشہ اجازت دینے کی دوبارہ کوشش کریں" + "retryAlwaysAllow": "ہمیشہ اجازت دینے کی دوبارہ کوشش کریں", + "unreadableTitle": "اجازت کی درخواست پڑھی نہیں جا سکی", + "unreadableBody": "ایجنٹ اجازت کے فیصلے کا انتظار کر رہا ہے جو یہ ایپ دکھا نہیں سکتی۔ ایپ یا CLI کو اپ ڈیٹ کریں، یا جاری رکھنے کے لیے CLI میں درخواست کا جواب دیں۔" }, "questionCard": { "title": "ایجنٹ کو جواب درکار ہے", diff --git a/apps/mobile/src/i18n/locales/uz.json b/apps/mobile/src/i18n/locales/uz.json index 1825ad552c9..25506e750d8 100644 --- a/apps/mobile/src/i18n/locales/uz.json +++ b/apps/mobile/src/i18n/locales/uz.json @@ -2578,7 +2578,9 @@ "retrying": "Qayta urinilmoqda…", "retryDeny": "Qayta rad etish", "retryAllowOnce": "Qayta bir marta ruxsat berish", - "retryAlwaysAllow": "Qayta doim ruxsat berish" + "retryAlwaysAllow": "Qayta doim ruxsat berish", + "unreadableTitle": "Ruxsat so'rovini o'qib bo'lmadi", + "unreadableBody": "Agent ruxsat qarorini kutmoqda, lekin bu ilova bu so'rovni ko'rsata olmaydi. Davom etish uchun ilovani yoki CLI'ni yangilang yoki so'rovga CLI'da javob bering." }, "questionCard": { "title": "Agentga javob kerak", diff --git a/apps/mobile/src/i18n/locales/vi.json b/apps/mobile/src/i18n/locales/vi.json index 2dda5e179c1..b8c67e89431 100644 --- a/apps/mobile/src/i18n/locales/vi.json +++ b/apps/mobile/src/i18n/locales/vi.json @@ -2054,7 +2054,9 @@ "retrying": "Đang thử lại…", "retryDeny": "Thử lại thao tác từ chối", "retryAllowOnce": "Thử lại thao tác cho phép một lần", - "retryAlwaysAllow": "Thử lại thao tác luôn cho phép" + "retryAlwaysAllow": "Thử lại thao tác luôn cho phép", + "unreadableTitle": "Không đọc được yêu cầu cấp quyền", + "unreadableBody": "Tác nhân đang chờ một quyết định cấp quyền mà ứng dụng này không thể hiển thị. Hãy cập nhật ứng dụng hoặc CLI, hoặc trả lời yêu cầu trong CLI để tiếp tục." }, "questionCard": { "title": "Tác nhân cần bạn trả lời", diff --git a/apps/mobile/src/i18n/locales/yo.json b/apps/mobile/src/i18n/locales/yo.json index 5e8600f5acf..4909a340923 100644 --- a/apps/mobile/src/i18n/locales/yo.json +++ b/apps/mobile/src/i18n/locales/yo.json @@ -2578,7 +2578,9 @@ "retrying": "Ń gbìyànjú lẹ́ẹ̀kan sí i…", "retryDeny": "Gbìyànjú láti kọ̀ lẹ́ẹ̀kan sí i", "retryAllowOnce": "Gbìyànjú láti gba láyè lẹ́ẹ̀kan sí i", - "retryAlwaysAllow": "Gbìyànjú láti gba láyè ní gbogbo ìgbà lẹ́ẹ̀kan sí i" + "retryAlwaysAllow": "Gbìyànjú láti gba láyè ní gbogbo ìgbà lẹ́ẹ̀kan sí i", + "unreadableTitle": "A kò lè ka ìbéèrè ìyọ̀ǹda", + "unreadableBody": "Aṣojú náà ń dúró de ìpinnu ìyọ̀ǹda tí ápù yìí kò lè fi hàn. Ṣe àtúnṣe ápù náà tàbí CLI, tàbí dáhùn ìbéèrè náà nínú CLI kí o lè tẹ̀síwájú." }, "questionCard": { "title": "Aṣojú nílò ìdáhùn", diff --git a/apps/mobile/src/i18n/locales/zh-Hans.json b/apps/mobile/src/i18n/locales/zh-Hans.json index 32e8d0a4206..75731ca48a7 100644 --- a/apps/mobile/src/i18n/locales/zh-Hans.json +++ b/apps/mobile/src/i18n/locales/zh-Hans.json @@ -2054,7 +2054,9 @@ "retrying": "正在重试……", "retryDeny": "再次尝试拒绝", "retryAllowOnce": "再次尝试仅允许一次", - "retryAlwaysAllow": "再次尝试始终允许" + "retryAlwaysAllow": "再次尝试始终允许", + "unreadableTitle": "无法读取授权请求", + "unreadableBody": "Agent 正在等待一项此应用无法显示的授权决定。请更新应用或 CLI,或在 CLI 中回应此请求以继续。" }, "questionCard": { "title": "智能体需要你的输入", diff --git a/apps/mobile/src/i18n/locales/zh-Hant.json b/apps/mobile/src/i18n/locales/zh-Hant.json index 48b1ec6b85f..6fb67c1576d 100644 --- a/apps/mobile/src/i18n/locales/zh-Hant.json +++ b/apps/mobile/src/i18n/locales/zh-Hant.json @@ -2054,7 +2054,9 @@ "retrying": "重試中…", "retryDeny": "再次嘗試拒絕", "retryAllowOnce": "再次嘗試僅允許這次", - "retryAlwaysAllow": "再次嘗試一律允許" + "retryAlwaysAllow": "再次嘗試一律允許", + "unreadableTitle": "無法讀取權限要求", + "unreadableBody": "代理程式正在等待一項權限決策,但此應用程式無法顯示該要求。請更新應用程式或 CLI,或在 CLI 中回覆該要求以繼續。" }, "questionCard": { "title": "智慧代理需要你的回覆", diff --git a/apps/mobile/src/i18n/locales/zu.json b/apps/mobile/src/i18n/locales/zu.json index a782a7978bb..18911e43331 100644 --- a/apps/mobile/src/i18n/locales/zu.json +++ b/apps/mobile/src/i18n/locales/zu.json @@ -2578,7 +2578,9 @@ "retrying": "Kuzanywa futhi…", "retryDeny": "Zama ukwenqaba futhi", "retryAllowOnce": "Zama ukuvumela kanye futhi", - "retryAlwaysAllow": "Zama ukuvumela njalo futhi" + "retryAlwaysAllow": "Zama ukuvumela njalo futhi", + "unreadableTitle": "Isicelo semvume asikwazile ukufundwa", + "unreadableBody": "I-agent ilinde isinqumo semvume esingakwazi ukusibonisa kule app. Buyekeza i-app noma i-CLI, noma uphendule isicelo ku-CLI ukuze uqhubeke." }, "questionCard": { "title": "Umenzeli udinga impendulo", diff --git a/apps/web/src/components/cloud-agent-next/CloudChatPage.tsx b/apps/web/src/components/cloud-agent-next/CloudChatPage.tsx index 279c7750789..4ae57b7020d 100644 --- a/apps/web/src/components/cloud-agent-next/CloudChatPage.tsx +++ b/apps/web/src/components/cloud-agent-next/CloudChatPage.tsx @@ -66,6 +66,7 @@ import { PreparationDrawer } from './PreparationDrawer'; import { QuestionToolCard } from './QuestionToolCard'; import { QuestionContextProvider } from './QuestionContext'; import { PermissionCard, PermissionContextProvider } from './PermissionCard'; +import { PermissionUnreadableNotice } from './PermissionUnreadableNotice'; import { SuggestionContextProvider } from './SuggestionCard'; import { SessionContinuationPanel } from './SessionContinuationPanel'; import { CloudAgentTerminalPane } from './CloudAgentTerminalDock'; @@ -292,6 +293,7 @@ export default function CloudChatPage({ const commits = useAtomValue(manager.atoms.commits); const activeQuestion = useAtomValue(manager.atoms.activeQuestion); const activePermission = useAtomValue(manager.atoms.activePermission); + const unreadablePermissions = useAtomValue(manager.atoms.unreadablePermissions); const activeSuggestion = useAtomValue(manager.atoms.activeSuggestion); const failedPrompt = useAtomValue(manager.atoms.failedPrompt); const staticMessages = useAtomValue(manager.atoms.staticMessages); @@ -2025,6 +2027,11 @@ export default function CloudChatPage({ ) : null ) : ( <> + {unreadablePermissions.length > 0 && transcriptPhase !== 'opening' && ( +
+ +
+ )} {activeQuestion && transcriptPhase !== 'opening' && (
{ + it('announces a waiting permission request the app cannot show', () => { + const html = renderToStaticMarkup(createElement(PermissionUnreadableNotice)); + + expect(html).toContain('role="alert"'); + expect(html).toContain('Permission request could not be read'); + expect(html).toContain('The agent is waiting for a permission decision this app cannot show.'); + expect(html).toContain('answer the request in the CLI'); + }); + + it('offers no consent action for a request whose scope was not read', () => { + const html = renderToStaticMarkup(createElement(PermissionUnreadableNotice)); + + expect(html).not.toContain(' +