@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
@@ -19,6 +19,7 @@ import {
19
19
  } from "../action.js";
20
20
  import { readAppState } from "../application-state/script-helpers.js";
21
21
  import { isReadOnlyShellCommand } from "../coding-tools/index.js";
22
+ import { getDbExec } from "../db/client.js";
22
23
  import { extensionIdFromPathname } from "../extensions/path.js";
23
24
  import { preUploadAttachments } from "../file-upload/pre-upload-attachments.js";
24
25
  import { isMcpActionResult } from "../mcp-client/app-result.js";
@@ -56,6 +57,10 @@ import {
56
57
  type ReasoningEffort,
57
58
  } from "../shared/reasoning-effort.js";
58
59
  import { actionPreparationContinuationNote } from "./action-continuation-guidance.js";
60
+ import {
61
+ drainAgentWarnings,
62
+ formatAgentWarningsForToolResult,
63
+ } from "./action-warnings.js";
59
64
  import {
60
65
  buildSystemManifestSections,
61
66
  readContextXraySystemSections,
@@ -109,9 +114,11 @@ import { EngineError } from "./engine/types.js";
109
114
  import {
110
115
  type AgentLoopSettings,
111
116
  getDefaultMaxIterations,
117
+ getDefaultMaxRunInputTokens,
112
118
  MAX_AGENT_MAX_ITERATIONS,
113
119
  MIN_AGENT_MAX_ITERATIONS,
114
120
  normalizeMaxIterations,
121
+ normalizeMaxRunInputTokens,
115
122
  readAgentLoopSettings,
116
123
  } from "./loop-settings.js";
117
124
  import {
@@ -137,6 +144,7 @@ import {
137
144
  tryClaimRunSlot,
138
145
  isHostedRuntime,
139
146
  resolveRunSoftTimeoutMs,
147
+ resolveRunToolTimeoutCeilingMs,
140
148
  } from "./run-manager.js";
141
149
  import type { ActiveRun } from "./run-manager.js";
142
150
  import {
@@ -144,6 +152,7 @@ import {
144
152
  readLedgerEntry,
145
153
  clearLedgerForThread,
146
154
  insertRun,
155
+ insertRunEvent,
147
156
  isTurnAborted,
148
157
  markRunAborted,
149
158
  updateRunHeartbeat,
@@ -158,7 +167,10 @@ import {
158
167
  UNCLAIMED_BACKGROUND_RUN_GRACE_MS,
159
168
  } from "./run-store.js";
160
169
  import { buildCurrentTimeUserContext } from "./runtime-context.js";
161
- import { findCompletedJournalEntry } from "./tool-call-journal.js";
170
+ import {
171
+ findCompletedJournalEntry,
172
+ type ToolCallJournal,
173
+ } from "./tool-call-journal.js";
162
174
  import {
163
175
  redactSensitiveFields,
164
176
  sanitizeToolErrorText,
@@ -180,6 +192,7 @@ import type {
180
192
  AgentChatEvent,
181
193
  AgentChatReference,
182
194
  AgentChatStructuredMessage,
195
+ RunEvent,
183
196
  } from "./types.js";
184
197
 
185
198
  // Register built-in engines on first import
@@ -1086,9 +1099,11 @@ const MODEL_STREAM_NO_PROGRESS_TIMEOUT_MS = 90_000;
1086
1099
  * around 40s, so that watchdog could never actually fire: the run died as a
1087
1100
  * silent platform kill instead of a recoverable checkpoint (observed: ~40s of
1088
1101
  * "Contacting model" with zero tokens, then a hard timeout with no
1089
- * auto_continue ever emitted). Once ANY event (including a heartbeat) has
1090
- * been observed for this model call, subsequent gaps revert to the normal 90s
1091
- * watchdog — this only guards the "nothing has happened yet" window.
1102
+ * auto_continue ever emitted). Once a real model event has been observed for
1103
+ * this model call, subsequent gaps revert to the normal 90s watchdog — this
1104
+ * only guards the "nothing has happened yet" window. A `gateway-heartbeat`
1105
+ * does NOT count as that first event (it proves the transport is up, not that
1106
+ * the model started); it is excluded from stream progress for the same reason.
1092
1107
  *
1093
1108
  * ORDERING INVARIANT (each bound must stay strictly smaller than the next —
1094
1109
  * do not change one without re-checking the others). This cap exists ONLY
@@ -1123,6 +1138,16 @@ const MAX_RESOURCE_INVENTORY_ITEMS = 40;
1123
1138
  const MAX_RESOURCE_INVENTORY_DESCRIPTION_CHARS = 160;
1124
1139
  const MAX_INLINE_SKILL_REFERENCE_CHARS = 40_000;
1125
1140
  const SOURCE_SWEEP_TOOL_CALL_THRESHOLD = 12;
1141
+ /**
1142
+ * Serialized-byte threshold at which a run reports how much tool schema
1143
+ * `expandActiveTools` has loaded on top of its starting set. Expansion is
1144
+ * monotonic — schemas added mid-turn are never released — and failing runs
1145
+ * carry ~3.4x the event payload of clean ones, but that is a correlation, not
1146
+ * a cause. Measure first; a cap or LRU eviction can only be sized safely once
1147
+ * the real distribution is known (dropping a tool the model is about to call
1148
+ * is worse than a large request).
1149
+ */
1150
+ const EXPANDED_TOOL_SCHEMA_WARN_BYTES = 32_000;
1126
1151
 
1127
1152
  /**
1128
1153
  * Hard cap on the `<current-screen>` block injected into EVERY user message.
@@ -1322,6 +1347,43 @@ export function trimOldToolResults(
1322
1347
  return trimmed ? result : null;
1323
1348
  }
1324
1349
 
1350
+ /** Upper bound (jitter included) on what `retryDelay(attempt)` will sleep. */
1351
+ function maxRetryDelayMs(attempt: number): number {
1352
+ return RETRY_BASE_DELAY_MS * Math.pow(2, attempt) * 1.1;
1353
+ }
1354
+
1355
+ /**
1356
+ * Wall-clock left in this invocation's soft-timeout budget, measured from
1357
+ * `startedAt`. `Infinity` off the hosted soft-timeout regime (local dev,
1358
+ * self-hosted), where runs are genuinely unbounded. Uses the same ceiling
1359
+ * `startRun` sizes the round to, so budget math here can't disagree with the
1360
+ * soft timeout that actually aborts the run.
1361
+ */
1362
+ export function remainingRunBudgetMs(startedAt: number): number {
1363
+ const ceilingMs = resolveRunSoftTimeoutMs(undefined, {
1364
+ useHostedDefault: true,
1365
+ backgroundFunction: isInBackgroundFunctionRuntime(),
1366
+ });
1367
+ if (ceilingMs <= 0) return Number.POSITIVE_INFINITY;
1368
+ return ceilingMs - (Date.now() - startedAt);
1369
+ }
1370
+
1371
+ /**
1372
+ * Whether one more engine retry — its backoff sleep, plus a minimal window for
1373
+ * the resume layer above — still fits in the run budget. Count-based retries
1374
+ * alone burn the entire hosted foreground budget on a deterministic failure
1375
+ * (observed: every failing run spent all 3 retries, ~14s of it asleep, and
1376
+ * left nothing for recovery).
1377
+ */
1378
+ function hasBudgetForEngineRetry(startedAt: number, attempt: number): boolean {
1379
+ const remainingMs = remainingRunBudgetMs(startedAt);
1380
+ if (remainingMs === Number.POSITIVE_INFINITY) return true;
1381
+ return (
1382
+ remainingMs - maxRetryDelayMs(attempt) >=
1383
+ SELF_CHAIN_MIN_CONTINUATION_BUDGET_MS
1384
+ );
1385
+ }
1386
+
1325
1387
  /** Wait with exponential backoff, respecting abort signal */
1326
1388
  function retryDelay(attempt: number, signal: AbortSignal): Promise<void> {
1327
1389
  const baseMs = RETRY_BASE_DELAY_MS * Math.pow(2, attempt);
@@ -2332,11 +2394,63 @@ async function applyObservationalMemoryToContext(
2332
2394
  }
2333
2395
  }
2334
2396
 
2397
+ /**
2398
+ * Cross-chunk read-only result cache seed.
2399
+ *
2400
+ * A chained continuation chunk rebuilds `messages` without the prior chunk's
2401
+ * tool results, so `seedReadOnlyToolResultsFromHistory` sees nothing and every
2402
+ * read-only tool (run-code, provider-api-request, tool-search, every research
2403
+ * tool) re-executes from scratch. Their only cross-chunk protection was the
2404
+ * prompt-level resume note, which truncates each result to 400 chars — a
2405
+ * 50,000-char run-code result came back as 400 chars, leaving the model no
2406
+ * option but to re-run it. Re-executed reads were the dominant term in
2407
+ * production spend.
2408
+ *
2409
+ * The full `tool_done` result IS in the durable run ledger, so seed the same
2410
+ * cache the in-run duplicate guard uses. The tool layer then serves the real
2411
+ * result while the prompt note keeps its short summary.
2412
+ *
2413
+ * Staleness is bounded to the CURRENT TURN: the journal is built from
2414
+ * `getCurrentTurnEventsForThread`, so nothing older than the user's current
2415
+ * request can be replayed, and a successful write inside the turn clears the
2416
+ * cache exactly as it does for in-chunk reads.
2417
+ */
2418
+ function seedReadOnlyToolResultsFromJournal(
2419
+ journal: ToolCallJournal | null,
2420
+ actions: Record<string, ActionEntry>,
2421
+ ): Map<string, string> {
2422
+ const cache = new Map<string, string>();
2423
+ if (!journal) return cache;
2424
+ for (const entry of journal.completed) {
2425
+ const action = actions[entry.tool];
2426
+ if (action?.readOnly !== true) {
2427
+ // Mirror the live loop: a completed write invalidates every cached read.
2428
+ cache.clear();
2429
+ continue;
2430
+ }
2431
+ if (action.dedupe === false) continue;
2432
+ const result = entry.result ?? "";
2433
+ if (
2434
+ !isReusableReadOnlyToolResult({
2435
+ type: "tool-result",
2436
+ toolCallId: "",
2437
+ toolName: entry.tool,
2438
+ content: result,
2439
+ } as EngineToolResultPart)
2440
+ ) {
2441
+ continue;
2442
+ }
2443
+ cache.set(toolCallCacheKey(entry.tool, entry.input), result);
2444
+ }
2445
+ return cache;
2446
+ }
2447
+
2335
2448
  function seedReadOnlyToolResultsFromHistory(
2336
2449
  messages: EngineMessage[],
2337
2450
  actions: Record<string, ActionEntry>,
2451
+ seed?: Map<string, string>,
2338
2452
  ): Map<string, string> {
2339
- const cache = new Map<string, string>();
2453
+ const cache = new Map<string, string>(seed);
2340
2454
  if (!isInternalContinuationTurn(messages)) return cache;
2341
2455
 
2342
2456
  // Scoped to the current turn only (same slice as
@@ -2552,6 +2666,21 @@ const INTERRUPTED_TOOL_RESULT_MARKER =
2552
2666
  "Interrupted before this tool returned a result.";
2553
2667
  const MAX_WRITE_TOOL_INTERRUPTIONS = 2;
2554
2668
  const MAX_IDENTICAL_TOOL_ERRORS = 3;
2669
+ /**
2670
+ * Identical (tool, arguments) invocations tolerated in one turn before the turn
2671
+ * is stopped, whether or not they errored.
2672
+ *
2673
+ * This is the guard that distinguishes a spiral from deep work. Volume ceilings
2674
+ * cannot: prod contains a legitimate 117-tool-call analysis alongside turns that
2675
+ * issued 39 identical `run-code` webFetches and 43 identical `docs-search`
2676
+ * calls. Repetition is what separates them, so repetition is what we bound —
2677
+ * leaving genuinely long analyses free to keep making NEW calls.
2678
+ *
2679
+ * Above `MAX_IDENTICAL_TOOL_ERRORS` (3) because a repeated SUCCESS is weaker
2680
+ * evidence of a loop than a repeated failure: a few identical reads can be a
2681
+ * legitimate re-check after a write.
2682
+ */
2683
+ export const MAX_IDENTICAL_TOOL_CALLS = 8;
2555
2684
 
2556
2685
  function seedWriteToolInterruptionsFromHistory(
2557
2686
  messages: EngineMessage[],
@@ -2834,6 +2963,14 @@ const DEFAULT_INITIAL_TOOL_NAMES = new Set([
2834
2963
  "docs-search",
2835
2964
  "get-framework-context",
2836
2965
  "read-attachment",
2966
+ // The `<available-apps>` prompt block names these two BY NAME on the same
2967
+ // request, and "which app should I use for this?" is answered on turn one or
2968
+ // not at all. Omitting them made the model read the instruction, find no
2969
+ // schema, and answer from its own assumptions instead of spending a
2970
+ // tool-search turn — so users were told a capability did not exist while a
2971
+ // sibling app owned it.
2972
+ "describe-workspace-apps",
2973
+ "call-agent",
2837
2974
  ]);
2838
2975
 
2839
2976
  function isDefaultInitialToolName(name: string): boolean {
@@ -3474,6 +3611,8 @@ export async function runAgentLoop(opts: {
3474
3611
  actions: Record<string, ActionEntry>;
3475
3612
  send: (event: AgentChatEvent) => void;
3476
3613
  signal: AbortSignal;
3614
+ /** Observe usage as each model response reports it, including aborted loops. */
3615
+ onUsage?: (usage: AgentLoopUsage) => void;
3477
3616
  ownerEmail?: string | null;
3478
3617
  orgId?: string | null;
3479
3618
  /** Action invocation attribution. Defaults to the normal agent tool loop. */
@@ -3482,6 +3621,12 @@ export async function runAgentLoop(opts: {
3482
3621
  automation?: ActionAutomationContext;
3483
3622
  /** Concrete execution id used for cross-app trace correlation. */
3484
3623
  runId?: string;
3624
+ /**
3625
+ * Wall-clock anchor for run-budget math (engine-retry backoff, in-process
3626
+ * resume). Defaults to loop entry; a continuation wrapper passes the round's
3627
+ * start so later attempts don't each believe they have a fresh budget.
3628
+ */
3629
+ budgetStartedAt?: number;
3485
3630
  /** Verified/telemetry-only delegated lineage supplied by the transport. */
3486
3631
  networkProtocol?: "a2a" | "mcp" | "provider-api";
3487
3632
  networkId?: string;
@@ -3499,6 +3644,19 @@ export async function runAgentLoop(opts: {
3499
3644
  maxOutputTokens?: number;
3500
3645
  executionMode?: AgentExecutionMode;
3501
3646
  maxIterations?: number;
3647
+ /**
3648
+ * Per-TURN input-token ceiling. Iteration count and wall clock do not bound
3649
+ * spend — retained tool results are re-sent every iteration, so cost is
3650
+ * quadratic in tool-call count. Crossing this stops the turn outright
3651
+ * (unlike `maxIterations`, which hands off to the next chunk).
3652
+ */
3653
+ maxRunInputTokens?: number;
3654
+ /**
3655
+ * Input tokens already consumed by EARLIER chunks of this same logical turn.
3656
+ * Without it every chained chunk would get a fresh allowance and 25 chunks
3657
+ * would multiply the ceiling by 25.
3658
+ */
3659
+ priorTurnInputTokens?: number;
3502
3660
  finalResponseGuard?: AgentLoopFinalResponseGuard;
3503
3661
  /**
3504
3662
  * Stable real-user request text preserved across internal continuation
@@ -3541,6 +3699,7 @@ export async function runAgentLoop(opts: {
3541
3699
  send,
3542
3700
  signal,
3543
3701
  } = opts;
3702
+ const budgetStartedAt = opts.budgetStartedAt ?? Date.now();
3544
3703
  const finalResponseGuardRequestText =
3545
3704
  opts.finalResponseGuardRequestText ??
3546
3705
  resolveFinalResponseGuardRequestText(messages);
@@ -3550,6 +3709,8 @@ export async function runAgentLoop(opts: {
3550
3709
  const activeToolNames = new Set(tools.map((tool) => tool.name));
3551
3710
  let activeTools = tools;
3552
3711
 
3712
+ let expandedToolSchemaBytes = 0;
3713
+ let reportedExpandedToolSchemaBytes = false;
3553
3714
  const expandActiveTools = (names: string[]): string[] => {
3554
3715
  const added: string[] = [];
3555
3716
  for (const name of names) {
@@ -3557,6 +3718,7 @@ export async function runAgentLoop(opts: {
3557
3718
  const tool = availableToolMap.get(name);
3558
3719
  if (!tool) continue;
3559
3720
  activeToolNames.add(name);
3721
+ expandedToolSchemaBytes += JSON.stringify(tool).length;
3560
3722
  added.push(name);
3561
3723
  }
3562
3724
  if (added.length > 0) {
@@ -3564,6 +3726,15 @@ export async function runAgentLoop(opts: {
3564
3726
  activeToolNames.has(tool.name),
3565
3727
  );
3566
3728
  }
3729
+ if (
3730
+ !reportedExpandedToolSchemaBytes &&
3731
+ expandedToolSchemaBytes > EXPANDED_TOOL_SCHEMA_WARN_BYTES
3732
+ ) {
3733
+ reportedExpandedToolSchemaBytes = true;
3734
+ console.warn(
3735
+ `[agent-loop] expanded tool schemas reached ${expandedToolSchemaBytes} bytes across ${activeToolNames.size} active tools (runId=${opts.runId ?? "none"})`,
3736
+ );
3737
+ }
3567
3738
  return added;
3568
3739
  };
3569
3740
 
@@ -3588,6 +3759,25 @@ export async function runAgentLoop(opts: {
3588
3759
  opts.maxIterations,
3589
3760
  getDefaultMaxIterations(),
3590
3761
  );
3762
+ const maxRunInputTokens = normalizeMaxRunInputTokens(
3763
+ opts.maxRunInputTokens,
3764
+ getDefaultMaxRunInputTokens(),
3765
+ );
3766
+ const priorTurnInputTokens =
3767
+ typeof opts.priorTurnInputTokens === "number" &&
3768
+ Number.isFinite(opts.priorTurnInputTokens)
3769
+ ? Math.max(0, opts.priorTurnInputTokens)
3770
+ : 0;
3771
+ // A per-tool timeout above the chunk's own soft timeout can never fire — the
3772
+ // chunk boundary always wins — so the 12-minute default is dead code on a
3773
+ // ~40s hosted foreground chunk. Background-function runs resolve to a ~13min
3774
+ // ceiling and keep the default unchanged.
3775
+ const runToolTimeoutCeilingMs = resolveRunToolTimeoutCeilingMs(
3776
+ resolveRunSoftTimeoutMs(undefined, {
3777
+ useHostedDefault: true,
3778
+ backgroundFunction: isInBackgroundFunctionRuntime(),
3779
+ }),
3780
+ );
3591
3781
  const toolCallHistory: AgentLoopToolCallSummary[] = [];
3592
3782
  const sourceSweepToolCallHistory = seedSourceSweepToolCallsFromHistory(
3593
3783
  messages,
@@ -3603,9 +3793,24 @@ export async function runAgentLoop(opts: {
3603
3793
  runCtx.toolCalls = toolCallHistory;
3604
3794
  runCtx.toolResults = toolResultHistory;
3605
3795
  }
3796
+ // Tool-call journal hard-block (resume safety). See
3797
+ // `loadPriorTurnToolCallJournal` for the full rationale — snapshotted ONCE
3798
+ // here, before any tool runs in this chunk, and its prior-chunk tool
3799
+ // calls/results are folded into `toolCallHistory` / `toolResultHistory` so
3800
+ // final response guards see evidence from earlier chunks of this turn.
3801
+ const consumedJournalKeys = new Set<string>();
3802
+ const {
3803
+ toolCallJournal,
3804
+ priorToolCalls: journaledPriorToolCalls,
3805
+ priorToolResults: journaledPriorToolResults,
3806
+ } = await loadPriorTurnToolCallJournal(opts.threadId, opts.turnId);
3807
+ toolCallHistory.push(...journaledPriorToolCalls);
3808
+ toolResultHistory.push(...journaledPriorToolResults);
3809
+
3606
3810
  const readOnlyToolResultCache = seedReadOnlyToolResultsFromHistory(
3607
3811
  messages,
3608
3812
  actions,
3813
+ seedReadOnlyToolResultsFromJournal(toolCallJournal, actions),
3609
3814
  );
3610
3815
  const duplicateReadOnlyToolCalls = seedDuplicateReadOnlyToolCallsFromHistory(
3611
3816
  messages,
@@ -3616,24 +3821,14 @@ export async function runAgentLoop(opts: {
3616
3821
  actions,
3617
3822
  );
3618
3823
  const repeatedToolErrors = new Map<string, number>();
3619
-
3620
- // Tool-call journal hard-block (resume safety). See
3621
- // `loadPriorTurnToolCallJournal` for the full rationale — snapshotted ONCE
3622
- // here, before any tool runs in this chunk, and its prior-chunk tool
3623
- // calls/results are folded into `toolCallHistory` / `toolResultHistory` so
3624
- // final response guards see evidence from earlier chunks of this turn.
3625
- const consumedJournalKeys = new Set<string>();
3626
- const {
3627
- toolCallJournal,
3628
- priorToolCalls: journaledPriorToolCalls,
3629
- priorToolResults: journaledPriorToolResults,
3630
- } = await loadPriorTurnToolCallJournal(opts.threadId);
3631
- toolCallHistory.push(...journaledPriorToolCalls);
3632
- toolResultHistory.push(...journaledPriorToolResults);
3824
+ const repeatedToolCalls = new Map<string, number>();
3633
3825
 
3634
3826
  let finalGuardRetries = 0;
3635
3827
  let emptyFinalResponseRetries = 0;
3636
3828
  let iterations = 0;
3829
+ // `loop_limit` and `done` share one terminal-event slot in run-manager, so a
3830
+ // trailing `done` would overwrite the boundary the continuation logic reads.
3831
+ let endedAtLoopLimit = false;
3637
3832
  // Overridden (raised tokens, lowered effort) only after an empty-final-
3638
3833
  // response retry below — kept separate from `opts.maxOutputTokens`/
3639
3834
  // `opts.reasoningEffort` so the very first attempt is unaffected and later
@@ -3661,9 +3856,30 @@ export async function runAgentLoop(opts: {
3661
3856
 
3662
3857
  while (true) {
3663
3858
  if (signal.aborted) break;
3859
+ const turnInputTokens = priorTurnInputTokens + usage.inputTokens;
3860
+ if (turnInputTokens > maxRunInputTokens) {
3861
+ // Terminal for the whole TURN, not a chunk boundary: emitting
3862
+ // `loop_limit` here would hand off to a successor chunk that inherits the
3863
+ // same exhausted total and immediately re-terminate, burning the run
3864
+ // ledger 25 times over.
3865
+ emitTripwire(
3866
+ new TripWire(
3867
+ `I stopped because this request consumed ${turnInputTokens.toLocaleString()} input tokens, past the ${maxRunInputTokens.toLocaleString()} budget for a single turn. ` +
3868
+ `Anything already completed above is saved. Please retry as a smaller, more specific follow-up.`,
3869
+ { processor: "run-input-token-budget" },
3870
+ ),
3871
+ );
3872
+ break;
3873
+ }
3874
+ // Terminal, NOT a nudge-and-reset: the run ends at `loop_limit` and the
3875
+ // durable per-turn ledger (or the client's own continuation) decides
3876
+ // whether the turn gets another chunk. Resetting the counter in-process
3877
+ // made the budget unenforceable and meant this event was never emitted,
3878
+ // even though run-manager, thread-data-builder and the client all handle it.
3664
3879
  if (++iterations > maxIterations) {
3665
- appendAgentLoopContinuation(messages, "loop_limit");
3666
- iterations = 1;
3880
+ send({ type: "loop_limit", maxIterations });
3881
+ endedAtLoopLimit = true;
3882
+ break;
3667
3883
  }
3668
3884
 
3669
3885
  let assistantContent: EngineContentPart[] | undefined;
@@ -3755,10 +3971,10 @@ export async function runAgentLoop(opts: {
3755
3971
  let zeroByteToolInputRestart: ZeroByteToolInputRestart | undefined;
3756
3972
  let endedForNoProgress = false;
3757
3973
  let lastModelStreamProgressAt = Date.now();
3758
- // FIX 2: true once ANY engine-stream event (including a heartbeat)
3759
- // has been retrieved for THIS model call — gates
3760
- // `FOREGROUND_FIRST_MODEL_EVENT_TIMEOUT_MS` below to only the first
3761
- // await on a fresh `engine.stream()` call, never subsequent gaps.
3974
+ // FIX 2: true once a real (non-heartbeat) engine-stream event has been
3975
+ // retrieved for THIS model call — gates
3976
+ // `FOREGROUND_FIRST_MODEL_EVENT_TIMEOUT_MS` below to the window before
3977
+ // the model has produced anything, never subsequent gaps.
3762
3978
  let hasReceivedFirstEngineEvent = false;
3763
3979
  // Resolved once per model-call attempt (not per event) so a single
3764
3980
  // call's deadline math can't observe the runtime predicates changing
@@ -3961,17 +4177,17 @@ export async function runAgentLoop(opts: {
3961
4177
  eventIteratorDone = true;
3962
4178
  break;
3963
4179
  }
3964
- // FIX 2: only the deadline for THIS await could have been
3965
- // tightened by FOREGROUND_FIRST_MODEL_EVENT_TIMEOUT_MS — every
3966
- // subsequent call in this model call reverts to the normal 90s
3967
- // watchdog regardless of what kind of event this turned out to be.
3968
- hasReceivedFirstEngineEvent = true;
3969
4180
  const event = nextEvent.value;
3970
4181
  if (hasNoProgressStalled()) {
3971
4182
  checkpointNoProgress();
3972
4183
  break;
3973
4184
  }
4185
+ // A gateway keepalive proves the transport is up, not that the
4186
+ // model started: it must not release the 25s first-model-event cap
4187
+ // any more than it counts as stream progress, or an endless
4188
+ // keepalive stream rides the unreachable 90s watchdog instead.
3974
4189
  if (event.type !== "gateway-heartbeat") {
4190
+ hasReceivedFirstEngineEvent = true;
3975
4191
  lastModelStreamProgressAt = Date.now();
3976
4192
  }
3977
4193
  // In-loop processor seam (stream hook). Each chunk is offered to every
@@ -4075,10 +4291,18 @@ export async function runAgentLoop(opts: {
4075
4291
  } else if (event.type === "assistant-content") {
4076
4292
  assistantContent = event.parts;
4077
4293
  } else if (event.type === "usage") {
4078
- usage.inputTokens += event.inputTokens;
4079
- usage.outputTokens += event.outputTokens;
4080
- usage.cacheReadTokens += event.cacheReadTokens ?? 0;
4081
- usage.cacheWriteTokens += event.cacheWriteTokens ?? 0;
4294
+ const eventUsage = {
4295
+ inputTokens: event.inputTokens,
4296
+ outputTokens: event.outputTokens,
4297
+ cacheReadTokens: event.cacheReadTokens ?? 0,
4298
+ cacheWriteTokens: event.cacheWriteTokens ?? 0,
4299
+ model,
4300
+ };
4301
+ usage.inputTokens += eventUsage.inputTokens;
4302
+ usage.outputTokens += eventUsage.outputTokens;
4303
+ usage.cacheReadTokens += eventUsage.cacheReadTokens;
4304
+ usage.cacheWriteTokens += eventUsage.cacheWriteTokens;
4305
+ opts.onUsage?.(eventUsage);
4082
4306
  } else if (event.type === "stop") {
4083
4307
  terminalStopReason = event.reason;
4084
4308
  if (event.reason === "error") {
@@ -4146,7 +4370,11 @@ export async function runAgentLoop(opts: {
4146
4370
  { errorCode: "context_length_exceeded" },
4147
4371
  );
4148
4372
  }
4149
- if (retry < maxRetriesForError(err) && isRetryableError(err)) {
4373
+ if (
4374
+ retry < maxRetriesForError(err) &&
4375
+ isRetryableError(err) &&
4376
+ hasBudgetForEngineRetry(budgetStartedAt, retry)
4377
+ ) {
4150
4378
  // Clear partial text from the failed attempt so the retry
4151
4379
  // doesn't produce garbled duplicate output. Keep the retry itself
4152
4380
  // silent so transient provider/backend failures do not leak into
@@ -4388,6 +4616,20 @@ export async function runAgentLoop(opts: {
4388
4616
  let requestedActionStop: { message: string; errorCode?: string } | null =
4389
4617
  null;
4390
4618
 
4619
+ const noteRepeatedToolCall = (toolName: string, input: unknown) => {
4620
+ const key = toolCallCacheKey(toolName, input);
4621
+ const count = (repeatedToolCalls.get(key) ?? 0) + 1;
4622
+ repeatedToolCalls.set(key, count);
4623
+ if (count < MAX_IDENTICAL_TOOL_CALLS) return;
4624
+ requestedActionStop ??= {
4625
+ message:
4626
+ `Stopped because ${toolName} was called ${count} times with identical arguments in one turn, ` +
4627
+ `which means the same step is repeating rather than making progress. ` +
4628
+ `Everything completed before this point is preserved above.`,
4629
+ errorCode: "repeated_tool_call",
4630
+ };
4631
+ };
4632
+
4391
4633
  // Human-in-the-loop approvals granted by the user for this turn (opt-in;
4392
4634
  // empty for the overwhelming majority of turns). Keyed by the stable
4393
4635
  // tool-call approval key so a re-issued continuation can let an approved
@@ -4397,6 +4639,9 @@ export async function runAgentLoop(opts: {
4397
4639
  const runToolCall = async (
4398
4640
  toolCall: import("./engine/types.js").EngineToolCallPart,
4399
4641
  ): Promise<EngineContentPart> => {
4642
+ // Counted before any journal/cache short-circuit: serving a repeat from
4643
+ // cache still means the model is asking the same question again.
4644
+ noteRepeatedToolCall(toolCall.name, toolCall.input);
4400
4645
  const actionEntry = actions[toolCall.name];
4401
4646
  const placeholderNormalization = actionEntry
4402
4647
  ? normalizeOptionalToolPlaceholders(
@@ -4659,10 +4904,14 @@ export async function runAgentLoop(opts: {
4659
4904
  // run-manager still aborts foreground hosted runs around 40s, while
4660
4905
  // background runs get nearly the full 15-minute function budget.
4661
4906
  const DEFAULT_TOOL_TIMEOUT_MS = 12 * 60_000;
4662
- const toolTimeoutMs =
4907
+ const requestedToolTimeoutMs =
4663
4908
  actionEntry.timeoutMs ??
4664
4909
  opts.toolLimits?.timeoutMs ??
4665
4910
  DEFAULT_TOOL_TIMEOUT_MS;
4911
+ const toolTimeoutMs =
4912
+ runToolTimeoutCeilingMs > 0
4913
+ ? Math.min(requestedToolTimeoutMs, runToolTimeoutCeilingMs)
4914
+ : requestedToolTimeoutMs;
4666
4915
  const toolMaxResultChars =
4667
4916
  actionEntry.maxResultChars ??
4668
4917
  opts.toolLimits?.maxResultChars ??
@@ -4680,6 +4929,12 @@ export async function runAgentLoop(opts: {
4680
4929
  // calls with no completed journal entry are completely unaffected). The
4681
4930
  // snapshot was taken before this chunk's tools ran, so it can only match a
4682
4931
  // PRIOR completion, never one from the current chunk.
4932
+ //
4933
+ // Read-only tools take the OTHER half of this protection:
4934
+ // `seedReadOnlyToolResultsFromJournal` puts their journaled results into
4935
+ // `readOnlyToolResultCache`, so the duplicate-read guard below serves them
4936
+ // as a cache hit (respecting `dedupe: false` and write invalidation)
4937
+ // instead of re-executing.
4683
4938
  if (!actionEntry.readOnly && toolCallJournal) {
4684
4939
  const journaled = findCompletedJournalEntry(
4685
4940
  toolCallJournal,
@@ -5187,6 +5442,15 @@ export async function runAgentLoop(opts: {
5187
5442
  result = finalizeToolErrorResult(result);
5188
5443
  }
5189
5444
 
5445
+ // Side-channel warnings raised anywhere inside the action's call stack
5446
+ // (see `action-warnings.ts`). Drained here rather than in the success
5447
+ // branch so an action that warns and then throws still surfaces it, and
5448
+ // so nothing stays pending to bleed into a later tool's result.
5449
+ const agentWarnings = drainAgentWarnings();
5450
+ if (agentWarnings.length > 0) {
5451
+ result = `${result}\n\n${formatAgentWarningsForToolResult(agentWarnings)}`;
5452
+ }
5453
+
5190
5454
  // Auto-refresh the UI after a successful mutating tool call. Any action
5191
5455
  // that isn't explicitly read-only is assumed to mutate. The client's
5192
5456
  // useDbSync listener sees a change event with source:"action" and
@@ -5328,7 +5592,7 @@ export async function runAgentLoop(opts: {
5328
5592
  return usage;
5329
5593
  }
5330
5594
 
5331
- if (!signal.aborted) {
5595
+ if (!signal.aborted && !endedAtLoopLimit) {
5332
5596
  // In-loop processor seam (result hook). Fires once at clean run end with the
5333
5597
  // final assistant text so processors (e.g. a proof-of-done gate) can record
5334
5598
  // a verdict. A result-hook abort cannot un-finish a completed run, so a
@@ -5600,26 +5864,21 @@ export function backgroundContinuationReasonForRun(
5600
5864
  export async function runAgentLoopWithMainChatInternalContinuations(
5601
5865
  opts: Parameters<typeof runAgentLoop>[0] & {
5602
5866
  /**
5603
- * Opt-in: also catch a thrown `isResumableEngineError` (gateway drop /
5604
- * transport interruption surviving engine retries) and retry it in-process
5605
- * — the same "continue from where you left off" treatment already applied
5606
- * to in-loop `auto_continue` events below — instead of letting it
5607
- * propagate out to the caller. Default false/omitted preserves the exact
5608
- * prior behavior: such an error is NOT caught here and propagates to
5609
- * `startRun`'s outer catch, which marks the run "errored" and (for a
5610
- * background worker) hands off to `chainServerDrivenContinuation` for a
5611
- * fresh invocation.
5867
+ * Resume a thrown `isResumableEngineError` (gateway drop / transport
5868
+ * interruption surviving engine retries) in-process UNCONDITIONALLY the
5869
+ * same "continue from where you left off" treatment applied to in-loop
5870
+ * `auto_continue` events below.
5612
5871
  *
5613
- * Only safe to enable when the CALLER is a proven durable-background
5614
- * worker (`isInBackgroundFunctionRuntime()`): such a worker has minutes of
5615
- * remaining budget on this same invocation, so resuming in-process avoids
5616
- * a self-dispatch entirely critically, it avoids the bg-function
5617
- * self-dispatch 404 (a background function cannot invoke its own public
5618
- * URL from inside a live invocation) that this same recoverable-error
5619
- * path would otherwise hit via `chainServerDrivenContinuation`. A
5620
- * foreground turn (~40s budget) must NOT set this — it keeps depending on
5621
- * the existing cross-invocation recovery (foreground self-chain or the
5622
- * client's `auto_continue` re-POST), unchanged.
5872
+ * Set it only for a proven durable-background worker
5873
+ * (`isInBackgroundFunctionRuntime()`), which has minutes of budget left on
5874
+ * this invocation AND cannot fall back to `chainServerDrivenContinuation`
5875
+ * (a background function cannot invoke its own public URL from inside a
5876
+ * live invocation that self-dispatch 404s).
5877
+ *
5878
+ * When omitted, the resume still happens but only while enough wall-clock
5879
+ * remains (`SELF_CHAIN_MIN_CONTINUATION_BUDGET_MS`); below that the error
5880
+ * propagates to `startRun`'s outer catch and the cross-invocation recovery
5881
+ * paths (foreground self-chain, client `auto_continue` re-POST) as before.
5623
5882
  */
5624
5883
  resumeResumableErrorsInProcess?: boolean;
5625
5884
  /**
@@ -5651,6 +5910,7 @@ export async function runAgentLoopWithMainChatInternalContinuations(
5651
5910
  usage.model = next.model;
5652
5911
  };
5653
5912
 
5913
+ const budgetStartedAt = opts.budgetStartedAt ?? Date.now();
5654
5914
  const resumeResumableErrorsInProcess =
5655
5915
  opts.resumeResumableErrorsInProcess === true;
5656
5916
  const maxContinuations =
@@ -5683,19 +5943,25 @@ export async function runAgentLoopWithMainChatInternalContinuations(
5683
5943
  try {
5684
5944
  const nextUsage = await runAgentLoop({
5685
5945
  ...opts,
5946
+ budgetStartedAt,
5686
5947
  send,
5687
5948
  finalResponseGuardRequestText,
5688
5949
  });
5689
5950
  addUsage(nextUsage);
5690
5951
  } catch (err) {
5691
- // Preserve exact prior behavior unless explicitly opted in: an aborted
5692
- // signal (real soft-timeout / user stop) or a non-resumable error is
5693
- // always rethrown, and when `resumeResumableErrorsInProcess` is not
5694
- // set, EVERY thrown error is rethrown exactly as before.
5952
+ // An aborted signal (real soft-timeout / user stop) or a non-resumable
5953
+ // error is always rethrown.
5954
+ if (opts.signal.aborted || !isResumableEngineError(err)) throw err;
5955
+ // A caller with a proven long budget (`resumeResumableErrorsInProcess`)
5956
+ // always resumes here. Everyone else — notably the foreground chat turn,
5957
+ // where a resumable transport error previously ALWAYS propagated and in
5958
+ // practice was never resumed by any other layer — resumes too, but only
5959
+ // while enough wall-clock remains to attempt it without being cut off
5960
+ // mid-stream by the platform wall.
5695
5961
  if (
5696
- !resumeResumableErrorsInProcess ||
5697
- opts.signal.aborted ||
5698
- !isResumableEngineError(err)
5962
+ !resumeResumableErrorsInProcess &&
5963
+ remainingRunBudgetMs(budgetStartedAt) <
5964
+ SELF_CHAIN_MIN_CONTINUATION_BUDGET_MS
5699
5965
  ) {
5700
5966
  throw err;
5701
5967
  }
@@ -5925,12 +6191,16 @@ export async function claimBackgroundWorkerRunEarly(opts: {
5925
6191
  insertRun?: typeof insertRun;
5926
6192
  claimBackgroundRun?: typeof claimBackgroundRun;
5927
6193
  updateRunHeartbeat?: typeof updateRunHeartbeat;
6194
+ isTurnAborted?: typeof isTurnAborted;
6195
+ markRunAborted?: typeof markRunAborted;
5928
6196
  };
5929
6197
  }): Promise<{ claimed: true } | { claimed: false; skipped: string }> {
5930
6198
  const record = opts.deps?.recordRunDiagnostic ?? recordRunDiagnostic;
5931
6199
  const insert = opts.deps?.insertRun ?? insertRun;
5932
6200
  const claim = opts.deps?.claimBackgroundRun ?? claimBackgroundRun;
5933
6201
  const heartbeat = opts.deps?.updateRunHeartbeat ?? updateRunHeartbeat;
6202
+ const turnAborted = opts.deps?.isTurnAborted ?? isTurnAborted;
6203
+ const abortRun = opts.deps?.markRunAborted ?? markRunAborted;
5934
6204
  const threadId =
5935
6205
  typeof opts.threadId === "string" && opts.threadId.trim()
5936
6206
  ? opts.threadId.trim()
@@ -5954,12 +6224,24 @@ export async function claimBackgroundWorkerRunEarly(opts: {
5954
6224
  .join(" "),
5955
6225
  ).catch(() => {});
5956
6226
 
6227
+ // A failed durable abort read is fail-closed: never let a worker execute
6228
+ // after cancellation just because the database was temporarily unreadable.
6229
+ if (await turnAborted(threadId, turnId).catch(() => true)) {
6230
+ await abortRun(opts.runId, "user").catch(() => {});
6231
+ return { claimed: false, skipped: "turn-aborted" };
6232
+ }
6233
+
5957
6234
  if (opts.continuationCount > 0) {
5958
6235
  await insert(opts.runId, threadId, turnId, {
5959
6236
  dispatchMode: "background",
5960
6237
  }).catch(() => {});
5961
6238
  }
5962
6239
 
6240
+ if (await turnAborted(threadId, turnId).catch(() => true)) {
6241
+ await abortRun(opts.runId, "user").catch(() => {});
6242
+ return { claimed: false, skipped: "turn-aborted" };
6243
+ }
6244
+
5963
6245
  const won = await claim(opts.runId);
5964
6246
  if (!won) {
5965
6247
  await record(opts.runId, RUN_DIAG_STAGE.workerClaimLost).catch(() => {});
@@ -5968,17 +6250,114 @@ export async function claimBackgroundWorkerRunEarly(opts: {
5968
6250
 
5969
6251
  await record(opts.runId, RUN_DIAG_STAGE.workerClaimed).catch(() => {});
5970
6252
  await heartbeat(opts.runId).catch(() => {});
6253
+ if (await turnAborted(threadId, turnId).catch(() => true)) {
6254
+ await abortRun(opts.runId, "user").catch(() => {});
6255
+ return { claimed: false, skipped: "turn-aborted" };
6256
+ }
5971
6257
  return { claimed: true };
5972
6258
  }
5973
6259
 
6260
+ /**
6261
+ * Wall-clock ceiling on a single logical turn. The run-count ledger alone is
6262
+ * not a time bound: in durable mode each of the ~25 permitted chunks may burn
6263
+ * ~780s, so the ledger's real worst case is over five hours (production has an
6264
+ * observed 2h34m turn). Nobody is waiting that long, and every minute past
6265
+ * this point is spend on a request the user has abandoned.
6266
+ */
6267
+ export const MAX_TURN_WALL_CLOCK_MS = 90 * 60_000;
6268
+
6269
+ /**
6270
+ * Request-body field carrying the turn's running input-token total across
6271
+ * chunks. It rides the BODY (not the background-run marker) because the marker
6272
+ * is stripped from `continuationBody` on every handoff while the body is the
6273
+ * successor's persisted rehydration payload.
6274
+ */
6275
+ export const AGENT_CHAT_TURN_INPUT_TOKENS_FIELD =
6276
+ "__agentNativeTurnInputTokens";
6277
+
6278
+ /**
6279
+ * First `started_at` for a logical turn — the turn's true wall-clock origin
6280
+ * (`agent_runs.started_at` is never bumped by heartbeats). Returns null when
6281
+ * the turn has no rows or the read fails, in which case the deadline simply
6282
+ * does not apply and the run-count ledger remains the only bound.
6283
+ *
6284
+ * Costs one extra round trip per chain. Folding `MIN(started_at)` into
6285
+ * `countRunsForTurn`'s existing SELECT in run-store.ts would remove it.
6286
+ */
6287
+ async function readTurnStartedAt(
6288
+ threadId: string,
6289
+ turnId: string,
6290
+ ): Promise<number | null> {
6291
+ const { rows } = await getDbExec().execute({
6292
+ sql: `SELECT MIN(started_at) AS turn_started_at FROM agent_runs WHERE thread_id = ? AND turn_id = ?`,
6293
+ args: [threadId, turnId],
6294
+ });
6295
+ const raw = (rows?.[0] as { turn_started_at?: unknown } | undefined)
6296
+ ?.turn_started_at;
6297
+ const startedAt = Number(raw);
6298
+ return Number.isFinite(startedAt) && startedAt > 0 ? startedAt : null;
6299
+ }
6300
+
6301
+ /**
6302
+ * Append a user-visible assistant text event to a live run from outside the
6303
+ * agent loop. The budget-exhaustion paths below terminate a turn that has
6304
+ * already done real work; without this the user sees only a bare
6305
+ * `turn_continuation_budget_exhausted` error string and every completed tool
6306
+ * result looks discarded. Best-effort — a failed ledger write must not turn a
6307
+ * budget stop into a thrown error.
6308
+ */
6309
+ async function emitRunText(run: ActiveRun, text: string): Promise<void> {
6310
+ const runEvent: RunEvent = {
6311
+ seq: run.events.length,
6312
+ event: { type: "text", text },
6313
+ };
6314
+ run.events.push(runEvent);
6315
+ for (const subscriber of run.subscribers) {
6316
+ try {
6317
+ subscriber(runEvent);
6318
+ } catch {}
6319
+ }
6320
+ await insertRunEvent(
6321
+ run.runId,
6322
+ runEvent.seq,
6323
+ JSON.stringify(runEvent.event),
6324
+ ).catch(() => {});
6325
+ }
6326
+
6327
+ /**
6328
+ * One sentence naming what the turn actually finished, derived from the same
6329
+ * per-turn journal the resume note uses (no new ledger read shape).
6330
+ */
6331
+ async function describeTurnProgress(
6332
+ threadId: string,
6333
+ turnId?: string,
6334
+ ): Promise<string> {
6335
+ const { toolCallJournal } = await loadPriorTurnToolCallJournal(
6336
+ threadId,
6337
+ turnId,
6338
+ );
6339
+ const completed = toolCallJournal?.completed ?? [];
6340
+ if (completed.length === 0) return "No steps had completed yet.";
6341
+ const names = [...new Set(completed.map((entry) => entry.tool))];
6342
+ const shown = names.slice(0, 8).join(", ");
6343
+ return (
6344
+ `${completed.length} step(s) completed before I stopped (${shown}` +
6345
+ `${names.length > 8 ? ", …" : ""}). Their results are in the messages above.`
6346
+ );
6347
+ }
6348
+
5974
6349
  /** Injectable dependencies for `chainServerDrivenContinuation` (unit tests). */
5975
6350
  export interface ChainServerDrivenContinuationDeps {
5976
6351
  countRunsForTurn?: typeof countRunsForTurn;
6352
+ readTurnStartedAt?: typeof readTurnStartedAt;
6353
+ isTurnAborted?: typeof isTurnAborted;
6354
+ emitRunText?: typeof emitRunText;
5977
6355
  insertRun?: typeof insertRun;
5978
6356
  fireInternalDispatch?: typeof fireInternalDispatch;
5979
6357
  readBackgroundRunClaim?: typeof readBackgroundRunClaim;
5980
6358
  updateRunHeartbeat?: typeof updateRunHeartbeat;
5981
6359
  updateRunStatusIfRunning?: typeof updateRunStatusIfRunning;
6360
+ markRunAborted?: typeof markRunAborted;
5982
6361
  setRunTerminalReason?: typeof setRunTerminalReason;
5983
6362
  recordRunDiagnostic?: typeof recordRunDiagnostic;
5984
6363
  markBackgroundContinuationChunkTerminal?: typeof markBackgroundContinuationChunkTerminal;
@@ -6180,6 +6559,12 @@ export async function chainServerDrivenContinuation(opts: {
6180
6559
  * is derived from it (marker stripped, `internalContinuation` set). */
6181
6560
  requestBody: Record<string, unknown>;
6182
6561
  backgroundContinuationCount: number;
6562
+ /**
6563
+ * Input tokens this logical turn has consumed across every chunk so far,
6564
+ * carried on the successor's body so the per-turn token ceiling is a real
6565
+ * turn budget instead of a fresh allowance per chunk.
6566
+ */
6567
+ turnInputTokens?: number;
6183
6568
  chainViaDurableBackground: boolean;
6184
6569
  /** True only when this worker is PROVEN (by runtime function name) to
6185
6570
  * already be executing inside a real Netlify `-background` function —
@@ -6192,6 +6577,9 @@ export async function chainServerDrivenContinuation(opts: {
6192
6577
  }): Promise<void> {
6193
6578
  const d = {
6194
6579
  countRunsForTurn: opts.deps?.countRunsForTurn ?? countRunsForTurn,
6580
+ readTurnStartedAt: opts.deps?.readTurnStartedAt ?? readTurnStartedAt,
6581
+ isTurnAborted: opts.deps?.isTurnAborted ?? isTurnAborted,
6582
+ emitRunText: opts.deps?.emitRunText ?? emitRunText,
6195
6583
  insertRun: opts.deps?.insertRun ?? insertRun,
6196
6584
  fireInternalDispatch:
6197
6585
  opts.deps?.fireInternalDispatch ?? fireInternalDispatch,
@@ -6200,6 +6588,7 @@ export async function chainServerDrivenContinuation(opts: {
6200
6588
  updateRunHeartbeat: opts.deps?.updateRunHeartbeat ?? updateRunHeartbeat,
6201
6589
  updateRunStatusIfRunning:
6202
6590
  opts.deps?.updateRunStatusIfRunning ?? updateRunStatusIfRunning,
6591
+ markRunAborted: opts.deps?.markRunAborted ?? markRunAborted,
6203
6592
  setRunTerminalReason:
6204
6593
  opts.deps?.setRunTerminalReason ?? setRunTerminalReason,
6205
6594
  recordRunDiagnostic: opts.deps?.recordRunDiagnostic ?? recordRunDiagnostic,
@@ -6223,22 +6612,59 @@ export async function chainServerDrivenContinuation(opts: {
6223
6612
  const turnRunCount = await d
6224
6613
  .countRunsForTurn(effectiveThreadId, effectiveTurnId)
6225
6614
  .catch(() => null);
6226
- if (
6227
- turnRunCount !== null &&
6228
- turnRunCount > MAX_BACKGROUND_RUN_CONTINUATIONS + 5
6229
- ) {
6230
- console.error(
6231
- `[agent-chat] turn ${effectiveTurnId} consumed ${turnRunCount} runs — refusing to chain further`,
6232
- runId,
6233
- );
6615
+ const stopTurn = async (
6616
+ terminalReason: string,
6617
+ logLine: string,
6618
+ userMessage: string,
6619
+ ) => {
6620
+ console.error(`[agent-chat] ${logLine}`, runId);
6621
+ const progress = await describeTurnProgress(
6622
+ effectiveThreadId,
6623
+ effectiveTurnId,
6624
+ ).catch(() => "");
6625
+ await d
6626
+ .emitRunText(
6627
+ run,
6628
+ progress ? `${userMessage}\n\n${progress}` : userMessage,
6629
+ )
6630
+ .catch(() => {});
6234
6631
  const statusUpdated = await d
6235
6632
  .updateRunStatusIfRunning(runId, "errored")
6236
6633
  .catch(() => false);
6237
6634
  if (statusUpdated) {
6238
- await d
6239
- .setRunTerminalReason(runId, "turn_continuation_budget_exhausted")
6240
- .catch(() => {});
6635
+ await d.setRunTerminalReason(runId, terminalReason).catch(() => {});
6241
6636
  }
6637
+ };
6638
+
6639
+ if (
6640
+ turnRunCount !== null &&
6641
+ turnRunCount > MAX_BACKGROUND_RUN_CONTINUATIONS + 5
6642
+ ) {
6643
+ await stopTurn(
6644
+ "turn_continuation_budget_exhausted",
6645
+ `turn ${effectiveTurnId} consumed ${turnRunCount} runs — refusing to chain further`,
6646
+ `I stopped after ${turnRunCount} internal continuations without finishing this request.`,
6647
+ );
6648
+ return;
6649
+ }
6650
+
6651
+ // WALL-CLOCK CEILING. The run-count ledger above bounds chunks, not time: in
6652
+ // durable mode 25 chunks x ~780s is over five hours, and prod has an observed
6653
+ // 2h34m turn. Measured from the turn's FIRST run row, so it survives every
6654
+ // recovery path exactly like the run count does.
6655
+ const turnStartedAt = await d
6656
+ .readTurnStartedAt(effectiveThreadId, effectiveTurnId)
6657
+ .catch(() => null);
6658
+ const turnElapsedMs = turnStartedAt === null ? 0 : Date.now() - turnStartedAt;
6659
+ if (turnElapsedMs > MAX_TURN_WALL_CLOCK_MS) {
6660
+ const elapsedMinutes = Math.round(turnElapsedMs / 60_000);
6661
+ await stopTurn(
6662
+ "turn_wall_clock_budget_exhausted",
6663
+ `turn ${effectiveTurnId} ran ${elapsedMinutes}min (limit ${Math.round(
6664
+ MAX_TURN_WALL_CLOCK_MS / 60_000,
6665
+ )}min) — refusing to chain further`,
6666
+ `I stopped after ${elapsedMinutes} minutes without finishing this request.`,
6667
+ );
6242
6668
  return;
6243
6669
  }
6244
6670
 
@@ -6274,9 +6700,20 @@ export async function chainServerDrivenContinuation(opts: {
6274
6700
  const continuationBody: Record<string, unknown> = {
6275
6701
  ...opts.requestBody,
6276
6702
  internalContinuation: true,
6703
+ ...(typeof opts.turnInputTokens === "number"
6704
+ ? { [AGENT_CHAT_TURN_INPUT_TOKENS_FIELD]: opts.turnInputTokens }
6705
+ : {}),
6277
6706
  };
6278
6707
  delete continuationBody[AGENT_CHAT_BACKGROUND_RUN_FIELD];
6279
6708
  try {
6709
+ if (
6710
+ await d
6711
+ .isTurnAborted(effectiveThreadId, effectiveTurnId)
6712
+ .catch(() => true)
6713
+ ) {
6714
+ await d.markRunAborted(runId, "user").catch(() => {});
6715
+ return;
6716
+ }
6280
6717
  await d
6281
6718
  .recordRunDiagnostic(
6282
6719
  runId,
@@ -6322,6 +6759,16 @@ export async function chainServerDrivenContinuation(opts: {
6322
6759
  insertErr instanceof Error ? insertErr.message : insertErr,
6323
6760
  );
6324
6761
  }
6762
+ if (
6763
+ await d
6764
+ .isTurnAborted(effectiveThreadId, effectiveTurnId)
6765
+ .catch(() => true)
6766
+ ) {
6767
+ if (nextRowInserted)
6768
+ await d.markRunAborted(nextRunId, "user").catch(() => {});
6769
+ await d.markRunAborted(runId, "user").catch(() => {});
6770
+ return;
6771
+ }
6325
6772
  const dispatchBody = nextRowInserted
6326
6773
  ? {
6327
6774
  internalContinuation: true,
@@ -6431,8 +6878,13 @@ export async function chainServerDrivenContinuation(opts: {
6431
6878
  ? lastDispatchErr.message
6432
6879
  : lastDispatchErr,
6433
6880
  );
6881
+ // `completed`, not `errored`: this chunk's work IS durably persisted
6882
+ // and a successor row exists for the sweep to redispatch. Only the
6883
+ // handoff attempt failed, and the terminal reason already says so —
6884
+ // recording the chunk as errored made a recoverable deferral look like
6885
+ // a failed turn everywhere run status is read.
6434
6886
  const statusUpdated = await d
6435
- .updateRunStatusIfRunning(runId, "errored")
6887
+ .updateRunStatusIfRunning(runId, "completed")
6436
6888
  .catch(() => false);
6437
6889
  if (statusUpdated) {
6438
6890
  await d
@@ -7295,6 +7747,8 @@ export function createProductionAgentHandler(
7295
7747
  defaultMaxIterations: getDefaultMaxIterations(),
7296
7748
  minMaxIterations: MIN_AGENT_MAX_ITERATIONS,
7297
7749
  maxMaxIterations: MAX_AGENT_MAX_ITERATIONS,
7750
+ maxRunInputTokens: getDefaultMaxRunInputTokens(),
7751
+ defaultMaxRunInputTokens: getDefaultMaxRunInputTokens(),
7298
7752
  scope: "default",
7299
7753
  source: "default",
7300
7754
  };
@@ -7468,11 +7922,31 @@ export function createProductionAgentHandler(
7468
7922
  : typeof requestTurnId === "string" && requestTurnId.trim()
7469
7923
  ? requestTurnId.trim()
7470
7924
  : runId;
7925
+ if (
7926
+ isBackgroundWorker &&
7927
+ (await isTurnAborted(effectiveThreadId, effectiveTurnId).catch(
7928
+ () => true,
7929
+ ))
7930
+ ) {
7931
+ await markRunAborted(runId, "user").catch(() => {});
7932
+ return { ok: true, stopped: true };
7933
+ }
7471
7934
  const messageToPersist =
7472
7935
  typeof requestDisplayMessage === "string" &&
7473
7936
  requestDisplayMessage.trim().length > 0
7474
7937
  ? requestDisplayMessage
7475
7938
  : requestMessage;
7939
+ // Running per-turn input-token total. Seeded from the predecessor chunk's
7940
+ // body, advanced by this chunk's own usage, and handed to the successor so
7941
+ // the token ceiling bounds the TURN rather than resetting every chunk.
7942
+ const priorTurnInputTokensFromBody = Number(
7943
+ (body as unknown as Record<string, unknown>)[
7944
+ AGENT_CHAT_TURN_INPUT_TOKENS_FIELD
7945
+ ],
7946
+ );
7947
+ let turnInputTokens = Number.isFinite(priorTurnInputTokensFromBody)
7948
+ ? Math.max(0, priorTurnInputTokensFromBody)
7949
+ : 0;
7476
7950
 
7477
7951
  // Server-driven background continuation: when the background worker re-fired
7478
7952
  // itself at a soft-timeout boundary (a chained continuation chunk), rebuild
@@ -7591,6 +8065,16 @@ export function createProductionAgentHandler(
7591
8065
  // the Authorization Bearer HMAC is preserved either way.
7592
8066
  path: backgroundDispatchPath,
7593
8067
  taskId: runId,
8068
+ // A Netlify background function 202s on enqueue in well under a
8069
+ // second, so a 404/401/508 from it is an IMMEDIATE, knowable failure.
8070
+ // Fire-and-forget recorded those as `dispatched = true` and the user
8071
+ // waited out the claim grace for a worker that never existed. Only
8072
+ // for a real background-function target: a regular-function target
8073
+ // replies only after the successor chunk finishes, so awaiting it
8074
+ // would time out on every healthy dispatch.
8075
+ ...(expectsNetlifyBackgroundFunction
8076
+ ? { awaitResponse: true, responseTimeoutMs: 5_000 }
8077
+ : {}),
7594
8078
  // When the row (and its persisted payload) landed, send only the
7595
8079
  // marker — the worker rehydrates the body from dispatch_payload
7596
8080
  // (`payloadRef`), keeping the self-POST far under Netlify's 256KB
@@ -7901,6 +8385,7 @@ export function createProductionAgentHandler(
7901
8385
  effectiveTurnId,
7902
8386
  requestBody: body as unknown as Record<string, unknown>,
7903
8387
  backgroundContinuationCount,
8388
+ turnInputTokens,
7904
8389
  // Re-evaluate the durable gate rather than keying off
7905
8390
  // isBackgroundWorker: a successor chunk of a FOREGROUND
7906
8391
  // self-chain re-enters as a worker too, and must keep
@@ -8158,6 +8643,9 @@ export function createProductionAgentHandler(
8158
8643
  cacheWriteTokens: subUsage.cacheWriteTokens,
8159
8644
  model: subUsage.model,
8160
8645
  label: `custom-agent:${ref.name}`,
8646
+ runId,
8647
+ threadId: effectiveThreadId,
8648
+ taskId: effectiveTurnId,
8161
8649
  });
8162
8650
  } catch {}
8163
8651
 
@@ -8271,6 +8759,13 @@ export function createProductionAgentHandler(
8271
8759
  : typeof message === "string" && message.trim().length > 0
8272
8760
  ? message
8273
8761
  : undefined;
8762
+ const turnUsage: AgentLoopUsage = {
8763
+ inputTokens: 0,
8764
+ outputTokens: 0,
8765
+ cacheReadTokens: 0,
8766
+ cacheWriteTokens: 0,
8767
+ model: effectiveModel,
8768
+ };
8274
8769
  const agentLoopOpts = {
8275
8770
  engine,
8276
8771
  model: effectiveModel,
@@ -8283,6 +8778,13 @@ export function createProductionAgentHandler(
8283
8778
  actions: requestActions,
8284
8779
  send,
8285
8780
  signal,
8781
+ onUsage: (usage: AgentLoopUsage) => {
8782
+ turnUsage.inputTokens += usage.inputTokens;
8783
+ turnUsage.outputTokens += usage.outputTokens;
8784
+ turnUsage.cacheReadTokens += usage.cacheReadTokens;
8785
+ turnUsage.cacheWriteTokens += usage.cacheWriteTokens;
8786
+ turnUsage.model = usage.model;
8787
+ },
8286
8788
  ownerEmail,
8287
8789
  orgId: getRequestOrgId() ?? null,
8288
8790
  attachments: requestAttachments,
@@ -8295,6 +8797,8 @@ export function createProductionAgentHandler(
8295
8797
  providerOptions: options.providerOptions,
8296
8798
  executionMode: requestMode,
8297
8799
  maxIterations: loopSettings.maxIterations,
8800
+ maxRunInputTokens: loopSettings.maxRunInputTokens,
8801
+ priorTurnInputTokens: turnInputTokens,
8298
8802
  finalResponseGuard: options.finalResponseGuard,
8299
8803
  finalResponseGuardRequestText: messageToPersist,
8300
8804
  ...(options.toolLimits ? { toolLimits: options.toolLimits } : {}),
@@ -8335,94 +8839,100 @@ export function createProductionAgentHandler(
8335
8839
 
8336
8840
  send({ type: "activity", label: "Contacting model" });
8337
8841
 
8338
- // loopUsage is always assigned — either via instrumentAgentLoop or
8339
- // runAgentLoop before use below. The definite-assignment guard is
8340
- // conservative because the try/catch makes the control flow non-obvious.
8341
- let loopUsage: AgentLoopUsage = undefined!;
8342
8842
  let instrumented = false;
8343
8843
  try {
8344
- const { getObservabilityConfig, instrumentAgentLoop } =
8345
- await import("../observability/traces.js");
8346
- const obsConfig = await getObservabilityConfig();
8347
- if (obsConfig.enabled) {
8348
- instrumented = true;
8349
- loopUsage = await instrumentAgentLoop({
8350
- runAgentLoop: runAgentLoopWithMainChatInternalContinuations,
8351
- loopOpts: agentLoopOpts,
8352
- runId,
8353
- threadId: threadId ?? null,
8354
- userId: ownerEmail,
8355
- config: obsConfig,
8356
- metadata: {
8844
+ try {
8845
+ const { getObservabilityConfig, instrumentAgentLoop } =
8846
+ await import("../observability/traces.js");
8847
+ const obsConfig = await getObservabilityConfig();
8848
+ if (obsConfig.enabled) {
8849
+ instrumented = true;
8850
+ await instrumentAgentLoop({
8851
+ runAgentLoop: runAgentLoopWithMainChatInternalContinuations,
8852
+ loopOpts: agentLoopOpts,
8853
+ runId,
8854
+ threadId: threadId ?? null,
8855
+ userId: ownerEmail,
8856
+ config: obsConfig,
8857
+ metadata: {
8858
+ modelSelectionSource,
8859
+ ...(experimentAssignments.length > 0
8860
+ ? { experimentAssignments }
8861
+ : {}),
8862
+ },
8863
+ experimentAssignments,
8357
8864
  modelSelectionSource,
8358
- ...(experimentAssignments.length > 0
8359
- ? { experimentAssignments }
8360
- : {}),
8361
- },
8362
- experimentAssignments,
8363
- modelSelectionSource,
8364
- sentimentInput: shouldInferSentimentForTurn({
8365
- internalContinuation: Boolean(internalContinuation),
8366
- isBackgroundWorker,
8367
- backgroundContinuationCount,
8368
- hasUserText: Boolean(userVisibleSentimentInput),
8369
- })
8370
- ? userVisibleSentimentInput
8371
- : undefined,
8372
- classifyError: () => {
8373
- if (
8374
- agentLoopOpts.signal.aborted &&
8375
- agentLoopOpts.signal.reason === "run_timeout"
8376
- ) {
8377
- return {
8378
- status: "success",
8379
- errorMessage: null,
8380
- metadata: {
8381
- terminalReason: "run_timeout",
8382
- recoverableContinuation: true,
8383
- },
8384
- };
8385
- }
8386
- return null;
8387
- },
8388
- });
8865
+ sentimentInput: shouldInferSentimentForTurn({
8866
+ internalContinuation: Boolean(internalContinuation),
8867
+ isBackgroundWorker,
8868
+ backgroundContinuationCount,
8869
+ hasUserText: Boolean(userVisibleSentimentInput),
8870
+ })
8871
+ ? userVisibleSentimentInput
8872
+ : undefined,
8873
+ classifyError: () => {
8874
+ if (
8875
+ agentLoopOpts.signal.aborted &&
8876
+ agentLoopOpts.signal.reason === "run_timeout"
8877
+ ) {
8878
+ return {
8879
+ status: "success",
8880
+ errorMessage: null,
8881
+ metadata: {
8882
+ terminalReason: "run_timeout",
8883
+ recoverableContinuation: true,
8884
+ },
8885
+ };
8886
+ }
8887
+ return null;
8888
+ },
8889
+ });
8890
+ }
8891
+ } catch (err) {
8892
+ // If instrumentation setup failed, fall through to uninstrumented.
8893
+ // If the agent loop itself failed, re-throw after the outer finally
8894
+ // records any usage events that arrived before the failure.
8895
+ if (instrumented) throw err;
8389
8896
  }
8390
- } catch (err) {
8391
- // If instrumentation setup failed, fall through to uninstrumented.
8392
- // If the agent loop itself failed (via instrumentAgentLoop), re-throw.
8393
- if (instrumented) throw err;
8394
- }
8395
- if (!instrumented) {
8396
- loopUsage =
8897
+ if (!instrumented) {
8397
8898
  await runAgentLoopWithMainChatInternalContinuations(agentLoopOpts);
8398
- }
8399
-
8400
- // Record token usage for cost monitoring so the Usage panel in
8401
- // settings works in every mode, including local dev.
8402
- try {
8403
- const ownerEmail = options.resolveOwnerEmail
8404
- ? await options.resolveOwnerEmail(event)
8405
- : getRequestUserEmail();
8406
- if (
8407
- ownerEmail &&
8408
- (loopUsage.inputTokens > 0 ||
8409
- loopUsage.outputTokens > 0 ||
8410
- loopUsage.cacheReadTokens > 0 ||
8411
- loopUsage.cacheWriteTokens > 0)
8412
- ) {
8413
- const { recordUsage } = await import("../usage/store.js");
8414
- await recordUsage({
8415
- ownerEmail,
8416
- inputTokens: loopUsage.inputTokens,
8417
- outputTokens: loopUsage.outputTokens,
8418
- cacheReadTokens: loopUsage.cacheReadTokens,
8419
- cacheWriteTokens: loopUsage.cacheWriteTokens,
8420
- model: loopUsage.model,
8421
- label: body.usageLabel || "chat",
8422
- });
8423
8899
  }
8424
- } catch {
8425
- // Usage recording failed don't break the run
8900
+ } finally {
8901
+ // Advance and persist usage even when the provider aborts the loop
8902
+ // before its promise resolves; the per-event accumulator is the only
8903
+ // durable view of those partial model calls.
8904
+ turnInputTokens += turnUsage.inputTokens;
8905
+ try {
8906
+ const resolvedOwnerEmail = options.resolveOwnerEmail
8907
+ ? await options.resolveOwnerEmail(event)
8908
+ : getRequestUserEmail();
8909
+ if (
8910
+ resolvedOwnerEmail &&
8911
+ (turnUsage.inputTokens > 0 ||
8912
+ turnUsage.outputTokens > 0 ||
8913
+ turnUsage.cacheReadTokens > 0 ||
8914
+ turnUsage.cacheWriteTokens > 0)
8915
+ ) {
8916
+ const { recordUsage } = await import("../usage/store.js");
8917
+ await recordUsage({
8918
+ ownerEmail: resolvedOwnerEmail,
8919
+ inputTokens: turnUsage.inputTokens,
8920
+ outputTokens: turnUsage.outputTokens,
8921
+ cacheReadTokens: turnUsage.cacheReadTokens,
8922
+ cacheWriteTokens: turnUsage.cacheWriteTokens,
8923
+ model: turnUsage.model,
8924
+ label: body.usageLabel || "chat",
8925
+ // token_usage has had run_id/thread_id/task_id since it was
8926
+ // created and every row was NULL on all three, so no spend could
8927
+ // be tied back to a run, thread, or outcome.
8928
+ runId,
8929
+ threadId: effectiveThreadId,
8930
+ taskId: effectiveTurnId,
8931
+ });
8932
+ }
8933
+ } catch {
8934
+ // Usage recording failed — don't break the run
8935
+ }
8426
8936
  }
8427
8937
  },
8428
8938
  handleRunComplete,