@agent-native/core 0.47.1 → 0.48.1

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 (808) hide show
  1. package/bin/agent-native.js +41 -0
  2. package/dist/a2a/handlers.js +2 -2
  3. package/dist/a2a/handlers.js.map +1 -1
  4. package/dist/a2a/server.js +2 -2
  5. package/dist/a2a/server.js.map +1 -1
  6. package/dist/action.d.ts +43 -2
  7. package/dist/action.d.ts.map +1 -1
  8. package/dist/action.js.map +1 -1
  9. package/dist/agent/context-xray/actions/context-evict.d.ts +7 -1
  10. package/dist/agent/context-xray/actions/context-evict.d.ts.map +1 -1
  11. package/dist/agent/context-xray/actions/context-manifest-get.d.ts +4 -1
  12. package/dist/agent/context-xray/actions/context-manifest-get.d.ts.map +1 -1
  13. package/dist/agent/context-xray/actions/context-pin.d.ts +7 -1
  14. package/dist/agent/context-xray/actions/context-pin.d.ts.map +1 -1
  15. package/dist/agent/context-xray/actions/context-report.d.ts +12 -1
  16. package/dist/agent/context-xray/actions/context-report.d.ts.map +1 -1
  17. package/dist/agent/context-xray/actions/context-restore.d.ts +7 -1
  18. package/dist/agent/context-xray/actions/context-restore.d.ts.map +1 -1
  19. package/dist/agent/context-xray/apply-directives.d.ts.map +1 -1
  20. package/dist/agent/context-xray/apply-directives.js.map +1 -1
  21. package/dist/agent/context-xray/schema.d.ts +10 -10
  22. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  23. package/dist/agent/engine/ai-sdk-engine.js +26 -3
  24. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  25. package/dist/agent/engine/anthropic-engine.d.ts +1 -1
  26. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  27. package/dist/agent/engine/builder-engine.d.ts +1 -1
  28. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  29. package/dist/agent/engine/builder-engine.js +47 -8
  30. package/dist/agent/engine/builder-engine.js.map +1 -1
  31. package/dist/agent/engine/builtin.js +1 -1
  32. package/dist/agent/engine/builtin.js.map +1 -1
  33. package/dist/agent/engine/output-tokens.d.ts +1 -1
  34. package/dist/agent/engine/output-tokens.d.ts.map +1 -1
  35. package/dist/agent/engine/output-tokens.js +6 -2
  36. package/dist/agent/engine/output-tokens.js.map +1 -1
  37. package/dist/agent/engine/registry.d.ts.map +1 -1
  38. package/dist/agent/engine/registry.js +7 -4
  39. package/dist/agent/engine/registry.js.map +1 -1
  40. package/dist/agent/engine/types.d.ts +19 -0
  41. package/dist/agent/engine/types.d.ts.map +1 -1
  42. package/dist/agent/engine/types.js +6 -0
  43. package/dist/agent/engine/types.js.map +1 -1
  44. package/dist/agent/model-config.d.ts +22 -14
  45. package/dist/agent/model-config.d.ts.map +1 -1
  46. package/dist/agent/model-config.js +113 -8
  47. package/dist/agent/model-config.js.map +1 -1
  48. package/dist/agent/production-agent.d.ts +19 -1
  49. package/dist/agent/production-agent.d.ts.map +1 -1
  50. package/dist/agent/production-agent.js +253 -39
  51. package/dist/agent/production-agent.js.map +1 -1
  52. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  53. package/dist/agent/run-loop-with-resume.js +10 -0
  54. package/dist/agent/run-loop-with-resume.js.map +1 -1
  55. package/dist/agent/run-manager.d.ts +1 -0
  56. package/dist/agent/run-manager.d.ts.map +1 -1
  57. package/dist/agent/run-manager.js +36 -9
  58. package/dist/agent/run-manager.js.map +1 -1
  59. package/dist/agent/run-store.d.ts +47 -4
  60. package/dist/agent/run-store.d.ts.map +1 -1
  61. package/dist/agent/run-store.js +154 -4
  62. package/dist/agent/run-store.js.map +1 -1
  63. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  64. package/dist/agent/thread-data-builder.js +57 -2
  65. package/dist/agent/thread-data-builder.js.map +1 -1
  66. package/dist/agent/types.d.ts +3 -0
  67. package/dist/agent/types.d.ts.map +1 -1
  68. package/dist/agent/types.js.map +1 -1
  69. package/dist/agent-web/generator.d.ts +3 -3
  70. package/dist/appearance/actions/change-appearance.d.ts +6 -1
  71. package/dist/appearance/actions/change-appearance.d.ts.map +1 -1
  72. package/dist/application-state/handlers.d.ts +2 -2
  73. package/dist/application-state/handlers.d.ts.map +1 -1
  74. package/dist/application-state/store.d.ts.map +1 -1
  75. package/dist/application-state/store.js +17 -0
  76. package/dist/application-state/store.js.map +1 -1
  77. package/dist/catalog.json +2 -1
  78. package/dist/cli/code-agent-commands.d.ts.map +1 -1
  79. package/dist/cli/code-agent-commands.js +2 -0
  80. package/dist/cli/code-agent-commands.js.map +1 -1
  81. package/dist/cli/code-agent-connector.js +7 -13
  82. package/dist/cli/code-agent-connector.js.map +1 -1
  83. package/dist/cli/code-agent-executor.d.ts +54 -2
  84. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  85. package/dist/cli/code-agent-executor.js +504 -48
  86. package/dist/cli/code-agent-executor.js.map +1 -1
  87. package/dist/cli/code-agent-runs.d.ts +13 -0
  88. package/dist/cli/code-agent-runs.d.ts.map +1 -1
  89. package/dist/cli/code-agent-runs.js +36 -0
  90. package/dist/cli/code-agent-runs.js.map +1 -1
  91. package/dist/cli/code.js +59 -5
  92. package/dist/cli/code.js.map +1 -1
  93. package/dist/cli/connect.js +141 -3
  94. package/dist/cli/connect.js.map +1 -1
  95. package/dist/cli/index.js +0 -0
  96. package/dist/cli/pr-visual-recap-workflow.js +1 -1
  97. package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
  98. package/dist/cli/recap.js +476 -46
  99. package/dist/cli/recap.js.map +1 -1
  100. package/dist/cli/skills.js +298 -179
  101. package/dist/cli/skills.js.map +1 -1
  102. package/dist/client/AgentPanel.d.ts.map +1 -1
  103. package/dist/client/AgentPanel.js +29 -2
  104. package/dist/client/AgentPanel.js.map +1 -1
  105. package/dist/client/AgentTaskCard.d.ts.map +1 -1
  106. package/dist/client/AgentTaskCard.js +17 -2
  107. package/dist/client/AgentTaskCard.js.map +1 -1
  108. package/dist/client/AssistantChat.d.ts +1 -1
  109. package/dist/client/AssistantChat.d.ts.map +1 -1
  110. package/dist/client/AssistantChat.js +310 -1732
  111. package/dist/client/AssistantChat.js.map +1 -1
  112. package/dist/client/CommandMenu.d.ts +1 -1
  113. package/dist/client/CommandMenu.d.ts.map +1 -1
  114. package/dist/client/CommandMenu.js +1 -1
  115. package/dist/client/CommandMenu.js.map +1 -1
  116. package/dist/client/HighlightedCodeBlock.d.ts +40 -0
  117. package/dist/client/HighlightedCodeBlock.d.ts.map +1 -0
  118. package/dist/client/HighlightedCodeBlock.js +110 -0
  119. package/dist/client/HighlightedCodeBlock.js.map +1 -0
  120. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  121. package/dist/client/MultiTabAssistantChat.js +8 -1
  122. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  123. package/dist/client/PoweredByBadge.d.ts +2 -2
  124. package/dist/client/PoweredByBadge.d.ts.map +1 -1
  125. package/dist/client/RunStuckBanner.d.ts +1 -1
  126. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  127. package/dist/client/StarfieldBackground.d.ts.map +1 -1
  128. package/dist/client/StarfieldBackground.js +10 -5
  129. package/dist/client/StarfieldBackground.js.map +1 -1
  130. package/dist/client/Turnstile.d.ts +1 -1
  131. package/dist/client/Turnstile.d.ts.map +1 -1
  132. package/dist/client/agent-chat-adapter.d.ts +3 -2
  133. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  134. package/dist/client/agent-chat-adapter.js +13 -9
  135. package/dist/client/agent-chat-adapter.js.map +1 -1
  136. package/dist/client/app-providers.d.ts +99 -0
  137. package/dist/client/app-providers.d.ts.map +1 -0
  138. package/dist/client/app-providers.js +19 -0
  139. package/dist/client/app-providers.js.map +1 -0
  140. package/dist/client/assistant-ui-recovery.d.ts +1 -1
  141. package/dist/client/auth-redirect-url.d.ts +1 -1
  142. package/dist/client/auth-redirect-url.d.ts.map +1 -1
  143. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts +0 -19
  144. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -1
  145. package/dist/client/blocks/library/AnnotatedCodeBlock.js +141 -55
  146. package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -1
  147. package/dist/client/blocks/library/DiffBlock.js +1 -1
  148. package/dist/client/blocks/library/DiffBlock.js.map +1 -1
  149. package/dist/client/blocks/library/FileTreeBlock.d.ts.map +1 -1
  150. package/dist/client/blocks/library/FileTreeBlock.js +1 -1
  151. package/dist/client/blocks/library/FileTreeBlock.js.map +1 -1
  152. package/dist/client/blocks/library/HighlightedCode.d.ts.map +1 -1
  153. package/dist/client/blocks/library/HighlightedCode.js +5 -3
  154. package/dist/client/blocks/library/HighlightedCode.js.map +1 -1
  155. package/dist/client/blocks/library/annotation-rail.d.ts +5 -4
  156. package/dist/client/blocks/library/annotation-rail.d.ts.map +1 -1
  157. package/dist/client/blocks/library/annotation-rail.js +22 -3
  158. package/dist/client/blocks/library/annotation-rail.js.map +1 -1
  159. package/dist/client/blocks/library/diagram.js +1 -1
  160. package/dist/client/blocks/library/diagram.js.map +1 -1
  161. package/dist/client/blocks/library/diff.config.d.ts +3 -2
  162. package/dist/client/blocks/library/diff.config.d.ts.map +1 -1
  163. package/dist/client/blocks/library/diff.config.js +4 -3
  164. package/dist/client/blocks/library/diff.config.js.map +1 -1
  165. package/dist/client/blocks/library/question-form.d.ts.map +1 -1
  166. package/dist/client/blocks/library/question-form.js +2 -1
  167. package/dist/client/blocks/library/question-form.js.map +1 -1
  168. package/dist/client/blocks/library/wireframe-kit.d.ts +1 -1
  169. package/dist/client/blocks/library/wireframe-kit.d.ts.map +1 -1
  170. package/dist/client/blocks/library/wireframe.js +1 -1
  171. package/dist/client/blocks/library/wireframe.js.map +1 -1
  172. package/dist/client/chat/attachment-adapters.d.ts +58 -0
  173. package/dist/client/chat/attachment-adapters.d.ts.map +1 -0
  174. package/dist/client/chat/attachment-adapters.js +331 -0
  175. package/dist/client/chat/attachment-adapters.js.map +1 -0
  176. package/dist/client/chat/index.d.ts +13 -0
  177. package/dist/client/chat/index.d.ts.map +1 -0
  178. package/dist/client/chat/index.js +13 -0
  179. package/dist/client/chat/index.js.map +1 -0
  180. package/dist/client/chat/markdown-renderer.d.ts +49 -0
  181. package/dist/client/chat/markdown-renderer.d.ts.map +1 -0
  182. package/dist/client/chat/markdown-renderer.js +391 -0
  183. package/dist/client/chat/markdown-renderer.js.map +1 -0
  184. package/dist/client/chat/message-components.d.ts +35 -0
  185. package/dist/client/chat/message-components.d.ts.map +1 -0
  186. package/dist/client/chat/message-components.js +452 -0
  187. package/dist/client/chat/message-components.js.map +1 -0
  188. package/dist/client/chat/repo-helpers.d.ts +41 -0
  189. package/dist/client/chat/repo-helpers.d.ts.map +1 -0
  190. package/dist/client/chat/repo-helpers.js +61 -0
  191. package/dist/client/chat/repo-helpers.js.map +1 -0
  192. package/dist/client/chat/run-recovery.d.ts +41 -0
  193. package/dist/client/chat/run-recovery.d.ts.map +1 -0
  194. package/dist/client/chat/run-recovery.js +348 -0
  195. package/dist/client/chat/run-recovery.js.map +1 -0
  196. package/dist/client/chat/tool-call-display.d.ts +34 -0
  197. package/dist/client/chat/tool-call-display.d.ts.map +1 -0
  198. package/dist/client/chat/tool-call-display.js +284 -0
  199. package/dist/client/chat/tool-call-display.js.map +1 -0
  200. package/dist/client/code-agent-chat-adapter.d.ts.map +1 -1
  201. package/dist/client/code-agent-chat-adapter.js +20 -0
  202. package/dist/client/code-agent-chat-adapter.js.map +1 -1
  203. package/dist/client/collab/index.d.ts +10 -0
  204. package/dist/client/collab/index.d.ts.map +1 -0
  205. package/dist/client/collab/index.js +10 -0
  206. package/dist/client/collab/index.js.map +1 -0
  207. package/dist/client/components/AgentPresenceChip.d.ts +1 -1
  208. package/dist/client/components/AgentPresenceChip.d.ts.map +1 -1
  209. package/dist/client/components/ApiKeySettings.d.ts +1 -1
  210. package/dist/client/components/ApiKeySettings.d.ts.map +1 -1
  211. package/dist/client/components/CodeAgentIndicator.d.ts +1 -1
  212. package/dist/client/components/CodeAgentIndicator.d.ts.map +1 -1
  213. package/dist/client/components/CodeRequiredDialog.d.ts +1 -1
  214. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  215. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  216. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  217. package/dist/client/components/PresenceBar.d.ts +1 -1
  218. package/dist/client/components/PresenceBar.d.ts.map +1 -1
  219. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  220. package/dist/client/composer/PromptComposer.js +6 -26
  221. package/dist/client/composer/PromptComposer.js.map +1 -1
  222. package/dist/client/composer/TiptapComposer.d.ts +8 -2
  223. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  224. package/dist/client/composer/TiptapComposer.js +21 -9
  225. package/dist/client/composer/TiptapComposer.js.map +1 -1
  226. package/dist/client/composer/VoiceButton.d.ts +2 -2
  227. package/dist/client/composer/VoiceButton.d.ts.map +1 -1
  228. package/dist/client/composer/index.d.ts +1 -1
  229. package/dist/client/composer/index.d.ts.map +1 -1
  230. package/dist/client/composer/index.js +1 -1
  231. package/dist/client/composer/index.js.map +1 -1
  232. package/dist/client/composer/use-skills.d.ts +1 -1
  233. package/dist/client/context-xray/ContextMeter.d.ts +1 -1
  234. package/dist/client/context-xray/ContextMeter.d.ts.map +1 -1
  235. package/dist/client/context-xray/ContextMeter.js +3 -3
  236. package/dist/client/context-xray/ContextMeter.js.map +1 -1
  237. package/dist/client/context-xray/ContextXRayPanel.d.ts.map +1 -1
  238. package/dist/client/context-xray/ContextXRayPanel.js +4 -3
  239. package/dist/client/context-xray/ContextXRayPanel.js.map +1 -1
  240. package/dist/client/context-xray/format.d.ts +11 -0
  241. package/dist/client/context-xray/format.d.ts.map +1 -1
  242. package/dist/client/context-xray/format.js +16 -0
  243. package/dist/client/context-xray/format.js.map +1 -1
  244. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  245. package/dist/client/conversation/AgentConversation.js +8 -53
  246. package/dist/client/conversation/AgentConversation.js.map +1 -1
  247. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts +1 -1
  248. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts.map +1 -1
  249. package/dist/client/conversation/use-near-bottom-autoscroll.js +14 -1
  250. package/dist/client/conversation/use-near-bottom-autoscroll.js.map +1 -1
  251. package/dist/client/create-query-client.d.ts +28 -0
  252. package/dist/client/create-query-client.d.ts.map +1 -0
  253. package/dist/client/create-query-client.js +78 -0
  254. package/dist/client/create-query-client.js.map +1 -0
  255. package/dist/client/db-admin/DevDatabaseLink.d.ts +1 -1
  256. package/dist/client/db-admin/DevDatabaseLink.d.ts.map +1 -1
  257. package/dist/client/db-admin/RowSidePanel.d.ts +1 -1
  258. package/dist/client/db-admin/RowSidePanel.d.ts.map +1 -1
  259. package/dist/client/db-admin/RowSidePanel.js +2 -2
  260. package/dist/client/db-admin/RowSidePanel.js.map +1 -1
  261. package/dist/client/db-admin/TableEditor.d.ts +1 -1
  262. package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
  263. package/dist/client/db-admin/TableEditor.js +1 -1
  264. package/dist/client/db-admin/TableEditor.js.map +1 -1
  265. package/dist/client/db-admin/cell-format.d.ts +1 -1
  266. package/dist/client/db-admin/cell-format.d.ts.map +1 -1
  267. package/dist/client/dev-overlay/DevOverlay.d.ts +1 -1
  268. package/dist/client/dev-overlay/DevOverlay.d.ts.map +1 -1
  269. package/dist/client/editor/index.d.ts +2 -0
  270. package/dist/client/editor/index.d.ts.map +1 -0
  271. package/dist/client/editor/index.js +2 -0
  272. package/dist/client/editor/index.js.map +1 -0
  273. package/dist/client/error-format.d.ts.map +1 -1
  274. package/dist/client/error-format.js +4 -0
  275. package/dist/client/error-format.js.map +1 -1
  276. package/dist/client/extensions/AgentNativeExtensionFrame.d.ts +1 -1
  277. package/dist/client/extensions/AgentNativeExtensionFrame.d.ts.map +1 -1
  278. package/dist/client/extensions/EmbeddedExtension.d.ts +1 -1
  279. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  280. package/dist/client/extensions/ExtensionSlot.d.ts +1 -1
  281. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  282. package/dist/client/extensions/ExtensionViewerPage.d.ts +1 -1
  283. package/dist/client/extensions/ExtensionViewerPage.d.ts.map +1 -1
  284. package/dist/client/guided-questions.d.ts +6 -6
  285. package/dist/client/host-bridge.d.ts.map +1 -1
  286. package/dist/client/host-bridge.js +2 -0
  287. package/dist/client/host-bridge.js.map +1 -1
  288. package/dist/client/index.d.ts +7 -6
  289. package/dist/client/index.d.ts.map +1 -1
  290. package/dist/client/index.js +5 -3
  291. package/dist/client/index.js.map +1 -1
  292. package/dist/client/onboarding/OnboardingBanner.d.ts +1 -1
  293. package/dist/client/onboarding/OnboardingBanner.d.ts.map +1 -1
  294. package/dist/client/onboarding/OnboardingPanel.d.ts +1 -1
  295. package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
  296. package/dist/client/onboarding/SetupButton.d.ts +1 -1
  297. package/dist/client/onboarding/SetupButton.d.ts.map +1 -1
  298. package/dist/client/org/InvitationBanner.d.ts +1 -1
  299. package/dist/client/org/InvitationBanner.d.ts.map +1 -1
  300. package/dist/client/org/OrgSwitcher.d.ts +1 -1
  301. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  302. package/dist/client/org/RequireActiveOrg.d.ts +1 -1
  303. package/dist/client/org/RequireActiveOrg.d.ts.map +1 -1
  304. package/dist/client/org/hooks.d.ts +3 -3
  305. package/dist/client/org/hooks.d.ts.map +1 -1
  306. package/dist/client/progress/RunsTray.d.ts +2 -2
  307. package/dist/client/progress/RunsTray.d.ts.map +1 -1
  308. package/dist/client/progress/RunsTray.js +34 -9
  309. package/dist/client/progress/RunsTray.js.map +1 -1
  310. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  311. package/dist/client/resources/ResourceEditor.js +1 -1
  312. package/dist/client/resources/ResourceEditor.js.map +1 -1
  313. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  314. package/dist/client/resources/ResourcesPanel.js +2 -0
  315. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  316. package/dist/client/rich-markdown-editor/BubbleToolbar.d.ts +1 -1
  317. package/dist/client/rich-markdown-editor/BubbleToolbar.d.ts.map +1 -1
  318. package/dist/client/rich-markdown-editor/CodeBlockNode.d.ts.map +1 -1
  319. package/dist/client/rich-markdown-editor/CodeBlockNode.js +2 -1
  320. package/dist/client/rich-markdown-editor/CodeBlockNode.js.map +1 -1
  321. package/dist/client/rich-markdown-editor/ImageExtension.d.ts.map +1 -1
  322. package/dist/client/rich-markdown-editor/ImageExtension.js +2 -1
  323. package/dist/client/rich-markdown-editor/ImageExtension.js.map +1 -1
  324. package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts +1 -1
  325. package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts.map +1 -1
  326. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +1 -1
  327. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
  328. package/dist/client/rich-markdown-editor/RichMarkdownEditor.d.ts +1 -1
  329. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
  330. package/dist/client/rich-markdown-editor/SharedRichEditor.js +2 -3
  331. package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
  332. package/dist/client/rich-markdown-editor/SlashCommandMenu.d.ts +1 -1
  333. package/dist/client/rich-markdown-editor/SlashCommandMenu.d.ts.map +1 -1
  334. package/dist/client/route-state.d.ts +12 -2
  335. package/dist/client/route-state.d.ts.map +1 -1
  336. package/dist/client/route-state.js +1 -1
  337. package/dist/client/route-state.js.map +1 -1
  338. package/dist/client/route-warmup.d.ts +1 -1
  339. package/dist/client/route-warmup.d.ts.map +1 -1
  340. package/dist/client/settings/VoiceTranscriptionSection.js +1 -1
  341. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  342. package/dist/client/settings/useBuilderStatus.d.ts +2 -2
  343. package/dist/client/sharing/ShareDialog.d.ts +1 -1
  344. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  345. package/dist/client/sse-event-processor.d.ts +8 -0
  346. package/dist/client/sse-event-processor.d.ts.map +1 -1
  347. package/dist/client/sse-event-processor.js +33 -10
  348. package/dist/client/sse-event-processor.js.map +1 -1
  349. package/dist/client/terminal/AgentTerminal.d.ts +1 -1
  350. package/dist/client/terminal/AgentTerminal.d.ts.map +1 -1
  351. package/dist/client/terminal/AgentTerminal.js +4 -2
  352. package/dist/client/terminal/AgentTerminal.js.map +1 -1
  353. package/dist/client/tool-cells/BashCell.d.ts +25 -0
  354. package/dist/client/tool-cells/BashCell.d.ts.map +1 -0
  355. package/dist/client/tool-cells/BashCell.js +49 -0
  356. package/dist/client/tool-cells/BashCell.js.map +1 -0
  357. package/dist/client/tool-cells/EditCell.d.ts +24 -0
  358. package/dist/client/tool-cells/EditCell.d.ts.map +1 -0
  359. package/dist/client/tool-cells/EditCell.js +126 -0
  360. package/dist/client/tool-cells/EditCell.js.map +1 -0
  361. package/dist/client/tool-cells/FilesChangedSummary.d.ts +13 -0
  362. package/dist/client/tool-cells/FilesChangedSummary.d.ts.map +1 -0
  363. package/dist/client/tool-cells/FilesChangedSummary.js +98 -0
  364. package/dist/client/tool-cells/FilesChangedSummary.js.map +1 -0
  365. package/dist/client/tool-cells/WriteCell.d.ts +17 -0
  366. package/dist/client/tool-cells/WriteCell.d.ts.map +1 -0
  367. package/dist/client/tool-cells/WriteCell.js +26 -0
  368. package/dist/client/tool-cells/WriteCell.js.map +1 -0
  369. package/dist/client/tool-cells/index.d.ts +8 -0
  370. package/dist/client/tool-cells/index.d.ts.map +1 -0
  371. package/dist/client/tool-cells/index.js +5 -0
  372. package/dist/client/tool-cells/index.js.map +1 -0
  373. package/dist/client/transcription/BuilderTranscriptionCta.d.ts +1 -1
  374. package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -1
  375. package/dist/client/use-chat-threads.d.ts +1 -1
  376. package/dist/client/use-chat-threads.d.ts.map +1 -1
  377. package/dist/client/use-chat-threads.js +11 -8
  378. package/dist/client/use-chat-threads.js.map +1 -1
  379. package/dist/client/use-db-sync.d.ts +2 -0
  380. package/dist/client/use-db-sync.d.ts.map +1 -1
  381. package/dist/client/use-db-sync.js +329 -302
  382. package/dist/client/use-db-sync.js.map +1 -1
  383. package/dist/code-agents/transcript-normalizer.d.ts +15 -1
  384. package/dist/code-agents/transcript-normalizer.d.ts.map +1 -1
  385. package/dist/code-agents/transcript-normalizer.js +47 -0
  386. package/dist/code-agents/transcript-normalizer.js.map +1 -1
  387. package/dist/coding-tools/index.d.ts +75 -0
  388. package/dist/coding-tools/index.d.ts.map +1 -1
  389. package/dist/coding-tools/index.js +137 -10
  390. package/dist/coding-tools/index.js.map +1 -1
  391. package/dist/collab/client.d.ts.map +1 -1
  392. package/dist/collab/client.js +15 -9
  393. package/dist/collab/client.js.map +1 -1
  394. package/dist/collab/ydoc-manager.d.ts +1 -1
  395. package/dist/collab/ydoc-manager.d.ts.map +1 -1
  396. package/dist/collab/ydoc-manager.js +1 -1
  397. package/dist/collab/ydoc-manager.js.map +1 -1
  398. package/dist/db/client.d.ts +9 -1
  399. package/dist/db/client.d.ts.map +1 -1
  400. package/dist/db/client.js +204 -48
  401. package/dist/db/client.js.map +1 -1
  402. package/dist/db/create-get-db.d.ts +38 -0
  403. package/dist/db/create-get-db.d.ts.map +1 -1
  404. package/dist/db/create-get-db.js +204 -4
  405. package/dist/db/create-get-db.js.map +1 -1
  406. package/dist/db/migrations.d.ts.map +1 -1
  407. package/dist/db/migrations.js +159 -67
  408. package/dist/db/migrations.js.map +1 -1
  409. package/dist/demo/actions/toggle-demo-mode.d.ts +6 -1
  410. package/dist/demo/actions/toggle-demo-mode.d.ts.map +1 -1
  411. package/dist/deploy/build.d.ts.map +1 -1
  412. package/dist/deploy/build.js +80 -39
  413. package/dist/deploy/build.js.map +1 -1
  414. package/dist/deploy/workspace-deploy.js +20 -10
  415. package/dist/deploy/workspace-deploy.js.map +1 -1
  416. package/dist/extensions/schema.d.ts +51 -51
  417. package/dist/extensions/slots/schema.d.ts +13 -13
  418. package/dist/file-upload/actions/upload-image.d.ts +26 -1
  419. package/dist/file-upload/actions/upload-image.d.ts.map +1 -1
  420. package/dist/file-upload/index.d.ts +1 -1
  421. package/dist/file-upload/index.d.ts.map +1 -1
  422. package/dist/file-upload/index.js +1 -1
  423. package/dist/file-upload/index.js.map +1 -1
  424. package/dist/file-upload/pre-upload-attachments.d.ts +37 -0
  425. package/dist/file-upload/pre-upload-attachments.d.ts.map +1 -1
  426. package/dist/file-upload/pre-upload-attachments.js +79 -19
  427. package/dist/file-upload/pre-upload-attachments.js.map +1 -1
  428. package/dist/index.d.ts +1 -1
  429. package/dist/index.d.ts.map +1 -1
  430. package/dist/index.js.map +1 -1
  431. package/dist/integrations/adapters/slack.js +1 -1
  432. package/dist/integrations/adapters/slack.js.map +1 -1
  433. package/dist/integrations/plugin.js +1 -1
  434. package/dist/integrations/plugin.js.map +1 -1
  435. package/dist/jobs/scheduler.js +70 -21
  436. package/dist/jobs/scheduler.js.map +1 -1
  437. package/dist/mcp/actions/create-org-service-token.d.ts +14 -0
  438. package/dist/mcp/actions/create-org-service-token.d.ts.map +1 -0
  439. package/dist/mcp/actions/create-org-service-token.js +74 -0
  440. package/dist/mcp/actions/create-org-service-token.js.map +1 -0
  441. package/dist/mcp/actions/list-org-service-tokens.d.ts +17 -0
  442. package/dist/mcp/actions/list-org-service-tokens.d.ts.map +1 -0
  443. package/dist/mcp/actions/list-org-service-tokens.js +42 -0
  444. package/dist/mcp/actions/list-org-service-tokens.js.map +1 -0
  445. package/dist/mcp/actions/revoke-org-service-token.d.ts +7 -0
  446. package/dist/mcp/actions/revoke-org-service-token.d.ts.map +1 -0
  447. package/dist/mcp/actions/revoke-org-service-token.js +28 -0
  448. package/dist/mcp/actions/revoke-org-service-token.js.map +1 -0
  449. package/dist/mcp/actions/service-token-access.d.ts +24 -0
  450. package/dist/mcp/actions/service-token-access.d.ts.map +1 -0
  451. package/dist/mcp/actions/service-token-access.js +63 -0
  452. package/dist/mcp/actions/service-token-access.js.map +1 -0
  453. package/dist/mcp/build-server.d.ts +42 -11
  454. package/dist/mcp/build-server.d.ts.map +1 -1
  455. package/dist/mcp/build-server.js +53 -3
  456. package/dist/mcp/build-server.js.map +1 -1
  457. package/dist/mcp/connect-route.d.ts +35 -0
  458. package/dist/mcp/connect-route.d.ts.map +1 -1
  459. package/dist/mcp/connect-route.js +57 -2
  460. package/dist/mcp/connect-route.js.map +1 -1
  461. package/dist/mcp/connect-store.d.ts +43 -0
  462. package/dist/mcp/connect-store.d.ts.map +1 -1
  463. package/dist/mcp/connect-store.js +129 -12
  464. package/dist/mcp/connect-store.js.map +1 -1
  465. package/dist/mcp/oauth-token.d.ts +10 -0
  466. package/dist/mcp/oauth-token.d.ts.map +1 -1
  467. package/dist/mcp/oauth-token.js +2 -0
  468. package/dist/mcp/oauth-token.js.map +1 -1
  469. package/dist/mcp/server.d.ts.map +1 -1
  470. package/dist/mcp/server.js +3 -0
  471. package/dist/mcp/server.js.map +1 -1
  472. package/dist/mcp-client/routes.js +1 -1
  473. package/dist/mcp-client/routes.js.map +1 -1
  474. package/dist/org/context.d.ts +4 -0
  475. package/dist/org/context.d.ts.map +1 -1
  476. package/dist/org/context.js +10 -0
  477. package/dist/org/context.js.map +1 -1
  478. package/dist/org/handlers.d.ts +11 -7
  479. package/dist/org/handlers.d.ts.map +1 -1
  480. package/dist/org/handlers.js +0 -8
  481. package/dist/org/handlers.js.map +1 -1
  482. package/dist/org/migrations.d.ts.map +1 -1
  483. package/dist/org/migrations.js +8 -0
  484. package/dist/org/migrations.js.map +1 -1
  485. package/dist/org/schema.d.ts +15 -15
  486. package/dist/progress/actions.d.ts.map +1 -1
  487. package/dist/progress/actions.js +13 -5
  488. package/dist/progress/actions.js.map +1 -1
  489. package/dist/provider-api/actions/delete-staged-dataset.d.ts +9 -0
  490. package/dist/provider-api/actions/delete-staged-dataset.d.ts.map +1 -0
  491. package/dist/provider-api/actions/delete-staged-dataset.js +35 -0
  492. package/dist/provider-api/actions/delete-staged-dataset.js.map +1 -0
  493. package/dist/provider-api/actions/list-staged-datasets.d.ts +15 -0
  494. package/dist/provider-api/actions/list-staged-datasets.d.ts.map +1 -0
  495. package/dist/provider-api/actions/list-staged-datasets.js +41 -0
  496. package/dist/provider-api/actions/list-staged-datasets.js.map +1 -0
  497. package/dist/provider-api/actions/query-staged-dataset.d.ts +29 -0
  498. package/dist/provider-api/actions/query-staged-dataset.d.ts.map +1 -0
  499. package/dist/provider-api/actions/query-staged-dataset.js +116 -0
  500. package/dist/provider-api/actions/query-staged-dataset.js.map +1 -0
  501. package/dist/provider-api/custom-registry.d.ts.map +1 -1
  502. package/dist/provider-api/custom-registry.js.map +1 -1
  503. package/dist/provider-api/index.d.ts +10 -10
  504. package/dist/provider-api/index.js +0 -5
  505. package/dist/provider-api/index.js.map +1 -1
  506. package/dist/provider-api/staged-datasets-aggregate.d.ts +46 -0
  507. package/dist/provider-api/staged-datasets-aggregate.d.ts.map +1 -0
  508. package/dist/provider-api/staged-datasets-aggregate.js +209 -0
  509. package/dist/provider-api/staged-datasets-aggregate.js.map +1 -0
  510. package/dist/provider-api/staged-datasets-store.d.ts +76 -0
  511. package/dist/provider-api/staged-datasets-store.d.ts.map +1 -0
  512. package/dist/provider-api/staged-datasets-store.js +319 -0
  513. package/dist/provider-api/staged-datasets-store.js.map +1 -0
  514. package/dist/provider-api/staging.d.ts +100 -0
  515. package/dist/provider-api/staging.d.ts.map +1 -0
  516. package/dist/provider-api/staging.js +281 -0
  517. package/dist/provider-api/staging.js.map +1 -0
  518. package/dist/resources/handlers.d.ts.map +1 -1
  519. package/dist/resources/handlers.js +13 -1
  520. package/dist/resources/handlers.js.map +1 -1
  521. package/dist/scripts/call-agent.d.ts.map +1 -1
  522. package/dist/scripts/call-agent.js +1 -2
  523. package/dist/scripts/call-agent.js.map +1 -1
  524. package/dist/scripts/resources/migrate-learnings.d.ts +1 -1
  525. package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -1
  526. package/dist/scripts/resources/migrate-learnings.js +1 -1
  527. package/dist/scripts/resources/migrate-learnings.js.map +1 -1
  528. package/dist/secrets/schema.d.ts +7 -7
  529. package/dist/server/action-discovery.d.ts.map +1 -1
  530. package/dist/server/action-discovery.js +14 -0
  531. package/dist/server/action-discovery.js.map +1 -1
  532. package/dist/server/action-routes.d.ts.map +1 -1
  533. package/dist/server/action-routes.js +3 -2
  534. package/dist/server/action-routes.js.map +1 -1
  535. package/dist/server/agent-chat-plugin.d.ts +33 -0
  536. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  537. package/dist/server/agent-chat-plugin.js +251 -180
  538. package/dist/server/agent-chat-plugin.js.map +1 -1
  539. package/dist/server/agent-discovery.d.ts.map +1 -1
  540. package/dist/server/agent-discovery.js +13 -16
  541. package/dist/server/agent-discovery.js.map +1 -1
  542. package/dist/server/agent-teams-run-queue.d.ts +31 -8
  543. package/dist/server/agent-teams-run-queue.d.ts.map +1 -1
  544. package/dist/server/agent-teams-run-queue.js +61 -18
  545. package/dist/server/agent-teams-run-queue.js.map +1 -1
  546. package/dist/server/agent-teams.d.ts +27 -1
  547. package/dist/server/agent-teams.d.ts.map +1 -1
  548. package/dist/server/agent-teams.js +214 -14
  549. package/dist/server/agent-teams.js.map +1 -1
  550. package/dist/server/app-base-path.d.ts +20 -0
  551. package/dist/server/app-base-path.d.ts.map +1 -1
  552. package/dist/server/app-base-path.js +36 -0
  553. package/dist/server/app-base-path.js.map +1 -1
  554. package/dist/server/attachment-actions.d.ts +43 -0
  555. package/dist/server/attachment-actions.d.ts.map +1 -0
  556. package/dist/server/attachment-actions.js +214 -0
  557. package/dist/server/attachment-actions.js.map +1 -0
  558. package/dist/server/auth.js +1 -1
  559. package/dist/server/auth.js.map +1 -1
  560. package/dist/server/complete-text.d.ts +56 -0
  561. package/dist/server/complete-text.d.ts.map +1 -0
  562. package/dist/server/complete-text.js +147 -0
  563. package/dist/server/complete-text.js.map +1 -0
  564. package/dist/server/core-routes-plugin.d.ts +1 -0
  565. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  566. package/dist/server/core-routes-plugin.js +37 -27
  567. package/dist/server/core-routes-plugin.js.map +1 -1
  568. package/dist/server/cors-origins.d.ts.map +1 -1
  569. package/dist/server/cors-origins.js +6 -1
  570. package/dist/server/cors-origins.js.map +1 -1
  571. package/dist/server/create-server.d.ts.map +1 -1
  572. package/dist/server/create-server.js +2 -1
  573. package/dist/server/create-server.js.map +1 -1
  574. package/dist/server/csrf.d.ts +1 -1
  575. package/dist/server/csrf.d.ts.map +1 -1
  576. package/dist/server/email-actions.d.ts +19 -0
  577. package/dist/server/email-actions.d.ts.map +1 -0
  578. package/dist/server/email-actions.js +191 -0
  579. package/dist/server/email-actions.js.map +1 -0
  580. package/dist/server/embed-route.js +1 -1
  581. package/dist/server/embed-route.js.map +1 -1
  582. package/dist/server/embed-session.d.ts.map +1 -1
  583. package/dist/server/embed-session.js +5 -1
  584. package/dist/server/embed-session.js.map +1 -1
  585. package/dist/server/entry-server.d.ts +24 -0
  586. package/dist/server/entry-server.d.ts.map +1 -0
  587. package/dist/server/entry-server.js +54 -0
  588. package/dist/server/entry-server.js.map +1 -0
  589. package/dist/server/framework-request-handler.d.ts.map +1 -1
  590. package/dist/server/framework-request-handler.js +2 -10
  591. package/dist/server/framework-request-handler.js.map +1 -1
  592. package/dist/server/google-oauth.d.ts.map +1 -1
  593. package/dist/server/google-oauth.js +2 -9
  594. package/dist/server/google-oauth.js.map +1 -1
  595. package/dist/server/google-realtime-session.d.ts.map +1 -1
  596. package/dist/server/google-realtime-session.js +6 -4
  597. package/dist/server/google-realtime-session.js.map +1 -1
  598. package/dist/server/h3-helpers.d.ts +39 -0
  599. package/dist/server/h3-helpers.d.ts.map +1 -1
  600. package/dist/server/h3-helpers.js +104 -1
  601. package/dist/server/h3-helpers.js.map +1 -1
  602. package/dist/server/index.d.ts +2 -1
  603. package/dist/server/index.d.ts.map +1 -1
  604. package/dist/server/index.js +2 -1
  605. package/dist/server/index.js.map +1 -1
  606. package/dist/server/onboarding-html.d.ts.map +1 -1
  607. package/dist/server/onboarding-html.js +1 -8
  608. package/dist/server/onboarding-html.js.map +1 -1
  609. package/dist/server/open-route.d.ts.map +1 -1
  610. package/dist/server/open-route.js +1 -0
  611. package/dist/server/open-route.js.map +1 -1
  612. package/dist/server/prompts/framework-core-compact.d.ts +19 -0
  613. package/dist/server/prompts/framework-core-compact.d.ts.map +1 -0
  614. package/dist/server/prompts/framework-core-compact.js +69 -0
  615. package/dist/server/prompts/framework-core-compact.js.map +1 -0
  616. package/dist/server/prompts/framework-core.d.ts +26 -0
  617. package/dist/server/prompts/framework-core.d.ts.map +1 -0
  618. package/dist/server/prompts/framework-core.js +130 -0
  619. package/dist/server/prompts/framework-core.js.map +1 -0
  620. package/dist/server/prompts/index.d.ts +9 -0
  621. package/dist/server/prompts/index.d.ts.map +1 -0
  622. package/dist/server/prompts/index.js +9 -0
  623. package/dist/server/prompts/index.js.map +1 -0
  624. package/dist/server/prompts/model-overlays.d.ts +18 -0
  625. package/dist/server/prompts/model-overlays.d.ts.map +1 -0
  626. package/dist/server/prompts/model-overlays.js +46 -0
  627. package/dist/server/prompts/model-overlays.js.map +1 -0
  628. package/dist/server/prompts/shared-rules.d.ts +29 -0
  629. package/dist/server/prompts/shared-rules.d.ts.map +1 -0
  630. package/dist/server/prompts/shared-rules.js +54 -0
  631. package/dist/server/prompts/shared-rules.js.map +1 -0
  632. package/dist/server/security-headers.d.ts +7 -1
  633. package/dist/server/security-headers.d.ts.map +1 -1
  634. package/dist/server/security-headers.js +11 -0
  635. package/dist/server/security-headers.js.map +1 -1
  636. package/dist/server/ssr-handler.d.ts.map +1 -1
  637. package/dist/server/ssr-handler.js +135 -46
  638. package/dist/server/ssr-handler.js.map +1 -1
  639. package/dist/server/transcribe-voice.d.ts.map +1 -1
  640. package/dist/server/transcribe-voice.js +7 -4
  641. package/dist/server/transcribe-voice.js.map +1 -1
  642. package/dist/settings/store.d.ts.map +1 -1
  643. package/dist/settings/store.js +9 -0
  644. package/dist/settings/store.js.map +1 -1
  645. package/dist/shared/markdown-block-split.d.ts +39 -0
  646. package/dist/shared/markdown-block-split.d.ts.map +1 -0
  647. package/dist/shared/markdown-block-split.js +97 -0
  648. package/dist/shared/markdown-block-split.js.map +1 -0
  649. package/dist/shared/reasoning-effort.js +13 -1
  650. package/dist/shared/reasoning-effort.js.map +1 -1
  651. package/dist/shared/streaming-text-smoothing.d.ts +18 -0
  652. package/dist/shared/streaming-text-smoothing.d.ts.map +1 -1
  653. package/dist/shared/streaming-text-smoothing.js +70 -4
  654. package/dist/shared/streaming-text-smoothing.js.map +1 -1
  655. package/dist/sharing/actions/list-resource-shares.d.ts +24 -1
  656. package/dist/sharing/actions/list-resource-shares.d.ts.map +1 -1
  657. package/dist/sharing/actions/set-resource-visibility.d.ts +8 -1
  658. package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
  659. package/dist/sharing/actions/share-resource.d.ts +12 -1
  660. package/dist/sharing/actions/share-resource.d.ts.map +1 -1
  661. package/dist/sharing/actions/unshare-resource.d.ts +8 -1
  662. package/dist/sharing/actions/unshare-resource.d.ts.map +1 -1
  663. package/dist/sharing/schema.d.ts +10 -10
  664. package/dist/styles/agent-conversation.css +239 -0
  665. package/dist/templates/default/.agents/skills/delegate-to-agent/SKILL.md +50 -2
  666. package/dist/templates/default/AGENTS.md +1 -1
  667. package/dist/templates/default/DEVELOPING.md +19 -0
  668. package/dist/templates/default/app/entry.client.tsx +4 -1
  669. package/dist/templates/default/app/entry.server.tsx +4 -56
  670. package/dist/templates/default/app/global.css +3 -2
  671. package/dist/templates/default/app/root.tsx +8 -24
  672. package/dist/templates/default/app/routes/_index.tsx +0 -13
  673. package/dist/templates/default/package.json +6 -5
  674. package/dist/templates/default/tsconfig.json +2 -1
  675. package/dist/templates/starter-shell-sync.spec.ts +118 -0
  676. package/dist/templates/ui-primitives-sync.spec.ts +399 -0
  677. package/dist/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +50 -2
  678. package/dist/terminal/pty-server.js +1 -1
  679. package/dist/terminal/pty-server.js.map +1 -1
  680. package/dist/triggers/dispatcher.js +1 -1
  681. package/dist/triggers/dispatcher.js.map +1 -1
  682. package/dist/usage/store.d.ts.map +1 -1
  683. package/dist/usage/store.js +60 -7
  684. package/dist/usage/store.js.map +1 -1
  685. package/dist/vite/client.d.ts.map +1 -1
  686. package/dist/vite/client.js +44 -12
  687. package/dist/vite/client.js.map +1 -1
  688. package/dist/workspace-files/schema.d.ts +8 -8
  689. package/dist/workspace-files/tool.d.ts.map +1 -1
  690. package/dist/workspace-files/tool.js +0 -1
  691. package/dist/workspace-files/tool.js.map +1 -1
  692. package/docs/content/a2a-protocol.md +18 -12
  693. package/docs/content/actions.md +42 -10
  694. package/docs/content/agent-mentions.md +7 -8
  695. package/docs/content/agent-teams.md +23 -37
  696. package/docs/content/agent-web-surfaces.md +18 -9
  697. package/docs/content/authentication.md +6 -17
  698. package/docs/content/automations.md +43 -15
  699. package/docs/content/cli-adapters.md +25 -24
  700. package/docs/content/client.md +66 -17
  701. package/docs/content/cloneable-saas.md +19 -23
  702. package/docs/content/code-agents-ui.md +3 -31
  703. package/docs/content/components.md +308 -0
  704. package/docs/content/context-awareness.md +4 -0
  705. package/docs/content/creating-templates.md +4 -2
  706. package/docs/content/cross-app-sso.md +45 -19
  707. package/docs/content/database.md +26 -1
  708. package/docs/content/deployment.md +3 -1
  709. package/docs/content/dispatch.md +9 -37
  710. package/docs/content/drop-in-agent.md +123 -2
  711. package/docs/content/embedding-sdk.md +35 -0
  712. package/docs/content/extensions.md +2 -2
  713. package/docs/content/external-agents.md +86 -171
  714. package/docs/content/faq.md +6 -27
  715. package/docs/content/frames.md +9 -12
  716. package/docs/content/getting-started.md +80 -77
  717. package/docs/content/key-concepts.md +29 -19
  718. package/docs/content/mcp-apps.md +103 -0
  719. package/docs/content/mcp-clients.md +2 -2
  720. package/docs/content/mcp-protocol.md +40 -17
  721. package/docs/content/messaging.md +11 -4
  722. package/docs/content/migration-workbench.md +4 -47
  723. package/docs/content/multi-app-workspace.md +48 -17
  724. package/docs/content/multi-tenancy.md +1 -1
  725. package/docs/content/notifications.md +8 -6
  726. package/docs/content/observability.md +26 -15
  727. package/docs/content/onboarding.md +7 -1
  728. package/docs/content/pr-visual-recap.md +203 -23
  729. package/docs/content/progress.md +5 -5
  730. package/docs/content/pure-agent-apps.md +3 -1
  731. package/docs/content/real-time-collaboration.md +106 -0
  732. package/docs/content/recurring-jobs.md +17 -1
  733. package/docs/content/security.md +17 -3
  734. package/docs/content/server.md +39 -3
  735. package/docs/content/sharing.md +20 -1
  736. package/docs/content/skills-guide.md +151 -125
  737. package/docs/content/template-analytics.md +8 -0
  738. package/docs/content/template-assets.md +2 -0
  739. package/docs/content/template-brain.md +59 -3
  740. package/docs/content/template-calendar.md +8 -0
  741. package/docs/content/template-clips.md +11 -2
  742. package/docs/content/template-content.md +24 -4
  743. package/docs/content/template-design.md +19 -17
  744. package/docs/content/template-dispatch.md +2 -0
  745. package/docs/content/template-forms.md +28 -1
  746. package/docs/content/template-mail.md +17 -0
  747. package/docs/content/template-plan.md +177 -10
  748. package/docs/content/template-slides.md +51 -12
  749. package/docs/content/template-videos.md +17 -0
  750. package/docs/content/tracking.md +17 -13
  751. package/docs/content/using-your-agent.md +15 -5
  752. package/docs/content/voice-input.md +1 -1
  753. package/docs/content/what-is-agent-native.md +5 -6
  754. package/docs/content/workspace-connections.md +138 -424
  755. package/docs/content/workspace-management.md +12 -128
  756. package/docs/content/workspace.md +125 -199
  757. package/docs/content/writing-agent-instructions.md +17 -1
  758. package/package.json +25 -6
  759. package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +50 -2
  760. package/src/templates/default/AGENTS.md +1 -1
  761. package/src/templates/default/DEVELOPING.md +19 -0
  762. package/src/templates/default/app/entry.client.tsx +4 -1
  763. package/src/templates/default/app/entry.server.tsx +4 -56
  764. package/src/templates/default/app/global.css +3 -2
  765. package/src/templates/default/app/root.tsx +8 -24
  766. package/src/templates/default/app/routes/_index.tsx +0 -13
  767. package/src/templates/default/package.json +6 -5
  768. package/src/templates/default/tsconfig.json +2 -1
  769. package/src/templates/starter-shell-sync.spec.ts +118 -0
  770. package/src/templates/ui-primitives-sync.spec.ts +399 -0
  771. package/src/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +50 -2
  772. package/tsconfig.base.json +2 -10
  773. package/dist/cli/app-skill.d.ts +0 -157
  774. package/dist/cli/app-skill.d.ts.map +0 -1
  775. package/dist/cli/audit-agent-web.d.ts +0 -2
  776. package/dist/cli/audit-agent-web.d.ts.map +0 -1
  777. package/dist/cli/code-agent-connector.d.ts +0 -17
  778. package/dist/cli/code-agent-connector.d.ts.map +0 -1
  779. package/dist/cli/code.d.ts +0 -66
  780. package/dist/cli/code.d.ts.map +0 -1
  781. package/dist/cli/connect.d.ts +0 -140
  782. package/dist/cli/connect.d.ts.map +0 -1
  783. package/dist/cli/context-xray-local.d.ts +0 -16
  784. package/dist/cli/context-xray-local.d.ts.map +0 -1
  785. package/dist/cli/create-workspace.d.ts +0 -8
  786. package/dist/cli/create-workspace.d.ts.map +0 -1
  787. package/dist/cli/index.d.ts +0 -3
  788. package/dist/cli/index.d.ts.map +0 -1
  789. package/dist/cli/info.d.ts +0 -2
  790. package/dist/cli/info.d.ts.map +0 -1
  791. package/dist/cli/mcp-config-writers.d.ts +0 -82
  792. package/dist/cli/mcp-config-writers.d.ts.map +0 -1
  793. package/dist/cli/mcp.d.ts +0 -16
  794. package/dist/cli/mcp.d.ts.map +0 -1
  795. package/dist/cli/migrate.d.ts +0 -38
  796. package/dist/cli/migrate.d.ts.map +0 -1
  797. package/dist/cli/plan-local.d.ts +0 -43
  798. package/dist/cli/plan-local.d.ts.map +0 -1
  799. package/dist/cli/plan-publish-store.d.ts +0 -62
  800. package/dist/cli/plan-publish-store.d.ts.map +0 -1
  801. package/dist/cli/pr-visual-recap-workflow.d.ts +0 -11
  802. package/dist/cli/pr-visual-recap-workflow.d.ts.map +0 -1
  803. package/dist/cli/recap.d.ts +0 -297
  804. package/dist/cli/recap.d.ts.map +0 -1
  805. package/dist/cli/skills.d.ts +0 -162
  806. package/dist/cli/skills.d.ts.map +0 -1
  807. package/dist/cli/workspace-dev.d.ts +0 -96
  808. package/dist/cli/workspace-dev.d.ts.map +0 -1
@@ -0,0 +1,24 @@
1
+ /**
2
+ * EditCell — renders an edit tool call as a syntax-highlighted unified diff.
3
+ *
4
+ * The diff is computed client-side from oldText / newText stored in the
5
+ * structured metadata. The HighlightedCodeBlock from AssistantChat is not
6
+ * accessible here, so we do a lightweight line-diff + per-line class approach
7
+ * instead (no dep on shiki required for the diff view itself).
8
+ *
9
+ * Collapsed by default beyond MAX_COLLAPSED_LINES; expand button shows all.
10
+ */
11
+ export interface EditCellMeta {
12
+ toolKind: "edit";
13
+ filePath: string;
14
+ oldText?: string;
15
+ newText?: string;
16
+ truncated?: boolean;
17
+ }
18
+ interface EditCellProps {
19
+ meta: EditCellMeta;
20
+ isRunning: boolean;
21
+ }
22
+ export declare function EditCell({ meta, isRunning }: EditCellProps): import("react/jsx-runtime").JSX.Element;
23
+ export {};
24
+ //# sourceMappingURL=EditCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditCell.d.ts","sourceRoot":"","sources":["../../../src/client/tool-cells/EditCell.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AA2KD,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,aAAa,2CAgG1D"}
@@ -0,0 +1,126 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * EditCell — renders an edit tool call as a syntax-highlighted unified diff.
4
+ *
5
+ * The diff is computed client-side from oldText / newText stored in the
6
+ * structured metadata. The HighlightedCodeBlock from AssistantChat is not
7
+ * accessible here, so we do a lightweight line-diff + per-line class approach
8
+ * instead (no dep on shiki required for the diff view itself).
9
+ *
10
+ * Collapsed by default beyond MAX_COLLAPSED_LINES; expand button shows all.
11
+ */
12
+ import { memo, useMemo, useState } from "react";
13
+ import { IconChevronDown, IconFile, IconFileDiff, IconLoader2, } from "@tabler/icons-react";
14
+ import { cn } from "../utils.js";
15
+ /** Lines shown collapsed before "expand" is offered. */
16
+ const MAX_COLLAPSED_LINES = 40;
17
+ function computeLineDiff(oldText, newText) {
18
+ const oldLines = oldText.split("\n");
19
+ const newLines = newText.split("\n");
20
+ // Simple Myers-style LCS via DP for line-level diffs.
21
+ // For very large files we cap input to keep it snappy.
22
+ const MAX_LINES = 2000;
23
+ const a = oldLines.slice(0, MAX_LINES);
24
+ const b = newLines.slice(0, MAX_LINES);
25
+ const m = a.length;
26
+ const n = b.length;
27
+ // Build LCS table
28
+ const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
29
+ for (let i = m - 1; i >= 0; i--) {
30
+ for (let j = n - 1; j >= 0; j--) {
31
+ if (a[i] === b[j]) {
32
+ dp[i][j] = dp[i + 1][j + 1] + 1;
33
+ }
34
+ else {
35
+ dp[i][j] = Math.max(dp[i + 1][j], dp[i][j + 1]);
36
+ }
37
+ }
38
+ }
39
+ const result = [];
40
+ let i = 0;
41
+ let j = 0;
42
+ let oldLineNo = 1;
43
+ let newLineNo = 1;
44
+ while (i < m || j < n) {
45
+ if (i < m && j < n && a[i] === b[j]) {
46
+ result.push({
47
+ kind: "context",
48
+ text: a[i],
49
+ oldLineNo: oldLineNo++,
50
+ newLineNo: newLineNo++,
51
+ });
52
+ i++;
53
+ j++;
54
+ }
55
+ else if (j < n && (i >= m || dp[i + 1][j] >= dp[i][j + 1])) {
56
+ result.push({ kind: "added", text: b[j], newLineNo: newLineNo++ });
57
+ j++;
58
+ }
59
+ else {
60
+ result.push({ kind: "removed", text: a[i], oldLineNo: oldLineNo++ });
61
+ i++;
62
+ }
63
+ }
64
+ // Append any overflow lines as context
65
+ if (oldLines.length > MAX_LINES) {
66
+ for (let k = MAX_LINES; k < oldLines.length; k++) {
67
+ result.push({
68
+ kind: "removed",
69
+ text: oldLines[k],
70
+ oldLineNo: oldLineNo++,
71
+ });
72
+ }
73
+ }
74
+ if (newLines.length > MAX_LINES) {
75
+ for (let k = MAX_LINES; k < newLines.length; k++) {
76
+ result.push({
77
+ kind: "added",
78
+ text: newLines[k],
79
+ newLineNo: newLineNo++,
80
+ });
81
+ }
82
+ }
83
+ return result;
84
+ }
85
+ /** Compute +N -N line counts from a diff. */
86
+ function diffStats(lines) {
87
+ let added = 0;
88
+ let removed = 0;
89
+ for (const line of lines) {
90
+ if (line.kind === "added")
91
+ added++;
92
+ else if (line.kind === "removed")
93
+ removed++;
94
+ }
95
+ return { added, removed };
96
+ }
97
+ // ─── Component ───────────────────────────────────────────────────────────────
98
+ const DiffView = memo(function DiffView({ lines, maxLines, }) {
99
+ const visible = maxLines === null ? lines : lines.slice(0, maxLines);
100
+ return (_jsx("div", { className: "overflow-x-auto", children: _jsx("table", { className: "w-full min-w-full border-collapse font-mono text-[11px] leading-relaxed", children: _jsx("tbody", { children: visible.map((line, idx) => (_jsxs("tr", { className: cn(line.kind === "added" &&
101
+ "bg-emerald-500/8 dark:bg-emerald-400/8", line.kind === "removed" && "bg-destructive/8"), children: [_jsx("td", { className: "w-8 select-none border-r border-border/30 px-1.5 text-right text-[10px] text-muted-foreground/60", children: line.oldLineNo ?? "" }), _jsx("td", { className: "w-8 select-none border-r border-border/30 px-1.5 text-right text-[10px] text-muted-foreground/60", children: line.newLineNo ?? "" }), _jsx("td", { className: cn("w-4 select-none text-center text-[10px] font-bold", line.kind === "added" &&
102
+ "text-emerald-600 dark:text-emerald-400", line.kind === "removed" && "text-destructive", line.kind === "context" && "text-muted-foreground/40"), children: line.kind === "added"
103
+ ? "+"
104
+ : line.kind === "removed"
105
+ ? "-"
106
+ : " " }), _jsx("td", { className: cn("px-2 text-foreground", line.kind === "added" &&
107
+ "text-emerald-800 dark:text-emerald-200", line.kind === "removed" && "text-red-800 dark:text-red-200"), children: _jsx("span", { style: { whiteSpace: "pre-wrap", wordBreak: "break-all" }, children: line.text }) })] }, idx))) }) }) }));
108
+ });
109
+ export function EditCell({ meta, isRunning }) {
110
+ const [expanded, setExpanded] = useState(false);
111
+ const [showAll, setShowAll] = useState(false);
112
+ const diff = useMemo(() => {
113
+ if (!meta.oldText && !meta.newText)
114
+ return null;
115
+ return computeLineDiff(meta.oldText ?? "", meta.newText ?? "");
116
+ }, [meta.oldText, meta.newText]);
117
+ const stats = useMemo(() => (diff ? diffStats(diff) : null), [diff]);
118
+ const hasDiff = diff !== null && diff.length > 0;
119
+ const totalLines = diff?.length ?? 0;
120
+ const maxCollapsed = showAll || totalLines <= MAX_COLLAPSED_LINES ? null : MAX_COLLAPSED_LINES;
121
+ const hiddenLines = maxCollapsed !== null ? totalLines - MAX_COLLAPSED_LINES : 0;
122
+ return (_jsxs("div", { className: "my-1 overflow-hidden rounded-md border border-border/60", children: [_jsxs("button", { type: "button", onClick: () => hasDiff && setExpanded((e) => !e), className: cn("flex w-full items-center gap-2 px-2.5 py-1.5 text-left text-xs font-mono", isRunning
123
+ ? "bg-muted text-muted-foreground"
124
+ : "bg-muted text-muted-foreground hover:bg-accent", hasDiff && "cursor-pointer", !hasDiff && "cursor-default"), "aria-expanded": hasDiff ? expanded : undefined, children: [_jsx("span", { className: "shrink-0", children: isRunning ? (_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" })) : (_jsx(IconFileDiff, { className: "h-3 w-3 text-amber-500" })) }), _jsx(IconFile, { className: "h-3 w-3 shrink-0 text-muted-foreground/70" }), _jsx("span", { className: "min-w-0 flex-1 truncate font-medium text-foreground", children: meta.filePath }), stats && !isRunning && (_jsxs("span", { className: "ml-auto flex shrink-0 items-center gap-1.5", children: [stats.added > 0 && (_jsxs("span", { className: "text-[10px] font-semibold text-emerald-600 dark:text-emerald-400", children: ["+", stats.added] })), stats.removed > 0 && (_jsxs("span", { className: "text-[10px] font-semibold text-destructive", children: ["-", stats.removed] })), meta.truncated && (_jsx("span", { className: "text-[10px] text-muted-foreground", children: "(partial)" }))] })), hasDiff && (_jsx(IconChevronDown, { className: cn("ml-1 h-3 w-3 shrink-0 opacity-40", expanded && "rotate-180") }))] }), expanded && hasDiff && (_jsxs("div", { className: "border-t border-border/40 bg-background", children: [_jsx(DiffView, { lines: diff, maxLines: maxCollapsed }), hiddenLines > 0 && (_jsx("div", { className: "border-t border-border/40 px-3 py-1 text-[11px] text-muted-foreground", children: _jsxs("button", { type: "button", className: "cursor-pointer underline hover:text-foreground", onClick: () => setShowAll(true), children: ["Show ", hiddenLines, " more lines"] }) }))] }))] }));
125
+ }
126
+ //# sourceMappingURL=EditCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditCell.js","sourceRoot":"","sources":["../../../src/client/tool-cells/EditCell.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * EditCell — renders an edit tool call as a syntax-highlighted unified diff.\n *\n * The diff is computed client-side from oldText / newText stored in the\n * structured metadata. The HighlightedCodeBlock from AssistantChat is not\n * accessible here, so we do a lightweight line-diff + per-line class approach\n * instead (no dep on shiki required for the diff view itself).\n *\n * Collapsed by default beyond MAX_COLLAPSED_LINES; expand button shows all.\n */\n\nimport { memo, useMemo, useState } from \"react\";\nimport {\n IconChevronDown,\n IconFile,\n IconFileDiff,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../utils.js\";\n\nexport interface EditCellMeta {\n toolKind: \"edit\";\n filePath: string;\n oldText?: string;\n newText?: string;\n truncated?: boolean;\n}\n\ninterface EditCellProps {\n meta: EditCellMeta;\n isRunning: boolean;\n}\n\n/** Lines shown collapsed before \"expand\" is offered. */\nconst MAX_COLLAPSED_LINES = 40;\n\n// ─── Diff computation ────────────────────────────────────────────────────────\n\ninterface DiffLine {\n kind: \"context\" | \"added\" | \"removed\";\n text: string;\n oldLineNo?: number;\n newLineNo?: number;\n}\n\nfunction computeLineDiff(oldText: string, newText: string): DiffLine[] {\n const oldLines = oldText.split(\"\\n\");\n const newLines = newText.split(\"\\n\");\n\n // Simple Myers-style LCS via DP for line-level diffs.\n // For very large files we cap input to keep it snappy.\n const MAX_LINES = 2000;\n const a = oldLines.slice(0, MAX_LINES);\n const b = newLines.slice(0, MAX_LINES);\n\n const m = a.length;\n const n = b.length;\n\n // Build LCS table\n const dp: number[][] = Array.from({ length: m + 1 }, () =>\n new Array(n + 1).fill(0),\n );\n for (let i = m - 1; i >= 0; i--) {\n for (let j = n - 1; j >= 0; j--) {\n if (a[i] === b[j]) {\n dp[i][j] = dp[i + 1][j + 1] + 1;\n } else {\n dp[i][j] = Math.max(dp[i + 1][j], dp[i][j + 1]);\n }\n }\n }\n\n const result: DiffLine[] = [];\n let i = 0;\n let j = 0;\n let oldLineNo = 1;\n let newLineNo = 1;\n\n while (i < m || j < n) {\n if (i < m && j < n && a[i] === b[j]) {\n result.push({\n kind: \"context\",\n text: a[i],\n oldLineNo: oldLineNo++,\n newLineNo: newLineNo++,\n });\n i++;\n j++;\n } else if (j < n && (i >= m || dp[i + 1][j] >= dp[i][j + 1])) {\n result.push({ kind: \"added\", text: b[j], newLineNo: newLineNo++ });\n j++;\n } else {\n result.push({ kind: \"removed\", text: a[i], oldLineNo: oldLineNo++ });\n i++;\n }\n }\n\n // Append any overflow lines as context\n if (oldLines.length > MAX_LINES) {\n for (let k = MAX_LINES; k < oldLines.length; k++) {\n result.push({\n kind: \"removed\",\n text: oldLines[k],\n oldLineNo: oldLineNo++,\n });\n }\n }\n if (newLines.length > MAX_LINES) {\n for (let k = MAX_LINES; k < newLines.length; k++) {\n result.push({\n kind: \"added\",\n text: newLines[k],\n newLineNo: newLineNo++,\n });\n }\n }\n\n return result;\n}\n\n/** Compute +N -N line counts from a diff. */\nfunction diffStats(lines: DiffLine[]): { added: number; removed: number } {\n let added = 0;\n let removed = 0;\n for (const line of lines) {\n if (line.kind === \"added\") added++;\n else if (line.kind === \"removed\") removed++;\n }\n return { added, removed };\n}\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nconst DiffView = memo(function DiffView({\n lines,\n maxLines,\n}: {\n lines: DiffLine[];\n maxLines: number | null;\n}) {\n const visible = maxLines === null ? lines : lines.slice(0, maxLines);\n\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-full border-collapse font-mono text-[11px] leading-relaxed\">\n <tbody>\n {visible.map((line, idx) => (\n <tr\n key={idx}\n className={cn(\n line.kind === \"added\" &&\n \"bg-emerald-500/8 dark:bg-emerald-400/8\",\n line.kind === \"removed\" && \"bg-destructive/8\",\n )}\n >\n {/* Old line number */}\n <td className=\"w-8 select-none border-r border-border/30 px-1.5 text-right text-[10px] text-muted-foreground/60\">\n {line.oldLineNo ?? \"\"}\n </td>\n {/* New line number */}\n <td className=\"w-8 select-none border-r border-border/30 px-1.5 text-right text-[10px] text-muted-foreground/60\">\n {line.newLineNo ?? \"\"}\n </td>\n {/* Sigil */}\n <td\n className={cn(\n \"w-4 select-none text-center text-[10px] font-bold\",\n line.kind === \"added\" &&\n \"text-emerald-600 dark:text-emerald-400\",\n line.kind === \"removed\" && \"text-destructive\",\n line.kind === \"context\" && \"text-muted-foreground/40\",\n )}\n >\n {line.kind === \"added\"\n ? \"+\"\n : line.kind === \"removed\"\n ? \"-\"\n : \" \"}\n </td>\n {/* Content */}\n <td\n className={cn(\n \"px-2 text-foreground\",\n line.kind === \"added\" &&\n \"text-emerald-800 dark:text-emerald-200\",\n line.kind === \"removed\" && \"text-red-800 dark:text-red-200\",\n )}\n >\n <span\n style={{ whiteSpace: \"pre-wrap\", wordBreak: \"break-all\" }}\n >\n {line.text}\n </span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n});\n\nexport function EditCell({ meta, isRunning }: EditCellProps) {\n const [expanded, setExpanded] = useState(false);\n const [showAll, setShowAll] = useState(false);\n\n const diff = useMemo(() => {\n if (!meta.oldText && !meta.newText) return null;\n return computeLineDiff(meta.oldText ?? \"\", meta.newText ?? \"\");\n }, [meta.oldText, meta.newText]);\n\n const stats = useMemo(() => (diff ? diffStats(diff) : null), [diff]);\n const hasDiff = diff !== null && diff.length > 0;\n\n const totalLines = diff?.length ?? 0;\n const maxCollapsed =\n showAll || totalLines <= MAX_COLLAPSED_LINES ? null : MAX_COLLAPSED_LINES;\n const hiddenLines =\n maxCollapsed !== null ? totalLines - MAX_COLLAPSED_LINES : 0;\n\n return (\n <div className=\"my-1 overflow-hidden rounded-md border border-border/60\">\n {/* Header */}\n <button\n type=\"button\"\n onClick={() => hasDiff && setExpanded((e) => !e)}\n className={cn(\n \"flex w-full items-center gap-2 px-2.5 py-1.5 text-left text-xs font-mono\",\n isRunning\n ? \"bg-muted text-muted-foreground\"\n : \"bg-muted text-muted-foreground hover:bg-accent\",\n hasDiff && \"cursor-pointer\",\n !hasDiff && \"cursor-default\",\n )}\n aria-expanded={hasDiff ? expanded : undefined}\n >\n <span className=\"shrink-0\">\n {isRunning ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n <IconFileDiff className=\"h-3 w-3 text-amber-500\" />\n )}\n </span>\n\n <IconFile className=\"h-3 w-3 shrink-0 text-muted-foreground/70\" />\n <span className=\"min-w-0 flex-1 truncate font-medium text-foreground\">\n {meta.filePath}\n </span>\n\n {stats && !isRunning && (\n <span className=\"ml-auto flex shrink-0 items-center gap-1.5\">\n {stats.added > 0 && (\n <span className=\"text-[10px] font-semibold text-emerald-600 dark:text-emerald-400\">\n +{stats.added}\n </span>\n )}\n {stats.removed > 0 && (\n <span className=\"text-[10px] font-semibold text-destructive\">\n -{stats.removed}\n </span>\n )}\n {meta.truncated && (\n <span className=\"text-[10px] text-muted-foreground\">\n (partial)\n </span>\n )}\n </span>\n )}\n\n {hasDiff && (\n <IconChevronDown\n className={cn(\n \"ml-1 h-3 w-3 shrink-0 opacity-40\",\n expanded && \"rotate-180\",\n )}\n />\n )}\n </button>\n\n {/* Diff body */}\n {expanded && hasDiff && (\n <div className=\"border-t border-border/40 bg-background\">\n <DiffView lines={diff} maxLines={maxCollapsed} />\n {hiddenLines > 0 && (\n <div className=\"border-t border-border/40 px-3 py-1 text-[11px] text-muted-foreground\">\n <button\n type=\"button\"\n className=\"cursor-pointer underline hover:text-foreground\"\n onClick={() => setShowAll(true)}\n >\n Show {hiddenLines} more lines\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * FilesChangedSummary — aggregates all edit/write tool calls in a turn and
3
+ * renders a compact "+N -M path" summary row per file. Click a row to expand
4
+ * to that file's diff. Derived purely from ContentPart structuredMeta.
5
+ */
6
+ import type { ContentPart } from "../sse-event-processor.js";
7
+ interface FilesChangedSummaryProps {
8
+ /** All content parts in the current assistant turn. */
9
+ parts: ContentPart[];
10
+ }
11
+ export declare const FilesChangedSummary: import("react").MemoExoticComponent<({ parts, }: FilesChangedSummaryProps) => import("react/jsx-runtime").JSX.Element | null>;
12
+ export {};
13
+ //# sourceMappingURL=FilesChangedSummary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilesChangedSummary.d.ts","sourceRoot":"","sources":["../../../src/client/tool-cells/FilesChangedSummary.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAI7D,UAAU,wBAAwB;IAChC,uDAAuD;IACvD,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAiFD,eAAO,MAAM,mBAAmB,mDAE7B,wBAAwB,oDAwGzB,CAAC"}
@@ -0,0 +1,98 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * FilesChangedSummary — aggregates all edit/write tool calls in a turn and
4
+ * renders a compact "+N -M path" summary row per file. Click a row to expand
5
+ * to that file's diff. Derived purely from ContentPart structuredMeta.
6
+ */
7
+ import { memo, useMemo, useState } from "react";
8
+ import { IconFiles } from "@tabler/icons-react";
9
+ import { cn } from "../utils.js";
10
+ import { EditCell } from "./EditCell.js";
11
+ import { WriteCell } from "./WriteCell.js";
12
+ function countLines(text) {
13
+ return text ? text.split("\n").length : 0;
14
+ }
15
+ function editLineDelta(oldText, newText) {
16
+ const oldLines = oldText ? oldText.split("\n") : [];
17
+ const newLines = newText ? newText.split("\n") : [];
18
+ // Simple count: compare total lines per side. For a real diff the
19
+ // edit cell already shows the full diff, so this approximation is fine
20
+ // for the summary bar.
21
+ const base = Math.min(oldLines.length, newLines.length);
22
+ const added = newLines.length - base;
23
+ const removed = oldLines.length - base;
24
+ return { added, removed };
25
+ }
26
+ function extractFileEntries(parts) {
27
+ const entries = [];
28
+ for (let i = 0; i < parts.length; i++) {
29
+ const part = parts[i];
30
+ if (part.type !== "tool-call" || !part.structuredMeta)
31
+ continue;
32
+ const meta = part.structuredMeta;
33
+ const kind = meta.toolKind;
34
+ if (kind === "edit") {
35
+ const { added, removed } = editLineDelta(meta.oldText, meta.newText);
36
+ entries.push({
37
+ filePath: meta.filePath ?? "",
38
+ kind: "edit",
39
+ added,
40
+ removed,
41
+ partIndex: i,
42
+ });
43
+ }
44
+ else if (kind === "write") {
45
+ const lineCount = typeof meta.lineCount === "number"
46
+ ? meta.lineCount
47
+ : countLines(meta.content ?? "");
48
+ entries.push({
49
+ filePath: meta.filePath ?? "",
50
+ kind: "write",
51
+ added: lineCount,
52
+ removed: 0,
53
+ partIndex: i,
54
+ });
55
+ }
56
+ }
57
+ // Deduplicate: last edit/write per file path wins for the summary row,
58
+ // but keep the expanded view as-is.
59
+ const seen = new Map();
60
+ const deduped = [];
61
+ for (const entry of entries) {
62
+ const key = `${entry.kind}:${entry.filePath}`;
63
+ if (seen.has(key)) {
64
+ const existing = seen.get(key);
65
+ deduped[existing] = entry;
66
+ }
67
+ else {
68
+ seen.set(key, deduped.length);
69
+ deduped.push(entry);
70
+ }
71
+ }
72
+ return deduped;
73
+ }
74
+ export const FilesChangedSummary = memo(function FilesChangedSummary({ parts, }) {
75
+ const entries = useMemo(() => extractFileEntries(parts), [parts]);
76
+ const [expanded, setExpanded] = useState(new Set());
77
+ if (entries.length === 0)
78
+ return null;
79
+ const toggle = (key) => {
80
+ setExpanded((prev) => {
81
+ const next = new Set(prev);
82
+ if (next.has(key))
83
+ next.delete(key);
84
+ else
85
+ next.add(key);
86
+ return next;
87
+ });
88
+ };
89
+ const totalAdded = entries.reduce((s, e) => s + e.added, 0);
90
+ const totalRemoved = entries.reduce((s, e) => s + e.removed, 0);
91
+ return (_jsxs("div", { className: "my-2 overflow-hidden rounded-md border border-border/60", children: [_jsxs("div", { className: "flex items-center gap-2 border-b border-border/40 bg-muted px-2.5 py-1.5 text-xs text-muted-foreground", children: [_jsx(IconFiles, { className: "h-3.5 w-3.5 shrink-0" }), _jsxs("span", { className: "font-medium text-foreground", children: [entries.length, " file", entries.length === 1 ? "" : "s", " changed"] }), _jsxs("span", { className: "ml-auto flex items-center gap-1.5", children: [totalAdded > 0 && (_jsxs("span", { className: "text-[10px] font-semibold text-emerald-600 dark:text-emerald-400", children: ["+", totalAdded] })), totalRemoved > 0 && (_jsxs("span", { className: "text-[10px] font-semibold text-destructive", children: ["-", totalRemoved] }))] })] }), entries.map((entry) => {
92
+ const key = `${entry.kind}:${entry.filePath}`;
93
+ const isExpanded = expanded.has(key);
94
+ const part = parts[entry.partIndex];
95
+ return (_jsxs("div", { className: "border-b border-border/30 last:border-b-0", children: [_jsxs("button", { type: "button", onClick: () => toggle(key), className: "flex w-full cursor-pointer items-center gap-2 px-2.5 py-1 text-left text-[11px] hover:bg-accent", children: [_jsx("span", { className: cn("inline-block h-1.5 w-1.5 shrink-0 rounded-full", entry.kind === "write" ? "bg-emerald-500" : "bg-amber-500") }), _jsx("span", { className: "min-w-0 flex-1 truncate font-mono text-foreground", children: entry.filePath }), _jsxs("span", { className: "ml-auto flex shrink-0 items-center gap-1", children: [entry.added > 0 && (_jsxs("span", { className: "text-[10px] font-semibold text-emerald-600 dark:text-emerald-400", children: ["+", entry.added] })), entry.removed > 0 && (_jsxs("span", { className: "text-[10px] font-semibold text-destructive", children: ["-", entry.removed] }))] })] }), isExpanded && part.type === "tool-call" && part.structuredMeta && (_jsx("div", { className: "pl-4", children: entry.kind === "edit" ? (_jsx(EditCell, { meta: part.structuredMeta, isRunning: false })) : (_jsx(WriteCell, { meta: part.structuredMeta, isRunning: false })) }))] }, key));
96
+ })] }));
97
+ });
98
+ //# sourceMappingURL=FilesChangedSummary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilesChangedSummary.js","sourceRoot":"","sources":["../../../src/client/tool-cells/FilesChangedSummary.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * FilesChangedSummary — aggregates all edit/write tool calls in a turn and\n * renders a compact \"+N -M path\" summary row per file. Click a row to expand\n * to that file's diff. Derived purely from ContentPart structuredMeta.\n */\n\nimport { memo, useMemo, useState } from \"react\";\nimport { IconFiles } from \"@tabler/icons-react\";\nimport { cn } from \"../utils.js\";\nimport type { ContentPart } from \"../sse-event-processor.js\";\nimport { EditCell } from \"./EditCell.js\";\nimport { WriteCell } from \"./WriteCell.js\";\n\ninterface FilesChangedSummaryProps {\n /** All content parts in the current assistant turn. */\n parts: ContentPart[];\n}\n\ninterface FileEntry {\n filePath: string;\n kind: \"edit\" | \"write\";\n added: number;\n removed: number;\n partIndex: number;\n}\n\nfunction countLines(text: string): number {\n return text ? text.split(\"\\n\").length : 0;\n}\n\nfunction editLineDelta(\n oldText: string | undefined,\n newText: string | undefined,\n): { added: number; removed: number } {\n const oldLines = oldText ? oldText.split(\"\\n\") : [];\n const newLines = newText ? newText.split(\"\\n\") : [];\n\n // Simple count: compare total lines per side. For a real diff the\n // edit cell already shows the full diff, so this approximation is fine\n // for the summary bar.\n const base = Math.min(oldLines.length, newLines.length);\n const added = newLines.length - base;\n const removed = oldLines.length - base;\n return { added, removed };\n}\n\nfunction extractFileEntries(parts: ContentPart[]): FileEntry[] {\n const entries: FileEntry[] = [];\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part.type !== \"tool-call\" || !part.structuredMeta) continue;\n const meta = part.structuredMeta as Record<string, unknown>;\n const kind = meta.toolKind as string | undefined;\n if (kind === \"edit\") {\n const { added, removed } = editLineDelta(\n meta.oldText as string | undefined,\n meta.newText as string | undefined,\n );\n entries.push({\n filePath: (meta.filePath as string) ?? \"\",\n kind: \"edit\",\n added,\n removed,\n partIndex: i,\n });\n } else if (kind === \"write\") {\n const lineCount =\n typeof meta.lineCount === \"number\"\n ? meta.lineCount\n : countLines((meta.content as string | undefined) ?? \"\");\n entries.push({\n filePath: (meta.filePath as string) ?? \"\",\n kind: \"write\",\n added: lineCount,\n removed: 0,\n partIndex: i,\n });\n }\n }\n\n // Deduplicate: last edit/write per file path wins for the summary row,\n // but keep the expanded view as-is.\n const seen = new Map<string, number>();\n const deduped: FileEntry[] = [];\n for (const entry of entries) {\n const key = `${entry.kind}:${entry.filePath}`;\n if (seen.has(key)) {\n const existing = seen.get(key)!;\n deduped[existing] = entry;\n } else {\n seen.set(key, deduped.length);\n deduped.push(entry);\n }\n }\n return deduped;\n}\n\nexport const FilesChangedSummary = memo(function FilesChangedSummary({\n parts,\n}: FilesChangedSummaryProps) {\n const entries = useMemo(() => extractFileEntries(parts), [parts]);\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n\n if (entries.length === 0) return null;\n\n const toggle = (key: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n\n const totalAdded = entries.reduce((s, e) => s + e.added, 0);\n const totalRemoved = entries.reduce((s, e) => s + e.removed, 0);\n\n return (\n <div className=\"my-2 overflow-hidden rounded-md border border-border/60\">\n {/* Summary header */}\n <div className=\"flex items-center gap-2 border-b border-border/40 bg-muted px-2.5 py-1.5 text-xs text-muted-foreground\">\n <IconFiles className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"font-medium text-foreground\">\n {entries.length} file{entries.length === 1 ? \"\" : \"s\"} changed\n </span>\n <span className=\"ml-auto flex items-center gap-1.5\">\n {totalAdded > 0 && (\n <span className=\"text-[10px] font-semibold text-emerald-600 dark:text-emerald-400\">\n +{totalAdded}\n </span>\n )}\n {totalRemoved > 0 && (\n <span className=\"text-[10px] font-semibold text-destructive\">\n -{totalRemoved}\n </span>\n )}\n </span>\n </div>\n\n {/* Per-file rows */}\n {entries.map((entry) => {\n const key = `${entry.kind}:${entry.filePath}`;\n const isExpanded = expanded.has(key);\n const part = parts[entry.partIndex];\n\n return (\n <div key={key} className=\"border-b border-border/30 last:border-b-0\">\n <button\n type=\"button\"\n onClick={() => toggle(key)}\n className=\"flex w-full cursor-pointer items-center gap-2 px-2.5 py-1 text-left text-[11px] hover:bg-accent\"\n >\n <span\n className={cn(\n \"inline-block h-1.5 w-1.5 shrink-0 rounded-full\",\n entry.kind === \"write\" ? \"bg-emerald-500\" : \"bg-amber-500\",\n )}\n />\n <span className=\"min-w-0 flex-1 truncate font-mono text-foreground\">\n {entry.filePath}\n </span>\n <span className=\"ml-auto flex shrink-0 items-center gap-1\">\n {entry.added > 0 && (\n <span className=\"text-[10px] font-semibold text-emerald-600 dark:text-emerald-400\">\n +{entry.added}\n </span>\n )}\n {entry.removed > 0 && (\n <span className=\"text-[10px] font-semibold text-destructive\">\n -{entry.removed}\n </span>\n )}\n </span>\n </button>\n\n {isExpanded && part.type === \"tool-call\" && part.structuredMeta && (\n <div className=\"pl-4\">\n {entry.kind === \"edit\" ? (\n <EditCell\n meta={\n part.structuredMeta as unknown as Parameters<\n typeof EditCell\n >[0][\"meta\"]\n }\n isRunning={false}\n />\n ) : (\n <WriteCell\n meta={\n part.structuredMeta as unknown as Parameters<\n typeof WriteCell\n >[0][\"meta\"]\n }\n isRunning={false}\n />\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n});\n"]}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * WriteCell — renders a write tool call as a new-file view with added-line styling.
3
+ */
4
+ export interface WriteCellMeta {
5
+ toolKind: "write";
6
+ filePath: string;
7
+ content?: string;
8
+ truncated?: boolean;
9
+ lineCount?: number;
10
+ }
11
+ interface WriteCellProps {
12
+ meta: WriteCellMeta;
13
+ isRunning: boolean;
14
+ }
15
+ export declare function WriteCell({ meta, isRunning }: WriteCellProps): import("react/jsx-runtime").JSX.Element;
16
+ export {};
17
+ //# sourceMappingURL=WriteCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WriteCell.d.ts","sourceRoot":"","sources":["../../../src/client/tool-cells/WriteCell.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAUH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB;AAyCD,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,cAAc,2CA4E5D"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * WriteCell — renders a write tool call as a new-file view with added-line styling.
4
+ */
5
+ import { memo, useState } from "react";
6
+ import { IconChevronDown, IconFilePlus, IconLoader2, } from "@tabler/icons-react";
7
+ import { cn } from "../utils.js";
8
+ const MAX_COLLAPSED_LINES = 40;
9
+ const FileContentView = memo(function FileContentView({ content, maxLines, }) {
10
+ const lines = content.split("\n");
11
+ const visible = maxLines !== null ? lines.slice(0, maxLines) : lines;
12
+ return (_jsx("div", { className: "overflow-x-auto", children: _jsx("table", { className: "w-full min-w-full border-collapse font-mono text-[11px] leading-relaxed", children: _jsx("tbody", { children: visible.map((line, idx) => (_jsxs("tr", { className: "bg-emerald-500/8 dark:bg-emerald-400/8", children: [_jsx("td", { className: "w-8 select-none border-r border-border/30 px-1.5 text-right text-[10px] text-muted-foreground/60", children: idx + 1 }), _jsx("td", { className: "w-4 select-none text-center text-[10px] font-bold text-emerald-600 dark:text-emerald-400", children: "+" }), _jsx("td", { className: "px-2 text-emerald-800 dark:text-emerald-200", children: _jsx("span", { style: { whiteSpace: "pre-wrap", wordBreak: "break-all" }, children: line }) })] }, idx))) }) }) }));
13
+ });
14
+ export function WriteCell({ meta, isRunning }) {
15
+ const [expanded, setExpanded] = useState(false);
16
+ const [showAll, setShowAll] = useState(false);
17
+ const hasContent = Boolean(meta.content);
18
+ const lines = meta.content ? meta.content.split("\n") : [];
19
+ const totalLines = lines.length;
20
+ const maxCollapsed = showAll || totalLines <= MAX_COLLAPSED_LINES ? null : MAX_COLLAPSED_LINES;
21
+ const hiddenLines = maxCollapsed !== null ? totalLines - MAX_COLLAPSED_LINES : 0;
22
+ return (_jsxs("div", { className: "my-1 overflow-hidden rounded-md border border-border/60", children: [_jsxs("button", { type: "button", onClick: () => hasContent && setExpanded((e) => !e), className: cn("flex w-full items-center gap-2 px-2.5 py-1.5 text-left text-xs font-mono", isRunning
23
+ ? "bg-muted text-muted-foreground"
24
+ : "bg-muted text-muted-foreground hover:bg-accent", hasContent && "cursor-pointer", !hasContent && "cursor-default"), "aria-expanded": hasContent ? expanded : undefined, children: [_jsx("span", { className: "shrink-0", children: isRunning ? (_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" })) : (_jsx(IconFilePlus, { className: "h-3 w-3 text-emerald-500" })) }), _jsx("span", { className: "min-w-0 flex-1 truncate font-medium text-foreground", children: meta.filePath }), _jsxs("span", { className: "ml-auto flex shrink-0 items-center gap-1.5", children: [meta.lineCount !== undefined && !isRunning && (_jsxs("span", { className: "text-[10px] font-semibold text-emerald-600 dark:text-emerald-400", children: ["+", meta.lineCount] })), meta.truncated && (_jsx("span", { className: "text-[10px] text-muted-foreground", children: "(partial)" })), hasContent && (_jsx(IconChevronDown, { className: cn("h-3 w-3 opacity-40", expanded && "rotate-180") }))] })] }), expanded && hasContent && meta.content && (_jsxs("div", { className: "border-t border-border/40 bg-background", children: [_jsx(FileContentView, { content: meta.content, maxLines: maxCollapsed }), hiddenLines > 0 && (_jsx("div", { className: "border-t border-border/40 px-3 py-1 text-[11px] text-muted-foreground", children: _jsxs("button", { type: "button", className: "cursor-pointer underline hover:text-foreground", onClick: () => setShowAll(true), children: ["Show ", hiddenLines, " more lines"] }) }))] }))] }));
25
+ }
26
+ //# sourceMappingURL=WriteCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WriteCell.js","sourceRoot":"","sources":["../../../src/client/tool-cells/WriteCell.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * WriteCell — renders a write tool call as a new-file view with added-line styling.\n */\n\nimport { memo, useState } from \"react\";\nimport {\n IconChevronDown,\n IconFilePlus,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../utils.js\";\n\nexport interface WriteCellMeta {\n toolKind: \"write\";\n filePath: string;\n content?: string;\n truncated?: boolean;\n lineCount?: number;\n}\n\ninterface WriteCellProps {\n meta: WriteCellMeta;\n isRunning: boolean;\n}\n\nconst MAX_COLLAPSED_LINES = 40;\n\nconst FileContentView = memo(function FileContentView({\n content,\n maxLines,\n}: {\n content: string;\n maxLines: number | null;\n}) {\n const lines = content.split(\"\\n\");\n const visible = maxLines !== null ? lines.slice(0, maxLines) : lines;\n\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-full border-collapse font-mono text-[11px] leading-relaxed\">\n <tbody>\n {visible.map((line, idx) => (\n <tr key={idx} className=\"bg-emerald-500/8 dark:bg-emerald-400/8\">\n <td className=\"w-8 select-none border-r border-border/30 px-1.5 text-right text-[10px] text-muted-foreground/60\">\n {idx + 1}\n </td>\n <td className=\"w-4 select-none text-center text-[10px] font-bold text-emerald-600 dark:text-emerald-400\">\n +\n </td>\n <td className=\"px-2 text-emerald-800 dark:text-emerald-200\">\n <span\n style={{ whiteSpace: \"pre-wrap\", wordBreak: \"break-all\" }}\n >\n {line}\n </span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n});\n\nexport function WriteCell({ meta, isRunning }: WriteCellProps) {\n const [expanded, setExpanded] = useState(false);\n const [showAll, setShowAll] = useState(false);\n\n const hasContent = Boolean(meta.content);\n const lines = meta.content ? meta.content.split(\"\\n\") : [];\n const totalLines = lines.length;\n const maxCollapsed =\n showAll || totalLines <= MAX_COLLAPSED_LINES ? null : MAX_COLLAPSED_LINES;\n const hiddenLines =\n maxCollapsed !== null ? totalLines - MAX_COLLAPSED_LINES : 0;\n\n return (\n <div className=\"my-1 overflow-hidden rounded-md border border-border/60\">\n {/* Header */}\n <button\n type=\"button\"\n onClick={() => hasContent && setExpanded((e) => !e)}\n className={cn(\n \"flex w-full items-center gap-2 px-2.5 py-1.5 text-left text-xs font-mono\",\n isRunning\n ? \"bg-muted text-muted-foreground\"\n : \"bg-muted text-muted-foreground hover:bg-accent\",\n hasContent && \"cursor-pointer\",\n !hasContent && \"cursor-default\",\n )}\n aria-expanded={hasContent ? expanded : undefined}\n >\n <span className=\"shrink-0\">\n {isRunning ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n <IconFilePlus className=\"h-3 w-3 text-emerald-500\" />\n )}\n </span>\n\n <span className=\"min-w-0 flex-1 truncate font-medium text-foreground\">\n {meta.filePath}\n </span>\n\n <span className=\"ml-auto flex shrink-0 items-center gap-1.5\">\n {meta.lineCount !== undefined && !isRunning && (\n <span className=\"text-[10px] font-semibold text-emerald-600 dark:text-emerald-400\">\n +{meta.lineCount}\n </span>\n )}\n {meta.truncated && (\n <span className=\"text-[10px] text-muted-foreground\">(partial)</span>\n )}\n {hasContent && (\n <IconChevronDown\n className={cn(\"h-3 w-3 opacity-40\", expanded && \"rotate-180\")}\n />\n )}\n </span>\n </button>\n\n {/* Content body */}\n {expanded && hasContent && meta.content && (\n <div className=\"border-t border-border/40 bg-background\">\n <FileContentView content={meta.content} maxLines={maxCollapsed} />\n {hiddenLines > 0 && (\n <div className=\"border-t border-border/40 px-3 py-1 text-[11px] text-muted-foreground\">\n <button\n type=\"button\"\n className=\"cursor-pointer underline hover:text-foreground\"\n onClick={() => setShowAll(true)}\n >\n Show {hiddenLines} more lines\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"]}
@@ -0,0 +1,8 @@
1
+ export { BashCell } from "./BashCell.js";
2
+ export type { BashCellMeta } from "./BashCell.js";
3
+ export { EditCell } from "./EditCell.js";
4
+ export type { EditCellMeta } from "./EditCell.js";
5
+ export { WriteCell } from "./WriteCell.js";
6
+ export type { WriteCellMeta } from "./WriteCell.js";
7
+ export { FilesChangedSummary } from "./FilesChangedSummary.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/tool-cells/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { BashCell } from "./BashCell.js";
2
+ export { EditCell } from "./EditCell.js";
3
+ export { WriteCell } from "./WriteCell.js";
4
+ export { FilesChangedSummary } from "./FilesChangedSummary.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/tool-cells/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC","sourcesContent":["export { BashCell } from \"./BashCell.js\";\nexport type { BashCellMeta } from \"./BashCell.js\";\nexport { EditCell } from \"./EditCell.js\";\nexport type { EditCellMeta } from \"./EditCell.js\";\nexport { WriteCell } from \"./WriteCell.js\";\nexport type { WriteCellMeta } from \"./WriteCell.js\";\nexport { FilesChangedSummary } from \"./FilesChangedSummary.js\";\n"]}
@@ -5,5 +5,5 @@
5
5
  *
6
6
  * Drop this next to transcript displays in any template.
7
7
  */
8
- export declare function BuilderTranscriptionCta(): import("react/jsx-runtime").JSX.Element;
8
+ export declare function BuilderTranscriptionCta(): import("react/jsx-runtime").JSX.Element | null;
9
9
  //# sourceMappingURL=BuilderTranscriptionCta.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BuilderTranscriptionCta.d.ts","sourceRoot":"","sources":["../../../src/client/transcription/BuilderTranscriptionCta.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,wBAAgB,uBAAuB,4CAyGtC"}
1
+ {"version":3,"file":"BuilderTranscriptionCta.d.ts","sourceRoot":"","sources":["../../../src/client/transcription/BuilderTranscriptionCta.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,wBAAgB,uBAAuB,mDAyGtC"}
@@ -42,7 +42,7 @@ export interface UseChatThreadsOptions {
42
42
  }
43
43
  export declare function useChatThreads(apiUrl?: string, storageKey?: string, scope?: ChatThreadScope | null, options?: UseChatThreadsOptions): {
44
44
  threads: ChatThreadSummary[];
45
- activeThreadId: string;
45
+ activeThreadId: string | null;
46
46
  isLoading: boolean;
47
47
  createThread: (preferredId?: string) => Promise<string | null>;
48
48
  switchThread: (id: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"use-chat-threads.d.ts","sourceRoot":"","sources":["../../src/client/use-chat-threads.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,iBAAiB,GAAG,WAAW,GAAG,WAAW,CAAC;AAMnD,MAAM,WAAW,qBAAqB;IACpC,+EAA+E;IAC/E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAqED,wBAAgB,cAAc,CAC5B,MAAM,SAA+C,EACrD,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,EAC9B,OAAO,CAAC,EAAE,qBAAqB;;;;iCA0Xd,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;uBAoNV,MAAM;uBAK/B,MAAM;6BAtMA,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;0BAkBtB,MAAM,UAAU,OAAO,KAAG,OAAO,CAAC,OAAO,CAAC;8BAuD1C,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;6BAgEzB,MAAM,SAAS,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;2BA0M7C,MAAM,mBACC,kBAAkB,GAAG,IAAI,KACzC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;yBA7GnB,MAAM,QACJ;QACJ,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,iBAAiB,CAAC;KACjC;8BA0Ec,MAAM,WAAW,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;2BA6HnD,MAAM,KAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;;sBAzP9C,MAAM;EA8Rd"}
1
+ {"version":3,"file":"use-chat-threads.d.ts","sourceRoot":"","sources":["../../src/client/use-chat-threads.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,iBAAiB,GAAG,WAAW,GAAG,WAAW,CAAC;AAMnD,MAAM,WAAW,qBAAqB;IACpC,+EAA+E;IAC/E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAqED,wBAAgB,cAAc,CAC5B,MAAM,SAA+C,EACrD,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,EAC9B,OAAO,CAAC,EAAE,qBAAqB;;;;iCA0Xd,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;uBAoNV,MAAM;uBAK/B,MAAM;6BAtMA,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;0BAkBtB,MAAM,UAAU,OAAO,KAAG,OAAO,CAAC,OAAO,CAAC;8BAuD1C,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;6BAgEzB,MAAM,SAAS,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;2BA0M7C,MAAM,mBACC,kBAAkB,GAAG,IAAI,KACzC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;yBA7GnB,MAAM,QACJ;QACJ,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,iBAAiB,CAAC;KACjC;8BA0Ec,MAAM,WAAW,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;2BAgInD,MAAM,KAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;;sBA5P9C,MAAM;EAiSd"}
@@ -723,20 +723,23 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
723
723
  else {
724
724
  thread = await res.json();
725
725
  }
726
+ // thread is non-null: the null branch returned early above (line 935)
727
+ // and the else branch always assigns it.
728
+ const t = thread;
726
729
  setThreads((prev) => [
727
730
  {
728
- id: thread.id,
729
- title: thread.title,
730
- preview: thread.preview,
731
- messageCount: thread.messageCount,
732
- createdAt: thread.createdAt,
733
- updatedAt: thread.updatedAt,
734
- scope: thread.scope ?? null,
731
+ id: t.id,
732
+ title: t.title,
733
+ preview: t.preview,
734
+ messageCount: t.messageCount,
735
+ createdAt: t.createdAt,
736
+ updatedAt: t.updatedAt,
737
+ scope: t.scope ?? null,
735
738
  },
736
739
  ...prev,
737
740
  ]);
738
741
  emitThreadsUpdated();
739
- return thread.id;
742
+ return t.id;
740
743
  }
741
744
  catch (err) {
742
745
  console.error(`[chat] fork threw for ${sourceId}:`, err);