@open-mercato/ai-assistant 0.6.7 → 0.6.8-develop.6874.1.982d6097d8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/AGENTS.md +12 -29
- package/dist/modules/ai_assistant/__integration__/TC-AI-MODERATION-008-settings-and-audit.spec.js +80 -0
- package/dist/modules/ai_assistant/__integration__/TC-AI-MODERATION-008-settings-and-audit.spec.js.map +7 -0
- package/dist/modules/ai_assistant/__integration__/TC-AI-MODERATION-009-ui.spec.js +124 -0
- package/dist/modules/ai_assistant/__integration__/TC-AI-MODERATION-009-ui.spec.js.map +7 -0
- package/dist/modules/ai_assistant/__integration__/helpers/aiAssistantFixtures.js +30 -0
- package/dist/modules/ai_assistant/__integration__/helpers/aiAssistantFixtures.js.map +2 -2
- package/dist/modules/ai_assistant/api/ai/chat/route.js +7 -0
- package/dist/modules/ai_assistant/api/ai/chat/route.js.map +2 -2
- package/dist/modules/ai_assistant/api/moderation-flags/route.js +121 -0
- package/dist/modules/ai_assistant/api/moderation-flags/route.js.map +7 -0
- package/dist/modules/ai_assistant/api/settings/allowlist/route.js +10 -10
- package/dist/modules/ai_assistant/api/settings/allowlist/route.js.map +2 -2
- package/dist/modules/ai_assistant/api/settings/route.js +34 -13
- package/dist/modules/ai_assistant/api/settings/route.js.map +2 -2
- package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.js +121 -15
- package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.js.map +2 -2
- package/dist/modules/ai_assistant/backend/config/ai-assistant/allowlist/AiTenantAllowlistPageClient.js +2 -2
- package/dist/modules/ai_assistant/backend/config/ai-assistant/allowlist/AiTenantAllowlistPageClient.js.map +2 -2
- package/dist/modules/ai_assistant/backend/config/ai-assistant/moderation-flags/AiModerationFlagsPageClient.js +139 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/moderation-flags/AiModerationFlagsPageClient.js.map +7 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/moderation-flags/page.js +10 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/moderation-flags/page.js.map +7 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/moderation-flags/page.meta.js +26 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/moderation-flags/page.meta.js.map +7 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/AiPlaygroundPageClient.js +4 -4
- package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/AiPlaygroundPageClient.js.map +2 -2
- package/dist/modules/ai_assistant/data/entities.js +42 -0
- package/dist/modules/ai_assistant/data/entities.js.map +2 -2
- package/dist/modules/ai_assistant/data/repositories/AiAgentRuntimeOverrideRepository.js +3 -1
- package/dist/modules/ai_assistant/data/repositories/AiAgentRuntimeOverrideRepository.js.map +2 -2
- package/dist/modules/ai_assistant/data/repositories/AiModerationFlagRepository.js +44 -0
- package/dist/modules/ai_assistant/data/repositories/AiModerationFlagRepository.js.map +7 -0
- package/dist/modules/ai_assistant/di.js +6 -2
- package/dist/modules/ai_assistant/di.js.map +2 -2
- package/dist/modules/ai_assistant/events.js +6 -0
- package/dist/modules/ai_assistant/events.js.map +2 -2
- package/dist/modules/ai_assistant/i18n/de.json +42 -0
- package/dist/modules/ai_assistant/i18n/en.json +42 -0
- package/dist/modules/ai_assistant/i18n/es.json +42 -0
- package/dist/modules/ai_assistant/i18n/ko.json +527 -0
- package/dist/modules/ai_assistant/i18n/pl.json +42 -0
- package/dist/modules/ai_assistant/lib/agent-runtime.js +158 -5
- package/dist/modules/ai_assistant/lib/agent-runtime.js.map +2 -2
- package/dist/modules/ai_assistant/lib/ai-agent-definition.js.map +2 -2
- package/dist/modules/ai_assistant/lib/auth.js +6 -7
- package/dist/modules/ai_assistant/lib/auth.js.map +2 -2
- package/dist/modules/ai_assistant/lib/entity-graph.js +3 -3
- package/dist/modules/ai_assistant/lib/entity-graph.js.map +2 -2
- package/dist/modules/ai_assistant/lib/llm-adapters/anthropic.js +3 -0
- package/dist/modules/ai_assistant/lib/llm-adapters/anthropic.js.map +2 -2
- package/dist/modules/ai_assistant/lib/llm-adapters/openai.js +8 -1
- package/dist/modules/ai_assistant/lib/llm-adapters/openai.js.map +2 -2
- package/dist/modules/ai_assistant/lib/model-factory.js +6 -1
- package/dist/modules/ai_assistant/lib/model-factory.js.map +2 -2
- package/dist/modules/ai_assistant/lib/moderation-flag-recorder.js +43 -0
- package/dist/modules/ai_assistant/lib/moderation-flag-recorder.js.map +7 -0
- package/dist/modules/ai_assistant/lib/moderation-policy.js +24 -0
- package/dist/modules/ai_assistant/lib/moderation-policy.js.map +7 -0
- package/dist/modules/ai_assistant/lib/moderation.js +109 -0
- package/dist/modules/ai_assistant/lib/moderation.js.map +7 -0
- package/dist/modules/ai_assistant/lib/openai-compatible-presets.js +2 -0
- package/dist/modules/ai_assistant/lib/openai-compatible-presets.js.map +2 -2
- package/dist/modules/ai_assistant/lib/tool-search.js +4 -12
- package/dist/modules/ai_assistant/lib/tool-search.js.map +2 -2
- package/dist/modules/ai_assistant/migrations/Migration20260610134045_ai_assistant.js +19 -0
- package/dist/modules/ai_assistant/migrations/Migration20260610134045_ai_assistant.js.map +7 -0
- package/generated/entities/ai_agent_runtime_override/index.ts +1 -0
- package/generated/entities/ai_moderation_flag/index.ts +9 -0
- package/generated/entities.ids.generated.ts +2 -1
- package/generated/entity-fields-registry.ts +13 -1
- package/package.json +13 -12
- package/src/modules/ai_assistant/__integration__/TC-AI-MODERATION-008-settings-and-audit.spec.ts +126 -0
- package/src/modules/ai_assistant/__integration__/TC-AI-MODERATION-009-ui.spec.ts +161 -0
- package/src/modules/ai_assistant/__integration__/helpers/aiAssistantFixtures.ts +48 -0
- package/src/modules/ai_assistant/api/ai/chat/route.ts +10 -0
- package/src/modules/ai_assistant/api/moderation-flags/__tests__/route.test.ts +122 -0
- package/src/modules/ai_assistant/api/moderation-flags/route.ts +137 -0
- package/src/modules/ai_assistant/api/settings/__tests__/route.test.ts +58 -8
- package/src/modules/ai_assistant/api/settings/allowlist/route.ts +10 -12
- package/src/modules/ai_assistant/api/settings/route.ts +33 -10
- package/src/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.tsx +161 -15
- package/src/modules/ai_assistant/backend/config/ai-assistant/allowlist/AiTenantAllowlistPageClient.tsx +2 -2
- package/src/modules/ai_assistant/backend/config/ai-assistant/moderation-flags/AiModerationFlagsPageClient.tsx +186 -0
- package/src/modules/ai_assistant/backend/config/ai-assistant/moderation-flags/page.meta.ts +24 -0
- package/src/modules/ai_assistant/backend/config/ai-assistant/moderation-flags/page.tsx +12 -0
- package/src/modules/ai_assistant/backend/config/ai-assistant/playground/AiPlaygroundPageClient.tsx +4 -4
- package/src/modules/ai_assistant/data/entities.ts +56 -0
- package/src/modules/ai_assistant/data/repositories/AiAgentRuntimeOverrideRepository.ts +4 -0
- package/src/modules/ai_assistant/data/repositories/AiModerationFlagRepository.ts +79 -0
- package/src/modules/ai_assistant/di.ts +5 -1
- package/src/modules/ai_assistant/events.ts +21 -0
- package/src/modules/ai_assistant/i18n/de.json +42 -0
- package/src/modules/ai_assistant/i18n/en.json +42 -0
- package/src/modules/ai_assistant/i18n/es.json +42 -0
- package/src/modules/ai_assistant/i18n/ko.json +527 -0
- package/src/modules/ai_assistant/i18n/pl.json +42 -0
- package/src/modules/ai_assistant/lib/__tests__/auth.test.ts +2 -5
- package/src/modules/ai_assistant/lib/__tests__/input-moderation-gate.test.ts +121 -0
- package/src/modules/ai_assistant/lib/__tests__/llm-adapters-anthropic.test.ts +13 -0
- package/src/modules/ai_assistant/lib/__tests__/llm-adapters-openai.test.ts +41 -0
- package/src/modules/ai_assistant/lib/__tests__/model-factory.test.ts +60 -0
- package/src/modules/ai_assistant/lib/__tests__/moderation-flag-recorder.test.ts +76 -0
- package/src/modules/ai_assistant/lib/__tests__/moderation-policy.test.ts +86 -0
- package/src/modules/ai_assistant/lib/__tests__/moderation.test.ts +114 -0
- package/src/modules/ai_assistant/lib/agent-runtime.ts +259 -0
- package/src/modules/ai_assistant/lib/ai-agent-definition.ts +10 -0
- package/src/modules/ai_assistant/lib/auth.ts +6 -15
- package/src/modules/ai_assistant/lib/entity-graph.ts +3 -3
- package/src/modules/ai_assistant/lib/llm-adapters/anthropic.ts +10 -0
- package/src/modules/ai_assistant/lib/llm-adapters/openai.ts +32 -1
- package/src/modules/ai_assistant/lib/model-factory.ts +33 -0
- package/src/modules/ai_assistant/lib/moderation-flag-recorder.ts +75 -0
- package/src/modules/ai_assistant/lib/moderation-policy.ts +77 -0
- package/src/modules/ai_assistant/lib/moderation.ts +179 -0
- package/src/modules/ai_assistant/lib/openai-compatible-presets.ts +2 -0
- package/src/modules/ai_assistant/lib/tool-search.ts +4 -17
- package/src/modules/ai_assistant/migrations/.snapshot-open-mercato.json +388 -16
- package/src/modules/ai_assistant/migrations/Migration20260610134045_ai_assistant.ts +21 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
2
|
+
import { AiModerationFlag } from '../entities'
|
|
3
|
+
import type { ModerationCategoryResult } from '../../lib/moderation'
|
|
4
|
+
|
|
5
|
+
export interface CreateModerationFlagInput {
|
|
6
|
+
tenantId: string
|
|
7
|
+
organizationId?: string | null
|
|
8
|
+
agentId: string
|
|
9
|
+
userId: string
|
|
10
|
+
providerId: string
|
|
11
|
+
modelId: string
|
|
12
|
+
categories: Record<string, ModerationCategoryResult>
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface ListModerationFlagsFilter {
|
|
16
|
+
tenantId: string
|
|
17
|
+
organizationId?: string | null
|
|
18
|
+
agentId?: string
|
|
19
|
+
userId?: string
|
|
20
|
+
/** Inclusive lower bound on `created_at`. */
|
|
21
|
+
from?: Date
|
|
22
|
+
/** Inclusive upper bound on `created_at`. */
|
|
23
|
+
to?: Date
|
|
24
|
+
page: number
|
|
25
|
+
pageSize: number
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ModerationFlagListResult {
|
|
29
|
+
items: AiModerationFlag[]
|
|
30
|
+
total: number
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Repository for the append-only `ai_moderation_flags` audit table. Every read
|
|
35
|
+
* is tenant-scoped — cross-tenant access is structurally impossible because
|
|
36
|
+
* `tenantId` is always part of the filter.
|
|
37
|
+
*
|
|
38
|
+
* Spec `2026-06-04-ai-input-moderation-and-safety-identifiers`.
|
|
39
|
+
*/
|
|
40
|
+
export class AiModerationFlagRepository {
|
|
41
|
+
constructor(private readonly em: EntityManager) {}
|
|
42
|
+
|
|
43
|
+
async create(input: CreateModerationFlagInput): Promise<AiModerationFlag> {
|
|
44
|
+
const flag = this.em.create(AiModerationFlag, {
|
|
45
|
+
tenantId: input.tenantId,
|
|
46
|
+
organizationId: input.organizationId ?? null,
|
|
47
|
+
agentId: input.agentId,
|
|
48
|
+
userId: input.userId,
|
|
49
|
+
providerId: input.providerId,
|
|
50
|
+
modelId: input.modelId,
|
|
51
|
+
categories: input.categories,
|
|
52
|
+
})
|
|
53
|
+
this.em.persist(flag)
|
|
54
|
+
await this.em.flush()
|
|
55
|
+
return flag
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async list(filter: ListModerationFlagsFilter): Promise<ModerationFlagListResult> {
|
|
59
|
+
const where: Record<string, unknown> = { tenantId: filter.tenantId }
|
|
60
|
+
if (filter.organizationId !== undefined && filter.organizationId !== null) {
|
|
61
|
+
where.organizationId = filter.organizationId
|
|
62
|
+
}
|
|
63
|
+
if (filter.agentId) where.agentId = filter.agentId
|
|
64
|
+
if (filter.userId) where.userId = filter.userId
|
|
65
|
+
if (filter.from || filter.to) {
|
|
66
|
+
const createdAt: Record<string, Date> = {}
|
|
67
|
+
if (filter.from) createdAt.$gte = filter.from
|
|
68
|
+
if (filter.to) createdAt.$lte = filter.to
|
|
69
|
+
where.createdAt = createdAt
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const [items, total] = await this.em.findAndCount(AiModerationFlag, where, {
|
|
73
|
+
orderBy: { createdAt: 'desc' },
|
|
74
|
+
limit: filter.pageSize,
|
|
75
|
+
offset: (filter.page - 1) * filter.pageSize,
|
|
76
|
+
})
|
|
77
|
+
return { items, total }
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import { asValue } from 'awilix'
|
|
1
|
+
import { asFunction, asValue } from 'awilix'
|
|
2
2
|
import type { AwilixContainer } from 'awilix'
|
|
3
3
|
import { toolRegistry } from './lib/tool-registry'
|
|
4
|
+
import { createModerationService } from './lib/moderation'
|
|
4
5
|
|
|
5
6
|
export function register(container: AwilixContainer): void {
|
|
6
7
|
container.register({
|
|
7
8
|
mcpToolRegistry: asValue(toolRegistry),
|
|
9
|
+
// Input pre-moderation service (OpenAI /v1/moderations). Singleton +
|
|
10
|
+
// overridable by downstream apps via the module overrides DI seam.
|
|
11
|
+
moderationService: asFunction(() => createModerationService()).singleton(),
|
|
8
12
|
})
|
|
9
13
|
}
|
|
@@ -61,6 +61,12 @@ const events = [
|
|
|
61
61
|
category: 'lifecycle' as const,
|
|
62
62
|
clientBroadcast: true,
|
|
63
63
|
},
|
|
64
|
+
{
|
|
65
|
+
id: 'ai_assistant.moderation_flag.created',
|
|
66
|
+
label: 'AI Moderation Flag Created',
|
|
67
|
+
entity: 'ai_moderation_flag',
|
|
68
|
+
category: 'system' as const,
|
|
69
|
+
},
|
|
64
70
|
] as const
|
|
65
71
|
|
|
66
72
|
export const eventsConfig = createModuleEvents({
|
|
@@ -148,4 +154,19 @@ export interface AiConversationUnsharedPayload {
|
|
|
148
154
|
participantUserId: string
|
|
149
155
|
}
|
|
150
156
|
|
|
157
|
+
/**
|
|
158
|
+
* Emitted (best-effort) when the input moderation gate blocks a turn and the
|
|
159
|
+
* audit row is persisted. Carries category flags only — never prompt content.
|
|
160
|
+
*
|
|
161
|
+
* Spec `2026-06-04-ai-input-moderation-and-safety-identifiers`.
|
|
162
|
+
*/
|
|
163
|
+
export interface AiModerationFlagCreatedPayload {
|
|
164
|
+
id: string
|
|
165
|
+
tenantId: string
|
|
166
|
+
organizationId: string | null
|
|
167
|
+
agentId: string
|
|
168
|
+
userId: string
|
|
169
|
+
categories: string[]
|
|
170
|
+
}
|
|
171
|
+
|
|
151
172
|
export default eventsConfig
|
|
@@ -36,21 +36,44 @@
|
|
|
36
36
|
"ai_assistant.agents.meta.readOnlyYes": "Ja",
|
|
37
37
|
"ai_assistant.agents.meta.unlimited": "Unbegrenzt",
|
|
38
38
|
"ai_assistant.agents.model_override.allowlistCustom": "benutzerdefiniert",
|
|
39
|
+
"ai_assistant.agents.model_override.allowlistEmpty": "Keine konfigurierten Anbieter für Chat-Überschreibungen verfügbar.",
|
|
40
|
+
"ai_assistant.agents.model_override.allowlistHelp": "Lege fest, welche Anbieter- und Modell-Überschreibungen Nutzer in der Chat-Fußzeile für diesen Agenten wählen können.",
|
|
39
41
|
"ai_assistant.agents.model_override.allowlistInherited": "geerbt",
|
|
40
42
|
"ai_assistant.agents.model_override.allowlistReset": "Erben",
|
|
41
43
|
"ai_assistant.agents.model_override.allowlistSave": "Auswahl speichern",
|
|
44
|
+
"ai_assistant.agents.model_override.allowlistSaved": "Auswahlmöglichkeiten für Chat-Überschreibungen gespeichert.",
|
|
45
|
+
"ai_assistant.agents.model_override.allowlistTitle": "Auswahlmöglichkeiten für Chat-Überschreibungen",
|
|
42
46
|
"ai_assistant.agents.model_override.anyProvider": "erste konfigurierte",
|
|
43
47
|
"ai_assistant.agents.model_override.clear": "Überschreibung löschen",
|
|
48
|
+
"ai_assistant.agents.model_override.cleared": "Modell-Überschreibung entfernt; der Agent nutzt wieder die normale Auflösungskette.",
|
|
44
49
|
"ai_assistant.agents.model_override.codeDefault": "Im Code deklarierter Standard",
|
|
45
50
|
"ai_assistant.agents.model_override.defaultBadge": "Standard",
|
|
51
|
+
"ai_assistant.agents.model_override.envAlsoNarrows": "schränkt diese Liste zusätzlich über die Umgebungsvariablen ein.",
|
|
52
|
+
"ai_assistant.agents.model_override.loadErrorTitle": "Anbieterkatalog konnte nicht geladen werden",
|
|
53
|
+
"ai_assistant.agents.model_override.loading": "Anbieterkatalog wird geladen...",
|
|
46
54
|
"ai_assistant.agents.model_override.model": "Modell",
|
|
47
55
|
"ai_assistant.agents.model_override.noOverride": "Keine agentenspezifische Überschreibung",
|
|
48
56
|
"ai_assistant.agents.model_override.provider": "Anbieter",
|
|
49
57
|
"ai_assistant.agents.model_override.providerDefault": "Anbieter-Standard",
|
|
50
58
|
"ai_assistant.agents.model_override.save": "Überschreibung speichern",
|
|
51
59
|
"ai_assistant.agents.model_override.saved": "Modell-Überschreibung gespeichert.",
|
|
60
|
+
"ai_assistant.agents.model_override.selectModel": "Modell auswählen",
|
|
61
|
+
"ai_assistant.agents.model_override.selectProvider": "Anbieter auswählen",
|
|
62
|
+
"ai_assistant.agents.model_override.subtitle": "Überschreibe Standardanbieter und -modell für diesen Mandanten und Agenten.",
|
|
52
63
|
"ai_assistant.agents.model_override.tenantOverride": "Mandanten-Überschreibung",
|
|
53
64
|
"ai_assistant.agents.model_override.title": "Anbieter und Modell",
|
|
65
|
+
"ai_assistant.agents.moderation.controlLabel": "Moderation",
|
|
66
|
+
"ai_assistant.agents.moderation.effectiveEnforced": "Erzwungen",
|
|
67
|
+
"ai_assistant.agents.moderation.effectiveOff": "Aus",
|
|
68
|
+
"ai_assistant.agents.moderation.effectiveOn": "Ein",
|
|
69
|
+
"ai_assistant.agents.moderation.enforcedBadge": "Erzwungen",
|
|
70
|
+
"ai_assistant.agents.moderation.enforcedHint": "Dieser Agent akzeptiert nicht vertrauenswürdige Eingaben, daher ist die Moderation immer aktiv und kann hier nicht deaktiviert werden.",
|
|
71
|
+
"ai_assistant.agents.moderation.inheritLabel": "Erben",
|
|
72
|
+
"ai_assistant.agents.moderation.offLabel": "Aus",
|
|
73
|
+
"ai_assistant.agents.moderation.onLabel": "Ein",
|
|
74
|
+
"ai_assistant.agents.moderation.saved": "Eingabe-Moderationseinstellung gespeichert.",
|
|
75
|
+
"ai_assistant.agents.moderation.subtitle": "Benutzereingaben vor dem Modelllauf auf unsichere Inhalte prüfen. Gilt nur, wenn der aufgelöste Anbieter Moderation unterstützt.",
|
|
76
|
+
"ai_assistant.agents.moderation.title": "Eingabe-Moderation",
|
|
54
77
|
"ai_assistant.agents.mutation_policy.clear": "Überschreibung löschen",
|
|
55
78
|
"ai_assistant.agents.mutation_policy.clearedMessage": "Überschreibung der Mutationsrichtlinie gelöscht; Agent verwendet die im Code deklarierte Richtlinie.",
|
|
56
79
|
"ai_assistant.agents.mutation_policy.codeDeclared": "Im Code deklariert",
|
|
@@ -275,7 +298,9 @@
|
|
|
275
298
|
"ai_assistant.chat.toolRunning": "running…",
|
|
276
299
|
"ai_assistant.chat.transcriptLabel": "Chat-Transkript",
|
|
277
300
|
"ai_assistant.chat.uiPartPending": "Ausstehendes UI-Element:",
|
|
301
|
+
"ai_assistant.chat.uploadingHint": "Anhänge werden hochgeladen… Senden ist deaktiviert, bis der Vorgang abgeschlossen ist.",
|
|
278
302
|
"ai_assistant.chat.userRoleLabel": "Sie",
|
|
303
|
+
"ai_assistant.chat.welcomeDescription": "Frag mich alles zu deinen Daten. Das kann ich zum Beispiel tun:",
|
|
279
304
|
"ai_assistant.chat.welcomeTitle": "How can I help?",
|
|
280
305
|
"ai_assistant.chat.zoomImage": "Vorschau von {name} öffnen",
|
|
281
306
|
"ai_assistant.dock.bottom": "Unten andocken",
|
|
@@ -284,13 +309,17 @@
|
|
|
284
309
|
"ai_assistant.dock.left": "Links andocken",
|
|
285
310
|
"ai_assistant.dock.minimize": "Minimieren",
|
|
286
311
|
"ai_assistant.dock.right": "Rechts andocken",
|
|
312
|
+
"ai_assistant.errors.moderationBlocked": "Ihre Nachricht wurde vom Inhaltssicherheitsfilter blockiert. Bitte formulieren Sie sie um und versuchen Sie es erneut.",
|
|
313
|
+
"ai_assistant.errors.moderationUnavailable": "Die Inhaltssicherheitsprüfung ist vorübergehend nicht verfügbar. Bitte versuchen Sie es in einem Moment erneut.",
|
|
287
314
|
"ai_assistant.launcher.composerPlaceholder": "Fragen Sie mich etwas…",
|
|
315
|
+
"ai_assistant.launcher.dialogDescription": "Wähle einen Assistenten. Mit ↑/↓ navigieren, Enter startet, Esc schließt.",
|
|
288
316
|
"ai_assistant.launcher.dialogTitle": "AI assistants",
|
|
289
317
|
"ai_assistant.launcher.dock.subtitle": "AI assistant",
|
|
290
318
|
"ai_assistant.launcher.empty": "No assistants match your search.",
|
|
291
319
|
"ai_assistant.launcher.hint.close": "Close",
|
|
292
320
|
"ai_assistant.launcher.hint.launch": "Launch",
|
|
293
321
|
"ai_assistant.launcher.hint.navigate": "Navigate",
|
|
322
|
+
"ai_assistant.launcher.none": "Für dein Konto sind keine Assistenten verfügbar.",
|
|
294
323
|
"ai_assistant.launcher.searchPlaceholder": "Search assistants...",
|
|
295
324
|
"ai_assistant.launcher.setup.body": "KI-Assistenten sind installiert, aber es ist kein Anbieterschlüssel konfiguriert. Lege OM_AI_PROVIDER und einen passenden API-Schlüssel in deiner .env-Datei fest und starte die App neu.",
|
|
296
325
|
"ai_assistant.launcher.setup.docs": "Dokumentation zum KI-Assistenten",
|
|
@@ -299,6 +328,7 @@
|
|
|
299
328
|
"ai_assistant.launcher.sheet.dock": "Dock to side",
|
|
300
329
|
"ai_assistant.launcher.triggerAriaLabel": "Open AI assistant",
|
|
301
330
|
"ai_assistant.launcher.triggerLabel": "AI",
|
|
331
|
+
"ai_assistant.launcher.welcome.fallback": "Wie kann ich helfen?",
|
|
302
332
|
"ai_assistant.launcher.welcome.suggestion1": "What can you help me with?",
|
|
303
333
|
"ai_assistant.launcher.welcome.suggestion2": "Show what data you can access",
|
|
304
334
|
"ai_assistant.launcher.welcome.suggestion3": "Suggest things to try",
|
|
@@ -326,6 +356,18 @@
|
|
|
326
356
|
"ai_assistant.modelPicker.triggerAriaLabel": "KI-Modell auswählen",
|
|
327
357
|
"ai_assistant.modelPicker.useDefault": "Standard des Agenten verwenden",
|
|
328
358
|
"ai_assistant.modelPicker.useDefaultWithModel": "Standard des Agenten verwenden: {{model}}",
|
|
359
|
+
"ai_assistant.moderationFlags.columns.agent": "Agent",
|
|
360
|
+
"ai_assistant.moderationFlags.columns.categories": "Kategorien",
|
|
361
|
+
"ai_assistant.moderationFlags.columns.createdAt": "Markiert am",
|
|
362
|
+
"ai_assistant.moderationFlags.columns.user": "Benutzer",
|
|
363
|
+
"ai_assistant.moderationFlags.empty": "Keine markierten Nachrichten.",
|
|
364
|
+
"ai_assistant.moderationFlags.filters.agentPlaceholder": "modul.agent",
|
|
365
|
+
"ai_assistant.moderationFlags.filters.apply": "Anwenden",
|
|
366
|
+
"ai_assistant.moderationFlags.filters.from": "Von",
|
|
367
|
+
"ai_assistant.moderationFlags.filters.to": "Bis",
|
|
368
|
+
"ai_assistant.moderationFlags.navTitle": "Moderations-Flags",
|
|
369
|
+
"ai_assistant.moderationFlags.subtitle": "Vom Inhaltssicherheitsfilter blockierte Eingaben. Nur Kategorie-Flags und Scores — es wird kein Prompt-Inhalt gespeichert.",
|
|
370
|
+
"ai_assistant.moderationFlags.title": "Moderations-Flags",
|
|
329
371
|
"ai_assistant.notifications.conversation_shared.body": "Eine KI-Konversation wurde mit Ihnen geteilt.",
|
|
330
372
|
"ai_assistant.notifications.conversation_shared.title": "Konversation mit Ihnen geteilt",
|
|
331
373
|
"ai_assistant.notifications.conversation_shared.view_button": "Konversation öffnen",
|
|
@@ -36,21 +36,44 @@
|
|
|
36
36
|
"ai_assistant.agents.meta.readOnlyYes": "Yes",
|
|
37
37
|
"ai_assistant.agents.meta.unlimited": "Unlimited",
|
|
38
38
|
"ai_assistant.agents.model_override.allowlistCustom": "custom",
|
|
39
|
+
"ai_assistant.agents.model_override.allowlistEmpty": "No configured providers are available for chat overrides.",
|
|
40
|
+
"ai_assistant.agents.model_override.allowlistHelp": "Limit which provider/model overrides users can pick in the chat footer for this agent.",
|
|
39
41
|
"ai_assistant.agents.model_override.allowlistInherited": "inherited",
|
|
40
42
|
"ai_assistant.agents.model_override.allowlistReset": "Inherit",
|
|
41
43
|
"ai_assistant.agents.model_override.allowlistSave": "Save choices",
|
|
44
|
+
"ai_assistant.agents.model_override.allowlistSaved": "Chat override choices saved.",
|
|
45
|
+
"ai_assistant.agents.model_override.allowlistTitle": "Chat override choices",
|
|
42
46
|
"ai_assistant.agents.model_override.anyProvider": "first configured",
|
|
43
47
|
"ai_assistant.agents.model_override.clear": "Clear override",
|
|
48
|
+
"ai_assistant.agents.model_override.cleared": "Model override cleared; the agent is using the normal resolution chain.",
|
|
44
49
|
"ai_assistant.agents.model_override.codeDefault": "Code-declared default",
|
|
45
50
|
"ai_assistant.agents.model_override.defaultBadge": "default",
|
|
51
|
+
"ai_assistant.agents.model_override.envAlsoNarrows": "also narrows this list from env.",
|
|
52
|
+
"ai_assistant.agents.model_override.loadErrorTitle": "Failed to load provider catalog",
|
|
53
|
+
"ai_assistant.agents.model_override.loading": "Loading provider catalog...",
|
|
46
54
|
"ai_assistant.agents.model_override.model": "Model",
|
|
47
55
|
"ai_assistant.agents.model_override.noOverride": "No per-agent override",
|
|
48
56
|
"ai_assistant.agents.model_override.provider": "Provider",
|
|
49
57
|
"ai_assistant.agents.model_override.providerDefault": "provider default",
|
|
50
58
|
"ai_assistant.agents.model_override.save": "Save override",
|
|
51
59
|
"ai_assistant.agents.model_override.saved": "Model override saved.",
|
|
60
|
+
"ai_assistant.agents.model_override.selectModel": "Select model",
|
|
61
|
+
"ai_assistant.agents.model_override.selectProvider": "Select provider",
|
|
62
|
+
"ai_assistant.agents.model_override.subtitle": "Override the default provider and model for this tenant and agent.",
|
|
52
63
|
"ai_assistant.agents.model_override.tenantOverride": "Tenant override",
|
|
53
64
|
"ai_assistant.agents.model_override.title": "Provider and model",
|
|
65
|
+
"ai_assistant.agents.moderation.controlLabel": "Moderation",
|
|
66
|
+
"ai_assistant.agents.moderation.effectiveEnforced": "Enforced",
|
|
67
|
+
"ai_assistant.agents.moderation.effectiveOff": "Off",
|
|
68
|
+
"ai_assistant.agents.moderation.effectiveOn": "On",
|
|
69
|
+
"ai_assistant.agents.moderation.enforcedBadge": "Enforced",
|
|
70
|
+
"ai_assistant.agents.moderation.enforcedHint": "This agent accepts untrusted input, so moderation is always on and cannot be disabled here.",
|
|
71
|
+
"ai_assistant.agents.moderation.inheritLabel": "Inherit",
|
|
72
|
+
"ai_assistant.agents.moderation.offLabel": "Off",
|
|
73
|
+
"ai_assistant.agents.moderation.onLabel": "On",
|
|
74
|
+
"ai_assistant.agents.moderation.saved": "Input moderation setting saved.",
|
|
75
|
+
"ai_assistant.agents.moderation.subtitle": "Screen user input for unsafe content before the model runs. Applies only when the resolved provider supports moderation.",
|
|
76
|
+
"ai_assistant.agents.moderation.title": "Input moderation",
|
|
54
77
|
"ai_assistant.agents.mutation_policy.clear": "Clear override",
|
|
55
78
|
"ai_assistant.agents.mutation_policy.clearedMessage": "Mutation policy override cleared; agent is using its code-declared policy.",
|
|
56
79
|
"ai_assistant.agents.mutation_policy.codeDeclared": "Code-declared",
|
|
@@ -275,7 +298,9 @@
|
|
|
275
298
|
"ai_assistant.chat.toolRunning": "running…",
|
|
276
299
|
"ai_assistant.chat.transcriptLabel": "Chat transcript",
|
|
277
300
|
"ai_assistant.chat.uiPartPending": "Pending UI part:",
|
|
301
|
+
"ai_assistant.chat.uploadingHint": "Uploading attachments… Send is disabled until they finish.",
|
|
278
302
|
"ai_assistant.chat.userRoleLabel": "You",
|
|
303
|
+
"ai_assistant.chat.welcomeDescription": "Ask me anything about your data. Here are some things I can do:",
|
|
279
304
|
"ai_assistant.chat.welcomeTitle": "How can I help?",
|
|
280
305
|
"ai_assistant.chat.zoomImage": "Open {name} preview",
|
|
281
306
|
"ai_assistant.dock.bottom": "Dock Bottom",
|
|
@@ -284,13 +309,17 @@
|
|
|
284
309
|
"ai_assistant.dock.left": "Dock Left",
|
|
285
310
|
"ai_assistant.dock.minimize": "Minimize",
|
|
286
311
|
"ai_assistant.dock.right": "Dock Right",
|
|
312
|
+
"ai_assistant.errors.moderationBlocked": "Your message was blocked by the content safety filter. Please rephrase and try again.",
|
|
313
|
+
"ai_assistant.errors.moderationUnavailable": "The content safety check is temporarily unavailable. Please try again in a moment.",
|
|
287
314
|
"ai_assistant.launcher.composerPlaceholder": "Ask anything…",
|
|
315
|
+
"ai_assistant.launcher.dialogDescription": "Pick an assistant. Use ↑/↓ to navigate, Enter to launch, Esc to close.",
|
|
288
316
|
"ai_assistant.launcher.dialogTitle": "AI assistants",
|
|
289
317
|
"ai_assistant.launcher.dock.subtitle": "AI assistant",
|
|
290
318
|
"ai_assistant.launcher.empty": "No assistants match your search.",
|
|
291
319
|
"ai_assistant.launcher.hint.close": "Close",
|
|
292
320
|
"ai_assistant.launcher.hint.launch": "Launch",
|
|
293
321
|
"ai_assistant.launcher.hint.navigate": "Navigate",
|
|
322
|
+
"ai_assistant.launcher.none": "No assistants are available for your account.",
|
|
294
323
|
"ai_assistant.launcher.searchPlaceholder": "Search assistants...",
|
|
295
324
|
"ai_assistant.launcher.setup.body": "AI assistants are installed, but no provider key is configured. Set OM_AI_PROVIDER and one matching API key in your .env file, then restart the app.",
|
|
296
325
|
"ai_assistant.launcher.setup.docs": "AI assistant docs",
|
|
@@ -299,6 +328,7 @@
|
|
|
299
328
|
"ai_assistant.launcher.sheet.dock": "Dock to side",
|
|
300
329
|
"ai_assistant.launcher.triggerAriaLabel": "Open AI assistant",
|
|
301
330
|
"ai_assistant.launcher.triggerLabel": "AI",
|
|
331
|
+
"ai_assistant.launcher.welcome.fallback": "How can I help?",
|
|
302
332
|
"ai_assistant.launcher.welcome.suggestion1": "What can you help me with?",
|
|
303
333
|
"ai_assistant.launcher.welcome.suggestion2": "Show what data you can access",
|
|
304
334
|
"ai_assistant.launcher.welcome.suggestion3": "Suggest things to try",
|
|
@@ -326,6 +356,18 @@
|
|
|
326
356
|
"ai_assistant.modelPicker.triggerAriaLabel": "Select AI model",
|
|
327
357
|
"ai_assistant.modelPicker.useDefault": "Use agent default",
|
|
328
358
|
"ai_assistant.modelPicker.useDefaultWithModel": "Use agent default: {{model}}",
|
|
359
|
+
"ai_assistant.moderationFlags.columns.agent": "Agent",
|
|
360
|
+
"ai_assistant.moderationFlags.columns.categories": "Categories",
|
|
361
|
+
"ai_assistant.moderationFlags.columns.createdAt": "Flagged at",
|
|
362
|
+
"ai_assistant.moderationFlags.columns.user": "User",
|
|
363
|
+
"ai_assistant.moderationFlags.empty": "No flagged messages.",
|
|
364
|
+
"ai_assistant.moderationFlags.filters.agentPlaceholder": "module.agent",
|
|
365
|
+
"ai_assistant.moderationFlags.filters.apply": "Apply",
|
|
366
|
+
"ai_assistant.moderationFlags.filters.from": "From",
|
|
367
|
+
"ai_assistant.moderationFlags.filters.to": "To",
|
|
368
|
+
"ai_assistant.moderationFlags.navTitle": "Moderation flags",
|
|
369
|
+
"ai_assistant.moderationFlags.subtitle": "Inputs blocked by the content safety filter. Category flags and scores only — no prompt content is stored.",
|
|
370
|
+
"ai_assistant.moderationFlags.title": "Moderation flags",
|
|
329
371
|
"ai_assistant.notifications.conversation_shared.body": "An AI conversation has been shared with you.",
|
|
330
372
|
"ai_assistant.notifications.conversation_shared.title": "Conversation shared with you",
|
|
331
373
|
"ai_assistant.notifications.conversation_shared.view_button": "View Conversation",
|
|
@@ -36,21 +36,44 @@
|
|
|
36
36
|
"ai_assistant.agents.meta.readOnlyYes": "Sí",
|
|
37
37
|
"ai_assistant.agents.meta.unlimited": "Sin límite",
|
|
38
38
|
"ai_assistant.agents.model_override.allowlistCustom": "personalizado",
|
|
39
|
+
"ai_assistant.agents.model_override.allowlistEmpty": "No hay proveedores configurados disponibles para anulaciones del chat.",
|
|
40
|
+
"ai_assistant.agents.model_override.allowlistHelp": "Limita qué anulaciones de proveedor y modelo pueden elegir los usuarios en el pie del chat para este agente.",
|
|
39
41
|
"ai_assistant.agents.model_override.allowlistInherited": "heredado",
|
|
40
42
|
"ai_assistant.agents.model_override.allowlistReset": "Heredar",
|
|
41
43
|
"ai_assistant.agents.model_override.allowlistSave": "Guardar opciones",
|
|
44
|
+
"ai_assistant.agents.model_override.allowlistSaved": "Opciones de anulación del chat guardadas.",
|
|
45
|
+
"ai_assistant.agents.model_override.allowlistTitle": "Opciones de anulación del chat",
|
|
42
46
|
"ai_assistant.agents.model_override.anyProvider": "primer configurado",
|
|
43
47
|
"ai_assistant.agents.model_override.clear": "Eliminar sobrescritura",
|
|
48
|
+
"ai_assistant.agents.model_override.cleared": "Se ha borrado la anulación del modelo; el agente usa la cadena de resolución normal.",
|
|
44
49
|
"ai_assistant.agents.model_override.codeDefault": "Predeterminado declarado en código",
|
|
45
50
|
"ai_assistant.agents.model_override.defaultBadge": "predeterminado",
|
|
51
|
+
"ai_assistant.agents.model_override.envAlsoNarrows": "también restringe esta lista desde el entorno.",
|
|
52
|
+
"ai_assistant.agents.model_override.loadErrorTitle": "No se pudo cargar el catálogo de proveedores",
|
|
53
|
+
"ai_assistant.agents.model_override.loading": "Cargando el catálogo de proveedores...",
|
|
46
54
|
"ai_assistant.agents.model_override.model": "Modelo",
|
|
47
55
|
"ai_assistant.agents.model_override.noOverride": "Sin sobrescritura por agente",
|
|
48
56
|
"ai_assistant.agents.model_override.provider": "Proveedor",
|
|
49
57
|
"ai_assistant.agents.model_override.providerDefault": "predeterminado del proveedor",
|
|
50
58
|
"ai_assistant.agents.model_override.save": "Guardar sobrescritura",
|
|
51
59
|
"ai_assistant.agents.model_override.saved": "Sobrescritura de modelo guardada.",
|
|
60
|
+
"ai_assistant.agents.model_override.selectModel": "Selecciona un modelo",
|
|
61
|
+
"ai_assistant.agents.model_override.selectProvider": "Selecciona un proveedor",
|
|
62
|
+
"ai_assistant.agents.model_override.subtitle": "Anula el proveedor y el modelo predeterminados para este inquilino y agente.",
|
|
52
63
|
"ai_assistant.agents.model_override.tenantOverride": "Sobrescritura del tenant",
|
|
53
64
|
"ai_assistant.agents.model_override.title": "Proveedor y modelo",
|
|
65
|
+
"ai_assistant.agents.moderation.controlLabel": "Moderación",
|
|
66
|
+
"ai_assistant.agents.moderation.effectiveEnforced": "Forzada",
|
|
67
|
+
"ai_assistant.agents.moderation.effectiveOff": "Desactivada",
|
|
68
|
+
"ai_assistant.agents.moderation.effectiveOn": "Activada",
|
|
69
|
+
"ai_assistant.agents.moderation.enforcedBadge": "Forzada",
|
|
70
|
+
"ai_assistant.agents.moderation.enforcedHint": "Este agente acepta entradas no confiables, por lo que la moderación siempre está activada y no se puede desactivar aquí.",
|
|
71
|
+
"ai_assistant.agents.moderation.inheritLabel": "Heredar",
|
|
72
|
+
"ai_assistant.agents.moderation.offLabel": "Desactivada",
|
|
73
|
+
"ai_assistant.agents.moderation.onLabel": "Activada",
|
|
74
|
+
"ai_assistant.agents.moderation.saved": "Ajuste de moderación de entrada guardado.",
|
|
75
|
+
"ai_assistant.agents.moderation.subtitle": "Filtra la entrada del usuario en busca de contenido no seguro antes de ejecutar el modelo. Solo aplica cuando el proveedor resuelto admite moderación.",
|
|
76
|
+
"ai_assistant.agents.moderation.title": "Moderación de entrada",
|
|
54
77
|
"ai_assistant.agents.mutation_policy.clear": "Eliminar sobrescritura",
|
|
55
78
|
"ai_assistant.agents.mutation_policy.clearedMessage": "Sobrescritura de política de mutación eliminada; el agente usa la política declarada en el código.",
|
|
56
79
|
"ai_assistant.agents.mutation_policy.codeDeclared": "Declarada en el código",
|
|
@@ -275,7 +298,9 @@
|
|
|
275
298
|
"ai_assistant.chat.toolRunning": "running…",
|
|
276
299
|
"ai_assistant.chat.transcriptLabel": "Transcripción del chat",
|
|
277
300
|
"ai_assistant.chat.uiPartPending": "Parte de UI pendiente:",
|
|
301
|
+
"ai_assistant.chat.uploadingHint": "Subiendo archivos adjuntos… El envío está desactivado hasta que terminen.",
|
|
278
302
|
"ai_assistant.chat.userRoleLabel": "Usted",
|
|
303
|
+
"ai_assistant.chat.welcomeDescription": "Pregúntame lo que quieras sobre tus datos. Esto es algo de lo que puedo hacer:",
|
|
279
304
|
"ai_assistant.chat.welcomeTitle": "How can I help?",
|
|
280
305
|
"ai_assistant.chat.zoomImage": "Abrir vista previa de {name}",
|
|
281
306
|
"ai_assistant.dock.bottom": "Anclar abajo",
|
|
@@ -284,13 +309,17 @@
|
|
|
284
309
|
"ai_assistant.dock.left": "Anclar a la izquierda",
|
|
285
310
|
"ai_assistant.dock.minimize": "Minimizar",
|
|
286
311
|
"ai_assistant.dock.right": "Anclar a la derecha",
|
|
312
|
+
"ai_assistant.errors.moderationBlocked": "Tu mensaje fue bloqueado por el filtro de seguridad de contenido. Reformúlalo e inténtalo de nuevo.",
|
|
313
|
+
"ai_assistant.errors.moderationUnavailable": "La verificación de seguridad de contenido no está disponible temporalmente. Inténtalo de nuevo en un momento.",
|
|
287
314
|
"ai_assistant.launcher.composerPlaceholder": "Pregunte lo que necesite…",
|
|
315
|
+
"ai_assistant.launcher.dialogDescription": "Elige un asistente. Usa ↑/↓ para navegar, Enter para iniciar, Esc para cerrar.",
|
|
288
316
|
"ai_assistant.launcher.dialogTitle": "AI assistants",
|
|
289
317
|
"ai_assistant.launcher.dock.subtitle": "AI assistant",
|
|
290
318
|
"ai_assistant.launcher.empty": "No assistants match your search.",
|
|
291
319
|
"ai_assistant.launcher.hint.close": "Close",
|
|
292
320
|
"ai_assistant.launcher.hint.launch": "Launch",
|
|
293
321
|
"ai_assistant.launcher.hint.navigate": "Navigate",
|
|
322
|
+
"ai_assistant.launcher.none": "No hay asistentes disponibles para tu cuenta.",
|
|
294
323
|
"ai_assistant.launcher.searchPlaceholder": "Search assistants...",
|
|
295
324
|
"ai_assistant.launcher.setup.body": "Los asistentes de IA están instalados, pero no hay una clave de proveedor configurada. Define OM_AI_PROVIDER y una clave de API compatible en tu archivo .env y reinicia la app.",
|
|
296
325
|
"ai_assistant.launcher.setup.docs": "Documentación del asistente de IA",
|
|
@@ -299,6 +328,7 @@
|
|
|
299
328
|
"ai_assistant.launcher.sheet.dock": "Dock to side",
|
|
300
329
|
"ai_assistant.launcher.triggerAriaLabel": "Open AI assistant",
|
|
301
330
|
"ai_assistant.launcher.triggerLabel": "AI",
|
|
331
|
+
"ai_assistant.launcher.welcome.fallback": "¿En qué puedo ayudarte?",
|
|
302
332
|
"ai_assistant.launcher.welcome.suggestion1": "What can you help me with?",
|
|
303
333
|
"ai_assistant.launcher.welcome.suggestion2": "Show what data you can access",
|
|
304
334
|
"ai_assistant.launcher.welcome.suggestion3": "Suggest things to try",
|
|
@@ -326,6 +356,18 @@
|
|
|
326
356
|
"ai_assistant.modelPicker.triggerAriaLabel": "Selector de modelo de IA",
|
|
327
357
|
"ai_assistant.modelPicker.useDefault": "Usar predeterminado",
|
|
328
358
|
"ai_assistant.modelPicker.useDefaultWithModel": "Usar predeterminado del agente: {{model}}",
|
|
359
|
+
"ai_assistant.moderationFlags.columns.agent": "Agente",
|
|
360
|
+
"ai_assistant.moderationFlags.columns.categories": "Categorías",
|
|
361
|
+
"ai_assistant.moderationFlags.columns.createdAt": "Marcado el",
|
|
362
|
+
"ai_assistant.moderationFlags.columns.user": "Usuario",
|
|
363
|
+
"ai_assistant.moderationFlags.empty": "No hay mensajes marcados.",
|
|
364
|
+
"ai_assistant.moderationFlags.filters.agentPlaceholder": "modulo.agente",
|
|
365
|
+
"ai_assistant.moderationFlags.filters.apply": "Aplicar",
|
|
366
|
+
"ai_assistant.moderationFlags.filters.from": "Desde",
|
|
367
|
+
"ai_assistant.moderationFlags.filters.to": "Hasta",
|
|
368
|
+
"ai_assistant.moderationFlags.navTitle": "Marcas de moderación",
|
|
369
|
+
"ai_assistant.moderationFlags.subtitle": "Entradas bloqueadas por el filtro de seguridad de contenido. Solo indicadores de categoría y puntuaciones — no se almacena el contenido del prompt.",
|
|
370
|
+
"ai_assistant.moderationFlags.title": "Marcas de moderación",
|
|
329
371
|
"ai_assistant.notifications.conversation_shared.body": "Se ha compartido una conversación de IA con usted.",
|
|
330
372
|
"ai_assistant.notifications.conversation_shared.title": "Conversación compartida con usted",
|
|
331
373
|
"ai_assistant.notifications.conversation_shared.view_button": "Ver conversación",
|