@agent-native/core 0.79.2 → 0.79.5
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/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +24 -0
- package/corpus/core/docs/content/locales/zh-TW/a2a-protocol.md +392 -0
- package/corpus/core/docs/content/locales/zh-TW/actions.md +583 -0
- package/corpus/core/docs/content/locales/zh-TW/agent-mentions.md +164 -0
- package/corpus/core/docs/content/locales/zh-TW/agent-surfaces.md +397 -0
- package/corpus/core/docs/content/locales/zh-TW/agent-teams.md +171 -0
- package/corpus/core/docs/content/locales/zh-TW/agent-web-surfaces.md +161 -0
- package/corpus/core/docs/content/locales/zh-TW/audit-log.md +111 -0
- package/corpus/core/docs/content/locales/zh-TW/authentication.md +332 -0
- package/corpus/core/docs/content/locales/zh-TW/automations.md +268 -0
- package/corpus/core/docs/content/locales/zh-TW/blueprint-installer.md +83 -0
- package/corpus/core/docs/content/locales/zh-TW/cli-adapters.md +129 -0
- package/corpus/core/docs/content/locales/zh-TW/client.md +398 -0
- package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.md +114 -0
- package/corpus/core/docs/content/locales/zh-TW/code-agents-ui.md +436 -0
- package/corpus/core/docs/content/locales/zh-TW/components.md +368 -0
- package/corpus/core/docs/content/locales/zh-TW/context-awareness.md +373 -0
- package/corpus/core/docs/content/locales/zh-TW/creating-templates.md +411 -0
- package/corpus/core/docs/content/locales/zh-TW/cross-app-sso.md +188 -0
- package/corpus/core/docs/content/locales/zh-TW/database.md +183 -0
- package/corpus/core/docs/content/locales/zh-TW/deployment.md +348 -0
- package/corpus/core/docs/content/locales/zh-TW/dispatch.md +146 -0
- package/corpus/core/docs/content/locales/zh-TW/drop-in-agent.md +260 -0
- package/corpus/core/docs/content/locales/zh-TW/durable-resume.md +65 -0
- package/corpus/core/docs/content/locales/zh-TW/embedding-sdk.md +597 -0
- package/corpus/core/docs/content/locales/zh-TW/evals.md +155 -0
- package/corpus/core/docs/content/locales/zh-TW/extensions.md +360 -0
- package/corpus/core/docs/content/locales/zh-TW/external-agents.md +619 -0
- package/corpus/core/docs/content/locales/zh-TW/faq.md +142 -0
- package/corpus/core/docs/content/locales/zh-TW/file-uploads.md +122 -0
- package/corpus/core/docs/content/locales/zh-TW/frames.md +153 -0
- package/corpus/core/docs/content/locales/zh-TW/getting-started.md +199 -0
- package/corpus/core/docs/content/locales/zh-TW/harness-agents.md +349 -0
- package/corpus/core/docs/content/locales/zh-TW/human-approval.md +86 -0
- package/corpus/core/docs/content/locales/zh-TW/internationalization.md +147 -0
- package/corpus/core/docs/content/locales/zh-TW/key-concepts.md +312 -0
- package/corpus/core/docs/content/locales/zh-TW/local-file-mode.md +433 -0
- package/corpus/core/docs/content/locales/zh-TW/mcp-apps.md +147 -0
- package/corpus/core/docs/content/locales/zh-TW/mcp-clients.md +330 -0
- package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.md +279 -0
- package/corpus/core/docs/content/locales/zh-TW/messaging.md +461 -0
- package/corpus/core/docs/content/locales/zh-TW/migration-workbench.md +33 -0
- package/corpus/core/docs/content/locales/zh-TW/multi-app-workspace.md +312 -0
- package/corpus/core/docs/content/locales/zh-TW/multi-tenancy.md +52 -0
- package/corpus/core/docs/content/locales/zh-TW/native-chat-ui.md +321 -0
- package/corpus/core/docs/content/locales/zh-TW/notifications.md +231 -0
- package/corpus/core/docs/content/locales/zh-TW/observability.md +294 -0
- package/corpus/core/docs/content/locales/zh-TW/observational-memory.md +77 -0
- package/corpus/core/docs/content/locales/zh-TW/onboarding.md +216 -0
- package/corpus/core/docs/content/locales/zh-TW/plan-plugin.md +200 -0
- package/corpus/core/docs/content/locales/zh-TW/pr-visual-recap.md +384 -0
- package/corpus/core/docs/content/locales/zh-TW/processors.md +106 -0
- package/corpus/core/docs/content/locales/zh-TW/progress.md +199 -0
- package/corpus/core/docs/content/locales/zh-TW/pure-agent-apps.md +39 -0
- package/corpus/core/docs/content/locales/zh-TW/real-time-collaboration.md +680 -0
- package/corpus/core/docs/content/locales/zh-TW/recurring-jobs.md +142 -0
- package/corpus/core/docs/content/locales/zh-TW/routing.md +79 -0
- package/corpus/core/docs/content/locales/zh-TW/sandbox-adapters.md +227 -0
- package/corpus/core/docs/content/locales/zh-TW/security.md +330 -0
- package/corpus/core/docs/content/locales/zh-TW/server.md +265 -0
- package/corpus/core/docs/content/locales/zh-TW/sharing.md +219 -0
- package/corpus/core/docs/content/locales/zh-TW/skills-guide.md +281 -0
- package/corpus/core/docs/content/locales/zh-TW/template-analytics.md +259 -0
- package/corpus/core/docs/content/locales/zh-TW/template-assets.md +303 -0
- package/corpus/core/docs/content/locales/zh-TW/template-brain.md +324 -0
- package/corpus/core/docs/content/locales/zh-TW/template-calendar.md +194 -0
- package/corpus/core/docs/content/locales/zh-TW/template-chat.md +129 -0
- package/corpus/core/docs/content/locales/zh-TW/template-clips.md +368 -0
- package/corpus/core/docs/content/locales/zh-TW/template-content.md +402 -0
- package/corpus/core/docs/content/locales/zh-TW/template-design.md +173 -0
- package/corpus/core/docs/content/locales/zh-TW/template-dispatch.md +220 -0
- package/corpus/core/docs/content/locales/zh-TW/template-forms.md +178 -0
- package/corpus/core/docs/content/locales/zh-TW/template-mail.md +239 -0
- package/corpus/core/docs/content/locales/zh-TW/template-plan.md +814 -0
- package/corpus/core/docs/content/locales/zh-TW/template-slides.md +293 -0
- package/corpus/core/docs/content/locales/zh-TW/template-videos.md +222 -0
- package/corpus/core/docs/content/locales/zh-TW/tracking.md +236 -0
- package/corpus/core/docs/content/locales/zh-TW/using-your-agent.md +71 -0
- package/corpus/core/docs/content/locales/zh-TW/voice-input.md +81 -0
- package/corpus/core/docs/content/locales/zh-TW/what-is-agent-native.md +202 -0
- package/corpus/core/docs/content/locales/zh-TW/workspace-connections.md +321 -0
- package/corpus/core/docs/content/locales/zh-TW/workspace-management.md +175 -0
- package/corpus/core/docs/content/locales/zh-TW/workspace.md +323 -0
- package/corpus/core/docs/content/locales/zh-TW/writing-agent-instructions.md +173 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/client/ErrorBoundary.tsx +10 -0
- package/corpus/core/src/client/FeedbackButton.tsx +12 -0
- package/corpus/core/src/client/blocks/library/block-copy.ts +32 -0
- package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +33 -0
- package/corpus/core/src/client/i18n.tsx +5 -0
- package/corpus/core/src/localization/actions/set-localization-preference.ts +2 -1
- package/corpus/core/src/localization/shared.ts +45 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +38 -0
- package/corpus/core/src/server/onboarding-html.ts +99 -0
- package/corpus/core/src/templates/default/app/i18n/index.ts +2 -0
- package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +466 -0
- package/corpus/core/src/templates/default/app/root.tsx +8 -0
- package/corpus/templates/analytics/app/i18n/index.ts +2 -0
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +818 -0
- package/corpus/templates/analytics/app/i18n-data.ts +9 -0
- package/corpus/templates/assets/app/i18n/index.ts +2 -0
- package/corpus/templates/assets/app/i18n/zh-TW.ts +860 -0
- package/corpus/templates/assets/app/i18n-data.ts +3 -0
- package/corpus/templates/brain/app/i18n/index.ts +2 -0
- package/corpus/templates/brain/app/i18n/zh-TW.ts +709 -0
- package/corpus/templates/brain/app/i18n-data.ts +3 -0
- package/corpus/templates/calendar/app/i18n/zh-TW.ts +836 -0
- package/corpus/templates/calendar/app/i18n-data.ts +4 -0
- package/corpus/templates/chat/app/i18n/index.ts +2 -0
- package/corpus/templates/chat/app/i18n/zh-TW.ts +67 -0
- package/corpus/templates/chat/app/i18n-data.ts +3 -0
- package/corpus/templates/clips/app/i18n/index.ts +2 -0
- package/corpus/templates/clips/app/i18n/zh-TW.ts +1280 -0
- package/corpus/templates/content/app/i18n/index.ts +2 -0
- package/corpus/templates/content/app/i18n/zh-TW.ts +906 -0
- package/corpus/templates/content/app/i18n-data.ts +4 -0
- package/corpus/templates/design/app/i18n/index.ts +2 -0
- package/corpus/templates/design/app/i18n/zh-TW.ts +517 -0
- package/corpus/templates/design/app/i18n-data.ts +6 -0
- package/corpus/templates/dispatch/app/i18n/index.ts +2 -0
- package/corpus/templates/dispatch/app/i18n/zh-TW.ts +195 -0
- package/corpus/templates/dispatch/app/i18n-data.ts +3 -0
- package/corpus/templates/forms/app/i18n/index.ts +2 -0
- package/corpus/templates/forms/app/i18n/zh-TW.ts +349 -0
- package/corpus/templates/macros/app/i18n/index.ts +2 -0
- package/corpus/templates/macros/app/i18n/zh-TW.ts +224 -0
- package/corpus/templates/mail/app/i18n/index.ts +2 -0
- package/corpus/templates/mail/app/i18n/zh-TW.ts +562 -0
- package/corpus/templates/mail/app/root.tsx +6 -0
- package/corpus/templates/plan/app/i18n/index.ts +2 -0
- package/corpus/templates/plan/app/i18n/zh-TW.ts +712 -0
- package/corpus/templates/slides/app/i18n/index.ts +2 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +531 -0
- package/corpus/templates/videos/app/i18n/index.ts +2 -0
- package/corpus/templates/videos/app/i18n/zh-TW.ts +435 -0
- package/dist/client/ErrorBoundary.d.ts.map +1 -1
- package/dist/client/ErrorBoundary.js +10 -0
- package/dist/client/ErrorBoundary.js.map +1 -1
- package/dist/client/FeedbackButton.d.ts.map +1 -1
- package/dist/client/FeedbackButton.js +12 -0
- package/dist/client/FeedbackButton.js.map +1 -1
- package/dist/client/blocks/library/block-copy.d.ts.map +1 -1
- package/dist/client/blocks/library/block-copy.js +32 -0
- package/dist/client/blocks/library/block-copy.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +32 -0
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/i18n.d.ts.map +1 -1
- package/dist/client/i18n.js +5 -0
- package/dist/client/i18n.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/localization/actions/set-localization-preference.d.ts.map +1 -1
- package/dist/localization/actions/set-localization-preference.js +2 -2
- package/dist/localization/actions/set-localization-preference.js.map +1 -1
- package/dist/localization/shared.d.ts +1 -1
- package/dist/localization/shared.d.ts.map +1 -1
- package/dist/localization/shared.js +43 -0
- package/dist/localization/shared.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +3 -3
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +39 -0
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +2 -2
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +96 -0
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/templates/default/app/i18n/index.ts +2 -0
- package/dist/templates/default/app/i18n/zh-TW.ts +466 -0
- package/dist/templates/default/app/root.tsx +8 -0
- package/docs/content/locales/zh-TW/a2a-protocol.md +392 -0
- package/docs/content/locales/zh-TW/actions.md +583 -0
- package/docs/content/locales/zh-TW/agent-mentions.md +164 -0
- package/docs/content/locales/zh-TW/agent-surfaces.md +397 -0
- package/docs/content/locales/zh-TW/agent-teams.md +171 -0
- package/docs/content/locales/zh-TW/agent-web-surfaces.md +161 -0
- package/docs/content/locales/zh-TW/audit-log.md +111 -0
- package/docs/content/locales/zh-TW/authentication.md +332 -0
- package/docs/content/locales/zh-TW/automations.md +268 -0
- package/docs/content/locales/zh-TW/blueprint-installer.md +83 -0
- package/docs/content/locales/zh-TW/cli-adapters.md +129 -0
- package/docs/content/locales/zh-TW/client.md +398 -0
- package/docs/content/locales/zh-TW/cloneable-saas.md +114 -0
- package/docs/content/locales/zh-TW/code-agents-ui.md +436 -0
- package/docs/content/locales/zh-TW/components.md +368 -0
- package/docs/content/locales/zh-TW/context-awareness.md +373 -0
- package/docs/content/locales/zh-TW/creating-templates.md +411 -0
- package/docs/content/locales/zh-TW/cross-app-sso.md +188 -0
- package/docs/content/locales/zh-TW/database.md +183 -0
- package/docs/content/locales/zh-TW/deployment.md +348 -0
- package/docs/content/locales/zh-TW/dispatch.md +146 -0
- package/docs/content/locales/zh-TW/drop-in-agent.md +260 -0
- package/docs/content/locales/zh-TW/durable-resume.md +65 -0
- package/docs/content/locales/zh-TW/embedding-sdk.md +597 -0
- package/docs/content/locales/zh-TW/evals.md +155 -0
- package/docs/content/locales/zh-TW/extensions.md +360 -0
- package/docs/content/locales/zh-TW/external-agents.md +619 -0
- package/docs/content/locales/zh-TW/faq.md +142 -0
- package/docs/content/locales/zh-TW/file-uploads.md +122 -0
- package/docs/content/locales/zh-TW/frames.md +153 -0
- package/docs/content/locales/zh-TW/getting-started.md +199 -0
- package/docs/content/locales/zh-TW/harness-agents.md +349 -0
- package/docs/content/locales/zh-TW/human-approval.md +86 -0
- package/docs/content/locales/zh-TW/internationalization.md +147 -0
- package/docs/content/locales/zh-TW/key-concepts.md +312 -0
- package/docs/content/locales/zh-TW/local-file-mode.md +433 -0
- package/docs/content/locales/zh-TW/mcp-apps.md +147 -0
- package/docs/content/locales/zh-TW/mcp-clients.md +330 -0
- package/docs/content/locales/zh-TW/mcp-protocol.md +279 -0
- package/docs/content/locales/zh-TW/messaging.md +461 -0
- package/docs/content/locales/zh-TW/migration-workbench.md +33 -0
- package/docs/content/locales/zh-TW/multi-app-workspace.md +312 -0
- package/docs/content/locales/zh-TW/multi-tenancy.md +52 -0
- package/docs/content/locales/zh-TW/native-chat-ui.md +321 -0
- package/docs/content/locales/zh-TW/notifications.md +231 -0
- package/docs/content/locales/zh-TW/observability.md +294 -0
- package/docs/content/locales/zh-TW/observational-memory.md +77 -0
- package/docs/content/locales/zh-TW/onboarding.md +216 -0
- package/docs/content/locales/zh-TW/plan-plugin.md +200 -0
- package/docs/content/locales/zh-TW/pr-visual-recap.md +384 -0
- package/docs/content/locales/zh-TW/processors.md +106 -0
- package/docs/content/locales/zh-TW/progress.md +199 -0
- package/docs/content/locales/zh-TW/pure-agent-apps.md +39 -0
- package/docs/content/locales/zh-TW/real-time-collaboration.md +680 -0
- package/docs/content/locales/zh-TW/recurring-jobs.md +142 -0
- package/docs/content/locales/zh-TW/routing.md +79 -0
- package/docs/content/locales/zh-TW/sandbox-adapters.md +227 -0
- package/docs/content/locales/zh-TW/security.md +330 -0
- package/docs/content/locales/zh-TW/server.md +265 -0
- package/docs/content/locales/zh-TW/sharing.md +219 -0
- package/docs/content/locales/zh-TW/skills-guide.md +281 -0
- package/docs/content/locales/zh-TW/template-analytics.md +259 -0
- package/docs/content/locales/zh-TW/template-assets.md +303 -0
- package/docs/content/locales/zh-TW/template-brain.md +324 -0
- package/docs/content/locales/zh-TW/template-calendar.md +194 -0
- package/docs/content/locales/zh-TW/template-chat.md +129 -0
- package/docs/content/locales/zh-TW/template-clips.md +368 -0
- package/docs/content/locales/zh-TW/template-content.md +402 -0
- package/docs/content/locales/zh-TW/template-design.md +173 -0
- package/docs/content/locales/zh-TW/template-dispatch.md +220 -0
- package/docs/content/locales/zh-TW/template-forms.md +178 -0
- package/docs/content/locales/zh-TW/template-mail.md +239 -0
- package/docs/content/locales/zh-TW/template-plan.md +814 -0
- package/docs/content/locales/zh-TW/template-slides.md +293 -0
- package/docs/content/locales/zh-TW/template-videos.md +222 -0
- package/docs/content/locales/zh-TW/tracking.md +236 -0
- package/docs/content/locales/zh-TW/using-your-agent.md +71 -0
- package/docs/content/locales/zh-TW/voice-input.md +81 -0
- package/docs/content/locales/zh-TW/what-is-agent-native.md +202 -0
- package/docs/content/locales/zh-TW/workspace-connections.md +321 -0
- package/docs/content/locales/zh-TW/workspace-management.md +175 -0
- package/docs/content/locales/zh-TW/workspace.md +323 -0
- package/docs/content/locales/zh-TW/writing-agent-instructions.md +173 -0
- package/package.json +1 -1
- package/src/templates/default/app/i18n/index.ts +2 -0
- package/src/templates/default/app/i18n/zh-TW.ts +466 -0
- package/src/templates/default/app/root.tsx +8 -0
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "嵌入SDK"
|
|
3
|
+
description: "使用頁面上下文和主機指令將 Agent-Native sidecar 嵌入到現有 SaaS 應用中。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 嵌入SDK
|
|
7
|
+
|
|
8
|
+
將 Agent-Native 嵌入現有產品:保留您的 SaaS 應用程式,新增耐用的
|
|
9
|
+
代理sidecar,讓該代理檢視使用者所在頁面並進行操作
|
|
10
|
+
已在使用。如果您仍在無頭代理、丰富聊天和
|
|
11
|
+
嵌入式邊車,或完整的應用程式,從
|
|
12
|
+
[Agent Surfaces](/docs/agent-surfaces).
|
|
13
|
+
|
|
14
|
+
```an-diagram title="包埋膜" summary="主機應用程式提供伺服器端驗證和實時頁面上下文; Agent-Native 執行持久 sidecar 並通過用戶端操作和主機指令到達開啟的分頁。"
|
|
15
|
+
{
|
|
16
|
+
"html": "<div class=\"diagram-embed\"><div class=\"diagram-box\" data-rough><strong>宿主 SaaS 應用</strong><small class=\"diagram-muted\">你的介面,你的認證</small></div><div class=\"diagram-col\"><div class=\"diagram-pill accent\">getContext →</div><div class=\"diagram-pill\">← 用戶端操作</div><div class=\"diagram-pill\">← 宿主指令</div></div><div class=\"diagram-panel center\" data-rough><strong>Agent-Native sidecar</strong><small class=\"diagram-muted\">持久聊天 · 應用狀態 · 擴充功能</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">→</div><div class=\"diagram-box\" data-rough>SQL<br><small class=\"diagram-muted\">框架表</small></div></div>",
|
|
17
|
+
"css": ".diagram-embed{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.diagram-embed .diagram-col{display:flex;flex-direction:column;gap:8px}.diagram-embed .diagram-arrow{font-size:22px;line-height:1}.diagram-embed .center{display:flex;flex-direction:column;align-items:center;gap:4px}"
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 從這裡開始:包含電池的外掛 {#batteries-included}
|
|
22
|
+
|
|
23
|
+
對於大多數 SaaS 主機,**使用完整的嵌入式執行時** - 伺服器外掛
|
|
24
|
+
`createAgentNativeEmbeddedPlugin` 加上 `<AgentNativeEmbedded>` 用戶端
|
|
25
|
+
元件。這是推薦的預設值:它重用整個框架
|
|
26
|
+
(actions、SQL 支持的應用程式狀態、擴充功能、瀏覽器工作階段工具)並給出
|
|
27
|
+
代理檢視使用者正在使用的頁面並進行操作的能力。
|
|
28
|
+
|
|
29
|
+
主機將 Agent-Native 伺服器路由掛載到其現有應用程式中,傳遞其
|
|
30
|
+
使用者登入Agent-Native,並在產品UI中渲染React側邊欄。
|
|
31
|
+
Agent-Native 使用主機部署、主機工作階段和設定
|
|
32
|
+
`DATABASE_URL` 管理自己的框架表:聊天線程、設定,
|
|
33
|
+
應用程式狀態、擴充功能、擴充功能資料、機密、瀏覽器工作階段和
|
|
34
|
+
行動路線。
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pnpm add @agent-native/core
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
在伺服器上:
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
// server/plugins/agent-native.ts
|
|
44
|
+
import { createAgentNativeEmbeddedPlugin } from "@agent-native/core/server";
|
|
45
|
+
import { builderActions } from "../agent-native/actions";
|
|
46
|
+
import { getBuilderSession } from "../auth";
|
|
47
|
+
|
|
48
|
+
export default createAgentNativeEmbeddedPlugin({
|
|
49
|
+
databaseUrl: process.env.DATABASE_URL,
|
|
50
|
+
auth: async (event) => {
|
|
51
|
+
const session = await getBuilderSession(event);
|
|
52
|
+
if (!session) return null;
|
|
53
|
+
return {
|
|
54
|
+
userId: session.user.id,
|
|
55
|
+
email: session.user.email,
|
|
56
|
+
name: session.user.name,
|
|
57
|
+
orgId: session.organization.id,
|
|
58
|
+
orgRole: session.organization.role,
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
actions: builderActions,
|
|
62
|
+
agentChat: {
|
|
63
|
+
appId: "builder",
|
|
64
|
+
systemPrompt:
|
|
65
|
+
"You are Builder's embedded agent. Use Builder actions for durable work.",
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
在用戶端:
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
import {
|
|
74
|
+
AgentNativeEmbedded,
|
|
75
|
+
defineClientAction,
|
|
76
|
+
} from "@agent-native/core/client";
|
|
77
|
+
|
|
78
|
+
export function BuilderAppShell({ children, content, editor }) {
|
|
79
|
+
return (
|
|
80
|
+
<AgentNativeEmbedded
|
|
81
|
+
defaultOpen
|
|
82
|
+
session={{
|
|
83
|
+
id: browserTabId(),
|
|
84
|
+
label: "Builder editor",
|
|
85
|
+
}}
|
|
86
|
+
getContext={() => ({
|
|
87
|
+
route: {
|
|
88
|
+
name: "builder-editor",
|
|
89
|
+
pathname: window.location.pathname,
|
|
90
|
+
params: { contentId: content.id },
|
|
91
|
+
},
|
|
92
|
+
resource: {
|
|
93
|
+
type: "content",
|
|
94
|
+
id: content.id,
|
|
95
|
+
name: content.name,
|
|
96
|
+
},
|
|
97
|
+
user: currentUser(),
|
|
98
|
+
organization: currentOrganization(),
|
|
99
|
+
})}
|
|
100
|
+
actions={[
|
|
101
|
+
defineClientAction({
|
|
102
|
+
name: "select-element",
|
|
103
|
+
description: "Select an element in the visual editor",
|
|
104
|
+
schema: {
|
|
105
|
+
type: "object",
|
|
106
|
+
properties: { elementId: { type: "string" } },
|
|
107
|
+
required: ["elementId"],
|
|
108
|
+
},
|
|
109
|
+
run: ({ elementId }) => editor.select(elementId),
|
|
110
|
+
}),
|
|
111
|
+
]}
|
|
112
|
+
onRefresh={() => queryClient.invalidateQueries()}
|
|
113
|
+
onNavigate={(payload) =>
|
|
114
|
+
router.navigate((payload as { path: string }).path)
|
|
115
|
+
}
|
|
116
|
+
onRemount={() => setAppKey((key) => key + 1)}
|
|
117
|
+
>
|
|
118
|
+
{children}
|
|
119
|
+
</AgentNativeEmbedded>
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
此模式是建議的預設模式,因為它重用了完整的框架:後端 actions 安裝在 `/_agent-native/actions` 下,代理可以調用與 UI 相同的 actions,使用者建立的擴充功能存儲在 SQL 中,`extensionData` 是持久的且具有使用者/組織範圍,瀏覽器工作階段工具允許後端代理檢查或操作目前開啟的分頁。
|
|
125
|
+
|
|
126
|
+
主機驗證是伺服器端的。不要將瀏覽器的身分作為事實來源傳遞;使用主機的請求/工作階段物件或短期伺服器驗證的權杖。如果主機不公開電子郵件,則返回穩定的 `userId`,Agent-Native 將使用它作為所有者金鑰。
|
|
127
|
+
|
|
128
|
+
### 資料庫隔離
|
|
129
|
+
|
|
130
|
+
嵌入模式管理SQL中的Agent-Native表。對於成熟的 SaaS 產品,最安全的預設設定是**相同的託管和驗證、專用的 Agent-Native 資料庫/架構**:
|
|
131
|
+
|
|
132
|
+
```ts
|
|
133
|
+
export default createAgentNativeEmbeddedPlugin({
|
|
134
|
+
databaseUrl: process.env.AGENT_NATIVE_DATABASE_URL,
|
|
135
|
+
auth: getHostSession,
|
|
136
|
+
actions: hostActions,
|
|
137
|
+
});
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
支持使用主機產品的主要 `DATABASE_URL`,但請明確選取。 Agent-Native 建立 `settings`、`application_state`、`tools`、`tool_data` 等框架表、瀏覽器工作階段表、秘密、聊天線程和相關索引。專用的資料庫/模式可以避免表名衝突,保持託管表的所有權清晰,並使備份/保留策略更容易推理。如果您有意共用主機資料庫,請首先檢查現有表名稱,並將 Agent-Native 表視為框架擁有的表。
|
|
141
|
+
|
|
142
|
+
## 其他模式 {#other-modes}
|
|
143
|
+
|
|
144
|
+
上面的包含電池的外掛是幸福的道路。伸手去拿其中之一
|
|
145
|
+
只有當它更適合您的情況時:
|
|
146
|
+
|
|
147
|
+
| 模式 | 什么時候使用它 | 包 |
|
|
148
|
+
| ------------------------ | ------------------------------------------------------------------------------------- | --------------------------------------- |
|
|
149
|
+
| **嵌入式應用程式選取器** | 啟動完整的 Agent-Native 應用程式作為重點 iframe(資產選取器、表單生成器、審批面板)。 | `@agent-native/embedding` |
|
|
150
|
+
| **`<AgentNative>` 主橋** | 手動連線頁面上下文和用戶端 actions 的獨立 sidecar 應用或跨來源 iframe。 | `@agent-native/core/client` |
|
|
151
|
+
| **便攜式擴充功能** | 當 SaaS 已擁有擴充功能存儲/批準時,讓主機使用者建置沙盒迷你應用程式。 | `@agent-native/core/client`擴充功能插槽 |
|
|
152
|
+
|
|
153
|
+
較低級別的 `@agent-native/embedding` 包公開:
|
|
154
|
+
|
|
155
|
+
| 匯入路徑 | 它提供什么 |
|
|
156
|
+
| ---------------------------------- | --------------------------------------------------------------------------------- |
|
|
157
|
+
| `@agent-native/embedding` | `EmbeddedApp` 選取器元件、`getA2AUrl`、`getMcpUrl`、`sendMessage`(流式傳輸 A2A) |
|
|
158
|
+
| `@agent-native/embedding/react` | React 特定的鉤子和元件 |
|
|
159
|
+
| `@agent-native/embedding/bridge` | `announceEmbeddedAppReady`、`sendEmbeddedAppMessage` — 在嵌入式應用內使用 |
|
|
160
|
+
| `@agent-native/embedding/agent` | 代理端點助手 |
|
|
161
|
+
| `@agent-native/embedding/protocol` | 協議型別 |
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
pnpm add @agent-native/embedding
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 嵌入式應用程式和選取器模式
|
|
168
|
+
|
|
169
|
+
當主機產品想要推出完整的產品時,請使用`@agent-native/embedding`
|
|
170
|
+
Agent-Native 應用程式作為聚焦的 iframe 表面:資產選取器、資產生成器,
|
|
171
|
+
表單建置器、行事曆時段選取器、審批面板或任何其他特定於工作的
|
|
172
|
+
工作流程。這是故意小於下面的 sidecar 主橋:
|
|
173
|
+
iframe 宣布準備就緒,主機可以發送命名訊息,並且嵌入
|
|
174
|
+
應用程式可以發出域事件,例如 `chooseAsset` 或 `close`。
|
|
175
|
+
|
|
176
|
+
```tsx
|
|
177
|
+
import { EmbeddedApp } from "@agent-native/embedding";
|
|
178
|
+
|
|
179
|
+
export function AssetPickerDialog({ close }) {
|
|
180
|
+
return (
|
|
181
|
+
<EmbeddedApp
|
|
182
|
+
url="https://assets.agent-native.com/picker"
|
|
183
|
+
className="h-full w-full"
|
|
184
|
+
onLoad={(ref) => {
|
|
185
|
+
ref.postMessage("configure", {
|
|
186
|
+
prompt: "Editorial blog hero",
|
|
187
|
+
aspectRatio: "16:9",
|
|
188
|
+
});
|
|
189
|
+
}}
|
|
190
|
+
onMessage={(name, payload) => {
|
|
191
|
+
if (name === "chooseAsset") {
|
|
192
|
+
const asset = payload as { url: string; altText?: string };
|
|
193
|
+
insertAsset(asset.url, asset.altText);
|
|
194
|
+
close();
|
|
195
|
+
}
|
|
196
|
+
if (name === "close") close();
|
|
197
|
+
}}
|
|
198
|
+
/>
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
在嵌入式應用程式內,使用瀏覽器橋宣布準備就緒並發送
|
|
204
|
+
事件返回主機:
|
|
205
|
+
|
|
206
|
+
```ts
|
|
207
|
+
import {
|
|
208
|
+
announceEmbeddedAppReady,
|
|
209
|
+
sendEmbeddedAppMessage,
|
|
210
|
+
} from "@agent-native/embedding/bridge";
|
|
211
|
+
|
|
212
|
+
announceEmbeddedAppReady({ app: "assets", mode: "picker" });
|
|
213
|
+
sendEmbeddedAppMessage("chooseAsset", {
|
|
214
|
+
url: asset.previewUrl,
|
|
215
|
+
assetId: asset.id,
|
|
216
|
+
altText: asset.altText,
|
|
217
|
+
});
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
資產還發出 `chooseImage` 作為舊圖片選取器的兼容性別名
|
|
221
|
+
主機;新的整合應該偵听 `chooseAsset`。
|
|
222
|
+
|
|
223
|
+
對於託管的第一方應用,啟用跨應用 SSO,並以 Dispatch 作為身分
|
|
224
|
+
集線器,使 `content.agent-native.com` 和 `assets.agent-native.com` 連結使用者
|
|
225
|
+
已驗證的電子郵件。 iframe 啟動仍應使用短暫的、路由範圍的
|
|
226
|
+
在需要第三方 cookie 彈性時嵌入工作階段;普通應用程式cookie
|
|
227
|
+
本身並不是一個完整的嵌入驗證故事。
|
|
228
|
+
|
|
229
|
+
同一包包括用於協議發現的代理端點幫助程序和
|
|
230
|
+
通過 A2A 流式傳輸文本:
|
|
231
|
+
|
|
232
|
+
```ts
|
|
233
|
+
import { getA2AUrl, getMcpUrl, sendMessage } from "@agent-native/embedding";
|
|
234
|
+
|
|
235
|
+
getMcpUrl("https://assets.agent-native.com");
|
|
236
|
+
getA2AUrl("https://assets.agent-native.com");
|
|
237
|
+
|
|
238
|
+
for await (const chunk of sendMessage(
|
|
239
|
+
"https://assets.agent-native.com",
|
|
240
|
+
"Generate a blog hero",
|
|
241
|
+
)) {
|
|
242
|
+
append(chunk);
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### 主機應用程式(`<AgentNative>`主機橋)
|
|
247
|
+
|
|
248
|
+
> 首選上面包含電池的外掛。使用這個較低級別的橋
|
|
249
|
+
> 僅適用於您連線頁面的獨立 sidecar 應用程式或跨來源 iframe
|
|
250
|
+
> 上下文和用戶端 actions 自己。
|
|
251
|
+
|
|
252
|
+
對於獨立的 sidecar 應用程式或跨來源 iframe,請使用較低級別的 `<AgentNative />`。它將 iframe sidecar 和連線頁面上下文、實時用戶端 actions 以及主機刷新/導覽指令呈現在一個位置:
|
|
253
|
+
|
|
254
|
+
```tsx
|
|
255
|
+
import { AgentNative, defineClientAction } from "@agent-native/core/client";
|
|
256
|
+
|
|
257
|
+
export function AssistantDock({ customer, sessionToken }) {
|
|
258
|
+
return (
|
|
259
|
+
<AgentNative
|
|
260
|
+
agentUrl="https://agent.example.com/workspaces/acme/sidecar"
|
|
261
|
+
className="h-full w-full"
|
|
262
|
+
session={{ id: browserTabId(), label: "Customer detail" }}
|
|
263
|
+
auth={() => ({ token: sessionToken })}
|
|
264
|
+
screen={{ includeVisibleText: true }}
|
|
265
|
+
getContext={() => ({
|
|
266
|
+
route: {
|
|
267
|
+
name: "customer-detail",
|
|
268
|
+
pathname: window.location.pathname,
|
|
269
|
+
params: { customerId: customer.id },
|
|
270
|
+
},
|
|
271
|
+
resource: {
|
|
272
|
+
type: "customer",
|
|
273
|
+
id: customer.id,
|
|
274
|
+
name: customer.name,
|
|
275
|
+
},
|
|
276
|
+
selection: {
|
|
277
|
+
ids: getSelectedRowIds(),
|
|
278
|
+
text: window.getSelection()?.toString() || undefined,
|
|
279
|
+
},
|
|
280
|
+
user: currentUser(),
|
|
281
|
+
organization: currentOrganization(),
|
|
282
|
+
})}
|
|
283
|
+
actions={[
|
|
284
|
+
defineClientAction<{ contentId: string }, { published: true }>({
|
|
285
|
+
name: "publish-content",
|
|
286
|
+
description: "Publish a Builder content entry",
|
|
287
|
+
schema: {
|
|
288
|
+
type: "object",
|
|
289
|
+
properties: { contentId: { type: "string" } },
|
|
290
|
+
required: ["contentId"],
|
|
291
|
+
},
|
|
292
|
+
destructive: true,
|
|
293
|
+
approval: { title: "Publish this entry?", risk: "medium" },
|
|
294
|
+
run: async ({ contentId }, { refresh }) => {
|
|
295
|
+
await builderApi.publish(contentId);
|
|
296
|
+
await refresh({ queryKey: ["content", contentId] });
|
|
297
|
+
return { published: true };
|
|
298
|
+
},
|
|
299
|
+
}),
|
|
300
|
+
defineClientAction<{ elementId: string }, void>({
|
|
301
|
+
name: "select-element",
|
|
302
|
+
description: "Select an element in the live visual editor",
|
|
303
|
+
schema: {
|
|
304
|
+
type: "object",
|
|
305
|
+
properties: { elementId: { type: "string" } },
|
|
306
|
+
required: ["elementId"],
|
|
307
|
+
},
|
|
308
|
+
run: ({ elementId }) => editor.select(elementId),
|
|
309
|
+
}),
|
|
310
|
+
]}
|
|
311
|
+
onNavigate={(payload) => {
|
|
312
|
+
const { path } = payload as { path: string };
|
|
313
|
+
router.navigate(path);
|
|
314
|
+
}}
|
|
315
|
+
onRefresh={(payload) => {
|
|
316
|
+
const { queryKey } = payload as { queryKey?: readonly unknown[] };
|
|
317
|
+
queryClient.invalidateQueries({ queryKey });
|
|
318
|
+
}}
|
|
319
|
+
onRemount={() => setAppKey((key) => key + 1)}
|
|
320
|
+
onOpenResource={(payload) => openResource(payload)}
|
|
321
|
+
onRequestApproval={(payload) => approvalDialog.confirm(payload)}
|
|
322
|
+
/>
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
如果您只需要顯式語義上下文,請使用 `screen={false}`。使用 `screen={{ includeDomHtml: true }}` 作為尚未將 UI 對應到語義 ID 和選取狀態的應用程式的後備。預設情況下,主橋僅接受來自 `agentUrl` 來源的訊息。如果 iframe URL 是可信來源不同的路由/代理 URL,則傳遞 `agentOrigin`。
|
|
328
|
+
|
|
329
|
+
對於非 React 主機,直接調用 `createAgentNativeHostBridge()` 並傳遞相同的 `getContext`、`actions` 和 `commands` 選項。
|
|
330
|
+
|
|
331
|
+
### Iframe 側
|
|
332
|
+
|
|
333
|
+
在 Agent-Native sidecar 內,使用框架助手請求主機上下文,發現實時瀏覽器工作階段 actions,執行它們,或要求主機執行 UI 工作。在正式環境中始終通過預期的 `hostOrigin`:
|
|
334
|
+
|
|
335
|
+
```ts
|
|
336
|
+
import {
|
|
337
|
+
announceAgentNativeFrameReady,
|
|
338
|
+
createAgentNativeHostTools,
|
|
339
|
+
requestAgentNativeHostActions,
|
|
340
|
+
requestAgentNativeHostContext,
|
|
341
|
+
runAgentNativeHostAction,
|
|
342
|
+
sendAgentNativeHostCommand,
|
|
343
|
+
} from "@agent-native/core/client";
|
|
344
|
+
|
|
345
|
+
announceAgentNativeFrameReady({ hostOrigin: "https://app.example.com" });
|
|
346
|
+
|
|
347
|
+
const context = await requestAgentNativeHostContext({
|
|
348
|
+
hostOrigin: "https://app.example.com",
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
const liveActions = await requestAgentNativeHostActions({
|
|
352
|
+
hostOrigin: "https://app.example.com",
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
await runAgentNativeHostAction(
|
|
356
|
+
"select-element",
|
|
357
|
+
{ elementId: context.selection?.ids?.[0] },
|
|
358
|
+
{ hostOrigin: "https://app.example.com" },
|
|
359
|
+
);
|
|
360
|
+
|
|
361
|
+
await sendAgentNativeHostCommand(
|
|
362
|
+
"refreshData",
|
|
363
|
+
{ queryKey: ["customer", context.resource?.id] },
|
|
364
|
+
{ hostOrigin: "https://app.example.com" },
|
|
365
|
+
);
|
|
366
|
+
|
|
367
|
+
const hostTools = createAgentNativeHostTools({
|
|
368
|
+
hostOrigin: "https://app.example.com",
|
|
369
|
+
});
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### 伺服器中介工具橋
|
|
373
|
+
|
|
374
|
+
對於 CLAW 風格的同事,iframe 還可以向 sidecar 後端註冊其實時瀏覽器分頁。然後,代理獲取正常的後端工具,將請求排入佇列,iframe 聲明它,主機頁面執行它,後端將結果返回給代理。
|
|
375
|
+
|
|
376
|
+
```an-diagram title="伺服器介導的瀏覽器工作階段橋" summary="後端工具將工作排隊;註冊的分頁聲明它,在實時頁面上執行它,並將結果返回給代理 - 因此 backend/Slack/A2A 代理仍然可以觸摸開啟的分頁。"
|
|
377
|
+
{
|
|
378
|
+
"html": "<div class=\"diagram-bridge\"><div class=\"diagram-node\" data-rough>後端代理<br><small class=\"diagram-muted\">聊天 · Slack · A2A</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">→</div><div class=\"diagram-box\" data-rough>enqueue request<br><small class=\"diagram-muted\">/_agent-native/browser-sessions</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">→</div><div class=\"diagram-node\" data-rough>活動標籤頁面接管它<br><small class=\"diagram-muted\">registered bridge</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">→</div><div class=\"diagram-pill ok\">result → agent</div></div>",
|
|
379
|
+
"css": ".diagram-bridge{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.diagram-bridge .diagram-arrow{font-size:22px;line-height:1}"
|
|
380
|
+
}
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
在 sidecar 應用程式中,當 iframe 安裝時啟動一次瀏覽器工作階段橋:
|
|
384
|
+
|
|
385
|
+
```tsx
|
|
386
|
+
import { useEffect } from "react";
|
|
387
|
+
import { startAgentNativeBrowserSessionBridge } from "@agent-native/core/client";
|
|
388
|
+
|
|
389
|
+
export function SidecarRuntime() {
|
|
390
|
+
useEffect(() => {
|
|
391
|
+
const bridge = startAgentNativeBrowserSessionBridge({
|
|
392
|
+
hostOrigin: "https://app.example.com",
|
|
393
|
+
label: "Builder editor",
|
|
394
|
+
});
|
|
395
|
+
return () => bridge.stop();
|
|
396
|
+
}, []);
|
|
397
|
+
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
框架自動掛載`/_agent-native/browser-sessions`。一旦網橋執行,sidecar 代理就可以使用:
|
|
403
|
+
|
|
404
|
+
| 工具 | 目的 |
|
|
405
|
+
| ------------------------------ | ---------------------------------------------- |
|
|
406
|
+
| `list-browser-sessions` | 檢視目前使用者的已連線主機分頁。 |
|
|
407
|
+
| `view-browser-session` | 向實時分頁詢問目前頁面上下文和螢幕快照。 |
|
|
408
|
+
| `list-browser-session-actions` | 向實時分頁詢問目前用戶端操作清單。 |
|
|
409
|
+
| `run-browser-session-action` | 通過實時分頁執行一項目前用戶端操作。 |
|
|
410
|
+
| `send-browser-session-command` | 請求主機刷新、導覽、重新安裝、重新載入或批準。 |
|
|
411
|
+
|
|
412
|
+
這是當代理在後端、Slack/Telegram/email 中執行或作為 A2A 被調用者執行時使用的橋,但在開啟時仍需要觸摸使用者目前的瀏覽器分頁。如果瀏覽器關閉,後端 actions 仍應處理持久工作,並且瀏覽器工作階段工具將報告沒有連線活動分頁。
|
|
413
|
+
|
|
414
|
+
### Actions
|
|
415
|
+
|
|
416
|
+
有兩個操作類:
|
|
417
|
+
|
|
418
|
+
| 動作型別 | 執行位置 | 瀏覽器關閉時可以工作嗎? | 最適合 |
|
|
419
|
+
| ---------- | ----------------------------------------------------- | ------------------------ | -------------------------------------------------------------------------------- |
|
|
420
|
+
| 後端操作 | Sidecar 應用、後端 API、MCP 或整合適配器 | 是 | 持久的工作,例如建立、更新、發布、同步、發送、匯入。 |
|
|
421
|
+
| 用戶端操作 | 通過 `<AgentNative actions={...} />` 的目前瀏覽器分頁 | 否 | 臨時 UI 的工作方式類似於選取元素、讀取編輯器狀態、滾動到一行、複製目前畫布狀態。 |
|
|
422
|
+
|
|
423
|
+
後端 actions 應該是任何必須在刷新、關閉瀏覽器、重試或整合觸發執行後仍然存在的預設設定。它們屬於 sidecar 應用程式的正常 Agent-Native 操作/工具層,代理可以在其中通過聊天、自動化、Slack/Telegram/電子郵件整合和後台作業調用它們。
|
|
424
|
+
|
|
425
|
+
用戶端 actions 是一個瀏覽器分頁的實時橋梁。主機使用 `source: "client"` 和 `availability: "browser-session"` 來通告它們,並且 sidecar 應該將該清單視為臨時的。當路線或選取發生變化時重新列出 actions,並在分頁消失時回退到後端 actions。
|
|
426
|
+
|
|
427
|
+
### 便攜式擴充功能
|
|
428
|
+
|
|
429
|
+
> 當您希望 Agent-Native 進行管理時,首選包含電池的外掛
|
|
430
|
+
> 擴充功能定義、批準、存儲和代理建立的擴充功能。使用
|
|
431
|
+
> 僅當 SaaS 已經擁有這些問題時才使用下面的可移植插槽。
|
|
432
|
+
|
|
433
|
+
SDK 還支持使用者定義的擴充功能:主機 SaaS 可以在命名槽中呈現的沙盒 Alpine.js 迷你應用程式。當客戶想要針對代理使用的相同操作/上下文介面建置自己的小面板、計算器、儀表板或工作流程助手時,請使用此選項。
|
|
434
|
+
|
|
435
|
+
```tsx
|
|
436
|
+
import {
|
|
437
|
+
AgentNativeExtensionSlot,
|
|
438
|
+
createHttpAgentNativeExtensionStorage,
|
|
439
|
+
defineClientAction,
|
|
440
|
+
} from "@agent-native/core/client";
|
|
441
|
+
|
|
442
|
+
const storage = createHttpAgentNativeExtensionStorage({
|
|
443
|
+
endpoint: "/api/agent-native/extensions/storage",
|
|
444
|
+
headers: () => ({ Authorization: `Bearer ${sessionToken()}` }),
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
const actions = [
|
|
448
|
+
defineClientAction({
|
|
449
|
+
name: "list-at-risk-customers",
|
|
450
|
+
description: "List customers currently at risk",
|
|
451
|
+
schema: { type: "object", properties: {} },
|
|
452
|
+
run: () => crmApi.customers.list({ status: "at-risk" }),
|
|
453
|
+
}),
|
|
454
|
+
];
|
|
455
|
+
|
|
456
|
+
const customerHealthExtension = {
|
|
457
|
+
id: "customer-health",
|
|
458
|
+
name: "Customer health",
|
|
459
|
+
description: "Shows at-risk customers and quick notes.",
|
|
460
|
+
manifest: {
|
|
461
|
+
slots: ["crm.customer.sidebar"],
|
|
462
|
+
requestedActions: ["list-at-risk-customers"],
|
|
463
|
+
requestedCommands: ["openResource", "refreshData"],
|
|
464
|
+
storageScopes: ["user", "org"],
|
|
465
|
+
},
|
|
466
|
+
content: `
|
|
467
|
+
<div x-data="{
|
|
468
|
+
customers: [],
|
|
469
|
+
note: '',
|
|
470
|
+
async init() {
|
|
471
|
+
this.customers = await appAction('list-at-risk-customers', {})
|
|
472
|
+
const row = await extensionData.get('notes', slotContext.customerId, { scope: 'user' })
|
|
473
|
+
this.note = row?.data?.text || ''
|
|
474
|
+
},
|
|
475
|
+
async save() {
|
|
476
|
+
await extensionData.set('notes', slotContext.customerId, { text: this.note }, { scope: 'user' })
|
|
477
|
+
await agentNative.refresh({ customerId: slotContext.customerId })
|
|
478
|
+
}
|
|
479
|
+
}" x-init="init()" class="space-y-3">
|
|
480
|
+
<textarea class="w-full rounded-md border bg-background p-2" x-model="note"></textarea>
|
|
481
|
+
<button class="rounded-md bg-primary px-3 py-2 text-primary-foreground" @click="save()">Save</button>
|
|
482
|
+
</div>
|
|
483
|
+
`,
|
|
484
|
+
};
|
|
485
|
+
|
|
486
|
+
export function CustomerSidebar({ customer, userExtensions }) {
|
|
487
|
+
return (
|
|
488
|
+
<AgentNativeExtensionSlot
|
|
489
|
+
id="crm.customer.sidebar"
|
|
490
|
+
extensions={[customerHealthExtension, ...userExtensions]}
|
|
491
|
+
context={{ customerId: customer.id, plan: customer.plan }}
|
|
492
|
+
actions={actions}
|
|
493
|
+
storage={storage}
|
|
494
|
+
storageContext={{
|
|
495
|
+
userId: currentUser().id,
|
|
496
|
+
organizationId: currentOrganization().id,
|
|
497
|
+
}}
|
|
498
|
+
getContext={() => ({
|
|
499
|
+
resource: { type: "customer", id: customer.id, name: customer.name },
|
|
500
|
+
})}
|
|
501
|
+
commands={{
|
|
502
|
+
refreshData: async () => queryClient.invalidateQueries(),
|
|
503
|
+
}}
|
|
504
|
+
/>
|
|
505
|
+
);
|
|
506
|
+
}
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
清單是安裝合同。當存在 `requestedActions`、`requestedCommands` 或 `storageScopes` 時,SDK 在 iframe 請求到達操作橋或存儲適配器之前在主機中強制執行它們。當 `slots` 存在時,`AgentNativeExtensionSlot` 僅在匹配插槽中渲染擴充功能。主機仍然可以使用 `allowedActions`、`allowedCommands` 和 `allowedStorageScopes` 覆蓋每個插槽的策略。
|
|
510
|
+
|
|
511
|
+
擴充功能名是普通的 HTML。 iframe 執行時為迷你應用程式提供相同的安全橋原語:
|
|
512
|
+
|
|
513
|
+
```html
|
|
514
|
+
<div
|
|
515
|
+
x-data="{ customers: [], async init() { this.customers = await appAction('list-at-risk-customers', {}) } }"
|
|
516
|
+
x-init="init()"
|
|
517
|
+
>
|
|
518
|
+
<template x-for="customer in customers" :key="customer.id">
|
|
519
|
+
<button
|
|
520
|
+
class="block w-full rounded-md px-3 py-2 text-left hover:bg-muted"
|
|
521
|
+
x-text="customer.name"
|
|
522
|
+
@click="agentNative.command('openResource', { type: 'customer', id: customer.id })"
|
|
523
|
+
></button>
|
|
524
|
+
</template>
|
|
525
|
+
</div>
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
iframe 內的可用全域變數:
|
|
529
|
+
|
|
530
|
+
| 幫手 | 目的 |
|
|
531
|
+
| ------------------------------ | ------------------------------------------ |
|
|
532
|
+
| `appAction(name, args)` | 執行主機聲明的操作。 |
|
|
533
|
+
| `agentNative.context()` | 讀取目前主機頁面、資源、插槽和使用者資料。 |
|
|
534
|
+
| `agentNative.command(name, p)` | 要求主機導覽、刷新、重新安裝或開啟。 |
|
|
535
|
+
| `agentNative.refresh(payload)` | `refreshData` 的快捷方式。 |
|
|
536
|
+
| `extensionData.*` | 通過主機適配器保留擴充功能本機資料。 |
|
|
537
|
+
|
|
538
|
+
預設情況下,`extensionData` 使用瀏覽器 `localStorage`,這對於原型和本機小部件很有用。正式環境 SaaS 主機應傳遞後端支持的 `storage` 適配器,以便使用者和組織範圍的擴充功能資料持久、可審核並受應用程式權限管理。通用 HTTP 適配器發送 POST 主體(如 `{ operation, extensionId, slotId, collection, id, data, options, context }`),並直接期望 `{ result }` 或結果 JSON。
|
|
539
|
+
|
|
540
|
+
這個可移植的 SDK 層與框架的內置 SQL 支持的擴充功能存儲是分開的。在 Agent-Native 應用程式中,使用現有的 `ExtensionSlot`/`EmbeddedExtension` 元件和 `create-extension` 操作。在託管 SaaS 嵌入場景中,當您希望 Agent-Native 開箱即用地管理擴充功能定義、審批、存儲和代理建立的擴充功能時,首選 `createAgentNativeEmbeddedPlugin()` 加上 `AgentNativeEmbedded`。僅當 SaaS 已擁有擴充功能定義、批準、市場、存儲和計費時才使用 `AgentNativeExtensionSlot`。
|
|
541
|
+
|
|
542
|
+
安全模型:
|
|
543
|
+
|
|
544
|
+
- 擴充功能 iframe 是沙盒的,沒有 `allow-same-origin`;小應用程式無法直接讀取父DOM、cookies或應用程式執行時。
|
|
545
|
+
- 擴充功能只能調用主機和擴充功能清單允許的 actions 和指令。
|
|
546
|
+
- 有風險的 actions 應設定 `destructive` 或 `requiresApproval`,以便主機可以顯示審批流程。
|
|
547
|
+
- 將使用者建立的擴充功能 HTML 視為不受信任。按使用者/組織檢視市場安裝、紀錄操作使用情況和範圍後端存儲。
|
|
548
|
+
|
|
549
|
+
### 工作階段和分頁
|
|
550
|
+
|
|
551
|
+
主機橋的作用域為一對 iframe/主機窗口。如果同一使用者開啟多個分頁,則每個分頁都有自己的 `session`、上下文、選取、用戶端 actions 和暫停的指令回應。不要假設在一個分頁中發現的用戶端操作可以在另一分頁中執行,或者它在導覽後仍然存在。
|
|
552
|
+
|
|
553
|
+
對於多分頁產品,在 SQL/後端 actions 中保持持久狀態,並僅將用戶端 actions 用於分頁本機部分:聚焦行、複製可見編輯器狀態、選取畫布元素或刷新目前 React 查詢快取。包含足夠的 `route`、`resource` 和 `selection` 上下文,以便 sidecar 決定目前分頁是否是執行瀏覽器工作階段操作的正確位置。
|
|
554
|
+
|
|
555
|
+
### 指令模型
|
|
556
|
+
|
|
557
|
+
內置指令名稱故意采用應用程式形式,而不是資料庫形式:
|
|
558
|
+
|
|
559
|
+
| 指令 | 目的 |
|
|
560
|
+
| -------------------------------------- | ----------------------------------------------- |
|
|
561
|
+
| `navigate` | 將主機 UI 行動到路徑/視圖/資源。 |
|
|
562
|
+
| `refreshData` / `refresh-data` | 要求主機使用戶端資料無效。 |
|
|
563
|
+
| `remountView` / `remount-view` | 要求主機重新掛載子樹,例如`<App key={key} />`。 |
|
|
564
|
+
| `hardReload` / `hard-reload` | 完全重新載入瀏覽器。 |
|
|
565
|
+
| `openResource` / `open-resource` | 在主機UI中開啟特定域物件。 |
|
|
566
|
+
| `requestApproval` / `request-approval` | 要求主持人展示確認流程。為此註冊一個處理程序。 |
|
|
567
|
+
|
|
568
|
+
如果未提供處理程序,安全預設值將調度瀏覽器事件,例如 `agentNative:refresh-data` 和 `agentNative:remount-view`。 `requestApproval`沒有預設處理程序;在依賴它之前先註冊一個。
|
|
569
|
+
|
|
570
|
+
### 審批指南
|
|
571
|
+
|
|
572
|
+
在其清單中將有風險的用戶端 actions 標記為 `destructive: true`,並在執行刪除、發布、發送、收費、邀請、共用或以其他方式影響目前視圖之外的使用者的操作之前需要主機批準。後端 actions 也應該執行自己的授權和批準檢查;主機批準是有用的使用者體驗,而不是安全邊界。
|
|
573
|
+
|
|
574
|
+
更喜歡這個形狀:
|
|
575
|
+
|
|
576
|
+
- 持久突變在後端操作中執行,包括驗證、驗證、審核記錄紀錄和重試。
|
|
577
|
+
- 主機指令開啟批準UI或聚焦受影響的資源。
|
|
578
|
+
- 用戶端操作僅處理無法在後端發生的實時 UI 步驟。
|
|
579
|
+
|
|
580
|
+
### 執行時整合
|
|
581
|
+
|
|
582
|
+
當代理執行時接受普通工具描述符時,請在 sidecar iframe 內使用 `createAgentNativeHostTools()`。它返回四個與框架無關的工具:
|
|
583
|
+
|
|
584
|
+
| 工具 | 目的 |
|
|
585
|
+
| ------------------- | ---------------------------------------------- |
|
|
586
|
+
| `view-host-screen` | 讀取語義主機上下文和螢幕快照。 |
|
|
587
|
+
| `list-host-actions` | 列出目前分頁公開的實時瀏覽器工作階段 actions。 |
|
|
588
|
+
| `run-host-action` | 按名稱執行一個實時用戶端操作。 |
|
|
589
|
+
| `send-host-command` | 發送刷新、導覽、重新安裝或批準等主機指令。 |
|
|
590
|
+
|
|
591
|
+
助手有意返回普通的 `{ name, description, parameters, execute }` 物件,以便 sidecar 可以將它們調整為 AI SDK、Anthropic、OpenAI 函數調用或 Agent-Native `ActionEntry` 形狀,而無需將此 SDK 耦合到一個執行時。
|
|
592
|
+
|
|
593
|
+
## 推薦產品形狀
|
|
594
|
+
|
|
595
|
+
首先啟動 iframe。它適用於 Builder.io、客戶 SaaS 應用程式和內部管理工具,無需耦合發布週期或 CSS/執行時假設。
|
|
596
|
+
|
|
597
|
+
sidecar 本身應該仍然是 Agent-Native 應用程式/範本:actions 是後端 API 表面,SQL 支持的應用程式狀態是代理的內存,並且 Slack 或 Telegram 等整合可以路由到相同的持久聊天。嵌入的 SDK 在該 sidecar 和目前主機頁面之間提供活動膜。
|