@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.
Files changed (97) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +19 -0
  3. package/corpus/core/docs/content/locales/zh-TW/durable-background-runs.md +74 -0
  4. package/corpus/core/package.json +1 -1
  5. package/corpus/core/src/agent/production-agent.ts +0 -93
  6. package/corpus/core/src/agent/run-manager.ts +9 -1
  7. package/corpus/core/src/client/agent-chat-adapter.ts +24 -16
  8. package/corpus/core/src/client/session-replay.ts +67 -13
  9. package/corpus/core/src/onboarding/default-steps.ts +3 -3
  10. package/corpus/core/src/server/agent-chat-plugin.ts +82 -162
  11. package/corpus/core/src/server/agent-run-context.ts +204 -0
  12. package/corpus/core/src/server/credential-provider.ts +20 -4
  13. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +14 -4
  14. package/corpus/templates/analytics/changelog/2026-06-26-session-replay-uploads-now-accept-compressed-payloads-so-lar.md +6 -0
  15. package/corpus/templates/analytics/changelog/2026-06-26-sql-chart-tooltips-now-stay-stable-while-moving-across-dense.md +6 -0
  16. package/corpus/templates/analytics/server/handlers/session-replay.ts +56 -8
  17. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +1 -1
  18. package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +44 -16
  19. package/corpus/templates/clips/app/i18n/ar-SA.ts +12 -9
  20. package/corpus/templates/clips/app/i18n/de-DE.ts +12 -9
  21. package/corpus/templates/clips/app/i18n/en-US.ts +19 -16
  22. package/corpus/templates/clips/app/i18n/es-ES.ts +12 -9
  23. package/corpus/templates/clips/app/i18n/fr-FR.ts +12 -9
  24. package/corpus/templates/clips/app/i18n/hi-IN.ts +13 -9
  25. package/corpus/templates/clips/app/i18n/ja-JP.ts +12 -9
  26. package/corpus/templates/clips/app/i18n/ko-KR.ts +12 -9
  27. package/corpus/templates/clips/app/i18n/pt-BR.ts +12 -9
  28. package/corpus/templates/clips/app/i18n/zh-CN.ts +19 -14
  29. package/corpus/templates/clips/app/i18n/zh-TW.ts +19 -14
  30. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +7 -0
  31. package/corpus/templates/clips/app/routes/record.tsx +2 -2
  32. package/corpus/templates/clips/changelog/2026-06-26-desktop-recordings-recover-more-reliably-when-macos-reports-.md +6 -0
  33. package/corpus/templates/clips/changelog/2026-06-26-slack-unfurls-now-recognize-recording-dashboard-links-pasted.md +6 -0
  34. package/corpus/templates/clips/changelog/2026-06-26-storage-setup-now-explains-why-clips-needs-connected-storage.md +6 -0
  35. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  36. package/corpus/templates/clips/chrome-extension/src/background.ts +24 -3
  37. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +28 -2
  38. package/corpus/templates/clips/chrome-extension/src/popup.html +16 -0
  39. package/corpus/templates/clips/chrome-extension/src/popup.ts +59 -7
  40. package/corpus/templates/clips/chrome-extension/src/sentry.ts +28 -1
  41. package/corpus/templates/clips/chrome-extension/src/styles.css +74 -0
  42. package/corpus/templates/clips/desktop/src/app.tsx +85 -18
  43. package/corpus/templates/clips/desktop/src/styles.css +55 -0
  44. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +88 -51
  45. package/corpus/templates/clips/desktop/src-tauri/src/native_speech.rs +12 -3
  46. package/corpus/templates/clips/server/lib/slack-unfurls.ts +5 -2
  47. package/corpus/templates/slides/actions/_app-url.ts +1 -1
  48. package/corpus/templates/slides/changelog/2026-06-26-deck-links-now-use-the-workspace-gateway-when-available-so-g.md +6 -0
  49. package/dist/agent/production-agent.d.ts.map +1 -1
  50. package/dist/agent/production-agent.js +0 -79
  51. package/dist/agent/production-agent.js.map +1 -1
  52. package/dist/agent/run-manager.d.ts.map +1 -1
  53. package/dist/agent/run-manager.js +12 -1
  54. package/dist/agent/run-manager.js.map +1 -1
  55. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  56. package/dist/client/agent-chat-adapter.js +15 -8
  57. package/dist/client/agent-chat-adapter.js.map +1 -1
  58. package/dist/client/session-replay.d.ts.map +1 -1
  59. package/dist/client/session-replay.js +55 -14
  60. package/dist/client/session-replay.js.map +1 -1
  61. package/dist/collab/awareness.d.ts +2 -2
  62. package/dist/collab/awareness.d.ts.map +1 -1
  63. package/dist/collab/routes.d.ts +2 -2
  64. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  65. package/dist/notifications/routes.d.ts +1 -1
  66. package/dist/observability/routes.d.ts +7 -7
  67. package/dist/onboarding/default-steps.js +3 -3
  68. package/dist/onboarding/default-steps.js.map +1 -1
  69. package/dist/progress/routes.d.ts +1 -1
  70. package/dist/resources/handlers.d.ts +3 -3
  71. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  72. package/dist/server/agent-chat-plugin.js +69 -154
  73. package/dist/server/agent-chat-plugin.js.map +1 -1
  74. package/dist/server/agent-engine-api-key-route.d.ts +2 -2
  75. package/dist/server/agent-run-context.d.ts +35 -0
  76. package/dist/server/agent-run-context.d.ts.map +1 -0
  77. package/dist/server/agent-run-context.js +137 -0
  78. package/dist/server/agent-run-context.js.map +1 -0
  79. package/dist/server/credential-provider.d.ts.map +1 -1
  80. package/dist/server/credential-provider.js +15 -4
  81. package/dist/server/credential-provider.js.map +1 -1
  82. package/dist/server/transcribe-voice.d.ts +1 -1
  83. package/docs/content/locales/zh-TW/durable-background-runs.md +74 -0
  84. package/package.json +1 -1
  85. package/corpus/templates/.retired/README.md +0 -9
  86. package/corpus/templates/.retired/calls/package.json +0 -8
  87. package/corpus/templates/.retired/code/package.json +0 -8
  88. package/corpus/templates/.retired/contracts/package.json +0 -8
  89. package/corpus/templates/.retired/images/package.json +0 -8
  90. package/corpus/templates/.retired/issues/package.json +0 -8
  91. package/corpus/templates/.retired/meeting-notes/package.json +0 -8
  92. package/corpus/templates/.retired/migration/package.json +0 -8
  93. package/corpus/templates/.retired/recruiting/package.json +0 -8
  94. package/corpus/templates/.retired/scheduling/package.json +0 -8
  95. package/corpus/templates/.retired/visual-plans/package.json +0 -8
  96. package/corpus/templates/.retired/voice/package.json +0 -8
  97. package/corpus/templates/.retired/workbench/package.json +0 -8
@@ -1,9 +1,11 @@
1
- import { readBody } from "@agent-native/core/server";
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 requestByteLength(body: unknown): number {
80
- if (typeof body === "string") return Buffer.byteLength(body, "utf8");
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 Buffer.byteLength(JSON.stringify(body), "utf8");
119
+ return { body: JSON.parse(text), requestBytes };
83
120
  } catch {
84
- return 0;
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 = await readBody(event);
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: requestByteLength(rawBody),
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
- : "Connect Builder.io"}
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
- <div className="flex items-center gap-3 border-t border-border pt-4">
177
- <IconServer className="h-4 w-4 text-muted-foreground" />
178
- <div className="flex-1">
179
- <span className="text-sm text-muted-foreground">
180
- Or{" "}
181
- <a
182
- href={appPath("/settings#video-storage")}
183
- className="font-medium text-foreground underline underline-offset-2 hover:text-foreground/80"
184
- >
185
- {t("storageSetup.configureS3")}
186
- </a>
187
- </span>
188
- <span className="mt-0.5 block text-[11px] text-muted-foreground">
189
- AWS S3, Cloudflare R2, DigitalOcean Spaces, MinIO
190
- </span>
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
- </div>
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
- "تم إيقاف عملية التنظيف مؤقتًا. قم بتوصيل Builder.io في الإعدادات لتمكينه.",
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: "اتصال Builder.io",
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
- "Builder.io هو المسار الافتراضي لاعتمادات الذكاء الاصطناعي المُدارة. مفاتيح المزود اختيارية ويمكن إضافتها هنا.",
614
- builderEasySetup: "Builder.io هو أسهل إعداد",
613
+ "صِل الذكاء الاصطناعي باستخدام أرصدة Builder.io المجانية أو مفاتيح LLM الخاصة بك.",
614
+ builderEasySetup: "أرصدة Builder.io مجانية",
615
615
  builderAiAvailable:
616
616
  "تتوفر اعتمادات الذكاء الاصطناعي المضمنة والنسخ المُدار لـ Clips.",
617
617
  builderAiDescription:
618
- "اتصل بـ Builder أولًا لاستخدام اعتمادات الذكاء الاصطناعي المضمنة وتخزين الكائنات والرفع والنسخ المُدار.",
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
- "قم بتوصيل Builder.io أو تخزين متوافق مع S3 قبل دمج التسجيلات.",
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: "اتصال بـ Builder.io",
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
- "Connect Builder.io or S3 storage on the next screen and Clips will finish saving it. (مترجم)",
1199
+ "صِل التخزين في الشاشة التالية: Builder.io (تخزين + ذكاء اصطناعي في الخطة المجانية) أو تخزين متوافق مع S3. سيكمل Clips الحفظ.",
1197
1200
  connectStorageToRetryLoom:
1198
- "Connect Builder.io or S3 storage on the next screen and Clips will retry the import. (مترجم)",
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. Verbinden Sie Builder.io in den Einstellungen, um es zu aktivieren.",
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 verbinden",
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
- "Builder.io ist der Standardpfad für verwaltete KI-Guthaben. Anbieter-Schlüssel sind optional und können hier hinzugefügt werden.",
639
- builderEasySetup: "Builder.io ist die einfachste Einrichtung",
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
- "Verbinde zuerst Builder, um enthaltene KI-Guthaben, Objektspeicher, Uploads und verwaltete Transkription zu nutzen.",
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-kompatiblen Speicher, bevor du Aufzeichnungen zusammenfügst.",
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 verbinden",
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
- "Connect Builder.io or S3 storage on the next screen and Clips will finish saving it. (Lokalisiert)",
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
- "Connect Builder.io or S3 storage on the next screen and Clips will retry the import. (Lokalisiert)",
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 or S3 storage before this clip can finish.",
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 in Settings to enable it.",
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: "Connect Builder.io",
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 is the default path for managed AI credits. Provider keys are optional and can be added here.",
614
- builderEasySetup: "Builder.io is the easiest setup",
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
- "Connect Builder first for included AI credits, object storage, uploads, and managed transcription.",
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 before stitching recordings.",
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: "Connect Builder.io",
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 or S3 storage on the next screen and Clips will finish saving it.",
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 or S3 storage on the next screen and Clips will retry the import.",
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 en Configuración para habilitarlo.",
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: "Conectar Builder.io",
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
- "Builder.io es la ruta predeterminada para créditos de IA gestionados. Las claves de proveedor son opcionales y pueden añadirse aquí.",
631
- builderEasySetup: "Builder.io es la configuración más sencilla",
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
- "Conecta Builder primero para usar créditos de IA incluidos, almacenamiento de objetos, subidas y transcripción gestionada.",
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 antes de unir grabaciones.",
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: "Conectar Builder.io",
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
- "Connect Builder.io or S3 storage on the next screen and Clips will finish saving it. (Localizado)",
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
- "Connect Builder.io or S3 storage on the next screen and Clips will retry the import. (Localizado)",
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 dans Paramètres pour l'activer.",
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: "Connecter Builder.io",
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
- "Builder.io est le chemin par défaut pour les crédits IA gérés. Les clés de fournisseur sont facultatives et peuvent être ajoutées ici.",
632
- builderEasySetup: "Builder.io est la configuration la plus simple",
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
- "Connectez Builder d’abord pour les crédits IA inclus, le stockage objet, les téléversements et la transcription gérée.",
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 Builder.io ou un stockage compatible S3 avant d’assembler des enregistrements.",
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: "Connecter Builder.io",
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
- "Connect Builder.io or S3 storage on the next screen and Clips will finish saving it. (Localisé)",
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
- "Connect Builder.io or S3 storage on the next screen and Clips will retry the import. (Localisé)",
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é)",