@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/composer/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;IAChC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,cAAc,CAAC;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,KAAK,GAAG,YAAY,GAAG,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/composer/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;IAChC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,cAAc,CAAC;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,KAAK,GAAG,YAAY,GAAG,WAAW,CAAC;AAExE,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/client/composer/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface FileResult {\n path: string;\n name: string;\n source: \"codebase\" | \"resource\";\n type: \"file\" | \"folder\";\n}\n\nexport interface SkillResult {\n name: string;\n description: string;\n path: string;\n source: \"codebase\" | \"resource\";\n}\n\nexport interface MentionItem {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n source: string;\n refType: string;\n refPath?: string;\n refId?: string;\n section?: string;\n}\n\nexport interface Reference {\n type: \"file\" | \"skill\" | \"mention\" | \"agent\" | \"custom-agent\";\n path: string;\n name: string;\n source: string;\n refType?: string;\n refId?: string;\n}\n\nexport interface SlashCommand {\n name: string;\n description: string;\n icon?: string;\n}\n\nexport type ComposerMode = \"skill\" | \"job\" | \"automation\" | \"extension\";\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/client/composer/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface FileResult {\n path: string;\n name: string;\n source: \"codebase\" | \"resource\";\n type: \"file\" | \"folder\";\n}\n\nexport interface SkillResult {\n name: string;\n description: string;\n path: string;\n source: \"codebase\" | \"resource\";\n}\n\nexport interface MentionItem {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n source: string;\n refType: string;\n refPath?: string;\n refId?: string;\n section?: string;\n}\n\nexport interface Reference {\n type: \"file\" | \"skill\" | \"mention\" | \"agent\" | \"custom-agent\";\n path: string;\n name: string;\n source: string;\n refType?: string;\n refId?: string;\n}\n\nexport interface SlashCommand {\n name: string;\n description: string;\n icon?: string;\n}\n\nexport type ComposerMode = \"skill\" | \"job\" | \"automation\" | \"extension\";\n\nexport type AgentComposerLayoutVariant = \"default\" | \"compact\" | \"hero\";\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import React, { type CSSProperties, type IframeHTMLAttributes } from "react";
|
|
2
|
+
import { type AgentNativeClientActions, type AgentNativeHostAuth, type AgentNativeHostBridge, type AgentNativeHostBridgeEvent, type AgentNativeHostCommandHandlers, type AgentNativeHostContextGetter, type AgentNativeHostSession } from "../host-bridge.js";
|
|
3
|
+
import { type AgentNativeExtensionDefinition, type AgentNativeExtensionStorage, type AgentNativeExtensionStorageContext, type AgentNativeExtensionStorageOptions, type AgentNativeExtensionStorageScope } from "./portable-extension.js";
|
|
4
|
+
export type AgentNativeExtensionPermissionList = readonly string[] | ((extension: AgentNativeExtensionDefinition) => readonly string[] | undefined) | undefined;
|
|
5
|
+
export type AgentNativeExtensionStorageScopeList = readonly AgentNativeExtensionStorageScope[] | ((extension: AgentNativeExtensionDefinition) => readonly AgentNativeExtensionStorageScope[] | undefined) | undefined;
|
|
6
|
+
export interface AgentNativeExtensionFrameProps extends Omit<IframeHTMLAttributes<HTMLIFrameElement>, "src" | "srcDoc"> {
|
|
7
|
+
extension: AgentNativeExtensionDefinition;
|
|
8
|
+
/** Stable slot identifier, for example `customer-detail.sidebar`. */
|
|
9
|
+
slotId?: string;
|
|
10
|
+
/** Context pushed into `window.slotContext` and merged into host context. */
|
|
11
|
+
context?: Record<string, unknown> | null;
|
|
12
|
+
/** Live actions exposed to the extension through `appAction()` and `agentNative.action()`. */
|
|
13
|
+
actions?: AgentNativeClientActions;
|
|
14
|
+
/** Page/app context exposed through `agentNative.context()`. */
|
|
15
|
+
getContext?: AgentNativeHostContextGetter;
|
|
16
|
+
/** Host commands exposed through `agentNative.command()` and `agentNative.refresh()`. */
|
|
17
|
+
commands?: AgentNativeHostCommandHandlers;
|
|
18
|
+
/** Host-enforced action allowlist. Defaults to extension manifest requestedActions. */
|
|
19
|
+
allowedActions?: AgentNativeExtensionPermissionList;
|
|
20
|
+
/** Host-enforced command allowlist. Defaults to extension manifest requestedCommands. */
|
|
21
|
+
allowedCommands?: AgentNativeExtensionPermissionList;
|
|
22
|
+
auth?: AgentNativeHostAuth;
|
|
23
|
+
session?: string | Partial<AgentNativeHostSession>;
|
|
24
|
+
/** Storage adapter used by `extensionData.*`. Defaults to browser localStorage. */
|
|
25
|
+
storage?: AgentNativeExtensionStorage | false;
|
|
26
|
+
/** Host-enforced storage scope allowlist. Defaults to extension manifest storageScopes. */
|
|
27
|
+
allowedStorageScopes?: AgentNativeExtensionStorageScopeList;
|
|
28
|
+
storageNamespace?: string;
|
|
29
|
+
storageContext?: Omit<AgentNativeExtensionStorageContext, "extensionId" | "slotId">;
|
|
30
|
+
themeCss?: string;
|
|
31
|
+
isDark?: boolean;
|
|
32
|
+
autoHeight?: boolean;
|
|
33
|
+
initialHeight?: number;
|
|
34
|
+
onBridgeEvent?: (event: AgentNativeHostBridgeEvent) => void;
|
|
35
|
+
onBridgeReady?: (bridge: AgentNativeHostBridge) => void;
|
|
36
|
+
onStorageError?: (error: Error, request: AgentNativeExtensionStorageRequest) => void;
|
|
37
|
+
}
|
|
38
|
+
export interface AgentNativeExtensionSlotProps extends Omit<AgentNativeExtensionFrameProps, "extension" | "className" | "style" | "children"> {
|
|
39
|
+
id: string;
|
|
40
|
+
extensions: AgentNativeExtensionDefinition[];
|
|
41
|
+
className?: string;
|
|
42
|
+
extensionClassName?: string;
|
|
43
|
+
extensionStyle?: CSSProperties;
|
|
44
|
+
empty?: React.ReactNode;
|
|
45
|
+
showEmptyAffordance?: boolean;
|
|
46
|
+
}
|
|
47
|
+
interface AgentNativeExtensionStorageRequest {
|
|
48
|
+
requestId: string;
|
|
49
|
+
op: "list" | "get" | "set" | "remove";
|
|
50
|
+
collection: string;
|
|
51
|
+
id?: string;
|
|
52
|
+
data?: unknown;
|
|
53
|
+
options?: AgentNativeExtensionStorageOptions;
|
|
54
|
+
}
|
|
55
|
+
export declare const AgentNativeExtensionFrame: React.ForwardRefExoticComponent<AgentNativeExtensionFrameProps & React.RefAttributes<HTMLIFrameElement>>;
|
|
56
|
+
export declare function AgentNativeExtensionSlot({ id, extensions, context, actions, getContext, commands, allowedActions, allowedCommands, auth, session, storage, allowedStorageScopes, storageNamespace, storageContext, themeCss, isDark, autoHeight, initialHeight, onBridgeEvent, onBridgeReady, onStorageError, className, extensionClassName, extensionStyle, empty, showEmptyAffordance, ...iframeProps }: AgentNativeExtensionSlotProps): import("react/jsx-runtime").JSX.Element;
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=AgentNativeExtensionFrame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentNativeExtensionFrame.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/AgentNativeExtensionFrame.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentNativeExtensionFrame.e2e-host.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/AgentNativeExtensionFrame.e2e-host.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createRoot } from "react-dom/client";
|
|
3
|
+
import { defineClientAction } from "../client-action.js";
|
|
4
|
+
import { AgentNativeExtensionSlot } from "./AgentNativeExtensionFrame.js";
|
|
5
|
+
const extensionContent = `
|
|
6
|
+
<div id="status">pending</div>
|
|
7
|
+
<pre id="results"></pre>
|
|
8
|
+
<script>
|
|
9
|
+
(async function() {
|
|
10
|
+
const result = {};
|
|
11
|
+
async function capture(name, fn) {
|
|
12
|
+
try {
|
|
13
|
+
result[name] = { ok: true, value: await fn() };
|
|
14
|
+
} catch (error) {
|
|
15
|
+
result[name] = {
|
|
16
|
+
ok: false,
|
|
17
|
+
error: error && error.message ? error.message : String(error),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
await capture('context', () => agentNative.context());
|
|
23
|
+
await capture('actions', () => agentNative.listActions());
|
|
24
|
+
await capture('allowedAction', () => appAction('allowed-action', { value: 3 }));
|
|
25
|
+
await capture('blockedAction', () => appAction('blocked-action', {}));
|
|
26
|
+
await capture('allowedCommand', () =>
|
|
27
|
+
agentNative.command('refreshData', { customerId: slotContext.customerId })
|
|
28
|
+
);
|
|
29
|
+
await capture('blockedCommand', () => agentNative.command('hardReload', {}));
|
|
30
|
+
await capture('storageSet', () =>
|
|
31
|
+
extensionData.set('notes', 'note-1', { text: 'Saved note' }, { scope: 'user' })
|
|
32
|
+
);
|
|
33
|
+
await capture('storageGet', () =>
|
|
34
|
+
extensionData.get('notes', 'note-1', { scope: 'user' })
|
|
35
|
+
);
|
|
36
|
+
await capture('blockedStorageScope', () =>
|
|
37
|
+
extensionData.set('notes', 'note-2', { text: 'Org note' }, { scope: 'org' })
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
result.done = true;
|
|
41
|
+
document.getElementById('status').textContent = 'done';
|
|
42
|
+
document.getElementById('results').textContent = JSON.stringify(result);
|
|
43
|
+
window.parent.postMessage({ type: 'extension-e2e.done', result }, '*');
|
|
44
|
+
})();
|
|
45
|
+
</script>
|
|
46
|
+
`;
|
|
47
|
+
const hostWindow = window;
|
|
48
|
+
const extension = {
|
|
49
|
+
id: "allowed-extension",
|
|
50
|
+
name: "Allowed extension",
|
|
51
|
+
content: extensionContent,
|
|
52
|
+
manifest: {
|
|
53
|
+
slots: ["crm.customer.sidebar"],
|
|
54
|
+
requestedActions: ["allowed-action"],
|
|
55
|
+
requestedCommands: ["refreshData"],
|
|
56
|
+
storageScopes: ["user"],
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
const wrongSlotExtension = {
|
|
60
|
+
id: "wrong-slot-extension",
|
|
61
|
+
name: "Wrong slot extension",
|
|
62
|
+
content: "<div>should not render</div>",
|
|
63
|
+
manifest: { slots: ["crm.billing.sidebar"] },
|
|
64
|
+
};
|
|
65
|
+
hostWindow.__extensionE2ECommands = [];
|
|
66
|
+
window.addEventListener("message", (event) => {
|
|
67
|
+
if (event.data?.type !== "extension-e2e.done")
|
|
68
|
+
return;
|
|
69
|
+
hostWindow.__extensionE2EResult = event.data.result;
|
|
70
|
+
const results = document.getElementById("host-results");
|
|
71
|
+
if (results)
|
|
72
|
+
results.textContent = JSON.stringify(event.data.result);
|
|
73
|
+
});
|
|
74
|
+
const actions = [
|
|
75
|
+
defineClientAction({
|
|
76
|
+
name: "allowed-action",
|
|
77
|
+
description: "Allowed test action",
|
|
78
|
+
schema: {
|
|
79
|
+
type: "object",
|
|
80
|
+
properties: { value: { type: "number" } },
|
|
81
|
+
required: ["value"],
|
|
82
|
+
},
|
|
83
|
+
run: async (args) => ({ doubled: args.value * 2 }),
|
|
84
|
+
}),
|
|
85
|
+
defineClientAction({
|
|
86
|
+
name: "blocked-action",
|
|
87
|
+
description: "Blocked test action",
|
|
88
|
+
schema: { type: "object", properties: {} },
|
|
89
|
+
run: async () => ({ shouldNotRun: true }),
|
|
90
|
+
}),
|
|
91
|
+
];
|
|
92
|
+
function Host() {
|
|
93
|
+
return (_jsxs("main", { children: [_jsx("div", { id: "command-count", children: hostWindow.__extensionE2ECommands?.length }), _jsx("div", { id: "host-results" }), _jsx(AgentNativeExtensionSlot, { id: "crm.customer.sidebar", extensions: [extension, wrongSlotExtension], context: { customerId: "customer-1" }, actions: actions, getContext: () => ({
|
|
94
|
+
resource: { type: "customer", id: "customer-1", name: "Ada Co" },
|
|
95
|
+
}), commands: {
|
|
96
|
+
refreshData: async ({ payload }) => {
|
|
97
|
+
hostWindow.__extensionE2ECommands?.push({
|
|
98
|
+
command: "refreshData",
|
|
99
|
+
payload,
|
|
100
|
+
});
|
|
101
|
+
const count = document.getElementById("command-count");
|
|
102
|
+
if (count) {
|
|
103
|
+
count.textContent = String(hostWindow.__extensionE2ECommands?.length ?? 0);
|
|
104
|
+
}
|
|
105
|
+
return { refreshed: true, payload };
|
|
106
|
+
},
|
|
107
|
+
} })] }));
|
|
108
|
+
}
|
|
109
|
+
createRoot(document.getElementById("root")).render(_jsx(Host, {}));
|
|
110
|
+
//# sourceMappingURL=AgentNativeExtensionFrame.e2e-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentNativeExtensionFrame.e2e-host.js","sourceRoot":"","sources":["../../../src/client/extensions/AgentNativeExtensionFrame.e2e-host.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { defineClientAction } from \"../client-action.js\";\nimport { AgentNativeExtensionSlot } from \"./AgentNativeExtensionFrame.js\";\n\nconst extensionContent = `\n<div id=\"status\">pending</div>\n<pre id=\"results\"></pre>\n<script>\n (async function() {\n const result = {};\n async function capture(name, fn) {\n try {\n result[name] = { ok: true, value: await fn() };\n } catch (error) {\n result[name] = {\n ok: false,\n error: error && error.message ? error.message : String(error),\n };\n }\n }\n\n await capture('context', () => agentNative.context());\n await capture('actions', () => agentNative.listActions());\n await capture('allowedAction', () => appAction('allowed-action', { value: 3 }));\n await capture('blockedAction', () => appAction('blocked-action', {}));\n await capture('allowedCommand', () =>\n agentNative.command('refreshData', { customerId: slotContext.customerId })\n );\n await capture('blockedCommand', () => agentNative.command('hardReload', {}));\n await capture('storageSet', () =>\n extensionData.set('notes', 'note-1', { text: 'Saved note' }, { scope: 'user' })\n );\n await capture('storageGet', () =>\n extensionData.get('notes', 'note-1', { scope: 'user' })\n );\n await capture('blockedStorageScope', () =>\n extensionData.set('notes', 'note-2', { text: 'Org note' }, { scope: 'org' })\n );\n\n result.done = true;\n document.getElementById('status').textContent = 'done';\n document.getElementById('results').textContent = JSON.stringify(result);\n window.parent.postMessage({ type: 'extension-e2e.done', result }, '*');\n })();\n</script>\n`;\n\ninterface ExtensionE2EWindow {\n __extensionE2EResult?: unknown;\n __extensionE2ECommands?: Array<{ command: string; payload: unknown }>;\n}\n\nconst hostWindow = window as Window & ExtensionE2EWindow;\n\nconst extension = {\n id: \"allowed-extension\",\n name: \"Allowed extension\",\n content: extensionContent,\n manifest: {\n slots: [\"crm.customer.sidebar\"],\n requestedActions: [\"allowed-action\"],\n requestedCommands: [\"refreshData\"],\n storageScopes: [\"user\"],\n },\n};\n\nconst wrongSlotExtension = {\n id: \"wrong-slot-extension\",\n name: \"Wrong slot extension\",\n content: \"<div>should not render</div>\",\n manifest: { slots: [\"crm.billing.sidebar\"] },\n};\n\nhostWindow.__extensionE2ECommands = [];\nwindow.addEventListener(\"message\", (event) => {\n if (event.data?.type !== \"extension-e2e.done\") return;\n hostWindow.__extensionE2EResult = event.data.result;\n const results = document.getElementById(\"host-results\");\n if (results) results.textContent = JSON.stringify(event.data.result);\n});\n\nconst actions = [\n defineClientAction<{ value: number }, { doubled: number }>({\n name: \"allowed-action\",\n description: \"Allowed test action\",\n schema: {\n type: \"object\",\n properties: { value: { type: \"number\" } },\n required: [\"value\"],\n },\n run: async (args) => ({ doubled: args.value * 2 }),\n }),\n defineClientAction<Record<string, never>, { shouldNotRun: true }>({\n name: \"blocked-action\",\n description: \"Blocked test action\",\n schema: { type: \"object\", properties: {} },\n run: async () => ({ shouldNotRun: true }),\n }),\n];\n\nfunction Host() {\n return (\n <main>\n <div id=\"command-count\">{hostWindow.__extensionE2ECommands?.length}</div>\n <div id=\"host-results\"></div>\n <AgentNativeExtensionSlot\n id=\"crm.customer.sidebar\"\n extensions={[extension, wrongSlotExtension]}\n context={{ customerId: \"customer-1\" }}\n actions={actions}\n getContext={() => ({\n resource: { type: \"customer\", id: \"customer-1\", name: \"Ada Co\" },\n })}\n commands={{\n refreshData: async ({ payload }) => {\n hostWindow.__extensionE2ECommands?.push({\n command: \"refreshData\",\n payload,\n });\n const count = document.getElementById(\"command-count\");\n if (count) {\n count.textContent = String(\n hostWindow.__extensionE2ECommands?.length ?? 0,\n );\n }\n return { refreshed: true, payload };\n },\n }}\n />\n </main>\n );\n}\n\ncreateRoot(document.getElementById(\"root\") as HTMLElement).render(<Host />);\n"]}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createElement as _createElement } from "react";
|
|
3
|
+
import { forwardRef, useCallback, useEffect, useMemo, useRef, useState, } from "react";
|
|
4
|
+
import { createAgentNativeHostBridge, } from "../host-bridge.js";
|
|
5
|
+
import { AGENT_NATIVE_EXTENSION_MESSAGE_TYPES, buildAgentNativeExtensionHtml, createLocalStorageAgentNativeExtensionStorage, getAgentNativeExtensionManifest, isAgentNativeExtensionAllowedInSlot, normalizeAgentNativeExtensionSandbox, } from "./portable-extension.js";
|
|
6
|
+
const defaultFrameStyle = {
|
|
7
|
+
border: 0,
|
|
8
|
+
display: "block",
|
|
9
|
+
width: "100%",
|
|
10
|
+
};
|
|
11
|
+
const BUILT_IN_COMMAND_NAMES = [
|
|
12
|
+
"navigate",
|
|
13
|
+
"refreshData",
|
|
14
|
+
"refresh-data",
|
|
15
|
+
"remountView",
|
|
16
|
+
"remount-view",
|
|
17
|
+
"hardReload",
|
|
18
|
+
"hard-reload",
|
|
19
|
+
"openResource",
|
|
20
|
+
"open-resource",
|
|
21
|
+
"requestApproval",
|
|
22
|
+
"request-approval",
|
|
23
|
+
];
|
|
24
|
+
const COMMAND_ALIASES = {
|
|
25
|
+
refreshData: ["refreshData", "refresh-data"],
|
|
26
|
+
"refresh-data": ["refreshData", "refresh-data"],
|
|
27
|
+
remountView: ["remountView", "remount-view"],
|
|
28
|
+
"remount-view": ["remountView", "remount-view"],
|
|
29
|
+
hardReload: ["hardReload", "hard-reload"],
|
|
30
|
+
"hard-reload": ["hardReload", "hard-reload"],
|
|
31
|
+
openResource: ["openResource", "open-resource"],
|
|
32
|
+
"open-resource": ["openResource", "open-resource"],
|
|
33
|
+
requestApproval: ["requestApproval", "request-approval"],
|
|
34
|
+
"request-approval": ["requestApproval", "request-approval"],
|
|
35
|
+
};
|
|
36
|
+
function setForwardedRef(ref, value) {
|
|
37
|
+
if (typeof ref === "function")
|
|
38
|
+
ref(value);
|
|
39
|
+
else if (ref)
|
|
40
|
+
ref.current = value;
|
|
41
|
+
}
|
|
42
|
+
function isRecord(value) {
|
|
43
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
44
|
+
}
|
|
45
|
+
function safeError(error) {
|
|
46
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
47
|
+
}
|
|
48
|
+
function safeStringify(value) {
|
|
49
|
+
try {
|
|
50
|
+
return JSON.stringify(value ?? {});
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return "{}";
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function resolvePermissionList(value, extension, fallback) {
|
|
57
|
+
if (typeof value === "function")
|
|
58
|
+
return value(extension);
|
|
59
|
+
if (Array.isArray(value))
|
|
60
|
+
return value;
|
|
61
|
+
return fallback;
|
|
62
|
+
}
|
|
63
|
+
function resolveStorageScopeList(value, extension, fallback) {
|
|
64
|
+
if (typeof value === "function")
|
|
65
|
+
return value(extension);
|
|
66
|
+
if (Array.isArray(value))
|
|
67
|
+
return value;
|
|
68
|
+
return fallback;
|
|
69
|
+
}
|
|
70
|
+
function toPermissionSet(value) {
|
|
71
|
+
return value ? new Set(value) : null;
|
|
72
|
+
}
|
|
73
|
+
function commandPermissionSet(value) {
|
|
74
|
+
if (!value)
|
|
75
|
+
return null;
|
|
76
|
+
const expanded = new Set();
|
|
77
|
+
for (const command of value) {
|
|
78
|
+
expanded.add(command);
|
|
79
|
+
for (const alias of COMMAND_ALIASES[command] ?? [])
|
|
80
|
+
expanded.add(alias);
|
|
81
|
+
}
|
|
82
|
+
return expanded;
|
|
83
|
+
}
|
|
84
|
+
async function resolveActions(actions) {
|
|
85
|
+
const resolved = typeof actions === "function" ? await actions() : actions;
|
|
86
|
+
return Array.isArray(resolved) ? resolved : [];
|
|
87
|
+
}
|
|
88
|
+
function scopeExtensionActions(actions, allowedNames) {
|
|
89
|
+
if (!actions || !allowedNames)
|
|
90
|
+
return actions;
|
|
91
|
+
return async () => (await resolveActions(actions)).filter((action) => allowedNames.has(action.name));
|
|
92
|
+
}
|
|
93
|
+
function blockedCommand(command) {
|
|
94
|
+
return () => {
|
|
95
|
+
throw new Error(`Extension is not allowed to call host command "${command}"`);
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function scopeExtensionCommands(commands, allowedNames) {
|
|
99
|
+
if (!allowedNames)
|
|
100
|
+
return commands;
|
|
101
|
+
const scoped = {};
|
|
102
|
+
for (const command of BUILT_IN_COMMAND_NAMES) {
|
|
103
|
+
if (!allowedNames.has(command))
|
|
104
|
+
scoped[command] = blockedCommand(command);
|
|
105
|
+
}
|
|
106
|
+
for (const [command, handler] of Object.entries(commands ?? {})) {
|
|
107
|
+
scoped[command] = allowedNames.has(command)
|
|
108
|
+
? handler
|
|
109
|
+
: blockedCommand(command);
|
|
110
|
+
}
|
|
111
|
+
return scoped;
|
|
112
|
+
}
|
|
113
|
+
function normalizeStorageRequest(value) {
|
|
114
|
+
if (!isRecord(value))
|
|
115
|
+
return null;
|
|
116
|
+
const requestId = typeof value.requestId === "string" ? value.requestId : "";
|
|
117
|
+
const op = value.op === "list" ||
|
|
118
|
+
value.op === "get" ||
|
|
119
|
+
value.op === "set" ||
|
|
120
|
+
value.op === "remove"
|
|
121
|
+
? value.op
|
|
122
|
+
: null;
|
|
123
|
+
const collection = typeof value.collection === "string" ? value.collection.trim() : "";
|
|
124
|
+
const id = typeof value.id === "string" ? value.id : undefined;
|
|
125
|
+
const options = isRecord(value.options)
|
|
126
|
+
? value.options
|
|
127
|
+
: undefined;
|
|
128
|
+
if (!requestId || !op || !collection)
|
|
129
|
+
return null;
|
|
130
|
+
if ((op === "get" || op === "set" || op === "remove") && !id) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
requestId,
|
|
135
|
+
op,
|
|
136
|
+
collection,
|
|
137
|
+
id,
|
|
138
|
+
data: value.data,
|
|
139
|
+
options,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function mergeExtensionContext(base, extension, slotId, slotContext) {
|
|
143
|
+
return {
|
|
144
|
+
...(base ?? {}),
|
|
145
|
+
extension: {
|
|
146
|
+
id: extension.id,
|
|
147
|
+
name: extension.name,
|
|
148
|
+
description: extension.description,
|
|
149
|
+
},
|
|
150
|
+
slot: slotId
|
|
151
|
+
? {
|
|
152
|
+
id: slotId,
|
|
153
|
+
context: slotContext ?? {},
|
|
154
|
+
}
|
|
155
|
+
: undefined,
|
|
156
|
+
data: {
|
|
157
|
+
...(base?.data ?? {}),
|
|
158
|
+
extension: {
|
|
159
|
+
id: extension.id,
|
|
160
|
+
name: extension.name,
|
|
161
|
+
},
|
|
162
|
+
slotContext: slotContext ?? {},
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export const AgentNativeExtensionFrame = forwardRef(function AgentNativeExtensionFrame({ extension, slotId, context, actions, getContext, commands, allowedActions, allowedCommands, auth, session, storage, allowedStorageScopes, storageNamespace = "default", storageContext, themeCss, isDark, autoHeight = true, initialHeight = 120, onBridgeEvent, onBridgeReady, onStorageError, title, sandbox, allow = "clipboard-read; clipboard-write", referrerPolicy = "no-referrer", style, onLoad, ...iframeProps }, forwardedRef) {
|
|
167
|
+
const iframeRef = useRef(null);
|
|
168
|
+
const bridgeRef = useRef(null);
|
|
169
|
+
const [height, setHeight] = useState(initialHeight);
|
|
170
|
+
const localStorageAdapter = useMemo(() => createLocalStorageAgentNativeExtensionStorage(storageNamespace), [storageNamespace]);
|
|
171
|
+
const storageAdapter = storage === undefined ? localStorageAdapter : storage;
|
|
172
|
+
const contextJson = safeStringify(context);
|
|
173
|
+
const sandboxValue = useMemo(() => normalizeAgentNativeExtensionSandbox(sandbox), [sandbox]);
|
|
174
|
+
const sessionValue = session ?? `extension:${extension.id}:${slotId ?? "standalone"}`;
|
|
175
|
+
const manifest = useMemo(() => getAgentNativeExtensionManifest(extension), [extension]);
|
|
176
|
+
const actionAllowlist = useMemo(() => toPermissionSet(resolvePermissionList(allowedActions, extension, manifest.requestedActions)), [allowedActions, extension, manifest.requestedActions]);
|
|
177
|
+
const commandAllowlist = useMemo(() => commandPermissionSet(resolvePermissionList(allowedCommands, extension, manifest.requestedCommands)), [allowedCommands, extension, manifest.requestedCommands]);
|
|
178
|
+
const storageScopeAllowlist = useMemo(() => {
|
|
179
|
+
const scopes = resolveStorageScopeList(allowedStorageScopes, extension, manifest.storageScopes);
|
|
180
|
+
return scopes ? new Set(scopes) : null;
|
|
181
|
+
}, [allowedStorageScopes, extension, manifest.storageScopes]);
|
|
182
|
+
const scopedActions = useMemo(() => scopeExtensionActions(actions, actionAllowlist), [actions, actionAllowlist]);
|
|
183
|
+
const scopedCommands = useMemo(() => scopeExtensionCommands(commands, commandAllowlist), [commands, commandAllowlist]);
|
|
184
|
+
const getMergedContext = useCallback(async () => {
|
|
185
|
+
const base = getContext ? await getContext() : {};
|
|
186
|
+
return mergeExtensionContext(base, extension, slotId, context);
|
|
187
|
+
}, [contextJson, extension, getContext, slotId]);
|
|
188
|
+
const srcDoc = useMemo(() => buildAgentNativeExtensionHtml({
|
|
189
|
+
extensionId: extension.id,
|
|
190
|
+
title: title ?? extension.name,
|
|
191
|
+
content: extension.content,
|
|
192
|
+
slotId,
|
|
193
|
+
slotContext: context,
|
|
194
|
+
themeCss,
|
|
195
|
+
isDark,
|
|
196
|
+
}), [
|
|
197
|
+
contextJson,
|
|
198
|
+
extension.content,
|
|
199
|
+
extension.id,
|
|
200
|
+
extension.name,
|
|
201
|
+
isDark,
|
|
202
|
+
slotId,
|
|
203
|
+
themeCss,
|
|
204
|
+
title,
|
|
205
|
+
]);
|
|
206
|
+
const postSlotContext = useCallback(() => {
|
|
207
|
+
iframeRef.current?.contentWindow?.postMessage({
|
|
208
|
+
type: AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.SLOT_CONTEXT,
|
|
209
|
+
extensionId: extension.id,
|
|
210
|
+
slotId,
|
|
211
|
+
context: context ?? {},
|
|
212
|
+
}, "*");
|
|
213
|
+
}, [contextJson, extension.id, slotId]);
|
|
214
|
+
useEffect(() => {
|
|
215
|
+
const bridge = createAgentNativeHostBridge({
|
|
216
|
+
session: sessionValue,
|
|
217
|
+
getContext: getMergedContext,
|
|
218
|
+
commands: scopedCommands,
|
|
219
|
+
actions: scopedActions,
|
|
220
|
+
auth,
|
|
221
|
+
onEvent: onBridgeEvent,
|
|
222
|
+
targetWindow: iframeRef.current?.contentWindow ?? null,
|
|
223
|
+
}).start();
|
|
224
|
+
bridgeRef.current = bridge;
|
|
225
|
+
onBridgeReady?.(bridge);
|
|
226
|
+
return () => {
|
|
227
|
+
bridge.stop();
|
|
228
|
+
if (bridgeRef.current === bridge)
|
|
229
|
+
bridgeRef.current = null;
|
|
230
|
+
};
|
|
231
|
+
}, [
|
|
232
|
+
actions,
|
|
233
|
+
auth,
|
|
234
|
+
getMergedContext,
|
|
235
|
+
onBridgeEvent,
|
|
236
|
+
onBridgeReady,
|
|
237
|
+
sessionValue,
|
|
238
|
+
scopedActions,
|
|
239
|
+
scopedCommands,
|
|
240
|
+
]);
|
|
241
|
+
useEffect(() => {
|
|
242
|
+
postSlotContext();
|
|
243
|
+
void bridgeRef.current?.refreshContext();
|
|
244
|
+
}, [postSlotContext]);
|
|
245
|
+
useEffect(() => {
|
|
246
|
+
if (typeof window === "undefined")
|
|
247
|
+
return;
|
|
248
|
+
const respond = (requestId, payload) => {
|
|
249
|
+
iframeRef.current?.contentWindow?.postMessage({
|
|
250
|
+
type: AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.STORAGE_RESPONSE,
|
|
251
|
+
requestId,
|
|
252
|
+
...payload,
|
|
253
|
+
}, "*");
|
|
254
|
+
};
|
|
255
|
+
const handleStorageRequest = async (request) => {
|
|
256
|
+
try {
|
|
257
|
+
if (!storageAdapter) {
|
|
258
|
+
throw new Error("No extension storage adapter is registered");
|
|
259
|
+
}
|
|
260
|
+
const requestContext = {
|
|
261
|
+
...(storageContext ?? {}),
|
|
262
|
+
extensionId: extension.id,
|
|
263
|
+
slotId,
|
|
264
|
+
};
|
|
265
|
+
const { op, collection, id, data, options } = request;
|
|
266
|
+
const requestedScope = typeof options?.scope === "string"
|
|
267
|
+
? options.scope
|
|
268
|
+
: (requestContext.scope ?? "user");
|
|
269
|
+
if (storageScopeAllowlist &&
|
|
270
|
+
!storageScopeAllowlist.has(requestedScope)) {
|
|
271
|
+
throw new Error(`Extension is not allowed to use storage scope "${requestedScope}"`);
|
|
272
|
+
}
|
|
273
|
+
const result = op === "list"
|
|
274
|
+
? await storageAdapter.list(collection, options, requestContext)
|
|
275
|
+
: op === "get"
|
|
276
|
+
? await storageAdapter.get(collection, id, options, requestContext)
|
|
277
|
+
: op === "set"
|
|
278
|
+
? await storageAdapter.set(collection, id, data, options, requestContext)
|
|
279
|
+
: await storageAdapter.remove(collection, id, options, requestContext);
|
|
280
|
+
respond(request.requestId, { ok: true, result });
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
const err = safeError(error);
|
|
284
|
+
onStorageError?.(err, request);
|
|
285
|
+
respond(request.requestId, { ok: false, error: err.message });
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
function onMessage(event) {
|
|
289
|
+
if (event.source !== iframeRef.current?.contentWindow)
|
|
290
|
+
return;
|
|
291
|
+
const message = event.data;
|
|
292
|
+
if (!isRecord(message))
|
|
293
|
+
return;
|
|
294
|
+
if (message.type === AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.RESIZE) {
|
|
295
|
+
if (!autoHeight)
|
|
296
|
+
return;
|
|
297
|
+
const nextHeight = Number(message.height);
|
|
298
|
+
if (Number.isFinite(nextHeight) && nextHeight > 0) {
|
|
299
|
+
setHeight(Math.ceil(nextHeight));
|
|
300
|
+
}
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
if (message.type !== AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.STORAGE_REQUEST) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
const request = normalizeStorageRequest(message);
|
|
307
|
+
if (!request) {
|
|
308
|
+
const requestId = typeof message.requestId === "string" ? message.requestId : "";
|
|
309
|
+
if (requestId) {
|
|
310
|
+
respond(requestId, {
|
|
311
|
+
ok: false,
|
|
312
|
+
error: "Invalid extension storage request",
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
void handleStorageRequest(request);
|
|
318
|
+
}
|
|
319
|
+
window.addEventListener("message", onMessage);
|
|
320
|
+
return () => window.removeEventListener("message", onMessage);
|
|
321
|
+
}, [
|
|
322
|
+
autoHeight,
|
|
323
|
+
extension.id,
|
|
324
|
+
onStorageError,
|
|
325
|
+
slotId,
|
|
326
|
+
storageAdapter,
|
|
327
|
+
storageContext,
|
|
328
|
+
storageScopeAllowlist,
|
|
329
|
+
]);
|
|
330
|
+
return (_createElement("iframe", { ...iframeProps, key: `${extension.id}:${extension.updatedAt ?? ""}`, ref: (node) => {
|
|
331
|
+
iframeRef.current = node;
|
|
332
|
+
setForwardedRef(forwardedRef, node);
|
|
333
|
+
bridgeRef.current?.setTargetWindow(node?.contentWindow ?? null);
|
|
334
|
+
}, title: title ?? extension.name, srcDoc: srcDoc, sandbox: sandboxValue, allow: allow, referrerPolicy: referrerPolicy, style: {
|
|
335
|
+
...defaultFrameStyle,
|
|
336
|
+
height: autoHeight ? height : "100%",
|
|
337
|
+
...style,
|
|
338
|
+
}, onLoad: (event) => {
|
|
339
|
+
bridgeRef.current?.setTargetWindow(event.currentTarget.contentWindow ?? null);
|
|
340
|
+
postSlotContext();
|
|
341
|
+
void bridgeRef.current?.sendInit();
|
|
342
|
+
onLoad?.(event);
|
|
343
|
+
} }));
|
|
344
|
+
});
|
|
345
|
+
export function AgentNativeExtensionSlot({ id, extensions, context, actions, getContext, commands, allowedActions, allowedCommands, auth, session, storage, allowedStorageScopes, storageNamespace, storageContext, themeCss, isDark, autoHeight, initialHeight, onBridgeEvent, onBridgeReady, onStorageError, className, extensionClassName, extensionStyle, empty = null, showEmptyAffordance = false, ...iframeProps }) {
|
|
346
|
+
const slotExtensions = extensions.filter((extension) => isAgentNativeExtensionAllowedInSlot(extension, id));
|
|
347
|
+
if (slotExtensions.length === 0) {
|
|
348
|
+
if (!showEmptyAffordance)
|
|
349
|
+
return null;
|
|
350
|
+
return _jsx("div", { className: className, children: empty });
|
|
351
|
+
}
|
|
352
|
+
return (_jsx("div", { className: className, children: slotExtensions.map((extension) => (_createElement(AgentNativeExtensionFrame, { ...iframeProps, key: extension.id, extension: extension, slotId: id, context: context, actions: actions, getContext: getContext, commands: commands, allowedActions: allowedActions, allowedCommands: allowedCommands, auth: auth, session: session, storage: storage, allowedStorageScopes: allowedStorageScopes, storageNamespace: storageNamespace, storageContext: storageContext, themeCss: themeCss, isDark: isDark, autoHeight: autoHeight, initialHeight: initialHeight, onBridgeEvent: onBridgeEvent, onBridgeReady: onBridgeReady, onStorageError: onStorageError, className: extensionClassName, style: extensionStyle }))) }));
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=AgentNativeExtensionFrame.js.map
|