@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,7 @@
1
+ import type { ActionEntry } from "../agent/production-agent.js";
2
+ export interface CreateBrowserSessionActionEntriesOptions {
3
+ getOwnerEmail: () => string | null | undefined;
4
+ getDefaultTimeoutMs?: () => number | undefined;
5
+ }
6
+ export declare function createBrowserSessionActionEntries(options: CreateBrowserSessionActionEntriesOptions): Record<string, ActionEntry>;
7
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/browser-sessions/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAOhE,MAAM,WAAW,wCAAwC;IACvD,aAAa,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CAChD;AAsFD,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,wCAAwC,GAChD,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CA2M7B"}
@@ -0,0 +1,223 @@
1
+ import { callBrowserSession, listBrowserSessions, } from "./store.js";
2
+ function requireOwner(options) {
3
+ const owner = options.getOwnerEmail()?.trim();
4
+ if (!owner) {
5
+ throw new Error("No authenticated user is available for browser sessions");
6
+ }
7
+ return owner;
8
+ }
9
+ function readString(args, key) {
10
+ const value = args[key];
11
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
12
+ }
13
+ function readTimeoutMs(args, options) {
14
+ const raw = args.timeoutMs;
15
+ if (typeof raw === "number" && raw > 0)
16
+ return raw;
17
+ if (typeof raw === "string" && raw.trim()) {
18
+ const parsed = Number(raw);
19
+ if (Number.isFinite(parsed) && parsed > 0)
20
+ return parsed;
21
+ }
22
+ return options.getDefaultTimeoutMs?.();
23
+ }
24
+ async function resolveSessionId(ownerEmail, requestedSessionId) {
25
+ if (requestedSessionId)
26
+ return requestedSessionId;
27
+ const sessions = await listBrowserSessions(ownerEmail, { limit: 5 });
28
+ if (sessions.length === 0) {
29
+ throw new Error("No active browser sessions are connected. Open the embedded Agent-Native sidecar in the host app first.");
30
+ }
31
+ return sessions[0].sessionId;
32
+ }
33
+ function compactSession(session) {
34
+ if (!session)
35
+ return null;
36
+ const route = session.context &&
37
+ typeof session.context.route === "object" &&
38
+ session.context.route
39
+ ? session.context.route
40
+ : undefined;
41
+ const resource = session.context &&
42
+ typeof session.context.resource === "object" &&
43
+ session.context.resource
44
+ ? session.context.resource
45
+ : undefined;
46
+ return {
47
+ sessionId: session.sessionId,
48
+ label: session.label,
49
+ url: session.url,
50
+ active: session.active,
51
+ connectedAt: session.connectedAt,
52
+ lastSeenAt: session.lastSeenAt,
53
+ expiresAt: session.expiresAt,
54
+ route,
55
+ resource,
56
+ actionCount: session.actions.length,
57
+ actions: session.actions.map((action) => ({
58
+ name: action.name,
59
+ description: action.description,
60
+ source: action.source,
61
+ availability: action.availability,
62
+ destructive: action.destructive,
63
+ requiresApproval: action.requiresApproval,
64
+ schema: action.schema ?? action.parameters,
65
+ })),
66
+ };
67
+ }
68
+ export function createBrowserSessionActionEntries(options) {
69
+ return {
70
+ "list-browser-sessions": {
71
+ readOnly: true,
72
+ tool: {
73
+ description: "List active browser tabs connected through the Agent-Native embedding SDK. Use this when you need to choose which live host page to inspect or operate.",
74
+ parameters: {
75
+ type: "object",
76
+ properties: {
77
+ includeExpired: {
78
+ type: "boolean",
79
+ description: "Include recently expired sessions for debugging. Defaults to false.",
80
+ },
81
+ },
82
+ },
83
+ },
84
+ run: async (args) => {
85
+ const ownerEmail = requireOwner(options);
86
+ const sessions = await listBrowserSessions(ownerEmail, {
87
+ includeExpired: args.includeExpired === true || args.includeExpired === "true",
88
+ });
89
+ return {
90
+ ok: true,
91
+ sessions: sessions.map(compactSession),
92
+ };
93
+ },
94
+ },
95
+ "view-browser-session": {
96
+ readOnly: true,
97
+ tool: {
98
+ description: "Read the current page context and screen snapshot from a connected browser session. Omit sessionId to use the most recently active tab.",
99
+ parameters: {
100
+ type: "object",
101
+ properties: {
102
+ sessionId: {
103
+ type: "string",
104
+ description: "Browser session id from list-browser-sessions. Optional when only one tab is active.",
105
+ },
106
+ timeoutMs: {
107
+ type: "number",
108
+ description: "How long to wait for the live tab to respond.",
109
+ },
110
+ },
111
+ },
112
+ },
113
+ run: async (args) => {
114
+ const ownerEmail = requireOwner(options);
115
+ const sessionId = await resolveSessionId(ownerEmail, readString(args, "sessionId"));
116
+ const context = await callBrowserSession(ownerEmail, sessionId, { type: "get-context", timeoutMs: readTimeoutMs(args, options) }, { timeoutMs: readTimeoutMs(args, options) });
117
+ return { ok: true, sessionId, context };
118
+ },
119
+ },
120
+ "list-browser-session-actions": {
121
+ readOnly: true,
122
+ tool: {
123
+ description: "List live client actions currently exposed by a connected browser session. These actions can change after navigation or selection changes.",
124
+ parameters: {
125
+ type: "object",
126
+ properties: {
127
+ sessionId: {
128
+ type: "string",
129
+ description: "Browser session id from list-browser-sessions. Optional when only one tab is active.",
130
+ },
131
+ timeoutMs: {
132
+ type: "number",
133
+ description: "How long to wait for the live tab to respond.",
134
+ },
135
+ },
136
+ },
137
+ },
138
+ run: async (args) => {
139
+ const ownerEmail = requireOwner(options);
140
+ const sessionId = await resolveSessionId(ownerEmail, readString(args, "sessionId"));
141
+ const actions = await callBrowserSession(ownerEmail, sessionId, { type: "list-actions", timeoutMs: readTimeoutMs(args, options) }, { timeoutMs: readTimeoutMs(args, options) });
142
+ return { ok: true, sessionId, actions };
143
+ },
144
+ },
145
+ "run-browser-session-action": {
146
+ tool: {
147
+ description: "Run a live client action in a connected browser tab. Use list-browser-session-actions first to discover the current action names and schemas. Omit sessionId to use the most recently active tab.",
148
+ parameters: {
149
+ type: "object",
150
+ properties: {
151
+ sessionId: {
152
+ type: "string",
153
+ description: "Browser session id from list-browser-sessions. Optional when only one tab is active.",
154
+ },
155
+ name: {
156
+ type: "string",
157
+ description: "The live client action name to run.",
158
+ },
159
+ args: {
160
+ type: "object",
161
+ description: "JSON-serializable arguments for the client action. Match the schema returned by list-browser-session-actions.",
162
+ },
163
+ timeoutMs: {
164
+ type: "number",
165
+ description: "How long to wait for the live tab to respond.",
166
+ },
167
+ },
168
+ required: ["name"],
169
+ },
170
+ },
171
+ run: async (args) => {
172
+ const ownerEmail = requireOwner(options);
173
+ const name = readString(args, "name");
174
+ if (!name)
175
+ throw new Error("name is required");
176
+ const timeoutMs = readTimeoutMs(args, options);
177
+ const sessionId = await resolveSessionId(ownerEmail, readString(args, "sessionId"));
178
+ const result = await callBrowserSession(ownerEmail, sessionId, { type: "run-action", name, args: args.args, timeoutMs }, { timeoutMs });
179
+ return { ok: true, sessionId, name, result };
180
+ },
181
+ },
182
+ "send-browser-session-command": {
183
+ tool: {
184
+ description: "Send a command to a connected host app, such as refreshData, navigate, remountView, hardReload, openResource, or requestApproval. Omit command to ask the host to refresh visible data.",
185
+ parameters: {
186
+ type: "object",
187
+ properties: {
188
+ sessionId: {
189
+ type: "string",
190
+ description: "Browser session id from list-browser-sessions. Optional when only one tab is active.",
191
+ },
192
+ command: {
193
+ type: "string",
194
+ description: "Built-in or custom host command. Defaults to refreshData.",
195
+ },
196
+ payload: {
197
+ type: "object",
198
+ description: "JSON-serializable payload for the command, such as a route target or refresh query key.",
199
+ },
200
+ timeoutMs: {
201
+ type: "number",
202
+ description: "How long to wait for the live tab to respond.",
203
+ },
204
+ },
205
+ },
206
+ },
207
+ run: async (args) => {
208
+ const ownerEmail = requireOwner(options);
209
+ const timeoutMs = readTimeoutMs(args, options);
210
+ const sessionId = await resolveSessionId(ownerEmail, readString(args, "sessionId"));
211
+ const command = readString(args, "command") ?? "refreshData";
212
+ const result = await callBrowserSession(ownerEmail, sessionId, {
213
+ type: "command",
214
+ command,
215
+ payload: args.payload,
216
+ timeoutMs,
217
+ }, { timeoutMs });
218
+ return { ok: true, sessionId, command, result };
219
+ },
220
+ },
221
+ };
222
+ }
223
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/browser-sessions/actions.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAElB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAOpB,SAAS,YAAY,CACnB,OAAiD;IAEjD,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CACjB,IAA6B,EAC7B,GAAW;IAEX,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC;AAED,SAAS,aAAa,CACpB,IAA6B,EAC7B,OAAiD;IAEjD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;IAC3B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACnD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;IAC3D,CAAC;IACD,OAAO,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,UAAkB,EAClB,kBAAsC;IAEtC,IAAI,kBAAkB;QAAE,OAAO,kBAAkB,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACrE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,yGAAyG,CAC1G,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/B,CAAC;AAED,SAAS,cAAc,CACrB,OAAsD;IAEtD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,KAAK,GACT,OAAO,CAAC,OAAO;QACf,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,KAAK,QAAQ;QACzC,OAAO,CAAC,OAAO,CAAC,KAAK;QACnB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK;QACvB,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,QAAQ,GACZ,OAAO,CAAC,OAAO;QACf,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC5C,OAAO,CAAC,OAAO,CAAC,QAAQ;QACtB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ;QAC1B,CAAC,CAAC,SAAS,CAAC;IAChB,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,KAAK;QACL,QAAQ;QACR,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;QACnC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU;SAC3C,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,OAAiD;IAEjD,OAAO;QACL,uBAAuB,EAAE;YACvB,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE;gBACJ,WAAW,EACT,yJAAyJ;gBAC3J,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,cAAc,EAAE;4BACd,IAAI,EAAE,SAAS;4BACf,WAAW,EACT,qEAAqE;yBACxE;qBACF;iBACF;aACF;YACD,GAAG,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE;gBAC3C,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE;oBACrD,cAAc,EACZ,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC,cAAc,KAAK,MAAM;iBACjE,CAAC,CAAC;gBACH,OAAO;oBACL,EAAE,EAAE,IAAI;oBACR,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC;iBACvC,CAAC;YACJ,CAAC;SACF;QAED,sBAAsB,EAAE;YACtB,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE;gBACJ,WAAW,EACT,yIAAyI;gBAC3I,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,SAAS,EAAE;4BACT,IAAI,EAAE,QAAQ;4BACd,WAAW,EACT,sFAAsF;yBACzF;wBACD,SAAS,EAAE;4BACT,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,+CAA+C;yBAC7D;qBACF;iBACF;aACF;YACD,GAAG,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE;gBAC3C,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,SAAS,GAAG,MAAM,gBAAgB,CACtC,UAAU,EACV,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAC9B,CAAC;gBACF,MAAM,OAAO,GAAG,MAAM,kBAAkB,CACtC,UAAU,EACV,SAAS,EACT,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAChE,EAAE,SAAS,EAAE,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAC5C,CAAC;gBACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;YAC1C,CAAC;SACF;QAED,8BAA8B,EAAE;YAC9B,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE;gBACJ,WAAW,EACT,4IAA4I;gBAC9I,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,SAAS,EAAE;4BACT,IAAI,EAAE,QAAQ;4BACd,WAAW,EACT,sFAAsF;yBACzF;wBACD,SAAS,EAAE;4BACT,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,+CAA+C;yBAC7D;qBACF;iBACF;aACF;YACD,GAAG,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE;gBAC3C,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,SAAS,GAAG,MAAM,gBAAgB,CACtC,UAAU,EACV,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAC9B,CAAC;gBACF,MAAM,OAAO,GAAG,MAAM,kBAAkB,CACtC,UAAU,EACV,SAAS,EACT,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EACjE,EAAE,SAAS,EAAE,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAC5C,CAAC;gBACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;YAC1C,CAAC;SACF;QAED,4BAA4B,EAAE;YAC5B,IAAI,EAAE;gBACJ,WAAW,EACT,mMAAmM;gBACrM,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,SAAS,EAAE;4BACT,IAAI,EAAE,QAAQ;4BACd,WAAW,EACT,sFAAsF;yBACzF;wBACD,IAAI,EAAE;4BACJ,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,qCAAqC;yBACnD;wBACD,IAAI,EAAE;4BACJ,IAAI,EAAE,QAAQ;4BACd,WAAW,EACT,+GAA+G;yBAClH;wBACD,SAAS,EAAE;4BACT,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,+CAA+C;yBAC7D;qBACF;oBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;iBACnB;aACF;YACD,GAAG,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE;gBAC3C,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAC/C,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC/C,MAAM,SAAS,GAAG,MAAM,gBAAgB,CACtC,UAAU,EACV,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAC9B,CAAC;gBACF,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,UAAU,EACV,SAAS,EACT,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,EACxD,EAAE,SAAS,EAAE,CACd,CAAC;gBACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC/C,CAAC;SACF;QAED,8BAA8B,EAAE;YAC9B,IAAI,EAAE;gBACJ,WAAW,EACT,yLAAyL;gBAC3L,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,SAAS,EAAE;4BACT,IAAI,EAAE,QAAQ;4BACd,WAAW,EACT,sFAAsF;yBACzF;wBACD,OAAO,EAAE;4BACP,IAAI,EAAE,QAAQ;4BACd,WAAW,EACT,2DAA2D;yBAC9D;wBACD,OAAO,EAAE;4BACP,IAAI,EAAE,QAAQ;4BACd,WAAW,EACT,yFAAyF;yBAC5F;wBACD,SAAS,EAAE;4BACT,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,+CAA+C;yBAC7D;qBACF;iBACF;aACF;YACD,GAAG,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE;gBAC3C,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC/C,MAAM,SAAS,GAAG,MAAM,gBAAgB,CACtC,UAAU,EACV,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAC9B,CAAC;gBACF,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,aAAa,CAAC;gBAC7D,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,UAAU,EACV,SAAS,EACT;oBACE,IAAI,EAAE,SAAS;oBACf,OAAO;oBACP,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,SAAS;iBACV,EACD,EAAE,SAAS,EAAE,CACd,CAAC;gBACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAClD,CAAC;SACF;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { ActionEntry } from \"../agent/production-agent.js\";\nimport {\n callBrowserSession,\n getBrowserSession,\n listBrowserSessions,\n} from \"./store.js\";\n\nexport interface CreateBrowserSessionActionEntriesOptions {\n getOwnerEmail: () => string | null | undefined;\n getDefaultTimeoutMs?: () => number | undefined;\n}\n\nfunction requireOwner(\n options: CreateBrowserSessionActionEntriesOptions,\n): string {\n const owner = options.getOwnerEmail()?.trim();\n if (!owner) {\n throw new Error(\"No authenticated user is available for browser sessions\");\n }\n return owner;\n}\n\nfunction readString(\n args: Record<string, unknown>,\n key: string,\n): string | undefined {\n const value = args[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction readTimeoutMs(\n args: Record<string, unknown>,\n options: CreateBrowserSessionActionEntriesOptions,\n): number | undefined {\n const raw = args.timeoutMs;\n if (typeof raw === \"number\" && raw > 0) return raw;\n if (typeof raw === \"string\" && raw.trim()) {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed > 0) return parsed;\n }\n return options.getDefaultTimeoutMs?.();\n}\n\nasync function resolveSessionId(\n ownerEmail: string,\n requestedSessionId: string | undefined,\n): Promise<string> {\n if (requestedSessionId) return requestedSessionId;\n const sessions = await listBrowserSessions(ownerEmail, { limit: 5 });\n if (sessions.length === 0) {\n throw new Error(\n \"No active browser sessions are connected. Open the embedded Agent-Native sidecar in the host app first.\",\n );\n }\n return sessions[0].sessionId;\n}\n\nfunction compactSession(\n session: Awaited<ReturnType<typeof getBrowserSession>>,\n) {\n if (!session) return null;\n const route =\n session.context &&\n typeof session.context.route === \"object\" &&\n session.context.route\n ? session.context.route\n : undefined;\n const resource =\n session.context &&\n typeof session.context.resource === \"object\" &&\n session.context.resource\n ? session.context.resource\n : undefined;\n return {\n sessionId: session.sessionId,\n label: session.label,\n url: session.url,\n active: session.active,\n connectedAt: session.connectedAt,\n lastSeenAt: session.lastSeenAt,\n expiresAt: session.expiresAt,\n route,\n resource,\n actionCount: session.actions.length,\n actions: session.actions.map((action) => ({\n name: action.name,\n description: action.description,\n source: action.source,\n availability: action.availability,\n destructive: action.destructive,\n requiresApproval: action.requiresApproval,\n schema: action.schema ?? action.parameters,\n })),\n };\n}\n\nexport function createBrowserSessionActionEntries(\n options: CreateBrowserSessionActionEntriesOptions,\n): Record<string, ActionEntry> {\n return {\n \"list-browser-sessions\": {\n readOnly: true,\n tool: {\n description:\n \"List active browser tabs connected through the Agent-Native embedding SDK. Use this when you need to choose which live host page to inspect or operate.\",\n parameters: {\n type: \"object\",\n properties: {\n includeExpired: {\n type: \"boolean\",\n description:\n \"Include recently expired sessions for debugging. Defaults to false.\",\n },\n },\n },\n },\n run: async (args: Record<string, unknown>) => {\n const ownerEmail = requireOwner(options);\n const sessions = await listBrowserSessions(ownerEmail, {\n includeExpired:\n args.includeExpired === true || args.includeExpired === \"true\",\n });\n return {\n ok: true,\n sessions: sessions.map(compactSession),\n };\n },\n },\n\n \"view-browser-session\": {\n readOnly: true,\n tool: {\n description:\n \"Read the current page context and screen snapshot from a connected browser session. Omit sessionId to use the most recently active tab.\",\n parameters: {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n description:\n \"Browser session id from list-browser-sessions. Optional when only one tab is active.\",\n },\n timeoutMs: {\n type: \"number\",\n description: \"How long to wait for the live tab to respond.\",\n },\n },\n },\n },\n run: async (args: Record<string, unknown>) => {\n const ownerEmail = requireOwner(options);\n const sessionId = await resolveSessionId(\n ownerEmail,\n readString(args, \"sessionId\"),\n );\n const context = await callBrowserSession(\n ownerEmail,\n sessionId,\n { type: \"get-context\", timeoutMs: readTimeoutMs(args, options) },\n { timeoutMs: readTimeoutMs(args, options) },\n );\n return { ok: true, sessionId, context };\n },\n },\n\n \"list-browser-session-actions\": {\n readOnly: true,\n tool: {\n description:\n \"List live client actions currently exposed by a connected browser session. These actions can change after navigation or selection changes.\",\n parameters: {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n description:\n \"Browser session id from list-browser-sessions. Optional when only one tab is active.\",\n },\n timeoutMs: {\n type: \"number\",\n description: \"How long to wait for the live tab to respond.\",\n },\n },\n },\n },\n run: async (args: Record<string, unknown>) => {\n const ownerEmail = requireOwner(options);\n const sessionId = await resolveSessionId(\n ownerEmail,\n readString(args, \"sessionId\"),\n );\n const actions = await callBrowserSession(\n ownerEmail,\n sessionId,\n { type: \"list-actions\", timeoutMs: readTimeoutMs(args, options) },\n { timeoutMs: readTimeoutMs(args, options) },\n );\n return { ok: true, sessionId, actions };\n },\n },\n\n \"run-browser-session-action\": {\n tool: {\n description:\n \"Run a live client action in a connected browser tab. Use list-browser-session-actions first to discover the current action names and schemas. Omit sessionId to use the most recently active tab.\",\n parameters: {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n description:\n \"Browser session id from list-browser-sessions. Optional when only one tab is active.\",\n },\n name: {\n type: \"string\",\n description: \"The live client action name to run.\",\n },\n args: {\n type: \"object\",\n description:\n \"JSON-serializable arguments for the client action. Match the schema returned by list-browser-session-actions.\",\n },\n timeoutMs: {\n type: \"number\",\n description: \"How long to wait for the live tab to respond.\",\n },\n },\n required: [\"name\"],\n },\n },\n run: async (args: Record<string, unknown>) => {\n const ownerEmail = requireOwner(options);\n const name = readString(args, \"name\");\n if (!name) throw new Error(\"name is required\");\n const timeoutMs = readTimeoutMs(args, options);\n const sessionId = await resolveSessionId(\n ownerEmail,\n readString(args, \"sessionId\"),\n );\n const result = await callBrowserSession(\n ownerEmail,\n sessionId,\n { type: \"run-action\", name, args: args.args, timeoutMs },\n { timeoutMs },\n );\n return { ok: true, sessionId, name, result };\n },\n },\n\n \"send-browser-session-command\": {\n tool: {\n description:\n \"Send a command to a connected host app, such as refreshData, navigate, remountView, hardReload, openResource, or requestApproval. Omit command to ask the host to refresh visible data.\",\n parameters: {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n description:\n \"Browser session id from list-browser-sessions. Optional when only one tab is active.\",\n },\n command: {\n type: \"string\",\n description:\n \"Built-in or custom host command. Defaults to refreshData.\",\n },\n payload: {\n type: \"object\",\n description:\n \"JSON-serializable payload for the command, such as a route target or refresh query key.\",\n },\n timeoutMs: {\n type: \"number\",\n description: \"How long to wait for the live tab to respond.\",\n },\n },\n },\n },\n run: async (args: Record<string, unknown>) => {\n const ownerEmail = requireOwner(options);\n const timeoutMs = readTimeoutMs(args, options);\n const sessionId = await resolveSessionId(\n ownerEmail,\n readString(args, \"sessionId\"),\n );\n const command = readString(args, \"command\") ?? \"refreshData\";\n const result = await callBrowserSession(\n ownerEmail,\n sessionId,\n {\n type: \"command\",\n command,\n payload: args.payload,\n timeoutMs,\n },\n { timeoutMs },\n );\n return { ok: true, sessionId, command, result };\n },\n },\n };\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { H3Event } from "h3";
2
+ export interface MountBrowserSessionRoutesOptions {
3
+ routePrefix?: string;
4
+ getOwnerFromEvent?: (event: H3Event) => string | Promise<string>;
5
+ }
6
+ export declare function mountBrowserSessionRoutes(nitroApp: any, options?: MountBrowserSessionRoutesOptions): void;
7
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/browser-sessions/routes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAoBlC,MAAM,WAAW,gCAAgC;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAClE;AA4DD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,GAAG,EACb,OAAO,GAAE,gCAAqC,GAC7C,IAAI,CA4IN"}
@@ -0,0 +1,159 @@
1
+ import { defineEventHandler, getMethod, setResponseHeader, setResponseStatus, } from "h3";
2
+ import { getH3App } from "../server/framework-request-handler.js";
3
+ import { readBody } from "../server/h3-helpers.js";
4
+ import { getSession } from "../server/auth.js";
5
+ import { claimBrowserSessionRequest, completeBrowserSessionRequest, createBrowserSessionRequest, disconnectBrowserSession, getBrowserSession, getBrowserSessionRequest, listBrowserSessions, registerBrowserSession, waitForBrowserSessionRequest, } from "./store.js";
6
+ function decodeSegment(value) {
7
+ if (!value)
8
+ return undefined;
9
+ try {
10
+ return decodeURIComponent(value);
11
+ }
12
+ catch {
13
+ return value;
14
+ }
15
+ }
16
+ async function defaultOwnerFromEvent(event) {
17
+ const session = await getSession(event);
18
+ if (!session?.email) {
19
+ throw Object.assign(new Error("Authentication required"), {
20
+ statusCode: 401,
21
+ });
22
+ }
23
+ return session.email;
24
+ }
25
+ async function ownerFromEvent(event, options) {
26
+ return options.getOwnerFromEvent
27
+ ? options.getOwnerFromEvent(event)
28
+ : defaultOwnerFromEvent(event);
29
+ }
30
+ function methodNotAllowed(event) {
31
+ setResponseStatus(event, 405);
32
+ return { error: "Method not allowed" };
33
+ }
34
+ function badRequest(event, error) {
35
+ setResponseStatus(event, 400);
36
+ return { error };
37
+ }
38
+ function notFound(event, error) {
39
+ setResponseStatus(event, 404);
40
+ return { error };
41
+ }
42
+ function errorResponse(event, error) {
43
+ const statusCode = typeof error?.statusCode === "number"
44
+ ? error.statusCode
45
+ : 500;
46
+ setResponseStatus(event, statusCode);
47
+ return {
48
+ error: error instanceof Error ? error.message : String(error),
49
+ };
50
+ }
51
+ async function readJsonBody(event) {
52
+ return ((await readBody(event).catch(() => ({}))) || {});
53
+ }
54
+ export function mountBrowserSessionRoutes(nitroApp, options = {}) {
55
+ const routePrefix = options.routePrefix ?? "/_agent-native";
56
+ const basePath = `${routePrefix}/browser-sessions`;
57
+ getH3App(nitroApp).use(basePath, defineEventHandler(async (event) => {
58
+ setResponseHeader(event, "Cache-Control", "no-store");
59
+ const method = getMethod(event);
60
+ const raw = (event.path || "/").split("?")[0];
61
+ const segments = raw
62
+ .replace(/^\/+/, "")
63
+ .split("/")
64
+ .filter(Boolean)
65
+ .map(decodeSegment);
66
+ try {
67
+ const ownerEmail = await ownerFromEvent(event, options);
68
+ if (segments.length === 0) {
69
+ if (method === "GET") {
70
+ const sessions = await listBrowserSessions(ownerEmail);
71
+ return { ok: true, sessions };
72
+ }
73
+ if (method === "POST") {
74
+ const body = await readJsonBody(event);
75
+ const session = await registerBrowserSession(ownerEmail, body);
76
+ return { ok: true, session };
77
+ }
78
+ return methodNotAllowed(event);
79
+ }
80
+ const sessionId = segments[0];
81
+ if (!sessionId)
82
+ return badRequest(event, "sessionId is required");
83
+ if (segments.length === 1) {
84
+ if (method === "GET") {
85
+ const session = await getBrowserSession(ownerEmail, sessionId, {
86
+ includeExpired: true,
87
+ });
88
+ return session
89
+ ? { ok: true, session }
90
+ : notFound(event, "Session not found");
91
+ }
92
+ if (method === "DELETE") {
93
+ const deleted = await disconnectBrowserSession(ownerEmail, sessionId);
94
+ return { ok: true, deleted };
95
+ }
96
+ return methodNotAllowed(event);
97
+ }
98
+ if (segments[1] === "heartbeat") {
99
+ if (method !== "POST")
100
+ return methodNotAllowed(event);
101
+ const body = await readJsonBody(event);
102
+ const session = await registerBrowserSession(ownerEmail, {
103
+ ...body,
104
+ session: {
105
+ ...(body.session ?? {}),
106
+ id: sessionId,
107
+ },
108
+ sessionId,
109
+ });
110
+ return { ok: true, session };
111
+ }
112
+ if (segments[1] !== "requests") {
113
+ return notFound(event, "Unknown browser-session route");
114
+ }
115
+ if (segments.length === 2) {
116
+ if (method !== "POST")
117
+ return methodNotAllowed(event);
118
+ const body = await readJsonBody(event);
119
+ const request = await createBrowserSessionRequest(ownerEmail, sessionId, body);
120
+ if (body.wait === true) {
121
+ const result = await waitForBrowserSessionRequest(ownerEmail, request.id, { timeoutMs: body.timeoutMs });
122
+ return { ok: true, requestId: request.id, result };
123
+ }
124
+ return { ok: true, request };
125
+ }
126
+ if (segments.length === 3 && segments[2] === "claim") {
127
+ if (method !== "POST")
128
+ return methodNotAllowed(event);
129
+ const request = await claimBrowserSessionRequest(ownerEmail, sessionId);
130
+ return { ok: true, request };
131
+ }
132
+ const requestId = segments[2];
133
+ if (!requestId)
134
+ return badRequest(event, "requestId is required");
135
+ if (segments.length === 3) {
136
+ if (method !== "GET")
137
+ return methodNotAllowed(event);
138
+ const request = await getBrowserSessionRequest(ownerEmail, requestId);
139
+ return request
140
+ ? { ok: true, request }
141
+ : notFound(event, "Request not found");
142
+ }
143
+ if (segments.length === 4 && segments[3] === "complete") {
144
+ if (method !== "POST")
145
+ return methodNotAllowed(event);
146
+ const body = await readJsonBody(event);
147
+ const request = await completeBrowserSessionRequest(ownerEmail, sessionId, requestId, body.ok === false
148
+ ? { ok: false, error: body.error, result: body.result }
149
+ : { ok: true, result: body.result });
150
+ return { ok: true, request };
151
+ }
152
+ return notFound(event, "Unknown browser-session route");
153
+ }
154
+ catch (error) {
155
+ return errorResponse(event, error);
156
+ }
157
+ }));
158
+ }
159
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/browser-sessions/routes.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n defineEventHandler,\n getMethod,\n setResponseHeader,\n setResponseStatus,\n} from \"h3\";\nimport type { H3Event } from \"h3\";\nimport { getH3App } from \"../server/framework-request-handler.js\";\nimport { readBody } from \"../server/h3-helpers.js\";\nimport { getSession } from \"../server/auth.js\";\nimport {\n claimBrowserSessionRequest,\n completeBrowserSessionRequest,\n createBrowserSessionRequest,\n disconnectBrowserSession,\n getBrowserSession,\n getBrowserSessionRequest,\n listBrowserSessions,\n registerBrowserSession,\n waitForBrowserSessionRequest,\n} from \"./store.js\";\nimport type {\n CreateAgentNativeBrowserSessionRequestInput,\n RegisterAgentNativeBrowserSessionInput,\n} from \"./types.js\";\n\nexport interface MountBrowserSessionRoutesOptions {\n routePrefix?: string;\n getOwnerFromEvent?: (event: H3Event) => string | Promise<string>;\n}\n\nfunction decodeSegment(value: string | undefined): string | undefined {\n if (!value) return undefined;\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nasync function defaultOwnerFromEvent(event: H3Event): Promise<string> {\n const session = await getSession(event);\n if (!session?.email) {\n throw Object.assign(new Error(\"Authentication required\"), {\n statusCode: 401,\n });\n }\n return session.email;\n}\n\nasync function ownerFromEvent(\n event: H3Event,\n options: MountBrowserSessionRoutesOptions,\n): Promise<string> {\n return options.getOwnerFromEvent\n ? options.getOwnerFromEvent(event)\n : defaultOwnerFromEvent(event);\n}\n\nfunction methodNotAllowed(event: H3Event) {\n setResponseStatus(event, 405);\n return { error: \"Method not allowed\" };\n}\n\nfunction badRequest(event: H3Event, error: string) {\n setResponseStatus(event, 400);\n return { error };\n}\n\nfunction notFound(event: H3Event, error: string) {\n setResponseStatus(event, 404);\n return { error };\n}\n\nfunction errorResponse(event: H3Event, error: unknown) {\n const statusCode =\n typeof (error as { statusCode?: unknown })?.statusCode === \"number\"\n ? (error as { statusCode: number }).statusCode\n : 500;\n setResponseStatus(event, statusCode);\n return {\n error: error instanceof Error ? error.message : String(error),\n };\n}\n\nasync function readJsonBody<T>(event: H3Event): Promise<T> {\n return ((await readBody(event).catch(() => ({}))) || {}) as T;\n}\n\nexport function mountBrowserSessionRoutes(\n nitroApp: any,\n options: MountBrowserSessionRoutesOptions = {},\n): void {\n const routePrefix = options.routePrefix ?? \"/_agent-native\";\n const basePath = `${routePrefix}/browser-sessions`;\n\n getH3App(nitroApp).use(\n basePath,\n defineEventHandler(async (event: H3Event) => {\n setResponseHeader(event, \"Cache-Control\", \"no-store\");\n\n const method = getMethod(event);\n const raw = (event.path || \"/\").split(\"?\")[0];\n const segments = raw\n .replace(/^\\/+/, \"\")\n .split(\"/\")\n .filter(Boolean)\n .map(decodeSegment);\n\n try {\n const ownerEmail = await ownerFromEvent(event, options);\n\n if (segments.length === 0) {\n if (method === \"GET\") {\n const sessions = await listBrowserSessions(ownerEmail);\n return { ok: true, sessions };\n }\n if (method === \"POST\") {\n const body =\n await readJsonBody<RegisterAgentNativeBrowserSessionInput>(event);\n const session = await registerBrowserSession(ownerEmail, body);\n return { ok: true, session };\n }\n return methodNotAllowed(event);\n }\n\n const sessionId = segments[0];\n if (!sessionId) return badRequest(event, \"sessionId is required\");\n\n if (segments.length === 1) {\n if (method === \"GET\") {\n const session = await getBrowserSession(ownerEmail, sessionId, {\n includeExpired: true,\n });\n return session\n ? { ok: true, session }\n : notFound(event, \"Session not found\");\n }\n if (method === \"DELETE\") {\n const deleted = await disconnectBrowserSession(\n ownerEmail,\n sessionId,\n );\n return { ok: true, deleted };\n }\n return methodNotAllowed(event);\n }\n\n if (segments[1] === \"heartbeat\") {\n if (method !== \"POST\") return methodNotAllowed(event);\n const body =\n await readJsonBody<RegisterAgentNativeBrowserSessionInput>(event);\n const session = await registerBrowserSession(ownerEmail, {\n ...body,\n session: {\n ...(body.session ?? {}),\n id: sessionId,\n },\n sessionId,\n });\n return { ok: true, session };\n }\n\n if (segments[1] !== \"requests\") {\n return notFound(event, \"Unknown browser-session route\");\n }\n\n if (segments.length === 2) {\n if (method !== \"POST\") return methodNotAllowed(event);\n const body = await readJsonBody<\n CreateAgentNativeBrowserSessionRequestInput & { wait?: boolean }\n >(event);\n const request = await createBrowserSessionRequest(\n ownerEmail,\n sessionId,\n body,\n );\n if (body.wait === true) {\n const result = await waitForBrowserSessionRequest(\n ownerEmail,\n request.id,\n { timeoutMs: body.timeoutMs },\n );\n return { ok: true, requestId: request.id, result };\n }\n return { ok: true, request };\n }\n\n if (segments.length === 3 && segments[2] === \"claim\") {\n if (method !== \"POST\") return methodNotAllowed(event);\n const request = await claimBrowserSessionRequest(\n ownerEmail,\n sessionId,\n );\n return { ok: true, request };\n }\n\n const requestId = segments[2];\n if (!requestId) return badRequest(event, \"requestId is required\");\n\n if (segments.length === 3) {\n if (method !== \"GET\") return methodNotAllowed(event);\n const request = await getBrowserSessionRequest(ownerEmail, requestId);\n return request\n ? { ok: true, request }\n : notFound(event, \"Request not found\");\n }\n\n if (segments.length === 4 && segments[3] === \"complete\") {\n if (method !== \"POST\") return methodNotAllowed(event);\n const body = await readJsonBody<{\n ok?: boolean;\n result?: unknown;\n error?: string;\n }>(event);\n const request = await completeBrowserSessionRequest(\n ownerEmail,\n sessionId,\n requestId,\n body.ok === false\n ? { ok: false, error: body.error, result: body.result }\n : { ok: true, result: body.result },\n );\n return { ok: true, request };\n }\n\n return notFound(event, \"Unknown browser-session route\");\n } catch (error) {\n return errorResponse(event, error);\n }\n }),\n );\n}\n"]}
@@ -0,0 +1,33 @@
1
+ import type { AgentNativeBrowserSessionRecord, AgentNativeBrowserSessionRequest, CreateAgentNativeBrowserSessionRequestInput, RegisterAgentNativeBrowserSessionInput } from "./types.js";
2
+ export declare const DEFAULT_BROWSER_SESSION_TTL_MS = 45000;
3
+ export declare const DEFAULT_BROWSER_SESSION_REQUEST_TIMEOUT_MS = 30000;
4
+ export declare const DEFAULT_BROWSER_SESSION_REQUEST_POLL_MS = 250;
5
+ export declare function registerBrowserSession(ownerEmailInput: string, input: RegisterAgentNativeBrowserSessionInput): Promise<AgentNativeBrowserSessionRecord>;
6
+ export declare function listBrowserSessions(ownerEmailInput: string, options?: {
7
+ includeExpired?: boolean;
8
+ limit?: number;
9
+ }): Promise<AgentNativeBrowserSessionRecord[]>;
10
+ export declare function getBrowserSession(ownerEmailInput: string, sessionIdInput: string, options?: {
11
+ includeExpired?: boolean;
12
+ }): Promise<AgentNativeBrowserSessionRecord | null>;
13
+ export declare function disconnectBrowserSession(ownerEmailInput: string, sessionIdInput: string): Promise<boolean>;
14
+ export declare function createBrowserSessionRequest(ownerEmailInput: string, sessionIdInput: string, input: CreateAgentNativeBrowserSessionRequestInput): Promise<AgentNativeBrowserSessionRequest>;
15
+ export declare function getBrowserSessionRequest(ownerEmailInput: string, requestIdInput: string): Promise<AgentNativeBrowserSessionRequest | null>;
16
+ export declare function claimBrowserSessionRequest(ownerEmailInput: string, sessionIdInput: string): Promise<AgentNativeBrowserSessionRequest | null>;
17
+ export declare function completeBrowserSessionRequest(ownerEmailInput: string, sessionIdInput: string, requestIdInput: string, result: {
18
+ ok: true;
19
+ result?: unknown;
20
+ } | {
21
+ ok: false;
22
+ error?: string;
23
+ result?: unknown;
24
+ }): Promise<AgentNativeBrowserSessionRequest>;
25
+ export declare function waitForBrowserSessionRequest(ownerEmailInput: string, requestIdInput: string, options?: {
26
+ timeoutMs?: number;
27
+ pollMs?: number;
28
+ }): Promise<unknown>;
29
+ export declare function callBrowserSession(ownerEmailInput: string, sessionIdInput: string, input: CreateAgentNativeBrowserSessionRequestInput, options?: {
30
+ timeoutMs?: number;
31
+ pollMs?: number;
32
+ }): Promise<unknown>;
33
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/browser-sessions/store.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAGV,+BAA+B,EAC/B,gCAAgC,EAGhC,2CAA2C,EAC3C,sCAAsC,EACvC,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,8BAA8B,QAAS,CAAC;AACrD,eAAO,MAAM,0CAA0C,QAAS,CAAC;AACjE,eAAO,MAAM,uCAAuC,MAAM,CAAC;AAmR3D,wBAAsB,sBAAsB,CAC1C,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,sCAAsC,GAC5C,OAAO,CAAC,+BAA+B,CAAC,CA2C1C;AAED,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,OAAO,CAAC,+BAA+B,EAAE,CAAC,CAqB5C;AAED,wBAAsB,iBAAiB,CACrC,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GACzC,OAAO,CAAC,+BAA+B,GAAG,IAAI,CAAC,CAYjD;AAED,wBAAsB,wBAAwB,CAC5C,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAgBlB;AA8CD,wBAAsB,2BAA2B,CAC/C,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,2CAA2C,GACjD,OAAO,CAAC,gCAAgC,CAAC,CAqC3C;AAED,wBAAsB,wBAAwB,CAC5C,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAUlD;AAED,wBAAsB,0BAA0B,CAC9C,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CA6BlD;AAED,wBAAsB,6BAA6B,CACjD,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,MAAM,EACF;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAClD,OAAO,CAAC,gCAAgC,CAAC,CAoC3C;AAED,wBAAsB,4BAA4B,CAChD,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,OAAO,CAAC,OAAO,CAAC,CAyClB;AAED,wBAAsB,kBAAkB,CACtC,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,2CAA2C,EAClD,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,OAAO,CAAC,OAAO,CAAC,CAalB"}