@agent-native/core 0.88.0 → 0.90.1
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 +82 -2
- package/corpus/core/docs/content/agent-native-toolkit.mdx +87 -146
- package/corpus/core/docs/content/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/components.mdx +16 -4
- package/corpus/core/docs/content/data-programs.mdx +329 -0
- package/corpus/core/docs/content/deployment.mdx +9 -9
- package/corpus/core/docs/content/extensions.mdx +8 -7
- package/corpus/core/docs/content/generative-ui.mdx +5 -3
- package/corpus/core/docs/content/key-concepts.mdx +6 -9
- package/corpus/core/docs/content/locales/ar-SA/agent-native-toolkit.mdx +100 -70
- package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/ar-SA/components.mdx +12 -2
- package/corpus/core/docs/content/locales/ar-SA/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/ar-SA/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/ar-SA/extensions.mdx +6 -4
- package/corpus/core/docs/content/locales/ar-SA/key-concepts.mdx +7 -9
- package/corpus/core/docs/content/locales/ar-SA/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/de-DE/agent-native-toolkit.mdx +100 -74
- package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/de-DE/components.mdx +12 -2
- package/corpus/core/docs/content/locales/de-DE/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/de-DE/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/de-DE/extensions.mdx +6 -4
- package/corpus/core/docs/content/locales/de-DE/key-concepts.mdx +8 -10
- package/corpus/core/docs/content/locales/de-DE/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/es-ES/agent-native-toolkit.mdx +100 -74
- package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/es-ES/components.mdx +12 -2
- package/corpus/core/docs/content/locales/es-ES/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/es-ES/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/es-ES/extensions.mdx +6 -4
- package/corpus/core/docs/content/locales/es-ES/key-concepts.mdx +8 -10
- package/corpus/core/docs/content/locales/es-ES/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/fr-FR/agent-native-toolkit.mdx +100 -76
- package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/fr-FR/components.mdx +12 -2
- package/corpus/core/docs/content/locales/fr-FR/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/fr-FR/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/fr-FR/extensions.mdx +6 -4
- package/corpus/core/docs/content/locales/fr-FR/key-concepts.mdx +8 -10
- package/corpus/core/docs/content/locales/fr-FR/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/hi-IN/agent-native-toolkit.mdx +100 -71
- package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/hi-IN/components.mdx +20 -10
- package/corpus/core/docs/content/locales/hi-IN/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/hi-IN/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/hi-IN/extensions.mdx +6 -4
- package/corpus/core/docs/content/locales/hi-IN/key-concepts.mdx +8 -10
- package/corpus/core/docs/content/locales/hi-IN/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/ja-JP/agent-native-toolkit.mdx +100 -64
- package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/ja-JP/components.mdx +12 -2
- package/corpus/core/docs/content/locales/ja-JP/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/ja-JP/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/ja-JP/extensions.mdx +6 -4
- package/corpus/core/docs/content/locales/ja-JP/key-concepts.mdx +9 -11
- package/corpus/core/docs/content/locales/ja-JP/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/ko-KR/agent-native-toolkit.mdx +100 -60
- package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/ko-KR/components.mdx +20 -10
- package/corpus/core/docs/content/locales/ko-KR/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/ko-KR/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/ko-KR/extensions.mdx +16 -14
- package/corpus/core/docs/content/locales/ko-KR/key-concepts.mdx +9 -11
- package/corpus/core/docs/content/locales/ko-KR/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/pt-BR/agent-native-toolkit.mdx +100 -74
- package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/pt-BR/components.mdx +12 -2
- package/corpus/core/docs/content/locales/pt-BR/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/pt-BR/deployment.mdx +8 -9
- package/corpus/core/docs/content/locales/pt-BR/extensions.mdx +6 -4
- package/corpus/core/docs/content/locales/pt-BR/key-concepts.mdx +8 -11
- package/corpus/core/docs/content/locales/pt-BR/real-time-collaboration.mdx +9 -10
- package/corpus/core/docs/content/locales/zh-CN/agent-native-toolkit.mdx +100 -58
- package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/zh-CN/components.mdx +20 -10
- package/corpus/core/docs/content/locales/zh-CN/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/zh-CN/deployment.mdx +7 -9
- package/corpus/core/docs/content/locales/zh-CN/extensions.mdx +16 -14
- package/corpus/core/docs/content/locales/zh-CN/key-concepts.mdx +7 -11
- package/corpus/core/docs/content/locales/zh-CN/real-time-collaboration.mdx +10 -11
- package/corpus/core/docs/content/locales/zh-TW/agent-native-toolkit.mdx +100 -58
- package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +19 -19
- package/corpus/core/docs/content/locales/zh-TW/components.mdx +20 -10
- package/corpus/core/docs/content/locales/zh-TW/data-programs.mdx +329 -0
- package/corpus/core/docs/content/locales/zh-TW/deployment.mdx +7 -9
- package/corpus/core/docs/content/locales/zh-TW/extensions.mdx +16 -14
- package/corpus/core/docs/content/locales/zh-TW/key-concepts.mdx +7 -11
- package/corpus/core/docs/content/locales/zh-TW/real-time-collaboration.mdx +10 -11
- package/corpus/core/docs/content/real-time-collaboration.mdx +10 -11
- package/corpus/core/docs/content/toolkit-app-adapters.mdx +46 -0
- package/corpus/core/docs/content/toolkit-collaboration-ui.mdx +48 -0
- package/corpus/core/docs/content/toolkit-sharing-ui.mdx +33 -0
- package/corpus/core/docs/content/toolkit-shell-hooks.mdx +27 -0
- package/corpus/core/docs/content/toolkit-ui.mdx +69 -0
- package/corpus/core/package.json +5 -1
- package/corpus/core/src/agent/durable-background.ts +53 -0
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +7 -1
- package/corpus/core/src/agent/engine/anthropic-engine.ts +29 -1
- package/corpus/core/src/agent/engine/builder-engine.ts +1 -0
- package/corpus/core/src/agent/engine/output-tokens.ts +26 -13
- package/corpus/core/src/agent/engine/registry.ts +45 -26
- package/corpus/core/src/agent/engine/translate-ai-sdk.ts +56 -7
- package/corpus/core/src/agent/engine/translate-anthropic.ts +43 -1
- package/corpus/core/src/agent/engine/types.ts +16 -0
- package/corpus/core/src/agent/model-config.ts +100 -0
- package/corpus/core/src/agent/production-agent.ts +492 -241
- package/corpus/core/src/agent/runtime-context.ts +50 -12
- package/corpus/core/src/agent/tool-result-images.ts +178 -0
- package/corpus/core/src/brand-kit/fig/index.ts +8 -4
- package/corpus/core/src/client/AgentPanel.tsx +88 -31
- package/corpus/core/src/client/AssistantChat.tsx +95 -46
- package/corpus/core/src/client/KeepTabOpenNotice.tsx +176 -0
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +7 -0
- package/corpus/core/src/client/RunStuckBanner.tsx +13 -1
- package/corpus/core/src/client/chat/run-recovery.tsx +7 -1
- package/corpus/core/src/client/clipboard.ts +17 -13
- package/corpus/core/src/client/components/AgentPresenceChip.tsx +4 -69
- package/corpus/core/src/client/components/LiveCursorOverlay.tsx +5 -240
- package/corpus/core/src/client/components/PresenceBar.tsx +4 -346
- package/corpus/core/src/client/components/RecentEditHighlights.tsx +4 -219
- package/corpus/core/src/client/components/RemoteSelectionRings.tsx +5 -220
- package/corpus/core/src/client/composer/TiptapComposer.tsx +94 -38
- package/corpus/core/src/client/db-admin/SqlEditor.tsx +13 -3
- package/corpus/core/src/client/dynamic-suggestions.ts +6 -1
- package/corpus/core/src/client/extensions/ExtensionViewer.tsx +0 -14
- package/corpus/core/src/client/extensions/ExtensionsListPage.tsx +29 -30
- package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +2 -1
- package/corpus/core/src/client/host-bridge.ts +29 -8
- package/corpus/core/src/client/i18n.tsx +7 -1
- package/corpus/core/src/client/index.ts +5 -0
- package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +34 -69
- package/corpus/core/src/client/rich-markdown-editor/SharedRichEditor.tsx +4 -0
- package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +7 -1
- package/corpus/core/src/client/settings/SettingsPanel.tsx +409 -230
- package/corpus/core/src/client/settings/SettingsTabsPage.tsx +5 -7
- package/corpus/core/src/client/settings/index.ts +5 -1
- package/corpus/core/src/client/sharing/VisibilityBadge.tsx +4 -37
- package/corpus/core/src/client/use-run-stuck-detection.ts +10 -1
- package/corpus/core/src/coding-tools/run-code.ts +473 -74
- package/corpus/core/src/coding-tools/sandbox/background.ts +406 -0
- package/corpus/core/src/coding-tools/sandbox/executions-store.ts +517 -0
- package/corpus/core/src/coding-tools/sandbox/index.ts +53 -13
- package/corpus/core/src/coding-tools/sandbox/local-child-process-adapter.ts +61 -4
- package/corpus/core/src/collab/client.ts +870 -562
- package/corpus/core/src/collab/presence.ts +12 -23
- package/corpus/core/src/collab/recent-edits.ts +13 -32
- package/corpus/core/src/data-programs/actions.ts +335 -0
- package/corpus/core/src/data-programs/contract.ts +284 -0
- package/corpus/core/src/data-programs/execute.ts +693 -0
- package/corpus/core/src/data-programs/index.ts +72 -0
- package/corpus/core/src/data-programs/schema.ts +148 -0
- package/corpus/core/src/data-programs/store.ts +755 -0
- package/corpus/core/src/deploy/build.ts +34 -0
- package/corpus/core/src/extensions/actions.ts +2 -2
- package/corpus/core/src/file-upload/builder.ts +11 -0
- package/corpus/core/src/integrations/webhook-handler.ts +27 -8
- package/corpus/core/src/local-artifacts/index.ts +1 -1
- package/corpus/core/src/localization/default-messages.ts +1 -2
- package/corpus/core/src/mcp-client/index.ts +29 -0
- package/corpus/core/src/onboarding/default-steps.ts +5 -2
- package/corpus/core/src/resources/store.ts +34 -3
- package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +4 -8
- package/corpus/core/src/scripts/agent-engines/test-agent-engine.ts +9 -2
- package/corpus/core/src/scripts/db/tool-mode.ts +2 -2
- package/corpus/core/src/scripts/resources/migrate-learnings.ts +9 -13
- package/corpus/core/src/server/agent-chat-plugin.ts +154 -62
- package/corpus/core/src/server/agent-discovery.ts +67 -7
- package/corpus/core/src/server/auth.ts +90 -3
- package/corpus/core/src/server/builder-design-systems.ts +2 -2
- package/corpus/core/src/server/core-routes-plugin.ts +119 -22
- package/corpus/core/src/server/credential-provider.ts +28 -8
- package/corpus/core/src/server/csrf.ts +3 -0
- package/corpus/core/src/server/oauth-helpers.ts +11 -1
- package/corpus/core/src/server/onboarding-html.ts +80 -48
- package/corpus/core/src/server/prompts/shared-rules.ts +2 -2
- package/corpus/core/src/server/transcribe-voice.ts +93 -9
- package/corpus/core/src/styles/agent-native.css +57 -45
- package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/core/src/templates/default/AGENTS.md +11 -14
- package/corpus/core/src/templates/default/actions/navigate.ts +1 -1
- package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/de-DE.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/en-US.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/es-ES.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +0 -1
- package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +0 -1
- package/corpus/core/src/templates/default/app/routes/settings.tsx +22 -33
- package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +20 -7
- package/corpus/core/src/templates/headless/AGENTS.md +9 -6
- package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/data-programs/SKILL.md +128 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +10 -4
- package/corpus/core/src/vite/agents-bundle-plugin.ts +26 -1
- package/corpus/core/src/vite/client.ts +12 -0
- package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/analytics/.agents/skills/analysis-workspace/SKILL.md +8 -0
- package/corpus/templates/analytics/.agents/skills/data-programs/SKILL.md +348 -0
- package/corpus/templates/analytics/.agents/skills/provider-api/SKILL.md +10 -0
- package/corpus/templates/analytics/AGENTS.md +31 -32
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +1 -1
- package/corpus/templates/analytics/actions/delete-data-source-credentials.ts +32 -0
- package/corpus/templates/analytics/actions/ensure-risk-meeting-dashboard.ts +247 -0
- package/corpus/templates/analytics/actions/update-data-source-credentials.ts +123 -0
- package/corpus/templates/analytics/app/components/InlineMetric.tsx +2 -2
- package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +2 -7
- package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +11 -16
- package/corpus/templates/analytics/app/components/dashboard/DateRangePicker.tsx +1 -2
- package/corpus/templates/analytics/app/components/dashboard/MetricCard.tsx +2 -7
- package/corpus/templates/analytics/app/components/dashboard/RecentActivity.tsx +3 -6
- package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +1 -6
- package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +2 -7
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +11 -15
- package/corpus/templates/analytics/app/components/dashboard/StatsCard.tsx +1 -7
- package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +2 -7
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +16 -16
- package/corpus/templates/analytics/app/components/layout/Header.tsx +2 -2
- package/corpus/templates/analytics/app/components/layout/HeaderActions.tsx +2 -1
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -2
- package/corpus/templates/analytics/app/components/layout/MobileNav.tsx +33 -17
- package/corpus/templates/analytics/app/components/layout/NewAnalysisDialog.tsx +6 -6
- package/corpus/templates/analytics/app/components/layout/NewDashboardDialog.tsx +4 -3
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +119 -68
- package/corpus/templates/analytics/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/alert.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/avatar.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/button.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/calendar.tsx +1 -1
- package/corpus/templates/analytics/app/components/ui/card.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/collapsible.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/command.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/date-picker.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/input.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/label.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/progress.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/select.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/table.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/toaster.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/toggle-group.tsx +1 -0
- package/corpus/templates/analytics/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/analytics/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/analytics/app/global.css +26 -3
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +27 -4
- package/corpus/templates/analytics/app/i18n-data.ts +277 -42
- package/corpus/templates/analytics/app/pages/Agents.tsx +19 -19
- package/corpus/templates/analytics/app/pages/DataDictionary.tsx +21 -21
- package/corpus/templates/analytics/app/pages/DataSources.tsx +31 -54
- package/corpus/templates/analytics/app/pages/NotFound.tsx +2 -1
- package/corpus/templates/analytics/app/pages/Placeholder.tsx +2 -1
- package/corpus/templates/analytics/app/pages/Settings.tsx +19 -37
- package/corpus/templates/analytics/app/pages/adhoc/DashboardSkeleton.tsx +3 -2
- package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +8 -13
- package/corpus/templates/analytics/app/pages/adhoc/_shared/components/DateRangeInput.tsx +1 -2
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ChartTypePicker.tsx +2 -4
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/DateRangePicker.tsx +1 -2
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventCombobox.tsx +7 -7
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventPanel.tsx +2 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventRow.tsx +2 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ExplorerChart.tsx +3 -8
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/FilterBuilder.tsx +5 -4
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/GroupByPicker.tsx +2 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/PropertyCombobox.tsx +7 -7
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/PropertyValueCombobox.tsx +7 -7
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/SqlPreview.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer/index.tsx +16 -16
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/ChartCard.tsx +16 -21
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +32 -32
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +14 -14
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/EmailReportDialog.tsx +14 -13
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +200 -52
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +23 -28
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewSqlPopover.tsx +13 -12
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +15 -15
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +32 -36
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +2 -1
- package/corpus/templates/analytics/app/pages/analyses/AnalysesList.tsx +8 -7
- package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +19 -19
- package/corpus/templates/analytics/app/pages/analyses/LegacyFusionAnalysis.tsx +11 -15
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +14 -14
- package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +7 -12
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +12 -12
- package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +25 -25
- package/corpus/templates/analytics/app/root.tsx +22 -19
- package/corpus/templates/analytics/app/routes/catalog.tsx +8 -8
- package/corpus/templates/analytics/changelog/2026-07-06-dashboard-lists-and-headers-stay-compact.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-06-dashboards-can-now-chart-data-programs-saved-server-side-scr.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-06-extension-pages-and-mobile-headers-now-share-one-background-shade.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-06-mobile-chat-header-is-more-compact-and-the-menu-button-opens-navigation.md +5 -0
- package/corpus/templates/analytics/learnings.defaults.md +36 -0
- package/corpus/templates/analytics/seeds/data-programs/risk-meeting-cohort.js +254 -0
- package/corpus/templates/analytics/seeds/data-programs/risk-meeting-pylon-early-warning.js +184 -0
- package/corpus/templates/analytics/server/handlers/sql-query.ts +1 -1
- package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +109 -1
- package/corpus/templates/assets/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/assets/app/components/create/RecentDraftsSection.tsx +3 -2
- package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +16 -10
- package/corpus/templates/assets/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/assets/app/components/layout/PageShell.tsx +4 -4
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +12 -12
- package/corpus/templates/assets/app/components/library/CreateLibraryDialog.tsx +8 -8
- package/corpus/templates/assets/app/components/library/EditLibraryDialog.tsx +7 -7
- package/corpus/templates/assets/app/components/library/LibraryCard.tsx +8 -8
- package/corpus/templates/assets/app/components/library/LibraryPresetGrid.tsx +3 -2
- package/corpus/templates/assets/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/button.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/card.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/input.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/label.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/select.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/assets/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/assets/app/global.css +1 -0
- package/corpus/templates/assets/app/root.tsx +12 -9
- package/corpus/templates/assets/app/routes/asset.$id.tsx +19 -19
- package/corpus/templates/assets/app/routes/audit.tsx +15 -14
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +49 -54
- package/corpus/templates/assets/app/routes/library.tsx +31 -31
- package/corpus/templates/assets/app/routes/settings.tsx +21 -35
- package/corpus/templates/assets/changelog/2026-07-06-mobile-layouts-no-longer-stack-two-top-headers.md +5 -0
- package/corpus/templates/brain/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/brain/.agents/skills/ask-across-everything/SKILL.md +6 -1
- package/corpus/templates/brain/.agents/skills/brain/SKILL.md +63 -5
- package/corpus/templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md +112 -0
- package/corpus/templates/brain/AGENTS.md +93 -8
- package/corpus/templates/brain/app/components/brain/CanonicalPreviewSheet.tsx +6 -5
- package/corpus/templates/brain/app/components/brain/Surface.tsx +3 -8
- package/corpus/templates/brain/app/components/layout/Layout.tsx +7 -7
- package/corpus/templates/brain/app/components/layout/Sidebar.tsx +6 -6
- package/corpus/templates/brain/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/button.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/card.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/input.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/label.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/progress.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/select.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/table.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/brain/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/brain/app/global.css +1 -0
- package/corpus/templates/brain/app/hooks/use-distillation-bridge.ts +9 -4
- package/corpus/templates/brain/app/root.tsx +11 -8
- package/corpus/templates/brain/app/routes/knowledge.tsx +19 -19
- package/corpus/templates/brain/app/routes/ops.tsx +18 -18
- package/corpus/templates/brain/app/routes/review.tsx +22 -27
- package/corpus/templates/brain/app/routes/search.tsx +20 -20
- package/corpus/templates/brain/app/routes/settings.tsx +25 -40
- package/corpus/templates/brain/app/routes/sources.tsx +23 -23
- package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/calendar/actions/find-a-time.ts +29 -16
- package/corpus/templates/calendar/actions/list-bookings.ts +33 -2
- package/corpus/templates/calendar/actions/list-events.ts +34 -8
- package/corpus/templates/calendar/actions/update-calendar-visual-preferences.ts +105 -34
- package/corpus/templates/calendar/app/components/ThemeToggle.tsx +5 -5
- package/corpus/templates/calendar/app/components/TimezoneCombobox.tsx +6 -6
- package/corpus/templates/calendar/app/components/booking/BookingConfirmation.tsx +2 -1
- package/corpus/templates/calendar/app/components/booking/BookingForm.tsx +9 -8
- package/corpus/templates/calendar/app/components/booking/DatePicker.tsx +2 -2
- package/corpus/templates/calendar/app/components/booking/TimeSlotPicker.tsx +3 -2
- package/corpus/templates/calendar/app/components/calendar/AddCalendarDialog.tsx +10 -15
- package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +6 -6
- package/corpus/templates/calendar/app/components/calendar/CommandPalette.tsx +73 -3
- package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +27 -27
- package/corpus/templates/calendar/app/components/calendar/DayView.tsx +553 -267
- package/corpus/templates/calendar/app/components/calendar/DeleteEventDialog.tsx +9 -12
- package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +10 -13
- package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +7 -7
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -21
- package/corpus/templates/calendar/app/components/calendar/EventDialog.tsx +11 -11
- package/corpus/templates/calendar/app/components/calendar/EventOptionControls.tsx +9 -9
- package/corpus/templates/calendar/app/components/calendar/FindTimePanel.tsx +9 -9
- package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +6 -6
- package/corpus/templates/calendar/app/components/calendar/GoogleSetupWizard.tsx +3 -3
- package/corpus/templates/calendar/app/components/calendar/GoogleSyncButton.tsx +1 -1
- package/corpus/templates/calendar/app/components/calendar/GuestNotificationDialog.tsx +8 -10
- package/corpus/templates/calendar/app/components/calendar/IntegrationsSidebar.tsx +12 -12
- package/corpus/templates/calendar/app/components/calendar/KeyboardShortcutsHelp.tsx +2 -2
- package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +93 -41
- package/corpus/templates/calendar/app/components/calendar/PeopleSearchDialog.tsx +6 -6
- package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +530 -299
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +229 -134
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +135 -108
- package/corpus/templates/calendar/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/button.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/card.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/collapsible.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/command.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/input.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/label.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/radio-group.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/select.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/table.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/calendar/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/calendar/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/calendar/app/global.css +1 -0
- package/corpus/templates/calendar/app/hooks/use-event-drag.ts +63 -9
- package/corpus/templates/calendar/app/hooks/use-google-auth.ts +15 -27
- package/corpus/templates/calendar/app/hooks/use-grid-create-drag.ts +254 -0
- package/corpus/templates/calendar/app/hooks/use-mobile.ts +1 -0
- package/corpus/templates/calendar/app/hooks/use-view-preferences.ts +287 -21
- package/corpus/templates/calendar/app/hooks/use-zoom-auth.ts +56 -19
- package/corpus/templates/calendar/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/calendar/app/i18n-data.ts +31 -0
- package/corpus/templates/calendar/app/lib/event-colors.ts +29 -8
- package/corpus/templates/calendar/app/pages/AvailabilitySettings.tsx +11 -11
- package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +45 -50
- package/corpus/templates/calendar/app/pages/BookingPage.tsx +2 -2
- package/corpus/templates/calendar/app/pages/BookingsList.tsx +12 -12
- package/corpus/templates/calendar/app/pages/CalendarView.tsx +438 -271
- package/corpus/templates/calendar/app/pages/ManageBookingPage.tsx +13 -13
- package/corpus/templates/calendar/app/pages/Settings.tsx +15 -29
- package/corpus/templates/calendar/app/root.tsx +19 -15
- package/corpus/templates/calendar/app/routes/event.tsx +2 -2
- package/corpus/templates/calendar/changelog/2026-07-06-calendar-now-loads-view-preferences-much-more-efficiently.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-connected-calendars-keep-their-own-color-when-you-customize-.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-create-events-from-the-command-menu-with-natural-phrases-lik.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-drag-across-empty-week-or-day-slots-to-create-an-event-with-.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-dragging-and-resizing-events-is-much-smoother-especially-on-.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-each-connected-google-account-can-now-have-its-own-calendar-.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-events-spanning-multiple-days-now-show-on-every-day-they-cov.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-google-calendar-now-finishes-connecting-correctly-after-sign.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-public-booking-pages-respond-faster.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-06-the-app-header-no-longer-shows-the-global-notifications-bell.md +6 -0
- package/corpus/templates/calendar/package.json +1 -0
- package/corpus/templates/calendar/server/handlers/bookings.ts +46 -52
- package/corpus/templates/calendar/server/handlers/google-auth.ts +21 -5
- package/corpus/templates/calendar/server/lib/google-calendar.ts +32 -3
- package/corpus/templates/calendar/shared/calendar-view-preferences.ts +66 -2
- package/corpus/templates/chat/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/chat/app/components/layout/Layout.tsx +6 -6
- package/corpus/templates/chat/app/components/layout/Sidebar.tsx +12 -12
- package/corpus/templates/chat/app/components/ui/button.tsx +1 -0
- package/corpus/templates/chat/app/components/ui/card.tsx +1 -0
- package/corpus/templates/chat/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/chat/app/components/ui/input.tsx +1 -0
- package/corpus/templates/chat/app/components/ui/label.tsx +1 -0
- package/corpus/templates/chat/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/chat/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/chat/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/chat/app/global.css +1 -0
- package/corpus/templates/chat/app/root.tsx +7 -4
- package/corpus/templates/chat/app/routes/settings.tsx +6 -21
- package/corpus/templates/clips/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +18 -4
- package/corpus/templates/clips/.env.example +8 -0
- package/corpus/templates/clips/actions/accept-invite.ts +3 -0
- package/corpus/templates/clips/actions/add-recording-to-space.ts +55 -27
- package/corpus/templates/clips/actions/add-vocabulary-term.ts +3 -1
- package/corpus/templates/clips/actions/archive-recording.ts +5 -12
- package/corpus/templates/clips/actions/cleanup-transcript.ts +5 -4
- package/corpus/templates/clips/actions/clear-edits.ts +42 -29
- package/corpus/templates/clips/actions/create-meeting.ts +87 -40
- package/corpus/templates/clips/actions/create-recording.ts +6 -3
- package/corpus/templates/clips/actions/delete-meeting.ts +25 -0
- package/corpus/templates/clips/actions/delete-recording-permanent.ts +3 -0
- package/corpus/templates/clips/actions/disconnect-calendar.ts +10 -4
- package/corpus/templates/clips/actions/export-insights-csv.ts +28 -8
- package/corpus/templates/clips/actions/finalize-meeting.ts +106 -33
- package/corpus/templates/clips/actions/finalize-recording.ts +201 -3
- package/corpus/templates/clips/actions/get-organization-insights.ts +51 -7
- package/corpus/templates/clips/actions/import-loom-recording.ts +17 -0
- package/corpus/templates/clips/actions/lib/audio-only-transcription.ts +18 -1
- package/corpus/templates/clips/actions/lib/create-recording-schema.ts +7 -1
- package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +16 -0
- package/corpus/templates/clips/actions/list-clip-views.ts +60 -0
- package/corpus/templates/clips/actions/regenerate-summary.ts +10 -0
- package/corpus/templates/clips/actions/remove-vocabulary-term.ts +59 -0
- package/corpus/templates/clips/actions/request-transcript.ts +170 -25
- package/corpus/templates/clips/actions/restore-recording.ts +5 -12
- package/corpus/templates/clips/actions/save-browser-transcript.ts +13 -2
- package/corpus/templates/clips/actions/set-chapters.ts +6 -15
- package/corpus/templates/clips/actions/set-thumbnail.ts +77 -36
- package/corpus/templates/clips/actions/split-recording.ts +49 -35
- package/corpus/templates/clips/actions/stitch-recordings.ts +7 -4
- package/corpus/templates/clips/actions/stop-meeting-recording.ts +15 -1
- package/corpus/templates/clips/actions/sync-calendars.ts +10 -108
- package/corpus/templates/clips/actions/trash-recording.ts +43 -14
- package/corpus/templates/clips/actions/trim-recording.ts +48 -27
- package/corpus/templates/clips/actions/undo-edit.ts +49 -37
- package/corpus/templates/clips/app/components/capture-install-options.tsx +6 -6
- package/corpus/templates/clips/app/components/dictate/vocabulary-section.tsx +208 -0
- package/corpus/templates/clips/app/components/editable-recording-title.tsx +2 -2
- package/corpus/templates/clips/app/components/editor/chapters-editor.tsx +7 -7
- package/corpus/templates/clips/app/components/editor/editor-toolbar.tsx +26 -26
- package/corpus/templates/clips/app/components/editor/split-button.tsx +5 -4
- package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +9 -9
- package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +11 -16
- package/corpus/templates/clips/app/components/editor/timeline.tsx +3 -3
- package/corpus/templates/clips/app/components/editor/transcript-editor.tsx +5 -5
- package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +4 -4
- package/corpus/templates/clips/app/components/library/create-space-dialog.tsx +8 -8
- package/corpus/templates/clips/app/components/library/empty-state.tsx +2 -1
- package/corpus/templates/clips/app/components/library/folder-tree.tsx +14 -14
- package/corpus/templates/clips/app/components/library/library-grid.tsx +24 -98
- package/corpus/templates/clips/app/components/library/library-layout.tsx +18 -19
- package/corpus/templates/clips/app/components/library/organization-switcher.tsx +11 -11
- package/corpus/templates/clips/app/components/library/recording-card.tsx +44 -50
- package/corpus/templates/clips/app/components/library/search-bar.tsx +5 -5
- package/corpus/templates/clips/app/components/library/sort-menu.tsx +4 -3
- package/corpus/templates/clips/app/components/library/tag-input.tsx +4 -4
- package/corpus/templates/clips/app/components/meetings/attendee-stack.tsx +2 -6
- package/corpus/templates/clips/app/components/meetings/auto-record-prompt.tsx +1 -1
- package/corpus/templates/clips/app/components/meetings/bullet-link.tsx +4 -4
- package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +5 -5
- package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +3 -3
- package/corpus/templates/clips/app/components/meetings/quick-ask-sidebar.tsx +17 -9
- package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +6 -11
- package/corpus/templates/clips/app/components/meetings/transcript-bubbles.tsx +215 -21
- package/corpus/templates/clips/app/components/player/access-password-prompt.tsx +3 -2
- package/corpus/templates/clips/app/components/player/comments-panel.tsx +14 -14
- package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +7 -6
- package/corpus/templates/clips/app/components/player/insights-panel.tsx +18 -6
- package/corpus/templates/clips/app/components/player/player-controls.tsx +42 -36
- package/corpus/templates/clips/app/components/player/reactions-tray.tsx +4 -4
- package/corpus/templates/clips/app/components/player/settings-panel.tsx +13 -12
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +80 -49
- package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +3 -2
- package/corpus/templates/clips/app/components/player/timestamped-comment-button.tsx +2 -2
- package/corpus/templates/clips/app/components/player/transcript-panel.tsx +7 -7
- package/corpus/templates/clips/app/components/player/video-player.tsx +182 -15
- package/corpus/templates/clips/app/components/recorder/camera-visualizer.tsx +1 -1
- package/corpus/templates/clips/app/components/recorder/microphone-visualizer.tsx +1 -1
- package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +49 -36
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +285 -24
- package/corpus/templates/clips/app/components/recorder/recording-toolbar.tsx +6 -5
- package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +7 -6
- package/corpus/templates/clips/app/components/sharing/share-ui.tsx +10 -10
- package/corpus/templates/clips/app/components/sharing/viewed-by-popover.tsx +132 -0
- package/corpus/templates/clips/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/avatar.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/button.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/card.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/collapsible.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/context-menu.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/input.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/label.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/scroll-area.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/select.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/slider.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/table.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/clips/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/clips/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +5 -9
- package/corpus/templates/clips/app/components/workspace/insights-hub.tsx +9 -19
- package/corpus/templates/clips/app/components/workspace/invite-dialog.tsx +10 -9
- package/corpus/templates/clips/app/components/workspace/members-list.tsx +11 -10
- package/corpus/templates/clips/app/components/workspace/notifications-list.tsx +2 -1
- package/corpus/templates/clips/app/components/workspace/top-creators-table.tsx +3 -2
- package/corpus/templates/clips/app/components/workspace/top-videos-table.tsx +3 -2
- package/corpus/templates/clips/app/global.css +1 -0
- package/corpus/templates/clips/app/hooks/use-desktop-promo.ts +2 -1
- package/corpus/templates/clips/app/hooks/use-mobile.ts +1 -0
- package/corpus/templates/clips/app/hooks/use-player-shortcuts.ts +14 -10
- package/corpus/templates/clips/app/hooks/use-view-tracking.ts +14 -0
- package/corpus/templates/clips/app/i18n/ar-SA.ts +56 -0
- package/corpus/templates/clips/app/i18n/de-DE.ts +53 -0
- package/corpus/templates/clips/app/i18n/en-US.ts +52 -0
- package/corpus/templates/clips/app/i18n/es-ES.ts +53 -0
- package/corpus/templates/clips/app/i18n/fr-FR.ts +53 -0
- package/corpus/templates/clips/app/i18n/hi-IN.ts +52 -0
- package/corpus/templates/clips/app/i18n/ja-JP.ts +53 -0
- package/corpus/templates/clips/app/i18n/ko-KR.ts +52 -0
- package/corpus/templates/clips/app/i18n/pt-BR.ts +53 -0
- package/corpus/templates/clips/app/i18n/zh-CN.ts +51 -0
- package/corpus/templates/clips/app/i18n/zh-TW.ts +51 -0
- package/corpus/templates/clips/app/lib/recorder-preferences.ts +4 -0
- package/corpus/templates/clips/app/lib/timestamp-mapping.ts +5 -0
- package/corpus/templates/clips/app/root.tsx +26 -23
- package/corpus/templates/clips/app/routes/_app.dictate.tsx +39 -23
- package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +134 -39
- package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +20 -20
- package/corpus/templates/clips/app/routes/_app.notifications.tsx +3 -3
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +92 -60
- package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +8 -13
- package/corpus/templates/clips/app/routes/_app.spaces._index.tsx +1 -1
- package/corpus/templates/clips/app/routes/_app.trash.tsx +96 -31
- package/corpus/templates/clips/app/routes/bug-report.done.tsx +1 -1
- package/corpus/templates/clips/app/routes/bug-report.tsx +11 -11
- package/corpus/templates/clips/app/routes/download.tsx +2 -2
- package/corpus/templates/clips/app/routes/embed.$shareId.tsx +2 -1
- package/corpus/templates/clips/app/routes/invite.$token.tsx +8 -13
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +263 -251
- package/corpus/templates/clips/app/routes/record.tsx +28 -10
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +51 -29
- package/corpus/templates/clips/app/routes/share.meeting.$meetingId.tsx +71 -16
- package/corpus/templates/clips/changelog/2026-07-05-mobile-clip-pages-use-a-tighter-viewer-layout-with-inline-ac.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-ai-setup-now-switches-to-your-saved-provider-key-and-uses-fa.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-browsers-that-can-t-play-a-clip-s-video-format-now-see-a-cle.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-calendar-connections-no-longer-ask-you-to-reconnect-after-te.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-chrome-extension-recordings-keep-your-selected-microphone.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-clip-recordings-now-use-streaming-uploads-by-default.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-clip-titles-in-the-library-grid-now-open-the-clip-instead-of.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-desktop-countdown-now-dims-the-screen-before-recording.md +5 -0
- package/corpus/templates/clips/changelog/2026-07-06-desktop-popover-no-longer-drops-bluetooth-headphones-into-call-quality-mode.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-desktop-recorder-now-refreshes-cameras-and-mics-when-the-pop.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-desktop-recordings-keep-microphone-volume-clear-while-recor.md +5 -0
- package/corpus/templates/clips/changelog/2026-07-06-desktop-recordings-no-longer-get-stuck-optimizing-when-scree.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-dictation-history-from-the-desktop-app-now-appears-in-the-di.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-dictation-no-longer-overwrites-your-clipboard-and-messaging-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-double-tap-your-dictation-key-for-hands-free-dictation-tap-a.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-fixed-desktop-recordings-sometimes-uploading-without-audio-a.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-fixed-desktop-recordings-that-could-get-stuck-uploading-and-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-fixed-recordings-sometimes-capturing-from-the-wrong-micropho.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-hands-free-dictation-and-meeting-cleanup-recover-more-reliab.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-live-meetings-show-time-remaining-and-you-can-end-a-meeting-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-manage-your-personal-dictation-dictionary-from-the-dictate-t.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-meetings-interrupted-by-quitting-or-crashing-now-close-out-c.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-mic-only-desktop-recordings-now-use-the-selected-microphone-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-paste-your-last-dictation-anytime-with-cmd-ctrl-v-or-from-th.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-press-esc-to-cancel-a-dictation-in-progress.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-recordings-whose-video-file-contains-no-audio-track-no-longe.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-search-inside-meeting-transcripts.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-see-who-viewed-your-shared-clips-and-when-click-the-view-cou.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-share-links-for-agents-now-appear-as-soon-as-the-share-menu-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-share-popovers-now-stay-above-video-playback-controls.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-shared-clip-pages-now-recover-automatically-from-transient-v.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-the-desktop-app-now-walks-you-through-permissions-on-first-l.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-transcript-cleanup-preferences-now-save-per-user.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-transcripts-now-retry-automatically-after-transient-failures.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-06-video-compression-now-runs-in-the-background-without-blocking.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-native-microphone-recordings-now-reduce-steady-background-noise.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-recording-transcripts-now-line-up-with-the-video-start-afte.md +6 -0
- package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
- package/corpus/templates/clips/chrome-extension/src/background.ts +141 -48
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +383 -59
- package/corpus/templates/clips/chrome-extension/src/overlay.ts +51 -10
- package/corpus/templates/clips/chrome-extension/src/popup.ts +57 -6
- package/corpus/templates/clips/desktop/package.json +1 -1
- package/corpus/templates/clips/desktop/scripts/sign-macos-local.ts +67 -0
- package/corpus/templates/clips/desktop/src/app.tsx +38 -13
- package/corpus/templates/clips/desktop/src/components/SourceRow.tsx +1 -0
- package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +88 -28
- package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +165 -55
- package/corpus/templates/clips/desktop/src/hooks/useMicMeter.ts +35 -10
- package/corpus/templates/clips/desktop/src/lib/backtrack.ts +12 -0
- package/corpus/templates/clips/desktop/src/lib/media-capture-constraints.ts +129 -34
- package/corpus/templates/clips/desktop/src/lib/media-device-selection.ts +157 -0
- package/corpus/templates/clips/desktop/src/lib/permissions.ts +2 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +109 -47
- package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +22 -2
- package/corpus/templates/clips/desktop/src/lib/transcription-engine.ts +29 -1
- package/corpus/templates/clips/desktop/src/lib/updater.ts +6 -0
- package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +372 -31
- package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +90 -0
- package/corpus/templates/clips/desktop/src/overlays/flow-bar.tsx +4 -6
- package/corpus/templates/clips/desktop/src/overlays/onboarding.tsx +214 -9
- package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +37 -52
- package/corpus/templates/clips/desktop/src/styles.css +1 -1
- package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +7 -0
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +371 -43
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +79 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +1418 -260
- package/corpus/templates/clips/desktop/src-tauri/src/native_speech.rs +188 -44
- package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +197 -8
- package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +64 -8
- package/corpus/templates/clips/desktop/src-tauri/src/state.rs +3 -2
- package/corpus/templates/clips/desktop/src-tauri/src/system_audio.rs +10 -0
- package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +29 -8
- package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +136 -13
- package/corpus/templates/clips/desktop/vite.config.ts +3 -0
- package/corpus/templates/clips/package.json +1 -1
- package/corpus/templates/clips/server/db/schema.ts +26 -0
- package/corpus/templates/clips/server/jobs/builder-media-compression.ts +41 -0
- package/corpus/templates/clips/server/jobs/stale-meeting-sweeper.ts +294 -0
- package/corpus/templates/clips/server/lib/builder-media-compression.ts +976 -0
- package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +107 -56
- package/corpus/templates/clips/server/lib/env-flags.ts +4 -0
- package/corpus/templates/clips/server/lib/google-calendar-client.ts +8 -1
- package/corpus/templates/clips/server/lib/media-worker.ts +153 -0
- package/corpus/templates/clips/server/lib/s3-upload-provider.ts +58 -17
- package/corpus/templates/clips/server/lib/streaming-upload-mode.ts +17 -5
- package/corpus/templates/clips/server/lib/video-remux.ts +90 -0
- package/corpus/templates/clips/server/plugins/calendar-jobs.ts +4 -0
- package/corpus/templates/clips/server/plugins/db.ts +196 -0
- package/corpus/templates/clips/server/register-secrets.ts +78 -0
- package/corpus/templates/clips/server/routes/_agent-native/clips/user-prefs.get.ts +15 -0
- package/corpus/templates/clips/server/routes/_agent-native/clips/user-prefs.put.ts +27 -0
- package/corpus/templates/clips/server/routes/api/media-worker/callback.post.ts +88 -0
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +87 -7
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +7 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +35 -10
- package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +24 -42
- package/corpus/templates/clips/server/routes/api/view-event.post.ts +29 -1
- package/corpus/templates/clips/shared/media-device-selection.ts +157 -0
- package/corpus/templates/clips/shared/media-worker-contract.ts +146 -0
- package/corpus/templates/content/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +67 -2
- package/corpus/templates/content/AGENTS.md +22 -14
- package/corpus/templates/content/actions/_local-file-documents.ts +90 -1
- package/corpus/templates/content/actions/_notion-action-utils.ts +6 -2
- package/corpus/templates/content/actions/delete-document.ts +8 -0
- package/corpus/templates/content/actions/remove-local-file-source.ts +100 -0
- package/corpus/templates/content/actions/sync-notion-comments.ts +174 -20
- package/corpus/templates/content/actions/update-document.ts +91 -5
- package/corpus/templates/content/app/blocks/SourceComponentBlock.tsx +31 -3
- package/corpus/templates/content/app/blocks/contentBlockRegistry.tsx +4 -4
- package/corpus/templates/content/app/components/EmptyState.tsx +1 -1
- package/corpus/templates/content/app/components/ThemeToggle.tsx +6 -6
- package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
- package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +5 -5
- package/corpus/templates/content/app/components/editor/ContentReferencePreview.tsx +1 -1
- package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +10 -14630
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +72 -51
- package/corpus/templates/content/app/components/editor/DocumentEditorSkeleton.tsx +36 -0
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +29 -29
- package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +29 -44
- package/corpus/templates/content/app/components/editor/EmojiPicker.tsx +5 -4
- package/corpus/templates/content/app/components/editor/LinkHoverPreview.tsx +5 -4
- package/corpus/templates/content/app/components/editor/NotionConflictBanner.tsx +1 -1
- package/corpus/templates/content/app/components/editor/NotionSyncBar.tsx +2 -2
- package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +5 -5
- package/corpus/templates/content/app/components/editor/TableHoverControls.tsx +13 -13
- package/corpus/templates/content/app/components/editor/VersionHistoryPanel.tsx +10 -10
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +24 -7
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +2856 -8389
- package/corpus/templates/content/app/components/editor/database/navigation-state.ts +36 -1
- package/corpus/templates/content/app/components/editor/database/settings.tsx +3224 -0
- package/corpus/templates/content/app/components/editor/database/shared.tsx +19 -19
- package/corpus/templates/content/app/components/editor/database/text.ts +23 -0
- package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +9 -8
- package/corpus/templates/content/app/components/editor/extensions/AudioBlock.tsx +19 -18
- package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +21 -20
- package/corpus/templates/content/app/components/editor/extensions/LocalMdxComponentNode.tsx +8 -8
- package/corpus/templates/content/app/components/editor/extensions/NotionExtensions.tsx +9 -0
- package/corpus/templates/content/app/components/editor/extensions/VideoBlock.tsx +19 -18
- package/corpus/templates/content/app/components/layout/Header.tsx +1 -5
- package/corpus/templates/content/app/components/layout/Layout.tsx +25 -8
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +203 -55
- package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +22 -22
- package/corpus/templates/content/app/components/sidebar/NotionButton.tsx +11 -11
- package/corpus/templates/content/app/components/sidebar/document-sidebar-sections.ts +109 -1
- package/corpus/templates/content/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/content/app/components/ui/button.tsx +1 -0
- package/corpus/templates/content/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/content/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/content/app/components/ui/input.tsx +1 -0
- package/corpus/templates/content/app/components/ui/label.tsx +1 -0
- package/corpus/templates/content/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/content/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/content/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/content/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/content/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/content/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/content/app/components/ui/table.tsx +1 -0
- package/corpus/templates/content/app/components/ui/toaster.tsx +1 -0
- package/corpus/templates/content/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/content/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/content/app/global.css +1 -0
- package/corpus/templates/content/app/hooks/use-documents.ts +89 -37
- package/corpus/templates/content/app/hooks/use-mobile.ts +1 -0
- package/corpus/templates/content/app/hooks/use-notion.ts +73 -5
- package/corpus/templates/content/app/i18n/zh-TW.ts +14 -0
- package/corpus/templates/content/app/i18n-data.ts +153 -0
- package/corpus/templates/content/app/root.tsx +35 -29
- package/corpus/templates/content/app/routes/_app._index.tsx +1 -1
- package/corpus/templates/content/app/routes/_app.local-files.tsx +268 -81
- package/corpus/templates/content/app/routes/_app.settings.tsx +4 -21
- package/corpus/templates/content/changelog/2026-07-01-builder-source-components-show-preservation-and-review-states.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-document-headers-and-page-bodies-now-share-one-background-shade.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-export-submenus-stay-visible-outside-the-page-actions-menu.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-fixed-collaborative-documents-reapplying-content-before-save.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-local-files-now-remember-sidebar-collapse-state-and-include-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-notion-comment-sync-now-preserves-threads-replies-stay-attac.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-notion-sync-is-far-more-reliable-auto-sync-no-longer-overwri.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-opening-pages-now-highlights-the-sidebar-item-and-shows-the-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-presence-markers-in-the-editor-are-now-compact-instead-of-co.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-sidebar-collapse-now-keeps-the-same-background-shade-as-the-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-06-the-content-header-no-longer-shows-the-global-notifications-.md +6 -0
- package/corpus/templates/content/parity/matrix.md +24 -24
- package/corpus/templates/content/parity/matrix.ts +7 -3
- package/corpus/templates/content/server/db/schema.ts +15 -0
- package/corpus/templates/content/server/lib/notion-sync.ts +481 -39
- package/corpus/templates/content/server/lib/notion.ts +212 -48
- package/corpus/templates/content/server/plugins/db.ts +20 -0
- package/corpus/templates/content/server/routes/api/documents/[id]/notion/resolve.post.ts +14 -2
- package/corpus/templates/content/server/routes/api/notion/callback.get.ts +54 -6
- package/corpus/templates/content/shared/builder-mdx.ts +68 -12
- package/corpus/templates/content/shared/builder-source-component-registry.ts +177 -0
- package/corpus/templates/content/shared/nfm.ts +459 -66
- package/corpus/templates/content/shared/source-component-block.ts +72 -6
- package/corpus/templates/content/vite.config.ts +17 -1
- package/corpus/templates/design/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +21 -12
- package/corpus/templates/design/AGENTS.md +3 -2
- package/corpus/templates/design/actions/import-design-source.ts +8 -58
- package/corpus/templates/design/actions/run-design-audit.ts +127 -1
- package/corpus/templates/design/actions/take-design-screenshot.ts +673 -0
- package/corpus/templates/design/app/components/ThemeToggle.tsx +6 -6
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +11 -11
- package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +2 -2
- package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +16 -21
- package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +6 -97
- package/corpus/templates/design/app/components/design/DrawOverlay.tsx +7 -7
- package/corpus/templates/design/app/components/design/EditPanel.tsx +30 -30
- package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +9 -8
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +14 -14
- package/corpus/templates/design/app/components/design/LocalhostWriteConsentDialog.tsx +6 -5
- package/corpus/templates/design/app/components/design/MotionDock.tsx +15 -15
- package/corpus/templates/design/app/components/design/QuestionFlow.tsx +3 -3
- package/corpus/templates/design/app/components/design/ReviewPanel.tsx +3 -3
- package/corpus/templates/design/app/components/design/StatesPanel.tsx +13 -13
- package/corpus/templates/design/app/components/design/TokensPanel.tsx +14 -14
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +6 -6
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +39 -9
- package/corpus/templates/design/app/components/design/code-workbench/ActivityBar.tsx +3 -3
- package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +4 -7
- package/corpus/templates/design/app/components/design/code-workbench/editor/EditorTabs.tsx +6 -6
- package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +2 -1
- package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +17 -17
- package/corpus/templates/design/app/components/design/code-workbench/search/SearchView.tsx +6 -6
- package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +3 -3
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +7 -7
- package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +3 -3
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +18 -18
- package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +6 -6
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +6 -6
- package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +7 -7
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +7 -7
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -14
- package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +9 -9
- package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +6 -6
- package/corpus/templates/design/app/components/design-system/DesignSystemCard.tsx +3 -2
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +15 -18
- package/corpus/templates/design/app/components/layout/Header.tsx +2 -2
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +5 -5
- package/corpus/templates/design/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/design/app/components/ui/avatar.tsx +1 -0
- package/corpus/templates/design/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/design/app/components/ui/button.tsx +1 -0
- package/corpus/templates/design/app/components/ui/card.tsx +1 -0
- package/corpus/templates/design/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/design/app/components/ui/collapsible.tsx +1 -0
- package/corpus/templates/design/app/components/ui/context-menu.tsx +1 -0
- package/corpus/templates/design/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/design/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/design/app/components/ui/input.tsx +1 -0
- package/corpus/templates/design/app/components/ui/label.tsx +1 -0
- package/corpus/templates/design/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/design/app/components/ui/select.tsx +1 -0
- package/corpus/templates/design/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/design/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/design/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/design/app/components/ui/slider.tsx +1 -0
- package/corpus/templates/design/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/design/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/design/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/design/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/design/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/design/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/design/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +7 -7
- package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +7 -7
- package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +3 -3
- package/corpus/templates/design/app/global.css +1 -0
- package/corpus/templates/design/app/i18n/zh-TW.ts +3 -4
- package/corpus/templates/design/app/i18n-data.ts +38 -35
- package/corpus/templates/design/app/pages/DesignEditor.tsx +47 -51
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +6 -6
- package/corpus/templates/design/app/pages/DesignSystems.tsx +31 -31
- package/corpus/templates/design/app/pages/Index.tsx +25 -29
- package/corpus/templates/design/app/pages/NotFound.tsx +2 -1
- package/corpus/templates/design/app/pages/Present.tsx +2 -1
- package/corpus/templates/design/app/pages/VisualEdit.tsx +2 -1
- package/corpus/templates/design/app/root.tsx +7 -4
- package/corpus/templates/design/app/routes/settings.tsx +22 -49
- package/corpus/templates/design/changelog/2026-07-05-code-sidebar-tabs-now-use-a-quieter-active-highlight-that-ma.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-fig-files-now-stay-on-the-builder-indexing-path-through-desi.md +6 -0
- package/corpus/templates/design/changelog/2026-07-06-mobile-layouts-no-longer-stack-two-top-headers.md +5 -0
- package/corpus/templates/design/changelog/2026-07-06-the-design-agent-now-visually-reviews-rendered-screenshots-o.md +6 -0
- package/corpus/templates/design/server/handlers/import-design-file.ts +4 -43
- package/corpus/templates/design/server/handlers/index-design-system-with-builder.ts +2 -2
- package/corpus/templates/design/server/lib/visible-clipboard-html.ts +32 -0
- package/corpus/templates/design/shared/design-review.ts +1 -0
- package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/dispatch/actions/list-staged-datasets.ts +3 -0
- package/corpus/templates/dispatch/app/routes/settings.tsx +3 -17
- package/corpus/templates/forms/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/forms/app/components/CloudUpgrade.tsx +10 -10
- package/corpus/templates/forms/app/components/ThemeToggle.tsx +5 -5
- package/corpus/templates/forms/app/components/builder/FieldPropertiesPanel.tsx +11 -10
- package/corpus/templates/forms/app/components/builder/FieldRenderer.tsx +10 -13
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +17 -17
- package/corpus/templates/forms/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/button.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/calendar.tsx +1 -1
- package/corpus/templates/forms/app/components/ui/card.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/command.tsx +1 -1
- package/corpus/templates/forms/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/input.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/label.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/radio-group.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/scroll-area.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/select.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/slider.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/table.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/forms/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/forms/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/forms/app/global.css +1 -0
- package/corpus/templates/forms/app/hooks/use-mobile.ts +1 -0
- package/corpus/templates/forms/app/hooks/use-navigation-state.ts +0 -1
- package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +24 -26
- package/corpus/templates/forms/app/pages/FormFillPage.tsx +2 -2
- package/corpus/templates/forms/app/pages/FormsListPage.tsx +21 -21
- package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +11 -11
- package/corpus/templates/forms/app/pages/ResponsesPage.tsx +4 -4
- package/corpus/templates/forms/app/root.tsx +11 -8
- package/corpus/templates/forms/app/routes/_app.settings.tsx +6 -21
- package/corpus/templates/forms/app/routes/form-preview.tsx +3 -3
- package/corpus/templates/forms/changelog/2026-07-06-the-form-builder-header-no-longer-shows-the-global-notificat.md +6 -0
- package/corpus/templates/macros/app/components/AddExerciseDialog.tsx +1 -1
- package/corpus/templates/macros/app/components/AddMealDialog.tsx +1 -1
- package/corpus/templates/macros/app/components/AddWeightDialog.tsx +1 -1
- package/corpus/templates/macros/app/components/DailyProgress.tsx +7 -7
- package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +2 -1
- package/corpus/templates/macros/app/components/WeightCard.tsx +10 -10
- package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +6 -10
- package/corpus/templates/macros/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/macros/app/components/ui/label.tsx +1 -0
- package/corpus/templates/macros/app/components/ui/select.tsx +1 -0
- package/corpus/templates/macros/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/macros/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/macros/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/macros/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/macros/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/macros/app/global.css +1 -0
- package/corpus/templates/macros/app/root.tsx +17 -14
- package/corpus/templates/macros/app/routes/_index.tsx +1 -1
- package/corpus/templates/macros/app/routes/analytics.tsx +8 -8
- package/corpus/templates/macros/app/routes/settings.tsx +4 -19
- package/corpus/templates/mail/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/mail/.agents/skills/contacts-and-crm/SKILL.md +67 -0
- package/corpus/templates/mail/.agents/skills/draft-queue/SKILL.md +35 -1
- package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +74 -33
- package/corpus/templates/mail/AGENTS.md +102 -16
- package/corpus/templates/mail/actions/archive-email.ts +67 -11
- package/corpus/templates/mail/actions/manage-snippets.ts +106 -0
- package/corpus/templates/mail/actions/mark-read.ts +45 -11
- package/corpus/templates/mail/actions/send-queued-drafts.ts +77 -42
- package/corpus/templates/mail/actions/star-email.ts +55 -10
- package/corpus/templates/mail/actions/trash-email.ts +48 -9
- package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +1 -1
- package/corpus/templates/mail/app/components/ThemeToggle.tsx +6 -6
- package/corpus/templates/mail/app/components/agent-engine-picker.tsx +10 -10
- package/corpus/templates/mail/app/components/email/CodeBlockLangPicker.tsx +4 -3
- package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +5 -5
- package/corpus/templates/mail/app/components/email/ComposeEditor.tsx +109 -10
- package/corpus/templates/mail/app/components/email/ComposeModal.tsx +44 -19
- package/corpus/templates/mail/app/components/email/ComposeSlashMenu.tsx +139 -17
- package/corpus/templates/mail/app/components/email/EmailList.tsx +522 -314
- package/corpus/templates/mail/app/components/email/EmailListItem.tsx +130 -45
- package/corpus/templates/mail/app/components/email/EmailThread.tsx +9 -9
- package/corpus/templates/mail/app/components/email/InlineReplyComposer.tsx +35 -13
- package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +13 -13
- package/corpus/templates/mail/app/components/email/MobileActionBar.tsx +13 -13
- package/corpus/templates/mail/app/components/email/RecipientInput.tsx +53 -42
- package/corpus/templates/mail/app/components/email/SendLaterButton.tsx +5 -4
- package/corpus/templates/mail/app/components/email/SnoozeModal.tsx +1 -1
- package/corpus/templates/mail/app/components/email/SnoozePopover.tsx +6 -6
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +19 -23
- package/corpus/templates/mail/app/components/layout/HeaderActions.tsx +12 -4
- package/corpus/templates/mail/app/components/layout/SearchBar.tsx +138 -18
- package/corpus/templates/mail/app/components/settings/GmailFiltersSection.tsx +23 -23
- package/corpus/templates/mail/app/components/settings/SnippetsSection.tsx +303 -0
- package/corpus/templates/mail/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/button.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/calendar.tsx +1 -1
- package/corpus/templates/mail/app/components/ui/command.tsx +1 -1
- package/corpus/templates/mail/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/drawer.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/select.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/mail/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/mail/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/mail/app/global.css +20 -3
- package/corpus/templates/mail/app/hooks/use-emails.ts +187 -0
- package/corpus/templates/mail/app/hooks/use-snippets.ts +103 -0
- package/corpus/templates/mail/app/i18n/ar-SA.ts +17 -0
- package/corpus/templates/mail/app/i18n/de-DE.ts +18 -0
- package/corpus/templates/mail/app/i18n/en-US.ts +17 -0
- package/corpus/templates/mail/app/i18n/es-ES.ts +17 -0
- package/corpus/templates/mail/app/i18n/fr-FR.ts +18 -0
- package/corpus/templates/mail/app/i18n/hi-IN.ts +17 -0
- package/corpus/templates/mail/app/i18n/ja-JP.ts +18 -0
- package/corpus/templates/mail/app/i18n/ko-KR.ts +17 -0
- package/corpus/templates/mail/app/i18n/pt-BR.ts +17 -0
- package/corpus/templates/mail/app/i18n/zh-CN.ts +16 -0
- package/corpus/templates/mail/app/i18n/zh-TW.ts +16 -0
- package/corpus/templates/mail/app/pages/DraftQueuePage.tsx +14 -14
- package/corpus/templates/mail/app/pages/InboxPage.tsx +3 -3
- package/corpus/templates/mail/app/pages/NotFound.tsx +2 -1
- package/corpus/templates/mail/app/pages/SettingsPage.tsx +64 -66
- package/corpus/templates/mail/app/root.tsx +21 -18
- package/corpus/templates/mail/app/routes/_index.tsx +2 -1
- package/corpus/templates/mail/app/routes/email.tsx +2 -2
- package/corpus/templates/mail/changelog/2026-07-06-a-queued-draft-can-no-longer-be-sent-twice-by-simultaneous-s.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-bulk-archive-trash-star-and-mark-read-now-complete-in-one-fa.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-dark-mode-sidebars-and-notifications-now-use-the-softer-gray.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-inbox-automations-pick-up-new-mail-faster.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-inbox-lists-stay-fast-as-scheduled-and-snoozed-mail-accumula.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-long-inboxes-scroll-smoothly-and-stay-fast-as-more-mail-load.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-paste-or-drop-images-straight-into-the-composer-to-send-them.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-save-reusable-snippets-and-insert-them-from-the-compose-slas.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-scrolling-older-mail-keeps-loading-correctly-when-no-gmail-a.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-search-shows-instant-matches-from-already-loaded-mail-while-.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-sends-now-fail-with-a-clear-error-instead-of-quietly-missing.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-06-the-mail-header-no-longer-shows-the-global-notifications-bel.md +6 -0
- package/corpus/templates/mail/package.json +1 -0
- package/corpus/templates/mail/server/db/schema.ts +11 -0
- package/corpus/templates/mail/server/handlers/emails.ts +20 -1
- package/corpus/templates/mail/server/lib/automation-engine.ts +53 -25
- package/corpus/templates/mail/server/lib/google-auth.ts +140 -9
- package/corpus/templates/mail/server/lib/jobs.ts +22 -6
- package/corpus/templates/mail/server/lib/outgoing-email.ts +11 -2
- package/corpus/templates/mail/server/lib/queued-drafts.ts +145 -4
- package/corpus/templates/mail/server/plugins/db.ts +29 -0
- package/corpus/templates/plan/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +42 -3
- package/corpus/templates/plan/app/components/layout/Layout.tsx +5 -4
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +20 -20
- package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +3 -2
- package/corpus/templates/plan/app/components/plan/DocumentArea.tsx +2 -2
- package/corpus/templates/plan/app/components/plan/GuestModeBanner.tsx +2 -1
- package/corpus/templates/plan/app/components/plan/LocalCodebasePicker.tsx +8 -8
- package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +6 -1
- package/corpus/templates/plan/app/components/plan/PlanImageViewer.tsx +8 -12
- package/corpus/templates/plan/app/components/plan/PlanMarkdownEditor.tsx +6 -1
- package/corpus/templates/plan/app/components/plan/PlanVisualSurface.tsx +3 -3
- package/corpus/templates/plan/app/components/plan/planBlocks.tsx +4 -4
- package/corpus/templates/plan/app/components/plan/wireframe/kit/rough.tsx +61 -27
- package/corpus/templates/plan/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/avatar.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/button.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/card.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/collapsible.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/input.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/label.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/scroll-area.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/select.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/sonner.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/toggle-group.tsx +1 -0
- package/corpus/templates/plan/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/plan/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/plan/app/global.css +13 -0
- package/corpus/templates/plan/app/hooks/use-plan-presence.ts +11 -1
- package/corpus/templates/plan/app/lib/plan-access-prompt.ts +74 -0
- package/corpus/templates/plan/app/lib/plan-annotation-runtime.ts +1435 -0
- package/corpus/templates/plan/app/lib/plan-comment-editor-helpers.ts +142 -0
- package/corpus/templates/plan/app/lib/plan-local-bridge.ts +376 -0
- package/corpus/templates/plan/app/lib/plan-native-anchors.ts +682 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +216 -2747
- package/corpus/templates/plan/app/root.tsx +13 -10
- package/corpus/templates/plan/app/routes/_index.tsx +1 -2
- package/corpus/templates/plan/app/routes/local-plans.$slug.tsx +1 -1
- package/corpus/templates/plan/app/routes/plans.$id.tsx +1 -2
- package/corpus/templates/plan/app/routes/plans.tsx +1 -2
- package/corpus/templates/plan/app/routes/recaps.$id.tsx +1 -2
- package/corpus/templates/plan/app/routes/recaps.tsx +1 -2
- package/corpus/templates/plan/app/routes/settings.tsx +7 -21
- package/corpus/templates/plan/changelog/2026-07-05-plan-pages-open-at-the-top-unless-a-shared-link-targets-a-sp.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-06-fixed-collaborative-plan-editing-so-content-no-longer-duplic.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-06-fixed-visual-reports-using-excessive-cpu-while-rendering-ske.md +6 -0
- package/corpus/templates/slides/.agents/skills/actions/SKILL.md +55 -0
- package/corpus/templates/slides/app/components/ThemeToggle.tsx +6 -6
- package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +5 -5
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +7 -7
- package/corpus/templates/slides/app/components/deck/ExcalidrawSlide.tsx +2 -1
- package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +1 -1
- package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +3 -2
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +15 -14
- package/corpus/templates/slides/app/components/editor/AnimationsPanel.tsx +7 -7
- package/corpus/templates/slides/app/components/editor/BlockBubbleMenu.tsx +5 -5
- package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +6 -6
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +14 -14
- package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +10 -9
- package/corpus/templates/slides/app/components/editor/GenerateSlidesDialog.tsx +6 -5
- package/corpus/templates/slides/app/components/editor/HistoryPanel.tsx +12 -12
- package/corpus/templates/slides/app/components/editor/ImageDropPromptPopover.tsx +4 -3
- package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +5 -4
- package/corpus/templates/slides/app/components/editor/ImportButton.tsx +4 -3
- package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +2 -1
- package/corpus/templates/slides/app/components/editor/ShareDialog.tsx +10 -10
- package/corpus/templates/slides/app/components/editor/SlideBubbleMenu.tsx +10 -10
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +6 -6
- package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +2 -1
- package/corpus/templates/slides/app/components/editor/TweaksPanel.tsx +1 -1
- package/corpus/templates/slides/app/components/layout/Header.tsx +2 -2
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
- package/corpus/templates/slides/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/button.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/card.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/input.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/label.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/scroll-area.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/select.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/separator.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/spinner.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/toast.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/toaster.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/toggle-group.tsx +1 -0
- package/corpus/templates/slides/app/components/ui/toolkit-provider.tsx +12 -0
- package/corpus/templates/slides/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +6 -6
- package/corpus/templates/slides/app/components/visual-editor/DrawOverlay.tsx +7 -7
- package/corpus/templates/slides/app/global.css +1 -0
- package/corpus/templates/slides/app/hooks/use-toast.ts +1 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +3 -3
- package/corpus/templates/slides/app/pages/DesignSystems.tsx +1 -1
- package/corpus/templates/slides/app/pages/Index.tsx +14 -17
- package/corpus/templates/slides/app/root.tsx +13 -10
- package/corpus/templates/slides/app/routes/settings.tsx +6 -21
- package/corpus/templates/slides/changelog/2026-07-06-mobile-layouts-no-longer-stack-two-top-headers.md +5 -0
- package/corpus/templates/slides/server/handlers/uploads.ts +7 -2
- package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
- package/dist/agent/durable-background.d.ts +29 -0
- package/dist/agent/durable-background.d.ts.map +1 -1
- package/dist/agent/durable-background.js +46 -0
- package/dist/agent/durable-background.js.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +7 -2
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +28 -2
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +1 -1
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/engine/output-tokens.d.ts +3 -3
- package/dist/agent/engine/output-tokens.d.ts.map +1 -1
- package/dist/agent/engine/output-tokens.js +16 -14
- package/dist/agent/engine/output-tokens.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +3 -3
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +28 -25
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/engine/translate-ai-sdk.d.ts +14 -2
- package/dist/agent/engine/translate-ai-sdk.d.ts.map +1 -1
- package/dist/agent/engine/translate-ai-sdk.js +33 -18
- package/dist/agent/engine/translate-ai-sdk.js.map +1 -1
- package/dist/agent/engine/translate-anthropic.d.ts.map +1 -1
- package/dist/agent/engine/translate-anthropic.js +42 -1
- package/dist/agent/engine/translate-anthropic.js.map +1 -1
- package/dist/agent/engine/types.d.ts +15 -0
- package/dist/agent/engine/types.d.ts.map +1 -1
- package/dist/agent/engine/types.js.map +1 -1
- package/dist/agent/model-config.d.ts +8 -0
- package/dist/agent/model-config.d.ts.map +1 -1
- package/dist/agent/model-config.js +86 -0
- package/dist/agent/model-config.js.map +1 -1
- package/dist/agent/production-agent.d.ts +91 -5
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +389 -180
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/runtime-context.d.ts +29 -0
- package/dist/agent/runtime-context.d.ts.map +1 -1
- package/dist/agent/runtime-context.js +40 -11
- package/dist/agent/runtime-context.js.map +1 -1
- package/dist/agent/tool-result-images.d.ts +49 -0
- package/dist/agent/tool-result-images.d.ts.map +1 -0
- package/dist/agent/tool-result-images.js +141 -0
- package/dist/agent/tool-result-images.js.map +1 -0
- package/dist/brand-kit/fig/index.d.ts.map +1 -1
- package/dist/brand-kit/fig/index.js +6 -3
- package/dist/brand-kit/fig/index.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +66 -17
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +72 -40
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/KeepTabOpenNotice.d.ts +55 -0
- package/dist/client/KeepTabOpenNotice.d.ts.map +1 -0
- package/dist/client/KeepTabOpenNotice.js +85 -0
- package/dist/client/KeepTabOpenNotice.js.map +1 -0
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +2 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/RunStuckBanner.d.ts +7 -1
- package/dist/client/RunStuckBanner.d.ts.map +1 -1
- package/dist/client/RunStuckBanner.js +7 -2
- package/dist/client/RunStuckBanner.js.map +1 -1
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +7 -1
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/clipboard.d.ts.map +1 -1
- package/dist/client/clipboard.js +5 -6
- package/dist/client/clipboard.js.map +1 -1
- package/dist/client/components/AgentPresenceChip.d.ts +1 -11
- package/dist/client/components/AgentPresenceChip.d.ts.map +1 -1
- package/dist/client/components/AgentPresenceChip.js +1 -41
- package/dist/client/components/AgentPresenceChip.js.map +1 -1
- package/dist/client/components/LiveCursorOverlay.d.ts +1 -44
- package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
- package/dist/client/components/LiveCursorOverlay.js +1 -123
- package/dist/client/components/LiveCursorOverlay.js.map +1 -1
- package/dist/client/components/PresenceBar.d.ts +1 -26
- package/dist/client/components/PresenceBar.d.ts.map +1 -1
- package/dist/client/components/PresenceBar.js +1 -164
- package/dist/client/components/PresenceBar.js.map +1 -1
- package/dist/client/components/RecentEditHighlights.d.ts +1 -42
- package/dist/client/components/RecentEditHighlights.d.ts.map +1 -1
- package/dist/client/components/RecentEditHighlights.js +1 -145
- package/dist/client/components/RecentEditHighlights.js.map +1 -1
- package/dist/client/components/RemoteSelectionRings.d.ts +1 -51
- package/dist/client/components/RemoteSelectionRings.d.ts.map +1 -1
- package/dist/client/components/RemoteSelectionRings.js +1 -129
- package/dist/client/components/RemoteSelectionRings.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +4 -0
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +74 -26
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/db-admin/SqlEditor.d.ts.map +1 -1
- package/dist/client/db-admin/SqlEditor.js +13 -3
- package/dist/client/db-admin/SqlEditor.js.map +1 -1
- package/dist/client/dynamic-suggestions.d.ts.map +1 -1
- package/dist/client/dynamic-suggestions.js +7 -1
- package/dist/client/dynamic-suggestions.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +7 -7
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsListPage.js +5 -7
- package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/host-bridge.d.ts +2 -0
- package/dist/client/host-bridge.d.ts.map +1 -1
- package/dist/client/host-bridge.js +26 -10
- package/dist/client/host-bridge.js.map +1 -1
- package/dist/client/i18n.d.ts +1 -0
- package/dist/client/i18n.d.ts.map +1 -1
- package/dist/client/i18n.js +3 -1
- package/dist/client/i18n.js.map +1 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.js +12 -31
- package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +3 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.js +2 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts +3 -1
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/useCollabReconcile.js +6 -2
- package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts +3 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +103 -9
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
- package/dist/client/settings/SettingsTabsPage.js +5 -5
- package/dist/client/settings/SettingsTabsPage.js.map +1 -1
- package/dist/client/settings/index.d.ts +1 -1
- package/dist/client/settings/index.d.ts.map +1 -1
- package/dist/client/settings/index.js +1 -1
- package/dist/client/settings/index.js.map +1 -1
- package/dist/client/sharing/VisibilityBadge.d.ts +1 -10
- package/dist/client/sharing/VisibilityBadge.d.ts.map +1 -1
- package/dist/client/sharing/VisibilityBadge.js +1 -18
- package/dist/client/sharing/VisibilityBadge.js.map +1 -1
- package/dist/client/use-run-stuck-detection.d.ts +8 -1
- package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
- package/dist/client/use-run-stuck-detection.js +3 -2
- package/dist/client/use-run-stuck-detection.js.map +1 -1
- package/dist/coding-tools/run-code.d.ts +36 -0
- package/dist/coding-tools/run-code.d.ts.map +1 -1
- package/dist/coding-tools/run-code.js +333 -62
- package/dist/coding-tools/run-code.js.map +1 -1
- package/dist/coding-tools/sandbox/background.d.ts +141 -0
- package/dist/coding-tools/sandbox/background.d.ts.map +1 -0
- package/dist/coding-tools/sandbox/background.js +279 -0
- package/dist/coding-tools/sandbox/background.js.map +1 -0
- package/dist/coding-tools/sandbox/executions-store.d.ts +138 -0
- package/dist/coding-tools/sandbox/executions-store.d.ts.map +1 -0
- package/dist/coding-tools/sandbox/executions-store.js +380 -0
- package/dist/coding-tools/sandbox/executions-store.js.map +1 -0
- package/dist/coding-tools/sandbox/index.d.ts +22 -13
- package/dist/coding-tools/sandbox/index.d.ts.map +1 -1
- package/dist/coding-tools/sandbox/index.js +31 -13
- package/dist/coding-tools/sandbox/index.js.map +1 -1
- package/dist/coding-tools/sandbox/local-child-process-adapter.d.ts.map +1 -1
- package/dist/coding-tools/sandbox/local-child-process-adapter.js +61 -4
- package/dist/coding-tools/sandbox/local-child-process-adapter.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/client.d.ts +16 -12
- package/dist/collab/client.d.ts.map +1 -1
- package/dist/collab/client.js +744 -496
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/presence.d.ts +2 -20
- package/dist/collab/presence.d.ts.map +1 -1
- package/dist/collab/presence.js +3 -0
- package/dist/collab/presence.js.map +1 -1
- package/dist/collab/recent-edits.d.ts +2 -37
- package/dist/collab/recent-edits.d.ts.map +1 -1
- package/dist/collab/recent-edits.js +2 -9
- package/dist/collab/recent-edits.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/data-programs/actions.d.ts +19 -0
- package/dist/data-programs/actions.d.ts.map +1 -0
- package/dist/data-programs/actions.js +279 -0
- package/dist/data-programs/actions.js.map +1 -0
- package/dist/data-programs/contract.d.ts +70 -0
- package/dist/data-programs/contract.d.ts.map +1 -0
- package/dist/data-programs/contract.js +225 -0
- package/dist/data-programs/contract.js.map +1 -0
- package/dist/data-programs/execute.d.ts +96 -0
- package/dist/data-programs/execute.d.ts.map +1 -0
- package/dist/data-programs/execute.js +454 -0
- package/dist/data-programs/execute.js.map +1 -0
- package/dist/data-programs/index.d.ts +11 -0
- package/dist/data-programs/index.d.ts.map +1 -0
- package/dist/data-programs/index.js +11 -0
- package/dist/data-programs/index.js.map +1 -0
- package/dist/data-programs/schema.d.ts +517 -0
- package/dist/data-programs/schema.d.ts.map +1 -0
- package/dist/data-programs/schema.js +138 -0
- package/dist/data-programs/schema.js.map +1 -0
- package/dist/data-programs/store.d.ts +158 -0
- package/dist/data-programs/store.d.ts.map +1 -0
- package/dist/data-programs/store.js +493 -0
- package/dist/data-programs/store.js.map +1 -0
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +34 -0
- package/dist/deploy/build.js.map +1 -1
- package/dist/extensions/actions.js +2 -2
- package/dist/extensions/actions.js.map +1 -1
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +9 -0
- package/dist/file-upload/builder.js.map +1 -1
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +21 -10
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/local-artifacts/index.js +1 -1
- package/dist/local-artifacts/index.js.map +1 -1
- package/dist/localization/default-messages.d.ts +0 -1
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +1 -2
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp-client/index.d.ts +9 -0
- package/dist/mcp-client/index.d.ts.map +1 -1
- package/dist/mcp-client/index.js +23 -0
- package/dist/mcp-client/index.js.map +1 -1
- package/dist/observability/routes.d.ts +5 -5
- package/dist/onboarding/default-steps.d.ts.map +1 -1
- package/dist/onboarding/default-steps.js +2 -2
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/store.d.ts.map +1 -1
- package/dist/resources/store.js +35 -3
- package/dist/resources/store.js.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +4 -8
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/agent-engines/test-agent-engine.d.ts.map +1 -1
- package/dist/scripts/agent-engines/test-agent-engine.js +7 -2
- package/dist/scripts/agent-engines/test-agent-engine.js.map +1 -1
- package/dist/scripts/db/tool-mode.js +3 -3
- package/dist/scripts/db/tool-mode.js.map +1 -1
- package/dist/scripts/resources/migrate-learnings.d.ts +5 -1
- package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -1
- package/dist/scripts/resources/migrate-learnings.js +8 -10
- package/dist/scripts/resources/migrate-learnings.js.map +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-chat-plugin.d.ts +20 -6
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +138 -59
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-discovery.d.ts.map +1 -1
- package/dist/server/agent-discovery.js +62 -8
- package/dist/server/agent-discovery.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +75 -3
- package/dist/server/auth.js.map +1 -1
- package/dist/server/builder-design-systems.js +2 -2
- package/dist/server/builder-design-systems.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +100 -20
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +6 -3
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +25 -8
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/csrf.js +3 -0
- package/dist/server/csrf.js.map +1 -1
- package/dist/server/oauth-helpers.d.ts.map +1 -1
- package/dist/server/oauth-helpers.js +9 -1
- package/dist/server/oauth-helpers.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +80 -48
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/prompts/shared-rules.js +2 -2
- package/dist/server/prompts/shared-rules.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts.map +1 -1
- package/dist/server/transcribe-voice.js +77 -15
- package/dist/server/transcribe-voice.js.map +1 -1
- package/dist/styles/agent-native.css +57 -45
- package/dist/templates/default/.agents/skills/actions/SKILL.md +55 -0
- package/dist/templates/default/AGENTS.md +11 -14
- package/dist/templates/default/actions/navigate.ts +1 -1
- package/dist/templates/default/app/i18n/ar-SA.ts +0 -1
- package/dist/templates/default/app/i18n/de-DE.ts +0 -1
- package/dist/templates/default/app/i18n/en-US.ts +0 -1
- package/dist/templates/default/app/i18n/es-ES.ts +0 -1
- package/dist/templates/default/app/i18n/fr-FR.ts +0 -1
- package/dist/templates/default/app/i18n/hi-IN.ts +0 -1
- package/dist/templates/default/app/i18n/ja-JP.ts +0 -1
- package/dist/templates/default/app/i18n/ko-KR.ts +0 -1
- package/dist/templates/default/app/i18n/pt-BR.ts +0 -1
- package/dist/templates/default/app/i18n/zh-CN.ts +0 -1
- package/dist/templates/default/app/i18n/zh-TW.ts +0 -1
- package/dist/templates/default/app/routes/settings.tsx +22 -33
- package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +20 -7
- package/dist/templates/headless/AGENTS.md +9 -6
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +55 -0
- package/dist/templates/workspace-core/.agents/skills/data-programs/SKILL.md +128 -0
- package/dist/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +10 -4
- package/dist/vite/agents-bundle-plugin.d.ts.map +1 -1
- package/dist/vite/agents-bundle-plugin.js +26 -1
- package/dist/vite/agents-bundle-plugin.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +11 -0
- package/dist/vite/client.js.map +1 -1
- package/docs/content/agent-native-toolkit.mdx +87 -146
- package/docs/content/cloneable-saas.mdx +19 -19
- package/docs/content/components.mdx +16 -4
- package/docs/content/data-programs.mdx +329 -0
- package/docs/content/deployment.mdx +9 -9
- package/docs/content/extensions.mdx +8 -7
- package/docs/content/generative-ui.mdx +5 -3
- package/docs/content/key-concepts.mdx +6 -9
- package/docs/content/locales/ar-SA/agent-native-toolkit.mdx +100 -70
- package/docs/content/locales/ar-SA/cloneable-saas.mdx +19 -19
- package/docs/content/locales/ar-SA/components.mdx +12 -2
- package/docs/content/locales/ar-SA/data-programs.mdx +329 -0
- package/docs/content/locales/ar-SA/deployment.mdx +8 -9
- package/docs/content/locales/ar-SA/extensions.mdx +6 -4
- package/docs/content/locales/ar-SA/key-concepts.mdx +7 -9
- package/docs/content/locales/ar-SA/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/de-DE/agent-native-toolkit.mdx +100 -74
- package/docs/content/locales/de-DE/cloneable-saas.mdx +19 -19
- package/docs/content/locales/de-DE/components.mdx +12 -2
- package/docs/content/locales/de-DE/data-programs.mdx +329 -0
- package/docs/content/locales/de-DE/deployment.mdx +8 -9
- package/docs/content/locales/de-DE/extensions.mdx +6 -4
- package/docs/content/locales/de-DE/key-concepts.mdx +8 -10
- package/docs/content/locales/de-DE/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/es-ES/agent-native-toolkit.mdx +100 -74
- package/docs/content/locales/es-ES/cloneable-saas.mdx +19 -19
- package/docs/content/locales/es-ES/components.mdx +12 -2
- package/docs/content/locales/es-ES/data-programs.mdx +329 -0
- package/docs/content/locales/es-ES/deployment.mdx +8 -9
- package/docs/content/locales/es-ES/extensions.mdx +6 -4
- package/docs/content/locales/es-ES/key-concepts.mdx +8 -10
- package/docs/content/locales/es-ES/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/fr-FR/agent-native-toolkit.mdx +100 -76
- package/docs/content/locales/fr-FR/cloneable-saas.mdx +19 -19
- package/docs/content/locales/fr-FR/components.mdx +12 -2
- package/docs/content/locales/fr-FR/data-programs.mdx +329 -0
- package/docs/content/locales/fr-FR/deployment.mdx +8 -9
- package/docs/content/locales/fr-FR/extensions.mdx +6 -4
- package/docs/content/locales/fr-FR/key-concepts.mdx +8 -10
- package/docs/content/locales/fr-FR/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/hi-IN/agent-native-toolkit.mdx +100 -71
- package/docs/content/locales/hi-IN/cloneable-saas.mdx +19 -19
- package/docs/content/locales/hi-IN/components.mdx +20 -10
- package/docs/content/locales/hi-IN/data-programs.mdx +329 -0
- package/docs/content/locales/hi-IN/deployment.mdx +8 -9
- package/docs/content/locales/hi-IN/extensions.mdx +6 -4
- package/docs/content/locales/hi-IN/key-concepts.mdx +8 -10
- package/docs/content/locales/hi-IN/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/ja-JP/agent-native-toolkit.mdx +100 -64
- package/docs/content/locales/ja-JP/cloneable-saas.mdx +19 -19
- package/docs/content/locales/ja-JP/components.mdx +12 -2
- package/docs/content/locales/ja-JP/data-programs.mdx +329 -0
- package/docs/content/locales/ja-JP/deployment.mdx +8 -9
- package/docs/content/locales/ja-JP/extensions.mdx +6 -4
- package/docs/content/locales/ja-JP/key-concepts.mdx +9 -11
- package/docs/content/locales/ja-JP/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/ko-KR/agent-native-toolkit.mdx +100 -60
- package/docs/content/locales/ko-KR/cloneable-saas.mdx +19 -19
- package/docs/content/locales/ko-KR/components.mdx +20 -10
- package/docs/content/locales/ko-KR/data-programs.mdx +329 -0
- package/docs/content/locales/ko-KR/deployment.mdx +8 -9
- package/docs/content/locales/ko-KR/extensions.mdx +16 -14
- package/docs/content/locales/ko-KR/key-concepts.mdx +9 -11
- package/docs/content/locales/ko-KR/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/pt-BR/agent-native-toolkit.mdx +100 -74
- package/docs/content/locales/pt-BR/cloneable-saas.mdx +19 -19
- package/docs/content/locales/pt-BR/components.mdx +12 -2
- package/docs/content/locales/pt-BR/data-programs.mdx +329 -0
- package/docs/content/locales/pt-BR/deployment.mdx +8 -9
- package/docs/content/locales/pt-BR/extensions.mdx +6 -4
- package/docs/content/locales/pt-BR/key-concepts.mdx +8 -11
- package/docs/content/locales/pt-BR/real-time-collaboration.mdx +9 -10
- package/docs/content/locales/zh-CN/agent-native-toolkit.mdx +100 -58
- package/docs/content/locales/zh-CN/cloneable-saas.mdx +19 -19
- package/docs/content/locales/zh-CN/components.mdx +20 -10
- package/docs/content/locales/zh-CN/data-programs.mdx +329 -0
- package/docs/content/locales/zh-CN/deployment.mdx +7 -9
- package/docs/content/locales/zh-CN/extensions.mdx +16 -14
- package/docs/content/locales/zh-CN/key-concepts.mdx +7 -11
- package/docs/content/locales/zh-CN/real-time-collaboration.mdx +10 -11
- package/docs/content/locales/zh-TW/agent-native-toolkit.mdx +100 -58
- package/docs/content/locales/zh-TW/cloneable-saas.mdx +19 -19
- package/docs/content/locales/zh-TW/components.mdx +20 -10
- package/docs/content/locales/zh-TW/data-programs.mdx +329 -0
- package/docs/content/locales/zh-TW/deployment.mdx +7 -9
- package/docs/content/locales/zh-TW/extensions.mdx +16 -14
- package/docs/content/locales/zh-TW/key-concepts.mdx +7 -11
- package/docs/content/locales/zh-TW/real-time-collaboration.mdx +10 -11
- package/docs/content/real-time-collaboration.mdx +10 -11
- package/docs/content/toolkit-app-adapters.mdx +46 -0
- package/docs/content/toolkit-collaboration-ui.mdx +48 -0
- package/docs/content/toolkit-sharing-ui.mdx +33 -0
- package/docs/content/toolkit-shell-hooks.mdx +27 -0
- package/docs/content/toolkit-ui.mdx +69 -0
- package/package.json +6 -2
- package/src/templates/default/.agents/skills/actions/SKILL.md +55 -0
- package/src/templates/default/AGENTS.md +11 -14
- package/src/templates/default/actions/navigate.spec.ts +53 -0
- package/src/templates/default/actions/navigate.ts +1 -1
- package/src/templates/default/app/i18n/ar-SA.ts +0 -1
- package/src/templates/default/app/i18n/de-DE.ts +0 -1
- package/src/templates/default/app/i18n/en-US.ts +0 -1
- package/src/templates/default/app/i18n/es-ES.ts +0 -1
- package/src/templates/default/app/i18n/fr-FR.ts +0 -1
- package/src/templates/default/app/i18n/hi-IN.ts +0 -1
- package/src/templates/default/app/i18n/ja-JP.ts +0 -1
- package/src/templates/default/app/i18n/ko-KR.ts +0 -1
- package/src/templates/default/app/i18n/pt-BR.ts +0 -1
- package/src/templates/default/app/i18n/zh-CN.ts +0 -1
- package/src/templates/default/app/i18n/zh-TW.ts +0 -1
- package/src/templates/default/app/routes/settings.tsx +22 -33
- package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +20 -7
- package/src/templates/headless/AGENTS.md +9 -6
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +55 -0
- package/src/templates/workspace-core/.agents/skills/data-programs/SKILL.md +128 -0
- package/src/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +10 -4
- package/corpus/templates/design/server/lib/figma-import/clipboard.ts +0 -122
- package/corpus/templates/design/server/lib/figma-import/decode.ts +0 -455
- package/corpus/templates/design/server/lib/figma-import/processor.ts +0 -116
- package/corpus/templates/design/server/lib/figma-import/render-html.ts +0 -397
- package/corpus/templates/design/server/lib/figma-import/types.ts +0 -60
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcribe-voice.js","sourceRoot":"","sources":["../../src/server/transcribe-voice.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * POST /_agent-native/transcribe-voice\n *\n * Receives an audio blob from the agent sidebar composer and forwards it to\n * the configured transcription provider. Returns `{ text }` on success,\n * `{ error }` on failure.\n *\n * Key resolution order for BYOK providers:\n * 1. Request-scoped encrypted secret (`app_secrets`: user, org, workspace).\n * 2. Env var fallback only outside authenticated request contexts.\n *\n * If no server provider is configured, returns 400 with an error the\n * composer UI can surface (the client falls back to Web Speech when possible).\n *\n * This is a framework route rather than a `defineAction` because multipart\n * audio bodies aren't a clean fit for the action contract (actions are\n * typed JSON-in / JSON-out).\n */\n\nimport {\n defineEventHandler,\n getMethod,\n getRequestHeader,\n readMultipartFormData,\n setResponseStatus,\n type H3Event,\n} from \"h3\";\n\nimport { createBuilderEngine } from \"../agent/engine/builder-engine.js\";\nimport { appStateGet } from \"../application-state/store.js\";\nimport { getOrgContext } from \"../org/context.js\";\nimport { transcribeWithBuilder } from \"../transcription/builder-transcription.js\";\nimport {\n applyVoiceContextReplacements,\n buildVoiceGuidanceBlock,\n parseVoiceContextPack,\n voiceContextTermsOnly,\n type VoiceContextPack,\n} from \"../voice/index.js\";\nimport { getSession } from \"./auth.js\";\nimport {\n resolveHasBuilderPrivateKey,\n resolveSecret,\n} from \"./credential-provider.js\";\nimport { runWithRequestContext } from \"./request-context.js\";\n\nconst WHISPER_URL = \"https://api.openai.com/v1/audio/transcriptions\";\nconst GROQ_URL = \"https://api.groq.com/openai/v1/audio/transcriptions\";\nconst GROQ_CHAT_URL = \"https://api.groq.com/openai/v1/chat/completions\";\nconst GROQ_MODEL = \"whisper-large-v3-turbo\";\nconst GROQ_CLEANUP_MODEL = \"llama-3.3-70b-versatile\";\nconst OPENAI_MODEL = \"whisper-1\";\nconst OPENAI_CHAT_URL = \"https://api.openai.com/v1/chat/completions\";\nconst OPENAI_CLEANUP_MODEL = \"gpt-5.4-mini\";\nconst MAX_AUDIO_BYTES = 25 * 1024 * 1024; // Whisper hard limit.\nconst MAX_TRANSCRIPT_CHARS = 40_000;\n// Public Builder transcription model id. The Builder gateway maps this to\n// Gemini 3.1 Flash-Lite.\nconst BUILDER_GEMINI_TRANSCRIPTION_MODEL = \"gemini-3-1-flash-lite\";\n\n// Gemini Flash Lite BYOK path when GEMINI_API_KEY is configured.\n// Gemini accepts inline audio; we just give it the bytes and a \"transcribe\n// this\" prompt and it replies with text. 2.5x faster TTFT than 2.5 Flash\n// per Google's release notes, and noticeably snappier than the Whisper\n// round-trip even on a fast connection.\n// Keep the direct Google AI path on a stable public model id; Builder's\n// managed provider above handles the newer Gemini 3.1 Flash-Lite preview.\nconst GEMINI_MODEL = \"gemini-2.0-flash-lite\";\nconst GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent`;\n\n/**\n * Reject cross-site POSTs. Cookies are `SameSite=None; Secure` over HTTPS so\n * the browser would otherwise attach the session to a forged form submission\n * from evil.com, causing us to spend OpenAI credits on the user's behalf.\n * Same-origin browsers always send `Origin` on POST; if it's missing we fall\n * back to `Sec-Fetch-Site` so Safari's fetch-spec behavior still works.\n */\nfunction isSameOriginRequest(event: H3Event): boolean {\n const host = getRequestHeader(event, \"host\");\n const origin = getRequestHeader(event, \"origin\");\n if (origin && host) {\n try {\n const parsed = new URL(origin);\n if (parsed.host === host) return true;\n // Tauri desktop dev serves the tray WebView from localhost:1420 while\n // the app server lives on the template dev port. Production Tauri\n // WebViews can also send a tauri://localhost origin. Treat only those\n // desktop origins as trusted cross-origin callers; arbitrary websites\n // still fail the CSRF check.\n if (parsed.protocol === \"tauri:\" && parsed.hostname === \"localhost\") {\n return true;\n }\n if (\n (parsed.protocol === \"http:\" || parsed.protocol === \"https:\") &&\n parsed.hostname === \"tauri.localhost\" &&\n (host.startsWith(\"localhost:\") || host.startsWith(\"127.0.0.1:\"))\n ) {\n return true;\n }\n if (\n parsed.protocol === \"http:\" &&\n (parsed.hostname === \"localhost\" || parsed.hostname === \"127.0.0.1\") &&\n parsed.port === \"1420\" &&\n (host.startsWith(\"localhost:\") || host.startsWith(\"127.0.0.1:\"))\n ) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n const fetchSite = getRequestHeader(event, \"sec-fetch-site\");\n if (fetchSite) return fetchSite === \"same-origin\" || fetchSite === \"none\";\n // No Origin and no Sec-Fetch-Site: likely a non-browser client (curl,\n // server-side) — safe to allow, CSRF requires a browser with ambient cookies.\n return true;\n}\n\nexport function createTranscribeVoiceHandler() {\n return defineEventHandler(async (event: H3Event) => {\n if (getMethod(event) !== \"POST\") {\n setResponseStatus(event, 405);\n return { error: \"Method not allowed\" };\n }\n if (!isSameOriginRequest(event)) {\n setResponseStatus(event, 403);\n return { error: \"Cross-origin request rejected\" };\n }\n\n const parts = await readMultipartFormData(event).catch(() => null);\n const audio = parts?.find((p) => p.name === \"audio\");\n const textPart = parts?.find((p) => p.name === \"text\");\n const transcriptText = textPart?.data\n ? sanitizeTranscriptText(Buffer.from(textPart.data).toString(\"utf8\"))\n : undefined;\n if (!audio?.data?.length && !transcriptText) {\n setResponseStatus(event, 400);\n return { error: \"Missing audio or transcript payload\" };\n }\n if (audio?.data?.length && audio.data.length > MAX_AUDIO_BYTES) {\n setResponseStatus(event, 413);\n return { error: \"Audio too large (max 25 MB)\" };\n }\n\n const languagePart = parts?.find((p) => p.name === \"language\");\n const language = languagePart?.data\n ? Buffer.from(languagePart.data).toString(\"utf8\").trim().slice(0, 8)\n : undefined;\n const instructionsPart = parts?.find((p) => p.name === \"instructions\");\n const instructions = instructionsPart?.data\n ? sanitizeInstructions(\n Buffer.from(instructionsPart.data).toString(\"utf8\"),\n )\n : undefined;\n const voiceContextPart = parts?.find(\n (p) => p.name === \"voiceContext\" || p.name === \"contextPack\",\n );\n const voiceContext = voiceContextPart?.data\n ? parseVoiceContextPack(\n Buffer.from(voiceContextPart.data).toString(\"utf8\"),\n )\n : undefined;\n const voiceGuidance = buildVoiceGuidanceBlock({\n instructions,\n contextPack: voiceContextTermsOnly(voiceContext),\n });\n const applyVoiceContext = (value: string) =>\n applyVoiceContextReplacements(value, voiceContext).trim();\n\n // Resolve provider preference. Per-request \"provider\" form field takes\n // precedence (the desktop client sends it on every dictation press),\n // falling back to the user's stored `voice-transcription-prefs` app\n // state for the agent sidebar composer / web clients that don't send\n // it explicitly.\n const session = await getSession(event).catch(() => null);\n if (!session?.email && process.env.NODE_ENV === \"production\") {\n setResponseStatus(event, 401);\n return { error: \"Authentication required\" };\n }\n const orgCtx = session?.email\n ? await getOrgContext(event).catch(() => null)\n : null;\n const requestContext = {\n userEmail: session?.email,\n orgId: orgCtx?.orgId ?? undefined,\n };\n const withRequestContext = async <T>(fn: () => Promise<T>): Promise<T> =>\n requestContext.userEmail\n ? runWithRequestContext(requestContext, fn)\n : fn();\n const hasBuilderPrivateKey = async () =>\n withRequestContext(() => resolveHasBuilderPrivateKey());\n const transcribeWithBuilderForRequest = (\n opts: Parameters<typeof transcribeWithBuilder>[0],\n ) => withRequestContext(() => transcribeWithBuilder(opts));\n const sessionId = session?.email ?? \"local\";\n let providerPref: string | undefined;\n // CRITICAL: presence of the \"provider\" form field is the explicit\n // signal that the client is making a per-request choice. Even if\n // the value is \"auto\" (→ undefined providerPref → fallback chain),\n // we must NOT fall back to app-state's stored preference — the\n // client just told us what it wants. Without this gate, a stale\n // `voice-transcription-prefs.provider = \"browser\"` in app-state\n // (from earlier testing) would override the client's \"auto\" and\n // 400 with \"Voice provider is set to browser\".\n const providerPart = parts?.find((p) => p.name === \"provider\");\n let providerExplicit = false;\n if (providerPart?.data) {\n const v = Buffer.from(providerPart.data)\n .toString(\"utf8\")\n .trim()\n .toLowerCase();\n if (\n v === \"auto\" ||\n v === \"browser\" ||\n v === \"builder\" ||\n v === \"builder-gemini\" ||\n v === \"gemini\" ||\n v === \"openai\" ||\n v === \"groq\"\n ) {\n providerExplicit = true;\n providerPref = v === \"auto\" ? undefined : v;\n }\n }\n if (!providerExplicit) {\n try {\n const prefs = await appStateGet(sessionId, \"voice-transcription-prefs\");\n providerPref = (\n prefs as { provider?: string; value?: { provider?: string } } | null\n )?.provider;\n providerPref ??= (prefs as { value?: { provider?: string } } | null)\n ?.value?.provider;\n } catch {\n /* fall through — default to fallback chain */\n }\n }\n\n // Respect explicit \"browser\" preference — user chose Web Speech API and\n // does not want audio uploaded to any external provider. The client\n // shouldn't hit this endpoint when \"browser\" is selected; this is a\n // defense-in-depth refusal.\n if (providerPref === \"browser\" && !transcriptText) {\n setResponseStatus(event, 400);\n return {\n error:\n 'Voice provider is set to \"browser\" (Web Speech API only). Change the preference in Settings → Voice Transcription to use a server-side provider.',\n };\n }\n\n // Per-user-or-fallback API key resolution. Hoisted up so the Gemini\n // path below can use it without duplicating logic.\n async function resolveApiKey(key: string): Promise<string | undefined> {\n return (await withRequestContext(() => resolveSecret(key))) ?? undefined;\n }\n\n if (transcriptText) {\n return await cleanupTranscriptText({\n event,\n text: transcriptText,\n instructions: voiceGuidance,\n contextPack: voiceContext,\n providerPref,\n hasBuilderPrivateKey,\n withRequestContext,\n resolveApiKey,\n });\n }\n\n if (!audio?.data?.length) {\n setResponseStatus(event, 400);\n return { error: \"Missing audio payload\" };\n }\n\n const mime = audio.type || \"audio/webm\";\n const audioBytes = new Uint8Array(\n audio.data.buffer,\n audio.data.byteOffset,\n audio.data.byteLength,\n );\n\n let builderError: string | null = null;\n\n // ── Strict per-provider preferences ─────────────────────────────────\n // When the user explicitly picks a single provider (gemini / builder /\n // groq), we only try that provider and surface its error rather than\n // silently falling through. \"auto\" / undefined keeps the existing\n // fallback chain below. \"openai\" is handled by the chain (it skips\n // earlier providers and lands on the Whisper path).\n\n if (providerPref === \"gemini\") {\n const geminiKey = await resolveApiKey(\"GEMINI_API_KEY\");\n if (!geminiKey) {\n setResponseStatus(event, 400);\n return {\n error:\n \"Gemini is selected but GEMINI_API_KEY is not configured. Add it in Settings → API Keys, or change the provider preference.\",\n };\n }\n try {\n const text = await transcribeWithGemini({\n audioBytes,\n mimeType: mime,\n apiKey: geminiKey,\n language: language || undefined,\n instructions: voiceGuidance,\n });\n const trimmed = applyVoiceContext(text);\n if (!trimmed) {\n setResponseStatus(event, 502);\n return { error: \"Gemini returned an empty transcript.\" };\n }\n return { text: trimmed };\n } catch (err) {\n setResponseStatus(event, 502);\n return {\n error: `Gemini transcription failed: ${(err as Error)?.message ?? String(err)}`,\n };\n }\n }\n\n if (providerPref === \"builder\" || providerPref === \"builder-gemini\") {\n const label =\n providerPref === \"builder-gemini\"\n ? \"Builder Gemini Flash-Lite\"\n : \"Builder\";\n if (!(await hasBuilderPrivateKey())) {\n setResponseStatus(event, 400);\n return {\n error: `${label} is selected but Builder.io is not connected. Connect Builder.io in Settings, or change the provider preference.`,\n };\n }\n try {\n const result = await transcribeWithBuilderForRequest({\n audioBytes,\n mimeType: mime,\n model:\n providerPref === \"builder-gemini\"\n ? BUILDER_GEMINI_TRANSCRIPTION_MODEL\n : undefined,\n language: language || undefined,\n instructions: voiceGuidance,\n });\n return { text: applyVoiceContext(result.text ?? \"\") };\n } catch (err) {\n const message = (err as Error)?.message ?? String(err);\n if (message.includes(\"credits exhausted\")) {\n setResponseStatus(event, 402);\n return { error: message };\n }\n setResponseStatus(event, 502);\n return { error: `${label} transcription failed: ${message}` };\n }\n }\n\n if (providerPref === \"groq\") {\n const groqKey = await resolveApiKey(\"GROQ_API_KEY\");\n if (!groqKey) {\n setResponseStatus(event, 400);\n return {\n error:\n \"Groq is selected but GROQ_API_KEY is not configured. Add it in Settings → API Keys, or change the provider preference.\",\n };\n }\n return await callWhisperCompat({\n event,\n provider: {\n name: \"groq\",\n endpoint: GROQ_URL,\n model: GROQ_MODEL,\n apiKey: groqKey,\n },\n audioBytes,\n mime,\n language,\n instructions: voiceGuidance,\n contextPack: voiceContext,\n });\n }\n\n // ── Auto / undefined / openai fallback chain ────────────────────────\n\n // ── Builder Gemini Flash-Lite path ─────────────────────────────────\n // First-priority in auto mode when Builder is connected. This lets users\n // try Gemini 3.1 Flash-Lite without bringing their own Google key.\n if (providerPref !== \"openai\" && (await hasBuilderPrivateKey())) {\n try {\n const result = await transcribeWithBuilderForRequest({\n audioBytes,\n mimeType: mime,\n model: BUILDER_GEMINI_TRANSCRIPTION_MODEL,\n language: language || undefined,\n instructions: voiceGuidance,\n });\n return { text: applyVoiceContext(result.text ?? \"\") };\n } catch (err) {\n const message = (err as Error)?.message ?? String(err);\n // Surface 402 (credits exhausted) as a 402 so the client can show\n // a specific upgrade prompt.\n if (message.includes(\"credits exhausted\")) {\n setResponseStatus(event, 402);\n return { error: message };\n }\n builderError = message;\n }\n }\n\n // ── Gemini Flash Lite BYOK path ────────────────────────────────────\n // If Builder is unavailable, try a user-provided Gemini key before\n // Whisper-compatible providers.\n if (providerPref !== \"openai\") {\n const geminiKey = await resolveApiKey(\"GEMINI_API_KEY\");\n if (geminiKey) {\n try {\n const text = await transcribeWithGemini({\n audioBytes,\n mimeType: mime,\n apiKey: geminiKey,\n language: language || undefined,\n instructions: voiceGuidance,\n });\n const trimmed = applyVoiceContext(text);\n if (trimmed) {\n console.log(`[transcribe-voice] Gemini → ${trimmed.length} chars`);\n return { text: trimmed };\n }\n console.warn(\n \"[transcribe-voice] Gemini returned empty text — falling through to next provider\",\n );\n } catch (err) {\n console.warn(\n \"[transcribe-voice] Gemini path failed, falling through:\",\n (err as Error)?.message ?? err,\n );\n }\n }\n }\n\n // If Builder is unavailable, fall through to BYOK providers rather than\n // hard-failing. This mirrors Clips' batch transcription path.\n\n // ── Groq / OpenAI Whisper-compatible path ──────────────────────────\n // (resolveApiKey is hoisted above so the Gemini path can use it too.)\n\n let provider: {\n name: \"groq\" | \"openai\";\n endpoint: string;\n model: string;\n apiKey: string;\n } | null = null;\n\n if (providerPref !== \"openai\") {\n const groqKey = await resolveApiKey(\"GROQ_API_KEY\");\n if (groqKey) {\n provider = {\n name: \"groq\",\n endpoint: GROQ_URL,\n model: GROQ_MODEL,\n apiKey: groqKey,\n };\n }\n }\n if (!provider) {\n const openaiKey = await resolveApiKey(\"OPENAI_API_KEY\");\n if (openaiKey) {\n provider = {\n name: \"openai\",\n endpoint: WHISPER_URL,\n model: OPENAI_MODEL,\n apiKey: openaiKey,\n };\n }\n }\n\n if (!provider) {\n setResponseStatus(event, builderError ? 502 : 400);\n return {\n error: builderError\n ? `Builder transcription failed: ${builderError}. Add GEMINI_API_KEY, GROQ_API_KEY, or OPENAI_API_KEY in Settings → API Keys to enable a fallback provider.`\n : \"No voice transcription provider configured. Connect Builder.io or add GEMINI_API_KEY / GROQ_API_KEY / OPENAI_API_KEY in Settings → API Keys.\",\n };\n }\n\n return await callWhisperCompat({\n event,\n provider,\n audioBytes,\n mime,\n language,\n instructions: voiceGuidance,\n contextPack: voiceContext,\n });\n });\n}\n\n/**\n * Posts the audio to a Whisper-compatible OpenAI-style endpoint (Groq or\n * OpenAI itself) and returns `{ text }` / `{ error }` shaped like the\n * other branches in `createTranscribeVoiceHandler`. Hoisted so the\n * strict-Groq preference path and the auto fallback chain share one\n * implementation.\n */\nasync function callWhisperCompat({\n event,\n provider,\n audioBytes,\n mime,\n language,\n instructions,\n contextPack,\n}: {\n event: H3Event;\n provider: {\n name: \"groq\" | \"openai\";\n endpoint: string;\n model: string;\n apiKey: string;\n };\n audioBytes: Uint8Array;\n mime: string;\n language?: string;\n instructions?: string;\n contextPack?: VoiceContextPack;\n}): Promise<{ text: string } | { error: string }> {\n const ext = pickExtension(mime);\n const filename = `composer-voice.${ext}`;\n\n const form = new FormData();\n form.append(\n \"file\",\n new Blob([audioBytes as BlobPart], { type: mime }),\n filename,\n );\n form.append(\"model\", provider.model);\n form.append(\"response_format\", \"json\");\n if (language) form.append(\"language\", language);\n if (instructions) form.append(\"prompt\", instructions);\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 45_000);\n try {\n const res = await fetch(provider.endpoint, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${provider.apiKey}` },\n body: form,\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n setResponseStatus(event, res.status === 401 ? 401 : 502);\n return {\n error:\n res.status === 401\n ? `${provider.name} rejected the API key. Update it in Settings → API Keys.`\n : `${provider.name} transcription error ${res.status}: ${text.slice(0, 300)}`,\n };\n }\n const data = (await res.json()) as { text?: string };\n return {\n text: applyVoiceContextReplacements(\n (data.text ?? \"\").trim(),\n contextPack,\n ).trim(),\n };\n } catch (err) {\n setResponseStatus(event, 502);\n return {\n error:\n (err as Error)?.name === \"AbortError\"\n ? `${provider.name} transcription timed out after 45 seconds.`\n : `Could not reach ${provider.name}: ${(err as Error)?.message ?? err}`,\n };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function cleanupTranscriptText({\n event,\n text,\n instructions,\n contextPack,\n providerPref,\n hasBuilderPrivateKey,\n withRequestContext,\n resolveApiKey,\n}: {\n event: H3Event;\n text: string;\n instructions?: string;\n contextPack?: VoiceContextPack;\n providerPref?: string;\n hasBuilderPrivateKey: () => Promise<boolean>;\n withRequestContext: <T>(fn: () => Promise<T>) => Promise<T>;\n resolveApiKey: (key: string) => Promise<string | undefined>;\n}): Promise<{ text: string } | { error: string }> {\n const original = text.trim();\n if (!original) return { text: \"\" };\n const finalizeText = (value: string) =>\n applyVoiceContextReplacements(value || original, contextPack).trim();\n\n if (providerPref === \"browser\") {\n return { text: finalizeText(original) };\n }\n\n if (providerPref === \"builder\" || providerPref === \"builder-gemini\") {\n if (!(await hasBuilderPrivateKey())) {\n setResponseStatus(event, 400);\n return {\n error:\n \"Builder.io cleanup is selected but Builder.io is not connected. Connect Builder.io in Settings, or change the provider preference.\",\n };\n }\n try {\n const cleaned = await withRequestContext(() =>\n cleanupWithBuilder({ text: original, instructions }),\n );\n return { text: finalizeText(cleaned || original) };\n } catch (err) {\n setResponseStatus(event, 502);\n return {\n error: `Builder.io cleanup failed: ${(err as Error)?.message ?? String(err)}`,\n };\n }\n }\n\n if (providerPref === \"gemini\") {\n const geminiKey = await resolveApiKey(\"GEMINI_API_KEY\");\n if (!geminiKey) {\n setResponseStatus(event, 400);\n return {\n error:\n \"Gemini cleanup is selected but GEMINI_API_KEY is not configured.\",\n };\n }\n try {\n const cleaned = await cleanupWithGemini({\n text: original,\n apiKey: geminiKey,\n instructions,\n });\n return { text: finalizeText(cleaned || original) };\n } catch (err) {\n setResponseStatus(event, 502);\n return {\n error: `Gemini cleanup failed: ${(err as Error)?.message ?? String(err)}`,\n };\n }\n }\n\n if (providerPref === \"openai\" || providerPref === \"groq\") {\n const keyName =\n providerPref === \"openai\" ? \"OPENAI_API_KEY\" : \"GROQ_API_KEY\";\n const apiKey = await resolveApiKey(keyName);\n if (!apiKey) {\n setResponseStatus(event, 400);\n return {\n error: `${providerPref} cleanup is selected but ${keyName} is not configured.`,\n };\n }\n try {\n const cleaned = await cleanupWithChatProvider({\n provider: providerPref,\n text: original,\n apiKey,\n instructions,\n });\n return { text: finalizeText(cleaned || original) };\n } catch (err) {\n setResponseStatus(event, 502);\n return {\n error: `${providerPref} cleanup failed: ${(err as Error)?.message ?? String(err)}`,\n };\n }\n }\n\n if (await hasBuilderPrivateKey()) {\n try {\n const cleaned = await withRequestContext(() =>\n cleanupWithBuilder({ text: original, instructions }),\n );\n if (cleaned) return { text: finalizeText(cleaned) };\n } catch {\n // Fall through to BYOK providers, then raw text.\n }\n }\n\n const geminiKey = await resolveApiKey(\"GEMINI_API_KEY\");\n if (geminiKey) {\n try {\n const cleaned = await cleanupWithGemini({\n text: original,\n apiKey: geminiKey,\n instructions,\n });\n if (cleaned) return { text: finalizeText(cleaned) };\n } catch {\n // Fall through.\n }\n }\n\n const groqKey = await resolveApiKey(\"GROQ_API_KEY\");\n if (groqKey) {\n try {\n const cleaned = await cleanupWithChatProvider({\n provider: \"groq\",\n text: original,\n apiKey: groqKey,\n instructions,\n });\n if (cleaned) return { text: finalizeText(cleaned) };\n } catch {\n // Fall through.\n }\n }\n\n const openaiKey = await resolveApiKey(\"OPENAI_API_KEY\");\n if (openaiKey) {\n try {\n const cleaned = await cleanupWithChatProvider({\n provider: \"openai\",\n text: original,\n apiKey: openaiKey,\n instructions,\n });\n if (cleaned) return { text: finalizeText(cleaned) };\n } catch {\n // Fall through.\n }\n }\n\n return { text: finalizeText(original) };\n}\n\nasync function cleanupWithBuilder({\n text,\n instructions,\n}: {\n text: string;\n instructions?: string;\n}): Promise<string> {\n const engine = createBuilderEngine();\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8_000);\n let streamedText = \"\";\n let finalText = \"\";\n let terminalError: string | undefined;\n try {\n for await (const event of engine.stream({\n model: BUILDER_GEMINI_TRANSCRIPTION_MODEL,\n systemPrompt: buildCleanupSystemPrompt(instructions),\n messages: [\n {\n role: \"user\",\n content: [{ type: \"text\", text: buildCleanupUserPrompt(text) }],\n },\n ],\n tools: [],\n abortSignal: controller.signal,\n maxOutputTokens: Math.min(4096, Math.max(512, text.length * 2)),\n temperature: 0,\n })) {\n if (event.type === \"text-delta\") streamedText += event.text;\n if (event.type === \"assistant-content\") {\n finalText = event.parts\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\")\n .trim();\n }\n if (event.type === \"stop\" && event.reason === \"error\") {\n terminalError = event.error ?? \"Builder gateway returned an error\";\n }\n }\n } finally {\n clearTimeout(timeout);\n }\n if (terminalError) throw new Error(terminalError);\n return stripTranscriptEnvelope(finalText || streamedText);\n}\n\nasync function cleanupWithGemini({\n text,\n apiKey,\n instructions,\n}: {\n text: string;\n apiKey: string;\n instructions?: string;\n}): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8_000);\n try {\n const res = await fetch(GEMINI_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": apiKey,\n },\n body: JSON.stringify({\n contents: [\n {\n parts: [\n { text: buildCleanupSystemPrompt(instructions) },\n { text: buildCleanupUserPrompt(text) },\n ],\n },\n ],\n generationConfig: { temperature: 0 },\n }),\n signal: controller.signal,\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`Gemini ${res.status}: ${body.slice(0, 300)}`);\n }\n const data = (await res.json()) as {\n candidates?: Array<{\n content?: { parts?: Array<{ text?: string }> };\n }>;\n };\n const cleaned = data.candidates?.[0]?.content?.parts\n ?.map((p) => p.text ?? \"\")\n .join(\"\")\n .trim();\n return stripTranscriptEnvelope(cleaned ?? \"\");\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function cleanupWithChatProvider({\n provider,\n text,\n apiKey,\n instructions,\n}: {\n provider: \"openai\" | \"groq\";\n text: string;\n apiKey: string;\n instructions?: string;\n}): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8_000);\n const endpoint = provider === \"openai\" ? OPENAI_CHAT_URL : GROQ_CHAT_URL;\n const model =\n provider === \"openai\" ? OPENAI_CLEANUP_MODEL : GROQ_CLEANUP_MODEL;\n try {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: buildCleanupSystemPrompt(instructions) },\n { role: \"user\", content: buildCleanupUserPrompt(text) },\n ],\n temperature: 0,\n }),\n signal: controller.signal,\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`${provider} ${res.status}: ${body.slice(0, 300)}`);\n }\n const data = (await res.json()) as {\n choices?: Array<{ message?: { content?: string } }>;\n };\n return stripTranscriptEnvelope(\n data.choices?.[0]?.message?.content?.trim() ?? \"\",\n );\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction pickExtension(mime: string): string {\n const lower = mime.toLowerCase();\n if (lower.includes(\"mp4\") || lower.includes(\"m4a\")) return \"mp4\";\n if (lower.includes(\"mpeg\") || lower.includes(\"mp3\")) return \"mp3\";\n if (lower.includes(\"ogg\")) return \"ogg\";\n if (lower.includes(\"wav\")) return \"wav\";\n return \"webm\";\n}\n\nfunction sanitizeInstructions(value: string): string | undefined {\n const trimmed = value.replace(/\\0/g, \"\").trim();\n if (!trimmed) return undefined;\n return trimmed.slice(0, 3000);\n}\n\nfunction sanitizeTranscriptText(value: string): string | undefined {\n const trimmed = value.replace(/\\0/g, \"\").trim();\n if (!trimmed) return undefined;\n return trimmed.slice(0, MAX_TRANSCRIPT_CHARS);\n}\n\nfunction buildCleanupSystemPrompt(instructions?: string): string {\n const custom = instructions\n ? `\\n\\nUser's custom cleanup instructions:\\n${instructions}`\n : \"\";\n return `You clean up live speech-recognition transcripts before paste.\n\nRules:\n- Preserve the speaker's meaning and voice.\n- Fix obvious recognition mistakes, punctuation, capitalization, spacing, and casing.\n- Remove false starts and filler only when they are clearly not intentional.\n- Do not add facts, explanations, headings, bullets, quotes, or markdown.\n- Output only the cleaned transcript text.${custom}`;\n}\n\nfunction buildCleanupUserPrompt(text: string): string {\n return `Clean up this transcript and return only the final text:\\n\\n<transcript>\\n${text}\\n</transcript>`;\n}\n\nfunction stripTranscriptEnvelope(value: string): string {\n return value\n .trim()\n .replace(/^```(?:text)?\\s*/i, \"\")\n .replace(/\\s*```$/i, \"\")\n .replace(/^[\"“](.*)[\"”]$/s, \"$1\")\n .trim();\n}\n\nfunction buildGeminiTranscriptionPrompt({\n language,\n instructions,\n}: {\n language?: string;\n instructions?: string;\n}): string {\n const base = language\n ? `Transcribe the speech in this audio (language: ${language}).`\n : \"Transcribe the speech in this audio.\";\n const custom = instructions\n ? `\\n\\nAdditional user instructions for transcription cleanup:\\n${instructions}\\n\\nApply these only to formatting, casing, punctuation, vocabulary, and cleanup. Do not add content that is not present in the audio.`\n : \"\";\n return `${base} Output only the transcript text — no preamble, no quotes, no formatting.${custom}`;\n}\n\n/**\n * Transcribe audio via Gemini Flash Lite.\n *\n * Gemini accepts the audio inline as base64 alongside a text prompt; we\n * ask for just the transcript with no preamble. 30s timeout — Gemini is\n * fast and we'd rather fall through to Whisper than wait longer.\n *\n * Gemini's documented audio formats are WAV / MP3 / AIFF / AAC / OGG /\n * FLAC — webm/opus is not officially supported but in practice it\n * accepts webm too. If Gemini rejects it the caller falls through.\n */\nasync function transcribeWithGemini({\n audioBytes,\n mimeType,\n apiKey,\n language,\n instructions,\n}: {\n audioBytes: Uint8Array;\n mimeType: string;\n apiKey: string;\n language?: string;\n instructions?: string;\n}): Promise<string> {\n const base64 = uint8ArrayToBase64(audioBytes);\n const prompt = buildGeminiTranscriptionPrompt({ language, instructions });\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 30_000);\n try {\n const res = await fetch(GEMINI_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": apiKey,\n },\n body: JSON.stringify({\n contents: [\n {\n parts: [\n { text: prompt },\n {\n inlineData: {\n mimeType: normalizeAudioMimeForGemini(mimeType),\n data: base64,\n },\n },\n ],\n },\n ],\n // Keep generation tight — we want the transcript verbatim, no\n // creative reinterpretation.\n generationConfig: { temperature: 0 },\n }),\n signal: controller.signal,\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`Gemini ${res.status}: ${body.slice(0, 300)}`);\n }\n const data = (await res.json()) as {\n candidates?: Array<{\n content?: { parts?: Array<{ text?: string }> };\n }>;\n };\n const text = data.candidates?.[0]?.content?.parts\n ?.map((p) => p.text ?? \"\")\n .join(\"\")\n .trim();\n return text ?? \"\";\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction normalizeAudioMimeForGemini(mime: string): string {\n // Strip codec parameters — Gemini doesn't need them and some variants\n // (e.g. \"audio/webm;codecs=opus\") are rejected as unknown.\n const lower = mime.toLowerCase().split(\";\")[0].trim();\n if (!lower) return \"audio/webm\";\n return lower;\n}\n\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes).toString(\"base64\");\n }\n // Fallback for non-Node runtimes — chunk to avoid stack overflow.\n let binary = \"\";\n const chunk = 0x8000;\n for (let i = 0; i < bytes.length; i += chunk) {\n binary += String.fromCharCode(\n ...bytes.subarray(i, Math.min(i + chunk, bytes.length)),\n );\n }\n return btoa(binary);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transcribe-voice.js","sourceRoot":"","sources":["../../src/server/transcribe-voice.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * POST /_agent-native/transcribe-voice\n *\n * Receives an audio blob from the agent sidebar composer and forwards it to\n * the configured transcription provider. Returns `{ text }` on success,\n * `{ error }` on failure.\n *\n * Key resolution order for BYOK providers:\n * 1. Request-scoped encrypted secret (`app_secrets`: user, org, workspace).\n * 2. Env var fallback only outside authenticated request contexts.\n *\n * If no server provider is configured, returns 400 with an error the\n * composer UI can surface (the client falls back to Web Speech when possible).\n *\n * This is a framework route rather than a `defineAction` because multipart\n * audio bodies aren't a clean fit for the action contract (actions are\n * typed JSON-in / JSON-out).\n */\n\nimport {\n defineEventHandler,\n getMethod,\n getRequestHeader,\n readMultipartFormData,\n setResponseStatus,\n type H3Event,\n} from \"h3\";\n\nimport { createBuilderEngine } from \"../agent/engine/builder-engine.js\";\nimport { appStateGet } from \"../application-state/store.js\";\nimport { getOrgContext } from \"../org/context.js\";\nimport { transcribeWithBuilder } from \"../transcription/builder-transcription.js\";\nimport {\n applyVoiceContextReplacements,\n buildVoiceGuidanceBlock,\n parseVoiceContextPack,\n voiceContextTermsOnly,\n type VoiceContextPack,\n} from \"../voice/index.js\";\nimport { getSession } from \"./auth.js\";\nimport {\n resolveHasBuilderPrivateKey,\n resolveSecret,\n} from \"./credential-provider.js\";\nimport { runWithRequestContext } from \"./request-context.js\";\n\nconst WHISPER_URL = \"https://api.openai.com/v1/audio/transcriptions\";\nconst GROQ_URL = \"https://api.groq.com/openai/v1/audio/transcriptions\";\nconst GROQ_CHAT_URL = \"https://api.groq.com/openai/v1/chat/completions\";\nconst GROQ_MODEL = \"whisper-large-v3-turbo\";\nconst GROQ_CLEANUP_MODEL = \"llama-3.3-70b-versatile\";\nconst OPENAI_MODEL = \"whisper-1\";\nconst OPENAI_CHAT_URL = \"https://api.openai.com/v1/chat/completions\";\nconst OPENAI_CLEANUP_MODEL = \"gpt-5.4-mini\";\nconst MAX_AUDIO_BYTES = 25 * 1024 * 1024; // Whisper hard limit.\n// Hard cap for the dictation-cleanup text path (`sanitizeTranscriptText`\n// below). This endpoint has no `task` field — it's always the Hold-Fn\n// dictation cleanup pass — but a long session (many minutes across\n// multiple pause-triggered final segments) can still exceed a tight cap.\n// 150k gives real headroom for a long dictation session while still\n// bounding worst-case request size; truncation (when it does happen) keeps\n// both ends of the text instead of silently dropping the tail.\nconst MAX_TRANSCRIPT_CHARS = 150_000;\n// Public Builder transcription model id. The Builder gateway maps this to\n// Gemini 3.1 Flash-Lite.\nconst BUILDER_GEMINI_TRANSCRIPTION_MODEL = \"gemini-3-1-flash-lite\";\n\n// Gemini Flash Lite BYOK path when GEMINI_API_KEY is configured.\n// Gemini accepts inline audio; we just give it the bytes and a \"transcribe\n// this\" prompt and it replies with text. 2.5x faster TTFT than 2.5 Flash\n// per Google's release notes, and noticeably snappier than the Whisper\n// round-trip even on a fast connection.\n// Keep the direct Google AI path on a stable public model id; Builder's\n// managed provider above handles the newer Gemini 3.1 Flash-Lite preview.\nconst GEMINI_MODEL = \"gemini-2.0-flash-lite\";\nconst GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent`;\n\n/**\n * Reject cross-site POSTs. Cookies are `SameSite=None; Secure` over HTTPS so\n * the browser would otherwise attach the session to a forged form submission\n * from evil.com, causing us to spend OpenAI credits on the user's behalf.\n * Same-origin browsers always send `Origin` on POST; if it's missing we fall\n * back to `Sec-Fetch-Site` so Safari's fetch-spec behavior still works.\n */\nfunction isSameOriginRequest(event: H3Event): boolean {\n const host = getRequestHeader(event, \"host\");\n const origin = getRequestHeader(event, \"origin\");\n if (origin && host) {\n try {\n const parsed = new URL(origin);\n if (parsed.host === host) return true;\n // Tauri desktop dev serves the tray WebView from localhost:1420 while\n // the app server lives on the template dev port. Production Tauri\n // WebViews can also send a tauri://localhost origin. Treat only those\n // desktop origins as trusted cross-origin callers; arbitrary websites\n // still fail the CSRF check.\n if (parsed.protocol === \"tauri:\" && parsed.hostname === \"localhost\") {\n return true;\n }\n if (\n (parsed.protocol === \"http:\" || parsed.protocol === \"https:\") &&\n parsed.hostname === \"tauri.localhost\" &&\n (host.startsWith(\"localhost:\") || host.startsWith(\"127.0.0.1:\"))\n ) {\n return true;\n }\n if (\n parsed.protocol === \"http:\" &&\n (parsed.hostname === \"localhost\" || parsed.hostname === \"127.0.0.1\") &&\n parsed.port === \"1420\" &&\n (host.startsWith(\"localhost:\") || host.startsWith(\"127.0.0.1:\"))\n ) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n const fetchSite = getRequestHeader(event, \"sec-fetch-site\");\n if (fetchSite) return fetchSite === \"same-origin\" || fetchSite === \"none\";\n // No Origin and no Sec-Fetch-Site: likely a non-browser client (curl,\n // server-side) — safe to allow, CSRF requires a browser with ambient cookies.\n return true;\n}\n\n/**\n * Derive an AbortSignal that fires when the client disconnects mid-request\n * (e.g. the desktop client's own 8s ceiling firing before a provider call's\n * longer timeout). Without this, an abandoned client connection leaves the\n * server-side provider fetch running for its full timeout, burning provider\n * quota/cost on a response nobody will read. `req.on(\"close\", ...)` fires on\n * abnormal/early disconnect in Node's http server; a stray fire after normal\n * completion is a harmless no-op since the response has already been sent.\n * Returns undefined if the underlying Node request isn't available (e.g. a\n * non-Node adapter), so callers fall back to their existing timeout-only\n * signal.\n */\nfunction clientDisconnectSignal(event: H3Event): AbortSignal | undefined {\n const req = event.node?.req as\n | (NodeJS.EventEmitter & { on?: (...args: any[]) => void })\n | undefined;\n if (!req?.on) return undefined;\n const controller = new AbortController();\n req.on(\"close\", () => controller.abort());\n return controller.signal;\n}\n\n/** Combine a provider call's own timeout signal with the request's optional\n * client-disconnect signal so either one aborts the upstream fetch. */\nfunction withClientAbort(\n timeoutSignal: AbortSignal,\n clientAbortSignal?: AbortSignal,\n): AbortSignal {\n return clientAbortSignal\n ? AbortSignal.any([timeoutSignal, clientAbortSignal])\n : timeoutSignal;\n}\n\nexport function createTranscribeVoiceHandler() {\n return defineEventHandler(async (event: H3Event) => {\n if (getMethod(event) !== \"POST\") {\n setResponseStatus(event, 405);\n return { error: \"Method not allowed\" };\n }\n if (!isSameOriginRequest(event)) {\n setResponseStatus(event, 403);\n return { error: \"Cross-origin request rejected\" };\n }\n\n // One client-disconnect signal per request, threaded into every\n // provider-fetch AbortController below via AbortSignal.any so a client\n // giving up early aborts the same upstream fetch instead of leaving it\n // running for its full timeout.\n const clientAbort = clientDisconnectSignal(event);\n\n const parts = await readMultipartFormData(event).catch(() => null);\n const audio = parts?.find((p) => p.name === \"audio\");\n const textPart = parts?.find((p) => p.name === \"text\");\n const transcriptText = textPart?.data\n ? sanitizeTranscriptText(Buffer.from(textPart.data).toString(\"utf8\"))\n : undefined;\n if (!audio?.data?.length && !transcriptText) {\n setResponseStatus(event, 400);\n return { error: \"Missing audio or transcript payload\" };\n }\n if (audio?.data?.length && audio.data.length > MAX_AUDIO_BYTES) {\n setResponseStatus(event, 413);\n return { error: \"Audio too large (max 25 MB)\" };\n }\n\n const languagePart = parts?.find((p) => p.name === \"language\");\n const language = languagePart?.data\n ? Buffer.from(languagePart.data).toString(\"utf8\").trim().slice(0, 8)\n : undefined;\n const instructionsPart = parts?.find((p) => p.name === \"instructions\");\n const instructions = instructionsPart?.data\n ? sanitizeInstructions(\n Buffer.from(instructionsPart.data).toString(\"utf8\"),\n )\n : undefined;\n const voiceContextPart = parts?.find(\n (p) => p.name === \"voiceContext\" || p.name === \"contextPack\",\n );\n const voiceContext = voiceContextPart?.data\n ? parseVoiceContextPack(\n Buffer.from(voiceContextPart.data).toString(\"utf8\"),\n )\n : undefined;\n const voiceGuidance = buildVoiceGuidanceBlock({\n instructions,\n contextPack: voiceContextTermsOnly(voiceContext),\n });\n const applyVoiceContext = (value: string) =>\n applyVoiceContextReplacements(value, voiceContext).trim();\n\n // Resolve provider preference. Per-request \"provider\" form field takes\n // precedence (the desktop client sends it on every dictation press),\n // falling back to the user's stored `voice-transcription-prefs` app\n // state for the agent sidebar composer / web clients that don't send\n // it explicitly.\n const session = await getSession(event).catch(() => null);\n if (!session?.email && process.env.NODE_ENV === \"production\") {\n setResponseStatus(event, 401);\n return { error: \"Authentication required\" };\n }\n const orgCtx = session?.email\n ? await getOrgContext(event).catch(() => null)\n : null;\n const requestContext = {\n userEmail: session?.email,\n orgId: orgCtx?.orgId ?? undefined,\n };\n const withRequestContext = async <T>(fn: () => Promise<T>): Promise<T> =>\n requestContext.userEmail\n ? runWithRequestContext(requestContext, fn)\n : fn();\n const hasBuilderPrivateKey = async () =>\n withRequestContext(() => resolveHasBuilderPrivateKey());\n const transcribeWithBuilderForRequest = (\n opts: Parameters<typeof transcribeWithBuilder>[0],\n ) => withRequestContext(() => transcribeWithBuilder(opts));\n const sessionId = session?.email ?? \"local\";\n let providerPref: string | undefined;\n // CRITICAL: presence of the \"provider\" form field is the explicit\n // signal that the client is making a per-request choice. Even if\n // the value is \"auto\" (→ undefined providerPref → fallback chain),\n // we must NOT fall back to app-state's stored preference — the\n // client just told us what it wants. Without this gate, a stale\n // `voice-transcription-prefs.provider = \"browser\"` in app-state\n // (from earlier testing) would override the client's \"auto\" and\n // 400 with \"Voice provider is set to browser\".\n const providerPart = parts?.find((p) => p.name === \"provider\");\n let providerExplicit = false;\n if (providerPart?.data) {\n const v = Buffer.from(providerPart.data)\n .toString(\"utf8\")\n .trim()\n .toLowerCase();\n if (\n v === \"auto\" ||\n v === \"browser\" ||\n v === \"builder\" ||\n v === \"builder-gemini\" ||\n v === \"gemini\" ||\n v === \"openai\" ||\n v === \"groq\"\n ) {\n providerExplicit = true;\n providerPref = v === \"auto\" ? undefined : v;\n }\n }\n if (!providerExplicit) {\n try {\n const prefs = await appStateGet(sessionId, \"voice-transcription-prefs\");\n providerPref = (\n prefs as { provider?: string; value?: { provider?: string } } | null\n )?.provider;\n providerPref ??= (prefs as { value?: { provider?: string } } | null)\n ?.value?.provider;\n } catch {\n /* fall through — default to fallback chain */\n }\n }\n\n // Respect explicit \"browser\" preference — user chose Web Speech API and\n // does not want audio uploaded to any external provider. The client\n // shouldn't hit this endpoint when \"browser\" is selected; this is a\n // defense-in-depth refusal.\n if (providerPref === \"browser\" && !transcriptText) {\n setResponseStatus(event, 400);\n return {\n error:\n 'Voice provider is set to \"browser\" (Web Speech API only). Change the preference in Settings → Voice Transcription to use a server-side provider.',\n };\n }\n\n // Per-user-or-fallback API key resolution. Hoisted up so the Gemini\n // path below can use it without duplicating logic.\n async function resolveApiKey(key: string): Promise<string | undefined> {\n return (await withRequestContext(() => resolveSecret(key))) ?? undefined;\n }\n\n if (transcriptText) {\n return await cleanupTranscriptText({\n event,\n text: transcriptText,\n instructions: voiceGuidance,\n contextPack: voiceContext,\n providerPref,\n hasBuilderPrivateKey,\n withRequestContext,\n resolveApiKey,\n clientAbortSignal: clientAbort,\n });\n }\n\n if (!audio?.data?.length) {\n setResponseStatus(event, 400);\n return { error: \"Missing audio payload\" };\n }\n\n const mime = audio.type || \"audio/webm\";\n const audioBytes = new Uint8Array(\n audio.data.buffer,\n audio.data.byteOffset,\n audio.data.byteLength,\n );\n\n let builderError: string | null = null;\n\n // ── Strict per-provider preferences ─────────────────────────────────\n // When the user explicitly picks a single provider (gemini / builder /\n // groq), we only try that provider and surface its error rather than\n // silently falling through. \"auto\" / undefined keeps the existing\n // fallback chain below. \"openai\" is handled by the chain (it skips\n // earlier providers and lands on the Whisper path).\n\n if (providerPref === \"gemini\") {\n const geminiKey = await resolveApiKey(\"GEMINI_API_KEY\");\n if (!geminiKey) {\n setResponseStatus(event, 400);\n return {\n error:\n \"Gemini is selected but GEMINI_API_KEY is not configured. Add it in Settings → API Keys, or change the provider preference.\",\n };\n }\n try {\n const text = await transcribeWithGemini({\n audioBytes,\n mimeType: mime,\n apiKey: geminiKey,\n language: language || undefined,\n instructions: voiceGuidance,\n clientAbortSignal: clientAbort,\n });\n const trimmed = applyVoiceContext(text);\n if (!trimmed) {\n setResponseStatus(event, 502);\n return { error: \"Gemini returned an empty transcript.\" };\n }\n return { text: trimmed };\n } catch (err) {\n setResponseStatus(event, 502);\n return {\n error: `Gemini transcription failed: ${(err as Error)?.message ?? String(err)}`,\n };\n }\n }\n\n if (providerPref === \"builder\" || providerPref === \"builder-gemini\") {\n const label =\n providerPref === \"builder-gemini\"\n ? \"Builder Gemini Flash-Lite\"\n : \"Builder\";\n if (!(await hasBuilderPrivateKey())) {\n setResponseStatus(event, 400);\n return {\n error: `${label} is selected but Builder.io is not connected. Connect Builder.io in Settings, or change the provider preference.`,\n };\n }\n try {\n const result = await transcribeWithBuilderForRequest({\n audioBytes,\n mimeType: mime,\n model:\n providerPref === \"builder-gemini\"\n ? BUILDER_GEMINI_TRANSCRIPTION_MODEL\n : undefined,\n language: language || undefined,\n instructions: voiceGuidance,\n });\n return { text: applyVoiceContext(result.text ?? \"\") };\n } catch (err) {\n const message = (err as Error)?.message ?? String(err);\n if (message.includes(\"credits exhausted\")) {\n setResponseStatus(event, 402);\n return { error: message };\n }\n setResponseStatus(event, 502);\n return { error: `${label} transcription failed: ${message}` };\n }\n }\n\n if (providerPref === \"groq\") {\n const groqKey = await resolveApiKey(\"GROQ_API_KEY\");\n if (!groqKey) {\n setResponseStatus(event, 400);\n return {\n error:\n \"Groq is selected but GROQ_API_KEY is not configured. Add it in Settings → API Keys, or change the provider preference.\",\n };\n }\n return await callWhisperCompat({\n event,\n provider: {\n name: \"groq\",\n endpoint: GROQ_URL,\n model: GROQ_MODEL,\n apiKey: groqKey,\n },\n audioBytes,\n mime,\n language,\n instructions: voiceGuidance,\n contextPack: voiceContext,\n clientAbortSignal: clientAbort,\n });\n }\n\n // ── Auto / undefined / openai fallback chain ────────────────────────\n\n // ── Builder Gemini Flash-Lite path ─────────────────────────────────\n // First-priority in auto mode when Builder is connected. This lets users\n // try Gemini 3.1 Flash-Lite without bringing their own Google key.\n if (providerPref !== \"openai\" && (await hasBuilderPrivateKey())) {\n try {\n const result = await transcribeWithBuilderForRequest({\n audioBytes,\n mimeType: mime,\n model: BUILDER_GEMINI_TRANSCRIPTION_MODEL,\n language: language || undefined,\n instructions: voiceGuidance,\n });\n return { text: applyVoiceContext(result.text ?? \"\") };\n } catch (err) {\n const message = (err as Error)?.message ?? String(err);\n // Surface 402 (credits exhausted) as a 402 so the client can show\n // a specific upgrade prompt.\n if (message.includes(\"credits exhausted\")) {\n setResponseStatus(event, 402);\n return { error: message };\n }\n builderError = message;\n }\n }\n\n // ── Gemini Flash Lite BYOK path ────────────────────────────────────\n // If Builder is unavailable, try a user-provided Gemini key before\n // Whisper-compatible providers.\n if (providerPref !== \"openai\") {\n const geminiKey = await resolveApiKey(\"GEMINI_API_KEY\");\n if (geminiKey) {\n try {\n const text = await transcribeWithGemini({\n audioBytes,\n mimeType: mime,\n apiKey: geminiKey,\n language: language || undefined,\n instructions: voiceGuidance,\n clientAbortSignal: clientAbort,\n });\n const trimmed = applyVoiceContext(text);\n if (trimmed) {\n console.log(`[transcribe-voice] Gemini → ${trimmed.length} chars`);\n return { text: trimmed };\n }\n console.warn(\n \"[transcribe-voice] Gemini returned empty text — falling through to next provider\",\n );\n } catch (err) {\n console.warn(\n \"[transcribe-voice] Gemini path failed, falling through:\",\n (err as Error)?.message ?? err,\n );\n }\n }\n }\n\n // If Builder is unavailable, fall through to BYOK providers rather than\n // hard-failing. This mirrors Clips' batch transcription path.\n\n // ── Groq / OpenAI Whisper-compatible path ──────────────────────────\n // (resolveApiKey is hoisted above so the Gemini path can use it too.)\n\n let provider: {\n name: \"groq\" | \"openai\";\n endpoint: string;\n model: string;\n apiKey: string;\n } | null = null;\n\n if (providerPref !== \"openai\") {\n const groqKey = await resolveApiKey(\"GROQ_API_KEY\");\n if (groqKey) {\n provider = {\n name: \"groq\",\n endpoint: GROQ_URL,\n model: GROQ_MODEL,\n apiKey: groqKey,\n };\n }\n }\n if (!provider) {\n const openaiKey = await resolveApiKey(\"OPENAI_API_KEY\");\n if (openaiKey) {\n provider = {\n name: \"openai\",\n endpoint: WHISPER_URL,\n model: OPENAI_MODEL,\n apiKey: openaiKey,\n };\n }\n }\n\n if (!provider) {\n setResponseStatus(event, builderError ? 502 : 400);\n return {\n error: builderError\n ? `Builder transcription failed: ${builderError}. Add GEMINI_API_KEY, GROQ_API_KEY, or OPENAI_API_KEY in Settings → API Keys to enable a fallback provider.`\n : \"No voice transcription provider configured. Connect Builder.io or add GEMINI_API_KEY / GROQ_API_KEY / OPENAI_API_KEY in Settings → API Keys.\",\n };\n }\n\n return await callWhisperCompat({\n event,\n provider,\n audioBytes,\n mime,\n language,\n instructions: voiceGuidance,\n contextPack: voiceContext,\n clientAbortSignal: clientAbort,\n });\n });\n}\n\n/**\n * Posts the audio to a Whisper-compatible OpenAI-style endpoint (Groq or\n * OpenAI itself) and returns `{ text }` / `{ error }` shaped like the\n * other branches in `createTranscribeVoiceHandler`. Hoisted so the\n * strict-Groq preference path and the auto fallback chain share one\n * implementation.\n */\nasync function callWhisperCompat({\n event,\n provider,\n audioBytes,\n mime,\n language,\n instructions,\n contextPack,\n clientAbortSignal,\n}: {\n event: H3Event;\n provider: {\n name: \"groq\" | \"openai\";\n endpoint: string;\n model: string;\n apiKey: string;\n };\n audioBytes: Uint8Array;\n mime: string;\n language?: string;\n instructions?: string;\n contextPack?: VoiceContextPack;\n clientAbortSignal?: AbortSignal;\n}): Promise<{ text: string } | { error: string }> {\n const ext = pickExtension(mime);\n const filename = `composer-voice.${ext}`;\n\n const form = new FormData();\n form.append(\n \"file\",\n new Blob([audioBytes as BlobPart], { type: mime }),\n filename,\n );\n form.append(\"model\", provider.model);\n form.append(\"response_format\", \"json\");\n if (language) form.append(\"language\", language);\n if (instructions) form.append(\"prompt\", instructions);\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 45_000);\n try {\n const res = await fetch(provider.endpoint, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${provider.apiKey}` },\n body: form,\n signal: withClientAbort(controller.signal, clientAbortSignal),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n setResponseStatus(event, res.status === 401 ? 401 : 502);\n return {\n error:\n res.status === 401\n ? `${provider.name} rejected the API key. Update it in Settings → API Keys.`\n : `${provider.name} transcription error ${res.status}: ${text.slice(0, 300)}`,\n };\n }\n const data = (await res.json()) as { text?: string };\n return {\n text: applyVoiceContextReplacements(\n (data.text ?? \"\").trim(),\n contextPack,\n ).trim(),\n };\n } catch (err) {\n setResponseStatus(event, 502);\n return {\n error:\n (err as Error)?.name === \"AbortError\"\n ? `${provider.name} transcription timed out after 45 seconds.`\n : `Could not reach ${provider.name}: ${(err as Error)?.message ?? err}`,\n };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function cleanupTranscriptText({\n event,\n text,\n instructions,\n contextPack,\n providerPref,\n hasBuilderPrivateKey,\n withRequestContext,\n resolveApiKey,\n clientAbortSignal,\n}: {\n event: H3Event;\n text: string;\n instructions?: string;\n contextPack?: VoiceContextPack;\n providerPref?: string;\n hasBuilderPrivateKey: () => Promise<boolean>;\n withRequestContext: <T>(fn: () => Promise<T>) => Promise<T>;\n resolveApiKey: (key: string) => Promise<string | undefined>;\n clientAbortSignal?: AbortSignal;\n}): Promise<{ text: string } | { error: string }> {\n const original = text.trim();\n if (!original) return { text: \"\" };\n const finalizeText = (value: string) =>\n applyVoiceContextReplacements(value || original, contextPack).trim();\n\n if (providerPref === \"browser\") {\n return { text: finalizeText(original) };\n }\n\n if (providerPref === \"builder\" || providerPref === \"builder-gemini\") {\n if (!(await hasBuilderPrivateKey())) {\n setResponseStatus(event, 400);\n return {\n error:\n \"Builder.io cleanup is selected but Builder.io is not connected. Connect Builder.io in Settings, or change the provider preference.\",\n };\n }\n try {\n const cleaned = await withRequestContext(() =>\n cleanupWithBuilder({ text: original, instructions, clientAbortSignal }),\n );\n return { text: finalizeText(cleaned || original) };\n } catch (err) {\n setResponseStatus(event, 502);\n return {\n error: `Builder.io cleanup failed: ${(err as Error)?.message ?? String(err)}`,\n };\n }\n }\n\n if (providerPref === \"gemini\") {\n const geminiKey = await resolveApiKey(\"GEMINI_API_KEY\");\n if (!geminiKey) {\n setResponseStatus(event, 400);\n return {\n error:\n \"Gemini cleanup is selected but GEMINI_API_KEY is not configured.\",\n };\n }\n try {\n const cleaned = await cleanupWithGemini({\n text: original,\n apiKey: geminiKey,\n instructions,\n clientAbortSignal,\n });\n return { text: finalizeText(cleaned || original) };\n } catch (err) {\n setResponseStatus(event, 502);\n return {\n error: `Gemini cleanup failed: ${(err as Error)?.message ?? String(err)}`,\n };\n }\n }\n\n if (providerPref === \"openai\" || providerPref === \"groq\") {\n const keyName =\n providerPref === \"openai\" ? \"OPENAI_API_KEY\" : \"GROQ_API_KEY\";\n const apiKey = await resolveApiKey(keyName);\n if (!apiKey) {\n setResponseStatus(event, 400);\n return {\n error: `${providerPref} cleanup is selected but ${keyName} is not configured.`,\n };\n }\n try {\n const cleaned = await cleanupWithChatProvider({\n provider: providerPref,\n text: original,\n apiKey,\n instructions,\n clientAbortSignal,\n });\n return { text: finalizeText(cleaned || original) };\n } catch (err) {\n setResponseStatus(event, 502);\n return {\n error: `${providerPref} cleanup failed: ${(err as Error)?.message ?? String(err)}`,\n };\n }\n }\n\n if (await hasBuilderPrivateKey()) {\n try {\n const cleaned = await withRequestContext(() =>\n cleanupWithBuilder({ text: original, instructions, clientAbortSignal }),\n );\n if (cleaned) return { text: finalizeText(cleaned) };\n } catch {\n // Fall through to BYOK providers, then raw text.\n }\n }\n\n const geminiKey = await resolveApiKey(\"GEMINI_API_KEY\");\n if (geminiKey) {\n try {\n const cleaned = await cleanupWithGemini({\n text: original,\n apiKey: geminiKey,\n instructions,\n clientAbortSignal,\n });\n if (cleaned) return { text: finalizeText(cleaned) };\n } catch {\n // Fall through.\n }\n }\n\n const groqKey = await resolveApiKey(\"GROQ_API_KEY\");\n if (groqKey) {\n try {\n const cleaned = await cleanupWithChatProvider({\n provider: \"groq\",\n text: original,\n apiKey: groqKey,\n instructions,\n clientAbortSignal,\n });\n if (cleaned) return { text: finalizeText(cleaned) };\n } catch {\n // Fall through.\n }\n }\n\n const openaiKey = await resolveApiKey(\"OPENAI_API_KEY\");\n if (openaiKey) {\n try {\n const cleaned = await cleanupWithChatProvider({\n provider: \"openai\",\n text: original,\n apiKey: openaiKey,\n instructions,\n clientAbortSignal,\n });\n if (cleaned) return { text: finalizeText(cleaned) };\n } catch {\n // Fall through.\n }\n }\n\n return { text: finalizeText(original) };\n}\n\nasync function cleanupWithBuilder({\n text,\n instructions,\n clientAbortSignal,\n}: {\n text: string;\n instructions?: string;\n clientAbortSignal?: AbortSignal;\n}): Promise<string> {\n const engine = createBuilderEngine();\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8_000);\n let streamedText = \"\";\n let finalText = \"\";\n let terminalError: string | undefined;\n try {\n for await (const event of engine.stream({\n model: BUILDER_GEMINI_TRANSCRIPTION_MODEL,\n systemPrompt: buildCleanupSystemPrompt(instructions),\n messages: [\n {\n role: \"user\",\n content: [{ type: \"text\", text: buildCleanupUserPrompt(text) }],\n },\n ],\n tools: [],\n abortSignal: withClientAbort(controller.signal, clientAbortSignal),\n maxOutputTokens: Math.min(4096, Math.max(512, text.length * 2)),\n temperature: 0,\n })) {\n if (event.type === \"text-delta\") streamedText += event.text;\n if (event.type === \"assistant-content\") {\n finalText = event.parts\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\")\n .trim();\n }\n if (event.type === \"stop\" && event.reason === \"error\") {\n terminalError = event.error ?? \"Builder gateway returned an error\";\n }\n }\n } finally {\n clearTimeout(timeout);\n }\n if (terminalError) throw new Error(terminalError);\n return stripTranscriptEnvelope(finalText || streamedText);\n}\n\nasync function cleanupWithGemini({\n text,\n apiKey,\n instructions,\n clientAbortSignal,\n}: {\n text: string;\n apiKey: string;\n instructions?: string;\n clientAbortSignal?: AbortSignal;\n}): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8_000);\n try {\n const res = await fetch(GEMINI_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": apiKey,\n },\n body: JSON.stringify({\n contents: [\n {\n parts: [\n { text: buildCleanupSystemPrompt(instructions) },\n { text: buildCleanupUserPrompt(text) },\n ],\n },\n ],\n generationConfig: { temperature: 0 },\n }),\n signal: withClientAbort(controller.signal, clientAbortSignal),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`Gemini ${res.status}: ${body.slice(0, 300)}`);\n }\n const data = (await res.json()) as {\n candidates?: Array<{\n content?: { parts?: Array<{ text?: string }> };\n }>;\n };\n const cleaned = data.candidates?.[0]?.content?.parts\n ?.map((p) => p.text ?? \"\")\n .join(\"\")\n .trim();\n return stripTranscriptEnvelope(cleaned ?? \"\");\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function cleanupWithChatProvider({\n provider,\n text,\n apiKey,\n instructions,\n clientAbortSignal,\n}: {\n provider: \"openai\" | \"groq\";\n text: string;\n apiKey: string;\n instructions?: string;\n clientAbortSignal?: AbortSignal;\n}): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8_000);\n const endpoint = provider === \"openai\" ? OPENAI_CHAT_URL : GROQ_CHAT_URL;\n const model =\n provider === \"openai\" ? OPENAI_CLEANUP_MODEL : GROQ_CLEANUP_MODEL;\n try {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: buildCleanupSystemPrompt(instructions) },\n { role: \"user\", content: buildCleanupUserPrompt(text) },\n ],\n temperature: 0,\n }),\n signal: withClientAbort(controller.signal, clientAbortSignal),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`${provider} ${res.status}: ${body.slice(0, 300)}`);\n }\n const data = (await res.json()) as {\n choices?: Array<{ message?: { content?: string } }>;\n };\n return stripTranscriptEnvelope(\n data.choices?.[0]?.message?.content?.trim() ?? \"\",\n );\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction pickExtension(mime: string): string {\n const lower = mime.toLowerCase();\n if (lower.includes(\"mp4\") || lower.includes(\"m4a\")) return \"mp4\";\n if (lower.includes(\"mpeg\") || lower.includes(\"mp3\")) return \"mp3\";\n if (lower.includes(\"ogg\")) return \"ogg\";\n if (lower.includes(\"wav\")) return \"wav\";\n return \"webm\";\n}\n\nfunction sanitizeInstructions(value: string): string | undefined {\n const trimmed = value.replace(/\\0/g, \"\").trim();\n if (!trimmed) return undefined;\n return trimmed.slice(0, 3000);\n}\n\nfunction sanitizeTranscriptText(value: string): string | undefined {\n const trimmed = value.replace(/\\0/g, \"\").trim();\n if (!trimmed) return undefined;\n if (trimmed.length <= MAX_TRANSCRIPT_CHARS) return trimmed;\n // Truncate the middle rather than the tail — losing the end of a long\n // dictation silently (previous behavior) is worse than losing the middle,\n // since users notice a cut-off ending immediately but rarely proofread\n // the entire cleaned output against the original.\n console.warn(\n `[transcribe-voice] transcript truncated: ${trimmed.length} chars exceeds ${MAX_TRANSCRIPT_CHARS} cap`,\n );\n const marker = \"\\n[... transcript truncated ...]\\n\";\n const keepChars = MAX_TRANSCRIPT_CHARS - marker.length;\n const headChars = Math.floor((keepChars * 2) / 3);\n const tailChars = keepChars - headChars;\n return (\n trimmed.slice(0, headChars) +\n marker +\n trimmed.slice(trimmed.length - tailChars)\n );\n}\n\nfunction buildCleanupSystemPrompt(instructions?: string): string {\n const custom = instructions\n ? `\\n\\nUser's custom cleanup instructions:\\n${instructions}`\n : \"\";\n return `You clean up live speech-recognition transcripts before paste.\n\nRules:\n- Preserve the speaker's meaning and voice.\n- Fix obvious recognition mistakes, punctuation, capitalization, spacing, and casing.\n- Remove false starts and filler only when they are clearly not intentional.\n- Do not add facts, explanations, headings, bullets, quotes, or markdown.\n- Output only the cleaned transcript text.${custom}`;\n}\n\nfunction buildCleanupUserPrompt(text: string): string {\n return `Clean up this transcript and return only the final text:\\n\\n<transcript>\\n${text}\\n</transcript>`;\n}\n\nfunction stripTranscriptEnvelope(value: string): string {\n return value\n .trim()\n .replace(/^```(?:text)?\\s*/i, \"\")\n .replace(/\\s*```$/i, \"\")\n .replace(/^[\"“](.*)[\"”]$/s, \"$1\")\n .trim();\n}\n\nfunction buildGeminiTranscriptionPrompt({\n language,\n instructions,\n}: {\n language?: string;\n instructions?: string;\n}): string {\n const base = language\n ? `Transcribe the speech in this audio (language: ${language}).`\n : \"Transcribe the speech in this audio.\";\n const custom = instructions\n ? `\\n\\nAdditional user instructions for transcription cleanup:\\n${instructions}\\n\\nApply these only to formatting, casing, punctuation, vocabulary, and cleanup. Do not add content that is not present in the audio.`\n : \"\";\n return `${base} Output only the transcript text — no preamble, no quotes, no formatting.${custom}`;\n}\n\n/**\n * Transcribe audio via Gemini Flash Lite.\n *\n * Gemini accepts the audio inline as base64 alongside a text prompt; we\n * ask for just the transcript with no preamble. 30s timeout — Gemini is\n * fast and we'd rather fall through to Whisper than wait longer.\n *\n * Gemini's documented audio formats are WAV / MP3 / AIFF / AAC / OGG /\n * FLAC — webm/opus is not officially supported but in practice it\n * accepts webm too. If Gemini rejects it the caller falls through.\n */\nasync function transcribeWithGemini({\n audioBytes,\n mimeType,\n apiKey,\n language,\n instructions,\n clientAbortSignal,\n}: {\n audioBytes: Uint8Array;\n mimeType: string;\n apiKey: string;\n language?: string;\n instructions?: string;\n clientAbortSignal?: AbortSignal;\n}): Promise<string> {\n const base64 = uint8ArrayToBase64(audioBytes);\n const prompt = buildGeminiTranscriptionPrompt({ language, instructions });\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 30_000);\n try {\n const res = await fetch(GEMINI_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": apiKey,\n },\n body: JSON.stringify({\n contents: [\n {\n parts: [\n { text: prompt },\n {\n inlineData: {\n mimeType: normalizeAudioMimeForGemini(mimeType),\n data: base64,\n },\n },\n ],\n },\n ],\n // Keep generation tight — we want the transcript verbatim, no\n // creative reinterpretation.\n generationConfig: { temperature: 0 },\n }),\n signal: withClientAbort(controller.signal, clientAbortSignal),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`Gemini ${res.status}: ${body.slice(0, 300)}`);\n }\n const data = (await res.json()) as {\n candidates?: Array<{\n content?: { parts?: Array<{ text?: string }> };\n }>;\n };\n const text = data.candidates?.[0]?.content?.parts\n ?.map((p) => p.text ?? \"\")\n .join(\"\")\n .trim();\n return text ?? \"\";\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction normalizeAudioMimeForGemini(mime: string): string {\n // Strip codec parameters — Gemini doesn't need them and some variants\n // (e.g. \"audio/webm;codecs=opus\") are rejected as unknown.\n const lower = mime.toLowerCase().split(\";\")[0].trim();\n if (!lower) return \"audio/webm\";\n return lower;\n}\n\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes).toString(\"base64\");\n }\n // Fallback for non-Node runtimes — chunk to avoid stack overflow.\n let binary = \"\";\n const chunk = 0x8000;\n for (let i = 0; i < bytes.length; i += chunk) {\n binary += String.fromCharCode(\n ...bytes.subarray(i, Math.min(i + chunk, bytes.length)),\n );\n }\n return btoa(binary);\n}\n"]}
|
|
@@ -41,6 +41,16 @@
|
|
|
41
41
|
zoom-in/out, slide-in-from-*, spin-in, etc.). */
|
|
42
42
|
@import "tw-animate-css";
|
|
43
43
|
|
|
44
|
+
:root {
|
|
45
|
+
--agent-native-viewport-height: 100vh;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@supports (height: 100dvh) {
|
|
49
|
+
:root {
|
|
50
|
+
--agent-native-viewport-height: 100dvh;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
44
54
|
/* Shared shell depth.
|
|
45
55
|
Use these classes on app layouts that have a persistent left nav:
|
|
46
56
|
|
|
@@ -63,6 +73,8 @@
|
|
|
63
73
|
var(--agent-native-raised-border);
|
|
64
74
|
--agent-native-raised-shadow-left: -1px 0 3px rgb(0 0 0 / 0.018);
|
|
65
75
|
--agent-native-raised-shadow-right: 1px 0 3px rgb(0 0 0 / 0.018);
|
|
76
|
+
height: var(--agent-native-viewport-height);
|
|
77
|
+
min-height: 0;
|
|
66
78
|
background: var(--agent-native-lower-surface);
|
|
67
79
|
}
|
|
68
80
|
|
|
@@ -90,16 +102,6 @@
|
|
|
90
102
|
hsl(var(--sidebar-background, var(--background))) 94%,
|
|
91
103
|
black
|
|
92
104
|
);
|
|
93
|
-
--agent-native-raised-surface: color-mix(
|
|
94
|
-
in srgb,
|
|
95
|
-
hsl(var(--background)) 78%,
|
|
96
|
-
hsl(var(--muted)) 22%
|
|
97
|
-
);
|
|
98
|
-
--agent-native-card-surface: color-mix(
|
|
99
|
-
in srgb,
|
|
100
|
-
var(--agent-native-raised-surface) 88%,
|
|
101
|
-
hsl(var(--muted)) 12%
|
|
102
|
-
);
|
|
103
105
|
}
|
|
104
106
|
}
|
|
105
107
|
|
|
@@ -167,43 +169,45 @@
|
|
|
167
169
|
container: agent-native-main / inline-size;
|
|
168
170
|
}
|
|
169
171
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
.
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
.
|
|
178
|
-
.agent-layout-
|
|
179
|
-
|
|
180
|
-
.
|
|
181
|
-
.agent-layout-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
172
|
+
@media (min-width: 768px) {
|
|
173
|
+
.agent-layout-shell
|
|
174
|
+
:where(.agent-layout-main-surface, .agent-sidebar-main-surface)
|
|
175
|
+
> :first-child
|
|
176
|
+
> :where(header, div).border-b,
|
|
177
|
+
.agent-layout-shell
|
|
178
|
+
:where(.agent-layout-main-surface, .agent-sidebar-main-surface)
|
|
179
|
+
> :where(header, div).border-b,
|
|
180
|
+
.agent-layout-shell
|
|
181
|
+
.agent-layout-left-drawer
|
|
182
|
+
> :where(header, div).border-b:first-child,
|
|
183
|
+
.agent-layout-shell
|
|
184
|
+
.agent-layout-left-drawer
|
|
185
|
+
> :first-child
|
|
186
|
+
> :where(header, div).border-b,
|
|
187
|
+
.agent-layout-shell .agent-native-shell-topbar {
|
|
188
|
+
border-bottom-color: transparent !important;
|
|
189
|
+
}
|
|
187
190
|
|
|
188
|
-
.agent-layout-shell
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
.agent-layout-shell
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
}
|
|
191
|
+
.agent-layout-shell
|
|
192
|
+
:where(.agent-layout-main-surface, .agent-sidebar-main-surface)
|
|
193
|
+
> :first-child
|
|
194
|
+
> :where(header, div).border-b,
|
|
195
|
+
.agent-layout-shell
|
|
196
|
+
:where(.agent-layout-main-surface, .agent-sidebar-main-surface)
|
|
197
|
+
> :where(header, div).border-b {
|
|
198
|
+
background-color: var(--agent-native-raised-surface) !important;
|
|
199
|
+
}
|
|
197
200
|
|
|
198
|
-
.agent-layout-shell
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
.agent-layout-shell
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
201
|
+
.agent-layout-shell
|
|
202
|
+
:where(.agent-layout-main-surface, .agent-sidebar-main-surface)
|
|
203
|
+
> :first-child
|
|
204
|
+
> :where(header, div).border-b.h-12,
|
|
205
|
+
.agent-layout-shell
|
|
206
|
+
:where(.agent-layout-main-surface, .agent-sidebar-main-surface)
|
|
207
|
+
> :where(header, div).border-b.h-12 {
|
|
208
|
+
min-height: 4rem;
|
|
209
|
+
height: 4rem;
|
|
210
|
+
}
|
|
207
211
|
}
|
|
208
212
|
|
|
209
213
|
.dark
|
|
@@ -699,6 +703,14 @@
|
|
|
699
703
|
width: 100%;
|
|
700
704
|
}
|
|
701
705
|
|
|
706
|
+
/* Plan-mode callout pill: lives inside .agent-composer-stack directly above
|
|
707
|
+
the composer. Matching .agent-composer-area's own width keeps the pill
|
|
708
|
+
visually attached to (and right-aligned with) the composer instead of the
|
|
709
|
+
full pane, whether the pane is a narrow sidebar or a wide centered page. */
|
|
710
|
+
.agent-plan-mode-callout {
|
|
711
|
+
width: 100%;
|
|
712
|
+
}
|
|
713
|
+
|
|
702
714
|
[data-agent-empty-state="centered"] {
|
|
703
715
|
justify-content: center;
|
|
704
716
|
}
|
|
@@ -161,6 +161,18 @@ to find likely URLs, `web-request` or `provider-api-docs` with clean
|
|
|
161
161
|
`webFetch()` when you need to grep, aggregate, or compare many pages before
|
|
162
162
|
returning a small result.
|
|
163
163
|
|
|
164
|
+
For LONG compute, `run-code` supports durable background executions: pass
|
|
165
|
+
`background: true` and the code is enqueued to a `sandbox_executions` row and
|
|
166
|
+
executed out-of-band with a generous budget (default 10 min), surviving the
|
|
167
|
+
hosted agent run's ~40s soft timeout. The call returns
|
|
168
|
+
`{ executionId, status: "queued" }` immediately with polling guidance; check
|
|
169
|
+
progress with `run-code` `{ executionId }` (or the `get-code-execution` tool
|
|
170
|
+
where registered) — results persist after completion. Use background for big
|
|
171
|
+
cross-source joins, multi-page provider sweeps, and heavy analysis scripts;
|
|
172
|
+
keep quick scripts in the default foreground mode. Agents should continue
|
|
173
|
+
other work between polls, and on `failed`/`timed_out` split the computation or
|
|
174
|
+
persist intermediate progress with `workspaceWrite` and re-run.
|
|
175
|
+
|
|
164
176
|
### The `http` Option
|
|
165
177
|
|
|
166
178
|
Controls how the action is exposed as an HTTP endpoint:
|
|
@@ -205,6 +217,49 @@ run: async (args) => {
|
|
|
205
217
|
}
|
|
206
218
|
```
|
|
207
219
|
|
|
220
|
+
### Returning Images the Agent Can See (`_agentImages`)
|
|
221
|
+
|
|
222
|
+
An action's return object may include the well-known optional field
|
|
223
|
+
`_agentImages` to attach vision images (screenshots, chart previews, rendered
|
|
224
|
+
designs) to the tool result. The agent literally sees them — enabling visual
|
|
225
|
+
self-review loops — while the field itself is stripped from the JSON text the
|
|
226
|
+
model reads.
|
|
227
|
+
|
|
228
|
+
```ts
|
|
229
|
+
run: async ({ dashboardId }) => {
|
|
230
|
+
const shot = await renderDashboardPng(dashboardId); // Buffer
|
|
231
|
+
return {
|
|
232
|
+
dashboardId,
|
|
233
|
+
panelCount: 6,
|
|
234
|
+
_agentImages: [
|
|
235
|
+
// Either a public https URL (preferred — the provider fetches it)…
|
|
236
|
+
{ url: "https://cdn.example.com/previews/dash-1.png", label: "overview" },
|
|
237
|
+
// …or base64 without a data: prefix (mediaType required; a full
|
|
238
|
+
// data:image/png;base64,… URL in `data` is also accepted and parsed).
|
|
239
|
+
{ data: shot.toString("base64"), mediaType: "image/png" },
|
|
240
|
+
],
|
|
241
|
+
};
|
|
242
|
+
},
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Rules and limits:
|
|
246
|
+
|
|
247
|
+
- Shape: `Array<{ url?: string; data?: string; mediaType?: string; label?: string }>`.
|
|
248
|
+
Each entry needs `url` (https only) **or** `data`. Supported media types:
|
|
249
|
+
`image/jpeg`, `image/png`, `image/gif`, `image/webp`.
|
|
250
|
+
- Caps: max **4 images** per result; max **~2MB of base64** per image.
|
|
251
|
+
Over-cap or invalid entries never fail the call — they become text notes in
|
|
252
|
+
the result telling the model what was dropped and why.
|
|
253
|
+
- Persistence: the run ledger stores only the string result plus compact
|
|
254
|
+
`[image: …]` notes (URLs verbatim; base64 as a byte-count placeholder) —
|
|
255
|
+
never the payload. Images are re-attached only for the live turn; replayed
|
|
256
|
+
history is text-only, so prefer stable `url` images the model can re-request.
|
|
257
|
+
- Engine support: native Anthropic and vision-capable AI-SDK providers
|
|
258
|
+
(anthropic, openai, google, openrouter) receive real image blocks; other
|
|
259
|
+
paths (Builder gateway, non-vision providers) degrade to the text notes.
|
|
260
|
+
- External MCP tools need no changes — standard MCP `image` content parts are
|
|
261
|
+
converted automatically under the same caps.
|
|
262
|
+
|
|
208
263
|
### Validating Return Values (`outputSchema`)
|
|
209
264
|
|
|
210
265
|
`schema` validates inputs; `outputSchema` validates what the action **returns**. Pass any Standard Schema-compatible schema (Zod, Valibot, ArkType) and the framework validates the result _after_ `run()` resolves — input validated before `run`, output after.
|
|
@@ -121,22 +121,19 @@ capability is missing, add or extend a `defineAction` so both the agent and UI
|
|
|
121
121
|
share the same operation. Do not create `/api/*` routes that only call,
|
|
122
122
|
repackage, or proxy an action.
|
|
123
123
|
|
|
124
|
-
| Action | Args
|
|
125
|
-
| ------------- |
|
|
126
|
-
| `view-screen` |
|
|
127
|
-
| `navigate` | `--view <name>` or `--path <url>`
|
|
128
|
-
| `hello` | `[--name <name>]`
|
|
129
|
-
| `db-schema` |
|
|
130
|
-
| `db-query` | `--sql "SELECT ..."`
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
**For one-off maintenance, pick the right SQL tool:**
|
|
124
|
+
| Action | Args | Purpose |
|
|
125
|
+
| ------------- | --------------------------------- | ------------------------------- |
|
|
126
|
+
| `view-screen` | | See current UI state |
|
|
127
|
+
| `navigate` | `--view <name>` or `--path <url>` | Navigate the UI |
|
|
128
|
+
| `hello` | `[--name <name>]` | Example script |
|
|
129
|
+
| `db-schema` | | Show all tables, columns, types |
|
|
130
|
+
| `db-query` | `--sql "SELECT ..."` | Run a SELECT query |
|
|
131
|
+
|
|
132
|
+
**For data changes, pick the right surface:**
|
|
135
133
|
|
|
136
134
|
- Use domain actions first. They validate input, enforce access, and refresh the UI.
|
|
137
|
-
- Use `db-
|
|
138
|
-
-
|
|
139
|
-
- If a template-specific action exists (e.g. `edit-document`, `update-slide`), prefer it — those also push live updates to any open collaborative editor.
|
|
135
|
+
- Use `db-query` / `db-schema` for read-only inspection.
|
|
136
|
+
- Raw write SQL (`db-exec` / `db-patch`) is not part of the default agent surface. If this app explicitly opts into `databaseTools: "write"`, use those tools only for deliberate maintenance when no domain action exists.
|
|
140
137
|
- **Database admin (dev only):** in development, `db-admin-query` / `db-admin-mutate` / `db-admin-rows` / `db-admin-tables` / `db-admin-schema` give **unscoped, full-database** access to ANY table — including framework tables and tables without `owner_email`/`org_id`. Prefer these over `db-exec`/`db-query` for database-admin work and for any non-owner-scoped table: `db-exec`/`db-query` auto-scope to the current user and return **0 rows** on unscoped tables. These mirror the in-app Database admin UI, so prompts and the UI do the same thing.
|
|
141
138
|
|
|
142
139
|
## Skills
|
|
@@ -12,7 +12,7 @@ export default defineAction({
|
|
|
12
12
|
http: false,
|
|
13
13
|
run: async (args) => {
|
|
14
14
|
if (!args.view && !args.path) {
|
|
15
|
-
|
|
15
|
+
throw new Error("At least --view or --path is required.");
|
|
16
16
|
}
|
|
17
17
|
const nav: Record<string, string> = {};
|
|
18
18
|
if (args.view) nav.view = args.view;
|
|
@@ -303,7 +303,6 @@ const messages = {
|
|
|
303
303
|
'Create a new widget that fits in slot "{{slotId}}". I\'ll describe what it should do next.',
|
|
304
304
|
whatShouldItDo: "ماذا يجب أن تفعل؟",
|
|
305
305
|
createPlaceholder: "قائمة المهام، لوحة تحكم API، آلة حاسبة...",
|
|
306
|
-
backToApp: "العودة إلى التطبيق",
|
|
307
306
|
title: "الإضافات",
|
|
308
307
|
hiddenShown: "يظهر الإخفاء",
|
|
309
308
|
showHidden: "إظهار المخفية",
|
|
@@ -295,7 +295,6 @@ const messages = {
|
|
|
295
295
|
whatShouldItDo: "Was soll es tun?",
|
|
296
296
|
createPlaceholder:
|
|
297
297
|
"Eine Aufgabenliste, ein API-Dashboard, ein Taschenrechner ...",
|
|
298
|
-
backToApp: "Zurück zur App",
|
|
299
298
|
title: "Erweiterungen",
|
|
300
299
|
hiddenShown: "Versteckt angezeigt",
|
|
301
300
|
showHidden: "Ausgeblendete anzeigen",
|
|
@@ -288,7 +288,6 @@ const messages = {
|
|
|
288
288
|
'Create a new widget that fits in slot "{{slotId}}". I\'ll describe what it should do next.',
|
|
289
289
|
whatShouldItDo: "What should it do?",
|
|
290
290
|
createPlaceholder: "A todo list, API dashboard, calculator...",
|
|
291
|
-
backToApp: "Back to app",
|
|
292
291
|
title: "Extensions",
|
|
293
292
|
hiddenShown: "Hiding shown",
|
|
294
293
|
showHidden: "Show hidden",
|
|
@@ -300,7 +300,6 @@ const messages = {
|
|
|
300
300
|
whatShouldItDo: "¿Qué debería hacer?",
|
|
301
301
|
createPlaceholder:
|
|
302
302
|
"Una lista de tareas pendientes, panel API, calculadora...",
|
|
303
|
-
backToApp: "Volver a la aplicación",
|
|
304
303
|
title: "Extensiones",
|
|
305
304
|
hiddenShown: "Ocultando mostrado",
|
|
306
305
|
showHidden: "Mostrar ocultos",
|
|
@@ -299,7 +299,6 @@ const messages = {
|
|
|
299
299
|
whatShouldItDo: "Que devrait-il faire ?",
|
|
300
300
|
createPlaceholder:
|
|
301
301
|
"Une liste de tâches, un tableau de bord API, une calculatrice...",
|
|
302
|
-
backToApp: "Retour à l'application",
|
|
303
302
|
title: "Rallonges",
|
|
304
303
|
hiddenShown: "Masquer affiché",
|
|
305
304
|
showHidden: "Afficher les éléments masqués",
|