@agent-native/core 0.122.4 → 0.123.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1340) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +538 -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/client/AssistantChat.tsx +623 -607
  157. package/corpus/core/src/client/agent-chat-adapter.ts +176 -29
  158. package/corpus/core/src/client/chat/message-components.tsx +13 -0
  159. package/corpus/core/src/client/embed-auth.ts +3 -1
  160. package/corpus/core/src/client/integrations/IntegrationCard.tsx +41 -24
  161. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +37 -21
  162. package/corpus/core/src/client/integrations/webhook-url.ts +29 -0
  163. package/corpus/core/src/client/org/OrgSwitcher.tsx +41 -27
  164. package/corpus/core/src/client/org/RequireActiveOrg.tsx +7 -0
  165. package/corpus/core/src/client/org/TeamPage.tsx +144 -14
  166. package/corpus/core/src/client/org/hooks.ts +27 -0
  167. package/corpus/core/src/client/org/index.ts +2 -0
  168. package/corpus/core/src/client/require-session.tsx +40 -29
  169. package/corpus/core/src/client/session-replay.ts +1 -1
  170. package/corpus/core/src/client/settings/DemoModeSection.tsx +0 -5
  171. package/corpus/core/src/client/settings/SecretsSection.tsx +47 -42
  172. package/corpus/core/src/client/settings/VoiceTranscriptionSection.tsx +0 -5
  173. package/corpus/core/src/client/sse-event-processor.ts +83 -8
  174. package/corpus/core/src/client/use-action.ts +22 -13
  175. package/corpus/core/src/client/use-agent-engine-configured.ts +36 -4
  176. package/corpus/core/src/client/use-db-sync.ts +21 -1
  177. package/corpus/core/src/credentials/index.ts +124 -2
  178. package/corpus/core/src/deploy/build.ts +93 -30
  179. package/corpus/core/src/deploy/workspace-deploy.ts +21 -16
  180. package/corpus/core/src/guards/no-localhost-fallback.ts +76 -14
  181. package/corpus/core/src/integrations/google-docs-poller.ts +19 -12
  182. package/corpus/core/src/integrations/webhook-handler.ts +56 -33
  183. package/corpus/core/src/jobs/scheduler.ts +57 -23
  184. package/corpus/core/src/localization/default-messages.ts +23 -1
  185. package/corpus/core/src/observability/evals.ts +7 -8
  186. package/corpus/core/src/observability/traces.ts +2 -0
  187. package/corpus/core/src/org/accept-pending.ts +2 -2
  188. package/corpus/core/src/org/active-org.ts +73 -0
  189. package/corpus/core/src/org/auto-join-domain.ts +7 -2
  190. package/corpus/core/src/org/context.ts +169 -66
  191. package/corpus/core/src/org/handlers.ts +148 -10
  192. package/corpus/core/src/org/plugin.ts +8 -1
  193. package/corpus/core/src/org/types.ts +6 -1
  194. package/corpus/core/src/provider-api/index.ts +6 -1
  195. package/corpus/core/src/resources/handlers.ts +2 -6
  196. package/corpus/core/src/resources/script-helpers.ts +2 -1
  197. package/corpus/core/src/scripts/chat/search-chats.ts +5 -2
  198. package/corpus/core/src/scripts/describe-workspace-apps.ts +59 -0
  199. package/corpus/core/src/scripts/resources/delete-memory.ts +5 -2
  200. package/corpus/core/src/scripts/resources/delete.ts +5 -2
  201. package/corpus/core/src/scripts/resources/effective.ts +5 -2
  202. package/corpus/core/src/scripts/resources/list.ts +5 -2
  203. package/corpus/core/src/scripts/resources/read.ts +5 -2
  204. package/corpus/core/src/scripts/resources/save-memory.ts +5 -2
  205. package/corpus/core/src/scripts/resources/write.ts +5 -2
  206. package/corpus/core/src/server/agent-capabilities.ts +147 -0
  207. package/corpus/core/src/server/agent-chat/framework-prompts.ts +11 -13
  208. package/corpus/core/src/server/agent-chat/prompt-resources.ts +183 -57
  209. package/corpus/core/src/server/agent-chat/script-entries.ts +20 -7
  210. package/corpus/core/src/server/agent-chat-plugin.ts +27 -0
  211. package/corpus/core/src/server/auth.ts +38 -32
  212. package/corpus/core/src/server/core-routes-plugin.ts +229 -179
  213. package/corpus/core/src/server/credential-provider.ts +196 -44
  214. package/corpus/core/src/server/embed-session.ts +10 -0
  215. package/corpus/core/src/server/framework-request-handler.ts +43 -0
  216. package/corpus/core/src/server/google-auth-plugin.ts +13 -450
  217. package/corpus/core/src/server/index.ts +4 -1
  218. package/corpus/core/src/server/onboarding-html.ts +20 -56
  219. package/corpus/core/src/server/open-route.ts +6 -1
  220. package/corpus/core/src/server/poll.ts +1 -1
  221. package/corpus/core/src/server/prompts/framework-core-compact.ts +5 -5
  222. package/corpus/core/src/server/prompts/framework-core.ts +7 -9
  223. package/corpus/core/src/server/prompts/shared-rules.ts +20 -9
  224. package/corpus/core/src/server/request-context.ts +58 -2
  225. package/corpus/core/src/server/scoped-key-storage.ts +1 -1
  226. package/corpus/core/src/settings/org-settings.ts +9 -0
  227. package/corpus/core/src/settings/store.ts +29 -0
  228. package/corpus/core/src/shared/index.ts +13 -0
  229. package/corpus/core/src/shared/sign-in-journey.ts +331 -0
  230. package/corpus/core/src/styles/agent-native.css +8 -0
  231. package/corpus/core/src/templates/chat/.agents/skills/actions/SKILL.md +19 -1
  232. package/corpus/core/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
  233. package/corpus/core/src/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
  234. package/corpus/core/src/templates/chat/.agents/skills/security/SKILL.md +2 -0
  235. package/corpus/core/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
  236. package/corpus/core/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
  237. package/corpus/core/src/templates/chat/AGENTS.md +8 -0
  238. package/corpus/core/src/templates/chat/app/entry.client.tsx +3 -0
  239. package/corpus/core/src/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  240. package/corpus/core/src/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  241. package/corpus/core/src/templates/chat/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  242. package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +19 -1
  243. package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +2 -0
  244. package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +20 -6
  245. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +2 -0
  246. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +4 -3
  247. package/corpus/core/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +7 -3
  248. package/corpus/core/src/templates/default/AGENTS.md +68 -195
  249. package/corpus/core/src/templates/default/app/entry.client.tsx +3 -0
  250. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +8 -0
  251. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +8 -0
  252. package/corpus/core/src/templates/default/app/i18n/en-US.ts +8 -0
  253. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +8 -0
  254. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +8 -0
  255. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +8 -0
  256. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +8 -0
  257. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +8 -0
  258. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +8 -0
  259. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +8 -0
  260. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +8 -0
  261. package/corpus/core/src/templates/headless/.agents/skills/actions/SKILL.md +19 -1
  262. package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +19 -1
  263. package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +2 -0
  264. package/corpus/core/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +100 -0
  265. package/corpus/core/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -1
  266. package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +28 -0
  267. package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +14 -1
  268. package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +20 -6
  269. package/corpus/core/src/templates/workspace-core/.agents/skills/qa/SKILL.md +6 -3
  270. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +2 -0
  271. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -3
  272. package/corpus/core/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +7 -3
  273. package/corpus/core/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +91 -0
  274. package/corpus/core/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +60 -0
  275. package/corpus/core/src/templates/workspace-core/AGENTS.md +62 -124
  276. package/corpus/core/src/templates/workspace-root/AGENTS.md +6 -1
  277. package/corpus/core/src/triggers/dispatcher.ts +28 -17
  278. package/corpus/core/src/vite/client.ts +20 -8
  279. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +19 -1
  280. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +41 -1
  281. package/corpus/templates/analytics/.agents/skills/dashboard-ops/SKILL.md +50 -22
  282. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +1 -1
  283. package/corpus/templates/analytics/.agents/skills/data-querying/references/inline-chart-embeds.md +8 -0
  284. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +20 -6
  285. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +2 -0
  286. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +4 -3
  287. package/corpus/templates/analytics/.agents/skills/shadcn-ui/SKILL.md +7 -3
  288. package/corpus/templates/analytics/.agents/skills/sharing/SKILL.md +228 -0
  289. package/corpus/templates/analytics/.builder/skills/charts/SKILL.md +2 -2
  290. package/corpus/templates/analytics/actions/delete-dashboard-view.ts +24 -0
  291. package/corpus/templates/analytics/actions/delete-user-pref.ts +22 -0
  292. package/corpus/templates/analytics/actions/generate-chart.ts +8 -245
  293. package/corpus/templates/analytics/actions/get-theme.ts +27 -0
  294. package/corpus/templates/analytics/actions/get-user-pref.ts +22 -0
  295. package/corpus/templates/analytics/actions/list-dashboard-views.ts +25 -0
  296. package/corpus/templates/analytics/actions/save-dashboard-view.ts +33 -0
  297. package/corpus/templates/analytics/actions/set-theme.ts +22 -0
  298. package/corpus/templates/analytics/actions/set-user-pref.ts +24 -0
  299. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +134 -27
  300. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -9
  301. package/corpus/templates/analytics/app/components/layout/Layout.tsx +0 -17
  302. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +10 -5
  303. package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +22 -52
  304. package/corpus/templates/analytics/app/hooks/use-user-pref.ts +21 -31
  305. package/corpus/templates/analytics/app/i18n-data.ts +10 -0
  306. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +2 -1
  307. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dual-axis.ts +73 -0
  308. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +8 -27
  309. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/report-panel-window.ts +0 -57
  310. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +8 -0
  311. package/corpus/templates/analytics/app/root.tsx +0 -28
  312. package/corpus/templates/analytics/changelog/2026-07-26-error-issues-now-group-by-message-as-well-as-stack-frame-and.md +6 -0
  313. package/corpus/templates/analytics/changelog/2026-07-26-line-area-and-bar-dashboard-panels-can-plot-series-on-a-seco.md +6 -0
  314. package/corpus/templates/analytics/changelog/2026-07-26-scheduled-dashboard-email-reports-now-arrive-complete-and-re.md +6 -0
  315. package/corpus/templates/analytics/changelog/2026-07-26-session-replays-now-detect-rage-clicks-so-the-rage-click-fil.md +6 -0
  316. package/corpus/templates/analytics/docs/error-capture.md +8 -4
  317. package/corpus/templates/analytics/package.json +1 -2
  318. package/corpus/templates/analytics/scripts/preview-dashboard-report.ts +221 -0
  319. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +39 -32
  320. package/corpus/templates/analytics/server/lib/dashboard-report-render.ts +1168 -0
  321. package/corpus/templates/analytics/server/lib/dashboard-report.ts +111 -1358
  322. package/corpus/templates/analytics/server/lib/error-capture.ts +32 -15
  323. package/corpus/templates/analytics/server/lib/report-chart-svg.ts +901 -0
  324. package/corpus/templates/analytics/server/lib/session-replay.ts +77 -1
  325. package/corpus/templates/analytics/shared/dashboard-report-timeouts.ts +3 -4
  326. package/corpus/templates/assets/.agents/skills/a2a-assets/SKILL.md +28 -0
  327. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +19 -1
  328. package/corpus/templates/assets/.agents/skills/assets-navigation/SKILL.md +46 -0
  329. package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +12 -0
  330. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +20 -6
  331. package/corpus/templates/assets/.agents/skills/image-generation/SKILL.md +28 -0
  332. package/corpus/templates/assets/.agents/skills/library-management/SKILL.md +9 -0
  333. package/corpus/templates/assets/.agents/skills/logo-composite/SKILL.md +11 -0
  334. package/corpus/templates/assets/.agents/skills/security/SKILL.md +2 -0
  335. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +4 -3
  336. package/corpus/templates/assets/.agents/skills/shadcn-ui/SKILL.md +7 -3
  337. package/corpus/templates/assets/.agents/skills/sharing/SKILL.md +228 -0
  338. package/corpus/templates/assets/AGENTS.md +58 -125
  339. package/corpus/templates/assets/actions/variant-slots.ts +8 -4
  340. package/corpus/templates/assets/app/entry.client.tsx +3 -0
  341. package/corpus/templates/assets/package.json +0 -2
  342. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +19 -1
  343. package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +2 -0
  344. package/corpus/templates/brain/.agents/skills/brain/SKILL.md +78 -4
  345. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +20 -6
  346. package/corpus/templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md +15 -3
  347. package/corpus/templates/brain/.agents/skills/security/SKILL.md +2 -0
  348. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +4 -3
  349. package/corpus/templates/brain/.agents/skills/shadcn-ui/SKILL.md +7 -3
  350. package/corpus/templates/brain/.agents/skills/sharing/SKILL.md +228 -0
  351. package/corpus/templates/brain/.agents/skills/storing-data/SKILL.md +178 -0
  352. package/corpus/templates/brain/AGENTS.md +73 -119
  353. package/corpus/templates/brain/app/entry.client.tsx +3 -0
  354. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +19 -1
  355. package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +56 -3
  356. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +20 -6
  357. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +2 -0
  358. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +4 -3
  359. package/corpus/templates/calendar/.agents/skills/shadcn-ui/SKILL.md +7 -3
  360. package/corpus/templates/calendar/.agents/skills/sharing/SKILL.md +228 -0
  361. package/corpus/templates/calendar/AGENTS.md +22 -45
  362. package/corpus/templates/calendar/app/entry.client.tsx +3 -0
  363. package/corpus/templates/calendar/server/handlers/events.ts +0 -364
  364. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +19 -1
  365. package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
  366. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
  367. package/corpus/templates/chat/.agents/skills/security/SKILL.md +2 -0
  368. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
  369. package/corpus/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
  370. package/corpus/templates/chat/.agents/skills/sharing/SKILL.md +228 -0
  371. package/corpus/templates/chat/.agents/skills/storing-data/SKILL.md +178 -0
  372. package/corpus/templates/chat/AGENTS.md +8 -0
  373. package/corpus/templates/chat/app/entry.client.tsx +3 -0
  374. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +19 -1
  375. package/corpus/templates/clips/.agents/skills/ai-video-tools/SKILL.md +42 -0
  376. package/corpus/templates/clips/.agents/skills/brain-export/SKILL.md +59 -0
  377. package/corpus/templates/clips/.agents/skills/bug-reports/SKILL.md +37 -0
  378. package/corpus/templates/clips/.agents/skills/crm-call-evidence/SKILL.md +41 -0
  379. package/corpus/templates/clips/.agents/skills/dictate/SKILL.md +4 -0
  380. package/corpus/templates/clips/.agents/skills/external-integrations/SKILL.md +45 -0
  381. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +20 -6
  382. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +9 -0
  383. package/corpus/templates/clips/.agents/skills/recording/SKILL.md +45 -0
  384. package/corpus/templates/clips/.agents/skills/screen-memory/SKILL.md +43 -0
  385. package/corpus/templates/clips/.agents/skills/security/SKILL.md +2 -0
  386. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +4 -3
  387. package/corpus/templates/clips/.agents/skills/shadcn-ui/SKILL.md +7 -3
  388. package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +38 -1
  389. package/corpus/templates/clips/AGENTS.md +82 -224
  390. package/corpus/templates/clips/actions/create-recording.ts +4 -0
  391. package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +6 -10
  392. package/corpus/templates/clips/app/routes/invite.$token.tsx +6 -5
  393. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +4 -5
  394. package/corpus/templates/clips/app/routes/share.$shareId.tsx +8 -8
  395. package/corpus/templates/clips/changelog/2026-07-26-long-agent-chat-turns-now-finish-instead-of-stopping-partway.md +6 -0
  396. package/corpus/templates/clips/changelog/2026-07-26-recordings-no-longer-get-stuck-on-uploading-uploads-now-hold.md +6 -0
  397. package/corpus/templates/clips/server/db/schema.ts +3 -0
  398. package/corpus/templates/clips/server/jobs/brain-export.ts +4 -0
  399. package/corpus/templates/clips/server/lib/recording-upload-state.ts +0 -52
  400. package/corpus/templates/clips/server/lib/upload-lease.ts +241 -0
  401. package/corpus/templates/clips/server/plugins/agent-chat.ts +4 -0
  402. package/corpus/templates/clips/server/plugins/db.ts +18 -347
  403. package/corpus/templates/clips/server/routes/api/clips/brain-export/run.post.ts +7 -1
  404. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +123 -126
  405. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/reset-chunks.post.ts +4 -0
  406. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/resume.get.ts +118 -0
  407. package/corpus/templates/clips/server/routes/api/uploads/reap.post.ts +69 -0
  408. package/corpus/templates/content/.agents/skills/actions/SKILL.md +19 -1
  409. package/corpus/templates/content/.agents/skills/content/SKILL.md +4 -0
  410. package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +8 -0
  411. package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +55 -0
  412. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +20 -6
  413. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +12 -1
  414. package/corpus/templates/content/.agents/skills/security/SKILL.md +2 -0
  415. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +4 -3
  416. package/corpus/templates/content/.agents/skills/shadcn-ui/SKILL.md +7 -3
  417. package/corpus/templates/content/.agents/skills/sharing/SKILL.md +228 -0
  418. package/corpus/templates/content/AGENTS.md +63 -131
  419. package/corpus/templates/content/app/routes/_app.tsx +4 -4
  420. package/corpus/templates/content/server/routes/api/notion/callback.get.ts +6 -24
  421. package/corpus/templates/design/.agents/skills/actions/SKILL.md +19 -1
  422. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
  423. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +15 -0
  424. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +20 -6
  425. package/corpus/templates/design/.agents/skills/full-app-build/SKILL.md +12 -0
  426. package/corpus/templates/design/.agents/skills/security/SKILL.md +2 -0
  427. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +4 -3
  428. package/corpus/templates/design/.agents/skills/shadcn-ui/SKILL.md +7 -3
  429. package/corpus/templates/design/.agents/skills/sharing/SKILL.md +228 -0
  430. package/corpus/templates/design/.agents/skills/storing-data/SKILL.md +178 -0
  431. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +201 -102
  432. package/corpus/templates/design/AGENTS.md +58 -71
  433. package/corpus/templates/design/actions/open-visual-edit.ts +111 -2
  434. package/corpus/templates/design/app/components/design/AddLocalhostScreenDialog.tsx +236 -0
  435. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +1 -1
  436. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2 -2
  437. package/corpus/templates/design/app/entry.client.tsx +3 -0
  438. package/corpus/templates/design/app/i18n-data.ts +180 -0
  439. package/corpus/templates/design/app/pages/Present.tsx +6 -9
  440. package/corpus/templates/design/app/pages/VisualEdit.tsx +4 -7
  441. package/corpus/templates/design/app/pages/design-editor/design-data-geometry-utils.ts +20 -0
  442. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +19 -1
  443. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +20 -6
  444. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +2 -0
  445. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +4 -3
  446. package/corpus/templates/dispatch/.agents/skills/shadcn-ui/SKILL.md +7 -3
  447. package/corpus/templates/dispatch/.agents/skills/sharing/SKILL.md +228 -0
  448. package/corpus/templates/dispatch/.agents/skills/storing-data/SKILL.md +178 -0
  449. package/corpus/templates/dispatch/app/entry.client.tsx +3 -0
  450. package/corpus/templates/dispatch/server/plugins/identity-sso.ts +27 -16
  451. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +19 -1
  452. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +20 -6
  453. package/corpus/templates/forms/.agents/skills/security/SKILL.md +2 -0
  454. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +4 -3
  455. package/corpus/templates/forms/.agents/skills/shadcn-ui/SKILL.md +7 -3
  456. package/corpus/templates/forms/.agents/skills/sharing/SKILL.md +228 -0
  457. package/corpus/templates/forms/DEVELOPING.md +1 -1
  458. package/corpus/templates/forms/app/entry.client.tsx +3 -0
  459. package/corpus/templates/forms/app/pages/FormsListPage.tsx +3 -5
  460. package/corpus/templates/forms/app/routes/_app.tsx +4 -4
  461. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +20 -6
  462. package/corpus/templates/macros/.agents/skills/security/SKILL.md +2 -0
  463. package/corpus/templates/macros/.agents/skills/shadcn-ui/SKILL.md +7 -3
  464. package/corpus/templates/macros/.agents/skills/sharing/SKILL.md +228 -0
  465. package/corpus/templates/macros/.agents/skills/storing-data/SKILL.md +178 -0
  466. package/corpus/templates/macros/app/entry.client.tsx +3 -0
  467. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +19 -1
  468. package/corpus/templates/mail/.agents/skills/contacts-and-crm/SKILL.md +10 -0
  469. package/corpus/templates/mail/.agents/skills/draft-queue/SKILL.md +3 -0
  470. package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +26 -2
  471. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +20 -6
  472. package/corpus/templates/mail/.agents/skills/inbox-automations/SKILL.md +37 -0
  473. package/corpus/templates/mail/.agents/skills/inbox-reads-and-triage/SKILL.md +58 -0
  474. package/corpus/templates/mail/.agents/skills/mail-backends/SKILL.md +33 -0
  475. package/corpus/templates/mail/.agents/skills/provider-api-scans/SKILL.md +39 -0
  476. package/corpus/templates/mail/.agents/skills/security/SKILL.md +2 -0
  477. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +4 -3
  478. package/corpus/templates/mail/.agents/skills/shadcn-ui/SKILL.md +7 -3
  479. package/corpus/templates/mail/.agents/skills/sharing/SKILL.md +228 -0
  480. package/corpus/templates/mail/AGENTS.md +74 -143
  481. package/corpus/templates/mail/actions/create-alias.ts +36 -0
  482. package/corpus/templates/mail/actions/create-automation.ts +28 -0
  483. package/corpus/templates/mail/actions/create-scheduled-job.ts +45 -0
  484. package/corpus/templates/mail/actions/delete-alias.ts +26 -0
  485. package/corpus/templates/mail/actions/delete-automation.ts +21 -0
  486. package/corpus/templates/mail/actions/get-automation-settings.ts +32 -0
  487. package/corpus/templates/mail/actions/get-mail-preferences.ts +18 -0
  488. package/corpus/templates/mail/actions/list-aliases.ts +17 -0
  489. package/corpus/templates/mail/actions/list-automations.ts +18 -0
  490. package/corpus/templates/mail/actions/list-scheduled-jobs.ts +18 -0
  491. package/corpus/templates/mail/actions/update-alias.ts +37 -0
  492. package/corpus/templates/mail/actions/update-automation-settings.ts +33 -0
  493. package/corpus/templates/mail/actions/update-automation.ts +33 -0
  494. package/corpus/templates/mail/actions/update-mail-preferences.ts +68 -0
  495. package/corpus/templates/mail/actions/update-scheduled-job.ts +25 -0
  496. package/corpus/templates/mail/app/entry.client.tsx +3 -0
  497. package/corpus/templates/mail/app/hooks/use-aliases.ts +6 -36
  498. package/corpus/templates/mail/app/hooks/use-automations.ts +9 -16
  499. package/corpus/templates/mail/app/hooks/use-emails.ts +6 -5
  500. package/corpus/templates/mail/app/hooks/use-scheduled-jobs.ts +12 -15
  501. package/corpus/templates/mail/app/pages/SettingsPage.tsx +15 -9
  502. package/corpus/templates/mail/server/handlers/automations.ts +5 -142
  503. package/corpus/templates/mail/server/handlers/emails.ts +1 -56
  504. package/corpus/templates/mail/server/handlers/scheduled-jobs.ts +0 -134
  505. package/corpus/templates/mail/server/lib/aliases.ts +18 -0
  506. package/corpus/templates/mail/server/lib/automations.ts +104 -0
  507. package/corpus/templates/mail/server/lib/jobs.ts +34 -0
  508. package/corpus/templates/mail/server/lib/mail-settings.ts +43 -0
  509. package/corpus/templates/mail/shared/automation-schema.ts +10 -0
  510. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +19 -1
  511. package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +2 -0
  512. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +20 -6
  513. package/corpus/templates/plan/.agents/skills/plan-authoring-flow/SKILL.md +98 -0
  514. package/corpus/templates/plan/.agents/skills/plan-browser-editing/SKILL.md +42 -0
  515. package/corpus/templates/plan/.agents/skills/plan-comments-and-feedback/SKILL.md +68 -0
  516. package/corpus/templates/plan/.agents/skills/plan-events/SKILL.md +22 -0
  517. package/corpus/templates/plan/.agents/skills/plan-hosted-writes/SKILL.md +42 -0
  518. package/corpus/templates/plan/.agents/skills/plan-local-codebase-chat/SKILL.md +38 -0
  519. package/corpus/templates/plan/.agents/skills/plan-review-recaps/SKILL.md +25 -0
  520. package/corpus/templates/plan/.agents/skills/plan-source-sync/SKILL.md +68 -0
  521. package/corpus/templates/plan/.agents/skills/plan-version-history/SKILL.md +25 -0
  522. package/corpus/templates/plan/.agents/skills/security/SKILL.md +2 -0
  523. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +4 -3
  524. package/corpus/templates/plan/.agents/skills/shadcn-ui/SKILL.md +7 -3
  525. package/corpus/templates/plan/.agents/skills/sharing/SKILL.md +228 -0
  526. package/corpus/templates/plan/.agents/skills/storing-data/SKILL.md +178 -0
  527. package/corpus/templates/plan/AGENTS.md +64 -296
  528. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +9 -8
  529. package/corpus/templates/plan/app/pages/PlansPage.tsx +5 -10
  530. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +19 -1
  531. package/corpus/templates/slides/.agents/skills/deck-management/SKILL.md +7 -7
  532. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +20 -6
  533. package/corpus/templates/slides/.agents/skills/security/SKILL.md +2 -0
  534. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +4 -3
  535. package/corpus/templates/slides/.agents/skills/shadcn-ui/SKILL.md +7 -3
  536. package/corpus/templates/slides/.agents/skills/sharing/SKILL.md +228 -0
  537. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +3 -2
  538. package/corpus/templates/slides/.agents/skills/storing-data/SKILL.md +178 -0
  539. package/corpus/templates/slides/DEVELOPING.md +3 -3
  540. package/corpus/templates/slides/actions/_deck-write.ts +52 -0
  541. package/corpus/templates/slides/actions/add-deck.ts +73 -0
  542. package/corpus/templates/slides/actions/delete-deck.ts +60 -0
  543. package/corpus/templates/slides/actions/get-deck.ts +3 -1
  544. package/corpus/templates/slides/actions/save-deck.ts +144 -0
  545. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +27 -20
  546. package/corpus/templates/slides/app/context/DeckContext.tsx +173 -100
  547. package/corpus/templates/slides/app/pages/Index.tsx +3 -6
  548. package/corpus/templates/slides/app/routes/slide.tsx +16 -12
  549. package/corpus/templates/slides/changelog/2026-07-26-a-newly-created-deck-now-appears-in-the-deck-list-right-away.md +6 -0
  550. package/corpus/templates/slides/server/handlers/decks.ts +2 -378
  551. package/corpus/templates/tasks/.agents/skills/action-reference/SKILL.md +47 -0
  552. package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +19 -1
  553. package/corpus/templates/tasks/.agents/skills/adding-a-feature/SKILL.md +2 -0
  554. package/corpus/templates/tasks/.agents/skills/change-summary/SKILL.md +19 -1
  555. package/corpus/templates/tasks/.agents/skills/custom-fields/SKILL.md +63 -0
  556. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +20 -6
  557. package/corpus/templates/tasks/.agents/skills/security/SKILL.md +2 -0
  558. package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +4 -3
  559. package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +7 -3
  560. package/corpus/templates/tasks/.agents/skills/sharing/SKILL.md +228 -0
  561. package/corpus/templates/tasks/.agents/skills/store-conventions/SKILL.md +45 -0
  562. package/corpus/templates/tasks/.agents/skills/storing-data/SKILL.md +178 -0
  563. package/corpus/templates/tasks/.agents/skills/task-inbox-workflow/SKILL.md +66 -0
  564. package/corpus/templates/tasks/AGENTS.md +48 -113
  565. package/corpus/templates/tasks/app/entry.client.tsx +3 -0
  566. package/corpus/toolkit/CHANGELOG.md +12 -0
  567. package/corpus/toolkit/package.json +1 -1
  568. package/corpus/toolkit/src/composer/PromptComposer.tsx +23 -20
  569. package/dist/a2a/client.d.ts +3 -1
  570. package/dist/a2a/client.d.ts.map +1 -1
  571. package/dist/a2a/client.js +4 -2
  572. package/dist/a2a/client.js.map +1 -1
  573. package/dist/agent/action-warnings.d.ts +27 -0
  574. package/dist/agent/action-warnings.d.ts.map +1 -0
  575. package/dist/agent/action-warnings.js +73 -0
  576. package/dist/agent/action-warnings.js.map +1 -0
  577. package/dist/agent/durable-background.d.ts +8 -0
  578. package/dist/agent/durable-background.d.ts.map +1 -1
  579. package/dist/agent/durable-background.js +37 -5
  580. package/dist/agent/durable-background.js.map +1 -1
  581. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  582. package/dist/agent/engine/ai-sdk-engine.js +47 -6
  583. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  584. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  585. package/dist/agent/engine/anthropic-engine.js +41 -9
  586. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  587. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  588. package/dist/agent/engine/builder-engine.js +46 -19
  589. package/dist/agent/engine/builder-engine.js.map +1 -1
  590. package/dist/agent/engine/continuation-dispatch-retry.d.ts.map +1 -1
  591. package/dist/agent/engine/continuation-dispatch-retry.js +11 -9
  592. package/dist/agent/engine/continuation-dispatch-retry.js.map +1 -1
  593. package/dist/agent/engine/credential-errors.d.ts +6 -0
  594. package/dist/agent/engine/credential-errors.d.ts.map +1 -1
  595. package/dist/agent/engine/credential-errors.js +10 -0
  596. package/dist/agent/engine/credential-errors.js.map +1 -1
  597. package/dist/agent/engine/error-detail.d.ts +2 -0
  598. package/dist/agent/engine/error-detail.d.ts.map +1 -0
  599. package/dist/agent/engine/error-detail.js +37 -0
  600. package/dist/agent/engine/error-detail.js.map +1 -0
  601. package/dist/agent/engine/prompt-cache.d.ts +34 -0
  602. package/dist/agent/engine/prompt-cache.d.ts.map +1 -0
  603. package/dist/agent/engine/prompt-cache.js +39 -0
  604. package/dist/agent/engine/prompt-cache.js.map +1 -0
  605. package/dist/agent/engine/registry.d.ts.map +1 -1
  606. package/dist/agent/engine/registry.js +23 -33
  607. package/dist/agent/engine/registry.js.map +1 -1
  608. package/dist/agent/engine/tool-call-journal-seed.d.ts +1 -1
  609. package/dist/agent/engine/tool-call-journal-seed.d.ts.map +1 -1
  610. package/dist/agent/engine/tool-call-journal-seed.js +2 -2
  611. package/dist/agent/engine/tool-call-journal-seed.js.map +1 -1
  612. package/dist/agent/engine/translate-anthropic.d.ts +28 -0
  613. package/dist/agent/engine/translate-anthropic.d.ts.map +1 -1
  614. package/dist/agent/engine/translate-anthropic.js +75 -0
  615. package/dist/agent/engine/translate-anthropic.js.map +1 -1
  616. package/dist/agent/loop-settings.d.ts +35 -2
  617. package/dist/agent/loop-settings.d.ts.map +1 -1
  618. package/dist/agent/loop-settings.js +71 -8
  619. package/dist/agent/loop-settings.js.map +1 -1
  620. package/dist/agent/production-agent.d.ts +105 -20
  621. package/dist/agent/production-agent.d.ts.map +1 -1
  622. package/dist/agent/production-agent.js +516 -123
  623. package/dist/agent/production-agent.js.map +1 -1
  624. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  625. package/dist/agent/run-loop-with-resume.js +24 -2
  626. package/dist/agent/run-loop-with-resume.js.map +1 -1
  627. package/dist/agent/run-manager.d.ts +52 -9
  628. package/dist/agent/run-manager.d.ts.map +1 -1
  629. package/dist/agent/run-manager.js +191 -36
  630. package/dist/agent/run-manager.js.map +1 -1
  631. package/dist/agent/run-store.d.ts +87 -14
  632. package/dist/agent/run-store.d.ts.map +1 -1
  633. package/dist/agent/run-store.js +331 -59
  634. package/dist/agent/run-store.js.map +1 -1
  635. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  636. package/dist/agent/thread-data-builder.js +6 -1
  637. package/dist/agent/thread-data-builder.js.map +1 -1
  638. package/dist/agent/types.d.ts +18 -6
  639. package/dist/agent/types.d.ts.map +1 -1
  640. package/dist/agent/types.js +9 -5
  641. package/dist/agent/types.js.map +1 -1
  642. package/dist/application-state/script-helpers.d.ts.map +1 -1
  643. package/dist/application-state/script-helpers.js +2 -2
  644. package/dist/application-state/script-helpers.js.map +1 -1
  645. package/dist/cli/agents.d.ts +2 -0
  646. package/dist/cli/agents.d.ts.map +1 -1
  647. package/dist/cli/agents.js +48 -1
  648. package/dist/cli/agents.js.map +1 -1
  649. package/dist/cli/app-skill.js +1 -1
  650. package/dist/cli/app-skill.js.map +1 -1
  651. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  652. package/dist/cli/code-agent-executor.js +3 -3
  653. package/dist/cli/code-agent-executor.js.map +1 -1
  654. package/dist/cli/design-connect.d.ts.map +1 -1
  655. package/dist/cli/design-connect.js +73 -8
  656. package/dist/cli/design-connect.js.map +1 -1
  657. package/dist/cli/skills-content/design-visual-edit-skill.d.ts +1 -1
  658. package/dist/cli/skills-content/design-visual-edit-skill.d.ts.map +1 -1
  659. package/dist/cli/skills-content/design-visual-edit-skill.js +169 -24
  660. package/dist/cli/skills-content/design-visual-edit-skill.js.map +1 -1
  661. package/dist/client/AssistantChat.d.ts.map +1 -1
  662. package/dist/client/AssistantChat.js +135 -125
  663. package/dist/client/AssistantChat.js.map +1 -1
  664. package/dist/client/agent-chat-adapter.d.ts +17 -0
  665. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  666. package/dist/client/agent-chat-adapter.js +141 -31
  667. package/dist/client/agent-chat-adapter.js.map +1 -1
  668. package/dist/client/chat/message-components.d.ts +9 -1
  669. package/dist/client/chat/message-components.d.ts.map +1 -1
  670. package/dist/client/chat/message-components.js +12 -1
  671. package/dist/client/chat/message-components.js.map +1 -1
  672. package/dist/client/embed-auth.d.ts.map +1 -1
  673. package/dist/client/embed-auth.js +3 -1
  674. package/dist/client/embed-auth.js.map +1 -1
  675. package/dist/client/integrations/IntegrationCard.d.ts.map +1 -1
  676. package/dist/client/integrations/IntegrationCard.js +9 -4
  677. package/dist/client/integrations/IntegrationCard.js.map +1 -1
  678. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
  679. package/dist/client/integrations/IntegrationsPanel.js +13 -7
  680. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  681. package/dist/client/integrations/webhook-url.d.ts +7 -0
  682. package/dist/client/integrations/webhook-url.d.ts.map +1 -0
  683. package/dist/client/integrations/webhook-url.js +32 -0
  684. package/dist/client/integrations/webhook-url.js.map +1 -0
  685. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  686. package/dist/client/org/OrgSwitcher.js +13 -11
  687. package/dist/client/org/OrgSwitcher.js.map +1 -1
  688. package/dist/client/org/RequireActiveOrg.d.ts.map +1 -1
  689. package/dist/client/org/RequireActiveOrg.js +2 -2
  690. package/dist/client/org/RequireActiveOrg.js.map +1 -1
  691. package/dist/client/org/TeamPage.d.ts.map +1 -1
  692. package/dist/client/org/TeamPage.js +52 -13
  693. package/dist/client/org/TeamPage.js.map +1 -1
  694. package/dist/client/org/hooks.d.ts +9 -0
  695. package/dist/client/org/hooks.d.ts.map +1 -1
  696. package/dist/client/org/hooks.js +24 -0
  697. package/dist/client/org/hooks.js.map +1 -1
  698. package/dist/client/org/index.d.ts +1 -1
  699. package/dist/client/org/index.d.ts.map +1 -1
  700. package/dist/client/org/index.js +1 -1
  701. package/dist/client/org/index.js.map +1 -1
  702. package/dist/client/require-session.d.ts +12 -17
  703. package/dist/client/require-session.d.ts.map +1 -1
  704. package/dist/client/require-session.js +36 -23
  705. package/dist/client/require-session.js.map +1 -1
  706. package/dist/client/session-replay.js +1 -1
  707. package/dist/client/session-replay.js.map +1 -1
  708. package/dist/client/settings/DemoModeSection.d.ts +0 -1
  709. package/dist/client/settings/DemoModeSection.d.ts.map +1 -1
  710. package/dist/client/settings/DemoModeSection.js +0 -4
  711. package/dist/client/settings/DemoModeSection.js.map +1 -1
  712. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  713. package/dist/client/settings/SecretsSection.js +12 -8
  714. package/dist/client/settings/SecretsSection.js.map +1 -1
  715. package/dist/client/settings/VoiceTranscriptionSection.d.ts +0 -1
  716. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  717. package/dist/client/settings/VoiceTranscriptionSection.js +1 -4
  718. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  719. package/dist/client/sse-event-processor.d.ts +33 -1
  720. package/dist/client/sse-event-processor.d.ts.map +1 -1
  721. package/dist/client/sse-event-processor.js +83 -8
  722. package/dist/client/sse-event-processor.js.map +1 -1
  723. package/dist/client/use-action.d.ts.map +1 -1
  724. package/dist/client/use-action.js +23 -14
  725. package/dist/client/use-action.js.map +1 -1
  726. package/dist/client/use-agent-engine-configured.d.ts +9 -3
  727. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  728. package/dist/client/use-agent-engine-configured.js +30 -3
  729. package/dist/client/use-agent-engine-configured.js.map +1 -1
  730. package/dist/client/use-db-sync.d.ts +3 -0
  731. package/dist/client/use-db-sync.d.ts.map +1 -1
  732. package/dist/client/use-db-sync.js +18 -1
  733. package/dist/client/use-db-sync.js.map +1 -1
  734. package/dist/collab/awareness.d.ts +2 -2
  735. package/dist/collab/awareness.d.ts.map +1 -1
  736. package/dist/collab/routes.d.ts +1 -1
  737. package/dist/credentials/index.d.ts +29 -1
  738. package/dist/credentials/index.d.ts.map +1 -1
  739. package/dist/credentials/index.js +111 -2
  740. package/dist/credentials/index.js.map +1 -1
  741. package/dist/deploy/build.d.ts +14 -3
  742. package/dist/deploy/build.d.ts.map +1 -1
  743. package/dist/deploy/build.js +81 -24
  744. package/dist/deploy/build.js.map +1 -1
  745. package/dist/deploy/workspace-deploy.d.ts +15 -0
  746. package/dist/deploy/workspace-deploy.d.ts.map +1 -1
  747. package/dist/deploy/workspace-deploy.js +19 -18
  748. package/dist/deploy/workspace-deploy.js.map +1 -1
  749. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  750. package/dist/guards/no-localhost-fallback.d.ts +7 -0
  751. package/dist/guards/no-localhost-fallback.d.ts.map +1 -1
  752. package/dist/guards/no-localhost-fallback.js +75 -16
  753. package/dist/guards/no-localhost-fallback.js.map +1 -1
  754. package/dist/integrations/google-docs-poller.d.ts.map +1 -1
  755. package/dist/integrations/google-docs-poller.js +8 -3
  756. package/dist/integrations/google-docs-poller.js.map +1 -1
  757. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  758. package/dist/integrations/webhook-handler.js +22 -4
  759. package/dist/integrations/webhook-handler.js.map +1 -1
  760. package/dist/jobs/scheduler.d.ts +17 -0
  761. package/dist/jobs/scheduler.d.ts.map +1 -1
  762. package/dist/jobs/scheduler.js +60 -33
  763. package/dist/jobs/scheduler.js.map +1 -1
  764. package/dist/localization/default-messages.d.ts +17 -1
  765. package/dist/localization/default-messages.d.ts.map +1 -1
  766. package/dist/localization/default-messages.js +17 -1
  767. package/dist/localization/default-messages.js.map +1 -1
  768. package/dist/notifications/routes.d.ts +1 -1
  769. package/dist/observability/evals.d.ts.map +1 -1
  770. package/dist/observability/evals.js +7 -10
  771. package/dist/observability/evals.js.map +1 -1
  772. package/dist/observability/routes.d.ts +1 -1
  773. package/dist/observability/traces.d.ts +2 -0
  774. package/dist/observability/traces.d.ts.map +1 -1
  775. package/dist/observability/traces.js.map +1 -1
  776. package/dist/org/accept-pending.js +2 -2
  777. package/dist/org/accept-pending.js.map +1 -1
  778. package/dist/org/active-org.d.ts +16 -0
  779. package/dist/org/active-org.d.ts.map +1 -0
  780. package/dist/org/active-org.js +57 -0
  781. package/dist/org/active-org.js.map +1 -0
  782. package/dist/org/auto-join-domain.d.ts.map +1 -1
  783. package/dist/org/auto-join-domain.js +3 -2
  784. package/dist/org/auto-join-domain.js.map +1 -1
  785. package/dist/org/context.d.ts +19 -1
  786. package/dist/org/context.d.ts.map +1 -1
  787. package/dist/org/context.js +159 -71
  788. package/dist/org/context.js.map +1 -1
  789. package/dist/org/handlers.d.ts +24 -1
  790. package/dist/org/handlers.d.ts.map +1 -1
  791. package/dist/org/handlers.js +129 -10
  792. package/dist/org/handlers.js.map +1 -1
  793. package/dist/org/plugin.d.ts +2 -0
  794. package/dist/org/plugin.d.ts.map +1 -1
  795. package/dist/org/plugin.js +9 -2
  796. package/dist/org/plugin.js.map +1 -1
  797. package/dist/org/types.d.ts +6 -1
  798. package/dist/org/types.d.ts.map +1 -1
  799. package/dist/org/types.js.map +1 -1
  800. package/dist/progress/routes.d.ts +1 -1
  801. package/dist/provider-api/actions/custom-provider-registration.d.ts +9 -9
  802. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  803. package/dist/provider-api/index.d.ts.map +1 -1
  804. package/dist/provider-api/index.js +3 -2
  805. package/dist/provider-api/index.js.map +1 -1
  806. package/dist/resources/handlers.d.ts.map +1 -1
  807. package/dist/resources/handlers.js +2 -7
  808. package/dist/resources/handlers.js.map +1 -1
  809. package/dist/resources/script-helpers.d.ts.map +1 -1
  810. package/dist/resources/script-helpers.js +2 -2
  811. package/dist/resources/script-helpers.js.map +1 -1
  812. package/dist/scripts/chat/search-chats.d.ts.map +1 -1
  813. package/dist/scripts/chat/search-chats.js +2 -2
  814. package/dist/scripts/chat/search-chats.js.map +1 -1
  815. package/dist/scripts/describe-workspace-apps.d.ts +4 -0
  816. package/dist/scripts/describe-workspace-apps.d.ts.map +1 -0
  817. package/dist/scripts/describe-workspace-apps.js +34 -0
  818. package/dist/scripts/describe-workspace-apps.js.map +1 -0
  819. package/dist/scripts/resources/delete-memory.d.ts.map +1 -1
  820. package/dist/scripts/resources/delete-memory.js +2 -2
  821. package/dist/scripts/resources/delete-memory.js.map +1 -1
  822. package/dist/scripts/resources/delete.d.ts.map +1 -1
  823. package/dist/scripts/resources/delete.js +2 -2
  824. package/dist/scripts/resources/delete.js.map +1 -1
  825. package/dist/scripts/resources/effective.d.ts.map +1 -1
  826. package/dist/scripts/resources/effective.js +2 -2
  827. package/dist/scripts/resources/effective.js.map +1 -1
  828. package/dist/scripts/resources/list.d.ts.map +1 -1
  829. package/dist/scripts/resources/list.js +2 -2
  830. package/dist/scripts/resources/list.js.map +1 -1
  831. package/dist/scripts/resources/read.d.ts.map +1 -1
  832. package/dist/scripts/resources/read.js +2 -2
  833. package/dist/scripts/resources/read.js.map +1 -1
  834. package/dist/scripts/resources/save-memory.d.ts.map +1 -1
  835. package/dist/scripts/resources/save-memory.js +2 -2
  836. package/dist/scripts/resources/save-memory.js.map +1 -1
  837. package/dist/scripts/resources/write.d.ts.map +1 -1
  838. package/dist/scripts/resources/write.js +2 -2
  839. package/dist/scripts/resources/write.js.map +1 -1
  840. package/dist/secrets/routes.d.ts +9 -9
  841. package/dist/server/agent-capabilities.d.ts +21 -0
  842. package/dist/server/agent-capabilities.d.ts.map +1 -0
  843. package/dist/server/agent-capabilities.js +106 -0
  844. package/dist/server/agent-capabilities.js.map +1 -0
  845. package/dist/server/agent-chat/framework-prompts.d.ts.map +1 -1
  846. package/dist/server/agent-chat/framework-prompts.js +11 -13
  847. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  848. package/dist/server/agent-chat/prompt-resources.d.ts +32 -0
  849. package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
  850. package/dist/server/agent-chat/prompt-resources.js +117 -56
  851. package/dist/server/agent-chat/prompt-resources.js.map +1 -1
  852. package/dist/server/agent-chat/script-entries.d.ts.map +1 -1
  853. package/dist/server/agent-chat/script-entries.js +18 -8
  854. package/dist/server/agent-chat/script-entries.js.map +1 -1
  855. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  856. package/dist/server/agent-chat-plugin.js +27 -1
  857. package/dist/server/agent-chat-plugin.js.map +1 -1
  858. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  859. package/dist/server/auth.d.ts +9 -9
  860. package/dist/server/auth.d.ts.map +1 -1
  861. package/dist/server/auth.js +32 -33
  862. package/dist/server/auth.js.map +1 -1
  863. package/dist/server/core-routes-plugin.d.ts +45 -0
  864. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  865. package/dist/server/core-routes-plugin.js +162 -139
  866. package/dist/server/core-routes-plugin.js.map +1 -1
  867. package/dist/server/credential-provider.d.ts +35 -2
  868. package/dist/server/credential-provider.d.ts.map +1 -1
  869. package/dist/server/credential-provider.js +155 -40
  870. package/dist/server/credential-provider.js.map +1 -1
  871. package/dist/server/embed-session.d.ts.map +1 -1
  872. package/dist/server/embed-session.js +10 -0
  873. package/dist/server/embed-session.js.map +1 -1
  874. package/dist/server/framework-request-handler.d.ts.map +1 -1
  875. package/dist/server/framework-request-handler.js +38 -0
  876. package/dist/server/framework-request-handler.js.map +1 -1
  877. package/dist/server/google-auth-plugin.d.ts.map +1 -1
  878. package/dist/server/google-auth-plugin.js +12 -444
  879. package/dist/server/google-auth-plugin.js.map +1 -1
  880. package/dist/server/index.d.ts +2 -2
  881. package/dist/server/index.d.ts.map +1 -1
  882. package/dist/server/index.js +2 -2
  883. package/dist/server/index.js.map +1 -1
  884. package/dist/server/onboarding-html.d.ts.map +1 -1
  885. package/dist/server/onboarding-html.js +20 -56
  886. package/dist/server/onboarding-html.js.map +1 -1
  887. package/dist/server/open-route.d.ts.map +1 -1
  888. package/dist/server/open-route.js +6 -1
  889. package/dist/server/open-route.js.map +1 -1
  890. package/dist/server/poll.js +1 -1
  891. package/dist/server/poll.js.map +1 -1
  892. package/dist/server/prompts/framework-core-compact.d.ts.map +1 -1
  893. package/dist/server/prompts/framework-core-compact.js +5 -6
  894. package/dist/server/prompts/framework-core-compact.js.map +1 -1
  895. package/dist/server/prompts/framework-core.d.ts.map +1 -1
  896. package/dist/server/prompts/framework-core.js +7 -10
  897. package/dist/server/prompts/framework-core.js.map +1 -1
  898. package/dist/server/prompts/shared-rules.d.ts +20 -2
  899. package/dist/server/prompts/shared-rules.d.ts.map +1 -1
  900. package/dist/server/prompts/shared-rules.js +20 -10
  901. package/dist/server/prompts/shared-rules.js.map +1 -1
  902. package/dist/server/request-context.d.ts +26 -1
  903. package/dist/server/request-context.d.ts.map +1 -1
  904. package/dist/server/request-context.js +52 -2
  905. package/dist/server/request-context.js.map +1 -1
  906. package/dist/server/scoped-key-storage.js +1 -1
  907. package/dist/server/scoped-key-storage.js.map +1 -1
  908. package/dist/settings/org-settings.d.ts +2 -0
  909. package/dist/settings/org-settings.d.ts.map +1 -1
  910. package/dist/settings/org-settings.js +5 -1
  911. package/dist/settings/org-settings.js.map +1 -1
  912. package/dist/settings/store.d.ts +6 -0
  913. package/dist/settings/store.d.ts.map +1 -1
  914. package/dist/settings/store.js +25 -0
  915. package/dist/settings/store.js.map +1 -1
  916. package/dist/shared/index.d.ts +1 -0
  917. package/dist/shared/index.d.ts.map +1 -1
  918. package/dist/shared/index.js +1 -0
  919. package/dist/shared/index.js.map +1 -1
  920. package/dist/shared/sign-in-journey.d.ts +102 -0
  921. package/dist/shared/sign-in-journey.d.ts.map +1 -0
  922. package/dist/shared/sign-in-journey.js +269 -0
  923. package/dist/shared/sign-in-journey.js.map +1 -0
  924. package/dist/styles/agent-native.css +8 -0
  925. package/dist/templates/chat/.agents/skills/actions/SKILL.md +19 -1
  926. package/dist/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
  927. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
  928. package/dist/templates/chat/.agents/skills/security/SKILL.md +2 -0
  929. package/dist/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
  930. package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
  931. package/dist/templates/chat/.agents/skills/sharing/SKILL.md +228 -0
  932. package/dist/templates/chat/.agents/skills/storing-data/SKILL.md +178 -0
  933. package/dist/templates/chat/AGENTS.md +8 -0
  934. package/dist/templates/chat/app/entry.client.tsx +3 -0
  935. package/dist/templates/default/.agents/skills/actions/SKILL.md +19 -1
  936. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +2 -0
  937. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +20 -6
  938. package/dist/templates/default/.agents/skills/security/SKILL.md +2 -0
  939. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +4 -3
  940. package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +7 -3
  941. package/dist/templates/default/AGENTS.md +68 -195
  942. package/dist/templates/default/app/entry.client.tsx +3 -0
  943. package/dist/templates/default/app/i18n/ar-SA.ts +8 -0
  944. package/dist/templates/default/app/i18n/de-DE.ts +8 -0
  945. package/dist/templates/default/app/i18n/en-US.ts +8 -0
  946. package/dist/templates/default/app/i18n/es-ES.ts +8 -0
  947. package/dist/templates/default/app/i18n/fr-FR.ts +8 -0
  948. package/dist/templates/default/app/i18n/hi-IN.ts +8 -0
  949. package/dist/templates/default/app/i18n/ja-JP.ts +8 -0
  950. package/dist/templates/default/app/i18n/ko-KR.ts +8 -0
  951. package/dist/templates/default/app/i18n/pt-BR.ts +8 -0
  952. package/dist/templates/default/app/i18n/zh-CN.ts +8 -0
  953. package/dist/templates/default/app/i18n/zh-TW.ts +8 -0
  954. package/dist/templates/headless/.agents/skills/actions/SKILL.md +19 -1
  955. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +19 -1
  956. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +2 -0
  957. package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +100 -0
  958. package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -1
  959. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +28 -0
  960. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +14 -1
  961. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +20 -6
  962. package/dist/templates/workspace-core/.agents/skills/qa/SKILL.md +6 -3
  963. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +2 -0
  964. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -3
  965. package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +7 -3
  966. package/dist/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +91 -0
  967. package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +60 -0
  968. package/dist/templates/workspace-core/AGENTS.md +62 -124
  969. package/dist/templates/workspace-root/AGENTS.md +6 -1
  970. package/dist/triggers/dispatcher.d.ts.map +1 -1
  971. package/dist/triggers/dispatcher.js +10 -3
  972. package/dist/triggers/dispatcher.js.map +1 -1
  973. package/dist/vite/client.d.ts.map +1 -1
  974. package/dist/vite/client.js +18 -8
  975. package/dist/vite/client.js.map +1 -1
  976. package/docs/content/actions.mdx +33 -20
  977. package/docs/content/agent-mentions.mdx +30 -19
  978. package/docs/content/agent-native-toolkit.mdx +8 -6
  979. package/docs/content/agent-resources.mdx +11 -0
  980. package/docs/content/agent-surfaces.mdx +41 -30
  981. package/docs/content/audit-log.mdx +78 -0
  982. package/docs/content/authentication.mdx +7 -5
  983. package/docs/content/automations.mdx +15 -9
  984. package/docs/content/client.mdx +11 -11
  985. package/docs/content/cloneable-saas.mdx +7 -1
  986. package/docs/content/code-agents-ui.mdx +9 -1
  987. package/docs/content/components.mdx +7 -0
  988. package/docs/content/context-awareness.mdx +1 -0
  989. package/docs/content/creating-templates.mdx +9 -1
  990. package/docs/content/custom-design-system.mdx +8 -0
  991. package/docs/content/data-programs.mdx +6 -0
  992. package/docs/content/deployment.mdx +2 -0
  993. package/docs/content/doctor.mdx +5 -3
  994. package/docs/content/extensions.mdx +26 -0
  995. package/docs/content/external-agents-catalog.mdx +533 -0
  996. package/docs/content/external-agents.mdx +20 -514
  997. package/docs/content/faq.mdx +2 -2
  998. package/docs/content/file-uploads.mdx +44 -0
  999. package/docs/content/frames.mdx +2 -2
  1000. package/docs/content/generative-ui.mdx +8 -0
  1001. package/docs/content/getting-started.mdx +45 -17
  1002. package/docs/content/human-approval.mdx +9 -0
  1003. package/docs/content/integrations.mdx +4 -3
  1004. package/docs/content/internationalization.mdx +4 -11
  1005. package/docs/content/key-concepts.mdx +1 -1
  1006. package/docs/content/local-file-mode.mdx +5 -0
  1007. package/docs/content/mcp-apps.mdx +2 -1
  1008. package/docs/content/mcp-clients.mdx +32 -1
  1009. package/docs/content/mcp-protocol.mdx +4 -3
  1010. package/docs/content/messaging-internals.mdx +328 -0
  1011. package/docs/content/messaging-recipes.mdx +194 -0
  1012. package/docs/content/messaging.mdx +9 -307
  1013. package/docs/content/multi-app-workspace.mdx +1 -1
  1014. package/docs/content/multi-tenancy.mdx +1 -0
  1015. package/docs/content/native-chat-ui.mdx +8 -0
  1016. package/docs/content/notifications.mdx +18 -20
  1017. package/docs/content/observability.mdx +1 -0
  1018. package/docs/content/onboarding.mdx +20 -6
  1019. package/docs/content/organizations-teams-permissions.mdx +99 -124
  1020. package/docs/content/package-lifecycle.mdx +19 -7
  1021. package/docs/content/progress.mdx +11 -0
  1022. package/docs/content/real-time-collaboration.mdx +44 -3
  1023. package/docs/content/recurring-jobs.mdx +14 -1
  1024. package/docs/content/security.mdx +5 -2
  1025. package/docs/content/server.mdx +2 -1
  1026. package/docs/content/sharing.mdx +22 -3
  1027. package/docs/content/skills-guide.mdx +62 -19
  1028. package/docs/content/syncing-template-changes.mdx +9 -0
  1029. package/docs/content/template-analytics-connectors.mdx +75 -0
  1030. package/docs/content/template-analytics-dashboards.mdx +106 -0
  1031. package/docs/content/template-analytics-developers.mdx +287 -0
  1032. package/docs/content/template-analytics-monitoring-and-sessions.mdx +109 -0
  1033. package/docs/content/template-analytics.mdx +21 -263
  1034. package/docs/content/template-assets-developers.mdx +456 -0
  1035. package/docs/content/template-assets-generation.mdx +147 -0
  1036. package/docs/content/template-assets-integrations.mdx +319 -0
  1037. package/docs/content/template-assets-presets.mdx +185 -0
  1038. package/docs/content/template-assets.mdx +12 -562
  1039. package/docs/content/template-brain-agent.mdx +103 -0
  1040. package/docs/content/template-brain-developers.mdx +379 -0
  1041. package/docs/content/template-brain-knowledge.mdx +50 -0
  1042. package/docs/content/template-brain-sources.mdx +163 -0
  1043. package/docs/content/template-brain.mdx +30 -390
  1044. package/docs/content/template-calendar-agent.mdx +133 -0
  1045. package/docs/content/template-calendar-booking-links.mdx +73 -0
  1046. package/docs/content/template-calendar-developers.mdx +366 -0
  1047. package/docs/content/template-calendar-scheduling.mdx +128 -0
  1048. package/docs/content/template-calendar.mdx +13 -260
  1049. package/docs/content/template-chat-developers.mdx +88 -0
  1050. package/docs/content/template-chat-first-edits.mdx +145 -0
  1051. package/docs/content/template-chat.mdx +12 -77
  1052. package/docs/content/template-clips-ai-and-editing.mdx +114 -0
  1053. package/docs/content/template-clips-capture-everywhere.mdx +120 -0
  1054. package/docs/content/template-clips-developers.mdx +373 -0
  1055. package/docs/content/template-clips-sharing-and-teams.mdx +182 -0
  1056. package/docs/content/template-clips.mdx +19 -508
  1057. package/docs/content/template-content-databases.mdx +406 -0
  1058. package/docs/content/template-content-developers.mdx +364 -0
  1059. package/docs/content/template-content-editing.mdx +60 -0
  1060. package/docs/content/template-content-sync.mdx +149 -0
  1061. package/docs/content/template-content.mdx +21 -561
  1062. package/docs/content/template-design-brand-and-figma.mdx +150 -0
  1063. package/docs/content/template-design-collaboration-and-full-apps.mdx +125 -0
  1064. package/docs/content/template-design-developers.mdx +358 -0
  1065. package/docs/content/template-design-quality-and-components.mdx +95 -0
  1066. package/docs/content/template-design.mdx +20 -344
  1067. package/docs/content/template-dispatch-developers.mdx +121 -0
  1068. package/docs/content/template-dispatch-messaging-routing.mdx +114 -0
  1069. package/docs/content/template-dispatch-operations.mdx +160 -0
  1070. package/docs/content/template-dispatch-vault-integrations.mdx +316 -0
  1071. package/docs/content/template-dispatch.mdx +24 -283
  1072. package/docs/content/template-forms-building-publishing.mdx +135 -0
  1073. package/docs/content/template-forms-developers.mdx +195 -0
  1074. package/docs/content/template-forms-responses.mdx +120 -0
  1075. package/docs/content/template-forms.mdx +21 -230
  1076. package/docs/content/template-mail-agent.mdx +114 -0
  1077. package/docs/content/template-mail-developers.mdx +356 -0
  1078. package/docs/content/template-mail-drafts-and-queue.mdx +103 -0
  1079. package/docs/content/template-mail-inbox.mdx +118 -0
  1080. package/docs/content/template-mail.mdx +23 -274
  1081. package/docs/content/template-plan-automations.mdx +213 -0
  1082. package/docs/content/template-plan-developers.mdx +703 -0
  1083. package/docs/content/template-plan-local-and-desktop.mdx +236 -0
  1084. package/docs/content/template-plan-review-workflow.mdx +180 -0
  1085. package/docs/content/template-plan.mdx +60 -910
  1086. package/docs/content/template-slides-agent.mdx +102 -0
  1087. package/docs/content/template-slides-design-and-media.mdx +94 -0
  1088. package/docs/content/template-slides-developers.mdx +488 -0
  1089. package/docs/content/template-slides-editing.mdx +56 -0
  1090. package/docs/content/template-slides.mdx +20 -362
  1091. package/docs/content/toolkit-capability-packages.mdx +38 -13
  1092. package/docs/content/toolkit-context-knowledge.mdx +49 -9
  1093. package/docs/content/toolkit-editors-canvases.mdx +72 -10
  1094. package/docs/content/toolkit-resources.mdx +16 -0
  1095. package/docs/content/toolkit-settings.mdx +3 -3
  1096. package/docs/content/toolkit-sharing.mdx +5 -7
  1097. package/docs/content/using-your-agent.mdx +25 -2
  1098. package/docs/content/voice-input.mdx +11 -7
  1099. package/docs/content/what-is-agent-native.mdx +1 -0
  1100. package/docs/content/workspace-connections.mdx +21 -11
  1101. package/docs/content/workspace-management.mdx +1 -1
  1102. package/package.json +2 -4
  1103. package/src/a2a/client.ts +4 -2
  1104. package/src/agent/action-warnings.ts +103 -0
  1105. package/src/agent/durable-background.ts +42 -5
  1106. package/src/agent/engine/ai-sdk-engine.ts +58 -6
  1107. package/src/agent/engine/anthropic-engine.ts +51 -8
  1108. package/src/agent/engine/builder-engine.ts +56 -18
  1109. package/src/agent/engine/continuation-dispatch-retry.ts +10 -9
  1110. package/src/agent/engine/credential-errors.ts +11 -0
  1111. package/src/agent/engine/error-detail.ts +39 -0
  1112. package/src/agent/engine/prompt-cache.ts +44 -0
  1113. package/src/agent/engine/registry.ts +22 -30
  1114. package/src/agent/engine/tool-call-journal-seed.ts +2 -1
  1115. package/src/agent/engine/translate-anthropic.ts +99 -0
  1116. package/src/agent/loop-settings.ts +94 -7
  1117. package/src/agent/production-agent.ts +667 -157
  1118. package/src/agent/run-loop-with-resume.ts +27 -1
  1119. package/src/agent/run-manager.ts +229 -39
  1120. package/src/agent/run-store.ts +397 -64
  1121. package/src/agent/thread-data-builder.ts +5 -1
  1122. package/src/agent/types.ts +23 -6
  1123. package/src/application-state/script-helpers.ts +5 -2
  1124. package/src/cli/agents.ts +69 -1
  1125. package/src/cli/app-skill.ts +1 -1
  1126. package/src/cli/code-agent-executor.ts +7 -3
  1127. package/src/cli/design-connect.ts +82 -8
  1128. package/src/cli/skills-content/design-visual-edit-skill.ts +169 -24
  1129. package/src/client/AssistantChat.tsx +623 -607
  1130. package/src/client/agent-chat-adapter.ts +176 -29
  1131. package/src/client/chat/message-components.tsx +13 -0
  1132. package/src/client/embed-auth.ts +3 -1
  1133. package/src/client/integrations/IntegrationCard.tsx +41 -24
  1134. package/src/client/integrations/IntegrationsPanel.tsx +37 -21
  1135. package/src/client/integrations/webhook-url.ts +29 -0
  1136. package/src/client/org/OrgSwitcher.tsx +41 -27
  1137. package/src/client/org/RequireActiveOrg.tsx +7 -0
  1138. package/src/client/org/TeamPage.tsx +144 -14
  1139. package/src/client/org/hooks.ts +27 -0
  1140. package/src/client/org/index.ts +2 -0
  1141. package/src/client/require-session.tsx +40 -29
  1142. package/src/client/session-replay.ts +1 -1
  1143. package/src/client/settings/DemoModeSection.tsx +0 -5
  1144. package/src/client/settings/SecretsSection.tsx +47 -42
  1145. package/src/client/settings/VoiceTranscriptionSection.tsx +0 -5
  1146. package/src/client/sse-event-processor.ts +83 -8
  1147. package/src/client/use-action.ts +22 -13
  1148. package/src/client/use-agent-engine-configured.ts +36 -4
  1149. package/src/client/use-db-sync.ts +21 -1
  1150. package/src/credentials/index.ts +124 -2
  1151. package/src/deploy/build.ts +93 -30
  1152. package/src/deploy/workspace-deploy.ts +21 -16
  1153. package/src/guards/no-localhost-fallback.ts +76 -14
  1154. package/src/integrations/google-docs-poller.ts +19 -12
  1155. package/src/integrations/webhook-handler.ts +56 -33
  1156. package/src/jobs/scheduler.ts +57 -23
  1157. package/src/localization/default-messages.ts +23 -1
  1158. package/src/observability/evals.ts +7 -8
  1159. package/src/observability/traces.ts +2 -0
  1160. package/src/org/accept-pending.ts +2 -2
  1161. package/src/org/active-org.ts +73 -0
  1162. package/src/org/auto-join-domain.ts +7 -2
  1163. package/src/org/context.ts +169 -66
  1164. package/src/org/handlers.ts +148 -10
  1165. package/src/org/plugin.ts +8 -1
  1166. package/src/org/types.ts +6 -1
  1167. package/src/provider-api/index.ts +6 -1
  1168. package/src/resources/handlers.ts +2 -6
  1169. package/src/resources/script-helpers.ts +2 -1
  1170. package/src/scripts/chat/search-chats.ts +5 -2
  1171. package/src/scripts/describe-workspace-apps.ts +59 -0
  1172. package/src/scripts/resources/delete-memory.ts +5 -2
  1173. package/src/scripts/resources/delete.ts +5 -2
  1174. package/src/scripts/resources/effective.ts +5 -2
  1175. package/src/scripts/resources/list.ts +5 -2
  1176. package/src/scripts/resources/read.ts +5 -2
  1177. package/src/scripts/resources/save-memory.ts +5 -2
  1178. package/src/scripts/resources/write.ts +5 -2
  1179. package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +11 -31
  1180. package/src/server/agent-capabilities.ts +147 -0
  1181. package/src/server/agent-chat/framework-prompts.ts +11 -13
  1182. package/src/server/agent-chat/prompt-resources.ts +183 -57
  1183. package/src/server/agent-chat/script-entries.ts +20 -7
  1184. package/src/server/agent-chat-plugin.ts +27 -0
  1185. package/src/server/auth.ts +38 -32
  1186. package/src/server/core-routes-plugin.ts +229 -179
  1187. package/src/server/credential-provider.ts +196 -44
  1188. package/src/server/embed-session.ts +10 -0
  1189. package/src/server/framework-request-handler.ts +43 -0
  1190. package/src/server/google-auth-plugin.ts +13 -450
  1191. package/src/server/index.ts +4 -1
  1192. package/src/server/onboarding-html.ts +20 -56
  1193. package/src/server/open-route.ts +6 -1
  1194. package/src/server/poll.ts +1 -1
  1195. package/src/server/prompts/framework-core-compact.ts +5 -5
  1196. package/src/server/prompts/framework-core.ts +7 -9
  1197. package/src/server/prompts/shared-rules.ts +20 -9
  1198. package/src/server/request-context.ts +58 -2
  1199. package/src/server/scoped-key-storage.ts +1 -1
  1200. package/src/settings/org-settings.ts +9 -0
  1201. package/src/settings/store.ts +29 -0
  1202. package/src/shared/index.ts +13 -0
  1203. package/src/shared/sign-in-journey.ts +331 -0
  1204. package/src/styles/agent-native.css +8 -0
  1205. package/src/templates/chat/.agents/skills/actions/SKILL.md +19 -1
  1206. package/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
  1207. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
  1208. package/src/templates/chat/.agents/skills/security/SKILL.md +2 -0
  1209. package/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
  1210. package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
  1211. package/src/templates/chat/.agents/skills/sharing/SKILL.md +228 -0
  1212. package/src/templates/chat/.agents/skills/storing-data/SKILL.md +178 -0
  1213. package/src/templates/chat/AGENTS.md +8 -0
  1214. package/src/templates/chat/app/entry.client.tsx +3 -0
  1215. package/src/templates/default/.agents/skills/actions/SKILL.md +19 -1
  1216. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +2 -0
  1217. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +20 -6
  1218. package/src/templates/default/.agents/skills/security/SKILL.md +2 -0
  1219. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +4 -3
  1220. package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +7 -3
  1221. package/src/templates/default/AGENTS.md +68 -195
  1222. package/src/templates/default/app/entry.client.tsx +3 -0
  1223. package/src/templates/default/app/i18n/ar-SA.ts +8 -0
  1224. package/src/templates/default/app/i18n/de-DE.ts +8 -0
  1225. package/src/templates/default/app/i18n/en-US.ts +8 -0
  1226. package/src/templates/default/app/i18n/es-ES.ts +8 -0
  1227. package/src/templates/default/app/i18n/fr-FR.ts +8 -0
  1228. package/src/templates/default/app/i18n/hi-IN.ts +8 -0
  1229. package/src/templates/default/app/i18n/ja-JP.ts +8 -0
  1230. package/src/templates/default/app/i18n/ko-KR.ts +8 -0
  1231. package/src/templates/default/app/i18n/pt-BR.ts +8 -0
  1232. package/src/templates/default/app/i18n/zh-CN.ts +8 -0
  1233. package/src/templates/default/app/i18n/zh-TW.ts +8 -0
  1234. package/src/templates/headless/.agents/skills/actions/SKILL.md +19 -1
  1235. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +19 -1
  1236. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +2 -0
  1237. package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +100 -0
  1238. package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -1
  1239. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +28 -0
  1240. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +14 -1
  1241. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +20 -6
  1242. package/src/templates/workspace-core/.agents/skills/qa/SKILL.md +6 -3
  1243. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +2 -0
  1244. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -3
  1245. package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +7 -3
  1246. package/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +91 -0
  1247. package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +60 -0
  1248. package/src/templates/workspace-core/AGENTS.md +62 -124
  1249. package/src/templates/workspace-root/AGENTS.md +6 -1
  1250. package/src/triggers/dispatcher.ts +28 -17
  1251. package/src/vite/client.ts +20 -8
  1252. package/corpus/core/src/client/components/MissingKeyCard.tsx +0 -61
  1253. package/corpus/core/src/client/extensions/agent-native-extension-runtime.ts +0 -495
  1254. package/corpus/core/src/client/settings/BackgroundAgentSection.tsx +0 -193
  1255. package/corpus/core/src/client/settings/BrowserSection.tsx +0 -110
  1256. package/corpus/templates/analytics/app/components/InlineMetric.tsx +0 -31
  1257. package/corpus/templates/analytics/app/components/auth/LoginScreen.tsx +0 -4
  1258. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +0 -128
  1259. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +0 -264
  1260. package/corpus/templates/analytics/app/components/dashboard/RecentActivity.tsx +0 -84
  1261. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +0 -92
  1262. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +0 -154
  1263. package/corpus/templates/analytics/app/components/dashboard/StatsCard.tsx +0 -49
  1264. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +0 -120
  1265. package/corpus/templates/analytics/server/handlers/dashboard-views.ts +0 -85
  1266. package/corpus/templates/analytics/server/handlers/user-prefs.ts +0 -58
  1267. package/corpus/templates/analytics/server/routes/api/dashboard-views/[dashboardId]/[viewId].delete.ts +0 -1
  1268. package/corpus/templates/analytics/server/routes/api/dashboard-views/[dashboardId].get.ts +0 -1
  1269. package/corpus/templates/analytics/server/routes/api/dashboard-views/[dashboardId].post.ts +0 -1
  1270. package/corpus/templates/analytics/server/routes/api/theme.get.ts +0 -17
  1271. package/corpus/templates/analytics/server/routes/api/theme.post.ts +0 -15
  1272. package/corpus/templates/analytics/server/routes/api/user-prefs/[key].delete.ts +0 -1
  1273. package/corpus/templates/analytics/server/routes/api/user-prefs/[key].get.ts +0 -1
  1274. package/corpus/templates/analytics/server/routes/api/user-prefs/[key].put.ts +0 -1
  1275. package/corpus/templates/assets/app/components/library/CreateLibraryDialog.tsx +0 -156
  1276. package/corpus/templates/assets/app/components/library/LibraryCard.tsx +0 -213
  1277. package/corpus/templates/calendar/app/components/calendar/GoogleSyncButton.tsx +0 -49
  1278. package/corpus/templates/calendar/server/routes/api/events/[id].delete.ts +0 -1
  1279. package/corpus/templates/calendar/server/routes/api/events/[id].get.ts +0 -1
  1280. package/corpus/templates/calendar/server/routes/api/events/[id].put.ts +0 -1
  1281. package/corpus/templates/content/app/components/layout/AppLayout.tsx +0 -9
  1282. package/corpus/templates/content/server/routes/api/comments/[id].delete.ts +0 -69
  1283. package/corpus/templates/content/server/routes/api/comments/[id].patch.ts +0 -109
  1284. package/corpus/templates/content/server/routes/api/documents/[id]/versions.get.ts +0 -53
  1285. package/corpus/templates/design/app/components/design/code-workbench/ActivityBar.tsx +0 -85
  1286. package/corpus/templates/design/app/components/design-system/DesignSystemCard.tsx +0 -129
  1287. package/corpus/templates/forms/app/components/layout/AppLayout.tsx +0 -9
  1288. package/corpus/templates/mail/app/components/email/SnoozePopover.tsx +0 -213
  1289. package/corpus/templates/mail/server/handlers/aliases.ts +0 -98
  1290. package/corpus/templates/mail/server/routes/api/aliases/[id].delete.ts +0 -1
  1291. package/corpus/templates/mail/server/routes/api/aliases/[id].patch.ts +0 -1
  1292. package/corpus/templates/mail/server/routes/api/aliases/index.get.ts +0 -1
  1293. package/corpus/templates/mail/server/routes/api/aliases/index.post.ts +0 -1
  1294. package/corpus/templates/mail/server/routes/api/automations/[id].delete.ts +0 -1
  1295. package/corpus/templates/mail/server/routes/api/automations/[id].patch.ts +0 -1
  1296. package/corpus/templates/mail/server/routes/api/automations/index.get.ts +0 -1
  1297. package/corpus/templates/mail/server/routes/api/automations/index.post.ts +0 -1
  1298. package/corpus/templates/mail/server/routes/api/automations/settings.get.ts +0 -22
  1299. package/corpus/templates/mail/server/routes/api/automations/settings.put.ts +0 -25
  1300. package/corpus/templates/mail/server/routes/api/scheduled-jobs/[id].delete.ts +0 -1
  1301. package/corpus/templates/mail/server/routes/api/scheduled-jobs/[id].patch.ts +0 -1
  1302. package/corpus/templates/mail/server/routes/api/scheduled-jobs/index.get.ts +0 -1
  1303. package/corpus/templates/mail/server/routes/api/scheduled-jobs/index.post.ts +0 -1
  1304. package/corpus/templates/mail/server/routes/api/settings.get.ts +0 -1
  1305. package/corpus/templates/mail/server/routes/api/settings.patch.ts +0 -1
  1306. package/corpus/templates/slides/app/components/deck/BuilderLogo.tsx +0 -22
  1307. package/corpus/templates/slides/app/components/design-system/DesignSystemPreview.tsx +0 -176
  1308. package/corpus/templates/slides/app/components/editor/GenerateSlidesDialog.tsx +0 -244
  1309. package/corpus/templates/slides/app/components/editor/ImportButton.tsx +0 -84
  1310. package/corpus/templates/slides/server/routes/api/comments/[id].delete.ts +0 -43
  1311. package/corpus/templates/slides/server/routes/api/comments/[id].patch.ts +0 -50
  1312. package/corpus/templates/slides/server/routes/api/decks/[id].delete.ts +0 -1
  1313. package/corpus/templates/slides/server/routes/api/decks/[id].get.ts +0 -1
  1314. package/corpus/templates/slides/server/routes/api/decks/[id].put.ts +0 -1
  1315. package/corpus/templates/slides/server/routes/api/decks/index.get.ts +0 -1
  1316. package/corpus/templates/slides/server/routes/api/decks/index.post.ts +0 -1
  1317. package/dist/client/components/MissingKeyCard.d.ts +0 -7
  1318. package/dist/client/components/MissingKeyCard.d.ts.map +0 -1
  1319. package/dist/client/components/MissingKeyCard.js +0 -32
  1320. package/dist/client/components/MissingKeyCard.js.map +0 -1
  1321. package/dist/client/extensions/agent-native-extension-runtime.d.ts +0 -69
  1322. package/dist/client/extensions/agent-native-extension-runtime.d.ts.map +0 -1
  1323. package/dist/client/extensions/agent-native-extension-runtime.js +0 -348
  1324. package/dist/client/extensions/agent-native-extension-runtime.js.map +0 -1
  1325. package/dist/client/settings/BackgroundAgentSection.d.ts +0 -2
  1326. package/dist/client/settings/BackgroundAgentSection.d.ts.map +0 -1
  1327. package/dist/client/settings/BackgroundAgentSection.js +0 -68
  1328. package/dist/client/settings/BackgroundAgentSection.js.map +0 -1
  1329. package/dist/client/settings/BrowserSection.d.ts +0 -2
  1330. package/dist/client/settings/BrowserSection.d.ts.map +0 -1
  1331. package/dist/client/settings/BrowserSection.js +0 -40
  1332. package/dist/client/settings/BrowserSection.js.map +0 -1
  1333. package/dist/templates/chat/.react-router/types/+server-build.d.ts +0 -18
  1334. package/dist/templates/chat/.react-router/types/app/+types/root.ts +0 -68
  1335. package/src/client/components/MissingKeyCard.tsx +0 -61
  1336. package/src/client/extensions/agent-native-extension-runtime.ts +0 -495
  1337. package/src/client/settings/BackgroundAgentSection.tsx +0 -193
  1338. package/src/client/settings/BrowserSection.tsx +0 -110
  1339. package/src/templates/chat/.react-router/types/+server-build.d.ts +0 -18
  1340. package/src/templates/chat/.react-router/types/app/+types/root.ts +0 -68
@@ -1,7 +1,9 @@
1
- import { getDbExec } from "../db/client.js";
1
+ import { warnAgent } from "../agent/action-warnings.js";
2
+ import { getDbExec, isTransientDatabaseError } from "../db/client.js";
2
3
  import { getSession } from "../server/auth.js";
3
4
  import { getSetting } from "../settings/store.js";
4
- import { getUserSetting, putUserSetting } from "../settings/user-settings.js";
5
+ import { getUserSetting } from "../settings/user-settings.js";
6
+ import { setActiveOrgId } from "./active-org.js";
5
7
  import { autoJoinDomainMatchingOrgs } from "./auto-join-domain.js";
6
8
  const EMPTY_CONTEXT = {
7
9
  email: "",
@@ -9,6 +11,31 @@ const EMPTY_CONTEXT = {
9
11
  orgName: null,
10
12
  role: null,
11
13
  };
14
+ /**
15
+ * The single way to read `org_members`, so no two call sites can pick opposite
16
+ * defaults for the same failure. A transient database failure is NOT an answer
17
+ * and propagates: a caller that turns it into "no memberships" silently drops
18
+ * org scope, which hides every org-scoped credential behind a
19
+ * permanent-sounding "not configured".
20
+ *
21
+ * `null` is every non-transient failure, not only the intended one (org tables
22
+ * absent on a fresh install before migrations). A permanently unreadable table
23
+ * — a role without SELECT, say — still reports as "no rows" here. Narrowing
24
+ * that further means classifying "no database configured" as readable-absent,
25
+ * which is load-bearing for CLI/script/test contexts that legitimately run
26
+ * without a store; see `assertCredentialStoreReadable`.
27
+ */
28
+ export async function queryOrgMembers(query) {
29
+ try {
30
+ const { rows } = await getDbExec().execute(query);
31
+ return rows;
32
+ }
33
+ catch (err) {
34
+ if (isTransientDatabaseError(err))
35
+ throw err;
36
+ return null;
37
+ }
38
+ }
12
39
  function normalizeOrgRole(value) {
13
40
  return value === "owner" || value === "admin" || value === "member"
14
41
  ? value
@@ -65,7 +92,12 @@ export async function getOrgContext(event) {
65
92
  // Per-request memoization. Multiple call sites per request (action wrappers,
66
93
  // SSR handler, loaders) must not each pay a separate org_members query.
67
94
  const ctx = event.context;
68
- return (ctx.__anOrgContextCache ??= resolveOrgContextUncached(event));
95
+ // Evict on failure. A memoized failure would otherwise answer every later
96
+ // caller in this request with the wrong org.
97
+ return (ctx.__anOrgContextCache ??= resolveOrgContextUncached(event).catch((err) => {
98
+ delete ctx.__anOrgContextCache;
99
+ throw err;
100
+ }));
69
101
  }
70
102
  const MEMBERSHIPS_CACHE_KEY = "__anOrgMembershipsCache";
71
103
  const ACTIVE_ORG_SETTING_CACHE_KEY = "__anActiveOrgSettingCache";
@@ -93,13 +125,18 @@ function loadActiveOrgSettingForEvent(event, email) {
93
125
  * `getOrgContext` need the membership rows; without sharing, every request
94
126
  * whose session lacks an orgId pays the query twice.
95
127
  */
96
- function loadMembershipsForEvent(event, exec, email) {
128
+ function loadMembershipsForEvent(event, email) {
97
129
  const ctx = event.context;
98
130
  const cache = (ctx[MEMBERSHIPS_CACHE_KEY] ??
99
131
  (ctx[MEMBERSHIPS_CACHE_KEY] = new Map()));
100
132
  let promise = cache.get(email);
101
133
  if (!promise) {
102
- promise = loadMemberships(exec, email);
134
+ // A failed read is evicted rather than memoized: caching it would make one
135
+ // transient error answer every later lookup in this request.
136
+ promise = loadMemberships(email).catch((err) => {
137
+ cache.delete(email);
138
+ throw err;
139
+ });
103
140
  cache.set(email, promise);
104
141
  }
105
142
  return promise;
@@ -119,7 +156,23 @@ async function resolveOrgContextUncached(event) {
119
156
  : null;
120
157
  const sessionOrgRole = normalizeOrgRole(session.orgRole);
121
158
  const exec = getDbExec();
122
- let memberships = await loadMembershipsForEvent(event, exec, email);
159
+ let memberships;
160
+ try {
161
+ memberships = await loadMembershipsForEvent(event, email);
162
+ }
163
+ catch (err) {
164
+ // A transient membership read must not downgrade an authenticated request
165
+ // to a private/solo scope when the session already carries its org.
166
+ if (sessionOrgId && isTransientDatabaseError(err)) {
167
+ return {
168
+ email,
169
+ orgId: sessionOrgId,
170
+ orgName: null,
171
+ role: sessionOrgRole,
172
+ };
173
+ }
174
+ throw err;
175
+ }
123
176
  if (memberships === null) {
124
177
  if (sessionOrgId) {
125
178
  return {
@@ -164,7 +217,7 @@ async function resolveOrgContextUncached(event) {
164
217
  });
165
218
  const joinedOrgId = joined.joined[0]?.orgId ?? null;
166
219
  if (joinedOrgId) {
167
- const refreshed = await loadMemberships(exec, email);
220
+ const refreshed = await loadMemberships(email);
168
221
  if (refreshed !== null) {
169
222
  memberships = refreshed;
170
223
  updateMembershipsForEvent(event, email, refreshed);
@@ -177,7 +230,7 @@ async function resolveOrgContextUncached(event) {
177
230
  (currentOrgId === null ||
178
231
  (await isSoloOwnedWorkspace(exec, currentOrgId, membershipsBeforeJoin)));
179
232
  if (shouldActivate) {
180
- await putUserSetting(email, "active-org-id", { orgId: joinedOrgId });
233
+ await setActiveOrgId(email, joinedOrgId, "joined domain-matched org");
181
234
  const active = memberships.find((m) => m.orgId === joinedOrgId);
182
235
  if (active) {
183
236
  return {
@@ -238,61 +291,58 @@ async function resolveOrgContextUncached(event) {
238
291
  role: memberships[0].role,
239
292
  };
240
293
  }
241
- async function loadMemberships(exec, email) {
242
- try {
243
- const { rows } = await exec.execute({
244
- sql: `SELECT m.org_id AS "orgId", m.role AS role, o.name AS "orgName",
245
- o.allowed_domain AS "allowedDomain"
246
- FROM org_members m
247
- INNER JOIN organizations o ON m.org_id = o.id
248
- WHERE LOWER(m.email) = ?`,
249
- args: [email.toLowerCase()],
250
- });
251
- return rows.map((r) => {
252
- const domain = r.allowedDomain ?? r.allowed_domain;
253
- return {
254
- orgId: String(r.orgId ?? r.org_id),
255
- role: String(r.role),
256
- orgName: String(r.orgName ?? r.org_name),
257
- allowedDomain: domain ? String(domain) : null,
258
- };
259
- });
260
- }
261
- catch {
262
- // Tables may not exist yet on first boot before migrations finish.
263
- return null;
264
- }
294
+ /**
295
+ * Ordering for every membership lookup that falls back to "first membership".
296
+ * Without it the fallback is whatever order the plan happens to return, so a
297
+ * multi-org user's active org can change between two identical requests — and
298
+ * `getSession` then freezes that arbitrary answer into `session.orgId`.
299
+ * `org_id` breaks ties so two memberships joined in the same millisecond still
300
+ * resolve identically.
301
+ */
302
+ const MEMBERSHIP_FALLBACK_ORDER_BY = `ORDER BY joined_at ASC, org_id ASC`;
303
+ async function loadMemberships(email) {
304
+ const rows = await queryOrgMembers({
305
+ sql: `SELECT m.org_id AS "orgId", m.role AS role, o.name AS "orgName",
306
+ o.allowed_domain AS "allowedDomain"
307
+ FROM org_members m
308
+ INNER JOIN organizations o ON m.org_id = o.id
309
+ WHERE LOWER(m.email) = ?
310
+ ${MEMBERSHIP_FALLBACK_ORDER_BY}`,
311
+ args: [email.toLowerCase()],
312
+ });
313
+ return (rows?.map((r) => {
314
+ const domain = r.allowedDomain ?? r.allowed_domain;
315
+ return {
316
+ orgId: String(r.orgId ?? r.org_id),
317
+ role: String(r.role),
318
+ orgName: String(r.orgName ?? r.org_name),
319
+ allowedDomain: domain ? String(domain) : null,
320
+ };
321
+ }) ?? null);
265
322
  }
266
323
  /**
267
324
  * Resolve the active org ID for a given email — for non-HTTP contexts like
268
325
  * the integration webhook handler where we have an email but no event/session.
269
326
  * Picks the user's active-org-id setting if set, including explicit Personal,
270
- * otherwise the first membership.
327
+ * otherwise the oldest membership.
271
328
  * Returns null if the user has no memberships.
272
329
  */
273
330
  export async function resolveOrgIdForEmail(email) {
274
- const exec = getDbExec();
275
- if (!exec)
331
+ const rows = await queryOrgMembers({
332
+ sql: `SELECT org_id FROM org_members WHERE LOWER(email) = ?
333
+ ${MEMBERSHIP_FALLBACK_ORDER_BY}`,
334
+ args: [email.toLowerCase()],
335
+ });
336
+ if (!rows?.length)
276
337
  return null;
277
- try {
278
- const { rows } = await exec.execute({
279
- sql: `SELECT org_id FROM org_members WHERE LOWER(email) = ?`,
280
- args: [email.toLowerCase()],
281
- });
282
- if (rows.length === 0)
283
- return null;
284
- const ids = rows.map((r) => String(r.org_id));
285
- const activeOrgSetting = (await getUserSetting(email, "active-org-id"));
286
- if (activeOrgSetting?.orgId === null)
287
- return null;
288
- if (activeOrgSetting?.orgId && ids.includes(activeOrgSetting.orgId)) {
289
- return activeOrgSetting.orgId;
290
- }
291
- return ids[0];
292
- }
293
- catch {
338
+ const ids = rows.map((r) => String(r.org_id));
339
+ const activeOrgSetting = (await getUserSetting(email, "active-org-id"));
340
+ if (activeOrgSetting?.orgId === null)
294
341
  return null;
342
+ if (activeOrgSetting?.orgId && ids.includes(activeOrgSetting.orgId)) {
343
+ return activeOrgSetting.orgId;
295
344
  }
345
+ return ids[0];
296
346
  }
297
347
  /**
298
348
  * Event-aware variant of `resolveOrgIdForEmail` for HTTP request paths.
@@ -301,25 +351,17 @@ export async function resolveOrgIdForEmail(email) {
301
351
  * in the same request pay ONE org_members round trip, not two.
302
352
  */
303
353
  export async function resolveOrgIdForEmailViaEvent(event, email) {
304
- try {
305
- const exec = getDbExec();
306
- if (!exec)
307
- return null;
308
- const memberships = await loadMembershipsForEvent(event, exec, email);
309
- if (!memberships || memberships.length === 0)
310
- return null;
311
- const activeOrgSetting = await loadActiveOrgSettingForEvent(event, email);
312
- if (activeOrgSetting?.orgId === null)
313
- return null;
314
- if (activeOrgSetting?.orgId &&
315
- memberships.some((m) => m.orgId === activeOrgSetting.orgId)) {
316
- return activeOrgSetting.orgId;
317
- }
318
- return memberships[0].orgId;
319
- }
320
- catch {
354
+ const memberships = await loadMembershipsForEvent(event, email);
355
+ if (!memberships || memberships.length === 0)
321
356
  return null;
357
+ const activeOrgSetting = await loadActiveOrgSettingForEvent(event, email);
358
+ if (activeOrgSetting?.orgId === null)
359
+ return null;
360
+ if (activeOrgSetting?.orgId &&
361
+ memberships.some((m) => m.orgId === activeOrgSetting.orgId)) {
362
+ return activeOrgSetting.orgId;
322
363
  }
364
+ return memberships[0].orgId;
323
365
  }
324
366
  /**
325
367
  * Create a new organization and add the caller as a member with the given
@@ -343,9 +385,55 @@ export async function createOrganization(name, email, role = "owner") {
343
385
  sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, ?, ?)`,
344
386
  args: [nanoid(), id, email, role, createdAt],
345
387
  });
346
- await putUserSetting(email, "active-org-id", { orgId: id });
388
+ await warnOnAdditionalOrganization(exec, email, id, trimmedName);
389
+ await setActiveOrgId(email, id, `created organization "${trimmedName}"`);
347
390
  return { id, name: trimmedName, role, a2aSecret, createdAt };
348
391
  }
392
+ /**
393
+ * A second organization is the single most expensive accident in this codebase:
394
+ * vault credentials are scoped per organization, so creating one and activating
395
+ * it orphans every key synced under the previous org, and the only symptom is a
396
+ * missing-env-var error somewhere else entirely. The UI warns humans before
397
+ * they click (`org.createOrgVaultNotice`); this covers the path that actually
398
+ * did the damage — app code or a migration action calling `createOrganization`
399
+ * directly, where no notice is ever rendered.
400
+ */
401
+ async function warnOnAdditionalOrganization(exec, email, newOrgId, newOrgName) {
402
+ try {
403
+ const { rows } = await exec.execute({
404
+ sql: `SELECT 1 FROM org_members WHERE LOWER(email) = ? AND org_id <> ? LIMIT 1`,
405
+ args: [email.toLowerCase(), newOrgId],
406
+ });
407
+ if (rows.length === 0)
408
+ return;
409
+ }
410
+ catch {
411
+ // "Couldn't tell" is not "it didn't" — swallowing the failed probe here made
412
+ // the function whose entire job is to not be silent, silent.
413
+ warnAgent({
414
+ severity: "critical",
415
+ code: "org-additional-org-membership-unreadable",
416
+ message: `Created an organization "${newOrgName}" (${newOrgId}) and made it the account's active org, ` +
417
+ `but could not read whether that account already belonged to another organization. If it did, ` +
418
+ `every vault credential synced under the previous organization is now unreadable for it, and ` +
419
+ `requests will fail with missing-credential errors that name the key rather than this org ` +
420
+ `change. Confirm the account's memberships before continuing; if this came from a roster, ` +
421
+ `identity, or user-list migration, add the members to the EXISTING organization instead.`,
422
+ });
423
+ return;
424
+ }
425
+ warnAgent({
426
+ severity: "critical",
427
+ code: "org-additional-organization",
428
+ message: `Created an ADDITIONAL organization "${newOrgName}" (${newOrgId}) ` +
429
+ `for an account that already belongs to another organization, and made it their active org. ` +
430
+ `Vault credentials are scoped per organization and are NOT shared between them: every API key ` +
431
+ `synced under the previous organization is now unreadable for this account until it is re-saved ` +
432
+ `in "${newOrgName}". Requests will fail with missing-credential errors that name the key rather ` +
433
+ `than this org change. If this came from a roster, identity, or user-list migration, add the ` +
434
+ `members to the EXISTING organization instead of creating a new one.`,
435
+ });
436
+ }
349
437
  function defaultOrgName(email, session) {
350
438
  const full = session?.name?.trim();
351
439
  if (full)
@@ -451,7 +539,7 @@ async function tryCreateDefaultOrg(exec, email, session) {
451
539
  sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, ?, ?)`,
452
540
  args: [nanoid(), orgId, email, "owner", now],
453
541
  });
454
- await putUserSetting(email, "active-org-id", { orgId });
542
+ await setActiveOrgId(email, orgId, "auto-created default organization");
455
543
  return { email, orgId, orgName, role: "owner" };
456
544
  }
457
545
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/org/context.ts"],"names":[],"mappings":"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","sourcesContent":["import type { H3Event } from \"h3\";\n\nimport { getDbExec } from \"../db/client.js\";\nimport { getSession } from \"../server/auth.js\";\nimport { getSetting } from \"../settings/store.js\";\nimport { getUserSetting, putUserSetting } from \"../settings/user-settings.js\";\nimport { autoJoinDomainMatchingOrgs } from \"./auto-join-domain.js\";\nimport type { OrgContext, OrgRole } from \"./types.js\";\n\nconst EMPTY_CONTEXT: OrgContext = {\n email: \"\",\n orgId: null,\n orgName: null,\n role: null,\n};\n\nfunction normalizeOrgRole(value: unknown): OrgRole | null {\n return value === \"owner\" || value === \"admin\" || value === \"member\"\n ? value\n : null;\n}\n\nfunction emailDomainOf(email: string): string | null {\n return email.split(\"@\")[1]?.toLowerCase() || null;\n}\n\n/**\n * A workspace the user owns that nobody else has joined is a default/personal\n * workspace whatever it happens to be named, so moving the user into their\n * company org is safe. An org with other members is a team they deliberately\n * belong to — join the domain org in the background but leave them there.\n */\nasync function isSoloOwnedWorkspace(\n exec: ReturnType<typeof getDbExec>,\n orgId: string,\n memberships: MembershipRow[],\n): Promise<boolean> {\n const membership = memberships.find((m) => m.orgId === orgId);\n if (!membership || membership.role !== \"owner\") return false;\n try {\n const { rows } = await exec.execute({\n sql: `SELECT COUNT(*) AS \"memberCount\" FROM org_members WHERE org_id = ?`,\n args: [orgId],\n });\n const row = rows[0] as any;\n return Number(row?.memberCount ?? row?.membercount ?? 0) <= 1;\n } catch {\n return false;\n }\n}\n\nfunction autoCreateDefaultOrgEnabled(): boolean {\n const raw = process.env.AUTO_CREATE_DEFAULT_ORG;\n if (raw === undefined || raw.trim() === \"\") return true;\n return ![\"0\", \"false\", \"no\", \"off\"].includes(raw.trim().toLowerCase());\n}\n\nconst nanoid = (): string =>\n globalThis.crypto?.randomUUID?.().replace(/-/g, \"\") ??\n Math.random().toString(36).slice(2) + Date.now().toString(36);\n\n/**\n * Resolve the current user's organization context from their session.\n *\n * - Honors the user's `active-org-id` setting, including an explicit Personal\n * context represented by `{ orgId: null }`.\n * - Falls back to the user's first membership.\n * - When the authenticated user has zero memberships, provisions a default org\n * named after the user ({name}'s workspace, falling back to the email\n * local-part). Set `AUTO_CREATE_DEFAULT_ORG=0` to opt out.\n *\n * Per-request memoized on `event.context` — mirrors the `getSession`\n * pattern so multiple callers in the same request (e.g. ssr-handler +\n * a loader) share a single org_members round trip.\n */\nexport async function getOrgContext(event: H3Event): Promise<OrgContext> {\n // Per-request memoization. Multiple call sites per request (action wrappers,\n // SSR handler, loaders) must not each pay a separate org_members query.\n const ctx = event.context as {\n __anOrgContextCache?: Promise<OrgContext>;\n };\n return (ctx.__anOrgContextCache ??= resolveOrgContextUncached(event));\n}\n\ntype MembershipRow = {\n orgId: string;\n role: OrgRole;\n orgName: string;\n allowedDomain: string | null;\n};\n\nconst MEMBERSHIPS_CACHE_KEY = \"__anOrgMembershipsCache\";\nconst ACTIVE_ORG_SETTING_CACHE_KEY = \"__anActiveOrgSettingCache\";\n\ntype ActiveOrgSetting = { orgId: string | null } | null;\n\nfunction loadActiveOrgSettingForEvent(\n event: H3Event,\n email: string,\n): Promise<ActiveOrgSetting> {\n const ctx = event.context as Record<string, unknown>;\n const cache = ((ctx[ACTIVE_ORG_SETTING_CACHE_KEY] as\n | Map<string, Promise<ActiveOrgSetting>>\n | undefined) ??\n (ctx[ACTIVE_ORG_SETTING_CACHE_KEY] = new Map<\n string,\n Promise<ActiveOrgSetting>\n >())) as Map<string, Promise<ActiveOrgSetting>>;\n const normalizedEmail = email.toLowerCase();\n let promise = cache.get(normalizedEmail);\n if (!promise) {\n promise = getUserSetting(email, \"active-org-id\").then((value) => {\n if (!value || !(\"orgId\" in value)) return null;\n if (value.orgId === null) return { orgId: null };\n return typeof value.orgId === \"string\" ? { orgId: value.orgId } : null;\n });\n cache.set(normalizedEmail, promise);\n }\n return promise;\n}\n\n/**\n * Per-request memoization of the org_members lookup, keyed by email on\n * `event.context`. Both the session org backfill (inside `getSession`) and\n * `getOrgContext` need the membership rows; without sharing, every request\n * whose session lacks an orgId pays the query twice.\n */\nfunction loadMembershipsForEvent(\n event: H3Event,\n exec: ReturnType<typeof getDbExec>,\n email: string,\n): Promise<MembershipRow[] | null> {\n const ctx = event.context as Record<string, unknown>;\n const cache = ((ctx[MEMBERSHIPS_CACHE_KEY] as\n | Map<string, Promise<MembershipRow[] | null>>\n | undefined) ??\n (ctx[MEMBERSHIPS_CACHE_KEY] = new Map<\n string,\n Promise<MembershipRow[] | null>\n >())) as Map<string, Promise<MembershipRow[] | null>>;\n let promise = cache.get(email);\n if (!promise) {\n promise = loadMemberships(exec, email);\n cache.set(email, promise);\n }\n return promise;\n}\n\nfunction updateMembershipsForEvent(\n event: H3Event,\n email: string,\n memberships: MembershipRow[] | null,\n): void {\n const ctx = event.context as Record<string, unknown>;\n const cache = ctx[MEMBERSHIPS_CACHE_KEY] as\n | Map<string, Promise<MembershipRow[] | null>>\n | undefined;\n cache?.set(email, Promise.resolve(memberships));\n}\n\nasync function resolveOrgContextUncached(event: H3Event): Promise<OrgContext> {\n const session = await getSession(event);\n const email = session?.email;\n if (!email) return EMPTY_CONTEXT;\n const sessionOrgId =\n typeof session.orgId === \"string\" && session.orgId.trim()\n ? session.orgId.trim()\n : null;\n const sessionOrgRole = normalizeOrgRole(session.orgRole);\n\n const exec = getDbExec();\n\n let memberships = await loadMembershipsForEvent(event, exec, email);\n if (memberships === null) {\n if (sessionOrgId) {\n return {\n email,\n orgId: sessionOrgId,\n orgName: null,\n role: sessionOrgRole,\n };\n }\n return { email, orgId: null, orgName: null, role: null };\n }\n\n const activeOrgSetting = await loadActiveOrgSettingForEvent(event, email);\n const explicitPersonal = activeOrgSetting?.orgId === null;\n\n const emailDomain = emailDomainOf(email);\n // Membership in a domain-matched org is the only durable \"already joined\"\n // signal. Recognizing the personal workspace by its *name* instead breaks the\n // moment the provider display name or the workspace name changes, which\n // strands an existing user in Personal with no way into their company org.\n const shouldTryDomainAutoJoin =\n !explicitPersonal &&\n emailDomain !== null &&\n !memberships.some((m) => m.allowedDomain?.toLowerCase() === emailDomain);\n\n if (\n !explicitPersonal &&\n activeOrgSetting?.orgId &&\n !shouldTryDomainAutoJoin\n ) {\n const active = memberships.find((m) => m.orgId === activeOrgSetting.orgId);\n if (active) {\n return {\n email,\n orgId: active.orgId,\n orgName: active.orgName,\n role: active.role,\n };\n }\n }\n\n const sessionMembership = sessionOrgId\n ? memberships.find((m) => m.orgId === sessionOrgId)\n : null;\n\n if (shouldTryDomainAutoJoin) {\n const membershipsBeforeJoin = memberships;\n const joined = await autoJoinDomainMatchingOrgs(email, {\n activateJoinedOrg: \"never\",\n });\n const joinedOrgId = joined.joined[0]?.orgId ?? null;\n if (joinedOrgId) {\n const refreshed = await loadMemberships(exec, email);\n if (refreshed !== null) {\n memberships = refreshed;\n updateMembershipsForEvent(event, email, refreshed);\n }\n\n const currentOrgId =\n activeOrgSetting?.orgId ??\n sessionOrgId ??\n membershipsBeforeJoin[0]?.orgId ??\n null;\n const shouldActivate =\n !explicitPersonal &&\n (currentOrgId === null ||\n (await isSoloOwnedWorkspace(\n exec,\n currentOrgId,\n membershipsBeforeJoin,\n )));\n\n if (shouldActivate) {\n await putUserSetting(email, \"active-org-id\", { orgId: joinedOrgId });\n const active = memberships.find((m) => m.orgId === joinedOrgId);\n if (active) {\n return {\n email,\n orgId: active.orgId,\n orgName: active.orgName,\n role: active.role,\n };\n }\n }\n }\n }\n\n if (explicitPersonal) {\n return { email, orgId: null, orgName: null, role: null };\n }\n\n if (activeOrgSetting?.orgId) {\n const active = memberships.find((m) => m.orgId === activeOrgSetting.orgId);\n if (active) {\n return {\n email,\n orgId: active.orgId,\n orgName: active.orgName,\n role: active.role,\n };\n }\n }\n\n if (sessionOrgId) {\n const active =\n sessionMembership ?? memberships.find((m) => m.orgId === sessionOrgId);\n if (active) {\n return {\n email,\n orgId: active.orgId,\n orgName: active.orgName,\n role: active.role,\n };\n }\n return {\n email,\n orgId: sessionOrgId,\n orgName: null,\n role: sessionOrgRole,\n };\n }\n\n if (memberships.length === 0 && autoCreateDefaultOrgEnabled()) {\n const created = await tryCreateDefaultOrg(exec, email, session);\n if (created) return created;\n // Creation failed (race / DB error); fall through with an empty org context\n // so non-blocking invite/domain UI can still surface recovery options.\n }\n\n if (memberships.length === 0) {\n return { email, orgId: null, orgName: null, role: null };\n }\n\n return {\n email,\n orgId: memberships[0].orgId,\n orgName: memberships[0].orgName,\n role: memberships[0].role,\n };\n}\n\nasync function loadMemberships(\n exec: ReturnType<typeof getDbExec>,\n email: string,\n): Promise<MembershipRow[] | null> {\n try {\n const { rows } = await exec.execute({\n sql: `SELECT m.org_id AS \"orgId\", m.role AS role, o.name AS \"orgName\",\n o.allowed_domain AS \"allowedDomain\"\n FROM org_members m\n INNER JOIN organizations o ON m.org_id = o.id\n WHERE LOWER(m.email) = ?`,\n args: [email.toLowerCase()],\n });\n return rows.map((r: any) => {\n const domain = r.allowedDomain ?? r.allowed_domain;\n return {\n orgId: String(r.orgId ?? r.org_id),\n role: String(r.role) as OrgRole,\n orgName: String(r.orgName ?? r.org_name),\n allowedDomain: domain ? String(domain) : null,\n };\n });\n } catch {\n // Tables may not exist yet on first boot before migrations finish.\n return null;\n }\n}\n\n/**\n * Resolve the active org ID for a given email — for non-HTTP contexts like\n * the integration webhook handler where we have an email but no event/session.\n * Picks the user's active-org-id setting if set, including explicit Personal,\n * otherwise the first membership.\n * Returns null if the user has no memberships.\n */\nexport async function resolveOrgIdForEmail(\n email: string,\n): Promise<string | null> {\n const exec = getDbExec();\n if (!exec) return null;\n try {\n const { rows } = await exec.execute({\n sql: `SELECT org_id FROM org_members WHERE LOWER(email) = ?`,\n args: [email.toLowerCase()],\n });\n if (rows.length === 0) return null;\n const ids = rows.map((r: any) => String(r.org_id));\n const activeOrgSetting = (await getUserSetting(\n email,\n \"active-org-id\",\n )) as ActiveOrgSetting;\n if (activeOrgSetting?.orgId === null) return null;\n if (activeOrgSetting?.orgId && ids.includes(activeOrgSetting.orgId)) {\n return activeOrgSetting.orgId;\n }\n return ids[0];\n } catch {\n return null;\n }\n}\n\n/**\n * Event-aware variant of `resolveOrgIdForEmail` for HTTP request paths.\n * Shares the per-request membership lookup with `getOrgContext`, so the\n * session org backfill inside `getSession` and a later `getOrgContext` call\n * in the same request pay ONE org_members round trip, not two.\n */\nexport async function resolveOrgIdForEmailViaEvent(\n event: H3Event,\n email: string,\n): Promise<string | null> {\n try {\n const exec = getDbExec();\n if (!exec) return null;\n const memberships = await loadMembershipsForEvent(event, exec, email);\n if (!memberships || memberships.length === 0) return null;\n const activeOrgSetting = await loadActiveOrgSettingForEvent(event, email);\n if (activeOrgSetting?.orgId === null) return null;\n if (\n activeOrgSetting?.orgId &&\n memberships.some((m) => m.orgId === activeOrgSetting.orgId)\n ) {\n return activeOrgSetting.orgId;\n }\n return memberships[0].orgId;\n } catch {\n return null;\n }\n}\n\n/**\n * Create a new organization and add the caller as a member with the given\n * role. Generates a per-org A2A secret for cross-app delegation and writes\n * the caller's `active-org-id` user-setting so the new org is immediately\n * active.\n *\n */\nexport async function createOrganization(\n name: string,\n email: string,\n role: OrgRole = \"owner\",\n): Promise<{\n id: string;\n name: string;\n role: OrgRole;\n a2aSecret: string;\n createdAt: number;\n}> {\n const trimmedName = name.trim();\n const exec = getDbExec();\n const id = nanoid();\n const createdAt = Date.now();\n const { randomBytes } = await import(\"node:crypto\");\n const a2aSecret = randomBytes(32).toString(\"base64url\");\n\n await exec.execute({\n sql: `INSERT INTO organizations (id, name, created_by, created_at, a2a_secret) VALUES (?, ?, ?, ?, ?)`,\n args: [id, trimmedName, email, createdAt, a2aSecret],\n });\n\n await exec.execute({\n sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, ?, ?)`,\n args: [nanoid(), id, email, role, createdAt],\n });\n\n await putUserSetting(email, \"active-org-id\", { orgId: id });\n\n return { id, name: trimmedName, role, a2aSecret, createdAt };\n}\n\nfunction defaultOrgName(\n email: string,\n session: { name?: string } | null,\n): string {\n const full = session?.name?.trim();\n if (full) return `${full}'s workspace`;\n const local = email.split(\"@\")[0] ?? email;\n const cleaned = local.replace(/[._-]+/g, \" \").trim();\n const titled =\n cleaned\n .split(\" \")\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \") || \"My\";\n return `${titled}'s workspace`;\n}\n\n/**\n * Check whether the user has a pending invitation. If so, auto-create\n * MUST be skipped — otherwise we'd provision a personal org for them\n * before they ever see the inviter's org in the invitation banner, and they'd\n * never join the team that invited them.\n */\nasync function hasPendingInvitation(\n exec: ReturnType<typeof getDbExec>,\n email: string,\n): Promise<boolean> {\n try {\n const { rows } = await exec.execute({\n sql: `SELECT 1 FROM org_invitations WHERE LOWER(email) = ? AND status = 'pending' LIMIT 1`,\n args: [email.toLowerCase()],\n });\n return rows.length > 0;\n } catch {\n // If we can't tell, err on the side of NOT auto-creating — the\n // invitation banner or team UI can surface the situation.\n return true;\n }\n}\n\nasync function hasDomainMatch(\n exec: ReturnType<typeof getDbExec>,\n email: string,\n): Promise<boolean> {\n try {\n const domain = email.split(\"@\")[1]?.toLowerCase();\n if (!domain) return false;\n const { rows } = await exec.execute({\n sql: `SELECT 1 FROM organizations WHERE LOWER(allowed_domain) = ? LIMIT 1`,\n args: [domain],\n });\n return rows.length > 0;\n } catch {\n return false;\n }\n}\n\n/** Stale-claim threshold. A claim row this old is treated as abandoned\n * (process crashed, DELETE failed, etc.) and a new caller may take it\n * over. Long enough that two genuine concurrent first-loads don't\n * trample each other (those settle in milliseconds), short enough that\n * a stuck user recovers on their next navigation. */\nconst CLAIM_TTL_MS = 5 * 60 * 1000;\n\n/**\n * Attempt to provision a default org + owner membership for a user with\n * zero memberships.\n *\n * Race protection: claims the user's auto-create slot via an atomic\n * INSERT into the framework `settings` table (PRIMARY KEY (key) — so\n * concurrent inserts for the same key throw uniqueness violations on\n * both SQLite and Postgres). Only the request that wins the claim\n * proceeds to create the org; losers bail. By the time a losing\n * request retries on a subsequent navigation, the winner's org is in\n * `org_members` and the auto-create branch is skipped entirely.\n *\n * Stuck-state recovery: a stale claim (held longer than CLAIM_TTL_MS)\n * is reclaimed automatically. So even if the DELETE on the failure\n * path fails (network blip, DB error), the user isn't stranded — the\n * next request after the TTL elapses retries cleanly.\n *\n * Returns null on any failure so the caller can fall back to the\n * empty-context / client-guard path.\n */\nasync function tryCreateDefaultOrg(\n exec: ReturnType<typeof getDbExec>,\n email: string,\n session: { name?: string } | null,\n): Promise<OrgContext | null> {\n // Make sure the framework `settings` table exists before we use it as\n // a claim primitive. getSetting() ensures the table on first call.\n await getSetting(\"__init\").catch(() => null);\n\n const claimKey = `u:${email.toLowerCase()}:auto-create-claim`;\n\n if (!(await acquireClaim(exec, claimKey))) return null;\n\n // Pending-invite check happens INSIDE the claim so the window where a\n // newly-arrived invitation can be missed is narrowed to a single SQL\n // round-trip. (A still-narrower window would require a transaction\n // spanning org_invitations and settings — out of scope.)\n if (await hasPendingInvitation(exec, email)) {\n await releaseClaim(exec, claimKey);\n return null;\n }\n\n if (await hasDomainMatch(exec, email)) {\n await releaseClaim(exec, claimKey);\n return null;\n }\n\n try {\n const orgId = nanoid();\n const orgName = defaultOrgName(email, session);\n const now = Date.now();\n\n await exec.execute({\n sql: `INSERT INTO organizations (id, name, created_by, created_at) VALUES (?, ?, ?, ?)`,\n args: [orgId, orgName, email, now],\n });\n await exec.execute({\n sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, ?, ?)`,\n args: [nanoid(), orgId, email, \"owner\", now],\n });\n\n await putUserSetting(email, \"active-org-id\", { orgId });\n\n return { email, orgId, orgName, role: \"owner\" };\n } catch {\n await releaseClaim(exec, claimKey);\n return null;\n }\n}\n\nasync function acquireClaim(\n exec: ReturnType<typeof getDbExec>,\n claimKey: string,\n): Promise<boolean> {\n const now = Date.now();\n try {\n await exec.execute({\n sql: `INSERT INTO settings (key, value, updated_at) VALUES (?, ?, ?)`,\n args: [claimKey, JSON.stringify({ at: now }), now],\n });\n return true;\n } catch {\n // Conflict — someone else's claim is already in the row. If it's\n // stale (older than CLAIM_TTL_MS) we take it over.\n //\n // CRITICAL: this MUST be a single atomic UPDATE guarded on\n // `updated_at <= staleThreshold`. A read-then-DELETE-then-INSERT\n // sequence lets two concurrent reclaimers each observe the stale\n // timestamp, delete each other's fresh claim, and both think they\n // won — duplicating org creation. The conditional UPDATE matches\n // each stale row at most once: only the first writer sees\n // rowsAffected === 1; the row's updated_at is now `now`, so any\n // subsequent UPDATE no longer satisfies `updated_at <= staleThreshold`\n // and matches zero rows.\n const staleThreshold = now - CLAIM_TTL_MS;\n const result = (await exec.execute({\n sql: `UPDATE settings SET value = ?, updated_at = ? WHERE key = ? AND updated_at <= ?`,\n args: [JSON.stringify({ at: now }), now, claimKey, staleThreshold],\n })) as { rowsAffected?: number };\n return (result.rowsAffected ?? 0) > 0;\n }\n}\n\nasync function releaseClaim(\n exec: ReturnType<typeof getDbExec>,\n claimKey: string,\n): Promise<void> {\n // Best-effort. If this fails (transient network/DB error), the\n // CLAIM_TTL_MS-based takeover in acquireClaim recovers automatically\n // on a future request — no permanent stuck state.\n await exec\n .execute({ sql: `DELETE FROM settings WHERE key = ?`, args: [claimKey] })\n .catch(() => {});\n}\n\n/**\n * Look up the `allowed_domain` for an org by its ID.\n * Used when making outbound A2A calls so the JWT includes the\n * caller's org domain for cross-app org resolution.\n */\nexport async function getOrgDomain(orgId: string): Promise<string | null> {\n try {\n const exec = getDbExec();\n const { rows } = await exec.execute({\n sql: `SELECT allowed_domain FROM organizations WHERE id = ? LIMIT 1`,\n args: [orgId],\n });\n if (!rows[0]) return null;\n const domain = String((rows[0] as any).allowed_domain || \"\");\n return domain || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Look up the org's A2A secret by org ID.\n * Used when making outbound A2A calls so the JWT is signed with the\n * org-specific secret rather than the global A2A_SECRET env var.\n */\nexport async function getOrgA2ASecret(orgId: string): Promise<string | null> {\n try {\n const exec = getDbExec();\n const { rows } = await exec.execute({\n sql: `SELECT a2a_secret FROM organizations WHERE id = ? LIMIT 1`,\n args: [orgId],\n });\n if (!rows[0]) return null;\n const secret = String((rows[0] as any).a2a_secret || \"\");\n return secret || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Look up an org's A2A secret by its `allowed_domain`.\n * Used on the A2A receiving side: the caller's JWT includes `org_domain`,\n * and the receiver looks up which local org matches that domain to find\n * the secret used to verify the JWT signature.\n */\nexport async function getA2ASecretByDomain(\n domain: string,\n): Promise<string | null> {\n try {\n const exec = getDbExec();\n const { rows } = await exec.execute({\n sql: `SELECT a2a_secret FROM organizations WHERE LOWER(allowed_domain) = ? LIMIT 1`,\n args: [domain.toLowerCase()],\n });\n if (!rows[0]) return null;\n const secret = String((rows[0] as any).a2a_secret || \"\");\n return secret || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Resolve a local org by its `allowed_domain`.\n * Used on the A2A receiving side: the caller sends `org_domain` in the JWT,\n * and the receiver looks up which local org matches that domain.\n */\nexport async function resolveOrgByDomain(\n domain: string,\n): Promise<{ orgId: string; orgName: string } | null> {\n try {\n const exec = getDbExec();\n const { rows } = await exec.execute({\n sql: `SELECT id, name FROM organizations WHERE LOWER(allowed_domain) = ? LIMIT 1`,\n args: [domain.toLowerCase()],\n });\n if (!rows[0]) return null;\n return {\n orgId: String((rows[0] as any).id),\n orgName: String((rows[0] as any).name),\n };\n } catch {\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/org/context.ts"],"names":[],"mappings":"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","sourcesContent":["import type { H3Event } from \"h3\";\n\nimport { warnAgent } from \"../agent/action-warnings.js\";\nimport { getDbExec, isTransientDatabaseError } from \"../db/client.js\";\nimport { getSession } from \"../server/auth.js\";\nimport { getSetting } from \"../settings/store.js\";\nimport { getUserSetting } from \"../settings/user-settings.js\";\nimport { setActiveOrgId } from \"./active-org.js\";\nimport { autoJoinDomainMatchingOrgs } from \"./auto-join-domain.js\";\nimport type { OrgContext, OrgRole } from \"./types.js\";\n\nconst EMPTY_CONTEXT: OrgContext = {\n email: \"\",\n orgId: null,\n orgName: null,\n role: null,\n};\n\n/**\n * The single way to read `org_members`, so no two call sites can pick opposite\n * defaults for the same failure. A transient database failure is NOT an answer\n * and propagates: a caller that turns it into \"no memberships\" silently drops\n * org scope, which hides every org-scoped credential behind a\n * permanent-sounding \"not configured\".\n *\n * `null` is every non-transient failure, not only the intended one (org tables\n * absent on a fresh install before migrations). A permanently unreadable table\n * — a role without SELECT, say — still reports as \"no rows\" here. Narrowing\n * that further means classifying \"no database configured\" as readable-absent,\n * which is load-bearing for CLI/script/test contexts that legitimately run\n * without a store; see `assertCredentialStoreReadable`.\n */\nexport async function queryOrgMembers(query: {\n sql: string;\n args: unknown[];\n}): Promise<Record<string, unknown>[] | null> {\n try {\n const { rows } = await getDbExec().execute(query);\n return rows as Record<string, unknown>[];\n } catch (err) {\n if (isTransientDatabaseError(err)) throw err;\n return null;\n }\n}\n\nfunction normalizeOrgRole(value: unknown): OrgRole | null {\n return value === \"owner\" || value === \"admin\" || value === \"member\"\n ? value\n : null;\n}\n\nfunction emailDomainOf(email: string): string | null {\n return email.split(\"@\")[1]?.toLowerCase() || null;\n}\n\n/**\n * A workspace the user owns that nobody else has joined is a default/personal\n * workspace whatever it happens to be named, so moving the user into their\n * company org is safe. An org with other members is a team they deliberately\n * belong to — join the domain org in the background but leave them there.\n */\nasync function isSoloOwnedWorkspace(\n exec: ReturnType<typeof getDbExec>,\n orgId: string,\n memberships: MembershipRow[],\n): Promise<boolean> {\n const membership = memberships.find((m) => m.orgId === orgId);\n if (!membership || membership.role !== \"owner\") return false;\n try {\n const { rows } = await exec.execute({\n sql: `SELECT COUNT(*) AS \"memberCount\" FROM org_members WHERE org_id = ?`,\n args: [orgId],\n });\n const row = rows[0] as any;\n return Number(row?.memberCount ?? row?.membercount ?? 0) <= 1;\n } catch {\n return false;\n }\n}\n\nfunction autoCreateDefaultOrgEnabled(): boolean {\n const raw = process.env.AUTO_CREATE_DEFAULT_ORG;\n if (raw === undefined || raw.trim() === \"\") return true;\n return ![\"0\", \"false\", \"no\", \"off\"].includes(raw.trim().toLowerCase());\n}\n\nconst nanoid = (): string =>\n globalThis.crypto?.randomUUID?.().replace(/-/g, \"\") ??\n Math.random().toString(36).slice(2) + Date.now().toString(36);\n\n/**\n * Resolve the current user's organization context from their session.\n *\n * - Honors the user's `active-org-id` setting, including an explicit Personal\n * context represented by `{ orgId: null }`.\n * - Falls back to the user's first membership.\n * - When the authenticated user has zero memberships, provisions a default org\n * named after the user ({name}'s workspace, falling back to the email\n * local-part). Set `AUTO_CREATE_DEFAULT_ORG=0` to opt out.\n *\n * Per-request memoized on `event.context` — mirrors the `getSession`\n * pattern so multiple callers in the same request (e.g. ssr-handler +\n * a loader) share a single org_members round trip.\n */\nexport async function getOrgContext(event: H3Event): Promise<OrgContext> {\n // Per-request memoization. Multiple call sites per request (action wrappers,\n // SSR handler, loaders) must not each pay a separate org_members query.\n const ctx = event.context as {\n __anOrgContextCache?: Promise<OrgContext>;\n };\n // Evict on failure. A memoized failure would otherwise answer every later\n // caller in this request with the wrong org.\n return (ctx.__anOrgContextCache ??= resolveOrgContextUncached(event).catch(\n (err) => {\n delete ctx.__anOrgContextCache;\n throw err;\n },\n ));\n}\n\ntype MembershipRow = {\n orgId: string;\n role: OrgRole;\n orgName: string;\n allowedDomain: string | null;\n};\n\nconst MEMBERSHIPS_CACHE_KEY = \"__anOrgMembershipsCache\";\nconst ACTIVE_ORG_SETTING_CACHE_KEY = \"__anActiveOrgSettingCache\";\n\ntype ActiveOrgSetting = { orgId: string | null } | null;\n\nfunction loadActiveOrgSettingForEvent(\n event: H3Event,\n email: string,\n): Promise<ActiveOrgSetting> {\n const ctx = event.context as Record<string, unknown>;\n const cache = ((ctx[ACTIVE_ORG_SETTING_CACHE_KEY] as\n | Map<string, Promise<ActiveOrgSetting>>\n | undefined) ??\n (ctx[ACTIVE_ORG_SETTING_CACHE_KEY] = new Map<\n string,\n Promise<ActiveOrgSetting>\n >())) as Map<string, Promise<ActiveOrgSetting>>;\n const normalizedEmail = email.toLowerCase();\n let promise = cache.get(normalizedEmail);\n if (!promise) {\n promise = getUserSetting(email, \"active-org-id\").then((value) => {\n if (!value || !(\"orgId\" in value)) return null;\n if (value.orgId === null) return { orgId: null };\n return typeof value.orgId === \"string\" ? { orgId: value.orgId } : null;\n });\n cache.set(normalizedEmail, promise);\n }\n return promise;\n}\n\n/**\n * Per-request memoization of the org_members lookup, keyed by email on\n * `event.context`. Both the session org backfill (inside `getSession`) and\n * `getOrgContext` need the membership rows; without sharing, every request\n * whose session lacks an orgId pays the query twice.\n */\nfunction loadMembershipsForEvent(\n event: H3Event,\n email: string,\n): Promise<MembershipRow[] | null> {\n const ctx = event.context as Record<string, unknown>;\n const cache = ((ctx[MEMBERSHIPS_CACHE_KEY] as\n | Map<string, Promise<MembershipRow[] | null>>\n | undefined) ??\n (ctx[MEMBERSHIPS_CACHE_KEY] = new Map<\n string,\n Promise<MembershipRow[] | null>\n >())) as Map<string, Promise<MembershipRow[] | null>>;\n let promise = cache.get(email);\n if (!promise) {\n // A failed read is evicted rather than memoized: caching it would make one\n // transient error answer every later lookup in this request.\n promise = loadMemberships(email).catch((err) => {\n cache.delete(email);\n throw err;\n });\n cache.set(email, promise);\n }\n return promise;\n}\n\nfunction updateMembershipsForEvent(\n event: H3Event,\n email: string,\n memberships: MembershipRow[] | null,\n): void {\n const ctx = event.context as Record<string, unknown>;\n const cache = ctx[MEMBERSHIPS_CACHE_KEY] as\n | Map<string, Promise<MembershipRow[] | null>>\n | undefined;\n cache?.set(email, Promise.resolve(memberships));\n}\n\nasync function resolveOrgContextUncached(event: H3Event): Promise<OrgContext> {\n const session = await getSession(event);\n const email = session?.email;\n if (!email) return EMPTY_CONTEXT;\n const sessionOrgId =\n typeof session.orgId === \"string\" && session.orgId.trim()\n ? session.orgId.trim()\n : null;\n const sessionOrgRole = normalizeOrgRole(session.orgRole);\n\n const exec = getDbExec();\n\n let memberships: MembershipRow[] | null;\n try {\n memberships = await loadMembershipsForEvent(event, email);\n } catch (err) {\n // A transient membership read must not downgrade an authenticated request\n // to a private/solo scope when the session already carries its org.\n if (sessionOrgId && isTransientDatabaseError(err)) {\n return {\n email,\n orgId: sessionOrgId,\n orgName: null,\n role: sessionOrgRole,\n };\n }\n throw err;\n }\n if (memberships === null) {\n if (sessionOrgId) {\n return {\n email,\n orgId: sessionOrgId,\n orgName: null,\n role: sessionOrgRole,\n };\n }\n return { email, orgId: null, orgName: null, role: null };\n }\n\n const activeOrgSetting = await loadActiveOrgSettingForEvent(event, email);\n const explicitPersonal = activeOrgSetting?.orgId === null;\n\n const emailDomain = emailDomainOf(email);\n // Membership in a domain-matched org is the only durable \"already joined\"\n // signal. Recognizing the personal workspace by its *name* instead breaks the\n // moment the provider display name or the workspace name changes, which\n // strands an existing user in Personal with no way into their company org.\n const shouldTryDomainAutoJoin =\n !explicitPersonal &&\n emailDomain !== null &&\n !memberships.some((m) => m.allowedDomain?.toLowerCase() === emailDomain);\n\n if (\n !explicitPersonal &&\n activeOrgSetting?.orgId &&\n !shouldTryDomainAutoJoin\n ) {\n const active = memberships.find((m) => m.orgId === activeOrgSetting.orgId);\n if (active) {\n return {\n email,\n orgId: active.orgId,\n orgName: active.orgName,\n role: active.role,\n };\n }\n }\n\n const sessionMembership = sessionOrgId\n ? memberships.find((m) => m.orgId === sessionOrgId)\n : null;\n\n if (shouldTryDomainAutoJoin) {\n const membershipsBeforeJoin = memberships;\n const joined = await autoJoinDomainMatchingOrgs(email, {\n activateJoinedOrg: \"never\",\n });\n const joinedOrgId = joined.joined[0]?.orgId ?? null;\n if (joinedOrgId) {\n const refreshed = await loadMemberships(email);\n if (refreshed !== null) {\n memberships = refreshed;\n updateMembershipsForEvent(event, email, refreshed);\n }\n\n const currentOrgId =\n activeOrgSetting?.orgId ??\n sessionOrgId ??\n membershipsBeforeJoin[0]?.orgId ??\n null;\n const shouldActivate =\n !explicitPersonal &&\n (currentOrgId === null ||\n (await isSoloOwnedWorkspace(\n exec,\n currentOrgId,\n membershipsBeforeJoin,\n )));\n\n if (shouldActivate) {\n await setActiveOrgId(email, joinedOrgId, \"joined domain-matched org\");\n const active = memberships.find((m) => m.orgId === joinedOrgId);\n if (active) {\n return {\n email,\n orgId: active.orgId,\n orgName: active.orgName,\n role: active.role,\n };\n }\n }\n }\n }\n\n if (explicitPersonal) {\n return { email, orgId: null, orgName: null, role: null };\n }\n\n if (activeOrgSetting?.orgId) {\n const active = memberships.find((m) => m.orgId === activeOrgSetting.orgId);\n if (active) {\n return {\n email,\n orgId: active.orgId,\n orgName: active.orgName,\n role: active.role,\n };\n }\n }\n\n if (sessionOrgId) {\n const active =\n sessionMembership ?? memberships.find((m) => m.orgId === sessionOrgId);\n if (active) {\n return {\n email,\n orgId: active.orgId,\n orgName: active.orgName,\n role: active.role,\n };\n }\n return {\n email,\n orgId: sessionOrgId,\n orgName: null,\n role: sessionOrgRole,\n };\n }\n\n if (memberships.length === 0 && autoCreateDefaultOrgEnabled()) {\n const created = await tryCreateDefaultOrg(exec, email, session);\n if (created) return created;\n // Creation failed (race / DB error); fall through with an empty org context\n // so non-blocking invite/domain UI can still surface recovery options.\n }\n\n if (memberships.length === 0) {\n return { email, orgId: null, orgName: null, role: null };\n }\n\n return {\n email,\n orgId: memberships[0].orgId,\n orgName: memberships[0].orgName,\n role: memberships[0].role,\n };\n}\n\n/**\n * Ordering for every membership lookup that falls back to \"first membership\".\n * Without it the fallback is whatever order the plan happens to return, so a\n * multi-org user's active org can change between two identical requests — and\n * `getSession` then freezes that arbitrary answer into `session.orgId`.\n * `org_id` breaks ties so two memberships joined in the same millisecond still\n * resolve identically.\n */\nconst MEMBERSHIP_FALLBACK_ORDER_BY = `ORDER BY joined_at ASC, org_id ASC`;\n\nasync function loadMemberships(email: string): Promise<MembershipRow[] | null> {\n const rows = await queryOrgMembers({\n sql: `SELECT m.org_id AS \"orgId\", m.role AS role, o.name AS \"orgName\",\n o.allowed_domain AS \"allowedDomain\"\n FROM org_members m\n INNER JOIN organizations o ON m.org_id = o.id\n WHERE LOWER(m.email) = ?\n ${MEMBERSHIP_FALLBACK_ORDER_BY}`,\n args: [email.toLowerCase()],\n });\n return (\n rows?.map((r: any) => {\n const domain = r.allowedDomain ?? r.allowed_domain;\n return {\n orgId: String(r.orgId ?? r.org_id),\n role: String(r.role) as OrgRole,\n orgName: String(r.orgName ?? r.org_name),\n allowedDomain: domain ? String(domain) : null,\n };\n }) ?? null\n );\n}\n\n/**\n * Resolve the active org ID for a given email — for non-HTTP contexts like\n * the integration webhook handler where we have an email but no event/session.\n * Picks the user's active-org-id setting if set, including explicit Personal,\n * otherwise the oldest membership.\n * Returns null if the user has no memberships.\n */\nexport async function resolveOrgIdForEmail(\n email: string,\n): Promise<string | null> {\n const rows = await queryOrgMembers({\n sql: `SELECT org_id FROM org_members WHERE LOWER(email) = ?\n ${MEMBERSHIP_FALLBACK_ORDER_BY}`,\n args: [email.toLowerCase()],\n });\n if (!rows?.length) return null;\n const ids = rows.map((r: any) => String(r.org_id));\n const activeOrgSetting = (await getUserSetting(\n email,\n \"active-org-id\",\n )) as ActiveOrgSetting;\n if (activeOrgSetting?.orgId === null) return null;\n if (activeOrgSetting?.orgId && ids.includes(activeOrgSetting.orgId)) {\n return activeOrgSetting.orgId;\n }\n return ids[0];\n}\n\n/**\n * Event-aware variant of `resolveOrgIdForEmail` for HTTP request paths.\n * Shares the per-request membership lookup with `getOrgContext`, so the\n * session org backfill inside `getSession` and a later `getOrgContext` call\n * in the same request pay ONE org_members round trip, not two.\n */\nexport async function resolveOrgIdForEmailViaEvent(\n event: H3Event,\n email: string,\n): Promise<string | null> {\n const memberships = await loadMembershipsForEvent(event, email);\n if (!memberships || memberships.length === 0) return null;\n const activeOrgSetting = await loadActiveOrgSettingForEvent(event, email);\n if (activeOrgSetting?.orgId === null) return null;\n if (\n activeOrgSetting?.orgId &&\n memberships.some((m) => m.orgId === activeOrgSetting.orgId)\n ) {\n return activeOrgSetting.orgId;\n }\n return memberships[0].orgId;\n}\n\n/**\n * Create a new organization and add the caller as a member with the given\n * role. Generates a per-org A2A secret for cross-app delegation and writes\n * the caller's `active-org-id` user-setting so the new org is immediately\n * active.\n *\n */\nexport async function createOrganization(\n name: string,\n email: string,\n role: OrgRole = \"owner\",\n): Promise<{\n id: string;\n name: string;\n role: OrgRole;\n a2aSecret: string;\n createdAt: number;\n}> {\n const trimmedName = name.trim();\n const exec = getDbExec();\n const id = nanoid();\n const createdAt = Date.now();\n const { randomBytes } = await import(\"node:crypto\");\n const a2aSecret = randomBytes(32).toString(\"base64url\");\n\n await exec.execute({\n sql: `INSERT INTO organizations (id, name, created_by, created_at, a2a_secret) VALUES (?, ?, ?, ?, ?)`,\n args: [id, trimmedName, email, createdAt, a2aSecret],\n });\n\n await exec.execute({\n sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, ?, ?)`,\n args: [nanoid(), id, email, role, createdAt],\n });\n\n await warnOnAdditionalOrganization(exec, email, id, trimmedName);\n\n await setActiveOrgId(email, id, `created organization \"${trimmedName}\"`);\n\n return { id, name: trimmedName, role, a2aSecret, createdAt };\n}\n\n/**\n * A second organization is the single most expensive accident in this codebase:\n * vault credentials are scoped per organization, so creating one and activating\n * it orphans every key synced under the previous org, and the only symptom is a\n * missing-env-var error somewhere else entirely. The UI warns humans before\n * they click (`org.createOrgVaultNotice`); this covers the path that actually\n * did the damage — app code or a migration action calling `createOrganization`\n * directly, where no notice is ever rendered.\n */\nasync function warnOnAdditionalOrganization(\n exec: ReturnType<typeof getDbExec>,\n email: string,\n newOrgId: string,\n newOrgName: string,\n): Promise<void> {\n try {\n const { rows } = await exec.execute({\n sql: `SELECT 1 FROM org_members WHERE LOWER(email) = ? AND org_id <> ? LIMIT 1`,\n args: [email.toLowerCase(), newOrgId],\n });\n if (rows.length === 0) return;\n } catch {\n // \"Couldn't tell\" is not \"it didn't\" — swallowing the failed probe here made\n // the function whose entire job is to not be silent, silent.\n warnAgent({\n severity: \"critical\",\n code: \"org-additional-org-membership-unreadable\",\n message:\n `Created an organization \"${newOrgName}\" (${newOrgId}) and made it the account's active org, ` +\n `but could not read whether that account already belonged to another organization. If it did, ` +\n `every vault credential synced under the previous organization is now unreadable for it, and ` +\n `requests will fail with missing-credential errors that name the key rather than this org ` +\n `change. Confirm the account's memberships before continuing; if this came from a roster, ` +\n `identity, or user-list migration, add the members to the EXISTING organization instead.`,\n });\n return;\n }\n\n warnAgent({\n severity: \"critical\",\n code: \"org-additional-organization\",\n message:\n `Created an ADDITIONAL organization \"${newOrgName}\" (${newOrgId}) ` +\n `for an account that already belongs to another organization, and made it their active org. ` +\n `Vault credentials are scoped per organization and are NOT shared between them: every API key ` +\n `synced under the previous organization is now unreadable for this account until it is re-saved ` +\n `in \"${newOrgName}\". Requests will fail with missing-credential errors that name the key rather ` +\n `than this org change. If this came from a roster, identity, or user-list migration, add the ` +\n `members to the EXISTING organization instead of creating a new one.`,\n });\n}\n\nfunction defaultOrgName(\n email: string,\n session: { name?: string } | null,\n): string {\n const full = session?.name?.trim();\n if (full) return `${full}'s workspace`;\n const local = email.split(\"@\")[0] ?? email;\n const cleaned = local.replace(/[._-]+/g, \" \").trim();\n const titled =\n cleaned\n .split(\" \")\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \") || \"My\";\n return `${titled}'s workspace`;\n}\n\n/**\n * Check whether the user has a pending invitation. If so, auto-create\n * MUST be skipped — otherwise we'd provision a personal org for them\n * before they ever see the inviter's org in the invitation banner, and they'd\n * never join the team that invited them.\n */\nasync function hasPendingInvitation(\n exec: ReturnType<typeof getDbExec>,\n email: string,\n): Promise<boolean> {\n try {\n const { rows } = await exec.execute({\n sql: `SELECT 1 FROM org_invitations WHERE LOWER(email) = ? AND status = 'pending' LIMIT 1`,\n args: [email.toLowerCase()],\n });\n return rows.length > 0;\n } catch {\n // If we can't tell, err on the side of NOT auto-creating — the\n // invitation banner or team UI can surface the situation.\n return true;\n }\n}\n\nasync function hasDomainMatch(\n exec: ReturnType<typeof getDbExec>,\n email: string,\n): Promise<boolean> {\n try {\n const domain = email.split(\"@\")[1]?.toLowerCase();\n if (!domain) return false;\n const { rows } = await exec.execute({\n sql: `SELECT 1 FROM organizations WHERE LOWER(allowed_domain) = ? LIMIT 1`,\n args: [domain],\n });\n return rows.length > 0;\n } catch {\n return false;\n }\n}\n\n/** Stale-claim threshold. A claim row this old is treated as abandoned\n * (process crashed, DELETE failed, etc.) and a new caller may take it\n * over. Long enough that two genuine concurrent first-loads don't\n * trample each other (those settle in milliseconds), short enough that\n * a stuck user recovers on their next navigation. */\nconst CLAIM_TTL_MS = 5 * 60 * 1000;\n\n/**\n * Attempt to provision a default org + owner membership for a user with\n * zero memberships.\n *\n * Race protection: claims the user's auto-create slot via an atomic\n * INSERT into the framework `settings` table (PRIMARY KEY (key) — so\n * concurrent inserts for the same key throw uniqueness violations on\n * both SQLite and Postgres). Only the request that wins the claim\n * proceeds to create the org; losers bail. By the time a losing\n * request retries on a subsequent navigation, the winner's org is in\n * `org_members` and the auto-create branch is skipped entirely.\n *\n * Stuck-state recovery: a stale claim (held longer than CLAIM_TTL_MS)\n * is reclaimed automatically. So even if the DELETE on the failure\n * path fails (network blip, DB error), the user isn't stranded — the\n * next request after the TTL elapses retries cleanly.\n *\n * Returns null on any failure so the caller can fall back to the\n * empty-context / client-guard path.\n */\nasync function tryCreateDefaultOrg(\n exec: ReturnType<typeof getDbExec>,\n email: string,\n session: { name?: string } | null,\n): Promise<OrgContext | null> {\n // Make sure the framework `settings` table exists before we use it as\n // a claim primitive. getSetting() ensures the table on first call.\n await getSetting(\"__init\").catch(() => null);\n\n const claimKey = `u:${email.toLowerCase()}:auto-create-claim`;\n\n if (!(await acquireClaim(exec, claimKey))) return null;\n\n // Pending-invite check happens INSIDE the claim so the window where a\n // newly-arrived invitation can be missed is narrowed to a single SQL\n // round-trip. (A still-narrower window would require a transaction\n // spanning org_invitations and settings — out of scope.)\n if (await hasPendingInvitation(exec, email)) {\n await releaseClaim(exec, claimKey);\n return null;\n }\n\n if (await hasDomainMatch(exec, email)) {\n await releaseClaim(exec, claimKey);\n return null;\n }\n\n try {\n const orgId = nanoid();\n const orgName = defaultOrgName(email, session);\n const now = Date.now();\n\n await exec.execute({\n sql: `INSERT INTO organizations (id, name, created_by, created_at) VALUES (?, ?, ?, ?)`,\n args: [orgId, orgName, email, now],\n });\n await exec.execute({\n sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, ?, ?)`,\n args: [nanoid(), orgId, email, \"owner\", now],\n });\n\n await setActiveOrgId(email, orgId, \"auto-created default organization\");\n\n return { email, orgId, orgName, role: \"owner\" };\n } catch {\n await releaseClaim(exec, claimKey);\n return null;\n }\n}\n\nasync function acquireClaim(\n exec: ReturnType<typeof getDbExec>,\n claimKey: string,\n): Promise<boolean> {\n const now = Date.now();\n try {\n await exec.execute({\n sql: `INSERT INTO settings (key, value, updated_at) VALUES (?, ?, ?)`,\n args: [claimKey, JSON.stringify({ at: now }), now],\n });\n return true;\n } catch {\n // Conflict — someone else's claim is already in the row. If it's\n // stale (older than CLAIM_TTL_MS) we take it over.\n //\n // CRITICAL: this MUST be a single atomic UPDATE guarded on\n // `updated_at <= staleThreshold`. A read-then-DELETE-then-INSERT\n // sequence lets two concurrent reclaimers each observe the stale\n // timestamp, delete each other's fresh claim, and both think they\n // won — duplicating org creation. The conditional UPDATE matches\n // each stale row at most once: only the first writer sees\n // rowsAffected === 1; the row's updated_at is now `now`, so any\n // subsequent UPDATE no longer satisfies `updated_at <= staleThreshold`\n // and matches zero rows.\n const staleThreshold = now - CLAIM_TTL_MS;\n const result = (await exec.execute({\n sql: `UPDATE settings SET value = ?, updated_at = ? WHERE key = ? AND updated_at <= ?`,\n args: [JSON.stringify({ at: now }), now, claimKey, staleThreshold],\n })) as { rowsAffected?: number };\n return (result.rowsAffected ?? 0) > 0;\n }\n}\n\nasync function releaseClaim(\n exec: ReturnType<typeof getDbExec>,\n claimKey: string,\n): Promise<void> {\n // Best-effort. If this fails (transient network/DB error), the\n // CLAIM_TTL_MS-based takeover in acquireClaim recovers automatically\n // on a future request — no permanent stuck state.\n await exec\n .execute({ sql: `DELETE FROM settings WHERE key = ?`, args: [claimKey] })\n .catch(() => {});\n}\n\n/**\n * Look up the `allowed_domain` for an org by its ID.\n * Used when making outbound A2A calls so the JWT includes the\n * caller's org domain for cross-app org resolution.\n */\nexport async function getOrgDomain(orgId: string): Promise<string | null> {\n try {\n const exec = getDbExec();\n const { rows } = await exec.execute({\n sql: `SELECT allowed_domain FROM organizations WHERE id = ? LIMIT 1`,\n args: [orgId],\n });\n if (!rows[0]) return null;\n const domain = String((rows[0] as any).allowed_domain || \"\");\n return domain || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Look up the org's A2A secret by org ID.\n * Used when making outbound A2A calls so the JWT is signed with the\n * org-specific secret rather than the global A2A_SECRET env var.\n */\nexport async function getOrgA2ASecret(orgId: string): Promise<string | null> {\n try {\n const exec = getDbExec();\n const { rows } = await exec.execute({\n sql: `SELECT a2a_secret FROM organizations WHERE id = ? LIMIT 1`,\n args: [orgId],\n });\n if (!rows[0]) return null;\n const secret = String((rows[0] as any).a2a_secret || \"\");\n return secret || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Look up an org's A2A secret by its `allowed_domain`.\n * Used on the A2A receiving side: the caller's JWT includes `org_domain`,\n * and the receiver looks up which local org matches that domain to find\n * the secret used to verify the JWT signature.\n */\nexport async function getA2ASecretByDomain(\n domain: string,\n): Promise<string | null> {\n try {\n const exec = getDbExec();\n const { rows } = await exec.execute({\n sql: `SELECT a2a_secret FROM organizations WHERE LOWER(allowed_domain) = ? LIMIT 1`,\n args: [domain.toLowerCase()],\n });\n if (!rows[0]) return null;\n const secret = String((rows[0] as any).a2a_secret || \"\");\n return secret || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Resolve a local org by its `allowed_domain`.\n * Used on the A2A receiving side: the caller sends `org_domain` in the JWT,\n * and the receiver looks up which local org matches that domain.\n */\nexport async function resolveOrgByDomain(\n domain: string,\n): Promise<{ orgId: string; orgName: string } | null> {\n try {\n const exec = getDbExec();\n const { rows } = await exec.execute({\n sql: `SELECT id, name FROM organizations WHERE LOWER(allowed_domain) = ? LIMIT 1`,\n args: [domain.toLowerCase()],\n });\n if (!rows[0]) return null;\n return {\n orgId: String((rows[0] as any).id),\n orgName: String((rows[0] as any).name),\n };\n } catch {\n return null;\n }\n}\n"]}
@@ -21,7 +21,7 @@ export declare const getMyOrgHandler: import("h3").EventHandlerWithFetch<import(
21
21
  orgName: string;
22
22
  }[];
23
23
  allowedDomain: string;
24
- a2aSecret: string;
24
+ a2aSecretSet: boolean;
25
25
  }>>;
26
26
  /** POST /_agent-native/org — create a new organization */
27
27
  export declare const createOrgHandler: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
@@ -95,6 +95,21 @@ export declare const updateOrgHandler: import("h3").EventHandlerWithFetch<import
95
95
  orgId: string;
96
96
  name: any;
97
97
  }>>;
98
+ /**
99
+ * DELETE /_agent-native/org — permanently delete the current organization
100
+ * (owner only). Body: { name: string } must match the org's current name
101
+ * (trim + case-insensitive) as a confirmation guard against misclicks.
102
+ *
103
+ * Deletes org_invitations, org-scoped settings, org_members, and the
104
+ * organizations row, then repoints the caller's active-org-id to another
105
+ * membership of theirs (or null for Personal) so they aren't left pointing
106
+ * at a deleted org.
107
+ */
108
+ export declare const deleteOrgHandler: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
109
+ success: boolean;
110
+ orgId: string;
111
+ nextOrgId: string;
112
+ }>>;
98
113
  /** PUT /_agent-native/org/switch — switch the user's active organization */
99
114
  export declare const switchOrgHandler: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
100
115
  orgId: any;
@@ -111,6 +126,14 @@ export declare const joinByDomainHandler: import("h3").EventHandlerWithFetch<imp
111
126
  export declare const setDomainHandler: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
112
127
  domain: any;
113
128
  }>>;
129
+ /**
130
+ * GET /_agent-native/org/a2a-secret — reveal the org's A2A secret
131
+ * (owner/admin only). Separate from `/org/me` so the secret is only ever sent
132
+ * to the browser when an operator explicitly asks to see or copy it.
133
+ */
134
+ export declare const revealA2ASecretHandler: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
135
+ a2aSecret: string;
136
+ }>>;
114
137
  /** PUT /_agent-native/org/a2a-secret — regenerate or set the org's A2A secret (owner/admin only) */
115
138
  export declare const setA2ASecretHandler: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
116
139
  a2aSecret: any;
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/org/handlers.ts"],"names":[],"mappings":"AAgDA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAkB1C,2FAA2F;AAC3F,eAAO,MAAM,eAAe;;;;;;;cAaA,OAAO;;;;;;;;;;eAIC,MAAM;iBAAW,MAAM;;;;GA0EzD,CAAC;AAEH,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB;;;;GAe3B,CAAC;AAEH,wDAAwD;AACxD,eAAO,MAAM,kBAAkB;;;cA2CH,OAAO;;;;;GAQjC,CAAC;AAqBH,UAAU,kBAAkB;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAsED,8EAA8E;AAC9E,eAAO,MAAM,uBAAuB;;;;GAuEnC,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,sBAAsB;;;;;;;;;GAyBlC,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB;;;UAoD8B,OAAO;GAkBxE,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,mBAAmB;;GA2D/B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB;;;GAqEnC,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,gBAAgB;;;GA4B3B,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB;;;UAkCC,OAAO;GAEnC,CAAC;AAEH,mGAAmG;AACnG,eAAO,MAAM,mBAAmB;;;UAqDR,OAAO;GAG9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,gBAAgB;;GAsE3B,CAAC;AAEH,oGAAoG;AACpG,eAAO,MAAM,mBAAmB;;;GA0C/B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,oBAAoB;;;;;YA2DvB,MAAM;cACJ,MAAM;aACP,MAAM;YACP,OAAO;iBACF,MAAM;gBACP,MAAM;;GA6DnB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB;;;GAgGnC,CAAC"}
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/org/handlers.ts"],"names":[],"mappings":"AAgDA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAkB1C,2FAA2F;AAC3F,eAAO,MAAM,eAAe;;;;;;;cAaA,OAAO;;;;;;;;;;eAIC,MAAM;iBAAW,MAAM;;;;GAgFzD,CAAC;AAEH,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB;;;;GAe3B,CAAC;AAEH,wDAAwD;AACxD,eAAO,MAAM,kBAAkB;;;cA2CH,OAAO;;;;;GAQjC,CAAC;AAqBH,UAAU,kBAAkB;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAsED,8EAA8E;AAC9E,eAAO,MAAM,uBAAuB;;;;GAuEnC,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,sBAAsB;;;;;;;;;GAyBlC,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB;;;UAoD8B,OAAO;GAkBxE,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,mBAAmB;;GA2D/B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB;;;GAqEnC,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,gBAAgB;;;GA4B3B,CAAC;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB;;;;GAuF3B,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB;;;UAkCC,OAAO;GAEnC,CAAC;AAEH,mGAAmG;AACnG,eAAO,MAAM,mBAAmB;;;UAqDR,OAAO;GAG9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,gBAAgB;;GAsE3B,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;GA0BlC,CAAC;AAEF,oGAAoG;AACpG,eAAO,MAAM,mBAAmB;;;GA0C/B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,oBAAoB;;;;;YA2DvB,MAAM;cACJ,MAAM;aACP,MAAM;YACP,OAAO;iBACF,MAAM;gBACP,MAAM;;GA6DnB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB;;;GAgGnC,CAAC"}