@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
package/corpus/README.md CHANGED
@@ -27,5 +27,5 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
27
27
 
28
28
  ## Generated Counts
29
29
 
30
- - core files: 1941
31
- - template files: 4365
30
+ - core files: 2025
31
+ - template files: 4380
@@ -1,5 +1,35 @@
1
1
  # @agent-native/core
2
2
 
3
+ ## 0.79.5
4
+
5
+ ### Patch Changes
6
+
7
+ - f35bd34: fix(agent): resolve the org from the owner email for the cookieless durable background worker. The worker has the run owner (seeded via OWNER_CONTEXT_KEY) but no session, so getSession()/getOrgContext() left orgId null — engine resolution then couldn't find the owner's org-scoped Builder credential and fell back to the anthropic default, bailing on the missing key before the worker claimed its run. invokeAgentChatHandler now falls back to resolveOrgIdForEmail(owner) when there's no session org, so the worker resolves the same engine/credential the foreground does.
8
+
9
+ ## 0.79.4
10
+
11
+ ### Patch Changes
12
+
13
+ - 495e57a: Fix agent chat resolving a null org in cookieless durable background runs, which
14
+ made the agent see and write only `org_id IS NULL` rows while the UI (carrying
15
+ the session) used the real org. The agent could not list or read resources the
16
+ UI showed, and agent-created rows landed outside the user's org. The background
17
+ run already pre-seeds the owner from the run row; org resolution now falls back
18
+ to `resolveOrgIdForEmail(owner)` when there is no session, so the agent and the
19
+ UI scope to the same org-shared data.
20
+
21
+ ## 0.79.3
22
+
23
+ ### Patch Changes
24
+
25
+ - d64e550: Add zh-TW Traditional Chinese localization support.
26
+
27
+ ## 0.79.2
28
+
29
+ ### Patch Changes
30
+
31
+ - 53b99c7: fix(agent): run the durable background-function worker inside the run owner's request context (`runWithRequestContext({ userEmail })`). The cookieless `_process-run` worker only seeded the owner for `getOwnerFromEvent`, but engine resolution (`detectEngineFromUserSecrets`) and other owner-scoped reads use `getRequestUserEmail()`/`getRequestOrgId()` from the AsyncLocalStorage request context, which the worker left empty. As a result the worker missed the owner's Builder credential, fell back to the anthropic default, and — when the owner had no stored anthropic key and deploy-credential fallback was blocked (hosted prod) — bailed at the API-key check before ever claiming its run, so durable background runs for such apps (e.g. analytics) only ever completed via the slow foreground inline-recovery. The worker now resolves the same engine/credential the foreground does and claims its run.
32
+
3
33
  ## 0.79.1
4
34
 
5
35
  ### Patch Changes
@@ -0,0 +1,392 @@
1
+ ---
2
+ title: "A2A協議"
3
+ description: "通過 JSON-RPC 進行代理間通信:發現、訊息傳遞、流式傳輸和工作管理。"
4
+ ---
5
+
6
+ # A2A協議
7
+
8
+ 通過 HTTP 進行代理間通信。代理相互發現、發送訊息並接收結構化結果。
9
+
10
+ ## 概述 {#overview}
11
+
12
+ A2A(代理到代理)是用於代理間通信的 JSON-RPC 協議。郵件代理可以要求分析代理執行查詢。行事曆代理可以搜尋專案管理代理中的問題。每個代理通過代理卡公開其功能,並通過標準 JSON-RPC 端點接受工作。
13
+
14
+ A2A 是此框架中跨應用程式委派的基礎 - 最顯著的是 [Dispatch](/docs/dispatch),它將單個入站訊息(Slack、電子郵件等)路由到工作區中最適合處理它的任何應用程式。
15
+
16
+ 關鍵概念:
17
+
18
+ - **代理卡** — `/.well-known/agent-card.json` 上描述 skills 和功能的公開元資料
19
+ - **JSON-RPC** — 代理本機應用程式使用 `POST /_agent-native/a2a`;外部/遺留節點可以使用 `POST /a2a`
20
+ - **工作** - 每條訊息都會建立一個具有生命週期的工作(已提交、正在工作、已完成、失敗、已取消)
21
+ - **JWT 承載驗證** - 正式環境 A2A 需要 `A2A_SECRET` 或顯式遺留 `apiKeyEnv`
22
+
23
+ ```an-diagram title="一名代理人將工作交給另一名代理人" summary="郵件代理發現分析代理的卡,發送 JSON-RPC 訊息,並返回已完成的工作。"
24
+ {
25
+ "html": "<div class=\"diagram-handoff\"><div class=\"diagram-card\"><strong>郵件 Agent</strong><small class=\"diagram-muted\">needs analytics</small></div><div class=\"diagram-col\"><div class=\"diagram-pill\">GET /.well-known/agent-card.json</div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-pill accent\">POST /_agent-native/a2a<br><small class=\"diagram-muted\">message/send</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&larr;</div><div class=\"diagram-pill ok\">工作 · 已完成</div></div><div class=\"diagram-card\" data-rough><strong>分析 Agent</strong><small class=\"diagram-muted\">執行 run-query,返回結果</small></div></div>",
26
+ "css": ".diagram-handoff{display:flex;align-items:center;gap:16px;flex-wrap:wrap}.diagram-handoff .diagram-col{display:flex;flex-direction:column;align-items:center;gap:6px}.diagram-handoff .diagram-arrow{font-size:20px;line-height:1}"
27
+ }
28
+ ```
29
+
30
+ ## 伺服器設定 {#server-setup}
31
+
32
+ 大多數範本通過框架代理聊天外掛獲取 A2A。如果您自己安裝它,請在伺服器外掛中調用 `mountA2A()`:
33
+
34
+ ```ts
35
+ // server/plugins/a2a.ts
36
+ import { mountA2A } from "@agent-native/core/a2a";
37
+
38
+ export default defineNitroPlugin((nitro) => {
39
+ mountA2A(nitro, {
40
+ name: "Analytics Agent",
41
+ description: "Runs analytics queries and returns chart data",
42
+ skills: [
43
+ {
44
+ id: "run-query",
45
+ name: "Run Query",
46
+ description: "Execute a SQL query against the analytics database",
47
+ tags: ["analytics", "sql"],
48
+ examples: ["Show me signups by source this month"],
49
+ },
50
+ ],
51
+ // Optional legacy external-peer bearer key. Prefer A2A_SECRET for
52
+ // agent-native workspace calls and production deployments.
53
+ apiKeyEnv: "A2A_API_KEY",
54
+ streaming: true, // enable message/stream
55
+ });
56
+ });
57
+ ```
58
+
59
+ 此安裝座:
60
+
61
+ - `GET /.well-known/agent-card.json` — 公開發現元資料。
62
+ - `POST /_agent-native/a2a` — 主要代理本機 JSON-RPC 端點。
63
+ - `POST /_agent-native/a2a/_process-task` — 內部非同步處理器路由,使用 `A2A_SECRET` 簽名。
64
+
65
+ 對於公開傳統/簡單路徑的外部代理,用戶端還回退到 `/a2a`。正式環境代理本機部署應設定 `A2A_SECRET`;如果沒有它,託管執行時將無法關閉,而不是接受未經驗證的遠端工作。
66
+
67
+ ## 代理卡 {#agent-card}
68
+
69
+ 代理卡是根據您的設定自動生成的,並在 `/.well-known/agent-card.json` 上提供。其他代理獲取它以發現您的代理的 skills。
70
+
71
+ ### 每租戶技能過濾 {#agent-card-filtering}
72
+
73
+ 卡端點是公開的,因此框架會在提供服務之前編輯 skills,其 ID 顯示每個使用者或每個組織的整合。任何 ID 以 `mcp__user_<emailhash>_…` 或 `mcp__org_<orgid>_…` 開頭的技能都會從已發布的卡牌中刪除。操作員控制的 stdio MCP 工具(從 `mcp.config.json` 載入)和範本定義的 skills 保持可見。這可以防止未經驗證的調用者對存在哪些租戶或他們連線的整合進行指紋識別。參見`packages/core/src/a2a/server.ts`。
74
+
75
+ ```json
76
+ {
77
+ "name": "Analytics Agent",
78
+ "description": "Runs analytics queries and returns chart data",
79
+ "url": "https://analytics.example.com",
80
+ "version": "1.0.0",
81
+ "protocolVersion": "0.3",
82
+ "capabilities": {
83
+ "streaming": true,
84
+ "pushNotifications": false,
85
+ "stateTransitionHistory": true
86
+ },
87
+ "skills": [
88
+ {
89
+ "id": "run-query",
90
+ "name": "Run Query",
91
+ "description": "Execute a SQL query against the analytics database",
92
+ "tags": ["analytics", "sql"],
93
+ "examples": ["Show me signups by source this month"]
94
+ }
95
+ ],
96
+ "securitySchemes": {
97
+ "jwtBearer": { "type": "http", "scheme": "bearer", "bearerFormat": "JWT" },
98
+ "apiKey": { "type": "http", "scheme": "bearer" }
99
+ },
100
+ "security": [{ "jwtBearer": [] }, { "apiKey": [] }]
101
+ }
102
+ ```
103
+
104
+ _(版本可能有所不同;在 `/.well-known/agent-card.json` 獲取目前 `protocolVersion` 的應用的實時卡。)_
105
+
106
+ 當設定了`A2A_SECRET`(推薦路徑)時,該卡會通告一個
107
+ `jwtBearer` 方案如上。僅當遺留時才新增`apiKey`方案
108
+ 還設定了 `apiKeyEnv`,因此僅設定了 `A2A_SECRET` 的卡就會發布
109
+ 單獨的`jwtBearer`。
110
+
111
+ ## JSON-RPC方法 {#json-rpc-methods}
112
+
113
+ 所有方法均通過 `POST /_agent-native/a2a` 調用,格式為 JSON-RPC 2.0:
114
+
115
+ | 方法 | 描述 | 關鍵參數 |
116
+ | ---------------- | ---------------------------------------------------------------------- | ----------------------------- |
117
+ | `message/send` | 發送訊息並等待工作完成。通過`async: true`立即返回`working`狀態並輪詢。 | `message, contextId?, async?` |
118
+ | `message/stream` | 發送訊息,接收SSE工作更新 | `message, contextId?` |
119
+ | `tasks/get` | 按 ID 獲取工作 - 用於輪詢非同步工作是否完成 | `id` |
120
+ | `tasks/cancel` | 取消正在執行的工作 | `id` |
121
+
122
+ ```an-api title="主要 A2A 端點" summary="所有 JSON-RPC 方法都是這裡的 POSTed。顯示message/send。"
123
+ {
124
+ "method": "POST",
125
+ "path": "/_agent-native/a2a",
126
+ "summary": "發送訊息並等待工作完成",
127
+ "description": "JSON-RPC 2.0 endpoint for `message/send`, `message/stream`, `tasks/get`, and `tasks/cancel`. Pass `async: true` to return immediately in `working` state and poll with `tasks/get`.",
128
+ "auth": "JWT bearer signed with A2A_SECRET (or legacy apiKeyEnv static token)",
129
+ "params": [
130
+ { "name": "Authorization", "in": "header", "type": "string", "required": false, "description": "Bearer token. Required in hosted production runtimes; optional in local dev." },
131
+ { "name": "method", "in": "body", "type": "string", "required": true, "description": "One of message/send, message/stream, tasks/get, tasks/cancel." },
132
+ { "name": "params.message", "in": "body", "type": "object", "required": false, "description": "{ role, parts[] } for message/send and message/stream." },
133
+ { "name": "params.async", "in": "body", "type": "boolean", "required": false, "description": "Return immediately in working state and poll via tasks/get. Use on serverless hosts." },
134
+ { "name": "params.id", "in": "body", "type": "string", "required": false, "description": "Task id for tasks/get and tasks/cancel." }
135
+ ],
136
+ "request": {
137
+ "contentType": "application/json",
138
+ "example": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"message/send\",\n \"params\": {\n \"message\": {\n \"role\": \"user\",\n \"parts\": [{ \"type\": \"text\", \"text\": \"Show signups by source\" }]\n },\n \"async\": true\n }\n}"
139
+ },
140
+ "responses": [
141
+ { "status": "200", "description": "JSON-RPC result containing the task. With async:true the task returns in working state.", "example": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": { \"id\": \"task_123\", \"status\": { \"state\": \"working\" } }\n}" },
142
+ { "status": "503", "description": "Hosted production runtime with no A2A_SECRET configured — fails closed instead of running unauthenticated." }
143
+ ]
144
+ }
145
+ ```
146
+
147
+ 當使用 `async: true` 調用 `message/send` 時,JSON-RPC 處理程序會將工作排入佇列,並將 POST 自觸發到內部 `/_agent-native/a2a/_process-task` 路由,以便處理程序在具有自己的完全超時的新函數執行中執行。該路由使用綁定到工作 ID 的 HMAC 權杖進行驗證(5 分鐘生存期,使用 `A2A_SECRET` 簽名)。它安裝在 `/_agent-native/a2a` JSON-RPC 路由之前,因此 h3 的前綴匹配不會吞噬它。
148
+
149
+ ```an-diagram title="無伺服器上的非同步工作生命週期" summary="async:true 在幾毫秒內返回工作,然後在調用者輪詢時重新執行執行代理循環。"
150
+ {
151
+ "html": "<div class=\"diagram-async\"><div class=\"diagram-box\" data-rough>message/send<br><small class=\"diagram-muted\">async: true</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-panel\"><span class=\"diagram-pill\">enqueue task</span><span class=\"diagram-pill warn\">return working</span><small class=\"diagram-muted\">約毫秒級</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&darr;</div><div class=\"diagram-box\" data-rough>自觸發 POST /_agent-native/a2a/_process-task<br><small class=\"diagram-muted\">HMAC token · 全新執行 · 完整超時</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-col\"><div class=\"diagram-pill\">tasks/get (poll)</div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&#8635;</div><div class=\"diagram-pill ok\">completed</div></div></div>",
152
+ "css": ".diagram-async{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.diagram-async .diagram-panel{display:flex;flex-direction:column;align-items:center;gap:6px}.diagram-async .diagram-col{display:flex;flex-direction:column;align-items:center;gap:6px}.diagram-async .diagram-arrow{font-size:20px;line-height:1}",
153
+ "caption": "A recurring sweeper re-claims any task left in flight if the function execution dies mid-run."
154
+ }
155
+ ```
156
+
157
+ > [!IMPORTANT]
158
+ > **無伺服器 Webhook 和網關超時:**
159
+ > 託管環境網關(例如 Netlify、Vercel 或 Cloudflare Pages)對面向公眾的 HTTP 路由施加嚴格的執行限制(通常為 10 到 30 秒)。由於代理循環可能需要大量時間來執行查詢、獲取上下文和執行工具,因此在調用 A2A 端點或處理外部 webhooks 時,您**必須使用 `async: true`**。這會立即將 `working` 狀態返回到 API 網關,僅保持連線開啟幾毫秒,而自觸發的 `/process-task` POST 在後台執行代理循環。不要阻止主 HTTP 請求等待代理循環完成。
160
+
161
+ 訊息包含鍵入的部分 - 文本、結構化資料和檔案都可以在一條訊息中傳輸:
162
+
163
+ ```an-annotated-code title="帶有鍵入部分的 A2A 訊息"
164
+ {
165
+ "language": "json",
166
+ "code": "{\n \"role\": \"user\",\n \"parts\": [\n { \"type\": \"text\", \"text\": \"Show signups by source\" },\n { \"type\": \"data\", \"data\": { \"dateRange\": \"last-30d\" } },\n {\n \"type\": \"file\",\n \"file\": { \"name\": \"report.csv\", \"mimeType\": \"text/csv\", \"bytes\": \"...\" }\n }\n ]\n}",
167
+ "annotations": [
168
+ { "lines": "4", "label": "text part", "note": "代理閱讀簡單的自然語言指令。" },
169
+ { "lines": "5", "label": "data part", "note": "結構化 JSON 參數 - e.g。日期範圍 - 與提示一起傳遞。" },
170
+ { "lines": "6-9", "label": "file part", "note": "按名稱 `mimeType` 和 base64 `bytes` 附加檔案。" }
171
+ ]
172
+ }
173
+ ```
174
+
175
+ ## 用戶端 {#client}
176
+
177
+ `A2AClient` 類處理發現、訊息傳遞和流式傳輸:
178
+
179
+ ```ts
180
+ import { A2AClient } from "@agent-native/core/a2a";
181
+
182
+ const client = new A2AClient("https://analytics.example.com", "my-api-key");
183
+
184
+ // Discover agent capabilities
185
+ const card = await client.getAgentCard();
186
+ console.log(card.skills);
187
+
188
+ // Send a message and get a completed task
189
+ const task = await client.send({
190
+ role: "user",
191
+ parts: [{ type: "text", text: "Show signups by source this month" }],
192
+ });
193
+ console.log(task.status.state); // "completed"
194
+ // task.status.message is a Message object ({ role, parts }), not a string.
195
+ // Pull text out of its parts:
196
+ const reply = task.status.message?.parts
197
+ .filter((p) => p.type === "text")
198
+ .map((p) => p.text)
199
+ .join("");
200
+ console.log(reply); // agent's response text
201
+
202
+ // Stream responses for long-running work
203
+ for await (const update of client.stream({
204
+ role: "user",
205
+ parts: [{ type: "text", text: "Generate a full quarterly report" }],
206
+ })) {
207
+ console.log(update.status.state, update.status.message);
208
+ }
209
+ ```
210
+
211
+ ## 方便幫手 {#convenience-helper}
212
+
213
+ 對於簡單的文本輸入/文本輸出調用,請使用 `callAgent()`:
214
+
215
+ ```ts
216
+ import { callAgent } from "@agent-native/core/a2a";
217
+
218
+ // One-shot: send text, get text back
219
+ const response = await callAgent(
220
+ "https://analytics.example.com",
221
+ "How many signups last week?",
222
+ { apiKey: process.env.ANALYTICS_API_KEY },
223
+ );
224
+ console.log(response); // "There were 1,247 signups last week..."
225
+ ```
226
+
227
+ ## 編程工作區調用 {#programmatic-invoke}
228
+
229
+ 對於代理本機工作區,在程式碼或 a 時更喜歡 `agentNative` 幫助器
230
+ 無頭應用程式需要發現同級應用程式並通過 ID、名稱或調用它們
231
+ URL。它使用與
232
+ `agent-native agents` 和 `agent-native invoke` CLI 指令。
233
+
234
+ ```ts
235
+ import { agentNative } from "@agent-native/core/agent-native";
236
+
237
+ const agents = await agentNative.listAgents();
238
+
239
+ const result = await agentNative.invoke(
240
+ "analytics",
241
+ "Summarize signups by source this month.",
242
+ { userEmail: "steve@example.com" },
243
+ );
244
+
245
+ console.log(`Called ${result.target.name}: ${result.responseText}`);
246
+ ```
247
+
248
+ 將此用於可組合的迷你應用程式:調度或協調器應用程式發現
249
+ 工作空間同級,然後調用擁有提供程序的專業應用程式,
250
+ 資料集或工作流程。在正式環境代理本機應用程式中,在每個中設定 `A2A_SECRET`
251
+ 應用程式環境並傳遞呼叫者身分(`userEmail`),因此出站呼叫
252
+ 簽名為 JWT 不記名代幣。僅將 `apiKeyEnv` 用於舊版外部對等點
253
+ 需要靜態不記名權杖。使用本機actions而不是自己調用。
254
+
255
+ ## 工作生命週期 {#task-lifecycle}
256
+
257
+ 每條訊息都會建立一個在以下狀態之間行動的工作:
258
+
259
+ `submitted` → `working` → `completed` | `failed` | `canceled` | `input-required`
260
+
261
+ `input-required` 是非終端:處理程序正在等待來自調用者的更多資訊,一旦輸入到達,工作就可以移回 `working`。
262
+
263
+ | 狀態 | 含義 |
264
+ | ---------------- | ------------------------------ |
265
+ | `submitted` | 工作已建立,已排隊等待處理 |
266
+ | `working` | Handler正在處理訊息 |
267
+ | `completed` | 處理程序成功完成 |
268
+ | `failed` | 處理程序拋出錯誤 |
269
+ | `canceled` | 工作已通過tasks/cancel取消 |
270
+ | `input-required` | 處理程序需要調用者提供更多資訊 |
271
+
272
+ 工作保留在 `a2a_tasks` SQL 表中,稍後可以通過 `tasks/get` 檢索。
273
+
274
+ ## 安全 {#security}
275
+
276
+ 在每個調用或接收 A2A 流量的正式環境應用上設定 `A2A_SECRET`。代理本機呼叫者使用此秘密簽署 JWT 不記名權杖,以便接收者可以在代理循環開始之前驗證呼叫者身分。
277
+
278
+ 對於仍然使用共用靜態權杖的外部對等點,請將設定中的 `apiKeyEnv` 設定為包含預期持有者權杖的環境變數的名稱:
279
+
280
+ ```ts
281
+ // Config
282
+ mountA2A(app, {
283
+ // ...
284
+ apiKeyEnv: "A2A_API_KEY", // reads process.env.A2A_API_KEY
285
+ });
286
+
287
+ // Client calls with the matching key
288
+ const client = new A2AClient(url, process.env.A2A_API_KEY);
289
+ ```
290
+
291
+ 代理卡端點始終是公開的(無需驗證),以便其他代理可以發現功能。 `/_agent-native/a2a` JSON-RPC 端點接受由 `A2A_SECRET` 簽名的 JWT 不記名權杖,並且在設定時還接受舊版 `apiKeyEnv` 權杖。本機開發時,auth可以省略;在託管正式環境執行時中,缺少 A2A 驗證會返回 503,而不是未經驗證執行。
292
+
293
+ ### 驗證策略邊界 {#auth-policy}
294
+
295
+ 承載驗證在代理循環看到訊息之前在請求邊界(JSON-RPC 處理程序中)執行。 `packages/core/src/a2a/auth-policy.ts` 中的共用助手決定部署需要什么:
296
+
297
+ - `isA2AProductionRuntime()` 在 Netlify、AWS Lambda、Cloudflare Pages/Workers、Vercel、Render、Fly 和 Cloud Run 上返回 `true` — 即使 `NODE_ENV` 不是 `"production"`。一些無伺服器提供者不會一致地設定 `NODE_ENV`,因此該策略也會讀取特定於提供者的標志。
298
+ - 當 `A2A_SECRET` 設定時,`hasConfiguredA2ASecret()` 返回 `true`。
299
+ - `shouldAdvertiseJwtA2AAuth()`是代理卡用來決定是否發布`jwtBearer`安全方案的依據。
300
+
301
+ 正式環境策略是嚴格的:在任何正式環境執行時中,除非設定了 `A2A_SECRET`(返回 503),否則非同步 `_process-task` 路由拒絕調度,並且 JSON-RPC 端點拒絕未經驗證的調用。開發回退(警告一次,允許)僅在未設定正式環境標志時觸發。
302
+
303
+ 此邊界很重要,因為代理循環接受來自遠端調用者的自由格式輸入。將不記名檢查放入循環內,或依靠工具來強制執行它,將使提示注入或有問題的處理程序繞過驗證。將其保持在 HTTP 邊界意味著權杖故障會在任何 LLM 調用之前短路。
304
+
305
+ JWT 驗證(`server.ts` 中的 `verifyA2AToken`)接受使用全域 `A2A_SECRET` 或通過權杖的 `org_domain` 聲明從 SQL 查找的組織範圍秘密簽名的權杖,並在存在時強制執行權杖自己的 `aud`/`iss` 聲明。
306
+
307
+ ## 繼續 {#continuations}
308
+
309
+ 當代理調用未立即返回的遠端 A2A 對等點時,框架會輪詢 `tasks/get` 直到工作解決。這是通過 `A2AClient.sendAndWait` 連線的,這是 `callAgent()` 幫助程序使用的預設模式。
310
+
311
+ ```ts
312
+ // Default: async + poll (safe on serverless hosts)
313
+ const reply = await callAgent(url, "Generate the quarterly report", {
314
+ userEmail: session.email,
315
+ });
316
+
317
+ // Single-shot blocking POST (avoid on Netlify/Vercel for slow handlers)
318
+ const reply2 = await callAgent(url, "Quick lookup", { async: false });
319
+ ```
320
+
321
+ 對於由訊息傳遞整合(Slack、電子郵件)觸發的入站延續,框架會將延續保留在 SQL 中並在帶外進行處理:
322
+
323
+ - 當整合處理程序將其移交給遠端代理時,一行將寫入 `a2a_continuations` 表。
324
+ - 自觸發的 `POST /_agent-native/integrations/process-a2a-continuation` 聲明該行,在遠端代理上調用 `tasks/get`,並將回複傳遞給整合適配器或重新安排。
325
+ - 如果遠端工作仍在工作,則會重新計畫並重新分派該行。投票預算**受約 20 分鐘遠端工作** (`MAX_REMOTE_WORK_MS`) 和 **30 次調度嘗試** (`MAX_ATTEMPTS`) 的限制;在任一限制之後,繼續都會失敗並出現明顯錯誤,並且使用者會收到“代理未及時回應”回複。
326
+ - 循環清理器 (`claimDueA2AContinuations`) 重新聲明上一個函數執行終止時剩餘的所有連續行。即使調用應用程式在輪詢中當機,下一次掃描也會恢復工作。
327
+
328
+ 在`packages/core/src/integrations/a2a-continuation-processor.ts`中定義。相同的重試作業模式用於整合 Webhook 工作 (`pending-tasks-retry-job.ts`),這是一個上限為 3 次嘗試的獨特佇列 - 與上面的連續輪詢預算分開。
329
+
330
+ ## 工作區A2A {#workspace-a2a}
331
+
332
+ 在部署到單個 Netlify 站點的多應用工作區中(請參閱 [multi-app workspace](/docs/multi-app-workspace)),`apps/<id>/` 下的每個應用都會自動註冊為 A2A 對等點:
333
+
334
+ - 共用的 `A2A_SECRET` 在建置時安裝到每個應用程式的環境中。
335
+ - 跨應用調用是同來源的 - `https://workspace.example.com/apps/analytics` 調用 `https://workspace.example.com/apps/mail` - 因此沒有 DNS、CORS 或每對 JWT 設定。
336
+ - 使用共用金鑰簽名的出站呼叫攜帶呼叫者的電子郵件(`sub`)和組織域(如果存在)。接收方的 JWT 驗證程序按順序接受來自 SQL 的共用秘密或組織範圍秘密。
337
+ - 代理發現會遍歷工作區註冊表,而不是依賴操作員手動連線每個對等點。請參閱 `packages/core/src/server/agent-discovery.ts` 中的 `discoverAgents` 和 `packages/core/src/org/handlers.ts` 中的組織刷新路徑。
338
+
339
+ 外部 A2A — 呼叫工作區之外的代理 — 仍然使用不記名權杖模型 (`apiKeyEnv` + `A2AClient(url, apiKey)`)。工作區A2A位於頂部;外部對等點沒有任何變化。
340
+
341
+ ## 無伺服器陷阱 {#serverless}
342
+
343
+ **永遠不要依賴“一勞永逸”的 `Promise` 超過回應的壽命。**無伺服器函數(Netlify、Vercel、AWS Lambda、Cloud Run)會在回應內文刷新時凍結 - 有時甚至在未等待的 `fetch(...)` 的 TCP 握手完成之前。在 Node 上本機工作的模式將默默地放棄正式環境中的工作。
344
+
345
+ A2A 非同步調度和 [integration webhook queue](/docs/messaging) 使用的框架模式是:
346
+
347
+ 1. 接受請求,保留SQL需要發生的事情,立即返回200。
348
+ 2. 將 `POST` 自觸發到單獨的框架路由(`/_agent-native/a2a/_process-task` 或 `/_agent-native/integrations/process-task`),以便實際工作在**新函數執行**中執行,並具有自己的完整超時。
349
+ 3. 使用綁定到行 ID 的 HMAC 權杖來驗證 self-fire,並使用 `A2A_SECRET` 簽名。
350
+ 4. 重複的重試作業會清除所有已聲明但未完成的行,因此當機的函數不會使工作陷入困境。
351
+
352
+ 當您編寫自己的 A2A 處理程序或整合適配器時,請遵循相同的形狀。不要將工作附加到 `return` 之後的獨立承諾中。如果您必須從無伺服器處理程序中自行啟動,請在返回之前啟動提取,並給它一個微小的啟動時間(框架使用較短的超時),以便 Lambda 式執行時不會在出站請求離開進程之前凍結。 `integration-webhooks`技能是規範參考。
353
+
354
+ ## 代理提及 {#agent-mentions}
355
+
356
+ 您可以在聊天編輯器中直接提及客服人員 `@`。連線代理使用 A2A:當您提及連線代理時,伺服器會對該代理進行 A2A 調用,並將回應編織到您的對話上下文中。
357
+
358
+ 自訂工作區代理有所不同:它們在目前應用/執行時本機執行,而不是通過 A2A 執行。
359
+
360
+ 請參閱 [Agent Mentions](/docs/agent-mentions),詳細了解提及的工作原理、如何新增代理以及如何建立自訂提及提供程序。
361
+
362
+ ## 訊息傳遞整合 {#messaging-integrations}
363
+
364
+ 還可以通過 Slack、電子郵件、Telegram 和 WhatsApp 等外部訊息平台聯系客服人員。使用者在這些平台上發送訊息,代理在同一線程中使用與網路聊天相同的工具和 actions 進行回應。
365
+
366
+ 有關每個平台的設定詳細資訊,請參閱 [Messaging](/docs/messaging)。
367
+
368
+ ## 範例:跨代理查詢 {#example}
369
+
370
+ 郵件代理需要分析資料。分析代理通過 A2A 公開“執行查詢”技能:
371
+
372
+ ```ts
373
+ // In the mail agent's actions/get-analytics.ts
374
+ import { defineAction } from "@agent-native/core/action";
375
+ import { callAgent } from "@agent-native/core/a2a";
376
+ import { z } from "zod";
377
+
378
+ export default defineAction({
379
+ description: "Ask the analytics agent a question.",
380
+ schema: z.object({ question: z.string() }),
381
+ async run({ question }) {
382
+ const response = await callAgent(
383
+ "https://analytics.example.com",
384
+ question,
385
+ { apiKey: process.env.ANALYTICS_API_KEY },
386
+ );
387
+ return { answer: response };
388
+ },
389
+ });
390
+ ```
391
+
392
+ 分析代理接收訊息,通過其處理程序執行查詢,並返回結果。郵件操作獲取文本回應。沒有共用資料庫,沒有直接的 API 調用——只有代理到代理的通信。