@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 @@
|
|
|
1
|
+
{"version":3,"file":"AgentNativeExtensionFrame.js","sourceRoot":"","sources":["../../../src/client/extensions/AgentNativeExtensionFrame.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type IframeHTMLAttributes,\n} from \"react\";\nimport {\n createAgentNativeHostBridge,\n type AgentNativeClientAction,\n type AgentNativeClientActions,\n type AgentNativeHostAuth,\n type AgentNativeHostBridge,\n type AgentNativeHostBridgeEvent,\n type AgentNativeHostCommandHandler,\n type AgentNativeHostCommandHandlers,\n type AgentNativeHostContext,\n type AgentNativeHostContextGetter,\n type AgentNativeHostSession,\n} from \"../host-bridge.js\";\nimport {\n AGENT_NATIVE_EXTENSION_MESSAGE_TYPES,\n buildAgentNativeExtensionHtml,\n createLocalStorageAgentNativeExtensionStorage,\n getAgentNativeExtensionManifest,\n isAgentNativeExtensionAllowedInSlot,\n normalizeAgentNativeExtensionSandbox,\n type AgentNativeExtensionDefinition,\n type AgentNativeExtensionStorage,\n type AgentNativeExtensionStorageContext,\n type AgentNativeExtensionStorageOptions,\n type AgentNativeExtensionStorageScope,\n} from \"./portable-extension.js\";\n\nexport type AgentNativeExtensionPermissionList =\n | readonly string[]\n | ((\n extension: AgentNativeExtensionDefinition,\n ) => readonly string[] | undefined)\n | undefined;\n\nexport type AgentNativeExtensionStorageScopeList =\n | readonly AgentNativeExtensionStorageScope[]\n | ((\n extension: AgentNativeExtensionDefinition,\n ) => readonly AgentNativeExtensionStorageScope[] | undefined)\n | undefined;\n\nexport interface AgentNativeExtensionFrameProps extends Omit<\n IframeHTMLAttributes<HTMLIFrameElement>,\n \"src\" | \"srcDoc\"\n> {\n extension: AgentNativeExtensionDefinition;\n /** Stable slot identifier, for example `customer-detail.sidebar`. */\n slotId?: string;\n /** Context pushed into `window.slotContext` and merged into host context. */\n context?: Record<string, unknown> | null;\n /** Live actions exposed to the extension through `appAction()` and `agentNative.action()`. */\n actions?: AgentNativeClientActions;\n /** Page/app context exposed through `agentNative.context()`. */\n getContext?: AgentNativeHostContextGetter;\n /** Host commands exposed through `agentNative.command()` and `agentNative.refresh()`. */\n commands?: AgentNativeHostCommandHandlers;\n /** Host-enforced action allowlist. Defaults to extension manifest requestedActions. */\n allowedActions?: AgentNativeExtensionPermissionList;\n /** Host-enforced command allowlist. Defaults to extension manifest requestedCommands. */\n allowedCommands?: AgentNativeExtensionPermissionList;\n auth?: AgentNativeHostAuth;\n session?: string | Partial<AgentNativeHostSession>;\n /** Storage adapter used by `extensionData.*`. Defaults to browser localStorage. */\n storage?: AgentNativeExtensionStorage | false;\n /** Host-enforced storage scope allowlist. Defaults to extension manifest storageScopes. */\n allowedStorageScopes?: AgentNativeExtensionStorageScopeList;\n storageNamespace?: string;\n storageContext?: Omit<\n AgentNativeExtensionStorageContext,\n \"extensionId\" | \"slotId\"\n >;\n themeCss?: string;\n isDark?: boolean;\n autoHeight?: boolean;\n initialHeight?: number;\n onBridgeEvent?: (event: AgentNativeHostBridgeEvent) => void;\n onBridgeReady?: (bridge: AgentNativeHostBridge) => void;\n onStorageError?: (\n error: Error,\n request: AgentNativeExtensionStorageRequest,\n ) => void;\n}\n\nexport interface AgentNativeExtensionSlotProps extends Omit<\n AgentNativeExtensionFrameProps,\n \"extension\" | \"className\" | \"style\" | \"children\"\n> {\n id: string;\n extensions: AgentNativeExtensionDefinition[];\n className?: string;\n extensionClassName?: string;\n extensionStyle?: CSSProperties;\n empty?: React.ReactNode;\n showEmptyAffordance?: boolean;\n}\n\ninterface AgentNativeExtensionStorageRequest {\n requestId: string;\n op: \"list\" | \"get\" | \"set\" | \"remove\";\n collection: string;\n id?: string;\n data?: unknown;\n options?: AgentNativeExtensionStorageOptions;\n}\n\nconst defaultFrameStyle: CSSProperties = {\n border: 0,\n display: \"block\",\n width: \"100%\",\n};\n\nconst BUILT_IN_COMMAND_NAMES = [\n \"navigate\",\n \"refreshData\",\n \"refresh-data\",\n \"remountView\",\n \"remount-view\",\n \"hardReload\",\n \"hard-reload\",\n \"openResource\",\n \"open-resource\",\n \"requestApproval\",\n \"request-approval\",\n];\n\nconst COMMAND_ALIASES: Record<string, readonly string[]> = {\n refreshData: [\"refreshData\", \"refresh-data\"],\n \"refresh-data\": [\"refreshData\", \"refresh-data\"],\n remountView: [\"remountView\", \"remount-view\"],\n \"remount-view\": [\"remountView\", \"remount-view\"],\n hardReload: [\"hardReload\", \"hard-reload\"],\n \"hard-reload\": [\"hardReload\", \"hard-reload\"],\n openResource: [\"openResource\", \"open-resource\"],\n \"open-resource\": [\"openResource\", \"open-resource\"],\n requestApproval: [\"requestApproval\", \"request-approval\"],\n \"request-approval\": [\"requestApproval\", \"request-approval\"],\n};\n\nfunction setForwardedRef<T>(ref: React.ForwardedRef<T>, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) ref.current = value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction safeError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value ?? {});\n } catch {\n return \"{}\";\n }\n}\n\nfunction resolvePermissionList(\n value: AgentNativeExtensionPermissionList,\n extension: AgentNativeExtensionDefinition,\n fallback: readonly string[] | undefined,\n): readonly string[] | undefined {\n if (typeof value === \"function\") return value(extension);\n if (Array.isArray(value)) return value;\n return fallback;\n}\n\nfunction resolveStorageScopeList(\n value: AgentNativeExtensionStorageScopeList,\n extension: AgentNativeExtensionDefinition,\n fallback: readonly AgentNativeExtensionStorageScope[] | undefined,\n): readonly AgentNativeExtensionStorageScope[] | undefined {\n if (typeof value === \"function\") return value(extension);\n if (Array.isArray(value)) return value;\n return fallback;\n}\n\nfunction toPermissionSet(\n value: readonly string[] | undefined,\n): Set<string> | null {\n return value ? new Set(value) : null;\n}\n\nfunction commandPermissionSet(\n value: readonly string[] | undefined,\n): Set<string> | null {\n if (!value) return null;\n const expanded = new Set<string>();\n for (const command of value) {\n expanded.add(command);\n for (const alias of COMMAND_ALIASES[command] ?? []) expanded.add(alias);\n }\n return expanded;\n}\n\nasync function resolveActions(\n actions: AgentNativeClientActions | undefined,\n): Promise<AgentNativeClientAction[]> {\n const resolved = typeof actions === \"function\" ? await actions() : actions;\n return Array.isArray(resolved) ? resolved : [];\n}\n\nfunction scopeExtensionActions(\n actions: AgentNativeClientActions | undefined,\n allowedNames: Set<string> | null,\n): AgentNativeClientActions | undefined {\n if (!actions || !allowedNames) return actions;\n return async () =>\n (await resolveActions(actions)).filter((action) =>\n allowedNames.has(action.name),\n );\n}\n\nfunction blockedCommand(command: string): AgentNativeHostCommandHandler {\n return () => {\n throw new Error(\n `Extension is not allowed to call host command \"${command}\"`,\n );\n };\n}\n\nfunction scopeExtensionCommands(\n commands: AgentNativeHostCommandHandlers | undefined,\n allowedNames: Set<string> | null,\n): AgentNativeHostCommandHandlers | undefined {\n if (!allowedNames) return commands;\n\n const scoped: AgentNativeHostCommandHandlers = {};\n for (const command of BUILT_IN_COMMAND_NAMES) {\n if (!allowedNames.has(command)) scoped[command] = blockedCommand(command);\n }\n\n for (const [command, handler] of Object.entries(commands ?? {})) {\n scoped[command] = allowedNames.has(command)\n ? handler\n : blockedCommand(command);\n }\n\n return scoped;\n}\n\nfunction normalizeStorageRequest(\n value: unknown,\n): AgentNativeExtensionStorageRequest | null {\n if (!isRecord(value)) return null;\n const requestId = typeof value.requestId === \"string\" ? value.requestId : \"\";\n const op =\n value.op === \"list\" ||\n value.op === \"get\" ||\n value.op === \"set\" ||\n value.op === \"remove\"\n ? value.op\n : null;\n const collection =\n typeof value.collection === \"string\" ? value.collection.trim() : \"\";\n const id = typeof value.id === \"string\" ? value.id : undefined;\n const options = isRecord(value.options)\n ? (value.options as AgentNativeExtensionStorageOptions)\n : undefined;\n\n if (!requestId || !op || !collection) return null;\n if ((op === \"get\" || op === \"set\" || op === \"remove\") && !id) {\n return null;\n }\n\n return {\n requestId,\n op,\n collection,\n id,\n data: value.data,\n options,\n };\n}\n\nfunction mergeExtensionContext(\n base: AgentNativeHostContext | undefined,\n extension: AgentNativeExtensionDefinition,\n slotId: string | undefined,\n slotContext: Record<string, unknown> | null | undefined,\n): AgentNativeHostContext {\n return {\n ...(base ?? {}),\n extension: {\n id: extension.id,\n name: extension.name,\n description: extension.description,\n },\n slot: slotId\n ? {\n id: slotId,\n context: slotContext ?? {},\n }\n : undefined,\n data: {\n ...(base?.data ?? {}),\n extension: {\n id: extension.id,\n name: extension.name,\n },\n slotContext: slotContext ?? {},\n },\n };\n}\n\nexport const AgentNativeExtensionFrame = forwardRef<\n HTMLIFrameElement,\n AgentNativeExtensionFrameProps\n>(function AgentNativeExtensionFrame(\n {\n extension,\n slotId,\n context,\n actions,\n getContext,\n commands,\n allowedActions,\n allowedCommands,\n auth,\n session,\n storage,\n allowedStorageScopes,\n storageNamespace = \"default\",\n storageContext,\n themeCss,\n isDark,\n autoHeight = true,\n initialHeight = 120,\n onBridgeEvent,\n onBridgeReady,\n onStorageError,\n title,\n sandbox,\n allow = \"clipboard-read; clipboard-write\",\n referrerPolicy = \"no-referrer\",\n style,\n onLoad,\n ...iframeProps\n },\n forwardedRef,\n) {\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const bridgeRef = useRef<AgentNativeHostBridge | null>(null);\n const [height, setHeight] = useState(initialHeight);\n const localStorageAdapter = useMemo(\n () => createLocalStorageAgentNativeExtensionStorage(storageNamespace),\n [storageNamespace],\n );\n const storageAdapter = storage === undefined ? localStorageAdapter : storage;\n const contextJson = safeStringify(context);\n const sandboxValue = useMemo(\n () => normalizeAgentNativeExtensionSandbox(sandbox),\n [sandbox],\n );\n const sessionValue =\n session ?? `extension:${extension.id}:${slotId ?? \"standalone\"}`;\n const manifest = useMemo(\n () => getAgentNativeExtensionManifest(extension),\n [extension],\n );\n const actionAllowlist = useMemo(\n () =>\n toPermissionSet(\n resolvePermissionList(\n allowedActions,\n extension,\n manifest.requestedActions,\n ),\n ),\n [allowedActions, extension, manifest.requestedActions],\n );\n const commandAllowlist = useMemo(\n () =>\n commandPermissionSet(\n resolvePermissionList(\n allowedCommands,\n extension,\n manifest.requestedCommands,\n ),\n ),\n [allowedCommands, extension, manifest.requestedCommands],\n );\n const storageScopeAllowlist = useMemo(() => {\n const scopes = resolveStorageScopeList(\n allowedStorageScopes,\n extension,\n manifest.storageScopes,\n );\n return scopes ? new Set(scopes) : null;\n }, [allowedStorageScopes, extension, manifest.storageScopes]);\n const scopedActions = useMemo(\n () => scopeExtensionActions(actions, actionAllowlist),\n [actions, actionAllowlist],\n );\n const scopedCommands = useMemo(\n () => scopeExtensionCommands(commands, commandAllowlist),\n [commands, commandAllowlist],\n );\n\n const getMergedContext = useCallback(async () => {\n const base = getContext ? await getContext() : {};\n return mergeExtensionContext(base, extension, slotId, context);\n }, [contextJson, extension, getContext, slotId]);\n\n const srcDoc = useMemo(\n () =>\n buildAgentNativeExtensionHtml({\n extensionId: extension.id,\n title: title ?? extension.name,\n content: extension.content,\n slotId,\n slotContext: context,\n themeCss,\n isDark,\n }),\n [\n contextJson,\n extension.content,\n extension.id,\n extension.name,\n isDark,\n slotId,\n themeCss,\n title,\n ],\n );\n\n const postSlotContext = useCallback(() => {\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.SLOT_CONTEXT,\n extensionId: extension.id,\n slotId,\n context: context ?? {},\n },\n \"*\",\n );\n }, [contextJson, extension.id, slotId]);\n\n useEffect(() => {\n const bridge = createAgentNativeHostBridge({\n session: sessionValue,\n getContext: getMergedContext,\n commands: scopedCommands,\n actions: scopedActions,\n auth,\n onEvent: onBridgeEvent,\n targetWindow: iframeRef.current?.contentWindow ?? null,\n }).start();\n bridgeRef.current = bridge;\n onBridgeReady?.(bridge);\n return () => {\n bridge.stop();\n if (bridgeRef.current === bridge) bridgeRef.current = null;\n };\n }, [\n actions,\n auth,\n getMergedContext,\n onBridgeEvent,\n onBridgeReady,\n sessionValue,\n scopedActions,\n scopedCommands,\n ]);\n\n useEffect(() => {\n postSlotContext();\n void bridgeRef.current?.refreshContext();\n }, [postSlotContext]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const respond = (requestId: string, payload: Record<string, unknown>) => {\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.STORAGE_RESPONSE,\n requestId,\n ...payload,\n },\n \"*\",\n );\n };\n\n const handleStorageRequest = async (\n request: AgentNativeExtensionStorageRequest,\n ) => {\n try {\n if (!storageAdapter) {\n throw new Error(\"No extension storage adapter is registered\");\n }\n const requestContext: AgentNativeExtensionStorageContext = {\n ...(storageContext ?? {}),\n extensionId: extension.id,\n slotId,\n };\n const { op, collection, id, data, options } = request;\n const requestedScope =\n typeof options?.scope === \"string\"\n ? options.scope\n : (requestContext.scope ?? \"user\");\n if (\n storageScopeAllowlist &&\n !storageScopeAllowlist.has(requestedScope)\n ) {\n throw new Error(\n `Extension is not allowed to use storage scope \"${requestedScope}\"`,\n );\n }\n const result =\n op === \"list\"\n ? await storageAdapter.list(collection, options, requestContext)\n : op === \"get\"\n ? await storageAdapter.get(\n collection,\n id as string,\n options,\n requestContext,\n )\n : op === \"set\"\n ? await storageAdapter.set(\n collection,\n id as string,\n data,\n options,\n requestContext,\n )\n : await storageAdapter.remove(\n collection,\n id as string,\n options,\n requestContext,\n );\n respond(request.requestId, { ok: true, result });\n } catch (error) {\n const err = safeError(error);\n onStorageError?.(err, request);\n respond(request.requestId, { ok: false, error: err.message });\n }\n };\n\n function onMessage(event: MessageEvent) {\n if (event.source !== iframeRef.current?.contentWindow) return;\n const message = event.data;\n if (!isRecord(message)) return;\n\n if (message.type === AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.RESIZE) {\n if (!autoHeight) return;\n const nextHeight = Number(message.height);\n if (Number.isFinite(nextHeight) && nextHeight > 0) {\n setHeight(Math.ceil(nextHeight));\n }\n return;\n }\n\n if (\n message.type !== AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.STORAGE_REQUEST\n ) {\n return;\n }\n\n const request = normalizeStorageRequest(message);\n if (!request) {\n const requestId =\n typeof message.requestId === \"string\" ? message.requestId : \"\";\n if (requestId) {\n respond(requestId, {\n ok: false,\n error: \"Invalid extension storage request\",\n });\n }\n return;\n }\n\n void handleStorageRequest(request);\n }\n\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n }, [\n autoHeight,\n extension.id,\n onStorageError,\n slotId,\n storageAdapter,\n storageContext,\n storageScopeAllowlist,\n ]);\n\n return (\n <iframe\n {...iframeProps}\n key={`${extension.id}:${extension.updatedAt ?? \"\"}`}\n ref={(node) => {\n iframeRef.current = node;\n setForwardedRef(forwardedRef, node);\n bridgeRef.current?.setTargetWindow(node?.contentWindow ?? null);\n }}\n title={title ?? extension.name}\n srcDoc={srcDoc}\n sandbox={sandboxValue}\n allow={allow}\n referrerPolicy={referrerPolicy}\n style={{\n ...defaultFrameStyle,\n height: autoHeight ? height : \"100%\",\n ...style,\n }}\n onLoad={(event) => {\n bridgeRef.current?.setTargetWindow(\n event.currentTarget.contentWindow ?? null,\n );\n postSlotContext();\n void bridgeRef.current?.sendInit();\n onLoad?.(event);\n }}\n />\n );\n});\n\nexport function AgentNativeExtensionSlot({\n id,\n extensions,\n context,\n actions,\n getContext,\n commands,\n allowedActions,\n allowedCommands,\n auth,\n session,\n storage,\n allowedStorageScopes,\n storageNamespace,\n storageContext,\n themeCss,\n isDark,\n autoHeight,\n initialHeight,\n onBridgeEvent,\n onBridgeReady,\n onStorageError,\n className,\n extensionClassName,\n extensionStyle,\n empty = null,\n showEmptyAffordance = false,\n ...iframeProps\n}: AgentNativeExtensionSlotProps) {\n const slotExtensions = extensions.filter((extension) =>\n isAgentNativeExtensionAllowedInSlot(extension, id),\n );\n\n if (slotExtensions.length === 0) {\n if (!showEmptyAffordance) return null;\n return <div className={className}>{empty}</div>;\n }\n\n return (\n <div className={className}>\n {slotExtensions.map((extension) => (\n <AgentNativeExtensionFrame\n {...iframeProps}\n key={extension.id}\n extension={extension}\n slotId={id}\n context={context}\n actions={actions}\n getContext={getContext}\n commands={commands}\n allowedActions={allowedActions}\n allowedCommands={allowedCommands}\n auth={auth}\n session={session}\n storage={storage}\n allowedStorageScopes={allowedStorageScopes}\n storageNamespace={storageNamespace}\n storageContext={storageContext}\n themeCss={themeCss}\n isDark={isDark}\n autoHeight={autoHeight}\n initialHeight={initialHeight}\n onBridgeEvent={onBridgeEvent}\n onBridgeReady={onBridgeReady}\n onStorageError={onStorageError}\n className={extensionClassName}\n style={extensionStyle}\n />\n ))}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentNativeExtensionFrame.spec.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/AgentNativeExtensionFrame.spec.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// @vitest-environment happy-dom
|
|
3
|
+
import { act } from "react";
|
|
4
|
+
import { createRoot } from "react-dom/client";
|
|
5
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { AgentNativeExtensionFrame, AgentNativeExtensionSlot, } from "./AgentNativeExtensionFrame.js";
|
|
7
|
+
describe("AgentNativeExtensionFrame", () => {
|
|
8
|
+
let container;
|
|
9
|
+
let root;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
|
|
12
|
+
container = document.createElement("div");
|
|
13
|
+
root = createRoot(container);
|
|
14
|
+
});
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
act(() => root.unmount());
|
|
17
|
+
container.remove();
|
|
18
|
+
vi.unstubAllGlobals();
|
|
19
|
+
});
|
|
20
|
+
it("renders extension content into a sandboxed srcdoc iframe", async () => {
|
|
21
|
+
await act(async () => {
|
|
22
|
+
root.render(_jsx(AgentNativeExtensionFrame, { extension: {
|
|
23
|
+
id: "ext-1",
|
|
24
|
+
name: "Customer panel",
|
|
25
|
+
content: "<section>Customer health</section>",
|
|
26
|
+
}, sandbox: "allow-scripts allow-same-origin allow-popups" }));
|
|
27
|
+
});
|
|
28
|
+
const iframe = container.querySelector("iframe");
|
|
29
|
+
expect(iframe).toBeTruthy();
|
|
30
|
+
expect(iframe?.getAttribute("sandbox")).toBe("allow-scripts allow-popups");
|
|
31
|
+
expect(iframe?.getAttribute("srcdoc")).toContain("<section>Customer health</section>");
|
|
32
|
+
});
|
|
33
|
+
it("renders one iframe per extension in a portable slot", async () => {
|
|
34
|
+
await act(async () => {
|
|
35
|
+
root.render(_jsx(AgentNativeExtensionSlot, { id: "crm.sidebar", extensions: [
|
|
36
|
+
{ id: "ext-1", name: "One", content: "<p>One</p>" },
|
|
37
|
+
{ id: "ext-2", name: "Two", content: "<p>Two</p>" },
|
|
38
|
+
], context: { customerId: "cus_123" } }));
|
|
39
|
+
});
|
|
40
|
+
const frames = Array.from(container.querySelectorAll("iframe"));
|
|
41
|
+
expect(frames).toHaveLength(2);
|
|
42
|
+
expect(frames[0].getAttribute("srcdoc")).toContain("cus_123");
|
|
43
|
+
expect(frames[1].getAttribute("srcdoc")).toContain("<p>Two</p>");
|
|
44
|
+
});
|
|
45
|
+
it("does not render extensions into slots outside their manifest", async () => {
|
|
46
|
+
await act(async () => {
|
|
47
|
+
root.render(_jsx(AgentNativeExtensionSlot, { id: "crm.sidebar", extensions: [
|
|
48
|
+
{
|
|
49
|
+
id: "ext-1",
|
|
50
|
+
name: "Allowed",
|
|
51
|
+
content: "<p>Allowed</p>",
|
|
52
|
+
manifest: { slots: ["crm.sidebar"] },
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: "ext-2",
|
|
56
|
+
name: "Blocked",
|
|
57
|
+
content: "<p>Blocked</p>",
|
|
58
|
+
manifest: { slots: ["billing.sidebar"] },
|
|
59
|
+
},
|
|
60
|
+
] }));
|
|
61
|
+
});
|
|
62
|
+
const frames = Array.from(container.querySelectorAll("iframe"));
|
|
63
|
+
expect(frames).toHaveLength(1);
|
|
64
|
+
expect(frames[0].getAttribute("srcdoc")).toContain("<p>Allowed</p>");
|
|
65
|
+
expect(frames[0].getAttribute("srcdoc")).not.toContain("<p>Blocked</p>");
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=AgentNativeExtensionFrame.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentNativeExtensionFrame.spec.js","sourceRoot":"","sources":["../../../src/client/extensions/AgentNativeExtensionFrame.spec.tsx"],"names":[],"mappings":"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","sourcesContent":["// @vitest-environment happy-dom\nimport React, { act } from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport {\n AgentNativeExtensionFrame,\n AgentNativeExtensionSlot,\n} from \"./AgentNativeExtensionFrame.js\";\n\ndescribe(\"AgentNativeExtensionFrame\", () => {\n let container: HTMLDivElement;\n let root: Root;\n\n beforeEach(() => {\n vi.stubGlobal(\"IS_REACT_ACT_ENVIRONMENT\", true);\n container = document.createElement(\"div\");\n root = createRoot(container);\n });\n\n afterEach(() => {\n act(() => root.unmount());\n container.remove();\n vi.unstubAllGlobals();\n });\n\n it(\"renders extension content into a sandboxed srcdoc iframe\", async () => {\n await act(async () => {\n root.render(\n <AgentNativeExtensionFrame\n extension={{\n id: \"ext-1\",\n name: \"Customer panel\",\n content: \"<section>Customer health</section>\",\n }}\n sandbox=\"allow-scripts allow-same-origin allow-popups\"\n />,\n );\n });\n\n const iframe = container.querySelector(\"iframe\");\n expect(iframe).toBeTruthy();\n expect(iframe?.getAttribute(\"sandbox\")).toBe(\"allow-scripts allow-popups\");\n expect(iframe?.getAttribute(\"srcdoc\")).toContain(\n \"<section>Customer health</section>\",\n );\n });\n\n it(\"renders one iframe per extension in a portable slot\", async () => {\n await act(async () => {\n root.render(\n <AgentNativeExtensionSlot\n id=\"crm.sidebar\"\n extensions={[\n { id: \"ext-1\", name: \"One\", content: \"<p>One</p>\" },\n { id: \"ext-2\", name: \"Two\", content: \"<p>Two</p>\" },\n ]}\n context={{ customerId: \"cus_123\" }}\n />,\n );\n });\n\n const frames = Array.from(container.querySelectorAll(\"iframe\"));\n expect(frames).toHaveLength(2);\n expect(frames[0].getAttribute(\"srcdoc\")).toContain(\"cus_123\");\n expect(frames[1].getAttribute(\"srcdoc\")).toContain(\"<p>Two</p>\");\n });\n\n it(\"does not render extensions into slots outside their manifest\", async () => {\n await act(async () => {\n root.render(\n <AgentNativeExtensionSlot\n id=\"crm.sidebar\"\n extensions={[\n {\n id: \"ext-1\",\n name: \"Allowed\",\n content: \"<p>Allowed</p>\",\n manifest: { slots: [\"crm.sidebar\"] },\n },\n {\n id: \"ext-2\",\n name: \"Blocked\",\n content: \"<p>Blocked</p>\",\n manifest: { slots: [\"billing.sidebar\"] },\n },\n ]}\n />,\n );\n });\n\n const frames = Array.from(container.querySelectorAll(\"iframe\"));\n expect(frames).toHaveLength(1);\n expect(frames[0].getAttribute(\"srcdoc\")).toContain(\"<p>Allowed</p>\");\n expect(frames[0].getAttribute(\"srcdoc\")).not.toContain(\"<p>Blocked</p>\");\n });\n});\n"]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export declare const AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES: {
|
|
2
|
+
readonly REQUEST: "agentNative.extension.storage";
|
|
3
|
+
readonly RESPONSE: "agentNative.extension.storageResult";
|
|
4
|
+
readonly SLOT_CONTEXT: "agentNative.extension.slotContext";
|
|
5
|
+
readonly RESIZE: "agentNative.extension.resize";
|
|
6
|
+
};
|
|
7
|
+
export type AgentNativeExtensionStorageScope = "user" | "org";
|
|
8
|
+
export type AgentNativeExtensionStorageOperation = "list" | "get" | "set" | "remove";
|
|
9
|
+
export interface AgentNativeExtensionDefinition {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
content: string;
|
|
14
|
+
updatedAt?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface AgentNativeExtensionStorageRequest {
|
|
17
|
+
operation: AgentNativeExtensionStorageOperation;
|
|
18
|
+
extensionId: string;
|
|
19
|
+
collection: string;
|
|
20
|
+
id?: string;
|
|
21
|
+
data?: unknown;
|
|
22
|
+
scope?: AgentNativeExtensionStorageScope;
|
|
23
|
+
limit?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface AgentNativeExtensionStorageContext {
|
|
26
|
+
extensionId: string;
|
|
27
|
+
slotId?: string;
|
|
28
|
+
slotContext?: Record<string, unknown> | null;
|
|
29
|
+
}
|
|
30
|
+
export interface AgentNativeExtensionDataRow {
|
|
31
|
+
id: string;
|
|
32
|
+
extensionId: string;
|
|
33
|
+
collection: string;
|
|
34
|
+
data: unknown;
|
|
35
|
+
scope: AgentNativeExtensionStorageScope;
|
|
36
|
+
createdAt: string;
|
|
37
|
+
updatedAt: string;
|
|
38
|
+
}
|
|
39
|
+
export interface AgentNativeExtensionStorage {
|
|
40
|
+
list(collection: string, options: {
|
|
41
|
+
scope?: AgentNativeExtensionStorageScope | "all";
|
|
42
|
+
limit?: number;
|
|
43
|
+
context: AgentNativeExtensionStorageContext;
|
|
44
|
+
}): Promise<AgentNativeExtensionDataRow[]>;
|
|
45
|
+
get(collection: string, id: string, options: {
|
|
46
|
+
scope?: AgentNativeExtensionStorageScope;
|
|
47
|
+
context: AgentNativeExtensionStorageContext;
|
|
48
|
+
}): Promise<AgentNativeExtensionDataRow | null>;
|
|
49
|
+
set(collection: string, id: string, data: unknown, options: {
|
|
50
|
+
scope?: AgentNativeExtensionStorageScope;
|
|
51
|
+
context: AgentNativeExtensionStorageContext;
|
|
52
|
+
}): Promise<AgentNativeExtensionDataRow>;
|
|
53
|
+
remove(collection: string, id: string, options: {
|
|
54
|
+
scope?: AgentNativeExtensionStorageScope;
|
|
55
|
+
context: AgentNativeExtensionStorageContext;
|
|
56
|
+
}): Promise<{
|
|
57
|
+
ok: true;
|
|
58
|
+
}>;
|
|
59
|
+
}
|
|
60
|
+
export interface BuildAgentNativeExtensionHtmlOptions {
|
|
61
|
+
extensionId: string;
|
|
62
|
+
content: string;
|
|
63
|
+
title?: string;
|
|
64
|
+
dark?: boolean;
|
|
65
|
+
themeCss?: string;
|
|
66
|
+
}
|
|
67
|
+
export declare function buildAgentNativeExtensionHtml(options: BuildAgentNativeExtensionHtmlOptions): string;
|
|
68
|
+
export declare function createLocalStorageAgentNativeExtensionStorage(namespace?: string): AgentNativeExtensionStorage;
|
|
69
|
+
//# sourceMappingURL=agent-native-extension-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-native-extension-runtime.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/agent-native-extension-runtime.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,4CAA4C;;;;;CAK/C,CAAC;AAEX,MAAM,MAAM,gCAAgC,GAAG,MAAM,GAAG,KAAK,CAAC;AAE9D,MAAM,MAAM,oCAAoC,GAC5C,MAAM,GACN,KAAK,GACL,KAAK,GACL,QAAQ,CAAC;AAEb,MAAM,WAAW,8BAA8B;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kCAAkC;IACjD,SAAS,EAAE,oCAAoC,CAAC;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,gCAAgC,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kCAAkC;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,gCAAgC,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,CACF,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,gCAAgC,GAAG,KAAK,CAAC;QACjD,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,kCAAkC,CAAC;KAC7C,GACA,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAAC;IAC1C,GAAG,CACD,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,gCAAgC,CAAC;QACzC,OAAO,EAAE,kCAAkC,CAAC;KAC7C,GACA,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CAAC;IAC/C,GAAG,CACD,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,EACb,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,gCAAgC,CAAC;QACzC,OAAO,EAAE,kCAAkC,CAAC;KAC7C,GACA,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACxC,MAAM,CACJ,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,gCAAgC,CAAC;QACzC,OAAO,EAAE,kCAAkC,CAAC;KAC7C,GACA,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,oCAAoC;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAmDD,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,oCAAoC,GAC5C,MAAM,CAoOR;AAyDD,wBAAgB,6CAA6C,CAC3D,SAAS,SAAY,GACpB,2BAA2B,CA6D7B"}
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import { EXTENSION_IFRAME_META_CSP } from "../../extensions/html-shell.js";
|
|
2
|
+
export const AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES = {
|
|
3
|
+
REQUEST: "agentNative.extension.storage",
|
|
4
|
+
RESPONSE: "agentNative.extension.storageResult",
|
|
5
|
+
SLOT_CONTEXT: "agentNative.extension.slotContext",
|
|
6
|
+
RESIZE: "agentNative.extension.resize",
|
|
7
|
+
};
|
|
8
|
+
function escapeHtml(value) {
|
|
9
|
+
return value
|
|
10
|
+
.replace(/&/g, "&")
|
|
11
|
+
.replace(/</g, "<")
|
|
12
|
+
.replace(/>/g, ">")
|
|
13
|
+
.replace(/"/g, """);
|
|
14
|
+
}
|
|
15
|
+
function safeJson(value) {
|
|
16
|
+
return JSON.stringify(value).replace(/</g, "\\u003c");
|
|
17
|
+
}
|
|
18
|
+
const defaultThemeCss = `
|
|
19
|
+
:root {
|
|
20
|
+
color-scheme: light;
|
|
21
|
+
--background: 0 0% 100%;
|
|
22
|
+
--foreground: 222.2 84% 4.9%;
|
|
23
|
+
--muted: 210 40% 96.1%;
|
|
24
|
+
--muted-foreground: 215.4 16.3% 46.9%;
|
|
25
|
+
--border: 214.3 31.8% 91.4%;
|
|
26
|
+
--primary: 221.2 83.2% 53.3%;
|
|
27
|
+
--primary-foreground: 210 40% 98%;
|
|
28
|
+
--destructive: 0 84.2% 60.2%;
|
|
29
|
+
--destructive-foreground: 210 40% 98%;
|
|
30
|
+
}
|
|
31
|
+
.dark {
|
|
32
|
+
color-scheme: dark;
|
|
33
|
+
--background: 222.2 84% 4.9%;
|
|
34
|
+
--foreground: 210 40% 98%;
|
|
35
|
+
--muted: 217.2 32.6% 17.5%;
|
|
36
|
+
--muted-foreground: 215 20.2% 65.1%;
|
|
37
|
+
--border: 217.2 32.6% 17.5%;
|
|
38
|
+
--primary: 217.2 91.2% 59.8%;
|
|
39
|
+
--primary-foreground: 222.2 47.4% 11.2%;
|
|
40
|
+
--destructive: 0 62.8% 30.6%;
|
|
41
|
+
--destructive-foreground: 210 40% 98%;
|
|
42
|
+
}
|
|
43
|
+
html, body {
|
|
44
|
+
margin: 0;
|
|
45
|
+
min-height: 100%;
|
|
46
|
+
background: transparent;
|
|
47
|
+
color: hsl(var(--foreground));
|
|
48
|
+
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
49
|
+
}
|
|
50
|
+
body {
|
|
51
|
+
padding: 0;
|
|
52
|
+
}
|
|
53
|
+
`;
|
|
54
|
+
export function buildAgentNativeExtensionHtml(options) {
|
|
55
|
+
const extensionId = safeJson(options.extensionId);
|
|
56
|
+
const storageRequestType = safeJson(AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.REQUEST);
|
|
57
|
+
const storageResponseType = safeJson(AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.RESPONSE);
|
|
58
|
+
const slotContextType = safeJson(AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.SLOT_CONTEXT);
|
|
59
|
+
const resizeType = safeJson(AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.RESIZE);
|
|
60
|
+
const themeCss = `${defaultThemeCss}\n${options.themeCss ?? ""}`;
|
|
61
|
+
return `<!doctype html>
|
|
62
|
+
<html lang="en"${options.dark ? ' class="dark"' : ""}>
|
|
63
|
+
<head>
|
|
64
|
+
<meta charset="utf-8" />
|
|
65
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
66
|
+
<meta http-equiv="Content-Security-Policy" content="${EXTENSION_IFRAME_META_CSP}" />
|
|
67
|
+
<title>${escapeHtml(options.title ?? "Agent Native extension")}</title>
|
|
68
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
69
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
70
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300..700&display=swap" rel="stylesheet" />
|
|
71
|
+
<script
|
|
72
|
+
src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4.2.4"
|
|
73
|
+
integrity="sha384-yNSZBFvuOWcmww494a9+1zNuvgUGEXoWkein7cxP8wHUTi3iXCU4vJ7hr3tzBCml"
|
|
74
|
+
crossorigin="anonymous"
|
|
75
|
+
></script>
|
|
76
|
+
<script
|
|
77
|
+
defer
|
|
78
|
+
src="https://cdn.jsdelivr.net/npm/alpinejs@3.15.11/dist/cdn.min.js"
|
|
79
|
+
integrity="sha384-WPtu0YHhJ3arcykfnv1JgUffWDSKRnqnDeTpJUbOc2os2moEmLkIdaeR0trPN4be"
|
|
80
|
+
crossorigin="anonymous"
|
|
81
|
+
></script>
|
|
82
|
+
<style>${themeCss}</style>
|
|
83
|
+
<style type="text/tailwindcss">
|
|
84
|
+
@custom-variant dark (&:where(.dark, .dark *));
|
|
85
|
+
@theme {
|
|
86
|
+
--color-background: hsl(var(--background));
|
|
87
|
+
--color-foreground: hsl(var(--foreground));
|
|
88
|
+
--color-muted: hsl(var(--muted));
|
|
89
|
+
--color-muted-foreground: hsl(var(--muted-foreground));
|
|
90
|
+
--color-border: hsl(var(--border));
|
|
91
|
+
--color-primary: hsl(var(--primary));
|
|
92
|
+
--color-primary-foreground: hsl(var(--primary-foreground));
|
|
93
|
+
--color-destructive: hsl(var(--destructive));
|
|
94
|
+
--color-destructive-foreground: hsl(var(--destructive-foreground));
|
|
95
|
+
}
|
|
96
|
+
</style>
|
|
97
|
+
<script>
|
|
98
|
+
(function() {
|
|
99
|
+
var extensionId = ${extensionId};
|
|
100
|
+
var pending = {};
|
|
101
|
+
var seq = 0;
|
|
102
|
+
var slotContext = {};
|
|
103
|
+
var HOST = {
|
|
104
|
+
READY: "agentNative.host.ready",
|
|
105
|
+
GET_CONTEXT: "agentNative.host.getContext",
|
|
106
|
+
CONTEXT: "agentNative.host.context",
|
|
107
|
+
LIST_ACTIONS: "agentNative.host.listActions",
|
|
108
|
+
ACTIONS: "agentNative.host.actions",
|
|
109
|
+
RUN_ACTION: "agentNative.host.runAction",
|
|
110
|
+
ACTION_RESULT: "agentNative.host.actionResult",
|
|
111
|
+
COMMAND: "agentNative.host.command",
|
|
112
|
+
COMMAND_RESULT: "agentNative.host.commandResult"
|
|
113
|
+
};
|
|
114
|
+
var STORAGE_REQUEST = ${storageRequestType};
|
|
115
|
+
var STORAGE_RESPONSE = ${storageResponseType};
|
|
116
|
+
var SLOT_CONTEXT = ${slotContextType};
|
|
117
|
+
var RESIZE = ${resizeType};
|
|
118
|
+
|
|
119
|
+
function nextId(prefix) {
|
|
120
|
+
seq += 1;
|
|
121
|
+
return prefix + "-" + Date.now() + "-" + seq;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function request(type, responseType, payload, timeoutMs) {
|
|
125
|
+
return new Promise(function(resolve, reject) {
|
|
126
|
+
var requestId = nextId("extension");
|
|
127
|
+
var timer = setTimeout(function() {
|
|
128
|
+
delete pending[requestId];
|
|
129
|
+
reject(new Error("Extension host request timed out"));
|
|
130
|
+
}, timeoutMs || 30000);
|
|
131
|
+
pending[requestId] = {
|
|
132
|
+
responseType: responseType,
|
|
133
|
+
resolve: resolve,
|
|
134
|
+
reject: reject,
|
|
135
|
+
timer: timer
|
|
136
|
+
};
|
|
137
|
+
window.parent.postMessage(Object.assign({ type: type, requestId: requestId }, payload || {}), "*");
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
window.addEventListener("message", function(event) {
|
|
142
|
+
if (event.source !== window.parent) return;
|
|
143
|
+
var message = event.data || {};
|
|
144
|
+
if (message.type === SLOT_CONTEXT) {
|
|
145
|
+
slotContext = message.context || {};
|
|
146
|
+
window.slotContext = slotContext;
|
|
147
|
+
window.agentNative.slotContext = slotContext;
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
var item = pending[message.requestId];
|
|
151
|
+
if (!item || message.type !== item.responseType) return;
|
|
152
|
+
clearTimeout(item.timer);
|
|
153
|
+
delete pending[message.requestId];
|
|
154
|
+
if (message.ok === false || message.error) {
|
|
155
|
+
item.reject(new Error(message.error || "Extension host request failed"));
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
item.resolve(message);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
function storage(operation, payload) {
|
|
162
|
+
return request(STORAGE_REQUEST, STORAGE_RESPONSE, Object.assign({
|
|
163
|
+
operation: operation,
|
|
164
|
+
extensionId: extensionId
|
|
165
|
+
}, payload || {})).then(function(message) {
|
|
166
|
+
return message.result;
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
var api = {
|
|
171
|
+
extensionId: extensionId,
|
|
172
|
+
slotContext: slotContext,
|
|
173
|
+
context: function() {
|
|
174
|
+
return request(HOST.GET_CONTEXT, HOST.CONTEXT).then(function(message) {
|
|
175
|
+
return message.context || {};
|
|
176
|
+
});
|
|
177
|
+
},
|
|
178
|
+
listActions: function() {
|
|
179
|
+
return request(HOST.LIST_ACTIONS, HOST.ACTIONS).then(function(message) {
|
|
180
|
+
return message.actions || [];
|
|
181
|
+
});
|
|
182
|
+
},
|
|
183
|
+
action: function(name, args) {
|
|
184
|
+
return request(HOST.RUN_ACTION, HOST.ACTION_RESULT, {
|
|
185
|
+
name: name,
|
|
186
|
+
args: args || {}
|
|
187
|
+
}).then(function(message) {
|
|
188
|
+
return message.result;
|
|
189
|
+
});
|
|
190
|
+
},
|
|
191
|
+
command: function(command, payload) {
|
|
192
|
+
return request(HOST.COMMAND, HOST.COMMAND_RESULT, {
|
|
193
|
+
command: command,
|
|
194
|
+
payload: payload
|
|
195
|
+
}).then(function(message) {
|
|
196
|
+
return message.result;
|
|
197
|
+
});
|
|
198
|
+
},
|
|
199
|
+
refresh: function(payload) {
|
|
200
|
+
return api.command("refreshData", payload);
|
|
201
|
+
},
|
|
202
|
+
data: {
|
|
203
|
+
list: function(collection, opts) {
|
|
204
|
+
opts = opts || {};
|
|
205
|
+
return storage("list", {
|
|
206
|
+
collection: collection,
|
|
207
|
+
scope: opts.scope,
|
|
208
|
+
limit: opts.limit
|
|
209
|
+
});
|
|
210
|
+
},
|
|
211
|
+
get: function(collection, id, opts) {
|
|
212
|
+
opts = opts || {};
|
|
213
|
+
return storage("get", {
|
|
214
|
+
collection: collection,
|
|
215
|
+
id: id,
|
|
216
|
+
scope: opts.scope
|
|
217
|
+
});
|
|
218
|
+
},
|
|
219
|
+
set: function(collection, id, data, opts) {
|
|
220
|
+
opts = opts || {};
|
|
221
|
+
return storage("set", {
|
|
222
|
+
collection: collection,
|
|
223
|
+
id: id,
|
|
224
|
+
data: data,
|
|
225
|
+
scope: opts.scope
|
|
226
|
+
});
|
|
227
|
+
},
|
|
228
|
+
remove: function(collection, id, opts) {
|
|
229
|
+
opts = opts || {};
|
|
230
|
+
return storage("remove", {
|
|
231
|
+
collection: collection,
|
|
232
|
+
id: id,
|
|
233
|
+
scope: opts.scope
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
window.agentNative = api;
|
|
240
|
+
window.appAction = api.action;
|
|
241
|
+
window.extensionData = api.data;
|
|
242
|
+
window.extensionId = extensionId;
|
|
243
|
+
window.slotContext = slotContext;
|
|
244
|
+
window.toolData = api.data;
|
|
245
|
+
window.toolId = extensionId;
|
|
246
|
+
|
|
247
|
+
function reportSize() {
|
|
248
|
+
var height = Math.max(
|
|
249
|
+
document.documentElement ? document.documentElement.scrollHeight : 0,
|
|
250
|
+
document.body ? document.body.scrollHeight : 0
|
|
251
|
+
);
|
|
252
|
+
window.parent.postMessage({ type: RESIZE, height: height }, "*");
|
|
253
|
+
}
|
|
254
|
+
if (typeof ResizeObserver !== "undefined") {
|
|
255
|
+
window.addEventListener("DOMContentLoaded", function() {
|
|
256
|
+
var observer = new ResizeObserver(reportSize);
|
|
257
|
+
observer.observe(document.body);
|
|
258
|
+
reportSize();
|
|
259
|
+
});
|
|
260
|
+
} else {
|
|
261
|
+
window.addEventListener("load", reportSize);
|
|
262
|
+
setInterval(reportSize, 1000);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
window.parent.postMessage({ type: HOST.READY, requestId: nextId("ready") }, "*");
|
|
266
|
+
})();
|
|
267
|
+
</script>
|
|
268
|
+
</head>
|
|
269
|
+
<body>
|
|
270
|
+
${options.content}
|
|
271
|
+
</body>
|
|
272
|
+
</html>`;
|
|
273
|
+
}
|
|
274
|
+
function storageKey(namespace, context, collection, scope) {
|
|
275
|
+
return [
|
|
276
|
+
"agent-native-extension-data",
|
|
277
|
+
namespace,
|
|
278
|
+
context.extensionId,
|
|
279
|
+
scope,
|
|
280
|
+
collection,
|
|
281
|
+
]
|
|
282
|
+
.map(encodeURIComponent)
|
|
283
|
+
.join(":");
|
|
284
|
+
}
|
|
285
|
+
function readCollection(namespace, context, collection, scope) {
|
|
286
|
+
if (typeof localStorage === "undefined")
|
|
287
|
+
return {};
|
|
288
|
+
const raw = localStorage.getItem(storageKey(namespace, context, collection, scope));
|
|
289
|
+
if (!raw)
|
|
290
|
+
return {};
|
|
291
|
+
try {
|
|
292
|
+
return JSON.parse(raw);
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
return {};
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
function writeCollection(namespace, context, collection, scope, rows) {
|
|
299
|
+
if (typeof localStorage === "undefined")
|
|
300
|
+
return;
|
|
301
|
+
localStorage.setItem(storageKey(namespace, context, collection, scope), JSON.stringify(rows));
|
|
302
|
+
}
|
|
303
|
+
function normalizeScope(scope) {
|
|
304
|
+
return scope === "org" ? "org" : "user";
|
|
305
|
+
}
|
|
306
|
+
export function createLocalStorageAgentNativeExtensionStorage(namespace = "default") {
|
|
307
|
+
return {
|
|
308
|
+
async list(collection, options) {
|
|
309
|
+
const scopes = options.scope === "all"
|
|
310
|
+
? ["user", "org"]
|
|
311
|
+
: [normalizeScope(options.scope)];
|
|
312
|
+
const rows = scopes.flatMap((scope) => Object.values(readCollection(namespace, options.context, collection, scope)));
|
|
313
|
+
return rows
|
|
314
|
+
.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))
|
|
315
|
+
.slice(0, options.limit ?? 100);
|
|
316
|
+
},
|
|
317
|
+
async get(collection, id, options) {
|
|
318
|
+
const scope = normalizeScope(options.scope);
|
|
319
|
+
const rows = readCollection(namespace, options.context, collection, scope);
|
|
320
|
+
return rows[id] ?? null;
|
|
321
|
+
},
|
|
322
|
+
async set(collection, id, data, options) {
|
|
323
|
+
const scope = normalizeScope(options.scope);
|
|
324
|
+
const rows = readCollection(namespace, options.context, collection, scope);
|
|
325
|
+
const now = new Date().toISOString();
|
|
326
|
+
const row = {
|
|
327
|
+
id,
|
|
328
|
+
extensionId: options.context.extensionId,
|
|
329
|
+
collection,
|
|
330
|
+
data,
|
|
331
|
+
scope,
|
|
332
|
+
createdAt: rows[id]?.createdAt ?? now,
|
|
333
|
+
updatedAt: now,
|
|
334
|
+
};
|
|
335
|
+
rows[id] = row;
|
|
336
|
+
writeCollection(namespace, options.context, collection, scope, rows);
|
|
337
|
+
return row;
|
|
338
|
+
},
|
|
339
|
+
async remove(collection, id, options) {
|
|
340
|
+
const scope = normalizeScope(options.scope);
|
|
341
|
+
const rows = readCollection(namespace, options.context, collection, scope);
|
|
342
|
+
delete rows[id];
|
|
343
|
+
writeCollection(namespace, options.context, collection, scope, rows);
|
|
344
|
+
return { ok: true };
|
|
345
|
+
},
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=agent-native-extension-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-native-extension-runtime.js","sourceRoot":"","sources":["../../../src/client/extensions/agent-native-extension-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { EXTENSION_IFRAME_META_CSP } from \"../../extensions/html-shell.js\";\n\nexport const AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES = {\n REQUEST: \"agentNative.extension.storage\",\n RESPONSE: \"agentNative.extension.storageResult\",\n SLOT_CONTEXT: \"agentNative.extension.slotContext\",\n RESIZE: \"agentNative.extension.resize\",\n} as const;\n\nexport type AgentNativeExtensionStorageScope = \"user\" | \"org\";\n\nexport type AgentNativeExtensionStorageOperation =\n | \"list\"\n | \"get\"\n | \"set\"\n | \"remove\";\n\nexport interface AgentNativeExtensionDefinition {\n id: string;\n name: string;\n description?: string;\n content: string;\n updatedAt?: string;\n}\n\nexport interface AgentNativeExtensionStorageRequest {\n operation: AgentNativeExtensionStorageOperation;\n extensionId: string;\n collection: string;\n id?: string;\n data?: unknown;\n scope?: AgentNativeExtensionStorageScope;\n limit?: number;\n}\n\nexport interface AgentNativeExtensionStorageContext {\n extensionId: string;\n slotId?: string;\n slotContext?: Record<string, unknown> | null;\n}\n\nexport interface AgentNativeExtensionDataRow {\n id: string;\n extensionId: string;\n collection: string;\n data: unknown;\n scope: AgentNativeExtensionStorageScope;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AgentNativeExtensionStorage {\n list(\n collection: string,\n options: {\n scope?: AgentNativeExtensionStorageScope | \"all\";\n limit?: number;\n context: AgentNativeExtensionStorageContext;\n },\n ): Promise<AgentNativeExtensionDataRow[]>;\n get(\n collection: string,\n id: string,\n options: {\n scope?: AgentNativeExtensionStorageScope;\n context: AgentNativeExtensionStorageContext;\n },\n ): Promise<AgentNativeExtensionDataRow | null>;\n set(\n collection: string,\n id: string,\n data: unknown,\n options: {\n scope?: AgentNativeExtensionStorageScope;\n context: AgentNativeExtensionStorageContext;\n },\n ): Promise<AgentNativeExtensionDataRow>;\n remove(\n collection: string,\n id: string,\n options: {\n scope?: AgentNativeExtensionStorageScope;\n context: AgentNativeExtensionStorageContext;\n },\n ): Promise<{ ok: true }>;\n}\n\nexport interface BuildAgentNativeExtensionHtmlOptions {\n extensionId: string;\n content: string;\n title?: string;\n dark?: boolean;\n themeCss?: string;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\nfunction safeJson(value: unknown): string {\n return JSON.stringify(value).replace(/</g, \"\\\\u003c\");\n}\n\nconst defaultThemeCss = `\n:root {\n color-scheme: light;\n --background: 0 0% 100%;\n --foreground: 222.2 84% 4.9%;\n --muted: 210 40% 96.1%;\n --muted-foreground: 215.4 16.3% 46.9%;\n --border: 214.3 31.8% 91.4%;\n --primary: 221.2 83.2% 53.3%;\n --primary-foreground: 210 40% 98%;\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%;\n}\n.dark {\n color-scheme: dark;\n --background: 222.2 84% 4.9%;\n --foreground: 210 40% 98%;\n --muted: 217.2 32.6% 17.5%;\n --muted-foreground: 215 20.2% 65.1%;\n --border: 217.2 32.6% 17.5%;\n --primary: 217.2 91.2% 59.8%;\n --primary-foreground: 222.2 47.4% 11.2%;\n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 210 40% 98%;\n}\nhtml, body {\n margin: 0;\n min-height: 100%;\n background: transparent;\n color: hsl(var(--foreground));\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n}\nbody {\n padding: 0;\n}\n`;\n\nexport function buildAgentNativeExtensionHtml(\n options: BuildAgentNativeExtensionHtmlOptions,\n): string {\n const extensionId = safeJson(options.extensionId);\n const storageRequestType = safeJson(\n AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.REQUEST,\n );\n const storageResponseType = safeJson(\n AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.RESPONSE,\n );\n const slotContextType = safeJson(\n AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.SLOT_CONTEXT,\n );\n const resizeType = safeJson(\n AGENT_NATIVE_EXTENSION_STORAGE_MESSAGE_TYPES.RESIZE,\n );\n const themeCss = `${defaultThemeCss}\\n${options.themeCss ?? \"\"}`;\n\n return `<!doctype html>\n<html lang=\"en\"${options.dark ? ' class=\"dark\"' : \"\"}>\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <meta http-equiv=\"Content-Security-Policy\" content=\"${EXTENSION_IFRAME_META_CSP}\" />\n <title>${escapeHtml(options.title ?? \"Agent Native extension\")}</title>\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin />\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@300..700&display=swap\" rel=\"stylesheet\" />\n <script\n src=\"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4.2.4\"\n integrity=\"sha384-yNSZBFvuOWcmww494a9+1zNuvgUGEXoWkein7cxP8wHUTi3iXCU4vJ7hr3tzBCml\"\n crossorigin=\"anonymous\"\n ></script>\n <script\n defer\n src=\"https://cdn.jsdelivr.net/npm/alpinejs@3.15.11/dist/cdn.min.js\"\n integrity=\"sha384-WPtu0YHhJ3arcykfnv1JgUffWDSKRnqnDeTpJUbOc2os2moEmLkIdaeR0trPN4be\"\n crossorigin=\"anonymous\"\n ></script>\n <style>${themeCss}</style>\n <style type=\"text/tailwindcss\">\n @custom-variant dark (&:where(.dark, .dark *));\n @theme {\n --color-background: hsl(var(--background));\n --color-foreground: hsl(var(--foreground));\n --color-muted: hsl(var(--muted));\n --color-muted-foreground: hsl(var(--muted-foreground));\n --color-border: hsl(var(--border));\n --color-primary: hsl(var(--primary));\n --color-primary-foreground: hsl(var(--primary-foreground));\n --color-destructive: hsl(var(--destructive));\n --color-destructive-foreground: hsl(var(--destructive-foreground));\n }\n </style>\n <script>\n (function() {\n var extensionId = ${extensionId};\n var pending = {};\n var seq = 0;\n var slotContext = {};\n var HOST = {\n READY: \"agentNative.host.ready\",\n GET_CONTEXT: \"agentNative.host.getContext\",\n CONTEXT: \"agentNative.host.context\",\n LIST_ACTIONS: \"agentNative.host.listActions\",\n ACTIONS: \"agentNative.host.actions\",\n RUN_ACTION: \"agentNative.host.runAction\",\n ACTION_RESULT: \"agentNative.host.actionResult\",\n COMMAND: \"agentNative.host.command\",\n COMMAND_RESULT: \"agentNative.host.commandResult\"\n };\n var STORAGE_REQUEST = ${storageRequestType};\n var STORAGE_RESPONSE = ${storageResponseType};\n var SLOT_CONTEXT = ${slotContextType};\n var RESIZE = ${resizeType};\n\n function nextId(prefix) {\n seq += 1;\n return prefix + \"-\" + Date.now() + \"-\" + seq;\n }\n\n function request(type, responseType, payload, timeoutMs) {\n return new Promise(function(resolve, reject) {\n var requestId = nextId(\"extension\");\n var timer = setTimeout(function() {\n delete pending[requestId];\n reject(new Error(\"Extension host request timed out\"));\n }, timeoutMs || 30000);\n pending[requestId] = {\n responseType: responseType,\n resolve: resolve,\n reject: reject,\n timer: timer\n };\n window.parent.postMessage(Object.assign({ type: type, requestId: requestId }, payload || {}), \"*\");\n });\n }\n\n window.addEventListener(\"message\", function(event) {\n if (event.source !== window.parent) return;\n var message = event.data || {};\n if (message.type === SLOT_CONTEXT) {\n slotContext = message.context || {};\n window.slotContext = slotContext;\n window.agentNative.slotContext = slotContext;\n return;\n }\n var item = pending[message.requestId];\n if (!item || message.type !== item.responseType) return;\n clearTimeout(item.timer);\n delete pending[message.requestId];\n if (message.ok === false || message.error) {\n item.reject(new Error(message.error || \"Extension host request failed\"));\n return;\n }\n item.resolve(message);\n });\n\n function storage(operation, payload) {\n return request(STORAGE_REQUEST, STORAGE_RESPONSE, Object.assign({\n operation: operation,\n extensionId: extensionId\n }, payload || {})).then(function(message) {\n return message.result;\n });\n }\n\n var api = {\n extensionId: extensionId,\n slotContext: slotContext,\n context: function() {\n return request(HOST.GET_CONTEXT, HOST.CONTEXT).then(function(message) {\n return message.context || {};\n });\n },\n listActions: function() {\n return request(HOST.LIST_ACTIONS, HOST.ACTIONS).then(function(message) {\n return message.actions || [];\n });\n },\n action: function(name, args) {\n return request(HOST.RUN_ACTION, HOST.ACTION_RESULT, {\n name: name,\n args: args || {}\n }).then(function(message) {\n return message.result;\n });\n },\n command: function(command, payload) {\n return request(HOST.COMMAND, HOST.COMMAND_RESULT, {\n command: command,\n payload: payload\n }).then(function(message) {\n return message.result;\n });\n },\n refresh: function(payload) {\n return api.command(\"refreshData\", payload);\n },\n data: {\n list: function(collection, opts) {\n opts = opts || {};\n return storage(\"list\", {\n collection: collection,\n scope: opts.scope,\n limit: opts.limit\n });\n },\n get: function(collection, id, opts) {\n opts = opts || {};\n return storage(\"get\", {\n collection: collection,\n id: id,\n scope: opts.scope\n });\n },\n set: function(collection, id, data, opts) {\n opts = opts || {};\n return storage(\"set\", {\n collection: collection,\n id: id,\n data: data,\n scope: opts.scope\n });\n },\n remove: function(collection, id, opts) {\n opts = opts || {};\n return storage(\"remove\", {\n collection: collection,\n id: id,\n scope: opts.scope\n });\n }\n }\n };\n\n window.agentNative = api;\n window.appAction = api.action;\n window.extensionData = api.data;\n window.extensionId = extensionId;\n window.slotContext = slotContext;\n window.toolData = api.data;\n window.toolId = extensionId;\n\n function reportSize() {\n var height = Math.max(\n document.documentElement ? document.documentElement.scrollHeight : 0,\n document.body ? document.body.scrollHeight : 0\n );\n window.parent.postMessage({ type: RESIZE, height: height }, \"*\");\n }\n if (typeof ResizeObserver !== \"undefined\") {\n window.addEventListener(\"DOMContentLoaded\", function() {\n var observer = new ResizeObserver(reportSize);\n observer.observe(document.body);\n reportSize();\n });\n } else {\n window.addEventListener(\"load\", reportSize);\n setInterval(reportSize, 1000);\n }\n\n window.parent.postMessage({ type: HOST.READY, requestId: nextId(\"ready\") }, \"*\");\n })();\n </script>\n</head>\n<body>\n${options.content}\n</body>\n</html>`;\n}\n\nfunction storageKey(\n namespace: string,\n context: AgentNativeExtensionStorageContext,\n collection: string,\n scope: AgentNativeExtensionStorageScope,\n): string {\n return [\n \"agent-native-extension-data\",\n namespace,\n context.extensionId,\n scope,\n collection,\n ]\n .map(encodeURIComponent)\n .join(\":\");\n}\n\nfunction readCollection(\n namespace: string,\n context: AgentNativeExtensionStorageContext,\n collection: string,\n scope: AgentNativeExtensionStorageScope,\n): Record<string, AgentNativeExtensionDataRow> {\n if (typeof localStorage === \"undefined\") return {};\n const raw = localStorage.getItem(\n storageKey(namespace, context, collection, scope),\n );\n if (!raw) return {};\n try {\n return JSON.parse(raw) as Record<string, AgentNativeExtensionDataRow>;\n } catch {\n return {};\n }\n}\n\nfunction writeCollection(\n namespace: string,\n context: AgentNativeExtensionStorageContext,\n collection: string,\n scope: AgentNativeExtensionStorageScope,\n rows: Record<string, AgentNativeExtensionDataRow>,\n): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(\n storageKey(namespace, context, collection, scope),\n JSON.stringify(rows),\n );\n}\n\nfunction normalizeScope(\n scope: AgentNativeExtensionStorageScope | undefined,\n): AgentNativeExtensionStorageScope {\n return scope === \"org\" ? \"org\" : \"user\";\n}\n\nexport function createLocalStorageAgentNativeExtensionStorage(\n namespace = \"default\",\n): AgentNativeExtensionStorage {\n return {\n async list(collection, options) {\n const scopes =\n options.scope === \"all\"\n ? ([\"user\", \"org\"] as const)\n : ([normalizeScope(options.scope)] as const);\n const rows = scopes.flatMap((scope) =>\n Object.values(\n readCollection(namespace, options.context, collection, scope),\n ),\n );\n return rows\n .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))\n .slice(0, options.limit ?? 100);\n },\n async get(collection, id, options) {\n const scope = normalizeScope(options.scope);\n const rows = readCollection(\n namespace,\n options.context,\n collection,\n scope,\n );\n return rows[id] ?? null;\n },\n async set(collection, id, data, options) {\n const scope = normalizeScope(options.scope);\n const rows = readCollection(\n namespace,\n options.context,\n collection,\n scope,\n );\n const now = new Date().toISOString();\n const row: AgentNativeExtensionDataRow = {\n id,\n extensionId: options.context.extensionId,\n collection,\n data,\n scope,\n createdAt: rows[id]?.createdAt ?? now,\n updatedAt: now,\n };\n rows[id] = row;\n writeCollection(namespace, options.context, collection, scope, rows);\n return row;\n },\n async remove(collection, id, options) {\n const scope = normalizeScope(options.scope);\n const rows = readCollection(\n namespace,\n options.context,\n collection,\n scope,\n );\n delete rows[id];\n writeCollection(namespace, options.context, collection, scope, rows);\n return { ok: true };\n },\n };\n}\n"]}
|