@agent-native/core 0.122.4 → 0.123.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1595) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +554 -0
  3. package/corpus/core/docs/content/actions.mdx +33 -20
  4. package/corpus/core/docs/content/agent-mentions.mdx +30 -19
  5. package/corpus/core/docs/content/agent-native-toolkit.mdx +8 -6
  6. package/corpus/core/docs/content/agent-resources.mdx +11 -0
  7. package/corpus/core/docs/content/agent-surfaces.mdx +41 -30
  8. package/corpus/core/docs/content/audit-log.mdx +78 -0
  9. package/corpus/core/docs/content/authentication.mdx +7 -5
  10. package/corpus/core/docs/content/automations.mdx +15 -9
  11. package/corpus/core/docs/content/client.mdx +11 -11
  12. package/corpus/core/docs/content/cloneable-saas.mdx +7 -1
  13. package/corpus/core/docs/content/code-agents-ui.mdx +9 -1
  14. package/corpus/core/docs/content/components.mdx +7 -0
  15. package/corpus/core/docs/content/context-awareness.mdx +1 -0
  16. package/corpus/core/docs/content/creating-templates.mdx +9 -1
  17. package/corpus/core/docs/content/custom-design-system.mdx +8 -0
  18. package/corpus/core/docs/content/data-programs.mdx +6 -0
  19. package/corpus/core/docs/content/deployment.mdx +2 -0
  20. package/corpus/core/docs/content/doctor.mdx +5 -3
  21. package/corpus/core/docs/content/extensions.mdx +26 -0
  22. package/corpus/core/docs/content/external-agents-catalog.mdx +533 -0
  23. package/corpus/core/docs/content/external-agents.mdx +20 -514
  24. package/corpus/core/docs/content/faq.mdx +2 -2
  25. package/corpus/core/docs/content/file-uploads.mdx +44 -0
  26. package/corpus/core/docs/content/frames.mdx +2 -2
  27. package/corpus/core/docs/content/generative-ui.mdx +8 -0
  28. package/corpus/core/docs/content/getting-started.mdx +45 -17
  29. package/corpus/core/docs/content/human-approval.mdx +9 -0
  30. package/corpus/core/docs/content/integrations.mdx +4 -3
  31. package/corpus/core/docs/content/internationalization.mdx +4 -11
  32. package/corpus/core/docs/content/key-concepts.mdx +1 -1
  33. package/corpus/core/docs/content/local-file-mode.mdx +5 -0
  34. package/corpus/core/docs/content/mcp-apps.mdx +2 -1
  35. package/corpus/core/docs/content/mcp-clients.mdx +32 -1
  36. package/corpus/core/docs/content/mcp-protocol.mdx +4 -3
  37. package/corpus/core/docs/content/messaging-internals.mdx +328 -0
  38. package/corpus/core/docs/content/messaging-recipes.mdx +194 -0
  39. package/corpus/core/docs/content/messaging.mdx +9 -307
  40. package/corpus/core/docs/content/multi-app-workspace.mdx +1 -1
  41. package/corpus/core/docs/content/multi-tenancy.mdx +1 -0
  42. package/corpus/core/docs/content/native-chat-ui.mdx +8 -0
  43. package/corpus/core/docs/content/notifications.mdx +18 -20
  44. package/corpus/core/docs/content/observability.mdx +1 -0
  45. package/corpus/core/docs/content/onboarding.mdx +20 -6
  46. package/corpus/core/docs/content/organizations-teams-permissions.mdx +99 -124
  47. package/corpus/core/docs/content/package-lifecycle.mdx +19 -7
  48. package/corpus/core/docs/content/progress.mdx +11 -0
  49. package/corpus/core/docs/content/real-time-collaboration.mdx +44 -3
  50. package/corpus/core/docs/content/recurring-jobs.mdx +14 -1
  51. package/corpus/core/docs/content/security.mdx +5 -2
  52. package/corpus/core/docs/content/server.mdx +2 -1
  53. package/corpus/core/docs/content/sharing.mdx +22 -3
  54. package/corpus/core/docs/content/skills-guide.mdx +62 -19
  55. package/corpus/core/docs/content/syncing-template-changes.mdx +9 -0
  56. package/corpus/core/docs/content/template-analytics-connectors.mdx +75 -0
  57. package/corpus/core/docs/content/template-analytics-dashboards.mdx +106 -0
  58. package/corpus/core/docs/content/template-analytics-developers.mdx +287 -0
  59. package/corpus/core/docs/content/template-analytics-monitoring-and-sessions.mdx +109 -0
  60. package/corpus/core/docs/content/template-analytics.mdx +21 -263
  61. package/corpus/core/docs/content/template-assets-developers.mdx +456 -0
  62. package/corpus/core/docs/content/template-assets-generation.mdx +147 -0
  63. package/corpus/core/docs/content/template-assets-integrations.mdx +319 -0
  64. package/corpus/core/docs/content/template-assets-presets.mdx +185 -0
  65. package/corpus/core/docs/content/template-assets.mdx +12 -562
  66. package/corpus/core/docs/content/template-brain-agent.mdx +103 -0
  67. package/corpus/core/docs/content/template-brain-developers.mdx +379 -0
  68. package/corpus/core/docs/content/template-brain-knowledge.mdx +50 -0
  69. package/corpus/core/docs/content/template-brain-sources.mdx +163 -0
  70. package/corpus/core/docs/content/template-brain.mdx +30 -390
  71. package/corpus/core/docs/content/template-calendar-agent.mdx +133 -0
  72. package/corpus/core/docs/content/template-calendar-booking-links.mdx +73 -0
  73. package/corpus/core/docs/content/template-calendar-developers.mdx +366 -0
  74. package/corpus/core/docs/content/template-calendar-scheduling.mdx +128 -0
  75. package/corpus/core/docs/content/template-calendar.mdx +13 -260
  76. package/corpus/core/docs/content/template-chat-developers.mdx +88 -0
  77. package/corpus/core/docs/content/template-chat-first-edits.mdx +145 -0
  78. package/corpus/core/docs/content/template-chat.mdx +12 -77
  79. package/corpus/core/docs/content/template-clips-ai-and-editing.mdx +114 -0
  80. package/corpus/core/docs/content/template-clips-capture-everywhere.mdx +120 -0
  81. package/corpus/core/docs/content/template-clips-developers.mdx +373 -0
  82. package/corpus/core/docs/content/template-clips-sharing-and-teams.mdx +182 -0
  83. package/corpus/core/docs/content/template-clips.mdx +19 -508
  84. package/corpus/core/docs/content/template-content-databases.mdx +406 -0
  85. package/corpus/core/docs/content/template-content-developers.mdx +364 -0
  86. package/corpus/core/docs/content/template-content-editing.mdx +60 -0
  87. package/corpus/core/docs/content/template-content-sync.mdx +149 -0
  88. package/corpus/core/docs/content/template-content.mdx +21 -561
  89. package/corpus/core/docs/content/template-design-brand-and-figma.mdx +150 -0
  90. package/corpus/core/docs/content/template-design-collaboration-and-full-apps.mdx +125 -0
  91. package/corpus/core/docs/content/template-design-developers.mdx +358 -0
  92. package/corpus/core/docs/content/template-design-quality-and-components.mdx +95 -0
  93. package/corpus/core/docs/content/template-design.mdx +20 -344
  94. package/corpus/core/docs/content/template-dispatch-developers.mdx +121 -0
  95. package/corpus/core/docs/content/template-dispatch-messaging-routing.mdx +114 -0
  96. package/corpus/core/docs/content/template-dispatch-operations.mdx +160 -0
  97. package/corpus/core/docs/content/template-dispatch-vault-integrations.mdx +316 -0
  98. package/corpus/core/docs/content/template-dispatch.mdx +24 -283
  99. package/corpus/core/docs/content/template-forms-building-publishing.mdx +135 -0
  100. package/corpus/core/docs/content/template-forms-developers.mdx +195 -0
  101. package/corpus/core/docs/content/template-forms-responses.mdx +120 -0
  102. package/corpus/core/docs/content/template-forms.mdx +21 -230
  103. package/corpus/core/docs/content/template-mail-agent.mdx +114 -0
  104. package/corpus/core/docs/content/template-mail-developers.mdx +356 -0
  105. package/corpus/core/docs/content/template-mail-drafts-and-queue.mdx +103 -0
  106. package/corpus/core/docs/content/template-mail-inbox.mdx +118 -0
  107. package/corpus/core/docs/content/template-mail.mdx +23 -274
  108. package/corpus/core/docs/content/template-plan-automations.mdx +213 -0
  109. package/corpus/core/docs/content/template-plan-developers.mdx +703 -0
  110. package/corpus/core/docs/content/template-plan-local-and-desktop.mdx +236 -0
  111. package/corpus/core/docs/content/template-plan-review-workflow.mdx +180 -0
  112. package/corpus/core/docs/content/template-plan.mdx +60 -910
  113. package/corpus/core/docs/content/template-slides-agent.mdx +102 -0
  114. package/corpus/core/docs/content/template-slides-design-and-media.mdx +94 -0
  115. package/corpus/core/docs/content/template-slides-developers.mdx +488 -0
  116. package/corpus/core/docs/content/template-slides-editing.mdx +56 -0
  117. package/corpus/core/docs/content/template-slides.mdx +20 -362
  118. package/corpus/core/docs/content/toolkit-capability-packages.mdx +38 -13
  119. package/corpus/core/docs/content/toolkit-context-knowledge.mdx +49 -9
  120. package/corpus/core/docs/content/toolkit-editors-canvases.mdx +72 -10
  121. package/corpus/core/docs/content/toolkit-resources.mdx +16 -0
  122. package/corpus/core/docs/content/toolkit-settings.mdx +3 -3
  123. package/corpus/core/docs/content/toolkit-sharing.mdx +5 -7
  124. package/corpus/core/docs/content/using-your-agent.mdx +25 -2
  125. package/corpus/core/docs/content/voice-input.mdx +11 -7
  126. package/corpus/core/docs/content/what-is-agent-native.mdx +1 -0
  127. package/corpus/core/docs/content/workspace-connections.mdx +21 -11
  128. package/corpus/core/docs/content/workspace-management.mdx +1 -1
  129. package/corpus/core/package.json +1 -3
  130. package/corpus/core/src/a2a/client.ts +4 -2
  131. package/corpus/core/src/agent/action-warnings.ts +103 -0
  132. package/corpus/core/src/agent/durable-background.ts +42 -5
  133. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +58 -6
  134. package/corpus/core/src/agent/engine/anthropic-engine.ts +51 -8
  135. package/corpus/core/src/agent/engine/builder-engine.ts +56 -18
  136. package/corpus/core/src/agent/engine/continuation-dispatch-retry.ts +10 -9
  137. package/corpus/core/src/agent/engine/credential-errors.ts +11 -0
  138. package/corpus/core/src/agent/engine/error-detail.ts +39 -0
  139. package/corpus/core/src/agent/engine/prompt-cache.ts +44 -0
  140. package/corpus/core/src/agent/engine/registry.ts +22 -30
  141. package/corpus/core/src/agent/engine/tool-call-journal-seed.ts +2 -1
  142. package/corpus/core/src/agent/engine/translate-anthropic.ts +99 -0
  143. package/corpus/core/src/agent/loop-settings.ts +94 -7
  144. package/corpus/core/src/agent/production-agent.ts +667 -157
  145. package/corpus/core/src/agent/run-loop-with-resume.ts +27 -1
  146. package/corpus/core/src/agent/run-manager.ts +229 -39
  147. package/corpus/core/src/agent/run-store.ts +397 -64
  148. package/corpus/core/src/agent/thread-data-builder.ts +5 -1
  149. package/corpus/core/src/agent/types.ts +23 -6
  150. package/corpus/core/src/application-state/script-helpers.ts +5 -2
  151. package/corpus/core/src/cli/agents.ts +69 -1
  152. package/corpus/core/src/cli/app-skill.ts +1 -1
  153. package/corpus/core/src/cli/code-agent-executor.ts +7 -3
  154. package/corpus/core/src/cli/design-connect.ts +82 -8
  155. package/corpus/core/src/cli/skills-content/design-visual-edit-skill.ts +169 -24
  156. package/corpus/core/src/cli/templates-meta.ts +12 -0
  157. package/corpus/core/src/client/AssistantChat.tsx +623 -607
  158. package/corpus/core/src/client/agent-chat-adapter.ts +176 -29
  159. package/corpus/core/src/client/chat/message-components.tsx +13 -0
  160. package/corpus/core/src/client/embed-auth.ts +3 -1
  161. package/corpus/core/src/client/integrations/IntegrationCard.tsx +41 -24
  162. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +37 -21
  163. package/corpus/core/src/client/integrations/webhook-url.ts +29 -0
  164. package/corpus/core/src/client/org/OrgSwitcher.tsx +41 -27
  165. package/corpus/core/src/client/org/RequireActiveOrg.tsx +7 -0
  166. package/corpus/core/src/client/org/TeamPage.tsx +144 -14
  167. package/corpus/core/src/client/org/hooks.ts +27 -0
  168. package/corpus/core/src/client/org/index.ts +2 -0
  169. package/corpus/core/src/client/require-session.tsx +40 -29
  170. package/corpus/core/src/client/session-replay.ts +1 -1
  171. package/corpus/core/src/client/settings/DemoModeSection.tsx +0 -5
  172. package/corpus/core/src/client/settings/SecretsSection.tsx +47 -42
  173. package/corpus/core/src/client/settings/VoiceTranscriptionSection.tsx +0 -5
  174. package/corpus/core/src/client/sse-event-processor.ts +83 -8
  175. package/corpus/core/src/client/use-action.ts +22 -13
  176. package/corpus/core/src/client/use-agent-engine-configured.ts +36 -4
  177. package/corpus/core/src/client/use-db-sync.ts +21 -1
  178. package/corpus/core/src/credentials/index.ts +124 -2
  179. package/corpus/core/src/deploy/build.ts +93 -30
  180. package/corpus/core/src/deploy/workspace-deploy.ts +21 -16
  181. package/corpus/core/src/guards/no-localhost-fallback.ts +76 -14
  182. package/corpus/core/src/integrations/google-docs-poller.ts +19 -12
  183. package/corpus/core/src/integrations/webhook-handler.ts +56 -33
  184. package/corpus/core/src/jobs/scheduler.ts +57 -23
  185. package/corpus/core/src/localization/default-messages.ts +23 -1
  186. package/corpus/core/src/observability/evals.ts +7 -8
  187. package/corpus/core/src/observability/traces.ts +2 -0
  188. package/corpus/core/src/org/accept-pending.ts +2 -2
  189. package/corpus/core/src/org/active-org.ts +73 -0
  190. package/corpus/core/src/org/auto-join-domain.ts +7 -2
  191. package/corpus/core/src/org/context.ts +169 -66
  192. package/corpus/core/src/org/handlers.ts +148 -10
  193. package/corpus/core/src/org/plugin.ts +8 -1
  194. package/corpus/core/src/org/types.ts +6 -1
  195. package/corpus/core/src/provider-api/index.ts +6 -1
  196. package/corpus/core/src/resources/handlers.ts +2 -6
  197. package/corpus/core/src/resources/script-helpers.ts +2 -1
  198. package/corpus/core/src/scripts/chat/search-chats.ts +5 -2
  199. package/corpus/core/src/scripts/describe-workspace-apps.ts +59 -0
  200. package/corpus/core/src/scripts/resources/delete-memory.ts +5 -2
  201. package/corpus/core/src/scripts/resources/delete.ts +5 -2
  202. package/corpus/core/src/scripts/resources/effective.ts +5 -2
  203. package/corpus/core/src/scripts/resources/list.ts +5 -2
  204. package/corpus/core/src/scripts/resources/read.ts +5 -2
  205. package/corpus/core/src/scripts/resources/save-memory.ts +5 -2
  206. package/corpus/core/src/scripts/resources/write.ts +5 -2
  207. package/corpus/core/src/server/agent-capabilities.ts +147 -0
  208. package/corpus/core/src/server/agent-chat/framework-prompts.ts +11 -13
  209. package/corpus/core/src/server/agent-chat/prompt-resources.ts +183 -57
  210. package/corpus/core/src/server/agent-chat/script-entries.ts +20 -7
  211. package/corpus/core/src/server/agent-chat-plugin.ts +27 -0
  212. package/corpus/core/src/server/auth.ts +38 -32
  213. package/corpus/core/src/server/core-routes-plugin.ts +229 -179
  214. package/corpus/core/src/server/credential-provider.ts +196 -44
  215. package/corpus/core/src/server/embed-session.ts +10 -0
  216. package/corpus/core/src/server/framework-request-handler.ts +43 -0
  217. package/corpus/core/src/server/google-auth-plugin.ts +13 -450
  218. package/corpus/core/src/server/index.ts +4 -1
  219. package/corpus/core/src/server/onboarding-html.ts +20 -56
  220. package/corpus/core/src/server/open-route.ts +6 -1
  221. package/corpus/core/src/server/poll.ts +1 -1
  222. package/corpus/core/src/server/prompts/framework-core-compact.ts +5 -5
  223. package/corpus/core/src/server/prompts/framework-core.ts +7 -9
  224. package/corpus/core/src/server/prompts/shared-rules.ts +20 -9
  225. package/corpus/core/src/server/request-context.ts +58 -2
  226. package/corpus/core/src/server/scoped-key-storage.ts +1 -1
  227. package/corpus/core/src/settings/org-settings.ts +9 -0
  228. package/corpus/core/src/settings/store.ts +29 -0
  229. package/corpus/core/src/shared/index.ts +13 -0
  230. package/corpus/core/src/shared/sign-in-journey.ts +331 -0
  231. package/corpus/core/src/styles/agent-native.css +8 -0
  232. package/corpus/core/src/templates/chat/.agents/skills/actions/SKILL.md +19 -1
  233. package/corpus/core/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
  234. package/corpus/core/src/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
  235. package/corpus/core/src/templates/chat/.agents/skills/security/SKILL.md +2 -0
  236. package/corpus/core/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
  237. package/corpus/core/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
  238. package/corpus/core/src/templates/chat/AGENTS.md +8 -0
  239. package/corpus/core/src/templates/chat/app/entry.client.tsx +3 -0
  240. package/corpus/core/src/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  241. package/corpus/core/src/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  242. package/corpus/core/src/templates/chat/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  243. package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +19 -1
  244. package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +2 -0
  245. package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +20 -6
  246. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +2 -0
  247. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +4 -3
  248. package/corpus/core/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +7 -3
  249. package/corpus/core/src/templates/default/AGENTS.md +68 -195
  250. package/corpus/core/src/templates/default/app/entry.client.tsx +3 -0
  251. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +8 -0
  252. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +8 -0
  253. package/corpus/core/src/templates/default/app/i18n/en-US.ts +8 -0
  254. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +8 -0
  255. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +8 -0
  256. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +8 -0
  257. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +8 -0
  258. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +8 -0
  259. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +8 -0
  260. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +8 -0
  261. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +8 -0
  262. package/corpus/core/src/templates/headless/.agents/skills/actions/SKILL.md +19 -1
  263. package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +19 -1
  264. package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +2 -0
  265. package/corpus/core/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +100 -0
  266. package/corpus/core/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -1
  267. package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +28 -0
  268. package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +14 -1
  269. package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +20 -6
  270. package/corpus/core/src/templates/workspace-core/.agents/skills/qa/SKILL.md +6 -3
  271. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +2 -0
  272. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -3
  273. package/corpus/core/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +7 -3
  274. package/corpus/core/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +91 -0
  275. package/corpus/core/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +60 -0
  276. package/corpus/core/src/templates/workspace-core/AGENTS.md +62 -124
  277. package/corpus/core/src/templates/workspace-root/AGENTS.md +6 -1
  278. package/corpus/core/src/triggers/dispatcher.ts +28 -17
  279. package/corpus/core/src/vite/client.ts +20 -8
  280. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +19 -1
  281. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +41 -1
  282. package/corpus/templates/analytics/.agents/skills/dashboard-ops/SKILL.md +50 -22
  283. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +1 -1
  284. package/corpus/templates/analytics/.agents/skills/data-querying/references/inline-chart-embeds.md +8 -0
  285. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +20 -6
  286. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +2 -0
  287. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +4 -3
  288. package/corpus/templates/analytics/.agents/skills/shadcn-ui/SKILL.md +7 -3
  289. package/corpus/templates/analytics/.agents/skills/sharing/SKILL.md +228 -0
  290. package/corpus/templates/analytics/.builder/skills/charts/SKILL.md +2 -2
  291. package/corpus/templates/analytics/actions/delete-dashboard-view.ts +24 -0
  292. package/corpus/templates/analytics/actions/delete-user-pref.ts +22 -0
  293. package/corpus/templates/analytics/actions/generate-chart.ts +8 -245
  294. package/corpus/templates/analytics/actions/get-theme.ts +27 -0
  295. package/corpus/templates/analytics/actions/get-user-pref.ts +22 -0
  296. package/corpus/templates/analytics/actions/list-dashboard-views.ts +25 -0
  297. package/corpus/templates/analytics/actions/save-dashboard-view.ts +33 -0
  298. package/corpus/templates/analytics/actions/set-theme.ts +22 -0
  299. package/corpus/templates/analytics/actions/set-user-pref.ts +24 -0
  300. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +134 -27
  301. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -9
  302. package/corpus/templates/analytics/app/components/layout/Layout.tsx +0 -17
  303. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +10 -5
  304. package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +22 -52
  305. package/corpus/templates/analytics/app/hooks/use-user-pref.ts +21 -31
  306. package/corpus/templates/analytics/app/i18n-data.ts +10 -0
  307. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +2 -1
  308. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dual-axis.ts +73 -0
  309. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +8 -27
  310. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/report-panel-window.ts +0 -57
  311. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +8 -0
  312. package/corpus/templates/analytics/app/root.tsx +0 -28
  313. package/corpus/templates/analytics/changelog/2026-07-26-error-issues-now-group-by-message-as-well-as-stack-frame-and.md +6 -0
  314. package/corpus/templates/analytics/changelog/2026-07-26-line-area-and-bar-dashboard-panels-can-plot-series-on-a-seco.md +6 -0
  315. package/corpus/templates/analytics/changelog/2026-07-26-scheduled-dashboard-email-reports-now-arrive-complete-and-re.md +6 -0
  316. package/corpus/templates/analytics/changelog/2026-07-26-session-replays-now-detect-rage-clicks-so-the-rage-click-fil.md +6 -0
  317. package/corpus/templates/analytics/docs/error-capture.md +8 -4
  318. package/corpus/templates/analytics/package.json +1 -2
  319. package/corpus/templates/analytics/scripts/preview-dashboard-report.ts +221 -0
  320. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +39 -32
  321. package/corpus/templates/analytics/server/lib/dashboard-report-render.ts +1168 -0
  322. package/corpus/templates/analytics/server/lib/dashboard-report.ts +111 -1358
  323. package/corpus/templates/analytics/server/lib/error-capture.ts +32 -15
  324. package/corpus/templates/analytics/server/lib/report-chart-svg.ts +901 -0
  325. package/corpus/templates/analytics/server/lib/session-replay.ts +77 -1
  326. package/corpus/templates/analytics/shared/dashboard-report-timeouts.ts +3 -4
  327. package/corpus/templates/assets/.agents/skills/a2a-assets/SKILL.md +28 -0
  328. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +19 -1
  329. package/corpus/templates/assets/.agents/skills/assets-navigation/SKILL.md +46 -0
  330. package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +12 -0
  331. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +20 -6
  332. package/corpus/templates/assets/.agents/skills/image-generation/SKILL.md +28 -0
  333. package/corpus/templates/assets/.agents/skills/library-management/SKILL.md +9 -0
  334. package/corpus/templates/assets/.agents/skills/logo-composite/SKILL.md +11 -0
  335. package/corpus/templates/assets/.agents/skills/security/SKILL.md +2 -0
  336. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +4 -3
  337. package/corpus/templates/assets/.agents/skills/shadcn-ui/SKILL.md +7 -3
  338. package/corpus/templates/assets/.agents/skills/sharing/SKILL.md +228 -0
  339. package/corpus/templates/assets/AGENTS.md +58 -125
  340. package/corpus/templates/assets/actions/variant-slots.ts +8 -4
  341. package/corpus/templates/assets/app/entry.client.tsx +3 -0
  342. package/corpus/templates/assets/package.json +0 -2
  343. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +19 -1
  344. package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +2 -0
  345. package/corpus/templates/brain/.agents/skills/brain/SKILL.md +78 -4
  346. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +20 -6
  347. package/corpus/templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md +15 -3
  348. package/corpus/templates/brain/.agents/skills/security/SKILL.md +2 -0
  349. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +4 -3
  350. package/corpus/templates/brain/.agents/skills/shadcn-ui/SKILL.md +7 -3
  351. package/corpus/templates/brain/.agents/skills/sharing/SKILL.md +228 -0
  352. package/corpus/templates/brain/.agents/skills/storing-data/SKILL.md +178 -0
  353. package/corpus/templates/brain/AGENTS.md +73 -119
  354. package/corpus/templates/brain/app/entry.client.tsx +3 -0
  355. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +19 -1
  356. package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +56 -3
  357. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +20 -6
  358. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +2 -0
  359. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +4 -3
  360. package/corpus/templates/calendar/.agents/skills/shadcn-ui/SKILL.md +7 -3
  361. package/corpus/templates/calendar/.agents/skills/sharing/SKILL.md +228 -0
  362. package/corpus/templates/calendar/AGENTS.md +22 -45
  363. package/corpus/templates/calendar/app/entry.client.tsx +3 -0
  364. package/corpus/templates/calendar/server/handlers/events.ts +0 -364
  365. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +19 -1
  366. package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
  367. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
  368. package/corpus/templates/chat/.agents/skills/security/SKILL.md +2 -0
  369. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
  370. package/corpus/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
  371. package/corpus/templates/chat/.agents/skills/sharing/SKILL.md +228 -0
  372. package/corpus/templates/chat/.agents/skills/storing-data/SKILL.md +178 -0
  373. package/corpus/templates/chat/AGENTS.md +8 -0
  374. package/corpus/templates/chat/app/entry.client.tsx +3 -0
  375. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +19 -1
  376. package/corpus/templates/clips/.agents/skills/ai-video-tools/SKILL.md +42 -0
  377. package/corpus/templates/clips/.agents/skills/brain-export/SKILL.md +59 -0
  378. package/corpus/templates/clips/.agents/skills/bug-reports/SKILL.md +37 -0
  379. package/corpus/templates/clips/.agents/skills/crm-call-evidence/SKILL.md +41 -0
  380. package/corpus/templates/clips/.agents/skills/dictate/SKILL.md +4 -0
  381. package/corpus/templates/clips/.agents/skills/external-integrations/SKILL.md +45 -0
  382. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +20 -6
  383. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +9 -0
  384. package/corpus/templates/clips/.agents/skills/recording/SKILL.md +45 -0
  385. package/corpus/templates/clips/.agents/skills/screen-memory/SKILL.md +43 -0
  386. package/corpus/templates/clips/.agents/skills/security/SKILL.md +2 -0
  387. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +4 -3
  388. package/corpus/templates/clips/.agents/skills/shadcn-ui/SKILL.md +7 -3
  389. package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +38 -1
  390. package/corpus/templates/clips/AGENTS.md +82 -224
  391. package/corpus/templates/clips/actions/create-recording.ts +4 -0
  392. package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +6 -10
  393. package/corpus/templates/clips/app/routes/invite.$token.tsx +6 -5
  394. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +4 -5
  395. package/corpus/templates/clips/app/routes/share.$shareId.tsx +8 -8
  396. package/corpus/templates/clips/changelog/2026-07-26-long-agent-chat-turns-now-finish-instead-of-stopping-partway.md +6 -0
  397. package/corpus/templates/clips/changelog/2026-07-26-recordings-no-longer-get-stuck-on-uploading-uploads-now-hold.md +6 -0
  398. package/corpus/templates/clips/server/db/schema.ts +3 -0
  399. package/corpus/templates/clips/server/jobs/brain-export.ts +4 -0
  400. package/corpus/templates/clips/server/lib/recording-upload-state.ts +0 -52
  401. package/corpus/templates/clips/server/lib/upload-lease.ts +241 -0
  402. package/corpus/templates/clips/server/plugins/agent-chat.ts +4 -0
  403. package/corpus/templates/clips/server/plugins/db.ts +18 -347
  404. package/corpus/templates/clips/server/routes/api/clips/brain-export/run.post.ts +7 -1
  405. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +123 -126
  406. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/reset-chunks.post.ts +4 -0
  407. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/resume.get.ts +118 -0
  408. package/corpus/templates/clips/server/routes/api/uploads/reap.post.ts +69 -0
  409. package/corpus/templates/content/.agents/skills/actions/SKILL.md +19 -1
  410. package/corpus/templates/content/.agents/skills/content/SKILL.md +4 -0
  411. package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +8 -0
  412. package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +55 -0
  413. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +20 -6
  414. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +12 -1
  415. package/corpus/templates/content/.agents/skills/security/SKILL.md +2 -0
  416. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +4 -3
  417. package/corpus/templates/content/.agents/skills/shadcn-ui/SKILL.md +7 -3
  418. package/corpus/templates/content/.agents/skills/sharing/SKILL.md +228 -0
  419. package/corpus/templates/content/AGENTS.md +63 -131
  420. package/corpus/templates/content/app/routes/_app.tsx +4 -4
  421. package/corpus/templates/content/server/routes/api/notion/callback.get.ts +6 -24
  422. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +115 -0
  423. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +177 -0
  424. package/corpus/templates/crm/.agents/skills/crm/SKILL.md +205 -0
  425. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +220 -0
  426. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +169 -0
  427. package/corpus/templates/crm/.agents/skills/sharing/SKILL.md +228 -0
  428. package/corpus/templates/crm/.agents/skills/storing-data/SKILL.md +178 -0
  429. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +122 -0
  430. package/corpus/templates/crm/.env.example +5 -0
  431. package/corpus/templates/crm/AGENTS.md +82 -0
  432. package/corpus/templates/crm/CHANGELOG.md +25 -0
  433. package/corpus/templates/crm/DEVELOPING.md +66 -0
  434. package/corpus/templates/crm/README.md +122 -0
  435. package/corpus/templates/crm/_gitignore +12 -0
  436. package/corpus/templates/crm/actions/_crm-action-utils.ts +98 -0
  437. package/corpus/templates/crm/actions/_crm-attribute-utils.ts +219 -0
  438. package/corpus/templates/crm/actions/_crm-dashboard.ts +69 -0
  439. package/corpus/templates/crm/actions/_crm-data-program-actions.ts +15 -0
  440. package/corpus/templates/crm/actions/_crm-list-utils.ts +775 -0
  441. package/corpus/templates/crm/actions/_crm-signal-utils.ts +79 -0
  442. package/corpus/templates/crm/actions/add-crm-record-to-list.ts +164 -0
  443. package/corpus/templates/crm/actions/apply-crm-proposals.ts +291 -0
  444. package/corpus/templates/crm/actions/archive-crm-attribute.ts +69 -0
  445. package/corpus/templates/crm/actions/attach-call-evidence.ts +170 -0
  446. package/corpus/templates/crm/actions/configure-crm-connection.ts +126 -0
  447. package/corpus/templates/crm/actions/configure-native-crm.ts +44 -0
  448. package/corpus/templates/crm/actions/create-crm-attribute.ts +350 -0
  449. package/corpus/templates/crm/actions/create-crm-list.ts +194 -0
  450. package/corpus/templates/crm/actions/create-crm-record.ts +148 -0
  451. package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +58 -0
  452. package/corpus/templates/crm/actions/delete-crm-saved-view.ts +68 -0
  453. package/corpus/templates/crm/actions/delete-staged-dataset.ts +14 -0
  454. package/corpus/templates/crm/actions/estimate-crm-enrichment.ts +229 -0
  455. package/corpus/templates/crm/actions/find-crm-duplicates.ts +87 -0
  456. package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +36 -0
  457. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +35 -0
  458. package/corpus/templates/crm/actions/get-crm-dashboard.ts +14 -0
  459. package/corpus/templates/crm/actions/get-crm-overview.ts +13 -0
  460. package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +61 -0
  461. package/corpus/templates/crm/actions/get-crm-record-page.ts +287 -0
  462. package/corpus/templates/crm/actions/get-crm-record.ts +75 -0
  463. package/corpus/templates/crm/actions/get-crm-workspace.ts +364 -0
  464. package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +81 -0
  465. package/corpus/templates/crm/actions/list-crm-attributes.ts +71 -0
  466. package/corpus/templates/crm/actions/list-crm-connections.ts +68 -0
  467. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +15 -0
  468. package/corpus/templates/crm/actions/list-crm-dashboards.ts +15 -0
  469. package/corpus/templates/crm/actions/list-crm-enrichment-slots.ts +28 -0
  470. package/corpus/templates/crm/actions/list-crm-list-entries.ts +192 -0
  471. package/corpus/templates/crm/actions/list-crm-lists.ts +80 -0
  472. package/corpus/templates/crm/actions/list-crm-proposals.ts +55 -0
  473. package/corpus/templates/crm/actions/list-crm-record-field-history.ts +201 -0
  474. package/corpus/templates/crm/actions/list-crm-record-values.ts +200 -0
  475. package/corpus/templates/crm/actions/list-crm-records.ts +103 -0
  476. package/corpus/templates/crm/actions/list-crm-saved-views.ts +66 -0
  477. package/corpus/templates/crm/actions/list-crm-signal-hits.ts +43 -0
  478. package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +32 -0
  479. package/corpus/templates/crm/actions/list-crm-tasks.ts +22 -0
  480. package/corpus/templates/crm/actions/list-staged-datasets.ts +14 -0
  481. package/corpus/templates/crm/actions/list-workspace-connections.ts +47 -0
  482. package/corpus/templates/crm/actions/manage-crm-attribute-option.ts +272 -0
  483. package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +87 -0
  484. package/corpus/templates/crm/actions/manage-crm-task.ts +132 -0
  485. package/corpus/templates/crm/actions/merge-crm-records.ts +691 -0
  486. package/corpus/templates/crm/actions/navigate.ts +54 -0
  487. package/corpus/templates/crm/actions/provider-api-catalog.ts +22 -0
  488. package/corpus/templates/crm/actions/provider-api-docs.ts +54 -0
  489. package/corpus/templates/crm/actions/provider-api-request.ts +92 -0
  490. package/corpus/templates/crm/actions/query-staged-dataset.ts +44 -0
  491. package/corpus/templates/crm/actions/record-crm-call-insight.ts +160 -0
  492. package/corpus/templates/crm/actions/record-crm-smart-signal.ts +150 -0
  493. package/corpus/templates/crm/actions/remove-crm-list-entry.ts +79 -0
  494. package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +23 -0
  495. package/corpus/templates/crm/actions/review-crm-signal.ts +31 -0
  496. package/corpus/templates/crm/actions/run-crm-attribute-fill.ts +443 -0
  497. package/corpus/templates/crm/actions/run-crm-enrichment.ts +647 -0
  498. package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +103 -0
  499. package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +265 -0
  500. package/corpus/templates/crm/actions/run.ts +7 -0
  501. package/corpus/templates/crm/actions/save-crm-dashboard.ts +51 -0
  502. package/corpus/templates/crm/actions/save-crm-saved-view.ts +296 -0
  503. package/corpus/templates/crm/actions/sync-crm.ts +146 -0
  504. package/corpus/templates/crm/actions/update-crm-attribute.ts +111 -0
  505. package/corpus/templates/crm/actions/update-crm-list-entry.ts +102 -0
  506. package/corpus/templates/crm/actions/update-crm-list.ts +97 -0
  507. package/corpus/templates/crm/actions/update-crm-record.ts +543 -0
  508. package/corpus/templates/crm/actions/view-screen.ts +324 -0
  509. package/corpus/templates/crm/agent-native.app-skill.json +69 -0
  510. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +158 -0
  511. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +78 -0
  512. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +220 -0
  513. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +414 -0
  514. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +648 -0
  515. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +488 -0
  516. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +232 -0
  517. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +93 -0
  518. package/corpus/templates/crm/app/components/crm/Surface.tsx +97 -0
  519. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +180 -0
  520. package/corpus/templates/crm/app/components/crm/board/CrmBoard.tsx +988 -0
  521. package/corpus/templates/crm/app/components/crm/board/board-model.ts +399 -0
  522. package/corpus/templates/crm/app/components/crm/board/entry-filter.ts +150 -0
  523. package/corpus/templates/crm/app/components/crm/board/view-draft.ts +227 -0
  524. package/corpus/templates/crm/app/components/crm/grid/CrmGrid.tsx +1033 -0
  525. package/corpus/templates/crm/app/components/crm/grid/GridCell.tsx +620 -0
  526. package/corpus/templates/crm/app/components/crm/grid/clipboard.ts +84 -0
  527. package/corpus/templates/crm/app/components/crm/grid/model.ts +304 -0
  528. package/corpus/templates/crm/app/components/crm/grid/navigation.ts +220 -0
  529. package/corpus/templates/crm/app/components/crm/grid/query.ts +214 -0
  530. package/corpus/templates/crm/app/components/crm/record/AttributePanel.tsx +192 -0
  531. package/corpus/templates/crm/app/components/crm/record/FieldHistory.tsx +179 -0
  532. package/corpus/templates/crm/app/components/crm/record/RecordHeader.tsx +103 -0
  533. package/corpus/templates/crm/app/components/crm/record/RecordLists.tsx +235 -0
  534. package/corpus/templates/crm/app/components/crm/record/RecordTabs.tsx +206 -0
  535. package/corpus/templates/crm/app/components/crm/record/field-editors.tsx +245 -0
  536. package/corpus/templates/crm/app/components/crm/record/record-data.ts +603 -0
  537. package/corpus/templates/crm/app/components/crm/settings/AdvancedSettings.tsx +49 -0
  538. package/corpus/templates/crm/app/components/crm/settings/AttributeOptionsEditor.tsx +441 -0
  539. package/corpus/templates/crm/app/components/crm/settings/ConnectionSettings.tsx +169 -0
  540. package/corpus/templates/crm/app/components/crm/settings/FieldsSettings.tsx +935 -0
  541. package/corpus/templates/crm/app/components/crm/settings/ListsSettings.tsx +339 -0
  542. package/corpus/templates/crm/app/components/crm/settings/settings-admin.ts +377 -0
  543. package/corpus/templates/crm/app/components/crm/shared/AttributeValueParts.tsx +69 -0
  544. package/corpus/templates/crm/app/components/crm/shared/attribute-value.ts +591 -0
  545. package/corpus/templates/crm/app/components/layout/CrmCommandMenu.tsx +556 -0
  546. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +130 -0
  547. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +407 -0
  548. package/corpus/templates/crm/app/components/layout/command-palette-search.ts +126 -0
  549. package/corpus/templates/crm/app/components/layout/crm-ui-intents.ts +41 -0
  550. package/corpus/templates/crm/app/components/layout/sidebar-collapse.ts +40 -0
  551. package/corpus/templates/crm/app/components/layout/sidebar-lists.ts +109 -0
  552. package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +1 -0
  553. package/corpus/templates/crm/app/components/ui/badge.tsx +1 -0
  554. package/corpus/templates/crm/app/components/ui/button.tsx +1 -0
  555. package/corpus/templates/crm/app/components/ui/card.tsx +1 -0
  556. package/corpus/templates/crm/app/components/ui/checkbox.tsx +1 -0
  557. package/corpus/templates/crm/app/components/ui/dialog.tsx +1 -0
  558. package/corpus/templates/crm/app/components/ui/dropdown-menu.tsx +1 -0
  559. package/corpus/templates/crm/app/components/ui/hover-card.tsx +1 -0
  560. package/corpus/templates/crm/app/components/ui/input.tsx +1 -0
  561. package/corpus/templates/crm/app/components/ui/label.tsx +1 -0
  562. package/corpus/templates/crm/app/components/ui/popover.tsx +1 -0
  563. package/corpus/templates/crm/app/components/ui/select.tsx +1 -0
  564. package/corpus/templates/crm/app/components/ui/sheet.tsx +1 -0
  565. package/corpus/templates/crm/app/components/ui/skeleton.tsx +1 -0
  566. package/corpus/templates/crm/app/components/ui/switch.tsx +1 -0
  567. package/corpus/templates/crm/app/components/ui/table.tsx +1 -0
  568. package/corpus/templates/crm/app/components/ui/tabs.tsx +1 -0
  569. package/corpus/templates/crm/app/components/ui/textarea.tsx +1 -0
  570. package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +17 -0
  571. package/corpus/templates/crm/app/components/ui/tooltip.tsx +1 -0
  572. package/corpus/templates/crm/app/design-system.ts +3 -0
  573. package/corpus/templates/crm/app/entry.client.tsx +19 -0
  574. package/corpus/templates/crm/app/entry.server.tsx +10 -0
  575. package/corpus/templates/crm/app/global.css +167 -0
  576. package/corpus/templates/crm/app/hooks/use-keyboard-shortcuts.ts +206 -0
  577. package/corpus/templates/crm/app/hooks/use-navigation-state.ts +48 -0
  578. package/corpus/templates/crm/app/i18n/en-US.ts +684 -0
  579. package/corpus/templates/crm/app/i18n/index.ts +34 -0
  580. package/corpus/templates/crm/app/lib/dashboard.ts +13 -0
  581. package/corpus/templates/crm/app/lib/navigation.ts +17 -0
  582. package/corpus/templates/crm/app/lib/tab-id.ts +1 -0
  583. package/corpus/templates/crm/app/lib/types.ts +172 -0
  584. package/corpus/templates/crm/app/lib/utils.ts +1 -0
  585. package/corpus/templates/crm/app/root.tsx +93 -0
  586. package/corpus/templates/crm/app/routes/_index.tsx +26 -0
  587. package/corpus/templates/crm/app/routes/accounts.tsx +41 -0
  588. package/corpus/templates/crm/app/routes/agent.tsx +5 -0
  589. package/corpus/templates/crm/app/routes/ask.tsx +53 -0
  590. package/corpus/templates/crm/app/routes/dashboard.tsx +118 -0
  591. package/corpus/templates/crm/app/routes/lists.tsx +228 -0
  592. package/corpus/templates/crm/app/routes/opportunities.tsx +41 -0
  593. package/corpus/templates/crm/app/routes/people.tsx +41 -0
  594. package/corpus/templates/crm/app/routes/proposals.tsx +388 -0
  595. package/corpus/templates/crm/app/routes/records.$recordId.tsx +53 -0
  596. package/corpus/templates/crm/app/routes/records.tsx +64 -0
  597. package/corpus/templates/crm/app/routes/settings.tsx +118 -0
  598. package/corpus/templates/crm/app/routes/setup.tsx +308 -0
  599. package/corpus/templates/crm/app/routes/tasks.tsx +252 -0
  600. package/corpus/templates/crm/app/routes/views.tsx +683 -0
  601. package/corpus/templates/crm/app/routes.ts +19 -0
  602. package/corpus/templates/crm/app/vite-env.d.ts +6 -0
  603. package/corpus/templates/crm/changelog/2026-07-26-any-list-or-view-can-be-shown-as-a-board-grouped-by-stage-so.md +6 -0
  604. package/corpus/templates/crm/changelog/2026-07-26-crm-now-finds-likely-duplicate-records-and-tells-you-exactly.md +6 -0
  605. package/corpus/templates/crm/changelog/2026-07-26-enrichment-now-shows-what-a-run-will-cost-before-it-starts-g.md +6 -0
  606. package/corpus/templates/crm/changelog/2026-07-26-lists-turn-any-set-of-records-into-a-pipeline-with-its-own-s.md +6 -0
  607. package/corpus/templates/crm/changelog/2026-07-26-moving-a-record-or-list-entry-into-a-stage-that-was-retired-.md +6 -0
  608. package/corpus/templates/crm/changelog/2026-07-26-opening-a-record-now-shows-one-page-with-its-fields-the-list.md +6 -0
  609. package/corpus/templates/crm/changelog/2026-07-26-press-cmd-k-to-jump-to-any-record-list-view-or-setting-and-u.md +6 -0
  610. package/corpus/templates/crm/changelog/2026-07-26-provider-record-edits-now-show-an-exact-before-after-diff-an.md +6 -0
  611. package/corpus/templates/crm/changelog/2026-07-26-record-page-attribute-labels-now-read-in-full-instead-of-bei.md +6 -0
  612. package/corpus/templates/crm/changelog/2026-07-26-records-now-use-typed-fields-currency-dates-ratings-status-s.md +6 -0
  613. package/corpus/templates/crm/changelog/2026-07-26-retyping-a-value-on-the-record-page-now-replaces-it-instead-.md +6 -0
  614. package/corpus/templates/crm/changelog/2026-07-26-settings-now-has-fields-and-lists-tabs-for-adding-fields-edi.md +6 -0
  615. package/corpus/templates/crm/changelog/2026-07-26-the-proposal-review-now-shows-the-field-that-actually-change.md +6 -0
  616. package/corpus/templates/crm/changelog/2026-07-26-the-record-grid-is-now-a-real-spreadsheet-filter-sort-and-pa.md +6 -0
  617. package/corpus/templates/crm/components.json +20 -0
  618. package/corpus/templates/crm/docs/architecture/crm-contract.md +214 -0
  619. package/corpus/templates/crm/docs/features/README.md +55 -0
  620. package/corpus/templates/crm/docs/features/f1-records-and-fields.mdx +52 -0
  621. package/corpus/templates/crm/docs/features/f2-lists-pipelines-and-views.mdx +48 -0
  622. package/corpus/templates/crm/docs/features/f3-work-and-record-quality.mdx +40 -0
  623. package/corpus/templates/crm/docs/features/f4-evidence-and-chat.mdx +47 -0
  624. package/corpus/templates/crm/learnings.defaults.md +5 -0
  625. package/corpus/templates/crm/netlify.toml +11 -0
  626. package/corpus/templates/crm/package.json +61 -0
  627. package/corpus/templates/crm/public/favicon.svg +1 -0
  628. package/corpus/templates/crm/public/icon-180.svg +1 -0
  629. package/corpus/templates/crm/public/manifest.json +11 -0
  630. package/corpus/templates/crm/react-router.config.ts +7 -0
  631. package/corpus/templates/crm/server/crm/adapter.ts +32 -0
  632. package/corpus/templates/crm/server/crm/crm-field-firewall.ts +64 -0
  633. package/corpus/templates/crm/server/crm/crm-mirror.ts +721 -0
  634. package/corpus/templates/crm/server/crm/field-policy-attributes.ts +48 -0
  635. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +1146 -0
  636. package/corpus/templates/crm/server/crm/native-adapter.ts +1810 -0
  637. package/corpus/templates/crm/server/crm/provider-record-link.ts +264 -0
  638. package/corpus/templates/crm/server/crm/read-through.ts +207 -0
  639. package/corpus/templates/crm/server/crm/salesforce-adapter.ts +1255 -0
  640. package/corpus/templates/crm/server/db/crm-store.ts +1112 -0
  641. package/corpus/templates/crm/server/db/index.ts +191 -0
  642. package/corpus/templates/crm/server/db/schema.ts +647 -0
  643. package/corpus/templates/crm/server/lib/crm-query.ts +1558 -0
  644. package/corpus/templates/crm/server/lib/dedupe.ts +714 -0
  645. package/corpus/templates/crm/server/lib/enrichment-cost.ts +381 -0
  646. package/corpus/templates/crm/server/lib/enrichment-slots.ts +519 -0
  647. package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +65 -0
  648. package/corpus/templates/crm/server/lib/intelligence/evidence.ts +105 -0
  649. package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +94 -0
  650. package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +39 -0
  651. package/corpus/templates/crm/server/lib/intelligence/summary.ts +19 -0
  652. package/corpus/templates/crm/server/lib/lifecycle.ts +634 -0
  653. package/corpus/templates/crm/server/lib/provider-api.ts +64 -0
  654. package/corpus/templates/crm/server/middleware/auth.ts +4 -0
  655. package/corpus/templates/crm/server/plugins/agent-chat.ts +65 -0
  656. package/corpus/templates/crm/server/plugins/auth.ts +14 -0
  657. package/corpus/templates/crm/server/plugins/core-routes.ts +17 -0
  658. package/corpus/templates/crm/server/plugins/db.ts +738 -0
  659. package/corpus/templates/crm/server/routes/[...page].get.ts +5 -0
  660. package/corpus/templates/crm/shared/crm-attributes.ts +469 -0
  661. package/corpus/templates/crm/shared/crm-automation-recipes.ts +132 -0
  662. package/corpus/templates/crm/shared/crm-contract.ts +417 -0
  663. package/corpus/templates/crm/shared/crm-navigation.ts +190 -0
  664. package/corpus/templates/crm/shared/crm-sales-config.ts +63 -0
  665. package/corpus/templates/crm/ssr-entry.ts +11 -0
  666. package/corpus/templates/crm/tsconfig.json +24 -0
  667. package/corpus/templates/crm/vite.config.ts +15 -0
  668. package/corpus/templates/crm/vitest.config.ts +5 -0
  669. package/corpus/templates/design/.agents/skills/actions/SKILL.md +19 -1
  670. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
  671. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +15 -0
  672. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +20 -6
  673. package/corpus/templates/design/.agents/skills/full-app-build/SKILL.md +12 -0
  674. package/corpus/templates/design/.agents/skills/security/SKILL.md +2 -0
  675. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +4 -3
  676. package/corpus/templates/design/.agents/skills/shadcn-ui/SKILL.md +7 -3
  677. package/corpus/templates/design/.agents/skills/sharing/SKILL.md +228 -0
  678. package/corpus/templates/design/.agents/skills/storing-data/SKILL.md +178 -0
  679. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +201 -102
  680. package/corpus/templates/design/AGENTS.md +58 -71
  681. package/corpus/templates/design/actions/open-visual-edit.ts +111 -2
  682. package/corpus/templates/design/app/components/design/AddLocalhostScreenDialog.tsx +236 -0
  683. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +1 -1
  684. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2 -2
  685. package/corpus/templates/design/app/entry.client.tsx +3 -0
  686. package/corpus/templates/design/app/i18n-data.ts +192 -12
  687. package/corpus/templates/design/app/pages/Present.tsx +6 -9
  688. package/corpus/templates/design/app/pages/VisualEdit.tsx +4 -7
  689. package/corpus/templates/design/app/pages/design-editor/design-data-geometry-utils.ts +20 -0
  690. package/corpus/templates/design/changelog/2026-07-26-apply-design-updates-from-a-centered-top-toolbar-without-cov.md +6 -0
  691. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +19 -1
  692. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +20 -6
  693. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +2 -0
  694. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +4 -3
  695. package/corpus/templates/dispatch/.agents/skills/shadcn-ui/SKILL.md +7 -3
  696. package/corpus/templates/dispatch/.agents/skills/sharing/SKILL.md +228 -0
  697. package/corpus/templates/dispatch/.agents/skills/storing-data/SKILL.md +178 -0
  698. package/corpus/templates/dispatch/app/entry.client.tsx +3 -0
  699. package/corpus/templates/dispatch/server/plugins/identity-sso.ts +27 -16
  700. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +19 -1
  701. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +20 -6
  702. package/corpus/templates/forms/.agents/skills/security/SKILL.md +2 -0
  703. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +4 -3
  704. package/corpus/templates/forms/.agents/skills/shadcn-ui/SKILL.md +7 -3
  705. package/corpus/templates/forms/.agents/skills/sharing/SKILL.md +228 -0
  706. package/corpus/templates/forms/DEVELOPING.md +1 -1
  707. package/corpus/templates/forms/app/entry.client.tsx +3 -0
  708. package/corpus/templates/forms/app/pages/FormsListPage.tsx +3 -5
  709. package/corpus/templates/forms/app/routes/_app.tsx +4 -4
  710. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +20 -6
  711. package/corpus/templates/macros/.agents/skills/security/SKILL.md +2 -0
  712. package/corpus/templates/macros/.agents/skills/shadcn-ui/SKILL.md +7 -3
  713. package/corpus/templates/macros/.agents/skills/sharing/SKILL.md +228 -0
  714. package/corpus/templates/macros/.agents/skills/storing-data/SKILL.md +178 -0
  715. package/corpus/templates/macros/app/entry.client.tsx +3 -0
  716. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +19 -1
  717. package/corpus/templates/mail/.agents/skills/contacts-and-crm/SKILL.md +10 -0
  718. package/corpus/templates/mail/.agents/skills/draft-queue/SKILL.md +3 -0
  719. package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +26 -2
  720. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +20 -6
  721. package/corpus/templates/mail/.agents/skills/inbox-automations/SKILL.md +37 -0
  722. package/corpus/templates/mail/.agents/skills/inbox-reads-and-triage/SKILL.md +58 -0
  723. package/corpus/templates/mail/.agents/skills/mail-backends/SKILL.md +33 -0
  724. package/corpus/templates/mail/.agents/skills/provider-api-scans/SKILL.md +39 -0
  725. package/corpus/templates/mail/.agents/skills/security/SKILL.md +2 -0
  726. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +4 -3
  727. package/corpus/templates/mail/.agents/skills/shadcn-ui/SKILL.md +7 -3
  728. package/corpus/templates/mail/.agents/skills/sharing/SKILL.md +228 -0
  729. package/corpus/templates/mail/AGENTS.md +74 -143
  730. package/corpus/templates/mail/actions/create-alias.ts +36 -0
  731. package/corpus/templates/mail/actions/create-automation.ts +28 -0
  732. package/corpus/templates/mail/actions/create-scheduled-job.ts +45 -0
  733. package/corpus/templates/mail/actions/delete-alias.ts +26 -0
  734. package/corpus/templates/mail/actions/delete-automation.ts +21 -0
  735. package/corpus/templates/mail/actions/get-automation-settings.ts +32 -0
  736. package/corpus/templates/mail/actions/get-mail-preferences.ts +18 -0
  737. package/corpus/templates/mail/actions/list-aliases.ts +17 -0
  738. package/corpus/templates/mail/actions/list-automations.ts +18 -0
  739. package/corpus/templates/mail/actions/list-scheduled-jobs.ts +18 -0
  740. package/corpus/templates/mail/actions/update-alias.ts +37 -0
  741. package/corpus/templates/mail/actions/update-automation-settings.ts +33 -0
  742. package/corpus/templates/mail/actions/update-automation.ts +33 -0
  743. package/corpus/templates/mail/actions/update-mail-preferences.ts +68 -0
  744. package/corpus/templates/mail/actions/update-scheduled-job.ts +25 -0
  745. package/corpus/templates/mail/app/entry.client.tsx +3 -0
  746. package/corpus/templates/mail/app/hooks/use-aliases.ts +6 -36
  747. package/corpus/templates/mail/app/hooks/use-automations.ts +9 -16
  748. package/corpus/templates/mail/app/hooks/use-emails.ts +6 -5
  749. package/corpus/templates/mail/app/hooks/use-scheduled-jobs.ts +12 -15
  750. package/corpus/templates/mail/app/pages/SettingsPage.tsx +15 -9
  751. package/corpus/templates/mail/server/handlers/automations.ts +5 -142
  752. package/corpus/templates/mail/server/handlers/emails.ts +1 -56
  753. package/corpus/templates/mail/server/handlers/scheduled-jobs.ts +0 -134
  754. package/corpus/templates/mail/server/lib/aliases.ts +18 -0
  755. package/corpus/templates/mail/server/lib/automations.ts +104 -0
  756. package/corpus/templates/mail/server/lib/jobs.ts +34 -0
  757. package/corpus/templates/mail/server/lib/mail-settings.ts +43 -0
  758. package/corpus/templates/mail/shared/automation-schema.ts +10 -0
  759. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +19 -1
  760. package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +2 -0
  761. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +20 -6
  762. package/corpus/templates/plan/.agents/skills/plan-authoring-flow/SKILL.md +98 -0
  763. package/corpus/templates/plan/.agents/skills/plan-browser-editing/SKILL.md +42 -0
  764. package/corpus/templates/plan/.agents/skills/plan-comments-and-feedback/SKILL.md +68 -0
  765. package/corpus/templates/plan/.agents/skills/plan-events/SKILL.md +22 -0
  766. package/corpus/templates/plan/.agents/skills/plan-hosted-writes/SKILL.md +42 -0
  767. package/corpus/templates/plan/.agents/skills/plan-local-codebase-chat/SKILL.md +38 -0
  768. package/corpus/templates/plan/.agents/skills/plan-review-recaps/SKILL.md +25 -0
  769. package/corpus/templates/plan/.agents/skills/plan-source-sync/SKILL.md +68 -0
  770. package/corpus/templates/plan/.agents/skills/plan-version-history/SKILL.md +25 -0
  771. package/corpus/templates/plan/.agents/skills/security/SKILL.md +2 -0
  772. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +4 -3
  773. package/corpus/templates/plan/.agents/skills/shadcn-ui/SKILL.md +7 -3
  774. package/corpus/templates/plan/.agents/skills/sharing/SKILL.md +228 -0
  775. package/corpus/templates/plan/.agents/skills/storing-data/SKILL.md +178 -0
  776. package/corpus/templates/plan/AGENTS.md +64 -296
  777. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +9 -8
  778. package/corpus/templates/plan/app/pages/PlansPage.tsx +5 -10
  779. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +19 -1
  780. package/corpus/templates/slides/.agents/skills/deck-management/SKILL.md +7 -7
  781. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +20 -6
  782. package/corpus/templates/slides/.agents/skills/security/SKILL.md +2 -0
  783. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +4 -3
  784. package/corpus/templates/slides/.agents/skills/shadcn-ui/SKILL.md +7 -3
  785. package/corpus/templates/slides/.agents/skills/sharing/SKILL.md +228 -0
  786. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +3 -2
  787. package/corpus/templates/slides/.agents/skills/storing-data/SKILL.md +178 -0
  788. package/corpus/templates/slides/DEVELOPING.md +3 -3
  789. package/corpus/templates/slides/actions/_deck-write.ts +52 -0
  790. package/corpus/templates/slides/actions/add-deck.ts +73 -0
  791. package/corpus/templates/slides/actions/delete-deck.ts +60 -0
  792. package/corpus/templates/slides/actions/get-deck.ts +3 -1
  793. package/corpus/templates/slides/actions/save-deck.ts +144 -0
  794. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +27 -20
  795. package/corpus/templates/slides/app/context/DeckContext.tsx +173 -100
  796. package/corpus/templates/slides/app/pages/Index.tsx +3 -6
  797. package/corpus/templates/slides/app/routes/slide.tsx +16 -12
  798. package/corpus/templates/slides/changelog/2026-07-26-a-newly-created-deck-now-appears-in-the-deck-list-right-away.md +6 -0
  799. package/corpus/templates/slides/server/handlers/decks.ts +2 -378
  800. package/corpus/templates/tasks/.agents/skills/action-reference/SKILL.md +47 -0
  801. package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +19 -1
  802. package/corpus/templates/tasks/.agents/skills/adding-a-feature/SKILL.md +2 -0
  803. package/corpus/templates/tasks/.agents/skills/change-summary/SKILL.md +19 -1
  804. package/corpus/templates/tasks/.agents/skills/custom-fields/SKILL.md +63 -0
  805. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +20 -6
  806. package/corpus/templates/tasks/.agents/skills/security/SKILL.md +2 -0
  807. package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +4 -3
  808. package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +7 -3
  809. package/corpus/templates/tasks/.agents/skills/sharing/SKILL.md +228 -0
  810. package/corpus/templates/tasks/.agents/skills/store-conventions/SKILL.md +45 -0
  811. package/corpus/templates/tasks/.agents/skills/storing-data/SKILL.md +178 -0
  812. package/corpus/templates/tasks/.agents/skills/task-inbox-workflow/SKILL.md +66 -0
  813. package/corpus/templates/tasks/AGENTS.md +48 -113
  814. package/corpus/templates/tasks/app/entry.client.tsx +3 -0
  815. package/corpus/toolkit/CHANGELOG.md +12 -0
  816. package/corpus/toolkit/package.json +1 -1
  817. package/corpus/toolkit/src/composer/PromptComposer.tsx +23 -20
  818. package/dist/a2a/client.d.ts +3 -1
  819. package/dist/a2a/client.d.ts.map +1 -1
  820. package/dist/a2a/client.js +4 -2
  821. package/dist/a2a/client.js.map +1 -1
  822. package/dist/agent/action-warnings.d.ts +27 -0
  823. package/dist/agent/action-warnings.d.ts.map +1 -0
  824. package/dist/agent/action-warnings.js +73 -0
  825. package/dist/agent/action-warnings.js.map +1 -0
  826. package/dist/agent/durable-background.d.ts +8 -0
  827. package/dist/agent/durable-background.d.ts.map +1 -1
  828. package/dist/agent/durable-background.js +37 -5
  829. package/dist/agent/durable-background.js.map +1 -1
  830. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  831. package/dist/agent/engine/ai-sdk-engine.js +47 -6
  832. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  833. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  834. package/dist/agent/engine/anthropic-engine.js +41 -9
  835. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  836. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  837. package/dist/agent/engine/builder-engine.js +46 -19
  838. package/dist/agent/engine/builder-engine.js.map +1 -1
  839. package/dist/agent/engine/continuation-dispatch-retry.d.ts.map +1 -1
  840. package/dist/agent/engine/continuation-dispatch-retry.js +11 -9
  841. package/dist/agent/engine/continuation-dispatch-retry.js.map +1 -1
  842. package/dist/agent/engine/credential-errors.d.ts +6 -0
  843. package/dist/agent/engine/credential-errors.d.ts.map +1 -1
  844. package/dist/agent/engine/credential-errors.js +10 -0
  845. package/dist/agent/engine/credential-errors.js.map +1 -1
  846. package/dist/agent/engine/error-detail.d.ts +2 -0
  847. package/dist/agent/engine/error-detail.d.ts.map +1 -0
  848. package/dist/agent/engine/error-detail.js +37 -0
  849. package/dist/agent/engine/error-detail.js.map +1 -0
  850. package/dist/agent/engine/prompt-cache.d.ts +34 -0
  851. package/dist/agent/engine/prompt-cache.d.ts.map +1 -0
  852. package/dist/agent/engine/prompt-cache.js +39 -0
  853. package/dist/agent/engine/prompt-cache.js.map +1 -0
  854. package/dist/agent/engine/registry.d.ts.map +1 -1
  855. package/dist/agent/engine/registry.js +23 -33
  856. package/dist/agent/engine/registry.js.map +1 -1
  857. package/dist/agent/engine/tool-call-journal-seed.d.ts +1 -1
  858. package/dist/agent/engine/tool-call-journal-seed.d.ts.map +1 -1
  859. package/dist/agent/engine/tool-call-journal-seed.js +2 -2
  860. package/dist/agent/engine/tool-call-journal-seed.js.map +1 -1
  861. package/dist/agent/engine/translate-anthropic.d.ts +28 -0
  862. package/dist/agent/engine/translate-anthropic.d.ts.map +1 -1
  863. package/dist/agent/engine/translate-anthropic.js +75 -0
  864. package/dist/agent/engine/translate-anthropic.js.map +1 -1
  865. package/dist/agent/loop-settings.d.ts +35 -2
  866. package/dist/agent/loop-settings.d.ts.map +1 -1
  867. package/dist/agent/loop-settings.js +71 -8
  868. package/dist/agent/loop-settings.js.map +1 -1
  869. package/dist/agent/production-agent.d.ts +105 -20
  870. package/dist/agent/production-agent.d.ts.map +1 -1
  871. package/dist/agent/production-agent.js +516 -123
  872. package/dist/agent/production-agent.js.map +1 -1
  873. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  874. package/dist/agent/run-loop-with-resume.js +24 -2
  875. package/dist/agent/run-loop-with-resume.js.map +1 -1
  876. package/dist/agent/run-manager.d.ts +52 -9
  877. package/dist/agent/run-manager.d.ts.map +1 -1
  878. package/dist/agent/run-manager.js +191 -36
  879. package/dist/agent/run-manager.js.map +1 -1
  880. package/dist/agent/run-store.d.ts +87 -14
  881. package/dist/agent/run-store.d.ts.map +1 -1
  882. package/dist/agent/run-store.js +331 -59
  883. package/dist/agent/run-store.js.map +1 -1
  884. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  885. package/dist/agent/thread-data-builder.js +6 -1
  886. package/dist/agent/thread-data-builder.js.map +1 -1
  887. package/dist/agent/types.d.ts +18 -6
  888. package/dist/agent/types.d.ts.map +1 -1
  889. package/dist/agent/types.js +9 -5
  890. package/dist/agent/types.js.map +1 -1
  891. package/dist/application-state/script-helpers.d.ts.map +1 -1
  892. package/dist/application-state/script-helpers.js +2 -2
  893. package/dist/application-state/script-helpers.js.map +1 -1
  894. package/dist/cli/agents.d.ts +2 -0
  895. package/dist/cli/agents.d.ts.map +1 -1
  896. package/dist/cli/agents.js +48 -1
  897. package/dist/cli/agents.js.map +1 -1
  898. package/dist/cli/app-skill.js +1 -1
  899. package/dist/cli/app-skill.js.map +1 -1
  900. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  901. package/dist/cli/code-agent-executor.js +3 -3
  902. package/dist/cli/code-agent-executor.js.map +1 -1
  903. package/dist/cli/design-connect.d.ts.map +1 -1
  904. package/dist/cli/design-connect.js +73 -8
  905. package/dist/cli/design-connect.js.map +1 -1
  906. package/dist/cli/skills-content/design-visual-edit-skill.d.ts +1 -1
  907. package/dist/cli/skills-content/design-visual-edit-skill.d.ts.map +1 -1
  908. package/dist/cli/skills-content/design-visual-edit-skill.js +169 -24
  909. package/dist/cli/skills-content/design-visual-edit-skill.js.map +1 -1
  910. package/dist/cli/templates-meta.d.ts.map +1 -1
  911. package/dist/cli/templates-meta.js +12 -0
  912. package/dist/cli/templates-meta.js.map +1 -1
  913. package/dist/client/AssistantChat.d.ts.map +1 -1
  914. package/dist/client/AssistantChat.js +135 -125
  915. package/dist/client/AssistantChat.js.map +1 -1
  916. package/dist/client/agent-chat-adapter.d.ts +17 -0
  917. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  918. package/dist/client/agent-chat-adapter.js +141 -31
  919. package/dist/client/agent-chat-adapter.js.map +1 -1
  920. package/dist/client/chat/message-components.d.ts +9 -1
  921. package/dist/client/chat/message-components.d.ts.map +1 -1
  922. package/dist/client/chat/message-components.js +12 -1
  923. package/dist/client/chat/message-components.js.map +1 -1
  924. package/dist/client/embed-auth.d.ts.map +1 -1
  925. package/dist/client/embed-auth.js +3 -1
  926. package/dist/client/embed-auth.js.map +1 -1
  927. package/dist/client/integrations/IntegrationCard.d.ts.map +1 -1
  928. package/dist/client/integrations/IntegrationCard.js +9 -4
  929. package/dist/client/integrations/IntegrationCard.js.map +1 -1
  930. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
  931. package/dist/client/integrations/IntegrationsPanel.js +13 -7
  932. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  933. package/dist/client/integrations/webhook-url.d.ts +7 -0
  934. package/dist/client/integrations/webhook-url.d.ts.map +1 -0
  935. package/dist/client/integrations/webhook-url.js +32 -0
  936. package/dist/client/integrations/webhook-url.js.map +1 -0
  937. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  938. package/dist/client/org/OrgSwitcher.js +13 -11
  939. package/dist/client/org/OrgSwitcher.js.map +1 -1
  940. package/dist/client/org/RequireActiveOrg.d.ts.map +1 -1
  941. package/dist/client/org/RequireActiveOrg.js +2 -2
  942. package/dist/client/org/RequireActiveOrg.js.map +1 -1
  943. package/dist/client/org/TeamPage.d.ts.map +1 -1
  944. package/dist/client/org/TeamPage.js +52 -13
  945. package/dist/client/org/TeamPage.js.map +1 -1
  946. package/dist/client/org/hooks.d.ts +9 -0
  947. package/dist/client/org/hooks.d.ts.map +1 -1
  948. package/dist/client/org/hooks.js +24 -0
  949. package/dist/client/org/hooks.js.map +1 -1
  950. package/dist/client/org/index.d.ts +1 -1
  951. package/dist/client/org/index.d.ts.map +1 -1
  952. package/dist/client/org/index.js +1 -1
  953. package/dist/client/org/index.js.map +1 -1
  954. package/dist/client/require-session.d.ts +12 -17
  955. package/dist/client/require-session.d.ts.map +1 -1
  956. package/dist/client/require-session.js +36 -23
  957. package/dist/client/require-session.js.map +1 -1
  958. package/dist/client/session-replay.js +1 -1
  959. package/dist/client/session-replay.js.map +1 -1
  960. package/dist/client/settings/DemoModeSection.d.ts +0 -1
  961. package/dist/client/settings/DemoModeSection.d.ts.map +1 -1
  962. package/dist/client/settings/DemoModeSection.js +0 -4
  963. package/dist/client/settings/DemoModeSection.js.map +1 -1
  964. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  965. package/dist/client/settings/SecretsSection.js +12 -8
  966. package/dist/client/settings/SecretsSection.js.map +1 -1
  967. package/dist/client/settings/VoiceTranscriptionSection.d.ts +0 -1
  968. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  969. package/dist/client/settings/VoiceTranscriptionSection.js +1 -4
  970. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  971. package/dist/client/sse-event-processor.d.ts +33 -1
  972. package/dist/client/sse-event-processor.d.ts.map +1 -1
  973. package/dist/client/sse-event-processor.js +83 -8
  974. package/dist/client/sse-event-processor.js.map +1 -1
  975. package/dist/client/use-action.d.ts.map +1 -1
  976. package/dist/client/use-action.js +23 -14
  977. package/dist/client/use-action.js.map +1 -1
  978. package/dist/client/use-agent-engine-configured.d.ts +9 -3
  979. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  980. package/dist/client/use-agent-engine-configured.js +30 -3
  981. package/dist/client/use-agent-engine-configured.js.map +1 -1
  982. package/dist/client/use-db-sync.d.ts +3 -0
  983. package/dist/client/use-db-sync.d.ts.map +1 -1
  984. package/dist/client/use-db-sync.js +18 -1
  985. package/dist/client/use-db-sync.js.map +1 -1
  986. package/dist/collab/awareness.d.ts +2 -2
  987. package/dist/collab/awareness.d.ts.map +1 -1
  988. package/dist/credentials/index.d.ts +29 -1
  989. package/dist/credentials/index.d.ts.map +1 -1
  990. package/dist/credentials/index.js +111 -2
  991. package/dist/credentials/index.js.map +1 -1
  992. package/dist/deploy/build.d.ts +14 -3
  993. package/dist/deploy/build.d.ts.map +1 -1
  994. package/dist/deploy/build.js +81 -24
  995. package/dist/deploy/build.js.map +1 -1
  996. package/dist/deploy/workspace-deploy.d.ts +15 -0
  997. package/dist/deploy/workspace-deploy.d.ts.map +1 -1
  998. package/dist/deploy/workspace-deploy.js +19 -18
  999. package/dist/deploy/workspace-deploy.js.map +1 -1
  1000. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  1001. package/dist/guards/no-localhost-fallback.d.ts +7 -0
  1002. package/dist/guards/no-localhost-fallback.d.ts.map +1 -1
  1003. package/dist/guards/no-localhost-fallback.js +75 -16
  1004. package/dist/guards/no-localhost-fallback.js.map +1 -1
  1005. package/dist/integrations/google-docs-poller.d.ts.map +1 -1
  1006. package/dist/integrations/google-docs-poller.js +8 -3
  1007. package/dist/integrations/google-docs-poller.js.map +1 -1
  1008. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  1009. package/dist/integrations/webhook-handler.js +22 -4
  1010. package/dist/integrations/webhook-handler.js.map +1 -1
  1011. package/dist/jobs/scheduler.d.ts +17 -0
  1012. package/dist/jobs/scheduler.d.ts.map +1 -1
  1013. package/dist/jobs/scheduler.js +60 -33
  1014. package/dist/jobs/scheduler.js.map +1 -1
  1015. package/dist/localization/default-messages.d.ts +17 -1
  1016. package/dist/localization/default-messages.d.ts.map +1 -1
  1017. package/dist/localization/default-messages.js +17 -1
  1018. package/dist/localization/default-messages.js.map +1 -1
  1019. package/dist/notifications/routes.d.ts +1 -1
  1020. package/dist/observability/evals.d.ts.map +1 -1
  1021. package/dist/observability/evals.js +7 -10
  1022. package/dist/observability/evals.js.map +1 -1
  1023. package/dist/observability/routes.d.ts +3 -3
  1024. package/dist/observability/traces.d.ts +2 -0
  1025. package/dist/observability/traces.d.ts.map +1 -1
  1026. package/dist/observability/traces.js.map +1 -1
  1027. package/dist/org/accept-pending.js +2 -2
  1028. package/dist/org/accept-pending.js.map +1 -1
  1029. package/dist/org/active-org.d.ts +16 -0
  1030. package/dist/org/active-org.d.ts.map +1 -0
  1031. package/dist/org/active-org.js +57 -0
  1032. package/dist/org/active-org.js.map +1 -0
  1033. package/dist/org/auto-join-domain.d.ts.map +1 -1
  1034. package/dist/org/auto-join-domain.js +3 -2
  1035. package/dist/org/auto-join-domain.js.map +1 -1
  1036. package/dist/org/context.d.ts +19 -1
  1037. package/dist/org/context.d.ts.map +1 -1
  1038. package/dist/org/context.js +159 -71
  1039. package/dist/org/context.js.map +1 -1
  1040. package/dist/org/handlers.d.ts +24 -1
  1041. package/dist/org/handlers.d.ts.map +1 -1
  1042. package/dist/org/handlers.js +129 -10
  1043. package/dist/org/handlers.js.map +1 -1
  1044. package/dist/org/plugin.d.ts +2 -0
  1045. package/dist/org/plugin.d.ts.map +1 -1
  1046. package/dist/org/plugin.js +9 -2
  1047. package/dist/org/plugin.js.map +1 -1
  1048. package/dist/org/types.d.ts +6 -1
  1049. package/dist/org/types.d.ts.map +1 -1
  1050. package/dist/org/types.js.map +1 -1
  1051. package/dist/progress/routes.d.ts +1 -1
  1052. package/dist/provider-api/actions/custom-provider-registration.d.ts +9 -9
  1053. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  1054. package/dist/provider-api/index.d.ts.map +1 -1
  1055. package/dist/provider-api/index.js +3 -2
  1056. package/dist/provider-api/index.js.map +1 -1
  1057. package/dist/resources/handlers.d.ts +1 -1
  1058. package/dist/resources/handlers.d.ts.map +1 -1
  1059. package/dist/resources/handlers.js +2 -7
  1060. package/dist/resources/handlers.js.map +1 -1
  1061. package/dist/resources/script-helpers.d.ts.map +1 -1
  1062. package/dist/resources/script-helpers.js +2 -2
  1063. package/dist/resources/script-helpers.js.map +1 -1
  1064. package/dist/scripts/chat/search-chats.d.ts.map +1 -1
  1065. package/dist/scripts/chat/search-chats.js +2 -2
  1066. package/dist/scripts/chat/search-chats.js.map +1 -1
  1067. package/dist/scripts/describe-workspace-apps.d.ts +4 -0
  1068. package/dist/scripts/describe-workspace-apps.d.ts.map +1 -0
  1069. package/dist/scripts/describe-workspace-apps.js +34 -0
  1070. package/dist/scripts/describe-workspace-apps.js.map +1 -0
  1071. package/dist/scripts/resources/delete-memory.d.ts.map +1 -1
  1072. package/dist/scripts/resources/delete-memory.js +2 -2
  1073. package/dist/scripts/resources/delete-memory.js.map +1 -1
  1074. package/dist/scripts/resources/delete.d.ts.map +1 -1
  1075. package/dist/scripts/resources/delete.js +2 -2
  1076. package/dist/scripts/resources/delete.js.map +1 -1
  1077. package/dist/scripts/resources/effective.d.ts.map +1 -1
  1078. package/dist/scripts/resources/effective.js +2 -2
  1079. package/dist/scripts/resources/effective.js.map +1 -1
  1080. package/dist/scripts/resources/list.d.ts.map +1 -1
  1081. package/dist/scripts/resources/list.js +2 -2
  1082. package/dist/scripts/resources/list.js.map +1 -1
  1083. package/dist/scripts/resources/read.d.ts.map +1 -1
  1084. package/dist/scripts/resources/read.js +2 -2
  1085. package/dist/scripts/resources/read.js.map +1 -1
  1086. package/dist/scripts/resources/save-memory.d.ts.map +1 -1
  1087. package/dist/scripts/resources/save-memory.js +2 -2
  1088. package/dist/scripts/resources/save-memory.js.map +1 -1
  1089. package/dist/scripts/resources/write.d.ts.map +1 -1
  1090. package/dist/scripts/resources/write.js +2 -2
  1091. package/dist/scripts/resources/write.js.map +1 -1
  1092. package/dist/secrets/routes.d.ts +9 -9
  1093. package/dist/server/agent-capabilities.d.ts +21 -0
  1094. package/dist/server/agent-capabilities.d.ts.map +1 -0
  1095. package/dist/server/agent-capabilities.js +106 -0
  1096. package/dist/server/agent-capabilities.js.map +1 -0
  1097. package/dist/server/agent-chat/framework-prompts.d.ts.map +1 -1
  1098. package/dist/server/agent-chat/framework-prompts.js +11 -13
  1099. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  1100. package/dist/server/agent-chat/prompt-resources.d.ts +32 -0
  1101. package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
  1102. package/dist/server/agent-chat/prompt-resources.js +117 -56
  1103. package/dist/server/agent-chat/prompt-resources.js.map +1 -1
  1104. package/dist/server/agent-chat/script-entries.d.ts.map +1 -1
  1105. package/dist/server/agent-chat/script-entries.js +18 -8
  1106. package/dist/server/agent-chat/script-entries.js.map +1 -1
  1107. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  1108. package/dist/server/agent-chat-plugin.js +27 -1
  1109. package/dist/server/agent-chat-plugin.js.map +1 -1
  1110. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  1111. package/dist/server/auth.d.ts +9 -9
  1112. package/dist/server/auth.d.ts.map +1 -1
  1113. package/dist/server/auth.js +32 -33
  1114. package/dist/server/auth.js.map +1 -1
  1115. package/dist/server/core-routes-plugin.d.ts +45 -0
  1116. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  1117. package/dist/server/core-routes-plugin.js +162 -139
  1118. package/dist/server/core-routes-plugin.js.map +1 -1
  1119. package/dist/server/credential-provider.d.ts +35 -2
  1120. package/dist/server/credential-provider.d.ts.map +1 -1
  1121. package/dist/server/credential-provider.js +155 -40
  1122. package/dist/server/credential-provider.js.map +1 -1
  1123. package/dist/server/embed-session.d.ts.map +1 -1
  1124. package/dist/server/embed-session.js +10 -0
  1125. package/dist/server/embed-session.js.map +1 -1
  1126. package/dist/server/framework-request-handler.d.ts.map +1 -1
  1127. package/dist/server/framework-request-handler.js +38 -0
  1128. package/dist/server/framework-request-handler.js.map +1 -1
  1129. package/dist/server/google-auth-plugin.d.ts.map +1 -1
  1130. package/dist/server/google-auth-plugin.js +12 -444
  1131. package/dist/server/google-auth-plugin.js.map +1 -1
  1132. package/dist/server/index.d.ts +2 -2
  1133. package/dist/server/index.d.ts.map +1 -1
  1134. package/dist/server/index.js +2 -2
  1135. package/dist/server/index.js.map +1 -1
  1136. package/dist/server/onboarding-html.d.ts.map +1 -1
  1137. package/dist/server/onboarding-html.js +20 -56
  1138. package/dist/server/onboarding-html.js.map +1 -1
  1139. package/dist/server/open-route.d.ts.map +1 -1
  1140. package/dist/server/open-route.js +6 -1
  1141. package/dist/server/open-route.js.map +1 -1
  1142. package/dist/server/poll.js +1 -1
  1143. package/dist/server/poll.js.map +1 -1
  1144. package/dist/server/prompts/framework-core-compact.d.ts.map +1 -1
  1145. package/dist/server/prompts/framework-core-compact.js +5 -6
  1146. package/dist/server/prompts/framework-core-compact.js.map +1 -1
  1147. package/dist/server/prompts/framework-core.d.ts.map +1 -1
  1148. package/dist/server/prompts/framework-core.js +7 -10
  1149. package/dist/server/prompts/framework-core.js.map +1 -1
  1150. package/dist/server/prompts/shared-rules.d.ts +20 -2
  1151. package/dist/server/prompts/shared-rules.d.ts.map +1 -1
  1152. package/dist/server/prompts/shared-rules.js +20 -10
  1153. package/dist/server/prompts/shared-rules.js.map +1 -1
  1154. package/dist/server/realtime-token.d.ts +1 -1
  1155. package/dist/server/request-context.d.ts +26 -1
  1156. package/dist/server/request-context.d.ts.map +1 -1
  1157. package/dist/server/request-context.js +52 -2
  1158. package/dist/server/request-context.js.map +1 -1
  1159. package/dist/server/scoped-key-storage.js +1 -1
  1160. package/dist/server/scoped-key-storage.js.map +1 -1
  1161. package/dist/server/transcribe-voice.d.ts +1 -1
  1162. package/dist/settings/org-settings.d.ts +2 -0
  1163. package/dist/settings/org-settings.d.ts.map +1 -1
  1164. package/dist/settings/org-settings.js +5 -1
  1165. package/dist/settings/org-settings.js.map +1 -1
  1166. package/dist/settings/store.d.ts +6 -0
  1167. package/dist/settings/store.d.ts.map +1 -1
  1168. package/dist/settings/store.js +25 -0
  1169. package/dist/settings/store.js.map +1 -1
  1170. package/dist/shared/index.d.ts +1 -0
  1171. package/dist/shared/index.d.ts.map +1 -1
  1172. package/dist/shared/index.js +1 -0
  1173. package/dist/shared/index.js.map +1 -1
  1174. package/dist/shared/sign-in-journey.d.ts +102 -0
  1175. package/dist/shared/sign-in-journey.d.ts.map +1 -0
  1176. package/dist/shared/sign-in-journey.js +269 -0
  1177. package/dist/shared/sign-in-journey.js.map +1 -0
  1178. package/dist/styles/agent-native.css +8 -0
  1179. package/dist/templates/chat/.agents/skills/actions/SKILL.md +19 -1
  1180. package/dist/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
  1181. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
  1182. package/dist/templates/chat/.agents/skills/security/SKILL.md +2 -0
  1183. package/dist/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
  1184. package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
  1185. package/dist/templates/chat/.agents/skills/sharing/SKILL.md +228 -0
  1186. package/dist/templates/chat/.agents/skills/storing-data/SKILL.md +178 -0
  1187. package/dist/templates/chat/AGENTS.md +8 -0
  1188. package/dist/templates/chat/app/entry.client.tsx +3 -0
  1189. package/dist/templates/default/.agents/skills/actions/SKILL.md +19 -1
  1190. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +2 -0
  1191. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +20 -6
  1192. package/dist/templates/default/.agents/skills/security/SKILL.md +2 -0
  1193. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +4 -3
  1194. package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +7 -3
  1195. package/dist/templates/default/AGENTS.md +68 -195
  1196. package/dist/templates/default/app/entry.client.tsx +3 -0
  1197. package/dist/templates/default/app/i18n/ar-SA.ts +8 -0
  1198. package/dist/templates/default/app/i18n/de-DE.ts +8 -0
  1199. package/dist/templates/default/app/i18n/en-US.ts +8 -0
  1200. package/dist/templates/default/app/i18n/es-ES.ts +8 -0
  1201. package/dist/templates/default/app/i18n/fr-FR.ts +8 -0
  1202. package/dist/templates/default/app/i18n/hi-IN.ts +8 -0
  1203. package/dist/templates/default/app/i18n/ja-JP.ts +8 -0
  1204. package/dist/templates/default/app/i18n/ko-KR.ts +8 -0
  1205. package/dist/templates/default/app/i18n/pt-BR.ts +8 -0
  1206. package/dist/templates/default/app/i18n/zh-CN.ts +8 -0
  1207. package/dist/templates/default/app/i18n/zh-TW.ts +8 -0
  1208. package/dist/templates/headless/.agents/skills/actions/SKILL.md +19 -1
  1209. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +19 -1
  1210. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +2 -0
  1211. package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +100 -0
  1212. package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -1
  1213. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +28 -0
  1214. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +14 -1
  1215. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +20 -6
  1216. package/dist/templates/workspace-core/.agents/skills/qa/SKILL.md +6 -3
  1217. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +2 -0
  1218. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -3
  1219. package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +7 -3
  1220. package/dist/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +91 -0
  1221. package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +60 -0
  1222. package/dist/templates/workspace-core/AGENTS.md +62 -124
  1223. package/dist/templates/workspace-root/AGENTS.md +6 -1
  1224. package/dist/triggers/dispatcher.d.ts.map +1 -1
  1225. package/dist/triggers/dispatcher.js +10 -3
  1226. package/dist/triggers/dispatcher.js.map +1 -1
  1227. package/dist/vite/client.d.ts.map +1 -1
  1228. package/dist/vite/client.js +18 -8
  1229. package/dist/vite/client.js.map +1 -1
  1230. package/docs/content/actions.mdx +33 -20
  1231. package/docs/content/agent-mentions.mdx +30 -19
  1232. package/docs/content/agent-native-toolkit.mdx +8 -6
  1233. package/docs/content/agent-resources.mdx +11 -0
  1234. package/docs/content/agent-surfaces.mdx +41 -30
  1235. package/docs/content/audit-log.mdx +78 -0
  1236. package/docs/content/authentication.mdx +7 -5
  1237. package/docs/content/automations.mdx +15 -9
  1238. package/docs/content/client.mdx +11 -11
  1239. package/docs/content/cloneable-saas.mdx +7 -1
  1240. package/docs/content/code-agents-ui.mdx +9 -1
  1241. package/docs/content/components.mdx +7 -0
  1242. package/docs/content/context-awareness.mdx +1 -0
  1243. package/docs/content/creating-templates.mdx +9 -1
  1244. package/docs/content/custom-design-system.mdx +8 -0
  1245. package/docs/content/data-programs.mdx +6 -0
  1246. package/docs/content/deployment.mdx +2 -0
  1247. package/docs/content/doctor.mdx +5 -3
  1248. package/docs/content/extensions.mdx +26 -0
  1249. package/docs/content/external-agents-catalog.mdx +533 -0
  1250. package/docs/content/external-agents.mdx +20 -514
  1251. package/docs/content/faq.mdx +2 -2
  1252. package/docs/content/file-uploads.mdx +44 -0
  1253. package/docs/content/frames.mdx +2 -2
  1254. package/docs/content/generative-ui.mdx +8 -0
  1255. package/docs/content/getting-started.mdx +45 -17
  1256. package/docs/content/human-approval.mdx +9 -0
  1257. package/docs/content/integrations.mdx +4 -3
  1258. package/docs/content/internationalization.mdx +4 -11
  1259. package/docs/content/key-concepts.mdx +1 -1
  1260. package/docs/content/local-file-mode.mdx +5 -0
  1261. package/docs/content/mcp-apps.mdx +2 -1
  1262. package/docs/content/mcp-clients.mdx +32 -1
  1263. package/docs/content/mcp-protocol.mdx +4 -3
  1264. package/docs/content/messaging-internals.mdx +328 -0
  1265. package/docs/content/messaging-recipes.mdx +194 -0
  1266. package/docs/content/messaging.mdx +9 -307
  1267. package/docs/content/multi-app-workspace.mdx +1 -1
  1268. package/docs/content/multi-tenancy.mdx +1 -0
  1269. package/docs/content/native-chat-ui.mdx +8 -0
  1270. package/docs/content/notifications.mdx +18 -20
  1271. package/docs/content/observability.mdx +1 -0
  1272. package/docs/content/onboarding.mdx +20 -6
  1273. package/docs/content/organizations-teams-permissions.mdx +99 -124
  1274. package/docs/content/package-lifecycle.mdx +19 -7
  1275. package/docs/content/progress.mdx +11 -0
  1276. package/docs/content/real-time-collaboration.mdx +44 -3
  1277. package/docs/content/recurring-jobs.mdx +14 -1
  1278. package/docs/content/security.mdx +5 -2
  1279. package/docs/content/server.mdx +2 -1
  1280. package/docs/content/sharing.mdx +22 -3
  1281. package/docs/content/skills-guide.mdx +62 -19
  1282. package/docs/content/syncing-template-changes.mdx +9 -0
  1283. package/docs/content/template-analytics-connectors.mdx +75 -0
  1284. package/docs/content/template-analytics-dashboards.mdx +106 -0
  1285. package/docs/content/template-analytics-developers.mdx +287 -0
  1286. package/docs/content/template-analytics-monitoring-and-sessions.mdx +109 -0
  1287. package/docs/content/template-analytics.mdx +21 -263
  1288. package/docs/content/template-assets-developers.mdx +456 -0
  1289. package/docs/content/template-assets-generation.mdx +147 -0
  1290. package/docs/content/template-assets-integrations.mdx +319 -0
  1291. package/docs/content/template-assets-presets.mdx +185 -0
  1292. package/docs/content/template-assets.mdx +12 -562
  1293. package/docs/content/template-brain-agent.mdx +103 -0
  1294. package/docs/content/template-brain-developers.mdx +379 -0
  1295. package/docs/content/template-brain-knowledge.mdx +50 -0
  1296. package/docs/content/template-brain-sources.mdx +163 -0
  1297. package/docs/content/template-brain.mdx +30 -390
  1298. package/docs/content/template-calendar-agent.mdx +133 -0
  1299. package/docs/content/template-calendar-booking-links.mdx +73 -0
  1300. package/docs/content/template-calendar-developers.mdx +366 -0
  1301. package/docs/content/template-calendar-scheduling.mdx +128 -0
  1302. package/docs/content/template-calendar.mdx +13 -260
  1303. package/docs/content/template-chat-developers.mdx +88 -0
  1304. package/docs/content/template-chat-first-edits.mdx +145 -0
  1305. package/docs/content/template-chat.mdx +12 -77
  1306. package/docs/content/template-clips-ai-and-editing.mdx +114 -0
  1307. package/docs/content/template-clips-capture-everywhere.mdx +120 -0
  1308. package/docs/content/template-clips-developers.mdx +373 -0
  1309. package/docs/content/template-clips-sharing-and-teams.mdx +182 -0
  1310. package/docs/content/template-clips.mdx +19 -508
  1311. package/docs/content/template-content-databases.mdx +406 -0
  1312. package/docs/content/template-content-developers.mdx +364 -0
  1313. package/docs/content/template-content-editing.mdx +60 -0
  1314. package/docs/content/template-content-sync.mdx +149 -0
  1315. package/docs/content/template-content.mdx +21 -561
  1316. package/docs/content/template-design-brand-and-figma.mdx +150 -0
  1317. package/docs/content/template-design-collaboration-and-full-apps.mdx +125 -0
  1318. package/docs/content/template-design-developers.mdx +358 -0
  1319. package/docs/content/template-design-quality-and-components.mdx +95 -0
  1320. package/docs/content/template-design.mdx +20 -344
  1321. package/docs/content/template-dispatch-developers.mdx +121 -0
  1322. package/docs/content/template-dispatch-messaging-routing.mdx +114 -0
  1323. package/docs/content/template-dispatch-operations.mdx +160 -0
  1324. package/docs/content/template-dispatch-vault-integrations.mdx +316 -0
  1325. package/docs/content/template-dispatch.mdx +24 -283
  1326. package/docs/content/template-forms-building-publishing.mdx +135 -0
  1327. package/docs/content/template-forms-developers.mdx +195 -0
  1328. package/docs/content/template-forms-responses.mdx +120 -0
  1329. package/docs/content/template-forms.mdx +21 -230
  1330. package/docs/content/template-mail-agent.mdx +114 -0
  1331. package/docs/content/template-mail-developers.mdx +356 -0
  1332. package/docs/content/template-mail-drafts-and-queue.mdx +103 -0
  1333. package/docs/content/template-mail-inbox.mdx +118 -0
  1334. package/docs/content/template-mail.mdx +23 -274
  1335. package/docs/content/template-plan-automations.mdx +213 -0
  1336. package/docs/content/template-plan-developers.mdx +703 -0
  1337. package/docs/content/template-plan-local-and-desktop.mdx +236 -0
  1338. package/docs/content/template-plan-review-workflow.mdx +180 -0
  1339. package/docs/content/template-plan.mdx +60 -910
  1340. package/docs/content/template-slides-agent.mdx +102 -0
  1341. package/docs/content/template-slides-design-and-media.mdx +94 -0
  1342. package/docs/content/template-slides-developers.mdx +488 -0
  1343. package/docs/content/template-slides-editing.mdx +56 -0
  1344. package/docs/content/template-slides.mdx +20 -362
  1345. package/docs/content/toolkit-capability-packages.mdx +38 -13
  1346. package/docs/content/toolkit-context-knowledge.mdx +49 -9
  1347. package/docs/content/toolkit-editors-canvases.mdx +72 -10
  1348. package/docs/content/toolkit-resources.mdx +16 -0
  1349. package/docs/content/toolkit-settings.mdx +3 -3
  1350. package/docs/content/toolkit-sharing.mdx +5 -7
  1351. package/docs/content/using-your-agent.mdx +25 -2
  1352. package/docs/content/voice-input.mdx +11 -7
  1353. package/docs/content/what-is-agent-native.mdx +1 -0
  1354. package/docs/content/workspace-connections.mdx +21 -11
  1355. package/docs/content/workspace-management.mdx +1 -1
  1356. package/package.json +2 -4
  1357. package/src/a2a/client.ts +4 -2
  1358. package/src/agent/action-warnings.ts +103 -0
  1359. package/src/agent/durable-background.ts +42 -5
  1360. package/src/agent/engine/ai-sdk-engine.ts +58 -6
  1361. package/src/agent/engine/anthropic-engine.ts +51 -8
  1362. package/src/agent/engine/builder-engine.ts +56 -18
  1363. package/src/agent/engine/continuation-dispatch-retry.ts +10 -9
  1364. package/src/agent/engine/credential-errors.ts +11 -0
  1365. package/src/agent/engine/error-detail.ts +39 -0
  1366. package/src/agent/engine/prompt-cache.ts +44 -0
  1367. package/src/agent/engine/registry.ts +22 -30
  1368. package/src/agent/engine/tool-call-journal-seed.ts +2 -1
  1369. package/src/agent/engine/translate-anthropic.ts +99 -0
  1370. package/src/agent/loop-settings.ts +94 -7
  1371. package/src/agent/production-agent.ts +667 -157
  1372. package/src/agent/run-loop-with-resume.ts +27 -1
  1373. package/src/agent/run-manager.ts +229 -39
  1374. package/src/agent/run-store.ts +397 -64
  1375. package/src/agent/thread-data-builder.ts +5 -1
  1376. package/src/agent/types.ts +23 -6
  1377. package/src/application-state/script-helpers.ts +5 -2
  1378. package/src/cli/agents.ts +69 -1
  1379. package/src/cli/app-skill.ts +1 -1
  1380. package/src/cli/code-agent-executor.ts +7 -3
  1381. package/src/cli/design-connect.ts +82 -8
  1382. package/src/cli/skills-content/design-visual-edit-skill.ts +169 -24
  1383. package/src/cli/templates-meta.ts +12 -0
  1384. package/src/client/AssistantChat.tsx +623 -607
  1385. package/src/client/agent-chat-adapter.ts +176 -29
  1386. package/src/client/chat/message-components.tsx +13 -0
  1387. package/src/client/embed-auth.ts +3 -1
  1388. package/src/client/integrations/IntegrationCard.tsx +41 -24
  1389. package/src/client/integrations/IntegrationsPanel.tsx +37 -21
  1390. package/src/client/integrations/webhook-url.ts +29 -0
  1391. package/src/client/org/OrgSwitcher.tsx +41 -27
  1392. package/src/client/org/RequireActiveOrg.tsx +7 -0
  1393. package/src/client/org/TeamPage.tsx +144 -14
  1394. package/src/client/org/hooks.ts +27 -0
  1395. package/src/client/org/index.ts +2 -0
  1396. package/src/client/require-session.tsx +40 -29
  1397. package/src/client/session-replay.ts +1 -1
  1398. package/src/client/settings/DemoModeSection.tsx +0 -5
  1399. package/src/client/settings/SecretsSection.tsx +47 -42
  1400. package/src/client/settings/VoiceTranscriptionSection.tsx +0 -5
  1401. package/src/client/sse-event-processor.ts +83 -8
  1402. package/src/client/use-action.ts +22 -13
  1403. package/src/client/use-agent-engine-configured.ts +36 -4
  1404. package/src/client/use-db-sync.ts +21 -1
  1405. package/src/credentials/index.ts +124 -2
  1406. package/src/deploy/build.ts +93 -30
  1407. package/src/deploy/workspace-deploy.ts +21 -16
  1408. package/src/guards/no-localhost-fallback.ts +76 -14
  1409. package/src/integrations/google-docs-poller.ts +19 -12
  1410. package/src/integrations/webhook-handler.ts +56 -33
  1411. package/src/jobs/scheduler.ts +57 -23
  1412. package/src/localization/default-messages.ts +23 -1
  1413. package/src/observability/evals.ts +7 -8
  1414. package/src/observability/traces.ts +2 -0
  1415. package/src/org/accept-pending.ts +2 -2
  1416. package/src/org/active-org.ts +73 -0
  1417. package/src/org/auto-join-domain.ts +7 -2
  1418. package/src/org/context.ts +169 -66
  1419. package/src/org/handlers.ts +148 -10
  1420. package/src/org/plugin.ts +8 -1
  1421. package/src/org/types.ts +6 -1
  1422. package/src/provider-api/index.ts +6 -1
  1423. package/src/resources/handlers.ts +2 -6
  1424. package/src/resources/script-helpers.ts +2 -1
  1425. package/src/scripts/chat/search-chats.ts +5 -2
  1426. package/src/scripts/describe-workspace-apps.ts +59 -0
  1427. package/src/scripts/resources/delete-memory.ts +5 -2
  1428. package/src/scripts/resources/delete.ts +5 -2
  1429. package/src/scripts/resources/effective.ts +5 -2
  1430. package/src/scripts/resources/list.ts +5 -2
  1431. package/src/scripts/resources/read.ts +5 -2
  1432. package/src/scripts/resources/save-memory.ts +5 -2
  1433. package/src/scripts/resources/write.ts +5 -2
  1434. package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +11 -31
  1435. package/src/server/agent-capabilities.ts +147 -0
  1436. package/src/server/agent-chat/framework-prompts.ts +11 -13
  1437. package/src/server/agent-chat/prompt-resources.ts +183 -57
  1438. package/src/server/agent-chat/script-entries.ts +20 -7
  1439. package/src/server/agent-chat-plugin.ts +27 -0
  1440. package/src/server/auth.ts +38 -32
  1441. package/src/server/core-routes-plugin.ts +229 -179
  1442. package/src/server/credential-provider.ts +196 -44
  1443. package/src/server/embed-session.ts +10 -0
  1444. package/src/server/framework-request-handler.ts +43 -0
  1445. package/src/server/google-auth-plugin.ts +13 -450
  1446. package/src/server/index.ts +4 -1
  1447. package/src/server/onboarding-html.ts +20 -56
  1448. package/src/server/open-route.ts +6 -1
  1449. package/src/server/poll.ts +1 -1
  1450. package/src/server/prompts/framework-core-compact.ts +5 -5
  1451. package/src/server/prompts/framework-core.ts +7 -9
  1452. package/src/server/prompts/shared-rules.ts +20 -9
  1453. package/src/server/request-context.ts +58 -2
  1454. package/src/server/scoped-key-storage.ts +1 -1
  1455. package/src/settings/org-settings.ts +9 -0
  1456. package/src/settings/store.ts +29 -0
  1457. package/src/shared/index.ts +13 -0
  1458. package/src/shared/sign-in-journey.ts +331 -0
  1459. package/src/styles/agent-native.css +8 -0
  1460. package/src/templates/chat/.agents/skills/actions/SKILL.md +19 -1
  1461. package/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
  1462. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
  1463. package/src/templates/chat/.agents/skills/security/SKILL.md +2 -0
  1464. package/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
  1465. package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
  1466. package/src/templates/chat/.agents/skills/sharing/SKILL.md +228 -0
  1467. package/src/templates/chat/.agents/skills/storing-data/SKILL.md +178 -0
  1468. package/src/templates/chat/AGENTS.md +8 -0
  1469. package/src/templates/chat/app/entry.client.tsx +3 -0
  1470. package/src/templates/default/.agents/skills/actions/SKILL.md +19 -1
  1471. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +2 -0
  1472. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +20 -6
  1473. package/src/templates/default/.agents/skills/security/SKILL.md +2 -0
  1474. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +4 -3
  1475. package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +7 -3
  1476. package/src/templates/default/AGENTS.md +68 -195
  1477. package/src/templates/default/app/entry.client.tsx +3 -0
  1478. package/src/templates/default/app/i18n/ar-SA.ts +8 -0
  1479. package/src/templates/default/app/i18n/de-DE.ts +8 -0
  1480. package/src/templates/default/app/i18n/en-US.ts +8 -0
  1481. package/src/templates/default/app/i18n/es-ES.ts +8 -0
  1482. package/src/templates/default/app/i18n/fr-FR.ts +8 -0
  1483. package/src/templates/default/app/i18n/hi-IN.ts +8 -0
  1484. package/src/templates/default/app/i18n/ja-JP.ts +8 -0
  1485. package/src/templates/default/app/i18n/ko-KR.ts +8 -0
  1486. package/src/templates/default/app/i18n/pt-BR.ts +8 -0
  1487. package/src/templates/default/app/i18n/zh-CN.ts +8 -0
  1488. package/src/templates/default/app/i18n/zh-TW.ts +8 -0
  1489. package/src/templates/headless/.agents/skills/actions/SKILL.md +19 -1
  1490. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +19 -1
  1491. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +2 -0
  1492. package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +100 -0
  1493. package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -1
  1494. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +28 -0
  1495. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +14 -1
  1496. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +20 -6
  1497. package/src/templates/workspace-core/.agents/skills/qa/SKILL.md +6 -3
  1498. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +2 -0
  1499. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -3
  1500. package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +7 -3
  1501. package/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +91 -0
  1502. package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +60 -0
  1503. package/src/templates/workspace-core/AGENTS.md +62 -124
  1504. package/src/templates/workspace-root/AGENTS.md +6 -1
  1505. package/src/triggers/dispatcher.ts +28 -17
  1506. package/src/vite/client.ts +20 -8
  1507. package/corpus/core/src/client/components/MissingKeyCard.tsx +0 -61
  1508. package/corpus/core/src/client/extensions/agent-native-extension-runtime.ts +0 -495
  1509. package/corpus/core/src/client/settings/BackgroundAgentSection.tsx +0 -193
  1510. package/corpus/core/src/client/settings/BrowserSection.tsx +0 -110
  1511. package/corpus/templates/analytics/app/components/InlineMetric.tsx +0 -31
  1512. package/corpus/templates/analytics/app/components/auth/LoginScreen.tsx +0 -4
  1513. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +0 -128
  1514. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +0 -264
  1515. package/corpus/templates/analytics/app/components/dashboard/RecentActivity.tsx +0 -84
  1516. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +0 -92
  1517. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +0 -154
  1518. package/corpus/templates/analytics/app/components/dashboard/StatsCard.tsx +0 -49
  1519. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +0 -120
  1520. package/corpus/templates/analytics/server/handlers/dashboard-views.ts +0 -85
  1521. package/corpus/templates/analytics/server/handlers/user-prefs.ts +0 -58
  1522. package/corpus/templates/analytics/server/routes/api/dashboard-views/[dashboardId]/[viewId].delete.ts +0 -1
  1523. package/corpus/templates/analytics/server/routes/api/dashboard-views/[dashboardId].get.ts +0 -1
  1524. package/corpus/templates/analytics/server/routes/api/dashboard-views/[dashboardId].post.ts +0 -1
  1525. package/corpus/templates/analytics/server/routes/api/theme.get.ts +0 -17
  1526. package/corpus/templates/analytics/server/routes/api/theme.post.ts +0 -15
  1527. package/corpus/templates/analytics/server/routes/api/user-prefs/[key].delete.ts +0 -1
  1528. package/corpus/templates/analytics/server/routes/api/user-prefs/[key].get.ts +0 -1
  1529. package/corpus/templates/analytics/server/routes/api/user-prefs/[key].put.ts +0 -1
  1530. package/corpus/templates/assets/app/components/library/CreateLibraryDialog.tsx +0 -156
  1531. package/corpus/templates/assets/app/components/library/LibraryCard.tsx +0 -213
  1532. package/corpus/templates/calendar/app/components/calendar/GoogleSyncButton.tsx +0 -49
  1533. package/corpus/templates/calendar/server/routes/api/events/[id].delete.ts +0 -1
  1534. package/corpus/templates/calendar/server/routes/api/events/[id].get.ts +0 -1
  1535. package/corpus/templates/calendar/server/routes/api/events/[id].put.ts +0 -1
  1536. package/corpus/templates/content/app/components/layout/AppLayout.tsx +0 -9
  1537. package/corpus/templates/content/server/routes/api/comments/[id].delete.ts +0 -69
  1538. package/corpus/templates/content/server/routes/api/comments/[id].patch.ts +0 -109
  1539. package/corpus/templates/content/server/routes/api/documents/[id]/versions.get.ts +0 -53
  1540. package/corpus/templates/design/app/components/design/code-workbench/ActivityBar.tsx +0 -85
  1541. package/corpus/templates/design/app/components/design-system/DesignSystemCard.tsx +0 -129
  1542. package/corpus/templates/forms/app/components/layout/AppLayout.tsx +0 -9
  1543. package/corpus/templates/mail/app/components/email/SnoozePopover.tsx +0 -213
  1544. package/corpus/templates/mail/server/handlers/aliases.ts +0 -98
  1545. package/corpus/templates/mail/server/routes/api/aliases/[id].delete.ts +0 -1
  1546. package/corpus/templates/mail/server/routes/api/aliases/[id].patch.ts +0 -1
  1547. package/corpus/templates/mail/server/routes/api/aliases/index.get.ts +0 -1
  1548. package/corpus/templates/mail/server/routes/api/aliases/index.post.ts +0 -1
  1549. package/corpus/templates/mail/server/routes/api/automations/[id].delete.ts +0 -1
  1550. package/corpus/templates/mail/server/routes/api/automations/[id].patch.ts +0 -1
  1551. package/corpus/templates/mail/server/routes/api/automations/index.get.ts +0 -1
  1552. package/corpus/templates/mail/server/routes/api/automations/index.post.ts +0 -1
  1553. package/corpus/templates/mail/server/routes/api/automations/settings.get.ts +0 -22
  1554. package/corpus/templates/mail/server/routes/api/automations/settings.put.ts +0 -25
  1555. package/corpus/templates/mail/server/routes/api/scheduled-jobs/[id].delete.ts +0 -1
  1556. package/corpus/templates/mail/server/routes/api/scheduled-jobs/[id].patch.ts +0 -1
  1557. package/corpus/templates/mail/server/routes/api/scheduled-jobs/index.get.ts +0 -1
  1558. package/corpus/templates/mail/server/routes/api/scheduled-jobs/index.post.ts +0 -1
  1559. package/corpus/templates/mail/server/routes/api/settings.get.ts +0 -1
  1560. package/corpus/templates/mail/server/routes/api/settings.patch.ts +0 -1
  1561. package/corpus/templates/slides/app/components/deck/BuilderLogo.tsx +0 -22
  1562. package/corpus/templates/slides/app/components/design-system/DesignSystemPreview.tsx +0 -176
  1563. package/corpus/templates/slides/app/components/editor/GenerateSlidesDialog.tsx +0 -244
  1564. package/corpus/templates/slides/app/components/editor/ImportButton.tsx +0 -84
  1565. package/corpus/templates/slides/server/routes/api/comments/[id].delete.ts +0 -43
  1566. package/corpus/templates/slides/server/routes/api/comments/[id].patch.ts +0 -50
  1567. package/corpus/templates/slides/server/routes/api/decks/[id].delete.ts +0 -1
  1568. package/corpus/templates/slides/server/routes/api/decks/[id].get.ts +0 -1
  1569. package/corpus/templates/slides/server/routes/api/decks/[id].put.ts +0 -1
  1570. package/corpus/templates/slides/server/routes/api/decks/index.get.ts +0 -1
  1571. package/corpus/templates/slides/server/routes/api/decks/index.post.ts +0 -1
  1572. package/dist/client/components/MissingKeyCard.d.ts +0 -7
  1573. package/dist/client/components/MissingKeyCard.d.ts.map +0 -1
  1574. package/dist/client/components/MissingKeyCard.js +0 -32
  1575. package/dist/client/components/MissingKeyCard.js.map +0 -1
  1576. package/dist/client/extensions/agent-native-extension-runtime.d.ts +0 -69
  1577. package/dist/client/extensions/agent-native-extension-runtime.d.ts.map +0 -1
  1578. package/dist/client/extensions/agent-native-extension-runtime.js +0 -348
  1579. package/dist/client/extensions/agent-native-extension-runtime.js.map +0 -1
  1580. package/dist/client/settings/BackgroundAgentSection.d.ts +0 -2
  1581. package/dist/client/settings/BackgroundAgentSection.d.ts.map +0 -1
  1582. package/dist/client/settings/BackgroundAgentSection.js +0 -68
  1583. package/dist/client/settings/BackgroundAgentSection.js.map +0 -1
  1584. package/dist/client/settings/BrowserSection.d.ts +0 -2
  1585. package/dist/client/settings/BrowserSection.d.ts.map +0 -1
  1586. package/dist/client/settings/BrowserSection.js +0 -40
  1587. package/dist/client/settings/BrowserSection.js.map +0 -1
  1588. package/dist/templates/chat/.react-router/types/+server-build.d.ts +0 -18
  1589. package/dist/templates/chat/.react-router/types/app/+types/root.ts +0 -68
  1590. package/src/client/components/MissingKeyCard.tsx +0 -61
  1591. package/src/client/extensions/agent-native-extension-runtime.ts +0 -495
  1592. package/src/client/settings/BackgroundAgentSection.tsx +0 -193
  1593. package/src/client/settings/BrowserSection.tsx +0 -110
  1594. package/src/templates/chat/.react-router/types/+server-build.d.ts +0 -18
  1595. package/src/templates/chat/.react-router/types/app/+types/root.ts +0 -68
@@ -0,0 +1,1810 @@
1
+ import { accessFilter, assertAccess } from "@agent-native/core/sharing";
2
+ import { and, asc, eq, gt, inArray, isNull, like, or } from "drizzle-orm";
3
+
4
+ import {
5
+ ATTRIBUTE_TYPE_SPECS,
6
+ legacyValueTypeFor,
7
+ type CrmAttributeType,
8
+ } from "../../shared/crm-attributes.js";
9
+ import type {
10
+ CrmAccessScope,
11
+ CrmAdapter,
12
+ CrmAdapterCapabilities,
13
+ CrmConnectionRef,
14
+ CrmFieldDefinition,
15
+ CrmMutation,
16
+ CrmMutationResult,
17
+ CrmObjectDefinition,
18
+ CrmObjectKind,
19
+ CrmRecord,
20
+ CrmRecordRef,
21
+ CrmRelationship,
22
+ CrmSyncScope,
23
+ CrmSyncPage,
24
+ CrmValue,
25
+ } from "../../shared/crm-contract.js";
26
+ import { getDb, schema } from "../db/index.js";
27
+ import {
28
+ isBoundedCrmValue,
29
+ isSafeCrmMutationFieldName,
30
+ } from "./crm-field-firewall.js";
31
+ import { crmAttributeColumnsFor } from "./field-policy-attributes.js";
32
+
33
+ const MAX_PAGE_SIZE = 100;
34
+ const MAX_FIELDS = 80;
35
+ const MAX_MUTATION_FIELDS = 20;
36
+ const STANDARD_OBJECTS = ["accounts", "people", "opportunities"] as const;
37
+
38
+ type Ownership = {
39
+ ownerEmail: string;
40
+ orgId: string | null;
41
+ visibility: "private" | "org" | "public";
42
+ };
43
+
44
+ type NativeConnection = Ownership & {
45
+ id: string;
46
+ accountId: string | null;
47
+ accessScopeKey: string;
48
+ accessScopeJson: string;
49
+ };
50
+
51
+ type StoredField = {
52
+ fieldName: string;
53
+ valueType: string;
54
+ stringValue: string | null;
55
+ numberValue: number | null;
56
+ booleanValue: boolean | null;
57
+ jsonValue: string | null;
58
+ };
59
+
60
+ function kindForObject(objectType: string): CrmObjectKind {
61
+ if (objectType === "accounts") return "account";
62
+ if (objectType === "people") return "person";
63
+ if (objectType === "opportunities") return "opportunity";
64
+ return "custom";
65
+ }
66
+
67
+ function labelForObject(objectType: string): string {
68
+ if (objectType === "accounts") return "Account";
69
+ if (objectType === "people") return "Person";
70
+ if (objectType === "opportunities") return "Opportunity";
71
+ return objectType
72
+ .replace(/[_-]+/g, " ")
73
+ .replace(/\b\w/g, (character) => character.toUpperCase());
74
+ }
75
+
76
+ /** Default managed options seeded for the native opportunities `stage`
77
+ * attribute — see `server/lib/record-fields.ts`: a status write against an
78
+ * attribute with no options is a 422, not a silent auto-create. Kept separate
79
+ * from `create-crm-list.ts`'s `DEFAULT_STAGE_OPTIONS` (a list's workflow
80
+ * stage is a different vocabulary from an opportunity's sales stage, even
81
+ * though today's starter values happen to read the same). */
82
+ export const DEFAULT_OPPORTUNITY_STAGE_OPTIONS: NonNullable<
83
+ CrmFieldDefinition["options"]
84
+ > = [
85
+ { value: "new", label: "New" },
86
+ { value: "in-progress", label: "In Progress" },
87
+ { value: "won", label: "Won" },
88
+ { value: "lost", label: "Lost" },
89
+ ];
90
+
91
+ function nativeField(
92
+ name: string,
93
+ attributeType: CrmAttributeType,
94
+ options: {
95
+ required?: boolean;
96
+ multi?: boolean;
97
+ config?: Record<string, unknown>;
98
+ fieldOptions?: CrmFieldDefinition["options"];
99
+ } = {},
100
+ ): CrmFieldDefinition {
101
+ const multi = options.multi ?? false;
102
+ return {
103
+ name,
104
+ label: name
105
+ .replace(/([A-Z])/g, " $1")
106
+ .replace(/^./, (character) => character.toUpperCase()),
107
+ // Derived, not hand-kept in sync: the legacy column exists only for
108
+ // pre-typed read paths that still branch on it.
109
+ valueType: legacyValueTypeFor(attributeType, multi),
110
+ attributeType,
111
+ ...(multi ? { multi } : {}),
112
+ ...(options.config ? { config: options.config } : {}),
113
+ ...(options.fieldOptions ? { options: options.fieldOptions } : {}),
114
+ storagePolicy: "local-authoritative",
115
+ sensitive: false,
116
+ readable: true,
117
+ createable: true,
118
+ updateable: true,
119
+ required: options.required ?? false,
120
+ };
121
+ }
122
+
123
+ export function nativeObjectTemplate(objectType: string): CrmObjectDefinition {
124
+ const objectFields =
125
+ objectType === "accounts"
126
+ ? [
127
+ nativeField("name", "text", { required: true }),
128
+ nativeField("domain", "domain"),
129
+ nativeField("industry", "text"),
130
+ nativeField("ownerName", "text"),
131
+ ]
132
+ : objectType === "people"
133
+ ? [
134
+ nativeField("firstName", "text"),
135
+ nativeField("lastName", "text"),
136
+ nativeField("email", "email-address"),
137
+ nativeField("title", "text"),
138
+ nativeField("accountId", "record-reference"),
139
+ nativeField("ownerName", "text"),
140
+ ]
141
+ : objectType === "opportunities"
142
+ ? [
143
+ nativeField("name", "text", { required: true }),
144
+ nativeField("amount", "currency", {
145
+ config: { currency: { code: "USD" } },
146
+ }),
147
+ nativeField("stage", "status", {
148
+ fieldOptions: DEFAULT_OPPORTUNITY_STAGE_OPTIONS,
149
+ }),
150
+ nativeField("closeDate", "date"),
151
+ nativeField("accountId", "record-reference"),
152
+ nativeField("ownerName", "text"),
153
+ ]
154
+ : [];
155
+ const fields = objectFields.length
156
+ ? [
157
+ ...objectFields,
158
+ nativeField("desiredCadenceDays", "number"),
159
+ nativeField("lastMeaningfulInteractionAt", "timestamp"),
160
+ nativeField("nextContactAt", "timestamp"),
161
+ ]
162
+ : [];
163
+ const label = labelForObject(objectType);
164
+ return {
165
+ connectionId: "",
166
+ provider: "native",
167
+ objectType,
168
+ kind: kindForObject(objectType),
169
+ label,
170
+ pluralLabel: `${label}s`,
171
+ custom: !STANDARD_OBJECTS.includes(
172
+ objectType as (typeof STANDARD_OBJECTS)[number],
173
+ ),
174
+ queryable: true,
175
+ searchable: true,
176
+ createable: true,
177
+ updateable: true,
178
+ deleteable: true,
179
+ fields,
180
+ };
181
+ }
182
+
183
+ function valueType(value: CrmValue): CrmFieldDefinition["valueType"] {
184
+ if (typeof value === "boolean") return "boolean";
185
+ if (typeof value === "number") return "number";
186
+ if (Array.isArray(value) || typeof value === "object") return "json";
187
+ return "string";
188
+ }
189
+
190
+ /**
191
+ * Best-effort attribute type for a field a mutation introduces that the
192
+ * object template does not already declare (an ad hoc custom field). A
193
+ * template-declared field always wins over this inference — see the merge
194
+ * order in `ensureNativeObject`.
195
+ */
196
+ function attributeTypeForValue(value: CrmValue): CrmAttributeType {
197
+ if (typeof value === "boolean") return "checkbox";
198
+ if (typeof value === "number") return "number";
199
+ if (Array.isArray(value) || (typeof value === "object" && value !== null))
200
+ return "location";
201
+ return "text";
202
+ }
203
+
204
+ function fieldColumns(value: CrmValue) {
205
+ if (typeof value === "string") {
206
+ return {
207
+ stringValue: value,
208
+ numberValue: null,
209
+ booleanValue: null,
210
+ jsonValue: null,
211
+ };
212
+ }
213
+ if (typeof value === "number") {
214
+ return {
215
+ stringValue: null,
216
+ numberValue: value,
217
+ booleanValue: null,
218
+ jsonValue: null,
219
+ };
220
+ }
221
+ if (typeof value === "boolean") {
222
+ return {
223
+ stringValue: null,
224
+ numberValue: null,
225
+ booleanValue: value,
226
+ jsonValue: null,
227
+ };
228
+ }
229
+ if (value === null) {
230
+ return {
231
+ stringValue: null,
232
+ numberValue: null,
233
+ booleanValue: null,
234
+ jsonValue: null,
235
+ };
236
+ }
237
+ return {
238
+ stringValue: null,
239
+ numberValue: null,
240
+ booleanValue: null,
241
+ jsonValue: JSON.stringify(value),
242
+ };
243
+ }
244
+
245
+ function fieldValue(field: StoredField): CrmValue {
246
+ if (field.stringValue !== null) return field.stringValue;
247
+ if (field.numberValue !== null) return field.numberValue;
248
+ if (field.booleanValue !== null) return field.booleanValue;
249
+ if (!field.jsonValue) return null;
250
+ try {
251
+ const value = JSON.parse(field.jsonValue) as unknown;
252
+ return isBoundedCrmValue(value) ? (value as CrmValue) : null;
253
+ } catch {
254
+ return null;
255
+ }
256
+ }
257
+
258
+ function encodeCursor(offset: number): string {
259
+ return btoa(String(offset)).replace(/=+$/, "");
260
+ }
261
+
262
+ function decodeCursor(cursor: string | undefined): number {
263
+ if (!cursor) return 0;
264
+ try {
265
+ const value = Number.parseInt(atob(cursor), 10);
266
+ return Number.isSafeInteger(value) && value >= 0 ? value : 0;
267
+ } catch {
268
+ return 0;
269
+ }
270
+ }
271
+
272
+ export function nextNativeRevision(value: string | null | undefined): string {
273
+ try {
274
+ const parsed = BigInt(value ?? "0");
275
+ return (parsed >= 0n ? parsed + 1n : 1n).toString();
276
+ } catch {
277
+ return "1";
278
+ }
279
+ }
280
+
281
+ function scopeFromConnection(connection: NativeConnection): CrmAccessScope {
282
+ try {
283
+ const stored = JSON.parse(
284
+ connection.accessScopeJson,
285
+ ) as Partial<CrmAccessScope>;
286
+ if (stored.mode === "native" && stored.key === connection.accessScopeKey) {
287
+ return {
288
+ key: stored.key,
289
+ actorId: stored.actorId ?? connection.ownerEmail,
290
+ mode: "native",
291
+ objectReadable: true,
292
+ objectCreateable: true,
293
+ objectUpdateable: true,
294
+ objectDeleteable: true,
295
+ recordVisibility:
296
+ stored.recordVisibility ??
297
+ (connection.visibility === "org" ? "workspace" : "actor"),
298
+ ...(stored.fieldPermissionsHash
299
+ ? { fieldPermissionsHash: stored.fieldPermissionsHash }
300
+ : {}),
301
+ ...(stored.sharingFingerprint
302
+ ? { sharingFingerprint: stored.sharingFingerprint }
303
+ : {}),
304
+ };
305
+ }
306
+ } catch {}
307
+ return {
308
+ key: connection.accessScopeKey,
309
+ actorId: connection.ownerEmail,
310
+ mode: "native",
311
+ objectReadable: true,
312
+ objectCreateable: true,
313
+ objectUpdateable: true,
314
+ objectDeleteable: true,
315
+ recordVisibility: connection.visibility === "org" ? "workspace" : "actor",
316
+ };
317
+ }
318
+
319
+ function json(value: unknown, maximum = 12_000): string {
320
+ const encoded = JSON.stringify(value);
321
+ if (encoded.length > maximum)
322
+ throw new Error("CRM mutation payload exceeds the allowed size.");
323
+ return encoded;
324
+ }
325
+
326
+ function mutationFields(mutation: CrmMutation): Record<string, CrmValue> {
327
+ const fields = mutation.fields ?? {};
328
+ const entries = Object.entries(fields);
329
+ if (
330
+ entries.length > MAX_MUTATION_FIELDS ||
331
+ entries.some(
332
+ ([name, value]) =>
333
+ !name ||
334
+ name.length > 120 ||
335
+ !isSafeCrmMutationFieldName(name) ||
336
+ !isBoundedCrmValue(value),
337
+ )
338
+ ) {
339
+ throw new Error(
340
+ "Native CRM mutations require bounded, non-media field values.",
341
+ );
342
+ }
343
+ return fields;
344
+ }
345
+
346
+ function summaryColumns(fields: Record<string, CrmValue>, fallback: string) {
347
+ const string = (...names: string[]) => {
348
+ for (const name of names) {
349
+ const value = fields[name];
350
+ if (typeof value === "string") return value.slice(0, 500);
351
+ }
352
+ return null;
353
+ };
354
+ const number = (...names: string[]) => {
355
+ for (const name of names) {
356
+ const value = fields[name];
357
+ if (typeof value === "number") return value;
358
+ }
359
+ return null;
360
+ };
361
+ const desiredCadenceDays = fields.desiredCadenceDays;
362
+ if (
363
+ desiredCadenceDays !== undefined &&
364
+ desiredCadenceDays !== null &&
365
+ (typeof desiredCadenceDays !== "number" ||
366
+ !Number.isInteger(desiredCadenceDays) ||
367
+ desiredCadenceDays < 1 ||
368
+ desiredCadenceDays > 365)
369
+ ) {
370
+ throw new Error(
371
+ "desiredCadenceDays must be null or an integer from 1 to 365.",
372
+ );
373
+ }
374
+ return {
375
+ displayName: string("displayName", "name", "Name") ?? fallback,
376
+ primaryEmail: string("email", "Email"),
377
+ domain: string("domain", "website", "Website"),
378
+ stage: string("stage", "StageName"),
379
+ ownerName: string("ownerName"),
380
+ amount: number("amount", "Amount"),
381
+ closeDate: string("closeDate", "CloseDate"),
382
+ desiredCadenceDays: desiredCadenceDays ?? null,
383
+ lastMeaningfulInteractionAt: string("lastMeaningfulInteractionAt"),
384
+ nextContactAt: string("nextContactAt"),
385
+ };
386
+ }
387
+
388
+ async function loadNativeConnection(
389
+ connectionId: string,
390
+ accessTier: "viewer" | "editor" = "viewer",
391
+ ): Promise<NativeConnection> {
392
+ await assertAccess("crm-connection", connectionId, accessTier);
393
+ const db = getDb();
394
+ const [connection] = await db
395
+ .select({
396
+ id: schema.crmConnections.id,
397
+ accountId: schema.crmConnections.accountId,
398
+ accessScopeKey: schema.crmConnections.accessScopeKey,
399
+ accessScopeJson: schema.crmConnections.accessScopeJson,
400
+ ownerEmail: schema.crmConnections.ownerEmail,
401
+ orgId: schema.crmConnections.orgId,
402
+ visibility: schema.crmConnections.visibility,
403
+ })
404
+ .from(schema.crmConnections)
405
+ .where(
406
+ and(
407
+ eq(schema.crmConnections.id, connectionId),
408
+ eq(schema.crmConnections.provider, "native"),
409
+ accessFilter(
410
+ schema.crmConnections,
411
+ schema.crmConnectionShares,
412
+ undefined,
413
+ accessTier,
414
+ ),
415
+ ),
416
+ )
417
+ .limit(1);
418
+ if (!connection) throw new Error("Native CRM connection is unavailable.");
419
+ return connection as NativeConnection;
420
+ }
421
+
422
+ async function ensureNativeObject(input: {
423
+ connection: NativeConnection;
424
+ objectType: string;
425
+ fields: CrmFieldDefinition[];
426
+ }) {
427
+ const db = getDb();
428
+ const template = nativeObjectTemplate(input.objectType);
429
+ const object = { ...template, connectionId: input.connection.id };
430
+ const [existing] = await db
431
+ .select({ id: schema.crmObjects.id })
432
+ .from(schema.crmObjects)
433
+ .where(
434
+ and(
435
+ eq(schema.crmObjects.connectionId, input.connection.id),
436
+ eq(schema.crmObjects.objectType, input.objectType),
437
+ accessFilter(schema.crmObjects, schema.crmObjectShares),
438
+ ),
439
+ )
440
+ .limit(1);
441
+ const now = new Date().toISOString();
442
+ const objectValues = {
443
+ provider: "native" as const,
444
+ objectType: input.objectType,
445
+ kind: object.kind,
446
+ label: object.label,
447
+ pluralLabel: object.pluralLabel,
448
+ custom: object.custom,
449
+ queryable: true,
450
+ searchable: true,
451
+ createable: true,
452
+ updateable: true,
453
+ deleteable: true,
454
+ capabilitiesJson: json(NATIVE_CAPABILITIES, 4_000),
455
+ updatedAt: now,
456
+ };
457
+ if (existing) {
458
+ await assertAccess("crm-object", existing.id, "editor");
459
+ await db
460
+ .update(schema.crmObjects)
461
+ .set(objectValues)
462
+ .where(
463
+ and(
464
+ eq(schema.crmObjects.id, existing.id),
465
+ accessFilter(
466
+ schema.crmObjects,
467
+ schema.crmObjectShares,
468
+ undefined,
469
+ "editor",
470
+ ),
471
+ ),
472
+ );
473
+ } else {
474
+ await db.insert(schema.crmObjects).values({
475
+ id: crypto.randomUUID(),
476
+ connectionId: input.connection.id,
477
+ ...objectValues,
478
+ ownerEmail: input.connection.ownerEmail,
479
+ orgId: input.connection.orgId,
480
+ visibility: input.connection.visibility,
481
+ createdAt: now,
482
+ });
483
+ }
484
+ // `input.fields` is rebuilt from the raw values of every mutation — including
485
+ // template fields, since a create/update passes its whole `fields` payload
486
+ // through. Template definitions go LAST so their genuine types (currency,
487
+ // status, …) always win; putting them first would let every write silently
488
+ // downgrade the field back to the value-shape guess in `attributeTypeForValue`.
489
+ const known = new Map<string, CrmFieldDefinition>();
490
+ for (const field of [...input.fields, ...template.fields])
491
+ known.set(field.name, field);
492
+ const existingPolicies = await db
493
+ .select({
494
+ id: schema.crmFieldPolicies.id,
495
+ fieldName: schema.crmFieldPolicies.fieldName,
496
+ })
497
+ .from(schema.crmFieldPolicies)
498
+ .where(
499
+ and(
500
+ eq(schema.crmFieldPolicies.connectionId, input.connection.id),
501
+ eq(schema.crmFieldPolicies.objectType, input.objectType),
502
+ accessFilter(schema.crmFieldPolicies, schema.crmFieldPolicyShares),
503
+ ),
504
+ );
505
+ const policyByName = new Map(
506
+ existingPolicies.map((policy) => [policy.fieldName, policy]),
507
+ );
508
+ for (const field of known.values()) {
509
+ const existingPolicy = policyByName.get(field.name);
510
+ const attributeColumns = crmAttributeColumnsFor(
511
+ field,
512
+ "local-authoritative",
513
+ );
514
+ const values = {
515
+ label: field.label,
516
+ valueType: field.valueType,
517
+ storagePolicy: "local-authoritative" as const,
518
+ sensitive: false,
519
+ readable: true,
520
+ createable: true,
521
+ updateable: true,
522
+ required: field.required,
523
+ metadataJson: "{}",
524
+ ...attributeColumns,
525
+ updatedAt: now,
526
+ };
527
+ if (existingPolicy) {
528
+ await assertAccess("crm-field-policy", existingPolicy.id, "editor");
529
+ await db
530
+ .update(schema.crmFieldPolicies)
531
+ .set(values)
532
+ .where(
533
+ and(
534
+ eq(schema.crmFieldPolicies.id, existingPolicy.id),
535
+ accessFilter(
536
+ schema.crmFieldPolicies,
537
+ schema.crmFieldPolicyShares,
538
+ undefined,
539
+ "editor",
540
+ ),
541
+ ),
542
+ );
543
+ continue;
544
+ }
545
+ const policyId = crypto.randomUUID();
546
+ await db.insert(schema.crmFieldPolicies).values({
547
+ id: policyId,
548
+ connectionId: input.connection.id,
549
+ objectType: input.objectType,
550
+ fieldName: field.name,
551
+ ...values,
552
+ ownerEmail: input.connection.ownerEmail,
553
+ orgId: input.connection.orgId,
554
+ visibility: input.connection.visibility,
555
+ createdAt: now,
556
+ });
557
+ // Seeded only at creation: a status field needs at least one managed
558
+ // option before any write to it (see `assertKnownOptions` in
559
+ // `server/lib/record-fields.ts`), and re-checking on every later mutation
560
+ // would cost a query per status field per write for no benefit — the
561
+ // backfill migration handles pre-existing rows this never ran for.
562
+ if (
563
+ ATTRIBUTE_TYPE_SPECS[attributeColumns.attributeType].usesOptions &&
564
+ field.options?.length
565
+ ) {
566
+ await db.insert(schema.crmAttributeOptions).values(
567
+ field.options.map((option, index) => ({
568
+ id: crypto.randomUUID(),
569
+ attributeId: policyId,
570
+ value: option.value,
571
+ title: option.label,
572
+ position: index,
573
+ archived: false,
574
+ celebrate: false,
575
+ ownerEmail: input.connection.ownerEmail,
576
+ orgId: input.connection.orgId,
577
+ visibility: input.connection.visibility,
578
+ createdAt: now,
579
+ updatedAt: now,
580
+ })),
581
+ );
582
+ }
583
+ }
584
+ }
585
+
586
+ export async function initializeNativeCrmDomain(connectionId: string) {
587
+ const connection = await loadNativeConnection(connectionId, "editor");
588
+ await Promise.all(
589
+ STANDARD_OBJECTS.map((objectType) =>
590
+ ensureNativeObject({ connection, objectType, fields: [] }),
591
+ ),
592
+ );
593
+ }
594
+
595
+ export async function configureNativeCrmConnection(input: {
596
+ label?: string;
597
+ ownership: Ownership;
598
+ }) {
599
+ const db = getDb();
600
+ const label = input.label?.trim() || "Native SQL";
601
+ const [existing] = await db
602
+ .select({ id: schema.crmConnections.id })
603
+ .from(schema.crmConnections)
604
+ .where(
605
+ and(
606
+ eq(schema.crmConnections.provider, "native"),
607
+ eq(schema.crmConnections.label, label),
608
+ accessFilter(schema.crmConnections, schema.crmConnectionShares),
609
+ ),
610
+ )
611
+ .limit(1);
612
+ const id = existing?.id ?? crypto.randomUUID();
613
+ const now = new Date().toISOString();
614
+ const accessScope: CrmAccessScope = {
615
+ key: `native:${id}`,
616
+ actorId: input.ownership.ownerEmail,
617
+ mode: "native",
618
+ objectReadable: true,
619
+ objectCreateable: true,
620
+ objectUpdateable: true,
621
+ objectDeleteable: true,
622
+ recordVisibility:
623
+ input.ownership.visibility === "org" ? "workspace" : "actor",
624
+ };
625
+ const values = {
626
+ provider: "native" as const,
627
+ workspaceConnectionId: null,
628
+ label,
629
+ accountId: null,
630
+ mode: "native" as const,
631
+ status: "connected" as const,
632
+ selectedPipelinesJson: "[]",
633
+ selectedObjectTypesJson: json(STANDARD_OBJECTS, 1_000),
634
+ accessScopeKey: accessScope.key,
635
+ accessScopeJson: json(accessScope, 4_000),
636
+ lastError: null,
637
+ updatedAt: now,
638
+ };
639
+ if (existing) {
640
+ await assertAccess("crm-connection", existing.id, "editor");
641
+ await db
642
+ .update(schema.crmConnections)
643
+ .set(values)
644
+ .where(
645
+ and(
646
+ eq(schema.crmConnections.id, existing.id),
647
+ accessFilter(
648
+ schema.crmConnections,
649
+ schema.crmConnectionShares,
650
+ undefined,
651
+ "editor",
652
+ ),
653
+ ),
654
+ );
655
+ } else {
656
+ await db.insert(schema.crmConnections).values({
657
+ id,
658
+ ...values,
659
+ ownerEmail: input.ownership.ownerEmail,
660
+ orgId: input.ownership.orgId,
661
+ visibility: input.ownership.visibility,
662
+ createdAt: now,
663
+ });
664
+ }
665
+ await initializeNativeCrmDomain(id);
666
+ return { id, label, accessScope, ...input.ownership };
667
+ }
668
+
669
+ export async function resolveNativeCrmAccessScope(input: {
670
+ connectionId: string;
671
+ objectType: string;
672
+ }): Promise<CrmAccessScope | null> {
673
+ const connection = await loadNativeConnection(input.connectionId);
674
+ const db = getDb();
675
+ const [object] = await db
676
+ .select({ id: schema.crmObjects.id })
677
+ .from(schema.crmObjects)
678
+ .where(
679
+ and(
680
+ eq(schema.crmObjects.connectionId, connection.id),
681
+ eq(schema.crmObjects.objectType, input.objectType),
682
+ accessFilter(schema.crmObjects, schema.crmObjectShares),
683
+ ),
684
+ )
685
+ .limit(1);
686
+ return object ? scopeFromConnection(connection) : null;
687
+ }
688
+
689
+ async function fieldsForRecord(recordId: string, requested?: string[]) {
690
+ const db = getDb();
691
+ const rows = await db
692
+ .select({
693
+ fieldName: schema.crmRecordFields.fieldName,
694
+ valueType: schema.crmRecordFields.valueType,
695
+ stringValue: schema.crmRecordFields.stringValue,
696
+ numberValue: schema.crmRecordFields.numberValue,
697
+ booleanValue: schema.crmRecordFields.booleanValue,
698
+ jsonValue: schema.crmRecordFields.jsonValue,
699
+ })
700
+ .from(schema.crmRecordFields)
701
+ .where(
702
+ and(
703
+ eq(schema.crmRecordFields.recordId, recordId),
704
+ eq(schema.crmRecordFields.storagePolicy, "local-authoritative"),
705
+ accessFilter(schema.crmRecordFields, schema.crmRecordFieldShares),
706
+ ),
707
+ );
708
+ const allowed = requested?.length ? new Set(requested) : null;
709
+ return Object.fromEntries(
710
+ rows
711
+ .filter((field) => !allowed || allowed.has(field.fieldName))
712
+ .map((field) => [field.fieldName, fieldValue(field as StoredField)]),
713
+ ) as Record<string, CrmValue>;
714
+ }
715
+
716
+ async function materializeRecord(input: {
717
+ row: typeof schema.crmRecords.$inferSelect;
718
+ connection: NativeConnection;
719
+ fields?: string[];
720
+ }): Promise<CrmRecord> {
721
+ const fields = await fieldsForRecord(input.row.id, input.fields);
722
+ const scope = scopeFromConnection(input.connection);
723
+ const observedAt = input.row.updatedAt;
724
+ return {
725
+ ref: {
726
+ connectionId: input.connection.id,
727
+ provider: "native",
728
+ accountId: input.connection.accountId ?? undefined,
729
+ actorId: scope.actorId,
730
+ objectType: input.row.objectType,
731
+ kind: input.row.kind as CrmObjectKind,
732
+ remoteId: input.row.remoteId,
733
+ localId: input.row.id,
734
+ },
735
+ displayName: input.row.displayName,
736
+ fields,
737
+ remoteRevision: input.row.remoteRevision ?? undefined,
738
+ remoteUpdatedAt: input.row.remoteUpdatedAt ?? undefined,
739
+ deleted: input.row.tombstone,
740
+ accessScope: scope,
741
+ provenance: Object.keys(fields).map((fieldName) => ({
742
+ provider: "native",
743
+ connectionId: input.connection.id,
744
+ objectType: input.row.objectType,
745
+ remoteId: input.row.remoteId,
746
+ fieldName,
747
+ remoteRevision: input.row.remoteRevision ?? undefined,
748
+ observedAt,
749
+ })),
750
+ };
751
+ }
752
+
753
+ const NATIVE_CAPABILITIES: CrmAdapterCapabilities = {
754
+ schemaDiscovery: true,
755
+ customObjects: true,
756
+ search: true,
757
+ incrementalSync: true,
758
+ deletedRecordSync: true,
759
+ conditionalMutations: true,
760
+ labeledRelationships: true,
761
+ perFieldPermissions: true,
762
+ perRecordPermissions: true,
763
+ };
764
+
765
+ export class NativeCrmAdapter implements CrmAdapter {
766
+ readonly capabilities = NATIVE_CAPABILITIES;
767
+ readonly connection: CrmConnectionRef;
768
+ readonly #nativeConnection: NativeConnection;
769
+ readonly #initiatedBy: "human" | "agent" | "automation";
770
+
771
+ constructor(
772
+ connection: NativeConnection,
773
+ initiatedBy: "human" | "agent" | "automation" = "agent",
774
+ ) {
775
+ this.#nativeConnection = connection;
776
+ this.#initiatedBy = initiatedBy;
777
+ const scope = scopeFromConnection(connection);
778
+ this.connection = {
779
+ connectionId: connection.id,
780
+ provider: "native",
781
+ ...(connection.accountId ? { accountId: connection.accountId } : {}),
782
+ ...(scope.actorId ? { actorId: scope.actorId } : {}),
783
+ };
784
+ }
785
+
786
+ getAccessScope(): CrmAccessScope {
787
+ return scopeFromConnection(this.#nativeConnection);
788
+ }
789
+
790
+ async discoverObjects(): Promise<CrmObjectDefinition[]> {
791
+ const db = getDb();
792
+ const objects = await db
793
+ .select()
794
+ .from(schema.crmObjects)
795
+ .where(
796
+ and(
797
+ eq(schema.crmObjects.connectionId, this.connection.connectionId),
798
+ eq(schema.crmObjects.provider, "native"),
799
+ accessFilter(schema.crmObjects, schema.crmObjectShares),
800
+ ),
801
+ )
802
+ .orderBy(asc(schema.crmObjects.objectType));
803
+ return Promise.all(
804
+ objects.map((object) => this.describeObject(object.objectType)),
805
+ );
806
+ }
807
+
808
+ async describeObject(objectType: string): Promise<CrmObjectDefinition> {
809
+ const db = getDb();
810
+ const [object] = await db
811
+ .select()
812
+ .from(schema.crmObjects)
813
+ .where(
814
+ and(
815
+ eq(schema.crmObjects.connectionId, this.connection.connectionId),
816
+ eq(schema.crmObjects.objectType, objectType),
817
+ accessFilter(schema.crmObjects, schema.crmObjectShares),
818
+ ),
819
+ )
820
+ .limit(1);
821
+ if (!object)
822
+ throw new Error(`Native CRM object ${objectType} is not registered.`);
823
+ const policies = await db
824
+ .select()
825
+ .from(schema.crmFieldPolicies)
826
+ .where(
827
+ and(
828
+ eq(
829
+ schema.crmFieldPolicies.connectionId,
830
+ this.connection.connectionId,
831
+ ),
832
+ eq(schema.crmFieldPolicies.objectType, objectType),
833
+ accessFilter(schema.crmFieldPolicies, schema.crmFieldPolicyShares),
834
+ ),
835
+ )
836
+ .orderBy(asc(schema.crmFieldPolicies.fieldName));
837
+ return {
838
+ ...this.connection,
839
+ objectType,
840
+ kind: object.kind as CrmObjectKind,
841
+ label: object.label,
842
+ pluralLabel: object.pluralLabel,
843
+ custom: object.custom,
844
+ queryable: object.queryable,
845
+ searchable: object.searchable,
846
+ createable: object.createable,
847
+ updateable: object.updateable,
848
+ deleteable: object.deleteable,
849
+ fields: policies.map((policy) => ({
850
+ name: policy.fieldName,
851
+ label: policy.label,
852
+ valueType: policy.valueType as CrmFieldDefinition["valueType"],
853
+ storagePolicy: "local-authoritative",
854
+ sensitive: policy.sensitive,
855
+ readable: policy.readable,
856
+ createable: policy.createable,
857
+ updateable: policy.updateable,
858
+ required: policy.required,
859
+ })),
860
+ };
861
+ }
862
+
863
+ async syncPage(input: {
864
+ scope: CrmSyncScope;
865
+ fieldAllowList: string[];
866
+ cursor?: string;
867
+ limit: number;
868
+ }): Promise<CrmSyncPage> {
869
+ const db = getDb();
870
+ const limit = Math.min(Math.max(input.limit, 1), MAX_PAGE_SIZE);
871
+ const offset = decodeCursor(input.cursor);
872
+ const conditions = [
873
+ eq(schema.crmRecords.connectionId, this.connection.connectionId),
874
+ eq(schema.crmRecords.provider, "native"),
875
+ eq(schema.crmRecords.objectType, input.scope.objectType),
876
+ accessFilter(schema.crmRecords, schema.crmRecordShares),
877
+ ];
878
+ if (!input.scope.includeDeleted)
879
+ conditions.push(eq(schema.crmRecords.tombstone, false));
880
+ if (input.scope.recordIds?.length)
881
+ conditions.push(
882
+ inArray(schema.crmRecords.remoteId, input.scope.recordIds),
883
+ );
884
+ if (input.scope.ownerIds?.length)
885
+ conditions.push(
886
+ inArray(schema.crmRecords.ownerRemoteId, input.scope.ownerIds),
887
+ );
888
+ if (input.scope.pipelineIds?.length)
889
+ conditions.push(
890
+ inArray(schema.crmRecords.pipelineId, input.scope.pipelineIds),
891
+ );
892
+ if (input.scope.updatedAfter)
893
+ conditions.push(
894
+ gt(schema.crmRecords.updatedAt, input.scope.updatedAfter),
895
+ );
896
+ if (input.scope.associatedRecordIds?.length) {
897
+ throw new Error(
898
+ "Native CRM sync does not infer associated-record cohorts; use explicit recordIds.",
899
+ );
900
+ }
901
+ const rows = await db
902
+ .select()
903
+ .from(schema.crmRecords)
904
+ .where(and(...conditions))
905
+ .orderBy(asc(schema.crmRecords.updatedAt), asc(schema.crmRecords.id))
906
+ .limit(limit + 1)
907
+ .offset(offset);
908
+ const page = rows.slice(0, limit);
909
+ return {
910
+ records: await Promise.all(
911
+ page.map((row) =>
912
+ materializeRecord({
913
+ row,
914
+ connection: this.#nativeConnection,
915
+ fields: input.fieldAllowList.slice(0, MAX_FIELDS),
916
+ }),
917
+ ),
918
+ ),
919
+ relationships: [],
920
+ ...(rows.length > limit
921
+ ? { nextCursor: encodeCursor(offset + limit) }
922
+ : {}),
923
+ complete: rows.length <= limit,
924
+ };
925
+ }
926
+
927
+ async getRecord(input: {
928
+ record: CrmRecordRef;
929
+ fields: string[];
930
+ }): Promise<CrmRecord | null> {
931
+ const db = getDb();
932
+ const conditions = [
933
+ eq(schema.crmRecords.connectionId, this.connection.connectionId),
934
+ eq(schema.crmRecords.provider, "native"),
935
+ eq(schema.crmRecords.objectType, input.record.objectType),
936
+ eq(schema.crmRecords.remoteId, input.record.remoteId),
937
+ accessFilter(schema.crmRecords, schema.crmRecordShares),
938
+ ];
939
+ if (input.record.localId)
940
+ conditions.push(eq(schema.crmRecords.id, input.record.localId));
941
+ const [row] = await db
942
+ .select()
943
+ .from(schema.crmRecords)
944
+ .where(and(...conditions))
945
+ .limit(1);
946
+ return row
947
+ ? materializeRecord({
948
+ row,
949
+ connection: this.#nativeConnection,
950
+ fields: input.fields.slice(0, MAX_FIELDS),
951
+ })
952
+ : null;
953
+ }
954
+
955
+ async search(input: {
956
+ objectTypes: string[];
957
+ query: string;
958
+ fields: string[];
959
+ limit: number;
960
+ cursor?: string;
961
+ }): Promise<CrmSyncPage> {
962
+ if (!input.objectTypes.length || input.objectTypes.length > 50)
963
+ throw new Error("Native CRM search requires 1 to 50 object types.");
964
+ const db = getDb();
965
+ const limit = Math.min(Math.max(input.limit, 1), MAX_PAGE_SIZE);
966
+ const offset = decodeCursor(input.cursor);
967
+ const query = input.query.trim().slice(0, 120);
968
+ const rows = await db
969
+ .select()
970
+ .from(schema.crmRecords)
971
+ .where(
972
+ and(
973
+ eq(schema.crmRecords.connectionId, this.connection.connectionId),
974
+ eq(schema.crmRecords.provider, "native"),
975
+ eq(schema.crmRecords.tombstone, false),
976
+ inArray(schema.crmRecords.objectType, input.objectTypes),
977
+ or(
978
+ like(schema.crmRecords.displayName, `%${query}%`),
979
+ like(schema.crmRecords.primaryEmail, `%${query}%`),
980
+ like(schema.crmRecords.domain, `%${query}%`),
981
+ ),
982
+ accessFilter(schema.crmRecords, schema.crmRecordShares),
983
+ ),
984
+ )
985
+ .orderBy(asc(schema.crmRecords.displayName), asc(schema.crmRecords.id))
986
+ .limit(limit + 1)
987
+ .offset(offset);
988
+ const page = rows.slice(0, limit);
989
+ return {
990
+ records: await Promise.all(
991
+ page.map((row) =>
992
+ materializeRecord({
993
+ row,
994
+ connection: this.#nativeConnection,
995
+ fields: input.fields.slice(0, MAX_FIELDS),
996
+ }),
997
+ ),
998
+ ),
999
+ relationships: [],
1000
+ ...(rows.length > limit
1001
+ ? { nextCursor: encodeCursor(offset + limit) }
1002
+ : {}),
1003
+ complete: rows.length <= limit,
1004
+ };
1005
+ }
1006
+
1007
+ async listRelationships(input: {
1008
+ record: CrmRecordRef;
1009
+ targetObjectTypes?: string[];
1010
+ limit: number;
1011
+ cursor?: string;
1012
+ }): Promise<{
1013
+ relationships: CrmRelationship[];
1014
+ nextCursor?: string;
1015
+ complete: boolean;
1016
+ }> {
1017
+ const source = await this.getRecord({ record: input.record, fields: [] });
1018
+ if (!source?.ref.localId) return { relationships: [], complete: true };
1019
+ const db = getDb();
1020
+ const limit = Math.min(Math.max(input.limit, 1), MAX_PAGE_SIZE);
1021
+ const rows = await db
1022
+ .select()
1023
+ .from(schema.crmRelationships)
1024
+ .where(
1025
+ and(
1026
+ eq(
1027
+ schema.crmRelationships.connectionId,
1028
+ this.connection.connectionId,
1029
+ ),
1030
+ eq(schema.crmRelationships.fromRecordId, source.ref.localId),
1031
+ eq(schema.crmRelationships.tombstone, false),
1032
+ accessFilter(schema.crmRelationships, schema.crmRelationshipShares),
1033
+ ),
1034
+ )
1035
+ .orderBy(asc(schema.crmRelationships.id))
1036
+ .limit(limit + 1)
1037
+ .offset(decodeCursor(input.cursor));
1038
+ const page = rows.slice(0, limit);
1039
+ const targetIds = page.map((row) => row.toRecordId);
1040
+ if (!targetIds.length)
1041
+ return { relationships: [], complete: rows.length <= limit };
1042
+ const targets = await db
1043
+ .select()
1044
+ .from(schema.crmRecords)
1045
+ .where(
1046
+ and(
1047
+ inArray(schema.crmRecords.id, targetIds),
1048
+ eq(schema.crmRecords.connectionId, this.connection.connectionId),
1049
+ eq(schema.crmRecords.tombstone, false),
1050
+ accessFilter(schema.crmRecords, schema.crmRecordShares),
1051
+ ),
1052
+ );
1053
+ const byId = new Map(targets.map((target) => [target.id, target]));
1054
+ const relationships = page.flatMap((relationship) => {
1055
+ const target = byId.get(relationship.toRecordId);
1056
+ if (
1057
+ !target ||
1058
+ (input.targetObjectTypes?.length &&
1059
+ !input.targetObjectTypes.includes(target.objectType))
1060
+ )
1061
+ return [];
1062
+ return [
1063
+ {
1064
+ from: source.ref,
1065
+ to: {
1066
+ ...this.connection,
1067
+ objectType: target.objectType,
1068
+ kind: target.kind as CrmObjectKind,
1069
+ remoteId: target.remoteId,
1070
+ localId: target.id,
1071
+ },
1072
+ relationshipType: relationship.relationshipType,
1073
+ ...(relationship.label ? { label: relationship.label } : {}),
1074
+ ...(relationship.inverseLabel
1075
+ ? { inverseLabel: relationship.inverseLabel }
1076
+ : {}),
1077
+ ...(relationship.sourceField
1078
+ ? { sourceField: relationship.sourceField }
1079
+ : {}),
1080
+ },
1081
+ ];
1082
+ });
1083
+ const offset = decodeCursor(input.cursor);
1084
+ return {
1085
+ relationships,
1086
+ ...(rows.length > limit
1087
+ ? { nextCursor: encodeCursor(offset + limit) }
1088
+ : {}),
1089
+ complete: rows.length <= limit,
1090
+ };
1091
+ }
1092
+
1093
+ async applyMutation(mutation: CrmMutation): Promise<CrmMutationResult> {
1094
+ if (
1095
+ mutation.record.connectionId !== this.connection.connectionId ||
1096
+ mutation.record.provider !== "native"
1097
+ ) {
1098
+ return {
1099
+ status: "rejected",
1100
+ message: "Native CRM mutations must target this native connection.",
1101
+ };
1102
+ }
1103
+ if (!mutation.idempotencyKey || mutation.idempotencyKey.length > 256) {
1104
+ return {
1105
+ status: "rejected",
1106
+ message: "Native CRM mutations require a bounded idempotency key.",
1107
+ };
1108
+ }
1109
+ const fields = mutationFields(mutation);
1110
+ if (mutation.operation === "create")
1111
+ return this.createRecord(mutation, fields);
1112
+ if (mutation.operation === "update")
1113
+ return this.updateRecord(mutation, fields);
1114
+ if (mutation.operation === "delete") return this.deleteRecord(mutation);
1115
+ if (
1116
+ mutation.operation === "associate" ||
1117
+ mutation.operation === "disassociate"
1118
+ ) {
1119
+ return this.mutateRelationship(mutation);
1120
+ }
1121
+ return { status: "rejected", message: "Unsupported native CRM mutation." };
1122
+ }
1123
+
1124
+ private async replayOrStart(mutation: CrmMutation, patchJson: string) {
1125
+ const db = getDb();
1126
+ const [existing] = await db
1127
+ .select()
1128
+ .from(schema.crmMutations)
1129
+ .where(
1130
+ and(
1131
+ eq(schema.crmMutations.idempotencyKey, mutation.idempotencyKey),
1132
+ accessFilter(schema.crmMutations, schema.crmMutationShares),
1133
+ ),
1134
+ )
1135
+ .limit(1);
1136
+ if (!existing) return null;
1137
+ if (
1138
+ existing.operation !== mutation.operation ||
1139
+ existing.patchJson !== patchJson
1140
+ ) {
1141
+ throw new Error(
1142
+ "Native CRM idempotency key was already used for a different mutation.",
1143
+ );
1144
+ }
1145
+ if (existing.status === "conflict")
1146
+ return {
1147
+ status: "conflict" as const,
1148
+ message: existing.error ?? undefined,
1149
+ };
1150
+ const record = existing.recordId
1151
+ ? await this.getRecord({
1152
+ record: { ...mutation.record, localId: existing.recordId },
1153
+ fields: [],
1154
+ })
1155
+ : null;
1156
+ return {
1157
+ status: "applied" as const,
1158
+ ...(record ? { record, remoteRevision: record.remoteRevision } : {}),
1159
+ };
1160
+ }
1161
+
1162
+ private async createRecord(
1163
+ mutation: CrmMutation,
1164
+ fields: Record<string, CrmValue>,
1165
+ ): Promise<CrmMutationResult> {
1166
+ const objectType = mutation.record.objectType;
1167
+ await ensureNativeObject({
1168
+ connection: this.#nativeConnection,
1169
+ objectType,
1170
+ fields: Object.entries(fields).map(([name, value]) =>
1171
+ nativeField(name, attributeTypeForValue(value)),
1172
+ ),
1173
+ });
1174
+ const patchJson = json({ fields });
1175
+ const replay = await this.replayOrStart(mutation, patchJson);
1176
+ if (replay) return replay;
1177
+ const db = getDb();
1178
+ const remoteId = mutation.record.remoteId || crypto.randomUUID();
1179
+ const recordId = crypto.randomUUID();
1180
+ const now = new Date().toISOString();
1181
+ const revision = "1";
1182
+ try {
1183
+ await db.transaction(async (tx) => {
1184
+ const [duplicate] = await tx
1185
+ .select({ id: schema.crmRecords.id })
1186
+ .from(schema.crmRecords)
1187
+ .where(
1188
+ and(
1189
+ eq(schema.crmRecords.connectionId, this.connection.connectionId),
1190
+ eq(schema.crmRecords.objectType, objectType),
1191
+ eq(schema.crmRecords.remoteId, remoteId),
1192
+ accessFilter(schema.crmRecords, schema.crmRecordShares),
1193
+ ),
1194
+ )
1195
+ .limit(1);
1196
+ if (duplicate) throw new Error("NATIVE_CRM_DUPLICATE_RECORD");
1197
+ await tx.insert(schema.crmRecords).values({
1198
+ id: recordId,
1199
+ connectionId: this.connection.connectionId,
1200
+ provider: "native",
1201
+ objectType,
1202
+ kind: kindForObject(objectType),
1203
+ remoteId,
1204
+ ...summaryColumns(fields, remoteId),
1205
+ remoteRevision: revision,
1206
+ remoteUpdatedAt: now,
1207
+ accessScopeKey: this.getAccessScope().key,
1208
+ accessScopeJson: json(this.getAccessScope(), 4_000),
1209
+ tombstone: false,
1210
+ ownerEmail: this.#nativeConnection.ownerEmail,
1211
+ orgId: this.#nativeConnection.orgId,
1212
+ visibility: this.#nativeConnection.visibility,
1213
+ createdAt: now,
1214
+ updatedAt: now,
1215
+ });
1216
+ for (const [fieldName, value] of Object.entries(fields)) {
1217
+ await tx.insert(schema.crmRecordFields).values({
1218
+ id: crypto.randomUUID(),
1219
+ recordId,
1220
+ fieldName,
1221
+ valueType: valueType(value),
1222
+ storagePolicy: "local-authoritative",
1223
+ ...fieldColumns(value),
1224
+ provenanceJson: json(
1225
+ [
1226
+ {
1227
+ provider: "native",
1228
+ connectionId: this.connection.connectionId,
1229
+ objectType,
1230
+ remoteId,
1231
+ fieldName,
1232
+ remoteRevision: revision,
1233
+ observedAt: now,
1234
+ },
1235
+ ],
1236
+ 4_000,
1237
+ ),
1238
+ accessScopeKey: this.getAccessScope().key,
1239
+ accessScopeJson: json(this.getAccessScope(), 4_000),
1240
+ remoteRevision: revision,
1241
+ ownerEmail: this.#nativeConnection.ownerEmail,
1242
+ orgId: this.#nativeConnection.orgId,
1243
+ visibility: this.#nativeConnection.visibility,
1244
+ createdAt: now,
1245
+ updatedAt: now,
1246
+ });
1247
+ }
1248
+ await tx.insert(schema.crmMutations).values({
1249
+ id: crypto.randomUUID(),
1250
+ recordId,
1251
+ connectionId: this.connection.connectionId,
1252
+ operation: "create",
1253
+ initiatedBy: this.#initiatedBy,
1254
+ target: "local",
1255
+ policyDecision: "execute",
1256
+ risk: "routine",
1257
+ status: "applied",
1258
+ patchJson,
1259
+ beforeJson: "{}",
1260
+ afterJson: json({ remoteId, revision }),
1261
+ idempotencyKey: mutation.idempotencyKey,
1262
+ providerRemoteRevision: revision,
1263
+ appliedAt: now,
1264
+ ownerEmail: this.#nativeConnection.ownerEmail,
1265
+ orgId: this.#nativeConnection.orgId,
1266
+ visibility: this.#nativeConnection.visibility,
1267
+ createdAt: now,
1268
+ updatedAt: now,
1269
+ });
1270
+ });
1271
+ } catch (error) {
1272
+ if (
1273
+ error instanceof Error &&
1274
+ error.message === "NATIVE_CRM_DUPLICATE_RECORD"
1275
+ )
1276
+ return {
1277
+ status: "conflict",
1278
+ message: "A native CRM record with this id already exists.",
1279
+ };
1280
+ throw error;
1281
+ }
1282
+ const record = await this.getRecord({
1283
+ record: { ...mutation.record, remoteId, localId: recordId },
1284
+ fields: Object.keys(fields),
1285
+ });
1286
+ return record
1287
+ ? { status: "applied", record, remoteRevision: revision }
1288
+ : { status: "rejected", message: "Native CRM record was not persisted." };
1289
+ }
1290
+
1291
+ private async updateRecord(
1292
+ mutation: CrmMutation,
1293
+ fields: Record<string, CrmValue>,
1294
+ ): Promise<CrmMutationResult> {
1295
+ await ensureNativeObject({
1296
+ connection: this.#nativeConnection,
1297
+ objectType: mutation.record.objectType,
1298
+ fields: Object.entries(fields).map(([name, value]) =>
1299
+ nativeField(name, attributeTypeForValue(value)),
1300
+ ),
1301
+ });
1302
+ const patchJson = json({ fields });
1303
+ const replay = await this.replayOrStart(mutation, patchJson);
1304
+ if (replay) return replay;
1305
+ const db = getDb();
1306
+ const [record] = await db
1307
+ .select()
1308
+ .from(schema.crmRecords)
1309
+ .where(
1310
+ and(
1311
+ eq(schema.crmRecords.connectionId, this.connection.connectionId),
1312
+ eq(schema.crmRecords.objectType, mutation.record.objectType),
1313
+ eq(schema.crmRecords.remoteId, mutation.record.remoteId),
1314
+ accessFilter(
1315
+ schema.crmRecords,
1316
+ schema.crmRecordShares,
1317
+ undefined,
1318
+ "editor",
1319
+ ),
1320
+ ),
1321
+ )
1322
+ .limit(1);
1323
+ if (!record || record.tombstone)
1324
+ return {
1325
+ status: "rejected",
1326
+ message: "Native CRM record is unavailable.",
1327
+ };
1328
+ await assertAccess("crm-record", record.id, "editor");
1329
+ if (
1330
+ mutation.expectedRemoteRevision &&
1331
+ mutation.expectedRemoteRevision !== record.remoteRevision
1332
+ )
1333
+ return {
1334
+ status: "conflict",
1335
+ message: "Native CRM record revision changed.",
1336
+ };
1337
+ const current = await fieldsForRecord(record.id);
1338
+ const merged = { ...current, ...fields };
1339
+ const revision = nextNativeRevision(record.remoteRevision);
1340
+ const now = new Date().toISOString();
1341
+ const revisionGuard =
1342
+ record.remoteRevision === null
1343
+ ? isNull(schema.crmRecords.remoteRevision)
1344
+ : eq(schema.crmRecords.remoteRevision, record.remoteRevision);
1345
+ try {
1346
+ await db.transaction(async (tx) => {
1347
+ const guarded = await tx
1348
+ .update(schema.crmRecords)
1349
+ .set({
1350
+ ...summaryColumns(merged, record.remoteId),
1351
+ remoteRevision: revision,
1352
+ remoteUpdatedAt: now,
1353
+ updatedAt: now,
1354
+ })
1355
+ .where(
1356
+ and(
1357
+ eq(schema.crmRecords.id, record.id),
1358
+ revisionGuard,
1359
+ accessFilter(
1360
+ schema.crmRecords,
1361
+ schema.crmRecordShares,
1362
+ undefined,
1363
+ "editor",
1364
+ ),
1365
+ ),
1366
+ )
1367
+ .returning({ id: schema.crmRecords.id });
1368
+ if (guarded.length !== 1)
1369
+ throw new Error("NATIVE_CRM_REVISION_CONFLICT");
1370
+ for (const [fieldName, value] of Object.entries(fields)) {
1371
+ const [existing] = await tx
1372
+ .select({ id: schema.crmRecordFields.id })
1373
+ .from(schema.crmRecordFields)
1374
+ .where(
1375
+ and(
1376
+ eq(schema.crmRecordFields.recordId, record.id),
1377
+ eq(schema.crmRecordFields.fieldName, fieldName),
1378
+ accessFilter(
1379
+ schema.crmRecordFields,
1380
+ schema.crmRecordFieldShares,
1381
+ undefined,
1382
+ "editor",
1383
+ ),
1384
+ ),
1385
+ )
1386
+ .limit(1);
1387
+ const values = {
1388
+ valueType: valueType(value),
1389
+ storagePolicy: "local-authoritative" as const,
1390
+ ...fieldColumns(value),
1391
+ provenanceJson: json(
1392
+ [
1393
+ {
1394
+ provider: "native",
1395
+ connectionId: this.connection.connectionId,
1396
+ objectType: record.objectType,
1397
+ remoteId: record.remoteId,
1398
+ fieldName,
1399
+ remoteRevision: revision,
1400
+ observedAt: now,
1401
+ },
1402
+ ],
1403
+ 4_000,
1404
+ ),
1405
+ accessScopeKey: this.getAccessScope().key,
1406
+ accessScopeJson: json(this.getAccessScope(), 4_000),
1407
+ remoteRevision: revision,
1408
+ updatedAt: now,
1409
+ };
1410
+ if (existing) {
1411
+ await tx
1412
+ .update(schema.crmRecordFields)
1413
+ .set(values)
1414
+ .where(
1415
+ and(
1416
+ eq(schema.crmRecordFields.id, existing.id),
1417
+ accessFilter(
1418
+ schema.crmRecordFields,
1419
+ schema.crmRecordFieldShares,
1420
+ undefined,
1421
+ "editor",
1422
+ ),
1423
+ ),
1424
+ );
1425
+ } else {
1426
+ await tx.insert(schema.crmRecordFields).values({
1427
+ id: crypto.randomUUID(),
1428
+ recordId: record.id,
1429
+ fieldName,
1430
+ ...values,
1431
+ ownerEmail: record.ownerEmail,
1432
+ orgId: record.orgId,
1433
+ visibility: record.visibility,
1434
+ createdAt: now,
1435
+ });
1436
+ }
1437
+ }
1438
+ await tx.insert(schema.crmMutations).values({
1439
+ id: crypto.randomUUID(),
1440
+ recordId: record.id,
1441
+ connectionId: this.connection.connectionId,
1442
+ operation: "update",
1443
+ initiatedBy: this.#initiatedBy,
1444
+ target: "local",
1445
+ policyDecision: "execute",
1446
+ risk: "routine",
1447
+ status: "applied",
1448
+ patchJson,
1449
+ beforeJson: json({ remoteRevision: record.remoteRevision }),
1450
+ afterJson: json({ remoteRevision: revision }),
1451
+ idempotencyKey: mutation.idempotencyKey,
1452
+ expectedRemoteRevision: mutation.expectedRemoteRevision ?? null,
1453
+ providerRemoteRevision: revision,
1454
+ appliedAt: now,
1455
+ ownerEmail: record.ownerEmail,
1456
+ orgId: record.orgId,
1457
+ visibility: record.visibility,
1458
+ createdAt: now,
1459
+ updatedAt: now,
1460
+ });
1461
+ });
1462
+ } catch (error) {
1463
+ if (
1464
+ error instanceof Error &&
1465
+ error.message === "NATIVE_CRM_REVISION_CONFLICT"
1466
+ )
1467
+ return {
1468
+ status: "conflict",
1469
+ message: "Native CRM record revision changed.",
1470
+ };
1471
+ throw error;
1472
+ }
1473
+ const updated = await this.getRecord({
1474
+ record: mutation.record,
1475
+ fields: Object.keys(merged),
1476
+ });
1477
+ return updated
1478
+ ? { status: "applied", record: updated, remoteRevision: revision }
1479
+ : { status: "rejected", message: "Native CRM record was not updated." };
1480
+ }
1481
+
1482
+ private async deleteRecord(
1483
+ mutation: CrmMutation,
1484
+ ): Promise<CrmMutationResult> {
1485
+ const patchJson = "{}";
1486
+ const replay = await this.replayOrStart(mutation, patchJson);
1487
+ if (replay) return replay;
1488
+ const db = getDb();
1489
+ const [record] = await db
1490
+ .select()
1491
+ .from(schema.crmRecords)
1492
+ .where(
1493
+ and(
1494
+ eq(schema.crmRecords.connectionId, this.connection.connectionId),
1495
+ eq(schema.crmRecords.objectType, mutation.record.objectType),
1496
+ eq(schema.crmRecords.remoteId, mutation.record.remoteId),
1497
+ accessFilter(
1498
+ schema.crmRecords,
1499
+ schema.crmRecordShares,
1500
+ undefined,
1501
+ "editor",
1502
+ ),
1503
+ ),
1504
+ )
1505
+ .limit(1);
1506
+ if (!record)
1507
+ return {
1508
+ status: "rejected",
1509
+ message: "Native CRM record is unavailable.",
1510
+ };
1511
+ await assertAccess("crm-record", record.id, "editor");
1512
+ if (
1513
+ mutation.expectedRemoteRevision &&
1514
+ mutation.expectedRemoteRevision !== record.remoteRevision
1515
+ )
1516
+ return {
1517
+ status: "conflict",
1518
+ message: "Native CRM record revision changed.",
1519
+ };
1520
+ const revision = nextNativeRevision(record.remoteRevision);
1521
+ const now = new Date().toISOString();
1522
+ const revisionGuard =
1523
+ record.remoteRevision === null
1524
+ ? isNull(schema.crmRecords.remoteRevision)
1525
+ : eq(schema.crmRecords.remoteRevision, record.remoteRevision);
1526
+ try {
1527
+ await db.transaction(async (tx) => {
1528
+ const guarded = await tx
1529
+ .update(schema.crmRecords)
1530
+ .set({
1531
+ tombstone: true,
1532
+ remoteRevision: revision,
1533
+ remoteUpdatedAt: now,
1534
+ updatedAt: now,
1535
+ })
1536
+ .where(
1537
+ and(
1538
+ eq(schema.crmRecords.id, record.id),
1539
+ revisionGuard,
1540
+ accessFilter(
1541
+ schema.crmRecords,
1542
+ schema.crmRecordShares,
1543
+ undefined,
1544
+ "editor",
1545
+ ),
1546
+ ),
1547
+ )
1548
+ .returning({ id: schema.crmRecords.id });
1549
+ if (guarded.length !== 1)
1550
+ throw new Error("NATIVE_CRM_REVISION_CONFLICT");
1551
+ const relationships = await tx
1552
+ .select({ id: schema.crmRelationships.id })
1553
+ .from(schema.crmRelationships)
1554
+ .where(
1555
+ and(
1556
+ eq(
1557
+ schema.crmRelationships.connectionId,
1558
+ this.connection.connectionId,
1559
+ ),
1560
+ or(
1561
+ eq(schema.crmRelationships.fromRecordId, record.id),
1562
+ eq(schema.crmRelationships.toRecordId, record.id),
1563
+ ),
1564
+ accessFilter(
1565
+ schema.crmRelationships,
1566
+ schema.crmRelationshipShares,
1567
+ undefined,
1568
+ "editor",
1569
+ ),
1570
+ ),
1571
+ );
1572
+ for (const relationship of relationships) {
1573
+ await assertAccess("crm-relationship", relationship.id, "editor");
1574
+ await tx
1575
+ .update(schema.crmRelationships)
1576
+ .set({ tombstone: true, updatedAt: now })
1577
+ .where(
1578
+ and(
1579
+ eq(schema.crmRelationships.id, relationship.id),
1580
+ accessFilter(
1581
+ schema.crmRelationships,
1582
+ schema.crmRelationshipShares,
1583
+ undefined,
1584
+ "editor",
1585
+ ),
1586
+ ),
1587
+ );
1588
+ }
1589
+ await tx.insert(schema.crmMutations).values({
1590
+ id: crypto.randomUUID(),
1591
+ recordId: record.id,
1592
+ connectionId: this.connection.connectionId,
1593
+ operation: "delete",
1594
+ initiatedBy: this.#initiatedBy,
1595
+ target: "local",
1596
+ policyDecision: "execute",
1597
+ risk: "routine",
1598
+ status: "applied",
1599
+ patchJson,
1600
+ beforeJson: json({ remoteRevision: record.remoteRevision }),
1601
+ afterJson: json({ remoteRevision: revision, tombstone: true }),
1602
+ idempotencyKey: mutation.idempotencyKey,
1603
+ expectedRemoteRevision: mutation.expectedRemoteRevision ?? null,
1604
+ providerRemoteRevision: revision,
1605
+ appliedAt: now,
1606
+ ownerEmail: record.ownerEmail,
1607
+ orgId: record.orgId,
1608
+ visibility: record.visibility,
1609
+ createdAt: now,
1610
+ updatedAt: now,
1611
+ });
1612
+ });
1613
+ } catch (error) {
1614
+ if (
1615
+ error instanceof Error &&
1616
+ error.message === "NATIVE_CRM_REVISION_CONFLICT"
1617
+ )
1618
+ return {
1619
+ status: "conflict",
1620
+ message: "Native CRM record revision changed.",
1621
+ };
1622
+ throw error;
1623
+ }
1624
+ const deleted = await this.getRecord({
1625
+ record: mutation.record,
1626
+ fields: [],
1627
+ });
1628
+ return {
1629
+ status: "applied",
1630
+ ...(deleted ? { record: deleted } : {}),
1631
+ remoteRevision: revision,
1632
+ };
1633
+ }
1634
+
1635
+ private async mutateRelationship(
1636
+ mutation: CrmMutation,
1637
+ ): Promise<CrmMutationResult> {
1638
+ if (!mutation.relationship)
1639
+ return {
1640
+ status: "rejected",
1641
+ message: "Native relationship mutations require an edge.",
1642
+ };
1643
+ const patchJson = json({ relationship: mutation.relationship });
1644
+ const replay = await this.replayOrStart(mutation, patchJson);
1645
+ if (replay) return replay;
1646
+ const from = await this.getRecord({
1647
+ record: mutation.relationship.from,
1648
+ fields: [],
1649
+ });
1650
+ const to = await this.getRecord({
1651
+ record: mutation.relationship.to,
1652
+ fields: [],
1653
+ });
1654
+ if (!from?.ref.localId || !to?.ref.localId)
1655
+ return {
1656
+ status: "rejected",
1657
+ message: "Native relationship records are unavailable.",
1658
+ };
1659
+ await assertAccess("crm-record", from.ref.localId, "editor");
1660
+ await assertAccess("crm-record", to.ref.localId, "editor");
1661
+ const db = getDb();
1662
+ const now = new Date().toISOString();
1663
+ await db.transaction(async (tx) => {
1664
+ const [existing] = await tx
1665
+ .select({ id: schema.crmRelationships.id })
1666
+ .from(schema.crmRelationships)
1667
+ .where(
1668
+ and(
1669
+ eq(
1670
+ schema.crmRelationships.connectionId,
1671
+ this.connection.connectionId,
1672
+ ),
1673
+ eq(schema.crmRelationships.fromRecordId, from.ref.localId!),
1674
+ eq(schema.crmRelationships.toRecordId, to.ref.localId!),
1675
+ eq(
1676
+ schema.crmRelationships.relationshipType,
1677
+ mutation.relationship!.relationshipType,
1678
+ ),
1679
+ accessFilter(
1680
+ schema.crmRelationships,
1681
+ schema.crmRelationshipShares,
1682
+ undefined,
1683
+ "editor",
1684
+ ),
1685
+ ),
1686
+ )
1687
+ .limit(1);
1688
+ if (existing) {
1689
+ await assertAccess("crm-relationship", existing.id, "editor");
1690
+ await tx
1691
+ .update(schema.crmRelationships)
1692
+ .set({
1693
+ tombstone: mutation.operation === "disassociate",
1694
+ label: mutation.relationship!.label ?? null,
1695
+ inverseLabel: mutation.relationship!.inverseLabel ?? null,
1696
+ sourceField: mutation.relationship!.sourceField ?? null,
1697
+ updatedAt: now,
1698
+ })
1699
+ .where(
1700
+ and(
1701
+ eq(schema.crmRelationships.id, existing.id),
1702
+ accessFilter(
1703
+ schema.crmRelationships,
1704
+ schema.crmRelationshipShares,
1705
+ undefined,
1706
+ "editor",
1707
+ ),
1708
+ ),
1709
+ );
1710
+ } else if (mutation.operation === "associate") {
1711
+ await tx.insert(schema.crmRelationships).values({
1712
+ id: crypto.randomUUID(),
1713
+ connectionId: this.connection.connectionId,
1714
+ fromRecordId: from.ref.localId!,
1715
+ toRecordId: to.ref.localId!,
1716
+ relationshipType: mutation.relationship!.relationshipType,
1717
+ label: mutation.relationship!.label ?? null,
1718
+ inverseLabel: mutation.relationship!.inverseLabel ?? null,
1719
+ sourceField: mutation.relationship!.sourceField ?? null,
1720
+ tombstone: false,
1721
+ ownerEmail: this.#nativeConnection.ownerEmail,
1722
+ orgId: this.#nativeConnection.orgId,
1723
+ visibility: this.#nativeConnection.visibility,
1724
+ createdAt: now,
1725
+ updatedAt: now,
1726
+ });
1727
+ }
1728
+ await tx.insert(schema.crmMutations).values({
1729
+ id: crypto.randomUUID(),
1730
+ recordId: from.ref.localId,
1731
+ connectionId: this.connection.connectionId,
1732
+ operation: mutation.operation,
1733
+ initiatedBy: this.#initiatedBy,
1734
+ target: "local",
1735
+ policyDecision: "execute",
1736
+ risk: "routine",
1737
+ status: "applied",
1738
+ patchJson,
1739
+ beforeJson: "{}",
1740
+ afterJson: json({ relationship: mutation.operation }),
1741
+ idempotencyKey: mutation.idempotencyKey,
1742
+ appliedAt: now,
1743
+ ownerEmail: this.#nativeConnection.ownerEmail,
1744
+ orgId: this.#nativeConnection.orgId,
1745
+ visibility: this.#nativeConnection.visibility,
1746
+ createdAt: now,
1747
+ updatedAt: now,
1748
+ });
1749
+ });
1750
+ return {
1751
+ status: "applied",
1752
+ record: from,
1753
+ remoteRevision: from.remoteRevision,
1754
+ };
1755
+ }
1756
+ }
1757
+
1758
+ export async function createNativeCrmAdapter(options: {
1759
+ connectionId: string;
1760
+ initiatedBy?: "human" | "agent" | "automation";
1761
+ accessTier?: "viewer" | "editor";
1762
+ }): Promise<NativeCrmAdapter> {
1763
+ const accessTier = options.accessTier ?? "editor";
1764
+ const connection = await loadNativeConnection(
1765
+ options.connectionId,
1766
+ accessTier,
1767
+ );
1768
+ if (accessTier === "editor") {
1769
+ await initializeNativeCrmDomain(options.connectionId);
1770
+ }
1771
+ return new NativeCrmAdapter(connection, options.initiatedBy);
1772
+ }
1773
+
1774
+ export async function createNativeCrmRecord(input: {
1775
+ connectionId: string;
1776
+ kind: "account" | "person" | "opportunity";
1777
+ displayName: string;
1778
+ fields: Record<string, CrmValue>;
1779
+ idempotencyKey?: string;
1780
+ initiatedBy?: "human" | "agent" | "automation";
1781
+ }) {
1782
+ const objectType =
1783
+ input.kind === "account"
1784
+ ? "accounts"
1785
+ : input.kind === "person"
1786
+ ? "people"
1787
+ : "opportunities";
1788
+ const adapter = await createNativeCrmAdapter({
1789
+ connectionId: input.connectionId,
1790
+ initiatedBy: input.initiatedBy,
1791
+ });
1792
+ return adapter.applyMutation({
1793
+ operation: "create",
1794
+ record: {
1795
+ ...adapter.connection,
1796
+ objectType,
1797
+ kind: input.kind,
1798
+ remoteId: `native-${crypto.randomUUID()}`,
1799
+ },
1800
+ // `summaryColumns` derives the record's display name from `name` first —
1801
+ // accounts and opportunities already carry a `name` attribute, so only
1802
+ // people (which have no `name` field) need a separate stored `displayName`
1803
+ // attribute. Minting both would leave two attributes for one value.
1804
+ fields:
1805
+ input.kind === "person"
1806
+ ? { ...input.fields, displayName: input.displayName }
1807
+ : { ...input.fields, name: input.displayName },
1808
+ idempotencyKey: input.idempotencyKey ?? crypto.randomUUID(),
1809
+ });
1810
+ }