@agent-native/core 0.87.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.
Files changed (1719) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +88 -2
  3. package/corpus/core/docs/content/agent-native-toolkit.mdx +103 -0
  4. package/corpus/core/docs/content/cloneable-saas.mdx +19 -19
  5. package/corpus/core/docs/content/components.mdx +16 -4
  6. package/corpus/core/docs/content/data-programs.mdx +329 -0
  7. package/corpus/core/docs/content/deployment.mdx +9 -9
  8. package/corpus/core/docs/content/extensions.mdx +8 -7
  9. package/corpus/core/docs/content/generative-ui.mdx +5 -3
  10. package/corpus/core/docs/content/key-concepts.mdx +6 -9
  11. package/corpus/core/docs/content/locales/ar-SA/agent-native-toolkit.mdx +103 -0
  12. package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +19 -19
  13. package/corpus/core/docs/content/locales/ar-SA/components.mdx +12 -2
  14. package/corpus/core/docs/content/locales/ar-SA/data-programs.mdx +329 -0
  15. package/corpus/core/docs/content/locales/ar-SA/deployment.mdx +8 -9
  16. package/corpus/core/docs/content/locales/ar-SA/extensions.mdx +6 -4
  17. package/corpus/core/docs/content/locales/ar-SA/key-concepts.mdx +7 -9
  18. package/corpus/core/docs/content/locales/ar-SA/real-time-collaboration.mdx +9 -10
  19. package/corpus/core/docs/content/locales/ar-SA/sharing.mdx +15 -7
  20. package/corpus/core/docs/content/locales/de-DE/agent-native-toolkit.mdx +103 -0
  21. package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +19 -19
  22. package/corpus/core/docs/content/locales/de-DE/components.mdx +12 -2
  23. package/corpus/core/docs/content/locales/de-DE/data-programs.mdx +329 -0
  24. package/corpus/core/docs/content/locales/de-DE/deployment.mdx +8 -9
  25. package/corpus/core/docs/content/locales/de-DE/extensions.mdx +6 -4
  26. package/corpus/core/docs/content/locales/de-DE/key-concepts.mdx +8 -10
  27. package/corpus/core/docs/content/locales/de-DE/real-time-collaboration.mdx +9 -10
  28. package/corpus/core/docs/content/locales/de-DE/sharing.mdx +15 -7
  29. package/corpus/core/docs/content/locales/es-ES/agent-native-toolkit.mdx +103 -0
  30. package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +19 -19
  31. package/corpus/core/docs/content/locales/es-ES/components.mdx +12 -2
  32. package/corpus/core/docs/content/locales/es-ES/data-programs.mdx +329 -0
  33. package/corpus/core/docs/content/locales/es-ES/deployment.mdx +8 -9
  34. package/corpus/core/docs/content/locales/es-ES/extensions.mdx +6 -4
  35. package/corpus/core/docs/content/locales/es-ES/key-concepts.mdx +8 -10
  36. package/corpus/core/docs/content/locales/es-ES/real-time-collaboration.mdx +9 -10
  37. package/corpus/core/docs/content/locales/es-ES/sharing.mdx +15 -7
  38. package/corpus/core/docs/content/locales/fr-FR/agent-native-toolkit.mdx +103 -0
  39. package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +19 -19
  40. package/corpus/core/docs/content/locales/fr-FR/components.mdx +12 -2
  41. package/corpus/core/docs/content/locales/fr-FR/data-programs.mdx +329 -0
  42. package/corpus/core/docs/content/locales/fr-FR/deployment.mdx +8 -9
  43. package/corpus/core/docs/content/locales/fr-FR/extensions.mdx +6 -4
  44. package/corpus/core/docs/content/locales/fr-FR/key-concepts.mdx +8 -10
  45. package/corpus/core/docs/content/locales/fr-FR/real-time-collaboration.mdx +9 -10
  46. package/corpus/core/docs/content/locales/fr-FR/sharing.mdx +15 -7
  47. package/corpus/core/docs/content/locales/hi-IN/agent-native-toolkit.mdx +103 -0
  48. package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +19 -19
  49. package/corpus/core/docs/content/locales/hi-IN/components.mdx +20 -10
  50. package/corpus/core/docs/content/locales/hi-IN/data-programs.mdx +329 -0
  51. package/corpus/core/docs/content/locales/hi-IN/deployment.mdx +8 -9
  52. package/corpus/core/docs/content/locales/hi-IN/extensions.mdx +6 -4
  53. package/corpus/core/docs/content/locales/hi-IN/key-concepts.mdx +8 -10
  54. package/corpus/core/docs/content/locales/hi-IN/real-time-collaboration.mdx +9 -10
  55. package/corpus/core/docs/content/locales/hi-IN/sharing.mdx +15 -7
  56. package/corpus/core/docs/content/locales/ja-JP/agent-native-toolkit.mdx +103 -0
  57. package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +19 -19
  58. package/corpus/core/docs/content/locales/ja-JP/components.mdx +12 -2
  59. package/corpus/core/docs/content/locales/ja-JP/data-programs.mdx +329 -0
  60. package/corpus/core/docs/content/locales/ja-JP/deployment.mdx +8 -9
  61. package/corpus/core/docs/content/locales/ja-JP/extensions.mdx +6 -4
  62. package/corpus/core/docs/content/locales/ja-JP/key-concepts.mdx +9 -11
  63. package/corpus/core/docs/content/locales/ja-JP/real-time-collaboration.mdx +9 -10
  64. package/corpus/core/docs/content/locales/ja-JP/sharing.mdx +15 -7
  65. package/corpus/core/docs/content/locales/ko-KR/agent-native-toolkit.mdx +103 -0
  66. package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +19 -19
  67. package/corpus/core/docs/content/locales/ko-KR/components.mdx +20 -10
  68. package/corpus/core/docs/content/locales/ko-KR/data-programs.mdx +329 -0
  69. package/corpus/core/docs/content/locales/ko-KR/deployment.mdx +8 -9
  70. package/corpus/core/docs/content/locales/ko-KR/extensions.mdx +16 -14
  71. package/corpus/core/docs/content/locales/ko-KR/key-concepts.mdx +9 -11
  72. package/corpus/core/docs/content/locales/ko-KR/real-time-collaboration.mdx +9 -10
  73. package/corpus/core/docs/content/locales/ko-KR/sharing.mdx +15 -7
  74. package/corpus/core/docs/content/locales/pt-BR/agent-native-toolkit.mdx +103 -0
  75. package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +19 -19
  76. package/corpus/core/docs/content/locales/pt-BR/components.mdx +12 -2
  77. package/corpus/core/docs/content/locales/pt-BR/data-programs.mdx +329 -0
  78. package/corpus/core/docs/content/locales/pt-BR/deployment.mdx +8 -9
  79. package/corpus/core/docs/content/locales/pt-BR/extensions.mdx +6 -4
  80. package/corpus/core/docs/content/locales/pt-BR/key-concepts.mdx +8 -11
  81. package/corpus/core/docs/content/locales/pt-BR/real-time-collaboration.mdx +9 -10
  82. package/corpus/core/docs/content/locales/pt-BR/sharing.mdx +15 -7
  83. package/corpus/core/docs/content/locales/zh-CN/agent-native-toolkit.mdx +103 -0
  84. package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +19 -19
  85. package/corpus/core/docs/content/locales/zh-CN/components.mdx +20 -10
  86. package/corpus/core/docs/content/locales/zh-CN/data-programs.mdx +329 -0
  87. package/corpus/core/docs/content/locales/zh-CN/deployment.mdx +7 -9
  88. package/corpus/core/docs/content/locales/zh-CN/extensions.mdx +16 -14
  89. package/corpus/core/docs/content/locales/zh-CN/key-concepts.mdx +7 -11
  90. package/corpus/core/docs/content/locales/zh-CN/real-time-collaboration.mdx +10 -11
  91. package/corpus/core/docs/content/locales/zh-CN/sharing.mdx +15 -7
  92. package/corpus/core/docs/content/locales/zh-TW/agent-native-toolkit.mdx +103 -0
  93. package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +19 -19
  94. package/corpus/core/docs/content/locales/zh-TW/components.mdx +20 -10
  95. package/corpus/core/docs/content/locales/zh-TW/data-programs.mdx +329 -0
  96. package/corpus/core/docs/content/locales/zh-TW/deployment.mdx +7 -9
  97. package/corpus/core/docs/content/locales/zh-TW/extensions.mdx +16 -14
  98. package/corpus/core/docs/content/locales/zh-TW/key-concepts.mdx +7 -11
  99. package/corpus/core/docs/content/locales/zh-TW/real-time-collaboration.mdx +10 -11
  100. package/corpus/core/docs/content/locales/zh-TW/sharing.mdx +15 -7
  101. package/corpus/core/docs/content/real-time-collaboration.mdx +10 -11
  102. package/corpus/core/docs/content/sharing.mdx +39 -7
  103. package/corpus/core/docs/content/toolkit-app-adapters.mdx +46 -0
  104. package/corpus/core/docs/content/toolkit-collaboration-ui.mdx +48 -0
  105. package/corpus/core/docs/content/toolkit-sharing-ui.mdx +33 -0
  106. package/corpus/core/docs/content/toolkit-shell-hooks.mdx +27 -0
  107. package/corpus/core/docs/content/toolkit-ui.mdx +69 -0
  108. package/corpus/core/package.json +6 -1
  109. package/corpus/core/src/agent/durable-background.ts +53 -0
  110. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +7 -1
  111. package/corpus/core/src/agent/engine/anthropic-engine.ts +29 -1
  112. package/corpus/core/src/agent/engine/builder-engine.ts +1 -0
  113. package/corpus/core/src/agent/engine/output-tokens.ts +26 -13
  114. package/corpus/core/src/agent/engine/registry.ts +45 -26
  115. package/corpus/core/src/agent/engine/translate-ai-sdk.ts +56 -7
  116. package/corpus/core/src/agent/engine/translate-anthropic.ts +43 -1
  117. package/corpus/core/src/agent/engine/types.ts +16 -0
  118. package/corpus/core/src/agent/model-config.ts +100 -0
  119. package/corpus/core/src/agent/production-agent.ts +492 -241
  120. package/corpus/core/src/agent/runtime-context.ts +50 -12
  121. package/corpus/core/src/agent/tool-result-images.ts +178 -0
  122. package/corpus/core/src/brand-kit/fig/index.ts +8 -4
  123. package/corpus/core/src/client/AgentPanel.tsx +88 -31
  124. package/corpus/core/src/client/AssistantChat.tsx +95 -46
  125. package/corpus/core/src/client/KeepTabOpenNotice.tsx +176 -0
  126. package/corpus/core/src/client/MultiTabAssistantChat.tsx +7 -0
  127. package/corpus/core/src/client/RunStuckBanner.tsx +13 -1
  128. package/corpus/core/src/client/chat/run-recovery.tsx +7 -1
  129. package/corpus/core/src/client/clipboard.ts +17 -13
  130. package/corpus/core/src/client/components/AgentPresenceChip.tsx +4 -69
  131. package/corpus/core/src/client/components/LiveCursorOverlay.tsx +5 -240
  132. package/corpus/core/src/client/components/PresenceBar.tsx +4 -346
  133. package/corpus/core/src/client/components/RecentEditHighlights.tsx +4 -219
  134. package/corpus/core/src/client/components/RemoteSelectionRings.tsx +5 -220
  135. package/corpus/core/src/client/composer/TiptapComposer.tsx +94 -38
  136. package/corpus/core/src/client/db-admin/SqlEditor.tsx +13 -3
  137. package/corpus/core/src/client/dynamic-suggestions.ts +6 -1
  138. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +0 -14
  139. package/corpus/core/src/client/extensions/ExtensionsListPage.tsx +29 -30
  140. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +2 -1
  141. package/corpus/core/src/client/host-bridge.ts +29 -8
  142. package/corpus/core/src/client/i18n.tsx +7 -1
  143. package/corpus/core/src/client/index.ts +5 -0
  144. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +34 -69
  145. package/corpus/core/src/client/rich-markdown-editor/SharedRichEditor.tsx +4 -0
  146. package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +7 -1
  147. package/corpus/core/src/client/settings/SettingsPanel.tsx +409 -230
  148. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +5 -7
  149. package/corpus/core/src/client/settings/index.ts +5 -1
  150. package/corpus/core/src/client/sharing/VisibilityBadge.tsx +4 -37
  151. package/corpus/core/src/client/use-run-stuck-detection.ts +10 -1
  152. package/corpus/core/src/coding-tools/run-code.ts +473 -74
  153. package/corpus/core/src/coding-tools/sandbox/background.ts +406 -0
  154. package/corpus/core/src/coding-tools/sandbox/executions-store.ts +517 -0
  155. package/corpus/core/src/coding-tools/sandbox/index.ts +53 -13
  156. package/corpus/core/src/coding-tools/sandbox/local-child-process-adapter.ts +61 -4
  157. package/corpus/core/src/collab/client.ts +870 -562
  158. package/corpus/core/src/collab/presence.ts +12 -23
  159. package/corpus/core/src/collab/recent-edits.ts +13 -32
  160. package/corpus/core/src/data-programs/actions.ts +335 -0
  161. package/corpus/core/src/data-programs/contract.ts +284 -0
  162. package/corpus/core/src/data-programs/execute.ts +693 -0
  163. package/corpus/core/src/data-programs/index.ts +72 -0
  164. package/corpus/core/src/data-programs/schema.ts +148 -0
  165. package/corpus/core/src/data-programs/store.ts +755 -0
  166. package/corpus/core/src/deploy/build.ts +34 -0
  167. package/corpus/core/src/extensions/actions.ts +2 -2
  168. package/corpus/core/src/file-upload/builder.ts +11 -0
  169. package/corpus/core/src/integrations/webhook-handler.ts +27 -8
  170. package/corpus/core/src/local-artifacts/index.ts +1 -1
  171. package/corpus/core/src/localization/default-messages.ts +1 -2
  172. package/corpus/core/src/mcp-client/index.ts +29 -0
  173. package/corpus/core/src/onboarding/default-steps.ts +5 -2
  174. package/corpus/core/src/resources/store.ts +34 -3
  175. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +4 -8
  176. package/corpus/core/src/scripts/agent-engines/test-agent-engine.ts +9 -2
  177. package/corpus/core/src/scripts/db/tool-mode.ts +2 -2
  178. package/corpus/core/src/scripts/resources/migrate-learnings.ts +9 -13
  179. package/corpus/core/src/server/action-discovery.ts +4 -0
  180. package/corpus/core/src/server/action-routes.ts +8 -1
  181. package/corpus/core/src/server/agent-chat-plugin.ts +154 -62
  182. package/corpus/core/src/server/agent-discovery.ts +67 -7
  183. package/corpus/core/src/server/auth.ts +90 -3
  184. package/corpus/core/src/server/builder-design-systems.ts +2 -2
  185. package/corpus/core/src/server/core-routes-plugin.ts +119 -22
  186. package/corpus/core/src/server/credential-provider.ts +28 -8
  187. package/corpus/core/src/server/csrf.ts +3 -0
  188. package/corpus/core/src/server/index.ts +9 -0
  189. package/corpus/core/src/server/oauth-helpers.ts +11 -1
  190. package/corpus/core/src/server/onboarding-html.ts +80 -48
  191. package/corpus/core/src/server/prompts/shared-rules.ts +2 -2
  192. package/corpus/core/src/server/transcribe-voice.ts +93 -9
  193. package/corpus/core/src/shared/agent-readable-resource.ts +111 -0
  194. package/corpus/core/src/shared/index.ts +9 -0
  195. package/corpus/core/src/sharing/actions/create-agent-resource-link.ts +91 -0
  196. package/corpus/core/src/sharing/registry.ts +19 -0
  197. package/corpus/core/src/styles/agent-native.css +57 -45
  198. package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +55 -0
  199. package/corpus/core/src/templates/default/AGENTS.md +11 -14
  200. package/corpus/core/src/templates/default/actions/navigate.ts +1 -1
  201. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +0 -1
  202. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +0 -1
  203. package/corpus/core/src/templates/default/app/i18n/en-US.ts +0 -1
  204. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +0 -1
  205. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +0 -1
  206. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +0 -1
  207. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +0 -1
  208. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +0 -1
  209. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +0 -1
  210. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +0 -1
  211. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +0 -1
  212. package/corpus/core/src/templates/default/app/routes/settings.tsx +22 -33
  213. package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +20 -7
  214. package/corpus/core/src/templates/headless/AGENTS.md +9 -6
  215. package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +55 -0
  216. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +92 -0
  217. package/corpus/core/src/templates/workspace-core/.agents/skills/data-programs/SKILL.md +128 -0
  218. package/corpus/core/src/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +10 -4
  219. package/corpus/core/src/vite/agents-bundle-plugin.ts +26 -1
  220. package/corpus/core/src/vite/client.ts +13 -0
  221. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +55 -0
  222. package/corpus/templates/analytics/.agents/skills/analysis-workspace/SKILL.md +8 -0
  223. package/corpus/templates/analytics/.agents/skills/data-programs/SKILL.md +348 -0
  224. package/corpus/templates/analytics/.agents/skills/provider-api/SKILL.md +10 -0
  225. package/corpus/templates/analytics/AGENTS.md +31 -32
  226. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +1 -1
  227. package/corpus/templates/analytics/actions/delete-data-source-credentials.ts +32 -0
  228. package/corpus/templates/analytics/actions/ensure-risk-meeting-dashboard.ts +247 -0
  229. package/corpus/templates/analytics/actions/get-sql-dashboard.ts +9 -113
  230. package/corpus/templates/analytics/actions/update-data-source-credentials.ts +123 -0
  231. package/corpus/templates/analytics/app/components/InlineMetric.tsx +2 -2
  232. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +2 -7
  233. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +11 -16
  234. package/corpus/templates/analytics/app/components/dashboard/DateRangePicker.tsx +1 -2
  235. package/corpus/templates/analytics/app/components/dashboard/MetricCard.tsx +2 -7
  236. package/corpus/templates/analytics/app/components/dashboard/RecentActivity.tsx +3 -6
  237. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +1 -6
  238. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +2 -7
  239. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +11 -15
  240. package/corpus/templates/analytics/app/components/dashboard/StatsCard.tsx +1 -7
  241. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +2 -7
  242. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +16 -16
  243. package/corpus/templates/analytics/app/components/layout/Header.tsx +2 -2
  244. package/corpus/templates/analytics/app/components/layout/HeaderActions.tsx +2 -1
  245. package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -2
  246. package/corpus/templates/analytics/app/components/layout/MobileNav.tsx +33 -17
  247. package/corpus/templates/analytics/app/components/layout/NewAnalysisDialog.tsx +6 -6
  248. package/corpus/templates/analytics/app/components/layout/NewDashboardDialog.tsx +4 -3
  249. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +119 -68
  250. package/corpus/templates/analytics/app/components/ui/alert-dialog.tsx +1 -0
  251. package/corpus/templates/analytics/app/components/ui/alert.tsx +1 -0
  252. package/corpus/templates/analytics/app/components/ui/avatar.tsx +1 -0
  253. package/corpus/templates/analytics/app/components/ui/badge.tsx +1 -0
  254. package/corpus/templates/analytics/app/components/ui/button.tsx +1 -0
  255. package/corpus/templates/analytics/app/components/ui/calendar.tsx +1 -1
  256. package/corpus/templates/analytics/app/components/ui/card.tsx +1 -0
  257. package/corpus/templates/analytics/app/components/ui/checkbox.tsx +1 -0
  258. package/corpus/templates/analytics/app/components/ui/collapsible.tsx +1 -0
  259. package/corpus/templates/analytics/app/components/ui/command.tsx +1 -0
  260. package/corpus/templates/analytics/app/components/ui/date-picker.tsx +1 -0
  261. package/corpus/templates/analytics/app/components/ui/dialog.tsx +1 -0
  262. package/corpus/templates/analytics/app/components/ui/dropdown-menu.tsx +1 -0
  263. package/corpus/templates/analytics/app/components/ui/input.tsx +1 -0
  264. package/corpus/templates/analytics/app/components/ui/label.tsx +1 -0
  265. package/corpus/templates/analytics/app/components/ui/popover.tsx +1 -0
  266. package/corpus/templates/analytics/app/components/ui/progress.tsx +1 -0
  267. package/corpus/templates/analytics/app/components/ui/select.tsx +1 -0
  268. package/corpus/templates/analytics/app/components/ui/sheet.tsx +1 -0
  269. package/corpus/templates/analytics/app/components/ui/skeleton.tsx +1 -0
  270. package/corpus/templates/analytics/app/components/ui/sonner.tsx +1 -0
  271. package/corpus/templates/analytics/app/components/ui/spinner.tsx +1 -0
  272. package/corpus/templates/analytics/app/components/ui/switch.tsx +1 -0
  273. package/corpus/templates/analytics/app/components/ui/table.tsx +1 -0
  274. package/corpus/templates/analytics/app/components/ui/tabs.tsx +1 -0
  275. package/corpus/templates/analytics/app/components/ui/textarea.tsx +1 -0
  276. package/corpus/templates/analytics/app/components/ui/toaster.tsx +1 -0
  277. package/corpus/templates/analytics/app/components/ui/toggle-group.tsx +1 -0
  278. package/corpus/templates/analytics/app/components/ui/toolkit-provider.tsx +12 -0
  279. package/corpus/templates/analytics/app/components/ui/tooltip.tsx +1 -0
  280. package/corpus/templates/analytics/app/global.css +26 -3
  281. package/corpus/templates/analytics/app/i18n/zh-TW.ts +27 -4
  282. package/corpus/templates/analytics/app/i18n-data.ts +277 -42
  283. package/corpus/templates/analytics/app/pages/Agents.tsx +19 -19
  284. package/corpus/templates/analytics/app/pages/DataDictionary.tsx +21 -21
  285. package/corpus/templates/analytics/app/pages/DataSources.tsx +31 -54
  286. package/corpus/templates/analytics/app/pages/NotFound.tsx +2 -1
  287. package/corpus/templates/analytics/app/pages/Placeholder.tsx +2 -1
  288. package/corpus/templates/analytics/app/pages/Settings.tsx +19 -37
  289. package/corpus/templates/analytics/app/pages/adhoc/DashboardSkeleton.tsx +3 -2
  290. package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +8 -13
  291. package/corpus/templates/analytics/app/pages/adhoc/_shared/components/DateRangeInput.tsx +1 -2
  292. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ChartTypePicker.tsx +2 -4
  293. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/DateRangePicker.tsx +1 -2
  294. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventCombobox.tsx +7 -7
  295. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventPanel.tsx +2 -1
  296. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventRow.tsx +2 -1
  297. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ExplorerChart.tsx +3 -8
  298. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/FilterBuilder.tsx +5 -4
  299. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/GroupByPicker.tsx +2 -1
  300. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/PropertyCombobox.tsx +7 -7
  301. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/PropertyValueCombobox.tsx +7 -7
  302. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/SqlPreview.tsx +1 -1
  303. package/corpus/templates/analytics/app/pages/adhoc/explorer/index.tsx +16 -16
  304. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/ChartCard.tsx +16 -21
  305. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +32 -32
  306. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +14 -14
  307. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/EmailReportDialog.tsx +14 -13
  308. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +200 -52
  309. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +23 -28
  310. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewSqlPopover.tsx +13 -12
  311. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +15 -15
  312. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +32 -36
  313. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +2 -1
  314. package/corpus/templates/analytics/app/pages/analyses/AnalysesList.tsx +8 -7
  315. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +19 -19
  316. package/corpus/templates/analytics/app/pages/analyses/LegacyFusionAnalysis.tsx +11 -15
  317. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +14 -14
  318. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +7 -12
  319. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +12 -12
  320. package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +25 -25
  321. package/corpus/templates/analytics/app/root.tsx +22 -19
  322. package/corpus/templates/analytics/app/routes/catalog.tsx +8 -8
  323. package/corpus/templates/analytics/changelog/2026-07-06-dashboard-lists-and-headers-stay-compact.md +6 -0
  324. package/corpus/templates/analytics/changelog/2026-07-06-dashboards-can-now-chart-data-programs-saved-server-side-scr.md +6 -0
  325. package/corpus/templates/analytics/changelog/2026-07-06-extension-pages-and-mobile-headers-now-share-one-background-shade.md +6 -0
  326. package/corpus/templates/analytics/changelog/2026-07-06-mobile-chat-header-is-more-compact-and-the-menu-button-opens-navigation.md +5 -0
  327. package/corpus/templates/analytics/learnings.defaults.md +36 -0
  328. package/corpus/templates/analytics/seeds/data-programs/risk-meeting-cohort.js +254 -0
  329. package/corpus/templates/analytics/seeds/data-programs/risk-meeting-pylon-early-warning.js +184 -0
  330. package/corpus/templates/analytics/server/db/index.ts +14 -0
  331. package/corpus/templates/analytics/server/handlers/sql-query.ts +1 -1
  332. package/corpus/templates/analytics/server/lib/agent-readable-resource-context.ts +156 -0
  333. package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +109 -1
  334. package/corpus/templates/analytics/server/routes/[...page].get.ts +92 -25
  335. package/corpus/templates/analytics/server/routes/api/analysis-agent-context.json.get.ts +94 -0
  336. package/corpus/templates/analytics/server/routes/api/dashboard-agent-context.json.get.ts +109 -0
  337. package/corpus/templates/analytics/shared/resource-agent-access.ts +6 -0
  338. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +55 -0
  339. package/corpus/templates/assets/app/components/create/RecentDraftsSection.tsx +3 -2
  340. package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +16 -10
  341. package/corpus/templates/assets/app/components/layout/Header.tsx +1 -1
  342. package/corpus/templates/assets/app/components/layout/PageShell.tsx +4 -4
  343. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +12 -12
  344. package/corpus/templates/assets/app/components/library/CreateLibraryDialog.tsx +8 -8
  345. package/corpus/templates/assets/app/components/library/EditLibraryDialog.tsx +7 -7
  346. package/corpus/templates/assets/app/components/library/LibraryCard.tsx +8 -8
  347. package/corpus/templates/assets/app/components/library/LibraryPresetGrid.tsx +3 -2
  348. package/corpus/templates/assets/app/components/ui/alert-dialog.tsx +1 -0
  349. package/corpus/templates/assets/app/components/ui/badge.tsx +1 -0
  350. package/corpus/templates/assets/app/components/ui/button.tsx +1 -0
  351. package/corpus/templates/assets/app/components/ui/card.tsx +1 -0
  352. package/corpus/templates/assets/app/components/ui/checkbox.tsx +1 -0
  353. package/corpus/templates/assets/app/components/ui/dialog.tsx +1 -0
  354. package/corpus/templates/assets/app/components/ui/dropdown-menu.tsx +1 -0
  355. package/corpus/templates/assets/app/components/ui/input.tsx +1 -0
  356. package/corpus/templates/assets/app/components/ui/label.tsx +1 -0
  357. package/corpus/templates/assets/app/components/ui/popover.tsx +1 -0
  358. package/corpus/templates/assets/app/components/ui/select.tsx +1 -0
  359. package/corpus/templates/assets/app/components/ui/separator.tsx +1 -0
  360. package/corpus/templates/assets/app/components/ui/sheet.tsx +1 -0
  361. package/corpus/templates/assets/app/components/ui/skeleton.tsx +1 -0
  362. package/corpus/templates/assets/app/components/ui/sonner.tsx +1 -0
  363. package/corpus/templates/assets/app/components/ui/spinner.tsx +1 -0
  364. package/corpus/templates/assets/app/components/ui/tabs.tsx +1 -0
  365. package/corpus/templates/assets/app/components/ui/toolkit-provider.tsx +12 -0
  366. package/corpus/templates/assets/app/components/ui/tooltip.tsx +1 -0
  367. package/corpus/templates/assets/app/global.css +1 -0
  368. package/corpus/templates/assets/app/root.tsx +12 -9
  369. package/corpus/templates/assets/app/routes/asset.$id.tsx +19 -19
  370. package/corpus/templates/assets/app/routes/audit.tsx +15 -14
  371. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +49 -54
  372. package/corpus/templates/assets/app/routes/library.tsx +31 -31
  373. package/corpus/templates/assets/app/routes/settings.tsx +21 -35
  374. package/corpus/templates/assets/changelog/2026-07-06-mobile-layouts-no-longer-stack-two-top-headers.md +5 -0
  375. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +55 -0
  376. package/corpus/templates/brain/.agents/skills/ask-across-everything/SKILL.md +6 -1
  377. package/corpus/templates/brain/.agents/skills/brain/SKILL.md +63 -5
  378. package/corpus/templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md +112 -0
  379. package/corpus/templates/brain/AGENTS.md +93 -8
  380. package/corpus/templates/brain/app/components/brain/CanonicalPreviewSheet.tsx +6 -5
  381. package/corpus/templates/brain/app/components/brain/Surface.tsx +3 -8
  382. package/corpus/templates/brain/app/components/layout/Layout.tsx +7 -7
  383. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +6 -6
  384. package/corpus/templates/brain/app/components/ui/badge.tsx +1 -0
  385. package/corpus/templates/brain/app/components/ui/button.tsx +1 -0
  386. package/corpus/templates/brain/app/components/ui/card.tsx +1 -0
  387. package/corpus/templates/brain/app/components/ui/input.tsx +1 -0
  388. package/corpus/templates/brain/app/components/ui/label.tsx +1 -0
  389. package/corpus/templates/brain/app/components/ui/progress.tsx +1 -0
  390. package/corpus/templates/brain/app/components/ui/select.tsx +1 -0
  391. package/corpus/templates/brain/app/components/ui/separator.tsx +1 -0
  392. package/corpus/templates/brain/app/components/ui/sheet.tsx +1 -0
  393. package/corpus/templates/brain/app/components/ui/skeleton.tsx +1 -0
  394. package/corpus/templates/brain/app/components/ui/switch.tsx +1 -0
  395. package/corpus/templates/brain/app/components/ui/table.tsx +1 -0
  396. package/corpus/templates/brain/app/components/ui/textarea.tsx +1 -0
  397. package/corpus/templates/brain/app/components/ui/toolkit-provider.tsx +12 -0
  398. package/corpus/templates/brain/app/components/ui/tooltip.tsx +1 -0
  399. package/corpus/templates/brain/app/global.css +1 -0
  400. package/corpus/templates/brain/app/hooks/use-distillation-bridge.ts +9 -4
  401. package/corpus/templates/brain/app/root.tsx +11 -8
  402. package/corpus/templates/brain/app/routes/knowledge.tsx +19 -19
  403. package/corpus/templates/brain/app/routes/ops.tsx +18 -18
  404. package/corpus/templates/brain/app/routes/review.tsx +22 -27
  405. package/corpus/templates/brain/app/routes/search.tsx +20 -20
  406. package/corpus/templates/brain/app/routes/settings.tsx +25 -40
  407. package/corpus/templates/brain/app/routes/sources.tsx +23 -23
  408. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +55 -0
  409. package/corpus/templates/calendar/actions/find-a-time.ts +29 -16
  410. package/corpus/templates/calendar/actions/list-bookings.ts +33 -2
  411. package/corpus/templates/calendar/actions/list-events.ts +34 -8
  412. package/corpus/templates/calendar/actions/update-calendar-visual-preferences.ts +105 -34
  413. package/corpus/templates/calendar/app/components/ThemeToggle.tsx +5 -5
  414. package/corpus/templates/calendar/app/components/TimezoneCombobox.tsx +6 -6
  415. package/corpus/templates/calendar/app/components/booking/BookingConfirmation.tsx +2 -1
  416. package/corpus/templates/calendar/app/components/booking/BookingForm.tsx +9 -8
  417. package/corpus/templates/calendar/app/components/booking/DatePicker.tsx +2 -2
  418. package/corpus/templates/calendar/app/components/booking/TimeSlotPicker.tsx +3 -2
  419. package/corpus/templates/calendar/app/components/calendar/AddCalendarDialog.tsx +10 -15
  420. package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +6 -6
  421. package/corpus/templates/calendar/app/components/calendar/CommandPalette.tsx +73 -3
  422. package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +27 -27
  423. package/corpus/templates/calendar/app/components/calendar/DayView.tsx +553 -267
  424. package/corpus/templates/calendar/app/components/calendar/DeleteEventDialog.tsx +9 -12
  425. package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +10 -13
  426. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +7 -7
  427. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -21
  428. package/corpus/templates/calendar/app/components/calendar/EventDialog.tsx +11 -11
  429. package/corpus/templates/calendar/app/components/calendar/EventOptionControls.tsx +9 -9
  430. package/corpus/templates/calendar/app/components/calendar/FindTimePanel.tsx +9 -9
  431. package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +6 -6
  432. package/corpus/templates/calendar/app/components/calendar/GoogleSetupWizard.tsx +3 -3
  433. package/corpus/templates/calendar/app/components/calendar/GoogleSyncButton.tsx +1 -1
  434. package/corpus/templates/calendar/app/components/calendar/GuestNotificationDialog.tsx +8 -10
  435. package/corpus/templates/calendar/app/components/calendar/IntegrationsSidebar.tsx +12 -12
  436. package/corpus/templates/calendar/app/components/calendar/KeyboardShortcutsHelp.tsx +2 -2
  437. package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +93 -41
  438. package/corpus/templates/calendar/app/components/calendar/PeopleSearchDialog.tsx +6 -6
  439. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +530 -299
  440. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +229 -134
  441. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +135 -108
  442. package/corpus/templates/calendar/app/components/ui/alert-dialog.tsx +1 -0
  443. package/corpus/templates/calendar/app/components/ui/badge.tsx +1 -0
  444. package/corpus/templates/calendar/app/components/ui/button.tsx +1 -0
  445. package/corpus/templates/calendar/app/components/ui/card.tsx +1 -0
  446. package/corpus/templates/calendar/app/components/ui/checkbox.tsx +1 -0
  447. package/corpus/templates/calendar/app/components/ui/collapsible.tsx +1 -0
  448. package/corpus/templates/calendar/app/components/ui/command.tsx +1 -0
  449. package/corpus/templates/calendar/app/components/ui/dialog.tsx +1 -0
  450. package/corpus/templates/calendar/app/components/ui/dropdown-menu.tsx +1 -0
  451. package/corpus/templates/calendar/app/components/ui/input.tsx +1 -0
  452. package/corpus/templates/calendar/app/components/ui/label.tsx +1 -0
  453. package/corpus/templates/calendar/app/components/ui/popover.tsx +1 -0
  454. package/corpus/templates/calendar/app/components/ui/radio-group.tsx +1 -0
  455. package/corpus/templates/calendar/app/components/ui/select.tsx +1 -0
  456. package/corpus/templates/calendar/app/components/ui/separator.tsx +1 -0
  457. package/corpus/templates/calendar/app/components/ui/skeleton.tsx +1 -0
  458. package/corpus/templates/calendar/app/components/ui/spinner.tsx +1 -0
  459. package/corpus/templates/calendar/app/components/ui/switch.tsx +1 -0
  460. package/corpus/templates/calendar/app/components/ui/table.tsx +1 -0
  461. package/corpus/templates/calendar/app/components/ui/tabs.tsx +1 -0
  462. package/corpus/templates/calendar/app/components/ui/textarea.tsx +1 -0
  463. package/corpus/templates/calendar/app/components/ui/toolkit-provider.tsx +12 -0
  464. package/corpus/templates/calendar/app/components/ui/tooltip.tsx +1 -0
  465. package/corpus/templates/calendar/app/global.css +1 -0
  466. package/corpus/templates/calendar/app/hooks/use-event-drag.ts +63 -9
  467. package/corpus/templates/calendar/app/hooks/use-google-auth.ts +15 -27
  468. package/corpus/templates/calendar/app/hooks/use-grid-create-drag.ts +254 -0
  469. package/corpus/templates/calendar/app/hooks/use-mobile.ts +1 -0
  470. package/corpus/templates/calendar/app/hooks/use-view-preferences.ts +287 -21
  471. package/corpus/templates/calendar/app/hooks/use-zoom-auth.ts +56 -19
  472. package/corpus/templates/calendar/app/i18n/zh-TW.ts +3 -0
  473. package/corpus/templates/calendar/app/i18n-data.ts +31 -0
  474. package/corpus/templates/calendar/app/lib/event-colors.ts +29 -8
  475. package/corpus/templates/calendar/app/pages/AvailabilitySettings.tsx +11 -11
  476. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +45 -50
  477. package/corpus/templates/calendar/app/pages/BookingPage.tsx +2 -2
  478. package/corpus/templates/calendar/app/pages/BookingsList.tsx +12 -12
  479. package/corpus/templates/calendar/app/pages/CalendarView.tsx +438 -271
  480. package/corpus/templates/calendar/app/pages/ManageBookingPage.tsx +13 -13
  481. package/corpus/templates/calendar/app/pages/Settings.tsx +15 -29
  482. package/corpus/templates/calendar/app/root.tsx +19 -15
  483. package/corpus/templates/calendar/app/routes/event.tsx +2 -2
  484. package/corpus/templates/calendar/changelog/2026-07-06-calendar-now-loads-view-preferences-much-more-efficiently.md +6 -0
  485. package/corpus/templates/calendar/changelog/2026-07-06-connected-calendars-keep-their-own-color-when-you-customize-.md +6 -0
  486. package/corpus/templates/calendar/changelog/2026-07-06-create-events-from-the-command-menu-with-natural-phrases-lik.md +6 -0
  487. package/corpus/templates/calendar/changelog/2026-07-06-drag-across-empty-week-or-day-slots-to-create-an-event-with-.md +6 -0
  488. package/corpus/templates/calendar/changelog/2026-07-06-dragging-and-resizing-events-is-much-smoother-especially-on-.md +6 -0
  489. package/corpus/templates/calendar/changelog/2026-07-06-each-connected-google-account-can-now-have-its-own-calendar-.md +6 -0
  490. package/corpus/templates/calendar/changelog/2026-07-06-events-spanning-multiple-days-now-show-on-every-day-they-cov.md +6 -0
  491. package/corpus/templates/calendar/changelog/2026-07-06-google-calendar-now-finishes-connecting-correctly-after-sign.md +6 -0
  492. package/corpus/templates/calendar/changelog/2026-07-06-public-booking-pages-respond-faster.md +6 -0
  493. package/corpus/templates/calendar/changelog/2026-07-06-the-app-header-no-longer-shows-the-global-notifications-bell.md +6 -0
  494. package/corpus/templates/calendar/package.json +1 -0
  495. package/corpus/templates/calendar/server/handlers/bookings.ts +46 -52
  496. package/corpus/templates/calendar/server/handlers/google-auth.ts +21 -5
  497. package/corpus/templates/calendar/server/lib/google-calendar.ts +32 -3
  498. package/corpus/templates/calendar/shared/calendar-view-preferences.ts +66 -2
  499. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +55 -0
  500. package/corpus/templates/chat/app/components/layout/Layout.tsx +6 -6
  501. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +12 -12
  502. package/corpus/templates/chat/app/components/ui/button.tsx +1 -0
  503. package/corpus/templates/chat/app/components/ui/card.tsx +1 -0
  504. package/corpus/templates/chat/app/components/ui/dropdown-menu.tsx +1 -0
  505. package/corpus/templates/chat/app/components/ui/input.tsx +1 -0
  506. package/corpus/templates/chat/app/components/ui/label.tsx +1 -0
  507. package/corpus/templates/chat/app/components/ui/sheet.tsx +1 -0
  508. package/corpus/templates/chat/app/components/ui/toolkit-provider.tsx +12 -0
  509. package/corpus/templates/chat/app/components/ui/tooltip.tsx +1 -0
  510. package/corpus/templates/chat/app/global.css +1 -0
  511. package/corpus/templates/chat/app/root.tsx +7 -4
  512. package/corpus/templates/chat/app/routes/settings.tsx +6 -21
  513. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +55 -0
  514. package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +18 -4
  515. package/corpus/templates/clips/.env.example +8 -0
  516. package/corpus/templates/clips/actions/accept-invite.ts +3 -0
  517. package/corpus/templates/clips/actions/add-recording-to-space.ts +55 -27
  518. package/corpus/templates/clips/actions/add-vocabulary-term.ts +3 -1
  519. package/corpus/templates/clips/actions/archive-recording.ts +5 -12
  520. package/corpus/templates/clips/actions/cleanup-transcript.ts +5 -4
  521. package/corpus/templates/clips/actions/clear-edits.ts +42 -29
  522. package/corpus/templates/clips/actions/create-meeting.ts +87 -40
  523. package/corpus/templates/clips/actions/create-recording.ts +6 -3
  524. package/corpus/templates/clips/actions/delete-meeting.ts +25 -0
  525. package/corpus/templates/clips/actions/delete-recording-permanent.ts +3 -0
  526. package/corpus/templates/clips/actions/disconnect-calendar.ts +10 -4
  527. package/corpus/templates/clips/actions/export-insights-csv.ts +28 -8
  528. package/corpus/templates/clips/actions/finalize-meeting.ts +106 -33
  529. package/corpus/templates/clips/actions/finalize-recording.ts +201 -3
  530. package/corpus/templates/clips/actions/get-organization-insights.ts +51 -7
  531. package/corpus/templates/clips/actions/import-loom-recording.ts +17 -0
  532. package/corpus/templates/clips/actions/lib/audio-only-transcription.ts +18 -1
  533. package/corpus/templates/clips/actions/lib/create-recording-schema.ts +7 -1
  534. package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +16 -0
  535. package/corpus/templates/clips/actions/list-clip-views.ts +60 -0
  536. package/corpus/templates/clips/actions/regenerate-summary.ts +10 -0
  537. package/corpus/templates/clips/actions/remove-vocabulary-term.ts +59 -0
  538. package/corpus/templates/clips/actions/request-transcript.ts +170 -25
  539. package/corpus/templates/clips/actions/restore-recording.ts +5 -12
  540. package/corpus/templates/clips/actions/save-browser-transcript.ts +13 -2
  541. package/corpus/templates/clips/actions/set-chapters.ts +6 -15
  542. package/corpus/templates/clips/actions/set-thumbnail.ts +77 -36
  543. package/corpus/templates/clips/actions/split-recording.ts +49 -35
  544. package/corpus/templates/clips/actions/stitch-recordings.ts +7 -4
  545. package/corpus/templates/clips/actions/stop-meeting-recording.ts +15 -1
  546. package/corpus/templates/clips/actions/sync-calendars.ts +10 -108
  547. package/corpus/templates/clips/actions/trash-recording.ts +43 -14
  548. package/corpus/templates/clips/actions/trim-recording.ts +48 -27
  549. package/corpus/templates/clips/actions/undo-edit.ts +49 -37
  550. package/corpus/templates/clips/app/components/capture-install-options.tsx +6 -6
  551. package/corpus/templates/clips/app/components/dictate/vocabulary-section.tsx +208 -0
  552. package/corpus/templates/clips/app/components/editable-recording-title.tsx +2 -2
  553. package/corpus/templates/clips/app/components/editor/chapters-editor.tsx +7 -7
  554. package/corpus/templates/clips/app/components/editor/editor-toolbar.tsx +26 -26
  555. package/corpus/templates/clips/app/components/editor/split-button.tsx +5 -4
  556. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +9 -9
  557. package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +11 -16
  558. package/corpus/templates/clips/app/components/editor/timeline.tsx +3 -3
  559. package/corpus/templates/clips/app/components/editor/transcript-editor.tsx +5 -5
  560. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +4 -4
  561. package/corpus/templates/clips/app/components/library/create-space-dialog.tsx +8 -8
  562. package/corpus/templates/clips/app/components/library/empty-state.tsx +2 -1
  563. package/corpus/templates/clips/app/components/library/folder-tree.tsx +14 -14
  564. package/corpus/templates/clips/app/components/library/library-grid.tsx +24 -98
  565. package/corpus/templates/clips/app/components/library/library-layout.tsx +18 -19
  566. package/corpus/templates/clips/app/components/library/organization-switcher.tsx +11 -11
  567. package/corpus/templates/clips/app/components/library/recording-card.tsx +44 -50
  568. package/corpus/templates/clips/app/components/library/search-bar.tsx +5 -5
  569. package/corpus/templates/clips/app/components/library/sort-menu.tsx +4 -3
  570. package/corpus/templates/clips/app/components/library/tag-input.tsx +4 -4
  571. package/corpus/templates/clips/app/components/meetings/attendee-stack.tsx +2 -6
  572. package/corpus/templates/clips/app/components/meetings/auto-record-prompt.tsx +1 -1
  573. package/corpus/templates/clips/app/components/meetings/bullet-link.tsx +4 -4
  574. package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +5 -5
  575. package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +3 -3
  576. package/corpus/templates/clips/app/components/meetings/quick-ask-sidebar.tsx +17 -9
  577. package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +6 -11
  578. package/corpus/templates/clips/app/components/meetings/transcript-bubbles.tsx +215 -21
  579. package/corpus/templates/clips/app/components/player/access-password-prompt.tsx +3 -2
  580. package/corpus/templates/clips/app/components/player/comments-panel.tsx +14 -14
  581. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +7 -6
  582. package/corpus/templates/clips/app/components/player/insights-panel.tsx +18 -6
  583. package/corpus/templates/clips/app/components/player/player-controls.tsx +42 -36
  584. package/corpus/templates/clips/app/components/player/reactions-tray.tsx +4 -4
  585. package/corpus/templates/clips/app/components/player/settings-panel.tsx +13 -12
  586. package/corpus/templates/clips/app/components/player/share-dialog.tsx +80 -49
  587. package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +3 -2
  588. package/corpus/templates/clips/app/components/player/timestamped-comment-button.tsx +2 -2
  589. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +7 -7
  590. package/corpus/templates/clips/app/components/player/video-player.tsx +182 -15
  591. package/corpus/templates/clips/app/components/recorder/camera-visualizer.tsx +1 -1
  592. package/corpus/templates/clips/app/components/recorder/microphone-visualizer.tsx +1 -1
  593. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +49 -36
  594. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +285 -24
  595. package/corpus/templates/clips/app/components/recorder/recording-toolbar.tsx +6 -5
  596. package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +7 -6
  597. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +10 -10
  598. package/corpus/templates/clips/app/components/sharing/viewed-by-popover.tsx +132 -0
  599. package/corpus/templates/clips/app/components/ui/alert-dialog.tsx +1 -0
  600. package/corpus/templates/clips/app/components/ui/avatar.tsx +1 -0
  601. package/corpus/templates/clips/app/components/ui/badge.tsx +1 -0
  602. package/corpus/templates/clips/app/components/ui/button.tsx +1 -0
  603. package/corpus/templates/clips/app/components/ui/card.tsx +1 -0
  604. package/corpus/templates/clips/app/components/ui/checkbox.tsx +1 -0
  605. package/corpus/templates/clips/app/components/ui/collapsible.tsx +1 -0
  606. package/corpus/templates/clips/app/components/ui/context-menu.tsx +1 -0
  607. package/corpus/templates/clips/app/components/ui/dialog.tsx +1 -0
  608. package/corpus/templates/clips/app/components/ui/dropdown-menu.tsx +1 -0
  609. package/corpus/templates/clips/app/components/ui/input.tsx +1 -0
  610. package/corpus/templates/clips/app/components/ui/label.tsx +1 -0
  611. package/corpus/templates/clips/app/components/ui/popover.tsx +1 -0
  612. package/corpus/templates/clips/app/components/ui/scroll-area.tsx +1 -0
  613. package/corpus/templates/clips/app/components/ui/select.tsx +1 -0
  614. package/corpus/templates/clips/app/components/ui/separator.tsx +1 -0
  615. package/corpus/templates/clips/app/components/ui/sheet.tsx +1 -0
  616. package/corpus/templates/clips/app/components/ui/skeleton.tsx +1 -0
  617. package/corpus/templates/clips/app/components/ui/slider.tsx +1 -0
  618. package/corpus/templates/clips/app/components/ui/sonner.tsx +1 -0
  619. package/corpus/templates/clips/app/components/ui/spinner.tsx +1 -0
  620. package/corpus/templates/clips/app/components/ui/switch.tsx +1 -0
  621. package/corpus/templates/clips/app/components/ui/table.tsx +1 -0
  622. package/corpus/templates/clips/app/components/ui/tabs.tsx +1 -0
  623. package/corpus/templates/clips/app/components/ui/textarea.tsx +1 -0
  624. package/corpus/templates/clips/app/components/ui/toolkit-provider.tsx +12 -0
  625. package/corpus/templates/clips/app/components/ui/tooltip.tsx +1 -0
  626. package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +5 -9
  627. package/corpus/templates/clips/app/components/workspace/insights-hub.tsx +9 -19
  628. package/corpus/templates/clips/app/components/workspace/invite-dialog.tsx +10 -9
  629. package/corpus/templates/clips/app/components/workspace/members-list.tsx +11 -10
  630. package/corpus/templates/clips/app/components/workspace/notifications-list.tsx +2 -1
  631. package/corpus/templates/clips/app/components/workspace/top-creators-table.tsx +3 -2
  632. package/corpus/templates/clips/app/components/workspace/top-videos-table.tsx +3 -2
  633. package/corpus/templates/clips/app/global.css +1 -0
  634. package/corpus/templates/clips/app/hooks/use-desktop-promo.ts +2 -1
  635. package/corpus/templates/clips/app/hooks/use-mobile.ts +1 -0
  636. package/corpus/templates/clips/app/hooks/use-player-shortcuts.ts +14 -10
  637. package/corpus/templates/clips/app/hooks/use-view-tracking.ts +14 -0
  638. package/corpus/templates/clips/app/i18n/ar-SA.ts +56 -0
  639. package/corpus/templates/clips/app/i18n/de-DE.ts +53 -0
  640. package/corpus/templates/clips/app/i18n/en-US.ts +52 -0
  641. package/corpus/templates/clips/app/i18n/es-ES.ts +53 -0
  642. package/corpus/templates/clips/app/i18n/fr-FR.ts +53 -0
  643. package/corpus/templates/clips/app/i18n/hi-IN.ts +52 -0
  644. package/corpus/templates/clips/app/i18n/ja-JP.ts +53 -0
  645. package/corpus/templates/clips/app/i18n/ko-KR.ts +52 -0
  646. package/corpus/templates/clips/app/i18n/pt-BR.ts +53 -0
  647. package/corpus/templates/clips/app/i18n/zh-CN.ts +51 -0
  648. package/corpus/templates/clips/app/i18n/zh-TW.ts +51 -0
  649. package/corpus/templates/clips/app/lib/recorder-preferences.ts +4 -0
  650. package/corpus/templates/clips/app/lib/timestamp-mapping.ts +5 -0
  651. package/corpus/templates/clips/app/root.tsx +26 -23
  652. package/corpus/templates/clips/app/routes/_app.dictate.tsx +39 -23
  653. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +134 -39
  654. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +20 -20
  655. package/corpus/templates/clips/app/routes/_app.notifications.tsx +3 -3
  656. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +92 -60
  657. package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +8 -13
  658. package/corpus/templates/clips/app/routes/_app.spaces._index.tsx +1 -1
  659. package/corpus/templates/clips/app/routes/_app.trash.tsx +96 -31
  660. package/corpus/templates/clips/app/routes/bug-report.done.tsx +1 -1
  661. package/corpus/templates/clips/app/routes/bug-report.tsx +11 -11
  662. package/corpus/templates/clips/app/routes/download.tsx +2 -2
  663. package/corpus/templates/clips/app/routes/embed.$shareId.tsx +2 -1
  664. package/corpus/templates/clips/app/routes/invite.$token.tsx +8 -13
  665. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +263 -251
  666. package/corpus/templates/clips/app/routes/record.tsx +28 -10
  667. package/corpus/templates/clips/app/routes/share.$shareId.tsx +51 -29
  668. package/corpus/templates/clips/app/routes/share.meeting.$meetingId.tsx +71 -16
  669. package/corpus/templates/clips/changelog/2026-07-05-mobile-clip-pages-use-a-tighter-viewer-layout-with-inline-ac.md +6 -0
  670. package/corpus/templates/clips/changelog/2026-07-06-ai-setup-now-switches-to-your-saved-provider-key-and-uses-fa.md +6 -0
  671. 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
  672. package/corpus/templates/clips/changelog/2026-07-06-calendar-connections-no-longer-ask-you-to-reconnect-after-te.md +6 -0
  673. package/corpus/templates/clips/changelog/2026-07-06-chrome-extension-recordings-keep-your-selected-microphone.md +6 -0
  674. package/corpus/templates/clips/changelog/2026-07-06-clip-recordings-now-use-streaming-uploads-by-default.md +6 -0
  675. package/corpus/templates/clips/changelog/2026-07-06-clip-titles-in-the-library-grid-now-open-the-clip-instead-of.md +6 -0
  676. package/corpus/templates/clips/changelog/2026-07-06-desktop-countdown-now-dims-the-screen-before-recording.md +5 -0
  677. package/corpus/templates/clips/changelog/2026-07-06-desktop-popover-no-longer-drops-bluetooth-headphones-into-call-quality-mode.md +6 -0
  678. package/corpus/templates/clips/changelog/2026-07-06-desktop-recorder-now-refreshes-cameras-and-mics-when-the-pop.md +6 -0
  679. package/corpus/templates/clips/changelog/2026-07-06-desktop-recordings-keep-microphone-volume-clear-while-recor.md +5 -0
  680. package/corpus/templates/clips/changelog/2026-07-06-desktop-recordings-no-longer-get-stuck-optimizing-when-scree.md +6 -0
  681. package/corpus/templates/clips/changelog/2026-07-06-dictation-history-from-the-desktop-app-now-appears-in-the-di.md +6 -0
  682. package/corpus/templates/clips/changelog/2026-07-06-dictation-no-longer-overwrites-your-clipboard-and-messaging-.md +6 -0
  683. package/corpus/templates/clips/changelog/2026-07-06-double-tap-your-dictation-key-for-hands-free-dictation-tap-a.md +6 -0
  684. package/corpus/templates/clips/changelog/2026-07-06-fixed-desktop-recordings-sometimes-uploading-without-audio-a.md +6 -0
  685. package/corpus/templates/clips/changelog/2026-07-06-fixed-desktop-recordings-that-could-get-stuck-uploading-and-.md +6 -0
  686. package/corpus/templates/clips/changelog/2026-07-06-fixed-recordings-sometimes-capturing-from-the-wrong-micropho.md +6 -0
  687. package/corpus/templates/clips/changelog/2026-07-06-hands-free-dictation-and-meeting-cleanup-recover-more-reliab.md +6 -0
  688. package/corpus/templates/clips/changelog/2026-07-06-live-meetings-show-time-remaining-and-you-can-end-a-meeting-.md +6 -0
  689. package/corpus/templates/clips/changelog/2026-07-06-manage-your-personal-dictation-dictionary-from-the-dictate-t.md +6 -0
  690. package/corpus/templates/clips/changelog/2026-07-06-meetings-interrupted-by-quitting-or-crashing-now-close-out-c.md +6 -0
  691. package/corpus/templates/clips/changelog/2026-07-06-mic-only-desktop-recordings-now-use-the-selected-microphone-.md +6 -0
  692. package/corpus/templates/clips/changelog/2026-07-06-paste-your-last-dictation-anytime-with-cmd-ctrl-v-or-from-th.md +6 -0
  693. package/corpus/templates/clips/changelog/2026-07-06-press-esc-to-cancel-a-dictation-in-progress.md +6 -0
  694. package/corpus/templates/clips/changelog/2026-07-06-recordings-whose-video-file-contains-no-audio-track-no-longe.md +6 -0
  695. package/corpus/templates/clips/changelog/2026-07-06-search-inside-meeting-transcripts.md +6 -0
  696. package/corpus/templates/clips/changelog/2026-07-06-see-who-viewed-your-shared-clips-and-when-click-the-view-cou.md +6 -0
  697. package/corpus/templates/clips/changelog/2026-07-06-share-links-for-agents-now-appear-as-soon-as-the-share-menu-.md +6 -0
  698. package/corpus/templates/clips/changelog/2026-07-06-share-popovers-now-stay-above-video-playback-controls.md +6 -0
  699. package/corpus/templates/clips/changelog/2026-07-06-shared-clip-pages-now-recover-automatically-from-transient-v.md +6 -0
  700. package/corpus/templates/clips/changelog/2026-07-06-the-desktop-app-now-walks-you-through-permissions-on-first-l.md +6 -0
  701. package/corpus/templates/clips/changelog/2026-07-06-transcript-cleanup-preferences-now-save-per-user.md +6 -0
  702. package/corpus/templates/clips/changelog/2026-07-06-transcripts-now-retry-automatically-after-transient-failures.md +6 -0
  703. package/corpus/templates/clips/changelog/2026-07-06-video-compression-now-runs-in-the-background-without-blocking.md +6 -0
  704. package/corpus/templates/clips/changelog/2026-07-07-native-microphone-recordings-now-reduce-steady-background-noise.md +6 -0
  705. package/corpus/templates/clips/changelog/2026-07-07-recording-transcripts-now-line-up-with-the-video-start-afte.md +6 -0
  706. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  707. package/corpus/templates/clips/chrome-extension/src/background.ts +141 -48
  708. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +383 -59
  709. package/corpus/templates/clips/chrome-extension/src/overlay.ts +51 -10
  710. package/corpus/templates/clips/chrome-extension/src/popup.ts +57 -6
  711. package/corpus/templates/clips/desktop/package.json +1 -1
  712. package/corpus/templates/clips/desktop/scripts/sign-macos-local.ts +67 -0
  713. package/corpus/templates/clips/desktop/src/app.tsx +38 -13
  714. package/corpus/templates/clips/desktop/src/components/SourceRow.tsx +1 -0
  715. package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +88 -28
  716. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +165 -55
  717. package/corpus/templates/clips/desktop/src/hooks/useMicMeter.ts +35 -10
  718. package/corpus/templates/clips/desktop/src/lib/backtrack.ts +12 -0
  719. package/corpus/templates/clips/desktop/src/lib/media-capture-constraints.ts +129 -34
  720. package/corpus/templates/clips/desktop/src/lib/media-device-selection.ts +157 -0
  721. package/corpus/templates/clips/desktop/src/lib/permissions.ts +2 -0
  722. package/corpus/templates/clips/desktop/src/lib/recorder.ts +109 -47
  723. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +22 -2
  724. package/corpus/templates/clips/desktop/src/lib/transcription-engine.ts +29 -1
  725. package/corpus/templates/clips/desktop/src/lib/updater.ts +6 -0
  726. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +372 -31
  727. package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +90 -0
  728. package/corpus/templates/clips/desktop/src/overlays/flow-bar.tsx +4 -6
  729. package/corpus/templates/clips/desktop/src/overlays/onboarding.tsx +214 -9
  730. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +37 -52
  731. package/corpus/templates/clips/desktop/src/styles.css +1 -1
  732. package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +7 -0
  733. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +371 -43
  734. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +79 -0
  735. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +1418 -260
  736. package/corpus/templates/clips/desktop/src-tauri/src/native_speech.rs +188 -44
  737. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +197 -8
  738. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +64 -8
  739. package/corpus/templates/clips/desktop/src-tauri/src/state.rs +3 -2
  740. package/corpus/templates/clips/desktop/src-tauri/src/system_audio.rs +10 -0
  741. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +29 -8
  742. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +136 -13
  743. package/corpus/templates/clips/desktop/vite.config.ts +3 -0
  744. package/corpus/templates/clips/package.json +1 -1
  745. package/corpus/templates/clips/server/db/schema.ts +26 -0
  746. package/corpus/templates/clips/server/jobs/builder-media-compression.ts +41 -0
  747. package/corpus/templates/clips/server/jobs/stale-meeting-sweeper.ts +294 -0
  748. package/corpus/templates/clips/server/lib/builder-media-compression.ts +976 -0
  749. package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +107 -56
  750. package/corpus/templates/clips/server/lib/env-flags.ts +4 -0
  751. package/corpus/templates/clips/server/lib/google-calendar-client.ts +8 -1
  752. package/corpus/templates/clips/server/lib/media-worker.ts +153 -0
  753. package/corpus/templates/clips/server/lib/s3-upload-provider.ts +58 -17
  754. package/corpus/templates/clips/server/lib/streaming-upload-mode.ts +17 -5
  755. package/corpus/templates/clips/server/lib/video-remux.ts +90 -0
  756. package/corpus/templates/clips/server/plugins/calendar-jobs.ts +4 -0
  757. package/corpus/templates/clips/server/plugins/db.ts +196 -0
  758. package/corpus/templates/clips/server/register-secrets.ts +78 -0
  759. package/corpus/templates/clips/server/routes/_agent-native/clips/user-prefs.get.ts +15 -0
  760. package/corpus/templates/clips/server/routes/_agent-native/clips/user-prefs.put.ts +27 -0
  761. package/corpus/templates/clips/server/routes/api/media-worker/callback.post.ts +88 -0
  762. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +87 -7
  763. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +7 -0
  764. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +35 -10
  765. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +24 -42
  766. package/corpus/templates/clips/server/routes/api/view-event.post.ts +29 -1
  767. package/corpus/templates/clips/shared/media-device-selection.ts +157 -0
  768. package/corpus/templates/clips/shared/media-worker-contract.ts +146 -0
  769. package/corpus/templates/content/.agents/skills/actions/SKILL.md +55 -0
  770. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +67 -2
  771. package/corpus/templates/content/AGENTS.md +22 -14
  772. package/corpus/templates/content/actions/_local-file-documents.ts +90 -1
  773. package/corpus/templates/content/actions/_notion-action-utils.ts +6 -2
  774. package/corpus/templates/content/actions/delete-document.ts +8 -0
  775. package/corpus/templates/content/actions/remove-local-file-source.ts +100 -0
  776. package/corpus/templates/content/actions/sync-notion-comments.ts +174 -20
  777. package/corpus/templates/content/actions/update-document.ts +91 -5
  778. package/corpus/templates/content/app/blocks/SourceComponentBlock.tsx +31 -3
  779. package/corpus/templates/content/app/blocks/contentBlockRegistry.tsx +4 -4
  780. package/corpus/templates/content/app/components/EmptyState.tsx +1 -1
  781. package/corpus/templates/content/app/components/ThemeToggle.tsx +6 -6
  782. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
  783. package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +5 -5
  784. package/corpus/templates/content/app/components/editor/ContentReferencePreview.tsx +1 -1
  785. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +10 -14630
  786. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +72 -51
  787. package/corpus/templates/content/app/components/editor/DocumentEditorSkeleton.tsx +36 -0
  788. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +29 -29
  789. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +29 -44
  790. package/corpus/templates/content/app/components/editor/EmojiPicker.tsx +5 -4
  791. package/corpus/templates/content/app/components/editor/LinkHoverPreview.tsx +5 -4
  792. package/corpus/templates/content/app/components/editor/NotionConflictBanner.tsx +1 -1
  793. package/corpus/templates/content/app/components/editor/NotionSyncBar.tsx +2 -2
  794. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +5 -5
  795. package/corpus/templates/content/app/components/editor/TableHoverControls.tsx +13 -13
  796. package/corpus/templates/content/app/components/editor/VersionHistoryPanel.tsx +10 -10
  797. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +24 -7
  798. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +2856 -8389
  799. package/corpus/templates/content/app/components/editor/database/navigation-state.ts +36 -1
  800. package/corpus/templates/content/app/components/editor/database/settings.tsx +3224 -0
  801. package/corpus/templates/content/app/components/editor/database/shared.tsx +19 -19
  802. package/corpus/templates/content/app/components/editor/database/text.ts +23 -0
  803. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +9 -8
  804. package/corpus/templates/content/app/components/editor/extensions/AudioBlock.tsx +19 -18
  805. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +21 -20
  806. package/corpus/templates/content/app/components/editor/extensions/LocalMdxComponentNode.tsx +8 -8
  807. package/corpus/templates/content/app/components/editor/extensions/NotionExtensions.tsx +9 -0
  808. package/corpus/templates/content/app/components/editor/extensions/VideoBlock.tsx +19 -18
  809. package/corpus/templates/content/app/components/layout/Header.tsx +1 -5
  810. package/corpus/templates/content/app/components/layout/Layout.tsx +25 -8
  811. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +203 -55
  812. package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +22 -22
  813. package/corpus/templates/content/app/components/sidebar/NotionButton.tsx +11 -11
  814. package/corpus/templates/content/app/components/sidebar/document-sidebar-sections.ts +109 -1
  815. package/corpus/templates/content/app/components/ui/alert-dialog.tsx +1 -0
  816. package/corpus/templates/content/app/components/ui/button.tsx +1 -0
  817. package/corpus/templates/content/app/components/ui/dialog.tsx +1 -0
  818. package/corpus/templates/content/app/components/ui/dropdown-menu.tsx +1 -0
  819. package/corpus/templates/content/app/components/ui/input.tsx +1 -0
  820. package/corpus/templates/content/app/components/ui/label.tsx +1 -0
  821. package/corpus/templates/content/app/components/ui/popover.tsx +1 -0
  822. package/corpus/templates/content/app/components/ui/separator.tsx +1 -0
  823. package/corpus/templates/content/app/components/ui/sheet.tsx +1 -0
  824. package/corpus/templates/content/app/components/ui/skeleton.tsx +1 -0
  825. package/corpus/templates/content/app/components/ui/sonner.tsx +1 -0
  826. package/corpus/templates/content/app/components/ui/spinner.tsx +1 -0
  827. package/corpus/templates/content/app/components/ui/table.tsx +1 -0
  828. package/corpus/templates/content/app/components/ui/toaster.tsx +1 -0
  829. package/corpus/templates/content/app/components/ui/toolkit-provider.tsx +12 -0
  830. package/corpus/templates/content/app/components/ui/tooltip.tsx +1 -0
  831. package/corpus/templates/content/app/global.css +1 -0
  832. package/corpus/templates/content/app/hooks/use-documents.ts +89 -37
  833. package/corpus/templates/content/app/hooks/use-mobile.ts +1 -0
  834. package/corpus/templates/content/app/hooks/use-notion.ts +73 -5
  835. package/corpus/templates/content/app/i18n/zh-TW.ts +14 -0
  836. package/corpus/templates/content/app/i18n-data.ts +153 -0
  837. package/corpus/templates/content/app/root.tsx +35 -29
  838. package/corpus/templates/content/app/routes/_app._index.tsx +1 -1
  839. package/corpus/templates/content/app/routes/_app.local-files.tsx +268 -81
  840. package/corpus/templates/content/app/routes/_app.settings.tsx +4 -21
  841. package/corpus/templates/content/app/routes/p.$id.tsx +114 -9
  842. package/corpus/templates/content/changelog/2026-07-01-builder-source-components-show-preservation-and-review-states.md +6 -0
  843. package/corpus/templates/content/changelog/2026-07-06-document-headers-and-page-bodies-now-share-one-background-shade.md +6 -0
  844. package/corpus/templates/content/changelog/2026-07-06-export-submenus-stay-visible-outside-the-page-actions-menu.md +6 -0
  845. package/corpus/templates/content/changelog/2026-07-06-fixed-collaborative-documents-reapplying-content-before-save.md +6 -0
  846. package/corpus/templates/content/changelog/2026-07-06-local-files-now-remember-sidebar-collapse-state-and-include-.md +6 -0
  847. package/corpus/templates/content/changelog/2026-07-06-notion-comment-sync-now-preserves-threads-replies-stay-attac.md +6 -0
  848. package/corpus/templates/content/changelog/2026-07-06-notion-sync-is-far-more-reliable-auto-sync-no-longer-overwri.md +6 -0
  849. package/corpus/templates/content/changelog/2026-07-06-opening-pages-now-highlights-the-sidebar-item-and-shows-the-.md +6 -0
  850. package/corpus/templates/content/changelog/2026-07-06-presence-markers-in-the-editor-are-now-compact-instead-of-co.md +6 -0
  851. package/corpus/templates/content/changelog/2026-07-06-sidebar-collapse-now-keeps-the-same-background-shade-as-the-.md +6 -0
  852. package/corpus/templates/content/changelog/2026-07-06-the-content-header-no-longer-shows-the-global-notifications-.md +6 -0
  853. package/corpus/templates/content/parity/matrix.md +24 -24
  854. package/corpus/templates/content/parity/matrix.ts +7 -3
  855. package/corpus/templates/content/server/db/index.ts +9 -0
  856. package/corpus/templates/content/server/db/schema.ts +15 -0
  857. package/corpus/templates/content/server/lib/notion-sync.ts +481 -39
  858. package/corpus/templates/content/server/lib/notion.ts +212 -48
  859. package/corpus/templates/content/server/plugins/db.ts +20 -0
  860. package/corpus/templates/content/server/routes/api/document-agent-context.json.get.ts +90 -0
  861. package/corpus/templates/content/server/routes/api/documents/[id]/notion/resolve.post.ts +14 -2
  862. package/corpus/templates/content/server/routes/api/notion/callback.get.ts +54 -6
  863. package/corpus/templates/content/shared/agent-readable.ts +56 -0
  864. package/corpus/templates/content/shared/builder-mdx.ts +68 -12
  865. package/corpus/templates/content/shared/builder-source-component-registry.ts +177 -0
  866. package/corpus/templates/content/shared/nfm.ts +459 -66
  867. package/corpus/templates/content/shared/source-component-block.ts +72 -6
  868. package/corpus/templates/content/vite.config.ts +17 -1
  869. package/corpus/templates/design/.agents/skills/actions/SKILL.md +55 -0
  870. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +21 -12
  871. package/corpus/templates/design/AGENTS.md +3 -2
  872. package/corpus/templates/design/actions/import-design-source.ts +8 -58
  873. package/corpus/templates/design/actions/run-design-audit.ts +127 -1
  874. package/corpus/templates/design/actions/take-design-screenshot.ts +673 -0
  875. package/corpus/templates/design/app/components/ThemeToggle.tsx +6 -6
  876. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +11 -11
  877. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +2 -2
  878. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +16 -21
  879. package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +6 -97
  880. package/corpus/templates/design/app/components/design/DrawOverlay.tsx +7 -7
  881. package/corpus/templates/design/app/components/design/EditPanel.tsx +30 -30
  882. package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +9 -8
  883. package/corpus/templates/design/app/components/design/LayersPanel.tsx +14 -14
  884. package/corpus/templates/design/app/components/design/LocalhostWriteConsentDialog.tsx +6 -5
  885. package/corpus/templates/design/app/components/design/MotionDock.tsx +15 -15
  886. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +3 -3
  887. package/corpus/templates/design/app/components/design/ReviewPanel.tsx +3 -3
  888. package/corpus/templates/design/app/components/design/StatesPanel.tsx +13 -13
  889. package/corpus/templates/design/app/components/design/TokensPanel.tsx +14 -14
  890. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +6 -6
  891. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +39 -9
  892. package/corpus/templates/design/app/components/design/code-workbench/ActivityBar.tsx +3 -3
  893. package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +4 -7
  894. package/corpus/templates/design/app/components/design/code-workbench/editor/EditorTabs.tsx +6 -6
  895. package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +2 -1
  896. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +17 -17
  897. package/corpus/templates/design/app/components/design/code-workbench/search/SearchView.tsx +6 -6
  898. package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +3 -3
  899. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +7 -7
  900. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +3 -3
  901. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +18 -18
  902. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +6 -6
  903. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +6 -6
  904. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +7 -7
  905. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +7 -7
  906. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -14
  907. package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +9 -9
  908. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +6 -6
  909. package/corpus/templates/design/app/components/design-system/DesignSystemCard.tsx +3 -2
  910. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +15 -18
  911. package/corpus/templates/design/app/components/layout/Header.tsx +2 -2
  912. package/corpus/templates/design/app/components/layout/Sidebar.tsx +5 -5
  913. package/corpus/templates/design/app/components/ui/alert-dialog.tsx +1 -0
  914. package/corpus/templates/design/app/components/ui/avatar.tsx +1 -0
  915. package/corpus/templates/design/app/components/ui/badge.tsx +1 -0
  916. package/corpus/templates/design/app/components/ui/button.tsx +1 -0
  917. package/corpus/templates/design/app/components/ui/card.tsx +1 -0
  918. package/corpus/templates/design/app/components/ui/checkbox.tsx +1 -0
  919. package/corpus/templates/design/app/components/ui/collapsible.tsx +1 -0
  920. package/corpus/templates/design/app/components/ui/context-menu.tsx +1 -0
  921. package/corpus/templates/design/app/components/ui/dialog.tsx +1 -0
  922. package/corpus/templates/design/app/components/ui/dropdown-menu.tsx +1 -0
  923. package/corpus/templates/design/app/components/ui/input.tsx +1 -0
  924. package/corpus/templates/design/app/components/ui/label.tsx +1 -0
  925. package/corpus/templates/design/app/components/ui/popover.tsx +1 -0
  926. package/corpus/templates/design/app/components/ui/select.tsx +1 -0
  927. package/corpus/templates/design/app/components/ui/separator.tsx +1 -0
  928. package/corpus/templates/design/app/components/ui/sheet.tsx +1 -0
  929. package/corpus/templates/design/app/components/ui/skeleton.tsx +1 -0
  930. package/corpus/templates/design/app/components/ui/slider.tsx +1 -0
  931. package/corpus/templates/design/app/components/ui/sonner.tsx +1 -0
  932. package/corpus/templates/design/app/components/ui/spinner.tsx +1 -0
  933. package/corpus/templates/design/app/components/ui/switch.tsx +1 -0
  934. package/corpus/templates/design/app/components/ui/tabs.tsx +1 -0
  935. package/corpus/templates/design/app/components/ui/textarea.tsx +1 -0
  936. package/corpus/templates/design/app/components/ui/toolkit-provider.tsx +12 -0
  937. package/corpus/templates/design/app/components/ui/tooltip.tsx +1 -0
  938. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +7 -7
  939. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +7 -7
  940. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +3 -3
  941. package/corpus/templates/design/app/global.css +1 -0
  942. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -4
  943. package/corpus/templates/design/app/i18n-data.ts +38 -35
  944. package/corpus/templates/design/app/pages/DesignEditor.tsx +47 -51
  945. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +6 -6
  946. package/corpus/templates/design/app/pages/DesignSystems.tsx +31 -31
  947. package/corpus/templates/design/app/pages/Index.tsx +25 -29
  948. package/corpus/templates/design/app/pages/NotFound.tsx +2 -1
  949. package/corpus/templates/design/app/pages/Present.tsx +2 -1
  950. package/corpus/templates/design/app/pages/VisualEdit.tsx +2 -1
  951. package/corpus/templates/design/app/root.tsx +7 -4
  952. package/corpus/templates/design/app/routes/settings.tsx +22 -49
  953. package/corpus/templates/design/changelog/2026-07-05-code-sidebar-tabs-now-use-a-quieter-active-highlight-that-ma.md +6 -0
  954. package/corpus/templates/design/changelog/2026-07-06-fig-files-now-stay-on-the-builder-indexing-path-through-desi.md +6 -0
  955. package/corpus/templates/design/changelog/2026-07-06-mobile-layouts-no-longer-stack-two-top-headers.md +5 -0
  956. package/corpus/templates/design/changelog/2026-07-06-the-design-agent-now-visually-reviews-rendered-screenshots-o.md +6 -0
  957. package/corpus/templates/design/server/db/index.ts +8 -0
  958. package/corpus/templates/design/server/handlers/import-design-file.ts +4 -43
  959. package/corpus/templates/design/server/handlers/index-design-system-with-builder.ts +2 -2
  960. package/corpus/templates/design/server/lib/visible-clipboard-html.ts +32 -0
  961. package/corpus/templates/design/server/routes/[...page].get.ts +94 -1
  962. package/corpus/templates/design/server/routes/api/design-agent-context.json.get.ts +84 -0
  963. package/corpus/templates/design/shared/agent-readable.ts +2 -0
  964. package/corpus/templates/design/shared/design-review.ts +1 -0
  965. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +55 -0
  966. package/corpus/templates/dispatch/actions/list-staged-datasets.ts +3 -0
  967. package/corpus/templates/dispatch/app/routes/settings.tsx +3 -17
  968. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +55 -0
  969. package/corpus/templates/forms/app/components/CloudUpgrade.tsx +10 -10
  970. package/corpus/templates/forms/app/components/ThemeToggle.tsx +5 -5
  971. package/corpus/templates/forms/app/components/builder/FieldPropertiesPanel.tsx +11 -10
  972. package/corpus/templates/forms/app/components/builder/FieldRenderer.tsx +10 -13
  973. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +17 -17
  974. package/corpus/templates/forms/app/components/ui/alert-dialog.tsx +1 -0
  975. package/corpus/templates/forms/app/components/ui/badge.tsx +1 -0
  976. package/corpus/templates/forms/app/components/ui/button.tsx +1 -0
  977. package/corpus/templates/forms/app/components/ui/calendar.tsx +1 -1
  978. package/corpus/templates/forms/app/components/ui/card.tsx +1 -0
  979. package/corpus/templates/forms/app/components/ui/checkbox.tsx +1 -0
  980. package/corpus/templates/forms/app/components/ui/command.tsx +1 -1
  981. package/corpus/templates/forms/app/components/ui/dialog.tsx +1 -0
  982. package/corpus/templates/forms/app/components/ui/dropdown-menu.tsx +1 -0
  983. package/corpus/templates/forms/app/components/ui/input.tsx +1 -0
  984. package/corpus/templates/forms/app/components/ui/label.tsx +1 -0
  985. package/corpus/templates/forms/app/components/ui/popover.tsx +1 -0
  986. package/corpus/templates/forms/app/components/ui/radio-group.tsx +1 -0
  987. package/corpus/templates/forms/app/components/ui/scroll-area.tsx +1 -0
  988. package/corpus/templates/forms/app/components/ui/select.tsx +1 -0
  989. package/corpus/templates/forms/app/components/ui/separator.tsx +1 -0
  990. package/corpus/templates/forms/app/components/ui/skeleton.tsx +1 -0
  991. package/corpus/templates/forms/app/components/ui/slider.tsx +1 -0
  992. package/corpus/templates/forms/app/components/ui/switch.tsx +1 -0
  993. package/corpus/templates/forms/app/components/ui/table.tsx +1 -0
  994. package/corpus/templates/forms/app/components/ui/tabs.tsx +1 -0
  995. package/corpus/templates/forms/app/components/ui/textarea.tsx +1 -0
  996. package/corpus/templates/forms/app/components/ui/toolkit-provider.tsx +12 -0
  997. package/corpus/templates/forms/app/components/ui/tooltip.tsx +1 -0
  998. package/corpus/templates/forms/app/global.css +1 -0
  999. package/corpus/templates/forms/app/hooks/use-mobile.ts +1 -0
  1000. package/corpus/templates/forms/app/hooks/use-navigation-state.ts +0 -1
  1001. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +24 -26
  1002. package/corpus/templates/forms/app/pages/FormFillPage.tsx +2 -2
  1003. package/corpus/templates/forms/app/pages/FormsListPage.tsx +21 -21
  1004. package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +11 -11
  1005. package/corpus/templates/forms/app/pages/ResponsesPage.tsx +4 -4
  1006. package/corpus/templates/forms/app/root.tsx +11 -8
  1007. package/corpus/templates/forms/app/routes/_app.settings.tsx +6 -21
  1008. package/corpus/templates/forms/app/routes/form-preview.tsx +3 -3
  1009. package/corpus/templates/forms/changelog/2026-07-06-the-form-builder-header-no-longer-shows-the-global-notificat.md +6 -0
  1010. package/corpus/templates/macros/app/components/AddExerciseDialog.tsx +1 -1
  1011. package/corpus/templates/macros/app/components/AddMealDialog.tsx +1 -1
  1012. package/corpus/templates/macros/app/components/AddWeightDialog.tsx +1 -1
  1013. package/corpus/templates/macros/app/components/DailyProgress.tsx +7 -7
  1014. package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +2 -1
  1015. package/corpus/templates/macros/app/components/WeightCard.tsx +10 -10
  1016. package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
  1017. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +6 -10
  1018. package/corpus/templates/macros/app/components/ui/alert-dialog.tsx +1 -0
  1019. package/corpus/templates/macros/app/components/ui/label.tsx +1 -0
  1020. package/corpus/templates/macros/app/components/ui/select.tsx +1 -0
  1021. package/corpus/templates/macros/app/components/ui/sheet.tsx +1 -0
  1022. package/corpus/templates/macros/app/components/ui/skeleton.tsx +1 -0
  1023. package/corpus/templates/macros/app/components/ui/sonner.tsx +1 -0
  1024. package/corpus/templates/macros/app/components/ui/toolkit-provider.tsx +12 -0
  1025. package/corpus/templates/macros/app/components/ui/tooltip.tsx +1 -0
  1026. package/corpus/templates/macros/app/global.css +1 -0
  1027. package/corpus/templates/macros/app/root.tsx +17 -14
  1028. package/corpus/templates/macros/app/routes/_index.tsx +1 -1
  1029. package/corpus/templates/macros/app/routes/analytics.tsx +8 -8
  1030. package/corpus/templates/macros/app/routes/settings.tsx +4 -19
  1031. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +55 -0
  1032. package/corpus/templates/mail/.agents/skills/contacts-and-crm/SKILL.md +67 -0
  1033. package/corpus/templates/mail/.agents/skills/draft-queue/SKILL.md +35 -1
  1034. package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +74 -33
  1035. package/corpus/templates/mail/AGENTS.md +102 -16
  1036. package/corpus/templates/mail/actions/archive-email.ts +67 -11
  1037. package/corpus/templates/mail/actions/manage-snippets.ts +106 -0
  1038. package/corpus/templates/mail/actions/mark-read.ts +45 -11
  1039. package/corpus/templates/mail/actions/send-queued-drafts.ts +77 -42
  1040. package/corpus/templates/mail/actions/star-email.ts +55 -10
  1041. package/corpus/templates/mail/actions/trash-email.ts +48 -9
  1042. package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +1 -1
  1043. package/corpus/templates/mail/app/components/ThemeToggle.tsx +6 -6
  1044. package/corpus/templates/mail/app/components/agent-engine-picker.tsx +10 -10
  1045. package/corpus/templates/mail/app/components/email/CodeBlockLangPicker.tsx +4 -3
  1046. package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +5 -5
  1047. package/corpus/templates/mail/app/components/email/ComposeEditor.tsx +109 -10
  1048. package/corpus/templates/mail/app/components/email/ComposeModal.tsx +44 -19
  1049. package/corpus/templates/mail/app/components/email/ComposeSlashMenu.tsx +139 -17
  1050. package/corpus/templates/mail/app/components/email/EmailList.tsx +522 -314
  1051. package/corpus/templates/mail/app/components/email/EmailListItem.tsx +130 -45
  1052. package/corpus/templates/mail/app/components/email/EmailThread.tsx +9 -9
  1053. package/corpus/templates/mail/app/components/email/InlineReplyComposer.tsx +35 -13
  1054. package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +13 -13
  1055. package/corpus/templates/mail/app/components/email/MobileActionBar.tsx +13 -13
  1056. package/corpus/templates/mail/app/components/email/RecipientInput.tsx +53 -42
  1057. package/corpus/templates/mail/app/components/email/SendLaterButton.tsx +5 -4
  1058. package/corpus/templates/mail/app/components/email/SnoozeModal.tsx +1 -1
  1059. package/corpus/templates/mail/app/components/email/SnoozePopover.tsx +6 -6
  1060. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +19 -23
  1061. package/corpus/templates/mail/app/components/layout/HeaderActions.tsx +12 -4
  1062. package/corpus/templates/mail/app/components/layout/SearchBar.tsx +138 -18
  1063. package/corpus/templates/mail/app/components/settings/GmailFiltersSection.tsx +23 -23
  1064. package/corpus/templates/mail/app/components/settings/SnippetsSection.tsx +303 -0
  1065. package/corpus/templates/mail/app/components/ui/alert-dialog.tsx +1 -0
  1066. package/corpus/templates/mail/app/components/ui/badge.tsx +1 -0
  1067. package/corpus/templates/mail/app/components/ui/button.tsx +1 -0
  1068. package/corpus/templates/mail/app/components/ui/calendar.tsx +1 -1
  1069. package/corpus/templates/mail/app/components/ui/command.tsx +1 -1
  1070. package/corpus/templates/mail/app/components/ui/dialog.tsx +1 -0
  1071. package/corpus/templates/mail/app/components/ui/drawer.tsx +1 -0
  1072. package/corpus/templates/mail/app/components/ui/dropdown-menu.tsx +1 -0
  1073. package/corpus/templates/mail/app/components/ui/popover.tsx +1 -0
  1074. package/corpus/templates/mail/app/components/ui/select.tsx +1 -0
  1075. package/corpus/templates/mail/app/components/ui/skeleton.tsx +1 -0
  1076. package/corpus/templates/mail/app/components/ui/spinner.tsx +1 -0
  1077. package/corpus/templates/mail/app/components/ui/switch.tsx +1 -0
  1078. package/corpus/templates/mail/app/components/ui/toolkit-provider.tsx +12 -0
  1079. package/corpus/templates/mail/app/components/ui/tooltip.tsx +1 -0
  1080. package/corpus/templates/mail/app/global.css +20 -3
  1081. package/corpus/templates/mail/app/hooks/use-emails.ts +187 -0
  1082. package/corpus/templates/mail/app/hooks/use-snippets.ts +103 -0
  1083. package/corpus/templates/mail/app/i18n/ar-SA.ts +17 -0
  1084. package/corpus/templates/mail/app/i18n/de-DE.ts +18 -0
  1085. package/corpus/templates/mail/app/i18n/en-US.ts +17 -0
  1086. package/corpus/templates/mail/app/i18n/es-ES.ts +17 -0
  1087. package/corpus/templates/mail/app/i18n/fr-FR.ts +18 -0
  1088. package/corpus/templates/mail/app/i18n/hi-IN.ts +17 -0
  1089. package/corpus/templates/mail/app/i18n/ja-JP.ts +18 -0
  1090. package/corpus/templates/mail/app/i18n/ko-KR.ts +17 -0
  1091. package/corpus/templates/mail/app/i18n/pt-BR.ts +17 -0
  1092. package/corpus/templates/mail/app/i18n/zh-CN.ts +16 -0
  1093. package/corpus/templates/mail/app/i18n/zh-TW.ts +16 -0
  1094. package/corpus/templates/mail/app/pages/DraftQueuePage.tsx +14 -14
  1095. package/corpus/templates/mail/app/pages/InboxPage.tsx +3 -3
  1096. package/corpus/templates/mail/app/pages/NotFound.tsx +2 -1
  1097. package/corpus/templates/mail/app/pages/SettingsPage.tsx +64 -66
  1098. package/corpus/templates/mail/app/root.tsx +21 -18
  1099. package/corpus/templates/mail/app/routes/_index.tsx +2 -1
  1100. package/corpus/templates/mail/app/routes/email.tsx +2 -2
  1101. package/corpus/templates/mail/changelog/2026-07-06-a-queued-draft-can-no-longer-be-sent-twice-by-simultaneous-s.md +6 -0
  1102. package/corpus/templates/mail/changelog/2026-07-06-bulk-archive-trash-star-and-mark-read-now-complete-in-one-fa.md +6 -0
  1103. package/corpus/templates/mail/changelog/2026-07-06-dark-mode-sidebars-and-notifications-now-use-the-softer-gray.md +6 -0
  1104. package/corpus/templates/mail/changelog/2026-07-06-inbox-automations-pick-up-new-mail-faster.md +6 -0
  1105. package/corpus/templates/mail/changelog/2026-07-06-inbox-lists-stay-fast-as-scheduled-and-snoozed-mail-accumula.md +6 -0
  1106. package/corpus/templates/mail/changelog/2026-07-06-long-inboxes-scroll-smoothly-and-stay-fast-as-more-mail-load.md +6 -0
  1107. package/corpus/templates/mail/changelog/2026-07-06-paste-or-drop-images-straight-into-the-composer-to-send-them.md +6 -0
  1108. package/corpus/templates/mail/changelog/2026-07-06-save-reusable-snippets-and-insert-them-from-the-compose-slas.md +6 -0
  1109. package/corpus/templates/mail/changelog/2026-07-06-scrolling-older-mail-keeps-loading-correctly-when-no-gmail-a.md +6 -0
  1110. package/corpus/templates/mail/changelog/2026-07-06-search-shows-instant-matches-from-already-loaded-mail-while-.md +6 -0
  1111. package/corpus/templates/mail/changelog/2026-07-06-sends-now-fail-with-a-clear-error-instead-of-quietly-missing.md +6 -0
  1112. package/corpus/templates/mail/changelog/2026-07-06-the-mail-header-no-longer-shows-the-global-notifications-bel.md +6 -0
  1113. package/corpus/templates/mail/package.json +1 -0
  1114. package/corpus/templates/mail/server/db/schema.ts +11 -0
  1115. package/corpus/templates/mail/server/handlers/emails.ts +20 -1
  1116. package/corpus/templates/mail/server/lib/automation-engine.ts +53 -25
  1117. package/corpus/templates/mail/server/lib/google-auth.ts +140 -9
  1118. package/corpus/templates/mail/server/lib/jobs.ts +22 -6
  1119. package/corpus/templates/mail/server/lib/outgoing-email.ts +11 -2
  1120. package/corpus/templates/mail/server/lib/queued-drafts.ts +145 -4
  1121. package/corpus/templates/mail/server/plugins/db.ts +29 -0
  1122. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +55 -0
  1123. package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +42 -3
  1124. package/corpus/templates/plan/app/components/layout/Layout.tsx +5 -4
  1125. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +20 -20
  1126. package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +3 -2
  1127. package/corpus/templates/plan/app/components/plan/DocumentArea.tsx +2 -2
  1128. package/corpus/templates/plan/app/components/plan/GuestModeBanner.tsx +2 -1
  1129. package/corpus/templates/plan/app/components/plan/LocalCodebasePicker.tsx +8 -8
  1130. package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +6 -1
  1131. package/corpus/templates/plan/app/components/plan/PlanImageViewer.tsx +8 -12
  1132. package/corpus/templates/plan/app/components/plan/PlanMarkdownEditor.tsx +6 -1
  1133. package/corpus/templates/plan/app/components/plan/PlanVisualSurface.tsx +3 -3
  1134. package/corpus/templates/plan/app/components/plan/planBlocks.tsx +4 -4
  1135. package/corpus/templates/plan/app/components/plan/wireframe/kit/rough.tsx +61 -27
  1136. package/corpus/templates/plan/app/components/ui/alert-dialog.tsx +1 -0
  1137. package/corpus/templates/plan/app/components/ui/avatar.tsx +1 -0
  1138. package/corpus/templates/plan/app/components/ui/badge.tsx +1 -0
  1139. package/corpus/templates/plan/app/components/ui/button.tsx +1 -0
  1140. package/corpus/templates/plan/app/components/ui/card.tsx +1 -0
  1141. package/corpus/templates/plan/app/components/ui/checkbox.tsx +1 -0
  1142. package/corpus/templates/plan/app/components/ui/collapsible.tsx +1 -0
  1143. package/corpus/templates/plan/app/components/ui/dialog.tsx +1 -0
  1144. package/corpus/templates/plan/app/components/ui/dropdown-menu.tsx +1 -0
  1145. package/corpus/templates/plan/app/components/ui/input.tsx +1 -0
  1146. package/corpus/templates/plan/app/components/ui/label.tsx +1 -0
  1147. package/corpus/templates/plan/app/components/ui/popover.tsx +1 -0
  1148. package/corpus/templates/plan/app/components/ui/scroll-area.tsx +1 -0
  1149. package/corpus/templates/plan/app/components/ui/select.tsx +1 -0
  1150. package/corpus/templates/plan/app/components/ui/separator.tsx +1 -0
  1151. package/corpus/templates/plan/app/components/ui/sheet.tsx +1 -0
  1152. package/corpus/templates/plan/app/components/ui/skeleton.tsx +1 -0
  1153. package/corpus/templates/plan/app/components/ui/sonner.tsx +1 -0
  1154. package/corpus/templates/plan/app/components/ui/spinner.tsx +1 -0
  1155. package/corpus/templates/plan/app/components/ui/textarea.tsx +1 -0
  1156. package/corpus/templates/plan/app/components/ui/toggle-group.tsx +1 -0
  1157. package/corpus/templates/plan/app/components/ui/toolkit-provider.tsx +12 -0
  1158. package/corpus/templates/plan/app/components/ui/tooltip.tsx +1 -0
  1159. package/corpus/templates/plan/app/global.css +13 -0
  1160. package/corpus/templates/plan/app/hooks/use-plan-presence.ts +11 -1
  1161. package/corpus/templates/plan/app/lib/plan-access-prompt.ts +74 -0
  1162. package/corpus/templates/plan/app/lib/plan-annotation-runtime.ts +1435 -0
  1163. package/corpus/templates/plan/app/lib/plan-comment-editor-helpers.ts +142 -0
  1164. package/corpus/templates/plan/app/lib/plan-local-bridge.ts +376 -0
  1165. package/corpus/templates/plan/app/lib/plan-native-anchors.ts +682 -0
  1166. package/corpus/templates/plan/app/pages/PlansPage.tsx +216 -2747
  1167. package/corpus/templates/plan/app/root.tsx +13 -10
  1168. package/corpus/templates/plan/app/routes/_index.tsx +1 -2
  1169. package/corpus/templates/plan/app/routes/local-plans.$slug.tsx +1 -1
  1170. package/corpus/templates/plan/app/routes/plans.$id.tsx +1 -2
  1171. package/corpus/templates/plan/app/routes/plans.tsx +1 -2
  1172. package/corpus/templates/plan/app/routes/recaps.$id.tsx +1 -2
  1173. package/corpus/templates/plan/app/routes/recaps.tsx +1 -2
  1174. package/corpus/templates/plan/app/routes/settings.tsx +7 -21
  1175. package/corpus/templates/plan/changelog/2026-07-05-plan-pages-open-at-the-top-unless-a-shared-link-targets-a-sp.md +6 -0
  1176. package/corpus/templates/plan/changelog/2026-07-06-fixed-collaborative-plan-editing-so-content-no-longer-duplic.md +6 -0
  1177. package/corpus/templates/plan/changelog/2026-07-06-fixed-visual-reports-using-excessive-cpu-while-rendering-ske.md +6 -0
  1178. package/corpus/templates/plan/server/db/index.ts +12 -0
  1179. package/corpus/templates/plan/server/plans.ts +25 -1
  1180. package/corpus/templates/plan/server/routes/[...page].get.ts +107 -1
  1181. package/corpus/templates/plan/server/routes/api/plan-agent-context.json.get.ts +65 -0
  1182. package/corpus/templates/plan/shared/agent-readable.ts +2 -0
  1183. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +55 -0
  1184. package/corpus/templates/slides/app/components/ThemeToggle.tsx +6 -6
  1185. package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +5 -5
  1186. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +7 -7
  1187. package/corpus/templates/slides/app/components/deck/ExcalidrawSlide.tsx +2 -1
  1188. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +1 -1
  1189. package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +3 -2
  1190. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +15 -14
  1191. package/corpus/templates/slides/app/components/editor/AnimationsPanel.tsx +7 -7
  1192. package/corpus/templates/slides/app/components/editor/BlockBubbleMenu.tsx +5 -5
  1193. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +6 -6
  1194. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +14 -14
  1195. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +10 -9
  1196. package/corpus/templates/slides/app/components/editor/GenerateSlidesDialog.tsx +6 -5
  1197. package/corpus/templates/slides/app/components/editor/HistoryPanel.tsx +12 -12
  1198. package/corpus/templates/slides/app/components/editor/ImageDropPromptPopover.tsx +4 -3
  1199. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +5 -4
  1200. package/corpus/templates/slides/app/components/editor/ImportButton.tsx +4 -3
  1201. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +2 -1
  1202. package/corpus/templates/slides/app/components/editor/ShareDialog.tsx +10 -10
  1203. package/corpus/templates/slides/app/components/editor/SlideBubbleMenu.tsx +10 -10
  1204. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +6 -6
  1205. package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +2 -1
  1206. package/corpus/templates/slides/app/components/editor/TweaksPanel.tsx +1 -1
  1207. package/corpus/templates/slides/app/components/layout/Header.tsx +2 -2
  1208. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
  1209. package/corpus/templates/slides/app/components/ui/alert-dialog.tsx +1 -0
  1210. package/corpus/templates/slides/app/components/ui/button.tsx +1 -0
  1211. package/corpus/templates/slides/app/components/ui/card.tsx +1 -0
  1212. package/corpus/templates/slides/app/components/ui/dialog.tsx +1 -0
  1213. package/corpus/templates/slides/app/components/ui/dropdown-menu.tsx +1 -0
  1214. package/corpus/templates/slides/app/components/ui/input.tsx +1 -0
  1215. package/corpus/templates/slides/app/components/ui/label.tsx +1 -0
  1216. package/corpus/templates/slides/app/components/ui/popover.tsx +1 -0
  1217. package/corpus/templates/slides/app/components/ui/scroll-area.tsx +1 -0
  1218. package/corpus/templates/slides/app/components/ui/select.tsx +1 -0
  1219. package/corpus/templates/slides/app/components/ui/separator.tsx +1 -0
  1220. package/corpus/templates/slides/app/components/ui/sheet.tsx +1 -0
  1221. package/corpus/templates/slides/app/components/ui/skeleton.tsx +1 -0
  1222. package/corpus/templates/slides/app/components/ui/spinner.tsx +1 -0
  1223. package/corpus/templates/slides/app/components/ui/textarea.tsx +1 -0
  1224. package/corpus/templates/slides/app/components/ui/toast.tsx +1 -0
  1225. package/corpus/templates/slides/app/components/ui/toaster.tsx +1 -0
  1226. package/corpus/templates/slides/app/components/ui/toggle-group.tsx +1 -0
  1227. package/corpus/templates/slides/app/components/ui/toolkit-provider.tsx +12 -0
  1228. package/corpus/templates/slides/app/components/ui/tooltip.tsx +1 -0
  1229. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +6 -6
  1230. package/corpus/templates/slides/app/components/visual-editor/DrawOverlay.tsx +7 -7
  1231. package/corpus/templates/slides/app/global.css +1 -0
  1232. package/corpus/templates/slides/app/hooks/use-toast.ts +1 -0
  1233. package/corpus/templates/slides/app/pages/DeckEditor.tsx +3 -3
  1234. package/corpus/templates/slides/app/pages/DesignSystems.tsx +1 -1
  1235. package/corpus/templates/slides/app/pages/Index.tsx +14 -17
  1236. package/corpus/templates/slides/app/root.tsx +13 -10
  1237. package/corpus/templates/slides/app/routes/p.$id.tsx +126 -12
  1238. package/corpus/templates/slides/app/routes/settings.tsx +6 -21
  1239. package/corpus/templates/slides/app/routes/share.$token.tsx +55 -8
  1240. package/corpus/templates/slides/changelog/2026-07-06-mobile-layouts-no-longer-stack-two-top-headers.md +5 -0
  1241. package/corpus/templates/slides/server/db/index.ts +9 -0
  1242. package/corpus/templates/slides/server/handlers/uploads.ts +7 -2
  1243. package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
  1244. package/corpus/templates/slides/server/routes/api/deck-agent-context.json.get.ts +97 -0
  1245. package/corpus/templates/slides/shared/agent-readable.ts +2 -0
  1246. package/dist/agent/durable-background.d.ts +29 -0
  1247. package/dist/agent/durable-background.d.ts.map +1 -1
  1248. package/dist/agent/durable-background.js +46 -0
  1249. package/dist/agent/durable-background.js.map +1 -1
  1250. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  1251. package/dist/agent/engine/ai-sdk-engine.js +7 -2
  1252. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  1253. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  1254. package/dist/agent/engine/anthropic-engine.js +28 -2
  1255. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  1256. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  1257. package/dist/agent/engine/builder-engine.js +1 -1
  1258. package/dist/agent/engine/builder-engine.js.map +1 -1
  1259. package/dist/agent/engine/output-tokens.d.ts +3 -3
  1260. package/dist/agent/engine/output-tokens.d.ts.map +1 -1
  1261. package/dist/agent/engine/output-tokens.js +16 -14
  1262. package/dist/agent/engine/output-tokens.js.map +1 -1
  1263. package/dist/agent/engine/registry.d.ts +3 -3
  1264. package/dist/agent/engine/registry.d.ts.map +1 -1
  1265. package/dist/agent/engine/registry.js +28 -25
  1266. package/dist/agent/engine/registry.js.map +1 -1
  1267. package/dist/agent/engine/translate-ai-sdk.d.ts +14 -2
  1268. package/dist/agent/engine/translate-ai-sdk.d.ts.map +1 -1
  1269. package/dist/agent/engine/translate-ai-sdk.js +33 -18
  1270. package/dist/agent/engine/translate-ai-sdk.js.map +1 -1
  1271. package/dist/agent/engine/translate-anthropic.d.ts.map +1 -1
  1272. package/dist/agent/engine/translate-anthropic.js +42 -1
  1273. package/dist/agent/engine/translate-anthropic.js.map +1 -1
  1274. package/dist/agent/engine/types.d.ts +15 -0
  1275. package/dist/agent/engine/types.d.ts.map +1 -1
  1276. package/dist/agent/engine/types.js.map +1 -1
  1277. package/dist/agent/model-config.d.ts +8 -0
  1278. package/dist/agent/model-config.d.ts.map +1 -1
  1279. package/dist/agent/model-config.js +86 -0
  1280. package/dist/agent/model-config.js.map +1 -1
  1281. package/dist/agent/production-agent.d.ts +91 -5
  1282. package/dist/agent/production-agent.d.ts.map +1 -1
  1283. package/dist/agent/production-agent.js +389 -180
  1284. package/dist/agent/production-agent.js.map +1 -1
  1285. package/dist/agent/runtime-context.d.ts +29 -0
  1286. package/dist/agent/runtime-context.d.ts.map +1 -1
  1287. package/dist/agent/runtime-context.js +40 -11
  1288. package/dist/agent/runtime-context.js.map +1 -1
  1289. package/dist/agent/tool-result-images.d.ts +49 -0
  1290. package/dist/agent/tool-result-images.d.ts.map +1 -0
  1291. package/dist/agent/tool-result-images.js +141 -0
  1292. package/dist/agent/tool-result-images.js.map +1 -0
  1293. package/dist/brand-kit/fig/index.d.ts.map +1 -1
  1294. package/dist/brand-kit/fig/index.js +6 -3
  1295. package/dist/brand-kit/fig/index.js.map +1 -1
  1296. package/dist/client/AgentPanel.d.ts.map +1 -1
  1297. package/dist/client/AgentPanel.js +66 -17
  1298. package/dist/client/AgentPanel.js.map +1 -1
  1299. package/dist/client/AssistantChat.d.ts.map +1 -1
  1300. package/dist/client/AssistantChat.js +72 -40
  1301. package/dist/client/AssistantChat.js.map +1 -1
  1302. package/dist/client/KeepTabOpenNotice.d.ts +55 -0
  1303. package/dist/client/KeepTabOpenNotice.d.ts.map +1 -0
  1304. package/dist/client/KeepTabOpenNotice.js +85 -0
  1305. package/dist/client/KeepTabOpenNotice.js.map +1 -0
  1306. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  1307. package/dist/client/MultiTabAssistantChat.js +2 -1
  1308. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  1309. package/dist/client/RunStuckBanner.d.ts +7 -1
  1310. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  1311. package/dist/client/RunStuckBanner.js +7 -2
  1312. package/dist/client/RunStuckBanner.js.map +1 -1
  1313. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  1314. package/dist/client/chat/run-recovery.js +7 -1
  1315. package/dist/client/chat/run-recovery.js.map +1 -1
  1316. package/dist/client/clipboard.d.ts.map +1 -1
  1317. package/dist/client/clipboard.js +5 -6
  1318. package/dist/client/clipboard.js.map +1 -1
  1319. package/dist/client/components/AgentPresenceChip.d.ts +1 -11
  1320. package/dist/client/components/AgentPresenceChip.d.ts.map +1 -1
  1321. package/dist/client/components/AgentPresenceChip.js +1 -41
  1322. package/dist/client/components/AgentPresenceChip.js.map +1 -1
  1323. package/dist/client/components/LiveCursorOverlay.d.ts +1 -44
  1324. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  1325. package/dist/client/components/LiveCursorOverlay.js +1 -123
  1326. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  1327. package/dist/client/components/PresenceBar.d.ts +1 -26
  1328. package/dist/client/components/PresenceBar.d.ts.map +1 -1
  1329. package/dist/client/components/PresenceBar.js +1 -164
  1330. package/dist/client/components/PresenceBar.js.map +1 -1
  1331. package/dist/client/components/RecentEditHighlights.d.ts +1 -42
  1332. package/dist/client/components/RecentEditHighlights.d.ts.map +1 -1
  1333. package/dist/client/components/RecentEditHighlights.js +1 -145
  1334. package/dist/client/components/RecentEditHighlights.js.map +1 -1
  1335. package/dist/client/components/RemoteSelectionRings.d.ts +1 -51
  1336. package/dist/client/components/RemoteSelectionRings.d.ts.map +1 -1
  1337. package/dist/client/components/RemoteSelectionRings.js +1 -129
  1338. package/dist/client/components/RemoteSelectionRings.js.map +1 -1
  1339. package/dist/client/composer/TiptapComposer.d.ts +4 -0
  1340. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  1341. package/dist/client/composer/TiptapComposer.js +74 -26
  1342. package/dist/client/composer/TiptapComposer.js.map +1 -1
  1343. package/dist/client/db-admin/SqlEditor.d.ts.map +1 -1
  1344. package/dist/client/db-admin/SqlEditor.js +13 -3
  1345. package/dist/client/db-admin/SqlEditor.js.map +1 -1
  1346. package/dist/client/dynamic-suggestions.d.ts.map +1 -1
  1347. package/dist/client/dynamic-suggestions.js +7 -1
  1348. package/dist/client/dynamic-suggestions.js.map +1 -1
  1349. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  1350. package/dist/client/extensions/ExtensionViewer.js +7 -7
  1351. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  1352. package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
  1353. package/dist/client/extensions/ExtensionsListPage.js +5 -7
  1354. package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
  1355. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  1356. package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
  1357. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  1358. package/dist/client/host-bridge.d.ts +2 -0
  1359. package/dist/client/host-bridge.d.ts.map +1 -1
  1360. package/dist/client/host-bridge.js +26 -10
  1361. package/dist/client/host-bridge.js.map +1 -1
  1362. package/dist/client/i18n.d.ts +1 -0
  1363. package/dist/client/i18n.d.ts.map +1 -1
  1364. package/dist/client/i18n.js +3 -1
  1365. package/dist/client/i18n.js.map +1 -1
  1366. package/dist/client/index.d.ts +2 -1
  1367. package/dist/client/index.d.ts.map +1 -1
  1368. package/dist/client/index.js +2 -1
  1369. package/dist/client/index.js.map +1 -1
  1370. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  1371. package/dist/client/resources/McpIntegrationDialog.js +12 -31
  1372. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  1373. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +3 -1
  1374. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
  1375. package/dist/client/rich-markdown-editor/SharedRichEditor.js +2 -1
  1376. package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
  1377. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts +3 -1
  1378. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
  1379. package/dist/client/rich-markdown-editor/useCollabReconcile.js +6 -2
  1380. package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
  1381. package/dist/client/settings/SettingsPanel.d.ts +3 -1
  1382. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  1383. package/dist/client/settings/SettingsPanel.js +103 -9
  1384. package/dist/client/settings/SettingsPanel.js.map +1 -1
  1385. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  1386. package/dist/client/settings/SettingsTabsPage.js +5 -5
  1387. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  1388. package/dist/client/settings/index.d.ts +1 -1
  1389. package/dist/client/settings/index.d.ts.map +1 -1
  1390. package/dist/client/settings/index.js +1 -1
  1391. package/dist/client/settings/index.js.map +1 -1
  1392. package/dist/client/sharing/VisibilityBadge.d.ts +1 -10
  1393. package/dist/client/sharing/VisibilityBadge.d.ts.map +1 -1
  1394. package/dist/client/sharing/VisibilityBadge.js +1 -18
  1395. package/dist/client/sharing/VisibilityBadge.js.map +1 -1
  1396. package/dist/client/use-run-stuck-detection.d.ts +8 -1
  1397. package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
  1398. package/dist/client/use-run-stuck-detection.js +3 -2
  1399. package/dist/client/use-run-stuck-detection.js.map +1 -1
  1400. package/dist/coding-tools/run-code.d.ts +36 -0
  1401. package/dist/coding-tools/run-code.d.ts.map +1 -1
  1402. package/dist/coding-tools/run-code.js +333 -62
  1403. package/dist/coding-tools/run-code.js.map +1 -1
  1404. package/dist/coding-tools/sandbox/background.d.ts +141 -0
  1405. package/dist/coding-tools/sandbox/background.d.ts.map +1 -0
  1406. package/dist/coding-tools/sandbox/background.js +279 -0
  1407. package/dist/coding-tools/sandbox/background.js.map +1 -0
  1408. package/dist/coding-tools/sandbox/executions-store.d.ts +138 -0
  1409. package/dist/coding-tools/sandbox/executions-store.d.ts.map +1 -0
  1410. package/dist/coding-tools/sandbox/executions-store.js +380 -0
  1411. package/dist/coding-tools/sandbox/executions-store.js.map +1 -0
  1412. package/dist/coding-tools/sandbox/index.d.ts +22 -13
  1413. package/dist/coding-tools/sandbox/index.d.ts.map +1 -1
  1414. package/dist/coding-tools/sandbox/index.js +31 -13
  1415. package/dist/coding-tools/sandbox/index.js.map +1 -1
  1416. package/dist/coding-tools/sandbox/local-child-process-adapter.d.ts.map +1 -1
  1417. package/dist/coding-tools/sandbox/local-child-process-adapter.js +61 -4
  1418. package/dist/coding-tools/sandbox/local-child-process-adapter.js.map +1 -1
  1419. package/dist/collab/awareness.d.ts +2 -2
  1420. package/dist/collab/awareness.d.ts.map +1 -1
  1421. package/dist/collab/client.d.ts +16 -12
  1422. package/dist/collab/client.d.ts.map +1 -1
  1423. package/dist/collab/client.js +744 -496
  1424. package/dist/collab/client.js.map +1 -1
  1425. package/dist/collab/presence.d.ts +2 -20
  1426. package/dist/collab/presence.d.ts.map +1 -1
  1427. package/dist/collab/presence.js +3 -0
  1428. package/dist/collab/presence.js.map +1 -1
  1429. package/dist/collab/recent-edits.d.ts +2 -37
  1430. package/dist/collab/recent-edits.d.ts.map +1 -1
  1431. package/dist/collab/recent-edits.js +2 -9
  1432. package/dist/collab/recent-edits.js.map +1 -1
  1433. package/dist/collab/routes.d.ts +2 -2
  1434. package/dist/collab/struct-routes.d.ts +1 -1
  1435. package/dist/data-programs/actions.d.ts +19 -0
  1436. package/dist/data-programs/actions.d.ts.map +1 -0
  1437. package/dist/data-programs/actions.js +279 -0
  1438. package/dist/data-programs/actions.js.map +1 -0
  1439. package/dist/data-programs/contract.d.ts +70 -0
  1440. package/dist/data-programs/contract.d.ts.map +1 -0
  1441. package/dist/data-programs/contract.js +225 -0
  1442. package/dist/data-programs/contract.js.map +1 -0
  1443. package/dist/data-programs/execute.d.ts +96 -0
  1444. package/dist/data-programs/execute.d.ts.map +1 -0
  1445. package/dist/data-programs/execute.js +454 -0
  1446. package/dist/data-programs/execute.js.map +1 -0
  1447. package/dist/data-programs/index.d.ts +11 -0
  1448. package/dist/data-programs/index.d.ts.map +1 -0
  1449. package/dist/data-programs/index.js +11 -0
  1450. package/dist/data-programs/index.js.map +1 -0
  1451. package/dist/data-programs/schema.d.ts +517 -0
  1452. package/dist/data-programs/schema.d.ts.map +1 -0
  1453. package/dist/data-programs/schema.js +138 -0
  1454. package/dist/data-programs/schema.js.map +1 -0
  1455. package/dist/data-programs/store.d.ts +158 -0
  1456. package/dist/data-programs/store.d.ts.map +1 -0
  1457. package/dist/data-programs/store.js +493 -0
  1458. package/dist/data-programs/store.js.map +1 -0
  1459. package/dist/deploy/build.d.ts.map +1 -1
  1460. package/dist/deploy/build.js +34 -0
  1461. package/dist/deploy/build.js.map +1 -1
  1462. package/dist/extensions/actions.js +2 -2
  1463. package/dist/extensions/actions.js.map +1 -1
  1464. package/dist/file-upload/builder.d.ts.map +1 -1
  1465. package/dist/file-upload/builder.js +9 -0
  1466. package/dist/file-upload/builder.js.map +1 -1
  1467. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  1468. package/dist/integrations/webhook-handler.js +21 -10
  1469. package/dist/integrations/webhook-handler.js.map +1 -1
  1470. package/dist/local-artifacts/index.js +1 -1
  1471. package/dist/local-artifacts/index.js.map +1 -1
  1472. package/dist/localization/default-messages.d.ts +0 -1
  1473. package/dist/localization/default-messages.d.ts.map +1 -1
  1474. package/dist/localization/default-messages.js +1 -2
  1475. package/dist/localization/default-messages.js.map +1 -1
  1476. package/dist/mcp-client/index.d.ts +9 -0
  1477. package/dist/mcp-client/index.d.ts.map +1 -1
  1478. package/dist/mcp-client/index.js +23 -0
  1479. package/dist/mcp-client/index.js.map +1 -1
  1480. package/dist/notifications/routes.d.ts +1 -1
  1481. package/dist/onboarding/default-steps.d.ts.map +1 -1
  1482. package/dist/onboarding/default-steps.js +2 -2
  1483. package/dist/onboarding/default-steps.js.map +1 -1
  1484. package/dist/resources/handlers.d.ts +1 -1
  1485. package/dist/resources/store.d.ts.map +1 -1
  1486. package/dist/resources/store.js +35 -3
  1487. package/dist/resources/store.js.map +1 -1
  1488. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  1489. package/dist/scripts/agent-engines/list-agent-engines.js +4 -8
  1490. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  1491. package/dist/scripts/agent-engines/test-agent-engine.d.ts.map +1 -1
  1492. package/dist/scripts/agent-engines/test-agent-engine.js +7 -2
  1493. package/dist/scripts/agent-engines/test-agent-engine.js.map +1 -1
  1494. package/dist/scripts/db/tool-mode.js +3 -3
  1495. package/dist/scripts/db/tool-mode.js.map +1 -1
  1496. package/dist/scripts/resources/migrate-learnings.d.ts +5 -1
  1497. package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -1
  1498. package/dist/scripts/resources/migrate-learnings.js +8 -10
  1499. package/dist/scripts/resources/migrate-learnings.js.map +1 -1
  1500. package/dist/server/action-discovery.d.ts.map +1 -1
  1501. package/dist/server/action-discovery.js +4 -0
  1502. package/dist/server/action-discovery.js.map +1 -1
  1503. package/dist/server/action-routes.d.ts.map +1 -1
  1504. package/dist/server/action-routes.js +8 -2
  1505. package/dist/server/action-routes.js.map +1 -1
  1506. package/dist/server/agent-chat-plugin.d.ts +20 -6
  1507. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  1508. package/dist/server/agent-chat-plugin.js +138 -59
  1509. package/dist/server/agent-chat-plugin.js.map +1 -1
  1510. package/dist/server/agent-discovery.d.ts.map +1 -1
  1511. package/dist/server/agent-discovery.js +62 -8
  1512. package/dist/server/agent-discovery.js.map +1 -1
  1513. package/dist/server/auth.d.ts.map +1 -1
  1514. package/dist/server/auth.js +75 -3
  1515. package/dist/server/auth.js.map +1 -1
  1516. package/dist/server/builder-design-systems.js +2 -2
  1517. package/dist/server/builder-design-systems.js.map +1 -1
  1518. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  1519. package/dist/server/core-routes-plugin.js +100 -20
  1520. package/dist/server/core-routes-plugin.js.map +1 -1
  1521. package/dist/server/credential-provider.d.ts +6 -3
  1522. package/dist/server/credential-provider.d.ts.map +1 -1
  1523. package/dist/server/credential-provider.js +25 -8
  1524. package/dist/server/credential-provider.js.map +1 -1
  1525. package/dist/server/csrf.d.ts.map +1 -1
  1526. package/dist/server/csrf.js +3 -0
  1527. package/dist/server/csrf.js.map +1 -1
  1528. package/dist/server/index.d.ts +1 -0
  1529. package/dist/server/index.d.ts.map +1 -1
  1530. package/dist/server/index.js +1 -0
  1531. package/dist/server/index.js.map +1 -1
  1532. package/dist/server/oauth-helpers.d.ts.map +1 -1
  1533. package/dist/server/oauth-helpers.js +9 -1
  1534. package/dist/server/oauth-helpers.js.map +1 -1
  1535. package/dist/server/onboarding-html.d.ts.map +1 -1
  1536. package/dist/server/onboarding-html.js +80 -48
  1537. package/dist/server/onboarding-html.js.map +1 -1
  1538. package/dist/server/prompts/shared-rules.js +2 -2
  1539. package/dist/server/prompts/shared-rules.js.map +1 -1
  1540. package/dist/server/transcribe-voice.d.ts +1 -1
  1541. package/dist/server/transcribe-voice.d.ts.map +1 -1
  1542. package/dist/server/transcribe-voice.js +77 -15
  1543. package/dist/server/transcribe-voice.js.map +1 -1
  1544. package/dist/shared/agent-readable-resource.d.ts +29 -0
  1545. package/dist/shared/agent-readable-resource.d.ts.map +1 -0
  1546. package/dist/shared/agent-readable-resource.js +60 -0
  1547. package/dist/shared/agent-readable-resource.js.map +1 -0
  1548. package/dist/shared/index.d.ts +1 -0
  1549. package/dist/shared/index.d.ts.map +1 -1
  1550. package/dist/shared/index.js +1 -0
  1551. package/dist/shared/index.js.map +1 -1
  1552. package/dist/sharing/actions/create-agent-resource-link.d.ts +13 -0
  1553. package/dist/sharing/actions/create-agent-resource-link.d.ts.map +1 -0
  1554. package/dist/sharing/actions/create-agent-resource-link.js +72 -0
  1555. package/dist/sharing/actions/create-agent-resource-link.js.map +1 -0
  1556. package/dist/sharing/registry.d.ts +17 -0
  1557. package/dist/sharing/registry.d.ts.map +1 -1
  1558. package/dist/sharing/registry.js.map +1 -1
  1559. package/dist/styles/agent-native.css +57 -45
  1560. package/dist/templates/default/.agents/skills/actions/SKILL.md +55 -0
  1561. package/dist/templates/default/AGENTS.md +11 -14
  1562. package/dist/templates/default/actions/navigate.ts +1 -1
  1563. package/dist/templates/default/app/i18n/ar-SA.ts +0 -1
  1564. package/dist/templates/default/app/i18n/de-DE.ts +0 -1
  1565. package/dist/templates/default/app/i18n/en-US.ts +0 -1
  1566. package/dist/templates/default/app/i18n/es-ES.ts +0 -1
  1567. package/dist/templates/default/app/i18n/fr-FR.ts +0 -1
  1568. package/dist/templates/default/app/i18n/hi-IN.ts +0 -1
  1569. package/dist/templates/default/app/i18n/ja-JP.ts +0 -1
  1570. package/dist/templates/default/app/i18n/ko-KR.ts +0 -1
  1571. package/dist/templates/default/app/i18n/pt-BR.ts +0 -1
  1572. package/dist/templates/default/app/i18n/zh-CN.ts +0 -1
  1573. package/dist/templates/default/app/i18n/zh-TW.ts +0 -1
  1574. package/dist/templates/default/app/routes/settings.tsx +22 -33
  1575. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +20 -7
  1576. package/dist/templates/headless/AGENTS.md +9 -6
  1577. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +55 -0
  1578. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +92 -0
  1579. package/dist/templates/workspace-core/.agents/skills/data-programs/SKILL.md +128 -0
  1580. package/dist/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +10 -4
  1581. package/dist/vite/agents-bundle-plugin.d.ts.map +1 -1
  1582. package/dist/vite/agents-bundle-plugin.js +26 -1
  1583. package/dist/vite/agents-bundle-plugin.js.map +1 -1
  1584. package/dist/vite/client.d.ts.map +1 -1
  1585. package/dist/vite/client.js +12 -0
  1586. package/dist/vite/client.js.map +1 -1
  1587. package/docs/content/agent-native-toolkit.mdx +103 -0
  1588. package/docs/content/cloneable-saas.mdx +19 -19
  1589. package/docs/content/components.mdx +16 -4
  1590. package/docs/content/data-programs.mdx +329 -0
  1591. package/docs/content/deployment.mdx +9 -9
  1592. package/docs/content/extensions.mdx +8 -7
  1593. package/docs/content/generative-ui.mdx +5 -3
  1594. package/docs/content/key-concepts.mdx +6 -9
  1595. package/docs/content/locales/ar-SA/agent-native-toolkit.mdx +103 -0
  1596. package/docs/content/locales/ar-SA/cloneable-saas.mdx +19 -19
  1597. package/docs/content/locales/ar-SA/components.mdx +12 -2
  1598. package/docs/content/locales/ar-SA/data-programs.mdx +329 -0
  1599. package/docs/content/locales/ar-SA/deployment.mdx +8 -9
  1600. package/docs/content/locales/ar-SA/extensions.mdx +6 -4
  1601. package/docs/content/locales/ar-SA/key-concepts.mdx +7 -9
  1602. package/docs/content/locales/ar-SA/real-time-collaboration.mdx +9 -10
  1603. package/docs/content/locales/ar-SA/sharing.mdx +15 -7
  1604. package/docs/content/locales/de-DE/agent-native-toolkit.mdx +103 -0
  1605. package/docs/content/locales/de-DE/cloneable-saas.mdx +19 -19
  1606. package/docs/content/locales/de-DE/components.mdx +12 -2
  1607. package/docs/content/locales/de-DE/data-programs.mdx +329 -0
  1608. package/docs/content/locales/de-DE/deployment.mdx +8 -9
  1609. package/docs/content/locales/de-DE/extensions.mdx +6 -4
  1610. package/docs/content/locales/de-DE/key-concepts.mdx +8 -10
  1611. package/docs/content/locales/de-DE/real-time-collaboration.mdx +9 -10
  1612. package/docs/content/locales/de-DE/sharing.mdx +15 -7
  1613. package/docs/content/locales/es-ES/agent-native-toolkit.mdx +103 -0
  1614. package/docs/content/locales/es-ES/cloneable-saas.mdx +19 -19
  1615. package/docs/content/locales/es-ES/components.mdx +12 -2
  1616. package/docs/content/locales/es-ES/data-programs.mdx +329 -0
  1617. package/docs/content/locales/es-ES/deployment.mdx +8 -9
  1618. package/docs/content/locales/es-ES/extensions.mdx +6 -4
  1619. package/docs/content/locales/es-ES/key-concepts.mdx +8 -10
  1620. package/docs/content/locales/es-ES/real-time-collaboration.mdx +9 -10
  1621. package/docs/content/locales/es-ES/sharing.mdx +15 -7
  1622. package/docs/content/locales/fr-FR/agent-native-toolkit.mdx +103 -0
  1623. package/docs/content/locales/fr-FR/cloneable-saas.mdx +19 -19
  1624. package/docs/content/locales/fr-FR/components.mdx +12 -2
  1625. package/docs/content/locales/fr-FR/data-programs.mdx +329 -0
  1626. package/docs/content/locales/fr-FR/deployment.mdx +8 -9
  1627. package/docs/content/locales/fr-FR/extensions.mdx +6 -4
  1628. package/docs/content/locales/fr-FR/key-concepts.mdx +8 -10
  1629. package/docs/content/locales/fr-FR/real-time-collaboration.mdx +9 -10
  1630. package/docs/content/locales/fr-FR/sharing.mdx +15 -7
  1631. package/docs/content/locales/hi-IN/agent-native-toolkit.mdx +103 -0
  1632. package/docs/content/locales/hi-IN/cloneable-saas.mdx +19 -19
  1633. package/docs/content/locales/hi-IN/components.mdx +20 -10
  1634. package/docs/content/locales/hi-IN/data-programs.mdx +329 -0
  1635. package/docs/content/locales/hi-IN/deployment.mdx +8 -9
  1636. package/docs/content/locales/hi-IN/extensions.mdx +6 -4
  1637. package/docs/content/locales/hi-IN/key-concepts.mdx +8 -10
  1638. package/docs/content/locales/hi-IN/real-time-collaboration.mdx +9 -10
  1639. package/docs/content/locales/hi-IN/sharing.mdx +15 -7
  1640. package/docs/content/locales/ja-JP/agent-native-toolkit.mdx +103 -0
  1641. package/docs/content/locales/ja-JP/cloneable-saas.mdx +19 -19
  1642. package/docs/content/locales/ja-JP/components.mdx +12 -2
  1643. package/docs/content/locales/ja-JP/data-programs.mdx +329 -0
  1644. package/docs/content/locales/ja-JP/deployment.mdx +8 -9
  1645. package/docs/content/locales/ja-JP/extensions.mdx +6 -4
  1646. package/docs/content/locales/ja-JP/key-concepts.mdx +9 -11
  1647. package/docs/content/locales/ja-JP/real-time-collaboration.mdx +9 -10
  1648. package/docs/content/locales/ja-JP/sharing.mdx +15 -7
  1649. package/docs/content/locales/ko-KR/agent-native-toolkit.mdx +103 -0
  1650. package/docs/content/locales/ko-KR/cloneable-saas.mdx +19 -19
  1651. package/docs/content/locales/ko-KR/components.mdx +20 -10
  1652. package/docs/content/locales/ko-KR/data-programs.mdx +329 -0
  1653. package/docs/content/locales/ko-KR/deployment.mdx +8 -9
  1654. package/docs/content/locales/ko-KR/extensions.mdx +16 -14
  1655. package/docs/content/locales/ko-KR/key-concepts.mdx +9 -11
  1656. package/docs/content/locales/ko-KR/real-time-collaboration.mdx +9 -10
  1657. package/docs/content/locales/ko-KR/sharing.mdx +15 -7
  1658. package/docs/content/locales/pt-BR/agent-native-toolkit.mdx +103 -0
  1659. package/docs/content/locales/pt-BR/cloneable-saas.mdx +19 -19
  1660. package/docs/content/locales/pt-BR/components.mdx +12 -2
  1661. package/docs/content/locales/pt-BR/data-programs.mdx +329 -0
  1662. package/docs/content/locales/pt-BR/deployment.mdx +8 -9
  1663. package/docs/content/locales/pt-BR/extensions.mdx +6 -4
  1664. package/docs/content/locales/pt-BR/key-concepts.mdx +8 -11
  1665. package/docs/content/locales/pt-BR/real-time-collaboration.mdx +9 -10
  1666. package/docs/content/locales/pt-BR/sharing.mdx +15 -7
  1667. package/docs/content/locales/zh-CN/agent-native-toolkit.mdx +103 -0
  1668. package/docs/content/locales/zh-CN/cloneable-saas.mdx +19 -19
  1669. package/docs/content/locales/zh-CN/components.mdx +20 -10
  1670. package/docs/content/locales/zh-CN/data-programs.mdx +329 -0
  1671. package/docs/content/locales/zh-CN/deployment.mdx +7 -9
  1672. package/docs/content/locales/zh-CN/extensions.mdx +16 -14
  1673. package/docs/content/locales/zh-CN/key-concepts.mdx +7 -11
  1674. package/docs/content/locales/zh-CN/real-time-collaboration.mdx +10 -11
  1675. package/docs/content/locales/zh-CN/sharing.mdx +15 -7
  1676. package/docs/content/locales/zh-TW/agent-native-toolkit.mdx +103 -0
  1677. package/docs/content/locales/zh-TW/cloneable-saas.mdx +19 -19
  1678. package/docs/content/locales/zh-TW/components.mdx +20 -10
  1679. package/docs/content/locales/zh-TW/data-programs.mdx +329 -0
  1680. package/docs/content/locales/zh-TW/deployment.mdx +7 -9
  1681. package/docs/content/locales/zh-TW/extensions.mdx +16 -14
  1682. package/docs/content/locales/zh-TW/key-concepts.mdx +7 -11
  1683. package/docs/content/locales/zh-TW/real-time-collaboration.mdx +10 -11
  1684. package/docs/content/locales/zh-TW/sharing.mdx +15 -7
  1685. package/docs/content/real-time-collaboration.mdx +10 -11
  1686. package/docs/content/sharing.mdx +39 -7
  1687. package/docs/content/toolkit-app-adapters.mdx +46 -0
  1688. package/docs/content/toolkit-collaboration-ui.mdx +48 -0
  1689. package/docs/content/toolkit-sharing-ui.mdx +33 -0
  1690. package/docs/content/toolkit-shell-hooks.mdx +27 -0
  1691. package/docs/content/toolkit-ui.mdx +69 -0
  1692. package/package.json +7 -2
  1693. package/src/templates/default/.agents/skills/actions/SKILL.md +55 -0
  1694. package/src/templates/default/AGENTS.md +11 -14
  1695. package/src/templates/default/actions/navigate.spec.ts +53 -0
  1696. package/src/templates/default/actions/navigate.ts +1 -1
  1697. package/src/templates/default/app/i18n/ar-SA.ts +0 -1
  1698. package/src/templates/default/app/i18n/de-DE.ts +0 -1
  1699. package/src/templates/default/app/i18n/en-US.ts +0 -1
  1700. package/src/templates/default/app/i18n/es-ES.ts +0 -1
  1701. package/src/templates/default/app/i18n/fr-FR.ts +0 -1
  1702. package/src/templates/default/app/i18n/hi-IN.ts +0 -1
  1703. package/src/templates/default/app/i18n/ja-JP.ts +0 -1
  1704. package/src/templates/default/app/i18n/ko-KR.ts +0 -1
  1705. package/src/templates/default/app/i18n/pt-BR.ts +0 -1
  1706. package/src/templates/default/app/i18n/zh-CN.ts +0 -1
  1707. package/src/templates/default/app/i18n/zh-TW.ts +0 -1
  1708. package/src/templates/default/app/routes/settings.tsx +22 -33
  1709. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +20 -7
  1710. package/src/templates/headless/AGENTS.md +9 -6
  1711. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +55 -0
  1712. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +92 -0
  1713. package/src/templates/workspace-core/.agents/skills/data-programs/SKILL.md +128 -0
  1714. package/src/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +10 -4
  1715. package/corpus/templates/design/server/lib/figma-import/clipboard.ts +0 -122
  1716. package/corpus/templates/design/server/lib/figma-import/decode.ts +0 -455
  1717. package/corpus/templates/design/server/lib/figma-import/processor.ts +0 -116
  1718. package/corpus/templates/design/server/lib/figma-import/render-html.ts +0 -397
  1719. package/corpus/templates/design/server/lib/figma-import/types.ts +0 -60
@@ -49,15 +49,18 @@ export declare function readDeployCredentialEnv(key: string): string | undefined
49
49
  /**
50
50
  * Deployment-level credentials are safe as a runtime fallback only in local /
51
51
  * single-tenant contexts. In hosted production with a shared database, every
52
- * signed-in user needs their own user/org/workspace credential so one deploy
53
- * key does not silently power another tenant's chat.
52
+ * signed-in user needs their own user/org/workspace credential for
53
+ * identity-bearing provider keys so one deploy key does not silently
54
+ * impersonate another tenant. App-provided LLM provider keys are different:
55
+ * they intentionally let the app developer pay for model usage for users of
56
+ * that deployed app, so key-aware callers may use those env vars.
54
57
  *
55
58
  * @deprecated Use `canUseDeployCredentialFallbackForRequest()` for generic
56
59
  * provider secrets. This stricter helper remains for legacy call sites with
57
60
  * identity-bearing deploy credentials.
58
61
  */
59
62
  export declare function isDeployCredentialFallbackAllowed(): boolean;
60
- export declare function canUseDeployCredentialFallbackForRequest(): boolean;
63
+ export declare function canUseDeployCredentialFallbackForRequest(key?: string): boolean;
61
64
  type BuilderCredentialSource = "user" | "org" | "workspace" | "env";
62
65
  export declare function isBuilderPrivateKey(value: string | null | undefined): boolean;
63
66
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"credential-provider.d.ts","sourceRoot":"","sources":["../../src/server/credential-provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credential-provider.d.ts","sourceRoot":"","sources":["../../src/server/credential-provider.ts"],"names":[],"mappings":"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"}
@@ -55,11 +55,27 @@ export class FeatureNotConfiguredError extends Error {
55
55
  export function readDeployCredentialEnv(key) {
56
56
  return process.env[key] || undefined;
57
57
  }
58
+ const APP_PROVIDED_DEPLOY_CREDENTIAL_KEYS = new Set([
59
+ "ANTHROPIC_API_KEY",
60
+ "OPENAI_API_KEY",
61
+ "OPENAI_BASE_URL",
62
+ "OPENROUTER_API_KEY",
63
+ "GOOGLE_GENERATIVE_AI_API_KEY",
64
+ "GROQ_API_KEY",
65
+ "MISTRAL_API_KEY",
66
+ "COHERE_API_KEY",
67
+ ]);
68
+ function isAppProvidedDeployCredentialKey(key) {
69
+ return !!key && APP_PROVIDED_DEPLOY_CREDENTIAL_KEYS.has(key);
70
+ }
58
71
  /**
59
72
  * Deployment-level credentials are safe as a runtime fallback only in local /
60
73
  * single-tenant contexts. In hosted production with a shared database, every
61
- * signed-in user needs their own user/org/workspace credential so one deploy
62
- * key does not silently power another tenant's chat.
74
+ * signed-in user needs their own user/org/workspace credential for
75
+ * identity-bearing provider keys so one deploy key does not silently
76
+ * impersonate another tenant. App-provided LLM provider keys are different:
77
+ * they intentionally let the app developer pay for model usage for users of
78
+ * that deployed app, so key-aware callers may use those env vars.
63
79
  *
64
80
  * @deprecated Use `canUseDeployCredentialFallbackForRequest()` for generic
65
81
  * provider secrets. This stricter helper remains for legacy call sites with
@@ -70,10 +86,12 @@ export function isDeployCredentialFallbackAllowed() {
70
86
  return true;
71
87
  return isLocalDatabase();
72
88
  }
73
- export function canUseDeployCredentialFallbackForRequest() {
89
+ export function canUseDeployCredentialFallbackForRequest(key) {
74
90
  const email = getRequestUserEmail();
75
91
  if (!email)
76
92
  return true;
93
+ if (isAppProvidedDeployCredentialKey(key))
94
+ return true;
77
95
  if (isHostedWorkspaceRuntime())
78
96
  return false;
79
97
  if (!isProductionLikeRuntime())
@@ -650,10 +668,9 @@ export async function deleteBuilderCredentials(email, options) {
650
668
  // User-pasted and shared secrets live in `app_secrets` (encrypted). The
651
669
  // settings UI / onboarding panels can write user, org, or workspace rows.
652
670
  // Deploy-level env vars are the fallback for unauthenticated/CLI/background
653
- // contexts where there's no user to scope by never the silent fallback
654
- // for an authenticated request, since on a multi-tenant deploy that would
655
- // silently identify every user as whoever set the deploy-level key
656
- // (KVesta Space, 2026-04).
671
+ // contexts where there's no user to scope by. Authenticated requests may also
672
+ // use app-provided LLM provider keys such as OPENAI_API_KEY or
673
+ // ANTHROPIC_API_KEY, but Builder identity keys keep the stricter scoped policy.
657
674
  // ---------------------------------------------------------------------------
658
675
  /**
659
676
  * Resolve a request-scoped secret. Reads from `app_secrets` first (current
@@ -734,7 +751,7 @@ export async function resolveSecret(key) {
734
751
  // Builder identity rather than just enabling a provider call.
735
752
  const envFallback = (isBuilderCredentialKey(key)
736
753
  ? canUseBuilderDeployCredentialFallbackForRequest()
737
- : canUseDeployCredentialFallbackForRequest())
754
+ : canUseDeployCredentialFallbackForRequest(key))
738
755
  ? process.env[key] || null
739
756
  : null;
740
757
  if (traceLookup) {
@@ -1 +1 @@
1
- {"version":3,"file":"credential-provider.js","sourceRoot":"","sources":["../../src/server/credential-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5E;;;;;;;;GAQG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAAa,EACb,KAAgC,EAChC,IAA+B;IAE/B,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;QACpD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACzC,kBAAkB,CAAS;IAC3B,iBAAiB,CAAU;IAC3B,WAAW,CAAU;IAE9B,YAAY,IAKX;QACC,KAAK,CACH,IAAI,CAAC,OAAO;YACV,gCAAgC,IAAI,CAAC,kBAAkB,yCAAyC,CACnG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAClD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACtC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;AACvC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iCAAiC;IAC/C,IAAI,CAAC,uBAAuB,EAAE;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,wCAAwC;IACtD,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,wBAAwB,EAAE;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,CAAC,uBAAuB,EAAE;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,uBAAuB,GAAG;IAC9B,qBAAqB;IACrB,oBAAoB;IACpB,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;IAClB,sBAAsB;IACtB,4BAA4B;IAC5B,2BAA2B;IAC3B,uBAAuB;IACvB,yBAAyB;CACjB,CAAC;AAEX,SAAS,sBAAsB,CAAC,GAAW;IACzC,OAAQ,uBAA6C,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,wBAAwB;IAC/B,MAAM,gBAAgB,GAAG,OAAO,CAC9B,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CACnC,CAAC;IACF,OAAO,CACL,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC;QAC5D,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE,CAAC;QACjE,gBAAgB,CACjB,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QACrC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;QAC7C,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;QAC5C,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC9C,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,wBAAwB;YACpC,OAAO,CAAC,GAAG,CAAC,iBAAiB;YAC7B,OAAO,CAAC,GAAG,CAAC,wBAAwB;YACpC,OAAO,CAAC,GAAG,CAAC,SAAS;YACrB,OAAO,CAAC,GAAG,CAAC,MAAM,CACnB,CACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAS,+CAA+C;IACtD,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,mBAAmB,GAAG,uBAAuB,EAAE,CAAC;IACtD,6EAA6E;IAC7E,6EAA6E;IAC7E,6CAA6C;IAC7C,MAAM,aAAa,GACjB,CAAC,mBAAmB;QACpB,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;IAEvE,IAAI,wBAAwB,EAAE,IAAI,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IAE/D,4EAA4E;IAC5E,OAAO,CAAC,mBAAmB,IAAI,eAAe,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,4BAA4B;IACnC,OAAO,aAAa,CAAC,IAAI,CACvB,OAAO,CAAC,GAAG,CAAC,qCAAqC;QAC/C,OAAO,CAAC,GAAG,CAAC,wBAAwB;QACpC,EAAE,CACL,CAAC;AACJ,CAAC;AAgCD,SAAS,2BAA2B,CAAC,KAAiC;IACpE,OAAO,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,0BAA0B,CACjC,KAAgC;IAEhC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAgC;IAClE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,aAAmE,EACnE,KAAmC,EACnC,OAAe;IAEf,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI,CAAU,CAAC;IAC/C,CAAC,CAAC,CACH,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAwB,MAAM,CAAC,CAAC;IACnD,OAAO;QACL,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,IAAI;QAClD,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,IAAI;QAChD,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,IAAI;QAC1C,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,IAAI;QAC5C,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,IAAI;QAC5C,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,IAAI;QACrD,iBAAiB,EAAE,GAAG,CAAC,GAAG,CAAC,4BAA4B,CAAC,IAAI,IAAI;QAChE,gBAAgB,EAAE,GAAG,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI,IAAI;QAC9D,YAAY,EAAE,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC1E,aAAa,EAAE,0BAA0B,CACvC,GAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC,CACnC;QACD,MAAM,EAAE,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK;KACpD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,GAAW;IAEX,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,yEAAyE;IACzE,sEAAsE;IACtE,MAAM,WAAW,GAAG,4BAA4B,EAAE,CAAC;IACnD,IAAI,cAAc,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAEhE,sEAAsE;QACtE,iEAAiE;QACjE,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC;YACrC,GAAG;YACH,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CACT,4BAA4B,GAAG,UAAU,KAAK,sBAAsB,CACrE,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACrD,CAAC;QAED,mEAAmE;QACnE,iEAAiE;QACjE,+DAA+D;QAC/D,6DAA6D;QAC7D,mEAAmE;QACnE,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,IAAI,KAAK,EAAE,CAAC;YACV,cAAc,GAAG,KAAK,CAAC;YACvB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC;gBACpC,GAAG;gBACH,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CACT,4BAA4B,GAAG,UAAU,KAAK,UAAU,KAAK,qBAAqB,CACnF,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YACnD,CAAC;YAED,iEAAiE;YACjE,qEAAqE;YACrE,yEAAyE;YACzE,cAAc,GAAG,WAAW,CAAC;YAC7B,MAAM,eAAe,GAAG,MAAM,aAAa,CAAC;gBAC1C,GAAG;gBACH,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,IAAI,eAAe,EAAE,CAAC;gBACpB,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CACT,4BAA4B,GAAG,UAAU,KAAK,UAAU,KAAK,2BAA2B,CACzF,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;YAC/D,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CACT,4BAA4B,GAAG,UAAU,KAAK,UAAU,KAAK,gCAAgC,CAC9F,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,gBAAgB,CAAC;YAClC,MAAM,mBAAmB,GAAG,MAAM,aAAa,CAAC;gBAC9C,GAAG;gBACH,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,QAAQ,KAAK,EAAE;aACzB,CAAC,CAAC;YACH,IAAI,mBAAmB,EAAE,CAAC;gBACxB,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CACT,4BAA4B,GAAG,UAAU,KAAK,gCAAgC,CAC/E,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;YACnE,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CACT,4BAA4B,GAAG,UAAU,KAAK,8CAA8C,CAC7F,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,4BAA4B,GAAG,UAAU,KAAK,UAAU,cAAc,UAAW,GAAa,EAAE,OAAO,IAAI,GAAG,EAAE,CACjH,CAAC;QACJ,CAAC;QACD,8CAA8C;IAChD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,+BAA+B;IAC5C,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,WAAW,GAAG,4BAA4B,EAAE,CAAC;IACnD,IAAI,cAAc,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,CAAC,KAAiC,EAAE,OAAe,EAAE,EAAE;YACxE,IAAI,CAAC,WAAW;gBAAE,OAAO;YACzB,OAAO,CAAC,GAAG,CACT,8BAA8B,KAAK,CAAC,MAAM,YAAY,OAAO,UAAU,KAAK,aAAa,2BAA2B,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CACtM,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,MAAM,0BAA0B,CAChD,aAAa,EACb,MAAM,EACN,KAAK,CACN,CAAC;QACF,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,2BAA2B,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAE7D,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,IAAI,KAAK,EAAE,CAAC;YACV,cAAc,GAAG,KAAK,CAAC;YACvB,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAC/C,aAAa,EACb,KAAK,EACL,KAAK,CACN,CAAC;YACF,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC5B,IAAI,2BAA2B,CAAC,QAAQ,CAAC;gBAAE,OAAO,QAAQ,CAAC;YAE3D,cAAc,GAAG,WAAW,CAAC;YAC7B,MAAM,cAAc,GAAG,MAAM,0BAA0B,CACrD,aAAa,EACb,WAAW,EACX,KAAK,CACN,CAAC;YACF,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YAClC,IAAI,2BAA2B,CAAC,cAAc,CAAC;gBAAE,OAAO,cAAc,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,gBAAgB,CAAC;YAClC,MAAM,OAAO,GAAG,QAAQ,KAAK,EAAE,CAAC;YAChC,MAAM,cAAc,GAAG,MAAM,0BAA0B,CACrD,aAAa,EACb,WAAW,EACX,OAAO,CACR,CAAC;YACF,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YACpC,IAAI,2BAA2B,CAAC,cAAc,CAAC;gBAAE,OAAO,cAAc,CAAC;QACzE,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,8BAA8B,KAAK,UAAU,cAAc,sBAAuB,GAAa,EAAE,OAAO,IAAI,GAAG,EAAE,CAClH,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,GAAW;IAEX,MAAM,MAAM,GAAG,MAAM,8BAA8B,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IAChC,IAAI,CAAC,+CAA+C,EAAE;QAAE,OAAO,IAAI,CAAC;IACpE,OAAO,uBAAuB,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,OAAO,wBAAwB,CAAC,qBAAqB,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,MAAM,GAAG,GAAG,MAAM,wBAAwB,EAAE,CAAC;IAC7C,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B;IAC/C,OAAO,CAAC,CAAC,CAAC,MAAM,wBAAwB,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mCAAmC;IACvD,MAAM,KAAK,GAAG,MAAM,yBAAyB,EAAE,CAAC;IAChD,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B;IAClD,MAAM,MAAM,GAAG,MAAM,+BAA+B,EAAE,CAAC;IACvD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IACjC,OAAO,+CAA+C,EAAE;QACtD,OAAO,CAAC,GAAG,CAAC,mBAAmB;QAC/B,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAY7C,MAAM,MAAM,GAAG,MAAM,+BAA+B,EAAE,CAAC;IACvD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,EACJ,UAAU,EACV,SAAS,EACT,MAAM,EACN,OAAO,EACP,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,aAAa,GACd,GAAG,MAAM,CAAC;QACX,OAAO;YACL,UAAU;YACV,SAAS;YACT,MAAM;YACN,OAAO;YACP,OAAO;YACP,YAAY;YACZ,iBAAiB;YACjB,gBAAgB;YAChB,YAAY;YACZ,aAAa;SACd,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,+CAA+C,EAAE;QAClE,CAAC,CAAC,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,IAAI,IAAI,CAAC;QAC1D,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,SAAS,GAAG,+CAA+C,EAAE;QACjE,CAAC,CAAC,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC;QACzD,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,MAAM,GAAG,+CAA+C,EAAE;QAC9D,CAAC,CAAC,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC;QACtD,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,OAAO,GAAG,+CAA+C,EAAE;QAC/D,CAAC,CAAC,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC;QACvD,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,OAAO,GAAG,+CAA+C,EAAE;QAC/D,CAAC,CAAC,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC;QACvD,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,YAAY,GAAG,+CAA+C,EAAE;QACpE,CAAC,CAAC,CAAC,uBAAuB,CAAC,sBAAsB,CAAC,IAAI,IAAI,CAAC;QAC3D,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,iBAAiB,GAAG,+CAA+C,EAAE;QACzE,CAAC,CAAC,CAAC,uBAAuB,CAAC,4BAA4B,CAAC,IAAI,IAAI,CAAC;QACjE,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,gBAAgB,GAAG,+CAA+C,EAAE;QACxE,CAAC,CAAC,CAAC,uBAAuB,CAAC,2BAA2B,CAAC,IAAI,IAAI,CAAC;QAChE,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,YAAY,GAAG,+CAA+C,EAAE;QACpE,CAAC,CAAC,0BAA0B,CACxB,uBAAuB,CAAC,uBAAuB,CAAC,CACjD;QACH,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,aAAa,GAAG,+CAA+C,EAAE;QACrE,CAAC,CAAC,0BAA0B,CACxB,uBAAuB,CAAC,yBAAyB,CAAC,CACnD;QACH,CAAC,CAAC,IAAI,CAAC;IACT,OAAO;QACL,UAAU;QACV,SAAS;QACT,MAAM;QACN,OAAO;QACP,OAAO;QACP,YAAY;QACZ,iBAAiB;QACjB,gBAAgB;QAChB,YAAY;QACZ,aAAa;KACd,CAAC;AACJ,CAAC;AAED,MAAM,mCAAmC,GAAG,uBAAuB,CAAC;AAYpE,MAAM,UAAU,4BAA4B,CAC1C,UAA0B,EAC1B,SAAyB;IAEzB,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,UAAU,CAAC;SAClB,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,SAAS,CAAC;SACjB,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,4BAA4B,CAAC,WAAmB;IACvD,OAAO,GAAG,mCAAmC,GAAG,WAAW,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,KAAK,GAGD,EAAE;IAEN,MAAM,WAAW,GAAG,4BAA4B,CAC9C,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,CAChB,CAAC;IACF,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,4BAA4B,CAAC,WAAW,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO;YACL,WAAW;YACX,OAAO,EACL,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO;gBAC5C,CAAC,CAAC,GAAG,CAAC,OAAO;gBACb,CAAC,CAAC,mEAAmE;YACzE,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAC/D,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACzD,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACpD,UAAU,EACR,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YACjE,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SAC7D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kCAAkC,CAAC,OAIxD;IACC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,yBAAyB,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,4BAA4B,CAC9C,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,CAChB,CAAC;QACF,IAAI,CAAC,WAAW;YAAE,OAAO;QACzB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC5D,MAAM,UAAU,CAAC,4BAA4B,CAAC,WAAW,CAAC,EAAE;YAC1D,WAAW;YACX,OAAO,EACL,OAAO,EAAE,OAAO;gBAChB,mEAAmE;YACrE,GAAG,CAAC,OAAO,OAAO,EAAE,MAAM,KAAK,QAAQ,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YACtE,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;YAC5C,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,UAAU,EAAE,mBAAmB,EAAE,IAAI,IAAI;YACzC,KAAK,EAAE,eAAe,EAAE,IAAI,IAAI;SACjC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iCAAiC,CAAC,KAGvD;IACC,MAAM,WAAW,GAAG,4BAA4B,CAC9C,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,CAChB,CAAC;IACF,IAAI,CAAC,WAAW;QAAE,OAAO;IACzB,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC/D,MAAM,aAAa,CAAC,4BAA4B,CAAC,WAAW,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAAa,EACb,KAWC,EACD,OAAyD;IAEzD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,uKAAuK,CACxK,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,GACvC,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,2BAA2B,CACxC,KAAK,EACL,OAAO,EAAE,KAAK,IAAI,IAAI,EACtB,OAAO,EAAE,IAAI,IAAI,IAAI,CACtB,CAAC;IAEF,yEAAyE;IACzE,8CAA8C;IAC9C,MAAM,QAAQ,GAA4B,uBAAuB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5E,eAAe,CAAC;QACd,GAAG;QACH,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CACnB,CAAC;IACF,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QAC3B,KAAK,MAAM,GAAG,IAAI,uBAAuB,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CACX,eAAe,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CACxE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE5B,MAAM,OAAO,GAA0C;QACrD,EAAE,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,UAAU,EAAE;QACjD,EAAE,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE;KAChD,CAAC;IACF,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,EAAE,4BAA4B;YACjC,KAAK,EAAE,KAAK,CAAC,iBAAiB;SAC/B,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,EAAE,2BAA2B;YAChC,KAAK,EAAE,KAAK,CAAC,gBAAgB;SAC9B,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,EAAE,uBAAuB;YAC5B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,EAAE,yBAAyB;YAC9B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;SACnC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC7B,cAAc,CAAC;QACb,GAAG;QACH,KAAK;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CACH,CACF,CAAC;IACF,MAAM,iCAAiC,CAAC;QACtC,UAAU;QACV,SAAS;KACV,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAa,EACb,OAAyD;IAEzD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,2BAA2B,CACxC,KAAK,EACL,OAAO,EAAE,KAAK,IAAI,IAAI,EACtB,OAAO,EAAE,IAAI,IAAI,IAAI,CACtB,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CACf,uBAAuB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAClC,eAAe,CAAC;QACd,GAAG;QACH,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CACnB,CACF,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,2CAA2C;AAC3C,EAAE;AACF,0EAA0E;AAC1E,wEAAwE;AACxE,0EAA0E;AAC1E,4EAA4E;AAC5E,yEAAyE;AACzE,0EAA0E;AAC1E,mEAAmE;AACnE,2BAA2B;AAC3B,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,MAAM,WAAW,GAAG,4BAA4B,EAAE,CAAC;IACnD,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC;YACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAChE,2BAA2B;YAC3B,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC;gBACrC,GAAG;gBACH,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,IAAI,UAAU,EAAE,KAAK,EAAE,CAAC;gBACtB,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CACT,wBAAwB,GAAG,UAAU,KAAK,sBAAsB,CACjE,CAAC;gBACJ,CAAC;gBACD,OAAO,UAAU,CAAC,KAAK,CAAC;YAC1B,CAAC;YAED,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;YAChC,IAAI,KAAK,EAAE,CAAC;gBACV,kEAAkE;gBAClE,2CAA2C;gBAC3C,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC;oBACpC,GAAG;oBACH,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;gBACH,IAAI,SAAS,EAAE,KAAK,EAAE,CAAC;oBACrB,IAAI,WAAW,EAAE,CAAC;wBAChB,OAAO,CAAC,GAAG,CACT,wBAAwB,GAAG,UAAU,KAAK,UAAU,KAAK,qBAAqB,CAC/E,CAAC;oBACJ,CAAC;oBACD,OAAO,SAAS,CAAC,KAAK,CAAC;gBACzB,CAAC;gBAED,6DAA6D;gBAC7D,mEAAmE;gBACnE,4BAA4B;gBAC5B,MAAM,eAAe,GAAG,MAAM,aAAa,CAAC;oBAC1C,GAAG;oBACH,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;gBACH,IAAI,eAAe,EAAE,KAAK,EAAE,CAAC;oBAC3B,IAAI,WAAW,EAAE,CAAC;wBAChB,OAAO,CAAC,GAAG,CACT,wBAAwB,GAAG,UAAU,KAAK,UAAU,KAAK,2BAA2B,CACrF,CAAC;oBACJ,CAAC;oBACD,OAAO,eAAe,CAAC,KAAK,CAAC;gBAC/B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,mBAAmB,GAAG,MAAM,aAAa,CAAC;oBAC9C,GAAG;oBACH,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,QAAQ,KAAK,EAAE;iBACzB,CAAC,CAAC;gBACH,IAAI,mBAAmB,EAAE,KAAK,EAAE,CAAC;oBAC/B,IAAI,WAAW,EAAE,CAAC;wBAChB,OAAO,CAAC,GAAG,CACT,wBAAwB,GAAG,UAAU,KAAK,gCAAgC,CAC3E,CAAC;oBACJ,CAAC;oBACD,OAAO,mBAAmB,CAAC,KAAK,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CACT,wBAAwB,GAAG,UAAU,KAAK,oBAAqB,GAAa,EAAE,OAAO,IAAI,GAAG,EAAE,CAC/F,CAAC;YACJ,CAAC;YACD,8CAA8C;QAChD,CAAC;QACD,4EAA4E;QAC5E,6EAA6E;QAC7E,4EAA4E;QAC5E,8DAA8D;QAC9D,MAAM,WAAW,GAAG,CAClB,sBAAsB,CAAC,GAAG,CAAC;YACzB,CAAC,CAAC,+CAA+C,EAAE;YACnD,CAAC,CAAC,wCAAwC,EAAE,CAC/C;YACC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI;YAC1B,CAAC,CAAC,IAAI,CAAC;QACT,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,wBAAwB,GAAG,UAAU,KAAK,UAAU,eAAe,EAAE,IAAI,QAAQ,UAAU,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,WAAW,EAAE,CACxJ,CAAC;QACJ,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,uEAAuE;IACvE,mDAAmD;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACvC,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,wBAAwB,GAAG,yCAAyC,CAAC,CAAC,KAAK,EAAE,CAC9E,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,uEAAuE;AACvE,iEAAiE;AACjE,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAC3C,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,qBAAqB;IACnC,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAChC,OAAO,CAAC,GAAG,CAAC,QAAQ;QACpB,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC5B,wBAAwB,CACzB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,wBAAwB;QACpC,gDAAgD,CACjD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gCAAgC;IAC9C,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,iCAAiC;QAC7C,+CAA+C,CAChD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,2BAA2B;QACvC,mDAAmD,CACpD,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,oBAAoB;IAClC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC5C,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACtC,CAAC","sourcesContent":["/**\n * Credential provider abstraction.\n *\n * Every feature that needs an external credential (Anthropic API key,\n * Google OAuth tokens, OpenAI key, Slack bot token, etc.) should go through\n * one of the resolve*() helpers here instead of reading `process.env`\n * directly. That way the same feature can work in three modes:\n *\n * 1. User set their own key in .env → use it directly\n * 2. User connected Builder via `/cli-auth` → route through Builder proxy\n * 3. Neither → throw FeatureNotConfigured\n *\n * Templates catch FeatureNotConfigured and show a \"Connect Builder (1 click) /\n * set up your own key (guide)\" card.\n *\n * Today these helpers are used by the Builder-hosted LLM gateway, and the\n * shape is meant to grow to cover future managed credential integrations\n * (e.g. additional Builder-hosted services) without rewrites.\n */\n\nimport { createHash } from \"node:crypto\";\n\nimport { isLocalDatabase } from \"../db/client.js\";\nimport { getRequestUserEmail, getRequestOrgId } from \"./request-context.js\";\n\n/**\n * Decide which `app_secrets` scope a Builder/credential write should use.\n *\n * Org scope (\"everyone in this org sees these credentials\") wins when the\n * connecting user is an owner or admin of an active org — the write\n * privileges shared infra. A plain member or a user without an active\n * org falls through to per-user scope so a teammate can't silently\n * overwrite the org-shared connection.\n */\nexport function resolveCredentialWriteScope(\n email: string,\n orgId: string | null | undefined,\n role: string | null | undefined,\n): { scope: \"user\" | \"org\"; scopeId: string } {\n if (orgId && (role === \"owner\" || role === \"admin\")) {\n return { scope: \"org\", scopeId: orgId };\n }\n return { scope: \"user\", scopeId: email };\n}\n\nexport class FeatureNotConfiguredError extends Error {\n readonly requiredCredential: string;\n readonly builderConnectUrl?: string;\n readonly byokDocsUrl?: string;\n\n constructor(opts: {\n requiredCredential: string;\n message?: string;\n builderConnectUrl?: string;\n byokDocsUrl?: string;\n }) {\n super(\n opts.message ??\n `Feature requires credential \"${opts.requiredCredential}\". Connect Builder or set your own key.`,\n );\n this.name = \"FeatureNotConfiguredError\";\n this.requiredCredential = opts.requiredCredential;\n this.builderConnectUrl = opts.builderConnectUrl;\n this.byokDocsUrl = opts.byokDocsUrl;\n }\n}\n\n/**\n * Deployment-level credential fallback for single-tenant/local operation.\n * Multi-tenant call sites must gate this explicitly before calling.\n */\nexport function readDeployCredentialEnv(key: string): string | undefined {\n return process.env[key] || undefined;\n}\n\n/**\n * Deployment-level credentials are safe as a runtime fallback only in local /\n * single-tenant contexts. In hosted production with a shared database, every\n * signed-in user needs their own user/org/workspace credential so one deploy\n * key does not silently power another tenant's chat.\n *\n * @deprecated Use `canUseDeployCredentialFallbackForRequest()` for generic\n * provider secrets. This stricter helper remains for legacy call sites with\n * identity-bearing deploy credentials.\n */\nexport function isDeployCredentialFallbackAllowed(): boolean {\n if (!isProductionLikeRuntime()) return true;\n return isLocalDatabase();\n}\n\nexport function canUseDeployCredentialFallbackForRequest(): boolean {\n const email = getRequestUserEmail();\n if (!email) return true;\n if (isHostedWorkspaceRuntime()) return false;\n if (!isProductionLikeRuntime()) return true;\n return isLocalDatabase();\n}\n\nconst BUILDER_CREDENTIAL_KEYS = [\n \"BUILDER_PRIVATE_KEY\",\n \"BUILDER_PUBLIC_KEY\",\n \"BUILDER_USER_ID\",\n \"BUILDER_ORG_NAME\",\n \"BUILDER_ORG_KIND\",\n \"BUILDER_SUBSCRIPTION\",\n \"BUILDER_SUBSCRIPTION_LEVEL\",\n \"BUILDER_SUBSCRIPTION_NAME\",\n \"BUILDER_IS_ENTERPRISE\",\n \"BUILDER_IS_FREE_ACCOUNT\",\n] as const;\n\nfunction isBuilderCredentialKey(key: string): boolean {\n return (BUILDER_CREDENTIAL_KEYS as readonly string[]).includes(key);\n}\n\nfunction isHostedWorkspaceRuntime(): boolean {\n const hasFusionPreview = Boolean(\n process.env.FUSION_ENVIRONMENT ||\n process.env.FUSION_ENV_ORIGIN ||\n process.env.VITE_FUSION_ENV_ORIGIN,\n );\n return (\n /^(1|true)$/i.test(process.env.AGENT_NATIVE_WORKSPACE ?? \"\") ||\n /^(1|true)$/i.test(process.env.VITE_AGENT_NATIVE_WORKSPACE ?? \"\") ||\n hasFusionPreview\n );\n}\n\nfunction isProductionLikeRuntime(): boolean {\n return (\n process.env.NODE_ENV === \"production\" ||\n /^(1|true)$/i.test(process.env.NETLIFY ?? \"\") ||\n /^(1|true)$/i.test(process.env.VERCEL ?? \"\") ||\n /^(1|true)$/i.test(process.env.CF_PAGES ?? \"\") ||\n Boolean(\n process.env.AWS_LAMBDA_FUNCTION_NAME ||\n process.env.AWS_EXECUTION_ENV ||\n process.env.FUNCTIONS_WORKER_RUNTIME ||\n process.env.K_SERVICE ||\n process.env.RENDER,\n )\n );\n}\n\n/**\n * Whether deployment-level Builder env keys may back the current request.\n *\n * This is intentionally self-contained rather than delegating to\n * `canUseDeployCredentialFallbackForRequest`. That generic helper blocks the\n * deploy fallback for any signed-in user in a hosted workspace runtime, so the\n * Builder dogfooding escape hatch must apply its own hosted-workspace exception\n * here instead of inheriting the generic helper's stricter (and hatch-unaware)\n * decision. Reading the env once into locals keeps the rules legible.\n *\n * Rules (all evaluated against the live request/runtime, not a build-time value):\n * - No signed-in user → safe to use the deploy env (nobody to mis-identify).\n * - Hosted workspace + signed-in user → deploy-level Builder keys would\n * impersonate that user, so block them — UNLESS a developer has explicitly\n * opted into the local dogfooding escape hatch (non-prod only). Default OFF;\n * hosted/shared production deployments are never affected.\n * - Otherwise → allowed in non-prod, or on a local/single-tenant database.\n */\nfunction canUseBuilderDeployCredentialFallbackForRequest(): boolean {\n const email = getRequestUserEmail();\n if (!email) return true;\n\n const isProductionRuntime = isProductionLikeRuntime();\n // Local dogfooding escape hatch: lets the env / root-`.env` Builder key back\n // a signed-in user so running the app locally doesn't require completing the\n // Builder connect flow first. Non-prod only.\n const localDevOptIn =\n !isProductionRuntime &&\n /^(1|true)$/i.test(process.env.AGENT_NATIVE_LOCAL_BUILDER_ENV ?? \"\");\n\n if (isHostedWorkspaceRuntime() && !localDevOptIn) return false;\n\n // Deploy fallback is safe in non-prod or on a local/single-tenant database.\n return !isProductionRuntime || isLocalDatabase();\n}\n\nfunction shouldTraceCredentialResolve(): boolean {\n return /^(1|true)$/i.test(\n process.env.AGENT_NATIVE_DEBUG_CREDENTIAL_RESOLVE ??\n process.env.DEBUG_CREDENTIAL_RESOLVE ??\n \"\",\n );\n}\n\n// ---------------------------------------------------------------------------\n// Builder credential resolution:\n//\n// 1. **Request-scoped credentials.** A signed-in user can connect Builder\n// through the CLI-auth flow. Owner/admin connections land at org scope;\n// member/no-org connections land at user scope.\n//\n// 2. **Deployment fallback.** BUILDER_PRIVATE_KEY in env still makes local\n// and single-tenant deploys work out of the box, but it no longer blocks\n// per-user connect. Request-scoped credentials win whenever present.\n//\n// To run multi-tenant SaaS: prefer leaving BUILDER_PRIVATE_KEY unset unless a\n// shared fallback identity is intentional.\n// ---------------------------------------------------------------------------\n\ntype BuilderCredentialSource = \"user\" | \"org\" | \"workspace\" | \"env\";\ninterface BuilderResolvedCredentials {\n privateKey: string | null;\n publicKey: string | null;\n userId: string | null;\n orgName: string | null;\n orgKind: string | null;\n subscription: string | null;\n subscriptionLevel: string | null;\n subscriptionName: string | null;\n isEnterprise: boolean | null;\n isFreeAccount: boolean | null;\n source: Exclude<BuilderCredentialSource, \"env\">;\n}\n\nfunction isCompleteBuilderConnection(creds: BuilderResolvedCredentials) {\n return Boolean(creds.privateKey && creds.publicKey);\n}\n\nfunction readOptionalBuilderBoolean(\n value: string | null | undefined,\n): boolean | null {\n if (value == null || value === \"\") return null;\n return /^(1|true)$/i.test(value);\n}\n\nexport function isBuilderPrivateKey(value: string | null | undefined): boolean {\n return typeof value === \"string\" && value.trim().startsWith(\"bpk-\");\n}\n\nasync function readBuilderCredentialScope(\n readAppSecret: typeof import(\"../secrets/storage.js\").readAppSecret,\n scope: \"user\" | \"org\" | \"workspace\",\n scopeId: string,\n): Promise<BuilderResolvedCredentials> {\n const values = await Promise.all(\n BUILDER_CREDENTIAL_KEYS.map(async (key) => {\n const secret = await readAppSecret({ key, scope, scopeId });\n return [key, secret?.value ?? null] as const;\n }),\n );\n const map = new Map<string, string | null>(values);\n return {\n privateKey: map.get(\"BUILDER_PRIVATE_KEY\") ?? null,\n publicKey: map.get(\"BUILDER_PUBLIC_KEY\") ?? null,\n userId: map.get(\"BUILDER_USER_ID\") ?? null,\n orgName: map.get(\"BUILDER_ORG_NAME\") ?? null,\n orgKind: map.get(\"BUILDER_ORG_KIND\") ?? null,\n subscription: map.get(\"BUILDER_SUBSCRIPTION\") ?? null,\n subscriptionLevel: map.get(\"BUILDER_SUBSCRIPTION_LEVEL\") ?? null,\n subscriptionName: map.get(\"BUILDER_SUBSCRIPTION_NAME\") ?? null,\n isEnterprise: readOptionalBuilderBoolean(map.get(\"BUILDER_IS_ENTERPRISE\")),\n isFreeAccount: readOptionalBuilderBoolean(\n map.get(\"BUILDER_IS_FREE_ACCOUNT\"),\n ),\n source: scope === \"workspace\" ? \"workspace\" : scope,\n };\n}\n\nasync function resolveScopedBuilderCredential(\n key: string,\n): Promise<{ value: string; source: \"user\" | \"org\" | \"workspace\" } | null> {\n const email = getRequestUserEmail();\n if (!email) return null;\n\n // Trace only when explicitly requested. These diagnostics are useful for\n // support, but they include account identifiers and run on hot paths.\n const traceLookup = shouldTraceCredentialResolve();\n let scopeAttempted = \"user\";\n try {\n const { readAppSecret } = await import(\"../secrets/storage.js\");\n\n // 1. Per-user override: a user can paste their own key in settings to\n // overrule the org-shared one (handy for a personal sandbox).\n const userSecret = await readAppSecret({\n key,\n scope: \"user\",\n scopeId: email,\n });\n if (userSecret) {\n if (traceLookup) {\n console.log(\n `[builder-credential] key=${key} email=${email} scope=user hit=true`,\n );\n }\n return { value: userSecret.value, source: \"user\" };\n }\n\n // 2. Per-org shared credential: when one teammate connects Builder\n // as an owner/admin we write the OAuth result at org scope so\n // every member of that org gets the AI chat working without\n // re-running the connect flow. Resolution falls back here\n // silently — the caller never has to know which scope answered.\n const orgId = getRequestOrgId();\n if (orgId) {\n scopeAttempted = \"org\";\n const orgSecret = await readAppSecret({\n key,\n scope: \"org\",\n scopeId: orgId,\n });\n if (orgSecret) {\n if (traceLookup) {\n console.log(\n `[builder-credential] key=${key} email=${email} orgId=${orgId} scope=org hit=true`,\n );\n }\n return { value: orgSecret.value, source: \"org\" };\n }\n\n // Older setup flows wrote shared credentials at workspace scope.\n // Keep reading those rows so status UIs and runtime resolution agree\n // for users who connected before org-scoped Builder credentials existed.\n scopeAttempted = \"workspace\";\n const workspaceSecret = await readAppSecret({\n key,\n scope: \"workspace\",\n scopeId: orgId,\n });\n if (workspaceSecret) {\n if (traceLookup) {\n console.log(\n `[builder-credential] key=${key} email=${email} orgId=${orgId} scope=workspace hit=true`,\n );\n }\n return { value: workspaceSecret.value, source: \"workspace\" };\n }\n if (traceLookup) {\n console.log(\n `[builder-credential] key=${key} email=${email} orgId=${orgId} miss tried=user,org,workspace`,\n );\n }\n } else {\n scopeAttempted = \"workspace-solo\";\n const soloWorkspaceSecret = await readAppSecret({\n key,\n scope: \"workspace\",\n scopeId: `solo:${email}`,\n });\n if (soloWorkspaceSecret) {\n if (traceLookup) {\n console.log(\n `[builder-credential] key=${key} email=${email} scope=workspace-solo hit=true`,\n );\n }\n return { value: soloWorkspaceSecret.value, source: \"workspace\" };\n }\n if (traceLookup) {\n console.log(\n `[builder-credential] key=${key} email=${email} orgId=(none) miss tried=user,workspace-solo`,\n );\n }\n }\n } catch (err) {\n if (traceLookup) {\n console.log(\n `[builder-credential] key=${key} email=${email} scope=${scopeAttempted} error=${(err as Error)?.message ?? err}`,\n );\n }\n // Secrets table not ready — treat as missing.\n }\n return null;\n}\n\nasync function resolveScopedBuilderCredentials(): Promise<BuilderResolvedCredentials | null> {\n const email = getRequestUserEmail();\n if (!email) return null;\n\n const traceLookup = shouldTraceCredentialResolve();\n let scopeAttempted = \"user\";\n try {\n const { readAppSecret } = await import(\"../secrets/storage.js\");\n const traceScope = (creds: BuilderResolvedCredentials, scopeId: string) => {\n if (!traceLookup) return;\n console.log(\n `[builder-credential] scope=${creds.source} scopeId=${scopeId} email=${email} complete=${isCompleteBuilderConnection(creds)} private=${Boolean(creds.privateKey)} public=${Boolean(creds.publicKey)}`,\n );\n };\n\n const userCreds = await readBuilderCredentialScope(\n readAppSecret,\n \"user\",\n email,\n );\n traceScope(userCreds, email);\n if (isCompleteBuilderConnection(userCreds)) return userCreds;\n\n const orgId = getRequestOrgId();\n if (orgId) {\n scopeAttempted = \"org\";\n const orgCreds = await readBuilderCredentialScope(\n readAppSecret,\n \"org\",\n orgId,\n );\n traceScope(orgCreds, orgId);\n if (isCompleteBuilderConnection(orgCreds)) return orgCreds;\n\n scopeAttempted = \"workspace\";\n const workspaceCreds = await readBuilderCredentialScope(\n readAppSecret,\n \"workspace\",\n orgId,\n );\n traceScope(workspaceCreds, orgId);\n if (isCompleteBuilderConnection(workspaceCreds)) return workspaceCreds;\n } else {\n scopeAttempted = \"workspace-solo\";\n const scopeId = `solo:${email}`;\n const workspaceCreds = await readBuilderCredentialScope(\n readAppSecret,\n \"workspace\",\n scopeId,\n );\n traceScope(workspaceCreds, scopeId);\n if (isCompleteBuilderConnection(workspaceCreds)) return workspaceCreds;\n }\n } catch (err) {\n if (traceLookup) {\n console.log(\n `[builder-credential] email=${email} scope=${scopeAttempted} credentials error=${(err as Error)?.message ?? err}`,\n );\n }\n }\n return null;\n}\n\n/**\n * Resolve a Builder credential for the current request. User/org credentials\n * win; deployment env is only a fallback. This lets local/root .env keys keep\n * a template working while still allowing users to connect their own Builder\n * account from Settings or onboarding.\n */\nexport async function resolveBuilderCredential(\n key: string,\n): Promise<string | null> {\n const scoped = await resolveScopedBuilderCredential(key);\n if (scoped) return scoped.value;\n if (!canUseBuilderDeployCredentialFallbackForRequest()) return null;\n return readDeployCredentialEnv(key) ?? null;\n}\n\n/**\n * True when `BUILDER_PRIVATE_KEY` is set at the deployment level. This means\n * a deploy-level fallback exists; it does not prevent per-user connect.\n */\nexport function isBuilderEnvManaged(): boolean {\n return !!process.env.BUILDER_PRIVATE_KEY;\n}\n\n/**\n * Resolve the Builder private key for the current request. User/org OAuth\n * credentials win; deploy-level `BUILDER_PRIVATE_KEY` is the fallback.\n */\nexport async function resolveBuilderPrivateKey(): Promise<string | null> {\n return resolveBuilderCredential(\"BUILDER_PRIVATE_KEY\");\n}\n\n/**\n * Resolve the current user's Builder auth header.\n * Returns `\"Bearer <key>\"` or null.\n */\nexport async function resolveBuilderAuthHeader(): Promise<string | null> {\n const key = await resolveBuilderPrivateKey();\n return key ? `Bearer ${key}` : null;\n}\n\n/**\n * Check whether the current user has a Builder private key configured\n * (per-user or deployment-level).\n */\nexport async function resolveHasBuilderPrivateKey(): Promise<boolean> {\n return !!(await resolveBuilderPrivateKey());\n}\n\n/**\n * Check whether the current request has the complete Builder credential bundle\n * needed for Builder-backed assistant/image-generation calls.\n */\nexport async function resolveHasCompleteBuilderConnection(): Promise<boolean> {\n const creds = await resolveBuilderCredentials();\n return !!(creds.privateKey && creds.publicKey);\n}\n\n/**\n * Resolve where the effective Builder assistant connection came from. This\n * intentionally requires a complete private+public key pair from one scope so\n * status UIs don't report a mixed user/org credential set as connected.\n */\nexport async function resolveBuilderCredentialSource(): Promise<BuilderCredentialSource | null> {\n const scoped = await resolveScopedBuilderCredentials();\n if (scoped) return scoped.source;\n return canUseBuilderDeployCredentialFallbackForRequest() &&\n process.env.BUILDER_PRIVATE_KEY\n ? \"env\"\n : null;\n}\n\n/**\n * Resolve the Builder assistant credential bundle from one complete scope.\n * A partial user row is treated as a miss so the org-shared connection can\n * still power the assistant for teammates.\n */\nexport async function resolveBuilderCredentials(): Promise<{\n privateKey: string | null;\n publicKey: string | null;\n userId: string | null;\n orgName: string | null;\n orgKind: string | null;\n subscription: string | null;\n subscriptionLevel: string | null;\n subscriptionName: string | null;\n isEnterprise: boolean | null;\n isFreeAccount: boolean | null;\n}> {\n const scoped = await resolveScopedBuilderCredentials();\n if (scoped) {\n const {\n privateKey,\n publicKey,\n userId,\n orgName,\n orgKind,\n subscription,\n subscriptionLevel,\n subscriptionName,\n isEnterprise,\n isFreeAccount,\n } = scoped;\n return {\n privateKey,\n publicKey,\n userId,\n orgName,\n orgKind,\n subscription,\n subscriptionLevel,\n subscriptionName,\n isEnterprise,\n isFreeAccount,\n };\n }\n const privateKey = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_PRIVATE_KEY\") ?? null)\n : null;\n const publicKey = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_PUBLIC_KEY\") ?? null)\n : null;\n const userId = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_USER_ID\") ?? null)\n : null;\n const orgName = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_ORG_NAME\") ?? null)\n : null;\n const orgKind = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_ORG_KIND\") ?? null)\n : null;\n const subscription = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_SUBSCRIPTION\") ?? null)\n : null;\n const subscriptionLevel = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_SUBSCRIPTION_LEVEL\") ?? null)\n : null;\n const subscriptionName = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_SUBSCRIPTION_NAME\") ?? null)\n : null;\n const isEnterprise = canUseBuilderDeployCredentialFallbackForRequest()\n ? readOptionalBuilderBoolean(\n readDeployCredentialEnv(\"BUILDER_IS_ENTERPRISE\"),\n )\n : null;\n const isFreeAccount = canUseBuilderDeployCredentialFallbackForRequest()\n ? readOptionalBuilderBoolean(\n readDeployCredentialEnv(\"BUILDER_IS_FREE_ACCOUNT\"),\n )\n : null;\n return {\n privateKey,\n publicKey,\n userId,\n orgName,\n orgKind,\n subscription,\n subscriptionLevel,\n subscriptionName,\n isEnterprise,\n isFreeAccount,\n };\n}\n\nconst BUILDER_AUTH_FAILURE_SETTING_PREFIX = \"builder-auth-failure:\";\n\nexport interface BuilderCredentialAuthFailure {\n fingerprint: string;\n message: string;\n status?: number;\n code?: string;\n at: number;\n ownerEmail?: string | null;\n orgId?: string | null;\n}\n\nexport function builderCredentialFingerprint(\n privateKey?: string | null,\n publicKey?: string | null,\n): string | null {\n if (!privateKey || !publicKey) return null;\n return createHash(\"sha256\")\n .update(privateKey)\n .update(\"\\0\")\n .update(publicKey)\n .digest(\"hex\")\n .slice(0, 24);\n}\n\nfunction builderAuthFailureSettingKey(fingerprint: string): string {\n return `${BUILDER_AUTH_FAILURE_SETTING_PREFIX}${fingerprint}`;\n}\n\nexport async function getBuilderCredentialAuthFailure(\n creds: {\n privateKey?: string | null;\n publicKey?: string | null;\n } = {},\n): Promise<BuilderCredentialAuthFailure | null> {\n const fingerprint = builderCredentialFingerprint(\n creds.privateKey,\n creds.publicKey,\n );\n if (!fingerprint) return null;\n try {\n const { getSetting } = await import(\"../settings/store.js\");\n const row = await getSetting(builderAuthFailureSettingKey(fingerprint));\n if (!row) return null;\n return {\n fingerprint,\n message:\n typeof row.message === \"string\" && row.message\n ? row.message\n : \"Builder rejected the connected credentials. Reconnect Builder.io.\",\n status: typeof row.status === \"number\" ? row.status : undefined,\n code: typeof row.code === \"string\" ? row.code : undefined,\n at: typeof row.at === \"number\" ? row.at : Date.now(),\n ownerEmail:\n typeof row.ownerEmail === \"string\" ? row.ownerEmail : undefined,\n orgId: typeof row.orgId === \"string\" ? row.orgId : undefined,\n };\n } catch {\n return null;\n }\n}\n\nexport async function recordBuilderCredentialAuthFailure(details?: {\n status?: number;\n code?: string;\n message?: string;\n}): Promise<void> {\n try {\n const creds = await resolveBuilderCredentials();\n const fingerprint = builderCredentialFingerprint(\n creds.privateKey,\n creds.publicKey,\n );\n if (!fingerprint) return;\n const { putSetting } = await import(\"../settings/store.js\");\n await putSetting(builderAuthFailureSettingKey(fingerprint), {\n fingerprint,\n message:\n details?.message ||\n \"Builder rejected the connected credentials. Reconnect Builder.io.\",\n ...(typeof details?.status === \"number\" && { status: details.status }),\n ...(details?.code && { code: details.code }),\n at: Date.now(),\n ownerEmail: getRequestUserEmail() ?? null,\n orgId: getRequestOrgId() ?? null,\n });\n } catch {\n // Best-effort marker only; the chat error is still returned to the user.\n }\n}\n\nexport async function clearBuilderCredentialAuthFailure(creds: {\n privateKey?: string | null;\n publicKey?: string | null;\n}): Promise<void> {\n const fingerprint = builderCredentialFingerprint(\n creds.privateKey,\n creds.publicKey,\n );\n if (!fingerprint) return;\n try {\n const { deleteSetting } = await import(\"../settings/store.js\");\n await deleteSetting(builderAuthFailureSettingKey(fingerprint));\n } catch {\n // A stale failure marker should not block writing fresh credentials.\n }\n}\n\n/**\n * Write Builder credentials to `app_secrets`.\n *\n * Scope decision (see `resolveCredentialWriteScope`): when the connecting\n * user is owner/admin of an active org we write at `scope: \"org\"` so every\n * member of that org auto-resolves the credentials via\n * `resolveBuilderCredential`'s org fallback — no per-user re-connect\n * needed. A plain member or a user with no active org writes at\n * `scope: \"user\"` (the safe default that doesn't trample the org's shared\n * connection).\n *\n * Stale-credential cleanup: before writing the new values we (1) clear ALL\n * five BUILDER_* keys at the target scope, so optional fields the new\n * connection doesn't carry (e.g. user picked a Builder space that returns\n * no orgName) don't leave the previous connection's metadata behind, and\n * (2) when writing at org scope, also clear the writer's own user-scope\n * BUILDER_* rows so a stale personal override from an earlier connect\n * doesn't shadow the new org write on resolution (user scope wins org\n * scope by design — see `resolveScopedBuilderCredential`). The org-scope\n * row is intentionally left alone when writing at user scope: that row is\n * shared with the rest of the org and a single user's personal override\n * shouldn't blow it away. (Victoria's \"I signed in again with my Builder\n * space and it still says no credits\" report on 2026-05-11 was exactly\n * this stale-shadow case.)\n *\n * Returns the actual scope/scopeId used so the caller can show \"Connected\n * for Builder.io\" vs \"Connected (personal)\" in the UI.\n */\nexport async function writeBuilderCredentials(\n email: string,\n creds: {\n privateKey: string;\n publicKey: string;\n userId?: string | null;\n orgName?: string | null;\n orgKind?: string | null;\n subscription?: string | null;\n subscriptionLevel?: string | null;\n subscriptionName?: string | null;\n isEnterprise?: boolean | null;\n isFreeAccount?: boolean | null;\n },\n options?: { orgId?: string | null; role?: string | null },\n): Promise<{ scope: \"user\" | \"org\"; scopeId: string }> {\n const privateKey = creds.privateKey.trim();\n const publicKey = creds.publicKey.trim();\n if (!isBuilderPrivateKey(privateKey)) {\n throw new Error(\n \"Builder returned a credential that is not a Builder private key (expected bpk-...). Restart the Builder connect flow and choose a space that can issue a private key.\",\n );\n }\n if (!publicKey) {\n throw new Error(\n \"Builder did not return a public API key. Restart the Builder connect flow.\",\n );\n }\n\n const { writeAppSecret, deleteAppSecret } =\n await import(\"../secrets/storage.js\");\n const target = resolveCredentialWriteScope(\n email,\n options?.orgId ?? null,\n options?.role ?? null,\n );\n\n // Clear stale rows before writing the new connection. See the function's\n // doc comment for the two cases this handles.\n const cleanups: Array<Promise<unknown>> = BUILDER_CREDENTIAL_KEYS.map((key) =>\n deleteAppSecret({\n key,\n scope: target.scope,\n scopeId: target.scopeId,\n }).catch(() => {}),\n );\n if (target.scope === \"org\") {\n for (const key of BUILDER_CREDENTIAL_KEYS) {\n cleanups.push(\n deleteAppSecret({ key, scope: \"user\", scopeId: email }).catch(() => {}),\n );\n }\n }\n await Promise.all(cleanups);\n\n const entries: Array<{ key: string; value: string }> = [\n { key: \"BUILDER_PRIVATE_KEY\", value: privateKey },\n { key: \"BUILDER_PUBLIC_KEY\", value: publicKey },\n ];\n if (creds.userId) {\n entries.push({ key: \"BUILDER_USER_ID\", value: creds.userId });\n }\n if (creds.orgName) {\n entries.push({ key: \"BUILDER_ORG_NAME\", value: creds.orgName });\n }\n if (creds.orgKind) {\n entries.push({ key: \"BUILDER_ORG_KIND\", value: creds.orgKind });\n }\n if (creds.subscription) {\n entries.push({ key: \"BUILDER_SUBSCRIPTION\", value: creds.subscription });\n }\n if (creds.subscriptionLevel) {\n entries.push({\n key: \"BUILDER_SUBSCRIPTION_LEVEL\",\n value: creds.subscriptionLevel,\n });\n }\n if (creds.subscriptionName) {\n entries.push({\n key: \"BUILDER_SUBSCRIPTION_NAME\",\n value: creds.subscriptionName,\n });\n }\n if (typeof creds.isEnterprise === \"boolean\") {\n entries.push({\n key: \"BUILDER_IS_ENTERPRISE\",\n value: String(creds.isEnterprise),\n });\n }\n if (typeof creds.isFreeAccount === \"boolean\") {\n entries.push({\n key: \"BUILDER_IS_FREE_ACCOUNT\",\n value: String(creds.isFreeAccount),\n });\n }\n await Promise.all(\n entries.map(({ key, value }) =>\n writeAppSecret({\n key,\n value,\n scope: target.scope,\n scopeId: target.scopeId,\n }),\n ),\n );\n await clearBuilderCredentialAuthFailure({\n privateKey,\n publicKey,\n });\n return target;\n}\n\n/**\n * Delete Builder credentials.\n *\n * Default behaviour: clears only this user's per-user override (so a\n * member can disconnect their personal Builder identity without\n * collapsing the org-wide connection for every teammate). To revoke the\n * org's shared connection, pass `{ orgId, role }` for an owner/admin —\n * matching the same authority gate `writeBuilderCredentials` uses on\n * write. Plain members can never reach the org-scoped row.\n */\nexport async function deleteBuilderCredentials(\n email: string,\n options?: { orgId?: string | null; role?: string | null },\n): Promise<{ scope: \"user\" | \"org\"; scopeId: string }> {\n const { deleteAppSecret } = await import(\"../secrets/storage.js\");\n const target = resolveCredentialWriteScope(\n email,\n options?.orgId ?? null,\n options?.role ?? null,\n );\n await Promise.all(\n BUILDER_CREDENTIAL_KEYS.map((key) =>\n deleteAppSecret({\n key,\n scope: target.scope,\n scopeId: target.scopeId,\n }).catch(() => {}),\n ),\n );\n return target;\n}\n\n// ---------------------------------------------------------------------------\n// Generic request-scoped secret resolution\n//\n// New consumers should prefer this over reading `process.env.X` directly.\n// User-pasted and shared secrets live in `app_secrets` (encrypted). The\n// settings UI / onboarding panels can write user, org, or workspace rows.\n// Deploy-level env vars are the fallback for unauthenticated/CLI/background\n// contexts where there's no user to scope by — never the silent fallback\n// for an authenticated request, since on a multi-tenant deploy that would\n// silently identify every user as whoever set the deploy-level key\n// (KVesta Space, 2026-04).\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a request-scoped secret. Reads from `app_secrets` first (current\n * user override, active org, then workspace row); falls back to `process.env`\n * only when the deploy fallback policy allows it.\n */\nexport async function resolveSecret(key: string): Promise<string | null> {\n const traceLookup = shouldTraceCredentialResolve();\n const email = getRequestUserEmail();\n if (email) {\n try {\n const { readAppSecret } = await import(\"../secrets/storage.js\");\n // Per-user override first.\n const userSecret = await readAppSecret({\n key,\n scope: \"user\",\n scopeId: email,\n });\n if (userSecret?.value) {\n if (traceLookup) {\n console.log(\n `[resolve-secret] key=${key} email=${email} scope=user hit=true`,\n );\n }\n return userSecret.value;\n }\n\n const orgId = getRequestOrgId();\n if (orgId) {\n // Fall back to the active org's shared row, when present. Builder\n // Connect uses this first-class org scope.\n const orgSecret = await readAppSecret({\n key,\n scope: \"org\",\n scopeId: orgId,\n });\n if (orgSecret?.value) {\n if (traceLookup) {\n console.log(\n `[resolve-secret] key=${key} email=${email} orgId=${orgId} scope=org hit=true`,\n );\n }\n return orgSecret.value;\n }\n\n // Registered secrets historically used \"workspace\" scope for\n // org-shared configuration. Keep reading it so Settings status and\n // runtime resolution agree.\n const workspaceSecret = await readAppSecret({\n key,\n scope: \"workspace\",\n scopeId: orgId,\n });\n if (workspaceSecret?.value) {\n if (traceLookup) {\n console.log(\n `[resolve-secret] key=${key} email=${email} orgId=${orgId} scope=workspace hit=true`,\n );\n }\n return workspaceSecret.value;\n }\n } else {\n const soloWorkspaceSecret = await readAppSecret({\n key,\n scope: \"workspace\",\n scopeId: `solo:${email}`,\n });\n if (soloWorkspaceSecret?.value) {\n if (traceLookup) {\n console.log(\n `[resolve-secret] key=${key} email=${email} scope=workspace-solo hit=true`,\n );\n }\n return soloWorkspaceSecret.value;\n }\n }\n } catch (err) {\n if (traceLookup) {\n console.log(\n `[resolve-secret] key=${key} email=${email} scope=error err=${(err as Error)?.message ?? err}`,\n );\n }\n // Secrets table not ready — treat as missing.\n }\n // Read deployment-provided env values as fallbacks; framework code must not\n // write to `process.env`, but keys supplied by the host remain valid config.\n // Builder credentials keep a narrower path below because those keys carry a\n // Builder identity rather than just enabling a provider call.\n const envFallback = (\n isBuilderCredentialKey(key)\n ? canUseBuilderDeployCredentialFallbackForRequest()\n : canUseDeployCredentialFallbackForRequest()\n )\n ? process.env[key] || null\n : null;\n if (traceLookup) {\n console.log(\n `[resolve-secret] key=${key} email=${email} orgId=${getRequestOrgId() ?? \"(none)\"} scope=${envFallback ? \"env-fallback\" : \"none\"} hit=${!!envFallback}`,\n );\n }\n return envFallback;\n }\n // Unauthenticated / local-dev / CLI / background context: env fallback\n // is safe because there's no user to mis-identify.\n const value = process.env[key] || null;\n if (traceLookup) {\n console.log(\n `[resolve-secret] key=${key} email=(none) scope=env-anonymous hit=${!!value}`,\n );\n }\n return value;\n}\n\n// ---------------------------------------------------------------------------\n// Synchronous helpers — env-only fallbacks for contexts where per-user\n// lookup isn't possible (sync isConfigured checks, CLI scripts).\n// ---------------------------------------------------------------------------\n\n/**\n * True when a Builder private key is configured at the deployment level.\n *\n * This is the same env-only check as `isBuilderEnvManaged()`. For \"does this\n * request have access to Builder via user/org/env credentials?\" use the async\n * `resolveHasBuilderPrivateKey()`.\n */\nexport function hasBuilderPrivateKey(): boolean {\n return !!process.env.BUILDER_PRIVATE_KEY;\n}\n\n/** The origin for Builder-proxied API calls. Overridable for testing. */\nexport function getBuilderProxyOrigin(): string {\n return (\n process.env.BUILDER_PROXY_ORIGIN ||\n process.env.AIR_HOST ||\n process.env.BUILDER_API_HOST ||\n \"https://api.builder.io\"\n );\n}\n\n/**\n * Base URL for the public Builder LLM gateway, which lives at\n * api.builder.io/agent-native/gateway.\n * Override via BUILDER_GATEWAY_BASE_URL for staging / testing.\n */\nexport function getBuilderGatewayBaseUrl(): string {\n return (\n process.env.BUILDER_GATEWAY_BASE_URL ||\n \"https://api.builder.io/agent-native/gateway/v1\"\n );\n}\n\n/**\n * Base URL for Builder-managed image generation.\n * Override via BUILDER_IMAGE_GENERATION_BASE_URL for staging / testing.\n */\nexport function getBuilderImageGenerationBaseUrl(): string {\n return (\n process.env.BUILDER_IMAGE_GENERATION_BASE_URL ||\n \"https://api.builder.io/agent-native/images/v1\"\n );\n}\n\n/**\n * Base URL for Builder-managed web search.\n * Override via BUILDER_WEB_SEARCH_BASE_URL for staging / testing.\n */\nexport function getBuilderWebSearchBaseUrl(): string {\n return (\n process.env.BUILDER_WEB_SEARCH_BASE_URL ||\n \"https://api.builder.io/agent-native/web-search/v1\"\n );\n}\n\n/** Authorization header value for Builder-proxied calls (env-only). */\nexport function getBuilderAuthHeader(): string | null {\n const key = process.env.BUILDER_PRIVATE_KEY;\n return key ? `Bearer ${key}` : null;\n}\n"]}
1
+ {"version":3,"file":"credential-provider.js","sourceRoot":"","sources":["../../src/server/credential-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5E;;;;;;;;GAQG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAAa,EACb,KAAgC,EAChC,IAA+B;IAE/B,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;QACpD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACzC,kBAAkB,CAAS;IAC3B,iBAAiB,CAAU;IAC3B,WAAW,CAAU;IAE9B,YAAY,IAKX;QACC,KAAK,CACH,IAAI,CAAC,OAAO;YACV,gCAAgC,IAAI,CAAC,kBAAkB,yCAAyC,CACnG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAClD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACtC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;AACvC,CAAC;AAED,MAAM,mCAAmC,GAAG,IAAI,GAAG,CAAC;IAClD,mBAAmB;IACnB,gBAAgB;IAChB,iBAAiB;IACjB,oBAAoB;IACpB,8BAA8B;IAC9B,cAAc;IACd,iBAAiB;IACjB,gBAAgB;CACjB,CAAC,CAAC;AAEH,SAAS,gCAAgC,CAAC,GAAuB;IAC/D,OAAO,CAAC,CAAC,GAAG,IAAI,mCAAmC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iCAAiC;IAC/C,IAAI,CAAC,uBAAuB,EAAE;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,wCAAwC,CACtD,GAAY;IAEZ,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,gCAAgC,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,wBAAwB,EAAE;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,CAAC,uBAAuB,EAAE;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,uBAAuB,GAAG;IAC9B,qBAAqB;IACrB,oBAAoB;IACpB,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;IAClB,sBAAsB;IACtB,4BAA4B;IAC5B,2BAA2B;IAC3B,uBAAuB;IACvB,yBAAyB;CACjB,CAAC;AAEX,SAAS,sBAAsB,CAAC,GAAW;IACzC,OAAQ,uBAA6C,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,wBAAwB;IAC/B,MAAM,gBAAgB,GAAG,OAAO,CAC9B,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CACnC,CAAC;IACF,OAAO,CACL,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC;QAC5D,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE,CAAC;QACjE,gBAAgB,CACjB,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QACrC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;QAC7C,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;QAC5C,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC9C,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,wBAAwB;YACpC,OAAO,CAAC,GAAG,CAAC,iBAAiB;YAC7B,OAAO,CAAC,GAAG,CAAC,wBAAwB;YACpC,OAAO,CAAC,GAAG,CAAC,SAAS;YACrB,OAAO,CAAC,GAAG,CAAC,MAAM,CACnB,CACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAS,+CAA+C;IACtD,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,mBAAmB,GAAG,uBAAuB,EAAE,CAAC;IACtD,6EAA6E;IAC7E,6EAA6E;IAC7E,6CAA6C;IAC7C,MAAM,aAAa,GACjB,CAAC,mBAAmB;QACpB,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;IAEvE,IAAI,wBAAwB,EAAE,IAAI,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IAE/D,4EAA4E;IAC5E,OAAO,CAAC,mBAAmB,IAAI,eAAe,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,4BAA4B;IACnC,OAAO,aAAa,CAAC,IAAI,CACvB,OAAO,CAAC,GAAG,CAAC,qCAAqC;QAC/C,OAAO,CAAC,GAAG,CAAC,wBAAwB;QACpC,EAAE,CACL,CAAC;AACJ,CAAC;AAgCD,SAAS,2BAA2B,CAAC,KAAiC;IACpE,OAAO,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,0BAA0B,CACjC,KAAgC;IAEhC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAgC;IAClE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,aAAmE,EACnE,KAAmC,EACnC,OAAe;IAEf,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI,CAAU,CAAC;IAC/C,CAAC,CAAC,CACH,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAwB,MAAM,CAAC,CAAC;IACnD,OAAO;QACL,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,IAAI;QAClD,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,IAAI;QAChD,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,IAAI;QAC1C,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,IAAI;QAC5C,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,IAAI;QAC5C,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,IAAI;QACrD,iBAAiB,EAAE,GAAG,CAAC,GAAG,CAAC,4BAA4B,CAAC,IAAI,IAAI;QAChE,gBAAgB,EAAE,GAAG,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI,IAAI;QAC9D,YAAY,EAAE,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC1E,aAAa,EAAE,0BAA0B,CACvC,GAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC,CACnC;QACD,MAAM,EAAE,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK;KACpD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,GAAW;IAEX,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,yEAAyE;IACzE,sEAAsE;IACtE,MAAM,WAAW,GAAG,4BAA4B,EAAE,CAAC;IACnD,IAAI,cAAc,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAEhE,sEAAsE;QACtE,iEAAiE;QACjE,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC;YACrC,GAAG;YACH,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CACT,4BAA4B,GAAG,UAAU,KAAK,sBAAsB,CACrE,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACrD,CAAC;QAED,mEAAmE;QACnE,iEAAiE;QACjE,+DAA+D;QAC/D,6DAA6D;QAC7D,mEAAmE;QACnE,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,IAAI,KAAK,EAAE,CAAC;YACV,cAAc,GAAG,KAAK,CAAC;YACvB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC;gBACpC,GAAG;gBACH,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CACT,4BAA4B,GAAG,UAAU,KAAK,UAAU,KAAK,qBAAqB,CACnF,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YACnD,CAAC;YAED,iEAAiE;YACjE,qEAAqE;YACrE,yEAAyE;YACzE,cAAc,GAAG,WAAW,CAAC;YAC7B,MAAM,eAAe,GAAG,MAAM,aAAa,CAAC;gBAC1C,GAAG;gBACH,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,IAAI,eAAe,EAAE,CAAC;gBACpB,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CACT,4BAA4B,GAAG,UAAU,KAAK,UAAU,KAAK,2BAA2B,CACzF,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;YAC/D,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CACT,4BAA4B,GAAG,UAAU,KAAK,UAAU,KAAK,gCAAgC,CAC9F,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,gBAAgB,CAAC;YAClC,MAAM,mBAAmB,GAAG,MAAM,aAAa,CAAC;gBAC9C,GAAG;gBACH,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,QAAQ,KAAK,EAAE;aACzB,CAAC,CAAC;YACH,IAAI,mBAAmB,EAAE,CAAC;gBACxB,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CACT,4BAA4B,GAAG,UAAU,KAAK,gCAAgC,CAC/E,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;YACnE,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CACT,4BAA4B,GAAG,UAAU,KAAK,8CAA8C,CAC7F,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,4BAA4B,GAAG,UAAU,KAAK,UAAU,cAAc,UAAW,GAAa,EAAE,OAAO,IAAI,GAAG,EAAE,CACjH,CAAC;QACJ,CAAC;QACD,8CAA8C;IAChD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,+BAA+B;IAC5C,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,WAAW,GAAG,4BAA4B,EAAE,CAAC;IACnD,IAAI,cAAc,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,CAAC,KAAiC,EAAE,OAAe,EAAE,EAAE;YACxE,IAAI,CAAC,WAAW;gBAAE,OAAO;YACzB,OAAO,CAAC,GAAG,CACT,8BAA8B,KAAK,CAAC,MAAM,YAAY,OAAO,UAAU,KAAK,aAAa,2BAA2B,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CACtM,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,MAAM,0BAA0B,CAChD,aAAa,EACb,MAAM,EACN,KAAK,CACN,CAAC;QACF,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,2BAA2B,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAE7D,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,IAAI,KAAK,EAAE,CAAC;YACV,cAAc,GAAG,KAAK,CAAC;YACvB,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAC/C,aAAa,EACb,KAAK,EACL,KAAK,CACN,CAAC;YACF,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC5B,IAAI,2BAA2B,CAAC,QAAQ,CAAC;gBAAE,OAAO,QAAQ,CAAC;YAE3D,cAAc,GAAG,WAAW,CAAC;YAC7B,MAAM,cAAc,GAAG,MAAM,0BAA0B,CACrD,aAAa,EACb,WAAW,EACX,KAAK,CACN,CAAC;YACF,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YAClC,IAAI,2BAA2B,CAAC,cAAc,CAAC;gBAAE,OAAO,cAAc,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,gBAAgB,CAAC;YAClC,MAAM,OAAO,GAAG,QAAQ,KAAK,EAAE,CAAC;YAChC,MAAM,cAAc,GAAG,MAAM,0BAA0B,CACrD,aAAa,EACb,WAAW,EACX,OAAO,CACR,CAAC;YACF,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YACpC,IAAI,2BAA2B,CAAC,cAAc,CAAC;gBAAE,OAAO,cAAc,CAAC;QACzE,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,8BAA8B,KAAK,UAAU,cAAc,sBAAuB,GAAa,EAAE,OAAO,IAAI,GAAG,EAAE,CAClH,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,GAAW;IAEX,MAAM,MAAM,GAAG,MAAM,8BAA8B,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IAChC,IAAI,CAAC,+CAA+C,EAAE;QAAE,OAAO,IAAI,CAAC;IACpE,OAAO,uBAAuB,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,OAAO,wBAAwB,CAAC,qBAAqB,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,MAAM,GAAG,GAAG,MAAM,wBAAwB,EAAE,CAAC;IAC7C,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B;IAC/C,OAAO,CAAC,CAAC,CAAC,MAAM,wBAAwB,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mCAAmC;IACvD,MAAM,KAAK,GAAG,MAAM,yBAAyB,EAAE,CAAC;IAChD,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B;IAClD,MAAM,MAAM,GAAG,MAAM,+BAA+B,EAAE,CAAC;IACvD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IACjC,OAAO,+CAA+C,EAAE;QACtD,OAAO,CAAC,GAAG,CAAC,mBAAmB;QAC/B,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAY7C,MAAM,MAAM,GAAG,MAAM,+BAA+B,EAAE,CAAC;IACvD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,EACJ,UAAU,EACV,SAAS,EACT,MAAM,EACN,OAAO,EACP,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,aAAa,GACd,GAAG,MAAM,CAAC;QACX,OAAO;YACL,UAAU;YACV,SAAS;YACT,MAAM;YACN,OAAO;YACP,OAAO;YACP,YAAY;YACZ,iBAAiB;YACjB,gBAAgB;YAChB,YAAY;YACZ,aAAa;SACd,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,+CAA+C,EAAE;QAClE,CAAC,CAAC,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,IAAI,IAAI,CAAC;QAC1D,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,SAAS,GAAG,+CAA+C,EAAE;QACjE,CAAC,CAAC,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC;QACzD,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,MAAM,GAAG,+CAA+C,EAAE;QAC9D,CAAC,CAAC,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC;QACtD,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,OAAO,GAAG,+CAA+C,EAAE;QAC/D,CAAC,CAAC,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC;QACvD,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,OAAO,GAAG,+CAA+C,EAAE;QAC/D,CAAC,CAAC,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC;QACvD,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,YAAY,GAAG,+CAA+C,EAAE;QACpE,CAAC,CAAC,CAAC,uBAAuB,CAAC,sBAAsB,CAAC,IAAI,IAAI,CAAC;QAC3D,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,iBAAiB,GAAG,+CAA+C,EAAE;QACzE,CAAC,CAAC,CAAC,uBAAuB,CAAC,4BAA4B,CAAC,IAAI,IAAI,CAAC;QACjE,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,gBAAgB,GAAG,+CAA+C,EAAE;QACxE,CAAC,CAAC,CAAC,uBAAuB,CAAC,2BAA2B,CAAC,IAAI,IAAI,CAAC;QAChE,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,YAAY,GAAG,+CAA+C,EAAE;QACpE,CAAC,CAAC,0BAA0B,CACxB,uBAAuB,CAAC,uBAAuB,CAAC,CACjD;QACH,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,aAAa,GAAG,+CAA+C,EAAE;QACrE,CAAC,CAAC,0BAA0B,CACxB,uBAAuB,CAAC,yBAAyB,CAAC,CACnD;QACH,CAAC,CAAC,IAAI,CAAC;IACT,OAAO;QACL,UAAU;QACV,SAAS;QACT,MAAM;QACN,OAAO;QACP,OAAO;QACP,YAAY;QACZ,iBAAiB;QACjB,gBAAgB;QAChB,YAAY;QACZ,aAAa;KACd,CAAC;AACJ,CAAC;AAED,MAAM,mCAAmC,GAAG,uBAAuB,CAAC;AAYpE,MAAM,UAAU,4BAA4B,CAC1C,UAA0B,EAC1B,SAAyB;IAEzB,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,UAAU,CAAC;SAClB,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,SAAS,CAAC;SACjB,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,4BAA4B,CAAC,WAAmB;IACvD,OAAO,GAAG,mCAAmC,GAAG,WAAW,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,KAAK,GAGD,EAAE;IAEN,MAAM,WAAW,GAAG,4BAA4B,CAC9C,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,CAChB,CAAC;IACF,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,4BAA4B,CAAC,WAAW,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO;YACL,WAAW;YACX,OAAO,EACL,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO;gBAC5C,CAAC,CAAC,GAAG,CAAC,OAAO;gBACb,CAAC,CAAC,mEAAmE;YACzE,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAC/D,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACzD,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACpD,UAAU,EACR,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YACjE,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SAC7D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kCAAkC,CAAC,OAIxD;IACC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,yBAAyB,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,4BAA4B,CAC9C,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,CAChB,CAAC;QACF,IAAI,CAAC,WAAW;YAAE,OAAO;QACzB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC5D,MAAM,UAAU,CAAC,4BAA4B,CAAC,WAAW,CAAC,EAAE;YAC1D,WAAW;YACX,OAAO,EACL,OAAO,EAAE,OAAO;gBAChB,mEAAmE;YACrE,GAAG,CAAC,OAAO,OAAO,EAAE,MAAM,KAAK,QAAQ,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YACtE,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;YAC5C,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,UAAU,EAAE,mBAAmB,EAAE,IAAI,IAAI;YACzC,KAAK,EAAE,eAAe,EAAE,IAAI,IAAI;SACjC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iCAAiC,CAAC,KAGvD;IACC,MAAM,WAAW,GAAG,4BAA4B,CAC9C,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,CAChB,CAAC;IACF,IAAI,CAAC,WAAW;QAAE,OAAO;IACzB,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC/D,MAAM,aAAa,CAAC,4BAA4B,CAAC,WAAW,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAAa,EACb,KAWC,EACD,OAAyD;IAEzD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,uKAAuK,CACxK,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,GACvC,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,2BAA2B,CACxC,KAAK,EACL,OAAO,EAAE,KAAK,IAAI,IAAI,EACtB,OAAO,EAAE,IAAI,IAAI,IAAI,CACtB,CAAC;IAEF,yEAAyE;IACzE,8CAA8C;IAC9C,MAAM,QAAQ,GAA4B,uBAAuB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5E,eAAe,CAAC;QACd,GAAG;QACH,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CACnB,CAAC;IACF,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QAC3B,KAAK,MAAM,GAAG,IAAI,uBAAuB,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CACX,eAAe,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CACxE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE5B,MAAM,OAAO,GAA0C;QACrD,EAAE,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,UAAU,EAAE;QACjD,EAAE,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE;KAChD,CAAC;IACF,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,EAAE,4BAA4B;YACjC,KAAK,EAAE,KAAK,CAAC,iBAAiB;SAC/B,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,EAAE,2BAA2B;YAChC,KAAK,EAAE,KAAK,CAAC,gBAAgB;SAC9B,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,EAAE,uBAAuB;YAC5B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,EAAE,yBAAyB;YAC9B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;SACnC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC7B,cAAc,CAAC;QACb,GAAG;QACH,KAAK;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CACH,CACF,CAAC;IACF,MAAM,iCAAiC,CAAC;QACtC,UAAU;QACV,SAAS;KACV,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAa,EACb,OAAyD;IAEzD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,2BAA2B,CACxC,KAAK,EACL,OAAO,EAAE,KAAK,IAAI,IAAI,EACtB,OAAO,EAAE,IAAI,IAAI,IAAI,CACtB,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CACf,uBAAuB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAClC,eAAe,CAAC;QACd,GAAG;QACH,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CACnB,CACF,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,2CAA2C;AAC3C,EAAE;AACF,0EAA0E;AAC1E,wEAAwE;AACxE,0EAA0E;AAC1E,4EAA4E;AAC5E,8EAA8E;AAC9E,+DAA+D;AAC/D,gFAAgF;AAChF,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,MAAM,WAAW,GAAG,4BAA4B,EAAE,CAAC;IACnD,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC;YACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAChE,2BAA2B;YAC3B,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC;gBACrC,GAAG;gBACH,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,IAAI,UAAU,EAAE,KAAK,EAAE,CAAC;gBACtB,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CACT,wBAAwB,GAAG,UAAU,KAAK,sBAAsB,CACjE,CAAC;gBACJ,CAAC;gBACD,OAAO,UAAU,CAAC,KAAK,CAAC;YAC1B,CAAC;YAED,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;YAChC,IAAI,KAAK,EAAE,CAAC;gBACV,kEAAkE;gBAClE,2CAA2C;gBAC3C,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC;oBACpC,GAAG;oBACH,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;gBACH,IAAI,SAAS,EAAE,KAAK,EAAE,CAAC;oBACrB,IAAI,WAAW,EAAE,CAAC;wBAChB,OAAO,CAAC,GAAG,CACT,wBAAwB,GAAG,UAAU,KAAK,UAAU,KAAK,qBAAqB,CAC/E,CAAC;oBACJ,CAAC;oBACD,OAAO,SAAS,CAAC,KAAK,CAAC;gBACzB,CAAC;gBAED,6DAA6D;gBAC7D,mEAAmE;gBACnE,4BAA4B;gBAC5B,MAAM,eAAe,GAAG,MAAM,aAAa,CAAC;oBAC1C,GAAG;oBACH,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;gBACH,IAAI,eAAe,EAAE,KAAK,EAAE,CAAC;oBAC3B,IAAI,WAAW,EAAE,CAAC;wBAChB,OAAO,CAAC,GAAG,CACT,wBAAwB,GAAG,UAAU,KAAK,UAAU,KAAK,2BAA2B,CACrF,CAAC;oBACJ,CAAC;oBACD,OAAO,eAAe,CAAC,KAAK,CAAC;gBAC/B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,mBAAmB,GAAG,MAAM,aAAa,CAAC;oBAC9C,GAAG;oBACH,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,QAAQ,KAAK,EAAE;iBACzB,CAAC,CAAC;gBACH,IAAI,mBAAmB,EAAE,KAAK,EAAE,CAAC;oBAC/B,IAAI,WAAW,EAAE,CAAC;wBAChB,OAAO,CAAC,GAAG,CACT,wBAAwB,GAAG,UAAU,KAAK,gCAAgC,CAC3E,CAAC;oBACJ,CAAC;oBACD,OAAO,mBAAmB,CAAC,KAAK,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CACT,wBAAwB,GAAG,UAAU,KAAK,oBAAqB,GAAa,EAAE,OAAO,IAAI,GAAG,EAAE,CAC/F,CAAC;YACJ,CAAC;YACD,8CAA8C;QAChD,CAAC;QACD,4EAA4E;QAC5E,6EAA6E;QAC7E,4EAA4E;QAC5E,8DAA8D;QAC9D,MAAM,WAAW,GAAG,CAClB,sBAAsB,CAAC,GAAG,CAAC;YACzB,CAAC,CAAC,+CAA+C,EAAE;YACnD,CAAC,CAAC,wCAAwC,CAAC,GAAG,CAAC,CAClD;YACC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI;YAC1B,CAAC,CAAC,IAAI,CAAC;QACT,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,wBAAwB,GAAG,UAAU,KAAK,UAAU,eAAe,EAAE,IAAI,QAAQ,UAAU,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,WAAW,EAAE,CACxJ,CAAC;QACJ,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,uEAAuE;IACvE,mDAAmD;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACvC,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,wBAAwB,GAAG,yCAAyC,CAAC,CAAC,KAAK,EAAE,CAC9E,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,uEAAuE;AACvE,iEAAiE;AACjE,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAC3C,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,qBAAqB;IACnC,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAChC,OAAO,CAAC,GAAG,CAAC,QAAQ;QACpB,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC5B,wBAAwB,CACzB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,wBAAwB;QACpC,gDAAgD,CACjD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gCAAgC;IAC9C,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,iCAAiC;QAC7C,+CAA+C,CAChD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,2BAA2B;QACvC,mDAAmD,CACpD,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,oBAAoB;IAClC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC5C,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACtC,CAAC","sourcesContent":["/**\n * Credential provider abstraction.\n *\n * Every feature that needs an external credential (Anthropic API key,\n * Google OAuth tokens, OpenAI key, Slack bot token, etc.) should go through\n * one of the resolve*() helpers here instead of reading `process.env`\n * directly. That way the same feature can work in three modes:\n *\n * 1. User set their own key in .env → use it directly\n * 2. User connected Builder via `/cli-auth` → route through Builder proxy\n * 3. Neither → throw FeatureNotConfigured\n *\n * Templates catch FeatureNotConfigured and show a \"Connect Builder (1 click) /\n * set up your own key (guide)\" card.\n *\n * Today these helpers are used by the Builder-hosted LLM gateway, and the\n * shape is meant to grow to cover future managed credential integrations\n * (e.g. additional Builder-hosted services) without rewrites.\n */\n\nimport { createHash } from \"node:crypto\";\n\nimport { isLocalDatabase } from \"../db/client.js\";\nimport { getRequestUserEmail, getRequestOrgId } from \"./request-context.js\";\n\n/**\n * Decide which `app_secrets` scope a Builder/credential write should use.\n *\n * Org scope (\"everyone in this org sees these credentials\") wins when the\n * connecting user is an owner or admin of an active org — the write\n * privileges shared infra. A plain member or a user without an active\n * org falls through to per-user scope so a teammate can't silently\n * overwrite the org-shared connection.\n */\nexport function resolveCredentialWriteScope(\n email: string,\n orgId: string | null | undefined,\n role: string | null | undefined,\n): { scope: \"user\" | \"org\"; scopeId: string } {\n if (orgId && (role === \"owner\" || role === \"admin\")) {\n return { scope: \"org\", scopeId: orgId };\n }\n return { scope: \"user\", scopeId: email };\n}\n\nexport class FeatureNotConfiguredError extends Error {\n readonly requiredCredential: string;\n readonly builderConnectUrl?: string;\n readonly byokDocsUrl?: string;\n\n constructor(opts: {\n requiredCredential: string;\n message?: string;\n builderConnectUrl?: string;\n byokDocsUrl?: string;\n }) {\n super(\n opts.message ??\n `Feature requires credential \"${opts.requiredCredential}\". Connect Builder or set your own key.`,\n );\n this.name = \"FeatureNotConfiguredError\";\n this.requiredCredential = opts.requiredCredential;\n this.builderConnectUrl = opts.builderConnectUrl;\n this.byokDocsUrl = opts.byokDocsUrl;\n }\n}\n\n/**\n * Deployment-level credential fallback for single-tenant/local operation.\n * Multi-tenant call sites must gate this explicitly before calling.\n */\nexport function readDeployCredentialEnv(key: string): string | undefined {\n return process.env[key] || undefined;\n}\n\nconst APP_PROVIDED_DEPLOY_CREDENTIAL_KEYS = new Set([\n \"ANTHROPIC_API_KEY\",\n \"OPENAI_API_KEY\",\n \"OPENAI_BASE_URL\",\n \"OPENROUTER_API_KEY\",\n \"GOOGLE_GENERATIVE_AI_API_KEY\",\n \"GROQ_API_KEY\",\n \"MISTRAL_API_KEY\",\n \"COHERE_API_KEY\",\n]);\n\nfunction isAppProvidedDeployCredentialKey(key: string | undefined): boolean {\n return !!key && APP_PROVIDED_DEPLOY_CREDENTIAL_KEYS.has(key);\n}\n\n/**\n * Deployment-level credentials are safe as a runtime fallback only in local /\n * single-tenant contexts. In hosted production with a shared database, every\n * signed-in user needs their own user/org/workspace credential for\n * identity-bearing provider keys so one deploy key does not silently\n * impersonate another tenant. App-provided LLM provider keys are different:\n * they intentionally let the app developer pay for model usage for users of\n * that deployed app, so key-aware callers may use those env vars.\n *\n * @deprecated Use `canUseDeployCredentialFallbackForRequest()` for generic\n * provider secrets. This stricter helper remains for legacy call sites with\n * identity-bearing deploy credentials.\n */\nexport function isDeployCredentialFallbackAllowed(): boolean {\n if (!isProductionLikeRuntime()) return true;\n return isLocalDatabase();\n}\n\nexport function canUseDeployCredentialFallbackForRequest(\n key?: string,\n): boolean {\n const email = getRequestUserEmail();\n if (!email) return true;\n if (isAppProvidedDeployCredentialKey(key)) return true;\n if (isHostedWorkspaceRuntime()) return false;\n if (!isProductionLikeRuntime()) return true;\n return isLocalDatabase();\n}\n\nconst BUILDER_CREDENTIAL_KEYS = [\n \"BUILDER_PRIVATE_KEY\",\n \"BUILDER_PUBLIC_KEY\",\n \"BUILDER_USER_ID\",\n \"BUILDER_ORG_NAME\",\n \"BUILDER_ORG_KIND\",\n \"BUILDER_SUBSCRIPTION\",\n \"BUILDER_SUBSCRIPTION_LEVEL\",\n \"BUILDER_SUBSCRIPTION_NAME\",\n \"BUILDER_IS_ENTERPRISE\",\n \"BUILDER_IS_FREE_ACCOUNT\",\n] as const;\n\nfunction isBuilderCredentialKey(key: string): boolean {\n return (BUILDER_CREDENTIAL_KEYS as readonly string[]).includes(key);\n}\n\nfunction isHostedWorkspaceRuntime(): boolean {\n const hasFusionPreview = Boolean(\n process.env.FUSION_ENVIRONMENT ||\n process.env.FUSION_ENV_ORIGIN ||\n process.env.VITE_FUSION_ENV_ORIGIN,\n );\n return (\n /^(1|true)$/i.test(process.env.AGENT_NATIVE_WORKSPACE ?? \"\") ||\n /^(1|true)$/i.test(process.env.VITE_AGENT_NATIVE_WORKSPACE ?? \"\") ||\n hasFusionPreview\n );\n}\n\nfunction isProductionLikeRuntime(): boolean {\n return (\n process.env.NODE_ENV === \"production\" ||\n /^(1|true)$/i.test(process.env.NETLIFY ?? \"\") ||\n /^(1|true)$/i.test(process.env.VERCEL ?? \"\") ||\n /^(1|true)$/i.test(process.env.CF_PAGES ?? \"\") ||\n Boolean(\n process.env.AWS_LAMBDA_FUNCTION_NAME ||\n process.env.AWS_EXECUTION_ENV ||\n process.env.FUNCTIONS_WORKER_RUNTIME ||\n process.env.K_SERVICE ||\n process.env.RENDER,\n )\n );\n}\n\n/**\n * Whether deployment-level Builder env keys may back the current request.\n *\n * This is intentionally self-contained rather than delegating to\n * `canUseDeployCredentialFallbackForRequest`. That generic helper blocks the\n * deploy fallback for any signed-in user in a hosted workspace runtime, so the\n * Builder dogfooding escape hatch must apply its own hosted-workspace exception\n * here instead of inheriting the generic helper's stricter (and hatch-unaware)\n * decision. Reading the env once into locals keeps the rules legible.\n *\n * Rules (all evaluated against the live request/runtime, not a build-time value):\n * - No signed-in user → safe to use the deploy env (nobody to mis-identify).\n * - Hosted workspace + signed-in user → deploy-level Builder keys would\n * impersonate that user, so block them — UNLESS a developer has explicitly\n * opted into the local dogfooding escape hatch (non-prod only). Default OFF;\n * hosted/shared production deployments are never affected.\n * - Otherwise → allowed in non-prod, or on a local/single-tenant database.\n */\nfunction canUseBuilderDeployCredentialFallbackForRequest(): boolean {\n const email = getRequestUserEmail();\n if (!email) return true;\n\n const isProductionRuntime = isProductionLikeRuntime();\n // Local dogfooding escape hatch: lets the env / root-`.env` Builder key back\n // a signed-in user so running the app locally doesn't require completing the\n // Builder connect flow first. Non-prod only.\n const localDevOptIn =\n !isProductionRuntime &&\n /^(1|true)$/i.test(process.env.AGENT_NATIVE_LOCAL_BUILDER_ENV ?? \"\");\n\n if (isHostedWorkspaceRuntime() && !localDevOptIn) return false;\n\n // Deploy fallback is safe in non-prod or on a local/single-tenant database.\n return !isProductionRuntime || isLocalDatabase();\n}\n\nfunction shouldTraceCredentialResolve(): boolean {\n return /^(1|true)$/i.test(\n process.env.AGENT_NATIVE_DEBUG_CREDENTIAL_RESOLVE ??\n process.env.DEBUG_CREDENTIAL_RESOLVE ??\n \"\",\n );\n}\n\n// ---------------------------------------------------------------------------\n// Builder credential resolution:\n//\n// 1. **Request-scoped credentials.** A signed-in user can connect Builder\n// through the CLI-auth flow. Owner/admin connections land at org scope;\n// member/no-org connections land at user scope.\n//\n// 2. **Deployment fallback.** BUILDER_PRIVATE_KEY in env still makes local\n// and single-tenant deploys work out of the box, but it no longer blocks\n// per-user connect. Request-scoped credentials win whenever present.\n//\n// To run multi-tenant SaaS: prefer leaving BUILDER_PRIVATE_KEY unset unless a\n// shared fallback identity is intentional.\n// ---------------------------------------------------------------------------\n\ntype BuilderCredentialSource = \"user\" | \"org\" | \"workspace\" | \"env\";\ninterface BuilderResolvedCredentials {\n privateKey: string | null;\n publicKey: string | null;\n userId: string | null;\n orgName: string | null;\n orgKind: string | null;\n subscription: string | null;\n subscriptionLevel: string | null;\n subscriptionName: string | null;\n isEnterprise: boolean | null;\n isFreeAccount: boolean | null;\n source: Exclude<BuilderCredentialSource, \"env\">;\n}\n\nfunction isCompleteBuilderConnection(creds: BuilderResolvedCredentials) {\n return Boolean(creds.privateKey && creds.publicKey);\n}\n\nfunction readOptionalBuilderBoolean(\n value: string | null | undefined,\n): boolean | null {\n if (value == null || value === \"\") return null;\n return /^(1|true)$/i.test(value);\n}\n\nexport function isBuilderPrivateKey(value: string | null | undefined): boolean {\n return typeof value === \"string\" && value.trim().startsWith(\"bpk-\");\n}\n\nasync function readBuilderCredentialScope(\n readAppSecret: typeof import(\"../secrets/storage.js\").readAppSecret,\n scope: \"user\" | \"org\" | \"workspace\",\n scopeId: string,\n): Promise<BuilderResolvedCredentials> {\n const values = await Promise.all(\n BUILDER_CREDENTIAL_KEYS.map(async (key) => {\n const secret = await readAppSecret({ key, scope, scopeId });\n return [key, secret?.value ?? null] as const;\n }),\n );\n const map = new Map<string, string | null>(values);\n return {\n privateKey: map.get(\"BUILDER_PRIVATE_KEY\") ?? null,\n publicKey: map.get(\"BUILDER_PUBLIC_KEY\") ?? null,\n userId: map.get(\"BUILDER_USER_ID\") ?? null,\n orgName: map.get(\"BUILDER_ORG_NAME\") ?? null,\n orgKind: map.get(\"BUILDER_ORG_KIND\") ?? null,\n subscription: map.get(\"BUILDER_SUBSCRIPTION\") ?? null,\n subscriptionLevel: map.get(\"BUILDER_SUBSCRIPTION_LEVEL\") ?? null,\n subscriptionName: map.get(\"BUILDER_SUBSCRIPTION_NAME\") ?? null,\n isEnterprise: readOptionalBuilderBoolean(map.get(\"BUILDER_IS_ENTERPRISE\")),\n isFreeAccount: readOptionalBuilderBoolean(\n map.get(\"BUILDER_IS_FREE_ACCOUNT\"),\n ),\n source: scope === \"workspace\" ? \"workspace\" : scope,\n };\n}\n\nasync function resolveScopedBuilderCredential(\n key: string,\n): Promise<{ value: string; source: \"user\" | \"org\" | \"workspace\" } | null> {\n const email = getRequestUserEmail();\n if (!email) return null;\n\n // Trace only when explicitly requested. These diagnostics are useful for\n // support, but they include account identifiers and run on hot paths.\n const traceLookup = shouldTraceCredentialResolve();\n let scopeAttempted = \"user\";\n try {\n const { readAppSecret } = await import(\"../secrets/storage.js\");\n\n // 1. Per-user override: a user can paste their own key in settings to\n // overrule the org-shared one (handy for a personal sandbox).\n const userSecret = await readAppSecret({\n key,\n scope: \"user\",\n scopeId: email,\n });\n if (userSecret) {\n if (traceLookup) {\n console.log(\n `[builder-credential] key=${key} email=${email} scope=user hit=true`,\n );\n }\n return { value: userSecret.value, source: \"user\" };\n }\n\n // 2. Per-org shared credential: when one teammate connects Builder\n // as an owner/admin we write the OAuth result at org scope so\n // every member of that org gets the AI chat working without\n // re-running the connect flow. Resolution falls back here\n // silently — the caller never has to know which scope answered.\n const orgId = getRequestOrgId();\n if (orgId) {\n scopeAttempted = \"org\";\n const orgSecret = await readAppSecret({\n key,\n scope: \"org\",\n scopeId: orgId,\n });\n if (orgSecret) {\n if (traceLookup) {\n console.log(\n `[builder-credential] key=${key} email=${email} orgId=${orgId} scope=org hit=true`,\n );\n }\n return { value: orgSecret.value, source: \"org\" };\n }\n\n // Older setup flows wrote shared credentials at workspace scope.\n // Keep reading those rows so status UIs and runtime resolution agree\n // for users who connected before org-scoped Builder credentials existed.\n scopeAttempted = \"workspace\";\n const workspaceSecret = await readAppSecret({\n key,\n scope: \"workspace\",\n scopeId: orgId,\n });\n if (workspaceSecret) {\n if (traceLookup) {\n console.log(\n `[builder-credential] key=${key} email=${email} orgId=${orgId} scope=workspace hit=true`,\n );\n }\n return { value: workspaceSecret.value, source: \"workspace\" };\n }\n if (traceLookup) {\n console.log(\n `[builder-credential] key=${key} email=${email} orgId=${orgId} miss tried=user,org,workspace`,\n );\n }\n } else {\n scopeAttempted = \"workspace-solo\";\n const soloWorkspaceSecret = await readAppSecret({\n key,\n scope: \"workspace\",\n scopeId: `solo:${email}`,\n });\n if (soloWorkspaceSecret) {\n if (traceLookup) {\n console.log(\n `[builder-credential] key=${key} email=${email} scope=workspace-solo hit=true`,\n );\n }\n return { value: soloWorkspaceSecret.value, source: \"workspace\" };\n }\n if (traceLookup) {\n console.log(\n `[builder-credential] key=${key} email=${email} orgId=(none) miss tried=user,workspace-solo`,\n );\n }\n }\n } catch (err) {\n if (traceLookup) {\n console.log(\n `[builder-credential] key=${key} email=${email} scope=${scopeAttempted} error=${(err as Error)?.message ?? err}`,\n );\n }\n // Secrets table not ready — treat as missing.\n }\n return null;\n}\n\nasync function resolveScopedBuilderCredentials(): Promise<BuilderResolvedCredentials | null> {\n const email = getRequestUserEmail();\n if (!email) return null;\n\n const traceLookup = shouldTraceCredentialResolve();\n let scopeAttempted = \"user\";\n try {\n const { readAppSecret } = await import(\"../secrets/storage.js\");\n const traceScope = (creds: BuilderResolvedCredentials, scopeId: string) => {\n if (!traceLookup) return;\n console.log(\n `[builder-credential] scope=${creds.source} scopeId=${scopeId} email=${email} complete=${isCompleteBuilderConnection(creds)} private=${Boolean(creds.privateKey)} public=${Boolean(creds.publicKey)}`,\n );\n };\n\n const userCreds = await readBuilderCredentialScope(\n readAppSecret,\n \"user\",\n email,\n );\n traceScope(userCreds, email);\n if (isCompleteBuilderConnection(userCreds)) return userCreds;\n\n const orgId = getRequestOrgId();\n if (orgId) {\n scopeAttempted = \"org\";\n const orgCreds = await readBuilderCredentialScope(\n readAppSecret,\n \"org\",\n orgId,\n );\n traceScope(orgCreds, orgId);\n if (isCompleteBuilderConnection(orgCreds)) return orgCreds;\n\n scopeAttempted = \"workspace\";\n const workspaceCreds = await readBuilderCredentialScope(\n readAppSecret,\n \"workspace\",\n orgId,\n );\n traceScope(workspaceCreds, orgId);\n if (isCompleteBuilderConnection(workspaceCreds)) return workspaceCreds;\n } else {\n scopeAttempted = \"workspace-solo\";\n const scopeId = `solo:${email}`;\n const workspaceCreds = await readBuilderCredentialScope(\n readAppSecret,\n \"workspace\",\n scopeId,\n );\n traceScope(workspaceCreds, scopeId);\n if (isCompleteBuilderConnection(workspaceCreds)) return workspaceCreds;\n }\n } catch (err) {\n if (traceLookup) {\n console.log(\n `[builder-credential] email=${email} scope=${scopeAttempted} credentials error=${(err as Error)?.message ?? err}`,\n );\n }\n }\n return null;\n}\n\n/**\n * Resolve a Builder credential for the current request. User/org credentials\n * win; deployment env is only a fallback. This lets local/root .env keys keep\n * a template working while still allowing users to connect their own Builder\n * account from Settings or onboarding.\n */\nexport async function resolveBuilderCredential(\n key: string,\n): Promise<string | null> {\n const scoped = await resolveScopedBuilderCredential(key);\n if (scoped) return scoped.value;\n if (!canUseBuilderDeployCredentialFallbackForRequest()) return null;\n return readDeployCredentialEnv(key) ?? null;\n}\n\n/**\n * True when `BUILDER_PRIVATE_KEY` is set at the deployment level. This means\n * a deploy-level fallback exists; it does not prevent per-user connect.\n */\nexport function isBuilderEnvManaged(): boolean {\n return !!process.env.BUILDER_PRIVATE_KEY;\n}\n\n/**\n * Resolve the Builder private key for the current request. User/org OAuth\n * credentials win; deploy-level `BUILDER_PRIVATE_KEY` is the fallback.\n */\nexport async function resolveBuilderPrivateKey(): Promise<string | null> {\n return resolveBuilderCredential(\"BUILDER_PRIVATE_KEY\");\n}\n\n/**\n * Resolve the current user's Builder auth header.\n * Returns `\"Bearer <key>\"` or null.\n */\nexport async function resolveBuilderAuthHeader(): Promise<string | null> {\n const key = await resolveBuilderPrivateKey();\n return key ? `Bearer ${key}` : null;\n}\n\n/**\n * Check whether the current user has a Builder private key configured\n * (per-user or deployment-level).\n */\nexport async function resolveHasBuilderPrivateKey(): Promise<boolean> {\n return !!(await resolveBuilderPrivateKey());\n}\n\n/**\n * Check whether the current request has the complete Builder credential bundle\n * needed for Builder-backed assistant/image-generation calls.\n */\nexport async function resolveHasCompleteBuilderConnection(): Promise<boolean> {\n const creds = await resolveBuilderCredentials();\n return !!(creds.privateKey && creds.publicKey);\n}\n\n/**\n * Resolve where the effective Builder assistant connection came from. This\n * intentionally requires a complete private+public key pair from one scope so\n * status UIs don't report a mixed user/org credential set as connected.\n */\nexport async function resolveBuilderCredentialSource(): Promise<BuilderCredentialSource | null> {\n const scoped = await resolveScopedBuilderCredentials();\n if (scoped) return scoped.source;\n return canUseBuilderDeployCredentialFallbackForRequest() &&\n process.env.BUILDER_PRIVATE_KEY\n ? \"env\"\n : null;\n}\n\n/**\n * Resolve the Builder assistant credential bundle from one complete scope.\n * A partial user row is treated as a miss so the org-shared connection can\n * still power the assistant for teammates.\n */\nexport async function resolveBuilderCredentials(): Promise<{\n privateKey: string | null;\n publicKey: string | null;\n userId: string | null;\n orgName: string | null;\n orgKind: string | null;\n subscription: string | null;\n subscriptionLevel: string | null;\n subscriptionName: string | null;\n isEnterprise: boolean | null;\n isFreeAccount: boolean | null;\n}> {\n const scoped = await resolveScopedBuilderCredentials();\n if (scoped) {\n const {\n privateKey,\n publicKey,\n userId,\n orgName,\n orgKind,\n subscription,\n subscriptionLevel,\n subscriptionName,\n isEnterprise,\n isFreeAccount,\n } = scoped;\n return {\n privateKey,\n publicKey,\n userId,\n orgName,\n orgKind,\n subscription,\n subscriptionLevel,\n subscriptionName,\n isEnterprise,\n isFreeAccount,\n };\n }\n const privateKey = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_PRIVATE_KEY\") ?? null)\n : null;\n const publicKey = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_PUBLIC_KEY\") ?? null)\n : null;\n const userId = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_USER_ID\") ?? null)\n : null;\n const orgName = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_ORG_NAME\") ?? null)\n : null;\n const orgKind = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_ORG_KIND\") ?? null)\n : null;\n const subscription = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_SUBSCRIPTION\") ?? null)\n : null;\n const subscriptionLevel = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_SUBSCRIPTION_LEVEL\") ?? null)\n : null;\n const subscriptionName = canUseBuilderDeployCredentialFallbackForRequest()\n ? (readDeployCredentialEnv(\"BUILDER_SUBSCRIPTION_NAME\") ?? null)\n : null;\n const isEnterprise = canUseBuilderDeployCredentialFallbackForRequest()\n ? readOptionalBuilderBoolean(\n readDeployCredentialEnv(\"BUILDER_IS_ENTERPRISE\"),\n )\n : null;\n const isFreeAccount = canUseBuilderDeployCredentialFallbackForRequest()\n ? readOptionalBuilderBoolean(\n readDeployCredentialEnv(\"BUILDER_IS_FREE_ACCOUNT\"),\n )\n : null;\n return {\n privateKey,\n publicKey,\n userId,\n orgName,\n orgKind,\n subscription,\n subscriptionLevel,\n subscriptionName,\n isEnterprise,\n isFreeAccount,\n };\n}\n\nconst BUILDER_AUTH_FAILURE_SETTING_PREFIX = \"builder-auth-failure:\";\n\nexport interface BuilderCredentialAuthFailure {\n fingerprint: string;\n message: string;\n status?: number;\n code?: string;\n at: number;\n ownerEmail?: string | null;\n orgId?: string | null;\n}\n\nexport function builderCredentialFingerprint(\n privateKey?: string | null,\n publicKey?: string | null,\n): string | null {\n if (!privateKey || !publicKey) return null;\n return createHash(\"sha256\")\n .update(privateKey)\n .update(\"\\0\")\n .update(publicKey)\n .digest(\"hex\")\n .slice(0, 24);\n}\n\nfunction builderAuthFailureSettingKey(fingerprint: string): string {\n return `${BUILDER_AUTH_FAILURE_SETTING_PREFIX}${fingerprint}`;\n}\n\nexport async function getBuilderCredentialAuthFailure(\n creds: {\n privateKey?: string | null;\n publicKey?: string | null;\n } = {},\n): Promise<BuilderCredentialAuthFailure | null> {\n const fingerprint = builderCredentialFingerprint(\n creds.privateKey,\n creds.publicKey,\n );\n if (!fingerprint) return null;\n try {\n const { getSetting } = await import(\"../settings/store.js\");\n const row = await getSetting(builderAuthFailureSettingKey(fingerprint));\n if (!row) return null;\n return {\n fingerprint,\n message:\n typeof row.message === \"string\" && row.message\n ? row.message\n : \"Builder rejected the connected credentials. Reconnect Builder.io.\",\n status: typeof row.status === \"number\" ? row.status : undefined,\n code: typeof row.code === \"string\" ? row.code : undefined,\n at: typeof row.at === \"number\" ? row.at : Date.now(),\n ownerEmail:\n typeof row.ownerEmail === \"string\" ? row.ownerEmail : undefined,\n orgId: typeof row.orgId === \"string\" ? row.orgId : undefined,\n };\n } catch {\n return null;\n }\n}\n\nexport async function recordBuilderCredentialAuthFailure(details?: {\n status?: number;\n code?: string;\n message?: string;\n}): Promise<void> {\n try {\n const creds = await resolveBuilderCredentials();\n const fingerprint = builderCredentialFingerprint(\n creds.privateKey,\n creds.publicKey,\n );\n if (!fingerprint) return;\n const { putSetting } = await import(\"../settings/store.js\");\n await putSetting(builderAuthFailureSettingKey(fingerprint), {\n fingerprint,\n message:\n details?.message ||\n \"Builder rejected the connected credentials. Reconnect Builder.io.\",\n ...(typeof details?.status === \"number\" && { status: details.status }),\n ...(details?.code && { code: details.code }),\n at: Date.now(),\n ownerEmail: getRequestUserEmail() ?? null,\n orgId: getRequestOrgId() ?? null,\n });\n } catch {\n // Best-effort marker only; the chat error is still returned to the user.\n }\n}\n\nexport async function clearBuilderCredentialAuthFailure(creds: {\n privateKey?: string | null;\n publicKey?: string | null;\n}): Promise<void> {\n const fingerprint = builderCredentialFingerprint(\n creds.privateKey,\n creds.publicKey,\n );\n if (!fingerprint) return;\n try {\n const { deleteSetting } = await import(\"../settings/store.js\");\n await deleteSetting(builderAuthFailureSettingKey(fingerprint));\n } catch {\n // A stale failure marker should not block writing fresh credentials.\n }\n}\n\n/**\n * Write Builder credentials to `app_secrets`.\n *\n * Scope decision (see `resolveCredentialWriteScope`): when the connecting\n * user is owner/admin of an active org we write at `scope: \"org\"` so every\n * member of that org auto-resolves the credentials via\n * `resolveBuilderCredential`'s org fallback — no per-user re-connect\n * needed. A plain member or a user with no active org writes at\n * `scope: \"user\"` (the safe default that doesn't trample the org's shared\n * connection).\n *\n * Stale-credential cleanup: before writing the new values we (1) clear ALL\n * five BUILDER_* keys at the target scope, so optional fields the new\n * connection doesn't carry (e.g. user picked a Builder space that returns\n * no orgName) don't leave the previous connection's metadata behind, and\n * (2) when writing at org scope, also clear the writer's own user-scope\n * BUILDER_* rows so a stale personal override from an earlier connect\n * doesn't shadow the new org write on resolution (user scope wins org\n * scope by design — see `resolveScopedBuilderCredential`). The org-scope\n * row is intentionally left alone when writing at user scope: that row is\n * shared with the rest of the org and a single user's personal override\n * shouldn't blow it away. (Victoria's \"I signed in again with my Builder\n * space and it still says no credits\" report on 2026-05-11 was exactly\n * this stale-shadow case.)\n *\n * Returns the actual scope/scopeId used so the caller can show \"Connected\n * for Builder.io\" vs \"Connected (personal)\" in the UI.\n */\nexport async function writeBuilderCredentials(\n email: string,\n creds: {\n privateKey: string;\n publicKey: string;\n userId?: string | null;\n orgName?: string | null;\n orgKind?: string | null;\n subscription?: string | null;\n subscriptionLevel?: string | null;\n subscriptionName?: string | null;\n isEnterprise?: boolean | null;\n isFreeAccount?: boolean | null;\n },\n options?: { orgId?: string | null; role?: string | null },\n): Promise<{ scope: \"user\" | \"org\"; scopeId: string }> {\n const privateKey = creds.privateKey.trim();\n const publicKey = creds.publicKey.trim();\n if (!isBuilderPrivateKey(privateKey)) {\n throw new Error(\n \"Builder returned a credential that is not a Builder private key (expected bpk-...). Restart the Builder connect flow and choose a space that can issue a private key.\",\n );\n }\n if (!publicKey) {\n throw new Error(\n \"Builder did not return a public API key. Restart the Builder connect flow.\",\n );\n }\n\n const { writeAppSecret, deleteAppSecret } =\n await import(\"../secrets/storage.js\");\n const target = resolveCredentialWriteScope(\n email,\n options?.orgId ?? null,\n options?.role ?? null,\n );\n\n // Clear stale rows before writing the new connection. See the function's\n // doc comment for the two cases this handles.\n const cleanups: Array<Promise<unknown>> = BUILDER_CREDENTIAL_KEYS.map((key) =>\n deleteAppSecret({\n key,\n scope: target.scope,\n scopeId: target.scopeId,\n }).catch(() => {}),\n );\n if (target.scope === \"org\") {\n for (const key of BUILDER_CREDENTIAL_KEYS) {\n cleanups.push(\n deleteAppSecret({ key, scope: \"user\", scopeId: email }).catch(() => {}),\n );\n }\n }\n await Promise.all(cleanups);\n\n const entries: Array<{ key: string; value: string }> = [\n { key: \"BUILDER_PRIVATE_KEY\", value: privateKey },\n { key: \"BUILDER_PUBLIC_KEY\", value: publicKey },\n ];\n if (creds.userId) {\n entries.push({ key: \"BUILDER_USER_ID\", value: creds.userId });\n }\n if (creds.orgName) {\n entries.push({ key: \"BUILDER_ORG_NAME\", value: creds.orgName });\n }\n if (creds.orgKind) {\n entries.push({ key: \"BUILDER_ORG_KIND\", value: creds.orgKind });\n }\n if (creds.subscription) {\n entries.push({ key: \"BUILDER_SUBSCRIPTION\", value: creds.subscription });\n }\n if (creds.subscriptionLevel) {\n entries.push({\n key: \"BUILDER_SUBSCRIPTION_LEVEL\",\n value: creds.subscriptionLevel,\n });\n }\n if (creds.subscriptionName) {\n entries.push({\n key: \"BUILDER_SUBSCRIPTION_NAME\",\n value: creds.subscriptionName,\n });\n }\n if (typeof creds.isEnterprise === \"boolean\") {\n entries.push({\n key: \"BUILDER_IS_ENTERPRISE\",\n value: String(creds.isEnterprise),\n });\n }\n if (typeof creds.isFreeAccount === \"boolean\") {\n entries.push({\n key: \"BUILDER_IS_FREE_ACCOUNT\",\n value: String(creds.isFreeAccount),\n });\n }\n await Promise.all(\n entries.map(({ key, value }) =>\n writeAppSecret({\n key,\n value,\n scope: target.scope,\n scopeId: target.scopeId,\n }),\n ),\n );\n await clearBuilderCredentialAuthFailure({\n privateKey,\n publicKey,\n });\n return target;\n}\n\n/**\n * Delete Builder credentials.\n *\n * Default behaviour: clears only this user's per-user override (so a\n * member can disconnect their personal Builder identity without\n * collapsing the org-wide connection for every teammate). To revoke the\n * org's shared connection, pass `{ orgId, role }` for an owner/admin —\n * matching the same authority gate `writeBuilderCredentials` uses on\n * write. Plain members can never reach the org-scoped row.\n */\nexport async function deleteBuilderCredentials(\n email: string,\n options?: { orgId?: string | null; role?: string | null },\n): Promise<{ scope: \"user\" | \"org\"; scopeId: string }> {\n const { deleteAppSecret } = await import(\"../secrets/storage.js\");\n const target = resolveCredentialWriteScope(\n email,\n options?.orgId ?? null,\n options?.role ?? null,\n );\n await Promise.all(\n BUILDER_CREDENTIAL_KEYS.map((key) =>\n deleteAppSecret({\n key,\n scope: target.scope,\n scopeId: target.scopeId,\n }).catch(() => {}),\n ),\n );\n return target;\n}\n\n// ---------------------------------------------------------------------------\n// Generic request-scoped secret resolution\n//\n// New consumers should prefer this over reading `process.env.X` directly.\n// User-pasted and shared secrets live in `app_secrets` (encrypted). The\n// settings UI / onboarding panels can write user, org, or workspace rows.\n// Deploy-level env vars are the fallback for unauthenticated/CLI/background\n// contexts where there's no user to scope by. Authenticated requests may also\n// use app-provided LLM provider keys such as OPENAI_API_KEY or\n// ANTHROPIC_API_KEY, but Builder identity keys keep the stricter scoped policy.\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a request-scoped secret. Reads from `app_secrets` first (current\n * user override, active org, then workspace row); falls back to `process.env`\n * only when the deploy fallback policy allows it.\n */\nexport async function resolveSecret(key: string): Promise<string | null> {\n const traceLookup = shouldTraceCredentialResolve();\n const email = getRequestUserEmail();\n if (email) {\n try {\n const { readAppSecret } = await import(\"../secrets/storage.js\");\n // Per-user override first.\n const userSecret = await readAppSecret({\n key,\n scope: \"user\",\n scopeId: email,\n });\n if (userSecret?.value) {\n if (traceLookup) {\n console.log(\n `[resolve-secret] key=${key} email=${email} scope=user hit=true`,\n );\n }\n return userSecret.value;\n }\n\n const orgId = getRequestOrgId();\n if (orgId) {\n // Fall back to the active org's shared row, when present. Builder\n // Connect uses this first-class org scope.\n const orgSecret = await readAppSecret({\n key,\n scope: \"org\",\n scopeId: orgId,\n });\n if (orgSecret?.value) {\n if (traceLookup) {\n console.log(\n `[resolve-secret] key=${key} email=${email} orgId=${orgId} scope=org hit=true`,\n );\n }\n return orgSecret.value;\n }\n\n // Registered secrets historically used \"workspace\" scope for\n // org-shared configuration. Keep reading it so Settings status and\n // runtime resolution agree.\n const workspaceSecret = await readAppSecret({\n key,\n scope: \"workspace\",\n scopeId: orgId,\n });\n if (workspaceSecret?.value) {\n if (traceLookup) {\n console.log(\n `[resolve-secret] key=${key} email=${email} orgId=${orgId} scope=workspace hit=true`,\n );\n }\n return workspaceSecret.value;\n }\n } else {\n const soloWorkspaceSecret = await readAppSecret({\n key,\n scope: \"workspace\",\n scopeId: `solo:${email}`,\n });\n if (soloWorkspaceSecret?.value) {\n if (traceLookup) {\n console.log(\n `[resolve-secret] key=${key} email=${email} scope=workspace-solo hit=true`,\n );\n }\n return soloWorkspaceSecret.value;\n }\n }\n } catch (err) {\n if (traceLookup) {\n console.log(\n `[resolve-secret] key=${key} email=${email} scope=error err=${(err as Error)?.message ?? err}`,\n );\n }\n // Secrets table not ready — treat as missing.\n }\n // Read deployment-provided env values as fallbacks; framework code must not\n // write to `process.env`, but keys supplied by the host remain valid config.\n // Builder credentials keep a narrower path below because those keys carry a\n // Builder identity rather than just enabling a provider call.\n const envFallback = (\n isBuilderCredentialKey(key)\n ? canUseBuilderDeployCredentialFallbackForRequest()\n : canUseDeployCredentialFallbackForRequest(key)\n )\n ? process.env[key] || null\n : null;\n if (traceLookup) {\n console.log(\n `[resolve-secret] key=${key} email=${email} orgId=${getRequestOrgId() ?? \"(none)\"} scope=${envFallback ? \"env-fallback\" : \"none\"} hit=${!!envFallback}`,\n );\n }\n return envFallback;\n }\n // Unauthenticated / local-dev / CLI / background context: env fallback\n // is safe because there's no user to mis-identify.\n const value = process.env[key] || null;\n if (traceLookup) {\n console.log(\n `[resolve-secret] key=${key} email=(none) scope=env-anonymous hit=${!!value}`,\n );\n }\n return value;\n}\n\n// ---------------------------------------------------------------------------\n// Synchronous helpers — env-only fallbacks for contexts where per-user\n// lookup isn't possible (sync isConfigured checks, CLI scripts).\n// ---------------------------------------------------------------------------\n\n/**\n * True when a Builder private key is configured at the deployment level.\n *\n * This is the same env-only check as `isBuilderEnvManaged()`. For \"does this\n * request have access to Builder via user/org/env credentials?\" use the async\n * `resolveHasBuilderPrivateKey()`.\n */\nexport function hasBuilderPrivateKey(): boolean {\n return !!process.env.BUILDER_PRIVATE_KEY;\n}\n\n/** The origin for Builder-proxied API calls. Overridable for testing. */\nexport function getBuilderProxyOrigin(): string {\n return (\n process.env.BUILDER_PROXY_ORIGIN ||\n process.env.AIR_HOST ||\n process.env.BUILDER_API_HOST ||\n \"https://api.builder.io\"\n );\n}\n\n/**\n * Base URL for the public Builder LLM gateway, which lives at\n * api.builder.io/agent-native/gateway.\n * Override via BUILDER_GATEWAY_BASE_URL for staging / testing.\n */\nexport function getBuilderGatewayBaseUrl(): string {\n return (\n process.env.BUILDER_GATEWAY_BASE_URL ||\n \"https://api.builder.io/agent-native/gateway/v1\"\n );\n}\n\n/**\n * Base URL for Builder-managed image generation.\n * Override via BUILDER_IMAGE_GENERATION_BASE_URL for staging / testing.\n */\nexport function getBuilderImageGenerationBaseUrl(): string {\n return (\n process.env.BUILDER_IMAGE_GENERATION_BASE_URL ||\n \"https://api.builder.io/agent-native/images/v1\"\n );\n}\n\n/**\n * Base URL for Builder-managed web search.\n * Override via BUILDER_WEB_SEARCH_BASE_URL for staging / testing.\n */\nexport function getBuilderWebSearchBaseUrl(): string {\n return (\n process.env.BUILDER_WEB_SEARCH_BASE_URL ||\n \"https://api.builder.io/agent-native/web-search/v1\"\n );\n}\n\n/** Authorization header value for Builder-proxied calls (env-only). */\nexport function getBuilderAuthHeader(): string | null {\n const key = process.env.BUILDER_PRIVATE_KEY;\n return key ? `Bearer ${key}` : null;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../src/server/csrf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAiHH;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,eAAe,GAAE,MAAyB;;GAqB3C"}
1
+ {"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../src/server/csrf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAoHH;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,eAAe,GAAE,MAAyB;;GAqB3C"}
@@ -55,6 +55,9 @@ const CSRF_ALLOWLIST_PREFIXES = [
55
55
  // Agent Teams durable sub-agent processor self-fire — verified by the same
56
56
  // HMAC internal-token scheme as the integration/A2A processors.
57
57
  "/agent-teams/",
58
+ // Durable sandbox-execution processor self-fire (run-code background
59
+ // queue) — verified by the same HMAC internal-token scheme.
60
+ "/sandbox/_process-execution",
58
61
  // A2A JSON-RPC endpoints — verified by signed JWT (when A2A_SECRET set) or
59
62
  // explicitly opt-in unauthenticated (handled at the A2A layer).
60
63
  "/a2a",
@@ -1 +1 @@
1
- {"version":3,"file":"csrf.js","sourceRoot":"","sources":["../../src/server/csrf.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Defense-in-depth CSRF check for framework state-changing routes.\n *\n * Threat model: action endpoints (`/_agent-native/actions/*`), extension\n * endpoints (`/_agent-native/extensions/*` and the legacy\n * `/_agent-native/tools/*` alias), and a handful of other state-changing\n * `/_agent-native/*` routes use the better-auth session cookie, which is\n * configured with `SameSite=None; Secure; Partitioned` so the iframe editor\n * (and other cross-site embeds) can authenticate. `SameSite=None` means the\n * browser ships the session cookie on top-level form POSTs from any origin —\n * which is exactly the precondition for classic cross-site request forgery.\n *\n * The browser still gates \"non-simple\" requests behind a CORS preflight, so\n * an attacker who has to send `Content-Type: application/json` is forced\n * through OPTIONS, which our CORS middleware (`create-server.ts`) rejects\n * for disallowed origins. But the simple-request bypass (`Content-Type:\n * text/plain` on a `<form enctype=\"text/plain\">` POST, or `multipart/form-data`)\n * never preflights — the browser delivers it cross-origin with cookies.\n *\n * Mitigation: this middleware rejects any state-changing\n * (`POST/PUT/PATCH/DELETE`) request to `/_agent-native/*` that\n *\n * 1. carries the auth-cookie pattern (any cookie at all is a heuristic\n * good-enough proxy — we don't want to deny anonymous fetches), AND\n * 2. is NOT clearly same-origin / first-party. We trust:\n * - `Sec-Fetch-Site: same-origin` (sent by every modern browser on\n * same-origin fetch — Chrome/Firefox/Safari/Edge all support it).\n * - `X-Agent-Native-CSRF` custom header. Custom headers force a\n * preflight, so an attacker can't add one cross-origin.\n * - `Content-Type: application/json` request body. Same logic — JSON\n * Content-Type is a non-simple request that triggers preflight.\n *\n * Why the existing CORS check isn't enough: a simple-request POST never\n * preflights, so the browser sends it through and only blocks the *response*\n * from being readable cross-origin. The state change (delete-account, write\n * SQL, etc.) happens server-side regardless. We need a server-side check that\n * proves first-party intent before running the action.\n *\n * Opt-out marker: a handful of routes legitimately accept cross-origin POSTs\n * — webhook endpoints (Slack, Telegram, email), the public A2A endpoint\n * (`/_agent-native/a2a`), the integrations process-task self-fire, and so on.\n * Those are listed in `CSRF_ALLOWLIST_PREFIXES` below; if you add a new\n * cross-origin-callable route, add it there.\n */\n\nimport {\n defineEventHandler,\n getMethod,\n getRequestHeader,\n setResponseStatus,\n} from \"h3\";\n\n/**\n * Path prefixes (relative to the framework prefix `/_agent-native`) that are\n * allowed to receive cross-origin state-changing POSTs without first-party\n * markers. These are signed/authenticated through other mechanisms (HMAC,\n * JWT, internal token) so they don't need cookie-based CSRF protection.\n */\nconst CSRF_ALLOWLIST_PREFIXES = [\n // Integration webhooks — verified by HMAC against a per-integration secret.\n \"/integrations/\",\n // Agent Teams durable sub-agent processor self-fire — verified by the same\n // HMAC internal-token scheme as the integration/A2A processors.\n \"/agent-teams/\",\n // A2A JSON-RPC endpoints — verified by signed JWT (when A2A_SECRET set) or\n // explicitly opt-in unauthenticated (handled at the A2A layer).\n \"/a2a\",\n // Better Auth's own login/sign-in/social-callback routes. Better Auth\n // ships its own CSRF protection (Origin/Sec-Fetch checks on its handlers)\n // and cookies are needed for the OAuth callback round-trip.\n \"/auth/\",\n // Stripe / Paddle / billing webhooks dropped in by templates.\n \"/billing/webhook\",\n // Public share endpoints — read-only and never cookie-driven, but kept\n // here so a templated POST (e.g. comment-on-public-recording) doesn't 403.\n \"/share/\",\n // OAuth callbacks (Builder, Google, Slack, Notion, Zoom). These get a\n // `code` query param via top-level navigation — they DO ride the session\n // cookie and they SHOULD validate state, but the framework can't see the\n // state token. Each callback handler is responsible for its own CSRF\n // check (signed state tokens).\n \"/oauth/\",\n // Builder's CLI-auth callback — uses the BUILDER_STATE_PARAM signed token\n // to authenticate the round-trip; framework CSRF check would block it.\n \"/builder/callback\",\n];\n\nconst STATE_CHANGING_METHODS = new Set([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"]);\n\n/**\n * Decide whether a request is \"first-party enough\" to trust as not-CSRF.\n * Any of the following make a request non-CSRF:\n *\n * - `Sec-Fetch-Site: same-origin` (or `none` for top-level navigations\n * to our own pages — but state-changing methods don't ship `none`).\n * - `X-Agent-Native-CSRF` header (any value, even \"1\"). This is a custom\n * header so the browser forces a preflight cross-origin, which our\n * CORS layer rejects for disallowed origins.\n * - `Content-Type: application/json` (case-insensitive). JSON content\n * type is a non-simple request that triggers preflight.\n *\n * We accept ANY of these — the goal is \"did the request come through a\n * channel the browser would have preflighted\", not a strict-mode token.\n *\n * NOTE: `Sec-Fetch-Site: same-site` is deliberately NOT trusted. Under a\n * shared cookie domain (COOKIE_DOMAIN / crossSubDomainCookies), the browser\n * labels a request from a SIBLING subdomain (evil.example.com → app.example.com)\n * as `same-site` even though it is cross-origin and would ride the shared\n * session cookie — a CSRF vector. Legitimate first-party clients all also send\n * `X-Agent-Native-CSRF` or `application/json`, so they still pass via those\n * paths and iframe/embed flows are unaffected.\n */\nfunction looksFirstParty(event: any): boolean {\n const sfs = getRequestHeader(event, \"sec-fetch-site\");\n if (sfs === \"same-origin\" || sfs === \"none\") {\n return true;\n }\n if (getRequestHeader(event, \"x-agent-native-csrf\")) {\n return true;\n }\n const contentType = getRequestHeader(event, \"content-type\");\n if (\n contentType &&\n typeof contentType === \"string\" &&\n contentType.toLowerCase().includes(\"application/json\")\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true when the request carries any cookie. We use \"has any cookie\"\n * as a coarse heuristic for \"the browser is going to attach the session\n * cookie\" — anonymous tools (curl, server-to-server) typically don't send\n * cookies, so they bypass this check entirely.\n */\nfunction requestHasCookies(event: any): boolean {\n const cookie = getRequestHeader(event, \"cookie\");\n return typeof cookie === \"string\" && cookie.trim().length > 0;\n}\n\n/**\n * Path passed in is the full request URL pathname (e.g. `/_agent-native/actions/foo`).\n * `frameworkPrefix` should be the framework route prefix without trailing slash,\n * e.g. `/_agent-native`.\n */\nfunction isOnAllowlist(pathname: string, frameworkPrefix: string): boolean {\n if (!pathname.startsWith(frameworkPrefix)) return false;\n const sub = pathname.slice(frameworkPrefix.length);\n for (const allowed of CSRF_ALLOWLIST_PREFIXES) {\n if (sub.startsWith(allowed)) return true;\n }\n return false;\n}\n\n/**\n * Create the framework CSRF middleware.\n *\n * Mount this BEFORE any state-changing route handler. The middleware\n * - lets every non-state-changing method through (GET/HEAD/OPTIONS).\n * - lets requests without cookies through (anonymous/server tools).\n * - lets allowlisted paths through (webhooks, A2A, OAuth callbacks).\n * - lets first-party-shaped requests through (custom header, JSON\n * Content-Type, or `Sec-Fetch-Site: same-origin`).\n * - rejects everything else with 403.\n */\nexport function createCsrfMiddleware(\n frameworkPrefix: string = \"/_agent-native\",\n) {\n return defineEventHandler((event) => {\n const method = getMethod(event);\n if (!STATE_CHANGING_METHODS.has(method)) return undefined;\n\n const pathname = event.url?.pathname ?? \"\";\n if (!pathname.startsWith(frameworkPrefix)) return undefined;\n if (isOnAllowlist(pathname, frameworkPrefix)) return undefined;\n\n // No cookie = no risk of confused-deputy CSRF on the session cookie.\n if (!requestHasCookies(event)) return undefined;\n\n if (looksFirstParty(event)) return undefined;\n\n setResponseStatus(event, 403);\n return {\n error:\n \"CSRF check failed: state-changing requests must include a same-origin marker. Set Content-Type: application/json or X-Agent-Native-CSRF: 1.\",\n };\n });\n}\n"]}
1
+ {"version":3,"file":"csrf.js","sourceRoot":"","sources":["../../src/server/csrf.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Defense-in-depth CSRF check for framework state-changing routes.\n *\n * Threat model: action endpoints (`/_agent-native/actions/*`), extension\n * endpoints (`/_agent-native/extensions/*` and the legacy\n * `/_agent-native/tools/*` alias), and a handful of other state-changing\n * `/_agent-native/*` routes use the better-auth session cookie, which is\n * configured with `SameSite=None; Secure; Partitioned` so the iframe editor\n * (and other cross-site embeds) can authenticate. `SameSite=None` means the\n * browser ships the session cookie on top-level form POSTs from any origin —\n * which is exactly the precondition for classic cross-site request forgery.\n *\n * The browser still gates \"non-simple\" requests behind a CORS preflight, so\n * an attacker who has to send `Content-Type: application/json` is forced\n * through OPTIONS, which our CORS middleware (`create-server.ts`) rejects\n * for disallowed origins. But the simple-request bypass (`Content-Type:\n * text/plain` on a `<form enctype=\"text/plain\">` POST, or `multipart/form-data`)\n * never preflights — the browser delivers it cross-origin with cookies.\n *\n * Mitigation: this middleware rejects any state-changing\n * (`POST/PUT/PATCH/DELETE`) request to `/_agent-native/*` that\n *\n * 1. carries the auth-cookie pattern (any cookie at all is a heuristic\n * good-enough proxy — we don't want to deny anonymous fetches), AND\n * 2. is NOT clearly same-origin / first-party. We trust:\n * - `Sec-Fetch-Site: same-origin` (sent by every modern browser on\n * same-origin fetch — Chrome/Firefox/Safari/Edge all support it).\n * - `X-Agent-Native-CSRF` custom header. Custom headers force a\n * preflight, so an attacker can't add one cross-origin.\n * - `Content-Type: application/json` request body. Same logic — JSON\n * Content-Type is a non-simple request that triggers preflight.\n *\n * Why the existing CORS check isn't enough: a simple-request POST never\n * preflights, so the browser sends it through and only blocks the *response*\n * from being readable cross-origin. The state change (delete-account, write\n * SQL, etc.) happens server-side regardless. We need a server-side check that\n * proves first-party intent before running the action.\n *\n * Opt-out marker: a handful of routes legitimately accept cross-origin POSTs\n * — webhook endpoints (Slack, Telegram, email), the public A2A endpoint\n * (`/_agent-native/a2a`), the integrations process-task self-fire, and so on.\n * Those are listed in `CSRF_ALLOWLIST_PREFIXES` below; if you add a new\n * cross-origin-callable route, add it there.\n */\n\nimport {\n defineEventHandler,\n getMethod,\n getRequestHeader,\n setResponseStatus,\n} from \"h3\";\n\n/**\n * Path prefixes (relative to the framework prefix `/_agent-native`) that are\n * allowed to receive cross-origin state-changing POSTs without first-party\n * markers. These are signed/authenticated through other mechanisms (HMAC,\n * JWT, internal token) so they don't need cookie-based CSRF protection.\n */\nconst CSRF_ALLOWLIST_PREFIXES = [\n // Integration webhooks — verified by HMAC against a per-integration secret.\n \"/integrations/\",\n // Agent Teams durable sub-agent processor self-fire — verified by the same\n // HMAC internal-token scheme as the integration/A2A processors.\n \"/agent-teams/\",\n // Durable sandbox-execution processor self-fire (run-code background\n // queue) — verified by the same HMAC internal-token scheme.\n \"/sandbox/_process-execution\",\n // A2A JSON-RPC endpoints — verified by signed JWT (when A2A_SECRET set) or\n // explicitly opt-in unauthenticated (handled at the A2A layer).\n \"/a2a\",\n // Better Auth's own login/sign-in/social-callback routes. Better Auth\n // ships its own CSRF protection (Origin/Sec-Fetch checks on its handlers)\n // and cookies are needed for the OAuth callback round-trip.\n \"/auth/\",\n // Stripe / Paddle / billing webhooks dropped in by templates.\n \"/billing/webhook\",\n // Public share endpoints — read-only and never cookie-driven, but kept\n // here so a templated POST (e.g. comment-on-public-recording) doesn't 403.\n \"/share/\",\n // OAuth callbacks (Builder, Google, Slack, Notion, Zoom). These get a\n // `code` query param via top-level navigation — they DO ride the session\n // cookie and they SHOULD validate state, but the framework can't see the\n // state token. Each callback handler is responsible for its own CSRF\n // check (signed state tokens).\n \"/oauth/\",\n // Builder's CLI-auth callback — uses the BUILDER_STATE_PARAM signed token\n // to authenticate the round-trip; framework CSRF check would block it.\n \"/builder/callback\",\n];\n\nconst STATE_CHANGING_METHODS = new Set([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"]);\n\n/**\n * Decide whether a request is \"first-party enough\" to trust as not-CSRF.\n * Any of the following make a request non-CSRF:\n *\n * - `Sec-Fetch-Site: same-origin` (or `none` for top-level navigations\n * to our own pages — but state-changing methods don't ship `none`).\n * - `X-Agent-Native-CSRF` header (any value, even \"1\"). This is a custom\n * header so the browser forces a preflight cross-origin, which our\n * CORS layer rejects for disallowed origins.\n * - `Content-Type: application/json` (case-insensitive). JSON content\n * type is a non-simple request that triggers preflight.\n *\n * We accept ANY of these — the goal is \"did the request come through a\n * channel the browser would have preflighted\", not a strict-mode token.\n *\n * NOTE: `Sec-Fetch-Site: same-site` is deliberately NOT trusted. Under a\n * shared cookie domain (COOKIE_DOMAIN / crossSubDomainCookies), the browser\n * labels a request from a SIBLING subdomain (evil.example.com → app.example.com)\n * as `same-site` even though it is cross-origin and would ride the shared\n * session cookie — a CSRF vector. Legitimate first-party clients all also send\n * `X-Agent-Native-CSRF` or `application/json`, so they still pass via those\n * paths and iframe/embed flows are unaffected.\n */\nfunction looksFirstParty(event: any): boolean {\n const sfs = getRequestHeader(event, \"sec-fetch-site\");\n if (sfs === \"same-origin\" || sfs === \"none\") {\n return true;\n }\n if (getRequestHeader(event, \"x-agent-native-csrf\")) {\n return true;\n }\n const contentType = getRequestHeader(event, \"content-type\");\n if (\n contentType &&\n typeof contentType === \"string\" &&\n contentType.toLowerCase().includes(\"application/json\")\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true when the request carries any cookie. We use \"has any cookie\"\n * as a coarse heuristic for \"the browser is going to attach the session\n * cookie\" — anonymous tools (curl, server-to-server) typically don't send\n * cookies, so they bypass this check entirely.\n */\nfunction requestHasCookies(event: any): boolean {\n const cookie = getRequestHeader(event, \"cookie\");\n return typeof cookie === \"string\" && cookie.trim().length > 0;\n}\n\n/**\n * Path passed in is the full request URL pathname (e.g. `/_agent-native/actions/foo`).\n * `frameworkPrefix` should be the framework route prefix without trailing slash,\n * e.g. `/_agent-native`.\n */\nfunction isOnAllowlist(pathname: string, frameworkPrefix: string): boolean {\n if (!pathname.startsWith(frameworkPrefix)) return false;\n const sub = pathname.slice(frameworkPrefix.length);\n for (const allowed of CSRF_ALLOWLIST_PREFIXES) {\n if (sub.startsWith(allowed)) return true;\n }\n return false;\n}\n\n/**\n * Create the framework CSRF middleware.\n *\n * Mount this BEFORE any state-changing route handler. The middleware\n * - lets every non-state-changing method through (GET/HEAD/OPTIONS).\n * - lets requests without cookies through (anonymous/server tools).\n * - lets allowlisted paths through (webhooks, A2A, OAuth callbacks).\n * - lets first-party-shaped requests through (custom header, JSON\n * Content-Type, or `Sec-Fetch-Site: same-origin`).\n * - rejects everything else with 403.\n */\nexport function createCsrfMiddleware(\n frameworkPrefix: string = \"/_agent-native\",\n) {\n return defineEventHandler((event) => {\n const method = getMethod(event);\n if (!STATE_CHANGING_METHODS.has(method)) return undefined;\n\n const pathname = event.url?.pathname ?? \"\";\n if (!pathname.startsWith(frameworkPrefix)) return undefined;\n if (isOnAllowlist(pathname, frameworkPrefix)) return undefined;\n\n // No cookie = no risk of confused-deputy CSRF on the session cookie.\n if (!requestHasCookies(event)) return undefined;\n\n if (looksFirstParty(event)) return undefined;\n\n setResponseStatus(event, 403);\n return {\n error:\n \"CSRF check failed: state-changing requests must include a same-origin marker. Set Content-Type: application/json or X-Agent-Native-CSRF: 1.\",\n };\n });\n}\n"]}
@@ -61,6 +61,7 @@ export { getAppProductionUrl, getFirstPartyProdUrl } from "./app-url.js";
61
61
  export { getConfiguredAppBasePath, normalizeAppBasePath, withConfiguredAppBasePath, } from "./app-base-path.js";
62
62
  export { signShortLivedToken, verifyShortLivedToken, type ShortLivedTokenClaims, type VerifyResult as ShortLivedTokenVerifyResult, } from "./short-lived-token.js";
63
63
  export { AGENT_ACCESS_PARAM, DEFAULT_AGENT_ACCESS_TTL_SECONDS, appendAgentAccessParam, buildAgentAccessApiUrl, buildAgentAccessUrl, createScopedAgentAccessGrant, normalizeAgentAccessBasePath, normalizeAgentAccessOrigin, scopedAgentAccessResourceId, signScopedAgentAccessToken, toAgentAccessUrl, verifyScopedAgentAccessToken, type AgentAccessApiUrlOptions, type AgentAccessResourceScope, type AgentAccessUrlOptions, type ScopedAgentAccessGrant, type ScopedAgentAccessTokenOptions, } from "./agent-access.js";
64
+ export { AGENT_READABLE_RESOURCE_PAYLOAD_TYPE, AGENT_READABLE_RESOURCE_SCRIPT_TYPE, buildAgentReadableResourceDiscovery, renderAgentReadableResourceDiscoveryScript, safeJsonForHtml, type AgentReadableResourceDiscovery, type BuildAgentReadableResourceDiscoveryOptions, } from "../shared/agent-readable-resource.js";
64
65
  export type NitroPluginDef = (nitroApp: any) => void | Promise<void>;
65
66
  export declare function defineNitroPlugin(def: NitroPluginDef): NitroPluginDef;
66
67
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -62,6 +62,7 @@ export { getAppProductionUrl, getFirstPartyProdUrl } from "./app-url.js";
62
62
  export { getConfiguredAppBasePath, normalizeAppBasePath, withConfiguredAppBasePath, } from "./app-base-path.js";
63
63
  export { signShortLivedToken, verifyShortLivedToken, } from "./short-lived-token.js";
64
64
  export { AGENT_ACCESS_PARAM, DEFAULT_AGENT_ACCESS_TTL_SECONDS, appendAgentAccessParam, buildAgentAccessApiUrl, buildAgentAccessUrl, createScopedAgentAccessGrant, normalizeAgentAccessBasePath, normalizeAgentAccessOrigin, scopedAgentAccessResourceId, signScopedAgentAccessToken, toAgentAccessUrl, verifyScopedAgentAccessToken, } from "./agent-access.js";
65
+ export { AGENT_READABLE_RESOURCE_PAYLOAD_TYPE, AGENT_READABLE_RESOURCE_SCRIPT_TYPE, buildAgentReadableResourceDiscovery, renderAgentReadableResourceDiscoveryScript, safeJsonForHtml, } from "../shared/agent-readable-resource.js";
65
66
  export function defineNitroPlugin(def) {
66
67
  return def;
67
68
  }