@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.
- package/README.md +37 -0
- package/dist/agent/app-model-defaults.d.ts +37 -0
- package/dist/agent/app-model-defaults.d.ts.map +1 -0
- package/dist/agent/app-model-defaults.js +136 -0
- package/dist/agent/app-model-defaults.js.map +1 -0
- package/dist/agent/engine/registry.d.ts +12 -7
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +28 -8
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/production-agent.d.ts +2 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +3 -1
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/browser-sessions/actions.d.ts +7 -0
- package/dist/browser-sessions/actions.d.ts.map +1 -0
- package/dist/browser-sessions/actions.js +223 -0
- package/dist/browser-sessions/actions.js.map +1 -0
- package/dist/browser-sessions/routes.d.ts +7 -0
- package/dist/browser-sessions/routes.d.ts.map +1 -0
- package/dist/browser-sessions/routes.js +159 -0
- package/dist/browser-sessions/routes.js.map +1 -0
- package/dist/browser-sessions/store.d.ts +33 -0
- package/dist/browser-sessions/store.d.ts.map +1 -0
- package/dist/browser-sessions/store.js +506 -0
- package/dist/browser-sessions/store.js.map +1 -0
- package/dist/browser-sessions/types.d.ts +68 -0
- package/dist/browser-sessions/types.d.ts.map +1 -0
- package/dist/browser-sessions/types.js +2 -0
- package/dist/browser-sessions/types.js.map +1 -0
- package/dist/cli/code-agent-commands.d.ts +36 -0
- package/dist/cli/code-agent-commands.d.ts.map +1 -0
- package/dist/cli/code-agent-commands.js +192 -0
- package/dist/cli/code-agent-commands.js.map +1 -0
- package/dist/cli/code-agent-connector.d.ts +17 -0
- package/dist/cli/code-agent-connector.d.ts.map +1 -0
- package/dist/cli/code-agent-connector.js +724 -0
- package/dist/cli/code-agent-connector.js.map +1 -0
- package/dist/cli/code-agent-executor.d.ts +31 -0
- package/dist/cli/code-agent-executor.d.ts.map +1 -0
- package/dist/cli/code-agent-executor.js +921 -0
- package/dist/cli/code-agent-executor.js.map +1 -0
- package/dist/cli/code-agent-runs.d.ts +102 -0
- package/dist/cli/code-agent-runs.d.ts.map +1 -0
- package/dist/cli/code-agent-runs.js +277 -0
- package/dist/cli/code-agent-runs.js.map +1 -0
- package/dist/cli/code.d.ts +66 -0
- package/dist/cli/code.d.ts.map +1 -0
- package/dist/cli/code.js +1306 -0
- package/dist/cli/code.js.map +1 -0
- package/dist/cli/create.d.ts +2 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +11 -1
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +26 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/migrate.d.ts +27 -0
- package/dist/cli/migrate.d.ts.map +1 -1
- package/dist/cli/migrate.js +1328 -20
- package/dist/cli/migrate.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +26 -2
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/cli/workspacify.d.ts +2 -0
- package/dist/cli/workspacify.d.ts.map +1 -1
- package/dist/cli/workspacify.js +2 -1
- package/dist/cli/workspacify.js.map +1 -1
- package/dist/client/AgentNative.d.ts +32 -0
- package/dist/client/AgentNative.d.ts.map +1 -0
- package/dist/client/AgentNative.js +79 -0
- package/dist/client/AgentNative.js.map +1 -0
- package/dist/client/AgentNativeEmbedded.d.ts +47 -0
- package/dist/client/AgentNativeEmbedded.d.ts.map +1 -0
- package/dist/client/AgentNativeEmbedded.js +148 -0
- package/dist/client/AgentNativeEmbedded.js.map +1 -0
- package/dist/client/AgentNativeFrame.d.ts +25 -0
- package/dist/client/AgentNativeFrame.d.ts.map +1 -0
- package/dist/client/AgentNativeFrame.js +68 -0
- package/dist/client/AgentNativeFrame.js.map +1 -0
- package/dist/client/AgentPanel.d.ts +19 -2
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +15 -4
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +79 -48
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +2 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.js +3 -2
- package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
- package/dist/client/browser-session-bridge.d.ts +44 -0
- package/dist/client/browser-session-bridge.d.ts.map +1 -0
- package/dist/client/browser-session-bridge.js +339 -0
- package/dist/client/browser-session-bridge.js.map +1 -0
- package/dist/client/client-action.d.ts +7 -0
- package/dist/client/client-action.d.ts.map +1 -0
- package/dist/client/client-action.js +4 -0
- package/dist/client/client-action.js.map +1 -0
- package/dist/client/components/ui/tooltip.d.ts.map +1 -1
- package/dist/client/components/ui/tooltip.js +1 -1
- package/dist/client/components/ui/tooltip.js.map +1 -1
- package/dist/client/composer/AgentComposerFrame.d.ts +17 -0
- package/dist/client/composer/AgentComposerFrame.d.ts.map +1 -0
- package/dist/client/composer/AgentComposerFrame.js +14 -0
- package/dist/client/composer/AgentComposerFrame.js.map +1 -0
- package/dist/client/composer/MentionPopover.d.ts.map +1 -1
- package/dist/client/composer/MentionPopover.js +2 -2
- package/dist/client/composer/MentionPopover.js.map +1 -1
- package/dist/client/composer/PromptComposer.d.ts +35 -2
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +31 -17
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +20 -2
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +112 -22
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/index.d.ts +3 -2
- package/dist/client/composer/index.d.ts.map +1 -1
- package/dist/client/composer/index.js +1 -0
- package/dist/client/composer/index.js.map +1 -1
- package/dist/client/composer/types.d.ts +1 -0
- package/dist/client/composer/types.d.ts.map +1 -1
- package/dist/client/composer/types.js.map +1 -1
- package/dist/client/extensions/AgentNativeExtensionFrame.d.ts +58 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.d.ts.map +1 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.d.ts +2 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.d.ts.map +1 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.js +110 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.js.map +1 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.js +354 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.js.map +1 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.spec.d.ts +2 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.spec.d.ts.map +1 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.spec.js +68 -0
- package/dist/client/extensions/AgentNativeExtensionFrame.spec.js.map +1 -0
- package/dist/client/extensions/agent-native-extension-runtime.d.ts +69 -0
- package/dist/client/extensions/agent-native-extension-runtime.d.ts.map +1 -0
- package/dist/client/extensions/agent-native-extension-runtime.js +348 -0
- package/dist/client/extensions/agent-native-extension-runtime.js.map +1 -0
- package/dist/client/extensions/index.d.ts +2 -0
- package/dist/client/extensions/index.d.ts.map +1 -1
- package/dist/client/extensions/index.js +2 -0
- package/dist/client/extensions/index.js.map +1 -1
- package/dist/client/extensions/portable-extension.d.ts +86 -0
- package/dist/client/extensions/portable-extension.d.ts.map +1 -0
- package/dist/client/extensions/portable-extension.js +480 -0
- package/dist/client/extensions/portable-extension.js.map +1 -0
- package/dist/client/host-bridge.d.ts +266 -0
- package/dist/client/host-bridge.d.ts.map +1 -0
- package/dist/client/host-bridge.js +745 -0
- package/dist/client/host-bridge.js.map +1 -0
- package/dist/client/host-tools.d.ts +40 -0
- package/dist/client/host-tools.d.ts.map +1 -0
- package/dist/client/host-tools.js +94 -0
- package/dist/client/host-tools.js.map +1 -0
- package/dist/client/index.d.ts +13 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +11 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client/resources/BuiltinCapabilityDetail.d.ts +10 -0
- package/dist/client/resources/BuiltinCapabilityDetail.d.ts.map +1 -0
- package/dist/client/resources/BuiltinCapabilityDetail.js +51 -0
- package/dist/client/resources/BuiltinCapabilityDetail.js.map +1 -0
- package/dist/client/resources/ResourceEditor.d.ts +3 -1
- package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
- package/dist/client/resources/ResourceEditor.js +40 -17
- package/dist/client/resources/ResourceEditor.js.map +1 -1
- package/dist/client/resources/ResourceTree.d.ts.map +1 -1
- package/dist/client/resources/ResourceTree.js +23 -2
- package/dist/client/resources/ResourceTree.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +77 -17
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/resources/index.d.ts +1 -0
- package/dist/client/resources/index.d.ts.map +1 -1
- package/dist/client/resources/index.js +1 -0
- package/dist/client/resources/index.js.map +1 -1
- package/dist/client/resources/use-builtin-capabilities.d.ts +62 -0
- package/dist/client/resources/use-builtin-capabilities.d.ts.map +1 -0
- package/dist/client/resources/use-builtin-capabilities.js +54 -0
- package/dist/client/resources/use-builtin-capabilities.js.map +1 -0
- package/dist/client/resources/use-resources.d.ts +30 -2
- package/dist/client/resources/use-resources.d.ts.map +1 -1
- package/dist/client/resources/use-resources.js +42 -1
- package/dist/client/resources/use-resources.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +151 -2
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/use-chat-models.d.ts.map +1 -1
- package/dist/client/use-chat-models.js +20 -0
- package/dist/client/use-chat-models.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +46 -2
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/client/use-chat-threads.spec.js +77 -0
- package/dist/client/use-chat-threads.spec.js.map +1 -1
- package/dist/code-agents/index.d.ts +4 -0
- package/dist/code-agents/index.d.ts.map +1 -0
- package/dist/code-agents/index.js +4 -0
- package/dist/code-agents/index.js.map +1 -0
- package/dist/connections/catalog.d.ts +134 -0
- package/dist/connections/catalog.d.ts.map +1 -0
- package/dist/connections/catalog.js +180 -0
- package/dist/connections/catalog.js.map +1 -0
- package/dist/connections/index.d.ts +2 -0
- package/dist/connections/index.d.ts.map +1 -0
- package/dist/connections/index.js +2 -0
- package/dist/connections/index.js.map +1 -0
- package/dist/extensions/change-marker.d.ts +10 -0
- package/dist/extensions/change-marker.d.ts.map +1 -0
- package/dist/extensions/change-marker.js +42 -0
- package/dist/extensions/change-marker.js.map +1 -0
- package/dist/extensions/routes.d.ts.map +1 -1
- package/dist/extensions/routes.js +1 -7
- package/dist/extensions/routes.js.map +1 -1
- package/dist/extensions/schema.d.ts +1 -0
- package/dist/extensions/schema.d.ts.map +1 -1
- package/dist/extensions/schema.js +1 -0
- package/dist/extensions/schema.js.map +1 -1
- package/dist/extensions/slots/routes.js +1 -1
- package/dist/extensions/slots/routes.js.map +1 -1
- package/dist/extensions/store.d.ts +3 -0
- package/dist/extensions/store.d.ts.map +1 -1
- package/dist/extensions/store.js +112 -4
- package/dist/extensions/store.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/adapters/telegram.d.ts.map +1 -1
- package/dist/integrations/adapters/telegram.js +1 -0
- package/dist/integrations/adapters/telegram.js.map +1 -1
- package/dist/integrations/index.d.ts +5 -1
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +4 -1
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/plugin.d.ts +8 -0
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +760 -32
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/remote-commands-store.d.ts +36 -0
- package/dist/integrations/remote-commands-store.d.ts.map +1 -0
- package/dist/integrations/remote-commands-store.js +273 -0
- package/dist/integrations/remote-commands-store.js.map +1 -0
- package/dist/integrations/remote-devices-store.d.ts +43 -0
- package/dist/integrations/remote-devices-store.d.ts.map +1 -0
- package/dist/integrations/remote-devices-store.js +315 -0
- package/dist/integrations/remote-devices-store.js.map +1 -0
- package/dist/integrations/remote-push-store.d.ts +37 -0
- package/dist/integrations/remote-push-store.d.ts.map +1 -0
- package/dist/integrations/remote-push-store.js +299 -0
- package/dist/integrations/remote-push-store.js.map +1 -0
- package/dist/integrations/remote-retry-job.d.ts +7 -0
- package/dist/integrations/remote-retry-job.d.ts.map +1 -0
- package/dist/integrations/remote-retry-job.js +45 -0
- package/dist/integrations/remote-retry-job.js.map +1 -0
- package/dist/integrations/remote-run-events-store.d.ts +18 -0
- package/dist/integrations/remote-run-events-store.d.ts.map +1 -0
- package/dist/integrations/remote-run-events-store.js +82 -0
- package/dist/integrations/remote-run-events-store.js.map +1 -0
- package/dist/integrations/remote-types.d.ts +101 -0
- package/dist/integrations/remote-types.d.ts.map +1 -0
- package/dist/integrations/remote-types.js +2 -0
- package/dist/integrations/remote-types.js.map +1 -0
- package/dist/integrations/webhook-handler.d.ts +2 -0
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +4 -1
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/jobs/scheduler.d.ts +4 -2
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +9 -3
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/mcp-client/builtin-capabilities.d.ts +20 -0
- package/dist/mcp-client/builtin-capabilities.d.ts.map +1 -0
- package/dist/mcp-client/builtin-capabilities.js +75 -0
- package/dist/mcp-client/builtin-capabilities.js.map +1 -0
- package/dist/mcp-client/builtin-store.d.ts +10 -0
- package/dist/mcp-client/builtin-store.d.ts.map +1 -0
- package/dist/mcp-client/builtin-store.js +55 -0
- package/dist/mcp-client/builtin-store.js.map +1 -0
- package/dist/mcp-client/index.d.ts +3 -1
- package/dist/mcp-client/index.d.ts.map +1 -1
- package/dist/mcp-client/index.js +3 -1
- package/dist/mcp-client/index.js.map +1 -1
- package/dist/mcp-client/routes.d.ts +28 -0
- package/dist/mcp-client/routes.d.ts.map +1 -1
- package/dist/mcp-client/routes.js +195 -1
- package/dist/mcp-client/routes.js.map +1 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +34 -0
- package/dist/org/context.js.map +1 -1
- package/dist/resources/handlers.d.ts +4 -0
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +46 -7
- package/dist/resources/handlers.js.map +1 -1
- package/dist/resources/script-helpers.d.ts +8 -1
- package/dist/resources/script-helpers.d.ts.map +1 -1
- package/dist/resources/script-helpers.js +18 -8
- package/dist/resources/script-helpers.js.map +1 -1
- package/dist/resources/store.d.ts +19 -0
- package/dist/resources/store.d.ts.map +1 -1
- package/dist/resources/store.js +86 -3
- package/dist/resources/store.js.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +18 -7
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.d.ts.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.js +100 -7
- package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
- package/dist/scripts/resources/delete.d.ts.map +1 -1
- package/dist/scripts/resources/delete.js +4 -1
- package/dist/scripts/resources/delete.js.map +1 -1
- package/dist/scripts/resources/effective.d.ts +11 -0
- package/dist/scripts/resources/effective.d.ts.map +1 -0
- package/dist/scripts/resources/effective.js +54 -0
- package/dist/scripts/resources/effective.js.map +1 -0
- package/dist/scripts/resources/index.d.ts.map +1 -1
- package/dist/scripts/resources/index.js +1 -0
- package/dist/scripts/resources/index.js.map +1 -1
- package/dist/scripts/resources/list.d.ts +1 -1
- package/dist/scripts/resources/list.d.ts.map +1 -1
- package/dist/scripts/resources/list.js +17 -5
- package/dist/scripts/resources/list.js.map +1 -1
- package/dist/scripts/resources/read.d.ts +1 -1
- package/dist/scripts/resources/read.d.ts.map +1 -1
- package/dist/scripts/resources/read.js +20 -5
- package/dist/scripts/resources/read.js.map +1 -1
- package/dist/scripts/resources/write.d.ts.map +1 -1
- package/dist/scripts/resources/write.js +4 -1
- package/dist/scripts/resources/write.js.map +1 -1
- package/dist/scripts/runner.d.ts +11 -1
- package/dist/scripts/runner.d.ts.map +1 -1
- package/dist/scripts/runner.js +75 -27
- package/dist/scripts/runner.js.map +1 -1
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +5 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +24 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +608 -54
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +2 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/embedded.d.ts +72 -0
- package/dist/server/embedded.d.ts.map +1 -0
- package/dist/server/embedded.js +119 -0
- package/dist/server/embedded.js.map +1 -0
- package/dist/server/index.d.ts +8 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +7 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +184 -13
- package/dist/server/poll.js.map +1 -1
- package/dist/server/resources-plugin.d.ts.map +1 -1
- package/dist/server/resources-plugin.js +11 -2
- package/dist/server/resources-plugin.js.map +1 -1
- package/dist/sharing/actions/extension-change.d.ts +4 -0
- package/dist/sharing/actions/extension-change.d.ts.map +1 -0
- package/dist/sharing/actions/extension-change.js +13 -0
- package/dist/sharing/actions/extension-change.js.map +1 -0
- package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
- package/dist/sharing/actions/set-resource-visibility.js +3 -0
- package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
- package/dist/sharing/actions/share-resource.d.ts.map +1 -1
- package/dist/sharing/actions/share-resource.js +4 -0
- package/dist/sharing/actions/share-resource.js.map +1 -1
- package/dist/sharing/actions/unshare-resource.d.ts.map +1 -1
- package/dist/sharing/actions/unshare-resource.js +3 -0
- package/dist/sharing/actions/unshare-resource.js.map +1 -1
- package/dist/templates/default/AGENTS.md +3 -3
- package/dist/templates/workspace-core/AGENTS.md +7 -0
- package/dist/templates/workspace-root/AGENTS.md +7 -0
- package/dist/templates/workspace-root/README.md +25 -0
- package/dist/triggers/dispatcher.d.ts +3 -1
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +9 -3
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/workspace-connections/index.d.ts +2 -0
- package/dist/workspace-connections/index.d.ts.map +1 -0
- package/dist/workspace-connections/index.js +2 -0
- package/dist/workspace-connections/index.js.map +1 -0
- package/dist/workspace-connections/store.d.ts +229 -0
- package/dist/workspace-connections/store.d.ts.map +1 -0
- package/dist/workspace-connections/store.js +938 -0
- package/dist/workspace-connections/store.js.map +1 -0
- package/docs/content/agent-teams.md +6 -0
- package/docs/content/cloneable-saas.md +1 -0
- package/docs/content/code-agents-ui.md +261 -0
- package/docs/content/dispatch.md +40 -3
- package/docs/content/embedding-sdk.md +459 -0
- package/docs/content/faq.md +1 -0
- package/docs/content/getting-started.md +1 -0
- package/docs/content/mcp-clients.md +41 -3
- package/docs/content/migration-workbench.md +237 -54
- package/docs/content/multi-app-workspace.md +41 -0
- package/docs/content/multi-tenancy.md +1 -1
- package/docs/content/template-brain.md +418 -0
- package/docs/content/template-dispatch.md +30 -0
- package/docs/content/workspace-connections.md +509 -0
- package/docs/content/workspace-management.md +12 -12
- package/docs/content/workspace.md +180 -40
- package/package.json +7 -2
- package/src/templates/default/AGENTS.md +3 -3
- package/src/templates/workspace-core/AGENTS.md +7 -0
- package/src/templates/workspace-root/AGENTS.md +7 -0
- package/src/templates/workspace-root/README.md +25 -0
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
import { getDbExec, intType, isPostgres, retryOnDdlRace, safeJsonParse, } from "../db/client.js";
|
|
2
|
+
export const DEFAULT_BROWSER_SESSION_TTL_MS = 45_000;
|
|
3
|
+
export const DEFAULT_BROWSER_SESSION_REQUEST_TIMEOUT_MS = 30_000;
|
|
4
|
+
export const DEFAULT_BROWSER_SESSION_REQUEST_POLL_MS = 250;
|
|
5
|
+
const SESSION_TABLE = "agent_native_browser_sessions";
|
|
6
|
+
const REQUEST_TABLE = "agent_native_browser_session_requests";
|
|
7
|
+
const SAFE_ID_RE = /^[A-Za-z0-9._:-]{1,160}$/;
|
|
8
|
+
let initPromise;
|
|
9
|
+
function nowMs() {
|
|
10
|
+
return Date.now();
|
|
11
|
+
}
|
|
12
|
+
function sleep(ms) {
|
|
13
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
14
|
+
}
|
|
15
|
+
async function ensureTables() {
|
|
16
|
+
if (!initPromise) {
|
|
17
|
+
initPromise = (async () => {
|
|
18
|
+
const client = getDbExec();
|
|
19
|
+
await retryOnDdlRace(() => client.execute(`
|
|
20
|
+
CREATE TABLE IF NOT EXISTS ${SESSION_TABLE} (
|
|
21
|
+
owner_email TEXT NOT NULL,
|
|
22
|
+
session_id TEXT NOT NULL,
|
|
23
|
+
label TEXT,
|
|
24
|
+
url TEXT,
|
|
25
|
+
session_json TEXT NOT NULL,
|
|
26
|
+
context_json TEXT,
|
|
27
|
+
actions_json TEXT,
|
|
28
|
+
connected_at ${intType()} NOT NULL,
|
|
29
|
+
last_seen_at ${intType()} NOT NULL,
|
|
30
|
+
expires_at ${intType()} NOT NULL,
|
|
31
|
+
PRIMARY KEY (owner_email, session_id)
|
|
32
|
+
)
|
|
33
|
+
`));
|
|
34
|
+
await retryOnDdlRace(() => client.execute(`
|
|
35
|
+
CREATE INDEX IF NOT EXISTS agent_native_browser_sessions_owner_seen_idx
|
|
36
|
+
ON ${SESSION_TABLE} (owner_email, last_seen_at)
|
|
37
|
+
`));
|
|
38
|
+
await retryOnDdlRace(() => client.execute(`
|
|
39
|
+
CREATE TABLE IF NOT EXISTS ${REQUEST_TABLE} (
|
|
40
|
+
owner_email TEXT NOT NULL,
|
|
41
|
+
session_id TEXT NOT NULL,
|
|
42
|
+
request_id TEXT NOT NULL,
|
|
43
|
+
type TEXT NOT NULL,
|
|
44
|
+
name TEXT,
|
|
45
|
+
command TEXT,
|
|
46
|
+
payload_json TEXT,
|
|
47
|
+
status TEXT NOT NULL,
|
|
48
|
+
created_at ${intType()} NOT NULL,
|
|
49
|
+
claimed_at ${intType()},
|
|
50
|
+
completed_at ${intType()},
|
|
51
|
+
expires_at ${intType()} NOT NULL,
|
|
52
|
+
result_json TEXT,
|
|
53
|
+
error TEXT,
|
|
54
|
+
PRIMARY KEY (owner_email, request_id)
|
|
55
|
+
)
|
|
56
|
+
`));
|
|
57
|
+
await retryOnDdlRace(() => client.execute(`
|
|
58
|
+
CREATE INDEX IF NOT EXISTS agent_native_browser_session_requests_pending_idx
|
|
59
|
+
ON ${REQUEST_TABLE} (owner_email, session_id, status, created_at)
|
|
60
|
+
`));
|
|
61
|
+
})();
|
|
62
|
+
}
|
|
63
|
+
return initPromise;
|
|
64
|
+
}
|
|
65
|
+
function assertOwnerEmail(ownerEmail) {
|
|
66
|
+
const trimmed = ownerEmail.trim();
|
|
67
|
+
if (!trimmed)
|
|
68
|
+
throw new Error("ownerEmail is required");
|
|
69
|
+
return trimmed;
|
|
70
|
+
}
|
|
71
|
+
function assertSafeId(value, label) {
|
|
72
|
+
const trimmed = value.trim();
|
|
73
|
+
if (!SAFE_ID_RE.test(trimmed)) {
|
|
74
|
+
throw new Error(`${label} must be 1-160 characters using letters, numbers, dot, underscore, colon, or dash`);
|
|
75
|
+
}
|
|
76
|
+
return trimmed;
|
|
77
|
+
}
|
|
78
|
+
function generateId(prefix) {
|
|
79
|
+
return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
|
|
80
|
+
}
|
|
81
|
+
function json(value) {
|
|
82
|
+
return JSON.stringify(value ?? null);
|
|
83
|
+
}
|
|
84
|
+
function parseOptionalObject(value) {
|
|
85
|
+
if (value == null)
|
|
86
|
+
return undefined;
|
|
87
|
+
const parsed = safeJsonParse(value, undefined);
|
|
88
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed)
|
|
89
|
+
? parsed
|
|
90
|
+
: undefined;
|
|
91
|
+
}
|
|
92
|
+
function parseActions(value) {
|
|
93
|
+
const parsed = safeJsonParse(value, []);
|
|
94
|
+
return Array.isArray(parsed)
|
|
95
|
+
? parsed.filter((action) => action &&
|
|
96
|
+
typeof action === "object" &&
|
|
97
|
+
typeof action.name === "string")
|
|
98
|
+
: [];
|
|
99
|
+
}
|
|
100
|
+
function parseSession(value, sessionId) {
|
|
101
|
+
const parsed = safeJsonParse(value, { id: sessionId });
|
|
102
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed)
|
|
103
|
+
? {
|
|
104
|
+
id: sessionId,
|
|
105
|
+
...parsed,
|
|
106
|
+
}
|
|
107
|
+
: { id: sessionId };
|
|
108
|
+
}
|
|
109
|
+
function coerceTime(value) {
|
|
110
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
111
|
+
return value;
|
|
112
|
+
if (typeof value === "string" && value.trim()) {
|
|
113
|
+
const parsed = Date.parse(value);
|
|
114
|
+
if (Number.isFinite(parsed))
|
|
115
|
+
return parsed;
|
|
116
|
+
}
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
function normalizeSessionInput(input) {
|
|
120
|
+
const sessionRecord = input.session && typeof input.session === "object" ? input.session : {};
|
|
121
|
+
const rawId = input.sessionId || sessionRecord.id;
|
|
122
|
+
if (typeof rawId !== "string") {
|
|
123
|
+
throw new Error("session.id is required");
|
|
124
|
+
}
|
|
125
|
+
const sessionId = assertSafeId(rawId, "session.id");
|
|
126
|
+
const now = nowMs();
|
|
127
|
+
const connectedAt = coerceTime(sessionRecord.connectedAt) ?? now;
|
|
128
|
+
const label = typeof input.label === "string" && input.label.trim()
|
|
129
|
+
? input.label.trim()
|
|
130
|
+
: typeof sessionRecord.label === "string" && sessionRecord.label.trim()
|
|
131
|
+
? sessionRecord.label.trim()
|
|
132
|
+
: undefined;
|
|
133
|
+
const url = typeof input.url === "string" && input.url.trim()
|
|
134
|
+
? input.url.trim()
|
|
135
|
+
: typeof sessionRecord.url === "string" && sessionRecord.url.trim()
|
|
136
|
+
? sessionRecord.url.trim()
|
|
137
|
+
: undefined;
|
|
138
|
+
const session = {
|
|
139
|
+
...sessionRecord,
|
|
140
|
+
id: sessionId,
|
|
141
|
+
...(label ? { label } : {}),
|
|
142
|
+
connectedAt: new Date(connectedAt).toISOString(),
|
|
143
|
+
...(url ? { url } : {}),
|
|
144
|
+
};
|
|
145
|
+
return {
|
|
146
|
+
sessionId,
|
|
147
|
+
session,
|
|
148
|
+
label,
|
|
149
|
+
url,
|
|
150
|
+
context: input.context &&
|
|
151
|
+
typeof input.context === "object" &&
|
|
152
|
+
!Array.isArray(input.context)
|
|
153
|
+
? input.context
|
|
154
|
+
: undefined,
|
|
155
|
+
actions: Array.isArray(input.actions) ? input.actions : [],
|
|
156
|
+
connectedAt,
|
|
157
|
+
ttlMs: typeof input.ttlMs === "number" && input.ttlMs > 0
|
|
158
|
+
? Math.min(input.ttlMs, 5 * 60 * 1000)
|
|
159
|
+
: DEFAULT_BROWSER_SESSION_TTL_MS,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function rowToSession(row, now = nowMs()) {
|
|
163
|
+
const sessionId = String(row.session_id ?? "");
|
|
164
|
+
const expiresAt = Number(row.expires_at ?? 0);
|
|
165
|
+
return {
|
|
166
|
+
sessionId,
|
|
167
|
+
session: parseSession(row.session_json, sessionId),
|
|
168
|
+
label: typeof row.label === "string" ? row.label : undefined,
|
|
169
|
+
url: typeof row.url === "string" ? row.url : undefined,
|
|
170
|
+
context: parseOptionalObject(row.context_json),
|
|
171
|
+
actions: parseActions(row.actions_json),
|
|
172
|
+
connectedAt: Number(row.connected_at ?? 0),
|
|
173
|
+
lastSeenAt: Number(row.last_seen_at ?? 0),
|
|
174
|
+
expiresAt,
|
|
175
|
+
active: expiresAt > now,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function rowToRequest(row) {
|
|
179
|
+
const type = String(row.type ?? "get-context");
|
|
180
|
+
const payload = safeJsonParse(row.payload_json, undefined);
|
|
181
|
+
const result = safeJsonParse(row.result_json, undefined);
|
|
182
|
+
const request = {
|
|
183
|
+
id: String(row.request_id ?? ""),
|
|
184
|
+
sessionId: String(row.session_id ?? ""),
|
|
185
|
+
type,
|
|
186
|
+
status: String(row.status ?? "pending"),
|
|
187
|
+
createdAt: Number(row.created_at ?? 0),
|
|
188
|
+
expiresAt: Number(row.expires_at ?? 0),
|
|
189
|
+
...(typeof row.name === "string" && row.name ? { name: row.name } : {}),
|
|
190
|
+
...(typeof row.command === "string" && row.command
|
|
191
|
+
? { command: row.command }
|
|
192
|
+
: {}),
|
|
193
|
+
...(row.claimed_at != null ? { claimedAt: Number(row.claimed_at) } : {}),
|
|
194
|
+
...(row.completed_at != null
|
|
195
|
+
? { completedAt: Number(row.completed_at) }
|
|
196
|
+
: {}),
|
|
197
|
+
...(row.error ? { error: String(row.error) } : {}),
|
|
198
|
+
...(row.result_json != null ? { result } : {}),
|
|
199
|
+
};
|
|
200
|
+
if (type === "run-action")
|
|
201
|
+
request.args = payload;
|
|
202
|
+
else
|
|
203
|
+
request.payload = payload;
|
|
204
|
+
return request;
|
|
205
|
+
}
|
|
206
|
+
async function expireOldRequests(ownerEmail, sessionId) {
|
|
207
|
+
await ensureTables();
|
|
208
|
+
const client = getDbExec();
|
|
209
|
+
const now = nowMs();
|
|
210
|
+
await client.execute({
|
|
211
|
+
sql: sessionId
|
|
212
|
+
? `UPDATE ${REQUEST_TABLE}
|
|
213
|
+
SET status = 'expired', completed_at = ?, error = 'Browser-session request expired'
|
|
214
|
+
WHERE owner_email = ? AND session_id = ? AND status IN ('pending', 'claimed') AND expires_at < ?`
|
|
215
|
+
: `UPDATE ${REQUEST_TABLE}
|
|
216
|
+
SET status = 'expired', completed_at = ?, error = 'Browser-session request expired'
|
|
217
|
+
WHERE owner_email = ? AND status IN ('pending', 'claimed') AND expires_at < ?`,
|
|
218
|
+
args: sessionId
|
|
219
|
+
? [now, ownerEmail, sessionId, now]
|
|
220
|
+
: [now, ownerEmail, now],
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
export async function registerBrowserSession(ownerEmailInput, input) {
|
|
224
|
+
const ownerEmail = assertOwnerEmail(ownerEmailInput);
|
|
225
|
+
const normalized = normalizeSessionInput(input);
|
|
226
|
+
await ensureTables();
|
|
227
|
+
const client = getDbExec();
|
|
228
|
+
const now = nowMs();
|
|
229
|
+
const expiresAt = now + normalized.ttlMs;
|
|
230
|
+
await client.execute({
|
|
231
|
+
sql: isPostgres()
|
|
232
|
+
? `INSERT INTO ${SESSION_TABLE}
|
|
233
|
+
(owner_email, session_id, label, url, session_json, context_json, actions_json, connected_at, last_seen_at, expires_at)
|
|
234
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
235
|
+
ON CONFLICT (owner_email, session_id) DO UPDATE SET
|
|
236
|
+
label = EXCLUDED.label,
|
|
237
|
+
url = EXCLUDED.url,
|
|
238
|
+
session_json = EXCLUDED.session_json,
|
|
239
|
+
context_json = EXCLUDED.context_json,
|
|
240
|
+
actions_json = EXCLUDED.actions_json,
|
|
241
|
+
last_seen_at = EXCLUDED.last_seen_at,
|
|
242
|
+
expires_at = EXCLUDED.expires_at`
|
|
243
|
+
: `INSERT OR REPLACE INTO ${SESSION_TABLE}
|
|
244
|
+
(owner_email, session_id, label, url, session_json, context_json, actions_json, connected_at, last_seen_at, expires_at)
|
|
245
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
246
|
+
args: [
|
|
247
|
+
ownerEmail,
|
|
248
|
+
normalized.sessionId,
|
|
249
|
+
normalized.label ?? null,
|
|
250
|
+
normalized.url ?? null,
|
|
251
|
+
json(normalized.session),
|
|
252
|
+
normalized.context ? json(normalized.context) : null,
|
|
253
|
+
json(normalized.actions),
|
|
254
|
+
normalized.connectedAt,
|
|
255
|
+
now,
|
|
256
|
+
expiresAt,
|
|
257
|
+
],
|
|
258
|
+
});
|
|
259
|
+
const saved = await getBrowserSession(ownerEmail, normalized.sessionId, {
|
|
260
|
+
includeExpired: true,
|
|
261
|
+
});
|
|
262
|
+
if (!saved)
|
|
263
|
+
throw new Error("Failed to register browser session");
|
|
264
|
+
return saved;
|
|
265
|
+
}
|
|
266
|
+
export async function listBrowserSessions(ownerEmailInput, options = {}) {
|
|
267
|
+
const ownerEmail = assertOwnerEmail(ownerEmailInput);
|
|
268
|
+
await ensureTables();
|
|
269
|
+
await expireOldRequests(ownerEmail);
|
|
270
|
+
const client = getDbExec();
|
|
271
|
+
const limit = typeof options.limit === "number" && options.limit > 0
|
|
272
|
+
? Math.min(Math.floor(options.limit), 100)
|
|
273
|
+
: 25;
|
|
274
|
+
const now = nowMs();
|
|
275
|
+
const { rows } = await client.execute({
|
|
276
|
+
sql: `SELECT * FROM ${SESSION_TABLE}
|
|
277
|
+
WHERE owner_email = ?
|
|
278
|
+
ORDER BY last_seen_at DESC
|
|
279
|
+
LIMIT ?`,
|
|
280
|
+
args: [ownerEmail, limit],
|
|
281
|
+
});
|
|
282
|
+
const sessions = rows.map((row) => rowToSession(row, now));
|
|
283
|
+
return options.includeExpired
|
|
284
|
+
? sessions
|
|
285
|
+
: sessions.filter((session) => session.active);
|
|
286
|
+
}
|
|
287
|
+
export async function getBrowserSession(ownerEmailInput, sessionIdInput, options = {}) {
|
|
288
|
+
const ownerEmail = assertOwnerEmail(ownerEmailInput);
|
|
289
|
+
const sessionId = assertSafeId(sessionIdInput, "sessionId");
|
|
290
|
+
await ensureTables();
|
|
291
|
+
const client = getDbExec();
|
|
292
|
+
const { rows } = await client.execute({
|
|
293
|
+
sql: `SELECT * FROM ${SESSION_TABLE} WHERE owner_email = ? AND session_id = ?`,
|
|
294
|
+
args: [ownerEmail, sessionId],
|
|
295
|
+
});
|
|
296
|
+
if (rows.length === 0)
|
|
297
|
+
return null;
|
|
298
|
+
const session = rowToSession(rows[0]);
|
|
299
|
+
return options.includeExpired || session.active ? session : null;
|
|
300
|
+
}
|
|
301
|
+
export async function disconnectBrowserSession(ownerEmailInput, sessionIdInput) {
|
|
302
|
+
const ownerEmail = assertOwnerEmail(ownerEmailInput);
|
|
303
|
+
const sessionId = assertSafeId(sessionIdInput, "sessionId");
|
|
304
|
+
await ensureTables();
|
|
305
|
+
const client = getDbExec();
|
|
306
|
+
await client.execute({
|
|
307
|
+
sql: `UPDATE ${REQUEST_TABLE}
|
|
308
|
+
SET status = 'expired', completed_at = ?, error = 'Browser session disconnected'
|
|
309
|
+
WHERE owner_email = ? AND session_id = ? AND status IN ('pending', 'claimed')`,
|
|
310
|
+
args: [nowMs(), ownerEmail, sessionId],
|
|
311
|
+
});
|
|
312
|
+
const result = await client.execute({
|
|
313
|
+
sql: `DELETE FROM ${SESSION_TABLE} WHERE owner_email = ? AND session_id = ?`,
|
|
314
|
+
args: [ownerEmail, sessionId],
|
|
315
|
+
});
|
|
316
|
+
return result.rowsAffected > 0;
|
|
317
|
+
}
|
|
318
|
+
function normalizeRequestInput(input) {
|
|
319
|
+
if (input.type !== "get-context" &&
|
|
320
|
+
input.type !== "list-actions" &&
|
|
321
|
+
input.type !== "run-action" &&
|
|
322
|
+
input.type !== "command") {
|
|
323
|
+
throw new Error("request type must be get-context, list-actions, run-action, or command");
|
|
324
|
+
}
|
|
325
|
+
const name = typeof input.name === "string" && input.name.trim()
|
|
326
|
+
? input.name.trim()
|
|
327
|
+
: undefined;
|
|
328
|
+
if (input.type === "run-action" && !name) {
|
|
329
|
+
throw new Error("name is required for run-action requests");
|
|
330
|
+
}
|
|
331
|
+
const command = typeof input.command === "string" && input.command.trim()
|
|
332
|
+
? input.command.trim()
|
|
333
|
+
: input.type === "command"
|
|
334
|
+
? "refreshData"
|
|
335
|
+
: undefined;
|
|
336
|
+
return {
|
|
337
|
+
type: input.type,
|
|
338
|
+
name,
|
|
339
|
+
command,
|
|
340
|
+
payload: input.type === "run-action" ? input.args : input.payload,
|
|
341
|
+
timeoutMs: typeof input.timeoutMs === "number" && input.timeoutMs > 0
|
|
342
|
+
? Math.min(input.timeoutMs, 2 * 60 * 1000)
|
|
343
|
+
: DEFAULT_BROWSER_SESSION_REQUEST_TIMEOUT_MS,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
export async function createBrowserSessionRequest(ownerEmailInput, sessionIdInput, input) {
|
|
347
|
+
const ownerEmail = assertOwnerEmail(ownerEmailInput);
|
|
348
|
+
const sessionId = assertSafeId(sessionIdInput, "sessionId");
|
|
349
|
+
const session = await getBrowserSession(ownerEmail, sessionId);
|
|
350
|
+
if (!session) {
|
|
351
|
+
throw new Error(`No active browser session found for "${sessionId}"`);
|
|
352
|
+
}
|
|
353
|
+
const normalized = normalizeRequestInput(input);
|
|
354
|
+
await ensureTables();
|
|
355
|
+
const client = getDbExec();
|
|
356
|
+
const createdAt = nowMs();
|
|
357
|
+
const requestId = generateId("browser-request");
|
|
358
|
+
const expiresAt = createdAt + normalized.timeoutMs + 15_000;
|
|
359
|
+
await client.execute({
|
|
360
|
+
sql: isPostgres()
|
|
361
|
+
? `INSERT INTO ${REQUEST_TABLE}
|
|
362
|
+
(owner_email, session_id, request_id, type, name, command, payload_json, status, created_at, expires_at)
|
|
363
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, 'pending', ?, ?)
|
|
364
|
+
ON CONFLICT (owner_email, request_id) DO NOTHING`
|
|
365
|
+
: `INSERT OR IGNORE INTO ${REQUEST_TABLE}
|
|
366
|
+
(owner_email, session_id, request_id, type, name, command, payload_json, status, created_at, expires_at)
|
|
367
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, 'pending', ?, ?)`,
|
|
368
|
+
args: [
|
|
369
|
+
ownerEmail,
|
|
370
|
+
sessionId,
|
|
371
|
+
requestId,
|
|
372
|
+
normalized.type,
|
|
373
|
+
normalized.name ?? null,
|
|
374
|
+
normalized.command ?? null,
|
|
375
|
+
json(normalized.payload),
|
|
376
|
+
createdAt,
|
|
377
|
+
expiresAt,
|
|
378
|
+
],
|
|
379
|
+
});
|
|
380
|
+
const request = await getBrowserSessionRequest(ownerEmail, requestId);
|
|
381
|
+
if (!request)
|
|
382
|
+
throw new Error("Failed to create browser-session request");
|
|
383
|
+
return request;
|
|
384
|
+
}
|
|
385
|
+
export async function getBrowserSessionRequest(ownerEmailInput, requestIdInput) {
|
|
386
|
+
const ownerEmail = assertOwnerEmail(ownerEmailInput);
|
|
387
|
+
const requestId = assertSafeId(requestIdInput, "requestId");
|
|
388
|
+
await ensureTables();
|
|
389
|
+
const client = getDbExec();
|
|
390
|
+
const { rows } = await client.execute({
|
|
391
|
+
sql: `SELECT * FROM ${REQUEST_TABLE} WHERE owner_email = ? AND request_id = ?`,
|
|
392
|
+
args: [ownerEmail, requestId],
|
|
393
|
+
});
|
|
394
|
+
return rows.length ? rowToRequest(rows[0]) : null;
|
|
395
|
+
}
|
|
396
|
+
export async function claimBrowserSessionRequest(ownerEmailInput, sessionIdInput) {
|
|
397
|
+
const ownerEmail = assertOwnerEmail(ownerEmailInput);
|
|
398
|
+
const sessionId = assertSafeId(sessionIdInput, "sessionId");
|
|
399
|
+
await ensureTables();
|
|
400
|
+
await expireOldRequests(ownerEmail, sessionId);
|
|
401
|
+
const client = getDbExec();
|
|
402
|
+
const now = nowMs();
|
|
403
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
404
|
+
const { rows } = await client.execute({
|
|
405
|
+
sql: `SELECT * FROM ${REQUEST_TABLE}
|
|
406
|
+
WHERE owner_email = ? AND session_id = ? AND status = 'pending' AND expires_at >= ?
|
|
407
|
+
ORDER BY created_at ASC
|
|
408
|
+
LIMIT 1`,
|
|
409
|
+
args: [ownerEmail, sessionId, now],
|
|
410
|
+
});
|
|
411
|
+
if (rows.length === 0)
|
|
412
|
+
return null;
|
|
413
|
+
const candidate = rowToRequest(rows[0]);
|
|
414
|
+
const updated = await client.execute({
|
|
415
|
+
sql: `UPDATE ${REQUEST_TABLE}
|
|
416
|
+
SET status = 'claimed', claimed_at = ?
|
|
417
|
+
WHERE owner_email = ? AND request_id = ? AND status = 'pending'`,
|
|
418
|
+
args: [now, ownerEmail, candidate.id],
|
|
419
|
+
});
|
|
420
|
+
if (updated.rowsAffected > 0) {
|
|
421
|
+
return getBrowserSessionRequest(ownerEmail, candidate.id);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
return null;
|
|
425
|
+
}
|
|
426
|
+
export async function completeBrowserSessionRequest(ownerEmailInput, sessionIdInput, requestIdInput, result) {
|
|
427
|
+
const ownerEmail = assertOwnerEmail(ownerEmailInput);
|
|
428
|
+
const sessionId = assertSafeId(sessionIdInput, "sessionId");
|
|
429
|
+
const requestId = assertSafeId(requestIdInput, "requestId");
|
|
430
|
+
await ensureTables();
|
|
431
|
+
const client = getDbExec();
|
|
432
|
+
const completedAt = nowMs();
|
|
433
|
+
const status = result.ok === true ? "completed" : "failed";
|
|
434
|
+
const error = result.ok === false
|
|
435
|
+
? result.error || "Browser-session request failed"
|
|
436
|
+
: null;
|
|
437
|
+
const updated = await client.execute({
|
|
438
|
+
sql: `UPDATE ${REQUEST_TABLE}
|
|
439
|
+
SET status = ?, completed_at = ?, result_json = ?, error = ?
|
|
440
|
+
WHERE owner_email = ? AND session_id = ? AND request_id = ? AND status IN ('pending', 'claimed')`,
|
|
441
|
+
args: [
|
|
442
|
+
status,
|
|
443
|
+
completedAt,
|
|
444
|
+
"result" in result ? json(result.result) : null,
|
|
445
|
+
error,
|
|
446
|
+
ownerEmail,
|
|
447
|
+
sessionId,
|
|
448
|
+
requestId,
|
|
449
|
+
],
|
|
450
|
+
});
|
|
451
|
+
if (updated.rowsAffected === 0) {
|
|
452
|
+
const existing = await getBrowserSessionRequest(ownerEmail, requestId);
|
|
453
|
+
if (existing)
|
|
454
|
+
return existing;
|
|
455
|
+
throw new Error(`No browser-session request found for "${requestId}"`);
|
|
456
|
+
}
|
|
457
|
+
const request = await getBrowserSessionRequest(ownerEmail, requestId);
|
|
458
|
+
if (!request)
|
|
459
|
+
throw new Error(`No browser-session request found for "${requestId}"`);
|
|
460
|
+
return request;
|
|
461
|
+
}
|
|
462
|
+
export async function waitForBrowserSessionRequest(ownerEmailInput, requestIdInput, options = {}) {
|
|
463
|
+
const ownerEmail = assertOwnerEmail(ownerEmailInput);
|
|
464
|
+
const requestId = assertSafeId(requestIdInput, "requestId");
|
|
465
|
+
const timeoutMs = typeof options.timeoutMs === "number" && options.timeoutMs > 0
|
|
466
|
+
? options.timeoutMs
|
|
467
|
+
: DEFAULT_BROWSER_SESSION_REQUEST_TIMEOUT_MS;
|
|
468
|
+
const pollMs = typeof options.pollMs === "number" && options.pollMs > 0
|
|
469
|
+
? options.pollMs
|
|
470
|
+
: DEFAULT_BROWSER_SESSION_REQUEST_POLL_MS;
|
|
471
|
+
const deadline = nowMs() + timeoutMs;
|
|
472
|
+
while (nowMs() <= deadline) {
|
|
473
|
+
const request = await getBrowserSessionRequest(ownerEmail, requestId);
|
|
474
|
+
if (!request)
|
|
475
|
+
throw new Error(`No browser-session request found for "${requestId}"`);
|
|
476
|
+
if (request.status === "completed")
|
|
477
|
+
return request.result;
|
|
478
|
+
if (request.status === "failed") {
|
|
479
|
+
throw new Error(request.error || "Browser-session request failed");
|
|
480
|
+
}
|
|
481
|
+
if (request.status === "expired" || request.expiresAt < nowMs()) {
|
|
482
|
+
await expireOldRequests(ownerEmail, request.sessionId);
|
|
483
|
+
throw new Error(request.error || "Browser-session request expired");
|
|
484
|
+
}
|
|
485
|
+
await sleep(Math.min(pollMs, Math.max(1, deadline - nowMs())));
|
|
486
|
+
}
|
|
487
|
+
const request = await getBrowserSessionRequest(ownerEmail, requestId);
|
|
488
|
+
if (request) {
|
|
489
|
+
await completeBrowserSessionRequest(ownerEmail, request.sessionId, requestId, {
|
|
490
|
+
ok: false,
|
|
491
|
+
error: "Timed out waiting for browser-session response",
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
throw new Error("Timed out waiting for browser-session response");
|
|
495
|
+
}
|
|
496
|
+
export async function callBrowserSession(ownerEmailInput, sessionIdInput, input, options = {}) {
|
|
497
|
+
const request = await createBrowserSessionRequest(ownerEmailInput, sessionIdInput, {
|
|
498
|
+
...input,
|
|
499
|
+
timeoutMs: input.timeoutMs ?? options.timeoutMs,
|
|
500
|
+
});
|
|
501
|
+
return waitForBrowserSessionRequest(ownerEmailInput, request.id, {
|
|
502
|
+
timeoutMs: options.timeoutMs ?? input.timeoutMs,
|
|
503
|
+
pollMs: options.pollMs,
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/browser-sessions/store.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getDbExec,\n intType,\n isPostgres,\n retryOnDdlRace,\n safeJsonParse,\n} from \"../db/client.js\";\nimport type {\n AgentNativeBrowserSession,\n AgentNativeBrowserSessionAction,\n AgentNativeBrowserSessionRecord,\n AgentNativeBrowserSessionRequest,\n AgentNativeBrowserSessionRequestStatus,\n AgentNativeBrowserSessionRequestType,\n CreateAgentNativeBrowserSessionRequestInput,\n RegisterAgentNativeBrowserSessionInput,\n} from \"./types.js\";\n\nexport const DEFAULT_BROWSER_SESSION_TTL_MS = 45_000;\nexport const DEFAULT_BROWSER_SESSION_REQUEST_TIMEOUT_MS = 30_000;\nexport const DEFAULT_BROWSER_SESSION_REQUEST_POLL_MS = 250;\n\nconst SESSION_TABLE = \"agent_native_browser_sessions\";\nconst REQUEST_TABLE = \"agent_native_browser_session_requests\";\nconst SAFE_ID_RE = /^[A-Za-z0-9._:-]{1,160}$/;\n\nlet initPromise: Promise<void> | undefined;\n\nfunction nowMs(): number {\n return Date.now();\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function ensureTables(): Promise<void> {\n if (!initPromise) {\n initPromise = (async () => {\n const client = getDbExec();\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE TABLE IF NOT EXISTS ${SESSION_TABLE} (\n owner_email TEXT NOT NULL,\n session_id TEXT NOT NULL,\n label TEXT,\n url TEXT,\n session_json TEXT NOT NULL,\n context_json TEXT,\n actions_json TEXT,\n connected_at ${intType()} NOT NULL,\n last_seen_at ${intType()} NOT NULL,\n expires_at ${intType()} NOT NULL,\n PRIMARY KEY (owner_email, session_id)\n )\n `),\n );\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE INDEX IF NOT EXISTS agent_native_browser_sessions_owner_seen_idx\n ON ${SESSION_TABLE} (owner_email, last_seen_at)\n `),\n );\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE TABLE IF NOT EXISTS ${REQUEST_TABLE} (\n owner_email TEXT NOT NULL,\n session_id TEXT NOT NULL,\n request_id TEXT NOT NULL,\n type TEXT NOT NULL,\n name TEXT,\n command TEXT,\n payload_json TEXT,\n status TEXT NOT NULL,\n created_at ${intType()} NOT NULL,\n claimed_at ${intType()},\n completed_at ${intType()},\n expires_at ${intType()} NOT NULL,\n result_json TEXT,\n error TEXT,\n PRIMARY KEY (owner_email, request_id)\n )\n `),\n );\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE INDEX IF NOT EXISTS agent_native_browser_session_requests_pending_idx\n ON ${REQUEST_TABLE} (owner_email, session_id, status, created_at)\n `),\n );\n })();\n }\n return initPromise;\n}\n\nfunction assertOwnerEmail(ownerEmail: string): string {\n const trimmed = ownerEmail.trim();\n if (!trimmed) throw new Error(\"ownerEmail is required\");\n return trimmed;\n}\n\nfunction assertSafeId(value: string, label: string): string {\n const trimmed = value.trim();\n if (!SAFE_ID_RE.test(trimmed)) {\n throw new Error(\n `${label} must be 1-160 characters using letters, numbers, dot, underscore, colon, or dash`,\n );\n }\n return trimmed;\n}\n\nfunction generateId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction json(value: unknown): string {\n return JSON.stringify(value ?? null);\n}\n\nfunction parseOptionalObject(\n value: unknown,\n): Record<string, unknown> | undefined {\n if (value == null) return undefined;\n const parsed = safeJsonParse<unknown>(value, undefined);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n}\n\nfunction parseActions(value: unknown): AgentNativeBrowserSessionAction[] {\n const parsed = safeJsonParse<unknown>(value, []);\n return Array.isArray(parsed)\n ? (parsed.filter(\n (action) =>\n action &&\n typeof action === \"object\" &&\n typeof (action as { name?: unknown }).name === \"string\",\n ) as AgentNativeBrowserSessionAction[])\n : [];\n}\n\nfunction parseSession(\n value: unknown,\n sessionId: string,\n): AgentNativeBrowserSession {\n const parsed = safeJsonParse<unknown>(value, { id: sessionId });\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? ({\n id: sessionId,\n ...(parsed as Record<string, unknown>),\n } as AgentNativeBrowserSession)\n : { id: sessionId };\n}\n\nfunction coerceTime(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Date.parse(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return undefined;\n}\n\nfunction normalizeSessionInput(input: RegisterAgentNativeBrowserSessionInput): {\n sessionId: string;\n session: AgentNativeBrowserSession;\n label?: string;\n url?: string;\n context?: Record<string, unknown>;\n actions: AgentNativeBrowserSessionAction[];\n connectedAt: number;\n ttlMs: number;\n} {\n const sessionRecord: Partial<AgentNativeBrowserSession> =\n input.session && typeof input.session === \"object\" ? input.session : {};\n const rawId = input.sessionId || sessionRecord.id;\n if (typeof rawId !== \"string\") {\n throw new Error(\"session.id is required\");\n }\n const sessionId = assertSafeId(rawId, \"session.id\");\n const now = nowMs();\n const connectedAt = coerceTime(sessionRecord.connectedAt) ?? now;\n const label =\n typeof input.label === \"string\" && input.label.trim()\n ? input.label.trim()\n : typeof sessionRecord.label === \"string\" && sessionRecord.label.trim()\n ? sessionRecord.label.trim()\n : undefined;\n const url =\n typeof input.url === \"string\" && input.url.trim()\n ? input.url.trim()\n : typeof sessionRecord.url === \"string\" && sessionRecord.url.trim()\n ? sessionRecord.url.trim()\n : undefined;\n const session: AgentNativeBrowserSession = {\n ...sessionRecord,\n id: sessionId,\n ...(label ? { label } : {}),\n connectedAt: new Date(connectedAt).toISOString(),\n ...(url ? { url } : {}),\n };\n return {\n sessionId,\n session,\n label,\n url,\n context:\n input.context &&\n typeof input.context === \"object\" &&\n !Array.isArray(input.context)\n ? input.context\n : undefined,\n actions: Array.isArray(input.actions) ? input.actions : [],\n connectedAt,\n ttlMs:\n typeof input.ttlMs === \"number\" && input.ttlMs > 0\n ? Math.min(input.ttlMs, 5 * 60 * 1000)\n : DEFAULT_BROWSER_SESSION_TTL_MS,\n };\n}\n\nfunction rowToSession(\n row: Record<string, unknown>,\n now = nowMs(),\n): AgentNativeBrowserSessionRecord {\n const sessionId = String(row.session_id ?? \"\");\n const expiresAt = Number(row.expires_at ?? 0);\n return {\n sessionId,\n session: parseSession(row.session_json, sessionId),\n label: typeof row.label === \"string\" ? row.label : undefined,\n url: typeof row.url === \"string\" ? row.url : undefined,\n context: parseOptionalObject(row.context_json),\n actions: parseActions(row.actions_json),\n connectedAt: Number(row.connected_at ?? 0),\n lastSeenAt: Number(row.last_seen_at ?? 0),\n expiresAt,\n active: expiresAt > now,\n };\n}\n\nfunction rowToRequest(\n row: Record<string, unknown>,\n): AgentNativeBrowserSessionRequest {\n const type = String(\n row.type ?? \"get-context\",\n ) as AgentNativeBrowserSessionRequestType;\n const payload = safeJsonParse<unknown>(row.payload_json, undefined);\n const result = safeJsonParse<unknown>(row.result_json, undefined);\n const request: AgentNativeBrowserSessionRequest = {\n id: String(row.request_id ?? \"\"),\n sessionId: String(row.session_id ?? \"\"),\n type,\n status: String(\n row.status ?? \"pending\",\n ) as AgentNativeBrowserSessionRequestStatus,\n createdAt: Number(row.created_at ?? 0),\n expiresAt: Number(row.expires_at ?? 0),\n ...(typeof row.name === \"string\" && row.name ? { name: row.name } : {}),\n ...(typeof row.command === \"string\" && row.command\n ? { command: row.command }\n : {}),\n ...(row.claimed_at != null ? { claimedAt: Number(row.claimed_at) } : {}),\n ...(row.completed_at != null\n ? { completedAt: Number(row.completed_at) }\n : {}),\n ...(row.error ? { error: String(row.error) } : {}),\n ...(row.result_json != null ? { result } : {}),\n };\n if (type === \"run-action\") request.args = payload;\n else request.payload = payload;\n return request;\n}\n\nasync function expireOldRequests(\n ownerEmail: string,\n sessionId?: string,\n): Promise<void> {\n await ensureTables();\n const client = getDbExec();\n const now = nowMs();\n await client.execute({\n sql: sessionId\n ? `UPDATE ${REQUEST_TABLE}\n SET status = 'expired', completed_at = ?, error = 'Browser-session request expired'\n WHERE owner_email = ? AND session_id = ? AND status IN ('pending', 'claimed') AND expires_at < ?`\n : `UPDATE ${REQUEST_TABLE}\n SET status = 'expired', completed_at = ?, error = 'Browser-session request expired'\n WHERE owner_email = ? AND status IN ('pending', 'claimed') AND expires_at < ?`,\n args: sessionId\n ? [now, ownerEmail, sessionId, now]\n : [now, ownerEmail, now],\n });\n}\n\nexport async function registerBrowserSession(\n ownerEmailInput: string,\n input: RegisterAgentNativeBrowserSessionInput,\n): Promise<AgentNativeBrowserSessionRecord> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const normalized = normalizeSessionInput(input);\n await ensureTables();\n const client = getDbExec();\n const now = nowMs();\n const expiresAt = now + normalized.ttlMs;\n\n await client.execute({\n sql: isPostgres()\n ? `INSERT INTO ${SESSION_TABLE}\n (owner_email, session_id, label, url, session_json, context_json, actions_json, connected_at, last_seen_at, expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (owner_email, session_id) DO UPDATE SET\n label = EXCLUDED.label,\n url = EXCLUDED.url,\n session_json = EXCLUDED.session_json,\n context_json = EXCLUDED.context_json,\n actions_json = EXCLUDED.actions_json,\n last_seen_at = EXCLUDED.last_seen_at,\n expires_at = EXCLUDED.expires_at`\n : `INSERT OR REPLACE INTO ${SESSION_TABLE}\n (owner_email, session_id, label, url, session_json, context_json, actions_json, connected_at, last_seen_at, expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n ownerEmail,\n normalized.sessionId,\n normalized.label ?? null,\n normalized.url ?? null,\n json(normalized.session),\n normalized.context ? json(normalized.context) : null,\n json(normalized.actions),\n normalized.connectedAt,\n now,\n expiresAt,\n ],\n });\n\n const saved = await getBrowserSession(ownerEmail, normalized.sessionId, {\n includeExpired: true,\n });\n if (!saved) throw new Error(\"Failed to register browser session\");\n return saved;\n}\n\nexport async function listBrowserSessions(\n ownerEmailInput: string,\n options: { includeExpired?: boolean; limit?: number } = {},\n): Promise<AgentNativeBrowserSessionRecord[]> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n await ensureTables();\n await expireOldRequests(ownerEmail);\n const client = getDbExec();\n const limit =\n typeof options.limit === \"number\" && options.limit > 0\n ? Math.min(Math.floor(options.limit), 100)\n : 25;\n const now = nowMs();\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${SESSION_TABLE}\n WHERE owner_email = ?\n ORDER BY last_seen_at DESC\n LIMIT ?`,\n args: [ownerEmail, limit],\n });\n const sessions = rows.map((row) => rowToSession(row, now));\n return options.includeExpired\n ? sessions\n : sessions.filter((session) => session.active);\n}\n\nexport async function getBrowserSession(\n ownerEmailInput: string,\n sessionIdInput: string,\n options: { includeExpired?: boolean } = {},\n): Promise<AgentNativeBrowserSessionRecord | null> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const sessionId = assertSafeId(sessionIdInput, \"sessionId\");\n await ensureTables();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${SESSION_TABLE} WHERE owner_email = ? AND session_id = ?`,\n args: [ownerEmail, sessionId],\n });\n if (rows.length === 0) return null;\n const session = rowToSession(rows[0]);\n return options.includeExpired || session.active ? session : null;\n}\n\nexport async function disconnectBrowserSession(\n ownerEmailInput: string,\n sessionIdInput: string,\n): Promise<boolean> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const sessionId = assertSafeId(sessionIdInput, \"sessionId\");\n await ensureTables();\n const client = getDbExec();\n await client.execute({\n sql: `UPDATE ${REQUEST_TABLE}\n SET status = 'expired', completed_at = ?, error = 'Browser session disconnected'\n WHERE owner_email = ? AND session_id = ? AND status IN ('pending', 'claimed')`,\n args: [nowMs(), ownerEmail, sessionId],\n });\n const result = await client.execute({\n sql: `DELETE FROM ${SESSION_TABLE} WHERE owner_email = ? AND session_id = ?`,\n args: [ownerEmail, sessionId],\n });\n return result.rowsAffected > 0;\n}\n\nfunction normalizeRequestInput(\n input: CreateAgentNativeBrowserSessionRequestInput,\n): {\n type: AgentNativeBrowserSessionRequestType;\n name?: string;\n command?: string;\n payload?: unknown;\n timeoutMs: number;\n} {\n if (\n input.type !== \"get-context\" &&\n input.type !== \"list-actions\" &&\n input.type !== \"run-action\" &&\n input.type !== \"command\"\n ) {\n throw new Error(\n \"request type must be get-context, list-actions, run-action, or command\",\n );\n }\n const name =\n typeof input.name === \"string\" && input.name.trim()\n ? input.name.trim()\n : undefined;\n if (input.type === \"run-action\" && !name) {\n throw new Error(\"name is required for run-action requests\");\n }\n const command =\n typeof input.command === \"string\" && input.command.trim()\n ? input.command.trim()\n : input.type === \"command\"\n ? \"refreshData\"\n : undefined;\n return {\n type: input.type,\n name,\n command,\n payload: input.type === \"run-action\" ? input.args : input.payload,\n timeoutMs:\n typeof input.timeoutMs === \"number\" && input.timeoutMs > 0\n ? Math.min(input.timeoutMs, 2 * 60 * 1000)\n : DEFAULT_BROWSER_SESSION_REQUEST_TIMEOUT_MS,\n };\n}\n\nexport async function createBrowserSessionRequest(\n ownerEmailInput: string,\n sessionIdInput: string,\n input: CreateAgentNativeBrowserSessionRequestInput,\n): Promise<AgentNativeBrowserSessionRequest> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const sessionId = assertSafeId(sessionIdInput, \"sessionId\");\n const session = await getBrowserSession(ownerEmail, sessionId);\n if (!session) {\n throw new Error(`No active browser session found for \"${sessionId}\"`);\n }\n const normalized = normalizeRequestInput(input);\n await ensureTables();\n const client = getDbExec();\n const createdAt = nowMs();\n const requestId = generateId(\"browser-request\");\n const expiresAt = createdAt + normalized.timeoutMs + 15_000;\n await client.execute({\n sql: isPostgres()\n ? `INSERT INTO ${REQUEST_TABLE}\n (owner_email, session_id, request_id, type, name, command, payload_json, status, created_at, expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, 'pending', ?, ?)\n ON CONFLICT (owner_email, request_id) DO NOTHING`\n : `INSERT OR IGNORE INTO ${REQUEST_TABLE}\n (owner_email, session_id, request_id, type, name, command, payload_json, status, created_at, expires_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, 'pending', ?, ?)`,\n args: [\n ownerEmail,\n sessionId,\n requestId,\n normalized.type,\n normalized.name ?? null,\n normalized.command ?? null,\n json(normalized.payload),\n createdAt,\n expiresAt,\n ],\n });\n const request = await getBrowserSessionRequest(ownerEmail, requestId);\n if (!request) throw new Error(\"Failed to create browser-session request\");\n return request;\n}\n\nexport async function getBrowserSessionRequest(\n ownerEmailInput: string,\n requestIdInput: string,\n): Promise<AgentNativeBrowserSessionRequest | null> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const requestId = assertSafeId(requestIdInput, \"requestId\");\n await ensureTables();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${REQUEST_TABLE} WHERE owner_email = ? AND request_id = ?`,\n args: [ownerEmail, requestId],\n });\n return rows.length ? rowToRequest(rows[0]) : null;\n}\n\nexport async function claimBrowserSessionRequest(\n ownerEmailInput: string,\n sessionIdInput: string,\n): Promise<AgentNativeBrowserSessionRequest | null> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const sessionId = assertSafeId(sessionIdInput, \"sessionId\");\n await ensureTables();\n await expireOldRequests(ownerEmail, sessionId);\n const client = getDbExec();\n const now = nowMs();\n\n for (let attempt = 0; attempt < 3; attempt++) {\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${REQUEST_TABLE}\n WHERE owner_email = ? AND session_id = ? AND status = 'pending' AND expires_at >= ?\n ORDER BY created_at ASC\n LIMIT 1`,\n args: [ownerEmail, sessionId, now],\n });\n if (rows.length === 0) return null;\n const candidate = rowToRequest(rows[0]);\n const updated = await client.execute({\n sql: `UPDATE ${REQUEST_TABLE}\n SET status = 'claimed', claimed_at = ?\n WHERE owner_email = ? AND request_id = ? AND status = 'pending'`,\n args: [now, ownerEmail, candidate.id],\n });\n if (updated.rowsAffected > 0) {\n return getBrowserSessionRequest(ownerEmail, candidate.id);\n }\n }\n return null;\n}\n\nexport async function completeBrowserSessionRequest(\n ownerEmailInput: string,\n sessionIdInput: string,\n requestIdInput: string,\n result:\n | { ok: true; result?: unknown }\n | { ok: false; error?: string; result?: unknown },\n): Promise<AgentNativeBrowserSessionRequest> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const sessionId = assertSafeId(sessionIdInput, \"sessionId\");\n const requestId = assertSafeId(requestIdInput, \"requestId\");\n await ensureTables();\n const client = getDbExec();\n const completedAt = nowMs();\n const status: AgentNativeBrowserSessionRequestStatus =\n result.ok === true ? \"completed\" : \"failed\";\n const error =\n result.ok === false\n ? result.error || \"Browser-session request failed\"\n : null;\n const updated = await client.execute({\n sql: `UPDATE ${REQUEST_TABLE}\n SET status = ?, completed_at = ?, result_json = ?, error = ?\n WHERE owner_email = ? AND session_id = ? AND request_id = ? AND status IN ('pending', 'claimed')`,\n args: [\n status,\n completedAt,\n \"result\" in result ? json(result.result) : null,\n error,\n ownerEmail,\n sessionId,\n requestId,\n ],\n });\n if (updated.rowsAffected === 0) {\n const existing = await getBrowserSessionRequest(ownerEmail, requestId);\n if (existing) return existing;\n throw new Error(`No browser-session request found for \"${requestId}\"`);\n }\n const request = await getBrowserSessionRequest(ownerEmail, requestId);\n if (!request)\n throw new Error(`No browser-session request found for \"${requestId}\"`);\n return request;\n}\n\nexport async function waitForBrowserSessionRequest(\n ownerEmailInput: string,\n requestIdInput: string,\n options: { timeoutMs?: number; pollMs?: number } = {},\n): Promise<unknown> {\n const ownerEmail = assertOwnerEmail(ownerEmailInput);\n const requestId = assertSafeId(requestIdInput, \"requestId\");\n const timeoutMs =\n typeof options.timeoutMs === \"number\" && options.timeoutMs > 0\n ? options.timeoutMs\n : DEFAULT_BROWSER_SESSION_REQUEST_TIMEOUT_MS;\n const pollMs =\n typeof options.pollMs === \"number\" && options.pollMs > 0\n ? options.pollMs\n : DEFAULT_BROWSER_SESSION_REQUEST_POLL_MS;\n const deadline = nowMs() + timeoutMs;\n\n while (nowMs() <= deadline) {\n const request = await getBrowserSessionRequest(ownerEmail, requestId);\n if (!request)\n throw new Error(`No browser-session request found for \"${requestId}\"`);\n if (request.status === \"completed\") return request.result;\n if (request.status === \"failed\") {\n throw new Error(request.error || \"Browser-session request failed\");\n }\n if (request.status === \"expired\" || request.expiresAt < nowMs()) {\n await expireOldRequests(ownerEmail, request.sessionId);\n throw new Error(request.error || \"Browser-session request expired\");\n }\n await sleep(Math.min(pollMs, Math.max(1, deadline - nowMs())));\n }\n\n const request = await getBrowserSessionRequest(ownerEmail, requestId);\n if (request) {\n await completeBrowserSessionRequest(\n ownerEmail,\n request.sessionId,\n requestId,\n {\n ok: false,\n error: \"Timed out waiting for browser-session response\",\n },\n );\n }\n throw new Error(\"Timed out waiting for browser-session response\");\n}\n\nexport async function callBrowserSession(\n ownerEmailInput: string,\n sessionIdInput: string,\n input: CreateAgentNativeBrowserSessionRequestInput,\n options: { timeoutMs?: number; pollMs?: number } = {},\n): Promise<unknown> {\n const request = await createBrowserSessionRequest(\n ownerEmailInput,\n sessionIdInput,\n {\n ...input,\n timeoutMs: input.timeoutMs ?? options.timeoutMs,\n },\n );\n return waitForBrowserSessionRequest(ownerEmailInput, request.id, {\n timeoutMs: options.timeoutMs ?? input.timeoutMs,\n pollMs: options.pollMs,\n });\n}\n"]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export type AgentNativeBrowserSessionRequestType = "get-context" | "list-actions" | "run-action" | "command";
|
|
2
|
+
export type AgentNativeBrowserSessionRequestStatus = "pending" | "claimed" | "completed" | "failed" | "expired";
|
|
3
|
+
export type AgentNativeBrowserSessionJsonObject = Record<string, unknown>;
|
|
4
|
+
export interface AgentNativeBrowserSessionAction {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
schema?: AgentNativeBrowserSessionJsonObject;
|
|
8
|
+
parameters?: AgentNativeBrowserSessionJsonObject;
|
|
9
|
+
source?: string;
|
|
10
|
+
availability?: string;
|
|
11
|
+
destructive?: boolean;
|
|
12
|
+
requiresApproval?: boolean | AgentNativeBrowserSessionJsonObject;
|
|
13
|
+
approval?: AgentNativeBrowserSessionJsonObject;
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface AgentNativeBrowserSession {
|
|
17
|
+
id: string;
|
|
18
|
+
label?: string;
|
|
19
|
+
connectedAt?: string;
|
|
20
|
+
url?: string;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
export interface AgentNativeBrowserSessionRecord {
|
|
24
|
+
sessionId: string;
|
|
25
|
+
session: AgentNativeBrowserSession;
|
|
26
|
+
label?: string;
|
|
27
|
+
url?: string;
|
|
28
|
+
context?: AgentNativeBrowserSessionJsonObject;
|
|
29
|
+
actions: AgentNativeBrowserSessionAction[];
|
|
30
|
+
connectedAt: number;
|
|
31
|
+
lastSeenAt: number;
|
|
32
|
+
expiresAt: number;
|
|
33
|
+
active: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface AgentNativeBrowserSessionRequest {
|
|
36
|
+
id: string;
|
|
37
|
+
sessionId: string;
|
|
38
|
+
type: AgentNativeBrowserSessionRequestType;
|
|
39
|
+
name?: string;
|
|
40
|
+
command?: string;
|
|
41
|
+
args?: unknown;
|
|
42
|
+
payload?: unknown;
|
|
43
|
+
status: AgentNativeBrowserSessionRequestStatus;
|
|
44
|
+
createdAt: number;
|
|
45
|
+
claimedAt?: number;
|
|
46
|
+
completedAt?: number;
|
|
47
|
+
expiresAt: number;
|
|
48
|
+
result?: unknown;
|
|
49
|
+
error?: string;
|
|
50
|
+
}
|
|
51
|
+
export interface RegisterAgentNativeBrowserSessionInput {
|
|
52
|
+
session?: AgentNativeBrowserSession;
|
|
53
|
+
sessionId?: string;
|
|
54
|
+
label?: string;
|
|
55
|
+
url?: string;
|
|
56
|
+
context?: AgentNativeBrowserSessionJsonObject;
|
|
57
|
+
actions?: AgentNativeBrowserSessionAction[];
|
|
58
|
+
ttlMs?: number;
|
|
59
|
+
}
|
|
60
|
+
export interface CreateAgentNativeBrowserSessionRequestInput {
|
|
61
|
+
type: AgentNativeBrowserSessionRequestType;
|
|
62
|
+
name?: string;
|
|
63
|
+
command?: string;
|
|
64
|
+
args?: unknown;
|
|
65
|
+
payload?: unknown;
|
|
66
|
+
timeoutMs?: number;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/browser-sessions/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oCAAoC,GAC5C,aAAa,GACb,cAAc,GACd,YAAY,GACZ,SAAS,CAAC;AAEd,MAAM,MAAM,sCAAsC,GAC9C,SAAS,GACT,SAAS,GACT,WAAW,GACX,QAAQ,GACR,SAAS,CAAC;AAEd,MAAM,MAAM,mCAAmC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1E,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,mCAAmC,CAAC;IAC7C,UAAU,CAAC,EAAE,mCAAmC,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,GAAG,mCAAmC,CAAC;IACjE,QAAQ,CAAC,EAAE,mCAAmC,CAAC;IAC/C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,+BAA+B;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,yBAAyB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,mCAAmC,CAAC;IAC9C,OAAO,EAAE,+BAA+B,EAAE,CAAC;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gCAAgC;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,oCAAoC,CAAC;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,sCAAsC,CAAC;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sCAAsC;IACrD,OAAO,CAAC,EAAE,yBAAyB,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,mCAAmC,CAAC;IAC9C,OAAO,CAAC,EAAE,+BAA+B,EAAE,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2CAA2C;IAC1D,IAAI,EAAE,oCAAoC,CAAC;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|