@agent-native/core 0.118.0 → 0.119.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 (480) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +32 -0
  3. package/corpus/core/docs/content/a2a-protocol.mdx +15 -0
  4. package/corpus/core/docs/content/template-chat.mdx +1 -1
  5. package/corpus/core/docs/content/template-plan.mdx +3 -3
  6. package/corpus/core/package.json +1 -1
  7. package/corpus/core/src/a2a/activity.ts +371 -0
  8. package/corpus/core/src/a2a/client.ts +35 -11
  9. package/corpus/core/src/a2a/index.ts +21 -0
  10. package/corpus/core/src/a2a/types.ts +8 -0
  11. package/corpus/core/src/agent/model-config.ts +19 -23
  12. package/corpus/core/src/agent/production-agent.ts +167 -100
  13. package/corpus/core/src/agent/types.ts +16 -1
  14. package/corpus/core/src/cli/index.ts +18 -10
  15. package/corpus/core/src/cli/multi-frontier-runs.ts +5 -3
  16. package/corpus/core/src/cli/templates-meta.ts +0 -12
  17. package/corpus/core/src/cli/workspace-dev.ts +1 -1
  18. package/corpus/core/src/client/AgentPanel.tsx +9 -1
  19. package/corpus/core/src/client/RunStuckBanner.tsx +39 -47
  20. package/corpus/core/src/client/chat/action-chat-ui-surface.tsx +32 -0
  21. package/corpus/core/src/client/chat/message-components.tsx +53 -8
  22. package/corpus/core/src/client/chat/tool-call-display.tsx +214 -44
  23. package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
  24. package/corpus/core/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
  25. package/corpus/core/src/client/chat-model-groups.ts +67 -27
  26. package/corpus/core/src/client/conversation/AgentConversation.tsx +12 -1
  27. package/corpus/core/src/client/error-capture.ts +2 -6
  28. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +20 -14
  29. package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
  30. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +7 -17
  31. package/corpus/core/src/client/resources/mcp-integration-logos.ts +2 -2
  32. package/corpus/core/src/client/route-chunk-recovery.ts +5 -3
  33. package/corpus/core/src/client/session-replay.ts +3 -3
  34. package/corpus/core/src/client/settings/SettingsPanel.tsx +15 -6
  35. package/corpus/core/src/client/sharing/ShareButton.tsx +1 -27
  36. package/corpus/core/src/client/sharing/ShareDialog.tsx +0 -16
  37. package/corpus/core/src/client/sharing/useShareButtonController.ts +0 -7
  38. package/corpus/core/src/client/sharing/useShareDialogController.ts +0 -2
  39. package/corpus/core/src/client/sse-event-processor.ts +85 -1
  40. package/corpus/core/src/client/transcription/use-live-transcription.ts +64 -45
  41. package/corpus/core/src/deploy/build.ts +2 -1
  42. package/corpus/core/src/guards/db-tool-scoping.ts +1 -1
  43. package/corpus/core/src/integrations/adapters/slack.ts +84 -5
  44. package/corpus/core/src/integrations/index.ts +5 -1
  45. package/corpus/core/src/localization/default-messages.ts +7 -1
  46. package/corpus/core/src/mcp-client/oauth-routes.ts +45 -12
  47. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +1 -18
  48. package/corpus/core/src/scripts/call-agent.ts +49 -6
  49. package/corpus/core/src/server/agent-chat-plugin.ts +50 -10
  50. package/corpus/core/src/server/realtime-voice.ts +4 -1
  51. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
  52. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  53. package/corpus/core/src/terminal/cli-registry.ts +1 -1
  54. package/corpus/core/src/vite/client.ts +166 -1
  55. package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +13 -1
  56. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +10 -0
  57. package/corpus/templates/analytics/changelog/2026-07-22-show-a-useful-error-when-saving-a-dashboard-view-fails.md +6 -0
  58. package/corpus/templates/brain/app/routes/sources.tsx +181 -114
  59. package/corpus/templates/clips/AGENTS.md +8 -6
  60. package/corpus/templates/clips/actions/request-transcript.ts +90 -420
  61. package/corpus/templates/clips/actions/save-browser-transcript.ts +11 -28
  62. package/corpus/templates/clips/app/components/capture-install-options.tsx +5 -3
  63. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +3 -136
  64. package/corpus/templates/clips/app/lib/capture-install-options.ts +15 -4
  65. package/corpus/templates/clips/app/routes/download.tsx +3 -2
  66. package/corpus/templates/clips/changelog/2026-07-22-fixed-an-intermittent-hydration-error-on-the-download-page.md +6 -0
  67. package/corpus/templates/clips/changelog/2026-07-22-fixed-transcript-generation-when-native-speech-capture-retur.md +6 -0
  68. package/corpus/templates/clips/changelog/2026-07-22-transcript-generation-now-retries-with-backup-speech-recogni.md +6 -0
  69. package/corpus/templates/clips/changelog/2026-07-23-fixed-recordings-failing-to-save-with-a-cancelled-or-cleanup.md +6 -0
  70. package/corpus/templates/clips/server/lib/public-agent-context.ts +2 -2
  71. package/corpus/templates/clips/server/plugins/db.ts +9 -1
  72. package/corpus/templates/clips/server/register-secrets.ts +7 -6
  73. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +16 -84
  74. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +13 -7
  75. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +2 -2
  76. package/corpus/templates/content/app/i18n-data.ts +10 -0
  77. package/corpus/templates/design/server/lib/fig-file-decoder.ts +1 -0
  78. package/corpus/templates/plan/app/entry.client.tsx +3 -0
  79. package/corpus/templates/plan/changelog/2026-07-22-recover-stale-pages-after-a-deployment-refresh-automatically.md +6 -0
  80. package/corpus/templates/slides/app/hooks/use-agent-generating.ts +10 -3
  81. package/corpus/templates/slides/app/pages/Index.tsx +1 -0
  82. package/corpus/templates/slides/changelog/2026-07-22-new-deck-prompts-now-open-in-their-own-visible-chat-thread.md +6 -0
  83. package/corpus/toolkit/CHANGELOG.md +9 -0
  84. package/corpus/toolkit/package.json +1 -1
  85. package/corpus/toolkit/src/composer/PromptComposer.tsx +5 -1
  86. package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +119 -31
  87. package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +30 -0
  88. package/corpus/toolkit/src/conformance/runner.tsx +153 -1
  89. package/corpus/toolkit/src/editor/SharedRichEditor.tsx +13 -2
  90. package/corpus/toolkit/src/editor/SlashCommandMenu.tsx +20 -0
  91. package/corpus/toolkit/src/editor/index.ts +2 -0
  92. package/corpus/toolkit/src/styles.css +52 -23
  93. package/dist/a2a/activity.d.ts +50 -0
  94. package/dist/a2a/activity.d.ts.map +1 -0
  95. package/dist/a2a/activity.js +236 -0
  96. package/dist/a2a/activity.js.map +1 -0
  97. package/dist/a2a/client.d.ts +5 -1
  98. package/dist/a2a/client.d.ts.map +1 -1
  99. package/dist/a2a/client.js +18 -13
  100. package/dist/a2a/client.js.map +1 -1
  101. package/dist/a2a/index.d.ts +2 -1
  102. package/dist/a2a/index.d.ts.map +1 -1
  103. package/dist/a2a/index.js +1 -0
  104. package/dist/a2a/index.js.map +1 -1
  105. package/dist/a2a/types.d.ts +1 -0
  106. package/dist/a2a/types.d.ts.map +1 -1
  107. package/dist/a2a/types.js.map +1 -1
  108. package/dist/agent/engine/anthropic-engine.d.ts +1 -1
  109. package/dist/agent/engine/builder-engine.d.ts +2 -2
  110. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  111. package/dist/agent/model-config.d.ts +16 -16
  112. package/dist/agent/model-config.d.ts.map +1 -1
  113. package/dist/agent/model-config.js +19 -23
  114. package/dist/agent/model-config.js.map +1 -1
  115. package/dist/agent/production-agent.d.ts +26 -0
  116. package/dist/agent/production-agent.d.ts.map +1 -1
  117. package/dist/agent/production-agent.js +137 -80
  118. package/dist/agent/production-agent.js.map +1 -1
  119. package/dist/agent/types.d.ts +10 -0
  120. package/dist/agent/types.d.ts.map +1 -1
  121. package/dist/agent/types.js.map +1 -1
  122. package/dist/cli/index.js +18 -8
  123. package/dist/cli/index.js.map +1 -1
  124. package/dist/cli/multi-frontier-runs.js +3 -3
  125. package/dist/cli/multi-frontier-runs.js.map +1 -1
  126. package/dist/cli/templates-meta.d.ts.map +1 -1
  127. package/dist/cli/templates-meta.js +0 -12
  128. package/dist/cli/templates-meta.js.map +1 -1
  129. package/dist/cli/workspace-dev.js +1 -1
  130. package/dist/cli/workspace-dev.js.map +1 -1
  131. package/dist/client/AgentPanel.d.ts.map +1 -1
  132. package/dist/client/AgentPanel.js +4 -1
  133. package/dist/client/AgentPanel.js.map +1 -1
  134. package/dist/client/RunStuckBanner.d.ts +3 -5
  135. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  136. package/dist/client/RunStuckBanner.js +17 -18
  137. package/dist/client/RunStuckBanner.js.map +1 -1
  138. package/dist/client/chat/action-chat-ui-surface.d.ts +8 -0
  139. package/dist/client/chat/action-chat-ui-surface.d.ts.map +1 -0
  140. package/dist/client/chat/action-chat-ui-surface.js +10 -0
  141. package/dist/client/chat/action-chat-ui-surface.js.map +1 -0
  142. package/dist/client/chat/message-components.d.ts +3 -0
  143. package/dist/client/chat/message-components.d.ts.map +1 -1
  144. package/dist/client/chat/message-components.js +40 -7
  145. package/dist/client/chat/message-components.js.map +1 -1
  146. package/dist/client/chat/tool-call-display.d.ts +3 -1
  147. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  148. package/dist/client/chat/tool-call-display.js +76 -23
  149. package/dist/client/chat/tool-call-display.js.map +1 -1
  150. package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -1
  151. package/dist/client/chat/widgets/InlineExtensionWidget.js +1 -1
  152. package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -1
  153. package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
  154. package/dist/client/chat/widgets/builtin-tool-renderers.js +5 -3
  155. package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
  156. package/dist/client/chat-model-groups.d.ts.map +1 -1
  157. package/dist/client/chat-model-groups.js +44 -21
  158. package/dist/client/chat-model-groups.js.map +1 -1
  159. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  160. package/dist/client/conversation/AgentConversation.js +3 -2
  161. package/dist/client/conversation/AgentConversation.js.map +1 -1
  162. package/dist/client/error-capture.d.ts.map +1 -1
  163. package/dist/client/error-capture.js +2 -2
  164. package/dist/client/error-capture.js.map +1 -1
  165. package/dist/client/resources/McpConnectionSuggestion.d.ts +1 -0
  166. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  167. package/dist/client/resources/McpConnectionSuggestion.js +9 -8
  168. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  169. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  170. package/dist/client/resources/ResourcesPanel.js +3 -1
  171. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  172. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  173. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  174. package/dist/client/resources/mcp-integration-catalog.js +4 -17
  175. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  176. package/dist/client/resources/mcp-integration-logos.js +2 -2
  177. package/dist/client/resources/mcp-integration-logos.js.map +1 -1
  178. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  179. package/dist/client/route-chunk-recovery.js +5 -3
  180. package/dist/client/route-chunk-recovery.js.map +1 -1
  181. package/dist/client/session-replay.js +3 -3
  182. package/dist/client/session-replay.js.map +1 -1
  183. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  184. package/dist/client/settings/SettingsPanel.js +2 -2
  185. package/dist/client/settings/SettingsPanel.js.map +1 -1
  186. package/dist/client/sharing/ShareButton.d.ts +1 -1
  187. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  188. package/dist/client/sharing/ShareButton.js +3 -4
  189. package/dist/client/sharing/ShareButton.js.map +1 -1
  190. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  191. package/dist/client/sharing/ShareDialog.js +1 -2
  192. package/dist/client/sharing/ShareDialog.js.map +1 -1
  193. package/dist/client/sharing/useShareButtonController.d.ts +0 -1
  194. package/dist/client/sharing/useShareButtonController.d.ts.map +1 -1
  195. package/dist/client/sharing/useShareButtonController.js +0 -6
  196. package/dist/client/sharing/useShareButtonController.js.map +1 -1
  197. package/dist/client/sharing/useShareDialogController.d.ts +0 -1
  198. package/dist/client/sharing/useShareDialogController.d.ts.map +1 -1
  199. package/dist/client/sharing/useShareDialogController.js +0 -1
  200. package/dist/client/sharing/useShareDialogController.js.map +1 -1
  201. package/dist/client/sse-event-processor.d.ts +12 -0
  202. package/dist/client/sse-event-processor.d.ts.map +1 -1
  203. package/dist/client/sse-event-processor.js +63 -1
  204. package/dist/client/sse-event-processor.js.map +1 -1
  205. package/dist/client/transcription/use-live-transcription.d.ts +3 -3
  206. package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
  207. package/dist/client/transcription/use-live-transcription.js +22 -11
  208. package/dist/client/transcription/use-live-transcription.js.map +1 -1
  209. package/dist/collab/awareness.d.ts +2 -2
  210. package/dist/collab/awareness.d.ts.map +1 -1
  211. package/dist/deploy/build.d.ts.map +1 -1
  212. package/dist/deploy/build.js +1 -1
  213. package/dist/deploy/build.js.map +1 -1
  214. package/dist/guards/db-tool-scoping.js +1 -1
  215. package/dist/guards/db-tool-scoping.js.map +1 -1
  216. package/dist/integrations/adapters/slack.d.ts +1 -0
  217. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  218. package/dist/integrations/adapters/slack.js +61 -5
  219. package/dist/integrations/adapters/slack.js.map +1 -1
  220. package/dist/integrations/index.d.ts +1 -1
  221. package/dist/integrations/index.d.ts.map +1 -1
  222. package/dist/integrations/index.js +1 -1
  223. package/dist/integrations/index.js.map +1 -1
  224. package/dist/localization/default-messages.d.ts +6 -0
  225. package/dist/localization/default-messages.d.ts.map +1 -1
  226. package/dist/localization/default-messages.js +7 -1
  227. package/dist/localization/default-messages.js.map +1 -1
  228. package/dist/mcp-client/oauth-routes.d.ts +3 -0
  229. package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
  230. package/dist/mcp-client/oauth-routes.js +41 -12
  231. package/dist/mcp-client/oauth-routes.js.map +1 -1
  232. package/dist/observability/routes.d.ts +3 -3
  233. package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
  234. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  235. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  236. package/dist/scripts/agent-engines/list-agent-engines.js +1 -18
  237. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  238. package/dist/scripts/call-agent.d.ts.map +1 -1
  239. package/dist/scripts/call-agent.js +49 -6
  240. package/dist/scripts/call-agent.js.map +1 -1
  241. package/dist/secrets/routes.d.ts +6 -6
  242. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  243. package/dist/server/agent-chat-plugin.js +38 -10
  244. package/dist/server/agent-chat-plugin.js.map +1 -1
  245. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  246. package/dist/server/realtime-voice.d.ts.map +1 -1
  247. package/dist/server/realtime-voice.js +1 -1
  248. package/dist/server/realtime-voice.js.map +1 -1
  249. package/dist/server/transcribe-voice.d.ts +1 -1
  250. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
  251. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  252. package/dist/terminal/cli-registry.js +1 -1
  253. package/dist/terminal/cli-registry.js.map +1 -1
  254. package/dist/vite/client.d.ts +8 -1
  255. package/dist/vite/client.d.ts.map +1 -1
  256. package/dist/vite/client.js +113 -2
  257. package/dist/vite/client.js.map +1 -1
  258. package/docs/content/a2a-protocol.mdx +15 -0
  259. package/docs/content/template-chat.mdx +1 -1
  260. package/docs/content/template-plan.mdx +3 -3
  261. package/package.json +2 -2
  262. package/src/a2a/activity.ts +371 -0
  263. package/src/a2a/client.ts +35 -11
  264. package/src/a2a/index.ts +21 -0
  265. package/src/a2a/types.ts +8 -0
  266. package/src/agent/model-config.ts +19 -23
  267. package/src/agent/production-agent.ts +167 -100
  268. package/src/agent/types.ts +16 -1
  269. package/src/cli/index.ts +18 -10
  270. package/src/cli/multi-frontier-runs.ts +5 -3
  271. package/src/cli/templates-meta.ts +0 -12
  272. package/src/cli/workspace-dev.ts +1 -1
  273. package/src/client/AgentPanel.tsx +9 -1
  274. package/src/client/RunStuckBanner.tsx +39 -47
  275. package/src/client/chat/action-chat-ui-surface.tsx +32 -0
  276. package/src/client/chat/message-components.tsx +53 -8
  277. package/src/client/chat/tool-call-display.tsx +214 -44
  278. package/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
  279. package/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
  280. package/src/client/chat-model-groups.ts +67 -27
  281. package/src/client/conversation/AgentConversation.tsx +12 -1
  282. package/src/client/error-capture.ts +2 -6
  283. package/src/client/resources/McpConnectionSuggestion.tsx +20 -14
  284. package/src/client/resources/ResourcesPanel.tsx +5 -1
  285. package/src/client/resources/mcp-integration-catalog.ts +7 -17
  286. package/src/client/resources/mcp-integration-logos.ts +2 -2
  287. package/src/client/route-chunk-recovery.ts +5 -3
  288. package/src/client/session-replay.ts +3 -3
  289. package/src/client/settings/SettingsPanel.tsx +15 -6
  290. package/src/client/sharing/ShareButton.tsx +1 -27
  291. package/src/client/sharing/ShareDialog.tsx +0 -16
  292. package/src/client/sharing/useShareButtonController.ts +0 -7
  293. package/src/client/sharing/useShareDialogController.ts +0 -2
  294. package/src/client/sse-event-processor.ts +85 -1
  295. package/src/client/transcription/use-live-transcription.ts +64 -45
  296. package/src/deploy/build.ts +2 -1
  297. package/src/guards/db-tool-scoping.ts +1 -1
  298. package/src/integrations/adapters/slack.ts +84 -5
  299. package/src/integrations/index.ts +5 -1
  300. package/src/localization/default-messages.ts +7 -1
  301. package/src/mcp-client/oauth-routes.ts +45 -12
  302. package/src/scripts/agent-engines/list-agent-engines.ts +1 -18
  303. package/src/scripts/call-agent.ts +49 -6
  304. package/src/server/agent-chat-plugin.ts +50 -10
  305. package/src/server/realtime-voice.ts +4 -1
  306. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
  307. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  308. package/src/terminal/cli-registry.ts +1 -1
  309. package/src/vite/client.ts +166 -1
  310. package/corpus/core/src/observability/hosted-model-experiment.ts +0 -118
  311. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +0 -115
  312. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +0 -177
  313. package/corpus/templates/crm/.agents/skills/crm/SKILL.md +0 -128
  314. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +0 -220
  315. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +0 -169
  316. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +0 -100
  317. package/corpus/templates/crm/.env.example +0 -5
  318. package/corpus/templates/crm/AGENTS.md +0 -120
  319. package/corpus/templates/crm/CHANGELOG.md +0 -1
  320. package/corpus/templates/crm/DEVELOPING.md +0 -66
  321. package/corpus/templates/crm/README.md +0 -106
  322. package/corpus/templates/crm/_gitignore +0 -12
  323. package/corpus/templates/crm/actions/_crm-action-utils.ts +0 -87
  324. package/corpus/templates/crm/actions/_crm-dashboard.ts +0 -69
  325. package/corpus/templates/crm/actions/_crm-data-program-actions.ts +0 -15
  326. package/corpus/templates/crm/actions/_crm-signal-utils.ts +0 -79
  327. package/corpus/templates/crm/actions/apply-crm-proposals.ts +0 -203
  328. package/corpus/templates/crm/actions/attach-call-evidence.ts +0 -170
  329. package/corpus/templates/crm/actions/configure-crm-connection.ts +0 -126
  330. package/corpus/templates/crm/actions/configure-native-crm.ts +0 -44
  331. package/corpus/templates/crm/actions/create-crm-record.ts +0 -148
  332. package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +0 -58
  333. package/corpus/templates/crm/actions/delete-staged-dataset.ts +0 -14
  334. package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +0 -36
  335. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +0 -35
  336. package/corpus/templates/crm/actions/get-crm-dashboard.ts +0 -14
  337. package/corpus/templates/crm/actions/get-crm-overview.ts +0 -13
  338. package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +0 -61
  339. package/corpus/templates/crm/actions/get-crm-record.ts +0 -75
  340. package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +0 -81
  341. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +0 -15
  342. package/corpus/templates/crm/actions/list-crm-dashboards.ts +0 -15
  343. package/corpus/templates/crm/actions/list-crm-proposals.ts +0 -31
  344. package/corpus/templates/crm/actions/list-crm-records.ts +0 -79
  345. package/corpus/templates/crm/actions/list-crm-saved-views.ts +0 -15
  346. package/corpus/templates/crm/actions/list-crm-signal-hits.ts +0 -43
  347. package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +0 -32
  348. package/corpus/templates/crm/actions/list-crm-tasks.ts +0 -22
  349. package/corpus/templates/crm/actions/list-staged-datasets.ts +0 -14
  350. package/corpus/templates/crm/actions/list-workspace-connections.ts +0 -47
  351. package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +0 -87
  352. package/corpus/templates/crm/actions/manage-crm-task.ts +0 -132
  353. package/corpus/templates/crm/actions/navigate.ts +0 -63
  354. package/corpus/templates/crm/actions/provider-api-catalog.ts +0 -22
  355. package/corpus/templates/crm/actions/provider-api-docs.ts +0 -54
  356. package/corpus/templates/crm/actions/provider-api-request.ts +0 -92
  357. package/corpus/templates/crm/actions/query-staged-dataset.ts +0 -44
  358. package/corpus/templates/crm/actions/record-crm-call-insight.ts +0 -160
  359. package/corpus/templates/crm/actions/record-crm-smart-signal.ts +0 -150
  360. package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +0 -23
  361. package/corpus/templates/crm/actions/review-crm-signal.ts +0 -31
  362. package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +0 -103
  363. package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +0 -275
  364. package/corpus/templates/crm/actions/run.ts +0 -7
  365. package/corpus/templates/crm/actions/save-crm-dashboard.ts +0 -51
  366. package/corpus/templates/crm/actions/save-crm-saved-view.ts +0 -119
  367. package/corpus/templates/crm/actions/sync-crm.ts +0 -146
  368. package/corpus/templates/crm/actions/update-crm-record.ts +0 -510
  369. package/corpus/templates/crm/actions/view-screen.ts +0 -218
  370. package/corpus/templates/crm/agent-native.app-skill.json +0 -58
  371. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +0 -158
  372. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +0 -78
  373. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +0 -226
  374. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +0 -414
  375. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +0 -510
  376. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +0 -134
  377. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +0 -362
  378. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +0 -93
  379. package/corpus/templates/crm/app/components/crm/Surface.tsx +0 -97
  380. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +0 -180
  381. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +0 -112
  382. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +0 -84
  383. package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +0 -1
  384. package/corpus/templates/crm/app/components/ui/badge.tsx +0 -1
  385. package/corpus/templates/crm/app/components/ui/button.tsx +0 -1
  386. package/corpus/templates/crm/app/components/ui/card.tsx +0 -1
  387. package/corpus/templates/crm/app/components/ui/dialog.tsx +0 -1
  388. package/corpus/templates/crm/app/components/ui/input.tsx +0 -1
  389. package/corpus/templates/crm/app/components/ui/label.tsx +0 -1
  390. package/corpus/templates/crm/app/components/ui/select.tsx +0 -1
  391. package/corpus/templates/crm/app/components/ui/sheet.tsx +0 -1
  392. package/corpus/templates/crm/app/components/ui/skeleton.tsx +0 -1
  393. package/corpus/templates/crm/app/components/ui/switch.tsx +0 -1
  394. package/corpus/templates/crm/app/components/ui/table.tsx +0 -1
  395. package/corpus/templates/crm/app/components/ui/tabs.tsx +0 -1
  396. package/corpus/templates/crm/app/components/ui/textarea.tsx +0 -1
  397. package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +0 -17
  398. package/corpus/templates/crm/app/design-system.ts +0 -3
  399. package/corpus/templates/crm/app/entry.client.tsx +0 -16
  400. package/corpus/templates/crm/app/entry.server.tsx +0 -10
  401. package/corpus/templates/crm/app/global.css +0 -167
  402. package/corpus/templates/crm/app/hooks/use-navigation-state.ts +0 -60
  403. package/corpus/templates/crm/app/i18n/en-US.ts +0 -89
  404. package/corpus/templates/crm/app/i18n/index.ts +0 -34
  405. package/corpus/templates/crm/app/lib/dashboard.ts +0 -13
  406. package/corpus/templates/crm/app/lib/navigation.ts +0 -54
  407. package/corpus/templates/crm/app/lib/tab-id.ts +0 -1
  408. package/corpus/templates/crm/app/lib/types.ts +0 -172
  409. package/corpus/templates/crm/app/lib/utils.ts +0 -1
  410. package/corpus/templates/crm/app/root.tsx +0 -91
  411. package/corpus/templates/crm/app/routes/_index.tsx +0 -26
  412. package/corpus/templates/crm/app/routes/accounts.tsx +0 -41
  413. package/corpus/templates/crm/app/routes/agent.tsx +0 -5
  414. package/corpus/templates/crm/app/routes/ask.tsx +0 -53
  415. package/corpus/templates/crm/app/routes/dashboard.tsx +0 -118
  416. package/corpus/templates/crm/app/routes/opportunities.tsx +0 -41
  417. package/corpus/templates/crm/app/routes/people.tsx +0 -41
  418. package/corpus/templates/crm/app/routes/proposals.tsx +0 -266
  419. package/corpus/templates/crm/app/routes/records.$recordId.tsx +0 -35
  420. package/corpus/templates/crm/app/routes/settings.tsx +0 -63
  421. package/corpus/templates/crm/app/routes/setup.tsx +0 -308
  422. package/corpus/templates/crm/app/routes/tasks.tsx +0 -252
  423. package/corpus/templates/crm/app/routes/views.tsx +0 -333
  424. package/corpus/templates/crm/app/routes.ts +0 -17
  425. package/corpus/templates/crm/app/vite-env.d.ts +0 -6
  426. package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +0 -6
  427. package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +0 -6
  428. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +0 -6
  429. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +0 -6
  430. package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +0 -6
  431. package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +0 -6
  432. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +0 -6
  433. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +0 -6
  434. package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +0 -6
  435. package/corpus/templates/crm/changelog/2026-07-22-crm-field-validation-now-explains-which-fields-cannot-be-edi.md +0 -6
  436. package/corpus/templates/crm/changelog/2026-07-22-fixed-hubspot-contact-syncs-missing-records-updated-after-th.md +0 -6
  437. package/corpus/templates/crm/changelog/2026-07-22-fixed-pipeline-dashboard-panels-so-their-opportunity-data-lo.md +0 -6
  438. package/corpus/templates/crm/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +0 -6
  439. package/corpus/templates/crm/components.json +0 -20
  440. package/corpus/templates/crm/docs/architecture/crm-contract.md +0 -180
  441. package/corpus/templates/crm/learnings.defaults.md +0 -5
  442. package/corpus/templates/crm/package.json +0 -59
  443. package/corpus/templates/crm/public/favicon.svg +0 -1
  444. package/corpus/templates/crm/public/icon-180.svg +0 -1
  445. package/corpus/templates/crm/public/manifest.json +0 -11
  446. package/corpus/templates/crm/react-router.config.ts +0 -7
  447. package/corpus/templates/crm/server/crm/adapter.ts +0 -32
  448. package/corpus/templates/crm/server/crm/crm-field-firewall.ts +0 -64
  449. package/corpus/templates/crm/server/crm/crm-mirror.ts +0 -711
  450. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +0 -1146
  451. package/corpus/templates/crm/server/crm/native-adapter.ts +0 -1715
  452. package/corpus/templates/crm/server/crm/read-through.ts +0 -207
  453. package/corpus/templates/crm/server/crm/salesforce-adapter.ts +0 -1255
  454. package/corpus/templates/crm/server/db/crm-store.ts +0 -1170
  455. package/corpus/templates/crm/server/db/index.ts +0 -169
  456. package/corpus/templates/crm/server/db/schema.ts +0 -441
  457. package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +0 -65
  458. package/corpus/templates/crm/server/lib/intelligence/evidence.ts +0 -105
  459. package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +0 -100
  460. package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +0 -144
  461. package/corpus/templates/crm/server/lib/intelligence/summary.ts +0 -141
  462. package/corpus/templates/crm/server/lib/provider-api.ts +0 -64
  463. package/corpus/templates/crm/server/middleware/auth.ts +0 -4
  464. package/corpus/templates/crm/server/plugins/agent-chat.ts +0 -68
  465. package/corpus/templates/crm/server/plugins/auth.ts +0 -14
  466. package/corpus/templates/crm/server/plugins/core-routes.ts +0 -17
  467. package/corpus/templates/crm/server/plugins/db.ts +0 -454
  468. package/corpus/templates/crm/server/routes/[...page].get.ts +0 -5
  469. package/corpus/templates/crm/shared/crm-automation-recipes.ts +0 -132
  470. package/corpus/templates/crm/shared/crm-contract.ts +0 -254
  471. package/corpus/templates/crm/shared/crm-sales-config.ts +0 -63
  472. package/corpus/templates/crm/ssr-entry.ts +0 -11
  473. package/corpus/templates/crm/tsconfig.json +0 -24
  474. package/corpus/templates/crm/vite.config.ts +0 -15
  475. package/corpus/templates/crm/vitest.config.ts +0 -5
  476. package/dist/observability/hosted-model-experiment.d.ts +0 -39
  477. package/dist/observability/hosted-model-experiment.d.ts.map +0 -1
  478. package/dist/observability/hosted-model-experiment.js +0 -90
  479. package/dist/observability/hosted-model-experiment.js.map +0 -1
  480. package/src/observability/hosted-model-experiment.ts +0 -118
@@ -1,510 +0,0 @@
1
- import { sendToAgentChat } from "@agent-native/core/client/agent-chat";
2
- import {
3
- useActionMutation,
4
- useActionQuery,
5
- } from "@agent-native/core/client/hooks";
6
- import { useT } from "@agent-native/core/client/i18n";
7
- import {
8
- IconBolt,
9
- IconChecklist,
10
- IconExternalLink,
11
- IconFilePlus,
12
- IconPencil,
13
- } from "@tabler/icons-react";
14
- import { useState } from "react";
15
- import { Link } from "react-router";
16
- import { toast } from "sonner";
17
-
18
- import { Button } from "@/components/ui/button";
19
- import {
20
- Dialog,
21
- DialogContent,
22
- DialogDescription,
23
- DialogFooter,
24
- DialogHeader,
25
- DialogTitle,
26
- DialogTrigger,
27
- } from "@/components/ui/dialog";
28
- import { Input } from "@/components/ui/input";
29
- import { Label } from "@/components/ui/label";
30
- import {
31
- Select,
32
- SelectContent,
33
- SelectItem,
34
- SelectTrigger,
35
- SelectValue,
36
- } from "@/components/ui/select";
37
- import { Textarea } from "@/components/ui/textarea";
38
- import type { CrmRecordDetail } from "@/lib/types";
39
-
40
- export function RecordActions({ record }: { record: CrmRecordDetail }) {
41
- return (
42
- <div className="flex flex-wrap items-center gap-2">
43
- <EditFieldDialog record={record} />
44
- <CreateRecordTaskDialog recordId={record.id} />
45
- <AttachEvidenceDialog recordId={record.id} />
46
- <CallEvidenceAutomationDialog record={record} />
47
- </div>
48
- );
49
- }
50
-
51
- function EditFieldDialog({ record }: { record: CrmRecordDetail }) {
52
- const isNative = record.provider === "native";
53
- const [open, setOpen] = useState(false);
54
- const [target, setTarget] = useState<"local" | "provider">(
55
- isNative ? "local" : "provider",
56
- );
57
- const [field, setField] = useState("");
58
- const [value, setValue] = useState("");
59
- const [valueType, setValueType] = useState<"string" | "number" | "boolean">(
60
- "string",
61
- );
62
- const update = useActionMutation<
63
- { mutationId: string; status?: string },
64
- {
65
- recordId: string;
66
- target: "local" | "provider";
67
- fields: Record<string, string | number | boolean>;
68
- expectedRemoteRevision?: string;
69
- }
70
- >("update-crm-record" as never);
71
- const apply = useActionMutation<
72
- { status?: string; message?: string },
73
- { proposalId: string }
74
- >("apply-crm-proposals" as never);
75
-
76
- async function submit() {
77
- const nextValue =
78
- valueType === "number"
79
- ? Number(value)
80
- : valueType === "boolean"
81
- ? value === "true"
82
- : value;
83
- if (valueType === "number" && !Number.isFinite(nextValue)) {
84
- toast.error("Enter a valid number.");
85
- return;
86
- }
87
- try {
88
- const result = await update.mutateAsync({
89
- recordId: record.id,
90
- target,
91
- fields: { [field.trim()]: nextValue },
92
- ...((isNative || target === "provider") && record.remoteRevision
93
- ? { expectedRemoteRevision: record.remoteRevision }
94
- : {}),
95
- });
96
- if (target === "provider" && result.status === "pending") {
97
- const applied = await apply.mutateAsync({
98
- proposalId: result.mutationId,
99
- });
100
- if (applied.status !== "applied") {
101
- throw new Error(
102
- applied.message ||
103
- `Provider update finished as ${applied.status ?? "unknown"}.`,
104
- );
105
- }
106
- }
107
- setOpen(false);
108
- setField("");
109
- setValue("");
110
- toast.success(
111
- target === "provider"
112
- ? "Connected CRM field updated."
113
- : "Local CRM field updated.",
114
- );
115
- } catch (error) {
116
- toast.error(
117
- error instanceof Error ? error.message : "CRM update failed.",
118
- );
119
- }
120
- }
121
-
122
- function setDialogOpen(nextOpen: boolean) {
123
- setOpen(nextOpen);
124
- if (nextOpen && isNative) setTarget("local");
125
- }
126
-
127
- return (
128
- <Dialog open={open} onOpenChange={setDialogOpen}>
129
- <DialogTrigger asChild>
130
- <Button variant="outline" size="sm" className="gap-1.5">
131
- <IconPencil className="size-4" /> Edit field
132
- </Button>
133
- </DialogTrigger>
134
- <DialogContent className="sm:max-w-md">
135
- <DialogHeader>
136
- <DialogTitle>Edit CRM field</DialogTitle>
137
- <DialogDescription>
138
- {isNative
139
- ? "Native SQL records are local-authoritative, so changes save directly to this workspace."
140
- : "Provider edits become reviewable proposals and remain fail-closed unless the connected CRM proves an atomic expected-revision write. Local changes are limited to local-authoritative fields."}
141
- </DialogDescription>
142
- </DialogHeader>
143
- <div className="grid gap-4 py-2">
144
- {isNative ? null : (
145
- <FormField label="Authority" htmlFor="field-target">
146
- <Select
147
- value={target}
148
- onValueChange={(next) =>
149
- setTarget(next as "local" | "provider")
150
- }
151
- >
152
- <SelectTrigger id="field-target">
153
- <SelectValue />
154
- </SelectTrigger>
155
- <SelectContent>
156
- <SelectItem value="provider">
157
- Connected CRM proposal
158
- </SelectItem>
159
- <SelectItem value="local">Local CRM field</SelectItem>
160
- </SelectContent>
161
- </Select>
162
- </FormField>
163
- )}
164
- <FormField label="Field name" htmlFor="field-name">
165
- <Input
166
- id="field-name"
167
- value={field}
168
- maxLength={120}
169
- placeholder={
170
- isNative || target === "local"
171
- ? "desiredCadenceDays"
172
- : record.provider === "salesforce"
173
- ? "StageName"
174
- : "lifecyclestage"
175
- }
176
- onChange={(event) => setField(event.target.value)}
177
- />
178
- </FormField>
179
- <FormField label="Value type" htmlFor="field-type">
180
- <Select
181
- value={valueType}
182
- onValueChange={(next) => setValueType(next as typeof valueType)}
183
- >
184
- <SelectTrigger id="field-type">
185
- <SelectValue />
186
- </SelectTrigger>
187
- <SelectContent>
188
- <SelectItem value="string">Text</SelectItem>
189
- <SelectItem value="number">Number</SelectItem>
190
- <SelectItem value="boolean">Boolean</SelectItem>
191
- </SelectContent>
192
- </Select>
193
- </FormField>
194
- <FormField label="New value" htmlFor="field-value">
195
- {valueType === "boolean" ? (
196
- <Select value={value} onValueChange={setValue}>
197
- <SelectTrigger id="field-value">
198
- <SelectValue placeholder="Choose a value" />
199
- </SelectTrigger>
200
- <SelectContent>
201
- <SelectItem value="true">True</SelectItem>
202
- <SelectItem value="false">False</SelectItem>
203
- </SelectContent>
204
- </Select>
205
- ) : (
206
- <Input
207
- id="field-value"
208
- type={valueType === "number" ? "number" : "text"}
209
- value={value}
210
- maxLength={4_000}
211
- onChange={(event) => setValue(event.target.value)}
212
- />
213
- )}
214
- </FormField>
215
- </div>
216
- <DialogFooter>
217
- <Button
218
- disabled={
219
- !field.trim() || !value || update.isPending || apply.isPending
220
- }
221
- onClick={() => void submit()}
222
- >
223
- {isNative
224
- ? "Save field"
225
- : target === "provider"
226
- ? `Prepare ${record.provider === "salesforce" ? "Salesforce" : "HubSpot"} change`
227
- : "Update locally"}
228
- </Button>
229
- </DialogFooter>
230
- </DialogContent>
231
- </Dialog>
232
- );
233
- }
234
-
235
- function CreateRecordTaskDialog({ recordId }: { recordId: string }) {
236
- const [open, setOpen] = useState(false);
237
- const [title, setTitle] = useState("");
238
- const [dueAt, setDueAt] = useState("");
239
- const create = useActionMutation<
240
- unknown,
241
- { recordId: string; title: string; dueAt?: string; status: "open" }
242
- >("manage-crm-task" as never);
243
-
244
- async function submit() {
245
- try {
246
- await create.mutateAsync({
247
- recordId,
248
- title: title.trim(),
249
- dueAt: dueAt ? new Date(dueAt).toISOString() : undefined,
250
- status: "open",
251
- });
252
- setOpen(false);
253
- setTitle("");
254
- setDueAt("");
255
- toast.success("Follow-up task created.");
256
- } catch (error) {
257
- toast.error(
258
- error instanceof Error ? error.message : "Task creation failed.",
259
- );
260
- }
261
- }
262
-
263
- return (
264
- <Dialog open={open} onOpenChange={setOpen}>
265
- <DialogTrigger asChild>
266
- <Button variant="outline" size="sm" className="gap-1.5">
267
- <IconChecklist className="size-4" /> Add task
268
- </Button>
269
- </DialogTrigger>
270
- <DialogContent className="sm:max-w-md">
271
- <DialogHeader>
272
- <DialogTitle>Add record task</DialogTitle>
273
- <DialogDescription>
274
- Keep a local follow-up next to this CRM record.
275
- </DialogDescription>
276
- </DialogHeader>
277
- <div className="grid gap-4 py-2">
278
- <FormField label="Title" htmlFor="record-task-title">
279
- <Input
280
- id="record-task-title"
281
- value={title}
282
- maxLength={300}
283
- onChange={(event) => setTitle(event.target.value)}
284
- />
285
- </FormField>
286
- <FormField label="Due" htmlFor="record-task-due">
287
- <Input
288
- id="record-task-due"
289
- type="datetime-local"
290
- value={dueAt}
291
- onChange={(event) => setDueAt(event.target.value)}
292
- />
293
- </FormField>
294
- </div>
295
- <DialogFooter>
296
- <Button
297
- disabled={!title.trim() || create.isPending}
298
- onClick={() => void submit()}
299
- >
300
- Create task
301
- </Button>
302
- </DialogFooter>
303
- </DialogContent>
304
- </Dialog>
305
- );
306
- }
307
-
308
- function AttachEvidenceDialog({ recordId }: { recordId: string }) {
309
- const t = useT();
310
- const [open, setOpen] = useState(false);
311
- const [artifactId, setArtifactId] = useState("");
312
- const [sourceUrl, setSourceUrl] = useState("");
313
- const [quote, setQuote] = useState("");
314
- const [summary, setSummary] = useState("");
315
- const attach = useActionMutation<
316
- unknown,
317
- {
318
- recordId: string;
319
- artifactId: string;
320
- sourceUrl: string;
321
- sourceApp: "clips";
322
- quote?: string;
323
- summary?: string;
324
- }
325
- >("attach-call-evidence" as never);
326
-
327
- async function submit() {
328
- try {
329
- await attach.mutateAsync({
330
- recordId,
331
- artifactId: artifactId.trim(),
332
- sourceUrl: sourceUrl.trim(),
333
- sourceApp: "clips",
334
- quote: quote.trim() || undefined,
335
- summary: summary.trim() || undefined,
336
- });
337
- setOpen(false);
338
- setArtifactId("");
339
- setSourceUrl("");
340
- setQuote("");
341
- setSummary("");
342
- toast.success(t("recordActions.evidenceAttached"));
343
- } catch (error) {
344
- toast.error(
345
- error instanceof Error
346
- ? error.message
347
- : t("recordActions.evidenceAttachFailed"),
348
- );
349
- }
350
- }
351
-
352
- return (
353
- <Dialog open={open} onOpenChange={setOpen}>
354
- <DialogTrigger asChild>
355
- <Button variant="outline" size="sm" className="gap-1.5">
356
- <IconFilePlus className="size-4" /> {t("recordActions.addEvidence")}
357
- </Button>
358
- </DialogTrigger>
359
- <DialogContent className="sm:max-w-lg">
360
- <DialogHeader>
361
- <DialogTitle>{t("recordActions.attachEvidenceTitle")}</DialogTitle>
362
- <DialogDescription>
363
- {t("recordActions.attachEvidenceDescription")}
364
- </DialogDescription>
365
- </DialogHeader>
366
- <div className="grid gap-4 py-2 sm:grid-cols-2">
367
- <FormField
368
- label={t("recordActions.artifactId")}
369
- htmlFor="evidence-id"
370
- >
371
- <Input
372
- id="evidence-id"
373
- value={artifactId}
374
- maxLength={256}
375
- onChange={(event) => setArtifactId(event.target.value)}
376
- />
377
- </FormField>
378
- <FormField label={t("recordActions.clipsUrl")} htmlFor="evidence-url">
379
- <Input
380
- id="evidence-url"
381
- type="url"
382
- value={sourceUrl}
383
- maxLength={2_048}
384
- onChange={(event) => setSourceUrl(event.target.value)}
385
- />
386
- </FormField>
387
- <FormField
388
- label={t("recordActions.summary")}
389
- htmlFor="evidence-summary"
390
- className="sm:col-span-2"
391
- >
392
- <Input
393
- id="evidence-summary"
394
- value={summary}
395
- maxLength={2_000}
396
- onChange={(event) => setSummary(event.target.value)}
397
- />
398
- </FormField>
399
- <FormField
400
- label={t("recordActions.shortExcerpt")}
401
- htmlFor="evidence-quote"
402
- className="sm:col-span-2"
403
- >
404
- <Textarea
405
- id="evidence-quote"
406
- value={quote}
407
- maxLength={1_200}
408
- onChange={(event) => setQuote(event.target.value)}
409
- />
410
- </FormField>
411
- </div>
412
- <DialogFooter>
413
- <Button
414
- disabled={
415
- !artifactId.trim() || !sourceUrl.trim() || attach.isPending
416
- }
417
- onClick={() => void submit()}
418
- >
419
- {t("recordActions.attachEvidence")}
420
- </Button>
421
- </DialogFooter>
422
- </DialogContent>
423
- </Dialog>
424
- );
425
- }
426
-
427
- function CallEvidenceAutomationDialog({ record }: { record: CrmRecordDetail }) {
428
- const t = useT();
429
- const [open, setOpen] = useState(false);
430
- const recipeQuery = useActionQuery<{
431
- title: string;
432
- description: string;
433
- enabledByDefault: false;
434
- agentContext: string;
435
- }>("get-crm-automation-recipe" as never, { recordId: record.id } as never, {
436
- enabled: open,
437
- });
438
- const recipe = recipeQuery.data;
439
-
440
- return (
441
- <Dialog open={open} onOpenChange={setOpen}>
442
- <DialogTrigger asChild>
443
- <Button variant="outline" size="sm" className="gap-1.5">
444
- <IconBolt className="size-4" /> {t("recordActions.automate")}
445
- </Button>
446
- </DialogTrigger>
447
- <DialogContent className="sm:max-w-lg">
448
- <DialogHeader>
449
- <DialogTitle>
450
- {recipe?.title ?? t("recordActions.reviewNewClipsCalls")}
451
- </DialogTitle>
452
- <DialogDescription>
453
- {recipe?.description ?? t("recordActions.reviewDescription")}
454
- </DialogDescription>
455
- </DialogHeader>
456
- <div className="space-y-3 text-sm text-muted-foreground">
457
- <p>
458
- {t("recordActions.disabledAutomationDescription", {
459
- name: record.displayName,
460
- })}
461
- </p>
462
- <p>{t("recordActions.handoffDescription", { path: "/r" })}</p>
463
- </div>
464
- <DialogFooter className="flex-row flex-wrap justify-end gap-2 sm:justify-end">
465
- <Button asChild variant="ghost" size="sm" className="gap-1.5">
466
- <Link to="/agent#jobs" onClick={() => setOpen(false)}>
467
- <IconExternalLink className="size-4" />{" "}
468
- {t("recordActions.manageAutomations")}
469
- </Link>
470
- </Button>
471
- <Button
472
- size="sm"
473
- disabled={!recipe || recipeQuery.isLoading}
474
- onClick={() => {
475
- if (!recipe) return;
476
- sendToAgentChat({
477
- message: `Set up the disabled Clips call-evidence review recipe for ${record.displayName}.`,
478
- context: recipe.agentContext,
479
- submit: true,
480
- newTab: true,
481
- });
482
- setOpen(false);
483
- }}
484
- >
485
- {t("recordActions.configureWithAgent")}
486
- </Button>
487
- </DialogFooter>
488
- </DialogContent>
489
- </Dialog>
490
- );
491
- }
492
-
493
- function FormField({
494
- label,
495
- htmlFor,
496
- className,
497
- children,
498
- }: {
499
- label: string;
500
- htmlFor: string;
501
- className?: string;
502
- children: React.ReactNode;
503
- }) {
504
- return (
505
- <div className={`grid gap-2 ${className ?? ""}`}>
506
- <Label htmlFor={htmlFor}>{label}</Label>
507
- {children}
508
- </div>
509
- );
510
- }
@@ -1,134 +0,0 @@
1
- import { IconArrowUpRight, IconSearch } from "@tabler/icons-react";
2
- import { useEffect, useState } from "react";
3
- import { Link, useSearchParams } from "react-router";
4
-
5
- import { LoadingRows, SetupEmptyState } from "@/components/crm/Surface";
6
- import { Badge } from "@/components/ui/badge";
7
- import { Input } from "@/components/ui/input";
8
- import {
9
- Table,
10
- TableBody,
11
- TableCell,
12
- TableHead,
13
- TableHeader,
14
- TableRow,
15
- } from "@/components/ui/table";
16
- import type { CrmKind, CrmRecordSummary } from "@/lib/types";
17
-
18
- const labels: Record<CrmKind, string> = {
19
- account: "Account",
20
- person: "Person",
21
- opportunity: "Opportunity",
22
- };
23
-
24
- export function RecordGrid({
25
- kind,
26
- records,
27
- isLoading,
28
- emptyTitle,
29
- }: {
30
- kind: CrmKind;
31
- records: CrmRecordSummary[];
32
- isLoading: boolean;
33
- emptyTitle: string;
34
- }) {
35
- const [params, setParams] = useSearchParams();
36
- const [draftQuery, setDraftQuery] = useState(params.get("q") ?? "");
37
- const query = (params.get("q") ?? "").trim().toLowerCase();
38
- useEffect(() => {
39
- setDraftQuery(params.get("q") ?? "");
40
- }, [params]);
41
- const filtered = records.filter((record) =>
42
- `${record.displayName} ${record.subtitle ?? ""} ${record.owner ?? ""}`
43
- .toLowerCase()
44
- .includes(query),
45
- );
46
-
47
- function updateSearch(value: string) {
48
- setDraftQuery(value);
49
- const next = new URLSearchParams(params);
50
- if (value) next.set("q", value);
51
- else next.delete("q");
52
- setParams(next, { replace: true });
53
- }
54
-
55
- if (isLoading) return <LoadingRows rows={7} />;
56
- if (!records.length) return <SetupEmptyState title={emptyTitle} />;
57
-
58
- return (
59
- <div className="p-5 sm:p-7">
60
- <div className="mb-4 flex max-w-sm items-center gap-2 rounded-md border border-input bg-background px-3 shadow-sm">
61
- <IconSearch className="size-4 shrink-0 text-muted-foreground" />
62
- <Input
63
- value={draftQuery}
64
- onChange={(event) => updateSearch(event.target.value)}
65
- placeholder={`Search ${labels[kind].toLowerCase()}s`}
66
- className="h-9 border-0 bg-transparent px-0 shadow-none focus-visible:ring-0"
67
- />
68
- </div>
69
- <div className="overflow-hidden rounded-lg border border-border/70 bg-card">
70
- <Table>
71
- <TableHeader>
72
- <TableRow>
73
- <TableHead>{labels[kind]}</TableHead>
74
- <TableHead className="hidden md:table-cell">Owner</TableHead>
75
- <TableHead className="hidden lg:table-cell">Cadence</TableHead>
76
- <TableHead>Next step</TableHead>
77
- <TableHead className="w-8">
78
- <span className="sr-only">Open</span>
79
- </TableHead>
80
- </TableRow>
81
- </TableHeader>
82
- <TableBody>
83
- {filtered.map((record) => (
84
- <TableRow key={record.id}>
85
- <TableCell className="min-w-[220px]">
86
- <Link
87
- to={`/records/${encodeURIComponent(record.id)}`}
88
- className="block rounded-sm outline-none focus-visible:ring-2 focus-visible:ring-ring"
89
- >
90
- <p className="font-medium">{record.displayName}</p>
91
- {record.subtitle ? (
92
- <p className="mt-0.5 text-xs text-muted-foreground">
93
- {record.subtitle}
94
- </p>
95
- ) : null}
96
- </Link>
97
- </TableCell>
98
- <TableCell className="hidden text-muted-foreground md:table-cell">
99
- {record.owner ?? "—"}
100
- </TableCell>
101
- <TableCell className="hidden lg:table-cell">
102
- {record.cadence ? (
103
- <Badge variant="secondary" className="font-normal">
104
- {record.cadence}
105
- </Badge>
106
- ) : (
107
- "—"
108
- )}
109
- </TableCell>
110
- <TableCell className="max-w-[260px] truncate text-muted-foreground">
111
- {record.nextStep ?? record.stage ?? "—"}
112
- </TableCell>
113
- <TableCell>
114
- <Link
115
- to={`/records/${encodeURIComponent(record.id)}`}
116
- className="inline-flex size-7 items-center justify-center rounded-sm text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
117
- aria-label={`Open ${record.displayName}`}
118
- >
119
- <IconArrowUpRight className="size-4" />
120
- </Link>
121
- </TableCell>
122
- </TableRow>
123
- ))}
124
- </TableBody>
125
- </Table>
126
- </div>
127
- {records.length > 0 && filtered.length === 0 ? (
128
- <p className="py-10 text-center text-sm text-muted-foreground">
129
- No matching {labels[kind].toLowerCase()}s.
130
- </p>
131
- ) : null}
132
- </div>
133
- );
134
- }