@agent-native/core 0.8.2 → 0.10.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 (305) hide show
  1. package/README.md +4 -4
  2. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  3. package/dist/agent/engine/builder-engine.js +5 -4
  4. package/dist/agent/engine/builder-engine.js.map +1 -1
  5. package/dist/agent/engine/registry.d.ts +6 -3
  6. package/dist/agent/engine/registry.d.ts.map +1 -1
  7. package/dist/agent/engine/registry.js +8 -17
  8. package/dist/agent/engine/registry.js.map +1 -1
  9. package/dist/agent/production-agent.d.ts +1 -1
  10. package/dist/agent/production-agent.d.ts.map +1 -1
  11. package/dist/agent/production-agent.js +28 -11
  12. package/dist/agent/production-agent.js.map +1 -1
  13. package/dist/agent/run-manager.d.ts +10 -0
  14. package/dist/agent/run-manager.d.ts.map +1 -1
  15. package/dist/agent/run-manager.js +89 -7
  16. package/dist/agent/run-manager.js.map +1 -1
  17. package/dist/agent/run-store.d.ts +4 -1
  18. package/dist/agent/run-store.d.ts.map +1 -1
  19. package/dist/agent/run-store.js +6 -5
  20. package/dist/agent/run-store.js.map +1 -1
  21. package/dist/agent/thread-data-builder.d.ts +12 -0
  22. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  23. package/dist/agent/thread-data-builder.js +96 -0
  24. package/dist/agent/thread-data-builder.js.map +1 -1
  25. package/dist/cli/create.d.ts +9 -0
  26. package/dist/cli/create.d.ts.map +1 -1
  27. package/dist/cli/create.js +29 -11
  28. package/dist/cli/create.js.map +1 -1
  29. package/dist/cli/index.js +177 -22
  30. package/dist/cli/index.js.map +1 -1
  31. package/dist/cli/workspace-dev.js +66 -5
  32. package/dist/cli/workspace-dev.js.map +1 -1
  33. package/dist/client/AgentPanel.d.ts.map +1 -1
  34. package/dist/client/AgentPanel.js +6 -20
  35. package/dist/client/AgentPanel.js.map +1 -1
  36. package/dist/client/AssistantChat.d.ts.map +1 -1
  37. package/dist/client/AssistantChat.js +146 -107
  38. package/dist/client/AssistantChat.js.map +1 -1
  39. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  40. package/dist/client/agent-chat-adapter.js +143 -22
  41. package/dist/client/agent-chat-adapter.js.map +1 -1
  42. package/dist/client/agent-sidebar-state.d.ts +3 -0
  43. package/dist/client/agent-sidebar-state.d.ts.map +1 -0
  44. package/dist/client/agent-sidebar-state.js +24 -0
  45. package/dist/client/agent-sidebar-state.js.map +1 -0
  46. package/dist/client/analytics.d.ts +39 -0
  47. package/dist/client/analytics.d.ts.map +1 -1
  48. package/dist/client/analytics.js +74 -0
  49. package/dist/client/analytics.js.map +1 -1
  50. package/dist/client/components/PresenceBar.d.ts.map +1 -1
  51. package/dist/client/components/PresenceBar.js +21 -15
  52. package/dist/client/components/PresenceBar.js.map +1 -1
  53. package/dist/client/components/ui/tooltip.d.ts +2 -1
  54. package/dist/client/components/ui/tooltip.d.ts.map +1 -1
  55. package/dist/client/components/ui/tooltip.js +9 -2
  56. package/dist/client/components/ui/tooltip.js.map +1 -1
  57. package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
  58. package/dist/client/composer/ComposerPlusMenu.js +51 -17
  59. package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
  60. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  61. package/dist/client/composer/PromptComposer.js +30 -0
  62. package/dist/client/composer/PromptComposer.js.map +1 -1
  63. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  64. package/dist/client/composer/TiptapComposer.js +31 -5
  65. package/dist/client/composer/TiptapComposer.js.map +1 -1
  66. package/dist/client/composer/VoiceButton.d.ts.map +1 -1
  67. package/dist/client/composer/VoiceButton.js +9 -8
  68. package/dist/client/composer/VoiceButton.js.map +1 -1
  69. package/dist/client/dev-overlay/DevOverlay.d.ts.map +1 -1
  70. package/dist/client/dev-overlay/DevOverlay.js +4 -3
  71. package/dist/client/dev-overlay/DevOverlay.js.map +1 -1
  72. package/dist/client/error-format.d.ts.map +1 -1
  73. package/dist/client/error-format.js +6 -0
  74. package/dist/client/error-format.js.map +1 -1
  75. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  76. package/dist/client/extensions/EmbeddedExtension.js +14 -3
  77. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  78. package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -1
  79. package/dist/client/extensions/ExtensionEditor.js +6 -5
  80. package/dist/client/extensions/ExtensionEditor.js.map +1 -1
  81. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  82. package/dist/client/extensions/ExtensionSlot.js +2 -1
  83. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  84. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  85. package/dist/client/extensions/ExtensionViewer.js +40 -19
  86. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  87. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  88. package/dist/client/extensions/ExtensionsSidebarSection.js +52 -51
  89. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  90. package/dist/client/index.d.ts +2 -1
  91. package/dist/client/index.d.ts.map +1 -1
  92. package/dist/client/index.js +2 -1
  93. package/dist/client/index.js.map +1 -1
  94. package/dist/client/integrations/IntegrationCard.d.ts.map +1 -1
  95. package/dist/client/integrations/IntegrationCard.js +2 -1
  96. package/dist/client/integrations/IntegrationCard.js.map +1 -1
  97. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
  98. package/dist/client/integrations/IntegrationsPanel.js +3 -2
  99. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  100. package/dist/client/notifications/NotificationsBell.d.ts.map +1 -1
  101. package/dist/client/notifications/NotificationsBell.js +42 -6
  102. package/dist/client/notifications/NotificationsBell.js.map +1 -1
  103. package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
  104. package/dist/client/onboarding/OnboardingPanel.js +3 -2
  105. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  106. package/dist/client/onboarding/SetupButton.d.ts.map +1 -1
  107. package/dist/client/onboarding/SetupButton.js +14 -13
  108. package/dist/client/onboarding/SetupButton.js.map +1 -1
  109. package/dist/client/org/InvitationBanner.d.ts +8 -2
  110. package/dist/client/org/InvitationBanner.d.ts.map +1 -1
  111. package/dist/client/org/InvitationBanner.js +28 -7
  112. package/dist/client/org/InvitationBanner.js.map +1 -1
  113. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  114. package/dist/client/org/OrgSwitcher.js +29 -5
  115. package/dist/client/org/OrgSwitcher.js.map +1 -1
  116. package/dist/client/org/TeamPage.d.ts.map +1 -1
  117. package/dist/client/org/TeamPage.js +9 -7
  118. package/dist/client/org/TeamPage.js.map +1 -1
  119. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  120. package/dist/client/resources/ResourceEditor.js +2 -1
  121. package/dist/client/resources/ResourceEditor.js.map +1 -1
  122. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  123. package/dist/client/resources/ResourcesPanel.js +48 -14
  124. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  125. package/dist/client/resources/use-mcp-servers.d.ts +2 -0
  126. package/dist/client/resources/use-mcp-servers.d.ts.map +1 -1
  127. package/dist/client/resources/use-mcp-servers.js +59 -3
  128. package/dist/client/resources/use-mcp-servers.js.map +1 -1
  129. package/dist/client/settings/AgentsSection.d.ts.map +1 -1
  130. package/dist/client/settings/AgentsSection.js +8 -7
  131. package/dist/client/settings/AgentsSection.js.map +1 -1
  132. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  133. package/dist/client/settings/AutomationsSection.js +4 -3
  134. package/dist/client/settings/AutomationsSection.js.map +1 -1
  135. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  136. package/dist/client/settings/SecretsSection.js +11 -1
  137. package/dist/client/settings/SecretsSection.js.map +1 -1
  138. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  139. package/dist/client/settings/SettingsPanel.js +15 -12
  140. package/dist/client/settings/SettingsPanel.js.map +1 -1
  141. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  142. package/dist/client/settings/VoiceTranscriptionSection.js +13 -30
  143. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  144. package/dist/client/settings/index.d.ts +1 -1
  145. package/dist/client/settings/index.d.ts.map +1 -1
  146. package/dist/client/settings/index.js.map +1 -1
  147. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  148. package/dist/client/settings/useBuilderStatus.js +27 -1
  149. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  150. package/dist/client/sharing/ShareButton.d.ts +4 -0
  151. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  152. package/dist/client/sharing/ShareButton.js +5 -1
  153. package/dist/client/sharing/ShareButton.js.map +1 -1
  154. package/dist/client/sse-event-processor.d.ts +1 -1
  155. package/dist/client/sse-event-processor.d.ts.map +1 -1
  156. package/dist/client/sse-event-processor.js +59 -11
  157. package/dist/client/sse-event-processor.js.map +1 -1
  158. package/dist/client/use-db-sync.d.ts.map +1 -1
  159. package/dist/client/use-db-sync.js +100 -19
  160. package/dist/client/use-db-sync.js.map +1 -1
  161. package/dist/client/use-session.d.ts.map +1 -1
  162. package/dist/client/use-session.js +14 -2
  163. package/dist/client/use-session.js.map +1 -1
  164. package/dist/collab/client.d.ts +1 -0
  165. package/dist/collab/client.d.ts.map +1 -1
  166. package/dist/collab/client.js +18 -1
  167. package/dist/collab/client.js.map +1 -1
  168. package/dist/deploy/build.d.ts.map +1 -1
  169. package/dist/deploy/build.js +5 -0
  170. package/dist/deploy/build.js.map +1 -1
  171. package/dist/deploy/route-discovery.d.ts.map +1 -1
  172. package/dist/deploy/route-discovery.js +1 -0
  173. package/dist/deploy/route-discovery.js.map +1 -1
  174. package/dist/deploy/workspace-core.d.ts +1 -1
  175. package/dist/deploy/workspace-core.d.ts.map +1 -1
  176. package/dist/deploy/workspace-core.js +1 -0
  177. package/dist/deploy/workspace-core.js.map +1 -1
  178. package/dist/extensions/actions.d.ts.map +1 -1
  179. package/dist/extensions/actions.js +17 -3
  180. package/dist/extensions/actions.js.map +1 -1
  181. package/dist/extensions/routes.js +1 -1
  182. package/dist/extensions/routes.js.map +1 -1
  183. package/dist/extensions/schema.d.ts +14 -14
  184. package/dist/extensions/schema.d.ts.map +1 -1
  185. package/dist/extensions/schema.js +4 -4
  186. package/dist/extensions/schema.js.map +1 -1
  187. package/dist/extensions/store.d.ts.map +1 -1
  188. package/dist/extensions/store.js +23 -0
  189. package/dist/extensions/store.js.map +1 -1
  190. package/dist/extensions/theme.d.ts +8 -1
  191. package/dist/extensions/theme.d.ts.map +1 -1
  192. package/dist/extensions/theme.js +43 -34
  193. package/dist/extensions/theme.js.map +1 -1
  194. package/dist/mcp-client/routes.d.ts +1 -0
  195. package/dist/mcp-client/routes.d.ts.map +1 -1
  196. package/dist/mcp-client/routes.js +28 -1
  197. package/dist/mcp-client/routes.js.map +1 -1
  198. package/dist/org/auto-join-domain.d.ts +28 -0
  199. package/dist/org/auto-join-domain.d.ts.map +1 -0
  200. package/dist/org/auto-join-domain.js +92 -0
  201. package/dist/org/auto-join-domain.js.map +1 -0
  202. package/dist/org/index.d.ts +2 -0
  203. package/dist/org/index.d.ts.map +1 -1
  204. package/dist/org/index.js +1 -0
  205. package/dist/org/index.js.map +1 -1
  206. package/dist/scripts/db/exec.d.ts.map +1 -1
  207. package/dist/scripts/db/exec.js +27 -1
  208. package/dist/scripts/db/exec.js.map +1 -1
  209. package/dist/scripts/db/index.d.ts.map +1 -1
  210. package/dist/scripts/db/index.js +1 -0
  211. package/dist/scripts/db/index.js.map +1 -1
  212. package/dist/scripts/db/reset-dev-owner.d.ts +27 -0
  213. package/dist/scripts/db/reset-dev-owner.d.ts.map +1 -0
  214. package/dist/scripts/db/reset-dev-owner.js +225 -0
  215. package/dist/scripts/db/reset-dev-owner.js.map +1 -0
  216. package/dist/scripts/db/scoping.d.ts.map +1 -1
  217. package/dist/scripts/db/scoping.js +15 -30
  218. package/dist/scripts/db/scoping.js.map +1 -1
  219. package/dist/scripts/dev-session.d.ts +46 -0
  220. package/dist/scripts/dev-session.d.ts.map +1 -0
  221. package/dist/scripts/dev-session.js +81 -0
  222. package/dist/scripts/dev-session.js.map +1 -0
  223. package/dist/scripts/runner.d.ts.map +1 -1
  224. package/dist/scripts/runner.js +21 -0
  225. package/dist/scripts/runner.js.map +1 -1
  226. package/dist/secrets/register.d.ts +1 -1
  227. package/dist/secrets/register.d.ts.map +1 -1
  228. package/dist/secrets/register.js +4 -2
  229. package/dist/secrets/register.js.map +1 -1
  230. package/dist/secrets/routes.d.ts.map +1 -1
  231. package/dist/secrets/routes.js +32 -0
  232. package/dist/secrets/routes.js.map +1 -1
  233. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  234. package/dist/server/agent-chat-plugin.js +77 -102
  235. package/dist/server/agent-chat-plugin.js.map +1 -1
  236. package/dist/server/auth.d.ts.map +1 -1
  237. package/dist/server/auth.js +33 -0
  238. package/dist/server/auth.js.map +1 -1
  239. package/dist/server/better-auth-instance.d.ts.map +1 -1
  240. package/dist/server/better-auth-instance.js +11 -0
  241. package/dist/server/better-auth-instance.js.map +1 -1
  242. package/dist/server/builder-browser.d.ts.map +1 -1
  243. package/dist/server/builder-browser.js +169 -68
  244. package/dist/server/builder-browser.js.map +1 -1
  245. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  246. package/dist/server/core-routes-plugin.js +56 -13
  247. package/dist/server/core-routes-plugin.js.map +1 -1
  248. package/dist/server/credential-provider.d.ts +49 -6
  249. package/dist/server/credential-provider.d.ts.map +1 -1
  250. package/dist/server/credential-provider.js +133 -38
  251. package/dist/server/credential-provider.js.map +1 -1
  252. package/dist/server/design-token-utils.d.ts +13 -2
  253. package/dist/server/design-token-utils.d.ts.map +1 -1
  254. package/dist/server/design-token-utils.js +48 -16
  255. package/dist/server/design-token-utils.js.map +1 -1
  256. package/dist/server/framework-request-handler.d.ts.map +1 -1
  257. package/dist/server/framework-request-handler.js +31 -0
  258. package/dist/server/framework-request-handler.js.map +1 -1
  259. package/dist/server/google-realtime-session.d.ts.map +1 -1
  260. package/dist/server/google-realtime-session.js +19 -6
  261. package/dist/server/google-realtime-session.js.map +1 -1
  262. package/dist/server/index.d.ts +2 -0
  263. package/dist/server/index.d.ts.map +1 -1
  264. package/dist/server/index.js +2 -0
  265. package/dist/server/index.js.map +1 -1
  266. package/dist/server/onboarding-html.d.ts.map +1 -1
  267. package/dist/server/onboarding-html.js +142 -14
  268. package/dist/server/onboarding-html.js.map +1 -1
  269. package/dist/server/request-context.d.ts +17 -0
  270. package/dist/server/request-context.d.ts.map +1 -1
  271. package/dist/server/request-context.js +40 -1
  272. package/dist/server/request-context.js.map +1 -1
  273. package/dist/server/sentry-plugin.d.ts +11 -0
  274. package/dist/server/sentry-plugin.d.ts.map +1 -0
  275. package/dist/server/sentry-plugin.js +116 -0
  276. package/dist/server/sentry-plugin.js.map +1 -0
  277. package/dist/server/sentry.d.ts +92 -0
  278. package/dist/server/sentry.d.ts.map +1 -0
  279. package/dist/server/sentry.js +287 -0
  280. package/dist/server/sentry.js.map +1 -0
  281. package/dist/server/transcribe-voice.d.ts +2 -4
  282. package/dist/server/transcribe-voice.d.ts.map +1 -1
  283. package/dist/server/transcribe-voice.js +4 -16
  284. package/dist/server/transcribe-voice.js.map +1 -1
  285. package/dist/server/voice-providers-status.d.ts.map +1 -1
  286. package/dist/server/voice-providers-status.js +19 -35
  287. package/dist/server/voice-providers-status.js.map +1 -1
  288. package/dist/styles/agent-native.css +15 -0
  289. package/docs/content/cloneable-saas.md +7 -9
  290. package/docs/content/deployment.md +6 -2
  291. package/docs/content/dispatch.md +1 -1
  292. package/docs/content/extensions.md +177 -142
  293. package/docs/content/faq.md +2 -2
  294. package/docs/content/getting-started.md +13 -11
  295. package/docs/content/multi-app-workspace.md +2 -2
  296. package/docs/content/observability.md +47 -0
  297. package/docs/content/pure-agent-apps.md +1 -1
  298. package/docs/content/template-clips.md +3 -3
  299. package/docs/content/template-design.md +3 -3
  300. package/docs/content/template-dispatch.md +1 -1
  301. package/docs/content/template-forms.md +1 -1
  302. package/docs/content/template-mail.md +1 -1
  303. package/docs/content/what-is-agent-native.md +4 -4
  304. package/docs/content/workspace.md +1 -1
  305. package/package.json +1 -1
@@ -9,7 +9,7 @@ import { attachToolSearch } from "../agent/tool-search.js";
9
9
  import { McpClientManager, loadMcpConfig, autoDetectMcpConfig, mcpToolsToActionEntries, syncMcpActionEntries, mountMcpServersRoutes, mountMcpHubRoutes, buildMergedConfig, getHubStatus, isHubServeEnabled, } from "../mcp-client/index.js";
10
10
  import { discoverAgents } from "./agent-discovery.js";
11
11
  import { loadSchemaPromptBlock } from "./schema-prompt.js";
12
- import { buildAssistantMessage, extractThreadMeta, } from "../agent/thread-data-builder.js";
12
+ import { buildAssistantMessage, extractThreadMeta, upsertAssistantMessage, } from "../agent/thread-data-builder.js";
13
13
  import { defineEventHandler, setResponseStatus, setResponseHeader, getMethod, getQuery, getHeader, } from "h3";
14
14
  import { getSession } from "./auth.js";
15
15
  import { getOrigin } from "./google-oauth.js";
@@ -768,7 +768,7 @@ function createBuilderBrowserTool(deps) {
768
768
  return {
769
769
  "connect-builder": {
770
770
  tool: {
771
- description: "Render a Builder.io card inline in the chat. Call this IMMEDIATELY — no exploration, no planning — whenever (a) the user asks to add a feature, change the UI, edit code, create a component, add a route, add an integration, fix a bug in the app itself, or anything else that requires source-file edits while in hosted/production mode, OR (b) the user needs Builder for LLM access, browser automation, or any other Builder-gated capability. If Builder is already connected, the card shows a 'Send to Builder' button that hands the work off to Builder's cloud agent and returns a branch URL. When you call this for a code-change request, pass the user's request verbatim as the `prompt` arg so the card can forward it to Builder unchanged.",
771
+ description: "Render a Builder.io card inline in the chat. Call this IMMEDIATELY — no exploration, no planning — when the user asks to modify the APP'S OWN SOURCE CODE: add a feature, change the UI chrome, edit a React component, add a route, add an integration, fix a bug in the app itself, or anything else that requires source-file edits while in hosted/production mode. Do NOT call this for content the app is meant to produce — creating a video, generating a design, drafting an email, building a slide deck, making a dashboard, etc. — those run through the app's own domain actions, not Builder. Do NOT mention 'click Send to Builder' in your response unless this card is already in the conversation. If Builder is already connected, the card shows a 'Send to Builder' button that hands the work off to Builder's cloud agent and returns a branch URL. When you call this for a code-change request, pass the user's request verbatim as the `prompt` arg so the card can forward it to Builder unchanged.",
772
772
  parameters: {
773
773
  type: "object",
774
774
  properties: {
@@ -2599,37 +2599,7 @@ export function createAgentChatPlugin(options) {
2599
2599
  }
2600
2600
  if (!Array.isArray(repo.messages))
2601
2601
  repo.messages = [];
2602
- const lastMsg = repo.messages[repo.messages.length - 1];
2603
- // Check both wrapped ({ message: { role } }) and unwrapped ({ role }) formats
2604
- const lastRole = lastMsg?.message?.role ?? lastMsg?.role;
2605
- const lastContent = lastMsg?.message?.content ?? lastMsg?.content;
2606
- const lastContentIsEmpty = Array.isArray(lastContent)
2607
- ? lastContent.length === 0
2608
- : lastContent == null || lastContent === "";
2609
- if (lastRole === "assistant" && !lastContentIsEmpty) {
2610
- // Frontend already saved the assistant response — just bump timestamp
2611
- await updateThreadData(threadId, thread.threadData, thread.title, thread.preview, thread.messageCount);
2612
- return;
2613
- }
2614
- if (lastRole === "assistant" && lastContentIsEmpty) {
2615
- // The frontend wrote an empty assistant placeholder before the stream
2616
- // had any content (common when the user reloads mid-run, and the 5s
2617
- // periodic save raced with the first text chunk). Replace it with
2618
- // the server's reconstructed message so the turn isn't lost.
2619
- repo.messages.pop();
2620
- }
2621
- // Determine if repo uses wrapped format ({ message, parentId }) or flat format
2622
- const isWrapped = lastMsg && "message" in lastMsg;
2623
- if (isWrapped) {
2624
- const parentId = repo.messages.length > 0
2625
- ? (repo.messages[repo.messages.length - 1].message?.id ??
2626
- null)
2627
- : null;
2628
- repo.messages.push({ message: assistantMsg, parentId });
2629
- }
2630
- else {
2631
- repo.messages.push(assistantMsg);
2632
- }
2602
+ repo = upsertAssistantMessage(repo, assistantMsg);
2633
2603
  // Store debug metadata so we can inspect what the LLM actually
2634
2604
  // received (system prompt, model, engine) when diagnosing issues.
2635
2605
  const runCtx = getRequestRunContext();
@@ -2646,86 +2616,91 @@ export function createAgentChatPlugin(options) {
2646
2616
  // Best-effort — don't break cleanup
2647
2617
  }
2648
2618
  });
2649
- // Emit agent.turn.completed for automation triggers.
2650
- //
2651
- // SECURITY: include `owner` so the trigger dispatcher's tenant-scope
2652
- // check engages (see triggers/dispatcher.ts:212-218). Without an
2653
- // owner, every user's matching `agent.turn.completed` trigger
2654
- // would fire when ANY user's chat turn completes — cross-tenant
2655
- // fan-out (audit 12 #9). Owner comes from the thread row when
2656
- // available (most reliable; persisted at thread create time),
2657
- // falling back to the current run context's owner. If neither
2658
- // resolves we skip emission entirely rather than emit unowned.
2659
- try {
2660
- let ownerEmail;
2619
+ // Keep SQL run completion gated only on durable thread data. Follow-up
2620
+ // hooks are useful, but they should never leave agent_runs stuck
2621
+ // "running" if an automation/checkpoint path stalls.
2622
+ void (async () => {
2623
+ // Emit agent.turn.completed for automation triggers.
2624
+ //
2625
+ // SECURITY: include `owner` so the trigger dispatcher's tenant-scope
2626
+ // check engages (see triggers/dispatcher.ts:212-218). Without an
2627
+ // owner, every user's matching `agent.turn.completed` trigger
2628
+ // would fire when ANY user's chat turn completes — cross-tenant
2629
+ // fan-out (audit 12 #9). Owner comes from the thread row when
2630
+ // available (most reliable; persisted at thread create time),
2631
+ // falling back to the current run context's owner. If neither
2632
+ // resolves we skip emission entirely rather than emit unowned.
2661
2633
  try {
2662
- const ownerThread = await getThread(threadId);
2663
- ownerEmail = ownerThread?.ownerEmail;
2634
+ let ownerEmail;
2635
+ try {
2636
+ const ownerThread = await getThread(threadId);
2637
+ ownerEmail = ownerThread?.ownerEmail;
2638
+ }
2639
+ catch {
2640
+ // ignore — fall through to run-context owner
2641
+ }
2642
+ if (!ownerEmail) {
2643
+ ownerEmail = getRequestRunContext()?.owner;
2644
+ }
2645
+ if (ownerEmail) {
2646
+ const { emit } = await import("../event-bus/index.js");
2647
+ emit("agent.turn.completed", { threadId, model: resolvedModel }, { owner: ownerEmail });
2648
+ }
2664
2649
  }
2665
2650
  catch {
2666
- // ignore fall through to run-context owner
2667
- }
2668
- if (!ownerEmail) {
2669
- ownerEmail = getRequestRunContext()?.owner;
2651
+ // Event bus not available skip
2670
2652
  }
2671
- if (ownerEmail) {
2672
- const { emit } = await import("../event-bus/index.js");
2673
- emit("agent.turn.completed", { threadId, model: resolvedModel }, { owner: ownerEmail });
2674
- }
2675
- }
2676
- catch {
2677
- // Event bus not available — skip
2678
- }
2679
- // Auto-checkpoint in dev mode after file-modifying agent turns
2680
- if (isDevMode()) {
2681
- try {
2682
- const { createCheckpoint: gitCheckpoint, isGitRepo, hasUncommittedChanges, getChangedFileNames, } = await import("../checkpoints/service.js");
2683
- const cwd = process.cwd();
2684
- if (isGitRepo(cwd) && hasUncommittedChanges(cwd)) {
2685
- let summary = "";
2686
- // Try to extract the first sentence of the assistant's text response
2687
- let assistantText = "";
2688
- for (const { event } of run.events ?? []) {
2689
- if (event.type === "text" && typeof event.text === "string") {
2690
- assistantText += event.text;
2653
+ // Auto-checkpoint in dev mode after file-modifying agent turns
2654
+ if (isDevMode()) {
2655
+ try {
2656
+ const { createCheckpoint: gitCheckpoint, isGitRepo, hasUncommittedChanges, getChangedFileNames, } = await import("../checkpoints/service.js");
2657
+ const cwd = process.cwd();
2658
+ if (isGitRepo(cwd) && hasUncommittedChanges(cwd)) {
2659
+ let summary = "";
2660
+ // Try to extract the first sentence of the assistant's text response
2661
+ let assistantText = "";
2662
+ for (const { event } of run.events ?? []) {
2663
+ if (event.type === "text" && typeof event.text === "string") {
2664
+ assistantText += event.text;
2665
+ }
2691
2666
  }
2692
- }
2693
- assistantText = assistantText.trim();
2694
- if (assistantText) {
2695
- const firstSentence = assistantText
2696
- .split(/(?<=[.!?\n])\s/)[0]
2697
- ?.replace(/\n/g, " ")
2698
- .trim();
2699
- if (firstSentence && firstSentence.length <= 120) {
2700
- summary = firstSentence;
2667
+ assistantText = assistantText.trim();
2668
+ if (assistantText) {
2669
+ const firstSentence = assistantText
2670
+ .split(/(?<=[.!?\n])\s/)[0]
2671
+ ?.replace(/\n/g, " ")
2672
+ .trim();
2673
+ if (firstSentence && firstSentence.length <= 120) {
2674
+ summary = firstSentence;
2675
+ }
2676
+ else if (firstSentence) {
2677
+ summary = firstSentence.slice(0, 117) + "...";
2678
+ }
2701
2679
  }
2702
- else if (firstSentence) {
2703
- summary = firstSentence.slice(0, 117) + "...";
2680
+ // Fall back to listing changed files
2681
+ if (!summary) {
2682
+ const files = getChangedFileNames(cwd);
2683
+ if (files.length > 0) {
2684
+ summary = `Update ${files.join(", ")}`;
2685
+ }
2704
2686
  }
2705
- }
2706
- // Fall back to listing changed files
2707
- if (!summary) {
2708
- const files = getChangedFileNames(cwd);
2709
- if (files.length > 0) {
2710
- summary = `Update ${files.join(", ")}`;
2687
+ if (!summary)
2688
+ summary = "Agent turn";
2689
+ if (summary.length > 120)
2690
+ summary = summary.slice(0, 117) + "...";
2691
+ const sha = gitCheckpoint(cwd, summary);
2692
+ if (sha) {
2693
+ const { insertCheckpoint } = await import("../checkpoints/store.js");
2694
+ const cpId = `cp-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
2695
+ await insertCheckpoint(cpId, threadId, run.runId, sha, summary);
2711
2696
  }
2712
2697
  }
2713
- if (!summary)
2714
- summary = "Agent turn";
2715
- if (summary.length > 120)
2716
- summary = summary.slice(0, 117) + "...";
2717
- const sha = gitCheckpoint(cwd, summary);
2718
- if (sha) {
2719
- const { insertCheckpoint } = await import("../checkpoints/store.js");
2720
- const cpId = `cp-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
2721
- await insertCheckpoint(cpId, threadId, run.runId, sha, summary);
2722
- }
2698
+ }
2699
+ catch {
2700
+ // Checkpointing is best-effort — never break the run
2723
2701
  }
2724
2702
  }
2725
- catch {
2726
- // Checkpointing is best-effort — never break the run
2727
- }
2728
- }
2703
+ })();
2729
2704
  };
2730
2705
  // ─── Agent Teams: per-run send reference ─────────────────────────
2731
2706
  // Team tools need to emit events to the parent chat's SSE stream.