@agent-native/core 0.130.2 → 0.131.2

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 (866) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +51 -0
  3. package/corpus/core/docs/content/agent-surfaces.mdx +4 -4
  4. package/corpus/core/docs/content/automations.mdx +61 -12
  5. package/corpus/core/docs/content/deployment.mdx +11 -4
  6. package/corpus/core/docs/content/extensions.mdx +39 -33
  7. package/corpus/core/docs/content/recurring-jobs.mdx +41 -19
  8. package/corpus/core/docs/content/template-dispatch-operations.mdx +19 -7
  9. package/corpus/core/package.json +3 -1
  10. package/corpus/core/src/action.ts +55 -0
  11. package/corpus/core/src/agent/engine/builder-engine.ts +8 -4
  12. package/corpus/core/src/agent/production-agent.ts +175 -100
  13. package/corpus/core/src/agent/tool-search.ts +36 -0
  14. package/corpus/core/src/automations/service.ts +506 -0
  15. package/corpus/core/src/browser-context/index.ts +392 -0
  16. package/corpus/core/src/client/AgentPanel.tsx +2 -1
  17. package/corpus/core/src/client/FeedbackButton.tsx +37 -4
  18. package/corpus/core/src/client/MultiTabAssistantChat.tsx +21 -0
  19. package/corpus/core/src/client/agent-chat.ts +31 -3
  20. package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +438 -310
  21. package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +4 -4
  22. package/corpus/core/src/client/agent-page/use-jobs.ts +7 -0
  23. package/corpus/core/src/client/analytics-session.ts +13 -0
  24. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +67 -0
  25. package/corpus/core/src/client/settings/AutomationsSection.tsx +27 -499
  26. package/corpus/core/src/client/settings/SettingsPanel.tsx +32 -11
  27. package/corpus/core/src/client/settings/index.ts +2 -0
  28. package/corpus/core/src/client/use-agent-chat.ts +35 -3
  29. package/corpus/core/src/client/use-chat-threads.ts +8 -25
  30. package/corpus/core/src/deploy/build.ts +2 -0
  31. package/corpus/core/src/deploy/workspace-deploy.ts +2 -0
  32. package/corpus/core/src/extensions/actions.ts +115 -3
  33. package/corpus/core/src/extensions/fetch-tool.ts +11 -0
  34. package/corpus/core/src/extensions/routes.ts +16 -1
  35. package/corpus/core/src/extensions/web-content.ts +96 -1
  36. package/corpus/core/src/integrations/computer-supervision.ts +33 -1
  37. package/corpus/core/src/integrations/index.ts +6 -0
  38. package/corpus/core/src/integrations/integration-durable-dispatch-config.ts +10 -0
  39. package/corpus/core/src/integrations/integration-durable-dispatch.ts +4 -0
  40. package/corpus/core/src/integrations/plugin.ts +94 -41
  41. package/corpus/core/src/integrations/remote-browser-actions.ts +621 -0
  42. package/corpus/core/src/jobs/actions/list-recurring-jobs.ts +5 -7
  43. package/corpus/core/src/jobs/actions/manage-recurring-job.ts +3 -7
  44. package/corpus/core/src/jobs/background-automation-runner.ts +437 -0
  45. package/corpus/core/src/jobs/frontmatter.ts +308 -0
  46. package/corpus/core/src/jobs/scheduler.ts +89 -598
  47. package/corpus/core/src/jobs/tools.ts +22 -3
  48. package/corpus/core/src/localization/default-messages.ts +45 -45
  49. package/corpus/core/src/mcp-client/index.ts +6 -0
  50. package/corpus/core/src/notifications/actions.ts +5 -0
  51. package/corpus/core/src/progress/actions.ts +5 -0
  52. package/corpus/core/src/provider-api/actions/github-repo-files.ts +11 -0
  53. package/corpus/core/src/provider-api/actions/provider-api.ts +13 -0
  54. package/corpus/core/src/server/action-discovery.ts +7 -0
  55. package/corpus/core/src/server/agent-chat/browser-team-tools.ts +126 -3
  56. package/corpus/core/src/server/agent-chat/framework-prompts.ts +7 -11
  57. package/corpus/core/src/server/agent-chat/plugin-options.ts +3 -3
  58. package/corpus/core/src/server/agent-chat/script-entries.ts +52 -1
  59. package/corpus/core/src/server/agent-chat-plugin.ts +25 -5
  60. package/corpus/core/src/server/attribution.ts +22 -0
  61. package/corpus/core/src/server/auth.ts +20 -6
  62. package/corpus/core/src/server/better-auth-instance.ts +10 -2
  63. package/corpus/core/src/server/core-routes-plugin.ts +10 -1
  64. package/corpus/core/src/server/csrf.ts +25 -0
  65. package/corpus/core/src/server/google-oauth.ts +21 -1
  66. package/corpus/core/src/server/onboarding-html.ts +18 -0
  67. package/corpus/core/src/server/prompts/framework-core-compact.ts +3 -3
  68. package/corpus/core/src/server/prompts/framework-core.ts +3 -3
  69. package/corpus/core/src/server/prompts/shared-rules.ts +3 -3
  70. package/corpus/core/src/settings/index.ts +1 -0
  71. package/corpus/core/src/shared/analytics-anonymous-id.ts +35 -0
  72. package/corpus/core/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  73. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +26 -0
  74. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +28 -0
  75. package/corpus/core/src/templates/default/app/i18n/en-US.ts +27 -0
  76. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +28 -0
  77. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +28 -0
  78. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +25 -0
  79. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +27 -0
  80. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +27 -0
  81. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +27 -0
  82. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +24 -0
  83. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +24 -0
  84. package/corpus/core/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  85. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  86. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-page/SKILL.md +10 -7
  87. package/corpus/core/src/templates/workspace-core/.agents/skills/automations/SKILL.md +53 -8
  88. package/corpus/core/src/templates/workspace-core/.agents/skills/browser-sessions/SKILL.md +131 -0
  89. package/corpus/core/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +13 -4
  90. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +23 -15
  91. package/corpus/core/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +33 -18
  92. package/corpus/core/src/tracking/providers.ts +1 -0
  93. package/corpus/core/src/tracking/registry.ts +2 -1
  94. package/corpus/core/src/tracking/types.ts +1 -0
  95. package/corpus/core/src/triggers/actions/list-automations.ts +43 -44
  96. package/corpus/core/src/triggers/actions/manage-automation.ts +17 -48
  97. package/corpus/core/src/triggers/actions.ts +218 -127
  98. package/corpus/core/src/triggers/dispatcher.ts +181 -367
  99. package/corpus/core/src/triggers/routes.ts +84 -27
  100. package/corpus/core/src/triggers/types.ts +9 -23
  101. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  102. package/corpus/templates/analytics/actions/install-dashboard-template.ts +13 -4
  103. package/corpus/templates/analytics/actions/rename-dashboard.ts +8 -3
  104. package/corpus/templates/analytics/actions/restore-dashboard-revision.ts +8 -3
  105. package/corpus/templates/analytics/actions/update-dashboard.ts +22 -5
  106. package/corpus/templates/analytics/app/components/dashboard/DashboardPanelSkeleton.tsx +7 -1
  107. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +1 -82
  108. package/corpus/templates/analytics/app/components/layout/NewDashboardDialog.tsx +4 -4
  109. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +23 -13
  110. package/corpus/templates/analytics/app/global.css +21 -0
  111. package/corpus/templates/analytics/app/i18n-data.ts +165 -101
  112. package/corpus/templates/analytics/app/lib/custom-block-promotion.ts +62 -0
  113. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +17 -2
  114. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +3 -1
  115. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +77 -12
  116. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-save-queue.ts +34 -0
  117. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +42 -26
  118. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +15 -0
  119. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +1 -1
  120. package/corpus/templates/analytics/changelog/2026-07-29-chat-history-now-closes-smoothly-and-stays-ready-when-you-re.md +6 -0
  121. package/corpus/templates/analytics/changelog/2026-07-29-chat-history-stays-visible-when-you-return-to-the-dashboard.md +6 -0
  122. package/corpus/templates/analytics/changelog/2026-07-29-custom-dashboard-blocks-now-identify-one-off-agent-patches-a.md +6 -0
  123. package/corpus/templates/analytics/changelog/2026-07-29-dashboard-chart-deletions-now-save-in-order-so-removed-rows-.md +6 -0
  124. package/corpus/templates/analytics/changelog/2026-07-29-dashboard-chart-loaders-are-easier-to-see-and-animate-more-s.md +6 -0
  125. package/corpus/templates/analytics/changelog/2026-07-29-plan-mode-can-now-query-connected-analytics-sources-while-ke.md +6 -0
  126. package/corpus/templates/analytics/changelog/2026-07-29-plan-mode-can-use-clips-as-read-only-prompt-context.md +6 -0
  127. package/corpus/templates/analytics/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  128. package/corpus/templates/analytics/changelog/2026-07-29-signup-entry-pages-now-show-the-first-page-viewed-before-eac.md +6 -0
  129. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +26 -1
  130. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +0 -33
  131. package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +13 -3
  132. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +9 -1
  133. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +44 -1
  134. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +96 -16
  135. package/corpus/templates/analytics/server/plugins/agent-chat.ts +18 -27
  136. package/corpus/templates/analytics/server/plugins/core-routes.ts +1 -0
  137. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  138. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +4 -8
  139. package/corpus/templates/assets/changelog/2026-07-29-chat-history-now-closes-smoothly-and-stays-ready-when-you-re.md +6 -0
  140. package/corpus/templates/assets/changelog/2026-07-29-chat-history-stays-visible-when-you-return-to-the-workspace.md +6 -0
  141. package/corpus/templates/assets/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  142. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  143. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +3 -7
  144. package/corpus/templates/brain/app/root.tsx +0 -3
  145. package/corpus/templates/brain/changelog/2026-07-29-chat-history-now-closes-smoothly-and-stays-ready-when-you-re.md +6 -0
  146. package/corpus/templates/brain/changelog/2026-07-29-chat-history-stays-visible-when-you-return-to-ask-brain.md +6 -0
  147. package/corpus/templates/brain/changelog/2026-07-29-extensions-are-no-longer-shown-as-a-default-command-menu-des.md +6 -0
  148. package/corpus/templates/brain/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  149. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  150. package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +25 -5
  151. package/corpus/templates/calendar/AGENTS.md +5 -0
  152. package/corpus/templates/calendar/actions/create-event.ts +43 -13
  153. package/corpus/templates/calendar/actions/event-action-helpers.ts +131 -1
  154. package/corpus/templates/calendar/actions/manage-event-draft.ts +65 -2
  155. package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +437 -258
  156. package/corpus/templates/calendar/app/components/calendar/DayView.tsx +19 -3
  157. package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +24 -0
  158. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +15 -2
  159. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +1 -5
  160. package/corpus/templates/calendar/app/hooks/use-events.ts +44 -5
  161. package/corpus/templates/calendar/app/i18n-data.ts +50 -0
  162. package/corpus/templates/calendar/app/lib/all-day-layout.ts +9 -2
  163. package/corpus/templates/calendar/app/lib/event-form-initialization.ts +4 -8
  164. package/corpus/templates/calendar/app/lib/event-form-utils.ts +30 -8
  165. package/corpus/templates/calendar/app/lib/location-suggestions.ts +36 -0
  166. package/corpus/templates/calendar/app/lib/out-of-office.ts +87 -1
  167. package/corpus/templates/calendar/app/pages/CalendarView.tsx +68 -13
  168. package/corpus/templates/calendar/changelog/2026-07-26-out-of-office-events-now-default-to-full-days-with-a-ready.md +6 -0
  169. package/corpus/templates/calendar/changelog/2026-07-29-recent-calendar-locations-now-appear-as-address-suggestions-.md +6 -0
  170. package/corpus/templates/calendar/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  171. package/corpus/templates/calendar/server/lib/find-time.ts +29 -5
  172. package/corpus/templates/calendar/shared/api.ts +2 -0
  173. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  174. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +1 -5
  175. package/corpus/templates/chat/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  176. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  177. package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -5
  178. package/corpus/templates/clips/changelog/2026-07-29-fixed-system-audio-recordings-picking-up-your-microphone-in-.md +6 -0
  179. package/corpus/templates/clips/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  180. package/corpus/templates/clips/changelog/2026-07-29-the-desktop-camera-preview-now-closes-after-a-recording-fin.md +6 -0
  181. package/corpus/templates/clips/desktop/src/app.tsx +14 -15
  182. package/corpus/templates/clips/desktop/src/lib/bubble-session.ts +11 -0
  183. package/corpus/templates/clips/desktop/src/lib/recorder.ts +9 -4
  184. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +11 -0
  185. package/corpus/templates/clips/server/jobs/transactional-emails.ts +47 -23
  186. package/corpus/templates/clips/server/lib/transactional-email-store.ts +16 -6
  187. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  188. package/corpus/templates/content/.agents/skills/content-product-development/SKILL.md +103 -0
  189. package/corpus/templates/content/.agents/skills/content-product-development/references/verification.md +57 -0
  190. package/corpus/templates/content/AGENTS.md +2 -0
  191. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +1 -6
  192. package/corpus/templates/content/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  193. package/corpus/templates/content/docs/product/README.md +115 -0
  194. package/corpus/templates/content/docs/product/architecture.md +98 -0
  195. package/corpus/templates/content/docs/product/capabilities/content.access.page-database.md +76 -0
  196. package/corpus/templates/content/docs/product/capabilities/content.access.row-private.md +75 -0
  197. package/corpus/templates/content/docs/product/capabilities/content.access.safe-aggregate.md +75 -0
  198. package/corpus/templates/content/docs/product/capabilities/content.access.visibility-closure.md +79 -0
  199. package/corpus/templates/content/docs/product/capabilities/content.action.button.md +67 -0
  200. package/corpus/templates/content/docs/product/capabilities/content.agent.action-parity.md +73 -0
  201. package/corpus/templates/content/docs/product/capabilities/content.agent.audience-safe.md +91 -0
  202. package/corpus/templates/content/docs/product/capabilities/content.agent.automation.md +67 -0
  203. package/corpus/templates/content/docs/product/capabilities/content.agent.expression-authoring.md +71 -0
  204. package/corpus/templates/content/docs/product/capabilities/content.agent.presence.md +103 -0
  205. package/corpus/templates/content/docs/product/capabilities/content.agent.resource-consent.md +90 -0
  206. package/corpus/templates/content/docs/product/capabilities/content.agent.skill-catalog.md +67 -0
  207. package/corpus/templates/content/docs/product/capabilities/content.api.cms.md +70 -0
  208. package/corpus/templates/content/docs/product/capabilities/content.author.code.md +71 -0
  209. package/corpus/templates/content/docs/product/capabilities/content.author.document-editor.md +71 -0
  210. package/corpus/templates/content/docs/product/capabilities/content.author.footnotes.md +71 -0
  211. package/corpus/templates/content/docs/product/capabilities/content.author.math.md +71 -0
  212. package/corpus/templates/content/docs/product/capabilities/content.author.media.md +71 -0
  213. package/corpus/templates/content/docs/product/capabilities/content.author.mermaid.md +71 -0
  214. package/corpus/templates/content/docs/product/capabilities/content.automation.scheduled.md +67 -0
  215. package/corpus/templates/content/docs/product/capabilities/content.capture.enrich.md +75 -0
  216. package/corpus/templates/content/docs/product/capabilities/content.command.fabric.md +67 -0
  217. package/corpus/templates/content/docs/product/capabilities/content.comment.page-owned.md +75 -0
  218. package/corpus/templates/content/docs/product/capabilities/content.diff.ai-assist.md +75 -0
  219. package/corpus/templates/content/docs/product/capabilities/content.diff.filtered-review.md +79 -0
  220. package/corpus/templates/content/docs/product/capabilities/content.diff.in-place.md +80 -0
  221. package/corpus/templates/content/docs/product/capabilities/content.discussion.page.md +80 -0
  222. package/corpus/templates/content/docs/product/capabilities/content.embed.host-grant.md +70 -0
  223. package/corpus/templates/content/docs/product/capabilities/content.embed.mcp-app.md +69 -0
  224. package/corpus/templates/content/docs/product/capabilities/content.embed.surface.md +74 -0
  225. package/corpus/templates/content/docs/product/capabilities/content.event.committed.md +85 -0
  226. package/corpus/templates/content/docs/product/capabilities/content.expression.cached-result.md +71 -0
  227. package/corpus/templates/content/docs/product/capabilities/content.expression.catalog.md +71 -0
  228. package/corpus/templates/content/docs/product/capabilities/content.expression.language.md +76 -0
  229. package/corpus/templates/content/docs/product/capabilities/content.feedback.signal.md +67 -0
  230. package/corpus/templates/content/docs/product/capabilities/content.form.shared-engine.md +72 -0
  231. package/corpus/templates/content/docs/product/capabilities/content.history.queryable.md +79 -0
  232. package/corpus/templates/content/docs/product/capabilities/content.home.global.md +80 -0
  233. package/corpus/templates/content/docs/product/capabilities/content.job.durable.md +76 -0
  234. package/corpus/templates/content/docs/product/capabilities/content.knowledge.graph.md +67 -0
  235. package/corpus/templates/content/docs/product/capabilities/content.knowledge.links.md +67 -0
  236. package/corpus/templates/content/docs/product/capabilities/content.knowledge.search.md +67 -0
  237. package/corpus/templates/content/docs/product/capabilities/content.layout.responsive.md +80 -0
  238. package/corpus/templates/content/docs/product/capabilities/content.navigation.sidebar.md +86 -0
  239. package/corpus/templates/content/docs/product/capabilities/content.notification.source.md +71 -0
  240. package/corpus/templates/content/docs/product/capabilities/content.object.block.md +76 -0
  241. package/corpus/templates/content/docs/product/capabilities/content.object.blocks-field.md +79 -0
  242. package/corpus/templates/content/docs/product/capabilities/content.object.database.md +92 -0
  243. package/corpus/templates/content/docs/product/capabilities/content.object.multi-membership.md +75 -0
  244. package/corpus/templates/content/docs/product/capabilities/content.object.page.md +76 -0
  245. package/corpus/templates/content/docs/product/capabilities/content.object.reference.md +75 -0
  246. package/corpus/templates/content/docs/product/capabilities/content.object.transclusion.md +75 -0
  247. package/corpus/templates/content/docs/product/capabilities/content.organization.teams.md +71 -0
  248. package/corpus/templates/content/docs/product/capabilities/content.portability.pdf-export.md +78 -0
  249. package/corpus/templates/content/docs/product/capabilities/content.portability.roundtrip.md +154 -0
  250. package/corpus/templates/content/docs/product/capabilities/content.portability.source-representation.md +70 -0
  251. package/corpus/templates/content/docs/product/capabilities/content.portability.vault-export.md +80 -0
  252. package/corpus/templates/content/docs/product/capabilities/content.presentation.mode.md +76 -0
  253. package/corpus/templates/content/docs/product/capabilities/content.preset.catalog.md +71 -0
  254. package/corpus/templates/content/docs/product/capabilities/content.property.actor.md +75 -0
  255. package/corpus/templates/content/docs/product/capabilities/content.property.catalog.md +76 -0
  256. package/corpus/templates/content/docs/product/capabilities/content.property.constraints.md +75 -0
  257. package/corpus/templates/content/docs/product/capabilities/content.property.guarded-change.md +76 -0
  258. package/corpus/templates/content/docs/product/capabilities/content.property.location.md +71 -0
  259. package/corpus/templates/content/docs/product/capabilities/content.property.typed.md +71 -0
  260. package/corpus/templates/content/docs/product/capabilities/content.publish.public.md +75 -0
  261. package/corpus/templates/content/docs/product/capabilities/content.publish.reading.md +74 -0
  262. package/corpus/templates/content/docs/product/capabilities/content.query.object.md +114 -0
  263. package/corpus/templates/content/docs/product/capabilities/content.reader.documents.md +69 -0
  264. package/corpus/templates/content/docs/product/capabilities/content.reader.surface.md +75 -0
  265. package/corpus/templates/content/docs/product/capabilities/content.relationship.edge.md +183 -0
  266. package/corpus/templates/content/docs/product/capabilities/content.renderer.artifact-block.md +71 -0
  267. package/corpus/templates/content/docs/product/capabilities/content.renderer.custom-block.md +81 -0
  268. package/corpus/templates/content/docs/product/capabilities/content.renderer.graph.md +71 -0
  269. package/corpus/templates/content/docs/product/capabilities/content.renderer.typed.md +92 -0
  270. package/corpus/templates/content/docs/product/capabilities/content.research.annotation.md +75 -0
  271. package/corpus/templates/content/docs/product/capabilities/content.research.citation.md +70 -0
  272. package/corpus/templates/content/docs/product/capabilities/content.review.code.md +67 -0
  273. package/corpus/templates/content/docs/product/capabilities/content.revision.suggestions.md +76 -0
  274. package/corpus/templates/content/docs/product/capabilities/content.rule.deterministic.md +79 -0
  275. package/corpus/templates/content/docs/product/capabilities/content.schedule.constraints.md +81 -0
  276. package/corpus/templates/content/docs/product/capabilities/content.security.private-vault.md +71 -0
  277. package/corpus/templates/content/docs/product/capabilities/content.share.views.md +140 -0
  278. package/corpus/templates/content/docs/product/capabilities/content.source.adapters.md +154 -0
  279. package/corpus/templates/content/docs/product/capabilities/content.source.builder-codec.md +70 -0
  280. package/corpus/templates/content/docs/product/capabilities/content.source.catalog.md +149 -0
  281. package/corpus/templates/content/docs/product/capabilities/content.source.file-folder.md +71 -0
  282. package/corpus/templates/content/docs/product/capabilities/content.source.local-bridge.md +156 -0
  283. package/corpus/templates/content/docs/product/capabilities/content.source.local-project.md +70 -0
  284. package/corpus/templates/content/docs/product/capabilities/content.source.page-link.md +70 -0
  285. package/corpus/templates/content/docs/product/capabilities/content.source.row-union.md +69 -0
  286. package/corpus/templates/content/docs/product/capabilities/content.source.spaces-files.md +75 -0
  287. package/corpus/templates/content/docs/product/capabilities/content.source.sync-policy.md +161 -0
  288. package/corpus/templates/content/docs/product/capabilities/content.system.dependencies.md +80 -0
  289. package/corpus/templates/content/docs/product/capabilities/content.system.my-tasks.md +75 -0
  290. package/corpus/templates/content/docs/product/capabilities/content.system.project-status.md +77 -0
  291. package/corpus/templates/content/docs/product/capabilities/content.system.research-workspace.md +80 -0
  292. package/corpus/templates/content/docs/product/capabilities/content.system.task-project.md +76 -0
  293. package/corpus/templates/content/docs/product/capabilities/content.template.governance.md +76 -0
  294. package/corpus/templates/content/docs/product/capabilities/content.template.graph.md +76 -0
  295. package/corpus/templates/content/docs/product/capabilities/content.template.item-body.md +71 -0
  296. package/corpus/templates/content/docs/product/capabilities/content.template.update.md +71 -0
  297. package/corpus/templates/content/docs/product/capabilities/content.time.types.md +85 -0
  298. package/corpus/templates/content/docs/product/capabilities/content.version.branching.md +151 -0
  299. package/corpus/templates/content/docs/product/capabilities/content.version.field-history.md +103 -0
  300. package/corpus/templates/content/docs/product/capabilities/content.view.canvas.md +94 -0
  301. package/corpus/templates/content/docs/product/capabilities/content.view.chart.md +91 -0
  302. package/corpus/templates/content/docs/product/capabilities/content.view.dynamic-create.md +137 -0
  303. package/corpus/templates/content/docs/product/capabilities/content.view.fast-capture.md +82 -0
  304. package/corpus/templates/content/docs/product/capabilities/content.view.graph.md +95 -0
  305. package/corpus/templates/content/docs/product/capabilities/content.view.grouping-aggregation.md +83 -0
  306. package/corpus/templates/content/docs/product/capabilities/content.view.map.md +77 -0
  307. package/corpus/templates/content/docs/product/capabilities/content.view.personal-state.md +99 -0
  308. package/corpus/templates/content/docs/product/capabilities/content.view.pivot.md +76 -0
  309. package/corpus/templates/content/docs/product/capabilities/content.view.query.md +106 -0
  310. package/corpus/templates/content/docs/product/capabilities/content.view.renderer-conformance.md +77 -0
  311. package/corpus/templates/content/docs/product/capabilities/content.view.scale.md +77 -0
  312. package/corpus/templates/content/docs/product/capabilities/content.view.source-query.md +159 -0
  313. package/corpus/templates/content/docs/product/capabilities/content.view.timeline.md +86 -0
  314. package/corpus/templates/content/docs/product/capabilities/content.view.tree.md +77 -0
  315. package/corpus/templates/content/docs/product/capabilities/content.workspace.multi-scope.md +80 -0
  316. package/corpus/templates/content/docs/product/capabilities/content.workspace.session-restore.md +76 -0
  317. package/corpus/templates/content/docs/product/capabilities/content.workspace.view-instance.md +76 -0
  318. package/corpus/templates/content/docs/product/capabilities/content.workspace.working-set.md +77 -0
  319. package/corpus/templates/content/docs/product/chapters/content.chapter.capture-research.md +20 -0
  320. package/corpus/templates/content/docs/product/chapters/content.chapter.connected-sources.md +20 -0
  321. package/corpus/templates/content/docs/product/chapters/content.chapter.consensus.md +19 -0
  322. package/corpus/templates/content/docs/product/chapters/content.chapter.durable-home.md +21 -0
  323. package/corpus/templates/content/docs/product/chapters/content.chapter.publishing-portability.md +21 -0
  324. package/corpus/templates/content/docs/product/chapters/content.chapter.working-systems.md +27 -0
  325. package/corpus/templates/content/docs/product/encyclopedia.md +559 -0
  326. package/corpus/templates/content/docs/product/features/content.feature.bring-your-local-work.md +39 -0
  327. package/corpus/templates/content/docs/product/features/content.feature.build-living-dashboards.md +34 -0
  328. package/corpus/templates/content/docs/product/features/content.feature.build-new-surfaces.md +33 -0
  329. package/corpus/templates/content/docs/product/features/content.feature.capture-into-action.md +34 -0
  330. package/corpus/templates/content/docs/product/features/content.feature.cite-what-you-found.md +34 -0
  331. package/corpus/templates/content/docs/product/features/content.feature.collaborate-in-context.md +59 -0
  332. package/corpus/templates/content/docs/product/features/content.feature.collect-structured-input.md +38 -0
  333. package/corpus/templates/content/docs/product/features/content.feature.connect-your-sources.md +38 -0
  334. package/corpus/templates/content/docs/product/features/content.feature.data-that-keeps-itself-right.md +45 -0
  335. package/corpus/templates/content/docs/product/features/content.feature.durable-foundations.md +48 -0
  336. package/corpus/templates/content/docs/product/features/content.feature.evolve-systems-safely.md +38 -0
  337. package/corpus/templates/content/docs/product/features/content.feature.explore-alternatives-safely.md +39 -0
  338. package/corpus/templates/content/docs/product/features/content.feature.find-your-place-again.md +40 -0
  339. package/corpus/templates/content/docs/product/features/content.feature.keep-your-private-vault-private.md +39 -0
  340. package/corpus/templates/content/docs/product/features/content.feature.living-references.md +38 -0
  341. package/corpus/templates/content/docs/product/features/content.feature.make-the-workspace-yours.md +40 -0
  342. package/corpus/templates/content/docs/product/features/content.feature.move-without-starting-over.md +38 -0
  343. package/corpus/templates/content/docs/product/features/content.feature.plan-work-across-time.md +39 -0
  344. package/corpus/templates/content/docs/product/features/content.feature.publish-with-confidence.md +43 -0
  345. package/corpus/templates/content/docs/product/features/content.feature.put-your-organizations-know-how-to-work.md +38 -0
  346. package/corpus/templates/content/docs/product/features/content.feature.read-and-annotate-anything.md +38 -0
  347. package/corpus/templates/content/docs/product/features/content.feature.review-changes-in-place.md +39 -0
  348. package/corpus/templates/content/docs/product/features/content.feature.run-projects-your-way.md +44 -0
  349. package/corpus/templates/content/docs/product/features/content.feature.see-your-information-your-way.md +44 -0
  350. package/corpus/templates/content/docs/product/features/content.feature.share-how-your-organization-works.md +38 -0
  351. package/corpus/templates/content/docs/product/features/content.feature.sketch-connections-keep-whats-true.md +39 -0
  352. package/corpus/templates/content/docs/product/features/content.feature.take-the-whole-vault-with-you.md +39 -0
  353. package/corpus/templates/content/docs/product/features/content.feature.trust-your-connected-sources.md +40 -0
  354. package/corpus/templates/content/docs/product/features/content.feature.understand-what-your-data-says.md +39 -0
  355. package/corpus/templates/content/docs/product/features/content.feature.when-this-happens-that-follows.md +43 -0
  356. package/corpus/templates/content/docs/product/features/content.feature.work-across-every-workspace.md +37 -0
  357. package/corpus/templates/content/docs/product/features/content.feature.work-on-content-inside-another-application.md +37 -0
  358. package/corpus/templates/content/docs/product/roadmap.md +878 -0
  359. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  360. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +1 -7
  361. package/corpus/templates/crm/app/i18n/en-US.ts +4 -0
  362. package/corpus/templates/crm/app/routes/settings.tsx +33 -8
  363. package/corpus/templates/crm/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  364. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  365. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +133 -63
  366. package/corpus/templates/design/.generated/bridge/embedded-wheel.generated.ts +19 -2
  367. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +51 -14
  368. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +41 -26
  369. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +22 -4
  370. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +216 -116
  371. package/corpus/templates/design/app/components/design/bridge/embedded-wheel.bridge.ts +21 -2
  372. package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +5 -1
  373. package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbenchLoader.tsx +10 -2
  374. package/corpus/templates/design/app/components/design/code-workbench/code-workbench-shell.ts +2 -0
  375. package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +60 -55
  376. package/corpus/templates/design/app/components/design/design-canvas/content-size-report.ts +88 -2
  377. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +3 -2
  378. package/corpus/templates/design/app/components/design/types.ts +4 -0
  379. package/corpus/templates/design/app/components/layout/Sidebar.tsx +1 -5
  380. package/corpus/templates/design/app/pages/design-editor/clipboard-layer-source.ts +28 -0
  381. package/corpus/templates/design/app/pages/design-editor/clone-and-pen-edit.ts +117 -0
  382. package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +3 -1
  383. package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +120 -74
  384. package/corpus/templates/design/app/pages/design-editor/pending-structure-verification.ts +11 -0
  385. package/corpus/templates/design/app/pages/design-editor/react-semantic-handoff.ts +2 -0
  386. package/corpus/templates/design/app/pages/design-editor/source-location.ts +1 -1
  387. package/corpus/templates/design/changelog/2026-07-29-copy-rendered-ui-between-live-local-apps-and-design-files-wh.md +6 -0
  388. package/corpus/templates/design/changelog/2026-07-29-design-boards-stay-dark-and-viewport-height-content-keeps-it.md +6 -0
  389. package/corpus/templates/design/changelog/2026-07-29-design-frames-no-longer-grow-continuously-when-their-content.md +6 -0
  390. package/corpus/templates/design/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  391. package/corpus/templates/design/changelog/2026-07-29-the-code-panel-and-apply-design-update-control-now-use-clear.md +6 -0
  392. package/corpus/templates/design/changelog/2026-07-29-the-tools-panel-now-keeps-extension-creation-and-discovery-h.md +6 -0
  393. package/corpus/templates/design/shared/source-mode.ts +7 -1
  394. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  395. package/corpus/templates/dispatch/app/i18n-data.ts +171 -0
  396. package/corpus/templates/dispatch/app/routes/browser-chat.tsx +4 -0
  397. package/corpus/templates/dispatch/app/routes/browser-connect.tsx +4 -0
  398. package/corpus/templates/dispatch/changelog/2026-07-29-browser-chat-can-securely-connect-the-agent-native-chrome-ex.md +6 -0
  399. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  400. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +1 -6
  401. package/corpus/templates/forms/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  402. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  403. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +1 -5
  404. package/corpus/templates/macros/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  405. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  406. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +1 -9
  407. package/corpus/templates/mail/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  408. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  409. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +3 -7
  410. package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -2
  411. package/corpus/templates/plan/changelog/2026-07-29-chat-history-now-closes-smoothly-and-stays-ready-when-you-re.md +6 -0
  412. package/corpus/templates/plan/changelog/2026-07-29-chat-history-stays-visible-when-you-return-to-ask-plan.md +6 -0
  413. package/corpus/templates/plan/changelog/2026-07-29-fixed-plan-pages-crashing-when-recent-activity-is-unavailabl.md +6 -0
  414. package/corpus/templates/plan/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  415. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  416. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +60 -4
  417. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +20 -0
  418. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +30 -1
  419. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +3 -1
  420. package/corpus/templates/slides/AGENTS.md +22 -24
  421. package/corpus/templates/slides/actions/check-image-gen.ts +8 -2
  422. package/corpus/templates/slides/actions/create-deck.ts +4 -12
  423. package/corpus/templates/slides/actions/export-pptx.ts +25 -3
  424. package/corpus/templates/slides/actions/generate-image-api.ts +4 -2
  425. package/corpus/templates/slides/actions/generate-slides-ai.ts +1 -1
  426. package/corpus/templates/slides/actions/get-deck-reference-context.ts +136 -0
  427. package/corpus/templates/slides/actions/get-workspace-defaults.ts +55 -0
  428. package/corpus/templates/slides/actions/image-gen-status.ts +10 -1
  429. package/corpus/templates/slides/actions/import-file.ts +53 -38
  430. package/corpus/templates/slides/actions/list-decks.ts +2 -0
  431. package/corpus/templates/slides/actions/patch-deck.ts +2 -0
  432. package/corpus/templates/slides/actions/set-workspace-defaults.ts +50 -0
  433. package/corpus/templates/slides/actions/view-screen.ts +6 -0
  434. package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +1 -1
  435. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +67 -3
  436. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +40 -8
  437. package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +33 -8
  438. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +6 -2
  439. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +114 -128
  440. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +2 -1
  441. package/corpus/templates/slides/app/components/editor/ImageGenPanel.tsx +1 -1
  442. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +1193 -267
  443. package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +302 -102
  444. package/corpus/templates/slides/app/components/editor/rich-text-selection.ts +270 -0
  445. package/corpus/templates/slides/app/components/editor/slide-escape-arbiter.ts +34 -0
  446. package/corpus/templates/slides/app/components/editor/slide-object-interactions.ts +368 -0
  447. package/corpus/templates/slides/app/components/editor/slide-presence.ts +13 -0
  448. package/corpus/templates/slides/app/components/layout/AgentWorkIndicator.tsx +23 -3
  449. package/corpus/templates/slides/app/components/layout/Layout.tsx +39 -6
  450. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +1 -6
  451. package/corpus/templates/slides/app/components/layout/layout-route-policy.ts +23 -0
  452. package/corpus/templates/slides/app/components/visual-editor/DrawOverlay.tsx +0 -2
  453. package/corpus/templates/slides/app/context/DeckContext.tsx +2 -0
  454. package/corpus/templates/slides/app/global.css +60 -0
  455. package/corpus/templates/slides/app/hooks/use-agent-generating.ts +76 -5
  456. package/corpus/templates/slides/app/hooks/use-workspace-defaults.ts +26 -0
  457. package/corpus/templates/slides/app/i18n/en-US.ts +38 -3
  458. package/corpus/templates/slides/app/lib/generation-state.ts +13 -3
  459. package/corpus/templates/slides/app/lib/slide-image-replacement.ts +27 -6
  460. package/corpus/templates/slides/app/lib/text-tool-shortcut.ts +62 -0
  461. package/corpus/templates/slides/app/pages/DeckEditor.tsx +197 -83
  462. package/corpus/templates/slides/app/pages/DesignSystems.tsx +95 -0
  463. package/corpus/templates/slides/app/pages/Index.tsx +348 -53
  464. package/corpus/templates/slides/changelog/2026-07-28-pick-an-existing-deck-as-a-style-reference-when-creating-a-n.md +6 -0
  465. package/corpus/templates/slides/changelog/2026-07-29-ai-editing-status-is-now-quieter-and-only-shows-slide-presen.md +6 -0
  466. package/corpus/templates/slides/changelog/2026-07-29-design-systems-and-reference-decks-are-easier-to-choose-toge.md +6 -0
  467. package/corpus/templates/slides/changelog/2026-07-29-generated-decks-now-receive-a-concise-relevant-title-before-.md +6 -0
  468. package/corpus/templates/slides/changelog/2026-07-29-new-deck-prompts-reuse-empty-chats.md +6 -0
  469. package/corpus/templates/slides/changelog/2026-07-29-new-deck-setup-now-stays-in-the-editor-with-closable-style-a.md +6 -0
  470. package/corpus/templates/slides/changelog/2026-07-29-selected-words-and-text-runs-can-now-be-styled-independently.md +6 -0
  471. package/corpus/templates/slides/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  472. package/corpus/templates/slides/changelog/2026-07-29-slide-annotation-tools-are-clearer-and-escape-now-exits-anno.md +6 -0
  473. package/corpus/templates/slides/changelog/2026-07-29-slide-editing-now-opens-with-the-app-navigation-collapsed-fo.md +6 -0
  474. package/corpus/templates/slides/changelog/2026-07-29-slide-editing-stays-visually-clean-on-hover-without-a-canvas.md +6 -0
  475. package/corpus/templates/slides/changelog/2026-07-29-slides-now-appear-one-by-one-while-ai-builds-a-deck-with-ste.md +6 -0
  476. package/corpus/templates/slides/changelog/2026-07-29-text-boxes-now-select-move-duplicate-resize-and-style-like-a.md +6 -0
  477. package/corpus/templates/slides/changelog/2026-07-29-untitled-decks-now-use-a-clearer-this-deck-label-in-the-agen.md +6 -0
  478. package/corpus/templates/slides/server/handlers/image-providers/builder.ts +305 -0
  479. package/corpus/templates/slides/server/handlers/image-providers/index.ts +6 -3
  480. package/corpus/templates/slides/server/plugins/agent-chat.ts +1 -0
  481. package/corpus/templates/slides/server/workspace-defaults.ts +169 -0
  482. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  483. package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +31 -8
  484. package/corpus/templates/tasks/app/i18n/en-US.ts +7 -0
  485. package/corpus/templates/tasks/app/routes/settings.tsx +25 -2
  486. package/corpus/templates/tasks/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  487. package/corpus/toolkit/CHANGELOG.md +15 -0
  488. package/corpus/toolkit/README.md +2 -2
  489. package/corpus/toolkit/package.json +1 -1
  490. package/corpus/toolkit/src/app-shell/sidebar-footer-actions.tsx +0 -3
  491. package/corpus/toolkit/src/chat-history.css +1 -0
  492. package/corpus/toolkit/src/composer/ComposerPlusMenu.tsx +35 -14
  493. package/corpus/toolkit/src/composer/PromptComposer.tsx +6 -0
  494. package/corpus/toolkit/src/composer/TiptapComposer.tsx +11 -3
  495. package/corpus/toolkit/src/design-tweaks/visual-style-controls.tsx +64 -11
  496. package/dist/action.d.ts +44 -0
  497. package/dist/action.d.ts.map +1 -1
  498. package/dist/action.js +9 -0
  499. package/dist/action.js.map +1 -1
  500. package/dist/agent/engine/builder-engine.js +6 -4
  501. package/dist/agent/engine/builder-engine.js.map +1 -1
  502. package/dist/agent/production-agent.d.ts +11 -1
  503. package/dist/agent/production-agent.d.ts.map +1 -1
  504. package/dist/agent/production-agent.js +131 -90
  505. package/dist/agent/production-agent.js.map +1 -1
  506. package/dist/agent/tool-search.d.ts +4 -0
  507. package/dist/agent/tool-search.d.ts.map +1 -1
  508. package/dist/agent/tool-search.js +30 -0
  509. package/dist/agent/tool-search.js.map +1 -1
  510. package/dist/automations/service.d.ts +85 -0
  511. package/dist/automations/service.d.ts.map +1 -0
  512. package/dist/automations/service.js +332 -0
  513. package/dist/automations/service.js.map +1 -0
  514. package/dist/browser-context/index.d.ts +579 -0
  515. package/dist/browser-context/index.d.ts.map +1 -0
  516. package/dist/browser-context/index.js +331 -0
  517. package/dist/browser-context/index.js.map +1 -0
  518. package/dist/client/AgentPanel.d.ts.map +1 -1
  519. package/dist/client/AgentPanel.js +1 -1
  520. package/dist/client/AgentPanel.js.map +1 -1
  521. package/dist/client/FeedbackButton.d.ts +6 -2
  522. package/dist/client/FeedbackButton.d.ts.map +1 -1
  523. package/dist/client/FeedbackButton.js +20 -3
  524. package/dist/client/FeedbackButton.js.map +1 -1
  525. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  526. package/dist/client/MultiTabAssistantChat.js +19 -2
  527. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  528. package/dist/client/agent-chat.d.ts +15 -0
  529. package/dist/client/agent-chat.d.ts.map +1 -1
  530. package/dist/client/agent-chat.js +13 -3
  531. package/dist/client/agent-chat.js.map +1 -1
  532. package/dist/client/agent-page/AgentJobsTab.d.ts +1 -0
  533. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  534. package/dist/client/agent-page/AgentJobsTab.js +186 -98
  535. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  536. package/dist/client/agent-page/AgentTabsPage.js +4 -4
  537. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  538. package/dist/client/agent-page/use-jobs.d.ts +7 -0
  539. package/dist/client/agent-page/use-jobs.d.ts.map +1 -1
  540. package/dist/client/agent-page/use-jobs.js.map +1 -1
  541. package/dist/client/analytics-session.d.ts.map +1 -1
  542. package/dist/client/analytics-session.js +13 -0
  543. package/dist/client/analytics-session.js.map +1 -1
  544. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  545. package/dist/client/extensions/ExtensionViewer.js +29 -6
  546. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  547. package/dist/client/settings/AutomationsSection.d.ts +0 -9
  548. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  549. package/dist/client/settings/AutomationsSection.js +9 -168
  550. package/dist/client/settings/AutomationsSection.js.map +1 -1
  551. package/dist/client/settings/SettingsPanel.d.ts +9 -1
  552. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  553. package/dist/client/settings/SettingsPanel.js +19 -11
  554. package/dist/client/settings/SettingsPanel.js.map +1 -1
  555. package/dist/client/settings/index.d.ts +1 -1
  556. package/dist/client/settings/index.d.ts.map +1 -1
  557. package/dist/client/settings/index.js +1 -1
  558. package/dist/client/settings/index.js.map +1 -1
  559. package/dist/client/use-agent-chat.d.ts.map +1 -1
  560. package/dist/client/use-agent-chat.js +20 -3
  561. package/dist/client/use-agent-chat.js.map +1 -1
  562. package/dist/client/use-chat-threads.d.ts.map +1 -1
  563. package/dist/client/use-chat-threads.js +4 -17
  564. package/dist/client/use-chat-threads.js.map +1 -1
  565. package/dist/collab/awareness.d.ts +2 -2
  566. package/dist/collab/awareness.d.ts.map +1 -1
  567. package/dist/deploy/build.d.ts.map +1 -1
  568. package/dist/deploy/build.js +2 -1
  569. package/dist/deploy/build.js.map +1 -1
  570. package/dist/deploy/workspace-deploy.d.ts.map +1 -1
  571. package/dist/deploy/workspace-deploy.js +2 -1
  572. package/dist/deploy/workspace-deploy.js.map +1 -1
  573. package/dist/extensions/actions.d.ts.map +1 -1
  574. package/dist/extensions/actions.js +82 -6
  575. package/dist/extensions/actions.js.map +1 -1
  576. package/dist/extensions/fetch-tool.d.ts.map +1 -1
  577. package/dist/extensions/fetch-tool.js +11 -0
  578. package/dist/extensions/fetch-tool.js.map +1 -1
  579. package/dist/extensions/routes.d.ts +5 -1
  580. package/dist/extensions/routes.d.ts.map +1 -1
  581. package/dist/extensions/routes.js +7 -1
  582. package/dist/extensions/routes.js.map +1 -1
  583. package/dist/extensions/web-content.d.ts +1 -0
  584. package/dist/extensions/web-content.d.ts.map +1 -1
  585. package/dist/extensions/web-content.js +82 -1
  586. package/dist/extensions/web-content.js.map +1 -1
  587. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  588. package/dist/integrations/computer-supervision.d.ts.map +1 -1
  589. package/dist/integrations/computer-supervision.js +22 -1
  590. package/dist/integrations/computer-supervision.js.map +1 -1
  591. package/dist/integrations/index.d.ts +3 -2
  592. package/dist/integrations/index.d.ts.map +1 -1
  593. package/dist/integrations/index.js +3 -2
  594. package/dist/integrations/index.js.map +1 -1
  595. package/dist/integrations/integration-durable-dispatch-config.d.ts +2 -0
  596. package/dist/integrations/integration-durable-dispatch-config.d.ts.map +1 -1
  597. package/dist/integrations/integration-durable-dispatch-config.js +4 -0
  598. package/dist/integrations/integration-durable-dispatch-config.js.map +1 -1
  599. package/dist/integrations/integration-durable-dispatch.d.ts +2 -2
  600. package/dist/integrations/integration-durable-dispatch.d.ts.map +1 -1
  601. package/dist/integrations/integration-durable-dispatch.js +2 -2
  602. package/dist/integrations/integration-durable-dispatch.js.map +1 -1
  603. package/dist/integrations/plugin.d.ts.map +1 -1
  604. package/dist/integrations/plugin.js +84 -39
  605. package/dist/integrations/plugin.js.map +1 -1
  606. package/dist/integrations/remote-browser-actions.d.ts +7 -0
  607. package/dist/integrations/remote-browser-actions.d.ts.map +1 -0
  608. package/dist/integrations/remote-browser-actions.js +482 -0
  609. package/dist/integrations/remote-browser-actions.js.map +1 -0
  610. package/dist/jobs/actions/list-recurring-jobs.d.ts.map +1 -1
  611. package/dist/jobs/actions/list-recurring-jobs.js +4 -6
  612. package/dist/jobs/actions/list-recurring-jobs.js.map +1 -1
  613. package/dist/jobs/actions/manage-recurring-job.js +3 -6
  614. package/dist/jobs/actions/manage-recurring-job.js.map +1 -1
  615. package/dist/jobs/background-automation-runner.d.ts +76 -0
  616. package/dist/jobs/background-automation-runner.d.ts.map +1 -0
  617. package/dist/jobs/background-automation-runner.js +288 -0
  618. package/dist/jobs/background-automation-runner.js.map +1 -0
  619. package/dist/jobs/frontmatter.d.ts +63 -0
  620. package/dist/jobs/frontmatter.d.ts.map +1 -0
  621. package/dist/jobs/frontmatter.js +216 -0
  622. package/dist/jobs/frontmatter.js.map +1 -0
  623. package/dist/jobs/scheduler.d.ts +6 -60
  624. package/dist/jobs/scheduler.d.ts.map +1 -1
  625. package/dist/jobs/scheduler.js +67 -484
  626. package/dist/jobs/scheduler.js.map +1 -1
  627. package/dist/jobs/tools.d.ts.map +1 -1
  628. package/dist/jobs/tools.js +24 -3
  629. package/dist/jobs/tools.js.map +1 -1
  630. package/dist/localization/default-messages.d.ts +28 -33
  631. package/dist/localization/default-messages.d.ts.map +1 -1
  632. package/dist/localization/default-messages.js +34 -39
  633. package/dist/localization/default-messages.js.map +1 -1
  634. package/dist/mcp-client/index.d.ts.map +1 -1
  635. package/dist/mcp-client/index.js +4 -0
  636. package/dist/mcp-client/index.js.map +1 -1
  637. package/dist/notifications/actions.d.ts.map +1 -1
  638. package/dist/notifications/actions.js +5 -0
  639. package/dist/notifications/actions.js.map +1 -1
  640. package/dist/notifications/routes.d.ts +6 -6
  641. package/dist/observability/routes.d.ts +3 -3
  642. package/dist/progress/actions.d.ts.map +1 -1
  643. package/dist/progress/actions.js +5 -0
  644. package/dist/progress/actions.js.map +1 -1
  645. package/dist/progress/routes.d.ts +1 -1
  646. package/dist/provider-api/actions/custom-provider-registration.d.ts +14 -14
  647. package/dist/provider-api/actions/github-repo-files.d.ts.map +1 -1
  648. package/dist/provider-api/actions/github-repo-files.js +9 -0
  649. package/dist/provider-api/actions/github-repo-files.js.map +1 -1
  650. package/dist/provider-api/actions/provider-api.d.ts +16 -16
  651. package/dist/provider-api/actions/provider-api.d.ts.map +1 -1
  652. package/dist/provider-api/actions/provider-api.js +14 -0
  653. package/dist/provider-api/actions/provider-api.js.map +1 -1
  654. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  655. package/dist/server/action-discovery.d.ts.map +1 -1
  656. package/dist/server/action-discovery.js +5 -0
  657. package/dist/server/action-discovery.js.map +1 -1
  658. package/dist/server/agent-chat/browser-team-tools.d.ts.map +1 -1
  659. package/dist/server/agent-chat/browser-team-tools.js +90 -3
  660. package/dist/server/agent-chat/browser-team-tools.js.map +1 -1
  661. package/dist/server/agent-chat/framework-prompts.d.ts.map +1 -1
  662. package/dist/server/agent-chat/framework-prompts.js +7 -11
  663. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  664. package/dist/server/agent-chat/plugin-options.d.ts +3 -3
  665. package/dist/server/agent-chat/plugin-options.js.map +1 -1
  666. package/dist/server/agent-chat/script-entries.d.ts.map +1 -1
  667. package/dist/server/agent-chat/script-entries.js +43 -1
  668. package/dist/server/agent-chat/script-entries.js.map +1 -1
  669. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  670. package/dist/server/agent-chat-plugin.js +24 -5
  671. package/dist/server/agent-chat-plugin.js.map +1 -1
  672. package/dist/server/attribution.d.ts +6 -0
  673. package/dist/server/attribution.d.ts.map +1 -1
  674. package/dist/server/attribution.js +14 -14
  675. package/dist/server/attribution.js.map +1 -1
  676. package/dist/server/auth.d.ts.map +1 -1
  677. package/dist/server/auth.js +5 -2
  678. package/dist/server/auth.js.map +1 -1
  679. package/dist/server/better-auth-instance.d.ts +2 -1
  680. package/dist/server/better-auth-instance.d.ts.map +1 -1
  681. package/dist/server/better-auth-instance.js +6 -3
  682. package/dist/server/better-auth-instance.js.map +1 -1
  683. package/dist/server/core-routes-plugin.d.ts +7 -0
  684. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  685. package/dist/server/core-routes-plugin.js +3 -1
  686. package/dist/server/core-routes-plugin.js.map +1 -1
  687. package/dist/server/csrf.d.ts.map +1 -1
  688. package/dist/server/csrf.js +25 -0
  689. package/dist/server/csrf.js.map +1 -1
  690. package/dist/server/google-oauth.d.ts +3 -0
  691. package/dist/server/google-oauth.d.ts.map +1 -1
  692. package/dist/server/google-oauth.js +12 -1
  693. package/dist/server/google-oauth.js.map +1 -1
  694. package/dist/server/onboarding-html.d.ts.map +1 -1
  695. package/dist/server/onboarding-html.js +18 -0
  696. package/dist/server/onboarding-html.js.map +1 -1
  697. package/dist/server/prompts/framework-core-compact.js +3 -3
  698. package/dist/server/prompts/framework-core-compact.js.map +1 -1
  699. package/dist/server/prompts/framework-core.js +3 -3
  700. package/dist/server/prompts/framework-core.js.map +1 -1
  701. package/dist/server/prompts/shared-rules.js +3 -3
  702. package/dist/server/prompts/shared-rules.js.map +1 -1
  703. package/dist/server/realtime-token.d.ts +1 -1
  704. package/dist/server/transcribe-voice.d.ts +1 -1
  705. package/dist/settings/index.d.ts +1 -1
  706. package/dist/settings/index.d.ts.map +1 -1
  707. package/dist/settings/index.js +1 -1
  708. package/dist/settings/index.js.map +1 -1
  709. package/dist/shared/analytics-anonymous-id.d.ts +12 -0
  710. package/dist/shared/analytics-anonymous-id.d.ts.map +1 -0
  711. package/dist/shared/analytics-anonymous-id.js +29 -0
  712. package/dist/shared/analytics-anonymous-id.js.map +1 -0
  713. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  714. package/dist/templates/chat/app/components/layout/Sidebar.tsx +1 -5
  715. package/dist/templates/chat/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  716. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  717. package/dist/templates/default/app/i18n/ar-SA.ts +26 -0
  718. package/dist/templates/default/app/i18n/de-DE.ts +28 -0
  719. package/dist/templates/default/app/i18n/en-US.ts +27 -0
  720. package/dist/templates/default/app/i18n/es-ES.ts +28 -0
  721. package/dist/templates/default/app/i18n/fr-FR.ts +28 -0
  722. package/dist/templates/default/app/i18n/hi-IN.ts +25 -0
  723. package/dist/templates/default/app/i18n/ja-JP.ts +27 -0
  724. package/dist/templates/default/app/i18n/ko-KR.ts +27 -0
  725. package/dist/templates/default/app/i18n/pt-BR.ts +27 -0
  726. package/dist/templates/default/app/i18n/zh-CN.ts +24 -0
  727. package/dist/templates/default/app/i18n/zh-TW.ts +24 -0
  728. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  729. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  730. package/dist/templates/workspace-core/.agents/skills/agent-page/SKILL.md +10 -7
  731. package/dist/templates/workspace-core/.agents/skills/automations/SKILL.md +53 -8
  732. package/dist/templates/workspace-core/.agents/skills/browser-sessions/SKILL.md +131 -0
  733. package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +13 -4
  734. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +23 -15
  735. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +33 -18
  736. package/dist/tracking/providers.d.ts.map +1 -1
  737. package/dist/tracking/providers.js +1 -0
  738. package/dist/tracking/providers.js.map +1 -1
  739. package/dist/tracking/registry.d.ts +1 -0
  740. package/dist/tracking/registry.d.ts.map +1 -1
  741. package/dist/tracking/registry.js +1 -0
  742. package/dist/tracking/registry.js.map +1 -1
  743. package/dist/tracking/types.d.ts +1 -0
  744. package/dist/tracking/types.d.ts.map +1 -1
  745. package/dist/tracking/types.js.map +1 -1
  746. package/dist/triggers/actions/list-automations.d.ts +7 -0
  747. package/dist/triggers/actions/list-automations.d.ts.map +1 -1
  748. package/dist/triggers/actions/list-automations.js +29 -41
  749. package/dist/triggers/actions/list-automations.js.map +1 -1
  750. package/dist/triggers/actions/manage-automation.js +15 -33
  751. package/dist/triggers/actions/manage-automation.js.map +1 -1
  752. package/dist/triggers/actions.d.ts.map +1 -1
  753. package/dist/triggers/actions.js +184 -95
  754. package/dist/triggers/actions.js.map +1 -1
  755. package/dist/triggers/dispatcher.d.ts +3 -9
  756. package/dist/triggers/dispatcher.d.ts.map +1 -1
  757. package/dist/triggers/dispatcher.js +134 -304
  758. package/dist/triggers/dispatcher.js.map +1 -1
  759. package/dist/triggers/routes.d.ts.map +1 -1
  760. package/dist/triggers/routes.js +76 -17
  761. package/dist/triggers/routes.js.map +1 -1
  762. package/dist/triggers/types.d.ts +4 -23
  763. package/dist/triggers/types.d.ts.map +1 -1
  764. package/dist/triggers/types.js.map +1 -1
  765. package/docs/content/agent-surfaces.mdx +4 -4
  766. package/docs/content/automations.mdx +61 -12
  767. package/docs/content/deployment.mdx +11 -4
  768. package/docs/content/extensions.mdx +39 -33
  769. package/docs/content/recurring-jobs.mdx +41 -19
  770. package/docs/content/template-dispatch-operations.mdx +19 -7
  771. package/package.json +4 -2
  772. package/src/action.ts +55 -0
  773. package/src/agent/engine/builder-engine.ts +8 -4
  774. package/src/agent/production-agent.ts +175 -100
  775. package/src/agent/tool-search.ts +36 -0
  776. package/src/automations/service.ts +506 -0
  777. package/src/browser-context/index.ts +392 -0
  778. package/src/client/AgentPanel.tsx +2 -1
  779. package/src/client/FeedbackButton.tsx +37 -4
  780. package/src/client/MultiTabAssistantChat.tsx +21 -0
  781. package/src/client/agent-chat.ts +31 -3
  782. package/src/client/agent-page/AgentJobsTab.tsx +438 -310
  783. package/src/client/agent-page/AgentTabsPage.tsx +4 -4
  784. package/src/client/agent-page/use-jobs.ts +7 -0
  785. package/src/client/analytics-session.ts +13 -0
  786. package/src/client/extensions/ExtensionViewer.tsx +67 -0
  787. package/src/client/settings/AutomationsSection.tsx +27 -499
  788. package/src/client/settings/SettingsPanel.tsx +32 -11
  789. package/src/client/settings/index.ts +2 -0
  790. package/src/client/use-agent-chat.ts +35 -3
  791. package/src/client/use-chat-threads.ts +8 -25
  792. package/src/deploy/build.ts +2 -0
  793. package/src/deploy/workspace-deploy.ts +2 -0
  794. package/src/extensions/actions.ts +115 -3
  795. package/src/extensions/fetch-tool.ts +11 -0
  796. package/src/extensions/routes.ts +16 -1
  797. package/src/extensions/web-content.ts +96 -1
  798. package/src/integrations/computer-supervision.ts +33 -1
  799. package/src/integrations/index.ts +6 -0
  800. package/src/integrations/integration-durable-dispatch-config.ts +10 -0
  801. package/src/integrations/integration-durable-dispatch.ts +4 -0
  802. package/src/integrations/plugin.ts +94 -41
  803. package/src/integrations/remote-browser-actions.ts +621 -0
  804. package/src/jobs/actions/list-recurring-jobs.ts +5 -7
  805. package/src/jobs/actions/manage-recurring-job.ts +3 -7
  806. package/src/jobs/background-automation-runner.ts +437 -0
  807. package/src/jobs/frontmatter.ts +308 -0
  808. package/src/jobs/scheduler.ts +89 -598
  809. package/src/jobs/tools.ts +22 -3
  810. package/src/localization/default-messages.ts +45 -45
  811. package/src/mcp-client/index.ts +6 -0
  812. package/src/notifications/actions.ts +5 -0
  813. package/src/progress/actions.ts +5 -0
  814. package/src/provider-api/actions/github-repo-files.ts +11 -0
  815. package/src/provider-api/actions/provider-api.ts +13 -0
  816. package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +4 -4
  817. package/src/server/action-discovery.ts +7 -0
  818. package/src/server/agent-chat/browser-team-tools.ts +126 -3
  819. package/src/server/agent-chat/framework-prompts.ts +7 -11
  820. package/src/server/agent-chat/plugin-options.ts +3 -3
  821. package/src/server/agent-chat/script-entries.ts +52 -1
  822. package/src/server/agent-chat-plugin.ts +25 -5
  823. package/src/server/attribution.ts +22 -0
  824. package/src/server/auth.ts +20 -6
  825. package/src/server/better-auth-instance.ts +10 -2
  826. package/src/server/core-routes-plugin.ts +10 -1
  827. package/src/server/csrf.ts +25 -0
  828. package/src/server/google-oauth.ts +21 -1
  829. package/src/server/onboarding-html.ts +18 -0
  830. package/src/server/prompts/framework-core-compact.ts +3 -3
  831. package/src/server/prompts/framework-core.ts +3 -3
  832. package/src/server/prompts/shared-rules.ts +3 -3
  833. package/src/settings/index.ts +1 -0
  834. package/src/shared/analytics-anonymous-id.ts +35 -0
  835. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  836. package/src/templates/chat/app/components/layout/Sidebar.tsx +1 -5
  837. package/src/templates/chat/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  838. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  839. package/src/templates/default/app/i18n/ar-SA.ts +26 -0
  840. package/src/templates/default/app/i18n/de-DE.ts +28 -0
  841. package/src/templates/default/app/i18n/en-US.ts +27 -0
  842. package/src/templates/default/app/i18n/es-ES.ts +28 -0
  843. package/src/templates/default/app/i18n/fr-FR.ts +28 -0
  844. package/src/templates/default/app/i18n/hi-IN.ts +25 -0
  845. package/src/templates/default/app/i18n/ja-JP.ts +27 -0
  846. package/src/templates/default/app/i18n/ko-KR.ts +27 -0
  847. package/src/templates/default/app/i18n/pt-BR.ts +27 -0
  848. package/src/templates/default/app/i18n/zh-CN.ts +24 -0
  849. package/src/templates/default/app/i18n/zh-TW.ts +24 -0
  850. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  851. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  852. package/src/templates/workspace-core/.agents/skills/agent-page/SKILL.md +10 -7
  853. package/src/templates/workspace-core/.agents/skills/automations/SKILL.md +53 -8
  854. package/src/templates/workspace-core/.agents/skills/browser-sessions/SKILL.md +131 -0
  855. package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +13 -4
  856. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +23 -15
  857. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +33 -18
  858. package/src/tracking/providers.ts +1 -0
  859. package/src/tracking/registry.ts +2 -1
  860. package/src/tracking/types.ts +1 -0
  861. package/src/triggers/actions/list-automations.ts +43 -44
  862. package/src/triggers/actions/manage-automation.ts +17 -48
  863. package/src/triggers/actions.ts +218 -127
  864. package/src/triggers/dispatcher.ts +181 -367
  865. package/src/triggers/routes.ts +84 -27
  866. package/src/triggers/types.ts +9 -23
@@ -30,7 +30,11 @@ import {
30
30
  } from "@/hooks/use-view-preferences";
31
31
  import { partitionAllDayEvents } from "@/lib/all-day-layout";
32
32
  import { getEventDisplayColor, allOtherDeclined } from "@/lib/event-colors";
33
- import { isOutOfOfficeEvent } from "@/lib/out-of-office";
33
+ import {
34
+ fullDayOutOfOfficeCoversDate,
35
+ isFullDayOutOfOfficeEvent,
36
+ isOutOfOfficeEvent,
37
+ } from "@/lib/out-of-office";
34
38
  import {
35
39
  shouldSuppressAfterPopoverClose,
36
40
  shouldSuppressCreatePointerDown,
@@ -596,13 +600,25 @@ export const DayView = memo(function DayView({
596
600
  [date],
597
601
  );
598
602
 
599
- const allDayEvents = useMemo(() => events.filter((e) => e.allDay), [events]);
603
+ const allDayEvents = useMemo(
604
+ () =>
605
+ events.filter(
606
+ (event) => event.allDay || fullDayOutOfOfficeCoversDate(event, date),
607
+ ),
608
+ [date, events],
609
+ );
600
610
  const { workingLocations, regularEvents: regularAllDayEvents } = useMemo(
601
611
  () => partitionAllDayEvents(allDayEvents),
602
612
  [allDayEvents],
603
613
  );
604
614
  const outOfOfficeEvents = useMemo(
605
- () => events.filter((event) => !event.allDay && isOutOfOfficeEvent(event)),
615
+ () =>
616
+ events.filter(
617
+ (event) =>
618
+ !event.allDay &&
619
+ isOutOfOfficeEvent(event) &&
620
+ !isFullDayOutOfOfficeEvent(event),
621
+ ),
606
622
  [events],
607
623
  );
608
624
  const timedEvents = useMemo(
@@ -17,6 +17,7 @@ import { memo, useState, useMemo } from "react";
17
17
 
18
18
  import { useIsMobile } from "@/hooks/use-mobile";
19
19
  import { useViewPreferences } from "@/hooks/use-view-preferences";
20
+ import { getFullDayOutOfOfficeDateRange } from "@/lib/out-of-office";
20
21
  import { shouldSuppressAfterPopoverClose } from "@/lib/popover-click-guard";
21
22
  import { cn } from "@/lib/utils";
22
23
 
@@ -115,6 +116,29 @@ export const MonthView = memo(function MonthView({
115
116
  const eventsByDay = useMemo(() => {
116
117
  const map = new Map<string, DayOccurrence[]>();
117
118
  for (const e of events) {
119
+ const fullDayOutOfOfficeRange = getFullDayOutOfOfficeDateRange(e);
120
+ if (fullDayOutOfOfficeRange) {
121
+ for (const day of days) {
122
+ const key = format(day, "yyyy-MM-dd");
123
+ if (
124
+ key < fullDayOutOfOfficeRange.startDate ||
125
+ key >= fullDayOutOfOfficeRange.endDateExclusive
126
+ ) {
127
+ continue;
128
+ }
129
+ const occurrence: DayOccurrence = {
130
+ event: e,
131
+ isStart: key === fullDayOutOfOfficeRange.startDate,
132
+ continuesNext:
133
+ format(addDays(day, 1), "yyyy-MM-dd") <
134
+ fullDayOutOfOfficeRange.endDateExclusive,
135
+ };
136
+ const list = map.get(key);
137
+ if (list) list.push(occurrence);
138
+ else map.set(key, [occurrence]);
139
+ }
140
+ continue;
141
+ }
118
142
  const evStart = parseISO(e.start);
119
143
  const evEnd = e.end ? parseISO(e.end) : addDays(evStart, 1);
120
144
  for (const day of days) {
@@ -46,6 +46,7 @@ import { getEventDisplayColor, allOtherDeclined } from "@/lib/event-colors";
46
46
  import {
47
47
  getFirstVisibleOutOfOfficeDayIndex,
48
48
  getOutOfOfficeSegment,
49
+ isFullDayOutOfOfficeEvent,
49
50
  isOutOfOfficeEvent,
50
51
  } from "@/lib/out-of-office";
51
52
  import {
@@ -684,10 +685,22 @@ export const WeekView = memo(function WeekView({
684
685
  );
685
686
 
686
687
  // Separate all-day and timed events
687
- const allDayEvents = useMemo(() => events.filter((e) => e.allDay), [events]);
688
+ const allDayEvents = useMemo(
689
+ () =>
690
+ events.filter(
691
+ (event) => event.allDay || isFullDayOutOfOfficeEvent(event),
692
+ ),
693
+ [events],
694
+ );
688
695
 
689
696
  const outOfOfficeEvents = useMemo(
690
- () => events.filter((event) => !event.allDay && isOutOfOfficeEvent(event)),
697
+ () =>
698
+ events.filter(
699
+ (event) =>
700
+ !event.allDay &&
701
+ isOutOfOfficeEvent(event) &&
702
+ !isFullDayOutOfOfficeEvent(event),
703
+ ),
691
704
  [events],
692
705
  );
693
706
 
@@ -1,6 +1,6 @@
1
1
  import { appPath } from "@agent-native/core/client/api-path";
2
2
  import { DevDatabaseLink } from "@agent-native/core/client/db-admin";
3
- import { LanguagePicker, useT } from "@agent-native/core/client/i18n";
3
+ import { useT } from "@agent-native/core/client/i18n";
4
4
  import { openCommandMenu } from "@agent-native/core/client/navigation";
5
5
  import { OrgSwitcher } from "@agent-native/core/client/org";
6
6
  import { FeedbackButton } from "@agent-native/core/client/ui";
@@ -742,9 +742,6 @@ export function Sidebar({
742
742
  <TooltipContent side="top">{t("root.commandSearch")}</TooltipContent>
743
743
  </Tooltip>
744
744
  );
745
- const translateButton = (
746
- <LanguagePicker variant="ghost-icon" label={t("settings.languageLabel")} />
747
- );
748
745
  const feedbackButton = (
749
746
  <FeedbackButton
750
747
  variant={collapsed ? "icon" : "sidebar"}
@@ -1182,7 +1179,6 @@ export function Sidebar({
1182
1179
  <SidebarFooterActions
1183
1180
  collapsed={collapsed}
1184
1181
  feedback={feedbackButton}
1185
- translate={translateButton}
1186
1182
  search={searchButton}
1187
1183
  collapse={collapseButton}
1188
1184
  />
@@ -11,6 +11,7 @@ import {
11
11
  } from "@tanstack/react-query";
12
12
  import { nanoid } from "nanoid";
13
13
 
14
+ import { dateTimeInTimezoneToIso } from "@/lib/event-form-utils";
14
15
  import {
15
16
  buildWorkingLocationProperties,
16
17
  getWorkingLocationEditableLabel,
@@ -26,9 +27,16 @@ import {
26
27
 
27
28
  type CreateEventInput = Omit<
28
29
  CalendarEvent,
29
- "id" | "createdAt" | "updatedAt" | "source"
30
+ "id" | "createdAt" | "updatedAt" | "source" | "title"
30
31
  > & {
32
+ title?: string;
31
33
  _tempId?: string;
34
+ fullDay?: boolean;
35
+ autoDeclineMode?:
36
+ | "declineNone"
37
+ | "declineAllConflictingInvitations"
38
+ | "declineOnlyNewConflictingInvitations";
39
+ declineMessage?: string;
32
40
  addGoogleMeet?: boolean;
33
41
  addZoom?: boolean;
34
42
  workingLocationType?: "homeOffice" | "officeLocation" | "customLocation";
@@ -100,14 +108,33 @@ function buildOptimisticCalendarEvent(
100
108
  optimisticId: string,
101
109
  ): CalendarEvent {
102
110
  const now = new Date().toISOString();
111
+ const timezone = newData.startTimeZone ?? newData.endTimeZone;
112
+ const dateOnlyPattern = /^\d{4}-\d{2}-\d{2}$/;
113
+ const nextDate = (date: string) => {
114
+ const [year, month, day] = date.split("-").map(Number);
115
+ const next = new Date(Date.UTC(year, month - 1, day + 1));
116
+ return next.toISOString().slice(0, 10);
117
+ };
118
+ const fullDayOutOfOffice =
119
+ newData.eventType === "outOfOffice" && newData.fullDay && timezone;
120
+ const start =
121
+ fullDayOutOfOffice && dateOnlyPattern.test(newData.start)
122
+ ? dateTimeInTimezoneToIso(newData.start, "00:00", timezone!)
123
+ : newData.start;
124
+ const end =
125
+ fullDayOutOfOffice && dateOnlyPattern.test(newData.end)
126
+ ? dateTimeInTimezoneToIso(nextDate(newData.end), "00:00", timezone!)
127
+ : newData.end;
103
128
  return {
104
129
  id: optimisticId,
105
- title: newData.title,
106
- start: newData.start,
107
- end: newData.end,
130
+ title:
131
+ newData.title?.trim() ||
132
+ (newData.eventType === "outOfOffice" ? "Out of office" : ""),
133
+ start,
134
+ end,
108
135
  startTimeZone: newData.startTimeZone,
109
136
  endTimeZone: newData.endTimeZone,
110
- allDay: newData.allDay ?? false,
137
+ allDay: fullDayOutOfOffice ? false : (newData.allDay ?? false),
111
138
  description: newData.description || "",
112
139
  location: newData.location || "",
113
140
  eventType: newData.eventType,
@@ -116,6 +143,18 @@ function buildOptimisticCalendarEvent(
116
143
  attachments: newData.attachments,
117
144
  transparency: newData.transparency,
118
145
  visibility: newData.visibility,
146
+ outOfOfficeProperties:
147
+ newData.eventType === "outOfOffice"
148
+ ? {
149
+ autoDeclineMode:
150
+ newData.autoDeclineMode ?? "declineAllConflictingInvitations",
151
+ declineMessage:
152
+ newData.autoDeclineMode === "declineNone"
153
+ ? undefined
154
+ : (newData.declineMessage ??
155
+ "Declined because I am out of office"),
156
+ }
157
+ : undefined,
119
158
  reminders: newData.reminders,
120
159
  remindersUseDefault: newData.remindersUseDefault,
121
160
  attendees: newData.attendees,
@@ -764,6 +764,11 @@ const enUS = {
764
764
  event: "Event",
765
765
  eventAlerts: "Event alerts",
766
766
  eventOptions: "Event options",
767
+ autoDecline: "Automatically decline",
768
+ declineAllConflicts: "All conflicting meetings",
769
+ declineNewConflicts: "New conflicting meetings",
770
+ declineNone: "Do not decline",
771
+ declineMessage: "Decline message",
767
772
  eventTitlePlaceholder: "Event title",
768
773
  events: "Events",
769
774
  everyWeekday: "Every weekday",
@@ -1191,6 +1196,11 @@ const calendarSurfaceTranslations = {
1191
1196
  event: "活动",
1192
1197
  eventAlerts: "事件提醒",
1193
1198
  eventOptions: "活动选项",
1199
+ autoDecline: "自动拒绝",
1200
+ declineAllConflicts: "所有冲突的会议",
1201
+ declineNewConflicts: "新的冲突会议",
1202
+ declineNone: "不拒绝",
1203
+ declineMessage: "拒绝消息",
1194
1204
  eventTitlePlaceholder: "活动标题",
1195
1205
  everyWeekday: "每个工作日",
1196
1206
  findTime: "找个时间",
@@ -1491,6 +1501,11 @@ const calendarSurfaceTranslations = {
1491
1501
  event: "Evento",
1492
1502
  eventAlerts: "Alertas de eventos",
1493
1503
  eventOptions: "Opciones de eventos",
1504
+ autoDecline: "Rechazar automáticamente",
1505
+ declineAllConflicts: "Todas las reuniones en conflicto",
1506
+ declineNewConflicts: "Nuevas reuniones en conflicto",
1507
+ declineNone: "No rechazar",
1508
+ declineMessage: "Mensaje de rechazo",
1494
1509
  eventTitlePlaceholder: "Título del evento",
1495
1510
  everyWeekday: "todos los dias de la semana",
1496
1511
  findTime: "Encuentra un momento",
@@ -1801,6 +1816,11 @@ const calendarSurfaceTranslations = {
1801
1816
  event: "Événement",
1802
1817
  eventAlerts: "Alertes d'événements",
1803
1818
  eventOptions: "Options d'événement",
1819
+ autoDecline: "Refuser automatiquement",
1820
+ declineAllConflicts: "Toutes les réunions en conflit",
1821
+ declineNewConflicts: "Nouvelles réunions en conflit",
1822
+ declineNone: "Ne pas refuser",
1823
+ declineMessage: "Message de refus",
1804
1824
  eventTitlePlaceholder: "Titre de l'événement",
1805
1825
  everyWeekday: "Chaque jour de la semaine",
1806
1826
  findTime: "Trouver une heure",
@@ -2111,6 +2131,11 @@ const calendarSurfaceTranslations = {
2111
2131
  event: "Veranstaltung",
2112
2132
  eventAlerts: "Ereigniswarnungen",
2113
2133
  eventOptions: "Event-Optionen",
2134
+ autoDecline: "Automatisch ablehnen",
2135
+ declineAllConflicts: "Alle kollidierenden Besprechungen",
2136
+ declineNewConflicts: "Neue kollidierende Besprechungen",
2137
+ declineNone: "Nicht ablehnen",
2138
+ declineMessage: "Ablehnungsnachricht",
2114
2139
  eventTitlePlaceholder: "Veranstaltungstitel",
2115
2140
  everyWeekday: "Jeden Wochentag",
2116
2141
  findTime: "Finden Sie eine Zeit",
@@ -2414,6 +2439,11 @@ const calendarSurfaceTranslations = {
2414
2439
  event: "イベント",
2415
2440
  eventAlerts: "イベントアラート",
2416
2441
  eventOptions: "イベントオプション",
2442
+ autoDecline: "自動的に辞退",
2443
+ declineAllConflicts: "競合するすべての会議",
2444
+ declineNewConflicts: "新しい競合する会議",
2445
+ declineNone: "辞退しない",
2446
+ declineMessage: "辞退メッセージ",
2417
2447
  eventTitlePlaceholder: "イベントタイトル",
2418
2448
  everyWeekday: "平日毎日",
2419
2449
  findTime: "時間を見つけてください",
@@ -2715,6 +2745,11 @@ const calendarSurfaceTranslations = {
2715
2745
  event: "이벤트",
2716
2746
  eventAlerts: "이벤트 알림",
2717
2747
  eventOptions: "이벤트 옵션",
2748
+ autoDecline: "자동으로 거절",
2749
+ declineAllConflicts: "충돌하는 모든 회의",
2750
+ declineNewConflicts: "새로 충돌하는 회의",
2751
+ declineNone: "거절하지 않음",
2752
+ declineMessage: "거절 메시지",
2718
2753
  eventTitlePlaceholder: "이벤트 제목",
2719
2754
  everyWeekday: "평일마다",
2720
2755
  findTime: "시간 찾기",
@@ -3019,6 +3054,11 @@ const calendarSurfaceTranslations = {
3019
3054
  event: "Evento",
3020
3055
  eventAlerts: "Alertas de eventos",
3021
3056
  eventOptions: "Opções de evento",
3057
+ autoDecline: "Recusar automaticamente",
3058
+ declineAllConflicts: "Todas as reuniões conflitantes",
3059
+ declineNewConflicts: "Novas reuniões conflitantes",
3060
+ declineNone: "Não recusar",
3061
+ declineMessage: "Mensagem de recusa",
3022
3062
  eventTitlePlaceholder: "Título do evento",
3023
3063
  everyWeekday: "Todos os dias da semana",
3024
3064
  findTime: "Encontre um horário",
@@ -3318,6 +3358,11 @@ const calendarSurfaceTranslations = {
3318
3358
  event: "घटना",
3319
3359
  eventAlerts: "घटना अलर्ट",
3320
3360
  eventOptions: "घटना विकल्प",
3361
+ autoDecline: "अपने आप अस्वीकार करें",
3362
+ declineAllConflicts: "सभी टकराने वाली मीटिंग",
3363
+ declineNewConflicts: "नई टकराने वाली मीटिंग",
3364
+ declineNone: "अस्वीकार न करें",
3365
+ declineMessage: "अस्वीकार संदेश",
3321
3366
  eventTitlePlaceholder: "घटना का शीर्षक",
3322
3367
  everyWeekday: "हर कार्यदिवस",
3323
3368
  findTime: "एक समय खोजें",
@@ -3616,6 +3661,11 @@ const calendarSurfaceTranslations = {
3616
3661
  event: "حدث",
3617
3662
  eventAlerts: "تنبيهات الحدث",
3618
3663
  eventOptions: "خيارات الحدث",
3664
+ autoDecline: "رفض تلقائي",
3665
+ declineAllConflicts: "كل الاجتماعات المتعارضة",
3666
+ declineNewConflicts: "الاجتماعات المتعارضة الجديدة",
3667
+ declineNone: "عدم الرفض",
3668
+ declineMessage: "رسالة الرفض",
3619
3669
  eventTitlePlaceholder: "عنوان الحدث",
3620
3670
  everyWeekday: "كل يوم من أيام الأسبوع",
3621
3671
  findTime: "جد وقتًا",
@@ -1,6 +1,7 @@
1
1
  import type { CalendarEvent } from "@shared/api";
2
- import { addDays, parseISO, startOfDay } from "date-fns";
2
+ import { addDays, format, parseISO, startOfDay } from "date-fns";
3
3
 
4
+ import { getFullDayOutOfOfficeDateRange } from "@/lib/out-of-office";
4
5
  import { isWorkingLocationEvent } from "@/lib/working-location";
5
6
 
6
7
  export interface AllDaySpan {
@@ -39,6 +40,7 @@ export function getAllDaySpan(
39
40
  ): Omit<AllDaySpan, "event"> | null {
40
41
  const eventStart = parseISO(event.start);
41
42
  const eventEnd = event.end ? parseISO(event.end) : addDays(eventStart, 1);
43
+ const outOfOfficeRange = getFullDayOutOfOfficeDateRange(event);
42
44
 
43
45
  let startCol = -1;
44
46
  let endCol = -1;
@@ -46,7 +48,12 @@ export function getAllDaySpan(
46
48
  for (let index = 0; index < days.length; index++) {
47
49
  const dayStart = startOfDay(days[index]);
48
50
  const dayEnd = addDays(dayStart, 1);
49
- if (eventStart < dayEnd && eventEnd > dayStart) {
51
+ const dayDate = format(days[index], "yyyy-MM-dd");
52
+ const overlaps = outOfOfficeRange
53
+ ? dayDate >= outOfOfficeRange.startDate &&
54
+ dayDate < outOfOfficeRange.endDateExclusive
55
+ : eventStart < dayEnd && eventEnd > dayStart;
56
+ if (overlaps) {
50
57
  if (startCol === -1) startCol = index;
51
58
  endCol = index;
52
59
  }
@@ -1,21 +1,17 @@
1
1
  interface EventFormInitializationInput {
2
2
  draftId?: string;
3
- draftTimezone: string;
4
3
  date: string;
5
- startTime: string;
6
- endTime: string;
7
- defaultTimezone: string;
4
+ startTime?: string;
5
+ endTime?: string;
8
6
  }
9
7
 
10
8
  export function buildEventFormInitializationKey({
11
9
  draftId,
12
- draftTimezone,
13
10
  date,
14
11
  startTime,
15
12
  endTime,
16
- defaultTimezone,
17
13
  }: EventFormInitializationInput): string {
18
14
  return draftId
19
- ? `draft:${draftId}:${draftTimezone}`
20
- : `new:${date}:${startTime}:${endTime}:${defaultTimezone}`;
15
+ ? `draft:${draftId}`
16
+ : `new:${date}:${startTime ?? ""}:${endTime ?? ""}`;
21
17
  }
@@ -247,14 +247,36 @@ export function dateTimeInTimezoneToIso(
247
247
  ) {
248
248
  const [year, month, day] = date.split("-").map(Number);
249
249
  const [hour, minute] = time.split(":").map(Number);
250
- const wallTimeAsUtc = new Date(
251
- Date.UTC(year, month - 1, day, hour, minute, 0),
252
- );
253
- let offset = getTimezoneOffsetMs(wallTimeAsUtc, timezone);
254
- let result = new Date(wallTimeAsUtc.getTime() - offset);
255
- offset = getTimezoneOffsetMs(result, timezone);
256
- result = new Date(wallTimeAsUtc.getTime() - offset);
257
- return result.toISOString();
250
+ const wallClockUtc = Date.UTC(year, month - 1, day, hour, minute, 0);
251
+ const offsets = new Set<number>();
252
+ for (let hours = -36; hours <= 36; hours += 6) {
253
+ offsets.add(
254
+ getTimezoneOffsetMs(
255
+ new Date(wallClockUtc + hours * 60 * 60 * 1000),
256
+ timezone,
257
+ ),
258
+ );
259
+ }
260
+
261
+ const candidates = [...offsets]
262
+ .map((offset) => new Date(wallClockUtc - offset))
263
+ .map((candidate) => ({
264
+ candidate,
265
+ localWallClock:
266
+ candidate.getTime() + getTimezoneOffsetMs(candidate, timezone),
267
+ }))
268
+ .sort((a, b) => {
269
+ const aDelta = a.localWallClock - wallClockUtc;
270
+ const bDelta = b.localWallClock - wallClockUtc;
271
+ if (aDelta === 0 && bDelta === 0) {
272
+ return a.candidate.getTime() - b.candidate.getTime();
273
+ }
274
+ if (aDelta >= 0 && bDelta < 0) return -1;
275
+ if (aDelta < 0 && bDelta >= 0) return 1;
276
+ return Math.abs(aDelta) - Math.abs(bDelta);
277
+ });
278
+
279
+ return candidates[0].candidate.toISOString();
258
280
  }
259
281
 
260
282
  export function formatTimezoneLabel(timezone: string) {
@@ -0,0 +1,36 @@
1
+ import type { CalendarEvent } from "@shared/api";
2
+
3
+ const LOCATION_SUGGESTION_LIMIT = 8;
4
+
5
+ function isMeetingLink(location: string) {
6
+ return /^(?:https?:\/\/)?(?:meet\.google\.com|zoom\.us|teams\.microsoft\.com)\b/i.test(
7
+ location,
8
+ );
9
+ }
10
+
11
+ /**
12
+ * Surface only locations from the user's connected Google calendars. Overlay
13
+ * and subscribed-calendar locations can belong to someone else.
14
+ */
15
+ export function getLocationSuggestions(events: CalendarEvent[]): string[] {
16
+ const seen = new Set<string>();
17
+
18
+ return [...events]
19
+ .sort((a, b) => new Date(b.start).getTime() - new Date(a.start).getTime())
20
+ .flatMap((event) => {
21
+ const location = event.location.trim();
22
+ const key = location.toLocaleLowerCase();
23
+ if (
24
+ event.source !== "google" ||
25
+ event.overlayEmail ||
26
+ !location ||
27
+ isMeetingLink(location) ||
28
+ seen.has(key)
29
+ ) {
30
+ return [];
31
+ }
32
+ seen.add(key);
33
+ return [location];
34
+ })
35
+ .slice(0, LOCATION_SUGGESTION_LIMIT);
36
+ }
@@ -1,5 +1,13 @@
1
1
  import type { CalendarEvent } from "@shared/api";
2
- import { addDays, differenceInMinutes, parseISO, startOfDay } from "date-fns";
2
+ import {
3
+ addDays,
4
+ differenceInMinutes,
5
+ format,
6
+ parseISO,
7
+ startOfDay,
8
+ } from "date-fns";
9
+
10
+ import { dateTimeInTimezoneToIso } from "@/lib/event-form-utils";
3
11
 
4
12
  export interface OutOfOfficeSegment {
5
13
  topMinutes: number;
@@ -14,6 +22,84 @@ export function isOutOfOfficeEvent(
14
22
  return event.eventType === "outOfOffice";
15
23
  }
16
24
 
25
+ function localDateTimeParts(value: string, timeZone: string) {
26
+ const date = parseISO(value);
27
+ if (Number.isNaN(date.getTime())) return null;
28
+
29
+ try {
30
+ const parts = new Intl.DateTimeFormat("en-US", {
31
+ timeZone,
32
+ year: "numeric",
33
+ month: "2-digit",
34
+ day: "2-digit",
35
+ hour: "2-digit",
36
+ minute: "2-digit",
37
+ hourCycle: "h23",
38
+ }).formatToParts(date);
39
+ const valueFor = (type: Intl.DateTimeFormatPartTypes) =>
40
+ parts.find((part) => part.type === type)?.value;
41
+ const year = valueFor("year");
42
+ const month = valueFor("month");
43
+ const day = valueFor("day");
44
+ const hour = valueFor("hour");
45
+ const minute = valueFor("minute");
46
+ if (!year || !month || !day || !hour || !minute) return null;
47
+ return { date: `${year}-${month}-${day}`, hour, minute };
48
+ } catch {
49
+ return null;
50
+ }
51
+ }
52
+
53
+ export function isFullDayOutOfOfficeEvent(
54
+ event: Pick<
55
+ CalendarEvent,
56
+ "eventType" | "allDay" | "start" | "end" | "startTimeZone" | "endTimeZone"
57
+ >,
58
+ ): boolean {
59
+ return getFullDayOutOfOfficeDateRange(event) !== null;
60
+ }
61
+
62
+ export function getFullDayOutOfOfficeDateRange(
63
+ event: Pick<
64
+ CalendarEvent,
65
+ "eventType" | "allDay" | "start" | "end" | "startTimeZone" | "endTimeZone"
66
+ >,
67
+ ): { startDate: string; endDateExclusive: string } | null {
68
+ if (!isOutOfOfficeEvent(event) || event.allDay) return null;
69
+ const timeZone = event.startTimeZone ?? event.endTimeZone;
70
+ if (!timeZone) return null;
71
+ const start = localDateTimeParts(event.start, timeZone);
72
+ const end = localDateTimeParts(event.end, timeZone);
73
+ const isFullDay =
74
+ start !== null &&
75
+ end !== null &&
76
+ new Date(event.start).getTime() ===
77
+ new Date(
78
+ dateTimeInTimezoneToIso(start.date, "00:00", timeZone),
79
+ ).getTime() &&
80
+ new Date(event.end).getTime() ===
81
+ new Date(
82
+ dateTimeInTimezoneToIso(end.date, "00:00", timeZone),
83
+ ).getTime() &&
84
+ end.date > start.date;
85
+ return isFullDay
86
+ ? { startDate: start.date, endDateExclusive: end.date }
87
+ : null;
88
+ }
89
+
90
+ export function fullDayOutOfOfficeCoversDate(
91
+ event: Pick<
92
+ CalendarEvent,
93
+ "eventType" | "allDay" | "start" | "end" | "startTimeZone" | "endTimeZone"
94
+ >,
95
+ date: Date,
96
+ ): boolean {
97
+ const range = getFullDayOutOfOfficeDateRange(event);
98
+ if (!range) return false;
99
+ const dateString = format(date, "yyyy-MM-dd");
100
+ return dateString >= range.startDate && dateString < range.endDateExclusive;
101
+ }
102
+
17
103
  /** Return the portion of a timed out-of-office event visible on one day. */
18
104
  export function getOutOfOfficeSegment(
19
105
  event: Pick<CalendarEvent, "start" | "end">,