@agent-native/core 0.79.1 → 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.
Files changed (258) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +30 -0
  3. package/corpus/core/docs/content/locales/zh-TW/a2a-protocol.md +392 -0
  4. package/corpus/core/docs/content/locales/zh-TW/actions.md +583 -0
  5. package/corpus/core/docs/content/locales/zh-TW/agent-mentions.md +164 -0
  6. package/corpus/core/docs/content/locales/zh-TW/agent-surfaces.md +397 -0
  7. package/corpus/core/docs/content/locales/zh-TW/agent-teams.md +171 -0
  8. package/corpus/core/docs/content/locales/zh-TW/agent-web-surfaces.md +161 -0
  9. package/corpus/core/docs/content/locales/zh-TW/audit-log.md +111 -0
  10. package/corpus/core/docs/content/locales/zh-TW/authentication.md +332 -0
  11. package/corpus/core/docs/content/locales/zh-TW/automations.md +268 -0
  12. package/corpus/core/docs/content/locales/zh-TW/blueprint-installer.md +83 -0
  13. package/corpus/core/docs/content/locales/zh-TW/cli-adapters.md +129 -0
  14. package/corpus/core/docs/content/locales/zh-TW/client.md +398 -0
  15. package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.md +114 -0
  16. package/corpus/core/docs/content/locales/zh-TW/code-agents-ui.md +436 -0
  17. package/corpus/core/docs/content/locales/zh-TW/components.md +368 -0
  18. package/corpus/core/docs/content/locales/zh-TW/context-awareness.md +373 -0
  19. package/corpus/core/docs/content/locales/zh-TW/creating-templates.md +411 -0
  20. package/corpus/core/docs/content/locales/zh-TW/cross-app-sso.md +188 -0
  21. package/corpus/core/docs/content/locales/zh-TW/database.md +183 -0
  22. package/corpus/core/docs/content/locales/zh-TW/deployment.md +348 -0
  23. package/corpus/core/docs/content/locales/zh-TW/dispatch.md +146 -0
  24. package/corpus/core/docs/content/locales/zh-TW/drop-in-agent.md +260 -0
  25. package/corpus/core/docs/content/locales/zh-TW/durable-resume.md +65 -0
  26. package/corpus/core/docs/content/locales/zh-TW/embedding-sdk.md +597 -0
  27. package/corpus/core/docs/content/locales/zh-TW/evals.md +155 -0
  28. package/corpus/core/docs/content/locales/zh-TW/extensions.md +360 -0
  29. package/corpus/core/docs/content/locales/zh-TW/external-agents.md +619 -0
  30. package/corpus/core/docs/content/locales/zh-TW/faq.md +142 -0
  31. package/corpus/core/docs/content/locales/zh-TW/file-uploads.md +122 -0
  32. package/corpus/core/docs/content/locales/zh-TW/frames.md +153 -0
  33. package/corpus/core/docs/content/locales/zh-TW/getting-started.md +199 -0
  34. package/corpus/core/docs/content/locales/zh-TW/harness-agents.md +349 -0
  35. package/corpus/core/docs/content/locales/zh-TW/human-approval.md +86 -0
  36. package/corpus/core/docs/content/locales/zh-TW/internationalization.md +147 -0
  37. package/corpus/core/docs/content/locales/zh-TW/key-concepts.md +312 -0
  38. package/corpus/core/docs/content/locales/zh-TW/local-file-mode.md +433 -0
  39. package/corpus/core/docs/content/locales/zh-TW/mcp-apps.md +147 -0
  40. package/corpus/core/docs/content/locales/zh-TW/mcp-clients.md +330 -0
  41. package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.md +279 -0
  42. package/corpus/core/docs/content/locales/zh-TW/messaging.md +461 -0
  43. package/corpus/core/docs/content/locales/zh-TW/migration-workbench.md +33 -0
  44. package/corpus/core/docs/content/locales/zh-TW/multi-app-workspace.md +312 -0
  45. package/corpus/core/docs/content/locales/zh-TW/multi-tenancy.md +52 -0
  46. package/corpus/core/docs/content/locales/zh-TW/native-chat-ui.md +321 -0
  47. package/corpus/core/docs/content/locales/zh-TW/notifications.md +231 -0
  48. package/corpus/core/docs/content/locales/zh-TW/observability.md +294 -0
  49. package/corpus/core/docs/content/locales/zh-TW/observational-memory.md +77 -0
  50. package/corpus/core/docs/content/locales/zh-TW/onboarding.md +216 -0
  51. package/corpus/core/docs/content/locales/zh-TW/plan-plugin.md +200 -0
  52. package/corpus/core/docs/content/locales/zh-TW/pr-visual-recap.md +384 -0
  53. package/corpus/core/docs/content/locales/zh-TW/processors.md +106 -0
  54. package/corpus/core/docs/content/locales/zh-TW/progress.md +199 -0
  55. package/corpus/core/docs/content/locales/zh-TW/pure-agent-apps.md +39 -0
  56. package/corpus/core/docs/content/locales/zh-TW/real-time-collaboration.md +680 -0
  57. package/corpus/core/docs/content/locales/zh-TW/recurring-jobs.md +142 -0
  58. package/corpus/core/docs/content/locales/zh-TW/routing.md +79 -0
  59. package/corpus/core/docs/content/locales/zh-TW/sandbox-adapters.md +227 -0
  60. package/corpus/core/docs/content/locales/zh-TW/security.md +330 -0
  61. package/corpus/core/docs/content/locales/zh-TW/server.md +265 -0
  62. package/corpus/core/docs/content/locales/zh-TW/sharing.md +219 -0
  63. package/corpus/core/docs/content/locales/zh-TW/skills-guide.md +281 -0
  64. package/corpus/core/docs/content/locales/zh-TW/template-analytics.md +259 -0
  65. package/corpus/core/docs/content/locales/zh-TW/template-assets.md +303 -0
  66. package/corpus/core/docs/content/locales/zh-TW/template-brain.md +324 -0
  67. package/corpus/core/docs/content/locales/zh-TW/template-calendar.md +194 -0
  68. package/corpus/core/docs/content/locales/zh-TW/template-chat.md +129 -0
  69. package/corpus/core/docs/content/locales/zh-TW/template-clips.md +368 -0
  70. package/corpus/core/docs/content/locales/zh-TW/template-content.md +402 -0
  71. package/corpus/core/docs/content/locales/zh-TW/template-design.md +173 -0
  72. package/corpus/core/docs/content/locales/zh-TW/template-dispatch.md +220 -0
  73. package/corpus/core/docs/content/locales/zh-TW/template-forms.md +178 -0
  74. package/corpus/core/docs/content/locales/zh-TW/template-mail.md +239 -0
  75. package/corpus/core/docs/content/locales/zh-TW/template-plan.md +814 -0
  76. package/corpus/core/docs/content/locales/zh-TW/template-slides.md +293 -0
  77. package/corpus/core/docs/content/locales/zh-TW/template-videos.md +222 -0
  78. package/corpus/core/docs/content/locales/zh-TW/tracking.md +236 -0
  79. package/corpus/core/docs/content/locales/zh-TW/using-your-agent.md +71 -0
  80. package/corpus/core/docs/content/locales/zh-TW/voice-input.md +81 -0
  81. package/corpus/core/docs/content/locales/zh-TW/what-is-agent-native.md +202 -0
  82. package/corpus/core/docs/content/locales/zh-TW/workspace-connections.md +321 -0
  83. package/corpus/core/docs/content/locales/zh-TW/workspace-management.md +175 -0
  84. package/corpus/core/docs/content/locales/zh-TW/workspace.md +323 -0
  85. package/corpus/core/docs/content/locales/zh-TW/writing-agent-instructions.md +173 -0
  86. package/corpus/core/package.json +1 -1
  87. package/corpus/core/src/client/ErrorBoundary.tsx +10 -0
  88. package/corpus/core/src/client/FeedbackButton.tsx +12 -0
  89. package/corpus/core/src/client/blocks/library/block-copy.ts +32 -0
  90. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +33 -0
  91. package/corpus/core/src/client/i18n.tsx +5 -0
  92. package/corpus/core/src/localization/actions/set-localization-preference.ts +2 -1
  93. package/corpus/core/src/localization/shared.ts +45 -0
  94. package/corpus/core/src/server/agent-chat-plugin.ts +54 -2
  95. package/corpus/core/src/server/onboarding-html.ts +99 -0
  96. package/corpus/core/src/templates/default/app/i18n/index.ts +2 -0
  97. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +466 -0
  98. package/corpus/core/src/templates/default/app/root.tsx +8 -0
  99. package/corpus/templates/analytics/app/i18n/index.ts +2 -0
  100. package/corpus/templates/analytics/app/i18n/zh-TW.ts +818 -0
  101. package/corpus/templates/analytics/app/i18n-data.ts +9 -0
  102. package/corpus/templates/assets/app/i18n/index.ts +2 -0
  103. package/corpus/templates/assets/app/i18n/zh-TW.ts +860 -0
  104. package/corpus/templates/assets/app/i18n-data.ts +3 -0
  105. package/corpus/templates/brain/app/i18n/index.ts +2 -0
  106. package/corpus/templates/brain/app/i18n/zh-TW.ts +709 -0
  107. package/corpus/templates/brain/app/i18n-data.ts +3 -0
  108. package/corpus/templates/calendar/app/i18n/zh-TW.ts +836 -0
  109. package/corpus/templates/calendar/app/i18n-data.ts +4 -0
  110. package/corpus/templates/chat/app/i18n/index.ts +2 -0
  111. package/corpus/templates/chat/app/i18n/zh-TW.ts +67 -0
  112. package/corpus/templates/chat/app/i18n-data.ts +3 -0
  113. package/corpus/templates/clips/app/i18n/index.ts +2 -0
  114. package/corpus/templates/clips/app/i18n/zh-TW.ts +1280 -0
  115. package/corpus/templates/content/app/i18n/index.ts +2 -0
  116. package/corpus/templates/content/app/i18n/zh-TW.ts +906 -0
  117. package/corpus/templates/content/app/i18n-data.ts +4 -0
  118. package/corpus/templates/design/app/i18n/index.ts +2 -0
  119. package/corpus/templates/design/app/i18n/zh-TW.ts +517 -0
  120. package/corpus/templates/design/app/i18n-data.ts +6 -0
  121. package/corpus/templates/dispatch/app/i18n/index.ts +2 -0
  122. package/corpus/templates/dispatch/app/i18n/zh-TW.ts +195 -0
  123. package/corpus/templates/dispatch/app/i18n-data.ts +3 -0
  124. package/corpus/templates/forms/app/i18n/index.ts +2 -0
  125. package/corpus/templates/forms/app/i18n/zh-TW.ts +349 -0
  126. package/corpus/templates/macros/app/i18n/index.ts +2 -0
  127. package/corpus/templates/macros/app/i18n/zh-TW.ts +224 -0
  128. package/corpus/templates/mail/app/i18n/index.ts +2 -0
  129. package/corpus/templates/mail/app/i18n/zh-TW.ts +562 -0
  130. package/corpus/templates/mail/app/root.tsx +6 -0
  131. package/corpus/templates/plan/app/i18n/index.ts +2 -0
  132. package/corpus/templates/plan/app/i18n/zh-TW.ts +712 -0
  133. package/corpus/templates/slides/app/i18n/index.ts +2 -0
  134. package/corpus/templates/slides/app/i18n/zh-TW.ts +531 -0
  135. package/corpus/templates/videos/app/i18n/index.ts +2 -0
  136. package/corpus/templates/videos/app/i18n/zh-TW.ts +435 -0
  137. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  138. package/dist/client/ErrorBoundary.js +10 -0
  139. package/dist/client/ErrorBoundary.js.map +1 -1
  140. package/dist/client/FeedbackButton.d.ts.map +1 -1
  141. package/dist/client/FeedbackButton.js +12 -0
  142. package/dist/client/FeedbackButton.js.map +1 -1
  143. package/dist/client/blocks/library/block-copy.d.ts.map +1 -1
  144. package/dist/client/blocks/library/block-copy.js +32 -0
  145. package/dist/client/blocks/library/block-copy.js.map +1 -1
  146. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  147. package/dist/client/extensions/ExtensionsSidebarSection.js +32 -0
  148. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  149. package/dist/client/i18n.d.ts.map +1 -1
  150. package/dist/client/i18n.js +5 -0
  151. package/dist/client/i18n.js.map +1 -1
  152. package/dist/collab/awareness.d.ts +2 -2
  153. package/dist/collab/awareness.d.ts.map +1 -1
  154. package/dist/collab/routes.d.ts +1 -1
  155. package/dist/localization/actions/set-localization-preference.d.ts.map +1 -1
  156. package/dist/localization/actions/set-localization-preference.js +2 -2
  157. package/dist/localization/actions/set-localization-preference.js.map +1 -1
  158. package/dist/localization/shared.d.ts +1 -1
  159. package/dist/localization/shared.d.ts.map +1 -1
  160. package/dist/localization/shared.js +43 -0
  161. package/dist/localization/shared.js.map +1 -1
  162. package/dist/resources/handlers.d.ts +2 -2
  163. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  164. package/dist/server/agent-chat-plugin.js +55 -2
  165. package/dist/server/agent-chat-plugin.js.map +1 -1
  166. package/dist/server/onboarding-html.d.ts.map +1 -1
  167. package/dist/server/onboarding-html.js +96 -0
  168. package/dist/server/onboarding-html.js.map +1 -1
  169. package/dist/templates/default/app/i18n/index.ts +2 -0
  170. package/dist/templates/default/app/i18n/zh-TW.ts +466 -0
  171. package/dist/templates/default/app/root.tsx +8 -0
  172. package/docs/content/locales/zh-TW/a2a-protocol.md +392 -0
  173. package/docs/content/locales/zh-TW/actions.md +583 -0
  174. package/docs/content/locales/zh-TW/agent-mentions.md +164 -0
  175. package/docs/content/locales/zh-TW/agent-surfaces.md +397 -0
  176. package/docs/content/locales/zh-TW/agent-teams.md +171 -0
  177. package/docs/content/locales/zh-TW/agent-web-surfaces.md +161 -0
  178. package/docs/content/locales/zh-TW/audit-log.md +111 -0
  179. package/docs/content/locales/zh-TW/authentication.md +332 -0
  180. package/docs/content/locales/zh-TW/automations.md +268 -0
  181. package/docs/content/locales/zh-TW/blueprint-installer.md +83 -0
  182. package/docs/content/locales/zh-TW/cli-adapters.md +129 -0
  183. package/docs/content/locales/zh-TW/client.md +398 -0
  184. package/docs/content/locales/zh-TW/cloneable-saas.md +114 -0
  185. package/docs/content/locales/zh-TW/code-agents-ui.md +436 -0
  186. package/docs/content/locales/zh-TW/components.md +368 -0
  187. package/docs/content/locales/zh-TW/context-awareness.md +373 -0
  188. package/docs/content/locales/zh-TW/creating-templates.md +411 -0
  189. package/docs/content/locales/zh-TW/cross-app-sso.md +188 -0
  190. package/docs/content/locales/zh-TW/database.md +183 -0
  191. package/docs/content/locales/zh-TW/deployment.md +348 -0
  192. package/docs/content/locales/zh-TW/dispatch.md +146 -0
  193. package/docs/content/locales/zh-TW/drop-in-agent.md +260 -0
  194. package/docs/content/locales/zh-TW/durable-resume.md +65 -0
  195. package/docs/content/locales/zh-TW/embedding-sdk.md +597 -0
  196. package/docs/content/locales/zh-TW/evals.md +155 -0
  197. package/docs/content/locales/zh-TW/extensions.md +360 -0
  198. package/docs/content/locales/zh-TW/external-agents.md +619 -0
  199. package/docs/content/locales/zh-TW/faq.md +142 -0
  200. package/docs/content/locales/zh-TW/file-uploads.md +122 -0
  201. package/docs/content/locales/zh-TW/frames.md +153 -0
  202. package/docs/content/locales/zh-TW/getting-started.md +199 -0
  203. package/docs/content/locales/zh-TW/harness-agents.md +349 -0
  204. package/docs/content/locales/zh-TW/human-approval.md +86 -0
  205. package/docs/content/locales/zh-TW/internationalization.md +147 -0
  206. package/docs/content/locales/zh-TW/key-concepts.md +312 -0
  207. package/docs/content/locales/zh-TW/local-file-mode.md +433 -0
  208. package/docs/content/locales/zh-TW/mcp-apps.md +147 -0
  209. package/docs/content/locales/zh-TW/mcp-clients.md +330 -0
  210. package/docs/content/locales/zh-TW/mcp-protocol.md +279 -0
  211. package/docs/content/locales/zh-TW/messaging.md +461 -0
  212. package/docs/content/locales/zh-TW/migration-workbench.md +33 -0
  213. package/docs/content/locales/zh-TW/multi-app-workspace.md +312 -0
  214. package/docs/content/locales/zh-TW/multi-tenancy.md +52 -0
  215. package/docs/content/locales/zh-TW/native-chat-ui.md +321 -0
  216. package/docs/content/locales/zh-TW/notifications.md +231 -0
  217. package/docs/content/locales/zh-TW/observability.md +294 -0
  218. package/docs/content/locales/zh-TW/observational-memory.md +77 -0
  219. package/docs/content/locales/zh-TW/onboarding.md +216 -0
  220. package/docs/content/locales/zh-TW/plan-plugin.md +200 -0
  221. package/docs/content/locales/zh-TW/pr-visual-recap.md +384 -0
  222. package/docs/content/locales/zh-TW/processors.md +106 -0
  223. package/docs/content/locales/zh-TW/progress.md +199 -0
  224. package/docs/content/locales/zh-TW/pure-agent-apps.md +39 -0
  225. package/docs/content/locales/zh-TW/real-time-collaboration.md +680 -0
  226. package/docs/content/locales/zh-TW/recurring-jobs.md +142 -0
  227. package/docs/content/locales/zh-TW/routing.md +79 -0
  228. package/docs/content/locales/zh-TW/sandbox-adapters.md +227 -0
  229. package/docs/content/locales/zh-TW/security.md +330 -0
  230. package/docs/content/locales/zh-TW/server.md +265 -0
  231. package/docs/content/locales/zh-TW/sharing.md +219 -0
  232. package/docs/content/locales/zh-TW/skills-guide.md +281 -0
  233. package/docs/content/locales/zh-TW/template-analytics.md +259 -0
  234. package/docs/content/locales/zh-TW/template-assets.md +303 -0
  235. package/docs/content/locales/zh-TW/template-brain.md +324 -0
  236. package/docs/content/locales/zh-TW/template-calendar.md +194 -0
  237. package/docs/content/locales/zh-TW/template-chat.md +129 -0
  238. package/docs/content/locales/zh-TW/template-clips.md +368 -0
  239. package/docs/content/locales/zh-TW/template-content.md +402 -0
  240. package/docs/content/locales/zh-TW/template-design.md +173 -0
  241. package/docs/content/locales/zh-TW/template-dispatch.md +220 -0
  242. package/docs/content/locales/zh-TW/template-forms.md +178 -0
  243. package/docs/content/locales/zh-TW/template-mail.md +239 -0
  244. package/docs/content/locales/zh-TW/template-plan.md +814 -0
  245. package/docs/content/locales/zh-TW/template-slides.md +293 -0
  246. package/docs/content/locales/zh-TW/template-videos.md +222 -0
  247. package/docs/content/locales/zh-TW/tracking.md +236 -0
  248. package/docs/content/locales/zh-TW/using-your-agent.md +71 -0
  249. package/docs/content/locales/zh-TW/voice-input.md +81 -0
  250. package/docs/content/locales/zh-TW/what-is-agent-native.md +202 -0
  251. package/docs/content/locales/zh-TW/workspace-connections.md +321 -0
  252. package/docs/content/locales/zh-TW/workspace-management.md +175 -0
  253. package/docs/content/locales/zh-TW/workspace.md +323 -0
  254. package/docs/content/locales/zh-TW/writing-agent-instructions.md +173 -0
  255. package/package.json +1 -1
  256. package/src/templates/default/app/i18n/index.ts +2 -0
  257. package/src/templates/default/app/i18n/zh-TW.ts +466 -0
  258. package/src/templates/default/app/root.tsx +8 -0
@@ -0,0 +1,373 @@
1
+ ---
2
+ title: "情境意識"
3
+ description: "代理如何知道使用者正在檢視的內容:導覽狀態、選取上下文、視圖螢幕、sendToAgentChat 切換、導覽指令和抖動預防。"
4
+ ---
5
+
6
+ # 情境意識
7
+
8
+ > **開發人員頁面。** 此頁面供開發人員連線應用程式的上下文層。對於最終使用者體驗 - 代理如何在對話中使用該上下文 - 請參閱 [Using Your Agent](/docs/using-your-agent)。
9
+
10
+ 代理如何知道使用者正在看什么——以及代理如何控制使用者看到的內容。
11
+
12
+ ## 概述 {#overview}
13
+
14
+ 如果沒有上下文感知,代理就是盲目的。它詢問“哪個電子郵件?”當使用者盯著一個時。它無法作用於目前的選取,無法提供相關建議,也無法修改使用者所看到的內容。借助上下文感知,使用者可以點選一行、突出顯示一個段落、選取一個幻燈片元素或按 Cmd+I,然後說“總結一下”,然後代理就已經知道“這個”的含義。
15
+
16
+ 要了解在哪個曲面中放置什么內容(AGENTS.md、skills、application_state),請參閱 [Writing Agent Instructions — The four surfaces the agent sees](/docs/writing-agent-instructions#four-surfaces)。
17
+
18
+ 六種模式解決了這個問題:
19
+
20
+ 1. **導覽狀態**——UI 在每次路線更改時將 `navigation` 金鑰寫入應用程式狀態
21
+ 2. **目前 URL** - 框架寫入 `__url__`,因此查詢參數對代理可見且可編輯
22
+ 3. **選取狀態**——當使用者聚焦、選取或多選有意義的內容時,UI 會寫入 `selection` 鍵
23
+ 4. **`view-screen`**——讀取應用程式狀態、獲取上下文資料並返回使用者所見內容的快照的操作
24
+ 5. **提示切換** -- 當點擊應成為代理輪次時,UI 控件調用 `sendToAgentChat()`
25
+ 6. **`navigate`**——來自代理的一次性指令,告訴 UI 去哪裡
26
+
27
+ ```an-diagram title="代理如何看到您所看到的內容" summary="UI編寫輕量級狀態鍵;螢幕將它們轉化為真實的紀錄;代理可以編寫導覽返回來行動 UI。"
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\">視圖、開啟的 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\">&rarr;</div><div class=\"diagram-panel center\" data-rough><span class=\"diagram-pill accent\">view-screen</span><small class=\"diagram-muted\">reads state &middot; fetches records</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</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\">&#8635;</div><div class=\"diagram-box diagram-accent\">navigate<br><small class=\"diagram-muted\">代理行動 UI</small></div></div>",
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
+ }
32
+ ```
33
+
34
+ ## 上下文層 {#context-layers}
35
+
36
+ 針對不同的作業使用不同的上下文通道:
37
+
38
+ | 層 | 所有者 | 用它來 |
39
+ | ---------------------------------------- | ----------------- | ------------------------------------------------------------ |
40
+ | `navigation` 應用狀態金鑰 | UI | 語義路由狀態:目前視圖、開啟的紀錄、活動分頁、穩定 ID |
41
+ | `__url__` 應用狀態金鑰 | 框架UI | 目前路徑名、搜尋字串、哈希和解析的 URL 查詢參數 |
42
+ | `__set_url__` 應用狀態金鑰 | 代理/框架 | 對 `set-search-params` 和 `set-url-path` 進行一次性 URL 編輯 |
43
+ | `selection` 應用狀態金鑰 | UI | 持久的語義選取:行、塊、形狀、資產、訊息 |
44
+ | `pending-selection-context` 應用狀態金鑰 | UI / `AgentPanel` | 一次性選取的文本附加到下一個聊天回合,通常來自 Cmd+I |
45
+ | `view-screen` 動作 | 代理 | 將應用狀態鍵融入真實紀錄和螢幕摘要 |
46
+ | `sendToAgentChat()` | UI | 將點擊、指令、評論圖釘或所選專案轉變為聊天提示 |
47
+ | `navigate` 應用狀態金鑰 | 代理 | 要求UI行動到另一條路線或聚焦另一個物體 |
48
+
49
+ 簡短版本:URL 查詢參數是可共用過濾器的真實來源,`navigation` 存儲語義 ID 和視圖名稱,`view-screen` 將這些狀態層轉換為有用的資料,而當使用者點選指令時,`sendToAgentChat()` 將 UI 意圖轉換為聊天訊息。
50
+
51
+ ## 導覽狀態 {#navigation-state}
52
+
53
+ UI 在每次路由更改時將 `navigation` 金鑰寫入應用程式狀態。這告訴代理使用者正在使用哪個視圖、開啟哪個專案以及哪個語義 UI 狀態很重要。
54
+
55
+ ```json
56
+ {
57
+ "view": "inbox",
58
+ "threadId": "thread-123",
59
+ "focusedEmailId": "msg-456",
60
+ "label": "important"
61
+ }
62
+ ```
63
+
64
+ 導覽狀態中包含的內容:
65
+
66
+ - `view` -- 目前頁面/部分,例如“收件箱”、“表單建置器”或“儀表板”
67
+ - 專案 ID -- 選定/開啟的專案,例如 `threadId` 或 `formId`
68
+ - 語義別名 - 活動分頁、標籤名稱或其他有助於代理推理的穩定應用概念
69
+ - 輕焦點狀態 - 聚焦行、活動分頁、目前面板
70
+
71
+ 保持 `navigation` 小且語義化。它應該識別目前螢幕,而不是複製整個紀錄或鏡像每個查詢參數。獲取 `view-screen` 中的紀錄,以便代理始終獲取最新資料。
72
+
73
+ 代理在行動前閱讀以下內容:
74
+
75
+ ```ts
76
+ import { readAppState } from "@agent-native/core/application-state";
77
+
78
+ const navigation = await readAppState("navigation");
79
+ // { view: "inbox", threadId: "thread-123", label: "important" }
80
+ ```
81
+
82
+ ## 目前URL和過濾器 {#current-url}
83
+
84
+ `AgentPanel` 自動將目前 React 路由器 URL 同步到 `__url__` 應用程式狀態金鑰中。內置代理每次都會將其包含為 `<current-url>` 塊:
85
+
86
+ ```text
87
+ <current-url>
88
+ pathname: /adhoc/revenue
89
+ search: ?f_region=west&q=renewal
90
+ searchParams:
91
+ f_region: west
92
+ q: renewal
93
+ </current-url>
94
+ ```
95
+
96
+ 這是可共用過濾器狀態的規範層。如果使用者可以複製 URL 並返回到相同的過濾列表,則該過濾器屬於查詢字串。代理可以使用內置的 `set-search-params` 工具更改這些過濾器:
97
+
98
+ ```text
99
+ set-search-params({ "params": { "f_region": "east", "q": null } })
100
+ ```
101
+
102
+ 僅將 `navigation` 用於幫助 `view-screen` 獲取或匯總正確資料的語義別名。儀表板可能保留 `navigation.dashboardId`,而 `__url__.searchParams` 擁有 `f_region`、`f_dateStart` 和 `q`。
103
+
104
+ 當`view-screen`返回更丰富的快照時,它可以將重要的URL過濾器複製到友好的`activeFilters`物件中:
105
+
106
+ ```ts
107
+ const url = (await readAppState("__url__")) as {
108
+ searchParams?: Record<string, string>;
109
+ } | null;
110
+
111
+ if (url?.searchParams) {
112
+ screen.activeFilters = Object.fromEntries(
113
+ Object.entries(url.searchParams).filter(
114
+ ([key, value]) => key.startsWith("f_") && value,
115
+ ),
116
+ );
117
+ }
118
+ ```
119
+
120
+ ## 選取狀態 {#selection-state}
121
+
122
+ 選取是語義 UI 狀態。這就是“我點選的圖表”、“這三行”、“這張幻燈片標題”或“目前電子郵件草稿範圍”如何成為模型可見上下文的方式。
123
+
124
+ 使用 `selection` 應用狀態鍵進行持久選取,該選取應該在導覽、空聊天建議或稍後的 `view-screen` 調用中保留下來:
125
+
126
+ ```json
127
+ {
128
+ "kind": "slide.elements",
129
+ "deckId": "deck-123",
130
+ "slideId": "slide-4",
131
+ "items": [
132
+ {
133
+ "id": "hero-title",
134
+ "selector": "[data-block-id='hero-title']",
135
+ "label": "Hero title",
136
+ "text": "第三季度發布 plan"
137
+ }
138
+ ],
139
+ "capturedAt": 1780332977027
140
+ }
141
+ ```
142
+
143
+ 當使用者選取、聚焦或多選有意義的物件時,從 UI 寫入:
144
+
145
+ ```tsx
146
+ import { setClientAppState } from "@agent-native/core/client";
147
+
148
+ async function syncSelection(selection: unknown | null) {
149
+ await setClientAppState("selection", selection, { keepalive: true });
150
+ }
151
+ ```
152
+
153
+ 良好的選取狀態包括:
154
+
155
+ - 代理可以在 actions 中使用的穩定 ID,例如 `threadId`、`slideId` 或 `assetId`
156
+ - 簡短的人工標籤,以便提示和建議易於閱讀
157
+ - 足夠的文本或元資料來消除物件的歧義
158
+ - 可選的 UI 定位器,例如代理需要引用視覺元素時的選取器或坐標
159
+ - `capturedAt` 當過時的選取有害時
160
+
161
+ 避免在 `selection` 中存儲機密、完整檔案、大型二進制有效負載或整個 API 回應。存儲 ID 和簡短摘錄,然後讓 `view-screen` 獲取目前的事實來源。
162
+
163
+ ### 一次性選定文本 {#pending-selection-context}
164
+
165
+ `AgentPanel` 已經處理常見的文本選取流程。當使用者在頁面上選取文本的情況下按 Cmd+I(或 Ctrl+I)時,它:
166
+
167
+ 1. 讀取`window.getSelection()`
168
+ 2. 將 `{ text, capturedAt }` 寫入 `pending-selection-context`
169
+ 3. 聚焦客服人員聊天
170
+
171
+ 正式環境代理將該金鑰作為立即選取上下文注入下一回合,並在其過時後忽略它。這是使“選取文本,按 Cmd+I,詢問‘使其更加有力’”工作的路徑,而無需使用者將選取內容複製到提示中。
172
+
173
+ 當自訂編輯器的選取不由本機瀏覽器選取表示時,可以編寫相同的鍵:
174
+
175
+ ```tsx
176
+ import { setClientAppState } from "@agent-native/core/client";
177
+
178
+ await setClientAppState(
179
+ "pending-selection-context",
180
+ {
181
+ text: selectedMarkdown,
182
+ capturedAt: Date.now(),
183
+ },
184
+ { keepalive: true },
185
+ );
186
+ ```
187
+
188
+ 使用 `pending-selection-context` 一次性“對這個精確突出顯示的文本進行操作”流程。使用 `selection` 進行持久物件選取,`view-screen` 和動態建議應該不斷看到。
189
+
190
+ ## 檢視螢幕操作 {#view-screen-action}
191
+
192
+ 每個範本都應該有一個 `view-screen` 操作。它讀取導覽和選取狀態,獲取相關資料,並返回使用者所看到內容的快照。這是特工的眼睛。
193
+
194
+ ```an-annotated-code title="檢視螢幕 — 特工的眼睛"
195
+ {
196
+ "filename": "actions/view-screen.ts",
197
+ "language": "ts",
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
+ "annotations": [
200
+ { "lines": "10-11", "label": "工具表面", "note": "代理讀取此描述,知道它可以調用 `view-screen` 來檢視目前的 UI。" },
201
+ { "lines": "13", "label": "http: false", "note": "內部操作 - 未通過 HTTP 暴露。代理和 `pnpm action` 調用它,而不是瀏覽器。" },
202
+ { "lines": "15-16", "label": "讀取狀態", "note": "拉取 UI 編寫的輕量級 `navigation` 和 `selection` 鍵。" },
203
+ { "lines": "23-37", "label": "水合物", "note": "將這些 ID 直接從 SQL 轉換為**新鮮**紀錄,以便代理在執行操作之前驗證活動物件。" }
204
+ ]
205
+ }
206
+ ```
207
+
208
+ 代理應在對目前 UI 進行操作之前調用 `pnpm action view-screen`。這是所有範本的硬約定。新增新功能時,更新 `view-screen` 以返回新視圖和任何新選取形狀的資料。
209
+
210
+ ```an-callout
211
+ {
212
+ "tone": "info",
213
+ "body": "**保持 `navigation` 和 `selection` 小。**商店 ID 加上短標籤,而不是整個紀錄。 `view-screen` 根據需要獲取事實來源,因此陳舊或龐大的狀態永遠不會到達代理。"
214
+ }
215
+ ```
216
+
217
+ ## 與 `sendToAgentChat()` 快速切換 {#send-to-agent-chat}
218
+
219
+ 有時上下文不應該僅僅處於應用程式狀態。使用者點選按鈕、放下評論圖釘、選取專案並選取“詢問代理”,或者按下工具列中的 AI 指令。那次點擊是一個指令。在瀏覽器UI中,將其交給帶有`sendToAgentChat()`的代理。
220
+
221
+ ```tsx
222
+ import { sendToAgentChat } from "@agent-native/core/client";
223
+
224
+ function askAgentAboutSelection(selection: {
225
+ documentId: string;
226
+ blockId: string;
227
+ label: string;
228
+ text: string;
229
+ }) {
230
+ sendToAgentChat({
231
+ message: `Improve the selected block: ${selection.label}`,
232
+ context: [
233
+ `Document id: ${selection.documentId}`,
234
+ `Block id: ${selection.blockId}`,
235
+ "Current selected text:",
236
+ selection.text,
237
+ ].join("\n"),
238
+ submit: false,
239
+ openSidebar: true,
240
+ });
241
+ }
242
+ ```
243
+
244
+ 有意使用這些欄位:
245
+
246
+ | 欄位 | 含義 |
247
+ | ------------------- | -------------------------------------------------------- |
248
+ | `message` | 聊天中顯示可見的提示文本 |
249
+ | `context` | 隱藏的模型可見上下文,不顯示為面向使用者的聊天文本 |
250
+ | `submit: true` | 立即發送;適用於顯式指令按鈕,例如“修複布局” |
251
+ | `submit: false` | 預填以供使用者審核;適合“向代理詢問此事”或模棱兩可的選取 |
252
+ | `openSidebar: true` | 即使面板折疊,代理回應也可見 |
253
+ | `newTab: true` | 為更大的建立工作啟動單獨的聊天線程 |
254
+ | `type: "code"` | 當請求涉及更改應用程式來源時路由到程式碼編輯框架 |
255
+
256
+ `sendToAgentChat()` 是提交的聊天路徑受支持的瀏覽器包裝器,有時在內部被視為 `agentNative.submitChat`。應用程式 UI 應調用包裝器,而不是直接發布 `agentNative.submitChat`,因為包裝器處理本機側邊欄、Builder/Frame 路由、MCP 應用程式主機路由、分頁 ID 和程式碼請求路由。
257
+
258
+ 對於沒有瀏覽器側邊欄的節點/腳本上下文,請使用 `agentChat.submit()` 或 `agentChat.prefill()`。伺服器actions一般不應該調用僅瀏覽器的`sendToAgentChat()`;如果某個操作需要開啟 UI 向代理詢問某些內容,請將一個小請求寫入 `application_state` 並讓 UI 橋接器從瀏覽器發送它。
259
+
260
+ ### 點擊提示中的專案 {#clicked-items-in-prompt}
261
+
262
+ 對於“點選 UI 中的專案,它們成為提示的一部分”體驗,請將選取狀態與提示切換相結合:
263
+
264
+ 1. 點選或多選時,寫入語義 `selection` 狀態,以便 `view-screen`、動態建議和未來回合可以看到它。
265
+ 2. 如果點擊也是指令,則調用`sendToAgentChat()`,簡潔的可見`message`和更丰富的隱藏`context`。
266
+ 3. 在 `view-screen` 中,將選定的 ID 合並到目前紀錄中,以便代理可以在改變物件之前驗證該物件。
267
+ 4. 當物件不再被選取、刪除或不再相關時,清除 `selection`。
268
+
269
+ 這為使用者提供了神奇的“這就是我的意思”行為,而無需在每個提示中填充大量可見上下文。
270
+
271
+ ## 導覽操作 {#navigate-action}
272
+
273
+ `navigate` 是 `navigation` 的鏡像。其中`navigation`是UI告訴代理使用者在哪裡,`navigate`是代理告訴UI去哪裡。代理將一次性 `navigate` 指令寫入應用程式狀態; UI 讀取它,執行導覽,然後刪除該條目。
274
+
275
+ ```ts
276
+ // Agent side -- write a navigate command
277
+ import { writeAppState } from "@agent-native/core/application-state";
278
+
279
+ await writeAppState("navigate", { view: "inbox", threadId: "thread-123" });
280
+ ```
281
+
282
+ 在 UI 端,您永遠不會手動輪詢或刪除此金鑰。兩個方向(在每次路由更改時寫入 `navigation` 並使用代理的 `navigate` 指令)均由單個鉤子 [`useNavigationState`](#use-navigation-state) 處理,下一節將對此進行介紹。
283
+
284
+ `navigation`金鑰屬於UI;代理絕不能直接寫入。代理寫入 `navigate`,UI 執行行動,該行動更新 `navigation`。
285
+
286
+ 當目的地有真實的URL時,請在其上包含同來源的`path`
287
+ `navigate` 指令並讓 UI 在回退到該路徑之前選取該路徑
288
+ 語義欄位。保持應用程式導覽單通道:不要同時寫入
289
+ `navigate` 和 `__set_url__` 相同的動作。 `__set_url__` 為
290
+ 框架URL工具(`set-url-path`、`set-search-params`)和僅URL過濾器
291
+ 改變。對於在聊天流式傳輸時可以到達的指令,請提交路由
292
+ 使用 `navigate(path, { replace: true, flushSync: true })` 而不是包裝它
293
+ 在視圖轉換中,使地址欄和可見頁面保持在一起。
294
+
295
+ ## useNavigationState 掛鉤 {#use-navigation-state}
296
+
297
+ `useNavigationState` 是 **您的應用程式的鉤子,而不是框架匯入。** 每個範本都在 `app/hooks/use-navigation-state.ts` 上發布一個,並從應用程式 shell (`root.tsx`) 調用它一次。這是連線兩個方向導覽的單一位置:
298
+
299
+ - **出站(UI→代理):**每當路線改變時寫入`navigation`金鑰,因此代理始終知道目前視圖。
300
+ - **入站(代理 → UI):**輪詢 `navigate` 指令、執行導覽並刪除指令。
301
+
302
+ 它很短,因為它是真實框架原語 `useAgentRouteState`(從 `@agent-native/core/client` 匯出)的薄包裝。您提供兩個特定於應用程式的功能,框架將完成其餘的工作:
303
+
304
+ ```tsx
305
+ // app/hooks/use-navigation-state.ts -- this file lives in YOUR app
306
+ import { useAgentRouteState } from "@agent-native/core/client";
307
+ import { TAB_ID } from "@/lib/tab-id";
308
+
309
+ interface NavigationState {
310
+ view: "inbox" | "thread";
311
+ threadId?: string;
312
+ path?: string;
313
+ }
314
+
315
+ export function useNavigationState() {
316
+ useAgentRouteState<NavigationState>({
317
+ browserTabId: TAB_ID,
318
+ requestSource: TAB_ID,
319
+
320
+ // UI → agent: derive semantic state from the current URL.
321
+ getNavigationState: ({ pathname }) => {
322
+ const match = pathname.match(/^\/thread\/([^/]+)/);
323
+ return match ? { view: "thread", threadId: match[1] } : { view: "inbox" };
324
+ },
325
+
326
+ // agent → UI: turn a `navigate` command into a route to push.
327
+ getCommandPath: (command) =>
328
+ command.path ??
329
+ (command.view === "thread" && command.threadId
330
+ ? `/thread/${command.threadId}`
331
+ : "/"),
332
+ navigateOptions: { replace: true, flushSync: true },
333
+ });
334
+ }
335
+ ```
336
+
337
+ | 你寫 | 框架句柄 |
338
+ | ----------------------------------------------- | ---------------------------------------------- |
339
+ | `getNavigationState` — 將 URL 對應到語義狀態 | `navigation` 寫入,制表符範圍加上全域後備鍵 |
340
+ | `getCommandPath` — 將 `navigate` 指令對應到路由 | 指令輪詢、讀後刪除、重複指令保護、請求來源標記 |
341
+
342
+ `useAgentRouteState` 假定為 React 路由器。當導覽不在 URL 中時(向導步驟、畫布選取、非路由器 shell),而是下拉到較低級別的 `useSemanticNavigationState`:您將現成的 `state` 值加上 `navigationKeys`/`commandKeys` 和 `onCommand` 回調,並且它與 React 路由器完全無關。
343
+
344
+ ## 抖動預防 {#jitter-prevention}
345
+
346
+ 當代理寫入應用程式狀態時,同步系統可能會導致 UI 重新獲取剛剛寫入的資料。這會產生抖動。解決方案是來源標記:
347
+
348
+ 使用 `@agent-native/core/client` 中的 `setClientAppState`、`writeClientAppState`、`readClientAppState` 和 `deleteClientAppState` 進行瀏覽器端應用程式狀態存取。與`useDbSync({ ignoreSource: TAB_ID })`配對時通過`{ requestSource: TAB_ID }`對UI進行寫入;通過 `{ keepalive: true }` 進行短期寫入,例如卸載期間的選取清理。
349
+
350
+ ```ts
351
+ // app/root.tsx
352
+ import { TAB_ID } from "@/lib/tab-id";
353
+
354
+ useDbSync({
355
+ queryClient,
356
+ ignoreSource: TAB_ID, // ignore events from this tab's own writes
357
+ });
358
+ ```
359
+
360
+ 工作原理:
361
+
362
+ - 代理寫入標記為 `requestSource: "agent"`(操作助手自動執行此操作)
363
+ - UI 寫入通過 `X-Request-Source` 標頭包含分頁的唯一 ID
364
+ - 伺服器存儲每個事件的來源
365
+ - 處理同步事件時,UI 會過濾掉與其自己的 `ignoreSource` 值匹配的事件 - 因此它不會重新獲取剛剛寫入的資料
366
+ - 來自代理、其他分頁和 actions 的事件仍然正常進行
367
+
368
+ ```an-diagram title="來源標記可阻止自重取抖動" summary="分頁會忽略標有其自己的 TAB_ID 的同步事件,但仍會對代理和其他分頁寫入做出反應。"
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\">&rarr;</div><div class=\"diagram-box\" data-rough>伺服器存儲來源<br>on the event</div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-card col\"><div class=\"diagram-pill warn\">source == TAB_ID &rarr; ignored</div><small class=\"diagram-muted\">無需重新拉取,無閃爍</small><div class=\"diagram-pill ok\">agent / other tab &rarr; applied</div><small class=\"diagram-muted\">介面實時更新</small></div></div>",
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
+ }
373
+ ```