@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,583 @@
1
+ ---
2
+ title: "Actions"
3
+ description: "defineAction - 成為代理工具、型別化前端掛鉤、框架傳輸、MCP 工具和 CLI 指令的單一定義。"
4
+ ---
5
+
6
+ # Actions
7
+
8
+ Actions 是您的應用所做的任何事情的唯一事實來源。使用 `defineAction()` 定義一次操作,將其放入 `actions/` 中,然後立即可用:
9
+
10
+ - **代理工具** — 代理通過 zod 派生的 JSON 架構檢視它,並可以在聊天中調用它。
11
+ - **型別安全 React 掛鉤** - 前端的 `useActionQuery("name")` 和 `useActionMutation("name")`,從架構推斷的型別。
12
+ - **指令式用戶端調用** — 當鉤子不適合時 `callAction("name", params)`。
13
+ - **框架傳輸** — 由這些鉤子後面的框架自動安裝,並可供外部 HTTP 用戶端使用。
14
+ - **MCP 工具** - 暴露給 Claude、ChatGPT 自訂 MCP 應用、Claude 桌面/程式碼、光標、Codex 和任何其他 MCP 用戶端。
15
+ - **A2A 工具** — 由其他代理本機應用通過 A2A 調用。
16
+ - **CLI 指令** - `pnpm action <name>` 用於腳本和開發循環。
17
+
18
+ 一個定義,七個消費者。這是 [ladder](/docs/what-is-agent-native#the-ladder) 的第 3 級。
19
+ 如果您正在決定是否在聊天中、在聊天中無頭公開操作
20
+ 嵌入式 sidecar,或作為完整的應用螢幕,請參閱 [Agent Surfaces](/docs/agent-surfaces)。
21
+
22
+ ```an-diagram title="一個定義,七個消費者" summary="單個 defineAction() 扇出到每個表面 - 代理、UI、HTTP、MCP、A2A 和 CLI - 具有一個經過驗證的模式和一個 run() 主體。"
23
+ {
24
+ "html": "<div class=\"diagram-fanout\"><div class=\"diagram-panel center\" data-rough><span class=\"diagram-pill accent\">defineAction()</span><small class=\"diagram-muted\">schema + run(),只定義一次</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-grid\"><div class=\"diagram-node\">Agent 工具<br><small class=\"diagram-muted\">上下文中的 JSON Schema</small></div><div class=\"diagram-node\">React 鉤子<br><small class=\"diagram-muted\">useActionQuery/Mutation</small></div><div class=\"diagram-node\">callAction()<br><small class=\"diagram-muted\">指令式用戶端</small></div><div class=\"diagram-node\">HTTP<br><small class=\"diagram-muted\">/_agent-native/actions/:name</small></div><div class=\"diagram-node\">MCP 工具<br><small class=\"diagram-muted\">外部主機</small></div><div class=\"diagram-node\">A2A 工具<br><small class=\"diagram-muted\">其他 agent-native 應用</small></div><div class=\"diagram-node\">CLI<br><small class=\"diagram-muted\">pnpm action &lt;name&gt;</small></div></div></div>",
25
+ "css": ".diagram-fanout{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.diagram-fanout .center{display:flex;flex-direction:column;align-items:center;gap:4px;padding:14px 16px}.diagram-fanout .diagram-arrow{font-size:22px;line-height:1}.diagram-fanout .diagram-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}"
26
+ }
27
+ ```
28
+
29
+ 如果 UI 和代理都需要做某事,請采取行動 - 而不是自訂
30
+ 路線。對於何時路由型協議才是正確的調用,請參閱[首選 Actions
31
+ 對於應用程式操作](/docs/server#actions-first)。
32
+
33
+ ## 從一個動作開始 {#hello-action}
34
+
35
+ 原始優先入口是一個動作,而不是範本。在無頭的情況下
36
+ 腳手架如`agent-native create my-agent --headless`,這個可以是
37
+ 整個第一個應用程式:
38
+
39
+ ```ts
40
+ // actions/hello.ts
41
+ import { defineAction } from "@agent-native/core/action";
42
+ import { z } from "zod";
43
+
44
+ export default defineAction({
45
+ description: "從本機代理問好。",
46
+ schema: z.object({
47
+ name: z.string().default("world"),
48
+ }),
49
+ http: { method: "GET" },
50
+ readOnly: true,
51
+ run: async ({ name }) => {
52
+ return { message: `Hello, ${name}!` };
53
+ },
54
+ });
55
+ ```
56
+
57
+ 從同一資料夾執行它:
58
+
59
+ ```bash
60
+ pnpm action hello '{"name":"Steve"}'
61
+ ```
62
+
63
+ CLI 接受 JSON 物件作為操作輸入,它與結構化的匹配
64
+ 代理已進行工具調用。簡單的標志仍然適用於快速手動執行:
65
+
66
+ ```bash
67
+ pnpm action hello --name Steve
68
+ ```
69
+
70
+ 然後針對該資料夾執行應用程式代理循環:
71
+
72
+ ```bash
73
+ pnpm agent "Call hello for Steve and explain the result"
74
+ ```
75
+
76
+ 這與您計畫的作業、聊天 UI、外部 MCP 循環相同的應用程式代理
77
+ 工具,以及未來的螢幕將使用。聊天和域範本用於新增 UI
78
+ 大約 actions,不是操作本身的必需先決條件。
79
+
80
+ ## 定義操作 {#defining}
81
+
82
+ ```an-annotated-code title="動作剖析"
83
+ {
84
+ "filename": "actions/reply-to-email.ts",
85
+ "language": "ts",
86
+ "code": "import { defineAction } from \"@agent-native/core/action\";\nimport { z } from \"zod\";\n\nexport default defineAction({\n description: \"Reply to an email thread in the user's voice.\",\n schema: z.object({\n emailId: z.string().describe(\"The id of the email to reply to.\"),\n body: z.string().describe(\"The reply body, in markdown.\"),\n }),\n run: async ({ emailId, body }) => {\n await db.insert(replies).values({ emailId, body });\n return { ok: true, emailId };\n },\n});",
87
+ "annotations": [
88
+ { "lines": "5", "label": "工具表面", "note": "`description` 是代理讀取以決定何時調用此動作的內容。每個欄位的 `.describe()` 也會進入 JSON Schema。" },
89
+ { "lines": "6-9", "label": "型別化契約", "note": "一個 schema 會驗證來自**每個**介面的輸入,並轉換為供模型使用的 JSON Schema。無效輸入永遠不會進入 `run`。" },
90
+ { "lines": "10-13", "label": "單一實現", "note": "`run` 主體是唯一事實來源,UI 按鈕和代理工具都會執行這一段。" }
91
+ ]
92
+ }
93
+ ```
94
+
95
+ 就是這樣。該框架會自動發現 `actions/` 中的每個檔案並在啟動時掛載它們。
96
+
97
+ ### 架構選項 {#schemas}
98
+
99
+ `schema` 接受任何 [Standard Schema](https://standardschema.dev) 兼容庫:
100
+
101
+ - **Zod** (v4) — 最常見、最佳型別推斷,自動轉換為 JSON 架構。
102
+ - **Valibot** — 最小捆綁包大小(如果重要的話)。
103
+ - **ArkType** — 如果您喜歡語法。
104
+
105
+ 該架構將轉換為 Claude API 工具定義的 JSON 架構,並在執行時用於在 `run()` 觸發之前驗證輸入。無效輸入永遠不會到達您的處理程序。
106
+
107
+ ### 驗證返回值 {#output-schema}
108
+
109
+ `schema` 驗證*輸入*。要驗證操作 **返回**,請傳遞 `outputSchema`(任何標準模式兼容模式 - Zod、Valibot、ArkType、與 `schema` 相同的表面)。框架在 `run()` 解析之後驗證結果,並與輸入驗證組合:在 `run` 之前驗證輸入,在 `run` 之後驗證輸出。
110
+
111
+ ```ts
112
+ export default defineAction({
113
+ description: "Summarize a thread.",
114
+ schema: z.object({ threadId: z.string() }),
115
+ outputSchema: z.object({
116
+ summary: z.string(),
117
+ messageCount: z.number(),
118
+ }),
119
+ outputErrorStrategy: "warn", // default
120
+ run: async ({ threadId }) => {
121
+ /* ...returns { summary, messageCount } ... */
122
+ },
123
+ });
124
+ ```
125
+
126
+ `outputErrorStrategy` 控制不匹配時發生的情況:
127
+
128
+ | 策略 | 不匹配時的行為 |
129
+ | ------------ | -------------------------------------------------------------- |
130
+ | `"warn"` | **預設。** `console.warn` 問題並返回**原始**結果不變。不間斷。 |
131
+ | `"strict"` | 拋出一個明顯的錯誤,以便大聲地浮現出有問題的操作。 |
132
+ | `"fallback"` | 返回提供的 `outputFallback` 值來代替無效結果。 |
133
+
134
+ 成功後,將返回 **validated** 值,因此 `outputSchema` 上定義的任何強制或預設值都會生效(鏡像輸入路徑)。當沒有提供 `outputSchema` 時,行為是逐字節不變的——沒有包裝。這是從 Mastra/Flue 結構化輸出借來的,並且在操作層上保持無依賴性。
135
+
136
+ ### HTTP設定 {#http}
137
+
138
+ 預設情況下,每個操作都公開為 `POST /_agent-native/actions/<name>`。使用 `http` 選項覆蓋:
139
+
140
+ ```ts
141
+ export default defineAction({
142
+ description: "Get details for a lead.",
143
+ schema: z.object({ leadId: z.string() }),
144
+ http: { method: "GET" },
145
+ run: async ({ leadId }) => {
146
+ return await db.select().from(leads).where(eq(leads.id, leadId));
147
+ },
148
+ });
149
+ ```
150
+
151
+ 對於 `GET` 操作,`leadId` 作為查詢參數傳遞:`/_agent-native/actions/get-lead?leadId=abc`。
152
+
153
+ ```an-api title="自動掛載的 action 端點" method="GET" path="/_agent-native/actions/get-lead"
154
+ {
155
+ "method": "GET",
156
+ "path": "/_agent-native/actions/get-lead",
157
+ "summary": "每個 action 都會自動掛載在這裡 - 檔案名就是 action 名稱。",
158
+ "description": "預設是 POST;`http: { method: \"GET\" }` 會讓它成為 GET。無論任何 `http.path` 覆蓋如何,React 鉤子 和 `callAction` 始終按名稱調用這個路徑。",
159
+ "auth": "工作階段 cookie;前端調用會攜帶 `X-Agent-Native-Frontend: 1`",
160
+ "params": [
161
+ { "name": "leadId", "in": "query", "type": "string", "required": true, "description": "GET 參數以查詢參數傳入;POST 參數以 JSON body 傳入。" }
162
+ ],
163
+ "responses": [
164
+ { "status": "200", "description": "action 的返回值,以 JSON 表示。" },
165
+ { "status": "400", "description": "輸入在 run() 觸發前未通過 schema 驗證。" }
166
+ ]
167
+ }
168
+ ```
169
+
170
+ - **`http: { method: "GET" | "POST" | "PUT" | "DELETE" }`** — 預設 `POST`。 `GET` actions 會自動標記為 `readOnly`,因此成功的調用不會觸發 UI 輪詢刷新。
171
+ - **`http: { path: "..." }`** — 覆蓋 `/_agent-native/actions/` 下安裝的 URL。預設為檔案名。 **路徑覆蓋僅針對直接 HTTP 調用方更改 URL** — 無論此覆蓋如何,`useActionQuery`、`useActionMutation` 和 `callAction` 始終調用 `/_agent-native/actions/<name>`,因此覆蓋路徑會使這些掛鉤 404。僅對外部 HTTP 調用方使用路徑覆蓋。另請注意,覆蓋路徑中的 `:param` 路由段**不會**解析為 `run()` 參數 - 只有查詢字串參數和 JSON 內文欄位。
172
+ - **`http: false`** — 完全停用 HTTP 端點。僅限代理 + CLI。
173
+ - **`readOnly: true`** — 即使對於不變異的 POST actions 也顯式跳過輪詢刷新。
174
+ - **`parallelSafe: true`** — 允許變異操作與其他同回合工具調用同時執行。僅當操作內部並發安全且與順序無關時才設定此項;預設情況下改變 actions 序列化。
175
+
176
+ ### 保持操作面較小 {#small-surface}
177
+
178
+ 代理可以看到的每個動作都是模型上下文窗口中的一個工具,而長而重疊的工具列表會降低模型的工具選取品質。將操作介面設計為您維護的 API,而不是為每個 UI 功能提供一個操作:
179
+
180
+ - 更喜歡**一個 CRUD 風格的 `update`**,它采用一個可選欄位補丁,而不是 N 個每個欄位 actions(`update-name`、`update-order`、`update-color`,...)。調用者僅發送更改的內容。
181
+ - 在為每個查詢/過濾器新增新的讀取操作之前,請使用通用逃生口:用於提供程序資料的 [provider API trio](/docs/template-dispatch) (`provider-api-catalog` / `provider-api-docs` / `provider-api-request`) 或用於應用程式資料的 dev `db-query` 工具。
182
+ - 標記僅 UI 或編程 actions [`agentTool: false`](#agent-tool),以便它們保持前端/HTTP 可調用,而無需在模型的工具列表中占用一個位置。
183
+ - 刪除或隱藏 UI 不再使用的 actions,而不是將它們暴露給模型。
184
+
185
+ 回購級諮詢助手 `node scripts/audit-template-actions.mjs [template ...]`(別名 `pnpm actions:audit`)靜態掃描範本的 `actions/` 並標記可能的 UI 死 actions 和冗餘的每欄位叢集。它僅是建議性的(始終退出 0,永遠不會失敗 CI)並使用保守的啟發式方法,因此請檢視其建議,而不是將其視為錯誤。
186
+
187
+ ### 曝光標志 {#exposure-flags}
188
+
189
+ 四個標志控制誰可以調用操作。所有預設值都為允許值,因此您只需設定一個即可收緊特定表面。該表是一目了然的摘要;這些小節新增了每個需要的細節。
190
+
191
+ | 標記 | 預設 | 限制值→誰仍然可以調用 | 典型用途 |
192
+ | --------------- | ------------ | -------------------------------------------------------------- | ----------------------------------------------- |
193
+ | `agentTool` | `true` | `false` → 僅 UI、HTTP、CLI — **對模型隱藏**、MCP 和 A2A | 僅 UI/程序化 actions,不應該花費工具槽 |
194
+ | `toolCallable` | `true` | `false` → 一切**除了**沙盒擴充功能 iframe 橋 (403) | 授權相鄰操作(刪除帳戶、更改組織成員資格/角色) |
195
+ | `publicAgent` | 關閉(私人) | `{ expose: true }` → 將操作新增到**公開** MCP/A2A/OpenAPI 表面 | 無需驗證即可存取安全讀取/攝取工具 |
196
+ | `needsApproval` | `false` | `true` → 特工**暫停**;人類必須批準特定的呼叫 | 間接副作用(發送電子郵件、為卡充值、刪除) |
197
+
198
+ 這些是獨立的:`agentTool` 控制模型的視圖,`toolCallable` 僅控制擴充功能 iframe,`publicAgent` 新增選取加入的公開介面(公開 Web 路由絕不意味著公開工具暴露),而 `needsApproval` 在調用後控制執行 - 請參閱下面的 [Human-in-the-loop approval](#needs-approval)。
199
+
200
+ #### `agentTool` — 隱藏模型 {#agent-tool}
201
+
202
+ 預設情況下,每個操作都是可調用的代理工具。設定 `agentTool: false` 以將其保留在框架的驗證 + 操作介面後面,同時將其從每個代理工具列表中刪除 - 它仍然可以從 UI (`useActionMutation` / `callAction`)、CLI 和 `/_agent-native/actions/<name>` 進行調用:
203
+
204
+ ```ts
205
+ export default defineAction({
206
+ description: "Persist the user's sidebar width.",
207
+ agentTool: false, // UI-only — not a tool in the model's context window
208
+ schema: z.object({ widthPx: z.number() }),
209
+ http: { method: "PUT" },
210
+ run: async ({ widthPx }) => {
211
+ /* ... */
212
+ },
213
+ });
214
+ ```
215
+
216
+ 當您新增僅 UI 或純編程操作時,或者當 UI 停止使用您本來會暴露給模型的操作時,請使用它。
217
+
218
+ #### `toolCallable` — 阻止擴充功能 iframe {#tool-callable}
219
+
220
+ 擴充功能 ([Alpine.js mini-apps in sandboxed iframes](/docs/extensions)) 通過 `appAction(name, params)` 調用 actions,以檢視者的權限、機密和 SQL 範圍執行。對於高爆炸半徑的操作,預設情況下信任度過高。設定 `toolCallable: false` 以使擴充功能橋返回 403,同時保持可從 UI、代理、CLI、MCP 和 A2A 調用的操作:
221
+
222
+ ```ts
223
+ export default defineAction({
224
+ description: "Delete the current user's account.",
225
+ toolCallable: false, // never callable from an extension iframe
226
+ schema: z.object({ confirm: z.literal("yes") }),
227
+ run: async () => {
228
+ /* ... */
229
+ },
230
+ });
231
+ ```
232
+
233
+ 將其用於 actions,刪除或轉移帳戶/組織、更改驗證狀態、修改組織成員資格或授予共用存取權限。該框架的內置 `share-resource`、`unshare-resource` 和 `set-resource-visibility` 已被選取退出。通過 iframe 調用上不可欺騙的主機集標頭執行;常規 UI/agent/CLI/MCP/A2A 呼叫不受影響 - 詳情請參閱 [Security](/docs/security)。
234
+
235
+ ### 執行上下文(第二個參數) {#run-context}
236
+
237
+ `run` 接收可選的第二個參數 `ctx`,它攜帶解析的請求標識和調用操作的表面。讀取它而不是手動調用`getRequestUserEmail()` / `getRequestOrgId()`,並將整個`ctx`傳遞給跟蹤:
238
+
239
+ ```ts
240
+ export default defineAction({
241
+ description: "Log an audit entry for the current request.",
242
+ schema: z.object({ event: z.string() }),
243
+ run: async (args, ctx) => {
244
+ // ctx is undefined-safe: a 1-arg `run(args)` is still valid.
245
+ const actor = ctx?.userEmail ?? "system";
246
+ if (ctx?.caller === "frontend") {
247
+ // tighter rules for browser-initiated calls, looser for "tool"/"cli"
248
+ }
249
+ await db.insert(audit).values({
250
+ actor,
251
+ orgId: ctx?.orgId ?? null,
252
+ source: ctx?.caller ?? "unknown",
253
+ event: args.event,
254
+ });
255
+ return { ok: true };
256
+ },
257
+ });
258
+ ```
259
+
260
+ `ActionRunContext` 欄位:
261
+
262
+ | 欄位 | 型別 | 注釋 |
263
+ | ------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
264
+ | `userEmail` | `string \| undefined` | Resolved request user. **Never defaulted to a dev identity** — `undefined` when the request has no authenticated user. Apply your own fallback if you need one. |
265
+ | `orgId` | `string \| null` | Resolved org id, or `null` when the request has no org. |
266
+ | `caller` | `ActionCaller` | 如何調用操作(見下文)。 |
267
+ | `send` | `(event) => void` | 可選。向用戶端發出 SSE 事件。僅存在於代理工具循環內部(`caller: "tool"`); `undefined` 其他地方。 |
268
+ | `attachments` | `AgentChatAttachment[]` | 目前代理提交的檔案、圖片和貼上的文本塊。僅當`caller: "tool"`時才填充; `undefined` 在所有其他表面上。 |
269
+
270
+ `caller` 是並集 `"tool" | "http" | "frontend" | "cli" | "mcp" | "a2a"`:
271
+
272
+ | `caller` | 設定當... |
273
+ | ------------ | --------------------------------------------------------------------------------------------------------------------- |
274
+ | `"tool"` | 應用內代理循環、子代理/代理團隊或 A2A 請求(A2A 驅動相同的代理循環,因此其工具調用為 `"tool"`)。 |
275
+ | `"frontend"` | 通過 `useActionMutation` / `useActionQuery` / `callAction` 的瀏覽器調用(用 `X-Agent-Native-Frontend: 1` 標頭標記)。 |
276
+ | `"http"` | 沒有前端標記的裸編程 `POST` / `GET` 到 `/_agent-native/actions/<name>`。 |
277
+ | `"cli"` | `pnpm action <name>`(CLI 跑步者)。 |
278
+ | `"mcp"` | MCP `tools/call` 端點上的外部代理。 |
279
+ | `"a2a"` | 保留用於將來的直接 A2A 操作調度。今天 A2A 執行在代理循環中,因此這些調用是 `"tool"`。 |
280
+
281
+ `run` 保持向後兼容:現有的 1 參數處理程序和僅解構 `{ send }` 的處理程序繼續保持不變。
282
+
283
+ ### actions中的存取控制 {#access-control}
284
+
285
+ 使用者擁有的表必須通過 `accessFilter` 進行讀取,並通過 `assertAccess` 進行寫入——框架的共用系統使用相同的幫助程序。這是一個完整的、可貼上的範例:
286
+
287
+ ```ts
288
+ // actions/create-lead.ts
289
+ import { defineAction } from "@agent-native/core/action";
290
+ import { z } from "zod";
291
+ import { getDb } from "../server/db/index.js";
292
+ import * as schema from "../server/db/schema.js";
293
+
294
+ export default defineAction({
295
+ description: "Create a lead in the CRM.",
296
+ schema: z.object({ name: z.string(), company: z.string() }),
297
+ run: async ({ name, company }, ctx) => {
298
+ const db = getDb();
299
+ await db.insert(schema.leads).values({
300
+ id: crypto.randomUUID(),
301
+ name,
302
+ company,
303
+ ownerEmail: ctx?.userEmail ?? "system",
304
+ });
305
+ return { ok: true };
306
+ },
307
+ });
308
+ ```
309
+
310
+ 對於列出和讀取 actions,請使用 `accessFilter` 將查詢範圍限定為目前使用者和組織。對於更新或刪除特定行的 actions,在寫入之前使用 `assertAccess` 來確認調用者是否被允許。請參閱 [Security](/docs/security#access-guards) 和 [Sharing](/docs/sharing) 了解完整助手 API。
311
+
312
+ ### 人機互動批準 {#needs-approval}
313
+
314
+ 少數 actions 過於重要,無法讓代理自主執行 - 發送電子郵件、為卡充值、刪除帳戶。對於這些,設定 `needsApproval` 暫停循環並要求人員在 `run()` 執行之前批準特定調用:
315
+
316
+ ```ts
317
+ export default defineAction({
318
+ description: "Send an email via Gmail.",
319
+ schema: z.object({ to: z.string(), subject: z.string(), body: z.string() }),
320
+ needsApproval: true, // pause; a human must approve this specific send
321
+ run: async (args) => {
322
+ /* ...actually send... */
323
+ },
324
+ });
325
+ ```
326
+
327
+ `needsApproval` 還接受謂詞 `(args, ctx) => boolean | Promise<boolean>` 進行有條件的門控(例如,僅外部接收者,僅高於閾值);它**無法關閉**,因此拋出算作“需要批準”。當門為真且未經批準時,循環會停止回合,並且副作用永遠不會觸發,直到有人在聊天 UI 中批準為止。
328
+
329
+ > [!WARNING]
330
+ > 保持很少的批準。每個門控操作都是代理循環中的硬停止。預設值為**關閉**,幾乎每個操作都應將其關閉。請參閱 [Human-in-the-Loop Approvals](/docs/human-approval) 了解謂詞 API、`approval_required` 事件和完整流程。
331
+
332
+ ### 審核記錄紀錄 {#audit}
333
+
334
+ 每個變異操作都會被**自動審核**——框架會紀錄誰執行它、何時執行、從哪個表面執行、以及(當它是代理時)哪個線程/輪次,以及經過憑證編輯的輸入。唯讀 (`GET`) actions 被跳過。您無需為此編寫任何程式碼;它發生在 `defineAction` 接縫處。
335
+
336
+ 僅將 `audit` 塊新增到 _tune_ capture - 最有用的是聲明操作更改的資源,以便更改顯示在該資源所有者的跟蹤中:
337
+
338
+ ```ts
339
+ export default defineAction({
340
+ description: "Delete a recording.",
341
+ schema: z.object({ id: z.string() }),
342
+ audit: {
343
+ target: (args, result) => ({ type: "recording", id: args.id }),
344
+ summary: (args) => `Deleted recording ${args.id}`,
345
+ },
346
+ run: async (args, ctx) => {
347
+ /* ...delete... */
348
+ },
349
+ });
350
+ ```
351
+
352
+ 其他旋鈕:`audit: { onRead: true }` 審核敏感讀取(秘密存取、批量匯出); `audit: { enabled: false }` 選取噪聲寫入; `audit: { recordInputs: false }` 跳過捕獲參數。使用內置 `list-audit-events` / `get-audit-event` actions 讀取軌跡。詳細資訊請參見 [Audit Log](/docs/audit-log)。
353
+
354
+ ## 從UI調用 {#ui}
355
+
356
+ 兩個掛鉤,均位於 `@agent-native/core/client` 中。型別是從您的 `defineAction` 架構中推斷出來的 - 無需手動型別聲明。
357
+
358
+ ### `useActionMutation` {#use-action-mutation}
359
+
360
+ 對於改變狀態的actions:
361
+
362
+ ```tsx
363
+ import { useActionMutation } from "@agent-native/core/client";
364
+
365
+ const { mutate, isPending } = useActionMutation("reply-to-email");
366
+
367
+ <Button
368
+ disabled={isPending}
369
+ onClick={() => mutate({ emailId, body: "Thanks!" })}
370
+ >
371
+ Send Reply
372
+ </Button>;
373
+ ```
374
+
375
+ 成功後,框架會發出 `source: "action"` 的更改事件,以便 `useActionQuery` 使用者和活動查詢觀察者自動重新獲取。參見[Live Sync](/docs/key-concepts#polling-sync)。
376
+
377
+ ### `useActionQuery` {#use-action-query}
378
+
379
+ 對於唯讀 GET actions:
380
+
381
+ ```ts
382
+ import { useActionQuery } from "@agent-native/core/client";
383
+
384
+ const { data, isLoading } = useActionQuery("get-lead", { leadId });
385
+ ```
386
+
387
+ 查詢快取在 `["action", "get-lead", { leadId }]` 下,並在完成任何變異操作後自動失效。
388
+
389
+ ## 渲染原生聊天UI {#native-chat-ui}
390
+
391
+ Actions 可以返回應用內聊天呈現的結構化小部件資料
392
+ 本機。這是可重用表格、圖表、設定的第一方聊天路徑
393
+ 摘要和見解卡;使用 [MCP Apps](/docs/mcp-apps) 進行內聯 UI
394
+ 外部 MCP 主機。
395
+
396
+ ```ts
397
+ import { defineAction } from "@agent-native/core/action";
398
+ import { ACTION_CHAT_UI_DATA_INSIGHTS_RENDERER } from "@agent-native/core/action-ui";
399
+ import {
400
+ createDataInsightsWidgetResult,
401
+ dataInsightsWidgetResultSchema,
402
+ } from "@agent-native/core/data-widgets";
403
+
404
+ export default defineAction({
405
+ description: "Summarize response trends.",
406
+ readOnly: true,
407
+ outputSchema: dataInsightsWidgetResultSchema,
408
+ chatUI: { renderer: ACTION_CHAT_UI_DATA_INSIGHTS_RENDERER },
409
+ run: async () =>
410
+ createDataInsightsWidgetResult({
411
+ title: "Response trends",
412
+ chartSeries: {
413
+ type: "line",
414
+ xKey: "day",
415
+ series: [{ key: "responses", label: "Responses" }],
416
+ data: [
417
+ { day: "Mon", responses: 12 },
418
+ { day: "Tue", responses: 18 },
419
+ ],
420
+ },
421
+ table: {
422
+ columns: [
423
+ { key: "day", label: "Day" },
424
+ { key: "responses", label: "Responses", align: "right" },
425
+ ],
426
+ rows: [
427
+ { day: "Mon", responses: 12 },
428
+ { day: "Tue", responses: 18 },
429
+ ],
430
+ },
431
+ }),
432
+ });
433
+ ```
434
+
435
+ 內置判別式為 `"data-table"`、`"data-chart"` 和
436
+ `"data-insights"`,具有伺服器安全的建置器和架構
437
+ `@agent-native/core/data-widgets`。見[Native 聊天介面](/docs/native-chat-ui)
438
+ 獲取完整結果合約和 BYO 執行時指南,或
439
+ [Agent Surfaces](/docs/agent-surfaces) 了解如何保持相同的操作
440
+ 無頭、在聊天中渲染或變成全屏。
441
+
442
+ ## 從CLI調用 {#cli}
443
+
444
+ 每個操作都可以通過 `pnpm action` 執行:
445
+
446
+ ```bash
447
+ pnpm action reply-to-email '{"emailId":"thread-123","body":"Thanks!"}'
448
+ ```
449
+
450
+ JSON 輸入是代理和複雜物件的首選形狀。標志是
451
+ 仍然解析為相同的模式形狀,以進行簡單的手動執行和現有
452
+ 腳本。對於代理開發循環、腳本和 cron 很有用。
453
+
454
+ ## 從另一個代理調用它(A2A) {#a2a}
455
+
456
+ 如果您的應用程式是 [A2A](/docs/a2a-protocol) 對等點,則其他代理本機應用程式會自動發現您的 actions 並可以通過名稱調用它們。同來源部署跳過JWT簽名;跨域使用共用的`A2A_SECRET`。
457
+
458
+ ## 通過 MCP 公開它 {#mcp}
459
+
460
+ 啟用 MCP 後,您的 actions 將顯示在框架的 MCP 伺服器中,位置為 `/_agent-native/mcp`。預設情況下,每個調用者都會獲得一個緊湊的目錄 - 面向應用程式的內置程序以及範本聲明的應用程式 actions - 並且 `tool-search` 始終存在,因此任何其他工具都可以按需存取。完整的操作介面僅在明確選取加入(`--full-catalog` 代幣或 `AGENT_NATIVE_MCP_FULL_CATALOG=1`)時提供,並且 `publicAgent.expose` 在公開介面上選取安全讀取/攝取工具。請參閱 [MCP Protocol](/docs/mcp-protocol) 了解目錄層、驗證和 `mcpApp` 資源詳細資訊。
461
+
462
+ 對於支持 UI 的 MCP 主機,操作可以通過 `mcpApp` 欄位(加上匹配的 `link`)聲明可選的 MCP Apps 資源,以便有能力的主機內聯渲染結果。當 `link` 和 `mcpApp` 應指向同一路線時,`embedRoute()` 從一個純路徑建置器建置兩者:
463
+
464
+ ```ts
465
+ import { embedRoute } from "@agent-native/core";
466
+
467
+ export default defineAction({
468
+ description: "Create an email draft for review.",
469
+ schema: z.object({ body: z.string() }),
470
+ run: async ({ body }) => ({ body }),
471
+ ...embedRoute({
472
+ title: "Review draft",
473
+ openLabel: "Open in Mail",
474
+ path: ({ result }) => ({
475
+ label: "Open draft in Mail",
476
+ url: "/_agent-native/open?app=mail&view=inbox",
477
+ }),
478
+ }),
479
+ });
480
+ ```
481
+
482
+ 保留 `link` 作為 CLI 和非 UI MCP 用戶端的後備;這也是嵌入的啟動目標。嵌入橋 - 已簽名的嵌入啟動工作階段、移植與受控幀渲染、`ui/*` 主橋、CSP 和高度限制 - 歸 [External Agents](/docs/external-agents#mcp-app-bridge) 所有。
483
+
484
+ ## 標準actions {#standard-actions}
485
+
486
+ 對於 [context awareness](/docs/context-awareness),每個範本都應包含這兩個:
487
+
488
+ ### 檢視螢幕 {#view-screen}
489
+
490
+ 讀取目前導覽狀態,獲取上下文資料,並返回使用者所看到內容的快照。當代理需要重新檢視螢幕時會調用此函數。
491
+
492
+ ```ts
493
+ // actions/view-screen.ts
494
+ import { defineAction } from "@agent-native/core/action";
495
+ import { readAppState } from "@agent-native/core/application-state";
496
+ import { z } from "zod";
497
+
498
+ export default defineAction({
499
+ description: "Read the current screen state for context.",
500
+ schema: z.object({}),
501
+ http: { method: "GET" },
502
+ run: async () => {
503
+ const navigation = await readAppState("navigation");
504
+ const screen: Record<string, unknown> = { navigation };
505
+
506
+ if (navigation?.view === "inbox") {
507
+ screen.emailList = await listEmailsForLabel(navigation.label);
508
+ }
509
+
510
+ return screen;
511
+ },
512
+ });
513
+ ```
514
+
515
+ ### 導覽 {#navigate}
516
+
517
+ 將一次性導覽指令寫入應用程式狀態。 UI 讀取它、導覽並刪除該條目。
518
+
519
+ ```ts
520
+ // actions/navigate.ts
521
+ import { defineAction } from "@agent-native/core/action";
522
+ import { writeAppState } from "@agent-native/core/application-state";
523
+ import { z } from "zod";
524
+
525
+ export default defineAction({
526
+ description: "Navigate the user to a view.",
527
+ schema: z.object({
528
+ view: z.string(),
529
+ threadId: z.string().optional(),
530
+ }),
531
+ run: async (args) => {
532
+ await writeAppState("navigate", args);
533
+ return { ok: true };
534
+ },
535
+ });
536
+ ```
537
+
538
+ ## 舊版 CLI 樣式 actions {#legacy-cli-actions}
539
+
540
+ 該框架仍然支持未包含在 `defineAction` 中的較舊的 `export default async function(args)` actions - 對於不需要代理/HTTP 暴露的一次性開發腳本很有用。這些僅限 CLI;它們不會顯示為代理工具,不會掛載 HTTP 端點,也不會獲得型別安全的前端掛鉤。
541
+
542
+ ```ts
543
+ // actions/debug-dump.ts — CLI-only
544
+ import { parseArgs } from "@agent-native/core";
545
+
546
+ export default async function main(args: string[]) {
547
+ const { table } = parseArgs(args);
548
+ // one-off script you wouldn't want the agent to call
549
+ }
550
+ ```
551
+
552
+ 新程式碼應該更喜歡 `defineAction()`。僅當您故意不希望操作暴露給代理或 UI 時,才采用此模式。
553
+
554
+ ### `parseArgs(args)` {#parseargs}
555
+
556
+ 舊式 actions 的幫助程序。解析 `--key value` 或 `--key=value` 格式的 CLI 參數:
557
+
558
+ ```ts
559
+ import { parseArgs } from "@agent-native/core";
560
+
561
+ const args = parseArgs(["--name", "Steve", "--verbose", "--count=3"]);
562
+ // { name: "Steve", verbose: "true", count: "3" }
563
+ ```
564
+
565
+ ## 實用函數 {#utility-functions}
566
+
567
+ | 功能 | 退貨 | 描述 |
568
+ | ----------------------- | --------- | -------------------------------------- |
569
+ | `loadEnv(path?)` | `void` | 從專案根目錄(或自訂路徑)載入`.env`。 |
570
+ | `camelCaseArgs(args)` | `Record` | 將短橫線大小寫鍵轉換為駝峰式大小寫。 |
571
+ | `isValidPath(p)` | `boolean` | 驗證相對路徑(無遍歷,無絕對)。 |
572
+ | `isValidProjectPath(p)` | `boolean` | 驗證專案段(例如 `my-project`)。 |
573
+ | `ensureDir(dir)` | `void` | `mkdir -p` 助手。 |
574
+ | `fail(message)` | `never` | 列印到stderr和`exit(1)`。 |
575
+
576
+ ## 下一步是什么
577
+
578
+ - [**Audit Log**](/docs/audit-log) — 每個操作的自動誰更改了什么跟蹤
579
+ - [**Human-in-the-Loop Approvals**](/docs/human-approval) — `needsApproval` 門的深度
580
+ - [**Drop-in Agent**](/docs/drop-in-agent) — React 中的 `useActionMutation` / `useActionQuery`
581
+ - [**Context Awareness**](/docs/context-awareness) — `view-screen` + `navigate` 模式的深度
582
+ - [**A2A Protocol**](/docs/a2a-protocol) — 其他代理如何發現並呼叫您的 actions
583
+ - [**MCP Protocol**](/docs/mcp-protocol) — 在 MCP 上暴露 actions