@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 +1 @@
1
- {"version":3,"file":"traces.js","sourceRoot":"","sources":["../../src/observability/traces.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentLoopUsage } from \"../agent/production-agent.js\";\nimport type { AgentChatEvent, AgentToolInput } from \"../agent/types.js\";\nimport { type AgentSpan, endAgentSpan, startAgentSpan } from \"./tracing.js\";\nimport { trackingIdentityProperties } from \"./tracking-identity.js\";\nimport type { TraceSpan, TraceSummary, ObservabilityConfig } from \"./types.js\";\nimport { DEFAULT_OBSERVABILITY_CONFIG } from \"./types.js\";\n\nfunction spanId(): string {\n return `span-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction llmProviderFromEngine(\n engineName: string | undefined,\n model: string,\n): string {\n const engine = engineName?.trim();\n if (engine?.startsWith(\"ai-sdk:\")) return engine.slice(\"ai-sdk:\".length);\n if (engine) return engine;\n if (/claude|anthropic/i.test(model)) return \"anthropic\";\n if (/gpt|openai|codex/i.test(model)) return \"openai\";\n if (/gemini|google/i.test(model)) return \"google\";\n return \"unknown\";\n}\n\nfunction costUsdFromCenticents(value: number): number {\n return Math.round((value / 10_000) * 1_000_000) / 1_000_000;\n}\n\nconst MAX_TRACKED_GENERATION_TOOL_CALLS = 50;\nconst MAX_TOOL_ERROR_MESSAGE_LENGTH = 500;\nconst STANDALONE_API_KEY_PATTERN =\n /\\b(?:sk-(?:proj-|ant-)?[A-Za-z0-9_-]{8,}|(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{8,}|AIza[A-Za-z0-9_-]{16,}|gh[pousr]_[A-Za-z0-9]{16,})\\b/g;\n\ntype GenerationToolCall = {\n name: string;\n started_offset_ms: number;\n duration_ms: number;\n status: \"success\" | \"error\";\n error_class: \"tool_error\" | \"legacy_inferred_error\" | \"interrupted\" | null;\n error_message?: string;\n};\n\nfunction truncateToolErrorMessage(value: string): string {\n return value.length > MAX_TOOL_ERROR_MESSAGE_LENGTH\n ? `${value.slice(0, MAX_TOOL_ERROR_MESSAGE_LENGTH)}…`\n : value;\n}\n\nfunction redactToolErrorMessage(value: string): string {\n const credentialName =\n \"authorization|cookie|api[_ -]?key|password|secret|token|access[_ -]?token|refresh[_ -]?token\";\n const labeledCredential = `([\"']?\\\\b(?:${credentialName})\\\\b[\"']?\\\\s*[:=]\\\\s*[\"']?)`;\n return value\n .replace(\n new RegExp(\n `${labeledCredential}(?:Bearer|Basic)\\\\s+[^\"'\\\\s,;)}\\\\]]+`,\n \"gi\",\n ),\n \"$1[REDACTED]\",\n )\n .replace(\n new RegExp(`${labeledCredential}[^\"'\\\\s,;)}\\\\[\\\\]]+`, \"gi\"),\n \"$1[REDACTED]\",\n )\n .replace(/\\bBearer\\s+[A-Za-z0-9._~+/=-]+/gi, \"[REDACTED]\")\n .replace(STANDALONE_API_KEY_PATTERN, \"[REDACTED]\");\n}\n\nfunction emitLlmGenerationTrackingEvent(args: {\n runId: string;\n threadId: string | null;\n userId: string | null;\n parentSpanId: string;\n llmSpanId: string;\n engineName: string | undefined;\n model: string;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n costCentsX100: number;\n durationMs: number;\n status: \"success\" | \"error\";\n errorMessage: string | null;\n toolCalls: number;\n successfulTools: number;\n failedTools: number;\n tools: GenerationToolCall[];\n toolsTruncated: boolean;\n delegation?: {\n protocol: \"a2a\" | \"mcp\";\n callerApp?: string;\n taskId?: string;\n parentRunId?: string;\n parentTurnId?: string;\n };\n createdAt: number;\n experimentAssignments?: Array<{\n experimentId: string;\n variantId: string;\n }>;\n modelSelectionSource?: string;\n}): void {\n const provider = llmProviderFromEngine(args.engineName, args.model);\n const costUsd = costUsdFromCenticents(args.costCentsX100);\n const error = args.errorMessage ?? undefined;\n const properties: Record<string, unknown> = {\n ...trackingIdentityProperties(),\n source: \"agent_observability\",\n span_type: \"llm_call\",\n run_id: args.runId,\n thread_id: args.threadId,\n parent_span_id: args.parentSpanId,\n span_id: args.llmSpanId,\n model: args.model,\n provider,\n input_tokens: args.inputTokens,\n output_tokens: args.outputTokens,\n total_tokens: args.inputTokens + args.outputTokens,\n cache_read_tokens: args.cacheReadTokens,\n cache_write_tokens: args.cacheWriteTokens,\n cost_cents_x100: args.costCentsX100,\n cost_usd: costUsd,\n duration_ms: args.durationMs,\n status: args.status,\n tool_calls: args.toolCalls,\n successful_tools: args.successfulTools,\n failed_tools: args.failedTools,\n tools: args.tools,\n tools_truncated: args.toolsTruncated,\n delegated: args.delegation ? true : undefined,\n delegation_protocol: args.delegation?.protocol,\n caller_app: args.delegation?.callerApp,\n a2a_task_id: args.delegation?.taskId,\n parent_run_id: args.delegation?.parentRunId,\n parent_turn_id: args.delegation?.parentTurnId,\n model_selection_source: args.modelSelectionSource,\n created_at: new Date(args.createdAt).toISOString(),\n created_at_ms: args.createdAt,\n $ai_trace_id: args.runId,\n $ai_session_id: args.threadId ?? undefined,\n $ai_span_id: args.llmSpanId,\n $ai_span_name: \"agent_run\",\n $ai_parent_id: args.parentSpanId,\n $ai_model: args.model,\n $ai_provider: provider,\n $ai_input_tokens: args.inputTokens,\n $ai_output_tokens: args.outputTokens,\n $ai_latency: Math.round((args.durationMs / 1000) * 1000) / 1000,\n $ai_is_error: args.status === \"error\",\n $ai_error: error,\n $ai_cache_read_input_tokens: args.cacheReadTokens,\n $ai_cache_creation_input_tokens: args.cacheWriteTokens,\n $ai_request_count: 1,\n $ai_total_cost_usd: costUsd,\n };\n if (args.experimentAssignments?.length) {\n properties.experiment_ids = args.experimentAssignments\n .map((assignment) => assignment.experimentId)\n .join(\",\");\n properties.experiment_variants = args.experimentAssignments\n .map((assignment) => assignment.variantId)\n .join(\",\");\n if (args.experimentAssignments.length === 1) {\n properties.experiment_id = args.experimentAssignments[0].experimentId;\n properties.experiment_variant = args.experimentAssignments[0].variantId;\n }\n }\n if (error) properties.error_message = error;\n\n for (const key of Object.keys(properties)) {\n if (properties[key] === undefined) delete properties[key];\n }\n\n try {\n void import(\"../tracking/registry.js\")\n .then(({ track }) => {\n track(\"$ai_generation\", properties, {\n userId: args.userId ?? undefined,\n });\n })\n .catch(() => {});\n } catch {\n // Tracking must never affect the agent run or trace persistence.\n }\n}\n\n/** Keys whose values are stripped from persisted tool inputs when\n * `captureToolArgs` is enabled. Matched case-insensitively and tolerant\n * of `_` / `-` separators. M14 in the MCP/A2A audit: tool calls\n * routinely receive credentials verbatim (db-exec INSERTs, fetchTool\n * Authorization headers, ad-hoc bearer tokens) — keeping those values\n * out of agent_trace_spans.metadata avoids long-term storage of\n * short-lived secrets. */\nconst SENSITIVE_FIELD_PATTERN =\n /^(authorization|cookie|api[_-]?key|password|secret|token|access[_-]?token|refresh[_-]?token|bearer)$/i;\n\n/** Recursively walk a structured value and replace sensitive field\n * values with the literal string \"[REDACTED]\". Pure (returns a copy);\n * the original input is never mutated. Cycles are tolerated via a\n * small WeakSet seen-tracker that returns \"[Circular]\" for repeats. */\nexport function redactSensitiveFields(value: unknown): unknown {\n return redactWalk(value, new WeakSet<object>());\n}\n\nfunction redactWalk(value: unknown, seen: WeakSet<object>): unknown {\n if (value === null || typeof value !== \"object\") return value;\n if (seen.has(value as object)) return \"[Circular]\";\n seen.add(value as object);\n if (Array.isArray(value)) {\n return value.map((v) => redactWalk(v, seen));\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (SENSITIVE_FIELD_PATTERN.test(k)) {\n out[k] = \"[REDACTED]\";\n } else {\n out[k] = redactWalk(v, seen);\n }\n }\n return out;\n}\n\nexport async function getObservabilityConfig(): Promise<ObservabilityConfig> {\n let stored: Partial<ObservabilityConfig> | null = null;\n try {\n const { getSetting } = await import(\"../settings/store.js\");\n stored = (await getSetting(\n \"observability-config\",\n )) as Partial<ObservabilityConfig> | null;\n } catch {}\n const { resolveInferredSentimentConfig } = await import(\"./sentiment.js\");\n return {\n ...DEFAULT_OBSERVABILITY_CONFIG,\n ...(stored ?? {}),\n ...resolveInferredSentimentConfig(stored),\n };\n}\n\nexport async function instrumentAgentLoop(opts: {\n runAgentLoop: (loopOpts: {\n engine: any;\n model: string;\n systemPrompt: string;\n tools: any[];\n messages: any[];\n actions: Record<string, any>;\n send: (event: AgentChatEvent) => void;\n signal: AbortSignal;\n providerOptions?: any;\n runId?: string;\n }) => Promise<AgentLoopUsage>;\n loopOpts: {\n engine: any;\n model: string;\n systemPrompt: string;\n tools: any[];\n messages: any[];\n actions: Record<string, any>;\n send: (event: AgentChatEvent) => void;\n signal: AbortSignal;\n providerOptions?: any;\n runId?: string;\n };\n runId: string;\n threadId: string | null;\n /** Owner of this run; persisted on every span + summary so dashboard\n * reads can filter to a single user. Null for unauthenticated callers\n * (background tasks, etc.) — those rows aren't returned by per-user\n * reads. */\n userId: string | null;\n config: ObservabilityConfig;\n metadata?: Record<string, unknown> | null;\n experimentAssignments?: Array<{\n experimentId: string;\n variantId: string;\n }>;\n modelSelectionSource?: string;\n delegation?: {\n protocol: \"a2a\" | \"mcp\";\n callerApp?: string;\n taskId?: string;\n parentRunId?: string;\n parentTurnId?: string;\n };\n /** Raw user-authored message before prompt/context enrichment. */\n sentimentInput?: string;\n classifyError?: (error: unknown) =>\n | {\n status?: \"success\" | \"error\";\n errorMessage?: string | null;\n metadata?: Record<string, unknown> | null;\n }\n | null\n | undefined;\n}): Promise<AgentLoopUsage> {\n const { runAgentLoop, loopOpts, runId, threadId, userId, config } = opts;\n const runStart = Date.now();\n const parentSpanId = spanId();\n const precedingResponsePromise =\n config.inferredSentimentEnabled && opts.sentimentInput && threadId && userId\n ? import(\"./store.js\")\n .then(({ getLatestTraceSummaryForThread }) =>\n getLatestTraceSummaryForThread(threadId, {\n userId,\n excludeRunId: runId,\n }),\n )\n .catch(() => null)\n : Promise.resolve(null);\n\n // Optional OpenTelemetry root span for this run. No-ops unless a host has\n // installed `@opentelemetry/api` and registered a provider. The promise is\n // resolved before the loop runs so child tool/model spans can parent under\n // it conceptually (we keep them flat in the same tracer, which is enough\n // for the dashboards an embedding app would build).\n const otelRunSpanPromise = startAgentSpan(\"agent.run\", {\n \"agent.run_id\": runId,\n \"agent.thread_id\": threadId ?? undefined,\n \"agent.user_id\": userId ?? undefined,\n \"agent.model\": loopOpts.model,\n \"agent.model_selection_source\": opts.modelSelectionSource,\n \"agent.experiment_id\":\n opts.experimentAssignments?.length === 1\n ? opts.experimentAssignments[0].experimentId\n : undefined,\n \"agent.experiment_variant\":\n opts.experimentAssignments?.length === 1\n ? opts.experimentAssignments[0].variantId\n : undefined,\n });\n\n const spans: TraceSpan[] = [];\n let toolInvocationCounter = 0;\n // Keyed by counter to handle concurrent calls to the same tool name\n const pendingTools = new Map<\n number,\n {\n spanId: string;\n callId?: string;\n startMs: number;\n toolName: string;\n input: AgentToolInput;\n otelSpan: AgentSpan | null;\n endResult?: { status: \"success\" | \"error\"; errorMessage: string | null };\n }\n >();\n // Secondary index for legacy emitters without call ids. Current tool events\n // are paired by id first; same-name FIFO remains as a compatibility fallback.\n const toolNameToCounters = new Map<string, number[]>();\n const toolCallIdToCounter = new Map<string, number>();\n const generationToolCalls = new Map<number, GenerationToolCall>();\n\n let toolCallCount = 0;\n let successfulTools = 0;\n let failedTools = 0;\n\n // Track in-flight OTel tool spans so they're all ended even if the loop\n // throws before a matching `tool_done` arrives.\n const openOtelToolSpans = new Set<AgentSpan>();\n\n const instrumentedSend = (event: AgentChatEvent): void => {\n try {\n if (event.type === \"tool_start\") {\n const counter = toolInvocationCounter++;\n const sid = spanId();\n // Start the OTel tool span synchronously-ish: kick off the async\n // resolution and stash the span once it lands. Tool spans are short\n // and the api tracer is synchronous in practice, but we tolerate the\n // microtask gap by recording the span on the pending entry when ready.\n const entry: {\n spanId: string;\n callId?: string;\n startMs: number;\n toolName: string;\n input: AgentToolInput;\n otelSpan: AgentSpan | null;\n // Set by the done handler if it fires before the span promise\n // resolves, so the resolved span is ended with the correct status.\n endResult?: {\n status: \"success\" | \"error\";\n errorMessage: string | null;\n };\n } = {\n spanId: sid,\n ...(event.id ? { callId: event.id } : {}),\n startMs: Date.now(),\n toolName: event.tool,\n input: event.input,\n otelSpan: null,\n };\n pendingTools.set(counter, entry);\n if (event.id) toolCallIdToCounter.set(event.id, counter);\n void startAgentSpan(\"tool.call\", {\n \"tool.name\": event.tool,\n }).then((span) => {\n if (!span) return;\n // If `tool_done` already ran for this call, end the span now with the\n // status it recorded; otherwise stash it for the done handler.\n if (entry.endResult) {\n endAgentSpan(span, {\n status: entry.endResult.status,\n errorMessage: entry.endResult.errorMessage,\n });\n } else {\n entry.otelSpan = span;\n openOtelToolSpans.add(span);\n }\n });\n const queue = toolNameToCounters.get(event.tool);\n if (queue) queue.push(counter);\n else toolNameToCounters.set(event.tool, [counter]);\n } else if (event.type === \"tool_done\") {\n const queue = toolNameToCounters.get(event.tool);\n const counterFromId = event.id\n ? toolCallIdToCounter.get(event.id)\n : undefined;\n const legacyQueueIndex =\n event.id && counterFromId === undefined && queue\n ? queue.findIndex(\n (candidate) => !pendingTools.get(candidate)?.callId,\n )\n : -1;\n const counter =\n counterFromId ??\n (event.id\n ? legacyQueueIndex >= 0\n ? queue?.[legacyQueueIndex]\n : undefined\n : queue?.shift());\n const pending =\n counter !== undefined ? pendingTools.get(counter) : undefined;\n if (counter !== undefined) {\n pendingTools.delete(counter);\n if (pending?.callId) toolCallIdToCounter.delete(pending.callId);\n if ((counterFromId !== undefined || legacyQueueIndex >= 0) && queue) {\n const queueIndex = queue.indexOf(counter);\n if (queueIndex >= 0) queue.splice(queueIndex, 1);\n }\n if (queue && queue.length === 0)\n toolNameToCounters.delete(event.tool);\n }\n toolCallCount++;\n\n const finishedAt = Date.now();\n\n const explicitError = event.isError === true;\n const isError =\n typeof event.isError === \"boolean\"\n ? event.isError\n : typeof event.result === \"string\" &&\n (event.result.startsWith(\"Error\") ||\n event.result.startsWith(\"Error running \"));\n if (isError) failedTools++;\n else successfulTools++;\n\n if (\n counter !== undefined &&\n counter < MAX_TRACKED_GENERATION_TOOL_CALLS &&\n pending\n ) {\n generationToolCalls.set(counter, {\n name: pending.toolName,\n started_offset_ms: Math.max(0, pending.startMs - runStart),\n duration_ms: Math.max(0, finishedAt - pending.startMs),\n status: isError ? \"error\" : \"success\",\n error_class: !isError\n ? null\n : explicitError\n ? \"tool_error\"\n : \"legacy_inferred_error\",\n error_message:\n isError && config.captureToolResults\n ? truncateToolErrorMessage(redactToolErrorMessage(event.result))\n : undefined,\n });\n }\n\n // Finalize the OTel tool span. If the span promise hasn't resolved yet\n // we record the result on the entry so its `.then` handler ends it.\n const otelEndResult = {\n status: (isError ? \"error\" : \"success\") as \"success\" | \"error\",\n errorMessage: isError ? (event.result as string) : null,\n };\n if (pending?.otelSpan) {\n openOtelToolSpans.delete(pending.otelSpan);\n endAgentSpan(pending.otelSpan, {\n status: otelEndResult.status,\n errorMessage: otelEndResult.errorMessage,\n attributes: { \"tool.name\": event.tool },\n });\n } else if (pending) {\n pending.endResult = otelEndResult;\n }\n\n const span: TraceSpan = {\n id: pending?.spanId ?? spanId(),\n runId,\n threadId,\n userId,\n parentSpanId,\n spanType: \"tool_call\",\n name: event.tool,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n costCentsX100: 0,\n durationMs: pending ? Math.max(0, finishedAt - pending.startMs) : 0,\n status: isError ? \"error\" : \"success\",\n errorMessage: isError ? event.result : null,\n metadata:\n config.captureToolArgs && pending\n ? // Strip Authorization/api-key/token-shaped values before\n // persisting (M14 in the MCP/A2A audit). Tool-runtime\n // execution still sees the unredacted input — only the\n // long-lived span row is sanitized.\n {\n input: redactSensitiveFields(pending.input) as Record<\n string,\n string\n >,\n }\n : null,\n createdAt: Date.now(),\n };\n spans.push(span);\n }\n } catch {}\n\n loopOpts.send(event);\n };\n\n let usage: AgentLoopUsage | undefined;\n let runStatus: \"success\" | \"error\" = \"success\";\n let errorMessage: string | null = null;\n let runMetadata: Record<string, unknown> | null = opts.metadata ?? null;\n try {\n usage = await runAgentLoop({\n ...loopOpts,\n runId,\n send: instrumentedSend,\n });\n } catch (err: any) {\n const classification = opts.classifyError?.(err) ?? null;\n runStatus = classification?.status ?? \"error\";\n errorMessage =\n classification?.errorMessage === undefined\n ? (err?.message ?? String(err))\n : classification.errorMessage;\n const errorMetadata = classification?.metadata ?? null;\n runMetadata =\n runMetadata || errorMetadata\n ? { ...(runMetadata ?? {}), ...(errorMetadata ?? {}) }\n : null;\n throw err;\n } finally {\n const runEnd = Date.now();\n const totalDurationMs = runEnd - runStart;\n\n if (pendingTools.size > 0) {\n if (runStatus === \"success\") {\n runStatus = \"error\";\n errorMessage ??= \"Agent run ended with interrupted tool calls\";\n }\n for (const [counter, pending] of pendingTools) {\n toolCallCount += 1;\n failedTools += 1;\n const interruptedMessage = \"Tool call interrupted before completion\";\n if (counter < MAX_TRACKED_GENERATION_TOOL_CALLS) {\n generationToolCalls.set(counter, {\n name: pending.toolName,\n started_offset_ms: Math.max(0, pending.startMs - runStart),\n duration_ms: Math.max(0, runEnd - pending.startMs),\n status: \"error\",\n error_class: \"interrupted\",\n error_message: config.captureToolResults\n ? interruptedMessage\n : undefined,\n });\n }\n if (pending.otelSpan) {\n openOtelToolSpans.delete(pending.otelSpan);\n endAgentSpan(pending.otelSpan, {\n status: \"error\",\n errorMessage: interruptedMessage,\n attributes: { \"tool.name\": pending.toolName },\n });\n } else {\n pending.endResult = {\n status: \"error\",\n errorMessage: interruptedMessage,\n };\n }\n spans.push({\n id: pending.spanId,\n runId,\n threadId,\n userId,\n parentSpanId,\n spanType: \"tool_call\",\n name: pending.toolName,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n costCentsX100: 0,\n durationMs: Math.max(0, runEnd - pending.startMs),\n status: \"error\",\n errorMessage: interruptedMessage,\n metadata: null,\n createdAt: runEnd,\n });\n }\n pendingTools.clear();\n toolNameToCounters.clear();\n toolCallIdToCounter.clear();\n }\n\n let costCentsX100 = 0;\n try {\n const { calculateCost } = await import(\"../usage/store.js\");\n if (usage) {\n costCentsX100 = calculateCost(\n usage.inputTokens,\n usage.outputTokens,\n usage.model,\n usage.cacheReadTokens,\n usage.cacheWriteTokens,\n );\n }\n } catch {}\n\n let llmCallCount = 0;\n if (usage || runStatus === \"error\") {\n llmCallCount = 1;\n const generationUsage = usage ?? {\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n model: loopOpts.model,\n };\n const llmSpanId = spanId();\n const llmSpan: TraceSpan = {\n id: llmSpanId,\n runId,\n threadId,\n userId,\n parentSpanId,\n spanType: \"llm_call\",\n name: generationUsage.model,\n inputTokens: generationUsage.inputTokens,\n outputTokens: generationUsage.outputTokens,\n cacheReadTokens: generationUsage.cacheReadTokens,\n cacheWriteTokens: generationUsage.cacheWriteTokens,\n costCentsX100,\n durationMs: totalDurationMs,\n status: runStatus,\n errorMessage,\n metadata: null,\n createdAt: runStart,\n };\n spans.push(llmSpan);\n emitLlmGenerationTrackingEvent({\n runId,\n threadId,\n userId,\n parentSpanId,\n llmSpanId,\n engineName:\n typeof loopOpts.engine?.name === \"string\"\n ? loopOpts.engine.name\n : undefined,\n model: generationUsage.model,\n inputTokens: generationUsage.inputTokens,\n outputTokens: generationUsage.outputTokens,\n cacheReadTokens: generationUsage.cacheReadTokens,\n cacheWriteTokens: generationUsage.cacheWriteTokens,\n costCentsX100,\n durationMs: totalDurationMs,\n status: runStatus,\n errorMessage,\n toolCalls: toolCallCount,\n successfulTools,\n failedTools,\n tools: [...generationToolCalls.entries()]\n .sort(([a], [b]) => a - b)\n .map(([, detail]) => detail),\n toolsTruncated:\n toolInvocationCounter > MAX_TRACKED_GENERATION_TOOL_CALLS,\n delegation: opts.delegation,\n createdAt: runStart,\n experimentAssignments: opts.experimentAssignments,\n modelSelectionSource: opts.modelSelectionSource,\n });\n }\n\n const parentSpan: TraceSpan = {\n id: parentSpanId,\n runId,\n threadId,\n userId,\n parentSpanId: null,\n spanType: \"agent_run\",\n name: \"agent_run\",\n inputTokens: usage?.inputTokens ?? 0,\n outputTokens: usage?.outputTokens ?? 0,\n cacheReadTokens: usage?.cacheReadTokens ?? 0,\n cacheWriteTokens: usage?.cacheWriteTokens ?? 0,\n costCentsX100,\n durationMs: totalDurationMs,\n status: runStatus,\n errorMessage,\n metadata: runMetadata,\n createdAt: runStart,\n };\n spans.push(parentSpan);\n\n const summary: TraceSummary = {\n runId,\n threadId,\n userId,\n totalSpans: spans.length,\n llmCalls: llmCallCount,\n toolCalls: toolCallCount,\n successfulTools,\n failedTools,\n totalDurationMs,\n totalCostCentsX100: costCentsX100,\n totalInputTokens: usage?.inputTokens ?? 0,\n totalOutputTokens: usage?.outputTokens ?? 0,\n model: usage?.model ?? loopOpts.model,\n createdAt: runStart,\n };\n\n writeTraceData(spans, summary, runId, config).catch(() => {});\n\n // OpenTelemetry export (no-op unless a provider is registered). Emit a\n // self-contained `llm.call` span carrying model + token usage, end any\n // tool spans still open (loop threw mid-tool), and end the run span. Awaited\n // so the spans are emitted before the function returns; cheap when no-op.\n try {\n if (usage) {\n endAgentSpan(await startAgentSpan(\"llm.call\", {}), {\n status: runStatus,\n errorMessage,\n attributes: {\n \"llm.model\": usage.model,\n \"llm.input_tokens\": usage.inputTokens,\n \"llm.output_tokens\": usage.outputTokens,\n \"llm.cache_read_tokens\": usage.cacheReadTokens,\n \"llm.cache_write_tokens\": usage.cacheWriteTokens,\n \"llm.cost_cents_x100\": costCentsX100,\n },\n });\n }\n for (const toolSpan of openOtelToolSpans) {\n endAgentSpan(toolSpan, {\n status: \"error\",\n errorMessage: \"Agent run ended before tool_done.\",\n });\n }\n openOtelToolSpans.clear();\n endAgentSpan(await otelRunSpanPromise, {\n status: runStatus,\n errorMessage,\n attributes: {\n \"agent.tool_calls\": toolCallCount,\n \"agent.successful_tools\": successfulTools,\n \"agent.failed_tools\": failedTools,\n \"agent.duration_ms\": totalDurationMs,\n \"agent.input_tokens\": usage?.inputTokens ?? 0,\n \"agent.output_tokens\": usage?.outputTokens ?? 0,\n \"agent.cost_cents_x100\": costCentsX100,\n },\n });\n } catch {\n // OTel export must never break the run.\n }\n }\n\n // Classify only after the main loop has finished so the tiny managed Luna\n // request cannot contend with the user's response for a gateway slot. This\n // short, awaited tail keeps serverless runtimes alive long enough to emit the\n // event, while the response content has already streamed to the client.\n if (usage && opts.sentimentInput) {\n try {\n const precedingResponse = await precedingResponsePromise;\n if (precedingResponse) {\n const { inferAndTrackSentiment } = await import(\"./sentiment.js\");\n await inferAndTrackSentiment({\n classifierModel: config.inferredSentimentModel,\n precedingResponseModel: precedingResponse.model,\n text: opts.sentimentInput,\n precedingRunId: precedingResponse.runId,\n classificationTriggerRunId: runId,\n threadId,\n userId,\n sampleRate: config.inferredSentimentSampleRate,\n });\n }\n } catch {\n // Optional inference must never alter the result of the main run.\n }\n }\n\n return usage!;\n}\n\nasync function writeTraceData(\n spans: TraceSpan[],\n summary: TraceSummary,\n runId: string,\n config: ObservabilityConfig,\n): Promise<void> {\n const { insertTraceSpan, upsertTraceSummary } = await import(\"./store.js\");\n await Promise.all(spans.map((s) => insertTraceSpan(s).catch(() => {})));\n await upsertTraceSummary(summary).catch(() => {});\n\n // Fire automated evals after trace data is persisted\n try {\n const { evaluateRun } = await import(\"./evals.js\");\n await evaluateRun(runId, { sampleRate: config.evalSampleRate });\n } catch {}\n}\n"]}
1
+ {"version":3,"file":"traces.js","sourceRoot":"","sources":["../../src/observability/traces.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentLoopUsage } from \"../agent/production-agent.js\";\nimport type { AgentChatEvent, AgentToolInput } from \"../agent/types.js\";\nimport { type AgentSpan, endAgentSpan, startAgentSpan } from \"./tracing.js\";\nimport { trackingIdentityProperties } from \"./tracking-identity.js\";\nimport type { TraceSpan, TraceSummary, ObservabilityConfig } from \"./types.js\";\nimport { DEFAULT_OBSERVABILITY_CONFIG } from \"./types.js\";\n\nfunction spanId(): string {\n return `span-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction llmProviderFromEngine(\n engineName: string | undefined,\n model: string,\n): string {\n const engine = engineName?.trim();\n if (engine?.startsWith(\"ai-sdk:\")) return engine.slice(\"ai-sdk:\".length);\n if (engine) return engine;\n if (/claude|anthropic/i.test(model)) return \"anthropic\";\n if (/gpt|openai|codex/i.test(model)) return \"openai\";\n if (/gemini|google/i.test(model)) return \"google\";\n return \"unknown\";\n}\n\nfunction costUsdFromCenticents(value: number): number {\n return Math.round((value / 10_000) * 1_000_000) / 1_000_000;\n}\n\nconst MAX_TRACKED_GENERATION_TOOL_CALLS = 50;\nconst MAX_TOOL_ERROR_MESSAGE_LENGTH = 500;\nconst STANDALONE_API_KEY_PATTERN =\n /\\b(?:sk-(?:proj-|ant-)?[A-Za-z0-9_-]{8,}|(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{8,}|AIza[A-Za-z0-9_-]{16,}|gh[pousr]_[A-Za-z0-9]{16,})\\b/g;\n\ntype GenerationToolCall = {\n name: string;\n started_offset_ms: number;\n duration_ms: number;\n status: \"success\" | \"error\";\n error_class: \"tool_error\" | \"legacy_inferred_error\" | \"interrupted\" | null;\n error_message?: string;\n};\n\nfunction truncateToolErrorMessage(value: string): string {\n return value.length > MAX_TOOL_ERROR_MESSAGE_LENGTH\n ? `${value.slice(0, MAX_TOOL_ERROR_MESSAGE_LENGTH)}…`\n : value;\n}\n\nfunction redactToolErrorMessage(value: string): string {\n const credentialName =\n \"authorization|cookie|api[_ -]?key|password|secret|token|access[_ -]?token|refresh[_ -]?token\";\n const labeledCredential = `([\"']?\\\\b(?:${credentialName})\\\\b[\"']?\\\\s*[:=]\\\\s*[\"']?)`;\n return value\n .replace(\n new RegExp(\n `${labeledCredential}(?:Bearer|Basic)\\\\s+[^\"'\\\\s,;)}\\\\]]+`,\n \"gi\",\n ),\n \"$1[REDACTED]\",\n )\n .replace(\n new RegExp(`${labeledCredential}[^\"'\\\\s,;)}\\\\[\\\\]]+`, \"gi\"),\n \"$1[REDACTED]\",\n )\n .replace(/\\bBearer\\s+[A-Za-z0-9._~+/=-]+/gi, \"[REDACTED]\")\n .replace(STANDALONE_API_KEY_PATTERN, \"[REDACTED]\");\n}\n\nfunction emitLlmGenerationTrackingEvent(args: {\n runId: string;\n threadId: string | null;\n userId: string | null;\n parentSpanId: string;\n llmSpanId: string;\n engineName: string | undefined;\n model: string;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n costCentsX100: number;\n durationMs: number;\n status: \"success\" | \"error\";\n errorMessage: string | null;\n toolCalls: number;\n successfulTools: number;\n failedTools: number;\n tools: GenerationToolCall[];\n toolsTruncated: boolean;\n delegation?: {\n protocol: \"a2a\" | \"mcp\";\n callerApp?: string;\n taskId?: string;\n parentRunId?: string;\n parentTurnId?: string;\n };\n createdAt: number;\n experimentAssignments?: Array<{\n experimentId: string;\n variantId: string;\n }>;\n modelSelectionSource?: string;\n}): void {\n const provider = llmProviderFromEngine(args.engineName, args.model);\n const costUsd = costUsdFromCenticents(args.costCentsX100);\n const error = args.errorMessage ?? undefined;\n const properties: Record<string, unknown> = {\n ...trackingIdentityProperties(),\n source: \"agent_observability\",\n span_type: \"llm_call\",\n run_id: args.runId,\n thread_id: args.threadId,\n parent_span_id: args.parentSpanId,\n span_id: args.llmSpanId,\n model: args.model,\n provider,\n input_tokens: args.inputTokens,\n output_tokens: args.outputTokens,\n total_tokens: args.inputTokens + args.outputTokens,\n cache_read_tokens: args.cacheReadTokens,\n cache_write_tokens: args.cacheWriteTokens,\n cost_cents_x100: args.costCentsX100,\n cost_usd: costUsd,\n duration_ms: args.durationMs,\n status: args.status,\n tool_calls: args.toolCalls,\n successful_tools: args.successfulTools,\n failed_tools: args.failedTools,\n tools: args.tools,\n tools_truncated: args.toolsTruncated,\n delegated: args.delegation ? true : undefined,\n delegation_protocol: args.delegation?.protocol,\n caller_app: args.delegation?.callerApp,\n a2a_task_id: args.delegation?.taskId,\n parent_run_id: args.delegation?.parentRunId,\n parent_turn_id: args.delegation?.parentTurnId,\n model_selection_source: args.modelSelectionSource,\n created_at: new Date(args.createdAt).toISOString(),\n created_at_ms: args.createdAt,\n $ai_trace_id: args.runId,\n $ai_session_id: args.threadId ?? undefined,\n $ai_span_id: args.llmSpanId,\n $ai_span_name: \"agent_run\",\n $ai_parent_id: args.parentSpanId,\n $ai_model: args.model,\n $ai_provider: provider,\n $ai_input_tokens: args.inputTokens,\n $ai_output_tokens: args.outputTokens,\n $ai_latency: Math.round((args.durationMs / 1000) * 1000) / 1000,\n $ai_is_error: args.status === \"error\",\n $ai_error: error,\n $ai_cache_read_input_tokens: args.cacheReadTokens,\n $ai_cache_creation_input_tokens: args.cacheWriteTokens,\n $ai_request_count: 1,\n $ai_total_cost_usd: costUsd,\n };\n if (args.experimentAssignments?.length) {\n properties.experiment_ids = args.experimentAssignments\n .map((assignment) => assignment.experimentId)\n .join(\",\");\n properties.experiment_variants = args.experimentAssignments\n .map((assignment) => assignment.variantId)\n .join(\",\");\n if (args.experimentAssignments.length === 1) {\n properties.experiment_id = args.experimentAssignments[0].experimentId;\n properties.experiment_variant = args.experimentAssignments[0].variantId;\n }\n }\n if (error) properties.error_message = error;\n\n for (const key of Object.keys(properties)) {\n if (properties[key] === undefined) delete properties[key];\n }\n\n try {\n void import(\"../tracking/registry.js\")\n .then(({ track }) => {\n track(\"$ai_generation\", properties, {\n userId: args.userId ?? undefined,\n });\n })\n .catch(() => {});\n } catch {\n // Tracking must never affect the agent run or trace persistence.\n }\n}\n\n/** Keys whose values are stripped from persisted tool inputs when\n * `captureToolArgs` is enabled. Matched case-insensitively and tolerant\n * of `_` / `-` separators. M14 in the MCP/A2A audit: tool calls\n * routinely receive credentials verbatim (db-exec INSERTs, fetchTool\n * Authorization headers, ad-hoc bearer tokens) — keeping those values\n * out of agent_trace_spans.metadata avoids long-term storage of\n * short-lived secrets. */\nconst SENSITIVE_FIELD_PATTERN =\n /^(authorization|cookie|api[_-]?key|password|secret|token|access[_-]?token|refresh[_-]?token|bearer)$/i;\n\n/** Recursively walk a structured value and replace sensitive field\n * values with the literal string \"[REDACTED]\". Pure (returns a copy);\n * the original input is never mutated. Cycles are tolerated via a\n * small WeakSet seen-tracker that returns \"[Circular]\" for repeats. */\nexport function redactSensitiveFields(value: unknown): unknown {\n return redactWalk(value, new WeakSet<object>());\n}\n\nfunction redactWalk(value: unknown, seen: WeakSet<object>): unknown {\n if (value === null || typeof value !== \"object\") return value;\n if (seen.has(value as object)) return \"[Circular]\";\n seen.add(value as object);\n if (Array.isArray(value)) {\n return value.map((v) => redactWalk(v, seen));\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (SENSITIVE_FIELD_PATTERN.test(k)) {\n out[k] = \"[REDACTED]\";\n } else {\n out[k] = redactWalk(v, seen);\n }\n }\n return out;\n}\n\nexport async function getObservabilityConfig(): Promise<ObservabilityConfig> {\n let stored: Partial<ObservabilityConfig> | null = null;\n try {\n const { getSetting } = await import(\"../settings/store.js\");\n stored = (await getSetting(\n \"observability-config\",\n )) as Partial<ObservabilityConfig> | null;\n } catch {}\n const { resolveInferredSentimentConfig } = await import(\"./sentiment.js\");\n return {\n ...DEFAULT_OBSERVABILITY_CONFIG,\n ...(stored ?? {}),\n ...resolveInferredSentimentConfig(stored),\n };\n}\n\nexport async function instrumentAgentLoop(opts: {\n runAgentLoop: (loopOpts: {\n engine: any;\n model: string;\n systemPrompt: string;\n tools: any[];\n messages: any[];\n actions: Record<string, any>;\n send: (event: AgentChatEvent) => void;\n signal: AbortSignal;\n onUsage?: (usage: AgentLoopUsage) => void;\n providerOptions?: any;\n runId?: string;\n }) => Promise<AgentLoopUsage>;\n loopOpts: {\n engine: any;\n model: string;\n systemPrompt: string;\n tools: any[];\n messages: any[];\n actions: Record<string, any>;\n send: (event: AgentChatEvent) => void;\n signal: AbortSignal;\n onUsage?: (usage: AgentLoopUsage) => void;\n providerOptions?: any;\n runId?: string;\n };\n runId: string;\n threadId: string | null;\n /** Owner of this run; persisted on every span + summary so dashboard\n * reads can filter to a single user. Null for unauthenticated callers\n * (background tasks, etc.) — those rows aren't returned by per-user\n * reads. */\n userId: string | null;\n config: ObservabilityConfig;\n metadata?: Record<string, unknown> | null;\n experimentAssignments?: Array<{\n experimentId: string;\n variantId: string;\n }>;\n modelSelectionSource?: string;\n delegation?: {\n protocol: \"a2a\" | \"mcp\";\n callerApp?: string;\n taskId?: string;\n parentRunId?: string;\n parentTurnId?: string;\n };\n /** Raw user-authored message before prompt/context enrichment. */\n sentimentInput?: string;\n classifyError?: (error: unknown) =>\n | {\n status?: \"success\" | \"error\";\n errorMessage?: string | null;\n metadata?: Record<string, unknown> | null;\n }\n | null\n | undefined;\n}): Promise<AgentLoopUsage> {\n const { runAgentLoop, loopOpts, runId, threadId, userId, config } = opts;\n const runStart = Date.now();\n const parentSpanId = spanId();\n const precedingResponsePromise =\n config.inferredSentimentEnabled && opts.sentimentInput && threadId && userId\n ? import(\"./store.js\")\n .then(({ getLatestTraceSummaryForThread }) =>\n getLatestTraceSummaryForThread(threadId, {\n userId,\n excludeRunId: runId,\n }),\n )\n .catch(() => null)\n : Promise.resolve(null);\n\n // Optional OpenTelemetry root span for this run. No-ops unless a host has\n // installed `@opentelemetry/api` and registered a provider. The promise is\n // resolved before the loop runs so child tool/model spans can parent under\n // it conceptually (we keep them flat in the same tracer, which is enough\n // for the dashboards an embedding app would build).\n const otelRunSpanPromise = startAgentSpan(\"agent.run\", {\n \"agent.run_id\": runId,\n \"agent.thread_id\": threadId ?? undefined,\n \"agent.user_id\": userId ?? undefined,\n \"agent.model\": loopOpts.model,\n \"agent.model_selection_source\": opts.modelSelectionSource,\n \"agent.experiment_id\":\n opts.experimentAssignments?.length === 1\n ? opts.experimentAssignments[0].experimentId\n : undefined,\n \"agent.experiment_variant\":\n opts.experimentAssignments?.length === 1\n ? opts.experimentAssignments[0].variantId\n : undefined,\n });\n\n const spans: TraceSpan[] = [];\n let toolInvocationCounter = 0;\n // Keyed by counter to handle concurrent calls to the same tool name\n const pendingTools = new Map<\n number,\n {\n spanId: string;\n callId?: string;\n startMs: number;\n toolName: string;\n input: AgentToolInput;\n otelSpan: AgentSpan | null;\n endResult?: { status: \"success\" | \"error\"; errorMessage: string | null };\n }\n >();\n // Secondary index for legacy emitters without call ids. Current tool events\n // are paired by id first; same-name FIFO remains as a compatibility fallback.\n const toolNameToCounters = new Map<string, number[]>();\n const toolCallIdToCounter = new Map<string, number>();\n const generationToolCalls = new Map<number, GenerationToolCall>();\n\n let toolCallCount = 0;\n let successfulTools = 0;\n let failedTools = 0;\n\n // Track in-flight OTel tool spans so they're all ended even if the loop\n // throws before a matching `tool_done` arrives.\n const openOtelToolSpans = new Set<AgentSpan>();\n\n const instrumentedSend = (event: AgentChatEvent): void => {\n try {\n if (event.type === \"tool_start\") {\n const counter = toolInvocationCounter++;\n const sid = spanId();\n // Start the OTel tool span synchronously-ish: kick off the async\n // resolution and stash the span once it lands. Tool spans are short\n // and the api tracer is synchronous in practice, but we tolerate the\n // microtask gap by recording the span on the pending entry when ready.\n const entry: {\n spanId: string;\n callId?: string;\n startMs: number;\n toolName: string;\n input: AgentToolInput;\n otelSpan: AgentSpan | null;\n // Set by the done handler if it fires before the span promise\n // resolves, so the resolved span is ended with the correct status.\n endResult?: {\n status: \"success\" | \"error\";\n errorMessage: string | null;\n };\n } = {\n spanId: sid,\n ...(event.id ? { callId: event.id } : {}),\n startMs: Date.now(),\n toolName: event.tool,\n input: event.input,\n otelSpan: null,\n };\n pendingTools.set(counter, entry);\n if (event.id) toolCallIdToCounter.set(event.id, counter);\n void startAgentSpan(\"tool.call\", {\n \"tool.name\": event.tool,\n }).then((span) => {\n if (!span) return;\n // If `tool_done` already ran for this call, end the span now with the\n // status it recorded; otherwise stash it for the done handler.\n if (entry.endResult) {\n endAgentSpan(span, {\n status: entry.endResult.status,\n errorMessage: entry.endResult.errorMessage,\n });\n } else {\n entry.otelSpan = span;\n openOtelToolSpans.add(span);\n }\n });\n const queue = toolNameToCounters.get(event.tool);\n if (queue) queue.push(counter);\n else toolNameToCounters.set(event.tool, [counter]);\n } else if (event.type === \"tool_done\") {\n const queue = toolNameToCounters.get(event.tool);\n const counterFromId = event.id\n ? toolCallIdToCounter.get(event.id)\n : undefined;\n const legacyQueueIndex =\n event.id && counterFromId === undefined && queue\n ? queue.findIndex(\n (candidate) => !pendingTools.get(candidate)?.callId,\n )\n : -1;\n const counter =\n counterFromId ??\n (event.id\n ? legacyQueueIndex >= 0\n ? queue?.[legacyQueueIndex]\n : undefined\n : queue?.shift());\n const pending =\n counter !== undefined ? pendingTools.get(counter) : undefined;\n if (counter !== undefined) {\n pendingTools.delete(counter);\n if (pending?.callId) toolCallIdToCounter.delete(pending.callId);\n if ((counterFromId !== undefined || legacyQueueIndex >= 0) && queue) {\n const queueIndex = queue.indexOf(counter);\n if (queueIndex >= 0) queue.splice(queueIndex, 1);\n }\n if (queue && queue.length === 0)\n toolNameToCounters.delete(event.tool);\n }\n toolCallCount++;\n\n const finishedAt = Date.now();\n\n const explicitError = event.isError === true;\n const isError =\n typeof event.isError === \"boolean\"\n ? event.isError\n : typeof event.result === \"string\" &&\n (event.result.startsWith(\"Error\") ||\n event.result.startsWith(\"Error running \"));\n if (isError) failedTools++;\n else successfulTools++;\n\n if (\n counter !== undefined &&\n counter < MAX_TRACKED_GENERATION_TOOL_CALLS &&\n pending\n ) {\n generationToolCalls.set(counter, {\n name: pending.toolName,\n started_offset_ms: Math.max(0, pending.startMs - runStart),\n duration_ms: Math.max(0, finishedAt - pending.startMs),\n status: isError ? \"error\" : \"success\",\n error_class: !isError\n ? null\n : explicitError\n ? \"tool_error\"\n : \"legacy_inferred_error\",\n error_message:\n isError && config.captureToolResults\n ? truncateToolErrorMessage(redactToolErrorMessage(event.result))\n : undefined,\n });\n }\n\n // Finalize the OTel tool span. If the span promise hasn't resolved yet\n // we record the result on the entry so its `.then` handler ends it.\n const otelEndResult = {\n status: (isError ? \"error\" : \"success\") as \"success\" | \"error\",\n errorMessage: isError ? (event.result as string) : null,\n };\n if (pending?.otelSpan) {\n openOtelToolSpans.delete(pending.otelSpan);\n endAgentSpan(pending.otelSpan, {\n status: otelEndResult.status,\n errorMessage: otelEndResult.errorMessage,\n attributes: { \"tool.name\": event.tool },\n });\n } else if (pending) {\n pending.endResult = otelEndResult;\n }\n\n const span: TraceSpan = {\n id: pending?.spanId ?? spanId(),\n runId,\n threadId,\n userId,\n parentSpanId,\n spanType: \"tool_call\",\n name: event.tool,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n costCentsX100: 0,\n durationMs: pending ? Math.max(0, finishedAt - pending.startMs) : 0,\n status: isError ? \"error\" : \"success\",\n errorMessage: isError ? event.result : null,\n metadata:\n config.captureToolArgs && pending\n ? // Strip Authorization/api-key/token-shaped values before\n // persisting (M14 in the MCP/A2A audit). Tool-runtime\n // execution still sees the unredacted input — only the\n // long-lived span row is sanitized.\n {\n input: redactSensitiveFields(pending.input) as Record<\n string,\n string\n >,\n }\n : null,\n createdAt: Date.now(),\n };\n spans.push(span);\n }\n } catch {}\n\n loopOpts.send(event);\n };\n\n let usage: AgentLoopUsage | undefined;\n let runStatus: \"success\" | \"error\" = \"success\";\n let errorMessage: string | null = null;\n let runMetadata: Record<string, unknown> | null = opts.metadata ?? null;\n try {\n usage = await runAgentLoop({\n ...loopOpts,\n runId,\n send: instrumentedSend,\n });\n } catch (err: any) {\n const classification = opts.classifyError?.(err) ?? null;\n runStatus = classification?.status ?? \"error\";\n errorMessage =\n classification?.errorMessage === undefined\n ? (err?.message ?? String(err))\n : classification.errorMessage;\n const errorMetadata = classification?.metadata ?? null;\n runMetadata =\n runMetadata || errorMetadata\n ? { ...(runMetadata ?? {}), ...(errorMetadata ?? {}) }\n : null;\n throw err;\n } finally {\n const runEnd = Date.now();\n const totalDurationMs = runEnd - runStart;\n\n if (pendingTools.size > 0) {\n if (runStatus === \"success\") {\n runStatus = \"error\";\n errorMessage ??= \"Agent run ended with interrupted tool calls\";\n }\n for (const [counter, pending] of pendingTools) {\n toolCallCount += 1;\n failedTools += 1;\n const interruptedMessage = \"Tool call interrupted before completion\";\n if (counter < MAX_TRACKED_GENERATION_TOOL_CALLS) {\n generationToolCalls.set(counter, {\n name: pending.toolName,\n started_offset_ms: Math.max(0, pending.startMs - runStart),\n duration_ms: Math.max(0, runEnd - pending.startMs),\n status: \"error\",\n error_class: \"interrupted\",\n error_message: config.captureToolResults\n ? interruptedMessage\n : undefined,\n });\n }\n if (pending.otelSpan) {\n openOtelToolSpans.delete(pending.otelSpan);\n endAgentSpan(pending.otelSpan, {\n status: \"error\",\n errorMessage: interruptedMessage,\n attributes: { \"tool.name\": pending.toolName },\n });\n } else {\n pending.endResult = {\n status: \"error\",\n errorMessage: interruptedMessage,\n };\n }\n spans.push({\n id: pending.spanId,\n runId,\n threadId,\n userId,\n parentSpanId,\n spanType: \"tool_call\",\n name: pending.toolName,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n costCentsX100: 0,\n durationMs: Math.max(0, runEnd - pending.startMs),\n status: \"error\",\n errorMessage: interruptedMessage,\n metadata: null,\n createdAt: runEnd,\n });\n }\n pendingTools.clear();\n toolNameToCounters.clear();\n toolCallIdToCounter.clear();\n }\n\n let costCentsX100 = 0;\n try {\n const { calculateCost } = await import(\"../usage/store.js\");\n if (usage) {\n costCentsX100 = calculateCost(\n usage.inputTokens,\n usage.outputTokens,\n usage.model,\n usage.cacheReadTokens,\n usage.cacheWriteTokens,\n );\n }\n } catch {}\n\n let llmCallCount = 0;\n if (usage || runStatus === \"error\") {\n llmCallCount = 1;\n const generationUsage = usage ?? {\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n model: loopOpts.model,\n };\n const llmSpanId = spanId();\n const llmSpan: TraceSpan = {\n id: llmSpanId,\n runId,\n threadId,\n userId,\n parentSpanId,\n spanType: \"llm_call\",\n name: generationUsage.model,\n inputTokens: generationUsage.inputTokens,\n outputTokens: generationUsage.outputTokens,\n cacheReadTokens: generationUsage.cacheReadTokens,\n cacheWriteTokens: generationUsage.cacheWriteTokens,\n costCentsX100,\n durationMs: totalDurationMs,\n status: runStatus,\n errorMessage,\n metadata: null,\n createdAt: runStart,\n };\n spans.push(llmSpan);\n emitLlmGenerationTrackingEvent({\n runId,\n threadId,\n userId,\n parentSpanId,\n llmSpanId,\n engineName:\n typeof loopOpts.engine?.name === \"string\"\n ? loopOpts.engine.name\n : undefined,\n model: generationUsage.model,\n inputTokens: generationUsage.inputTokens,\n outputTokens: generationUsage.outputTokens,\n cacheReadTokens: generationUsage.cacheReadTokens,\n cacheWriteTokens: generationUsage.cacheWriteTokens,\n costCentsX100,\n durationMs: totalDurationMs,\n status: runStatus,\n errorMessage,\n toolCalls: toolCallCount,\n successfulTools,\n failedTools,\n tools: [...generationToolCalls.entries()]\n .sort(([a], [b]) => a - b)\n .map(([, detail]) => detail),\n toolsTruncated:\n toolInvocationCounter > MAX_TRACKED_GENERATION_TOOL_CALLS,\n delegation: opts.delegation,\n createdAt: runStart,\n experimentAssignments: opts.experimentAssignments,\n modelSelectionSource: opts.modelSelectionSource,\n });\n }\n\n const parentSpan: TraceSpan = {\n id: parentSpanId,\n runId,\n threadId,\n userId,\n parentSpanId: null,\n spanType: \"agent_run\",\n name: \"agent_run\",\n inputTokens: usage?.inputTokens ?? 0,\n outputTokens: usage?.outputTokens ?? 0,\n cacheReadTokens: usage?.cacheReadTokens ?? 0,\n cacheWriteTokens: usage?.cacheWriteTokens ?? 0,\n costCentsX100,\n durationMs: totalDurationMs,\n status: runStatus,\n errorMessage,\n metadata: runMetadata,\n createdAt: runStart,\n };\n spans.push(parentSpan);\n\n const summary: TraceSummary = {\n runId,\n threadId,\n userId,\n totalSpans: spans.length,\n llmCalls: llmCallCount,\n toolCalls: toolCallCount,\n successfulTools,\n failedTools,\n totalDurationMs,\n totalCostCentsX100: costCentsX100,\n totalInputTokens: usage?.inputTokens ?? 0,\n totalOutputTokens: usage?.outputTokens ?? 0,\n model: usage?.model ?? loopOpts.model,\n createdAt: runStart,\n };\n\n writeTraceData(spans, summary, runId, config).catch(() => {});\n\n // OpenTelemetry export (no-op unless a provider is registered). Emit a\n // self-contained `llm.call` span carrying model + token usage, end any\n // tool spans still open (loop threw mid-tool), and end the run span. Awaited\n // so the spans are emitted before the function returns; cheap when no-op.\n try {\n if (usage) {\n endAgentSpan(await startAgentSpan(\"llm.call\", {}), {\n status: runStatus,\n errorMessage,\n attributes: {\n \"llm.model\": usage.model,\n \"llm.input_tokens\": usage.inputTokens,\n \"llm.output_tokens\": usage.outputTokens,\n \"llm.cache_read_tokens\": usage.cacheReadTokens,\n \"llm.cache_write_tokens\": usage.cacheWriteTokens,\n \"llm.cost_cents_x100\": costCentsX100,\n },\n });\n }\n for (const toolSpan of openOtelToolSpans) {\n endAgentSpan(toolSpan, {\n status: \"error\",\n errorMessage: \"Agent run ended before tool_done.\",\n });\n }\n openOtelToolSpans.clear();\n endAgentSpan(await otelRunSpanPromise, {\n status: runStatus,\n errorMessage,\n attributes: {\n \"agent.tool_calls\": toolCallCount,\n \"agent.successful_tools\": successfulTools,\n \"agent.failed_tools\": failedTools,\n \"agent.duration_ms\": totalDurationMs,\n \"agent.input_tokens\": usage?.inputTokens ?? 0,\n \"agent.output_tokens\": usage?.outputTokens ?? 0,\n \"agent.cost_cents_x100\": costCentsX100,\n },\n });\n } catch {\n // OTel export must never break the run.\n }\n }\n\n // Classify only after the main loop has finished so the tiny managed Luna\n // request cannot contend with the user's response for a gateway slot. This\n // short, awaited tail keeps serverless runtimes alive long enough to emit the\n // event, while the response content has already streamed to the client.\n if (usage && opts.sentimentInput) {\n try {\n const precedingResponse = await precedingResponsePromise;\n if (precedingResponse) {\n const { inferAndTrackSentiment } = await import(\"./sentiment.js\");\n await inferAndTrackSentiment({\n classifierModel: config.inferredSentimentModel,\n precedingResponseModel: precedingResponse.model,\n text: opts.sentimentInput,\n precedingRunId: precedingResponse.runId,\n classificationTriggerRunId: runId,\n threadId,\n userId,\n sampleRate: config.inferredSentimentSampleRate,\n });\n }\n } catch {\n // Optional inference must never alter the result of the main run.\n }\n }\n\n return usage!;\n}\n\nasync function writeTraceData(\n spans: TraceSpan[],\n summary: TraceSummary,\n runId: string,\n config: ObservabilityConfig,\n): Promise<void> {\n const { insertTraceSpan, upsertTraceSummary } = await import(\"./store.js\");\n await Promise.all(spans.map((s) => insertTraceSpan(s).catch(() => {})));\n await upsertTraceSummary(summary).catch(() => {});\n\n // Fire automated evals after trace data is persisted\n try {\n const { evaluateRun } = await import(\"./evals.js\");\n await evaluateRun(runId, { sampleRate: config.evalSampleRate });\n } catch {}\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { getDbExec } from "../db/client.js";
2
- import { putUserSetting } from "../settings/user-settings.js";
2
+ import { setActiveOrgId } from "./active-org.js";
3
3
  const nanoid = () => globalThis.crypto?.randomUUID?.().replace(/-/g, "") ??
4
4
  Math.random().toString(36).slice(2) + Date.now().toString(36);
5
5
  /**
@@ -74,7 +74,7 @@ export async function acceptPendingInvitationsForEmail(rawEmail) {
74
74
  const activeOrgId = accepted[0]?.orgId ?? null;
75
75
  if (activeOrgId) {
76
76
  try {
77
- await putUserSetting(email, "active-org-id", { orgId: activeOrgId });
77
+ await setActiveOrgId(email, activeOrgId, "accepted pending invitation");
78
78
  }
79
79
  catch {
80
80
  // user_settings table might not exist in a minimal template — not fatal.
@@ -1 +1 @@
1
- {"version":3,"file":"accept-pending.js","sourceRoot":"","sources":["../../src/org/accept-pending.ts"],"names":[],"mappings":"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","sourcesContent":["import { getDbExec } from \"../db/client.js\";\nimport { putUserSetting } from \"../settings/user-settings.js\";\n\nconst nanoid = (): string =>\n globalThis.crypto?.randomUUID?.().replace(/-/g, \"\") ??\n Math.random().toString(36).slice(2) + Date.now().toString(36);\n\nexport interface AcceptPendingResult {\n accepted: Array<{ invitationId: string; orgId: string }>;\n activeOrgId: string | null;\n}\n\n/**\n * Accept every pending `org_invitations` row for this email:\n * - insert a matching `org_members` row (role 'member') when one doesn't exist\n * - flip the invitation's status to 'accepted'\n * - set the user's `active-org-id` to the most-recently-created invite\n *\n * Called from the Better Auth `user.create.after` hook so that a user who signs\n * up with an email they were just invited to lands in the org immediately,\n * rather than seeing a blank-slate app until they navigate to /team.\n *\n * Safe to call when the org tables don't exist (some templates don't use the\n * org module) — it swallows the \"no such table\" error and returns empty.\n */\nexport async function acceptPendingInvitationsForEmail(\n rawEmail: string,\n): Promise<AcceptPendingResult> {\n const email = rawEmail.trim().toLowerCase();\n if (!email) {\n return { accepted: [], activeOrgId: null };\n }\n\n const db = getDbExec();\n\n let rows: Array<{ id: string; orgId: string; role: string | null }> = [];\n try {\n const res = await db.execute({\n sql: `SELECT id, org_id AS \"orgId\", role FROM org_invitations\n WHERE LOWER(email) = ? AND status = 'pending'\n ORDER BY created_at DESC`,\n args: [email],\n });\n rows = res.rows.map((r: any) => ({\n id: String(r.id),\n orgId: String(r.orgId ?? r.org_id),\n role: r.role == null ? null : String(r.role),\n }));\n } catch {\n // Template doesn't use the org module / tables not migrated yet.\n return { accepted: [], activeOrgId: null };\n }\n\n if (rows.length === 0) {\n return { accepted: [], activeOrgId: null };\n }\n\n const accepted: AcceptPendingResult[\"accepted\"] = [];\n for (const inv of rows) {\n const existing = await db.execute({\n sql: `SELECT 1 FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,\n args: [inv.orgId, email],\n });\n if (existing.rows.length === 0) {\n const role = inv.role === \"admin\" ? \"admin\" : \"member\";\n // The SELECT above is a cheap pre-check, not a correctness guard —\n // two concurrent acceptances (e.g. a retried signup hook) can both\n // pass it before either INSERT commits. `ON CONFLICT (org_id,\n // LOWER(email)) DO NOTHING` targets the unique expression index\n // added in migrations.ts (org-members-unique-lower-email-idx) so the\n // race's loser is a silent no-op instead of a thrown unique\n // constraint violation or a duplicate row.\n await db.execute({\n sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, ?, ?)\n ON CONFLICT (org_id, LOWER(email)) DO NOTHING`,\n args: [nanoid(), inv.orgId, email, role, Date.now()],\n });\n }\n await db.execute({\n sql: `UPDATE org_invitations SET status = 'accepted' WHERE id = ?`,\n args: [inv.id],\n });\n accepted.push({ invitationId: inv.id, orgId: inv.orgId });\n }\n\n // Set active-org-id to the most recent invite so the user lands in a\n // populated workspace on first load.\n const activeOrgId = accepted[0]?.orgId ?? null;\n if (activeOrgId) {\n try {\n await putUserSetting(email, \"active-org-id\", { orgId: activeOrgId });\n } catch {\n // user_settings table might not exist in a minimal template — not fatal.\n }\n }\n\n return { accepted, activeOrgId };\n}\n"]}
1
+ {"version":3,"file":"accept-pending.js","sourceRoot":"","sources":["../../src/org/accept-pending.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,MAAM,GAAG,GAAW,EAAE,CAC1B,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;IACnD,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAOhE;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,QAAgB;IAEhB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAEvB,IAAI,IAAI,GAA8D,EAAE,CAAC;IACzE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;YAC3B,GAAG,EAAE;;qCAE0B;YAC/B,IAAI,EAAE,CAAC,KAAK,CAAC;SACd,CAAC,CAAC;QACH,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;YAC/B,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;YAClC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;SAC7C,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;QACjE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,QAAQ,GAAoC,EAAE,CAAC;IACrD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;YAChC,GAAG,EAAE,yEAAyE;YAC9E,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;SACzB,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;YACvD,mEAAmE;YACnE,mEAAmE;YACnE,8DAA8D;YAC9D,gEAAgE;YAChE,qEAAqE;YACrE,4DAA4D;YAC5D,2CAA2C;YAC3C,MAAM,EAAE,CAAC,OAAO,CAAC;gBACf,GAAG,EAAE;4DAC+C;gBACpD,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;aACrD,CAAC,CAAC;QACL,CAAC;QACD,MAAM,EAAE,CAAC,OAAO,CAAC;YACf,GAAG,EAAE,6DAA6D;YAClE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;SACf,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,qEAAqE;IACrE,qCAAqC;IACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;IAC/C,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,6BAA6B,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,yEAAyE;QAC3E,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AACnC,CAAC","sourcesContent":["import { getDbExec } from \"../db/client.js\";\nimport { setActiveOrgId } from \"./active-org.js\";\n\nconst nanoid = (): string =>\n globalThis.crypto?.randomUUID?.().replace(/-/g, \"\") ??\n Math.random().toString(36).slice(2) + Date.now().toString(36);\n\nexport interface AcceptPendingResult {\n accepted: Array<{ invitationId: string; orgId: string }>;\n activeOrgId: string | null;\n}\n\n/**\n * Accept every pending `org_invitations` row for this email:\n * - insert a matching `org_members` row (role 'member') when one doesn't exist\n * - flip the invitation's status to 'accepted'\n * - set the user's `active-org-id` to the most-recently-created invite\n *\n * Called from the Better Auth `user.create.after` hook so that a user who signs\n * up with an email they were just invited to lands in the org immediately,\n * rather than seeing a blank-slate app until they navigate to /team.\n *\n * Safe to call when the org tables don't exist (some templates don't use the\n * org module) — it swallows the \"no such table\" error and returns empty.\n */\nexport async function acceptPendingInvitationsForEmail(\n rawEmail: string,\n): Promise<AcceptPendingResult> {\n const email = rawEmail.trim().toLowerCase();\n if (!email) {\n return { accepted: [], activeOrgId: null };\n }\n\n const db = getDbExec();\n\n let rows: Array<{ id: string; orgId: string; role: string | null }> = [];\n try {\n const res = await db.execute({\n sql: `SELECT id, org_id AS \"orgId\", role FROM org_invitations\n WHERE LOWER(email) = ? AND status = 'pending'\n ORDER BY created_at DESC`,\n args: [email],\n });\n rows = res.rows.map((r: any) => ({\n id: String(r.id),\n orgId: String(r.orgId ?? r.org_id),\n role: r.role == null ? null : String(r.role),\n }));\n } catch {\n // Template doesn't use the org module / tables not migrated yet.\n return { accepted: [], activeOrgId: null };\n }\n\n if (rows.length === 0) {\n return { accepted: [], activeOrgId: null };\n }\n\n const accepted: AcceptPendingResult[\"accepted\"] = [];\n for (const inv of rows) {\n const existing = await db.execute({\n sql: `SELECT 1 FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,\n args: [inv.orgId, email],\n });\n if (existing.rows.length === 0) {\n const role = inv.role === \"admin\" ? \"admin\" : \"member\";\n // The SELECT above is a cheap pre-check, not a correctness guard —\n // two concurrent acceptances (e.g. a retried signup hook) can both\n // pass it before either INSERT commits. `ON CONFLICT (org_id,\n // LOWER(email)) DO NOTHING` targets the unique expression index\n // added in migrations.ts (org-members-unique-lower-email-idx) so the\n // race's loser is a silent no-op instead of a thrown unique\n // constraint violation or a duplicate row.\n await db.execute({\n sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, ?, ?)\n ON CONFLICT (org_id, LOWER(email)) DO NOTHING`,\n args: [nanoid(), inv.orgId, email, role, Date.now()],\n });\n }\n await db.execute({\n sql: `UPDATE org_invitations SET status = 'accepted' WHERE id = ?`,\n args: [inv.id],\n });\n accepted.push({ invitationId: inv.id, orgId: inv.orgId });\n }\n\n // Set active-org-id to the most recent invite so the user lands in a\n // populated workspace on first load.\n const activeOrgId = accepted[0]?.orgId ?? null;\n if (activeOrgId) {\n try {\n await setActiveOrgId(email, activeOrgId, \"accepted pending invitation\");\n } catch {\n // user_settings table might not exist in a minimal template — not fatal.\n }\n }\n\n return { accepted, activeOrgId };\n}\n"]}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Every write to `active-org-id` goes through here, so no call site can move an
3
+ * account between organizations silently. Vault credentials are scoped per
4
+ * organization, so a repoint makes every key synced under the previous org
5
+ * unreadable for that account, and the only symptom is a missing-credential
6
+ * error naming the key. The UI notices (`org.createOrgVaultNotice`,
7
+ * `org.acceptInvitationOrgSwitchNotice`) only reach a human looking at the
8
+ * screen; roster and identity migrations run by an agent reach this setting with
9
+ * no notice anywhere in their path, so the warnings below go to `warnAgent` and
10
+ * surface in the conversation that ordered the repoint.
11
+ *
12
+ * Lives in its own module because `auto-join-domain` and `accept-pending` are
13
+ * imported by `context`, so hosting this in `context` would make the cycle.
14
+ */
15
+ export declare function setActiveOrgId(email: string, orgId: string | null, reason: string): Promise<void>;
16
+ //# sourceMappingURL=active-org.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active-org.d.ts","sourceRoot":"","sources":["../../src/org/active-org.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAGf"}
@@ -0,0 +1,57 @@
1
+ import { warnAgent } from "../agent/action-warnings.js";
2
+ import { getUserSetting, putUserSetting } from "../settings/user-settings.js";
3
+ /**
4
+ * Every write to `active-org-id` goes through here, so no call site can move an
5
+ * account between organizations silently. Vault credentials are scoped per
6
+ * organization, so a repoint makes every key synced under the previous org
7
+ * unreadable for that account, and the only symptom is a missing-credential
8
+ * error naming the key. The UI notices (`org.createOrgVaultNotice`,
9
+ * `org.acceptInvitationOrgSwitchNotice`) only reach a human looking at the
10
+ * screen; roster and identity migrations run by an agent reach this setting with
11
+ * no notice anywhere in their path, so the warnings below go to `warnAgent` and
12
+ * surface in the conversation that ordered the repoint.
13
+ *
14
+ * Lives in its own module because `auto-join-domain` and `accept-pending` are
15
+ * imported by `context`, so hosting this in `context` would make the cycle.
16
+ */
17
+ export async function setActiveOrgId(email, orgId, reason) {
18
+ await warnOnCrossOrgRepoint(email, orgId, reason);
19
+ await putUserSetting(email, "active-org-id", { orgId });
20
+ }
21
+ async function warnOnCrossOrgRepoint(email, nextOrgId, reason) {
22
+ if (!nextOrgId)
23
+ return;
24
+ let previousOrgId;
25
+ try {
26
+ const setting = (await getUserSetting(email, "active-org-id"));
27
+ previousOrgId = typeof setting?.orgId === "string" ? setting.orgId : null;
28
+ }
29
+ catch {
30
+ // "Unreadable" is not "had no previous org" — report which one happened, so
31
+ // a silent repoint can never read as a first-time assignment in the log.
32
+ warnAgent({
33
+ severity: "critical",
34
+ code: "org-active-org-previous-unreadable",
35
+ message: `Could not read the previous active organization before ` +
36
+ `repointing an account to ${nextOrgId} (${reason}). If that account already ` +
37
+ `belonged to a different organization, every vault credential synced under ` +
38
+ `the old organization is now unreadable for it.`,
39
+ });
40
+ return;
41
+ }
42
+ if (!previousOrgId || previousOrgId === nextOrgId)
43
+ return;
44
+ warnAgent({
45
+ severity: "critical",
46
+ code: "org-cross-org-repoint",
47
+ message: `Repointed an account's active organization from ` +
48
+ `${previousOrgId} to ${nextOrgId} (${reason}). Vault credentials are scoped per ` +
49
+ `organization and are NOT shared between them: every API key synced under ` +
50
+ `${previousOrgId} is now unreadable for this account until it is re-saved in ` +
51
+ `${nextOrgId}. Requests will fail with missing-credential errors that name the ` +
52
+ `key rather than this organization change. If this came from a roster, identity, ` +
53
+ `or user-list migration, put the account back and add its members to the ` +
54
+ `EXISTING organization instead of a new one.`,
55
+ });
56
+ }
57
+ //# sourceMappingURL=active-org.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active-org.js","sourceRoot":"","sources":["../../src/org/active-org.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAI9E;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAa,EACb,KAAoB,EACpB,MAAc;IAEd,MAAM,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,KAAa,EACb,SAAwB,EACxB,MAAc;IAEd,IAAI,CAAC,SAAS;QAAE,OAAO;IAEvB,IAAI,aAA4B,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,CAAC,MAAM,cAAc,CACnC,KAAK,EACL,eAAe,CAChB,CAAqB,CAAC;QACvB,aAAa,GAAG,OAAO,OAAO,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;QAC5E,yEAAyE;QACzE,SAAS,CAAC;YACR,QAAQ,EAAE,UAAU;YACpB,IAAI,EAAE,oCAAoC;YAC1C,OAAO,EACL,yDAAyD;gBACzD,4BAA4B,SAAS,KAAK,MAAM,6BAA6B;gBAC7E,4EAA4E;gBAC5E,gDAAgD;SACnD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,CAAC,aAAa,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO;IAE1D,SAAS,CAAC;QACR,QAAQ,EAAE,UAAU;QACpB,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EACL,kDAAkD;YAClD,GAAG,aAAa,OAAO,SAAS,KAAK,MAAM,sCAAsC;YACjF,2EAA2E;YAC3E,GAAG,aAAa,8DAA8D;YAC9E,GAAG,SAAS,oEAAoE;YAChF,kFAAkF;YAClF,0EAA0E;YAC1E,6CAA6C;KAChD,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { warnAgent } from \"../agent/action-warnings.js\";\nimport { getUserSetting, putUserSetting } from \"../settings/user-settings.js\";\n\ntype ActiveOrgSetting = { orgId: string | null } | null;\n\n/**\n * Every write to `active-org-id` goes through here, so no call site can move an\n * account between organizations silently. Vault credentials are scoped per\n * organization, so a repoint makes every key synced under the previous org\n * unreadable for that account, and the only symptom is a missing-credential\n * error naming the key. The UI notices (`org.createOrgVaultNotice`,\n * `org.acceptInvitationOrgSwitchNotice`) only reach a human looking at the\n * screen; roster and identity migrations run by an agent reach this setting with\n * no notice anywhere in their path, so the warnings below go to `warnAgent` and\n * surface in the conversation that ordered the repoint.\n *\n * Lives in its own module because `auto-join-domain` and `accept-pending` are\n * imported by `context`, so hosting this in `context` would make the cycle.\n */\nexport async function setActiveOrgId(\n email: string,\n orgId: string | null,\n reason: string,\n): Promise<void> {\n await warnOnCrossOrgRepoint(email, orgId, reason);\n await putUserSetting(email, \"active-org-id\", { orgId });\n}\n\nasync function warnOnCrossOrgRepoint(\n email: string,\n nextOrgId: string | null,\n reason: string,\n): Promise<void> {\n if (!nextOrgId) return;\n\n let previousOrgId: string | null;\n try {\n const setting = (await getUserSetting(\n email,\n \"active-org-id\",\n )) as ActiveOrgSetting;\n previousOrgId = typeof setting?.orgId === \"string\" ? setting.orgId : null;\n } catch {\n // \"Unreadable\" is not \"had no previous org\" — report which one happened, so\n // a silent repoint can never read as a first-time assignment in the log.\n warnAgent({\n severity: \"critical\",\n code: \"org-active-org-previous-unreadable\",\n message:\n `Could not read the previous active organization before ` +\n `repointing an account to ${nextOrgId} (${reason}). If that account already ` +\n `belonged to a different organization, every vault credential synced under ` +\n `the old organization is now unreadable for it.`,\n });\n return;\n }\n\n if (!previousOrgId || previousOrgId === nextOrgId) return;\n\n warnAgent({\n severity: \"critical\",\n code: \"org-cross-org-repoint\",\n message:\n `Repointed an account's active organization from ` +\n `${previousOrgId} to ${nextOrgId} (${reason}). Vault credentials are scoped per ` +\n `organization and are NOT shared between them: every API key synced under ` +\n `${previousOrgId} is now unreadable for this account until it is re-saved in ` +\n `${nextOrgId}. Requests will fail with missing-credential errors that name the ` +\n `key rather than this organization change. If this came from a roster, identity, ` +\n `or user-list migration, put the account back and add its members to the ` +\n `EXISTING organization instead of a new one.`,\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"auto-join-domain.d.ts","sourceRoot":"","sources":["../../src/org/auto-join-domain.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;CACvD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAoE/B"}
1
+ {"version":3,"file":"auto-join-domain.d.ts","sourceRoot":"","sources":["../../src/org/auto-join-domain.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;CACvD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAwE/B"}
@@ -1,5 +1,6 @@
1
1
  import { getDbExec } from "../db/client.js";
2
- import { getUserSetting, putUserSetting } from "../settings/user-settings.js";
2
+ import { getUserSetting } from "../settings/user-settings.js";
3
+ import { setActiveOrgId } from "./active-org.js";
3
4
  const nanoid = () => globalThis.crypto?.randomUUID?.().replace(/-/g, "") ??
4
5
  Math.random().toString(36).slice(2) + Date.now().toString(36);
5
6
  /**
@@ -81,7 +82,7 @@ export async function autoJoinDomainMatchingOrgs(rawEmail, options = {}) {
81
82
  const hasActive = Boolean(existing?.orgId);
82
83
  if (options.activateJoinedOrg === "always" || !hasActive) {
83
84
  activeOrgId = joined[0].orgId;
84
- await putUserSetting(email, "active-org-id", { orgId: activeOrgId });
85
+ await setActiveOrgId(email, activeOrgId, "auto-joined domain-matched org");
85
86
  }
86
87
  }
87
88
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"auto-join-domain.js","sourceRoot":"","sources":["../../src/org/auto-join-domain.ts"],"names":[],"mappings":"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","sourcesContent":["import { getDbExec } from \"../db/client.js\";\nimport { getUserSetting, putUserSetting } from \"../settings/user-settings.js\";\n\nconst nanoid = (): string =>\n globalThis.crypto?.randomUUID?.().replace(/-/g, \"\") ??\n Math.random().toString(36).slice(2) + Date.now().toString(36);\n\nexport interface AutoJoinDomainResult {\n joined: Array<{ orgId: string }>;\n activeOrgId: string | null;\n}\n\nexport interface AutoJoinDomainOptions {\n /**\n * The signup hook should not clobber an org selected by an invite flow, but\n * request-time org resolution may need to move an existing account from a\n * personal workspace into its newly matched company org. `\"never\"` joins\n * without touching `active-org-id` — the caller decides activation itself.\n */\n activateJoinedOrg?: \"if-missing\" | \"always\" | \"never\";\n}\n\n/**\n * Auto-join a newly-signed-up user into every org whose `allowed_domain`\n * matches their email domain.\n *\n * Called from the Better Auth `user.create.after` hook so that e.g. a new\n * `@builder.io` signup lands inside the existing Builder.io org on first\n * page load instead of starting in Personal and having to find the join\n * CTA. The org's owner opts into this by setting\n * `organizations.allowed_domain` — the column already gated the manual\n * \"Join your team\" UI in the picker; we use the same opt-in to drive\n * automatic join.\n *\n * Idempotent — skips orgs the user is already a member of and, by default,\n * never overwrites an existing `active-org-id` setting.\n *\n * Safe to call when the org tables don't exist (some templates don't use\n * the org module): it swallows the \"no such table\" error and returns\n * empty. Never throws — the caller is a signup hook and we don't want to\n * block a user from creating their account because of an org-tier issue.\n */\nexport async function autoJoinDomainMatchingOrgs(\n rawEmail: string,\n options: AutoJoinDomainOptions = {},\n): Promise<AutoJoinDomainResult> {\n const email = rawEmail.trim().toLowerCase();\n if (!email) return { joined: [], activeOrgId: null };\n\n const domain = email.split(\"@\")[1]?.toLowerCase();\n if (!domain) return { joined: [], activeOrgId: null };\n\n const db = getDbExec();\n\n let matches: Array<{ orgId: string }> = [];\n try {\n const res = await db.execute({\n sql: `SELECT o.id AS \"orgId\"\n FROM organizations o\n WHERE LOWER(o.allowed_domain) = ?\n AND NOT EXISTS (\n SELECT 1\n FROM org_members m\n WHERE m.org_id = o.id\n AND LOWER(m.email) = ?\n )\n ORDER BY o.created_at ASC`,\n args: [domain, email],\n });\n matches = res.rows.map((r: any) => ({\n orgId: String(r.orgId ?? r.org_id),\n }));\n } catch {\n // Template without org tables (or `allowed_domain` column not yet\n // migrated). Not fatal — return empty.\n return { joined: [], activeOrgId: null };\n }\n\n if (matches.length === 0) return { joined: [], activeOrgId: null };\n\n const joined: AutoJoinDomainResult[\"joined\"] = [];\n for (const m of matches) {\n try {\n await db.execute({\n sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, 'member', ?)`,\n args: [nanoid(), m.orgId, email, Date.now()],\n });\n joined.push({ orgId: m.orgId });\n } catch {\n // Race with a parallel join (e.g. user accepted an invite to the\n // same org milliseconds earlier). The unique constraint keeps the\n // existing membership intact; just skip this org.\n }\n }\n\n // Set active-org-id to the first match only if the user doesn't already have\n // one, unless the caller is request-time org resolution intentionally moving\n // an existing account into its newly matched company org.\n let activeOrgId: string | null = null;\n if (joined[0] && options.activateJoinedOrg !== \"never\") {\n try {\n const existing = await getUserSetting(email, \"active-org-id\");\n const hasActive = Boolean(existing?.orgId);\n if (options.activateJoinedOrg === \"always\" || !hasActive) {\n activeOrgId = joined[0].orgId;\n await putUserSetting(email, \"active-org-id\", { orgId: activeOrgId });\n }\n } catch {\n // settings table missing — not fatal.\n }\n }\n\n return { joined, activeOrgId };\n}\n"]}
1
+ {"version":3,"file":"auto-join-domain.js","sourceRoot":"","sources":["../../src/org/auto-join-domain.ts"],"names":[],"mappings":"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","sourcesContent":["import { getDbExec } from \"../db/client.js\";\nimport { getUserSetting } from \"../settings/user-settings.js\";\nimport { setActiveOrgId } from \"./active-org.js\";\n\nconst nanoid = (): string =>\n globalThis.crypto?.randomUUID?.().replace(/-/g, \"\") ??\n Math.random().toString(36).slice(2) + Date.now().toString(36);\n\nexport interface AutoJoinDomainResult {\n joined: Array<{ orgId: string }>;\n activeOrgId: string | null;\n}\n\nexport interface AutoJoinDomainOptions {\n /**\n * The signup hook should not clobber an org selected by an invite flow, but\n * request-time org resolution may need to move an existing account from a\n * personal workspace into its newly matched company org. `\"never\"` joins\n * without touching `active-org-id` — the caller decides activation itself.\n */\n activateJoinedOrg?: \"if-missing\" | \"always\" | \"never\";\n}\n\n/**\n * Auto-join a newly-signed-up user into every org whose `allowed_domain`\n * matches their email domain.\n *\n * Called from the Better Auth `user.create.after` hook so that e.g. a new\n * `@builder.io` signup lands inside the existing Builder.io org on first\n * page load instead of starting in Personal and having to find the join\n * CTA. The org's owner opts into this by setting\n * `organizations.allowed_domain` — the column already gated the manual\n * \"Join your team\" UI in the picker; we use the same opt-in to drive\n * automatic join.\n *\n * Idempotent — skips orgs the user is already a member of and, by default,\n * never overwrites an existing `active-org-id` setting.\n *\n * Safe to call when the org tables don't exist (some templates don't use\n * the org module): it swallows the \"no such table\" error and returns\n * empty. Never throws — the caller is a signup hook and we don't want to\n * block a user from creating their account because of an org-tier issue.\n */\nexport async function autoJoinDomainMatchingOrgs(\n rawEmail: string,\n options: AutoJoinDomainOptions = {},\n): Promise<AutoJoinDomainResult> {\n const email = rawEmail.trim().toLowerCase();\n if (!email) return { joined: [], activeOrgId: null };\n\n const domain = email.split(\"@\")[1]?.toLowerCase();\n if (!domain) return { joined: [], activeOrgId: null };\n\n const db = getDbExec();\n\n let matches: Array<{ orgId: string }> = [];\n try {\n const res = await db.execute({\n sql: `SELECT o.id AS \"orgId\"\n FROM organizations o\n WHERE LOWER(o.allowed_domain) = ?\n AND NOT EXISTS (\n SELECT 1\n FROM org_members m\n WHERE m.org_id = o.id\n AND LOWER(m.email) = ?\n )\n ORDER BY o.created_at ASC`,\n args: [domain, email],\n });\n matches = res.rows.map((r: any) => ({\n orgId: String(r.orgId ?? r.org_id),\n }));\n } catch {\n // Template without org tables (or `allowed_domain` column not yet\n // migrated). Not fatal — return empty.\n return { joined: [], activeOrgId: null };\n }\n\n if (matches.length === 0) return { joined: [], activeOrgId: null };\n\n const joined: AutoJoinDomainResult[\"joined\"] = [];\n for (const m of matches) {\n try {\n await db.execute({\n sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, 'member', ?)`,\n args: [nanoid(), m.orgId, email, Date.now()],\n });\n joined.push({ orgId: m.orgId });\n } catch {\n // Race with a parallel join (e.g. user accepted an invite to the\n // same org milliseconds earlier). The unique constraint keeps the\n // existing membership intact; just skip this org.\n }\n }\n\n // Set active-org-id to the first match only if the user doesn't already have\n // one, unless the caller is request-time org resolution intentionally moving\n // an existing account into its newly matched company org.\n let activeOrgId: string | null = null;\n if (joined[0] && options.activateJoinedOrg !== \"never\") {\n try {\n const existing = await getUserSetting(email, \"active-org-id\");\n const hasActive = Boolean(existing?.orgId);\n if (options.activateJoinedOrg === \"always\" || !hasActive) {\n activeOrgId = joined[0].orgId;\n await setActiveOrgId(\n email,\n activeOrgId,\n \"auto-joined domain-matched org\",\n );\n }\n } catch {\n // settings table missing — not fatal.\n }\n }\n\n return { joined, activeOrgId };\n}\n"]}
@@ -1,5 +1,23 @@
1
1
  import type { H3Event } from "h3";
2
2
  import type { OrgContext, OrgRole } from "./types.js";
3
+ /**
4
+ * The single way to read `org_members`, so no two call sites can pick opposite
5
+ * defaults for the same failure. A transient database failure is NOT an answer
6
+ * and propagates: a caller that turns it into "no memberships" silently drops
7
+ * org scope, which hides every org-scoped credential behind a
8
+ * permanent-sounding "not configured".
9
+ *
10
+ * `null` is every non-transient failure, not only the intended one (org tables
11
+ * absent on a fresh install before migrations). A permanently unreadable table
12
+ * — a role without SELECT, say — still reports as "no rows" here. Narrowing
13
+ * that further means classifying "no database configured" as readable-absent,
14
+ * which is load-bearing for CLI/script/test contexts that legitimately run
15
+ * without a store; see `assertCredentialStoreReadable`.
16
+ */
17
+ export declare function queryOrgMembers(query: {
18
+ sql: string;
19
+ args: unknown[];
20
+ }): Promise<Record<string, unknown>[] | null>;
3
21
  /**
4
22
  * Resolve the current user's organization context from their session.
5
23
  *
@@ -19,7 +37,7 @@ export declare function getOrgContext(event: H3Event): Promise<OrgContext>;
19
37
  * Resolve the active org ID for a given email — for non-HTTP contexts like
20
38
  * the integration webhook handler where we have an email but no event/session.
21
39
  * Picks the user's active-org-id setting if set, including explicit Personal,
22
- * otherwise the first membership.
40
+ * otherwise the oldest membership.
23
41
  * Returns null if the user has no memberships.
24
42
  */
25
43
  export declare function resolveOrgIdForEmail(email: string): Promise<string | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/org/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAOlC,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAsDtD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAOvE;AAoQD;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsBxB;AAED;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBxB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,OAAiB,GACtB,OAAO,CAAC;IACT,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAqBD;AAqLD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAaxE;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAa3E;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAaxB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAepD"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/org/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AASlC,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAStD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAQ5C;AA+CD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAcvE;AA4RD;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBxB;AAED;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,OAAiB,GACtB,OAAO,CAAC;IACT,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAuBD;AAyOD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAaxE;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAa3E;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAaxB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAepD"}