@agent-native/core 0.15.13 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/README.md +37 -0
  2. package/dist/agent/app-model-defaults.d.ts +37 -0
  3. package/dist/agent/app-model-defaults.d.ts.map +1 -0
  4. package/dist/agent/app-model-defaults.js +136 -0
  5. package/dist/agent/app-model-defaults.js.map +1 -0
  6. package/dist/agent/engine/registry.d.ts +12 -7
  7. package/dist/agent/engine/registry.d.ts.map +1 -1
  8. package/dist/agent/engine/registry.js +28 -8
  9. package/dist/agent/engine/registry.js.map +1 -1
  10. package/dist/agent/production-agent.d.ts +2 -0
  11. package/dist/agent/production-agent.d.ts.map +1 -1
  12. package/dist/agent/production-agent.js +3 -1
  13. package/dist/agent/production-agent.js.map +1 -1
  14. package/dist/browser-sessions/actions.d.ts +7 -0
  15. package/dist/browser-sessions/actions.d.ts.map +1 -0
  16. package/dist/browser-sessions/actions.js +223 -0
  17. package/dist/browser-sessions/actions.js.map +1 -0
  18. package/dist/browser-sessions/routes.d.ts +7 -0
  19. package/dist/browser-sessions/routes.d.ts.map +1 -0
  20. package/dist/browser-sessions/routes.js +159 -0
  21. package/dist/browser-sessions/routes.js.map +1 -0
  22. package/dist/browser-sessions/store.d.ts +33 -0
  23. package/dist/browser-sessions/store.d.ts.map +1 -0
  24. package/dist/browser-sessions/store.js +506 -0
  25. package/dist/browser-sessions/store.js.map +1 -0
  26. package/dist/browser-sessions/types.d.ts +68 -0
  27. package/dist/browser-sessions/types.d.ts.map +1 -0
  28. package/dist/browser-sessions/types.js +2 -0
  29. package/dist/browser-sessions/types.js.map +1 -0
  30. package/dist/cli/code-agent-commands.d.ts +36 -0
  31. package/dist/cli/code-agent-commands.d.ts.map +1 -0
  32. package/dist/cli/code-agent-commands.js +192 -0
  33. package/dist/cli/code-agent-commands.js.map +1 -0
  34. package/dist/cli/code-agent-connector.d.ts +17 -0
  35. package/dist/cli/code-agent-connector.d.ts.map +1 -0
  36. package/dist/cli/code-agent-connector.js +724 -0
  37. package/dist/cli/code-agent-connector.js.map +1 -0
  38. package/dist/cli/code-agent-executor.d.ts +31 -0
  39. package/dist/cli/code-agent-executor.d.ts.map +1 -0
  40. package/dist/cli/code-agent-executor.js +921 -0
  41. package/dist/cli/code-agent-executor.js.map +1 -0
  42. package/dist/cli/code-agent-runs.d.ts +102 -0
  43. package/dist/cli/code-agent-runs.d.ts.map +1 -0
  44. package/dist/cli/code-agent-runs.js +277 -0
  45. package/dist/cli/code-agent-runs.js.map +1 -0
  46. package/dist/cli/code.d.ts +66 -0
  47. package/dist/cli/code.d.ts.map +1 -0
  48. package/dist/cli/code.js +1306 -0
  49. package/dist/cli/code.js.map +1 -0
  50. package/dist/cli/create.d.ts +2 -1
  51. package/dist/cli/create.d.ts.map +1 -1
  52. package/dist/cli/create.js +11 -1
  53. package/dist/cli/create.js.map +1 -1
  54. package/dist/cli/index.js +26 -1
  55. package/dist/cli/index.js.map +1 -1
  56. package/dist/cli/migrate.d.ts +27 -0
  57. package/dist/cli/migrate.d.ts.map +1 -1
  58. package/dist/cli/migrate.js +1328 -20
  59. package/dist/cli/migrate.js.map +1 -1
  60. package/dist/cli/templates-meta.d.ts.map +1 -1
  61. package/dist/cli/templates-meta.js +26 -2
  62. package/dist/cli/templates-meta.js.map +1 -1
  63. package/dist/cli/workspacify.d.ts +2 -0
  64. package/dist/cli/workspacify.d.ts.map +1 -1
  65. package/dist/cli/workspacify.js +2 -1
  66. package/dist/cli/workspacify.js.map +1 -1
  67. package/dist/client/AgentNative.d.ts +32 -0
  68. package/dist/client/AgentNative.d.ts.map +1 -0
  69. package/dist/client/AgentNative.js +79 -0
  70. package/dist/client/AgentNative.js.map +1 -0
  71. package/dist/client/AgentNativeEmbedded.d.ts +47 -0
  72. package/dist/client/AgentNativeEmbedded.d.ts.map +1 -0
  73. package/dist/client/AgentNativeEmbedded.js +148 -0
  74. package/dist/client/AgentNativeEmbedded.js.map +1 -0
  75. package/dist/client/AgentNativeFrame.d.ts +25 -0
  76. package/dist/client/AgentNativeFrame.d.ts.map +1 -0
  77. package/dist/client/AgentNativeFrame.js +68 -0
  78. package/dist/client/AgentNativeFrame.js.map +1 -0
  79. package/dist/client/AgentPanel.d.ts +19 -2
  80. package/dist/client/AgentPanel.d.ts.map +1 -1
  81. package/dist/client/AgentPanel.js +15 -4
  82. package/dist/client/AgentPanel.js.map +1 -1
  83. package/dist/client/AssistantChat.d.ts +1 -1
  84. package/dist/client/AssistantChat.d.ts.map +1 -1
  85. package/dist/client/AssistantChat.js +79 -48
  86. package/dist/client/AssistantChat.js.map +1 -1
  87. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  88. package/dist/client/MultiTabAssistantChat.js +2 -1
  89. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  90. package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
  91. package/dist/client/NewWorkspaceAppFlow.js +3 -2
  92. package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
  93. package/dist/client/browser-session-bridge.d.ts +44 -0
  94. package/dist/client/browser-session-bridge.d.ts.map +1 -0
  95. package/dist/client/browser-session-bridge.js +339 -0
  96. package/dist/client/browser-session-bridge.js.map +1 -0
  97. package/dist/client/client-action.d.ts +7 -0
  98. package/dist/client/client-action.d.ts.map +1 -0
  99. package/dist/client/client-action.js +4 -0
  100. package/dist/client/client-action.js.map +1 -0
  101. package/dist/client/components/ui/tooltip.d.ts.map +1 -1
  102. package/dist/client/components/ui/tooltip.js +1 -1
  103. package/dist/client/components/ui/tooltip.js.map +1 -1
  104. package/dist/client/composer/AgentComposerFrame.d.ts +17 -0
  105. package/dist/client/composer/AgentComposerFrame.d.ts.map +1 -0
  106. package/dist/client/composer/AgentComposerFrame.js +14 -0
  107. package/dist/client/composer/AgentComposerFrame.js.map +1 -0
  108. package/dist/client/composer/MentionPopover.d.ts.map +1 -1
  109. package/dist/client/composer/MentionPopover.js +2 -2
  110. package/dist/client/composer/MentionPopover.js.map +1 -1
  111. package/dist/client/composer/PromptComposer.d.ts +35 -2
  112. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  113. package/dist/client/composer/PromptComposer.js +31 -17
  114. package/dist/client/composer/PromptComposer.js.map +1 -1
  115. package/dist/client/composer/TiptapComposer.d.ts +20 -2
  116. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  117. package/dist/client/composer/TiptapComposer.js +112 -22
  118. package/dist/client/composer/TiptapComposer.js.map +1 -1
  119. package/dist/client/composer/index.d.ts +3 -2
  120. package/dist/client/composer/index.d.ts.map +1 -1
  121. package/dist/client/composer/index.js +1 -0
  122. package/dist/client/composer/index.js.map +1 -1
  123. package/dist/client/composer/types.d.ts +1 -0
  124. package/dist/client/composer/types.d.ts.map +1 -1
  125. package/dist/client/composer/types.js.map +1 -1
  126. package/dist/client/extensions/AgentNativeExtensionFrame.d.ts +58 -0
  127. package/dist/client/extensions/AgentNativeExtensionFrame.d.ts.map +1 -0
  128. package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.d.ts +2 -0
  129. package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.d.ts.map +1 -0
  130. package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.js +110 -0
  131. package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.js.map +1 -0
  132. package/dist/client/extensions/AgentNativeExtensionFrame.js +354 -0
  133. package/dist/client/extensions/AgentNativeExtensionFrame.js.map +1 -0
  134. package/dist/client/extensions/AgentNativeExtensionFrame.spec.d.ts +2 -0
  135. package/dist/client/extensions/AgentNativeExtensionFrame.spec.d.ts.map +1 -0
  136. package/dist/client/extensions/AgentNativeExtensionFrame.spec.js +68 -0
  137. package/dist/client/extensions/AgentNativeExtensionFrame.spec.js.map +1 -0
  138. package/dist/client/extensions/agent-native-extension-runtime.d.ts +69 -0
  139. package/dist/client/extensions/agent-native-extension-runtime.d.ts.map +1 -0
  140. package/dist/client/extensions/agent-native-extension-runtime.js +348 -0
  141. package/dist/client/extensions/agent-native-extension-runtime.js.map +1 -0
  142. package/dist/client/extensions/index.d.ts +2 -0
  143. package/dist/client/extensions/index.d.ts.map +1 -1
  144. package/dist/client/extensions/index.js +2 -0
  145. package/dist/client/extensions/index.js.map +1 -1
  146. package/dist/client/extensions/portable-extension.d.ts +86 -0
  147. package/dist/client/extensions/portable-extension.d.ts.map +1 -0
  148. package/dist/client/extensions/portable-extension.js +480 -0
  149. package/dist/client/extensions/portable-extension.js.map +1 -0
  150. package/dist/client/host-bridge.d.ts +266 -0
  151. package/dist/client/host-bridge.d.ts.map +1 -0
  152. package/dist/client/host-bridge.js +745 -0
  153. package/dist/client/host-bridge.js.map +1 -0
  154. package/dist/client/host-tools.d.ts +40 -0
  155. package/dist/client/host-tools.d.ts.map +1 -0
  156. package/dist/client/host-tools.js +94 -0
  157. package/dist/client/host-tools.js.map +1 -0
  158. package/dist/client/index.d.ts +13 -2
  159. package/dist/client/index.d.ts.map +1 -1
  160. package/dist/client/index.js +11 -2
  161. package/dist/client/index.js.map +1 -1
  162. package/dist/client/resources/BuiltinCapabilityDetail.d.ts +10 -0
  163. package/dist/client/resources/BuiltinCapabilityDetail.d.ts.map +1 -0
  164. package/dist/client/resources/BuiltinCapabilityDetail.js +51 -0
  165. package/dist/client/resources/BuiltinCapabilityDetail.js.map +1 -0
  166. package/dist/client/resources/ResourceEditor.d.ts +3 -1
  167. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  168. package/dist/client/resources/ResourceEditor.js +40 -17
  169. package/dist/client/resources/ResourceEditor.js.map +1 -1
  170. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  171. package/dist/client/resources/ResourceTree.js +23 -2
  172. package/dist/client/resources/ResourceTree.js.map +1 -1
  173. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  174. package/dist/client/resources/ResourcesPanel.js +77 -17
  175. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  176. package/dist/client/resources/index.d.ts +1 -0
  177. package/dist/client/resources/index.d.ts.map +1 -1
  178. package/dist/client/resources/index.js +1 -0
  179. package/dist/client/resources/index.js.map +1 -1
  180. package/dist/client/resources/use-builtin-capabilities.d.ts +62 -0
  181. package/dist/client/resources/use-builtin-capabilities.d.ts.map +1 -0
  182. package/dist/client/resources/use-builtin-capabilities.js +54 -0
  183. package/dist/client/resources/use-builtin-capabilities.js.map +1 -0
  184. package/dist/client/resources/use-resources.d.ts +30 -2
  185. package/dist/client/resources/use-resources.d.ts.map +1 -1
  186. package/dist/client/resources/use-resources.js +42 -1
  187. package/dist/client/resources/use-resources.js.map +1 -1
  188. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  189. package/dist/client/settings/SettingsPanel.js +151 -2
  190. package/dist/client/settings/SettingsPanel.js.map +1 -1
  191. package/dist/client/use-chat-models.d.ts.map +1 -1
  192. package/dist/client/use-chat-models.js +20 -0
  193. package/dist/client/use-chat-models.js.map +1 -1
  194. package/dist/client/use-chat-threads.d.ts.map +1 -1
  195. package/dist/client/use-chat-threads.js +46 -2
  196. package/dist/client/use-chat-threads.js.map +1 -1
  197. package/dist/client/use-chat-threads.spec.js +77 -0
  198. package/dist/client/use-chat-threads.spec.js.map +1 -1
  199. package/dist/code-agents/index.d.ts +4 -0
  200. package/dist/code-agents/index.d.ts.map +1 -0
  201. package/dist/code-agents/index.js +4 -0
  202. package/dist/code-agents/index.js.map +1 -0
  203. package/dist/connections/catalog.d.ts +134 -0
  204. package/dist/connections/catalog.d.ts.map +1 -0
  205. package/dist/connections/catalog.js +180 -0
  206. package/dist/connections/catalog.js.map +1 -0
  207. package/dist/connections/index.d.ts +2 -0
  208. package/dist/connections/index.d.ts.map +1 -0
  209. package/dist/connections/index.js +2 -0
  210. package/dist/connections/index.js.map +1 -0
  211. package/dist/extensions/change-marker.d.ts +10 -0
  212. package/dist/extensions/change-marker.d.ts.map +1 -0
  213. package/dist/extensions/change-marker.js +42 -0
  214. package/dist/extensions/change-marker.js.map +1 -0
  215. package/dist/extensions/routes.d.ts.map +1 -1
  216. package/dist/extensions/routes.js +1 -7
  217. package/dist/extensions/routes.js.map +1 -1
  218. package/dist/extensions/schema.d.ts +1 -0
  219. package/dist/extensions/schema.d.ts.map +1 -1
  220. package/dist/extensions/schema.js +1 -0
  221. package/dist/extensions/schema.js.map +1 -1
  222. package/dist/extensions/slots/routes.js +1 -1
  223. package/dist/extensions/slots/routes.js.map +1 -1
  224. package/dist/extensions/store.d.ts +3 -0
  225. package/dist/extensions/store.d.ts.map +1 -1
  226. package/dist/extensions/store.js +112 -4
  227. package/dist/extensions/store.js.map +1 -1
  228. package/dist/index.d.ts +4 -1
  229. package/dist/index.d.ts.map +1 -1
  230. package/dist/index.js +6 -1
  231. package/dist/index.js.map +1 -1
  232. package/dist/integrations/adapters/telegram.d.ts.map +1 -1
  233. package/dist/integrations/adapters/telegram.js +1 -0
  234. package/dist/integrations/adapters/telegram.js.map +1 -1
  235. package/dist/integrations/index.d.ts +5 -1
  236. package/dist/integrations/index.d.ts.map +1 -1
  237. package/dist/integrations/index.js +4 -1
  238. package/dist/integrations/index.js.map +1 -1
  239. package/dist/integrations/plugin.d.ts +8 -0
  240. package/dist/integrations/plugin.d.ts.map +1 -1
  241. package/dist/integrations/plugin.js +760 -32
  242. package/dist/integrations/plugin.js.map +1 -1
  243. package/dist/integrations/remote-commands-store.d.ts +36 -0
  244. package/dist/integrations/remote-commands-store.d.ts.map +1 -0
  245. package/dist/integrations/remote-commands-store.js +273 -0
  246. package/dist/integrations/remote-commands-store.js.map +1 -0
  247. package/dist/integrations/remote-devices-store.d.ts +43 -0
  248. package/dist/integrations/remote-devices-store.d.ts.map +1 -0
  249. package/dist/integrations/remote-devices-store.js +315 -0
  250. package/dist/integrations/remote-devices-store.js.map +1 -0
  251. package/dist/integrations/remote-push-store.d.ts +37 -0
  252. package/dist/integrations/remote-push-store.d.ts.map +1 -0
  253. package/dist/integrations/remote-push-store.js +299 -0
  254. package/dist/integrations/remote-push-store.js.map +1 -0
  255. package/dist/integrations/remote-retry-job.d.ts +7 -0
  256. package/dist/integrations/remote-retry-job.d.ts.map +1 -0
  257. package/dist/integrations/remote-retry-job.js +45 -0
  258. package/dist/integrations/remote-retry-job.js.map +1 -0
  259. package/dist/integrations/remote-run-events-store.d.ts +18 -0
  260. package/dist/integrations/remote-run-events-store.d.ts.map +1 -0
  261. package/dist/integrations/remote-run-events-store.js +82 -0
  262. package/dist/integrations/remote-run-events-store.js.map +1 -0
  263. package/dist/integrations/remote-types.d.ts +101 -0
  264. package/dist/integrations/remote-types.d.ts.map +1 -0
  265. package/dist/integrations/remote-types.js +2 -0
  266. package/dist/integrations/remote-types.js.map +1 -0
  267. package/dist/integrations/webhook-handler.d.ts +2 -0
  268. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  269. package/dist/integrations/webhook-handler.js +4 -1
  270. package/dist/integrations/webhook-handler.js.map +1 -1
  271. package/dist/jobs/scheduler.d.ts +4 -2
  272. package/dist/jobs/scheduler.d.ts.map +1 -1
  273. package/dist/jobs/scheduler.js +9 -3
  274. package/dist/jobs/scheduler.js.map +1 -1
  275. package/dist/mcp-client/builtin-capabilities.d.ts +20 -0
  276. package/dist/mcp-client/builtin-capabilities.d.ts.map +1 -0
  277. package/dist/mcp-client/builtin-capabilities.js +75 -0
  278. package/dist/mcp-client/builtin-capabilities.js.map +1 -0
  279. package/dist/mcp-client/builtin-store.d.ts +10 -0
  280. package/dist/mcp-client/builtin-store.d.ts.map +1 -0
  281. package/dist/mcp-client/builtin-store.js +55 -0
  282. package/dist/mcp-client/builtin-store.js.map +1 -0
  283. package/dist/mcp-client/index.d.ts +3 -1
  284. package/dist/mcp-client/index.d.ts.map +1 -1
  285. package/dist/mcp-client/index.js +3 -1
  286. package/dist/mcp-client/index.js.map +1 -1
  287. package/dist/mcp-client/routes.d.ts +28 -0
  288. package/dist/mcp-client/routes.d.ts.map +1 -1
  289. package/dist/mcp-client/routes.js +195 -1
  290. package/dist/mcp-client/routes.js.map +1 -1
  291. package/dist/org/context.d.ts.map +1 -1
  292. package/dist/org/context.js +34 -0
  293. package/dist/org/context.js.map +1 -1
  294. package/dist/resources/handlers.d.ts +4 -0
  295. package/dist/resources/handlers.d.ts.map +1 -1
  296. package/dist/resources/handlers.js +46 -7
  297. package/dist/resources/handlers.js.map +1 -1
  298. package/dist/resources/script-helpers.d.ts +8 -1
  299. package/dist/resources/script-helpers.d.ts.map +1 -1
  300. package/dist/resources/script-helpers.js +18 -8
  301. package/dist/resources/script-helpers.js.map +1 -1
  302. package/dist/resources/store.d.ts +19 -0
  303. package/dist/resources/store.d.ts.map +1 -1
  304. package/dist/resources/store.js +86 -3
  305. package/dist/resources/store.js.map +1 -1
  306. package/dist/scripts/agent-engines/list-agent-engines.d.ts +1 -1
  307. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  308. package/dist/scripts/agent-engines/list-agent-engines.js +18 -7
  309. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  310. package/dist/scripts/agent-engines/manage-agent-engine.d.ts.map +1 -1
  311. package/dist/scripts/agent-engines/manage-agent-engine.js +100 -7
  312. package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
  313. package/dist/scripts/resources/delete.d.ts.map +1 -1
  314. package/dist/scripts/resources/delete.js +4 -1
  315. package/dist/scripts/resources/delete.js.map +1 -1
  316. package/dist/scripts/resources/effective.d.ts +11 -0
  317. package/dist/scripts/resources/effective.d.ts.map +1 -0
  318. package/dist/scripts/resources/effective.js +54 -0
  319. package/dist/scripts/resources/effective.js.map +1 -0
  320. package/dist/scripts/resources/index.d.ts.map +1 -1
  321. package/dist/scripts/resources/index.js +1 -0
  322. package/dist/scripts/resources/index.js.map +1 -1
  323. package/dist/scripts/resources/list.d.ts +1 -1
  324. package/dist/scripts/resources/list.d.ts.map +1 -1
  325. package/dist/scripts/resources/list.js +17 -5
  326. package/dist/scripts/resources/list.js.map +1 -1
  327. package/dist/scripts/resources/read.d.ts +1 -1
  328. package/dist/scripts/resources/read.d.ts.map +1 -1
  329. package/dist/scripts/resources/read.js +20 -5
  330. package/dist/scripts/resources/read.js.map +1 -1
  331. package/dist/scripts/resources/write.d.ts.map +1 -1
  332. package/dist/scripts/resources/write.js +4 -1
  333. package/dist/scripts/resources/write.js.map +1 -1
  334. package/dist/scripts/runner.d.ts +11 -1
  335. package/dist/scripts/runner.d.ts.map +1 -1
  336. package/dist/scripts/runner.js +75 -27
  337. package/dist/scripts/runner.js.map +1 -1
  338. package/dist/server/action-discovery.d.ts.map +1 -1
  339. package/dist/server/action-discovery.js +5 -0
  340. package/dist/server/action-discovery.js.map +1 -1
  341. package/dist/server/agent-chat-plugin.d.ts +24 -0
  342. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  343. package/dist/server/agent-chat-plugin.js +608 -54
  344. package/dist/server/agent-chat-plugin.js.map +1 -1
  345. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  346. package/dist/server/core-routes-plugin.js +2 -0
  347. package/dist/server/core-routes-plugin.js.map +1 -1
  348. package/dist/server/embedded.d.ts +72 -0
  349. package/dist/server/embedded.d.ts.map +1 -0
  350. package/dist/server/embedded.js +119 -0
  351. package/dist/server/embedded.js.map +1 -0
  352. package/dist/server/index.d.ts +8 -1
  353. package/dist/server/index.d.ts.map +1 -1
  354. package/dist/server/index.js +7 -1
  355. package/dist/server/index.js.map +1 -1
  356. package/dist/server/poll.d.ts.map +1 -1
  357. package/dist/server/poll.js +184 -13
  358. package/dist/server/poll.js.map +1 -1
  359. package/dist/server/resources-plugin.d.ts.map +1 -1
  360. package/dist/server/resources-plugin.js +11 -2
  361. package/dist/server/resources-plugin.js.map +1 -1
  362. package/dist/sharing/actions/extension-change.d.ts +4 -0
  363. package/dist/sharing/actions/extension-change.d.ts.map +1 -0
  364. package/dist/sharing/actions/extension-change.js +13 -0
  365. package/dist/sharing/actions/extension-change.js.map +1 -0
  366. package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
  367. package/dist/sharing/actions/set-resource-visibility.js +3 -0
  368. package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
  369. package/dist/sharing/actions/share-resource.d.ts.map +1 -1
  370. package/dist/sharing/actions/share-resource.js +4 -0
  371. package/dist/sharing/actions/share-resource.js.map +1 -1
  372. package/dist/sharing/actions/unshare-resource.d.ts.map +1 -1
  373. package/dist/sharing/actions/unshare-resource.js +3 -0
  374. package/dist/sharing/actions/unshare-resource.js.map +1 -1
  375. package/dist/templates/default/AGENTS.md +3 -3
  376. package/dist/templates/workspace-core/AGENTS.md +7 -0
  377. package/dist/templates/workspace-root/AGENTS.md +7 -0
  378. package/dist/templates/workspace-root/README.md +25 -0
  379. package/dist/triggers/dispatcher.d.ts +3 -1
  380. package/dist/triggers/dispatcher.d.ts.map +1 -1
  381. package/dist/triggers/dispatcher.js +9 -3
  382. package/dist/triggers/dispatcher.js.map +1 -1
  383. package/dist/workspace-connections/index.d.ts +2 -0
  384. package/dist/workspace-connections/index.d.ts.map +1 -0
  385. package/dist/workspace-connections/index.js +2 -0
  386. package/dist/workspace-connections/index.js.map +1 -0
  387. package/dist/workspace-connections/store.d.ts +229 -0
  388. package/dist/workspace-connections/store.d.ts.map +1 -0
  389. package/dist/workspace-connections/store.js +938 -0
  390. package/dist/workspace-connections/store.js.map +1 -0
  391. package/docs/content/agent-teams.md +6 -0
  392. package/docs/content/cloneable-saas.md +1 -0
  393. package/docs/content/code-agents-ui.md +261 -0
  394. package/docs/content/dispatch.md +40 -3
  395. package/docs/content/embedding-sdk.md +459 -0
  396. package/docs/content/faq.md +1 -0
  397. package/docs/content/getting-started.md +1 -0
  398. package/docs/content/mcp-clients.md +41 -3
  399. package/docs/content/migration-workbench.md +237 -54
  400. package/docs/content/multi-app-workspace.md +41 -0
  401. package/docs/content/multi-tenancy.md +1 -1
  402. package/docs/content/template-brain.md +418 -0
  403. package/docs/content/template-dispatch.md +30 -0
  404. package/docs/content/workspace-connections.md +509 -0
  405. package/docs/content/workspace-management.md +12 -12
  406. package/docs/content/workspace.md +180 -40
  407. package/package.json +7 -2
  408. package/src/templates/default/AGENTS.md +3 -3
  409. package/src/templates/workspace-core/AGENTS.md +7 -0
  410. package/src/templates/workspace-root/AGENTS.md +7 -0
  411. package/src/templates/workspace-root/README.md +25 -0
@@ -0,0 +1,54 @@
1
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
2
+ import { agentNativePath } from "../api-path.js";
3
+ const ENDPOINT = agentNativePath("/_agent-native/mcp/builtin");
4
+ export const BUILTIN_CAPABILITIES_KEY = ["mcp-builtin-capabilities"];
5
+ export function useBuiltinCapabilities() {
6
+ return useQuery({
7
+ queryKey: BUILTIN_CAPABILITIES_KEY,
8
+ queryFn: async () => {
9
+ const res = await fetch(ENDPOINT, { credentials: "include" });
10
+ if (!res.ok)
11
+ throw new Error(`Failed to load (${res.status})`);
12
+ return (await res.json());
13
+ },
14
+ staleTime: 10_000,
15
+ });
16
+ }
17
+ export function useToggleBuiltinCapability() {
18
+ const qc = useQueryClient();
19
+ return useMutation({
20
+ mutationFn: async (args) => {
21
+ const res = await fetch(ENDPOINT, {
22
+ method: "POST",
23
+ credentials: "include",
24
+ headers: { "Content-Type": "application/json" },
25
+ body: JSON.stringify(args),
26
+ });
27
+ const body = (await res.json().catch(() => ({})));
28
+ if (!res.ok || !body.ok) {
29
+ throw new Error(body.error || `Update failed (${res.status})`);
30
+ }
31
+ return body;
32
+ },
33
+ onSuccess: () => {
34
+ qc.invalidateQueries({ queryKey: BUILTIN_CAPABILITIES_KEY });
35
+ qc.invalidateQueries({ queryKey: ["mcp-servers"] });
36
+ },
37
+ });
38
+ }
39
+ export function mcpBuiltinVirtualId(scope, capabilityId) {
40
+ return `mcp-builtin:${scope}:${capabilityId}`;
41
+ }
42
+ export function parseMcpBuiltinVirtualId(id) {
43
+ const m = /^mcp-builtin:(user|org):(.+)$/.exec(id);
44
+ if (!m)
45
+ return null;
46
+ const capabilityId = m[2];
47
+ if (capabilityId !== "browser-chrome-devtools" &&
48
+ capabilityId !== "browser-playwright" &&
49
+ capabilityId !== "computer-use") {
50
+ return null;
51
+ }
52
+ return { scope: m[1], capabilityId };
53
+ }
54
+ //# sourceMappingURL=use-builtin-capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-builtin-capabilities.js","sourceRoot":"","sources":["../../../src/client/resources/use-builtin-capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AA0CjD,MAAM,QAAQ,GAAG,eAAe,CAAC,4BAA4B,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,0BAA0B,CAAU,CAAC;AAE9E,MAAM,UAAU,sBAAsB;IACpC,OAAO,QAAQ,CAA0B;QACvC,QAAQ,EAAE,wBAAwB;QAClC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YAC/D,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAC;QACvD,CAAC;QACD,SAAS,EAAE,MAAM;KAClB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IAC5B,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,KAAK,EAAE,IAIlB,EAAE,EAAE;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,SAAS;gBACtB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC3B,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAG/C,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,kBAAkB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,SAAS,EAAE,GAAG,EAAE;YACd,EAAE,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,wBAAwB,EAAE,CAAC,CAAC;YAC7D,EAAE,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAAqB,EACrB,YAAoB;IAEpB,OAAO,eAAe,KAAK,IAAI,YAAY,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,EAAU;IAEV,MAAM,CAAC,GAAG,+BAA+B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,CAAwB,CAAC;IACjD,IACE,YAAY,KAAK,yBAAyB;QAC1C,YAAY,KAAK,oBAAoB;QACrC,YAAY,KAAK,cAAc,EAC/B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAmB,EAAE,YAAY,EAAE,CAAC;AACzD,CAAC","sourcesContent":["import { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { agentNativePath } from \"../api-path.js\";\nimport type { McpServerScope } from \"./use-mcp-servers.js\";\n\nexport type BuiltinCapabilityId =\n | \"browser-chrome-devtools\"\n | \"browser-playwright\"\n | \"computer-use\";\n\nexport interface BuiltinCapability {\n id: BuiltinCapabilityId;\n serverId: string;\n name: string;\n description: string;\n command: string;\n args: string[];\n exclusiveGroup?: string;\n available: boolean;\n unavailableReason?: string;\n notes?: string;\n enabled: { user: boolean; org: boolean };\n mergedIds: { user?: string; org?: string };\n status: {\n user?: BuiltinCapabilityStatus;\n org?: BuiltinCapabilityStatus;\n };\n}\n\nexport type BuiltinCapabilityStatus =\n | { state: \"connected\"; toolCount: number }\n | { state: \"error\"; error: string }\n | { state: \"unknown\" };\n\nexport interface BuiltinCapabilitiesList {\n capabilities: BuiltinCapability[];\n user: { enabledIds: BuiltinCapabilityId[] };\n org: {\n enabledIds: BuiltinCapabilityId[];\n orgId: string | null;\n role: string | null;\n };\n}\n\nconst ENDPOINT = agentNativePath(\"/_agent-native/mcp/builtin\");\nexport const BUILTIN_CAPABILITIES_KEY = [\"mcp-builtin-capabilities\"] as const;\n\nexport function useBuiltinCapabilities() {\n return useQuery<BuiltinCapabilitiesList>({\n queryKey: BUILTIN_CAPABILITIES_KEY,\n queryFn: async () => {\n const res = await fetch(ENDPOINT, { credentials: \"include\" });\n if (!res.ok) throw new Error(`Failed to load (${res.status})`);\n return (await res.json()) as BuiltinCapabilitiesList;\n },\n staleTime: 10_000,\n });\n}\n\nexport function useToggleBuiltinCapability() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (args: {\n id: BuiltinCapabilityId;\n scope: McpServerScope;\n enabled: boolean;\n }) => {\n const res = await fetch(ENDPOINT, {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(args),\n });\n const body = (await res.json().catch(() => ({}))) as {\n ok?: boolean;\n error?: string;\n };\n if (!res.ok || !body.ok) {\n throw new Error(body.error || `Update failed (${res.status})`);\n }\n return body;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: BUILTIN_CAPABILITIES_KEY });\n qc.invalidateQueries({ queryKey: [\"mcp-servers\"] });\n },\n });\n}\n\nexport function mcpBuiltinVirtualId(\n scope: McpServerScope,\n capabilityId: string,\n): string {\n return `mcp-builtin:${scope}:${capabilityId}`;\n}\n\nexport function parseMcpBuiltinVirtualId(\n id: string,\n): { scope: McpServerScope; capabilityId: BuiltinCapabilityId } | null {\n const m = /^mcp-builtin:(user|org):(.+)$/.exec(id);\n if (!m) return null;\n const capabilityId = m[2] as BuiltinCapabilityId;\n if (\n capabilityId !== \"browser-chrome-devtools\" &&\n capabilityId !== \"browser-playwright\" &&\n capabilityId !== \"computer-use\"\n ) {\n return null;\n }\n return { scope: m[1] as McpServerScope, capabilityId };\n}\n"]}
@@ -1,11 +1,12 @@
1
1
  import type { CustomAgentProfile, RemoteAgentManifest, ResourceKind as StoredResourceKind, SkillMetadata } from "../../resources/metadata.js";
2
2
  import type { McpServer } from "./use-mcp-servers.js";
3
+ import { type BuiltinCapability } from "./use-builtin-capabilities.js";
3
4
  /**
4
5
  * Extended resource kind that includes virtual entries injected into the
5
6
  * Workspace tree — MCP servers live in the settings store, not the
6
7
  * resources table, but they render as a folder inside each scope.
7
8
  */
8
- export type ResourceKind = StoredResourceKind | "mcp-server";
9
+ export type ResourceKind = StoredResourceKind | "mcp-server" | "mcp-builtin";
9
10
  export interface Resource {
10
11
  id: string;
11
12
  path: string;
@@ -59,8 +60,30 @@ export interface TreeNode {
59
60
  remoteAgentMeta?: RemoteAgentManifest;
60
61
  /** Attached when `kind === "mcp-server"` — virtual tree entry. */
61
62
  mcpServerMeta?: McpServer;
63
+ /** Attached when `kind === "mcp-builtin"` — virtual built-in MCP entry. */
64
+ mcpBuiltinMeta?: BuiltinCapability & {
65
+ scope: "user" | "org";
66
+ scopeEnabled: boolean;
67
+ };
68
+ }
69
+ export type ResourceScope = "personal" | "shared" | "workspace" | "all";
70
+ export type EffectiveResourceScope = "workspace" | "shared" | "personal";
71
+ export interface EffectiveResourceLayer {
72
+ scope: EffectiveResourceScope;
73
+ label: string;
74
+ owner: string;
75
+ resource: ResourceMeta | null;
76
+ exists: boolean;
77
+ effective: boolean;
78
+ overridden: boolean;
79
+ canWrite: boolean;
80
+ }
81
+ export interface EffectiveResourceContext {
82
+ path: string;
83
+ effectiveResource: ResourceMeta | null;
84
+ effectiveScope: EffectiveResourceScope | null;
85
+ layers: EffectiveResourceLayer[];
62
86
  }
63
- export type ResourceScope = "personal" | "shared" | "all";
64
87
  /**
65
88
  * Inject a virtual `mcp-servers/` folder into a scope's resource tree.
66
89
  *
@@ -77,6 +100,10 @@ export type ResourceScope = "personal" | "shared" | "all";
77
100
  */
78
101
  export declare function withMcpServersFolder(tree: TreeNode[], servers: McpServer[], opts?: {
79
102
  alwaysShow?: boolean;
103
+ builtins?: Array<{
104
+ capability: BuiltinCapability;
105
+ scope: "user" | "org";
106
+ }>;
80
107
  }): TreeNode[];
81
108
  export declare function withAgentScratchFolder(tree: TreeNode[], opts?: {
82
109
  show?: boolean;
@@ -86,6 +113,7 @@ export declare function useResourceTree(scope?: ResourceScope, opts?: {
86
113
  includeAgentScratch?: boolean;
87
114
  }): import("@tanstack/react-query").UseQueryResult<TreeNode[], Error>;
88
115
  export declare function useResource(id: string | null): import("@tanstack/react-query").UseQueryResult<Resource, Error>;
116
+ export declare function useEffectiveResourceContext(path: string | null): import("@tanstack/react-query").UseQueryResult<EffectiveResourceContext, Error>;
89
117
  export declare function useCreateResource(): import("@tanstack/react-query").UseMutationResult<Resource, Error, {
90
118
  path: string;
91
119
  content?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"use-resources.d.ts","sourceRoot":"","sources":["../../../src/client/resources/use-resources.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-resources.d.ts","sourceRoot":"","sources":["../../../src/client/resources/use-resources.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { agentNativePath } from "../api-path.js";
2
2
  import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
3
+ import { mcpBuiltinVirtualId, } from "./use-builtin-capabilities.js";
3
4
  /**
4
5
  * Inject a virtual `mcp-servers/` folder into a scope's resource tree.
5
6
  *
@@ -16,8 +17,10 @@ import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
16
17
  */
17
18
  export function withMcpServersFolder(tree, servers, opts) {
18
19
  const alwaysShow = opts?.alwaysShow ?? false;
19
- if (servers.length === 0 && !alwaysShow)
20
+ const builtins = opts?.builtins ?? [];
21
+ if (servers.length === 0 && builtins.length === 0 && !alwaysShow) {
20
22
  return tree;
23
+ }
21
24
  // Filter out any real `mcp-servers/` entries so the virtual folder is
22
25
  // authoritative. (Shouldn't happen today, but guards against collisions
23
26
  // if a user pastes a file there.)
@@ -49,6 +52,34 @@ export function withMcpServersFolder(tree, servers, opts) {
49
52
  },
50
53
  };
51
54
  });
55
+ for (const { capability, scope } of builtins) {
56
+ const scopeEnabled = capability.enabled[scope];
57
+ const virtualId = mcpBuiltinVirtualId(scope, capability.id);
58
+ const path = `mcp-servers/${capability.id}.json`;
59
+ children.push({
60
+ name: `${capability.name}.json`,
61
+ path,
62
+ type: "file",
63
+ kind: "mcp-builtin",
64
+ mcpBuiltinMeta: { ...capability, scope, scopeEnabled },
65
+ resource: {
66
+ id: virtualId,
67
+ path,
68
+ owner: scope,
69
+ mimeType: "application/json",
70
+ size: 0,
71
+ createdAt: 0,
72
+ updatedAt: scopeEnabled ? now : 0,
73
+ createdBy: "system",
74
+ visibility: "workspace",
75
+ threadId: null,
76
+ runId: null,
77
+ expiresAt: null,
78
+ metadata: null,
79
+ },
80
+ });
81
+ }
82
+ children.sort((a, b) => a.name.localeCompare(b.name));
52
83
  const folder = {
53
84
  name: "mcp-servers",
54
85
  path: "mcp-servers",
@@ -151,6 +182,16 @@ export function useResource(id) {
151
182
  enabled: !!id,
152
183
  });
153
184
  }
185
+ export function useEffectiveResourceContext(path) {
186
+ return useQuery({
187
+ queryKey: ["resources", "effective", path],
188
+ queryFn: async () => {
189
+ const query = new URLSearchParams({ path: path ?? "" });
190
+ return fetchJson(agentNativePath(`/_agent-native/resources/effective?${query}`));
191
+ },
192
+ enabled: !!path,
193
+ });
194
+ }
154
195
  export function useCreateResource() {
155
196
  const queryClient = useQueryClient();
156
197
  return useMutation({
@@ -1 +1 @@
1
- {"version":3,"file":"use-resources.js","sourceRoot":"","sources":["../../../src/client/resources/use-resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AA4E9E;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAgB,EAChB,OAAoB,EACpB,IAA+B;IAE/B,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,KAAK,CAAC;IAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAErD,sEAAsE;IACtE,wEAAwE;IACxE,kCAAkC;IAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAC1D,CAAC;IAEF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAe,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,IAAI,OAAO,CAAC;QAC1C,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,OAAO;YACtB,IAAI;YACJ,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,YAAY;YAClB,aAAa,EAAE,CAAC;YAChB,QAAQ,EAAE;gBACR,EAAE,EAAE,SAAS;gBACb,IAAI;gBACJ,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE,WAAW;gBACvB,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,IAAI;gBACX,SAAS,EAAE,IAAI;gBACf,QAAQ,EAAE,IAAI;aACf;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAa;QACvB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,QAAQ;QACd,QAAQ;KACT,CAAC;IAEF,6EAA6E;IAC7E,+DAA+D;IAC/D,MAAM,YAAY,GAAe,EAAE,CAAC;IACpC,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,yEAAyE;IACzE,+DAA+D;IAC/D,KAAK,GAAG,CAAC;IACT,OAAO,CAAC,GAAG,YAAY,EAAE,GAAG,KAAK,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,0BAA0B,CAAC,IAAc;IAChD,OAAO,CACL,IAAI,CAAC,QAAQ,EAAE,UAAU,KAAK,eAAe;QAC7C,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;YACrB,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CACtD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,IAAgB,EAChB,IAAyB;IAEzB,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC;IAChC,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,MAAM,GAAa;QACvB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,OAAO;KAClB,CAAC;IACF,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,SAAS,CAAI,GAAW;IACrC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1E,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAuB,UAAU;IAC5D,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,OAAO,QAAQ,CAAiB;QAC9B,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC;QACtC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,IAAI,GAAG,MAAM,SAAS,CAC1B,eAAe,CAAC,4BAA4B,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAChE,CAAC;YACF,OAAO,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;QAC9B,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,QAAuB,UAAU,EACjC,IAAwC;IAExC,OAAO,QAAQ,CAAa;QAC1B,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,IAAI,KAAK,CAAC;QAC1E,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7C,IAAI,IAAI,EAAE,mBAAmB;gBAAE,KAAK,CAAC,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YACxE,MAAM,IAAI,GAAG,MAAM,SAAS,CAC1B,eAAe,CAAC,iCAAiC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CACrE,CAAC;YACF,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QACzB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAiB;IAC3C,OAAO,QAAQ,CAAW;QACxB,QAAQ,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC;QAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,eAAe,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;QAC3E,OAAO,EAAE,CAAC,CAAC,EAAE;KACd,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,KAAK,EAAE,IAKlB,EAAE,EAAE;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,0BAA0B,CAAC,EAAE;gBACnE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC3B,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YACjE,OAAO,GAAG,CAAC,IAAI,EAAuB,CAAC;QACzC,CAAC;QACD,SAAS,EAAE,GAAG,EAAE;YACd,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,KAAK,EAAE,EACjB,EAAE,EACF,GAAG,IAAI,EAMR,EAAE,EAAE;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,eAAe,CAAC,4BAA4B,EAAE,EAAE,CAAC,EACjD;gBACE,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC3B,CACF,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YACjE,OAAO,GAAG,CAAC,IAAI,EAAuB,CAAC;QACzC,CAAC;QACD,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YAC9B,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAC3D,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,KAAK,EAAE,EAAU,EAAE,EAAE;YAC/B,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,eAAe,CAAC,4BAA4B,EAAE,EAAE,CAAC,EACjD;gBACE,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CACF,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,SAAS,EAAE,GAAG,EAAE;YACd,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,KAAK,EAAE,QAAkB,EAAE,EAAE;YACvC,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,eAAe,CAAC,iCAAiC,CAAC,EAClD;gBACE,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,QAAQ;aACf,CACF,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YACjE,OAAO,GAAG,CAAC,IAAI,EAAuB,CAAC;QACzC,CAAC;QACD,SAAS,EAAE,GAAG,EAAE;YACd,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type {\n CustomAgentProfile,\n RemoteAgentManifest,\n ResourceKind as StoredResourceKind,\n SkillMetadata,\n} from \"../../resources/metadata.js\";\nimport type { McpServer } from \"./use-mcp-servers.js\";\n\n/**\n * Extended resource kind that includes virtual entries injected into the\n * Workspace tree — MCP servers live in the settings store, not the\n * resources table, but they render as a folder inside each scope.\n */\nexport type ResourceKind = StoredResourceKind | \"mcp-server\";\n\nexport interface Resource {\n id: string;\n path: string;\n owner: string;\n content: string;\n mimeType: string;\n size: number;\n createdAt: number;\n updatedAt: number;\n createdBy: \"user\" | \"agent\" | \"system\";\n visibility: \"workspace\" | \"agent_scratch\";\n threadId: string | null;\n runId: string | null;\n expiresAt: number | null;\n metadata: string | null;\n}\n\nexport interface ResourceMeta {\n id: string;\n path: string;\n owner: string;\n mimeType: string;\n size: number;\n createdAt: number;\n updatedAt: number;\n createdBy: \"user\" | \"agent\" | \"system\";\n visibility: \"workspace\" | \"agent_scratch\";\n threadId: string | null;\n runId: string | null;\n expiresAt: number | null;\n metadata: string | null;\n}\n\nexport interface JobMetadata {\n schedule?: string;\n scheduleDescription?: string;\n enabled?: boolean;\n lastStatus?: \"success\" | \"error\" | \"running\" | \"skipped\";\n lastRun?: string;\n nextRun?: string;\n}\n\nexport interface TreeNode {\n name: string;\n path: string;\n type: \"file\" | \"folder\";\n kind?: ResourceKind;\n children?: TreeNode[];\n resource?: ResourceMeta;\n /** Parsed metadata for job files (under jobs/) */\n jobMeta?: JobMetadata;\n skillMeta?: SkillMetadata;\n agentMeta?: CustomAgentProfile;\n remoteAgentMeta?: RemoteAgentManifest;\n /** Attached when `kind === \"mcp-server\"` — virtual tree entry. */\n mcpServerMeta?: McpServer;\n}\n\nexport type ResourceScope = \"personal\" | \"shared\" | \"all\";\n\n/**\n * Inject a virtual `mcp-servers/` folder into a scope's resource tree.\n *\n * MCP servers aren't stored as resource rows — they live in the settings\n * store — but we surface them in the Workspace tree alongside `memory/`,\n * `skills/`, etc. Each server becomes a synthetic `TreeNode` whose\n * `resource.id` is an `mcp:<scope>:<id>` virtual id the panel recognizes\n * on click/delete and routes to the MCP endpoints instead of the\n * resource endpoints.\n *\n * Returns a new tree; the input is not mutated. If `servers` is empty\n * and `alwaysShow` is false, the folder is not added — same behavior as\n * any other optional folder.\n */\nexport function withMcpServersFolder(\n tree: TreeNode[],\n servers: McpServer[],\n opts?: { alwaysShow?: boolean },\n): TreeNode[] {\n const alwaysShow = opts?.alwaysShow ?? false;\n if (servers.length === 0 && !alwaysShow) return tree;\n\n // Filter out any real `mcp-servers/` entries so the virtual folder is\n // authoritative. (Shouldn't happen today, but guards against collisions\n // if a user pastes a file there.)\n const filtered = tree.filter(\n (n) => !(n.type === \"folder\" && n.name === \"mcp-servers\"),\n );\n\n const now = Date.now();\n const children: TreeNode[] = servers.map((s) => {\n const virtualId = `mcp:${s.scope}:${s.id}`;\n const path = `mcp-servers/${s.name}.json`;\n return {\n name: `${s.name}.json`,\n path,\n type: \"file\",\n kind: \"mcp-server\",\n mcpServerMeta: s,\n resource: {\n id: virtualId,\n path,\n owner: s.scope,\n mimeType: \"application/json\",\n size: 0,\n createdAt: s.createdAt,\n updatedAt: s.createdAt,\n createdBy: \"system\",\n visibility: \"workspace\",\n threadId: null,\n runId: null,\n expiresAt: null,\n metadata: null,\n },\n };\n });\n\n const folder: TreeNode = {\n name: \"mcp-servers\",\n path: \"mcp-servers\",\n type: \"folder\",\n children,\n };\n\n // Insert the folder so it sorts naturally with other folders (alphabetical).\n // The backend already sorts folders-first, alpha — match that.\n const foldersFirst: TreeNode[] = [];\n const files: TreeNode[] = [];\n for (const n of filtered) {\n (n.type === \"folder\" ? foldersFirst : files).push(n);\n }\n foldersFirst.push(folder);\n foldersFirst.sort((a, b) => a.name.localeCompare(b.name));\n // Assign a synthetic `updatedAt`-less ordering — use current time so the\n // folder appears stable across renders; we rely on alpha sort.\n void now;\n return [...foldersFirst, ...files];\n}\n\n/**\n * Group top-level `scripts/` and `tasks/` folders into a virtual\n * `agent-scratch/` folder.\n *\n * The agent occasionally writes scratch scripts and task notes to the\n * resources store while working through a request. These aren't user\n * content — they're agent machinery — and they clutter the top of the\n * personal tree. Grouping them under a single clearly-labeled folder\n * keeps them visible (so the user can inspect or delete) without making\n * them look like first-class personal files.\n */\nfunction isTopLevelAgentScratchNode(node: TreeNode): boolean {\n return (\n node.resource?.visibility === \"agent_scratch\" ||\n (node.type === \"folder\" &&\n (node.name === \"scripts\" || node.name === \"tasks\"))\n );\n}\n\nexport function withAgentScratchFolder(\n tree: TreeNode[],\n opts?: { show?: boolean },\n): TreeNode[] {\n const show = opts?.show ?? true;\n const scratch: TreeNode[] = [];\n const rest: TreeNode[] = [];\n for (const n of tree) {\n if (isTopLevelAgentScratchNode(n)) {\n scratch.push(n);\n } else {\n rest.push(n);\n }\n }\n if (!show) return rest;\n if (scratch.length === 0) return tree;\n const folder: TreeNode = {\n name: \"agent-scratch\",\n path: \"agent-scratch\",\n type: \"folder\",\n children: scratch,\n };\n const folders: TreeNode[] = [];\n const files: TreeNode[] = [];\n for (const n of rest) {\n (n.type === \"folder\" ? folders : files).push(n);\n }\n folders.push(folder);\n folders.sort((a, b) => a.name.localeCompare(b.name));\n return [...folders, ...files];\n}\n\nasync function fetchJson<T>(url: string): Promise<T> {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch ${url}: ${res.statusText}`);\n return res.json();\n}\n\nexport function useResources(scope: ResourceScope = \"personal\") {\n const query = new URLSearchParams({ scope });\n return useQuery<ResourceMeta[]>({\n queryKey: [\"resources\", \"list\", scope],\n queryFn: async () => {\n const data = await fetchJson<{ resources: ResourceMeta[] }>(\n agentNativePath(`/_agent-native/resources?${query.toString()}`),\n );\n return data.resources ?? [];\n },\n });\n}\n\nexport function useResourceTree(\n scope: ResourceScope = \"personal\",\n opts?: { includeAgentScratch?: boolean },\n) {\n return useQuery<TreeNode[]>({\n queryKey: [\"resources\", \"tree\", scope, opts?.includeAgentScratch ?? false],\n queryFn: async () => {\n const query = new URLSearchParams({ scope });\n if (opts?.includeAgentScratch) query.set(\"includeAgentScratch\", \"true\");\n const data = await fetchJson<{ tree: TreeNode[] }>(\n agentNativePath(`/_agent-native/resources/tree?${query.toString()}`),\n );\n return data.tree ?? [];\n },\n });\n}\n\nexport function useResource(id: string | null) {\n return useQuery<Resource>({\n queryKey: [\"resource\", id],\n queryFn: () => fetchJson(agentNativePath(`/_agent-native/resources/${id}`)),\n enabled: !!id,\n });\n}\n\nexport function useCreateResource() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (body: {\n path: string;\n content?: string;\n mimeType?: string;\n shared?: boolean;\n }) => {\n const res = await fetch(agentNativePath(\"/_agent-native/resources\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!res.ok) throw new Error(`Create failed: ${res.statusText}`);\n return res.json() as Promise<Resource>;\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"resources\"] });\n },\n });\n}\n\nexport function useUpdateResource() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async ({\n id,\n ...body\n }: {\n id: string;\n content?: string;\n path?: string;\n mimeType?: string;\n }) => {\n const res = await fetch(\n agentNativePath(`/_agent-native/resources/${id}`),\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n if (!res.ok) throw new Error(`Update failed: ${res.statusText}`);\n return res.json() as Promise<Resource>;\n },\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({ queryKey: [\"resources\"] });\n queryClient.invalidateQueries({ queryKey: [\"resource\", variables.id] });\n },\n });\n}\n\nexport function useDeleteResource() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const res = await fetch(\n agentNativePath(`/_agent-native/resources/${id}`),\n {\n method: \"DELETE\",\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n if (!res.ok) throw new Error(`Delete failed: ${res.statusText}`);\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"resources\"] });\n },\n });\n}\n\nexport function useUploadResource() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (formData: FormData) => {\n const res = await fetch(\n agentNativePath(\"/_agent-native/resources/upload\"),\n {\n method: \"POST\",\n body: formData,\n },\n );\n if (!res.ok) throw new Error(`Upload failed: ${res.statusText}`);\n return res.json() as Promise<Resource>;\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"resources\"] });\n },\n });\n}\n"]}
1
+ {"version":3,"file":"use-resources.js","sourceRoot":"","sources":["../../../src/client/resources/use-resources.ts"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type {\n CustomAgentProfile,\n RemoteAgentManifest,\n ResourceKind as StoredResourceKind,\n SkillMetadata,\n} from \"../../resources/metadata.js\";\nimport type { McpServer } from \"./use-mcp-servers.js\";\nimport {\n mcpBuiltinVirtualId,\n type BuiltinCapability,\n} from \"./use-builtin-capabilities.js\";\n\n/**\n * Extended resource kind that includes virtual entries injected into the\n * Workspace tree — MCP servers live in the settings store, not the\n * resources table, but they render as a folder inside each scope.\n */\nexport type ResourceKind = StoredResourceKind | \"mcp-server\" | \"mcp-builtin\";\n\nexport interface Resource {\n id: string;\n path: string;\n owner: string;\n content: string;\n mimeType: string;\n size: number;\n createdAt: number;\n updatedAt: number;\n createdBy: \"user\" | \"agent\" | \"system\";\n visibility: \"workspace\" | \"agent_scratch\";\n threadId: string | null;\n runId: string | null;\n expiresAt: number | null;\n metadata: string | null;\n}\n\nexport interface ResourceMeta {\n id: string;\n path: string;\n owner: string;\n mimeType: string;\n size: number;\n createdAt: number;\n updatedAt: number;\n createdBy: \"user\" | \"agent\" | \"system\";\n visibility: \"workspace\" | \"agent_scratch\";\n threadId: string | null;\n runId: string | null;\n expiresAt: number | null;\n metadata: string | null;\n}\n\nexport interface JobMetadata {\n schedule?: string;\n scheduleDescription?: string;\n enabled?: boolean;\n lastStatus?: \"success\" | \"error\" | \"running\" | \"skipped\";\n lastRun?: string;\n nextRun?: string;\n}\n\nexport interface TreeNode {\n name: string;\n path: string;\n type: \"file\" | \"folder\";\n kind?: ResourceKind;\n children?: TreeNode[];\n resource?: ResourceMeta;\n /** Parsed metadata for job files (under jobs/) */\n jobMeta?: JobMetadata;\n skillMeta?: SkillMetadata;\n agentMeta?: CustomAgentProfile;\n remoteAgentMeta?: RemoteAgentManifest;\n /** Attached when `kind === \"mcp-server\"` — virtual tree entry. */\n mcpServerMeta?: McpServer;\n /** Attached when `kind === \"mcp-builtin\"` — virtual built-in MCP entry. */\n mcpBuiltinMeta?: BuiltinCapability & {\n scope: \"user\" | \"org\";\n scopeEnabled: boolean;\n };\n}\n\nexport type ResourceScope = \"personal\" | \"shared\" | \"workspace\" | \"all\";\nexport type EffectiveResourceScope = \"workspace\" | \"shared\" | \"personal\";\n\nexport interface EffectiveResourceLayer {\n scope: EffectiveResourceScope;\n label: string;\n owner: string;\n resource: ResourceMeta | null;\n exists: boolean;\n effective: boolean;\n overridden: boolean;\n canWrite: boolean;\n}\n\nexport interface EffectiveResourceContext {\n path: string;\n effectiveResource: ResourceMeta | null;\n effectiveScope: EffectiveResourceScope | null;\n layers: EffectiveResourceLayer[];\n}\n\n/**\n * Inject a virtual `mcp-servers/` folder into a scope's resource tree.\n *\n * MCP servers aren't stored as resource rows — they live in the settings\n * store — but we surface them in the Workspace tree alongside `memory/`,\n * `skills/`, etc. Each server becomes a synthetic `TreeNode` whose\n * `resource.id` is an `mcp:<scope>:<id>` virtual id the panel recognizes\n * on click/delete and routes to the MCP endpoints instead of the\n * resource endpoints.\n *\n * Returns a new tree; the input is not mutated. If `servers` is empty\n * and `alwaysShow` is false, the folder is not added — same behavior as\n * any other optional folder.\n */\nexport function withMcpServersFolder(\n tree: TreeNode[],\n servers: McpServer[],\n opts?: {\n alwaysShow?: boolean;\n builtins?: Array<{\n capability: BuiltinCapability;\n scope: \"user\" | \"org\";\n }>;\n },\n): TreeNode[] {\n const alwaysShow = opts?.alwaysShow ?? false;\n const builtins = opts?.builtins ?? [];\n if (servers.length === 0 && builtins.length === 0 && !alwaysShow) {\n return tree;\n }\n\n // Filter out any real `mcp-servers/` entries so the virtual folder is\n // authoritative. (Shouldn't happen today, but guards against collisions\n // if a user pastes a file there.)\n const filtered = tree.filter(\n (n) => !(n.type === \"folder\" && n.name === \"mcp-servers\"),\n );\n\n const now = Date.now();\n const children: TreeNode[] = servers.map((s) => {\n const virtualId = `mcp:${s.scope}:${s.id}`;\n const path = `mcp-servers/${s.name}.json`;\n return {\n name: `${s.name}.json`,\n path,\n type: \"file\",\n kind: \"mcp-server\",\n mcpServerMeta: s,\n resource: {\n id: virtualId,\n path,\n owner: s.scope,\n mimeType: \"application/json\",\n size: 0,\n createdAt: s.createdAt,\n updatedAt: s.createdAt,\n createdBy: \"system\",\n visibility: \"workspace\",\n threadId: null,\n runId: null,\n expiresAt: null,\n metadata: null,\n },\n };\n });\n\n for (const { capability, scope } of builtins) {\n const scopeEnabled = capability.enabled[scope];\n const virtualId = mcpBuiltinVirtualId(scope, capability.id);\n const path = `mcp-servers/${capability.id}.json`;\n children.push({\n name: `${capability.name}.json`,\n path,\n type: \"file\",\n kind: \"mcp-builtin\",\n mcpBuiltinMeta: { ...capability, scope, scopeEnabled },\n resource: {\n id: virtualId,\n path,\n owner: scope,\n mimeType: \"application/json\",\n size: 0,\n createdAt: 0,\n updatedAt: scopeEnabled ? now : 0,\n createdBy: \"system\",\n visibility: \"workspace\",\n threadId: null,\n runId: null,\n expiresAt: null,\n metadata: null,\n },\n });\n }\n\n children.sort((a, b) => a.name.localeCompare(b.name));\n\n const folder: TreeNode = {\n name: \"mcp-servers\",\n path: \"mcp-servers\",\n type: \"folder\",\n children,\n };\n\n // Insert the folder so it sorts naturally with other folders (alphabetical).\n // The backend already sorts folders-first, alpha — match that.\n const foldersFirst: TreeNode[] = [];\n const files: TreeNode[] = [];\n for (const n of filtered) {\n (n.type === \"folder\" ? foldersFirst : files).push(n);\n }\n foldersFirst.push(folder);\n foldersFirst.sort((a, b) => a.name.localeCompare(b.name));\n // Assign a synthetic `updatedAt`-less ordering — use current time so the\n // folder appears stable across renders; we rely on alpha sort.\n void now;\n return [...foldersFirst, ...files];\n}\n\n/**\n * Group top-level `scripts/` and `tasks/` folders into a virtual\n * `agent-scratch/` folder.\n *\n * The agent occasionally writes scratch scripts and task notes to the\n * resources store while working through a request. These aren't user\n * content — they're agent machinery — and they clutter the top of the\n * personal tree. Grouping them under a single clearly-labeled folder\n * keeps them visible (so the user can inspect or delete) without making\n * them look like first-class personal files.\n */\nfunction isTopLevelAgentScratchNode(node: TreeNode): boolean {\n return (\n node.resource?.visibility === \"agent_scratch\" ||\n (node.type === \"folder\" &&\n (node.name === \"scripts\" || node.name === \"tasks\"))\n );\n}\n\nexport function withAgentScratchFolder(\n tree: TreeNode[],\n opts?: { show?: boolean },\n): TreeNode[] {\n const show = opts?.show ?? true;\n const scratch: TreeNode[] = [];\n const rest: TreeNode[] = [];\n for (const n of tree) {\n if (isTopLevelAgentScratchNode(n)) {\n scratch.push(n);\n } else {\n rest.push(n);\n }\n }\n if (!show) return rest;\n if (scratch.length === 0) return tree;\n const folder: TreeNode = {\n name: \"agent-scratch\",\n path: \"agent-scratch\",\n type: \"folder\",\n children: scratch,\n };\n const folders: TreeNode[] = [];\n const files: TreeNode[] = [];\n for (const n of rest) {\n (n.type === \"folder\" ? folders : files).push(n);\n }\n folders.push(folder);\n folders.sort((a, b) => a.name.localeCompare(b.name));\n return [...folders, ...files];\n}\n\nasync function fetchJson<T>(url: string): Promise<T> {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch ${url}: ${res.statusText}`);\n return res.json();\n}\n\nexport function useResources(scope: ResourceScope = \"personal\") {\n const query = new URLSearchParams({ scope });\n return useQuery<ResourceMeta[]>({\n queryKey: [\"resources\", \"list\", scope],\n queryFn: async () => {\n const data = await fetchJson<{ resources: ResourceMeta[] }>(\n agentNativePath(`/_agent-native/resources?${query.toString()}`),\n );\n return data.resources ?? [];\n },\n });\n}\n\nexport function useResourceTree(\n scope: ResourceScope = \"personal\",\n opts?: { includeAgentScratch?: boolean },\n) {\n return useQuery<TreeNode[]>({\n queryKey: [\"resources\", \"tree\", scope, opts?.includeAgentScratch ?? false],\n queryFn: async () => {\n const query = new URLSearchParams({ scope });\n if (opts?.includeAgentScratch) query.set(\"includeAgentScratch\", \"true\");\n const data = await fetchJson<{ tree: TreeNode[] }>(\n agentNativePath(`/_agent-native/resources/tree?${query.toString()}`),\n );\n return data.tree ?? [];\n },\n });\n}\n\nexport function useResource(id: string | null) {\n return useQuery<Resource>({\n queryKey: [\"resource\", id],\n queryFn: () => fetchJson(agentNativePath(`/_agent-native/resources/${id}`)),\n enabled: !!id,\n });\n}\n\nexport function useEffectiveResourceContext(path: string | null) {\n return useQuery<EffectiveResourceContext>({\n queryKey: [\"resources\", \"effective\", path],\n queryFn: async () => {\n const query = new URLSearchParams({ path: path ?? \"\" });\n return fetchJson<EffectiveResourceContext>(\n agentNativePath(`/_agent-native/resources/effective?${query}`),\n );\n },\n enabled: !!path,\n });\n}\n\nexport function useCreateResource() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (body: {\n path: string;\n content?: string;\n mimeType?: string;\n shared?: boolean;\n }) => {\n const res = await fetch(agentNativePath(\"/_agent-native/resources\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!res.ok) throw new Error(`Create failed: ${res.statusText}`);\n return res.json() as Promise<Resource>;\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"resources\"] });\n },\n });\n}\n\nexport function useUpdateResource() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async ({\n id,\n ...body\n }: {\n id: string;\n content?: string;\n path?: string;\n mimeType?: string;\n }) => {\n const res = await fetch(\n agentNativePath(`/_agent-native/resources/${id}`),\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n if (!res.ok) throw new Error(`Update failed: ${res.statusText}`);\n return res.json() as Promise<Resource>;\n },\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({ queryKey: [\"resources\"] });\n queryClient.invalidateQueries({ queryKey: [\"resource\", variables.id] });\n },\n });\n}\n\nexport function useDeleteResource() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const res = await fetch(\n agentNativePath(`/_agent-native/resources/${id}`),\n {\n method: \"DELETE\",\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n if (!res.ok) throw new Error(`Delete failed: ${res.statusText}`);\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"resources\"] });\n },\n });\n}\n\nexport function useUploadResource() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (formData: FormData) => {\n const res = await fetch(\n agentNativePath(\"/_agent-native/resources/upload\"),\n {\n method: \"POST\",\n body: formData,\n },\n );\n if (!res.ok) throw new Error(`Upload failed: ${res.statusText}`);\n return res.json() as Promise<Resource>;\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"resources\"] });\n },\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsPanel.d.ts","sourceRoot":"","sources":["../../../src/client/settings/SettingsPanel.tsx"],"names":[],"mappings":"AA6+CA,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AA2QD,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,eAAe,EACf,aAAa,EACb,SAAS,EACT,cAAc,EACd,iBAAiB,GAClB,EAAE,kBAAkB,2CA2WpB"}
1
+ {"version":3,"file":"SettingsPanel.d.ts","sourceRoot":"","sources":["../../../src/client/settings/SettingsPanel.tsx"],"names":[],"mappings":"AA6xDA,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAoRD,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,eAAe,EACf,aAAa,EACb,SAAS,EACT,cAAc,EACd,iBAAiB,GAClB,EAAE,kBAAkB,2CAiXpB"}
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import { agentNativePath } from "../api-path.js";
3
3
  import { Suspense, lazy, useState, useEffect, useCallback, useRef, } from "react";
4
4
  import * as SelectPrimitive from "@radix-ui/react-select";
5
- import { IconChevronDown, IconCheck, IconExternalLink, IconBrain, IconBrowser, IconGitBranch, IconCloud, IconDatabase, IconShield, IconPlugConnected, IconTopologyRing2, IconLoader2, IconUpload, IconCoin, IconMail, IconKey, IconMicrophone, IconBolt, IconGauge, IconUserCircle, } from "@tabler/icons-react";
5
+ import { IconChevronDown, IconCheck, IconExternalLink, IconBrain, IconBrowser, IconGitBranch, IconCloud, IconDatabase, IconShield, IconPlugConnected, IconTopologyRing2, IconLoader2, IconUpload, IconCoin, IconMail, IconKey, IconMicrophone, IconBolt, IconGauge, IconUserCircle, IconApps, } from "@tabler/icons-react";
6
6
  import { SettingsSection } from "./SettingsSection.js";
7
7
  import { useBuilderConnectFlow, useBuilderStatus, } from "./useBuilderStatus.js";
8
8
  import { BuilderBMark } from "../builder-mark.js";
@@ -435,6 +435,149 @@ function LLMSectionInner({ builderFlow, builderLoading, connectUrl, connected, o
435
435
  handleSave();
436
436
  }, placeholder: PROVIDER_ENV_PLACEHOLDERS[envVar] ?? "...", className: "flex-1 rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent" }), _jsx("button", { onClick: handleSave, disabled: !apiKey.trim() || saving, className: "rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40", children: saving ? (_jsx(IconLoader2, { size: 10, className: "animate-spin" })) : saved ? (_jsx(IconCheck, { size: 10 })) : ("Save") })] })) : null, _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { onClick: handleTest, disabled: testing, className: "rounded border border-border px-2.5 py-1 text-[10px] font-medium text-foreground hover:bg-accent/40 disabled:opacity-40", children: testing ? (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx(IconLoader2, { size: 10, className: "animate-spin" }), "Testing\u2026"] })) : ("Test") }), engineChanged && (_jsx("button", { onClick: handleApply, className: "rounded bg-accent px-2.5 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80", children: "Apply" })), settingsStatus != null && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { onClick: handleDisconnect, className: "ml-auto rounded border border-border px-2.5 py-1 text-[10px] font-medium text-muted-foreground hover:bg-destructive/10 hover:text-destructive hover:border-destructive/40", children: "Disconnect" }) }), _jsx(TooltipContent, { children: "Clear the saved engine \u2014 the app will fall back to the default until you re-apply." })] }))] }), testResult && testResult.ok && (_jsxs("p", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Test passed \u2014 ", testResult.latencyMs, "ms"] })), testResult && testResult.ok === false && (_jsxs("p", { className: "text-[10px] text-destructive", children: ["Test failed: ", testResult.error] })), disconnectError && (_jsxs("p", { className: "text-[10px] text-destructive", children: ["Disconnect failed: ", disconnectError] })), applyNote && (_jsx("p", { className: "text-[10px] text-muted-foreground", children: "Changes take effect on next conversation" }))] }) }))] })) }));
437
437
  }
438
+ function friendlyAppName(appId) {
439
+ return appId
440
+ .split("-")
441
+ .filter(Boolean)
442
+ .map((part) => part[0]?.toUpperCase() + part.slice(1))
443
+ .join(" ");
444
+ }
445
+ function AppModelDefaultsSectionInner({ open, onToggle, }) {
446
+ const [settings, setSettings] = useState(null);
447
+ const [selectedEngine, setSelectedEngine] = useState("");
448
+ const [selectedModel, setSelectedModel] = useState("");
449
+ const [loading, setLoading] = useState(true);
450
+ const [saving, setSaving] = useState(false);
451
+ const [saved, setSaved] = useState(false);
452
+ const [error, setError] = useState(null);
453
+ const load = useCallback(() => {
454
+ let cancelled = false;
455
+ setLoading(true);
456
+ fetch(agentNativePath("/_agent-native/agent-model-defaults"))
457
+ .then((r) => (r.ok ? r.json() : null))
458
+ .then((data) => {
459
+ if (cancelled || !data)
460
+ return;
461
+ setSettings(data);
462
+ const firstConfigured = data.engines.find((engine) => engine.configured) ?? data.engines[0];
463
+ const nextEngine = data.engine ?? firstConfigured?.name ?? "";
464
+ const nextEngineInfo = data.engines.find((engine) => engine.name === nextEngine) ??
465
+ firstConfigured;
466
+ setSelectedEngine(nextEngine);
467
+ setSelectedModel(data.model ?? nextEngineInfo?.defaultModel ?? "");
468
+ })
469
+ .catch(() => { })
470
+ .finally(() => {
471
+ if (!cancelled)
472
+ setLoading(false);
473
+ });
474
+ return () => {
475
+ cancelled = true;
476
+ };
477
+ }, []);
478
+ useEffect(() => load(), [load]);
479
+ const selectedEngineInfo = settings?.engines.find((engine) => engine.name === selectedEngine) ?? null;
480
+ const engineOptions = (settings?.engines ?? [])
481
+ .filter((engine) => engine.name === selectedEngine ||
482
+ (engine.name !== "ai-sdk:anthropic" && engine.name !== "ai-sdk:ollama"))
483
+ .map((engine) => ({
484
+ value: engine.name,
485
+ label: engine.name === "builder"
486
+ ? "Builder.io Gateway"
487
+ : engine.label || engine.name,
488
+ description: engine.configured
489
+ ? "Configured for this workspace"
490
+ : "Credentials not detected yet",
491
+ }));
492
+ const modelOptions = latestModelsOnly(selectedEngineInfo?.supportedModels ?? []).map((model) => ({ value: model, label: friendlyModelName(model) }));
493
+ const hasPendingChange = !!settings &&
494
+ settings.canUpdate &&
495
+ !!selectedEngine &&
496
+ !!selectedModel.trim() &&
497
+ (selectedEngine !== settings.engine ||
498
+ selectedModel.trim() !== settings.model);
499
+ const hasAppDefault = settings?.source !== "default";
500
+ const scopeLabel = settings?.scope === "org"
501
+ ? settings.orgName
502
+ ? `${settings.orgName} organization`
503
+ : "organization"
504
+ : "your account";
505
+ const notifyChanged = () => {
506
+ window.dispatchEvent(new CustomEvent("agent-engine:configured-changed"));
507
+ };
508
+ const save = async () => {
509
+ if (!hasPendingChange)
510
+ return;
511
+ setSaving(true);
512
+ setSaved(false);
513
+ setError(null);
514
+ try {
515
+ const res = await fetch(agentNativePath("/_agent-native/agent-model-defaults"), {
516
+ method: "PUT",
517
+ headers: { "Content-Type": "application/json" },
518
+ body: JSON.stringify({
519
+ engine: selectedEngine,
520
+ model: selectedModel.trim(),
521
+ }),
522
+ });
523
+ const body = await res.json().catch(() => ({}));
524
+ if (!res.ok)
525
+ throw new Error(body?.error ?? `Save failed (${res.status})`);
526
+ const next = body;
527
+ setSettings(next);
528
+ setSelectedEngine(next.engine ?? selectedEngine);
529
+ setSelectedModel(next.model ?? selectedModel.trim());
530
+ setSaved(true);
531
+ notifyChanged();
532
+ setTimeout(() => setSaved(false), 2000);
533
+ }
534
+ catch (err) {
535
+ setError(err instanceof Error ? err.message : "Save failed");
536
+ }
537
+ finally {
538
+ setSaving(false);
539
+ }
540
+ };
541
+ const reset = async () => {
542
+ if (!settings?.canUpdate || !hasAppDefault)
543
+ return;
544
+ setSaving(true);
545
+ setSaved(false);
546
+ setError(null);
547
+ try {
548
+ const res = await fetch(agentNativePath("/_agent-native/agent-model-defaults"), { method: "DELETE" });
549
+ const body = await res.json().catch(() => ({}));
550
+ if (!res.ok)
551
+ throw new Error(body?.error ?? `Reset failed (${res.status})`);
552
+ const next = body;
553
+ setSettings(next);
554
+ const fallback = next.engines.find((engine) => engine.configured);
555
+ setSelectedEngine(next.engine ?? fallback?.name ?? selectedEngine);
556
+ setSelectedModel(next.model ?? fallback?.defaultModel ?? selectedModel);
557
+ notifyChanged();
558
+ }
559
+ catch (err) {
560
+ setError(err instanceof Error ? err.message : "Reset failed");
561
+ }
562
+ finally {
563
+ setSaving(false);
564
+ }
565
+ };
566
+ return (_jsx(SettingsSection, { id: settingsSectionDomId("app-models"), icon: _jsx(IconApps, { size: 14 }), title: "App Default Model", subtitle: "Choose the default model for this app/template when no one-off composer model is selected.", connected: loading ? undefined : hasAppDefault, open: open, onToggle: onToggle, children: loading ? (_jsx(SettingsSkeleton, { lines: 2 })) : settings ? (_jsx("div", { className: "space-y-2", children: _jsxs("div", { className: "rounded-md border border-border bg-accent/20 px-2.5 py-2", children: [_jsxs("div", { className: "mb-2 flex items-center justify-between gap-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "truncate text-[11px] font-medium text-foreground", children: friendlyAppName(settings.appId) || "This app" }), _jsx("p", { className: "mt-0.5 text-[10px] text-muted-foreground", children: hasAppDefault
567
+ ? `Applies to ${scopeLabel}.`
568
+ : "Using the global LLM default." })] }), _jsx("span", { className: "shrink-0 rounded-full bg-background px-2 py-0.5 text-[10px] font-medium text-muted-foreground", children: settings.source })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(SettingsSelect, { label: "Provider", value: selectedEngine, options: engineOptions, onValueChange: (value) => {
569
+ setSelectedEngine(value);
570
+ const info = settings.engines.find((engine) => engine.name === value);
571
+ setSelectedModel(info?.defaultModel ?? "");
572
+ setError(null);
573
+ } }), _jsxs("div", { className: "space-y-1.5", children: [_jsx("p", { className: "text-[12px] font-medium text-foreground", children: "Model" }), _jsx("input", { type: "text", list: `app-model-suggestions-${selectedEngine}`, value: selectedModel, disabled: !settings.canUpdate || saving, onChange: (event) => {
574
+ setSelectedModel(event.target.value);
575
+ setError(null);
576
+ }, onKeyDown: (event) => {
577
+ if (event.key === "Enter" && hasPendingChange)
578
+ void save();
579
+ }, placeholder: selectedEngineInfo?.defaultModel ?? "model-id", spellCheck: false, autoComplete: "off", className: "flex h-9 w-full rounded-md border border-border bg-background px-3 text-[12px] text-foreground outline-none transition-colors hover:bg-accent/40 focus:ring-1 focus:ring-accent placeholder:text-muted-foreground/50 disabled:opacity-60", style: CONTROL_STYLE }), modelOptions.length > 0 && (_jsx("datalist", { id: `app-model-suggestions-${selectedEngine}`, children: modelOptions.map((option) => (_jsx("option", { value: option.value, label: option.label }, option.value))) }))] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("button", { type: "button", onClick: save, disabled: !hasPendingChange || saving, className: "inline-flex h-8 items-center gap-1 rounded bg-accent px-2.5 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40", children: saving ? (_jsx(IconLoader2, { size: 10, className: "animate-spin" })) : saved ? (_jsx(IconCheck, { size: 10 })) : ("Save") }), _jsx("button", { type: "button", onClick: reset, disabled: !settings.canUpdate || !hasAppDefault || saving, className: "h-8 rounded border border-border px-2.5 text-[10px] font-medium text-muted-foreground hover:bg-accent/40 hover:text-foreground disabled:opacity-40", children: "Reset" })] })] }), !settings.canUpdate && (_jsx("p", { className: "mt-2 text-[10px] text-muted-foreground", children: "Only organization owners and admins can change app model defaults." })), selectedEngineInfo && !selectedEngineInfo.configured && (_jsx("p", { className: "mt-2 text-[10px] text-muted-foreground", children: "Credentials for this provider were not detected; runtime will fall back if the model cannot be used." })), error && (_jsx("p", { className: "mt-2 text-[10px] text-destructive", children: error }))] }) })) : (_jsx("p", { className: "text-[10px] text-muted-foreground", children: "App model defaults are unavailable." })) }));
580
+ }
438
581
  // ─── Email Section ──────────────────────────────────────────────────────────
439
582
  function EmailSectionInner({ open, onToggle, }) {
440
583
  const [envKeys, setEnvKeys] = useState([]);
@@ -631,6 +774,7 @@ function AgentLimitsSectionInner({ open, onToggle, }) {
631
774
  const SETTINGS_SECTION_IDS = new Set([
632
775
  "account",
633
776
  "llm",
777
+ "app-models",
634
778
  "limits",
635
779
  "voice",
636
780
  "automations",
@@ -660,6 +804,11 @@ function normalizeSettingsSection(value) {
660
804
  }
661
805
  if (normalized === "agent-engine")
662
806
  return "llm";
807
+ if (normalized === "agent-model-defaults" ||
808
+ normalized === "app-model-defaults" ||
809
+ normalized === "models") {
810
+ return "app-models";
811
+ }
663
812
  if (normalized === "agent-limits" || normalized === "loop-settings") {
664
813
  return "limits";
665
814
  }
@@ -799,6 +948,6 @@ export function SettingsPanel({ isDevMode, onToggleDevMode, showDevToggle, devAp
799
948
  const nextIsDev = next === "development";
800
949
  if (nextIsDev !== isDevMode)
801
950
  onToggleDevMode();
802
- } })) })), _jsx(CapabilityStatusStrip, { isDevMode: isDevMode, builderConnected: connected, builderLoading: builderLoading, builderBranchesAvailable: builderBranchesAvailable, onOpenLlm: () => openSettingsSection("llm", true) }), _jsx(AccountSectionInner, { open: openSection === "account", onToggle: () => toggle("account") }), _jsx(LLMSectionInner, { builderFlow: builderFlow, builderLoading: builderLoading, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, open: openSection === "llm", onToggle: () => toggle("llm") }), _jsx(AgentLimitsSectionInner, { open: openSection === "limits", onToggle: () => toggle("limits") }), _jsx(SettingsSection, { icon: _jsx(IconMicrophone, { size: 14 }), title: "Voice Transcription", subtitle: "How the composer microphone turns your voice into text.", open: openSection === "voice", onToggle: () => toggle("voice"), children: _jsx(VoiceTranscriptionSection, {}) }), _jsx(SettingsSection, { icon: _jsx(IconBolt, { size: 14 }), title: "Automations", subtitle: "Event-triggered and scheduled automations.", open: openSection === "automations", onToggle: () => toggle("automations"), children: _jsx(AutomationsSection, {}) }), _jsx(SettingsSection, { id: settingsSectionDomId("secrets"), icon: _jsx(IconKey, { size: 14 }), title: "API Keys & Connections", subtitle: "Service credentials and automation keys.", open: openSection === "secrets", onToggle: () => toggle("secrets"), children: _jsx(SecretsSection, { focusKey: focusSecretKey }) }), _jsx(SettingsSection, { icon: _jsx(IconCloud, { size: 14 }), title: "Hosting", subtitle: "Deploy your app to the cloud.", connected: connected, open: openSection === "hosting", onToggle: () => toggle("hosting"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource }), _jsx(ManualSetupCard, { hint: "Deploy manually to Netlify, Vercel, Cloudflare, or any Nitro-supported target.", docsUrl: "https://www.builder.io/c/docs/agent-native-deployment", dim: connected })] }) }), _jsx(SettingsSection, { icon: _jsx(IconDatabase, { size: 14 }), title: "Database", subtitle: "Connect a cloud database for persistent storage.", connected: connected, open: openSection === "database", onToggle: () => toggle("database"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource }), _jsx(ManualSetupCard, { hint: "Set DATABASE_URL in your .env to connect Neon, Supabase, Turso, or any Postgres/SQLite database.", docsUrl: "https://www.builder.io/c/docs/agent-native-database", dim: connected })] }) }), _jsx(SettingsSection, { icon: _jsx(IconUpload, { size: 14 }), title: "File uploads", subtitle: "Where user-uploaded files (avatars, chat attachments) are stored.", connected: connected, open: openSection === "uploads", onToggle: () => toggle("uploads"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource }), _jsx(ManualSetupCard, { hint: "Without a provider, files are stored as base64 in your database. Fine for dev, not recommended for production.", docsUrl: "https://www.builder.io/c/docs/agent-native-file-uploads", dim: connected })] }) }), _jsx(SettingsSection, { icon: _jsx(IconShield, { size: 14 }), title: "Authentication", subtitle: "Set up user authentication and access control.", connected: connected, open: openSection === "auth", onToggle: () => toggle("auth"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource }), _jsx(ManualSetupCard, { hint: "Configure Better Auth with BETTER_AUTH_SECRET and optional Google/GitHub OAuth providers.", docsUrl: "https://www.builder.io/c/docs/agent-native-authentication", dim: connected })] }) }), _jsx(EmailSectionInner, { open: openSection === "email", onToggle: () => toggle("email") }), _jsx(SettingsSection, { icon: _jsx(IconBrowser, { size: 14 }), title: "Browser Automation", subtitle: "Let agents control a real browser for web tasks.", connected: connected, open: openSection === "browser", onToggle: () => toggle("browser"), children: _jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource }) }), builderBranchesAvailable && (_jsx(SettingsSection, { icon: _jsx(IconGitBranch, { size: 14 }), title: "Background Agent", subtitle: "Make code changes from production mode via Builder.", connected: connected, open: openSection === "background", onToggle: () => toggle("background"), children: _jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource }) })), _jsx(SettingsSection, { icon: _jsx(IconPlugConnected, { size: 14 }), title: "Integrations", subtitle: "Connect messaging platforms and external services.", open: openSection === "integrations", onToggle: () => toggle("integrations"), children: _jsx(Suspense, { fallback: null, children: _jsx(IntegrationsPanel, {}) }) }), _jsx(SettingsSection, { icon: _jsx(IconCoin, { size: 14 }), title: "Usage", subtitle: "Track token consumption and estimated cost \u2014 broken down by chat, automations, and background jobs.", open: openSection === "usage", onToggle: () => toggle("usage"), children: _jsx(UsageSection, {}) }), _jsx(SettingsSection, { icon: _jsx(IconTopologyRing2, { size: 14 }), title: "Connected Agents (A2A)", subtitle: "Manage remote agents connected via the A2A protocol.", open: openSection === "a2a", onToggle: () => toggle("a2a"), children: _jsx(AgentsSection, {}) })] }));
951
+ } })) })), _jsx(CapabilityStatusStrip, { isDevMode: isDevMode, builderConnected: connected, builderLoading: builderLoading, builderBranchesAvailable: builderBranchesAvailable, onOpenLlm: () => openSettingsSection("llm", true) }), _jsx(AccountSectionInner, { open: openSection === "account", onToggle: () => toggle("account") }), _jsx(LLMSectionInner, { builderFlow: builderFlow, builderLoading: builderLoading, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, open: openSection === "llm", onToggle: () => toggle("llm") }), _jsx(AppModelDefaultsSectionInner, { open: openSection === "app-models", onToggle: () => toggle("app-models") }), _jsx(AgentLimitsSectionInner, { open: openSection === "limits", onToggle: () => toggle("limits") }), _jsx(SettingsSection, { icon: _jsx(IconMicrophone, { size: 14 }), title: "Voice Transcription", subtitle: "How the composer microphone turns your voice into text.", open: openSection === "voice", onToggle: () => toggle("voice"), children: _jsx(VoiceTranscriptionSection, {}) }), _jsx(SettingsSection, { icon: _jsx(IconBolt, { size: 14 }), title: "Automations", subtitle: "Event-triggered and scheduled automations.", open: openSection === "automations", onToggle: () => toggle("automations"), children: _jsx(AutomationsSection, {}) }), _jsx(SettingsSection, { id: settingsSectionDomId("secrets"), icon: _jsx(IconKey, { size: 14 }), title: "API Keys & Connections", subtitle: "Service credentials and automation keys.", open: openSection === "secrets", onToggle: () => toggle("secrets"), children: _jsx(SecretsSection, { focusKey: focusSecretKey }) }), _jsx(SettingsSection, { icon: _jsx(IconCloud, { size: 14 }), title: "Hosting", subtitle: "Deploy your app to the cloud.", connected: connected, open: openSection === "hosting", onToggle: () => toggle("hosting"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource }), _jsx(ManualSetupCard, { hint: "Deploy manually to Netlify, Vercel, Cloudflare, or any Nitro-supported target.", docsUrl: "https://www.builder.io/c/docs/agent-native-deployment", dim: connected })] }) }), _jsx(SettingsSection, { icon: _jsx(IconDatabase, { size: 14 }), title: "Database", subtitle: "Connect a cloud database for persistent storage.", connected: connected, open: openSection === "database", onToggle: () => toggle("database"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource }), _jsx(ManualSetupCard, { hint: "Set DATABASE_URL in your .env to connect Neon, Supabase, Turso, or any Postgres/SQLite database.", docsUrl: "https://www.builder.io/c/docs/agent-native-database", dim: connected })] }) }), _jsx(SettingsSection, { icon: _jsx(IconUpload, { size: 14 }), title: "File uploads", subtitle: "Where user-uploaded files (avatars, chat attachments) are stored.", connected: connected, open: openSection === "uploads", onToggle: () => toggle("uploads"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource }), _jsx(ManualSetupCard, { hint: "Without a provider, files are stored as base64 in your database. Fine for dev, not recommended for production.", docsUrl: "https://www.builder.io/c/docs/agent-native-file-uploads", dim: connected })] }) }), _jsx(SettingsSection, { icon: _jsx(IconShield, { size: 14 }), title: "Authentication", subtitle: "Set up user authentication and access control.", connected: connected, open: openSection === "auth", onToggle: () => toggle("auth"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource }), _jsx(ManualSetupCard, { hint: "Configure Better Auth with BETTER_AUTH_SECRET and optional Google/GitHub OAuth providers.", docsUrl: "https://www.builder.io/c/docs/agent-native-authentication", dim: connected })] }) }), _jsx(EmailSectionInner, { open: openSection === "email", onToggle: () => toggle("email") }), _jsx(SettingsSection, { icon: _jsx(IconBrowser, { size: 14 }), title: "Browser Automation", subtitle: "Let agents control a real browser for web tasks.", connected: connected, open: openSection === "browser", onToggle: () => toggle("browser"), children: _jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource }) }), builderBranchesAvailable && (_jsx(SettingsSection, { icon: _jsx(IconGitBranch, { size: 14 }), title: "Background Agent", subtitle: "Make code changes from production mode via Builder.", connected: connected, open: openSection === "background", onToggle: () => toggle("background"), children: _jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource }) })), _jsx(SettingsSection, { icon: _jsx(IconPlugConnected, { size: 14 }), title: "Integrations", subtitle: "Connect messaging platforms and external services.", open: openSection === "integrations", onToggle: () => toggle("integrations"), children: _jsx(Suspense, { fallback: null, children: _jsx(IntegrationsPanel, {}) }) }), _jsx(SettingsSection, { icon: _jsx(IconCoin, { size: 14 }), title: "Usage", subtitle: "Track token consumption and estimated cost \u2014 broken down by chat, automations, and background jobs.", open: openSection === "usage", onToggle: () => toggle("usage"), children: _jsx(UsageSection, {}) }), _jsx(SettingsSection, { icon: _jsx(IconTopologyRing2, { size: 14 }), title: "Connected Agents (A2A)", subtitle: "Manage remote agents connected via the A2A protocol.", open: openSection === "a2a", onToggle: () => toggle("a2a"), children: _jsx(AgentsSection, {}) })] }));
803
952
  }
804
953
  //# sourceMappingURL=SettingsPanel.js.map