@agent-native/core 0.103.1 → 0.104.0

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 (565) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +30 -0
  3. package/corpus/core/package.json +9 -2
  4. package/corpus/core/src/agent/engine/credential-errors.ts +2 -2
  5. package/corpus/core/src/agent/production-agent.ts +30 -0
  6. package/corpus/core/src/agent/run-store.ts +12 -2
  7. package/corpus/core/src/cli/create.ts +1 -0
  8. package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +30 -11
  9. package/corpus/core/src/cli/templates-meta.ts +4 -3
  10. package/corpus/core/src/client/AgentAskPopover.tsx +89 -0
  11. package/corpus/core/src/client/AgentChatHome.tsx +4 -0
  12. package/corpus/core/src/client/AgentPanel.tsx +321 -223
  13. package/corpus/core/src/client/AssistantChat.tsx +6 -10
  14. package/corpus/core/src/client/MultiTabAssistantChat.tsx +53 -372
  15. package/corpus/core/src/client/agent-chat-adapter.ts +13 -1
  16. package/corpus/core/src/client/agent-page/AgentContextTab.tsx +133 -149
  17. package/corpus/core/src/client/agent-page/AgentEmptyState.tsx +44 -0
  18. package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +153 -82
  19. package/corpus/core/src/client/agent-page/AgentTabFrame.tsx +39 -0
  20. package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +368 -356
  21. package/corpus/core/src/client/agent-page/types.ts +1 -1
  22. package/corpus/core/src/client/analytics.ts +51 -5
  23. package/corpus/core/src/client/chat/run-recovery.tsx +12 -4
  24. package/corpus/core/src/client/composer/PromptComposer.tsx +5 -15
  25. package/corpus/core/src/client/composer/TiptapComposer.tsx +32 -3
  26. package/corpus/core/src/client/dynamic-suggestions.ts +3 -3
  27. package/corpus/core/src/client/index.ts +16 -1
  28. package/corpus/core/src/client/resources/ResourceTree.tsx +249 -38
  29. package/corpus/core/src/client/resources/ResourcesPanel.tsx +307 -140
  30. package/corpus/core/src/client/session-replay.ts +158 -5
  31. package/corpus/core/src/client/settings/AutomationsSection.tsx +30 -10
  32. package/corpus/core/src/client/settings/SettingsPanel.tsx +3 -2
  33. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +2 -0
  34. package/corpus/core/src/client/settings/agent-settings-search.ts +2 -2
  35. package/corpus/core/src/client/use-chat-threads.ts +2 -0
  36. package/corpus/core/src/connections/catalog.ts +49 -7
  37. package/corpus/core/src/db/index.ts +6 -1
  38. package/corpus/core/src/extensions/actions.ts +106 -16
  39. package/corpus/core/src/extensions/content-patch.ts +22 -0
  40. package/corpus/core/src/extensions/routes.ts +18 -0
  41. package/corpus/core/src/extensions/store.ts +8 -0
  42. package/corpus/core/src/index.ts +3 -0
  43. package/corpus/core/src/ingestion/docx.ts +158 -0
  44. package/corpus/core/src/ingestion/figma-node-to-html.ts +1860 -0
  45. package/corpus/core/src/ingestion/figma.ts +548 -0
  46. package/corpus/core/src/ingestion/index.ts +107 -0
  47. package/corpus/core/src/ingestion/media.ts +264 -0
  48. package/corpus/core/src/ingestion/notion.ts +121 -0
  49. package/corpus/core/src/ingestion/office.ts +214 -0
  50. package/corpus/core/src/ingestion/orchestration.ts +160 -0
  51. package/corpus/core/src/ingestion/pptx.ts +333 -0
  52. package/corpus/core/src/ingestion/selection.ts +81 -0
  53. package/corpus/core/src/ingestion/website.ts +151 -0
  54. package/corpus/core/src/integrations/plugin.ts +45 -37
  55. package/corpus/core/src/localization/default-messages.ts +35 -12
  56. package/corpus/core/src/observability/hosted-model-experiment.ts +118 -0
  57. package/corpus/core/src/observability/traces.ts +5 -3
  58. package/corpus/core/src/provider-api/index.ts +452 -8
  59. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +18 -1
  60. package/corpus/core/src/search-utils/index.ts +112 -0
  61. package/corpus/core/src/secrets/register-framework-secrets.ts +61 -0
  62. package/corpus/core/src/server/action-discovery.ts +33 -8
  63. package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
  64. package/corpus/core/src/server/agent-chat/prompt-resources.ts +144 -0
  65. package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
  66. package/corpus/core/src/server/core-routes-plugin.ts +12 -0
  67. package/corpus/core/src/server/index.ts +30 -0
  68. package/corpus/core/src/server/workspace-provider-oauth.ts +583 -0
  69. package/corpus/core/src/styles/agent-native.css +9 -0
  70. package/corpus/core/src/templates/default/app/i18n/en-US.ts +3 -3
  71. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  72. package/corpus/core/src/templates/workspace-root/.env.example +12 -0
  73. package/corpus/core/src/workspace-connections/index.ts +6 -0
  74. package/corpus/core/src/workspace-connections/lifecycle.ts +43 -0
  75. package/corpus/core/src/workspace-connections/store.ts +16 -0
  76. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +46 -3
  77. package/corpus/templates/analytics/AGENTS.md +9 -0
  78. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +120 -6
  79. package/corpus/templates/analytics/actions/mutate-dashboard.ts +92 -30
  80. package/corpus/templates/analytics/actions/update-dashboard.ts +5 -5
  81. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +313 -220
  82. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -2
  83. package/corpus/templates/analytics/app/components/layout/Layout.tsx +9 -6
  84. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +90 -64
  85. package/corpus/templates/analytics/app/i18n-data.ts +3 -3
  86. package/corpus/templates/analytics/app/lib/dashboard-list-loading.ts +25 -0
  87. package/corpus/templates/analytics/app/lib/item-popularity.ts +13 -4
  88. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +1 -1
  89. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/pivot.ts +8 -3
  90. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
  91. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +15 -3
  92. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-filter-defaults-can-now-be-changed-reliably-withou.md +6 -0
  93. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-lists-load-in-one-stable-order-without-popping-bet.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-16-fixed-dashboard-filter-dropdown-text-alignment.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-07-16-recurring-signed-in-users-can-now-be-viewed-as-weekly-bars-b.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-07-16-the-analytics-agent-can-now-duplicate-a-chart-and-place-the-.md +6 -0
  97. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +41 -1
  98. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -1
  99. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +47 -1
  100. package/corpus/templates/analytics/server/lib/session-replay.ts +68 -0
  101. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
  102. package/corpus/templates/analytics/server/routes/sessions/lookup.get.ts +47 -0
  103. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +16 -9
  104. package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +86 -0
  105. package/corpus/templates/assets/AGENTS.md +10 -0
  106. package/corpus/templates/assets/actions/create-generation-session.ts +59 -1
  107. package/corpus/templates/assets/actions/edit-image.ts +2 -0
  108. package/corpus/templates/assets/actions/generate-asset.ts +52 -0
  109. package/corpus/templates/assets/actions/generate-image-batch.ts +55 -0
  110. package/corpus/templates/assets/actions/generate-image.ts +219 -1
  111. package/corpus/templates/assets/actions/open-asset-picker.ts +14 -0
  112. package/corpus/templates/assets/actions/refine-image.ts +3 -0
  113. package/corpus/templates/assets/actions/restyle-image.ts +2 -0
  114. package/corpus/templates/assets/agent-native.app-skill.json +4 -0
  115. package/corpus/templates/assets/app/components/layout/Layout.tsx +2 -0
  116. package/corpus/templates/assets/app/i18n/zh-TW.ts +3 -0
  117. package/corpus/templates/assets/app/i18n-data.ts +29 -13
  118. package/corpus/templates/assets/app/routes/agent.tsx +7 -1
  119. package/corpus/templates/assets/app/routes/library.tsx +9 -0
  120. package/corpus/templates/assets/app/routes/settings.tsx +3 -0
  121. package/corpus/templates/assets/changelog/2026-07-16-creative-context-library.md +6 -0
  122. package/corpus/templates/assets/package.json +1 -0
  123. package/corpus/templates/assets/server/lib/image-processing.ts +1 -22
  124. package/corpus/templates/assets/server/plugins/creative-context.ts +205 -0
  125. package/corpus/templates/brain/app/i18n-data.ts +3 -3
  126. package/corpus/templates/brain/app/lib/brain.ts +1 -1
  127. package/corpus/templates/brain/server/lib/search.ts +17 -67
  128. package/corpus/templates/calendar/app/i18n-data.ts +3 -3
  129. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +19 -18
  130. package/corpus/templates/chat/app/i18n/en-US.ts +3 -3
  131. package/corpus/templates/chat/app/lib/agent-page.tsx +10 -1
  132. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +1 -1
  133. package/corpus/templates/clips/AGENTS.md +4 -0
  134. package/corpus/templates/clips/actions/cleanup-transcript.ts +35 -4
  135. package/corpus/templates/clips/actions/create-meeting.ts +6 -2
  136. package/corpus/templates/clips/actions/create-organization.ts +3 -2
  137. package/corpus/templates/clips/actions/create-recording.ts +4 -1
  138. package/corpus/templates/clips/actions/finalize-recording.ts +44 -7
  139. package/corpus/templates/clips/actions/import-loom-recording.ts +4 -1
  140. package/corpus/templates/clips/actions/lib/create-recording-schema.ts +2 -2
  141. package/corpus/templates/clips/actions/list-meetings.ts +23 -5
  142. package/corpus/templates/clips/actions/list-organization-state.ts +1 -1
  143. package/corpus/templates/clips/actions/remove-silences.ts +10 -1
  144. package/corpus/templates/clips/actions/request-transcript.ts +53 -11
  145. package/corpus/templates/clips/actions/search-recordings-utils.ts +7 -0
  146. package/corpus/templates/clips/actions/search-recordings.ts +5 -8
  147. package/corpus/templates/clips/actions/set-organization-branding.ts +2 -2
  148. package/corpus/templates/clips/actions/stitch-recordings.ts +10 -5
  149. package/corpus/templates/clips/actions/update-ai-request-status.ts +38 -0
  150. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +3 -4
  151. package/corpus/templates/clips/app/components/editor/editor-selection.ts +19 -0
  152. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +10 -10
  153. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +1 -2
  154. package/corpus/templates/clips/app/components/library/library-grid.tsx +101 -93
  155. package/corpus/templates/clips/app/components/player/video-player.tsx +11 -0
  156. package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +53 -1
  157. package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
  158. package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
  159. package/corpus/templates/clips/app/i18n/en-US.ts +10 -4
  160. package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
  161. package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
  162. package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
  163. package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
  164. package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
  165. package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
  166. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -1
  167. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -1
  168. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +5 -9
  169. package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +6 -2
  170. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +129 -27
  171. package/corpus/templates/clips/app/routes/record.tsx +23 -2
  172. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -2
  173. package/corpus/templates/clips/changelog/2026-07-16-authorized-viewers-can-open-shared-private-clips-without-a-m.md +6 -0
  174. package/corpus/templates/clips/changelog/2026-07-16-camera-bubble-hover-controls-appear-above-the-face.md +6 -0
  175. package/corpus/templates/clips/changelog/2026-07-16-chrome-extension-recovers-stale-recorder-state.md +6 -0
  176. package/corpus/templates/clips/changelog/2026-07-16-clips-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  177. package/corpus/templates/clips/changelog/2026-07-16-clips-search-now-matches-recording-content-without-requiring.md +6 -0
  178. package/corpus/templates/clips/changelog/2026-07-16-declined-meetings-no-longer-show-desktop-reminders.md +6 -0
  179. package/corpus/templates/clips/changelog/2026-07-16-failed-desktop-saves-now-show-their-local-recovery-copy.md +6 -0
  180. package/corpus/templates/clips/changelog/2026-07-16-long-desktop-clips-now-preserve-complete-playback-synced-aud.md +6 -0
  181. package/corpus/templates/clips/changelog/2026-07-16-long-recording-lists-keep-stitch-and-library-actions-visible.md +6 -0
  182. package/corpus/templates/clips/changelog/2026-07-16-organization-admins-can-choose-new-recording-visibility.md +6 -0
  183. package/corpus/templates/clips/changelog/2026-07-16-remove-silences-now-shows-queued-active-completed-and-failed.md +6 -0
  184. package/corpus/templates/clips/changelog/2026-07-16-settings-no-longer-repeats-the-builder-connection-status-in-.md +6 -0
  185. package/corpus/templates/clips/changelog/2026-07-16-transcripts-now-appear-from-native-browser-speech-sooner-wit.md +6 -0
  186. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  187. package/corpus/templates/clips/chrome-extension/src/background.ts +73 -1
  188. package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +32 -0
  189. package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +248 -0
  190. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +106 -0
  191. package/corpus/templates/clips/desktop/src/app.tsx +66 -28
  192. package/corpus/templates/clips/desktop/src/lib/recorder.ts +335 -285
  193. package/corpus/templates/clips/desktop/src/lib/single-flight.ts +7 -0
  194. package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +51 -0
  195. package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +2 -2
  196. package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +10 -2
  197. package/corpus/templates/clips/desktop/src/styles.css +13 -11
  198. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +8 -9
  199. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +1 -0
  200. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +88 -13
  201. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +13 -2
  202. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +241 -6
  203. package/corpus/templates/clips/server/db/schema.ts +2 -2
  204. package/corpus/templates/clips/server/lib/builder-media-compression.ts +64 -67
  205. package/corpus/templates/clips/server/lib/calendar-event-classification.ts +19 -0
  206. package/corpus/templates/clips/server/lib/google-calendar-client.ts +1 -0
  207. package/corpus/templates/clips/server/lib/recordings.ts +40 -1
  208. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
  209. package/corpus/templates/clips/server/plugins/db.ts +2 -2
  210. package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +1 -1
  211. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -5
  212. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +51 -1
  213. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +1 -64
  214. package/corpus/templates/clips/shared/media-worker-contract.ts +32 -15
  215. package/corpus/templates/content/.agents/skills/content/SKILL.md +16 -0
  216. package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +85 -0
  217. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +8 -0
  218. package/corpus/templates/content/AGENTS.md +9 -0
  219. package/corpus/templates/content/actions/create-document.ts +94 -0
  220. package/corpus/templates/content/actions/edit-document.ts +144 -4
  221. package/corpus/templates/content/actions/update-document.ts +138 -0
  222. package/corpus/templates/content/agent-native.app-skill.json +4 -0
  223. package/corpus/templates/content/app/components/layout/Layout.tsx +2 -0
  224. package/corpus/templates/content/app/i18n/zh-TW.ts +3 -0
  225. package/corpus/templates/content/app/i18n-data.ts +13 -4
  226. package/corpus/templates/content/app/routes/_app.agent.tsx +2 -1
  227. package/corpus/templates/content/app/routes/_app.settings.tsx +3 -0
  228. package/corpus/templates/content/changelog/2026-07-16-creative-context-library.md +6 -0
  229. package/corpus/templates/content/package.json +1 -0
  230. package/corpus/templates/content/server/plugins/creative-context.ts +31 -0
  231. package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +116 -0
  232. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
  233. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
  234. package/corpus/templates/design/AGENTS.md +6 -0
  235. package/corpus/templates/design/actions/clone-creative-context-design.ts +176 -0
  236. package/corpus/templates/design/actions/edit-design.ts +128 -0
  237. package/corpus/templates/design/actions/generate-design.ts +278 -14
  238. package/corpus/templates/design/actions/generate-screens.ts +42 -1
  239. package/corpus/templates/design/agent-native.app-skill.json +4 -0
  240. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -3
  241. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
  242. package/corpus/templates/design/app/i18n-data.ts +10 -4
  243. package/corpus/templates/design/app/routes/agent.tsx +2 -1
  244. package/corpus/templates/design/app/routes/settings.tsx +3 -0
  245. package/corpus/templates/design/changelog/2026-07-16-creative-context-library.md +6 -0
  246. package/corpus/templates/design/changelog/2026-07-16-design-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  247. package/corpus/templates/design/package.json +1 -0
  248. package/corpus/templates/design/server/lib/figma-design-context.ts +5 -335
  249. package/corpus/templates/design/server/lib/figma-node-to-html.ts +1 -1859
  250. package/corpus/templates/design/server/lib/import-design-files.ts +6 -8
  251. package/corpus/templates/design/server/plugins/creative-context.ts +31 -0
  252. package/corpus/templates/design/shared/generation-session.ts +7 -0
  253. package/corpus/templates/dispatch/app/i18n-data.ts +3 -3
  254. package/corpus/templates/forms/app/i18n/en-US.ts +3 -3
  255. package/corpus/templates/macros/app/i18n/en-US.ts +3 -3
  256. package/corpus/templates/mail/app/components/email/EmailThread.tsx +35 -5
  257. package/corpus/templates/mail/app/i18n/en-US.ts +3 -3
  258. package/corpus/templates/mail/changelog/2026-07-16-mail-previews-now-expand-to-show-the-full-message-without-an.md +6 -0
  259. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +30 -11
  260. package/corpus/templates/plan/AGENTS.md +21 -1
  261. package/corpus/templates/plan/actions/get-visual-plan.ts +1 -1
  262. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +161 -0
  263. package/corpus/templates/plan/actions/read-visual-plan-source.ts +1 -1
  264. package/corpus/templates/plan/actions/update-visual-plan.ts +126 -10
  265. package/corpus/templates/plan/app/hooks/use-plans.ts +2 -0
  266. package/corpus/templates/plan/app/i18n/en-US.ts +3 -3
  267. package/corpus/templates/plan/app/pages/PlansPage.tsx +65 -62
  268. package/corpus/templates/plan/changelog/2026-07-16-local-plan-previews-now-load-annotations-containing-html-lik.md +6 -0
  269. package/corpus/templates/plan/changelog/2026-07-16-plan-agents-now-prevent-stale-edits-from-overwriting-newer-p.md +6 -0
  270. package/corpus/templates/plan/server/plan-mdx.ts +75 -2
  271. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +21 -4
  272. package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +122 -0
  273. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +11 -0
  274. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +12 -3
  275. package/corpus/templates/slides/AGENTS.md +6 -0
  276. package/corpus/templates/slides/actions/add-slide.ts +230 -14
  277. package/corpus/templates/slides/actions/clone-context-slide.ts +302 -0
  278. package/corpus/templates/slides/actions/create-deck.ts +130 -0
  279. package/corpus/templates/slides/actions/extract-pdf.ts +6 -2
  280. package/corpus/templates/slides/actions/import-file.ts +5 -4
  281. package/corpus/templates/slides/actions/patch-deck.ts +200 -10
  282. package/corpus/templates/slides/actions/update-slide.ts +208 -15
  283. package/corpus/templates/slides/app/components/layout/Layout.tsx +2 -0
  284. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +16 -1
  285. package/corpus/templates/slides/app/i18n/ar-SA.ts +3 -0
  286. package/corpus/templates/slides/app/i18n/de-DE.ts +3 -0
  287. package/corpus/templates/slides/app/i18n/en-US.ts +6 -3
  288. package/corpus/templates/slides/app/i18n/es-ES.ts +3 -0
  289. package/corpus/templates/slides/app/i18n/fr-FR.ts +3 -0
  290. package/corpus/templates/slides/app/i18n/hi-IN.ts +3 -0
  291. package/corpus/templates/slides/app/i18n/ja-JP.ts +3 -0
  292. package/corpus/templates/slides/app/i18n/ko-KR.ts +3 -0
  293. package/corpus/templates/slides/app/i18n/pt-BR.ts +3 -0
  294. package/corpus/templates/slides/app/i18n/zh-CN.ts +3 -0
  295. package/corpus/templates/slides/app/i18n/zh-TW.ts +3 -0
  296. package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +176 -0
  297. package/corpus/templates/slides/app/routes/agent.tsx +7 -1
  298. package/corpus/templates/slides/app/routes/settings.tsx +3 -0
  299. package/corpus/templates/slides/changelog/2026-07-16-creative-context-library.md +6 -0
  300. package/corpus/templates/slides/changelog/2026-07-16-google-slides-native-cloning.md +6 -0
  301. package/corpus/templates/slides/package.json +1 -0
  302. package/corpus/templates/slides/server/handlers/import/docx-parser.ts +4 -85
  303. package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +7 -421
  304. package/corpus/templates/slides/server/plugins/creative-context.ts +166 -0
  305. package/dist/agent/engine/credential-errors.d.ts +1 -1
  306. package/dist/agent/engine/credential-errors.d.ts.map +1 -1
  307. package/dist/agent/engine/credential-errors.js +2 -2
  308. package/dist/agent/engine/credential-errors.js.map +1 -1
  309. package/dist/agent/production-agent.d.ts.map +1 -1
  310. package/dist/agent/production-agent.js +25 -0
  311. package/dist/agent/production-agent.js.map +1 -1
  312. package/dist/agent/run-store.d.ts.map +1 -1
  313. package/dist/agent/run-store.js +12 -2
  314. package/dist/agent/run-store.js.map +1 -1
  315. package/dist/cli/create.d.ts.map +1 -1
  316. package/dist/cli/create.js +1 -0
  317. package/dist/cli/create.js.map +1 -1
  318. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  319. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  320. package/dist/cli/skills-content/visual-plan-skill.js +30 -11
  321. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  322. package/dist/cli/templates-meta.d.ts.map +1 -1
  323. package/dist/cli/templates-meta.js +4 -3
  324. package/dist/cli/templates-meta.js.map +1 -1
  325. package/dist/client/AgentAskPopover.d.ts +11 -0
  326. package/dist/client/AgentAskPopover.d.ts.map +1 -0
  327. package/dist/client/AgentAskPopover.js +30 -0
  328. package/dist/client/AgentAskPopover.js.map +1 -0
  329. package/dist/client/AgentChatHome.d.ts +1 -1
  330. package/dist/client/AgentChatHome.d.ts.map +1 -1
  331. package/dist/client/AgentChatHome.js +2 -2
  332. package/dist/client/AgentChatHome.js.map +1 -1
  333. package/dist/client/AgentPanel.d.ts +9 -19
  334. package/dist/client/AgentPanel.d.ts.map +1 -1
  335. package/dist/client/AgentPanel.js +119 -80
  336. package/dist/client/AgentPanel.js.map +1 -1
  337. package/dist/client/AssistantChat.d.ts.map +1 -1
  338. package/dist/client/AssistantChat.js +4 -4
  339. package/dist/client/AssistantChat.js.map +1 -1
  340. package/dist/client/MultiTabAssistantChat.d.ts +3 -9
  341. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  342. package/dist/client/MultiTabAssistantChat.js +49 -189
  343. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  344. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  345. package/dist/client/agent-chat-adapter.js +12 -1
  346. package/dist/client/agent-chat-adapter.js.map +1 -1
  347. package/dist/client/agent-page/AgentContextTab.d.ts.map +1 -1
  348. package/dist/client/agent-page/AgentContextTab.js +26 -28
  349. package/dist/client/agent-page/AgentContextTab.js.map +1 -1
  350. package/dist/client/agent-page/AgentEmptyState.d.ts +13 -0
  351. package/dist/client/agent-page/AgentEmptyState.d.ts.map +1 -0
  352. package/dist/client/agent-page/AgentEmptyState.js +6 -0
  353. package/dist/client/agent-page/AgentEmptyState.js.map +1 -0
  354. package/dist/client/agent-page/AgentJobsTab.d.ts +1 -1
  355. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  356. package/dist/client/agent-page/AgentJobsTab.js +90 -58
  357. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  358. package/dist/client/agent-page/AgentTabFrame.d.ts +12 -0
  359. package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -0
  360. package/dist/client/agent-page/AgentTabFrame.js +7 -0
  361. package/dist/client/agent-page/AgentTabFrame.js.map +1 -0
  362. package/dist/client/agent-page/AgentTabsPage.d.ts +9 -1
  363. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  364. package/dist/client/agent-page/AgentTabsPage.js +135 -99
  365. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  366. package/dist/client/agent-page/types.d.ts +1 -1
  367. package/dist/client/agent-page/types.d.ts.map +1 -1
  368. package/dist/client/agent-page/types.js.map +1 -1
  369. package/dist/client/analytics.d.ts +10 -3
  370. package/dist/client/analytics.d.ts.map +1 -1
  371. package/dist/client/analytics.js +37 -2
  372. package/dist/client/analytics.js.map +1 -1
  373. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  374. package/dist/client/chat/run-recovery.js +10 -3
  375. package/dist/client/chat/run-recovery.js.map +1 -1
  376. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  377. package/dist/client/composer/PromptComposer.js +2 -2
  378. package/dist/client/composer/PromptComposer.js.map +1 -1
  379. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  380. package/dist/client/composer/TiptapComposer.js +15 -3
  381. package/dist/client/composer/TiptapComposer.js.map +1 -1
  382. package/dist/client/dynamic-suggestions.js +3 -3
  383. package/dist/client/dynamic-suggestions.js.map +1 -1
  384. package/dist/client/index.d.ts +4 -3
  385. package/dist/client/index.d.ts.map +1 -1
  386. package/dist/client/index.js +3 -2
  387. package/dist/client/index.js.map +1 -1
  388. package/dist/client/resources/ResourceTree.d.ts +5 -1
  389. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  390. package/dist/client/resources/ResourceTree.js +74 -5
  391. package/dist/client/resources/ResourceTree.js.map +1 -1
  392. package/dist/client/resources/ResourcesPanel.d.ts +11 -2
  393. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  394. package/dist/client/resources/ResourcesPanel.js +105 -31
  395. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  396. package/dist/client/session-replay.d.ts +28 -0
  397. package/dist/client/session-replay.d.ts.map +1 -1
  398. package/dist/client/session-replay.js +122 -8
  399. package/dist/client/session-replay.js.map +1 -1
  400. package/dist/client/settings/AutomationsSection.d.ts +3 -1
  401. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  402. package/dist/client/settings/AutomationsSection.js +16 -6
  403. package/dist/client/settings/AutomationsSection.js.map +1 -1
  404. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  405. package/dist/client/settings/SettingsPanel.js +3 -3
  406. package/dist/client/settings/SettingsPanel.js.map +1 -1
  407. package/dist/client/settings/SettingsTabsPage.d.ts +2 -0
  408. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  409. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  410. package/dist/client/settings/agent-settings-search.js +2 -2
  411. package/dist/client/settings/agent-settings-search.js.map +1 -1
  412. package/dist/client/use-chat-threads.d.ts +2 -0
  413. package/dist/client/use-chat-threads.d.ts.map +1 -1
  414. package/dist/client/use-chat-threads.js.map +1 -1
  415. package/dist/collab/routes.d.ts +1 -1
  416. package/dist/connections/catalog.d.ts +41 -7
  417. package/dist/connections/catalog.d.ts.map +1 -1
  418. package/dist/connections/catalog.js +40 -7
  419. package/dist/connections/catalog.js.map +1 -1
  420. package/dist/db/index.d.ts +2 -2
  421. package/dist/db/index.d.ts.map +1 -1
  422. package/dist/db/index.js +2 -2
  423. package/dist/db/index.js.map +1 -1
  424. package/dist/extensions/actions.d.ts.map +1 -1
  425. package/dist/extensions/actions.js +85 -15
  426. package/dist/extensions/actions.js.map +1 -1
  427. package/dist/extensions/content-patch.d.ts +4 -0
  428. package/dist/extensions/content-patch.d.ts.map +1 -1
  429. package/dist/extensions/content-patch.js +18 -0
  430. package/dist/extensions/content-patch.js.map +1 -1
  431. package/dist/extensions/routes.d.ts.map +1 -1
  432. package/dist/extensions/routes.js +14 -0
  433. package/dist/extensions/routes.js.map +1 -1
  434. package/dist/extensions/store.d.ts +1 -0
  435. package/dist/extensions/store.d.ts.map +1 -1
  436. package/dist/extensions/store.js +4 -1
  437. package/dist/extensions/store.js.map +1 -1
  438. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  439. package/dist/index.d.ts +1 -1
  440. package/dist/index.d.ts.map +1 -1
  441. package/dist/index.js +1 -1
  442. package/dist/index.js.map +1 -1
  443. package/dist/ingestion/docx.d.ts +16 -0
  444. package/dist/ingestion/docx.d.ts.map +1 -0
  445. package/dist/ingestion/docx.js +129 -0
  446. package/dist/ingestion/docx.js.map +1 -0
  447. package/dist/ingestion/figma-node-to-html.d.ts +304 -0
  448. package/dist/ingestion/figma-node-to-html.d.ts.map +1 -0
  449. package/dist/ingestion/figma-node-to-html.js +1292 -0
  450. package/dist/ingestion/figma-node-to-html.js.map +1 -0
  451. package/dist/ingestion/figma.d.ts +115 -0
  452. package/dist/ingestion/figma.d.ts.map +1 -0
  453. package/dist/ingestion/figma.js +399 -0
  454. package/dist/ingestion/figma.js.map +1 -0
  455. package/dist/ingestion/index.d.ts +11 -0
  456. package/dist/ingestion/index.d.ts.map +1 -0
  457. package/dist/ingestion/index.js +11 -0
  458. package/dist/ingestion/index.js.map +1 -0
  459. package/dist/ingestion/media.d.ts +36 -0
  460. package/dist/ingestion/media.d.ts.map +1 -0
  461. package/dist/ingestion/media.js +178 -0
  462. package/dist/ingestion/media.js.map +1 -0
  463. package/dist/ingestion/notion.d.ts +12 -0
  464. package/dist/ingestion/notion.d.ts.map +1 -0
  465. package/dist/ingestion/notion.js +104 -0
  466. package/dist/ingestion/notion.js.map +1 -0
  467. package/dist/ingestion/office.d.ts +45 -0
  468. package/dist/ingestion/office.d.ts.map +1 -0
  469. package/dist/ingestion/office.js +141 -0
  470. package/dist/ingestion/office.js.map +1 -0
  471. package/dist/ingestion/orchestration.d.ts +52 -0
  472. package/dist/ingestion/orchestration.d.ts.map +1 -0
  473. package/dist/ingestion/orchestration.js +89 -0
  474. package/dist/ingestion/orchestration.js.map +1 -0
  475. package/dist/ingestion/pptx.d.ts +28 -0
  476. package/dist/ingestion/pptx.d.ts.map +1 -0
  477. package/dist/ingestion/pptx.js +255 -0
  478. package/dist/ingestion/pptx.js.map +1 -0
  479. package/dist/ingestion/selection.d.ts +20 -0
  480. package/dist/ingestion/selection.d.ts.map +1 -0
  481. package/dist/ingestion/selection.js +52 -0
  482. package/dist/ingestion/selection.js.map +1 -0
  483. package/dist/ingestion/website.d.ts +27 -0
  484. package/dist/ingestion/website.d.ts.map +1 -0
  485. package/dist/ingestion/website.js +100 -0
  486. package/dist/ingestion/website.js.map +1 -0
  487. package/dist/integrations/plugin.d.ts.map +1 -1
  488. package/dist/integrations/plugin.js +32 -27
  489. package/dist/integrations/plugin.js.map +1 -1
  490. package/dist/localization/default-messages.d.ts +22 -0
  491. package/dist/localization/default-messages.d.ts.map +1 -1
  492. package/dist/localization/default-messages.js +31 -9
  493. package/dist/localization/default-messages.js.map +1 -1
  494. package/dist/notifications/routes.d.ts +1 -1
  495. package/dist/observability/hosted-model-experiment.d.ts +39 -0
  496. package/dist/observability/hosted-model-experiment.d.ts.map +1 -0
  497. package/dist/observability/hosted-model-experiment.js +90 -0
  498. package/dist/observability/hosted-model-experiment.js.map +1 -0
  499. package/dist/observability/traces.d.ts.map +1 -1
  500. package/dist/observability/traces.js +5 -3
  501. package/dist/observability/traces.js.map +1 -1
  502. package/dist/progress/routes.d.ts +1 -1
  503. package/dist/provider-api/index.d.ts +35 -4
  504. package/dist/provider-api/index.d.ts.map +1 -1
  505. package/dist/provider-api/index.js +339 -8
  506. package/dist/provider-api/index.js.map +1 -1
  507. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  508. package/dist/scripts/agent-engines/list-agent-engines.js +18 -1
  509. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  510. package/dist/search-utils/index.d.ts +12 -0
  511. package/dist/search-utils/index.d.ts.map +1 -0
  512. package/dist/search-utils/index.js +95 -0
  513. package/dist/search-utils/index.js.map +1 -0
  514. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  515. package/dist/secrets/register-framework-secrets.js +57 -0
  516. package/dist/secrets/register-framework-secrets.js.map +1 -1
  517. package/dist/server/action-discovery.d.ts +8 -0
  518. package/dist/server/action-discovery.d.ts.map +1 -1
  519. package/dist/server/action-discovery.js +26 -9
  520. package/dist/server/action-discovery.js.map +1 -1
  521. package/dist/server/agent-chat/framework-prompts.js +2 -2
  522. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  523. package/dist/server/agent-chat/prompt-resources.d.ts +19 -0
  524. package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
  525. package/dist/server/agent-chat/prompt-resources.js +95 -0
  526. package/dist/server/agent-chat/prompt-resources.js.map +1 -1
  527. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  528. package/dist/server/agent-chat-plugin.js +7 -0
  529. package/dist/server/agent-chat-plugin.js.map +1 -1
  530. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  531. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  532. package/dist/server/core-routes-plugin.js +5 -0
  533. package/dist/server/core-routes-plugin.js.map +1 -1
  534. package/dist/server/index.d.ts +5 -1
  535. package/dist/server/index.d.ts.map +1 -1
  536. package/dist/server/index.js +5 -1
  537. package/dist/server/index.js.map +1 -1
  538. package/dist/server/workspace-provider-oauth.d.ts +48 -0
  539. package/dist/server/workspace-provider-oauth.d.ts.map +1 -0
  540. package/dist/server/workspace-provider-oauth.js +415 -0
  541. package/dist/server/workspace-provider-oauth.js.map +1 -0
  542. package/dist/styles/agent-native.css +9 -0
  543. package/dist/templates/chat/app/i18n/en-US.ts +3 -3
  544. package/dist/templates/chat/app/lib/agent-page.tsx +10 -1
  545. package/dist/templates/default/app/i18n/en-US.ts +3 -3
  546. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  547. package/dist/templates/workspace-root/.env.example +12 -0
  548. package/dist/workspace-connections/index.d.ts +1 -0
  549. package/dist/workspace-connections/index.d.ts.map +1 -1
  550. package/dist/workspace-connections/index.js +1 -0
  551. package/dist/workspace-connections/index.js.map +1 -1
  552. package/dist/workspace-connections/lifecycle.d.ts +16 -0
  553. package/dist/workspace-connections/lifecycle.d.ts.map +1 -0
  554. package/dist/workspace-connections/lifecycle.js +14 -0
  555. package/dist/workspace-connections/lifecycle.js.map +1 -0
  556. package/dist/workspace-connections/store.d.ts.map +1 -1
  557. package/dist/workspace-connections/store.js +16 -0
  558. package/dist/workspace-connections/store.js.map +1 -1
  559. package/package.json +10 -3
  560. package/src/templates/chat/app/i18n/en-US.ts +3 -3
  561. package/src/templates/chat/app/lib/agent-page.spec.tsx +10 -1
  562. package/src/templates/chat/app/lib/agent-page.tsx +10 -1
  563. package/src/templates/default/app/i18n/en-US.ts +3 -3
  564. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  565. package/src/templates/workspace-root/.env.example +12 -0
@@ -0,0 +1,151 @@
1
+ import { extractCssColors, rankColorSamples } from "./media.js";
2
+
3
+ export interface WebsiteAsset {
4
+ url: string;
5
+ kind: "image" | "video" | "audio" | "font" | "stylesheet" | "script";
6
+ role?: "logo" | "open-graph";
7
+ }
8
+
9
+ export interface WebsiteDesignTokens {
10
+ colors: string[];
11
+ typography: Array<{
12
+ family: string;
13
+ size: string;
14
+ weight: string;
15
+ lineHeight: string;
16
+ letterSpacing: string;
17
+ }>;
18
+ spacing: string[];
19
+ radii: string[];
20
+ cssVariables: Record<string, string>;
21
+ }
22
+
23
+ export interface WebsiteExtraction {
24
+ title: string;
25
+ text: string;
26
+ assets: WebsiteAsset[];
27
+ internalLinks: string[];
28
+ designTokens: WebsiteDesignTokens;
29
+ }
30
+
31
+ export function extractStaticWebsiteContext(
32
+ html: string,
33
+ baseUrl: string,
34
+ ): WebsiteExtraction {
35
+ const title = decodeEntities(
36
+ html.match(/<title\b[^>]*>([\s\S]*?)<\/title>/i)?.[1] ?? "",
37
+ ).trim();
38
+ const assets = new Map<string, WebsiteAsset>();
39
+ const links = new Set<string>();
40
+ for (const match of html.matchAll(
41
+ /<(img|video|audio|script|link)\b[^>]*(?:src|href)=["']([^"']+)["'][^>]*>/gi,
42
+ )) {
43
+ const tag = match[1].toLowerCase();
44
+ const url = resolveUrl(match[2], baseUrl);
45
+ if (!url) continue;
46
+ const kind =
47
+ tag === "link"
48
+ ? /icon/i.test(match[0])
49
+ ? "image"
50
+ : /font/i.test(match[0])
51
+ ? "font"
52
+ : "stylesheet"
53
+ : tag === "img"
54
+ ? "image"
55
+ : tag;
56
+ if (
57
+ (
58
+ ["image", "video", "audio", "font", "stylesheet", "script"] as string[]
59
+ ).includes(kind)
60
+ ) {
61
+ const role =
62
+ /(?:alt|class|id|rel)=["'][^"']*(?:logo|wordmark|brandmark|icon)[^"']*["']/i.test(
63
+ match[0],
64
+ )
65
+ ? "logo"
66
+ : undefined;
67
+ assets.set(url, {
68
+ url,
69
+ kind: kind as WebsiteAsset["kind"],
70
+ ...(role ? { role } : {}),
71
+ });
72
+ }
73
+ }
74
+ for (const match of html.matchAll(
75
+ /<meta\b[^>]*(?:property|name)=["'](?:og:image(?::url)?|twitter:image)["'][^>]*content=["']([^"']+)["'][^>]*>|<meta\b[^>]*content=["']([^"']+)["'][^>]*(?:property|name)=["'](?:og:image(?::url)?|twitter:image)["'][^>]*>/gi,
76
+ )) {
77
+ const url = resolveUrl(match[1] ?? match[2], baseUrl);
78
+ if (url) assets.set(url, { url, kind: "image", role: "open-graph" });
79
+ }
80
+ for (const match of html.matchAll(/<a\b[^>]*href=["']([^"']+)["'][^>]*>/gi)) {
81
+ const url = resolveUrl(match[1], baseUrl);
82
+ if (url && new URL(url).origin === new URL(baseUrl).origin) links.add(url);
83
+ }
84
+ const styleText = [...html.matchAll(/<style\b[^>]*>([\s\S]*?)<\/style>/gi)]
85
+ .map((match) => match[1])
86
+ .join("\n");
87
+ const cssVariables = Object.fromEntries(
88
+ [...styleText.matchAll(/(--[\w-]+)\s*:\s*([^;}{]+)/g)].map((match) => [
89
+ match[1],
90
+ match[2].trim(),
91
+ ]),
92
+ );
93
+ return {
94
+ title,
95
+ text: htmlToText(html),
96
+ assets: [...assets.values()],
97
+ internalLinks: [...links],
98
+ designTokens: {
99
+ colors: rankColorSamples(extractCssColors(styleText)),
100
+ typography: [],
101
+ spacing: uniqueMatches(
102
+ styleText,
103
+ /(?:margin|padding|gap)\s*:\s*([^;}{]+)/gi,
104
+ ),
105
+ radii: uniqueMatches(styleText, /border-radius\s*:\s*([^;}{]+)/gi),
106
+ cssVariables,
107
+ },
108
+ };
109
+ }
110
+
111
+ function uniqueMatches(value: string, pattern: RegExp): string[] {
112
+ return [
113
+ ...new Set([...value.matchAll(pattern)].map((match) => match[1].trim())),
114
+ ].slice(0, 100);
115
+ }
116
+
117
+ function htmlToText(html: string): string {
118
+ return decodeEntities(
119
+ html
120
+ .replace(/<!--[\s\S]*?-->/g, " ")
121
+ .replace(/<(script|style|noscript|template)\b[^>]*>[\s\S]*?<\/\1>/gi, " ")
122
+ .replace(/<\s*br\s*\/?\s*>/gi, "\n")
123
+ .replace(/<\/(p|div|li|h[1-6]|section|article|main)>/gi, "\n")
124
+ .replace(/<[^>]+>/g, " "),
125
+ )
126
+ .replace(/[\t ]+/g, " ")
127
+ .replace(/ *\n */g, "\n")
128
+ .replace(/\n{3,}/g, "\n\n")
129
+ .trim();
130
+ }
131
+
132
+ function resolveUrl(value: string, baseUrl: string): string | null {
133
+ try {
134
+ const url = new URL(decodeEntities(value), baseUrl);
135
+ if (url.protocol !== "http:" && url.protocol !== "https:") return null;
136
+ url.hash = "";
137
+ return url.href;
138
+ } catch {
139
+ return null;
140
+ }
141
+ }
142
+
143
+ function decodeEntities(value: string): string {
144
+ return value
145
+ .replace(/&nbsp;/gi, " ")
146
+ .replace(/&amp;/gi, "&")
147
+ .replace(/&lt;/gi, "<")
148
+ .replace(/&gt;/gi, ">")
149
+ .replace(/&quot;/gi, '"')
150
+ .replace(/&#39;|&apos;/gi, "'");
151
+ }
@@ -2160,38 +2160,46 @@ export function createIntegrationsPlugin(
2160
2160
  error: err instanceof Error ? err.message : "Slack access denied",
2161
2161
  };
2162
2162
  }
2163
- const clientId = await resolveSecret("SLACK_CLIENT_ID");
2164
- const clientSecret = await resolveSecret("SLACK_CLIENT_SECRET");
2165
- const signingSecret = await resolveSecret("SLACK_SIGNING_SECRET");
2166
- if (!clientId || !clientSecret || !signingSecret) {
2167
- setResponseStatus(event, 503);
2168
- return {
2169
- error:
2170
- "Slack OAuth is not configured. Add the Slack client id, client secret, and signing secret first.",
2171
- };
2172
- }
2173
- const redirectUri = resolveOAuthRedirectUri(
2174
- event,
2175
- `${P}/slack/oauth/callback`,
2176
- );
2177
- if (!redirectUri) {
2178
- setResponseStatus(event, 400);
2179
- return { error: "Slack OAuth redirect URL is not allowed." };
2180
- }
2181
- const query = getQuery(event);
2182
- const state = encodeOAuthState({
2183
- redirectUri,
2184
- owner: session.email,
2185
- orgId: org?.orgId ?? session.orgId ?? undefined,
2186
- app: "agent-native:slack",
2187
- addAccount: true,
2188
- returnUrl:
2189
- typeof query.return === "string" ? query.return : "/messaging",
2190
- });
2191
- return sendRedirect(
2192
- event,
2193
- buildSlackAuthorizeUrl({ clientId, redirectUri, state }),
2194
- 302,
2163
+ return await runWithRequestContext(
2164
+ {
2165
+ userEmail: session.email,
2166
+ orgId: org?.orgId ?? session.orgId ?? undefined,
2167
+ },
2168
+ async () => {
2169
+ const clientId = await resolveSecret("SLACK_CLIENT_ID");
2170
+ const clientSecret = await resolveSecret("SLACK_CLIENT_SECRET");
2171
+ const signingSecret = await resolveSecret("SLACK_SIGNING_SECRET");
2172
+ if (!clientId || !clientSecret || !signingSecret) {
2173
+ setResponseStatus(event, 503);
2174
+ return {
2175
+ error:
2176
+ "Slack OAuth is not configured. Add the Slack client id, client secret, and signing secret first.",
2177
+ };
2178
+ }
2179
+ const redirectUri = resolveOAuthRedirectUri(
2180
+ event,
2181
+ `${P}/slack/oauth/callback`,
2182
+ );
2183
+ if (!redirectUri) {
2184
+ setResponseStatus(event, 400);
2185
+ return { error: "Slack OAuth redirect URL is not allowed." };
2186
+ }
2187
+ const query = getQuery(event);
2188
+ const state = encodeOAuthState({
2189
+ redirectUri,
2190
+ owner: session.email,
2191
+ orgId: org?.orgId ?? session.orgId ?? undefined,
2192
+ app: "agent-native:slack",
2193
+ addAccount: true,
2194
+ returnUrl:
2195
+ typeof query.return === "string" ? query.return : "/messaging",
2196
+ });
2197
+ return sendRedirect(
2198
+ event,
2199
+ buildSlackAuthorizeUrl({ clientId, redirectUri, state }),
2200
+ 302,
2201
+ );
2202
+ },
2195
2203
  );
2196
2204
  }),
2197
2205
  );
@@ -2239,17 +2247,17 @@ export function createIntegrationsPlugin(
2239
2247
  orgId: org?.orgId ?? session.orgId ?? null,
2240
2248
  orgRole: org?.role ?? null,
2241
2249
  });
2242
- const clientId = await resolveSecret("SLACK_CLIENT_ID");
2243
- const clientSecret = await resolveSecret("SLACK_CLIENT_SECRET");
2244
- if (!clientId || !clientSecret) {
2245
- return oauthErrorPage("Slack OAuth is not configured.");
2246
- }
2247
2250
  return await runWithRequestContext(
2248
2251
  {
2249
2252
  userEmail: access.ownerEmail,
2250
2253
  orgId: access.orgId ?? undefined,
2251
2254
  },
2252
2255
  async () => {
2256
+ const clientId = await resolveSecret("SLACK_CLIENT_ID");
2257
+ const clientSecret = await resolveSecret("SLACK_CLIENT_SECRET");
2258
+ if (!clientId || !clientSecret) {
2259
+ return oauthErrorPage("Slack OAuth is not configured.");
2260
+ }
2253
2261
  const oauth = await exchangeSlackOAuthCode({
2254
2262
  code,
2255
2263
  clientId,
@@ -23,10 +23,10 @@ const messages = {
23
23
  languageDescription:
24
24
  "Choose the interface language. This preference is saved for your account.",
25
25
  languageLabel: "Interface language",
26
- agentTitle: "Agent settings",
26
+ agentTitle: "Agent workspace",
27
27
  agentDescription:
28
- "Open the agent sidebar settings for model, API keys, automations, voice, and other agent controls.",
29
- openAgentSettings: "Open agent settings",
28
+ "Open the agent workspace for model, API keys, automations, voice, and other agent controls.",
29
+ openAgentSettings: "Open agent workspace",
30
30
  workspaceTitle: "Workspace",
31
31
  workspaceDescription: "Manage team access and shared workspace resources.",
32
32
  openTeamSettings: "Open team settings",
@@ -212,6 +212,17 @@ const messages = {
212
212
  "Run this app locally with pnpm dev or use Builder.io to access the CLI terminal.",
213
213
  toggleAgent: "Toggle agent",
214
214
  openFullView: "Open full view",
215
+ askAgent: "Ask the agent",
216
+ askAgentTitle: "Ask the agent",
217
+ askAgentPlaceholder: "Tell the agent what you want to do…",
218
+ connectAi: "Connect AI",
219
+ builderOrOwnKeys:
220
+ "Use Builder.io (free credits), or add your own provider keys.",
221
+ connectBuilderIo: "Connect Builder.io",
222
+ connectingBuilder: "Connecting Builder.io…",
223
+ builderModelCredits: "Free credits for Claude, OpenAI & Gemini",
224
+ addOwnKeys: "Add your own keys",
225
+ configureProviderKeys: "Configure Anthropic, OpenAI, or another provider",
215
226
  checkingAiConnection: "Checking AI connection...",
216
227
  voiceMode: {
217
228
  entryButtonLabel: "Use microphone",
@@ -220,9 +231,9 @@ const messages = {
220
231
  "Voice mode keeps listening while the agent navigates and takes actions.",
221
232
  setupTitle: "Set up voice mode",
222
233
  setupDescription:
223
- "Connect Builder to use managed voice with free credits, or use your own OpenAI API key.",
224
- connectBuilder: "Connect Builder",
225
- useOpenAiKey: "Use OpenAI API key",
234
+ "Connect Builder.io to use managed voice with free credits, or add your own keys.",
235
+ connectBuilder: "Connect Builder.io",
236
+ useOpenAiKey: "Add your own keys",
226
237
  startWithOpenAiKey: "Start with OpenAI key",
227
238
  start: "Start voice mode",
228
239
  keepDictating: "Keep dictating",
@@ -351,9 +362,19 @@ const messages = {
351
362
  organizationMemberNote: "You can manage jobs you created.",
352
363
  loading: "Loading…",
353
364
  recurringLoadError: "Could not load recurring jobs.",
365
+ organizationEmptyTitle: "No organization jobs yet",
366
+ organizationEmptyDescription:
367
+ "Describe a shared job for this organization.",
368
+ recurringEmptyTitle: "No recurring jobs yet",
369
+ recurringEmptyDescription: "Describe what should run and when.",
370
+ organizationCreateTitle: "Create an organization job",
371
+ recurringCreateTitle: "Create a recurring job",
372
+ organizationPrompt:
373
+ "Create a shared organization job that runs on a schedule and does this: ",
374
+ recurringPrompt:
375
+ "Create a recurring job that runs on a schedule and does this: every morning, summarize my inbox.",
354
376
  organizationEmpty: "No organization jobs yet.",
355
- recurringEmpty:
356
- "No recurring jobs yet. Ask the agent: “every morning, summarize my inbox”.",
377
+ recurringEmpty: "No recurring jobs yet.",
357
378
  enabled: "Enabled",
358
379
  paused: "Paused",
359
380
  disabled: "Disabled",
@@ -370,6 +391,10 @@ const messages = {
370
391
  "Automations are personal today, so none are shown in the organization view.",
371
392
  automationsDescription:
372
393
  "Event-triggered and scheduled agent tasks managed from one place.",
394
+ automationsEmptyTitle: "No automations yet",
395
+ automationsEmptyDescription: "Describe what should happen and when.",
396
+ automationsCreateTitle: "Create an automation",
397
+ automationPrompt: "Create an automation that does this: ",
373
398
  automationsPersonalOnly: "Automations are personal today.",
374
399
  deleteRecurringTitle: "Delete recurring job?",
375
400
  deleteRecurringDescription:
@@ -378,8 +403,7 @@ const messages = {
378
403
  recurringDetails: "Recurring job details",
379
404
  instructions: "Instructions",
380
405
  automationsLoadError: "Could not load automations.",
381
- automationsEmpty:
382
- "No automations yet. Ask the agent to set up an event-triggered or scheduled task.",
406
+ automationsEmpty: "No automations yet.",
383
407
  automationEventTrigger: "On {{event}}",
384
408
  automationScheduleTrigger: "Scheduled task",
385
409
  deleteAutomationTitle: "Delete automation?",
@@ -397,8 +421,7 @@ const messages = {
397
421
  personal: "Personal",
398
422
  organization: "Organization",
399
423
  fireTestEvent: "Fire test event",
400
- automationsEmptySettings:
401
- 'No automations yet. Click "New automation" or ask the agent to set one up.',
424
+ automationsEmptySettings: "Describe what should happen and when.",
402
425
  },
403
426
  share: {
404
427
  titleWithResource: 'Share "{{title}}"',
@@ -0,0 +1,118 @@
1
+ export const HOSTED_DEFAULT_MODEL_EXPERIMENT_ID =
2
+ "hosted-default-model-sonnet-5-vs-gpt-5-6-luna-2026-07";
3
+
4
+ export const HOSTED_DEFAULT_MODEL_CONTROL = {
5
+ id: "sonnet-5",
6
+ model: "claude-sonnet-5",
7
+ weight: 80,
8
+ } as const;
9
+
10
+ export const HOSTED_DEFAULT_MODEL_TREATMENT = {
11
+ id: "gpt-5-6-luna",
12
+ model: "gpt-5-6-luna",
13
+ weight: 20,
14
+ } as const;
15
+
16
+ export interface HostedDefaultModelExperimentAssignment {
17
+ experimentId: string;
18
+ variantId: string;
19
+ }
20
+
21
+ export interface HostedDefaultModelExperimentResolution {
22
+ model: string;
23
+ assignment: HostedDefaultModelExperimentAssignment;
24
+ }
25
+
26
+ type HostedExperimentEnv = Record<string, string | undefined>;
27
+
28
+ const FIRST_PARTY_HOST_SUFFIX = ".agent-native.com";
29
+ const ENABLED_VALUES = new Set(["1", "true", "on", "yes"]);
30
+ const DISABLED_VALUES = new Set(["0", "false", "off", "no"]);
31
+
32
+ function hostnameFromUrl(value: string | undefined): string | null {
33
+ const trimmed = value?.trim();
34
+ if (!trimmed) return null;
35
+ try {
36
+ const url = /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed)
37
+ ? new URL(trimmed)
38
+ : new URL(`https://${trimmed}`);
39
+ return url.hostname.toLowerCase();
40
+ } catch {
41
+ return null;
42
+ }
43
+ }
44
+
45
+ /**
46
+ * The rollout is automatic only on first-party hosted app domains. Operators
47
+ * can explicitly enable or disable it for preview and emergency rollback.
48
+ */
49
+ export function isHostedDefaultModelExperimentEnabled(
50
+ env: HostedExperimentEnv = process.env,
51
+ ): boolean {
52
+ const override =
53
+ env.AGENT_NATIVE_HOSTED_MODEL_EXPERIMENT?.trim().toLowerCase();
54
+ if (override && DISABLED_VALUES.has(override)) return false;
55
+ if (override && ENABLED_VALUES.has(override)) return true;
56
+
57
+ const hostnames = [
58
+ env.APP_URL,
59
+ env.BETTER_AUTH_URL,
60
+ env.URL,
61
+ env.DEPLOY_URL,
62
+ env.VERCEL_PROJECT_PRODUCTION_URL,
63
+ env.VERCEL_URL,
64
+ ]
65
+ .map(hostnameFromUrl)
66
+ .filter((hostname): hostname is string => Boolean(hostname));
67
+
68
+ return hostnames.some(
69
+ (hostname) =>
70
+ hostname === "agent-native.com" ||
71
+ hostname.endsWith(FIRST_PARTY_HOST_SUFFIX),
72
+ );
73
+ }
74
+
75
+ /**
76
+ * Stable cross-app bucket: the same authenticated user receives the same
77
+ * variant in every hosted template for the life of this experiment id.
78
+ */
79
+ export function hostedDefaultModelExperimentBucket(userId: string): number {
80
+ const input = `${HOSTED_DEFAULT_MODEL_EXPERIMENT_ID}:${userId.trim().toLowerCase()}`;
81
+ let hash = 0x811c9dc5;
82
+ for (let index = 0; index < input.length; index++) {
83
+ hash ^= input.charCodeAt(index);
84
+ hash = Math.imul(hash, 0x01000193);
85
+ }
86
+ return (hash >>> 0) % 100;
87
+ }
88
+
89
+ export function resolveHostedDefaultModelExperiment(args: {
90
+ userId: string | null | undefined;
91
+ engineName: string;
92
+ isDefaultModelSelection: boolean;
93
+ supportedModels?: readonly string[];
94
+ env?: HostedExperimentEnv;
95
+ }): HostedDefaultModelExperimentResolution | null {
96
+ const userId = args.userId?.trim();
97
+ if (!userId) return null;
98
+ if (args.engineName !== "builder") return null;
99
+ if (!args.isDefaultModelSelection) return null;
100
+ if (!isHostedDefaultModelExperimentEnabled(args.env)) return null;
101
+
102
+ const variant =
103
+ hostedDefaultModelExperimentBucket(userId) <
104
+ HOSTED_DEFAULT_MODEL_TREATMENT.weight
105
+ ? HOSTED_DEFAULT_MODEL_TREATMENT
106
+ : HOSTED_DEFAULT_MODEL_CONTROL;
107
+ if (args.supportedModels && !args.supportedModels.includes(variant.model)) {
108
+ return null;
109
+ }
110
+
111
+ return {
112
+ model: variant.model,
113
+ assignment: {
114
+ experimentId: HOSTED_DEFAULT_MODEL_EXPERIMENT_ID,
115
+ variantId: variant.id,
116
+ },
117
+ };
118
+ }
@@ -354,9 +354,11 @@ export async function instrumentAgentLoop(opts: {
354
354
  toolCallCount++;
355
355
 
356
356
  const isError =
357
- typeof event.result === "string" &&
358
- (event.result.startsWith("Error") ||
359
- event.result.startsWith("Error running "));
357
+ typeof event.isError === "boolean"
358
+ ? event.isError
359
+ : typeof event.result === "string" &&
360
+ (event.result.startsWith("Error") ||
361
+ event.result.startsWith("Error running "));
360
362
  if (isError) failedTools++;
361
363
  else successfulTools++;
362
364