@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
@@ -0,0 +1,380 @@
1
+ /**
2
+ * Durable storage for queued `run-code` sandbox executions.
3
+ *
4
+ * A row in `sandbox_executions` is one background code-execution request: the
5
+ * raw user code plus enough identity (owner email, org, thread) to rebuild the
6
+ * action bridge context in a fresh process, and the full result once an
7
+ * executor finishes. This is what lets a long compute job survive the hosted
8
+ * serverless wall: the enqueueing request returns immediately, and any later
9
+ * invocation (self-dispatch processor, status poll, warm-instance sweep) can
10
+ * claim and run the row under its own budget.
11
+ *
12
+ * Concurrency model (single-writer via claim token + lease):
13
+ * - `claimSandboxExecution` atomically flips `queued → running` (or reclaims
14
+ * a `running` row whose lease expired) with `UPDATE … WHERE status = …`
15
+ * guards, so exactly one executor wins even when several invocations race.
16
+ * - The winning executor holds a random `claim_token` and heartbeats
17
+ * `lease_expires_at`; `finalizeSandboxExecution` only writes results when
18
+ * the token still matches, so a displaced executor can never clobber the
19
+ * reclaimer's result.
20
+ * - A row whose lease expired with attempts remaining is re-claimable; once
21
+ * attempts are exhausted `failExpiredSandboxExecution` marks it `failed`
22
+ * instead of leaving it "running" forever.
23
+ *
24
+ * Schema notes: additive-only, portable across Postgres (Neon) and SQLite —
25
+ * same `ensureTableExists`/dialect-branched DDL pattern as
26
+ * `resources/store.ts`. Timestamps are epoch-ms in `BIGINT`/`INTEGER` columns.
27
+ * Reads for user-facing surfaces are always owner-scoped
28
+ * (`getSandboxExecutionForOwner`); the unscoped internal reader exists only
29
+ * for the trusted executor/sweep paths.
30
+ */
31
+ import crypto from "node:crypto";
32
+ import { getDbExec, intType, isPostgres, retryOnDdlRace, } from "../../db/client.js";
33
+ import { ensureColumnExists, ensureIndexExists, ensureTableExists, } from "../../db/ddl-guard.js";
34
+ /** Default retry budget: the initial attempt plus one lease-expiry retry. */
35
+ export const SANDBOX_EXECUTION_DEFAULT_MAX_ATTEMPTS = 2;
36
+ /**
37
+ * Hard per-stream storage cap. The per-row `max_output_chars` (derived from
38
+ * the caller's `maxOutputChars`) is applied first; this bounds even that.
39
+ */
40
+ export const SANDBOX_EXECUTION_MAX_STORED_OUTPUT_CHARS = 200_000;
41
+ const TABLE = "sandbox_executions";
42
+ let _initPromise;
43
+ async function ensureTable() {
44
+ if (!_initPromise) {
45
+ _initPromise = _doEnsureTable().catch((err) => {
46
+ // Don't cache the rejection — let the next caller retry a fresh init.
47
+ _initPromise = undefined;
48
+ throw err;
49
+ });
50
+ }
51
+ return _initPromise;
52
+ }
53
+ /** Test-only: forget the memoized init so a fresh in-memory DB re-creates. */
54
+ export function resetSandboxExecutionsStoreForTests() {
55
+ _initPromise = undefined;
56
+ }
57
+ async function _doEnsureTable() {
58
+ const client = getDbExec();
59
+ const createSql = `
60
+ CREATE TABLE IF NOT EXISTS ${TABLE} (
61
+ id TEXT PRIMARY KEY,
62
+ owner TEXT NOT NULL,
63
+ org_id TEXT,
64
+ thread_id TEXT,
65
+ runtime TEXT NOT NULL DEFAULT 'node',
66
+ code TEXT NOT NULL,
67
+ status TEXT NOT NULL DEFAULT 'queued',
68
+ timeout_ms ${intType()} NOT NULL,
69
+ max_output_chars ${intType()} NOT NULL,
70
+ attempt_count ${intType()} NOT NULL DEFAULT 0,
71
+ max_attempts ${intType()} NOT NULL DEFAULT ${SANDBOX_EXECUTION_DEFAULT_MAX_ATTEMPTS},
72
+ claim_token TEXT,
73
+ lease_expires_at ${intType()},
74
+ stdout TEXT NOT NULL DEFAULT '',
75
+ stderr TEXT NOT NULL DEFAULT '',
76
+ stdout_truncated ${intType()} NOT NULL DEFAULT 0,
77
+ stderr_truncated ${intType()} NOT NULL DEFAULT 0,
78
+ exit_code ${intType()},
79
+ timed_out ${intType()} NOT NULL DEFAULT 0,
80
+ error TEXT,
81
+ bridge_tools_used TEXT,
82
+ created_at ${intType()} NOT NULL,
83
+ started_at ${intType()},
84
+ finished_at ${intType()},
85
+ updated_at ${intType()} NOT NULL
86
+ )
87
+ `;
88
+ const ownerIdxSql = `CREATE INDEX IF NOT EXISTS sandbox_executions_owner_created_idx ON ${TABLE} (owner, created_at)`;
89
+ const dueIdxSql = `CREATE INDEX IF NOT EXISTS sandbox_executions_due_idx ON ${TABLE} (status, lease_expires_at)`;
90
+ if (isPostgres()) {
91
+ // Probe information_schema first (no lock) and DDL only what's missing —
92
+ // same guarded pattern as resources/store.ts so a fresh background worker
93
+ // never blocks on an ACCESS EXCLUSIVE lock for schema that already exists.
94
+ await ensureTableExists(TABLE, createSql);
95
+ // Additive-column guard: keeps older deployments (created before a column
96
+ // was added) self-healing without destructive migrations.
97
+ const pgColumns = [["bridge_tools_used", "TEXT"]];
98
+ for (const [col, def] of pgColumns) {
99
+ await ensureColumnExists(TABLE, col, `ALTER TABLE ${TABLE} ADD COLUMN IF NOT EXISTS ${col} ${def}`);
100
+ }
101
+ await ensureIndexExists("sandbox_executions_owner_created_idx", ownerIdxSql);
102
+ await ensureIndexExists("sandbox_executions_due_idx", dueIdxSql);
103
+ }
104
+ else {
105
+ await retryOnDdlRace(() => client.execute(createSql));
106
+ await retryOnDdlRace(() => client.execute(ownerIdxSql));
107
+ await retryOnDdlRace(() => client.execute(dueIdxSql));
108
+ }
109
+ }
110
+ function capOutput(value, maxChars) {
111
+ const raw = typeof value === "string" ? value : "";
112
+ const cap = Math.max(1, Math.min(maxChars, SANDBOX_EXECUTION_MAX_STORED_OUTPUT_CHARS));
113
+ if (raw.length <= cap)
114
+ return { text: raw, truncated: false };
115
+ return { text: raw.slice(0, cap), truncated: true };
116
+ }
117
+ function toBool(value) {
118
+ return value === true || value === 1 || value === "1" || value === "true";
119
+ }
120
+ function toNumberOrNull(value) {
121
+ if (value === null || value === undefined || value === "")
122
+ return null;
123
+ const parsed = Number(value);
124
+ return Number.isFinite(parsed) ? parsed : null;
125
+ }
126
+ function rowFromDb(raw) {
127
+ let bridgeToolsUsed = [];
128
+ if (typeof raw.bridge_tools_used === "string" && raw.bridge_tools_used) {
129
+ try {
130
+ const parsed = JSON.parse(raw.bridge_tools_used);
131
+ if (Array.isArray(parsed)) {
132
+ bridgeToolsUsed = parsed.filter((item) => typeof item === "string");
133
+ }
134
+ }
135
+ catch {
136
+ bridgeToolsUsed = [];
137
+ }
138
+ }
139
+ return {
140
+ id: String(raw.id),
141
+ owner: String(raw.owner),
142
+ orgId: raw.org_id === null || raw.org_id === undefined
143
+ ? null
144
+ : String(raw.org_id),
145
+ threadId: raw.thread_id === null || raw.thread_id === undefined
146
+ ? null
147
+ : String(raw.thread_id),
148
+ runtime: String(raw.runtime ?? "node"),
149
+ code: String(raw.code ?? ""),
150
+ status: String(raw.status ?? "queued"),
151
+ timeoutMs: toNumberOrNull(raw.timeout_ms) ?? 0,
152
+ maxOutputChars: toNumberOrNull(raw.max_output_chars) ?? 0,
153
+ attemptCount: toNumberOrNull(raw.attempt_count) ?? 0,
154
+ maxAttempts: toNumberOrNull(raw.max_attempts) ??
155
+ SANDBOX_EXECUTION_DEFAULT_MAX_ATTEMPTS,
156
+ claimToken: raw.claim_token === null || raw.claim_token === undefined
157
+ ? null
158
+ : String(raw.claim_token),
159
+ leaseExpiresAt: toNumberOrNull(raw.lease_expires_at),
160
+ stdout: String(raw.stdout ?? ""),
161
+ stderr: String(raw.stderr ?? ""),
162
+ stdoutTruncated: toBool(raw.stdout_truncated),
163
+ stderrTruncated: toBool(raw.stderr_truncated),
164
+ exitCode: toNumberOrNull(raw.exit_code),
165
+ timedOut: toBool(raw.timed_out),
166
+ error: raw.error === null || raw.error === undefined ? null : String(raw.error),
167
+ bridgeToolsUsed,
168
+ createdAt: toNumberOrNull(raw.created_at) ?? 0,
169
+ startedAt: toNumberOrNull(raw.started_at),
170
+ finishedAt: toNumberOrNull(raw.finished_at),
171
+ updatedAt: toNumberOrNull(raw.updated_at) ?? 0,
172
+ };
173
+ }
174
+ /** Enqueue a new execution row in `queued` state. */
175
+ export async function createSandboxExecution(input) {
176
+ await ensureTable();
177
+ const client = getDbExec();
178
+ const now = Date.now();
179
+ const id = `sbx_${crypto.randomUUID()}`;
180
+ const maxAttempts = Math.max(1, Math.min(input.maxAttempts ?? SANDBOX_EXECUTION_DEFAULT_MAX_ATTEMPTS, 5));
181
+ await client.execute({
182
+ sql: `INSERT INTO ${TABLE}
183
+ (id, owner, org_id, thread_id, runtime, code, status, timeout_ms, max_output_chars, attempt_count, max_attempts, created_at, updated_at)
184
+ VALUES (?, ?, ?, ?, ?, ?, 'queued', ?, ?, 0, ?, ?, ?)`,
185
+ args: [
186
+ id,
187
+ input.owner,
188
+ input.orgId ?? null,
189
+ input.threadId ?? null,
190
+ input.runtime ?? "node",
191
+ input.code,
192
+ input.timeoutMs,
193
+ input.maxOutputChars,
194
+ maxAttempts,
195
+ now,
196
+ now,
197
+ ],
198
+ });
199
+ const row = await getSandboxExecutionInternal(id);
200
+ if (!row)
201
+ throw new Error(`sandbox execution ${id} vanished after insert`);
202
+ return row;
203
+ }
204
+ /** Owner-scoped read for user-facing status/result surfaces. */
205
+ export async function getSandboxExecutionForOwner(id, owner) {
206
+ if (!id || !owner)
207
+ return null;
208
+ await ensureTable();
209
+ const client = getDbExec();
210
+ const result = await client.execute({
211
+ sql: `SELECT * FROM ${TABLE} WHERE id = ? AND owner = ? LIMIT 1`,
212
+ args: [id, owner],
213
+ });
214
+ const raw = result.rows?.[0];
215
+ return raw ? rowFromDb(raw) : null;
216
+ }
217
+ /**
218
+ * Unscoped read for the trusted executor/sweep paths ONLY. Never expose this
219
+ * through a user-facing action — use `getSandboxExecutionForOwner`.
220
+ */
221
+ export async function getSandboxExecutionInternal(id) {
222
+ if (!id)
223
+ return null;
224
+ await ensureTable();
225
+ const client = getDbExec();
226
+ const result = await client.execute({
227
+ sql: `SELECT * FROM ${TABLE} WHERE id = ? LIMIT 1`,
228
+ args: [id],
229
+ });
230
+ const raw = result.rows?.[0];
231
+ return raw ? rowFromDb(raw) : null;
232
+ }
233
+ /**
234
+ * Atomically claim an execution for a single executor. Claims a `queued` row,
235
+ * or reclaims a `running` row whose lease expired, as long as the attempt
236
+ * budget is not exhausted. Returns the claimed row (with the new claim token)
237
+ * or null when another executor holds it / it is terminal / attempts ran out.
238
+ */
239
+ export async function claimSandboxExecution(id, claimToken, leaseMs, now = Date.now()) {
240
+ await ensureTable();
241
+ const client = getDbExec();
242
+ const result = await client.execute({
243
+ sql: `UPDATE ${TABLE}
244
+ SET status = 'running',
245
+ claim_token = ?,
246
+ lease_expires_at = ?,
247
+ attempt_count = attempt_count + 1,
248
+ started_at = COALESCE(started_at, ?),
249
+ updated_at = ?
250
+ WHERE id = ?
251
+ AND attempt_count < max_attempts
252
+ AND (
253
+ status = 'queued'
254
+ OR (status = 'running' AND lease_expires_at IS NOT NULL AND lease_expires_at < ?)
255
+ )`,
256
+ args: [claimToken, now + leaseMs, now, now, id, now],
257
+ });
258
+ if ((result.rowsAffected ?? 0) !== 1)
259
+ return null;
260
+ const row = await getSandboxExecutionInternal(id);
261
+ // Verify the claim token survived (paranoia against a same-ms racing UPDATE
262
+ // on drivers that report affected rows loosely).
263
+ if (!row || row.claimToken !== claimToken)
264
+ return null;
265
+ return row;
266
+ }
267
+ /** Heartbeat: extend the lease while the claimed execution is still running. */
268
+ export async function renewSandboxExecutionLease(id, claimToken, leaseMs, now = Date.now()) {
269
+ await ensureTable();
270
+ const client = getDbExec();
271
+ const result = await client.execute({
272
+ sql: `UPDATE ${TABLE}
273
+ SET lease_expires_at = ?, updated_at = ?
274
+ WHERE id = ? AND claim_token = ? AND status = 'running'`,
275
+ args: [now + leaseMs, now, id, claimToken],
276
+ });
277
+ return (result.rowsAffected ?? 0) === 1;
278
+ }
279
+ /**
280
+ * Write the terminal result. Single-writer safe: only the executor whose
281
+ * claim token still matches the row (i.e. it was not reclaimed after a lease
282
+ * expiry) can finalize. Returns false when the row was already finalized or
283
+ * reclaimed — the caller must discard its result.
284
+ */
285
+ export async function finalizeSandboxExecution(id, claimToken, input, now = Date.now()) {
286
+ await ensureTable();
287
+ const client = getDbExec();
288
+ const row = await getSandboxExecutionInternal(id);
289
+ if (!row)
290
+ return false;
291
+ const stdout = capOutput(input.stdout, row.maxOutputChars);
292
+ const stderr = capOutput(input.stderr, row.maxOutputChars);
293
+ const result = await client.execute({
294
+ sql: `UPDATE ${TABLE}
295
+ SET status = ?,
296
+ stdout = ?,
297
+ stderr = ?,
298
+ stdout_truncated = ?,
299
+ stderr_truncated = ?,
300
+ exit_code = ?,
301
+ timed_out = ?,
302
+ error = ?,
303
+ bridge_tools_used = ?,
304
+ finished_at = ?,
305
+ updated_at = ?,
306
+ lease_expires_at = NULL
307
+ WHERE id = ? AND claim_token = ? AND status = 'running'`,
308
+ args: [
309
+ input.status,
310
+ stdout.text,
311
+ stderr.text,
312
+ stdout.truncated ? 1 : 0,
313
+ stderr.truncated ? 1 : 0,
314
+ input.exitCode ?? null,
315
+ input.timedOut ? 1 : 0,
316
+ input.error ?? null,
317
+ JSON.stringify(input.bridgeToolsUsed ?? []),
318
+ now,
319
+ now,
320
+ id,
321
+ claimToken,
322
+ ],
323
+ });
324
+ return (result.rowsAffected ?? 0) === 1;
325
+ }
326
+ /**
327
+ * Reap a `running` row whose lease expired after its attempt budget was
328
+ * exhausted, so it never sits "running" forever. Atomic: guarded on the same
329
+ * expiry + budget conditions, so a live executor (fresh lease) is untouched.
330
+ */
331
+ export async function failExpiredSandboxExecution(id, error, now = Date.now()) {
332
+ await ensureTable();
333
+ const client = getDbExec();
334
+ const result = await client.execute({
335
+ sql: `UPDATE ${TABLE}
336
+ SET status = 'failed',
337
+ error = ?,
338
+ finished_at = ?,
339
+ updated_at = ?,
340
+ lease_expires_at = NULL
341
+ WHERE id = ?
342
+ AND status = 'running'
343
+ AND lease_expires_at IS NOT NULL AND lease_expires_at < ?
344
+ AND attempt_count >= max_attempts`,
345
+ args: [error, now, now, id, now],
346
+ });
347
+ return (result.rowsAffected ?? 0) === 1;
348
+ }
349
+ /**
350
+ * List rows that need driving: `queued` rows that have sat unclaimed longer
351
+ * than `queuedOlderThanMs` (their enqueue-time dispatch was likely lost), and
352
+ * `running` rows whose lease expired (executor died). Used by the sweep and
353
+ * the poll-time drain. Deliberately does NOT call `ensureTable()` — the sweep
354
+ * must stay a zero-footprint no-op on deployments that never enqueue; callers
355
+ * treat a missing-table error as "nothing due".
356
+ */
357
+ export async function listDueSandboxExecutions(options) {
358
+ const client = getDbExec();
359
+ const now = options.now ?? Date.now();
360
+ const limit = Math.max(1, Math.min(options.limit ?? 5, 25));
361
+ const queuedCutoff = now - Math.max(0, options.queuedOlderThanMs ?? 30_000);
362
+ const result = await client.execute({
363
+ sql: `SELECT id, status, attempt_count, max_attempts, lease_expires_at
364
+ FROM ${TABLE}
365
+ WHERE (status = 'queued' AND updated_at < ?)
366
+ OR (status = 'running' AND lease_expires_at IS NOT NULL AND lease_expires_at < ?)
367
+ ORDER BY created_at ASC
368
+ LIMIT ?`,
369
+ args: [queuedCutoff, now, limit],
370
+ });
371
+ return (result.rows ?? []).map((raw) => ({
372
+ id: String(raw.id),
373
+ status: String(raw.status),
374
+ attemptCount: toNumberOrNull(raw.attempt_count) ?? 0,
375
+ maxAttempts: toNumberOrNull(raw.max_attempts) ??
376
+ SANDBOX_EXECUTION_DEFAULT_MAX_ATTEMPTS,
377
+ leaseExpiresAt: toNumberOrNull(raw.lease_expires_at),
378
+ }));
379
+ }
380
+ //# sourceMappingURL=executions-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executions-store.js","sourceRoot":"","sources":["../../../src/coding-tools/sandbox/executions-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EACL,SAAS,EACT,OAAO,EACP,UAAU,EACV,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AA0D/B,6EAA6E;AAC7E,MAAM,CAAC,MAAM,sCAAsC,GAAG,CAAC,CAAC;AACxD;;;GAGG;AACH,MAAM,CAAC,MAAM,yCAAyC,GAAG,OAAO,CAAC;AAEjE,MAAM,KAAK,GAAG,oBAAoB,CAAC;AAEnC,IAAI,YAAuC,CAAC;AAE5C,KAAK,UAAU,WAAW;IACxB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAC5C,sEAAsE;YACtE,YAAY,GAAG,SAAS,CAAC;YACzB,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,mCAAmC;IACjD,YAAY,GAAG,SAAS,CAAC;AAC3B,CAAC;AAED,KAAK,UAAU,cAAc;IAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG;iCACa,KAAK;;;;;;;;mBAQnB,OAAO,EAAE;yBACH,OAAO,EAAE;sBACZ,OAAO,EAAE;qBACV,OAAO,EAAE,qBAAqB,sCAAsC;;yBAEhE,OAAO,EAAE;;;yBAGT,OAAO,EAAE;yBACT,OAAO,EAAE;kBAChB,OAAO,EAAE;kBACT,OAAO,EAAE;;;mBAGR,OAAO,EAAE;mBACT,OAAO,EAAE;oBACR,OAAO,EAAE;mBACV,OAAO,EAAE;;GAEzB,CAAC;IACF,MAAM,WAAW,GAAG,sEAAsE,KAAK,sBAAsB,CAAC;IACtH,MAAM,SAAS,GAAG,4DAA4D,KAAK,6BAA6B,CAAC;IAEjH,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,yEAAyE;QACzE,0EAA0E;QAC1E,2EAA2E;QAC3E,MAAM,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC1C,0EAA0E;QAC1E,0DAA0D;QAC1D,MAAM,SAAS,GAA4B,CAAC,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3E,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;YACnC,MAAM,kBAAkB,CACtB,KAAK,EACL,GAAG,EACH,eAAe,KAAK,6BAA6B,GAAG,IAAI,GAAG,EAAE,CAC9D,CAAC;QACJ,CAAC;QACD,MAAM,iBAAiB,CACrB,sCAAsC,EACtC,WAAW,CACZ,CAAC;QACF,MAAM,iBAAiB,CAAC,4BAA4B,EAAE,SAAS,CAAC,CAAC;IACnE,CAAC;SAAM,CAAC;QACN,MAAM,cAAc,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACtD,MAAM,cAAc,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QACxD,MAAM,cAAc,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAChB,KAAyB,EACzB,QAAgB;IAEhB,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,yCAAyC,CAAC,CAC9D,CAAC;IACF,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9D,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM,CAAC;AAC5E,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACvE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,SAAS,SAAS,CAAC,GAA4B;IAC7C,IAAI,eAAe,GAAa,EAAE,CAAC;IACnC,IAAI,OAAO,GAAG,CAAC,iBAAiB,KAAK,QAAQ,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACvE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YACjD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,eAAe,GAAG,MAAM,CAAC,MAAM,CAC7B,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CACnD,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,eAAe,GAAG,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB,KAAK,EACH,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;YAC7C,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QACxB,QAAQ,EACN,GAAG,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS;YACnD,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;QAC3B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;QACtC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,QAAQ,CAA2B;QAChE,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAC9C,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC;QACzD,YAAY,EAAE,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;QACpD,WAAW,EACT,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;YAChC,sCAAsC;QACxC,UAAU,EACR,GAAG,CAAC,WAAW,KAAK,IAAI,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS;YACvD,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;QAC7B,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACpD,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;QAChC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;QAChC,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAC7C,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAC7C,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;QACvC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;QAC/B,KAAK,EACH,GAAG,CAAC,KAAK,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1E,eAAe;QACf,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAC9C,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC;QACzC,UAAU,EAAE,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC;QAC3C,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,qDAAqD;AACrD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAkC;IAElC,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,EAAE,GAAG,OAAO,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;IACxC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,sCAAsC,EAAE,CAAC,CAAC,CACzE,CAAC;IACF,MAAM,MAAM,CAAC,OAAO,CAAC;QACnB,GAAG,EAAE,eAAe,KAAK;;4DAE+B;QACxD,IAAI,EAAE;YACJ,EAAE;YACF,KAAK,CAAC,KAAK;YACX,KAAK,CAAC,KAAK,IAAI,IAAI;YACnB,KAAK,CAAC,QAAQ,IAAI,IAAI;YACtB,KAAK,CAAC,OAAO,IAAI,MAAM;YACvB,KAAK,CAAC,IAAI;YACV,KAAK,CAAC,SAAS;YACf,KAAK,CAAC,cAAc;YACpB,WAAW;YACX,GAAG;YACH,GAAG;SACJ;KACF,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,CAAC;IAC3E,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,EAAU,EACV,KAAa;IAEb,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QAClC,GAAG,EAAE,iBAAiB,KAAK,qCAAqC;QAChE,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC;KAClB,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAwC,CAAC;IACpE,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,EAAU;IAEV,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IACrB,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QAClC,GAAG,EAAE,iBAAiB,KAAK,uBAAuB;QAClD,IAAI,EAAE,CAAC,EAAE,CAAC;KACX,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAwC,CAAC;IACpE,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,EAAU,EACV,UAAkB,EAClB,OAAe,EACf,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QAClC,GAAG,EAAE,UAAU,KAAK;;;;;;;;;;;;UAYd;QACN,IAAI,EAAE,CAAC,UAAU,EAAE,GAAG,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;KACrD,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAClD,4EAA4E;IAC5E,iDAAiD;IACjD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IACvD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,EAAU,EACV,UAAkB,EAClB,OAAe,EACf,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QAClC,GAAG,EAAE,UAAU,KAAK;;8DAEsC;QAC1D,IAAI,EAAE,CAAC,GAAG,GAAG,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,UAAU,CAAC;KAC3C,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,EAAU,EACV,UAAkB,EAClB,KAAoC,EACpC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QAClC,GAAG,EAAE,UAAU,KAAK;;;;;;;;;;;;;8DAasC;QAC1D,IAAI,EAAE;YACJ,KAAK,CAAC,MAAM;YACZ,MAAM,CAAC,IAAI;YACX,MAAM,CAAC,IAAI;YACX,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxB,KAAK,CAAC,QAAQ,IAAI,IAAI;YACtB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtB,KAAK,CAAC,KAAK,IAAI,IAAI;YACnB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC;YAC3C,GAAG;YACH,GAAG;YACH,EAAE;YACF,UAAU;SACX;KACF,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,EAAU,EACV,KAAa,EACb,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QAClC,GAAG,EAAE,UAAU,KAAK;;;;;;;;;0CASkB;QACtC,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;KACjC,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC;AAUD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAI9C;IACC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,iBAAiB,IAAI,MAAM,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QAClC,GAAG,EAAE;aACI,KAAK;;;;cAIJ;QACV,IAAI,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE,KAAK,CAAC;KACjC,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAA4B,EAAE,EAAE,CAAC,CAAC;QAChE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAA2B;QACpD,YAAY,EAAE,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;QACpD,WAAW,EACT,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;YAChC,sCAAsC;QACxC,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC;KACrD,CAAC,CAAC,CAAC;AACN,CAAC","sourcesContent":["/**\n * Durable storage for queued `run-code` sandbox executions.\n *\n * A row in `sandbox_executions` is one background code-execution request: the\n * raw user code plus enough identity (owner email, org, thread) to rebuild the\n * action bridge context in a fresh process, and the full result once an\n * executor finishes. This is what lets a long compute job survive the hosted\n * serverless wall: the enqueueing request returns immediately, and any later\n * invocation (self-dispatch processor, status poll, warm-instance sweep) can\n * claim and run the row under its own budget.\n *\n * Concurrency model (single-writer via claim token + lease):\n * - `claimSandboxExecution` atomically flips `queued → running` (or reclaims\n * a `running` row whose lease expired) with `UPDATE … WHERE status = …`\n * guards, so exactly one executor wins even when several invocations race.\n * - The winning executor holds a random `claim_token` and heartbeats\n * `lease_expires_at`; `finalizeSandboxExecution` only writes results when\n * the token still matches, so a displaced executor can never clobber the\n * reclaimer's result.\n * - A row whose lease expired with attempts remaining is re-claimable; once\n * attempts are exhausted `failExpiredSandboxExecution` marks it `failed`\n * instead of leaving it \"running\" forever.\n *\n * Schema notes: additive-only, portable across Postgres (Neon) and SQLite —\n * same `ensureTableExists`/dialect-branched DDL pattern as\n * `resources/store.ts`. Timestamps are epoch-ms in `BIGINT`/`INTEGER` columns.\n * Reads for user-facing surfaces are always owner-scoped\n * (`getSandboxExecutionForOwner`); the unscoped internal reader exists only\n * for the trusted executor/sweep paths.\n */\n\nimport crypto from \"node:crypto\";\n\nimport {\n getDbExec,\n intType,\n isPostgres,\n retryOnDdlRace,\n} from \"../../db/client.js\";\nimport {\n ensureColumnExists,\n ensureIndexExists,\n ensureTableExists,\n} from \"../../db/ddl-guard.js\";\n\nexport type SandboxExecutionStatus =\n | \"queued\"\n | \"running\"\n | \"succeeded\"\n | \"failed\"\n | \"timed_out\";\n\nexport interface SandboxExecutionRow {\n id: string;\n owner: string;\n orgId: string | null;\n threadId: string | null;\n runtime: string;\n code: string;\n status: SandboxExecutionStatus;\n timeoutMs: number;\n maxOutputChars: number;\n attemptCount: number;\n maxAttempts: number;\n claimToken: string | null;\n leaseExpiresAt: number | null;\n stdout: string;\n stderr: string;\n stdoutTruncated: boolean;\n stderrTruncated: boolean;\n exitCode: number | null;\n timedOut: boolean;\n error: string | null;\n bridgeToolsUsed: string[];\n createdAt: number;\n startedAt: number | null;\n finishedAt: number | null;\n updatedAt: number;\n}\n\nexport interface CreateSandboxExecutionInput {\n owner: string;\n orgId?: string | null;\n threadId?: string | null;\n code: string;\n timeoutMs: number;\n maxOutputChars: number;\n maxAttempts?: number;\n runtime?: string;\n}\n\nexport interface FinalizeSandboxExecutionInput {\n status: Extract<SandboxExecutionStatus, \"succeeded\" | \"failed\" | \"timed_out\">;\n stdout?: string;\n stderr?: string;\n exitCode?: number | null;\n timedOut?: boolean;\n error?: string | null;\n bridgeToolsUsed?: string[];\n}\n\n/** Default retry budget: the initial attempt plus one lease-expiry retry. */\nexport const SANDBOX_EXECUTION_DEFAULT_MAX_ATTEMPTS = 2;\n/**\n * Hard per-stream storage cap. The per-row `max_output_chars` (derived from\n * the caller's `maxOutputChars`) is applied first; this bounds even that.\n */\nexport const SANDBOX_EXECUTION_MAX_STORED_OUTPUT_CHARS = 200_000;\n\nconst TABLE = \"sandbox_executions\";\n\nlet _initPromise: Promise<void> | undefined;\n\nasync function ensureTable(): Promise<void> {\n if (!_initPromise) {\n _initPromise = _doEnsureTable().catch((err) => {\n // Don't cache the rejection — let the next caller retry a fresh init.\n _initPromise = undefined;\n throw err;\n });\n }\n return _initPromise;\n}\n\n/** Test-only: forget the memoized init so a fresh in-memory DB re-creates. */\nexport function resetSandboxExecutionsStoreForTests(): void {\n _initPromise = undefined;\n}\n\nasync function _doEnsureTable(): Promise<void> {\n const client = getDbExec();\n const createSql = `\n CREATE TABLE IF NOT EXISTS ${TABLE} (\n id TEXT PRIMARY KEY,\n owner TEXT NOT NULL,\n org_id TEXT,\n thread_id TEXT,\n runtime TEXT NOT NULL DEFAULT 'node',\n code TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'queued',\n timeout_ms ${intType()} NOT NULL,\n max_output_chars ${intType()} NOT NULL,\n attempt_count ${intType()} NOT NULL DEFAULT 0,\n max_attempts ${intType()} NOT NULL DEFAULT ${SANDBOX_EXECUTION_DEFAULT_MAX_ATTEMPTS},\n claim_token TEXT,\n lease_expires_at ${intType()},\n stdout TEXT NOT NULL DEFAULT '',\n stderr TEXT NOT NULL DEFAULT '',\n stdout_truncated ${intType()} NOT NULL DEFAULT 0,\n stderr_truncated ${intType()} NOT NULL DEFAULT 0,\n exit_code ${intType()},\n timed_out ${intType()} NOT NULL DEFAULT 0,\n error TEXT,\n bridge_tools_used TEXT,\n created_at ${intType()} NOT NULL,\n started_at ${intType()},\n finished_at ${intType()},\n updated_at ${intType()} NOT NULL\n )\n `;\n const ownerIdxSql = `CREATE INDEX IF NOT EXISTS sandbox_executions_owner_created_idx ON ${TABLE} (owner, created_at)`;\n const dueIdxSql = `CREATE INDEX IF NOT EXISTS sandbox_executions_due_idx ON ${TABLE} (status, lease_expires_at)`;\n\n if (isPostgres()) {\n // Probe information_schema first (no lock) and DDL only what's missing —\n // same guarded pattern as resources/store.ts so a fresh background worker\n // never blocks on an ACCESS EXCLUSIVE lock for schema that already exists.\n await ensureTableExists(TABLE, createSql);\n // Additive-column guard: keeps older deployments (created before a column\n // was added) self-healing without destructive migrations.\n const pgColumns: Array<[string, string]> = [[\"bridge_tools_used\", \"TEXT\"]];\n for (const [col, def] of pgColumns) {\n await ensureColumnExists(\n TABLE,\n col,\n `ALTER TABLE ${TABLE} ADD COLUMN IF NOT EXISTS ${col} ${def}`,\n );\n }\n await ensureIndexExists(\n \"sandbox_executions_owner_created_idx\",\n ownerIdxSql,\n );\n await ensureIndexExists(\"sandbox_executions_due_idx\", dueIdxSql);\n } else {\n await retryOnDdlRace(() => client.execute(createSql));\n await retryOnDdlRace(() => client.execute(ownerIdxSql));\n await retryOnDdlRace(() => client.execute(dueIdxSql));\n }\n}\n\nfunction capOutput(\n value: string | undefined,\n maxChars: number,\n): { text: string; truncated: boolean } {\n const raw = typeof value === \"string\" ? value : \"\";\n const cap = Math.max(\n 1,\n Math.min(maxChars, SANDBOX_EXECUTION_MAX_STORED_OUTPUT_CHARS),\n );\n if (raw.length <= cap) return { text: raw, truncated: false };\n return { text: raw.slice(0, cap), truncated: true };\n}\n\nfunction toBool(value: unknown): boolean {\n return value === true || value === 1 || value === \"1\" || value === \"true\";\n}\n\nfunction toNumberOrNull(value: unknown): number | null {\n if (value === null || value === undefined || value === \"\") return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction rowFromDb(raw: Record<string, unknown>): SandboxExecutionRow {\n let bridgeToolsUsed: string[] = [];\n if (typeof raw.bridge_tools_used === \"string\" && raw.bridge_tools_used) {\n try {\n const parsed = JSON.parse(raw.bridge_tools_used);\n if (Array.isArray(parsed)) {\n bridgeToolsUsed = parsed.filter(\n (item): item is string => typeof item === \"string\",\n );\n }\n } catch {\n bridgeToolsUsed = [];\n }\n }\n return {\n id: String(raw.id),\n owner: String(raw.owner),\n orgId:\n raw.org_id === null || raw.org_id === undefined\n ? null\n : String(raw.org_id),\n threadId:\n raw.thread_id === null || raw.thread_id === undefined\n ? null\n : String(raw.thread_id),\n runtime: String(raw.runtime ?? \"node\"),\n code: String(raw.code ?? \"\"),\n status: String(raw.status ?? \"queued\") as SandboxExecutionStatus,\n timeoutMs: toNumberOrNull(raw.timeout_ms) ?? 0,\n maxOutputChars: toNumberOrNull(raw.max_output_chars) ?? 0,\n attemptCount: toNumberOrNull(raw.attempt_count) ?? 0,\n maxAttempts:\n toNumberOrNull(raw.max_attempts) ??\n SANDBOX_EXECUTION_DEFAULT_MAX_ATTEMPTS,\n claimToken:\n raw.claim_token === null || raw.claim_token === undefined\n ? null\n : String(raw.claim_token),\n leaseExpiresAt: toNumberOrNull(raw.lease_expires_at),\n stdout: String(raw.stdout ?? \"\"),\n stderr: String(raw.stderr ?? \"\"),\n stdoutTruncated: toBool(raw.stdout_truncated),\n stderrTruncated: toBool(raw.stderr_truncated),\n exitCode: toNumberOrNull(raw.exit_code),\n timedOut: toBool(raw.timed_out),\n error:\n raw.error === null || raw.error === undefined ? null : String(raw.error),\n bridgeToolsUsed,\n createdAt: toNumberOrNull(raw.created_at) ?? 0,\n startedAt: toNumberOrNull(raw.started_at),\n finishedAt: toNumberOrNull(raw.finished_at),\n updatedAt: toNumberOrNull(raw.updated_at) ?? 0,\n };\n}\n\n/** Enqueue a new execution row in `queued` state. */\nexport async function createSandboxExecution(\n input: CreateSandboxExecutionInput,\n): Promise<SandboxExecutionRow> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n const id = `sbx_${crypto.randomUUID()}`;\n const maxAttempts = Math.max(\n 1,\n Math.min(input.maxAttempts ?? SANDBOX_EXECUTION_DEFAULT_MAX_ATTEMPTS, 5),\n );\n await client.execute({\n sql: `INSERT INTO ${TABLE}\n (id, owner, org_id, thread_id, runtime, code, status, timeout_ms, max_output_chars, attempt_count, max_attempts, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, 'queued', ?, ?, 0, ?, ?, ?)`,\n args: [\n id,\n input.owner,\n input.orgId ?? null,\n input.threadId ?? null,\n input.runtime ?? \"node\",\n input.code,\n input.timeoutMs,\n input.maxOutputChars,\n maxAttempts,\n now,\n now,\n ],\n });\n const row = await getSandboxExecutionInternal(id);\n if (!row) throw new Error(`sandbox execution ${id} vanished after insert`);\n return row;\n}\n\n/** Owner-scoped read for user-facing status/result surfaces. */\nexport async function getSandboxExecutionForOwner(\n id: string,\n owner: string,\n): Promise<SandboxExecutionRow | null> {\n if (!id || !owner) return null;\n await ensureTable();\n const client = getDbExec();\n const result = await client.execute({\n sql: `SELECT * FROM ${TABLE} WHERE id = ? AND owner = ? LIMIT 1`,\n args: [id, owner],\n });\n const raw = result.rows?.[0] as Record<string, unknown> | undefined;\n return raw ? rowFromDb(raw) : null;\n}\n\n/**\n * Unscoped read for the trusted executor/sweep paths ONLY. Never expose this\n * through a user-facing action — use `getSandboxExecutionForOwner`.\n */\nexport async function getSandboxExecutionInternal(\n id: string,\n): Promise<SandboxExecutionRow | null> {\n if (!id) return null;\n await ensureTable();\n const client = getDbExec();\n const result = await client.execute({\n sql: `SELECT * FROM ${TABLE} WHERE id = ? LIMIT 1`,\n args: [id],\n });\n const raw = result.rows?.[0] as Record<string, unknown> | undefined;\n return raw ? rowFromDb(raw) : null;\n}\n\n/**\n * Atomically claim an execution for a single executor. Claims a `queued` row,\n * or reclaims a `running` row whose lease expired, as long as the attempt\n * budget is not exhausted. Returns the claimed row (with the new claim token)\n * or null when another executor holds it / it is terminal / attempts ran out.\n */\nexport async function claimSandboxExecution(\n id: string,\n claimToken: string,\n leaseMs: number,\n now = Date.now(),\n): Promise<SandboxExecutionRow | null> {\n await ensureTable();\n const client = getDbExec();\n const result = await client.execute({\n sql: `UPDATE ${TABLE}\n SET status = 'running',\n claim_token = ?,\n lease_expires_at = ?,\n attempt_count = attempt_count + 1,\n started_at = COALESCE(started_at, ?),\n updated_at = ?\n WHERE id = ?\n AND attempt_count < max_attempts\n AND (\n status = 'queued'\n OR (status = 'running' AND lease_expires_at IS NOT NULL AND lease_expires_at < ?)\n )`,\n args: [claimToken, now + leaseMs, now, now, id, now],\n });\n if ((result.rowsAffected ?? 0) !== 1) return null;\n const row = await getSandboxExecutionInternal(id);\n // Verify the claim token survived (paranoia against a same-ms racing UPDATE\n // on drivers that report affected rows loosely).\n if (!row || row.claimToken !== claimToken) return null;\n return row;\n}\n\n/** Heartbeat: extend the lease while the claimed execution is still running. */\nexport async function renewSandboxExecutionLease(\n id: string,\n claimToken: string,\n leaseMs: number,\n now = Date.now(),\n): Promise<boolean> {\n await ensureTable();\n const client = getDbExec();\n const result = await client.execute({\n sql: `UPDATE ${TABLE}\n SET lease_expires_at = ?, updated_at = ?\n WHERE id = ? AND claim_token = ? AND status = 'running'`,\n args: [now + leaseMs, now, id, claimToken],\n });\n return (result.rowsAffected ?? 0) === 1;\n}\n\n/**\n * Write the terminal result. Single-writer safe: only the executor whose\n * claim token still matches the row (i.e. it was not reclaimed after a lease\n * expiry) can finalize. Returns false when the row was already finalized or\n * reclaimed — the caller must discard its result.\n */\nexport async function finalizeSandboxExecution(\n id: string,\n claimToken: string,\n input: FinalizeSandboxExecutionInput,\n now = Date.now(),\n): Promise<boolean> {\n await ensureTable();\n const client = getDbExec();\n const row = await getSandboxExecutionInternal(id);\n if (!row) return false;\n const stdout = capOutput(input.stdout, row.maxOutputChars);\n const stderr = capOutput(input.stderr, row.maxOutputChars);\n const result = await client.execute({\n sql: `UPDATE ${TABLE}\n SET status = ?,\n stdout = ?,\n stderr = ?,\n stdout_truncated = ?,\n stderr_truncated = ?,\n exit_code = ?,\n timed_out = ?,\n error = ?,\n bridge_tools_used = ?,\n finished_at = ?,\n updated_at = ?,\n lease_expires_at = NULL\n WHERE id = ? AND claim_token = ? AND status = 'running'`,\n args: [\n input.status,\n stdout.text,\n stderr.text,\n stdout.truncated ? 1 : 0,\n stderr.truncated ? 1 : 0,\n input.exitCode ?? null,\n input.timedOut ? 1 : 0,\n input.error ?? null,\n JSON.stringify(input.bridgeToolsUsed ?? []),\n now,\n now,\n id,\n claimToken,\n ],\n });\n return (result.rowsAffected ?? 0) === 1;\n}\n\n/**\n * Reap a `running` row whose lease expired after its attempt budget was\n * exhausted, so it never sits \"running\" forever. Atomic: guarded on the same\n * expiry + budget conditions, so a live executor (fresh lease) is untouched.\n */\nexport async function failExpiredSandboxExecution(\n id: string,\n error: string,\n now = Date.now(),\n): Promise<boolean> {\n await ensureTable();\n const client = getDbExec();\n const result = await client.execute({\n sql: `UPDATE ${TABLE}\n SET status = 'failed',\n error = ?,\n finished_at = ?,\n updated_at = ?,\n lease_expires_at = NULL\n WHERE id = ?\n AND status = 'running'\n AND lease_expires_at IS NOT NULL AND lease_expires_at < ?\n AND attempt_count >= max_attempts`,\n args: [error, now, now, id, now],\n });\n return (result.rowsAffected ?? 0) === 1;\n}\n\nexport interface DueSandboxExecution {\n id: string;\n status: SandboxExecutionStatus;\n attemptCount: number;\n maxAttempts: number;\n leaseExpiresAt: number | null;\n}\n\n/**\n * List rows that need driving: `queued` rows that have sat unclaimed longer\n * than `queuedOlderThanMs` (their enqueue-time dispatch was likely lost), and\n * `running` rows whose lease expired (executor died). Used by the sweep and\n * the poll-time drain. Deliberately does NOT call `ensureTable()` — the sweep\n * must stay a zero-footprint no-op on deployments that never enqueue; callers\n * treat a missing-table error as \"nothing due\".\n */\nexport async function listDueSandboxExecutions(options: {\n limit?: number;\n queuedOlderThanMs?: number;\n now?: number;\n}): Promise<DueSandboxExecution[]> {\n const client = getDbExec();\n const now = options.now ?? Date.now();\n const limit = Math.max(1, Math.min(options.limit ?? 5, 25));\n const queuedCutoff = now - Math.max(0, options.queuedOlderThanMs ?? 30_000);\n const result = await client.execute({\n sql: `SELECT id, status, attempt_count, max_attempts, lease_expires_at\n FROM ${TABLE}\n WHERE (status = 'queued' AND updated_at < ?)\n OR (status = 'running' AND lease_expires_at IS NOT NULL AND lease_expires_at < ?)\n ORDER BY created_at ASC\n LIMIT ?`,\n args: [queuedCutoff, now, limit],\n });\n return (result.rows ?? []).map((raw: Record<string, unknown>) => ({\n id: String(raw.id),\n status: String(raw.status) as SandboxExecutionStatus,\n attemptCount: toNumberOrNull(raw.attempt_count) ?? 0,\n maxAttempts:\n toNumberOrNull(raw.max_attempts) ??\n SANDBOX_EXECUTION_DEFAULT_MAX_ATTEMPTS,\n leaseExpiresAt: toNumberOrNull(raw.lease_expires_at),\n }));\n}\n"]}
@@ -9,27 +9,28 @@
9
9
  *
10
10
  * 1. Programmatically, via `registerSandboxAdapter(adapter)` — e.g. a host
11
11
  * process that wants every `run-code` call to run in a remote container.
12
- * 2. By env var `AGENT_NATIVE_SANDBOX` for built-in adapters. Currently only
13
- * `local` (the default) is wired; unknown values fall back to local.
12
+ * 2. By env var `AGENT_NATIVE_SANDBOX` for built-in adapters: `local` (the
13
+ * default) and `background` (the durable queued backend every `run-code`
14
+ * call is enqueued to `sandbox_executions` and executed out-of-request;
15
+ * see `./background.ts`). Unknown values fall back to local.
14
16
  *
15
17
  * Resolution order: an explicitly registered adapter wins; otherwise the env
16
18
  * var selects a built-in; otherwise the local adapter is used.
17
19
  *
18
- * // TODO: remote/durable adapter for long jobs. The local child-process
19
- * // adapter is bounded by the hosting process — on the hosted platform that
20
- * // means the agent loop's soft execution ceiling (~40s before timeout/
21
- * // continuation thrash). A remote or durable adapter (Docker, a
22
- * // Vercel-Sandbox-style runner, or a queued background worker) is the lever
23
- * // to exceed that ceiling: it would implement `SandboxAdapter.run` against an
24
- * // out-of-process runtime, tunnel the loopback bridge (or proxy bridge calls
25
- * // back to the parent), and let large data jobs run to completion
26
- * // independently of the request lifecycle. Register it here under a new
27
- * // `AGENT_NATIVE_SANDBOX` value (e.g. `remote`) and via
28
- * // `registerSandboxAdapter()`.
20
+ * The `background` adapter is a QUEUE MARKER, not an executor: `run-code`
21
+ * detects it via `isQueuedSandboxAdapter()` and enqueues the raw code instead
22
+ * of preparing a module (a prepared module embeds the enqueueing request's
23
+ * loopback bridge, which dies with that request). The queued work is later
24
+ * executed through `resolveExecutionSandboxAdapter()` the active adapter
25
+ * unless that adapter is itself queued, in which case the local child process
26
+ * so a host-registered Docker/remote adapter is still honored for the
27
+ * actual execution.
29
28
  */
30
29
  import type { SandboxAdapter } from "./adapter.js";
31
30
  export type { SandboxAdapter, SandboxRunRequest, SandboxRunResult, SandboxEnv, } from "./adapter.js";
32
31
  export { LocalChildProcessAdapter } from "./local-child-process-adapter.js";
32
+ export { BackgroundQueueAdapter, isQueuedSandboxAdapter, registerSandboxExecutionRunner, resetSandboxBackgroundForTests, enqueueSandboxExecution, driveSandboxExecution, processQueuedSandboxExecution, drainDueSandboxExecutions, SANDBOX_PROCESS_EXECUTION_PATH, SANDBOX_EXECUTION_REDRIVE_AFTER_MS, BACKGROUND_DEFAULT_TIMEOUT_MS, BACKGROUND_MAX_TIMEOUT_MS, type SandboxExecutionRunner, type SandboxExecutionRunInput, type SandboxExecutionRunOutput, } from "./background.js";
33
+ export { getSandboxExecutionForOwner, type SandboxExecutionRow, type SandboxExecutionStatus, } from "./executions-store.js";
33
34
  /**
34
35
  * Override the sandbox backend for all subsequent `run-code` invocations.
35
36
  * Intended for hosts that want to plug in a Docker/remote/durable adapter. Pass
@@ -43,6 +44,14 @@ export declare function registerSandboxAdapter(adapter: SandboxAdapter | null):
43
44
  * `AGENT_NATIVE_SANDBOX` → local child-process default.
44
45
  */
45
46
  export declare function getSandboxAdapter(): SandboxAdapter;
47
+ /**
48
+ * Resolve the adapter to use for ACTUALLY EXECUTING a prepared sandbox module.
49
+ * Identical to `getSandboxAdapter()` except a queued (background) adapter is
50
+ * replaced by the local child-process default — the background executor and
51
+ * the foreground fallback both call this so they can never recurse back into
52
+ * the queue.
53
+ */
54
+ export declare function resolveExecutionSandboxAdapter(): SandboxAdapter;
46
55
  /**
47
56
  * Reset selection state (registered override + cached default). Test-only helper
48
57
  * so specs can exercise selection without leaking adapters across cases.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/coding-tools/sandbox/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAa5E;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAE3E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAelD;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAGlD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/coding-tools/sandbox/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAOnD,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,8BAA8B,EAC9B,8BAA8B,EAC9B,uBAAuB,EACvB,qBAAqB,EACrB,6BAA6B,EAC7B,yBAAyB,EACzB,8BAA8B,EAC9B,kCAAkC,EAClC,6BAA6B,EAC7B,yBAAyB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,GAC/B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,2BAA2B,EAC3B,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,uBAAuB,CAAC;AAc/B;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAE3E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAelD;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,IAAI,cAAc,CAK/D;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAGlD"}
@@ -9,29 +9,32 @@
9
9
  *
10
10
  * 1. Programmatically, via `registerSandboxAdapter(adapter)` — e.g. a host
11
11
  * process that wants every `run-code` call to run in a remote container.
12
- * 2. By env var `AGENT_NATIVE_SANDBOX` for built-in adapters. Currently only
13
- * `local` (the default) is wired; unknown values fall back to local.
12
+ * 2. By env var `AGENT_NATIVE_SANDBOX` for built-in adapters: `local` (the
13
+ * default) and `background` (the durable queued backend every `run-code`
14
+ * call is enqueued to `sandbox_executions` and executed out-of-request;
15
+ * see `./background.ts`). Unknown values fall back to local.
14
16
  *
15
17
  * Resolution order: an explicitly registered adapter wins; otherwise the env
16
18
  * var selects a built-in; otherwise the local adapter is used.
17
19
  *
18
- * // TODO: remote/durable adapter for long jobs. The local child-process
19
- * // adapter is bounded by the hosting process — on the hosted platform that
20
- * // means the agent loop's soft execution ceiling (~40s before timeout/
21
- * // continuation thrash). A remote or durable adapter (Docker, a
22
- * // Vercel-Sandbox-style runner, or a queued background worker) is the lever
23
- * // to exceed that ceiling: it would implement `SandboxAdapter.run` against an
24
- * // out-of-process runtime, tunnel the loopback bridge (or proxy bridge calls
25
- * // back to the parent), and let large data jobs run to completion
26
- * // independently of the request lifecycle. Register it here under a new
27
- * // `AGENT_NATIVE_SANDBOX` value (e.g. `remote`) and via
28
- * // `registerSandboxAdapter()`.
20
+ * The `background` adapter is a QUEUE MARKER, not an executor: `run-code`
21
+ * detects it via `isQueuedSandboxAdapter()` and enqueues the raw code instead
22
+ * of preparing a module (a prepared module embeds the enqueueing request's
23
+ * loopback bridge, which dies with that request). The queued work is later
24
+ * executed through `resolveExecutionSandboxAdapter()` the active adapter
25
+ * unless that adapter is itself queued, in which case the local child process
26
+ * so a host-registered Docker/remote adapter is still honored for the
27
+ * actual execution.
29
28
  */
29
+ import { BackgroundQueueAdapter, isQueuedSandboxAdapter, } from "./background.js";
30
30
  import { LocalChildProcessAdapter } from "./local-child-process-adapter.js";
31
31
  export { LocalChildProcessAdapter } from "./local-child-process-adapter.js";
32
+ export { BackgroundQueueAdapter, isQueuedSandboxAdapter, registerSandboxExecutionRunner, resetSandboxBackgroundForTests, enqueueSandboxExecution, driveSandboxExecution, processQueuedSandboxExecution, drainDueSandboxExecutions, SANDBOX_PROCESS_EXECUTION_PATH, SANDBOX_EXECUTION_REDRIVE_AFTER_MS, BACKGROUND_DEFAULT_TIMEOUT_MS, BACKGROUND_MAX_TIMEOUT_MS, } from "./background.js";
33
+ export { getSandboxExecutionForOwner, } from "./executions-store.js";
32
34
  /** Built-in adapter ids selectable via the `AGENT_NATIVE_SANDBOX` env var. */
33
35
  const BUILT_IN_ADAPTERS = {
34
36
  local: () => new LocalChildProcessAdapter(),
37
+ background: () => new BackgroundQueueAdapter(),
35
38
  };
36
39
  /** Lazily-constructed default (local) adapter, shared across calls. */
37
40
  let defaultAdapter;
@@ -68,6 +71,21 @@ export function getSandboxAdapter() {
68
71
  defaultAdapter = new LocalChildProcessAdapter();
69
72
  return defaultAdapter;
70
73
  }
74
+ /**
75
+ * Resolve the adapter to use for ACTUALLY EXECUTING a prepared sandbox module.
76
+ * Identical to `getSandboxAdapter()` except a queued (background) adapter is
77
+ * replaced by the local child-process default — the background executor and
78
+ * the foreground fallback both call this so they can never recurse back into
79
+ * the queue.
80
+ */
81
+ export function resolveExecutionSandboxAdapter() {
82
+ const adapter = getSandboxAdapter();
83
+ if (!isQueuedSandboxAdapter(adapter))
84
+ return adapter;
85
+ if (!defaultAdapter)
86
+ defaultAdapter = new LocalChildProcessAdapter();
87
+ return defaultAdapter;
88
+ }
71
89
  /**
72
90
  * Reset selection state (registered override + cached default). Test-only helper
73
91
  * so specs can exercise selection without leaking adapters across cases.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/coding-tools/sandbox/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAQ5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,8EAA8E;AAC9E,MAAM,iBAAiB,GAAyC;IAC9D,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,wBAAwB,EAAE;CAC5C,CAAC;AAEF,uEAAuE;AACvE,IAAI,cAA0C,CAAC;AAE/C,gFAAgF;AAChF,IAAI,iBAA6C,CAAC;AAElD;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAA8B;IACnE,iBAAiB,GAAG,OAAO,IAAI,SAAS,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,iBAAiB;QAAE,OAAO,iBAAiB,CAAC;IAEhD,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC;SACtD,IAAI,EAAE;SACN,WAAW,EAAE,CAAC;IACjB,IAAI,QAAQ,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,OAAO;YAAE,OAAO,OAAO,EAAE,CAAC;QAC9B,2EAA2E;QAC3E,8EAA8E;IAChF,CAAC;IAED,IAAI,CAAC,cAAc;QAAE,cAAc,GAAG,IAAI,wBAAwB,EAAE,CAAC;IACrE,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B;IACzC,iBAAiB,GAAG,SAAS,CAAC;IAC9B,cAAc,GAAG,SAAS,CAAC;AAC7B,CAAC","sourcesContent":["/**\n * Sandbox-adapter selection seam.\n *\n * `getSandboxAdapter()` resolves which backend the `run-code` tool executes in.\n * By default it returns the local child-process adapter (preserving today's\n * behavior). The active adapter can be overridden in two ways, both designed so\n * a remote/durable backend can be plugged in later WITHOUT touching the agent\n * loop or `run-code.ts`:\n *\n * 1. Programmatically, via `registerSandboxAdapter(adapter)` — e.g. a host\n * process that wants every `run-code` call to run in a remote container.\n * 2. By env var `AGENT_NATIVE_SANDBOX` for built-in adapters. Currently only\n * `local` (the default) is wired; unknown values fall back to local.\n *\n * Resolution order: an explicitly registered adapter wins; otherwise the env\n * var selects a built-in; otherwise the local adapter is used.\n *\n * // TODO: remote/durable adapter for long jobs. The local child-process\n * // adapter is bounded by the hosting process — on the hosted platform that\n * // means the agent loop's soft execution ceiling (~40s before timeout/\n * // continuation thrash). A remote or durable adapter (Docker, a\n * // Vercel-Sandbox-style runner, or a queued background worker) is the lever\n * // to exceed that ceiling: it would implement `SandboxAdapter.run` against an\n * // out-of-process runtime, tunnel the loopback bridge (or proxy bridge calls\n * // back to the parent), and let large data jobs run to completion\n * // independently of the request lifecycle. Register it here under a new\n * // `AGENT_NATIVE_SANDBOX` value (e.g. `remote`) and via\n * // `registerSandboxAdapter()`.\n */\n\nimport type { SandboxAdapter } from \"./adapter.js\";\nimport { LocalChildProcessAdapter } from \"./local-child-process-adapter.js\";\n\nexport type {\n SandboxAdapter,\n SandboxRunRequest,\n SandboxRunResult,\n SandboxEnv,\n} from \"./adapter.js\";\nexport { LocalChildProcessAdapter } from \"./local-child-process-adapter.js\";\n\n/** Built-in adapter ids selectable via the `AGENT_NATIVE_SANDBOX` env var. */\nconst BUILT_IN_ADAPTERS: Record<string, () => SandboxAdapter> = {\n local: () => new LocalChildProcessAdapter(),\n};\n\n/** Lazily-constructed default (local) adapter, shared across calls. */\nlet defaultAdapter: SandboxAdapter | undefined;\n\n/** Explicitly registered adapter, if any. Takes precedence over the env var. */\nlet registeredAdapter: SandboxAdapter | undefined;\n\n/**\n * Override the sandbox backend for all subsequent `run-code` invocations.\n * Intended for hosts that want to plug in a Docker/remote/durable adapter. Pass\n * `null` to clear the override and fall back to env-var / default resolution.\n */\nexport function registerSandboxAdapter(adapter: SandboxAdapter | null): void {\n registeredAdapter = adapter ?? undefined;\n}\n\n/**\n * Resolve the active sandbox adapter.\n *\n * Order: explicitly registered adapter → built-in selected by\n * `AGENT_NATIVE_SANDBOX` → local child-process default.\n */\nexport function getSandboxAdapter(): SandboxAdapter {\n if (registeredAdapter) return registeredAdapter;\n\n const selected = (process.env.AGENT_NATIVE_SANDBOX ?? \"\")\n .trim()\n .toLowerCase();\n if (selected && selected !== \"local\") {\n const factory = BUILT_IN_ADAPTERS[selected];\n if (factory) return factory();\n // Unknown value: fall through to the local default rather than failing the\n // run. (A remote adapter is registered programmatically; see the TODO above.)\n }\n\n if (!defaultAdapter) defaultAdapter = new LocalChildProcessAdapter();\n return defaultAdapter;\n}\n\n/**\n * Reset selection state (registered override + cached default). Test-only helper\n * so specs can exercise selection without leaking adapters across cases.\n */\nexport function resetSandboxAdapterForTests(): void {\n registeredAdapter = undefined;\n defaultAdapter = undefined;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/coding-tools/sandbox/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAQ5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,8BAA8B,EAC9B,8BAA8B,EAC9B,uBAAuB,EACvB,qBAAqB,EACrB,6BAA6B,EAC7B,yBAAyB,EACzB,8BAA8B,EAC9B,kCAAkC,EAClC,6BAA6B,EAC7B,yBAAyB,GAI1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,2BAA2B,GAG5B,MAAM,uBAAuB,CAAC;AAE/B,8EAA8E;AAC9E,MAAM,iBAAiB,GAAyC;IAC9D,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,wBAAwB,EAAE;IAC3C,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,sBAAsB,EAAE;CAC/C,CAAC;AAEF,uEAAuE;AACvE,IAAI,cAA0C,CAAC;AAE/C,gFAAgF;AAChF,IAAI,iBAA6C,CAAC;AAElD;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAA8B;IACnE,iBAAiB,GAAG,OAAO,IAAI,SAAS,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,iBAAiB;QAAE,OAAO,iBAAiB,CAAC;IAEhD,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC;SACtD,IAAI,EAAE;SACN,WAAW,EAAE,CAAC;IACjB,IAAI,QAAQ,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,OAAO;YAAE,OAAO,OAAO,EAAE,CAAC;QAC9B,2EAA2E;QAC3E,8EAA8E;IAChF,CAAC;IAED,IAAI,CAAC,cAAc;QAAE,cAAc,GAAG,IAAI,wBAAwB,EAAE,CAAC;IACrE,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,8BAA8B;IAC5C,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IACpC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACrD,IAAI,CAAC,cAAc;QAAE,cAAc,GAAG,IAAI,wBAAwB,EAAE,CAAC;IACrE,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B;IACzC,iBAAiB,GAAG,SAAS,CAAC;IAC9B,cAAc,GAAG,SAAS,CAAC;AAC7B,CAAC","sourcesContent":["/**\n * Sandbox-adapter selection seam.\n *\n * `getSandboxAdapter()` resolves which backend the `run-code` tool executes in.\n * By default it returns the local child-process adapter (preserving today's\n * behavior). The active adapter can be overridden in two ways, both designed so\n * a remote/durable backend can be plugged in later WITHOUT touching the agent\n * loop or `run-code.ts`:\n *\n * 1. Programmatically, via `registerSandboxAdapter(adapter)` — e.g. a host\n * process that wants every `run-code` call to run in a remote container.\n * 2. By env var `AGENT_NATIVE_SANDBOX` for built-in adapters: `local` (the\n * default) and `background` (the durable queued backend — every `run-code`\n * call is enqueued to `sandbox_executions` and executed out-of-request;\n * see `./background.ts`). Unknown values fall back to local.\n *\n * Resolution order: an explicitly registered adapter wins; otherwise the env\n * var selects a built-in; otherwise the local adapter is used.\n *\n * The `background` adapter is a QUEUE MARKER, not an executor: `run-code`\n * detects it via `isQueuedSandboxAdapter()` and enqueues the raw code instead\n * of preparing a module (a prepared module embeds the enqueueing request's\n * loopback bridge, which dies with that request). The queued work is later\n * executed through `resolveExecutionSandboxAdapter()` the active adapter\n * unless that adapter is itself queued, in which case the local child process\n * so a host-registered Docker/remote adapter is still honored for the\n * actual execution.\n */\n\nimport type { SandboxAdapter } from \"./adapter.js\";\nimport {\n BackgroundQueueAdapter,\n isQueuedSandboxAdapter,\n} from \"./background.js\";\nimport { LocalChildProcessAdapter } from \"./local-child-process-adapter.js\";\n\nexport type {\n SandboxAdapter,\n SandboxRunRequest,\n SandboxRunResult,\n SandboxEnv,\n} from \"./adapter.js\";\nexport { LocalChildProcessAdapter } from \"./local-child-process-adapter.js\";\nexport {\n BackgroundQueueAdapter,\n isQueuedSandboxAdapter,\n registerSandboxExecutionRunner,\n resetSandboxBackgroundForTests,\n enqueueSandboxExecution,\n driveSandboxExecution,\n processQueuedSandboxExecution,\n drainDueSandboxExecutions,\n SANDBOX_PROCESS_EXECUTION_PATH,\n SANDBOX_EXECUTION_REDRIVE_AFTER_MS,\n BACKGROUND_DEFAULT_TIMEOUT_MS,\n BACKGROUND_MAX_TIMEOUT_MS,\n type SandboxExecutionRunner,\n type SandboxExecutionRunInput,\n type SandboxExecutionRunOutput,\n} from \"./background.js\";\nexport {\n getSandboxExecutionForOwner,\n type SandboxExecutionRow,\n type SandboxExecutionStatus,\n} from \"./executions-store.js\";\n\n/** Built-in adapter ids selectable via the `AGENT_NATIVE_SANDBOX` env var. */\nconst BUILT_IN_ADAPTERS: Record<string, () => SandboxAdapter> = {\n local: () => new LocalChildProcessAdapter(),\n background: () => new BackgroundQueueAdapter(),\n};\n\n/** Lazily-constructed default (local) adapter, shared across calls. */\nlet defaultAdapter: SandboxAdapter | undefined;\n\n/** Explicitly registered adapter, if any. Takes precedence over the env var. */\nlet registeredAdapter: SandboxAdapter | undefined;\n\n/**\n * Override the sandbox backend for all subsequent `run-code` invocations.\n * Intended for hosts that want to plug in a Docker/remote/durable adapter. Pass\n * `null` to clear the override and fall back to env-var / default resolution.\n */\nexport function registerSandboxAdapter(adapter: SandboxAdapter | null): void {\n registeredAdapter = adapter ?? undefined;\n}\n\n/**\n * Resolve the active sandbox adapter.\n *\n * Order: explicitly registered adapter → built-in selected by\n * `AGENT_NATIVE_SANDBOX` → local child-process default.\n */\nexport function getSandboxAdapter(): SandboxAdapter {\n if (registeredAdapter) return registeredAdapter;\n\n const selected = (process.env.AGENT_NATIVE_SANDBOX ?? \"\")\n .trim()\n .toLowerCase();\n if (selected && selected !== \"local\") {\n const factory = BUILT_IN_ADAPTERS[selected];\n if (factory) return factory();\n // Unknown value: fall through to the local default rather than failing the\n // run. (A remote adapter is registered programmatically; see the TODO above.)\n }\n\n if (!defaultAdapter) defaultAdapter = new LocalChildProcessAdapter();\n return defaultAdapter;\n}\n\n/**\n * Resolve the adapter to use for ACTUALLY EXECUTING a prepared sandbox module.\n * Identical to `getSandboxAdapter()` except a queued (background) adapter is\n * replaced by the local child-process default — the background executor and\n * the foreground fallback both call this so they can never recurse back into\n * the queue.\n */\nexport function resolveExecutionSandboxAdapter(): SandboxAdapter {\n const adapter = getSandboxAdapter();\n if (!isQueuedSandboxAdapter(adapter)) return adapter;\n if (!defaultAdapter) defaultAdapter = new LocalChildProcessAdapter();\n return defaultAdapter;\n}\n\n/**\n * Reset selection state (registered override + cached default). Test-only helper\n * so specs can exercise selection without leaking adapters across cases.\n */\nexport function resetSandboxAdapterForTests(): void {\n registeredAdapter = undefined;\n defaultAdapter = undefined;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"local-child-process-adapter.d.ts","sourceRoot":"","sources":["../../../src/coding-tools/sandbox/local-child-process-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AAmDtB,gFAAgF;AAChF,qBAAa,wBAAyB,YAAW,cAAc;IAC7D,QAAQ,CAAC,EAAE,yBAAyB;IAE9B,GAAG,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4E/D;CACF"}
1
+ {"version":3,"file":"local-child-process-adapter.d.ts","sourceRoot":"","sources":["../../../src/coding-tools/sandbox/local-child-process-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AAkEtB,gFAAgF;AAChF,qBAAa,wBAAyB,YAAW,cAAc;IAC7D,QAAQ,CAAC,EAAE,yBAAyB;IAE9B,GAAG,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsH/D;CACF"}