@agent-native/core 0.79.6 → 0.79.9
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/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +19 -0
- package/corpus/core/docs/content/locales/zh-TW/durable-background-runs.md +74 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/production-agent.ts +0 -93
- package/corpus/core/src/agent/run-manager.ts +9 -1
- package/corpus/core/src/client/agent-chat-adapter.ts +24 -16
- package/corpus/core/src/client/session-replay.ts +67 -13
- package/corpus/core/src/onboarding/default-steps.ts +3 -3
- package/corpus/core/src/server/agent-chat-plugin.ts +82 -162
- package/corpus/core/src/server/agent-run-context.ts +204 -0
- package/corpus/core/src/server/credential-provider.ts +20 -4
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +14 -4
- package/corpus/templates/analytics/changelog/2026-06-26-session-replay-uploads-now-accept-compressed-payloads-so-lar.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-26-sql-chart-tooltips-now-stay-stable-while-moving-across-dense.md +6 -0
- package/corpus/templates/analytics/server/handlers/session-replay.ts +56 -8
- package/corpus/templates/clips/app/components/player/transcript-panel.tsx +1 -1
- package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +44 -16
- package/corpus/templates/clips/app/i18n/ar-SA.ts +12 -9
- package/corpus/templates/clips/app/i18n/de-DE.ts +12 -9
- package/corpus/templates/clips/app/i18n/en-US.ts +19 -16
- package/corpus/templates/clips/app/i18n/es-ES.ts +12 -9
- package/corpus/templates/clips/app/i18n/fr-FR.ts +12 -9
- package/corpus/templates/clips/app/i18n/hi-IN.ts +13 -9
- package/corpus/templates/clips/app/i18n/ja-JP.ts +12 -9
- package/corpus/templates/clips/app/i18n/ko-KR.ts +12 -9
- package/corpus/templates/clips/app/i18n/pt-BR.ts +12 -9
- package/corpus/templates/clips/app/i18n/zh-CN.ts +19 -14
- package/corpus/templates/clips/app/i18n/zh-TW.ts +19 -14
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +7 -0
- package/corpus/templates/clips/app/routes/record.tsx +2 -2
- package/corpus/templates/clips/changelog/2026-06-26-desktop-recordings-recover-more-reliably-when-macos-reports-.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-slack-unfurls-now-recognize-recording-dashboard-links-pasted.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-storage-setup-now-explains-why-clips-needs-connected-storage.md +6 -0
- package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
- package/corpus/templates/clips/chrome-extension/src/background.ts +24 -3
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +28 -2
- package/corpus/templates/clips/chrome-extension/src/popup.html +16 -0
- package/corpus/templates/clips/chrome-extension/src/popup.ts +59 -7
- package/corpus/templates/clips/chrome-extension/src/sentry.ts +28 -1
- package/corpus/templates/clips/chrome-extension/src/styles.css +74 -0
- package/corpus/templates/clips/desktop/src/app.tsx +85 -18
- package/corpus/templates/clips/desktop/src/styles.css +55 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +88 -51
- package/corpus/templates/clips/desktop/src-tauri/src/native_speech.rs +12 -3
- package/corpus/templates/clips/server/lib/slack-unfurls.ts +5 -2
- package/corpus/templates/slides/actions/_app-url.ts +1 -1
- package/corpus/templates/slides/changelog/2026-06-26-deck-links-now-use-the-workspace-gateway-when-available-so-g.md +6 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +0 -79
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +12 -1
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +15 -8
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +55 -14
- package/dist/client/session-replay.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +2 -2
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +7 -7
- package/dist/onboarding/default-steps.js +3 -3
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +69 -154
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +2 -2
- package/dist/server/agent-run-context.d.ts +35 -0
- package/dist/server/agent-run-context.d.ts.map +1 -0
- package/dist/server/agent-run-context.js +137 -0
- package/dist/server/agent-run-context.js.map +1 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +15 -4
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/docs/content/locales/zh-TW/durable-background-runs.md +74 -0
- package/package.json +1 -1
- package/corpus/templates/.retired/README.md +0 -9
- package/corpus/templates/.retired/calls/package.json +0 -8
- package/corpus/templates/.retired/code/package.json +0 -8
- package/corpus/templates/.retired/contracts/package.json +0 -8
- package/corpus/templates/.retired/images/package.json +0 -8
- package/corpus/templates/.retired/issues/package.json +0 -8
- package/corpus/templates/.retired/meeting-notes/package.json +0 -8
- package/corpus/templates/.retired/migration/package.json +0 -8
- package/corpus/templates/.retired/recruiting/package.json +0 -8
- package/corpus/templates/.retired/scheduling/package.json +0 -8
- package/corpus/templates/.retired/visual-plans/package.json +0 -8
- package/corpus/templates/.retired/voice/package.json +0 -8
- package/corpus/templates/.retired/workbench/package.json +0 -8
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { gunzipSync } from "node:zlib";
|
|
2
|
+
|
|
2
3
|
import {
|
|
3
4
|
defineEventHandler,
|
|
4
5
|
getHeader,
|
|
5
6
|
getQuery,
|
|
6
7
|
getRouterParam,
|
|
8
|
+
readRawBody,
|
|
7
9
|
setResponseHeader,
|
|
8
10
|
setResponseStatus,
|
|
9
11
|
} from "h3";
|
|
@@ -48,7 +50,7 @@ function setCors(event: any): void {
|
|
|
48
50
|
setResponseHeader(
|
|
49
51
|
event,
|
|
50
52
|
"Access-Control-Allow-Headers",
|
|
51
|
-
"content-type, x-agent-native-analytics-key",
|
|
53
|
+
"content-type, content-encoding, x-agent-native-analytics-key",
|
|
52
54
|
);
|
|
53
55
|
setResponseHeader(event, "Access-Control-Max-Age", "86400");
|
|
54
56
|
}
|
|
@@ -76,15 +78,60 @@ function injectHeaderKey(body: unknown, headerKey?: string): unknown {
|
|
|
76
78
|
return { publicKey: headerKey };
|
|
77
79
|
}
|
|
78
80
|
|
|
79
|
-
function
|
|
80
|
-
|
|
81
|
+
function statusError(message: string, statusCode: number): Error {
|
|
82
|
+
return Object.assign(new Error(message), { statusCode });
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function decodeSessionReplayRequestBody(
|
|
86
|
+
rawBody: Buffer | Uint8Array | string | undefined,
|
|
87
|
+
contentEncoding?: string | null,
|
|
88
|
+
): { body: unknown; requestBytes: number } {
|
|
89
|
+
const requestBytes =
|
|
90
|
+
typeof rawBody === "string"
|
|
91
|
+
? Buffer.byteLength(rawBody, "utf8")
|
|
92
|
+
: (rawBody?.byteLength ?? 0);
|
|
93
|
+
const bytes = Buffer.isBuffer(rawBody)
|
|
94
|
+
? rawBody
|
|
95
|
+
: rawBody instanceof Uint8Array
|
|
96
|
+
? Buffer.from(rawBody)
|
|
97
|
+
: Buffer.from(rawBody ?? "", "utf8");
|
|
98
|
+
const encoding = (contentEncoding ?? "").split(";")[0]?.trim().toLowerCase();
|
|
99
|
+
let decoded = bytes;
|
|
100
|
+
|
|
101
|
+
if (encoding === "gzip" || encoding === "x-gzip") {
|
|
102
|
+
try {
|
|
103
|
+
decoded = gunzipSync(bytes);
|
|
104
|
+
} catch {
|
|
105
|
+
throw statusError("Invalid gzip-compressed replay body", 400);
|
|
106
|
+
}
|
|
107
|
+
} else if (encoding && encoding !== "identity") {
|
|
108
|
+
throw statusError(
|
|
109
|
+
`Unsupported replay request content-encoding: ${encoding}`,
|
|
110
|
+
415,
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const text = decoded.toString("utf8");
|
|
115
|
+
if (!text.trim()) {
|
|
116
|
+
return { body: undefined, requestBytes };
|
|
117
|
+
}
|
|
81
118
|
try {
|
|
82
|
-
return
|
|
119
|
+
return { body: JSON.parse(text), requestBytes };
|
|
83
120
|
} catch {
|
|
84
|
-
return
|
|
121
|
+
return { body: text, requestBytes };
|
|
85
122
|
}
|
|
86
123
|
}
|
|
87
124
|
|
|
125
|
+
async function readSessionReplayRequestBody(
|
|
126
|
+
event: any,
|
|
127
|
+
): Promise<{ body: unknown; requestBytes: number }> {
|
|
128
|
+
const rawBody = await readRawBody(event, false);
|
|
129
|
+
return decodeSessionReplayRequestBody(
|
|
130
|
+
rawBody,
|
|
131
|
+
getHeader(event, "content-encoding"),
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
88
135
|
function asString(value: unknown): string | undefined {
|
|
89
136
|
if (typeof value === "string" && value.trim()) return value.trim();
|
|
90
137
|
if (Array.isArray(value) && typeof value[0] === "string" && value[0].trim()) {
|
|
@@ -153,12 +200,13 @@ export const handleSessionReplayIngest = defineEventHandler(async (event) => {
|
|
|
153
200
|
}
|
|
154
201
|
|
|
155
202
|
const headerKey = getHeader(event, "x-agent-native-analytics-key");
|
|
156
|
-
const rawBody
|
|
203
|
+
const { body: rawBody, requestBytes } =
|
|
204
|
+
await readSessionReplayRequestBody(event);
|
|
157
205
|
const body = injectHeaderKey(rawBody, headerKey);
|
|
158
206
|
const parsed = parseSessionReplayIngestPayload(body);
|
|
159
207
|
const result = await recordSessionReplayChunks(parsed, {
|
|
160
208
|
origin: readOrigin(event),
|
|
161
|
-
requestBytes
|
|
209
|
+
requestBytes,
|
|
162
210
|
});
|
|
163
211
|
setResponseStatus(event, 202);
|
|
164
212
|
return { success: true, ...result };
|
|
@@ -585,7 +585,7 @@ function TranscriptSetupCard({
|
|
|
585
585
|
<p className="text-xs font-semibold">
|
|
586
586
|
{builderConfigured
|
|
587
587
|
? "Builder.io connected"
|
|
588
|
-
: "
|
|
588
|
+
: "Use Builder.io (free)"}
|
|
589
589
|
</p>
|
|
590
590
|
{!builderConfigured && (
|
|
591
591
|
<span className="rounded-sm bg-primary/10 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-primary">
|
|
@@ -13,6 +13,13 @@ import {
|
|
|
13
13
|
} from "@tabler/icons-react";
|
|
14
14
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
15
15
|
|
|
16
|
+
import {
|
|
17
|
+
Tooltip,
|
|
18
|
+
TooltipContent,
|
|
19
|
+
TooltipProvider,
|
|
20
|
+
TooltipTrigger,
|
|
21
|
+
} from "@/components/ui/tooltip";
|
|
22
|
+
|
|
16
23
|
function BuilderBMark({ className }: { className?: string }) {
|
|
17
24
|
return (
|
|
18
25
|
<svg
|
|
@@ -173,23 +180,44 @@ export function StorageSetupCard({
|
|
|
173
180
|
|
|
174
181
|
{/* S3 — secondary option */}
|
|
175
182
|
{!connected && (
|
|
176
|
-
|
|
177
|
-
<
|
|
178
|
-
|
|
179
|
-
<
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
183
|
+
<>
|
|
184
|
+
<div className="flex items-center gap-3 border-t border-border pt-4">
|
|
185
|
+
<IconServer className="h-4 w-4 text-muted-foreground" />
|
|
186
|
+
<div className="flex-1">
|
|
187
|
+
<span className="text-sm text-muted-foreground">
|
|
188
|
+
Or{" "}
|
|
189
|
+
<a
|
|
190
|
+
href={appPath("/settings#video-storage")}
|
|
191
|
+
className="font-medium text-foreground underline underline-offset-2 hover:text-foreground/80"
|
|
192
|
+
>
|
|
193
|
+
{t("storageSetup.configureS3")}
|
|
194
|
+
</a>
|
|
195
|
+
</span>
|
|
196
|
+
<span className="mt-0.5 block text-[11px] text-muted-foreground">
|
|
197
|
+
AWS S3, Cloudflare R2, DigitalOcean Spaces, MinIO
|
|
198
|
+
</span>
|
|
199
|
+
</div>
|
|
191
200
|
</div>
|
|
192
|
-
|
|
201
|
+
<TooltipProvider delayDuration={150}>
|
|
202
|
+
<Tooltip>
|
|
203
|
+
<TooltipTrigger asChild>
|
|
204
|
+
<button
|
|
205
|
+
type="button"
|
|
206
|
+
className="self-start text-xs text-muted-foreground underline decoration-muted-foreground/50 decoration-dotted underline-offset-4 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"
|
|
207
|
+
>
|
|
208
|
+
{t("storageSetup.whyPrompt")}
|
|
209
|
+
</button>
|
|
210
|
+
</TooltipTrigger>
|
|
211
|
+
<TooltipContent
|
|
212
|
+
side="bottom"
|
|
213
|
+
align="start"
|
|
214
|
+
className="max-w-80 whitespace-normal text-xs leading-relaxed"
|
|
215
|
+
>
|
|
216
|
+
{t("storageSetup.whyDescription")}
|
|
217
|
+
</TooltipContent>
|
|
218
|
+
</Tooltip>
|
|
219
|
+
</TooltipProvider>
|
|
220
|
+
</>
|
|
193
221
|
)}
|
|
194
222
|
</div>
|
|
195
223
|
);
|
|
@@ -344,7 +344,7 @@ const messages = {
|
|
|
344
344
|
cleanupBuilderFailed:
|
|
345
345
|
"تعذر إنهاء عملية التنظيف على الرغم من اتصال Builder.io. تم الاحتفاظ بالنص الأصلي.",
|
|
346
346
|
cleanupPaused:
|
|
347
|
-
"
|
|
347
|
+
"التنظيف متوقف مؤقتًا. صِل الذكاء الاصطناعي من الإعدادات: Builder.io (أرصدة مجانية) أو مفتاح LLM الخاص بك.",
|
|
348
348
|
builderNoResponse:
|
|
349
349
|
"لم أتلق ردًا من Builder. اسمح بالنوافذ المنبثقة وحاول مرة أخرى.",
|
|
350
350
|
saveFailed: "فشل الحفظ ({{status}})",
|
|
@@ -584,7 +584,7 @@ const messages = {
|
|
|
584
584
|
"Builder.io هو مسار التخزين الأساسي لعمليات رفع Clips. يتوفر S3 عندما تحتاج إلى استخدام حاويتك الخاصة.",
|
|
585
585
|
checkingBuilder: "جار فحص Builder.io",
|
|
586
586
|
builderConnected: "Builder.io متصل",
|
|
587
|
-
connectBuilder: "
|
|
587
|
+
connectBuilder: "استخدام Builder.io (مجاني)",
|
|
588
588
|
builderConnectedFor: "يتم استخدام Builder.io لـ {{orgName}}.",
|
|
589
589
|
builderConnectedGeneric: "تستخدم المقاطع الجديدة مزود Builder.io المتصل.",
|
|
590
590
|
builderIncludes:
|
|
@@ -610,12 +610,12 @@ const messages = {
|
|
|
610
610
|
s3PublicBaseUrlLabel: "عنوان URL الأساسي العام",
|
|
611
611
|
apiSetup: "إعداد الذكاء الاصطناعي",
|
|
612
612
|
apiSetupDescription:
|
|
613
|
-
"
|
|
614
|
-
builderEasySetup: "Builder.io
|
|
613
|
+
"صِل الذكاء الاصطناعي باستخدام أرصدة Builder.io المجانية أو مفاتيح LLM الخاصة بك.",
|
|
614
|
+
builderEasySetup: "أرصدة Builder.io مجانية",
|
|
615
615
|
builderAiAvailable:
|
|
616
616
|
"تتوفر اعتمادات الذكاء الاصطناعي المضمنة والنسخ المُدار لـ Clips.",
|
|
617
617
|
builderAiDescription:
|
|
618
|
-
"
|
|
618
|
+
"استخدم Builder.io أولًا لاعتمادات الذكاء الاصطناعي المضمنة وتخزين الكائنات والرفع والنسخ المُدار.",
|
|
619
619
|
providerKeyTitle: "استخدام مفتاح مزود خاص بك",
|
|
620
620
|
providerKeyDescription:
|
|
621
621
|
"أضف مفاتيح Anthropic أو OpenAI أو Gemini أو Groq أو OpenRouter للاستخدام المفوتر من المزود.",
|
|
@@ -762,7 +762,7 @@ const messages = {
|
|
|
762
762
|
pickAtLeastTwo: "اختر تسجيلين على الأقل لدمجهما",
|
|
763
763
|
videoUrlMissing: "واحد أو أكثر من التسجيلات لا يحتوي بعد على رابط فيديو جاهز",
|
|
764
764
|
connectStorage:
|
|
765
|
-
"
|
|
765
|
+
"صِل التخزين قبل دمج التسجيلات: Builder.io (تخزين + ذكاء اصطناعي في الخطة المجانية) أو تخزين متوافق مع S3.",
|
|
766
766
|
created: "تم إنشاء التسجيل المدمج",
|
|
767
767
|
failed: "فشل دمج التسجيلات",
|
|
768
768
|
noOtherRecordings: "لا توجد تسجيلات أخرى متاحة.",
|
|
@@ -988,9 +988,12 @@ const messages = {
|
|
|
988
988
|
"لم يصل رد من Builder خلال 5 دقائق. تحقق من النافذة المنبثقة وحاول مرة أخرى.",
|
|
989
989
|
builderConnected: "Builder.io متصل",
|
|
990
990
|
waitingForBuilder: "بانتظار Builder...",
|
|
991
|
-
connectBuilder: "
|
|
991
|
+
connectBuilder: "استخدام Builder.io (مجاني)",
|
|
992
992
|
free: "مجاني",
|
|
993
993
|
configureS3: "تكوين تخزين متوافق مع S3",
|
|
994
|
+
whyPrompt: "لماذا أرى هذا؟",
|
|
995
|
+
whyDescription:
|
|
996
|
+
"Clips تطبيق مجاني ومفتوح المصدر 100%، لذلك تحتاج إلى توصيل طريقة لتخزين المقاطع. صِل التخزين عبر Builder.io لتخزين وذكاء اصطناعي ضمن الخطة المجانية، أو استخدم تخزين كائنات متوافقًا مع S3 ومفاتيح LLM الخاصة بك.",
|
|
994
997
|
},
|
|
995
998
|
captureInstall: {
|
|
996
999
|
title: "Choose your recorder (مترجم)",
|
|
@@ -1193,9 +1196,9 @@ const messages = {
|
|
|
1193
1196
|
downloadRecording: "Download recording (مترجم)",
|
|
1194
1197
|
openRecorderInTab: "Open recorder in tab (مترجم)",
|
|
1195
1198
|
connectStorageToFinish:
|
|
1196
|
-
"
|
|
1199
|
+
"صِل التخزين في الشاشة التالية: Builder.io (تخزين + ذكاء اصطناعي في الخطة المجانية) أو تخزين متوافق مع S3. سيكمل Clips الحفظ.",
|
|
1197
1200
|
connectStorageToRetryLoom:
|
|
1198
|
-
"
|
|
1201
|
+
"صِل التخزين في الشاشة التالية: Builder.io (تخزين + ذكاء اصطناعي في الخطة المجانية) أو تخزين متوافق مع S3. سيعيد Clips محاولة الاستيراد.",
|
|
1199
1202
|
},
|
|
1200
1203
|
dictateRoute: {
|
|
1201
1204
|
pageTitle: "Dictate · Clips (مترجم)",
|
|
@@ -359,7 +359,7 @@ const messages = {
|
|
|
359
359
|
cleanupBuilderFailed:
|
|
360
360
|
"Die Bereinigung konnte nicht abgeschlossen werden, obwohl Builder.io verbunden ist. Das native Transkript wurde aufbewahrt.",
|
|
361
361
|
cleanupPaused:
|
|
362
|
-
"Die Bereinigung ist pausiert.
|
|
362
|
+
"Die Bereinigung ist pausiert. Verbinde KI in den Einstellungen: Builder.io (kostenlose Credits) oder deinen eigenen LLM-Schlüssel.",
|
|
363
363
|
builderNoResponse:
|
|
364
364
|
"Ich habe keine Antwort von Builder erhalten. Lassen Sie Popups zu und versuchen Sie es erneut.",
|
|
365
365
|
saveFailed: "Speichern fehlgeschlagen ({{status}})",
|
|
@@ -607,7 +607,7 @@ Alle sichtbaren Änderungen für Clips-Nutzer werden hier dokumentiert. Du kanns
|
|
|
607
607
|
"Builder.io ist der primäre Speicherpfad für Clips-Uploads. S3 ist verfügbar, wenn du deinen eigenen Bucket verwenden musst.",
|
|
608
608
|
checkingBuilder: "Builder.io wird geprüft",
|
|
609
609
|
builderConnected: "Builder.io verbunden",
|
|
610
|
-
connectBuilder: "Builder.io
|
|
610
|
+
connectBuilder: "Builder.io nutzen (kostenlos)",
|
|
611
611
|
builderConnectedFor: "Builder.io wird für {{orgName}} verwendet.",
|
|
612
612
|
builderConnectedGeneric:
|
|
613
613
|
"Neue Clips verwenden den verbundenen Builder.io-Anbieter.",
|
|
@@ -635,12 +635,12 @@ Alle sichtbaren Änderungen für Clips-Nutzer werden hier dokumentiert. Du kanns
|
|
|
635
635
|
s3PublicBaseUrlLabel: "Öffentliche Basis-URL",
|
|
636
636
|
apiSetup: "KI-Einrichtung",
|
|
637
637
|
apiSetupDescription:
|
|
638
|
-
"
|
|
639
|
-
builderEasySetup: "Builder.io
|
|
638
|
+
"Verbinde KI mit kostenlosen Builder.io-Credits oder deinen eigenen LLM-Schlüsseln.",
|
|
639
|
+
builderEasySetup: "Kostenlose Builder.io-Credits",
|
|
640
640
|
builderAiAvailable:
|
|
641
641
|
"Enthaltene KI-Guthaben und verwaltete Transkription sind für Clips verfügbar.",
|
|
642
642
|
builderAiDescription:
|
|
643
|
-
"
|
|
643
|
+
"Nutze Builder.io zuerst für enthaltene KI-Guthaben, Objektspeicher, Uploads und verwaltete Transkription.",
|
|
644
644
|
providerKeyTitle: "Eigenen Anbieter-Schlüssel verwenden",
|
|
645
645
|
providerKeyDescription:
|
|
646
646
|
"Füge Anthropic-, OpenAI-, Gemini-, Groq- oder OpenRouter-Schlüssel für anbieterseitig abgerechnete Nutzung hinzu.",
|
|
@@ -787,7 +787,7 @@ Alle sichtbaren Änderungen für Clips-Nutzer werden hier dokumentiert. Du kanns
|
|
|
787
787
|
videoUrlMissing:
|
|
788
788
|
"Eine oder mehrere Aufzeichnungen haben noch keine fertige Video-URL",
|
|
789
789
|
connectStorage:
|
|
790
|
-
"Verbinde Builder.io oder S3-
|
|
790
|
+
"Verbinde Speicher vor dem Zusammenfügen von Aufzeichnungen: Builder.io (Speicher + KI im kostenlosen Tarif) oder S3-kompatibler Speicher.",
|
|
791
791
|
created: "Zusammengefügte Aufzeichnung erstellt",
|
|
792
792
|
failed: "Aufzeichnungen konnten nicht zusammengefügt werden",
|
|
793
793
|
noOtherRecordings: "Keine anderen Aufzeichnungen verfügbar.",
|
|
@@ -1018,9 +1018,12 @@ Alle sichtbaren Änderungen für Clips-Nutzer werden hier dokumentiert. Du kanns
|
|
|
1018
1018
|
"Nach 5 Minuten kam keine Antwort von Builder. Prüfe das Popup und versuche es erneut.",
|
|
1019
1019
|
builderConnected: "Builder.io verbunden",
|
|
1020
1020
|
waitingForBuilder: "Warten auf Builder...",
|
|
1021
|
-
connectBuilder: "Builder.io
|
|
1021
|
+
connectBuilder: "Builder.io nutzen (kostenlos)",
|
|
1022
1022
|
free: "Kostenlos",
|
|
1023
1023
|
configureS3: "S3-kompatiblen Speicher konfigurieren",
|
|
1024
|
+
whyPrompt: "Warum sehe ich das?",
|
|
1025
|
+
whyDescription:
|
|
1026
|
+
"Clips ist 100 % kostenlos und Open Source, deshalb musst du eine Möglichkeit zum Speichern deiner Clips verbinden. Verbinde Speicher mit Builder.io für Speicher und KI im kostenlosen Tarif, oder nutze S3-kompatiblen Objektspeicher und deine eigenen LLM-Schlüssel.",
|
|
1024
1027
|
},
|
|
1025
1028
|
captureInstall: {
|
|
1026
1029
|
title: "Choose your recorder (Lokalisiert)",
|
|
@@ -1223,9 +1226,9 @@ Alle sichtbaren Änderungen für Clips-Nutzer werden hier dokumentiert. Du kanns
|
|
|
1223
1226
|
downloadRecording: "Download recording (Lokalisiert)",
|
|
1224
1227
|
openRecorderInTab: "Open recorder in tab (Lokalisiert)",
|
|
1225
1228
|
connectStorageToFinish:
|
|
1226
|
-
"
|
|
1229
|
+
"Verbinde Speicher im nächsten Bildschirm: Builder.io (Speicher + KI im kostenlosen Tarif) oder S3-kompatibler Speicher. Clips schließt das Speichern ab.",
|
|
1227
1230
|
connectStorageToRetryLoom:
|
|
1228
|
-
"
|
|
1231
|
+
"Verbinde Speicher im nächsten Bildschirm: Builder.io (Speicher + KI im kostenlosen Tarif) oder S3-kompatibler Speicher. Clips versucht den Import erneut.",
|
|
1229
1232
|
},
|
|
1230
1233
|
dictateRoute: {
|
|
1231
1234
|
pageTitle: "Dictate · Clips (Lokalisiert)",
|
|
@@ -117,7 +117,7 @@ const messages = {
|
|
|
117
117
|
backToLibrary: "Back to library",
|
|
118
118
|
storageStillDisconnected: "Storage still isn't connected",
|
|
119
119
|
finishBuilderOrS3:
|
|
120
|
-
"Finish the Builder.io popup or configure S3 storage, then try again.",
|
|
120
|
+
"Finish the Builder.io popup or configure S3-compatible storage, then try again.",
|
|
121
121
|
loomImportResumed: "Loom import resumed",
|
|
122
122
|
clipUploadResumed: "Clip upload resumed",
|
|
123
123
|
couldNotRetryLoom: "Couldn't retry Loom import",
|
|
@@ -151,9 +151,9 @@ const messages = {
|
|
|
151
151
|
savingWentWrong: "Something went wrong while saving this clip.",
|
|
152
152
|
finishingClip: "Finishing up your clip…",
|
|
153
153
|
loomSourcePreserved:
|
|
154
|
-
"The Loom source link is preserved. Connect Builder.io or S3 storage and Clips will retry saving its own copy.",
|
|
154
|
+
"The Loom source link is preserved. Connect storage with Builder.io (free tier storage + AI) or S3-compatible storage, and Clips will retry saving its own copy.",
|
|
155
155
|
clipDataPreserved:
|
|
156
|
-
"Your clip data is still preserved. Connect Builder.io or S3 storage and Clips will upload it automatically.",
|
|
156
|
+
"Your clip data is still preserved. Connect storage with Builder.io (free tier storage + AI) or S3-compatible storage, and Clips will upload it automatically.",
|
|
157
157
|
details: "Details",
|
|
158
158
|
importingLoom: "Importing Loom...",
|
|
159
159
|
uploadingSavedClip: "Uploading saved clip…",
|
|
@@ -230,13 +230,13 @@ const messages = {
|
|
|
230
230
|
savingWentWrong: "Something went wrong while saving this clip.",
|
|
231
231
|
finishingClip: "Finishing up this clip...",
|
|
232
232
|
loomPreservedManage:
|
|
233
|
-
"The Loom source link is preserved. Connect Builder.io or S3 storage, then retry the import.",
|
|
233
|
+
"The Loom source link is preserved. Connect storage with Builder.io (free tier storage + AI) or S3-compatible storage, then retry the import.",
|
|
234
234
|
videoPreservedManage:
|
|
235
|
-
"The video is preserved. Connect Builder.io or S3 storage and Clips will finish uploading it.",
|
|
235
|
+
"The video is preserved. Connect storage with Builder.io (free tier storage + AI) or S3-compatible storage, and Clips will finish uploading it.",
|
|
236
236
|
creatorNeedsStorage:
|
|
237
|
-
"The creator needs to connect Builder.io
|
|
237
|
+
"The creator needs to connect storage before this clip can finish: Builder.io (free tier storage + AI) or S3-compatible storage.",
|
|
238
238
|
signInStorage:
|
|
239
|
-
"If this is your clip, sign in here to connect Builder.io or S3 storage and finish the upload.",
|
|
239
|
+
"If this is your clip, sign in here to connect storage with Builder.io (free tier storage + AI) or S3-compatible storage and finish the upload.",
|
|
240
240
|
uploadNotCompleteSession:
|
|
241
241
|
"The upload has not completed yet. Open the dashboard for this clip or ask the creator to check storage.",
|
|
242
242
|
uploadNotCompleteSignIn:
|
|
@@ -343,7 +343,7 @@ const messages = {
|
|
|
343
343
|
cleanupBuilderFailed:
|
|
344
344
|
"Cleanup could not finish even though Builder.io is connected. Native transcript was kept.",
|
|
345
345
|
cleanupPaused:
|
|
346
|
-
"Cleanup is paused. Connect Builder.io
|
|
346
|
+
"Cleanup is paused. Connect AI in Settings: Builder.io (free credits) or your own LLM key.",
|
|
347
347
|
builderNoResponse:
|
|
348
348
|
"Didn't hear back from Builder. Allow popups and try again.",
|
|
349
349
|
saveFailed: "Save failed ({{status}})",
|
|
@@ -584,7 +584,7 @@ All notable user-facing changes to Clips are documented here. Open it any time f
|
|
|
584
584
|
"Builder.io is the primary storage path for Clips uploads. S3 is available when you need to bring your own bucket.",
|
|
585
585
|
checkingBuilder: "Checking Builder.io",
|
|
586
586
|
builderConnected: "Builder.io connected",
|
|
587
|
-
connectBuilder: "
|
|
587
|
+
connectBuilder: "Use Builder.io (free)",
|
|
588
588
|
builderConnectedFor: "Using Builder.io for {{orgName}}.",
|
|
589
589
|
builderConnectedGeneric: "New clips use the connected Builder.io provider.",
|
|
590
590
|
builderIncludes:
|
|
@@ -610,12 +610,12 @@ All notable user-facing changes to Clips are documented here. Open it any time f
|
|
|
610
610
|
s3PublicBaseUrlLabel: "Public base URL",
|
|
611
611
|
apiSetup: "AI setup",
|
|
612
612
|
apiSetupDescription:
|
|
613
|
-
"Builder.io
|
|
614
|
-
builderEasySetup: "Builder.io
|
|
613
|
+
"Connect AI with Builder.io free credits or your own LLM keys.",
|
|
614
|
+
builderEasySetup: "Builder.io free credits",
|
|
615
615
|
builderAiAvailable:
|
|
616
616
|
"Included AI credits and managed transcription are available for Clips.",
|
|
617
617
|
builderAiDescription:
|
|
618
|
-
"
|
|
618
|
+
"Use Builder.io first for included AI credits, object storage, uploads, and managed transcription.",
|
|
619
619
|
providerKeyTitle: "Bring your own provider key",
|
|
620
620
|
providerKeyDescription:
|
|
621
621
|
"Add Anthropic, OpenAI, Gemini, Groq, or OpenRouter keys for provider-billed usage.",
|
|
@@ -760,7 +760,7 @@ All notable user-facing changes to Clips are documented here. Open it any time f
|
|
|
760
760
|
pickAtLeastTwo: "Pick at least 2 recordings to stitch together",
|
|
761
761
|
videoUrlMissing: "One or more recordings don't have a ready video URL yet",
|
|
762
762
|
connectStorage:
|
|
763
|
-
"Connect Builder.io or S3-compatible storage
|
|
763
|
+
"Connect storage before stitching recordings: Builder.io (free tier storage + AI) or S3-compatible storage.",
|
|
764
764
|
created: "Stitched recording created",
|
|
765
765
|
failed: "Failed to stitch recordings",
|
|
766
766
|
noOtherRecordings: "No other recordings available.",
|
|
@@ -988,9 +988,12 @@ All notable user-facing changes to Clips are documented here. Open it any time f
|
|
|
988
988
|
"Didn't hear back from Builder in 5 minutes. Check the popup and try again.",
|
|
989
989
|
builderConnected: "Builder.io connected",
|
|
990
990
|
waitingForBuilder: "Waiting for Builder...",
|
|
991
|
-
connectBuilder: "
|
|
991
|
+
connectBuilder: "Use Builder.io (free)",
|
|
992
992
|
free: "Free",
|
|
993
993
|
configureS3: "configure S3-compatible storage",
|
|
994
|
+
whyPrompt: "Why am I seeing this?",
|
|
995
|
+
whyDescription:
|
|
996
|
+
"Clips is 100% free and open source, so you need to hook up a way to store clips. Connect storage with Builder.io for free-tier storage and AI, or use S3-compatible object storage and your own LLM keys.",
|
|
994
997
|
},
|
|
995
998
|
captureInstall: {
|
|
996
999
|
title: "Choose your recorder",
|
|
@@ -1187,9 +1190,9 @@ All notable user-facing changes to Clips are documented here. Open it any time f
|
|
|
1187
1190
|
downloadRecording: "Download recording",
|
|
1188
1191
|
openRecorderInTab: "Open recorder in tab",
|
|
1189
1192
|
connectStorageToFinish:
|
|
1190
|
-
"Connect Builder.io
|
|
1193
|
+
"Connect storage on the next screen: Builder.io (free tier storage + AI) or S3-compatible storage. Clips will finish saving it.",
|
|
1191
1194
|
connectStorageToRetryLoom:
|
|
1192
|
-
"Connect Builder.io
|
|
1195
|
+
"Connect storage on the next screen: Builder.io (free tier storage + AI) or S3-compatible storage. Clips will retry the import.",
|
|
1193
1196
|
},
|
|
1194
1197
|
dictateRoute: {
|
|
1195
1198
|
pageTitle: "Dictate · Clips",
|
|
@@ -355,7 +355,7 @@ const messages = {
|
|
|
355
355
|
cleanupBuilderFailed:
|
|
356
356
|
"La limpieza no pudo finalizar aunque Builder.io esté conectado. Se mantuvo la transcripción nativa.",
|
|
357
357
|
cleanupPaused:
|
|
358
|
-
"La limpieza está en pausa. Conecte Builder.io
|
|
358
|
+
"La limpieza está en pausa. Conecte IA en Configuración: Builder.io (créditos gratis) o su propia clave LLM.",
|
|
359
359
|
builderNoResponse:
|
|
360
360
|
"No recibí respuesta del constructor. Permita ventanas emergentes e inténtelo de nuevo.",
|
|
361
361
|
saveFailed: "Error al guardar ({{status}})",
|
|
@@ -600,7 +600,7 @@ Todos los cambios visibles para los usuarios de Clips se documentan aquí. Puede
|
|
|
600
600
|
"Builder.io es la ruta principal de almacenamiento para las subidas de Clips. S3 está disponible si necesitas usar tu propio bucket.",
|
|
601
601
|
checkingBuilder: "Comprobando Builder.io",
|
|
602
602
|
builderConnected: "Builder.io conectado",
|
|
603
|
-
connectBuilder: "
|
|
603
|
+
connectBuilder: "Usar Builder.io (gratis)",
|
|
604
604
|
builderConnectedFor: "Usando Builder.io para {{orgName}}.",
|
|
605
605
|
builderConnectedGeneric:
|
|
606
606
|
"Los clips nuevos usan el proveedor Builder.io conectado.",
|
|
@@ -627,12 +627,12 @@ Todos los cambios visibles para los usuarios de Clips se documentan aquí. Puede
|
|
|
627
627
|
s3PublicBaseUrlLabel: "URL base pública",
|
|
628
628
|
apiSetup: "Configuración de IA",
|
|
629
629
|
apiSetupDescription:
|
|
630
|
-
"
|
|
631
|
-
builderEasySetup: "Builder.io
|
|
630
|
+
"Conecta IA con créditos gratis de Builder.io o tus propias claves LLM.",
|
|
631
|
+
builderEasySetup: "Créditos gratis de Builder.io",
|
|
632
632
|
builderAiAvailable:
|
|
633
633
|
"Los créditos de IA incluidos y la transcripción gestionada están disponibles para Clips.",
|
|
634
634
|
builderAiDescription:
|
|
635
|
-
"
|
|
635
|
+
"Usa Builder.io primero para créditos de IA incluidos, almacenamiento de objetos, subidas y transcripción gestionada.",
|
|
636
636
|
providerKeyTitle: "Usar tu propia clave de proveedor",
|
|
637
637
|
providerKeyDescription:
|
|
638
638
|
"Añade claves de Anthropic, OpenAI, Gemini, Groq u OpenRouter para uso facturado por proveedor.",
|
|
@@ -780,7 +780,7 @@ Todos los cambios visibles para los usuarios de Clips se documentan aquí. Puede
|
|
|
780
780
|
videoUrlMissing:
|
|
781
781
|
"Una o más grabaciones aún no tienen una URL de video lista",
|
|
782
782
|
connectStorage:
|
|
783
|
-
"Conecta Builder.io o almacenamiento compatible con S3
|
|
783
|
+
"Conecta almacenamiento antes de unir grabaciones: Builder.io (almacenamiento + IA en el plan gratuito) o almacenamiento compatible con S3.",
|
|
784
784
|
created: "Grabación unida creada",
|
|
785
785
|
failed: "No se pudieron unir las grabaciones",
|
|
786
786
|
noOtherRecordings: "No hay otras grabaciones disponibles.",
|
|
@@ -1010,9 +1010,12 @@ Todos los cambios visibles para los usuarios de Clips se documentan aquí. Puede
|
|
|
1010
1010
|
"No hubo respuesta de Builder en 5 minutos. Revisa la ventana emergente e inténtalo de nuevo.",
|
|
1011
1011
|
builderConnected: "Builder.io conectado",
|
|
1012
1012
|
waitingForBuilder: "Esperando a Builder...",
|
|
1013
|
-
connectBuilder: "
|
|
1013
|
+
connectBuilder: "Usar Builder.io (gratis)",
|
|
1014
1014
|
free: "Gratis",
|
|
1015
1015
|
configureS3: "configurar almacenamiento compatible con S3",
|
|
1016
|
+
whyPrompt: "¿Por qué veo esto?",
|
|
1017
|
+
whyDescription:
|
|
1018
|
+
"Clips es 100% gratis y de código abierto, así que necesitas conectar una forma de almacenar clips. Conecta almacenamiento con Builder.io para almacenamiento e IA en el plan gratuito, o usa almacenamiento compatible con S3 y tus propias claves LLM.",
|
|
1016
1019
|
},
|
|
1017
1020
|
captureInstall: {
|
|
1018
1021
|
title: "Choose your recorder (Localizado)",
|
|
@@ -1215,9 +1218,9 @@ Todos los cambios visibles para los usuarios de Clips se documentan aquí. Puede
|
|
|
1215
1218
|
downloadRecording: "Download recording (Localizado)",
|
|
1216
1219
|
openRecorderInTab: "Open recorder in tab (Localizado)",
|
|
1217
1220
|
connectStorageToFinish:
|
|
1218
|
-
"
|
|
1221
|
+
"Conecta almacenamiento en la siguiente pantalla: Builder.io (almacenamiento + IA en el plan gratuito) o almacenamiento compatible con S3. Clips terminará de guardarlo.",
|
|
1219
1222
|
connectStorageToRetryLoom:
|
|
1220
|
-
"
|
|
1223
|
+
"Conecta almacenamiento en la siguiente pantalla: Builder.io (almacenamiento + IA en el plan gratuito) o almacenamiento compatible con S3. Clips reintentará la importación.",
|
|
1221
1224
|
},
|
|
1222
1225
|
dictateRoute: {
|
|
1223
1226
|
pageTitle: "Dictate · Clips (Localizado)",
|
|
@@ -355,7 +355,7 @@ const messages = {
|
|
|
355
355
|
cleanupBuilderFailed:
|
|
356
356
|
"Le nettoyage n'a pas pu se terminer même si Builder.io est connecté. La transcription native a été conservée.",
|
|
357
357
|
cleanupPaused:
|
|
358
|
-
"Le nettoyage est suspendu. Connectez Builder.io
|
|
358
|
+
"Le nettoyage est suspendu. Connectez l’IA dans Paramètres : Builder.io (crédits gratuits) ou votre propre clé LLM.",
|
|
359
359
|
builderNoResponse:
|
|
360
360
|
"Je n'ai pas eu de réponse de Builder. Autorisez les fenêtres contextuelles et réessayez.",
|
|
361
361
|
saveFailed: "Échec de l'enregistrement ({{status}})",
|
|
@@ -600,7 +600,7 @@ Tous les changements visibles par les utilisateurs de Clips sont documentés ici
|
|
|
600
600
|
"Builder.io est le chemin de stockage principal pour les téléversements Clips. S3 est disponible si vous devez utiliser votre propre bucket.",
|
|
601
601
|
checkingBuilder: "Vérification de Builder.io",
|
|
602
602
|
builderConnected: "Builder.io connecté",
|
|
603
|
-
connectBuilder: "
|
|
603
|
+
connectBuilder: "Utiliser Builder.io (gratuit)",
|
|
604
604
|
builderConnectedFor: "Utilisation de Builder.io pour {{orgName}}.",
|
|
605
605
|
builderConnectedGeneric:
|
|
606
606
|
"Les nouveaux clips utilisent le fournisseur Builder.io connecté.",
|
|
@@ -628,12 +628,12 @@ Tous les changements visibles par les utilisateurs de Clips sont documentés ici
|
|
|
628
628
|
s3PublicBaseUrlLabel: "URL de base publique",
|
|
629
629
|
apiSetup: "Configuration IA",
|
|
630
630
|
apiSetupDescription:
|
|
631
|
-
"
|
|
632
|
-
builderEasySetup: "Builder.io
|
|
631
|
+
"Connectez l’IA avec les crédits gratuits Builder.io ou vos propres clés LLM.",
|
|
632
|
+
builderEasySetup: "Crédits gratuits Builder.io",
|
|
633
633
|
builderAiAvailable:
|
|
634
634
|
"Les crédits IA inclus et la transcription gérée sont disponibles pour Clips.",
|
|
635
635
|
builderAiDescription:
|
|
636
|
-
"
|
|
636
|
+
"Utilisez d’abord Builder.io pour les crédits IA inclus, le stockage objet, les téléversements et la transcription gérée.",
|
|
637
637
|
providerKeyTitle: "Utiliser votre propre clé fournisseur",
|
|
638
638
|
providerKeyDescription:
|
|
639
639
|
"Ajoutez des clés Anthropic, OpenAI, Gemini, Groq ou OpenRouter pour une utilisation facturée par fournisseur.",
|
|
@@ -782,7 +782,7 @@ Tous les changements visibles par les utilisateurs de Clips sont documentés ici
|
|
|
782
782
|
videoUrlMissing:
|
|
783
783
|
"Un ou plusieurs enregistrements n’ont pas encore d’URL vidéo prête",
|
|
784
784
|
connectStorage:
|
|
785
|
-
"Connectez
|
|
785
|
+
"Connectez le stockage avant d’assembler des enregistrements : Builder.io (stockage + IA sur l’offre gratuite) ou stockage compatible S3.",
|
|
786
786
|
created: "Enregistrement assemblé créé",
|
|
787
787
|
failed: "Échec de l’assemblage des enregistrements",
|
|
788
788
|
noOtherRecordings: "Aucun autre enregistrement disponible.",
|
|
@@ -1012,9 +1012,12 @@ Tous les changements visibles par les utilisateurs de Clips sont documentés ici
|
|
|
1012
1012
|
"Aucune réponse de Builder après 5 minutes. Vérifiez la fenêtre contextuelle et réessayez.",
|
|
1013
1013
|
builderConnected: "Builder.io connecté",
|
|
1014
1014
|
waitingForBuilder: "En attente de Builder...",
|
|
1015
|
-
connectBuilder: "
|
|
1015
|
+
connectBuilder: "Utiliser Builder.io (gratuit)",
|
|
1016
1016
|
free: "Gratuit",
|
|
1017
1017
|
configureS3: "configurer un stockage compatible S3",
|
|
1018
|
+
whyPrompt: "Pourquoi vois-je ceci ?",
|
|
1019
|
+
whyDescription:
|
|
1020
|
+
"Clips est 100 % gratuit et open source, vous devez donc connecter un moyen de stocker vos clips. Connectez le stockage avec Builder.io pour le stockage et l’IA sur l’offre gratuite, ou utilisez un stockage compatible S3 et vos propres clés LLM.",
|
|
1018
1021
|
},
|
|
1019
1022
|
captureInstall: {
|
|
1020
1023
|
title: "Choose your recorder (Localisé)",
|
|
@@ -1217,9 +1220,9 @@ Tous les changements visibles par les utilisateurs de Clips sont documentés ici
|
|
|
1217
1220
|
downloadRecording: "Download recording (Localisé)",
|
|
1218
1221
|
openRecorderInTab: "Open recorder in tab (Localisé)",
|
|
1219
1222
|
connectStorageToFinish:
|
|
1220
|
-
"
|
|
1223
|
+
"Connectez le stockage sur l’écran suivant : Builder.io (stockage + IA sur l’offre gratuite) ou stockage compatible S3. Clips terminera l’enregistrement.",
|
|
1221
1224
|
connectStorageToRetryLoom:
|
|
1222
|
-
"
|
|
1225
|
+
"Connectez le stockage sur l’écran suivant : Builder.io (stockage + IA sur l’offre gratuite) ou stockage compatible S3. Clips relancera l’import.",
|
|
1223
1226
|
},
|
|
1224
1227
|
dictateRoute: {
|
|
1225
1228
|
pageTitle: "Dictate · Clips (Localisé)",
|