@agent-native/core 0.79.12 → 0.79.15
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 +19 -0
- package/corpus/core/docs/content/locales/zh-TW/a2a-protocol.md +68 -68
- package/corpus/core/docs/content/locales/zh-TW/actions.md +82 -82
- package/corpus/core/docs/content/locales/zh-TW/agent-mentions.md +22 -22
- package/corpus/core/docs/content/locales/zh-TW/agent-surfaces.md +82 -82
- package/corpus/core/docs/content/locales/zh-TW/agent-teams.md +29 -29
- package/corpus/core/docs/content/locales/zh-TW/agent-web-surfaces.md +11 -11
- package/corpus/core/docs/content/locales/zh-TW/audit-log.md +16 -16
- package/corpus/core/docs/content/locales/zh-TW/authentication.md +32 -32
- package/corpus/core/docs/content/locales/zh-TW/automations.md +32 -32
- package/corpus/core/docs/content/locales/zh-TW/blueprint-installer.md +19 -19
- package/corpus/core/docs/content/locales/zh-TW/cli-adapters.md +17 -17
- package/corpus/core/docs/content/locales/zh-TW/client.md +62 -62
- package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.md +32 -32
- package/corpus/core/docs/content/locales/zh-TW/code-agents-ui.md +91 -91
- package/corpus/core/docs/content/locales/zh-TW/components.md +51 -51
- package/corpus/core/docs/content/locales/zh-TW/context-awareness.md +66 -66
- package/corpus/core/docs/content/locales/zh-TW/creating-templates.md +39 -39
- package/corpus/core/docs/content/locales/zh-TW/cross-app-sso.md +29 -29
- package/corpus/core/docs/content/locales/zh-TW/database.md +21 -21
- package/corpus/core/docs/content/locales/zh-TW/deployment.md +37 -37
- package/corpus/core/docs/content/locales/zh-TW/dispatch.md +43 -43
- package/corpus/core/docs/content/locales/zh-TW/drop-in-agent.md +34 -34
- package/corpus/core/docs/content/locales/zh-TW/durable-resume.md +18 -18
- package/corpus/core/docs/content/locales/zh-TW/embedding-sdk.md +73 -73
- package/corpus/core/docs/content/locales/zh-TW/evals.md +16 -16
- package/corpus/core/docs/content/locales/zh-TW/extensions.md +81 -81
- package/corpus/core/docs/content/locales/zh-TW/external-agents.md +146 -146
- package/corpus/core/docs/content/locales/zh-TW/faq.md +43 -43
- package/corpus/core/docs/content/locales/zh-TW/file-uploads.md +11 -11
- package/corpus/core/docs/content/locales/zh-TW/frames.md +33 -33
- package/corpus/core/docs/content/locales/zh-TW/getting-started.md +28 -28
- package/corpus/core/docs/content/locales/zh-TW/harness-agents.md +78 -78
- package/corpus/core/docs/content/locales/zh-TW/human-approval.md +27 -27
- package/corpus/core/docs/content/locales/zh-TW/internationalization.md +19 -19
- package/corpus/core/docs/content/locales/zh-TW/key-concepts.md +68 -68
- package/corpus/core/docs/content/locales/zh-TW/local-file-mode.md +50 -50
- package/corpus/core/docs/content/locales/zh-TW/mcp-apps.md +38 -38
- package/corpus/core/docs/content/locales/zh-TW/mcp-clients.md +67 -67
- package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.md +50 -50
- package/corpus/core/docs/content/locales/zh-TW/messaging.md +99 -99
- package/corpus/core/docs/content/locales/zh-TW/migration-workbench.md +6 -6
- package/corpus/core/docs/content/locales/zh-TW/multi-app-workspace.md +39 -39
- package/corpus/core/docs/content/locales/zh-TW/multi-tenancy.md +7 -7
- package/corpus/core/docs/content/locales/zh-TW/native-chat-ui.md +38 -38
- package/corpus/core/docs/content/locales/zh-TW/notifications.md +23 -23
- package/corpus/core/docs/content/locales/zh-TW/observability.md +49 -49
- package/corpus/core/docs/content/locales/zh-TW/observational-memory.md +23 -23
- package/corpus/core/docs/content/locales/zh-TW/onboarding.md +40 -40
- package/corpus/core/docs/content/locales/zh-TW/plan-plugin.md +37 -37
- package/corpus/core/docs/content/locales/zh-TW/pr-visual-recap.md +72 -72
- package/corpus/core/docs/content/locales/zh-TW/processors.md +17 -17
- package/corpus/core/docs/content/locales/zh-TW/progress.md +15 -15
- package/corpus/core/docs/content/locales/zh-TW/pure-agent-apps.md +10 -10
- package/corpus/core/docs/content/locales/zh-TW/real-time-collaboration.md +103 -103
- package/corpus/core/docs/content/locales/zh-TW/recurring-jobs.md +19 -19
- package/corpus/core/docs/content/locales/zh-TW/routing.md +9 -9
- package/corpus/core/docs/content/locales/zh-TW/sandbox-adapters.md +48 -48
- package/corpus/core/docs/content/locales/zh-TW/security.md +49 -49
- package/corpus/core/docs/content/locales/zh-TW/server.md +47 -47
- package/corpus/core/docs/content/locales/zh-TW/sharing.md +22 -22
- package/corpus/core/docs/content/locales/zh-TW/skills-guide.md +46 -46
- package/corpus/core/docs/content/locales/zh-TW/template-analytics.md +40 -40
- package/corpus/core/docs/content/locales/zh-TW/template-assets.md +69 -69
- package/corpus/core/docs/content/locales/zh-TW/template-brain.md +81 -81
- package/corpus/core/docs/content/locales/zh-TW/template-calendar.md +40 -40
- package/corpus/core/docs/content/locales/zh-TW/template-chat.md +27 -27
- package/corpus/core/docs/content/locales/zh-TW/template-clips.md +85 -85
- package/corpus/core/docs/content/locales/zh-TW/template-content.md +65 -66
- package/corpus/core/docs/content/locales/zh-TW/template-design.md +29 -29
- package/corpus/core/docs/content/locales/zh-TW/template-dispatch.md +51 -51
- package/corpus/core/docs/content/locales/zh-TW/template-forms.md +25 -25
- package/corpus/core/docs/content/locales/zh-TW/template-mail.md +71 -71
- package/corpus/core/docs/content/locales/zh-TW/template-plan.md +92 -92
- package/corpus/core/docs/content/locales/zh-TW/template-slides.md +52 -52
- package/corpus/core/docs/content/locales/zh-TW/template-videos.md +30 -30
- package/corpus/core/docs/content/locales/zh-TW/tracking.md +29 -29
- package/corpus/core/docs/content/locales/zh-TW/using-your-agent.md +18 -18
- package/corpus/core/docs/content/locales/zh-TW/voice-input.md +19 -19
- package/corpus/core/docs/content/locales/zh-TW/what-is-agent-native.md +61 -61
- package/corpus/core/docs/content/locales/zh-TW/workspace-connections.md +41 -41
- package/corpus/core/docs/content/locales/zh-TW/workspace-management.md +27 -27
- package/corpus/core/docs/content/locales/zh-TW/workspace.md +58 -58
- package/corpus/core/docs/content/locales/zh-TW/writing-agent-instructions.md +41 -41
- package/corpus/core/docs/content/template-clips.md +48 -2
- package/corpus/core/package.json +2 -1
- package/corpus/core/src/client/AgentPanel.tsx +27 -3
- package/corpus/core/src/deploy/build.ts +417 -42
- package/corpus/core/src/deploy/route-discovery.ts +1 -1
- package/corpus/core/src/server/edge.ts +50 -0
- package/corpus/core/src/styles/agent-native.css +93 -0
- package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +44 -44
- package/corpus/core/src/vite/client.ts +1 -0
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +5 -3
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +69 -70
- package/corpus/templates/analytics/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/assets/app/components/layout/Layout.tsx +3 -3
- package/corpus/templates/assets/app/i18n/zh-TW.ts +82 -82
- package/corpus/templates/assets/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/brain/app/components/layout/Layout.tsx +6 -4
- package/corpus/templates/brain/app/i18n/zh-TW.ts +90 -90
- package/corpus/templates/brain/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +1 -1
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +1 -1
- package/corpus/templates/calendar/app/i18n/zh-TW.ts +57 -57
- package/corpus/templates/calendar/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/calendar/server/lib/booking-og-fonts.ts +20 -6
- package/corpus/templates/calendar/server/lib/booking-og-image.ts +17 -9
- package/corpus/templates/chat/app/components/layout/Layout.tsx +5 -3
- package/corpus/templates/chat/app/i18n/zh-TW.ts +3 -3
- package/corpus/templates/chat/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/clips/AGENTS.md +6 -0
- package/corpus/templates/clips/actions/delete-recording-permanent.ts +7 -1
- package/corpus/templates/clips/actions/get-recording-player-data.ts +44 -2
- package/corpus/templates/clips/actions/navigate.ts +2 -0
- package/corpus/templates/clips/actions/save-bug-report-context.ts +173 -0
- package/corpus/templates/clips/actions/view-screen.ts +58 -7
- package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +9 -3
- package/corpus/templates/clips/app/hooks/use-navigation-state.ts +17 -0
- package/corpus/templates/clips/app/i18n/ar-SA.ts +31 -0
- package/corpus/templates/clips/app/i18n/de-DE.ts +32 -0
- package/corpus/templates/clips/app/i18n/en-US.ts +32 -0
- package/corpus/templates/clips/app/i18n/es-ES.ts +32 -0
- package/corpus/templates/clips/app/i18n/fr-FR.ts +32 -0
- package/corpus/templates/clips/app/i18n/hi-IN.ts +32 -0
- package/corpus/templates/clips/app/i18n/ja-JP.ts +31 -0
- package/corpus/templates/clips/app/i18n/ko-KR.ts +32 -0
- package/corpus/templates/clips/app/i18n/pt-BR.ts +32 -0
- package/corpus/templates/clips/app/i18n/zh-CN.ts +30 -0
- package/corpus/templates/clips/app/i18n/zh-TW.ts +461 -451
- package/corpus/templates/clips/app/routes/bug-report.done.tsx +126 -0
- package/corpus/templates/clips/app/routes/bug-report.tsx +222 -0
- package/corpus/templates/clips/app/routes/record.tsx +104 -12
- package/corpus/templates/clips/changelog/2026-06-26-brief-network-blips-no-longer-block-recording-or-wrongly-pro.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-bug-report-recordings-can-keep-redacted-host-app-context-wit.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-bug-report-widgets-can-launch-clips-recordings-from-embedded.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-desktop-recording-keeps-connected-users-out-of-the-storage-s.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-if-a-recording-can-t-be-uploaded-the-chrome-extension-now-sa.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/clips/chrome-extension/public/manifest.json +9 -2
- package/corpus/templates/clips/chrome-extension/src/background.ts +43 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +111 -6
- package/corpus/templates/clips/chrome-extension/src/popup.ts +18 -7
- package/corpus/templates/clips/desktop/src/app.tsx +53 -19
- package/corpus/templates/clips/server/db/schema.ts +26 -0
- package/corpus/templates/clips/server/lib/public-agent-context.ts +51 -0
- package/corpus/templates/clips/server/plugins/auth.ts +1 -0
- package/corpus/templates/clips/server/plugins/db.ts +28 -0
- package/corpus/templates/clips/server/routes/api/agent-context.json.get.ts +4 -1
- package/corpus/templates/clips/shared/bug-report.ts +161 -0
- package/corpus/templates/content/app/components/layout/Layout.tsx +10 -8
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +1 -1
- package/corpus/templates/content/app/i18n/zh-TW.ts +67 -66
- package/corpus/templates/content/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +3 -3
- package/corpus/templates/design/app/i18n/zh-TW.ts +44 -44
- package/corpus/templates/design/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/dispatch/app/i18n/zh-TW.ts +5 -4
- package/corpus/templates/dispatch/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/forms/app/components/layout/Layout.tsx +4 -2
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +1 -1
- package/corpus/templates/forms/app/i18n/zh-TW.ts +48 -48
- package/corpus/templates/forms/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +3 -3
- package/corpus/templates/macros/app/i18n/zh-TW.ts +5 -5
- package/corpus/templates/macros/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/mail/app/i18n/zh-TW.ts +83 -83
- package/corpus/templates/mail/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/plan/app/components/layout/Layout.tsx +5 -3
- package/corpus/templates/plan/app/i18n/zh-TW.ts +69 -69
- package/corpus/templates/plan/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/slides/app/components/layout/Layout.tsx +3 -3
- package/corpus/templates/slides/app/i18n/zh-TW.ts +64 -64
- package/corpus/templates/slides/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/videos/app/components/layout/Layout.tsx +2 -2
- package/corpus/templates/videos/app/i18n/zh-TW.ts +54 -54
- package/corpus/templates/videos/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +14 -4
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/deploy/build.d.ts +3 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +361 -37
- package/dist/deploy/build.js.map +1 -1
- package/dist/deploy/route-discovery.d.ts +1 -1
- package/dist/deploy/route-discovery.js +1 -1
- package/dist/deploy/route-discovery.js.map +1 -1
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/server/edge.d.ts +11 -0
- package/dist/server/edge.d.ts.map +1 -0
- package/dist/server/edge.js +11 -0
- package/dist/server/edge.js.map +1 -0
- package/dist/styles/agent-native.css +93 -0
- package/dist/templates/default/app/i18n/zh-TW.ts +44 -44
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +1 -0
- package/dist/vite/client.js.map +1 -1
- package/docs/content/locales/zh-TW/a2a-protocol.md +68 -68
- package/docs/content/locales/zh-TW/actions.md +82 -82
- package/docs/content/locales/zh-TW/agent-mentions.md +22 -22
- package/docs/content/locales/zh-TW/agent-surfaces.md +82 -82
- package/docs/content/locales/zh-TW/agent-teams.md +29 -29
- package/docs/content/locales/zh-TW/agent-web-surfaces.md +11 -11
- package/docs/content/locales/zh-TW/audit-log.md +16 -16
- package/docs/content/locales/zh-TW/authentication.md +32 -32
- package/docs/content/locales/zh-TW/automations.md +32 -32
- package/docs/content/locales/zh-TW/blueprint-installer.md +19 -19
- package/docs/content/locales/zh-TW/cli-adapters.md +17 -17
- package/docs/content/locales/zh-TW/client.md +62 -62
- package/docs/content/locales/zh-TW/cloneable-saas.md +32 -32
- package/docs/content/locales/zh-TW/code-agents-ui.md +91 -91
- package/docs/content/locales/zh-TW/components.md +51 -51
- package/docs/content/locales/zh-TW/context-awareness.md +66 -66
- package/docs/content/locales/zh-TW/creating-templates.md +39 -39
- package/docs/content/locales/zh-TW/cross-app-sso.md +29 -29
- package/docs/content/locales/zh-TW/database.md +21 -21
- package/docs/content/locales/zh-TW/deployment.md +37 -37
- package/docs/content/locales/zh-TW/dispatch.md +43 -43
- package/docs/content/locales/zh-TW/drop-in-agent.md +34 -34
- package/docs/content/locales/zh-TW/durable-resume.md +18 -18
- package/docs/content/locales/zh-TW/embedding-sdk.md +73 -73
- package/docs/content/locales/zh-TW/evals.md +16 -16
- package/docs/content/locales/zh-TW/extensions.md +81 -81
- package/docs/content/locales/zh-TW/external-agents.md +146 -146
- package/docs/content/locales/zh-TW/faq.md +43 -43
- package/docs/content/locales/zh-TW/file-uploads.md +11 -11
- package/docs/content/locales/zh-TW/frames.md +33 -33
- package/docs/content/locales/zh-TW/getting-started.md +28 -28
- package/docs/content/locales/zh-TW/harness-agents.md +78 -78
- package/docs/content/locales/zh-TW/human-approval.md +27 -27
- package/docs/content/locales/zh-TW/internationalization.md +19 -19
- package/docs/content/locales/zh-TW/key-concepts.md +68 -68
- package/docs/content/locales/zh-TW/local-file-mode.md +50 -50
- package/docs/content/locales/zh-TW/mcp-apps.md +38 -38
- package/docs/content/locales/zh-TW/mcp-clients.md +67 -67
- package/docs/content/locales/zh-TW/mcp-protocol.md +50 -50
- package/docs/content/locales/zh-TW/messaging.md +99 -99
- package/docs/content/locales/zh-TW/migration-workbench.md +6 -6
- package/docs/content/locales/zh-TW/multi-app-workspace.md +39 -39
- package/docs/content/locales/zh-TW/multi-tenancy.md +7 -7
- package/docs/content/locales/zh-TW/native-chat-ui.md +38 -38
- package/docs/content/locales/zh-TW/notifications.md +23 -23
- package/docs/content/locales/zh-TW/observability.md +49 -49
- package/docs/content/locales/zh-TW/observational-memory.md +23 -23
- package/docs/content/locales/zh-TW/onboarding.md +40 -40
- package/docs/content/locales/zh-TW/plan-plugin.md +37 -37
- package/docs/content/locales/zh-TW/pr-visual-recap.md +72 -72
- package/docs/content/locales/zh-TW/processors.md +17 -17
- package/docs/content/locales/zh-TW/progress.md +15 -15
- package/docs/content/locales/zh-TW/pure-agent-apps.md +10 -10
- package/docs/content/locales/zh-TW/real-time-collaboration.md +103 -103
- package/docs/content/locales/zh-TW/recurring-jobs.md +19 -19
- package/docs/content/locales/zh-TW/routing.md +9 -9
- package/docs/content/locales/zh-TW/sandbox-adapters.md +48 -48
- package/docs/content/locales/zh-TW/security.md +49 -49
- package/docs/content/locales/zh-TW/server.md +47 -47
- package/docs/content/locales/zh-TW/sharing.md +22 -22
- package/docs/content/locales/zh-TW/skills-guide.md +46 -46
- package/docs/content/locales/zh-TW/template-analytics.md +40 -40
- package/docs/content/locales/zh-TW/template-assets.md +69 -69
- package/docs/content/locales/zh-TW/template-brain.md +81 -81
- package/docs/content/locales/zh-TW/template-calendar.md +40 -40
- package/docs/content/locales/zh-TW/template-chat.md +27 -27
- package/docs/content/locales/zh-TW/template-clips.md +85 -85
- package/docs/content/locales/zh-TW/template-content.md +65 -66
- package/docs/content/locales/zh-TW/template-design.md +29 -29
- package/docs/content/locales/zh-TW/template-dispatch.md +51 -51
- package/docs/content/locales/zh-TW/template-forms.md +25 -25
- package/docs/content/locales/zh-TW/template-mail.md +71 -71
- package/docs/content/locales/zh-TW/template-plan.md +92 -92
- package/docs/content/locales/zh-TW/template-slides.md +52 -52
- package/docs/content/locales/zh-TW/template-videos.md +30 -30
- package/docs/content/locales/zh-TW/tracking.md +29 -29
- package/docs/content/locales/zh-TW/using-your-agent.md +18 -18
- package/docs/content/locales/zh-TW/voice-input.md +19 -19
- package/docs/content/locales/zh-TW/what-is-agent-native.md +61 -61
- package/docs/content/locales/zh-TW/workspace-connections.md +41 -41
- package/docs/content/locales/zh-TW/workspace-management.md +27 -27
- package/docs/content/locales/zh-TW/workspace.md +58 -58
- package/docs/content/locales/zh-TW/writing-agent-instructions.md +41 -41
- package/docs/content/template-clips.md +48 -2
- package/package.json +2 -1
- package/src/templates/default/app/i18n/zh-TW.ts +44 -44
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: "元件API"
|
|
3
|
-
description: "用於自訂代理 UI
|
|
2
|
+
title: "元件 API"
|
|
3
|
+
description: "用於自訂代理 UI、聊天欄位、對話呈現、即時狀態、共用、進度和豐富編輯器的公開 React 建置塊。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# 元件API
|
|
6
|
+
# 元件 API
|
|
7
7
|
|
|
8
8
|
Agent-Native 附帶了完整的側邊欄,但側邊欄不是合同。
|
|
9
|
-
|
|
10
|
-
附件、模型選取、執行和 SQL
|
|
11
|
-
當你需要定制產品UI時,可以選取元件,並下拉一層。
|
|
9
|
+
合約是執行時:聊天流、對話串狀態、actions、脈絡,
|
|
10
|
+
附件、模型選取、執行和 SQL 支援的同步。使用庫存
|
|
11
|
+
當你需要定制產品 UI 時,可以選取元件,並下拉一層。
|
|
12
12
|
|
|
13
|
-
從聚焦的用戶端子路徑匯入瀏覽器UI:
|
|
13
|
+
從聚焦的用戶端子路徑匯入瀏覽器 UI:
|
|
14
14
|
|
|
15
15
|
```tsx
|
|
16
16
|
import { AgentSidebar } from "@agent-native/core/client";
|
|
@@ -25,23 +25,23 @@ import { ResourcesPanel } from "@agent-native/core/client/resources";
|
|
|
25
25
|
`@agent-native/core/client` 或聚焦的 `@agent-native/core/client/*` 子路徑
|
|
26
26
|
因此捆綁商選取瀏覽器安全的條目。
|
|
27
27
|
|
|
28
|
-
```an-diagram title="下拉一層,不脫離框架" summary="每個層都保持相同的執行時 -
|
|
28
|
+
```an-diagram title="下拉一層,不脫離框架" summary="每個層都保持相同的執行時 - 操作、對話串狀態和 SQL-backed 同步 - 同時讓您更好地控制鑲邊。"
|
|
29
29
|
{
|
|
30
30
|
"html": "<div class=\"diagram-layers\"><div class=\"diagram-card layer\"><span class=\"diagram-pill accent\"><AgentSidebar></span><small class=\"diagram-muted\">圍繞應用的完整側邊欄。80% 的常見場景。</small></div><div class=\"diagram-card layer l2\"><span class=\"diagram-pill\"><AgentPanel> · <AgentChatSurface></span><small class=\"diagram-muted\">你自己布局中的面板或聊天頁面。</small></div><div class=\"diagram-card layer l3\"><span class=\"diagram-pill\"><AssistantChat> + runtime</span><small class=\"diagram-muted\">Own the chrome; optionally pass a BYO AgentChatRuntime.</small></div><div class=\"diagram-card layer l4\"><span class=\"diagram-pill\"><PromptComposer> · <AgentConversation></span><small class=\"diagram-muted\">撰寫r and transcript primitives only.</small></div><div class=\"diagram-rail\" data-rough>同一 runtime: actions · thread state · SQL-backed sync</div></div>",
|
|
31
31
|
"css": ".diagram-layers{display:flex;flex-direction:column;gap:10px}.diagram-layers .layer{display:flex;flex-direction:column;gap:4px;padding:12px 14px}.diagram-layers .l2{margin-inline-start:24px}.diagram-layers .l3{margin-inline-start:48px}.diagram-layers .l4{margin-inline-start:72px}.diagram-layers .diagram-rail{margin-top:6px;padding:10px 14px;text-align:center}"
|
|
32
32
|
}
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
## 代理並聊天UI {#agent-chat-ui}
|
|
35
|
+
## 代理並聊天 UI {#agent-chat-ui}
|
|
36
36
|
|
|
37
37
|
| API | 匯入路徑 | 何時使用 |
|
|
38
38
|
| ------------------------------------ | --------------------------------------------- | ----------------------------------------------------------- |
|
|
39
39
|
| `<AgentSidebar>` | `@agent-native/core/client` 或 `/client/chat` | 您希望應用程式週圍有完整的側邊欄。 |
|
|
40
40
|
| `<AgentToggleButton>` | `@agent-native/core/client` 或 `/client/chat` | 您為側邊欄渲染自己的標題按鈕。 |
|
|
41
|
-
| `<AgentPanel>` | `@agent-native/core/client` 或 `/client/chat` |
|
|
41
|
+
| `<AgentPanel>` | `@agent-native/core/client` 或 `/client/chat` | 您希望在自己的布局、路由、對話框或側欄中顯示完整面板。 |
|
|
42
42
|
| `<AgentChatSurface>` | `@agent-native/core/client` 或 `/client/chat` | 您希望在面板或頁面模式下聊天,而不需要側邊欄包裝。 |
|
|
43
|
-
| `<AssistantChat>` | `@agent-native/core/client`或`/client/chat` |
|
|
44
|
-
| `<MultiTabAssistantChat>` | `@agent-native/core/client` 或 `/client/chat` |
|
|
43
|
+
| `<AssistantChat>` | `@agent-native/core/client`或`/client/chat` | 您希望擁有週圍的鑲邊,同時保持標準對話和撰寫器執行時。 |
|
|
44
|
+
| `<MultiTabAssistantChat>` | `@agent-native/core/client` 或 `/client/chat` | 您希望框架的對話串分頁沒有 `AgentPanel` chrome。 |
|
|
45
45
|
| `createHttpAgentChatRuntime()` | `@agent-native/core/client` 或 `/client/chat` | 您有一個 BYO 代理端點,用於流式傳輸規範化的聊天事件。 |
|
|
46
46
|
| `createOpenAIAgentsChatRuntime()` | `@agent-native/core/client` 或 `/client/chat` | 您有一個 OpenAI 代理 SDK 流,並希望圍繞它進行標準聊天 UI。 |
|
|
47
47
|
| `createOpenAIResponsesChatRuntime()` | `@agent-native/core/client` 或 `/client/chat` | 您有一個 OpenAI 回應事件流,並希望將其規範化到聊天 UI 中。 |
|
|
@@ -49,20 +49,20 @@ import { ResourcesPanel } from "@agent-native/core/client/resources";
|
|
|
49
49
|
| `createClaudeAgentChatRuntime()` | `@agent-native/core/client`或`/client/chat` | 您有一個 Claude 代理 SDK 流,並希望將其規範化到聊天 UI 中。 |
|
|
50
50
|
| `createVercelAiChatRuntime()` | `@agent-native/core/client` 或 `/client/chat` | 您有一個 Vercel AI SDK 流,並希望將其規範化到聊天 UI 中。 |
|
|
51
51
|
| `createAgentChatRuntimeAdapter()` | `@agent-native/core/client` 或 `/client/chat` | 需要自己將一個`AgentChatRuntime`適配成assistant-ui。 |
|
|
52
|
-
| `createAgentChatAdapter()` | `@agent-native/core/client` 或 `/client/chat` |
|
|
53
|
-
| `useChatThreads()` | `@agent-native/core/client`或`/client/chat` |
|
|
52
|
+
| `createAgentChatAdapter()` | `@agent-native/core/client` 或 `/client/chat` | 您需要內建 Agent-Native SSE 傳輸作為低階助手 UI 轉接器。 |
|
|
53
|
+
| `useChatThreads()` | `@agent-native/core/client`或`/client/chat` | 您需要自訂話題清單、歷史紀錄選取器或範圍聊天 UI。 |
|
|
54
54
|
| `sendToAgentChat()` | `@agent-native/core/client` 或 `/client/chat` | 產品操作應該將工作交給代理聊天。 |
|
|
55
55
|
|
|
56
|
-
`AgentChatRuntime` 是標準聊天 shell 的 BYO
|
|
56
|
+
`AgentChatRuntime` 是標準聊天 shell 的 BYO 代理合約。透過
|
|
57
57
|
當外部代理應該為 `runtime` 到 `<AssistantChat>` 供電時
|
|
58
|
-
Agent-Native
|
|
59
|
-
|
|
58
|
+
Agent-Native 保留撰寫器、文字紀錄、工具卡和
|
|
59
|
+
本機小工具渲染。上面的連線器是 API 面;執行時
|
|
60
60
|
合同和事件形狀在中教授
|
|
61
61
|
[Native 聊天介面 — BYO agent runtimes](/docs/native-chat-ui#byo-agent-runtimes).
|
|
62
|
-
|
|
62
|
+
如果您在無頭代理、豐富聊天、嵌入式 sidecar 之間進行選取
|
|
63
63
|
完整的應用形狀,請參閱 [Agent Surfaces](/docs/agent-surfaces)。
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
最短的自訂路由仍然是預接線表面:
|
|
66
66
|
|
|
67
67
|
```tsx
|
|
68
68
|
import { AgentChatSurface } from "@agent-native/core/client/chat";
|
|
@@ -100,18 +100,18 @@ function CustomChat({ projectSlug }: { projectSlug: string }) {
|
|
|
100
100
|
連線器使用情況、標準化事件流以及何時到達
|
|
101
101
|
`createHttpAgentChatRuntime()` 與特定於協議的連線器。
|
|
102
102
|
|
|
103
|
-
##
|
|
103
|
+
## 聊天欄位和撰寫器 {#composer}
|
|
104
104
|
|
|
105
105
|
當您需要進行相同的聊天時,請使用`@agent-native/core/client/composer`
|
|
106
|
-
自訂UI內的側邊欄使用的欄位。
|
|
106
|
+
自訂 UI 內的側邊欄使用的欄位。
|
|
107
107
|
|
|
108
108
|
| API | 何時使用 |
|
|
109
109
|
| --------------------------------- | -------------------------------------------------------------------------------------------------------------- |
|
|
110
|
-
| `<PromptComposer>` |
|
|
110
|
+
| `<PromptComposer>` | 您需要一個隨時可以提交的聊天欄位,其中包含附件、斜線指令、參考、貼上文字處理、草稿持久性、語音輸入和提交語義。 |
|
|
111
111
|
| `<AgentComposerFrame>` | 您需要自訂 撰寫r 主體週圍的標準視覺外殼。 |
|
|
112
|
-
| `<TiptapComposer>` |
|
|
113
|
-
| `buildPromptComposerSubmission()` |
|
|
114
|
-
| `formatPromptWithAttachments()` |
|
|
112
|
+
| `<TiptapComposer>` | 您需要最低階別的豐富聊天欄位。它必須在 Assistant-ui `ThreadPrimitive.Root` / 撰寫r 執行時內呈現。 |
|
|
113
|
+
| `buildPromptComposerSubmission()` | 在呼叫您自己的提交處理常式之前,您需要相同的附件和貼上文字規範化。 |
|
|
114
|
+
| `formatPromptWithAttachments()` | 您需要將隱藏的附件中繼資料呈現到提示字串中。 |
|
|
115
115
|
|
|
116
116
|
大多數自訂 UI 應以 `PromptComposer` 開頭:
|
|
117
117
|
|
|
@@ -136,19 +136,19 @@ import { PromptComposer } from "@agent-native/core/client/composer";
|
|
|
136
136
|
|
|
137
137
|
| API | 何時使用 |
|
|
138
138
|
| ----------------------------------------------- | ------------------------------------ |
|
|
139
|
-
| `<AgentConversation>` |
|
|
139
|
+
| `<AgentConversation>` | 呈現標準化代理訊息清單。 |
|
|
140
140
|
| `<AgentConversationMessageView>` | 渲染一條標準化訊息。 |
|
|
141
141
|
| `normalizeCodeAgentTranscriptForConversation()` | 將程式碼代理轉錄事件轉換為對話訊息。 |
|
|
142
|
-
| `useNearBottomAutoscroll()` |
|
|
142
|
+
| `useNearBottomAutoscroll()` | 在流式傳輸時將自訂指令碼固定在底部。 |
|
|
143
143
|
|
|
144
144
|
這一層有意做到資料優先:您擁有訊息的來源,並且
|
|
145
145
|
渲染器擁有一致的降價、附件、通知、工件和
|
|
146
|
-
|
|
146
|
+
工具呼叫顯示。
|
|
147
147
|
|
|
148
|
-
##
|
|
148
|
+
## 本機工具小工具 {#native-tool-widgets}
|
|
149
149
|
|
|
150
|
-
當操作結果應呈現為應用品質 UI
|
|
151
|
-
內部聊天而不是普通的 JSON
|
|
150
|
+
當操作結果應呈現為應用品質 UI 時,請使用本機工具小工具
|
|
151
|
+
內部聊天而不是普通的 JSON。內建可重複使用的輸出包括
|
|
152
152
|
`DataTableWidget`、`DataChartWidget` 和 `DataWidgetResult`;它們被匯出
|
|
153
153
|
來自 `@agent-native/core/client/chat` 和根用戶端條目。請參閱
|
|
154
154
|
[Native 聊天介面](/docs/native-chat-ui) 表示操作結果合約。
|
|
@@ -162,23 +162,23 @@ import { PromptComposer } from "@agent-native/core/client/composer";
|
|
|
162
162
|
| `registerToolRenderer()` | 您需要特定於產品的本機渲染器來獲得非核心工具結果。 |
|
|
163
163
|
| `registerReservedToolRenderer()` | 框架程式碼需要一個保留的渲染器,該渲染器在範本渲染器之前獲勝。 |
|
|
164
164
|
|
|
165
|
-
##
|
|
165
|
+
## 即時協作和線上狀態 {#collab-presence}
|
|
166
166
|
|
|
167
167
|
使用 `@agent-native/core/client/collab` 實現 Liveblocks 式的呈現效果
|
|
168
168
|
協作檔案掛鉤。
|
|
169
169
|
|
|
170
170
|
| API | 何時使用 |
|
|
171
171
|
| --------------------------------------------------- | ----------------------------------------------------------------- |
|
|
172
|
-
| `useCollaborativeDoc()` |
|
|
173
|
-
| `usePresence()` |
|
|
172
|
+
| `useCollaborativeDoc()` | 將富文字編輯器或自訂 Yjs 介面綁定到 `/_agent-native/collab`。 |
|
|
173
|
+
| `usePresence()` | 發布並渲染任意感知欄位:游標、選取、視口、模式。 |
|
|
174
174
|
| `<PresenceBar>` | 顯示活躍的人類和代理協作者。 |
|
|
175
|
-
| `<LiveCursorOverlay>` |
|
|
175
|
+
| `<LiveCursorOverlay>` | 在定位的容器上渲染遠端游標標籤。 |
|
|
176
176
|
| `<RemoteSelectionRings>` | 在 DOM 元素上渲染遠端選取輪廓。 |
|
|
177
177
|
| `useFollowUser()` | 跟隨其他參與者的視口或選取。 |
|
|
178
|
-
| `useCollaborativeMap()` / `useCollaborativeArray()` |
|
|
178
|
+
| `useCollaborativeMap()` / `useCollaborativeArray()` | 當富文字內文協作不合適時,使用結構化 Y.Map/Y.Array 狀態進行實驗。 |
|
|
179
179
|
| `dedupeCollabUsersByEmail()` | 為同一使用者建置一個沒有重複分頁的自訂頭像堆堆疊。 |
|
|
180
180
|
|
|
181
|
-
```an-diagram title="
|
|
181
|
+
```an-diagram title="存在:人類和智慧體共用一個意識層" summary="useCollaborativeDoc 擁有感知執行個體;用戶端掛鉤發布游標和選取;伺服器助手讓代理操作顯示為即時參與者。"
|
|
182
182
|
{
|
|
183
183
|
"html": "<div class=\"diagram-presence\"><div class=\"diagram-col\"><div class=\"diagram-node\">Humans<br><small class=\"diagram-muted\">usePresence · cursors, selection</small></div><div class=\"diagram-node diagram-accent\">Agent 操作<br><small class=\"diagram-muted\">agentUpdateSelection()</small></div></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">→</div><div class=\"diagram-panel center\" data-rough><span class=\"diagram-pill accent\">useCollaborativeDoc</span><small class=\"diagram-muted\">awareness layer</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">→</div><div class=\"diagram-box\"><PresenceBar> · <LiveCursorOverlay><br><small class=\"diagram-muted\">渲染所有人,包括代理</small></div></div>",
|
|
184
184
|
"css": ".diagram-presence{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.diagram-presence .diagram-col{display:flex;flex-direction:column;gap:10px}.diagram-presence .center{display:flex;flex-direction:column;align-items:center;gap:4px;padding:14px}.diagram-presence .diagram-arrow{font-size:22px;line-height:1}"
|
|
@@ -186,7 +186,7 @@ import { PromptComposer } from "@agent-native/core/client/composer";
|
|
|
186
186
|
```
|
|
187
187
|
|
|
188
188
|
想要作為現場參與者出現的伺服器端代理 actions 使用
|
|
189
|
-
|
|
189
|
+
較低階別的 `@agent-native/core/collab` 代理存在助手:
|
|
190
190
|
|
|
191
191
|
```ts
|
|
192
192
|
import {
|
|
@@ -196,7 +196,7 @@ import {
|
|
|
196
196
|
} from "@agent-native/core/collab";
|
|
197
197
|
```
|
|
198
198
|
|
|
199
|
-
##
|
|
199
|
+
## 豐富的編輯器 {#rich-editor}
|
|
200
200
|
|
|
201
201
|
當需要共用markdown編輯器時使用`@agent-native/core/client/editor`
|
|
202
202
|
計畫、內容、資源和協作檔案使用的表面
|
|
@@ -205,11 +205,11 @@ import {
|
|
|
205
205
|
| API | 何時使用 |
|
|
206
206
|
| -------------------------------- | ------------------------------------------------------------------------- |
|
|
207
207
|
| `<SharedRichEditor>` | 您需要具有 Markdown 序列化、可選 Yjs 和應用附加功能的目前可設定編輯器。 |
|
|
208
|
-
| `<RichMarkdownEditor>` |
|
|
208
|
+
| `<RichMarkdownEditor>` | 您需要共用豐富編輯器的向後相容別名。 |
|
|
209
209
|
| `createSharedEditorExtensions()` | 您正在建置自己的 Tiptap 編輯器,但需要框架架構和 Markdown 方言。 |
|
|
210
210
|
| `<SlashCommandMenu>` | 您需要共用斜線指令 UI 來建立自訂 Tiptap 表面。 |
|
|
211
|
-
| `<BubbleToolbar>` |
|
|
212
|
-
| `createRegistryBlockNode()` |
|
|
211
|
+
| `<BubbleToolbar>` | 您需要用於標記、連結和自訂行內 actions 的共用選取工具列。 |
|
|
212
|
+
| `createRegistryBlockNode()` | 您需要在豐富的編輯器中提供註冊表支援的塊節點。 |
|
|
213
213
|
| `uploadEditorImage()` | 您希望框架上傳圖片操作位於編輯器的共用圖片塊後面。 |
|
|
214
214
|
| `useCollabReconcile()` | 您正在將自訂編輯器介面綁定到 Yjs 檔案,同時將 Markdown 保留為已儲存狀態。 |
|
|
215
215
|
|
|
@@ -226,7 +226,7 @@ import { SharedRichEditor } from "@agent-native/core/client/editor";
|
|
|
226
226
|
/>;
|
|
227
227
|
```
|
|
228
228
|
|
|
229
|
-
|
|
229
|
+
對於即時編輯,請將其與協作子路徑配對:
|
|
230
230
|
|
|
231
231
|
```tsx
|
|
232
232
|
import {
|
|
@@ -257,7 +257,7 @@ const collab = useCollaborativeDoc({
|
|
|
257
257
|
## 工作區資源 {#resources}
|
|
258
258
|
|
|
259
259
|
當您想要公開相同的內容時,請使用 `@agent-native/core/client/resources`
|
|
260
|
-
|
|
260
|
+
為代理面板的“工作空間”分頁提供支援的工作空間資源模型。
|
|
261
261
|
|
|
262
262
|
| API | 何時使用 |
|
|
263
263
|
| --------------------------------------------------------------------- | ---------------------------------------------------- |
|
|
@@ -265,9 +265,9 @@ const collab = useCollaborativeDoc({
|
|
|
265
265
|
| `<ResourceTree>` | 您想要圍繞框架資料渲染您自己的資源瀏覽器。 |
|
|
266
266
|
| `<ResourceEditor>` | 您需要所選資源的框架編輯器。 |
|
|
267
267
|
| `useResourceTree()` | 您需要一個用於個人、共用或工作區資源的作用域樹。 |
|
|
268
|
-
| `useResource()` |
|
|
268
|
+
| `useResource()` | 您需要一項選定資源的內容和中繼資料。 |
|
|
269
269
|
| `useCreateResource()` / `useUpdateResource()` / `useDeleteResource()` | 您需要圍繞資源生命週期進行自訂控制。 |
|
|
270
|
-
| `useUploadResource()` |
|
|
270
|
+
| `useUploadResource()` | 您需要將檔案上傳到框架資源儲存中。 |
|
|
271
271
|
|
|
272
272
|
完整的面板不需要道具:
|
|
273
273
|
|
|
@@ -320,7 +320,7 @@ function WorkspaceResources() {
|
|
|
320
320
|
}
|
|
321
321
|
```
|
|
322
322
|
|
|
323
|
-
## 其他公開UI {#other-ui}
|
|
323
|
+
## 其他公開 UI {#other-ui}
|
|
324
324
|
|
|
325
325
|
| 區域 | APIs | 匯入路徑 |
|
|
326
326
|
| ------------ | ----------------------------------------------------- | ----------------------------------------- |
|
|
@@ -330,13 +330,13 @@ function WorkspaceResources() {
|
|
|
330
330
|
| 入職 | `useOnboarding()`,入門面板掛鉤 | `@agent-native/core/client/onboarding` |
|
|
331
331
|
| 可觀察性 | `<ObservabilityDashboard>`, `<ThumbsFeedback>` | `@agent-native/core/client/observability` |
|
|
332
332
|
| 資源 | `<ResourcesPanel>`、`<ResourceTree>`、資源掛鉤 | `@agent-native/core/client/resources` |
|
|
333
|
-
|
|
|
333
|
+
| 豐富的編輯器 | `<SharedRichEditor>`,斜杠指令,塊節點掛鉤 | `@agent-native/core/client/editor` |
|
|
334
334
|
|
|
335
|
-
##
|
|
335
|
+
## 一次性文字完成 {#one-off-text-completion}
|
|
336
336
|
|
|
337
|
-
|
|
337
|
+
如果您確實需要原始文字輸入/文字輸出,請將其保留在伺服器端並使用
|
|
338
338
|
`completeText()` 來自 `@agent-native/core/server`。將面向使用者的用法包裝在
|
|
339
|
-
|
|
339
|
+
採取行動,使 UI 和代理共用相同的功能。
|
|
340
340
|
|
|
341
341
|
```an-callout
|
|
342
342
|
{
|
|
@@ -1,56 +1,56 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "情境意識"
|
|
3
|
-
description: "
|
|
3
|
+
description: "代理如何知道使用者正在檢視的內容:導覽狀態、選取脈絡、檢視螢幕、sendToAgentChat 切換、導覽指令和抖動預防。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 情境意識
|
|
7
7
|
|
|
8
|
-
> **開發人員頁面。**
|
|
8
|
+
> **開發人員頁面。** 此頁面供開發人員連線應用程式的脈絡層。對於最終使用者體驗 - 代理如何在對話中使用該脈絡 - 請參閱 [Using Your Agent](/docs/using-your-agent)。
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
代理如何知道使用者正在看什麼——以及代理如何控制使用者看到的內容。
|
|
11
11
|
|
|
12
12
|
## 概述 {#overview}
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
如果沒有脈絡感知,代理就是盲目的。它詢問“哪個電子郵件?”當使用者盯著一個時。它無法作用於目前的選取,無法提供相關建議,也無法修改使用者所看到的內容。借助脈絡感知,使用者可以點選一行、突出顯示一個段落、選取一個幻燈片元素或按 Cmd+I,然後說“總結一下”,然後代理就已經知道“這個”的含義。
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
要了解在哪個曲面中放置什麼內容(AGENTS.md、skills、application_state),請參閱 [Writing Agent Instructions — The four surfaces the agent sees](/docs/writing-agent-instructions#four-surfaces)。
|
|
17
17
|
|
|
18
18
|
六種模式解決了這個問題:
|
|
19
19
|
|
|
20
|
-
1. **導覽狀態**——UI
|
|
20
|
+
1. **導覽狀態**——UI 在每次路由更改時將 `navigation` 金鑰寫入應用程式狀態
|
|
21
21
|
2. **目前 URL** - 框架寫入 `__url__`,因此查詢參數對代理可見且可編輯
|
|
22
22
|
3. **選取狀態**——當使用者聚焦、選取或多選有意義的內容時,UI 會寫入 `selection` 鍵
|
|
23
|
-
4. **`view-screen
|
|
24
|
-
5. **提示切換** --
|
|
23
|
+
4. **`view-screen`**——讀取應用程式狀態、取得脈絡資料並返回使用者所見內容的快照的操作
|
|
24
|
+
5. **提示切換** -- 當點選應成為代理輪次時,UI 控制項呼叫 `sendToAgentChat()`
|
|
25
25
|
6. **`navigate`**——來自代理的一次性指令,告訴 UI 去哪裡
|
|
26
26
|
|
|
27
|
-
```an-diagram title="代理如何看到您所看到的內容" summary="UI編寫輕量級狀態鍵;螢幕將它們轉化為真實的紀錄;代理可以編寫導覽返回來行動 UI。"
|
|
27
|
+
```an-diagram title="代理如何看到您所看到的內容" summary="UI 編寫輕量級狀態鍵;螢幕將它們轉化為真實的紀錄;代理可以編寫導覽返回來行動 UI。"
|
|
28
28
|
{
|
|
29
|
-
"html": "<div class=\"diagram-ctx\"><div class=\"diagram-card col\"><span class=\"diagram-pill\">UI 寫入</span><div class=\"diagram-node\">navigation<br><small class=\"diagram-muted\"
|
|
29
|
+
"html": "<div class=\"diagram-ctx\"><div class=\"diagram-card col\"><span class=\"diagram-pill\">UI 寫入</span><div class=\"diagram-node\">navigation<br><small class=\"diagram-muted\">檢視、開啟的 ID</small></div><div class=\"diagram-node\">__url__<br><small class=\"diagram-muted\">shareable filters</small></div><div class=\"diagram-node\">selection<br><small class=\"diagram-muted\">行、塊、形狀</small></div></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">→</div><div class=\"diagram-panel center\" data-rough><span class=\"diagram-pill accent\">view-screen</span><small class=\"diagram-muted\">reads state · fetches records</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">→</div><div class=\"diagram-box\">代理執行<br><small class=\"diagram-muted\">on the real object</small></div><div class=\"diagram-arrow diagram-accent\" aria-hidden=\"true\">↻</div><div class=\"diagram-box diagram-accent\">navigate<br><small class=\"diagram-muted\">代理行動 UI</small></div></div>",
|
|
30
30
|
"css": ".diagram-ctx{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.diagram-ctx .col{display:flex;flex-direction:column;gap:8px;padding:14px}.diagram-ctx .center{display:flex;flex-direction:column;align-items:center;gap:4px;padding:14px}.diagram-ctx .diagram-arrow{font-size:22px;line-height:1}"
|
|
31
31
|
}
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
##
|
|
34
|
+
## 脈絡層 {#context-layers}
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
針對不同的作業使用不同的脈絡通道:
|
|
37
37
|
|
|
38
38
|
| 層 | 所有者 | 用它來 |
|
|
39
39
|
| ---------------------------------------- | ----------------- | ------------------------------------------------------------ |
|
|
40
|
-
| `navigation` 應用狀態金鑰 | UI |
|
|
41
|
-
| `__url__` 應用狀態金鑰 | 框架UI
|
|
40
|
+
| `navigation` 應用狀態金鑰 | UI | 語義路由狀態:目前檢視、開啟的紀錄、活動分頁、穩定 ID |
|
|
41
|
+
| `__url__` 應用狀態金鑰 | 框架 UI | 目前路徑名、搜尋字串、哈希和解析的 URL 查詢參數 |
|
|
42
42
|
| `__set_url__` 應用狀態金鑰 | 代理/框架 | 對 `set-search-params` 和 `set-url-path` 進行一次性 URL 編輯 |
|
|
43
43
|
| `selection` 應用狀態金鑰 | UI | 持久的語義選取:行、塊、形狀、資產、訊息 |
|
|
44
|
-
| `pending-selection-context` 應用狀態金鑰 | UI / `AgentPanel` |
|
|
44
|
+
| `pending-selection-context` 應用狀態金鑰 | UI / `AgentPanel` | 一次性選取的文字附加到下一個聊天回合,通常來自 Cmd+I |
|
|
45
45
|
| `view-screen` 動作 | 代理 | 將應用狀態鍵融入真實紀錄和螢幕摘要 |
|
|
46
|
-
| `sendToAgentChat()` | UI |
|
|
47
|
-
| `navigate` 應用狀態金鑰 | 代理 | 要求UI
|
|
46
|
+
| `sendToAgentChat()` | UI | 將點選、指令、評論圖釘或所選專案轉變為聊天提示 |
|
|
47
|
+
| `navigate` 應用狀態金鑰 | 代理 | 要求 UI 行動到另一條路由或聚焦另一個物體 |
|
|
48
48
|
|
|
49
|
-
簡短版本:URL 查詢參數是可共用過濾器的真實來源,`navigation`
|
|
49
|
+
簡短版本:URL 查詢參數是可共用過濾器的真實來源,`navigation` 儲存語義 ID 和檢視名稱,`view-screen` 將這些狀態層轉換為有用的資料,而當使用者點選指令時,`sendToAgentChat()` 將 UI 意圖轉換為聊天訊息。
|
|
50
50
|
|
|
51
51
|
## 導覽狀態 {#navigation-state}
|
|
52
52
|
|
|
53
|
-
UI 在每次路由更改時將 `navigation`
|
|
53
|
+
UI 在每次路由更改時將 `navigation` 金鑰寫入應用程式狀態。這告訴代理使用者正在使用哪個檢視、開啟哪個專案以及哪個語義 UI 狀態很重要。
|
|
54
54
|
|
|
55
55
|
```json
|
|
56
56
|
{
|
|
@@ -68,7 +68,7 @@ UI 在每次路由更改時將 `navigation` 金鑰寫入應用程式狀態。這
|
|
|
68
68
|
- 語義別名 - 活動分頁、標籤名稱或其他有助於代理推理的穩定應用概念
|
|
69
69
|
- 輕焦點狀態 - 聚焦行、活動分頁、目前面板
|
|
70
70
|
|
|
71
|
-
保持 `navigation`
|
|
71
|
+
保持 `navigation` 小且語義化。它應該識別目前螢幕,而不是複製整個紀錄或鏡像每個查詢參數。取得 `view-screen` 中的紀錄,以便代理始終取得最新資料。
|
|
72
72
|
|
|
73
73
|
代理在行動前閱讀以下內容:
|
|
74
74
|
|
|
@@ -79,9 +79,9 @@ const navigation = await readAppState("navigation");
|
|
|
79
79
|
// { view: "inbox", threadId: "thread-123", label: "important" }
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
-
## 目前URL和過濾器 {#current-url}
|
|
82
|
+
## 目前 URL 和過濾器 {#current-url}
|
|
83
83
|
|
|
84
|
-
`AgentPanel` 自動將目前 React 路由器 URL 同步到 `__url__`
|
|
84
|
+
`AgentPanel` 自動將目前 React 路由器 URL 同步到 `__url__` 應用程式狀態金鑰中。內建代理每次都會將其包含為 `<current-url>` 塊:
|
|
85
85
|
|
|
86
86
|
```text
|
|
87
87
|
<current-url>
|
|
@@ -93,15 +93,15 @@ searchParams:
|
|
|
93
93
|
</current-url>
|
|
94
94
|
```
|
|
95
95
|
|
|
96
|
-
這是可共用過濾器狀態的規範層。如果使用者可以複製 URL
|
|
96
|
+
這是可共用過濾器狀態的規範層。如果使用者可以複製 URL 並返回到相同的過濾清單,則該過濾器屬於查詢字串。代理可以使用內建的 `set-search-params` 工具更改這些過濾器:
|
|
97
97
|
|
|
98
98
|
```text
|
|
99
99
|
set-search-params({ "params": { "f_region": "east", "q": null } })
|
|
100
100
|
```
|
|
101
101
|
|
|
102
|
-
僅將 `navigation` 用於幫助 `view-screen`
|
|
102
|
+
僅將 `navigation` 用於幫助 `view-screen` 取得或匯總正確資料的語義別名。儀表板可能保留 `navigation.dashboardId`,而 `__url__.searchParams` 擁有 `f_region`、`f_dateStart` 和 `q`。
|
|
103
103
|
|
|
104
|
-
當`view-screen
|
|
104
|
+
當`view-screen`返回更豐富的快照時,它可以將重要的 URL 過濾器複製到友好的`activeFilters`物件中:
|
|
105
105
|
|
|
106
106
|
```ts
|
|
107
107
|
const url = (await readAppState("__url__")) as {
|
|
@@ -119,9 +119,9 @@ if (url?.searchParams) {
|
|
|
119
119
|
|
|
120
120
|
## 選取狀態 {#selection-state}
|
|
121
121
|
|
|
122
|
-
選取是語義 UI
|
|
122
|
+
選取是語義 UI 狀態。這就是“我點選的圖表”、“這三行”、“這張幻燈片標題”或“目前電子郵件草稿範圍”如何成為模型可見脈絡的方式。
|
|
123
123
|
|
|
124
|
-
使用 `selection` 應用狀態鍵進行持久選取,該選取應該在導覽、空聊天建議或稍後的 `view-screen`
|
|
124
|
+
使用 `selection` 應用狀態鍵進行持久選取,該選取應該在導覽、空聊天建議或稍後的 `view-screen` 呼叫中保留下來:
|
|
125
125
|
|
|
126
126
|
```json
|
|
127
127
|
{
|
|
@@ -154,21 +154,21 @@ async function syncSelection(selection: unknown | null) {
|
|
|
154
154
|
|
|
155
155
|
- 代理可以在 actions 中使用的穩定 ID,例如 `threadId`、`slideId` 或 `assetId`
|
|
156
156
|
- 簡短的人工標籤,以便提示和建議易於閱讀
|
|
157
|
-
-
|
|
157
|
+
- 足夠的文字或中繼資料來消除物件的歧義
|
|
158
158
|
- 可選的 UI 定位器,例如代理需要引用視覺元素時的選取器或坐標
|
|
159
159
|
- `capturedAt` 當過時的選取有害時
|
|
160
160
|
|
|
161
|
-
避免在 `selection`
|
|
161
|
+
避免在 `selection` 中儲存機密、完整檔案、大型二進制有效負載或整個 API 回應。儲存 ID 和簡短摘錄,然後讓 `view-screen` 取得目前的事實來源。
|
|
162
162
|
|
|
163
|
-
###
|
|
163
|
+
### 一次性選定文字 {#pending-selection-context}
|
|
164
164
|
|
|
165
|
-
`AgentPanel`
|
|
165
|
+
`AgentPanel` 已經處理常見的文字選取流程。當使用者在頁面上選取文字的情況下按 Cmd+I(或 Ctrl+I)時,它:
|
|
166
166
|
|
|
167
167
|
1. 讀取`window.getSelection()`
|
|
168
168
|
2. 將 `{ text, capturedAt }` 寫入 `pending-selection-context`
|
|
169
|
-
3.
|
|
169
|
+
3. 聚焦代理聊天
|
|
170
170
|
|
|
171
|
-
|
|
171
|
+
正式環境代理將該金鑰作為立即選取脈絡注入下一回合,並在其過時後忽略它。這是使“選取文字,按 Cmd+I,詢問‘使其更加有力’”工作的路徑,而無需使用者將選取內容複製到提示中。
|
|
172
172
|
|
|
173
173
|
當自訂編輯器的選取不由本機瀏覽器選取表示時,可以編寫相同的鍵:
|
|
174
174
|
|
|
@@ -185,38 +185,38 @@ await setClientAppState(
|
|
|
185
185
|
);
|
|
186
186
|
```
|
|
187
187
|
|
|
188
|
-
使用 `pending-selection-context`
|
|
188
|
+
使用 `pending-selection-context` 一次性“對這個精確突出顯示的文字進行操作”流程。使用 `selection` 進行持久物件選取,`view-screen` 和動態建議應該不斷看到。
|
|
189
189
|
|
|
190
190
|
## 檢視螢幕操作 {#view-screen-action}
|
|
191
191
|
|
|
192
|
-
每個範本都應該有一個 `view-screen`
|
|
192
|
+
每個範本都應該有一個 `view-screen` 操作。它讀取導覽和選取狀態,取得相關資料,並返回使用者所看到內容的快照。這是代理的眼睛。
|
|
193
193
|
|
|
194
|
-
```an-annotated-code title="檢視螢幕 —
|
|
194
|
+
```an-annotated-code title="檢視螢幕 — 代理的眼睛"
|
|
195
195
|
{
|
|
196
196
|
"filename": "actions/view-screen.ts",
|
|
197
197
|
"language": "ts",
|
|
198
198
|
"code": "import { defineAction } from \"@agent-native/core/action\";\nimport { readAppState } from \"@agent-native/core/application-state\";\nimport { eq, inArray } from \"drizzle-orm\";\nimport { z } from \"zod\";\nimport { getDb, schema } from \"../server/db/index.js\";\n\nexport default defineAction({\n description:\n \"See what the user is currently looking at on screen.\",\n schema: z.object({}),\n http: false,\n run: async () => {\n const navigation = (await readAppState(\"navigation\")) as any;\n const selection = (await readAppState(\"selection\")) as any;\n const screen: Record<string, unknown> = {};\n if (navigation) screen.navigation = navigation;\n if (selection) screen.selection = selection;\n\n const db = getDb();\n\n // Fetch data based on what the user is viewing\n if (navigation?.view === \"inbox\") {\n screen.emailList = await db\n .select()\n .from(schema.emails)\n .where(eq(schema.emails.label, navigation.label));\n }\n if (navigation?.threadId) {\n screen.thread = await db\n .select()\n .from(schema.threads)\n .where(eq(schema.threads.id, navigation.threadId));\n }\n if (selection?.kind === \"email.messages\") {\n screen.selectedMessages = await db\n .select()\n .from(schema.emails)\n .where(inArray(schema.emails.id, selection.messageIds));\n }\n\n if (Object.keys(screen).length === 0) {\n return \"No application state found. Is the app running?\";\n }\n return screen;\n },\n});",
|
|
199
199
|
"annotations": [
|
|
200
|
-
{ "lines": "10-11", "label": "工具表面", "note": "
|
|
201
|
-
{ "lines": "13", "label": "http: false", "note": "內部操作 - 未通過 HTTP 暴露。代理和 `pnpm action`
|
|
200
|
+
{ "lines": "10-11", "label": "工具表面", "note": "代理讀取此描述,知道它可以呼叫 `view-screen` 來檢視目前的 UI。" },
|
|
201
|
+
{ "lines": "13", "label": "http: false", "note": "內部操作 - 未通過 HTTP 暴露。代理和 `pnpm action` 呼叫它,而不是瀏覽器。" },
|
|
202
202
|
{ "lines": "15-16", "label": "讀取狀態", "note": "拉取 UI 編寫的輕量級 `navigation` 和 `selection` 鍵。" },
|
|
203
203
|
{ "lines": "23-37", "label": "水合物", "note": "將這些 ID 直接從 SQL 轉換為**新鮮**紀錄,以便代理在執行操作之前驗證活動物件。" }
|
|
204
204
|
]
|
|
205
205
|
}
|
|
206
206
|
```
|
|
207
207
|
|
|
208
|
-
代理應在對目前 UI
|
|
208
|
+
代理應在對目前 UI 進行操作之前呼叫 `pnpm action view-screen`。這是所有範本的硬約定。新增新功能時,更新 `view-screen` 以返回新檢視和任何新選取形狀的資料。
|
|
209
209
|
|
|
210
210
|
```an-callout
|
|
211
211
|
{
|
|
212
212
|
"tone": "info",
|
|
213
|
-
"body": "**保持 `navigation` 和 `selection` 小。**商店 ID 加上短標籤,而不是整個紀錄。 `view-screen`
|
|
213
|
+
"body": "**保持 `navigation` 和 `selection` 小。**商店 ID 加上短標籤,而不是整個紀錄。 `view-screen` 根據需要取得事實來源,因此陳舊或龐大的狀態永遠不會到達代理。"
|
|
214
214
|
}
|
|
215
215
|
```
|
|
216
216
|
|
|
217
217
|
## 與 `sendToAgentChat()` 快速切換 {#send-to-agent-chat}
|
|
218
218
|
|
|
219
|
-
|
|
219
|
+
有時脈絡不應該僅僅處於應用程式狀態。使用者點選按鈕、放下評論圖釘、選取專案並選取“詢問代理”,或者按下工具列中的 AI 指令。那次點選是一個指令。在瀏覽器 UI 中,將其交給帶有`sendToAgentChat()`的代理。
|
|
220
220
|
|
|
221
221
|
```tsx
|
|
222
222
|
import { sendToAgentChat } from "@agent-native/core/client";
|
|
@@ -245,32 +245,32 @@ function askAgentAboutSelection(selection: {
|
|
|
245
245
|
|
|
246
246
|
| 欄位 | 含義 |
|
|
247
247
|
| ------------------- | -------------------------------------------------------- |
|
|
248
|
-
| `message` |
|
|
249
|
-
| `context` |
|
|
250
|
-
| `submit: true` |
|
|
248
|
+
| `message` | 聊天中顯示可見的提示文字 |
|
|
249
|
+
| `context` | 隱藏的模型可見脈絡,不顯示為面向使用者的聊天文字 |
|
|
250
|
+
| `submit: true` | 立即傳送;適用於顯式指令按鈕,例如“修復布局” |
|
|
251
251
|
| `submit: false` | 預填以供使用者審核;適合“向代理詢問此事”或模棱兩可的選取 |
|
|
252
252
|
| `openSidebar: true` | 即使面板折疊,代理回應也可見 |
|
|
253
|
-
| `newTab: true` |
|
|
253
|
+
| `newTab: true` | 為更大的建立工作啟動單獨的聊天對話串 |
|
|
254
254
|
| `type: "code"` | 當請求涉及更改應用程式來源時路由到程式碼編輯框架 |
|
|
255
255
|
|
|
256
|
-
`sendToAgentChat()`
|
|
256
|
+
`sendToAgentChat()` 是提交的聊天路徑受支援的瀏覽器包裝器,有時在內部被視為 `agentNative.submitChat`。應用程式 UI 應呼叫包裝器,而不是直接發布 `agentNative.submitChat`,因為包裝器處理本機側邊欄、Builder/Frame 路由、MCP 應用程式主機路由、分頁 ID 和程式碼請求路由。
|
|
257
257
|
|
|
258
|
-
|
|
258
|
+
對於沒有瀏覽器側邊欄的節點/指令碼脈絡,請使用 `agentChat.submit()` 或 `agentChat.prefill()`。伺服器actions一般不應該呼叫僅瀏覽器的`sendToAgentChat()`;如果某個操作需要開啟 UI 向代理詢問某些內容,請將一個小請求寫入 `application_state` 並讓 UI 橋接器從瀏覽器傳送它。
|
|
259
259
|
|
|
260
|
-
###
|
|
260
|
+
### 點選提示中的專案 {#clicked-items-in-prompt}
|
|
261
261
|
|
|
262
262
|
對於“點選 UI 中的專案,它們成為提示的一部分”體驗,請將選取狀態與提示切換相結合:
|
|
263
263
|
|
|
264
264
|
1. 點選或多選時,寫入語義 `selection` 狀態,以便 `view-screen`、動態建議和未來回合可以看到它。
|
|
265
|
-
2.
|
|
266
|
-
3. 在 `view-screen` 中,將選定的 ID
|
|
265
|
+
2. 如果點選也是指令,則呼叫`sendToAgentChat()`,簡潔的可見`message`和更豐富的隱藏`context`。
|
|
266
|
+
3. 在 `view-screen` 中,將選定的 ID 合併到目前紀錄中,以便代理可以在改變物件之前驗證該物件。
|
|
267
267
|
4. 當物件不再被選取、刪除或不再相關時,清除 `selection`。
|
|
268
268
|
|
|
269
|
-
|
|
269
|
+
這為使用者提供了神奇的“這就是我的意思”行為,而無需在每個提示中填充大量可見脈絡。
|
|
270
270
|
|
|
271
271
|
## 導覽操作 {#navigate-action}
|
|
272
272
|
|
|
273
|
-
`navigate` 是 `navigation` 的鏡像。其中`navigation`是UI告訴代理使用者在哪裡,`navigate`是代理告訴UI去哪裡。代理將一次性 `navigate` 指令寫入應用程式狀態; UI 讀取它,執行導覽,然後刪除該條目。
|
|
273
|
+
`navigate` 是 `navigation` 的鏡像。其中`navigation`是 UI 告訴代理使用者在哪裡,`navigate`是代理告訴 UI 去哪裡。代理將一次性 `navigate` 指令寫入應用程式狀態; UI 讀取它,執行導覽,然後刪除該條目。
|
|
274
274
|
|
|
275
275
|
```ts
|
|
276
276
|
// Agent side -- write a navigate command
|
|
@@ -279,24 +279,24 @@ import { writeAppState } from "@agent-native/core/application-state";
|
|
|
279
279
|
await writeAppState("navigate", { view: "inbox", threadId: "thread-123" });
|
|
280
280
|
```
|
|
281
281
|
|
|
282
|
-
在 UI 端,您永遠不會手動輪詢或刪除此金鑰。兩個方向(在每次路由更改時寫入 `navigation` 並使用代理的 `navigate`
|
|
282
|
+
在 UI 端,您永遠不會手動輪詢或刪除此金鑰。兩個方向(在每次路由更改時寫入 `navigation` 並使用代理的 `navigate` 指令)均由單一鉤子 [`useNavigationState`](#use-navigation-state) 處理,下一節將對此進行介紹。
|
|
283
283
|
|
|
284
|
-
`navigation`金鑰屬於UI;代理絕不能直接寫入。代理寫入 `navigate`,UI 執行行動,該行動更新 `navigation`。
|
|
284
|
+
`navigation`金鑰屬於 UI;代理絕不能直接寫入。代理寫入 `navigate`,UI 執行行動,該行動更新 `navigation`。
|
|
285
285
|
|
|
286
|
-
當目的地有真實的URL時,請在其上包含同來源的`path`
|
|
286
|
+
當目的地有真實的 URL 時,請在其上包含同來源的`path`
|
|
287
287
|
`navigate` 指令並讓 UI 在回退到該路徑之前選取該路徑
|
|
288
288
|
語義欄位。保持應用程式導覽單通道:不要同時寫入
|
|
289
289
|
`navigate` 和 `__set_url__` 相同的動作。 `__set_url__` 為
|
|
290
|
-
框架URL工具(`set-url-path`、`set-search-params`)和僅URL過濾器
|
|
290
|
+
框架 URL 工具(`set-url-path`、`set-search-params`)和僅 URL 過濾器
|
|
291
291
|
改變。對於在聊天流式傳輸時可以到達的指令,請提交路由
|
|
292
292
|
使用 `navigate(path, { replace: true, flushSync: true })` 而不是包裝它
|
|
293
|
-
|
|
293
|
+
在檢視轉換中,使地址欄和可見頁面保持在一起。
|
|
294
294
|
|
|
295
295
|
## useNavigationState 掛鉤 {#use-navigation-state}
|
|
296
296
|
|
|
297
|
-
`useNavigationState` 是 **您的應用程式的鉤子,而不是框架匯入。** 每個範本都在 `app/hooks/use-navigation-state.ts` 上發布一個,並從應用程式 shell (`root.tsx`)
|
|
297
|
+
`useNavigationState` 是 **您的應用程式的鉤子,而不是框架匯入。** 每個範本都在 `app/hooks/use-navigation-state.ts` 上發布一個,並從應用程式 shell (`root.tsx`) 呼叫它一次。這是連線兩個方向導覽的單一位置:
|
|
298
298
|
|
|
299
|
-
- **出站(UI
|
|
299
|
+
- **出站(UI→代理):**每當路由改變時寫入`navigation`金鑰,因此代理始終知道目前檢視。
|
|
300
300
|
- **入站(代理 → UI):**輪詢 `navigate` 指令、執行導覽並刪除指令。
|
|
301
301
|
|
|
302
302
|
它很短,因為它是真實框架原語 `useAgentRouteState`(從 `@agent-native/core/client` 匯出)的薄包裝。您提供兩個特定於應用程式的功能,框架將完成其餘的工作:
|
|
@@ -339,13 +339,13 @@ export function useNavigationState() {
|
|
|
339
339
|
| `getNavigationState` — 將 URL 對應到語義狀態 | `navigation` 寫入,制表符範圍加上全域後備鍵 |
|
|
340
340
|
| `getCommandPath` — 將 `navigate` 指令對應到路由 | 指令輪詢、讀後刪除、重複指令保護、請求來源標記 |
|
|
341
341
|
|
|
342
|
-
`useAgentRouteState` 假定為 React 路由器。當導覽不在 URL 中時(向導步驟、畫布選取、非路由器 shell
|
|
342
|
+
`useAgentRouteState` 假定為 React 路由器。當導覽不在 URL 中時(向導步驟、畫布選取、非路由器 shell),而是下拉到較低階別的 `useSemanticNavigationState`:您將現成的 `state` 值加上 `navigationKeys`/`commandKeys` 和 `onCommand` 回調,並且它與 React 路由器完全無關。
|
|
343
343
|
|
|
344
344
|
## 抖動預防 {#jitter-prevention}
|
|
345
345
|
|
|
346
|
-
當代理寫入應用程式狀態時,同步系統可能會導致 UI
|
|
346
|
+
當代理寫入應用程式狀態時,同步系統可能會導致 UI 重新取得剛剛寫入的資料。這會產生抖動。解決方案是來源標記:
|
|
347
347
|
|
|
348
|
-
使用 `@agent-native/core/client` 中的 `setClientAppState`、`writeClientAppState`、`readClientAppState` 和 `deleteClientAppState` 進行瀏覽器端應用程式狀態存取。與`useDbSync({ ignoreSource: TAB_ID })
|
|
348
|
+
使用 `@agent-native/core/client` 中的 `setClientAppState`、`writeClientAppState`、`readClientAppState` 和 `deleteClientAppState` 進行瀏覽器端應用程式狀態存取。與`useDbSync({ ignoreSource: TAB_ID })`配對時透過`{ requestSource: TAB_ID }`對 UI 進行寫入;透過 `{ keepalive: true }` 進行短期寫入,例如卸載期間的選取清理。
|
|
349
349
|
|
|
350
350
|
```ts
|
|
351
351
|
// app/root.tsx
|
|
@@ -360,14 +360,14 @@ useDbSync({
|
|
|
360
360
|
工作原理:
|
|
361
361
|
|
|
362
362
|
- 代理寫入標記為 `requestSource: "agent"`(操作助手自動執行此操作)
|
|
363
|
-
- UI
|
|
364
|
-
-
|
|
365
|
-
- 處理同步事件時,UI 會過濾掉與其自己的 `ignoreSource` 值匹配的事件 -
|
|
363
|
+
- UI 寫入透過 `X-Request-Source` 標頭包含分頁的唯一 ID
|
|
364
|
+
- 伺服器儲存每個事件的來源
|
|
365
|
+
- 處理同步事件時,UI 會過濾掉與其自己的 `ignoreSource` 值匹配的事件 - 因此它不會重新取得剛剛寫入的資料
|
|
366
366
|
- 來自代理、其他分頁和 actions 的事件仍然正常進行
|
|
367
367
|
|
|
368
368
|
```an-diagram title="來源標記可阻止自重取抖動" summary="分頁會忽略標有其自己的 TAB_ID 的同步事件,但仍會對代理和其他分頁寫入做出反應。"
|
|
369
369
|
{
|
|
370
|
-
"html": "<div class=\"diagram-jitter\"><div class=\"diagram-node\">此標籤頁面寫入<br><small class=\"diagram-muted\">X-Request-Source: TAB_ID</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">→</div><div class=\"diagram-box\" data-rough
|
|
370
|
+
"html": "<div class=\"diagram-jitter\"><div class=\"diagram-node\">此標籤頁面寫入<br><small class=\"diagram-muted\">X-Request-Source: TAB_ID</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">→</div><div class=\"diagram-box\" data-rough>伺服器儲存來源<br>on the event</div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">→</div><div class=\"diagram-card col\"><div class=\"diagram-pill warn\">source == TAB_ID → ignored</div><small class=\"diagram-muted\">無需重新拉取,無閃爍</small><div class=\"diagram-pill ok\">agent / other tab → applied</div><small class=\"diagram-muted\">介面即時更新</small></div></div>",
|
|
371
371
|
"css": ".diagram-jitter{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.diagram-jitter .col{display:flex;flex-direction:column;gap:6px;padding:14px}.diagram-jitter .diagram-arrow{font-size:22px;line-height:1}"
|
|
372
372
|
}
|
|
373
373
|
```
|