@agent-native/core-corpus 0.200.0 → 0.200.1-nightly-20261002213029
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 +1 -1
- package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/corpus/templates/analytics/CHANGELOG.md +1 -1
- package/corpus/templates/analytics/app/i18n/en-US.ts +3 -3
- package/corpus/templates/analytics/changelog/2026-06-29-set-up-session-replay-storage-from-settings-connect-builder-.md +1 -1
- package/corpus/templates/analytics/changelog/2026-10-02-builder-io-setup-now-explains-free-credits-and-the-existing-.md +6 -0
- package/corpus/templates/analytics/server/lib/replay-storage.ts +1 -1
- package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/corpus/templates/assets/app/i18n-data.ts +10 -10
- package/corpus/templates/assets/changelog/2026-10-02-builder-io-setup-copy-now-clarifies-account-use-and-availabl.md +6 -0
- package/corpus/templates/assets/server/lib/generation.ts +8 -8
- package/corpus/templates/assets/server/lib/storage.ts +1 -1
- package/corpus/templates/assets/server/plugins/onboarding.ts +3 -3
- package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/corpus/templates/brain/server/lib/privacy-readiness.ts +2 -2
- package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/corpus/templates/calendar/app/i18n/en-US.ts +1 -1
- package/corpus/templates/calendar/changelog/2026-10-02-builder-io-setup-copy-now-clarifies-account-activation-and-s.md +6 -0
- package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/corpus/templates/clips/CHANGELOG.md +1 -1
- package/corpus/templates/clips/actions/cleanup-transcript.ts +1 -1
- package/corpus/templates/clips/actions/create-meeting.ts +4 -5
- package/corpus/templates/clips/actions/create-recording.ts +9 -3
- package/corpus/templates/clips/actions/create-screenshot.ts +3 -2
- package/corpus/templates/clips/actions/import-loom-recording.ts +8 -8
- package/corpus/templates/clips/actions/set-thumbnail.ts +1 -1
- package/corpus/templates/clips/actions/stitch-recordings.ts +3 -2
- package/corpus/templates/clips/app/components/player/transcript-panel.tsx +5 -2
- package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +1 -9
- package/corpus/templates/clips/app/i18n/en-US.ts +17 -19
- package/corpus/templates/clips/app/lib/local-recording-upload.ts +1 -1
- package/corpus/templates/clips/app/lib/storage-failures.ts +1 -1
- package/corpus/templates/clips/app/routes/record.tsx +1 -1
- package/corpus/templates/clips/changelog/2026-09-25-one-click-builder-storage.md +1 -1
- package/corpus/templates/clips/changelog/2026-10-02-builder-io-setup-now-offers-one-click-activation-and-clear-e.md +6 -0
- package/corpus/templates/clips/changelog/2026-10-02-recording-visibility-settings-fail-clearly.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/background.ts +2 -2
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +2 -2
- package/corpus/templates/clips/chrome-extension/src/popup.html +2 -3
- package/corpus/templates/clips/chrome-extension/src/popup.ts +4 -4
- package/corpus/templates/clips/desktop/src/app.tsx +73 -10
- package/corpus/templates/clips/desktop/src/lib/builder-connection.ts +71 -0
- package/corpus/templates/clips/desktop/src/lib/recording-request.ts +1 -1
- package/corpus/templates/clips/server/lib/public-agent-context.ts +1 -1
- package/corpus/templates/clips/server/lib/recordings.ts +7 -8
- package/corpus/templates/clips/server/lib/video-storage.ts +1 -1
- package/corpus/templates/clips/server/plugins/onboarding.ts +1 -1
- package/corpus/templates/clips/server/routes/api/media/index.post.ts +1 -1
- package/corpus/templates/clips/shared/transcript-failure.ts +1 -1
- package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/corpus/templates/content/actions/transcribe-media.ts +4 -3
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +6 -1
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +1 -1
- package/corpus/templates/content/app/components/editor/database/settings.tsx +1 -1
- package/corpus/templates/content/app/i18n-data.ts +2 -2
- package/corpus/templates/content/app/lib/content-landing.ts +14 -0
- package/corpus/templates/content/app/lib/last-location-hint.ts +47 -0
- package/corpus/templates/content/app/lib/page-icon-row-hint.ts +8 -3
- package/corpus/templates/content/app/root.tsx +17 -0
- package/corpus/templates/content/app/routes/_app.home.tsx +20 -9
- package/corpus/templates/content/changelog/2026-10-01-home-opens-your-last-page-sooner.md +6 -0
- package/corpus/templates/content/changelog/2026-10-02-builder-io-setup-instructions-now-use-consistent-action-lang.md +6 -0
- package/corpus/templates/content/scripts/trace-startup.mjs +20 -1
- package/corpus/templates/content/server/plugins/onboarding.ts +2 -2
- package/corpus/templates/content/vitest.config.ts +3 -1
- package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/corpus/templates/design/CODE_NATIVE_DESIGN_STUDIO_IMPLEMENTATION_PLAN.md +2 -2
- package/corpus/templates/design/DESIGN-STUDIO-PLAN.md +5 -5
- package/corpus/templates/design/actions/apply-design-token-edit.ts +1 -1
- package/corpus/templates/design/actions/capture-design-state.ts +4 -3
- package/corpus/templates/design/actions/connect-builder-app.ts +2 -2
- package/corpus/templates/design/actions/create-design-branch.ts +2 -2
- package/corpus/templates/design/actions/create-fusion-app.ts +2 -2
- package/corpus/templates/design/actions/deploy-design-preview.ts +2 -2
- package/corpus/templates/design/actions/export-png.ts +1 -1
- package/corpus/templates/design/actions/get-component-details.ts +1 -1
- package/corpus/templates/design/actions/get-design-branch-diff.ts +1 -1
- package/corpus/templates/design/actions/index-components.ts +3 -3
- package/corpus/templates/design/actions/index-design-system-with-builder.ts +1 -1
- package/corpus/templates/design/actions/migrate-inline-design-to-app.ts +3 -3
- package/corpus/templates/design/actions/open-component-source.ts +1 -1
- package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +2 -2
- package/corpus/templates/design/app/i18n/en-US.ts +3 -3
- package/corpus/templates/design/app/pages/DesignEditor.tsx +1 -1
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +1 -1
- package/corpus/templates/design/changelog/2026-10-02-builder-io-setup-now-routes-account-activation-through-the-o.md +6 -0
- package/corpus/templates/design/scripts/qa-figma-stress-import.ts +1 -1
- package/corpus/templates/design/server/lib/figma-node-import.ts +1 -1
- package/corpus/templates/design/shared/design-source-capabilities.ts +9 -9
- package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/corpus/templates/forms/actions/export-responses.ts +1 -1
- package/corpus/templates/forms/server/handlers/uploads.ts +1 -1
- package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/corpus/templates/mail/app/i18n/en-US.ts +2 -2
- package/corpus/templates/mail/changelog/2026-10-02-builder-io-setup-copy-now-clarifies-the-account-action-and-a.md +6 -0
- package/corpus/templates/mail/server/lib/media-upload.ts +1 -1
- package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/corpus/templates/plan/server/lib/plan-assets.ts +1 -1
- package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/corpus/templates/slides/CHANGELOG.md +1 -0
- package/corpus/templates/slides/actions/generate-image-api.ts +4 -3
- package/corpus/templates/slides/actions/generate-slides-ai.ts +1 -1
- package/corpus/templates/slides/actions/import-google-slides-reference.ts +3 -1
- package/corpus/templates/slides/actions/index-design-system-with-builder.ts +1 -1
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +1 -1
- package/corpus/templates/slides/app/i18n/en-US.ts +6 -6
- package/corpus/templates/slides/app/lib/image-drop-to-agent.ts +3 -2
- package/corpus/templates/slides/changelog/2026-10-02-builder-io-setup-now-routes-account-activation-through-the-o.md +6 -0
- package/corpus/templates/slides/changelog/2026-10-02-google-slides-skipped-slides.md +6 -0
- package/corpus/templates/slides/changelog/2026-10-02-only-one-queued-message-action-menu-stays-open-at-a-time.md +6 -0
- package/corpus/templates/slides/server/handlers/assets.ts +1 -1
- package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
- package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +2 -2
- package/package.json +1 -1
package/corpus/README.md
CHANGED
|
@@ -364,7 +364,7 @@ optimistic action patterns. Do not add a parallel CRUD API route for an action.
|
|
|
364
364
|
## 4. Keep onboarding shared
|
|
365
365
|
|
|
366
366
|
Use the framework's existing setup experience. The app should offer the normal
|
|
367
|
-
“
|
|
367
|
+
“Use Builder.io” and “Add your own keys” paths for AI setup. Do not create a
|
|
368
368
|
second credential form or hardcode a provider key.
|
|
369
369
|
|
|
370
370
|
In local-development instructions, add a brief note that a developer can set
|
|
@@ -388,7 +388,7 @@ plain `pnpm dev` has the right first-run behavior without extra flags:
|
|
|
388
388
|
}
|
|
389
389
|
```
|
|
390
390
|
|
|
391
|
-
Either value keeps the shared
|
|
391
|
+
Either value keeps the shared Use Builder.io / Add your own keys choice
|
|
392
392
|
visible; only `"off"` disables first-run onboarding entirely. Do not replace
|
|
393
393
|
this with a local credential form or remove the shared onboarding.
|
|
394
394
|
|
|
@@ -962,7 +962,7 @@ time from the command menu (Cmd+K → "What's new") or from Settings.
|
|
|
962
962
|
|
|
963
963
|
- Agents can search and read connected GitHub repositories when auditing tracking events.
|
|
964
964
|
- Dashboards can now include extension panels that embed a sandboxed extension inline instead of a SQL chart
|
|
965
|
-
- Set up session replay storage from settings:
|
|
965
|
+
- Set up session replay storage from settings: use Builder.io or add S3-compatible storage
|
|
966
966
|
|
|
967
967
|
### Improved
|
|
968
968
|
|
|
@@ -361,9 +361,9 @@ export default {
|
|
|
361
361
|
notificationsSoundGroup: "Sound",
|
|
362
362
|
replayStorage: "Session replay storage",
|
|
363
363
|
replayStorageDescription:
|
|
364
|
-
"Session replay recordings need a configured file-upload provider.
|
|
364
|
+
"Session replay recordings need a configured file-upload provider. Use Builder.io for free-tier object storage, or use your own S3-compatible bucket.",
|
|
365
365
|
connected: "Connected",
|
|
366
|
-
connectBuilder: "
|
|
366
|
+
connectBuilder: "Use Builder.io",
|
|
367
367
|
checkingBuilder: "Checking Builder.io...",
|
|
368
368
|
builderConnected: "Builder.io connected",
|
|
369
369
|
builderConnectedToast: "Builder.io connected",
|
|
@@ -1537,7 +1537,7 @@ export default {
|
|
|
1537
1537
|
time: "Time",
|
|
1538
1538
|
storageSetupTitle: "Connect replay storage",
|
|
1539
1539
|
storageSetupDescription:
|
|
1540
|
-
"Session replay recordings need storage before chunks can be saved.
|
|
1540
|
+
"Session replay recordings need storage before chunks can be saved. Use Builder.io for free-tier storage, or configure your own S3-compatible bucket.",
|
|
1541
1541
|
storageConnected: "Storage connected",
|
|
1542
1542
|
connectBuilder: "Use Builder.io",
|
|
1543
1543
|
configureS3: "Configure S3 storage",
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "@agent-native/core/server";
|
|
7
7
|
|
|
8
8
|
export const REPLAY_STORAGE_SETUP_REQUIRED_REASON =
|
|
9
|
-
"Session replay storage is not connected yet.
|
|
9
|
+
"Session replay storage is not connected yet. Use Builder.io (free tier available) or configure S3-compatible storage to record replays.";
|
|
10
10
|
|
|
11
11
|
function appDatabaseUrl(): string {
|
|
12
12
|
const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, "_");
|
|
@@ -364,7 +364,7 @@ optimistic action patterns. Do not add a parallel CRUD API route for an action.
|
|
|
364
364
|
## 4. Keep onboarding shared
|
|
365
365
|
|
|
366
366
|
Use the framework's existing setup experience. The app should offer the normal
|
|
367
|
-
“
|
|
367
|
+
“Use Builder.io” and “Add your own keys” paths for AI setup. Do not create a
|
|
368
368
|
second credential form or hardcode a provider key.
|
|
369
369
|
|
|
370
370
|
In local-development instructions, add a brief note that a developer can set
|
|
@@ -388,7 +388,7 @@ plain `pnpm dev` has the right first-run behavior without extra flags:
|
|
|
388
388
|
}
|
|
389
389
|
```
|
|
390
390
|
|
|
391
|
-
Either value keeps the shared
|
|
391
|
+
Either value keeps the shared Use Builder.io / Add your own keys choice
|
|
392
392
|
visible; only `"off"` disables first-run onboarding entirely. Do not replace
|
|
393
393
|
this with a local credential form or remove the shared onboarding.
|
|
394
394
|
|
|
@@ -626,7 +626,7 @@ const enUS = {
|
|
|
626
626
|
"Get an email when a generation you started finishes or fails.",
|
|
627
627
|
builderDescriptionReady: "Connected for managed generation.",
|
|
628
628
|
builderDescriptionManaged:
|
|
629
|
-
"
|
|
629
|
+
"Use Builder.io for managed image generation and storage. Video generation is available when enabled for your space.",
|
|
630
630
|
builderDescriptionDisabled:
|
|
631
631
|
"Image generation is disabled here; Builder video may still be available.",
|
|
632
632
|
builderLookupFailed:
|
|
@@ -3972,7 +3972,7 @@ export const messagesByLocale = {
|
|
|
3972
3972
|
"此处已停用图像生成;Builder 视频生成功能仍可能可用。",
|
|
3973
3973
|
builderLookupFailed: "无法检查 Builder 访问权限。重试以刷新连接状态。",
|
|
3974
3974
|
builderDescriptionManaged:
|
|
3975
|
-
"
|
|
3975
|
+
"使用 Builder.io 即可使用托管图像生成和存储。若你的空间已启用视频生成功能,也可使用该功能。",
|
|
3976
3976
|
builderDescriptionReady: "连接管理一代。",
|
|
3977
3977
|
builderManaged:
|
|
3978
3978
|
"Builder 管理图像生成。若你的空间已启用视频生成功能,即可使用。",
|
|
@@ -4818,7 +4818,7 @@ export const messagesByLocale = {
|
|
|
4818
4818
|
builderLookupFailed:
|
|
4819
4819
|
"No se pudo comprobar el acceso a Builder. Vuelve a intentarlo para actualizar el estado de la conexión.",
|
|
4820
4820
|
builderDescriptionManaged:
|
|
4821
|
-
"
|
|
4821
|
+
"Usa Builder.io para la generación y el almacenamiento de imágenes gestionados. La generación de vídeo está disponible si se habilita para tu espacio.",
|
|
4822
4822
|
builderDescriptionReady: "Conectado para generación gestionada.",
|
|
4823
4823
|
builderManaged:
|
|
4824
4824
|
"Builder gestiona la generación de imágenes. La generación de vídeo está disponible si se habilita para tu espacio.",
|
|
@@ -5326,7 +5326,7 @@ export const messagesByLocale = {
|
|
|
5326
5326
|
builderLookupFailed:
|
|
5327
5327
|
"Impossible de vérifier l’accès à Builder. Réessayez pour actualiser l’état de la connexion.",
|
|
5328
5328
|
builderDescriptionManaged:
|
|
5329
|
-
"
|
|
5329
|
+
"Utilisez Builder.io pour gérer la génération et le stockage d’images. La génération vidéo est disponible si elle est activée pour votre espace.",
|
|
5330
5330
|
builderDescriptionReady: "Connecté pour une génération gérée.",
|
|
5331
5331
|
builderManaged:
|
|
5332
5332
|
"Builder gère la génération d’images. La génération vidéo est disponible si elle est activée pour votre espace.",
|
|
@@ -5816,7 +5816,7 @@ export const messagesByLocale = {
|
|
|
5816
5816
|
"Erhalte eine E-Mail, wenn eine von dir gestartete Generierung fertig ist oder fehlschlägt.",
|
|
5817
5817
|
builderDescriptionReady: "Für verwaltete Generierung verbunden.",
|
|
5818
5818
|
builderDescriptionManaged:
|
|
5819
|
-
"
|
|
5819
|
+
"Nutze Builder.io für verwaltete Bildgenerierung und Speicherung. Videogenerierung ist verfügbar, wenn sie für deinen Space aktiviert ist.",
|
|
5820
5820
|
builderDescriptionDisabled:
|
|
5821
5821
|
"Die Bildgenerierung ist hier deaktiviert; die Videogenerierung mit Builder kann weiterhin verfügbar sein.",
|
|
5822
5822
|
builderLookupFailed:
|
|
@@ -6205,7 +6205,7 @@ export const messagesByLocale = {
|
|
|
6205
6205
|
"開始した生成が完了または失敗したときにメールを受け取ります。",
|
|
6206
6206
|
builderDescriptionReady: "管理された生成に接続済みです。",
|
|
6207
6207
|
builderDescriptionManaged:
|
|
6208
|
-
"Builder
|
|
6208
|
+
"Builder.io を使うと、画像生成と保存を管理できます。動画生成はスペースで有効な場合に利用できます。",
|
|
6209
6209
|
builderDescriptionDisabled:
|
|
6210
6210
|
"ここでは画像生成が無効です。Builder の動画生成は引き続き利用できる場合があります。",
|
|
6211
6211
|
builderLookupFailed:
|
|
@@ -6590,7 +6590,7 @@ export const messagesByLocale = {
|
|
|
6590
6590
|
"내가 시작한 생성이 완료되거나 실패하면 이메일을 받습니다.",
|
|
6591
6591
|
builderDescriptionReady: "관리형 생성에 연결되었습니다.",
|
|
6592
6592
|
builderDescriptionManaged:
|
|
6593
|
-
"이미지 생성 및 저장을 관리하려면 Builder를
|
|
6593
|
+
"이미지 생성 및 저장을 관리하려면 Builder.io를 사용하세요. 동영상 생성은 워크스페이스에서 사용 설정된 경우 이용할 수 있습니다.",
|
|
6594
6594
|
builderDescriptionDisabled:
|
|
6595
6595
|
"여기서는 이미지 생성이 비활성화되어 있습니다. Builder 동영상 생성은 계속 사용할 수 있을 수 있습니다.",
|
|
6596
6596
|
builderLookupFailed:
|
|
@@ -6984,7 +6984,7 @@ export const messagesByLocale = {
|
|
|
6984
6984
|
builderLookupFailed:
|
|
6985
6985
|
"Não foi possível verificar o acesso ao Builder. Tente novamente para atualizar o estado da conexão.",
|
|
6986
6986
|
builderDescriptionManaged:
|
|
6987
|
-
"
|
|
6987
|
+
"Use o Builder.io para gerenciar a geração e o armazenamento de imagens. A geração de vídeo fica disponível quando ativada para seu espaço.",
|
|
6988
6988
|
builderDescriptionReady: "Conectado para geração gerenciada.",
|
|
6989
6989
|
builderManaged:
|
|
6990
6990
|
"O Builder gerencia a geração de imagens. A geração de vídeo fica disponível quando ativada para seu espaço.",
|
|
@@ -7467,7 +7467,7 @@ export const messagesByLocale = {
|
|
|
7467
7467
|
"आपके द्वारा शुरू किया गया जनरेशन पूरा या विफल होने पर ईमेल पाएँ।",
|
|
7468
7468
|
builderDescriptionReady: "Managed generation के लिए connected.",
|
|
7469
7469
|
builderDescriptionManaged:
|
|
7470
|
-
"प्रबंधित इमेज जनरेशन और स्टोरेज के लिए Builder
|
|
7470
|
+
"प्रबंधित इमेज जनरेशन और स्टोरेज के लिए Builder.io का उपयोग करें। वीडियो जनरेशन आपके स्पेस में सक्षम होने पर उपलब्ध है।",
|
|
7471
7471
|
builderDescriptionDisabled:
|
|
7472
7472
|
"यहां छवि निर्माण बंद है; Builder वीडियो निर्माण फिर भी उपलब्ध हो सकता है।",
|
|
7473
7473
|
builderLookupFailed:
|
|
@@ -7858,7 +7858,7 @@ export const messagesByLocale = {
|
|
|
7858
7858
|
builderLookupFailed:
|
|
7859
7859
|
"تعذّر التحقق من الوصول إلى Builder. أعد المحاولة لتحديث حالة الاتصال.",
|
|
7860
7860
|
builderDescriptionManaged:
|
|
7861
|
-
"
|
|
7861
|
+
"استخدم Builder.io لإدارة إنشاء الصور وتخزينها. يتوفر إنشاء الفيديو عند تفعيله لمساحتك.",
|
|
7862
7862
|
builderDescriptionReady: "متصل للجيل المدار.",
|
|
7863
7863
|
builderManaged:
|
|
7864
7864
|
"يدير Builder إنشاء الصور. يتوفر إنشاء الفيديو عند تفعيله لمساحتك.",
|
|
@@ -142,7 +142,7 @@ export async function getGeminiApiKey(): Promise<string> {
|
|
|
142
142
|
builderConnectUrl: "/_agent-native/builder/connect",
|
|
143
143
|
byokDocsUrl: "https://aistudio.google.com/apikey",
|
|
144
144
|
message:
|
|
145
|
-
"Asset generation is not configured. Open Settings and either click
|
|
145
|
+
"Asset generation is not configured. Open Settings and either click Use Builder.io (free tier available) for images, or expand the Asset generation setup step and paste a Gemini API key for videos and image fallback.",
|
|
146
146
|
});
|
|
147
147
|
}
|
|
148
148
|
return key;
|
|
@@ -161,7 +161,7 @@ async function getOpenAIImageApiKey(): Promise<string> {
|
|
|
161
161
|
builderConnectUrl: "/_agent-native/builder/connect",
|
|
162
162
|
byokDocsUrl: "https://platform.openai.com/api-keys",
|
|
163
163
|
message:
|
|
164
|
-
"Image generation is not configured. Open Settings and
|
|
164
|
+
"Image generation is not configured. Open Settings and use Builder.io (free tier available), or add an OpenAI or Gemini API key manually.",
|
|
165
165
|
});
|
|
166
166
|
}
|
|
167
167
|
return key;
|
|
@@ -272,7 +272,7 @@ export async function generateWithBuilderImageApi(
|
|
|
272
272
|
const builderAuth = await resolveBuilderGatewayAuth();
|
|
273
273
|
if (!builderAuth) {
|
|
274
274
|
throw new BuilderImageGenerationError(
|
|
275
|
-
"Builder.io is not connected for managed image generation.
|
|
275
|
+
"Builder.io is not connected for managed image generation. Use Builder.io (free tier available), or publish with Builder credits so the site is issued its own gateway credential.",
|
|
276
276
|
401,
|
|
277
277
|
);
|
|
278
278
|
}
|
|
@@ -735,7 +735,7 @@ function builderImageGenerationFallbackMessage(
|
|
|
735
735
|
if (input?.mode === "edit") {
|
|
736
736
|
switch (err.status) {
|
|
737
737
|
case 401:
|
|
738
|
-
return `Masked skeleton inpainting needs Builder.io connected or reconnected${err.detail ? ` (${err.detail})` : ""}. Open Settings and click
|
|
738
|
+
return `Masked skeleton inpainting needs Builder.io connected or reconnected${err.detail ? ` (${err.detail})` : ""}. Open Settings and click Use Builder.io (free tier available); manual OpenAI or Gemini fallback cannot pass image-edit masks.`;
|
|
739
739
|
case 402:
|
|
740
740
|
return `Builder.io is connected, but this Builder space cannot use managed image generation credits${detail} Masked skeleton inpainting cannot use manual OpenAI or Gemini fallback because it must pass an image-edit mask.`;
|
|
741
741
|
case 403:
|
|
@@ -751,7 +751,7 @@ function builderImageGenerationFallbackMessage(
|
|
|
751
751
|
}
|
|
752
752
|
switch (err.status) {
|
|
753
753
|
case 401:
|
|
754
|
-
return `Image generation needs Builder.io connected or reconnected${err.detail ? ` (${err.detail})` : ""}. Open Settings and click
|
|
754
|
+
return `Image generation needs Builder.io connected or reconnected${err.detail ? ` (${err.detail})` : ""}. Open Settings and click Use Builder.io (free tier available), or expand the Asset generation setup step and add an OpenAI or Gemini API key as the manual fallback.`;
|
|
755
755
|
case 402:
|
|
756
756
|
return `Builder.io is connected, but this Builder space cannot use managed image generation credits${detail} Open Builder space settings or reconnect to a space with image-generation credits, or add an OpenAI or Gemini API key as the manual fallback.`;
|
|
757
757
|
case 403:
|
|
@@ -972,7 +972,7 @@ async function generateWithManualImageProvider(
|
|
|
972
972
|
builderConnectUrl: "/_agent-native/builder/connect",
|
|
973
973
|
byokDocsUrl: "https://aistudio.google.com/apikey",
|
|
974
974
|
message:
|
|
975
|
-
"This preset attaches reference board images, which the manual OpenAI fallback cannot pass.
|
|
975
|
+
"This preset attaches reference board images, which the manual OpenAI fallback cannot pass. Use Builder.io managed generation (free tier available), or switch the preset to a Gemini model with a Gemini API key.",
|
|
976
976
|
});
|
|
977
977
|
}
|
|
978
978
|
if (await isGeminiImageGenerationConfigured()) {
|
|
@@ -984,7 +984,7 @@ async function generateWithManualImageProvider(
|
|
|
984
984
|
builderConnectUrl: "/_agent-native/builder/connect",
|
|
985
985
|
byokDocsUrl: "https://aistudio.google.com/apikey",
|
|
986
986
|
message:
|
|
987
|
-
"This preset attaches reference board images, which the manual OpenAI fallback cannot pass.
|
|
987
|
+
"This preset attaches reference board images, which the manual OpenAI fallback cannot pass. Use Builder.io managed generation (free tier available), or switch the preset to a Gemini model with a Gemini API key.",
|
|
988
988
|
});
|
|
989
989
|
}
|
|
990
990
|
if (input.intent === "restyle" || input.intent === "edit") {
|
|
@@ -1008,7 +1008,7 @@ export async function generateWithOpenAI(
|
|
|
1008
1008
|
builderConnectUrl: "/_agent-native/builder/connect",
|
|
1009
1009
|
byokDocsUrl: "https://aistudio.google.com/apikey",
|
|
1010
1010
|
message:
|
|
1011
|
-
"This preset attaches reference board images, which the manual OpenAI fallback cannot pass.
|
|
1011
|
+
"This preset attaches reference board images, which the manual OpenAI fallback cannot pass. Use Builder.io managed generation (free tier available), or switch the preset to a Gemini model with a Gemini API key.",
|
|
1012
1012
|
});
|
|
1013
1013
|
}
|
|
1014
1014
|
const startedAt = Date.now();
|
|
@@ -103,7 +103,7 @@ export async function putObject(input: {
|
|
|
103
103
|
|
|
104
104
|
if (process.env.NODE_ENV === "production") {
|
|
105
105
|
throw new Error(
|
|
106
|
-
"Asset storage is not configured.
|
|
106
|
+
"Asset storage is not configured. Use Builder.io (free tier available) in onboarding, set BUILDER_PRIVATE_KEY, or fill in the ASSETS_STORAGE_* secrets.",
|
|
107
107
|
);
|
|
108
108
|
}
|
|
109
109
|
const localPath = path.join(LOCAL_ROOT, input.key);
|
|
@@ -42,15 +42,15 @@ export default async (nitroApp: any): Promise<void> => {
|
|
|
42
42
|
required: true,
|
|
43
43
|
title: "Image and video generation",
|
|
44
44
|
description:
|
|
45
|
-
"
|
|
45
|
+
"Use Builder.io for managed image generation and video generation when enabled for your space, or add OpenAI/Gemini keys as manual fallbacks.",
|
|
46
46
|
methods: [
|
|
47
47
|
{
|
|
48
48
|
id: "builder",
|
|
49
49
|
kind: "builder-cli-auth",
|
|
50
|
-
label: "
|
|
50
|
+
label: "Use Builder.io",
|
|
51
51
|
description: builderImageGenerationEnabled
|
|
52
52
|
? "Recommended one-click setup for managed image generation and video generation when enabled for your space. Uses Builder credits and keeps provider keys out of this app."
|
|
53
|
-
: "Managed image generation is disabled here.
|
|
53
|
+
: "Managed image generation is disabled here. Use Builder.io for video when your space supports it, or add Gemini/OpenAI keys for manual generation.",
|
|
54
54
|
primary: true,
|
|
55
55
|
badge: builderImageGenerationEnabled ? "recommended" : undefined,
|
|
56
56
|
payload: { scope: "image-generation" },
|
|
@@ -364,7 +364,7 @@ optimistic action patterns. Do not add a parallel CRUD API route for an action.
|
|
|
364
364
|
## 4. Keep onboarding shared
|
|
365
365
|
|
|
366
366
|
Use the framework's existing setup experience. The app should offer the normal
|
|
367
|
-
“
|
|
367
|
+
“Use Builder.io” and “Add your own keys” paths for AI setup. Do not create a
|
|
368
368
|
second credential form or hardcode a provider key.
|
|
369
369
|
|
|
370
370
|
In local-development instructions, add a brief note that a developer can set
|
|
@@ -388,7 +388,7 @@ plain `pnpm dev` has the right first-run behavior without extra flags:
|
|
|
388
388
|
}
|
|
389
389
|
```
|
|
390
390
|
|
|
391
|
-
Either value keeps the shared
|
|
391
|
+
Either value keeps the shared Use Builder.io / Add your own keys choice
|
|
392
392
|
visible; only `"off"` disables first-run onboarding entirely. Do not replace
|
|
393
393
|
this with a local credential form or remove the shared onboarding.
|
|
394
394
|
|
|
@@ -55,7 +55,7 @@ export function brainPrivacyReadiness(
|
|
|
55
55
|
warning:
|
|
56
56
|
jevCredential === "unavailable"
|
|
57
57
|
? "The Jev credential lookup failed, so Brain is classifying with the approved model instead. Check JEV_API_KEY or the Builder connection."
|
|
58
|
-
: "Jev is selected but no credential was found, so Brain is classifying with the approved model instead. Add JEV_API_KEY or
|
|
58
|
+
: "Jev is selected but no credential was found, so Brain is classifying with the approved model instead. Add JEV_API_KEY or use Builder.io.",
|
|
59
59
|
};
|
|
60
60
|
}
|
|
61
61
|
return {
|
|
@@ -64,7 +64,7 @@ export function brainPrivacyReadiness(
|
|
|
64
64
|
warning:
|
|
65
65
|
jevCredential === "unavailable"
|
|
66
66
|
? "The Jev credential lookup failed and no approved model is configured. Uncertain captures stay quarantined until a classifier is reachable."
|
|
67
|
-
: "Jev is selected but no credential was found and no approved model is configured. Add JEV_API_KEY,
|
|
67
|
+
: "Jev is selected but no credential was found and no approved model is configured. Add JEV_API_KEY, use Builder.io, or configure an approved model.",
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
70
|
|
|
@@ -364,7 +364,7 @@ optimistic action patterns. Do not add a parallel CRUD API route for an action.
|
|
|
364
364
|
## 4. Keep onboarding shared
|
|
365
365
|
|
|
366
366
|
Use the framework's existing setup experience. The app should offer the normal
|
|
367
|
-
“
|
|
367
|
+
“Use Builder.io” and “Add your own keys” paths for AI setup. Do not create a
|
|
368
368
|
second credential form or hardcode a provider key.
|
|
369
369
|
|
|
370
370
|
In local-development instructions, add a brief note that a developer can set
|
|
@@ -388,7 +388,7 @@ plain `pnpm dev` has the right first-run behavior without extra flags:
|
|
|
388
388
|
}
|
|
389
389
|
```
|
|
390
390
|
|
|
391
|
-
Either value keeps the shared
|
|
391
|
+
Either value keeps the shared Use Builder.io / Add your own keys choice
|
|
392
392
|
visible; only `"off"` disables first-run onboarding entirely. Do not replace
|
|
393
393
|
this with a local credential form or remove the shared onboarding.
|
|
394
394
|
|
|
@@ -235,7 +235,7 @@ export default {
|
|
|
235
235
|
eventRulesAutomationLink: "For other actions, create an automation",
|
|
236
236
|
eventRulesConnectJev: "Connect Jev to run invitation rules",
|
|
237
237
|
eventRulesFreeBuilderOrApiKey: "Free with Builder.io, or add an API key.",
|
|
238
|
-
eventRulesConnectBuilder: "
|
|
238
|
+
eventRulesConnectBuilder: "Use Builder.io",
|
|
239
239
|
eventRulesAddJevApiKey: "Add API key",
|
|
240
240
|
eventRulesTabRules: "Rules",
|
|
241
241
|
eventRulesHelpLabel: "About invitation rule prompts",
|
|
@@ -364,7 +364,7 @@ optimistic action patterns. Do not add a parallel CRUD API route for an action.
|
|
|
364
364
|
## 4. Keep onboarding shared
|
|
365
365
|
|
|
366
366
|
Use the framework's existing setup experience. The app should offer the normal
|
|
367
|
-
“
|
|
367
|
+
“Use Builder.io” and “Add your own keys” paths for AI setup. Do not create a
|
|
368
368
|
second credential form or hardcode a provider key.
|
|
369
369
|
|
|
370
370
|
In local-development instructions, add a brief note that a developer can set
|
|
@@ -388,7 +388,7 @@ plain `pnpm dev` has the right first-run behavior without extra flags:
|
|
|
388
388
|
}
|
|
389
389
|
```
|
|
390
390
|
|
|
391
|
-
Either value keeps the shared
|
|
391
|
+
Either value keeps the shared Use Builder.io / Add your own keys choice
|
|
392
392
|
visible; only `"off"` disables first-run onboarding entirely. Do not replace
|
|
393
393
|
this with a local credential form or remove the shared onboarding.
|
|
394
394
|
|
|
@@ -364,7 +364,7 @@ optimistic action patterns. Do not add a parallel CRUD API route for an action.
|
|
|
364
364
|
## 4. Keep onboarding shared
|
|
365
365
|
|
|
366
366
|
Use the framework's existing setup experience. The app should offer the normal
|
|
367
|
-
“
|
|
367
|
+
“Use Builder.io” and “Add your own keys” paths for AI setup. Do not create a
|
|
368
368
|
second credential form or hardcode a provider key.
|
|
369
369
|
|
|
370
370
|
In local-development instructions, add a brief note that a developer can set
|
|
@@ -388,7 +388,7 @@ plain `pnpm dev` has the right first-run behavior without extra flags:
|
|
|
388
388
|
}
|
|
389
389
|
```
|
|
390
390
|
|
|
391
|
-
Either value keeps the shared
|
|
391
|
+
Either value keeps the shared Use Builder.io / Add your own keys choice
|
|
392
392
|
visible; only `"off"` disables first-run onboarding entirely. Do not replace
|
|
393
393
|
this with a local credential form or remove the shared onboarding.
|
|
394
394
|
|
|
@@ -120,7 +120,7 @@ from the command menu (Cmd+K → "What's new") or from Settings.
|
|
|
120
120
|
- Clips settings are reorganized in the new Settings: General with Recordings and Meetings tabs, Notifications, and Slack link previews under Channels.
|
|
121
121
|
- The account menu at the bottom of the sidebar shows your photo, name, and organization, and holds Settings, Usage, Get apps and extensions, and Log out
|
|
122
122
|
- Video storage now uses the shared storage form, and Clear credentials asks before it removes your storage keys
|
|
123
|
-
-
|
|
123
|
+
- Use Builder storage by creating an account in one click.
|
|
124
124
|
- Public clip embeds and meeting notes show richer link previews.
|
|
125
125
|
- The no-comments sidebar gives viewers a concise reason to try Clips and a clear path to sign up.
|
|
126
126
|
- Shared clips remember your sidebar choice and help new viewers understand why to sign up.
|
|
@@ -235,7 +235,7 @@ function buildCleanupConfigurationError({
|
|
|
235
235
|
builderFailureMessage: string | null;
|
|
236
236
|
}): FeatureNotConfiguredError {
|
|
237
237
|
let message =
|
|
238
|
-
"
|
|
238
|
+
"Use Builder.io (free credits available) or a fallback AI key for transcript cleanup.";
|
|
239
239
|
|
|
240
240
|
if (builderConfigured && builderReturnedEmpty) {
|
|
241
241
|
message =
|
|
@@ -184,14 +184,13 @@ export default defineAction({
|
|
|
184
184
|
ownerParticipant.name = ownerName;
|
|
185
185
|
}
|
|
186
186
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
(await getDefaultRecordingVisibility(
|
|
187
|
+
try {
|
|
188
|
+
const visibility = await getDefaultRecordingVisibility(
|
|
190
189
|
orgId,
|
|
191
190
|
actionContext?.userEmail ?? ownerEmail,
|
|
192
|
-
|
|
191
|
+
args.visibility,
|
|
192
|
+
);
|
|
193
193
|
|
|
194
|
-
try {
|
|
195
194
|
await db.insert(schema.meetings).values({
|
|
196
195
|
id,
|
|
197
196
|
organizationId: orgId ?? null,
|
|
@@ -48,6 +48,9 @@ export function classifyInitialUploadFailure(error: unknown): {
|
|
|
48
48
|
: typeof error === "string"
|
|
49
49
|
? error
|
|
50
50
|
: "";
|
|
51
|
+
const isSignedUrlFailure = /builder\.io signed-url request failed/i.test(
|
|
52
|
+
message,
|
|
53
|
+
);
|
|
51
54
|
const messageStatus = /\b(?:failed|failure|error)\s*\((\d{3})\)/i.exec(
|
|
52
55
|
message,
|
|
53
56
|
)?.[1];
|
|
@@ -64,11 +67,13 @@ export function classifyInitialUploadFailure(error: unknown): {
|
|
|
64
67
|
? details.failureStage
|
|
65
68
|
: "multipart_start";
|
|
66
69
|
const failureCode = normalizeRecordingFailureCode(details.failureCode);
|
|
70
|
+
// A nested signed-URL response does not mean the account needs reauthorization.
|
|
67
71
|
const storageSetupRequired =
|
|
68
72
|
failureCode === "storage_setup_required" ||
|
|
69
73
|
details.errorCode === "builder_oauth_reauthorization_required" ||
|
|
70
74
|
details.errorCode === "builder_credentials_rejected" ||
|
|
71
|
-
|
|
75
|
+
(!isSignedUrlFailure && (httpStatus === 401 || httpStatus === 403)) ||
|
|
76
|
+
/credentials?[^.\n]*(?:not configured|missing)|not connected|(?:reconnect|use) builder(?:\.io)?|scope mismatch|missing its space id/i.test(
|
|
72
77
|
message,
|
|
73
78
|
);
|
|
74
79
|
|
|
@@ -114,9 +119,10 @@ export default defineAction({
|
|
|
114
119
|
const { organizationId } = await requireOrganizationAccess(
|
|
115
120
|
args.organizationId,
|
|
116
121
|
);
|
|
117
|
-
const
|
|
122
|
+
const visibility = await getDefaultRecordingVisibility(
|
|
118
123
|
organizationId,
|
|
119
124
|
actionContext?.userEmail ?? ownerEmail,
|
|
125
|
+
args.visibility,
|
|
120
126
|
);
|
|
121
127
|
|
|
122
128
|
const spaceIds = await validateRecordingScope(db, {
|
|
@@ -144,7 +150,7 @@ export default defineAction({
|
|
|
144
150
|
uploadLeaseExpiresAt: uploadLeaseExpiry(),
|
|
145
151
|
hasAudio: args.hasAudio ?? true,
|
|
146
152
|
hasCamera: args.hasCamera ?? false,
|
|
147
|
-
visibility
|
|
153
|
+
visibility,
|
|
148
154
|
width: args.width ?? 0,
|
|
149
155
|
height: args.height ?? 0,
|
|
150
156
|
ownerEmail,
|
|
@@ -118,9 +118,10 @@ export default defineAction({
|
|
|
118
118
|
const { organizationId } = await requireOrganizationAccess(
|
|
119
119
|
args.organizationId,
|
|
120
120
|
);
|
|
121
|
-
const
|
|
121
|
+
const visibility = await getDefaultRecordingVisibility(
|
|
122
122
|
organizationId,
|
|
123
123
|
actionContext?.userEmail ?? ownerEmail,
|
|
124
|
+
args.visibility,
|
|
124
125
|
);
|
|
125
126
|
|
|
126
127
|
// The same check a new recording gets: the folder has to be the
|
|
@@ -175,7 +176,7 @@ export default defineAction({
|
|
|
175
176
|
videoSizeBytes: bytes.byteLength,
|
|
176
177
|
hasAudio: false,
|
|
177
178
|
hasCamera: false,
|
|
178
|
-
visibility
|
|
179
|
+
visibility,
|
|
179
180
|
width: args.width,
|
|
180
181
|
height: args.height,
|
|
181
182
|
ownerEmail,
|
|
@@ -99,9 +99,9 @@ const ImportLoomRecordingSchema = z.object({
|
|
|
99
99
|
});
|
|
100
100
|
|
|
101
101
|
const LOOM_STORAGE_SETUP_REQUIRED_REASON =
|
|
102
|
-
"Video storage is not connected yet.
|
|
102
|
+
"Video storage is not connected yet. Use Builder.io (free tier available) or configure S3-compatible storage, then retry this Loom import.";
|
|
103
103
|
const DIRECT_VIDEO_STORAGE_SETUP_REQUIRED_REASON =
|
|
104
|
-
"Video storage is not connected yet.
|
|
104
|
+
"Video storage is not connected yet. Use Builder.io (free tier available) or configure S3-compatible storage, then retry this import.";
|
|
105
105
|
|
|
106
106
|
function recordingDeepLink(recordingId: string): string {
|
|
107
107
|
return buildDeepLink({
|
|
@@ -229,11 +229,6 @@ export default defineAction({
|
|
|
229
229
|
const { organizationId } = await requireOrganizationAccess(
|
|
230
230
|
existingRecording?.organizationId ?? args.organizationId,
|
|
231
231
|
);
|
|
232
|
-
const defaultVisibility = await getDefaultRecordingVisibility(
|
|
233
|
-
organizationId,
|
|
234
|
-
actionContext?.userEmail ?? ownerEmail,
|
|
235
|
-
);
|
|
236
|
-
|
|
237
232
|
const now = new Date().toISOString();
|
|
238
233
|
const id = existingRecording?.id ?? nanoid();
|
|
239
234
|
const createdAt = existingRecording?.createdAt ?? now;
|
|
@@ -259,7 +254,12 @@ export default defineAction({
|
|
|
259
254
|
const height = boundedDimension(oembed?.height ?? oembed?.thumbnail_height);
|
|
260
255
|
const folderId = args.folderId ?? existingRecording?.folderId ?? null;
|
|
261
256
|
const visibility =
|
|
262
|
-
args.visibility ??
|
|
257
|
+
args.visibility ??
|
|
258
|
+
existingRecording?.visibility ??
|
|
259
|
+
(await getDefaultRecordingVisibility(
|
|
260
|
+
organizationId,
|
|
261
|
+
actionContext?.userEmail ?? ownerEmail,
|
|
262
|
+
));
|
|
263
263
|
const titleSource = args.title
|
|
264
264
|
? "manual"
|
|
265
265
|
: (existingRecording?.titleSource ?? "upload");
|
|
@@ -15,7 +15,7 @@ import { assertNativeRecordingMedia } from "./lib/native-media.js";
|
|
|
15
15
|
|
|
16
16
|
const MAX_CAS_ATTEMPTS = 5;
|
|
17
17
|
const THUMBNAIL_STORAGE_REQUIRED_REASON =
|
|
18
|
-
"No object storage is connected.
|
|
18
|
+
"No object storage is connected. Use Builder.io (free) or configure your own S3-compatible storage keys in Settings → File uploads.";
|
|
19
19
|
|
|
20
20
|
export default defineAction({
|
|
21
21
|
description:
|
|
@@ -97,9 +97,10 @@ export default defineAction({
|
|
|
97
97
|
assertNativeRecordingMedia(source);
|
|
98
98
|
}
|
|
99
99
|
const organizationId = ordered[0].organizationId;
|
|
100
|
-
const
|
|
100
|
+
const visibility = await getDefaultRecordingVisibility(
|
|
101
101
|
organizationId,
|
|
102
102
|
actionContext?.userEmail ?? ownerEmail,
|
|
103
|
+
args.visibility,
|
|
103
104
|
);
|
|
104
105
|
|
|
105
106
|
const totalDuration =
|
|
@@ -143,7 +144,7 @@ export default defineAction({
|
|
|
143
144
|
hasCamera: ordered.some((r) => Boolean(r.hasCamera)),
|
|
144
145
|
editsJson: serializeEdits(edits),
|
|
145
146
|
ownerEmail,
|
|
146
|
-
visibility
|
|
147
|
+
visibility,
|
|
147
148
|
createdAt: now,
|
|
148
149
|
updatedAt: now,
|
|
149
150
|
thumbnailUrl: ordered[0].thumbnailUrl ?? null,
|
|
@@ -602,7 +602,8 @@ function isTranscriptionSetupNeeded(
|
|
|
602
602
|
r.includes("credits exhausted") ||
|
|
603
603
|
r.includes("rate limit") ||
|
|
604
604
|
r.includes("rejected the api key") ||
|
|
605
|
-
r.includes("connect builder")
|
|
605
|
+
r.includes("connect builder") ||
|
|
606
|
+
r.includes("use builder")
|
|
606
607
|
);
|
|
607
608
|
}
|
|
608
609
|
|
|
@@ -614,6 +615,7 @@ function isConnectedBuilderRetryable(
|
|
|
614
615
|
return (
|
|
615
616
|
r.includes("no transcription provider configured") ||
|
|
616
617
|
r.includes("connect builder") ||
|
|
618
|
+
r.includes("use builder") ||
|
|
617
619
|
r.includes("no transcription provider")
|
|
618
620
|
);
|
|
619
621
|
}
|
|
@@ -649,7 +651,8 @@ function friendlyTranscriptFailure(
|
|
|
649
651
|
if (
|
|
650
652
|
normalized.includes("api key") ||
|
|
651
653
|
normalized.includes("not configured") ||
|
|
652
|
-
normalized.includes("connect builder")
|
|
654
|
+
normalized.includes("connect builder") ||
|
|
655
|
+
normalized.includes("use builder")
|
|
653
656
|
) {
|
|
654
657
|
return t("transcriptPanel.backupNotSetup");
|
|
655
658
|
}
|