@agent-native/core 0.79.2 → 0.79.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +24 -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 +38 -0
  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/notifications/routes.d.ts +3 -3
  163. package/dist/observability/routes.d.ts +3 -3
  164. package/dist/resources/handlers.d.ts +2 -2
  165. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  166. package/dist/server/agent-chat-plugin.js +39 -0
  167. package/dist/server/agent-chat-plugin.js.map +1 -1
  168. package/dist/server/agent-engine-api-key-route.d.ts +2 -2
  169. package/dist/server/onboarding-html.d.ts.map +1 -1
  170. package/dist/server/onboarding-html.js +96 -0
  171. package/dist/server/onboarding-html.js.map +1 -1
  172. package/dist/templates/default/app/i18n/index.ts +2 -0
  173. package/dist/templates/default/app/i18n/zh-TW.ts +466 -0
  174. package/dist/templates/default/app/root.tsx +8 -0
  175. package/docs/content/locales/zh-TW/a2a-protocol.md +392 -0
  176. package/docs/content/locales/zh-TW/actions.md +583 -0
  177. package/docs/content/locales/zh-TW/agent-mentions.md +164 -0
  178. package/docs/content/locales/zh-TW/agent-surfaces.md +397 -0
  179. package/docs/content/locales/zh-TW/agent-teams.md +171 -0
  180. package/docs/content/locales/zh-TW/agent-web-surfaces.md +161 -0
  181. package/docs/content/locales/zh-TW/audit-log.md +111 -0
  182. package/docs/content/locales/zh-TW/authentication.md +332 -0
  183. package/docs/content/locales/zh-TW/automations.md +268 -0
  184. package/docs/content/locales/zh-TW/blueprint-installer.md +83 -0
  185. package/docs/content/locales/zh-TW/cli-adapters.md +129 -0
  186. package/docs/content/locales/zh-TW/client.md +398 -0
  187. package/docs/content/locales/zh-TW/cloneable-saas.md +114 -0
  188. package/docs/content/locales/zh-TW/code-agents-ui.md +436 -0
  189. package/docs/content/locales/zh-TW/components.md +368 -0
  190. package/docs/content/locales/zh-TW/context-awareness.md +373 -0
  191. package/docs/content/locales/zh-TW/creating-templates.md +411 -0
  192. package/docs/content/locales/zh-TW/cross-app-sso.md +188 -0
  193. package/docs/content/locales/zh-TW/database.md +183 -0
  194. package/docs/content/locales/zh-TW/deployment.md +348 -0
  195. package/docs/content/locales/zh-TW/dispatch.md +146 -0
  196. package/docs/content/locales/zh-TW/drop-in-agent.md +260 -0
  197. package/docs/content/locales/zh-TW/durable-resume.md +65 -0
  198. package/docs/content/locales/zh-TW/embedding-sdk.md +597 -0
  199. package/docs/content/locales/zh-TW/evals.md +155 -0
  200. package/docs/content/locales/zh-TW/extensions.md +360 -0
  201. package/docs/content/locales/zh-TW/external-agents.md +619 -0
  202. package/docs/content/locales/zh-TW/faq.md +142 -0
  203. package/docs/content/locales/zh-TW/file-uploads.md +122 -0
  204. package/docs/content/locales/zh-TW/frames.md +153 -0
  205. package/docs/content/locales/zh-TW/getting-started.md +199 -0
  206. package/docs/content/locales/zh-TW/harness-agents.md +349 -0
  207. package/docs/content/locales/zh-TW/human-approval.md +86 -0
  208. package/docs/content/locales/zh-TW/internationalization.md +147 -0
  209. package/docs/content/locales/zh-TW/key-concepts.md +312 -0
  210. package/docs/content/locales/zh-TW/local-file-mode.md +433 -0
  211. package/docs/content/locales/zh-TW/mcp-apps.md +147 -0
  212. package/docs/content/locales/zh-TW/mcp-clients.md +330 -0
  213. package/docs/content/locales/zh-TW/mcp-protocol.md +279 -0
  214. package/docs/content/locales/zh-TW/messaging.md +461 -0
  215. package/docs/content/locales/zh-TW/migration-workbench.md +33 -0
  216. package/docs/content/locales/zh-TW/multi-app-workspace.md +312 -0
  217. package/docs/content/locales/zh-TW/multi-tenancy.md +52 -0
  218. package/docs/content/locales/zh-TW/native-chat-ui.md +321 -0
  219. package/docs/content/locales/zh-TW/notifications.md +231 -0
  220. package/docs/content/locales/zh-TW/observability.md +294 -0
  221. package/docs/content/locales/zh-TW/observational-memory.md +77 -0
  222. package/docs/content/locales/zh-TW/onboarding.md +216 -0
  223. package/docs/content/locales/zh-TW/plan-plugin.md +200 -0
  224. package/docs/content/locales/zh-TW/pr-visual-recap.md +384 -0
  225. package/docs/content/locales/zh-TW/processors.md +106 -0
  226. package/docs/content/locales/zh-TW/progress.md +199 -0
  227. package/docs/content/locales/zh-TW/pure-agent-apps.md +39 -0
  228. package/docs/content/locales/zh-TW/real-time-collaboration.md +680 -0
  229. package/docs/content/locales/zh-TW/recurring-jobs.md +142 -0
  230. package/docs/content/locales/zh-TW/routing.md +79 -0
  231. package/docs/content/locales/zh-TW/sandbox-adapters.md +227 -0
  232. package/docs/content/locales/zh-TW/security.md +330 -0
  233. package/docs/content/locales/zh-TW/server.md +265 -0
  234. package/docs/content/locales/zh-TW/sharing.md +219 -0
  235. package/docs/content/locales/zh-TW/skills-guide.md +281 -0
  236. package/docs/content/locales/zh-TW/template-analytics.md +259 -0
  237. package/docs/content/locales/zh-TW/template-assets.md +303 -0
  238. package/docs/content/locales/zh-TW/template-brain.md +324 -0
  239. package/docs/content/locales/zh-TW/template-calendar.md +194 -0
  240. package/docs/content/locales/zh-TW/template-chat.md +129 -0
  241. package/docs/content/locales/zh-TW/template-clips.md +368 -0
  242. package/docs/content/locales/zh-TW/template-content.md +402 -0
  243. package/docs/content/locales/zh-TW/template-design.md +173 -0
  244. package/docs/content/locales/zh-TW/template-dispatch.md +220 -0
  245. package/docs/content/locales/zh-TW/template-forms.md +178 -0
  246. package/docs/content/locales/zh-TW/template-mail.md +239 -0
  247. package/docs/content/locales/zh-TW/template-plan.md +814 -0
  248. package/docs/content/locales/zh-TW/template-slides.md +293 -0
  249. package/docs/content/locales/zh-TW/template-videos.md +222 -0
  250. package/docs/content/locales/zh-TW/tracking.md +236 -0
  251. package/docs/content/locales/zh-TW/using-your-agent.md +71 -0
  252. package/docs/content/locales/zh-TW/voice-input.md +81 -0
  253. package/docs/content/locales/zh-TW/what-is-agent-native.md +202 -0
  254. package/docs/content/locales/zh-TW/workspace-connections.md +321 -0
  255. package/docs/content/locales/zh-TW/workspace-management.md +175 -0
  256. package/docs/content/locales/zh-TW/workspace.md +323 -0
  257. package/docs/content/locales/zh-TW/writing-agent-instructions.md +173 -0
  258. package/package.json +1 -1
  259. package/src/templates/default/app/i18n/index.ts +2 -0
  260. package/src/templates/default/app/i18n/zh-TW.ts +466 -0
  261. package/src/templates/default/app/root.tsx +8 -0
@@ -0,0 +1,332 @@
1
+ ---
2
+ title: "驗證"
3
+ description: "與電子郵件/密碼、社交提供者、組織和 MCP 持有者憑證更好的驗證整合。"
4
+ ---
5
+
6
+ # 驗證
7
+
8
+ 代理本機應用程式使用 [Better Auth](https://better-auth.com) 進行帳戶優先設計的驗證。使用者在第一次存取時建立一個帳戶,並從第一天起就獲得真實身分。
9
+
10
+ ## 概述 {#overview}
11
+
12
+ Auth 是通過 auth 伺服器外掛中的 `autoMountAuth(app)` 自動設定的。共有三種模式:
13
+
14
+ - **預設:**使用電子郵件/密碼+社交提供者進行更好的驗證。首次存取時顯示的入門頁面。
15
+ - **遠端 MCP OAuth:** 適用於 MCP 主機的標準 OAuth 2.1,例如 Claude 程式碼和 ChatGPT 連線器。
16
+ - **自訂:**通過 `getSession` 回調帶來您自己的驗證。
17
+
18
+ ```an-diagram title="三種方式,一次會議" summary="瀏覽器訪客、編程 MCP 用戶端和自訂提供程序都解析為下游作用域讀取的同一 AuthSession。"
19
+ {
20
+ "html": "<div class=\"auth-modes\"><div class=\"diagram-col\"><div class=\"diagram-card\"><span class=\"diagram-pill accent\">Default</span><strong>Better Auth</strong><small class=\"diagram-muted\">email/password &middot; Google &middot; GitHub</small></div><div class=\"diagram-card\"><span class=\"diagram-pill\">Remote MCP OAuth</span><strong>OAuth 2.1 + PKCE</strong><small class=\"diagram-muted\">Claude Code、ChatGPT 連線器</small></div><div class=\"diagram-card\"><span class=\"diagram-pill\">Custom</span><strong>getSession callback</strong><small class=\"diagram-muted\">Clerk &middot; Auth0 &middot; Firebase</small></div></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-panel center\"><span class=\"diagram-pill ok\">AuthSession</span><small class=\"diagram-muted\">email &middot; orgId &middot; orgRole</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-box\">Request context &amp; data scoping</div></div>",
21
+ "css": ".auth-modes{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.auth-modes .diagram-col{display:flex;flex-direction:column;gap:10px}.auth-modes .diagram-card{display:flex;flex-direction:column;gap:4px;padding:10px 12px}.auth-modes .diagram-arrow{font-size:22px;line-height:1}.auth-modes .center{display:flex;flex-direction:column;align-items:center;gap:4px}"
22
+ }
23
+ ```
24
+
25
+ 瀏覽器流程在任何地方都是相同的更好的驗證流程 - **沒有開發驗證繞過**,並且 `getSession()` 永遠不會退回到 `local@localhost` 哨兵。環境之間的變化是註冊摩擦,而不是登入牆:
26
+
27
+ | 環境 | 首次載入行為 | 電子郵件驗證 |
28
+ | ----------------- | ------------------------------------------------------ | ------------------------------------------ |
29
+ | **本機開發** | 自動建立一次性開發帳戶並讓您登入(無登入牆) | 預設跳過(當沒有電子郵件提供者時) |
30
+ | **品質檢查/預覽** | 正常註冊,但可以跳過驗證,因此測試人員無需等待電子郵件 | 使用 `AUTH_SKIP_EMAIL_VERIFICATION=1` 跳過 |
31
+ | **正式環境** | 正常更好的驗證註冊/登入 | 必需(設定電子郵件提供者時) |
32
+
33
+ 一些標志對此進行了調整;完整詳細資訊位於 [Environment Variables](#environment-variables) 表中:
34
+
35
+ - `AGENT_NATIVE_DISABLE_AUTO_DEV_ACCOUNT=1` — 使用本機開發中的普通註冊頁面而不是自動開發帳戶。
36
+ - `AUTH_DISABLED=true` — 完全跳過登入/註冊,並以一個共用使用者身分執行每個請求(僅限本機開發/預覽/演示,切勿與真實使用者一起進行正式環境)。
37
+ - `AUTH_MODE=local` — 僅影響 CLI/代理身分(開發使用者 `pnpm action` 執行時的身分);它**不是**瀏覽器登入繞過。
38
+
39
+ ```an-callout
40
+ {
41
+ "tone": "warning",
42
+ "body": "`AUTH_DISABLED=true` runs **every request as one shared user**. Use it only for local dev, previews, or demos — never in production with real users, where it would expose all data to anyone."
43
+ }
44
+ ```
45
+
46
+ ## 更好的驗證(預設) {#better-auth}
47
+
48
+ 預設情況下,Better Auth 支持驗證。它提供:
49
+
50
+ - 電子郵件/密碼註冊和登入
51
+ - 社交提供者(Google、GitHub 和 35 多個其他提供者)
52
+ - 具有角色和邀請的組織
53
+ - 用於 API 和 A2A 存取的 JWT 權杖
54
+ - 對程序化用戶端的不記名權杖支持
55
+
56
+ Better Auth 路由安裝在 `/_agent-native/auth/ba/*`。該框架還提供向後兼容的端點:
57
+
58
+ - `GET /_agent-native/auth/session` — 獲取目前工作階段
59
+ - `POST /_agent-native/auth/login` — 電子郵件/密碼登入
60
+ - `POST /_agent-native/auth/register` — 建立帳戶
61
+ - `POST /_agent-native/auth/logout` — 退出
62
+
63
+ ## Cookie 領域 {#cookie-realms}
64
+
65
+ 工作階段 cookie 的領域遵循部署形狀,因此共用的應用程式
66
+ 資料庫/來源共用登入和不保持隔離的應用:
67
+
68
+ | 部署形狀 | Cookie 領域 |
69
+ | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
70
+ | 獨立應用 | 通過 slug(`APP_NAME`,或本機開發中的包名稱)隔離每個應用程式;正式環境中穩定的 `an` 前綴 |
71
+ | 工作區模式(`AGENT_NATIVE_WORKSPACE=1`) | 一個共用領域 - 工作區應用程式共用來源和資料庫 |
72
+ | 自訂同資料庫子域 | 選取與 `COOKIE_DOMAIN` 共用 Cookie |
73
+ | 第一方託管 (`*.agent-native.com`) | 每個應用程式的獨立命名空間(每個應用程式都有自己的驗證資料庫);預設情況下忽略 `COOKIE_DOMAIN=.agent-native.com` |
74
+
75
+ 第一方託管應用程式都有自己的驗證資料庫,因此可以跨應用程式登入
76
+ 通過 [Cross-App SSO](/docs/cross-app-sso) 而不是共用 cookie。
77
+ 這些部署必須提供 `APP_NAME` 或可派生應用 URL(`APP_URL`、`URL`,
78
+ `DEPLOY_PRIME_URL`,或`DEPLOY_URL`);否則啟動失敗而不是下降
79
+ 返回共用的 `an_session` 名稱。有意共用一個驗證資料庫
80
+ 跨子域,將 `AGENT_NATIVE_SHARE_COOKIE_DOMAIN=1` 並排設定
81
+ `COOKIE_DOMAIN`.
82
+
83
+ ## 品質檢查帳戶 {#qa-accounts}
84
+
85
+ 本機開發和測試預設跳過註冊電子郵件驗證,因此您
86
+ 可以建立真實的電子郵件/密碼帳戶,而無需等待收件箱。強制
87
+ 在測試該流程時進行本機驗證,設定 `AUTH_SKIP_EMAIL_VERIFICATION=0`。
88
+
89
+ 對於測試人員需要真實帳戶但不應等待的託管 QA 環境
90
+ 在電子郵件傳送時,設定:
91
+
92
+ ```bash
93
+ AUTH_SKIP_EMAIL_VERIFICATION=1
94
+ ```
95
+
96
+ 設定此標志後,電子郵件/密碼註冊不需要電子郵件
97
+ 驗證和註冊驗證電子郵件未發送。僅將其用於品質檢查
98
+ 或預覽環境,並使用 `+qa` 地址命名測試帳戶
99
+ (`name+qa@example.com`),因此很容易識別。
100
+
101
+ ## 社交提供者 {#social-providers}
102
+
103
+ 設定環境變數以啟用社交登入。 Better Auth 自動檢測它們:
104
+
105
+ ```bash
106
+ # GoogleOAuth
107
+ GOOGLE_SIGN_IN_CLIENT_ID=your-low-scope-sign-in-client-id
108
+ GOOGLE_SIGN_IN_CLIENT_SECRET=your-low-scope-sign-in-client-secret
109
+
110
+ # 向後兼容的回退以及範本的提供者 OAuth 憑證
111
+ # 連線到 Google APIs,例如 Gmail 或行事曆。
112
+ GOOGLE_CLIENT_ID=your-client-id
113
+ GOOGLE_CLIENT_SECRET=your-client-secret
114
+
115
+ # GitHub OAuth
116
+ GITHUB_CLIENT_ID=your-client-id
117
+ GITHUB_CLIENT_SECRET=your-client-secret
118
+ ```
119
+
120
+ 使用 `createGoogleAuthPlugin()` 的範本顯示“使用 Google 登入”頁面。 GoogleOAuth 回呼自動處理本機應用的行動深度連結。
121
+
122
+ 普通情況下優先選取 `GOOGLE_SIGN_IN_CLIENT_ID` / `GOOGLE_SIGN_IN_CLIENT_SECRET`
123
+ 應用程式登入。該用戶端應該僅請求身分範圍。保留
124
+ `GOOGLE_CLIENT_ID` / `GOOGLE_CLIENT_SECRET` 適用於需要的產品整合
125
+ Google API 範圍,或作為部署未拆分時的舊後備
126
+ 還沒有。郵件和行事曆樣式的應用程式應該使用自己的提供者 OAuth 用戶端,因此
127
+ 高範圍同意螢幕不會影響通用應用登入。
128
+
129
+ ### OAuth 狀態簽名 {#oauth-state-secret}
130
+
131
+ 在正式環境中將 `OAUTH_STATE_SECRET` 設定為隨機的 32+ 字符值,以便 OAuth 狀態信封(Google、Atlassian、Zoom)使用獨立於任何第三方機密的專用金鑰進行 HMAC 簽名。請參閱 [Security — OAuth State Signing](/docs/security#oauth-state) 了解完整的要求和威脅模型。
132
+
133
+ ## 組織 {#organizations}
134
+
135
+ 該框架提供了內置的組織系統。這是框架自己的 `org/` 模塊(由 `organizations` 和 `org_members` 表支持),而不是 Better Auth 的組織外掛,該外掛故意未註冊。每個應用程式都支持:
136
+
137
+ - 建立組織
138
+ - 邀請具有角色的成員(`owner`、`admin`、`member`)
139
+ - 切換活動組織
140
+ - 通過 `org_id` 列確定每個組織的資料範圍
141
+
142
+ 活動組織在工作階段中被跟蹤為 `session.orgId`,切換組織會更改使用者和代理看到的資料。資料作用域本身發生在堆堆疊的更下方——有關完整的 `session.orgId → AGENT_ORG_ID → SQL` 管道和存取防護,請參閱 [Security & Data Scoping](/docs/security#data-scoping)。 [Multi-Tenancy](/docs/multi-tenancy) 檔案涵蓋了組織管理層面。
143
+
144
+ ## 靜態MCP不記名權杖 {#access-tokens}
145
+
146
+ `ACCESS_TOKEN` 和 `ACCESS_TOKENS` 不是瀏覽器驗證,並且不會將應用程式設為私人。它們僅保留為無法使用 OAuth 流的 MCP/連線用戶端的靜態承載憑證。
147
+
148
+ ```bash
149
+ # 單一代幣
150
+ ACCESS_TOKEN=my-secret-token
151
+
152
+ # 多個代幣
153
+ ACCESS_TOKENS=token1,token2,token3
154
+ ```
155
+
156
+ 設定這些變數永遠不會為訪客呈現權杖登入頁面。 Web 登入保留在 Better Auth 或您的自訂 `getSession` 提供者上。
157
+
158
+ ## 遠端MCP OAuth {#remote-mcp-oauth}
159
+
160
+ 每個應用程式的 MCP 端點都可以充當標準受保護的 MCP 資源。支持 OAuth 的用戶端只能設定遠端 MCP URL:
161
+
162
+ ```text
163
+ https://mail.agent-native.com/_agent-native/mcp
164
+ ```
165
+
166
+ 未經驗證的 MCP 請求返回指向 `/.well-known/oauth-protected-resource` 的 `WWW-Authenticate` 質詢。然後,用戶端發現應用程式的 OAuth 元資料,動態註冊公開用戶端,開啟應用程式的授權頁面,並與 PKCE 交換授權程式碼以獲取存取和刷新權杖。
167
+
168
+ ```an-diagram title="遠端 MCP OAuth 握手" summary="具有 OAuth 功能的用戶端僅從 MCP URL 引導 — 挑战、發現、動態註冊,然後是 PKCE 程式碼交換。"
169
+ {
170
+ "html": "<div class=\"mcp-flow\"><div class=\"diagram-node\">1 &middot; MCP request<br><small class=\"diagram-muted\">no token</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-node warn\">2 &middot; 401 challenge<br><small class=\"diagram-muted\">WWW-Authenticate</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-node\">3 &middot; Discover metadata<br><small class=\"diagram-muted\">.well-known</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-node\">4 &middot; Register client<br><small class=\"diagram-muted\">動態、公開</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-node\">5 &middot; Authorize + PKCE<br><small class=\"diagram-muted\">code exchange</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-node ok\">6 &middot; Access + refresh<br><small class=\"diagram-muted\">audience-bound</small></div></div>",
171
+ "css": ".mcp-flow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.mcp-flow .diagram-node{display:flex;flex-direction:column;gap:2px;padding:8px 12px}.mcp-flow .diagram-arrow{font-size:20px;line-height:1}"
172
+ }
173
+ ```
174
+
175
+ 設定時存取權杖使用 `A2A_SECRET` 進行簽名,否則使用 `BETTER_AUTH_SECRET` 進行簽名。它們攜帶簽名的使用者/組織身分和 `mcp:read`、`mcp:write` 和/或 `mcp:apps` 範圍,並且受眾綁定到確切的 MCP 資源 URL。刷新權杖僅存儲為哈希值並在每次刷新時輪換。工具調用和 MCP Apps 資源讀取在與登入使用者相同的請求上下文中執行;嵌入式 MCP 應用程式 iframe 永遠不會接收原始 OAuth 權杖。
176
+
177
+ `npx @agent-native/core@latest connect <url> --client claude-code` 為此標準流程寫入僅 URL 的 MCP 條目。對於無法執行遠端 MCP OAuth 的用戶端,請使用“連線”頁面或 `npx @agent-native/core@latest connect --token <token>` 回退來寫入顯式不記名權杖條目。
178
+
179
+ ## 自帶驗證 {#byoa}
180
+
181
+ 傳遞自訂 `getSession` 回調以使用任何驗證提供程序(Clerk、Auth0、Firebase 等):
182
+
183
+ ```ts
184
+ // server/plugins/auth.ts
185
+ import { createAuthPlugin } from "@agent-native/core/server";
186
+
187
+ export default createAuthPlugin({
188
+ getSession: async (event) => {
189
+ // Your custom auth logic here
190
+ const session = await myAuthProvider.verify(event);
191
+ if (!session) return null;
192
+ return { email: session.email };
193
+ },
194
+ publicPaths: ["/api/webhooks"],
195
+ });
196
+ ```
197
+
198
+ ## 公開工作區應用 {#public-workspace-apps}
199
+
200
+ 工作區應用程式預設為內部應用程式。讓匿名訪客載入公開
201
+ 站點同時將管理頁面保留在驗證之後,在
202
+ `apps/<id>/package.json`:
203
+
204
+ ```json
205
+ {
206
+ "agent-native": {
207
+ "workspaceApp": {
208
+ "audience": "public",
209
+ "protectedPaths": ["/admin"]
210
+ }
211
+ }
212
+ }
213
+ ```
214
+
215
+ 對於相反的形狀,保留預設的內部受眾並僅公開
216
+ 特定公開頁面:
217
+
218
+ ```json
219
+ {
220
+ "agent-native": {
221
+ "workspaceApp": {
222
+ "publicPaths": ["/", "/share"]
223
+ }
224
+ }
225
+ }
226
+ ```
227
+
228
+ `publicPaths`和`protectedPaths`使用前綴匹配,所以`"/admin"`也
229
+ 覆蓋 `"/admin/users"`。這些設定僅開啟頁面導覽。框架
230
+ 路由(`/_agent-native/*`)和自訂API路由(`/api/*`)仍然需要驗證
231
+ 除非應用明確新增這些前綴
232
+ `createAuthPlugin({ publicPaths: [...] })`.
233
+
234
+ ## 工作階段 API {#session-api}
235
+
236
+ `getSession(event)` 返回的工作階段物件具有以下形狀:
237
+
238
+ ```ts
239
+ interface AuthSession {
240
+ email: string; // User's email (primary identifier)
241
+ userId?: string; // Better Auth user ID
242
+ token?: string; // Session token
243
+ name?: string; // Display name from the auth provider, when available
244
+ image?: string; // Profile image from the auth provider, when available
245
+ orgId?: string; // Active organization ID
246
+ orgRole?: string; // Role in active org (owner/admin/member)
247
+ }
248
+ ```
249
+
250
+ 在用戶端上,使用 `useSession()` 掛鉤:
251
+
252
+ ```ts
253
+ import { useSession } from "@agent-native/core/client";
254
+
255
+ function MyComponent() {
256
+ const { session, isLoading } = useSession();
257
+ if (isLoading) return <p>Loading...</p>;
258
+ if (!session) return <p>Not signed in</p>;
259
+ return <p>Hello, {session.email}</p>;
260
+ }
261
+ ```
262
+
263
+ ## 登入並返回URL {#sign-in-return-url}
264
+
265
+ 具有**公開頁面**(共用連結、嵌入、營銷頁面)的範本通常需要一個頁面內 CTA 來要求匿名檢視者登入並將他們帶回到他們所在的頁面。該框架為此提供了一個入口點:
266
+
267
+ ```
268
+ /_agent-native/sign-in?return=<same-origin-path>
269
+ ```
270
+
271
+ 當匿名檢視者點擊此 URL 時,將提供框架的登入頁面。成功登入(任何流程 - 權杖、電子郵件/密碼或 GoogleOAuth)後,檢視者將 302 轉至 `return`。
272
+
273
+ `return` 參數被驗證為**同來源路徑**。網路路徑引用 (`//evil.com/...`)、絕對 URL、`data:` / `javascript:` 方案和嵌入式控制字符都回退到 `/`。驗證的路徑是從 URL 解析器重建的,而不是從輸入中回顯。
274
+
275
+ **來自 React 元件:**
276
+
277
+ ```tsx
278
+ import { Button } from "@/components/ui/button";
279
+
280
+ function SignInCta() {
281
+ const onClick = () => {
282
+ const ret = window.location.pathname + window.location.search;
283
+ window.location.href =
284
+ "/_agent-native/sign-in?return=" + encodeURIComponent(ret);
285
+ };
286
+ return <Button onClick={onClick}>Sign in</Button>;
287
+ }
288
+ ```
289
+
290
+ ### 已新增書簽的私人路徑
291
+
292
+ 當匿名使用者直接導覽到 `/dashboard` 等私人路徑時,框架已經在該 URL 處提供登入頁面 - 成功登入後,頁面重新載入並且使用者登陸 `/dashboard`。無需特殊處理;這適用於權杖、電子郵件/密碼、**和** GoogleOAuth。
293
+
294
+ ### 幕後花絮:GoogleOAuth
295
+
296
+ 兩個流(顯式 `/_agent-native/sign-in` 入口點和書簽路徑情況)都將返回 URL 線程穿過 OAuth 狀態。該狀態是 HMAC 簽名的,因此在運輸過程中無法偽造。在回調中,返回的 URL 在重新導向之前被重新驗證為同來源 - 因此泄漏的簽名金鑰仍然無法轉換為開放重新導向預言機。
297
+
298
+ 如果您的範本直接包裝 `/_agent-native/google/auth-url`(例如郵件和行事曆範本這樣做,以擴大範圍),則接受 `?return=<path>` 查詢並通過 `encodeOAuthState` 的選項物件形式轉發它:
299
+
300
+ ```ts
301
+ const returnUrl = getQuery(event).return;
302
+ const state = encodeOAuthState({
303
+ redirectUri,
304
+ desktop,
305
+ returnUrl: typeof returnUrl === "string" ? returnUrl : undefined,
306
+ });
307
+ ```
308
+
309
+ 預設的 `/_agent-native/google/auth-url` 路由會自動執行此操作 - 僅當您的範本需要自訂 OAuth 處理時才覆蓋。
310
+
311
+ ## 環境變數 {#environment-variables}
312
+
313
+ | 變數 | 目的 |
314
+ | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
315
+ | `BETTER_AUTH_SECRET` | 更好的驗證簽名金鑰(如果未設定,則自動生成) |
316
+ | `AUTH_SKIP_EMAIL_VERIFICATION` | 在 QA/預覽環境中設定為 `1`,讓電子郵件/密碼註冊無需驗證即可繼續進行;預設情況下跳過本機開發/測試 |
317
+ | `AUTH_DISABLED` | 設定為`true`或`1`跳過登入/註冊;所有請求都作為一個共用使用者執行(僅限本機開發/預覽 - 不適用於真實使用者的正式環境) |
318
+ | `AGENT_NATIVE_DISABLE_AUTO_DEV_ACCOUNT` | 設定為 `1` 以在新的開發資料庫上停用本機主機自動登入 |
319
+ | `AUTH_MODE` | `local` 僅解析 CLI/代理身分(開發使用者 `pnpm action` 作為其執行);絕不繞過瀏覽器登入 |
320
+ | `COOKIE_DOMAIN` | 選取跨同一資料庫子域共用工作階段 Cookie(請參閱 [Cookie Realms](#cookie-realms)) |
321
+ | `AGENT_NATIVE_WORKSPACE` | `1` 在工作區模式下執行 - 跨工作區應用的一個共用工作階段領域 |
322
+ | `AGENT_NATIVE_SHARE_COOKIE_DOMAIN` | 使用 `COOKIE_DOMAIN` 設定以跨第一方子域共用一個驗證資料庫 |
323
+ | `OAUTH_STATE_SECRET` | 用於 OAuth 狀態包絡的專用 HMAC 金鑰(請參閱 [Security — OAuth State Signing](/docs/security#oauth-state)) |
324
+ | `GOOGLE_SIGN_IN_CLIENT_ID` | 用於應用登入的首選低範圍 GoogleOAuth 用戶端 ID |
325
+ | `GOOGLE_SIGN_IN_CLIENT_SECRET` | 用於應用登入的首選低範圍 GoogleOAuth 金鑰 |
326
+ | `GOOGLE_CLIENT_ID` | 舊版 Google 登入回退以及用於 Google API 整合的提供者 OAuth 用戶端 ID |
327
+ | `GOOGLE_CLIENT_SECRET` | 舊版 Google 登入回退以及 Google API 整合的提供者 OAuth 金鑰 |
328
+ | `GITHUB_CLIENT_ID` | 啟用GitHub OAuth |
329
+ | `GITHUB_CLIENT_SECRET` | GitHub OAuth秘密 |
330
+ | `ACCESS_TOKEN` | MCP/連線用戶端的靜態承載回退;不是瀏覽器驗證 |
331
+ | `ACCESS_TOKENS` | MCP/connect 用戶端的逗號分隔靜態承載回退;不是瀏覽器驗證 |
332
+ | `A2A_SECRET` | JWT 簽名的 A2A 跨應用驗證的共用金鑰,以及 MCP OAuth 存取權杖簽名(如果存在) |
@@ -0,0 +1,268 @@
1
+ ---
2
+ title: "自動化"
3
+ description: "具有自然語言條件的事件觸發和計畫自動化"
4
+ ---
5
+
6
+ # 自動化
7
+
8
+ **自動化**是一條規則:_當 X 發生時,執行 Y_ — 用自然語言描述。代理執行指令,因此自動化可以存取代理可以在互動式聊天中使用的每個操作、工具和 MCP 伺服器。
9
+
10
+ 自動化通過 `web-request` 工具使用**事件觸發器**、**自然語言條件**和**出站 HTTP** 擴充功能 [recurring jobs](/docs/recurring-jobs)。它們使用與重複作業相同的 `jobs/<name>.md` 檔案格式、存儲和“建立三種方式”工作流程 - 請參閱 [Recurring Jobs](/docs/recurring-jobs#job-file) 了解共用格式。本頁面僅涵蓋事件驅動自動化的新增內容。
11
+
12
+ ```an-diagram title="當X發生時,做Y" summary="總線上觸發事件,可選的自然語言條件對其進行門控,代理執行具有完整工具存取權限的自動化主體。"
13
+ {
14
+ "html": "<div class=\"auto-flow\"><div class=\"diagram-card\"><span class=\"diagram-pill\">Event</span><small class=\"diagram-muted\"><code>calendar.booking.created</code></small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-card\"><span class=\"diagram-pill\">Condition</span><small class=\"diagram-muted\">Haiku checks: &ldquo;email ends with @builder.io&rdquo;</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&rarr;</div><div class=\"diagram-card accent\"><span class=\"diagram-pill accent\">代理執行 body</span><small class=\"diagram-muted\">actions &middot; web-request &middot; MCP &middot; sub-agents</small></div></div>",
15
+ "css": ".auto-flow{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.auto-flow .diagram-card{display:flex;flex-direction:column;gap:4px;padding:14px 16px;min-width:180px}.auto-flow .diagram-arrow{font-size:22px}"
16
+ }
17
+ ```
18
+
19
+ ## 兩種觸發器型別 {#trigger-types}
20
+
21
+ | 型別 | 觸發時 | 關鍵欄位 |
22
+ | ---------- | --------------------------------- | ------------------ |
23
+ | `schedule` | cron 表達式匹配(與重複作業相同) | `schedule`(cron) |
24
+ | `event` | 框架事件總線上發出匹配的事件 | `event`(姓名) |
25
+
26
+ 事件觸發器可以包含 `condition`——Haiku 在調度之前根據事件負載評估的自然語言字串。如果條件不匹配,則自動跳過自動化。
27
+
28
+ ## 建立自動化 {#creating}
29
+
30
+ ### 通過詢問代理
31
+
32
+ > “當有人使用 @builder.io 電子郵件預訂會議時,請通過 Slack 向我發送訊息。”
33
+
34
+ 代理發現可用事件,確認計畫,並為您編寫自動化。
35
+
36
+ ### 來自設定UI
37
+
38
+ 自動化出現在設定面板中。使用者可以在那裡檢視、啟用/停用和刪除它們。
39
+
40
+ 第三條路徑 - 通過 `resourcePut` 手動寫入 `jobs/<name>.md` 檔案 - 與 [recurring jobs](/docs/recurring-jobs#creating) 的工作方式完全相同。對於事件驅動的自動化,您可以將下面的事件觸發 frontmatter 新增到同一檔案中。事件觸發作業設定 `schedule: ""` 並提供 `triggerType: event`、`event` 名稱和可選的 `condition`:
41
+
42
+ ```an-annotated-code title="事件觸發的自動化"
43
+ {
44
+ "filename": "jobs/slack-on-builder-booking.md",
45
+ "language": "markdown",
46
+ "code": "---\nschedule: \"\"\nenabled: true\ntriggerType: event\nevent: calendar.booking.created\ncondition: \"attendee email ends with @builder.io\"\nmode: agentic\ndomain: calendar\nrunAs: creator\n---\nSend a Slack message to #sales with the booking details.\nUse the web-request tool to POST to ${keys.SLACK_WEBHOOK}.",
47
+ "annotations": [
48
+ { "lines": "2", "label": "沒有計畫工作", "note": "Event triggers set `schedule` to `\"\"` — the cron field stays empty." },
49
+ { "lines": "4-5", "label": "觸發器", "note": "`triggerType: event` 加上 `event` 名稱將此自動化訂閱到總線。" },
50
+ { "lines": "6", "label": "門", "note": "可選的自然語言 `condition`,由 Haiku 在調度之前根據有效負載進行評估。" },
51
+ { "lines": "12", "label": "伺服器端秘密", "note": "`${keys.SLACK_WEBHOOK}` is resolved server-side — the raw value never enters the agent's context." }
52
+ ]
53
+ }
54
+ ```
55
+
56
+ ## 自動化前沿 {#frontmatter}
57
+
58
+ 自動化共用 [recurring-jobs frontmatter table](/docs/recurring-jobs#frontmatter) 中的每個欄位。這些附加欄位控制事件觸發器、條件和執行模式:
59
+
60
+ | 欄位 | 型別 | 預設 | 描述 |
61
+ | ------------- | -------------------------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------- |
62
+ | `triggerType` | `"schedule"` \| `"event"` | `"schedule"` | 自動化如何啟動 |
63
+ | `event` | 字串 | _(可選)_ | 要訂閱的事件名稱(僅限事件觸發器) |
64
+ | `condition` | 字串 | _(可選)_ | 在調度之前評估自然語言條件 |
65
+ | `mode` | `"agentic"` \| `"deterministic"` | `"agentic"` | 完整的代理循環。 (`"deterministic"` 已保留,但尚未實現 - 設定它的自動化將被跳過。對所有目前自動化使用 `"agentic"`。) |
66
+ | `domain` | 字串 | _(可選)_ | 分組標籤(郵件、行事曆、剪輯等) |
67
+
68
+ 對於事件觸發器,`schedule`為`""`(空);對於計畫觸發器,它帶有 cron 表達式。調度程序還寫入與調度程序相同的託管 `lastRun` / `lastStatus` / `lastError` 欄位,以及當條件評估為 false 時的 `"skipped"` 狀態。
69
+
70
+ ## 事件總線 {#event-bus}
71
+
72
+ 整合在模塊載入時註冊事件。總線根據 [Standard Schema](https://standardschema.dev) 定義驗證有效負載並將其分派給訂閱者。
73
+
74
+ ### 內置事件 {#built-in-events}
75
+
76
+ | 活動 | 來源 |
77
+ | ---------------------- | ------------------------------------------ |
78
+ | `test.event.fired` | 手動/`manage-automations` action=fire-test |
79
+ | `agent.turn.completed` | 代理聊天 |
80
+ | `calendar.*` | 行事曆整合 |
81
+ | `clip.*` | 剪輯整合 |
82
+ | `mail.*` | 郵件整合 |
83
+
84
+ 從代理中使用 `action=list-events` 調用 `manage-automations`,以檢視所有已註冊事件以及目前範本的描述和負載模式。
85
+
86
+ ### 發出自訂事件 {#emitting-events}
87
+
88
+ 在伺服器外掛中註冊事件型別,然後從 actions 或 webhook 處理程序發出它:
89
+
90
+ ```ts
91
+ import { registerEvent, emit } from "@agent-native/core/event-bus";
92
+ import { z } from "zod";
93
+
94
+ // Register the event type (once, at module load)
95
+ registerEvent({
96
+ name: "order.completed",
97
+ description: "A customer completed an order",
98
+ payloadSchema: z.object({
99
+ orderId: z.string(),
100
+ customerEmail: z.string(),
101
+ total: z.number(),
102
+ }),
103
+ example: {
104
+ orderId: "ord_123",
105
+ customerEmail: "jane@example.com",
106
+ total: 49.99,
107
+ },
108
+ });
109
+
110
+ // Emit the event (from an action, webhook handler, etc.)
111
+ emit(
112
+ "order.completed",
113
+ {
114
+ orderId: "ord_123",
115
+ customerEmail: "jane@example.com",
116
+ total: 49.99,
117
+ },
118
+ { owner: "steve@builder.io" },
119
+ );
120
+ ```
121
+
122
+ 自動化觸發的發出元資料範圍中的 `owner` - 僅評估同一使用者擁有的自動化(或共用自動化)。
123
+
124
+ ## 條件 {#conditions}
125
+
126
+ 條件是 Claude Haiku 針對事件負載評估的自然語言字串。這是一個是/否分類,而不是生成工作。
127
+
128
+ - **空或缺失條件** = 無條件(始終觸發)。
129
+ - 結果通過 5 分鐘 TTL 和 500 個條目的 LRU 快取進行記憶(條件 + 負載的 SHA-256)。
130
+ - 有效負載在發送到 Haiku 之前被截斷為 4000 個字符。
131
+ - 在 API 失敗時,條件評估為 `false`(安全預設值 - 跳過自動化)。
132
+
133
+ 條件範例:
134
+
135
+ - `"attendee email ends with @builder.io"`
136
+ - `"the order total is greater than $100"`
137
+ - `"the message contains the word 'urgent'"`
138
+
139
+ ## 網路請求工具 {#web-request}
140
+
141
+ 自動化使用 `web-request` 工具進行出站 HTTP。它支持 URL、標頭和內文中的 `${keys.NAME}` 預留位置:
142
+
143
+ ```
144
+ POST to ${keys.SLACK_WEBHOOK}
145
+
146
+ Headers: {"Authorization": "Bearer ${keys.API_TOKEN}"}
147
+
148
+ Body: {"text": "New booking from ${attendeeEmail}"}
149
+ ```
150
+
151
+ 在代理發出工具調用後,預留位置在**伺服器端**解析 - 原始秘密值永遠不會進入代理的上下文。
152
+
153
+ ### 參數 {#web-request-params}
154
+
155
+ | 參數 | 型別 | 預設 | 描述 |
156
+ | ------------ | ---- | ----- | -------------------------------------------------- |
157
+ | `url` | 字串 | — | 完整的URL。可能包含 `${keys.NAME}` 引用。 |
158
+ | `method` | 字串 | `GET` | HTTP 方法(GET、POST、PUT、PATCH、DELETE、HEAD)。 |
159
+ | `headers` | 字串 | `{}` | JSON 標頭物件。可能包含 `${keys.NAME}`。 |
160
+ | `body` | 字串 | — | 請求內文。可能包含 `${keys.NAME}`。 |
161
+ | `timeout_ms` | 數字 | 15000 | 超時(以毫秒為單位)(最大 30000)。 |
162
+
163
+ ## 按鍵 {#keys}
164
+
165
+ 金鑰是由使用者或代理建立的用於自動化使用的臨時秘密(例如 `SLACK_WEBHOOK`、`HUBSPOT_API_KEY`)。它們與註冊機密 (`registerRequiredSecret`) 的不同之處在於它們沒有範本定義的元資料或入門步驟。
166
+
167
+ - 通過設定 UI 或 `/_agent-native/secrets/adhoc` API 建立。
168
+ - 每個金鑰都可以有一個 **URL 允許清單**,用於限制金鑰可以發送到哪些來源(來源級別匹配)。
169
+ - 原始值永遠不會暴露給 AI - 只有 `${keys.NAME}` 預留位置出現在代理的上下文中。
170
+ - 分辨率從使用者範圍回退到工作區範圍,因此使用者可以覆蓋共用金鑰。
171
+
172
+ ## 代理工具 {#agent-tools}
173
+
174
+ 所有自動化操作均通過帶有 `action` 參數的單個 `manage-automations` 工具存取:
175
+
176
+ | 行動 | 目的 |
177
+ | ------------- | ---------------------------------------------------- |
178
+ | `list-events` | 發現所有已註冊事件及其描述和負載模式 |
179
+ | `list` | 列出所有自動化的狀態;按域或啟用過濾 |
180
+ | `define` | 建立新的自動化(名稱、觸發器型別、事件、條件、內文) |
181
+ | `update` | 更新現有自動化(已啟用、條件、內文) |
182
+ | `delete` | 刪除自動化(始終先與使用者確認) |
183
+ | `fire-test` | 發出 `test.event.fired` 事件來驗證自動化 |
184
+
185
+ 附加工具:`web-request` — 出站 HTTP 替換為 `${keys.NAME}`。
186
+
187
+ ## API端點 {#api}
188
+
189
+ | 端點 | 方法 | 描述 |
190
+ | -------------------------------------- | ------ | ---------------------------- |
191
+ | `/_agent-native/automations` | GET | 列出所有自動化(已解析) |
192
+ | `/_agent-native/automations/fire-test` | POST | 發出 `test.event.fired` 事件 |
193
+ | `/_agent-native/secrets/adhoc` | GET | 列出臨時鍵(無值) |
194
+ | `/_agent-native/secrets/adhoc` | POST | 建立或更新臨時金鑰 |
195
+ | `/_agent-native/secrets/adhoc/:name` | DELETE | 刪除臨時金鑰 |
196
+
197
+ ```an-api title="觸發測試事件"
198
+ {
199
+ "method": "POST",
200
+ "path": "/_agent-native/automations/fire-test",
201
+ "summary": "發出 test.event.fired 事件以驗證事件觸發的自動化",
202
+ "description": "Confirm an automation's wiring and condition without waiting for a real provider event. Equivalent to the `manage-automations` action `fire-test`.",
203
+ "responses": [
204
+ { "status": "200", "description": "Event emitted; matching automations are dispatched through the normal condition + ownership path." }
205
+ ]
206
+ }
207
+ ```
208
+
209
+ ## 調度如何運作 {#dispatch}
210
+
211
+ ```an-diagram title="調度路徑" summary="從觸發事件到完成代理執行,由所有權範圍和自然語言條件控制。"
212
+ {
213
+ "html": "<div class=\"disp\"><div class=\"diagram-box accent\">event fired on the bus</div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&darr;</div><div class=\"diagram-card\"><span class=\"diagram-pill\">match</span><small class=\"diagram-muted\">load enabled automations subscribed to this event name</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&darr;</div><div class=\"diagram-card\"><span class=\"diagram-pill\">scope</span><small class=\"diagram-muted\">keep only those owned by the event's owner (or shared)</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&darr;</div><div class=\"diagram-card\"><span class=\"diagram-pill warn\">condition</span><small class=\"diagram-muted\">Haiku yes/no on the payload &mdash; false &rarr; <code>skipped</code></small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&darr;</div><div class=\"diagram-card accent\"><span class=\"diagram-pill accent\">run</span><small class=\"diagram-muted\"><code>runAgentLoop</code> body 作為提示、payload 作為上下文,5 分鐘超時</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">&darr;</div><div class=\"diagram-card ok\"><span class=\"diagram-pill ok\">record</span><small class=\"diagram-muted\">write <code>lastRun</code> / <code>lastStatus</code> / <code>lastError</code></small></div></div>",
214
+ "css": ".disp{display:flex;flex-direction:column;gap:6px;max-width:540px}.disp .diagram-card{display:flex;flex-direction:column;gap:2px;padding:10px 14px}.disp .diagram-box{align-self:flex-start}.disp .diagram-arrow{font-size:18px;align-self:center}"
215
+ }
216
+ ```
217
+
218
+ ## 範例 {#example}
219
+
220
+ **使用者:**“當有人使用 @builder.io 電子郵件預訂時,請在 Slack 中給我發訊息。”
221
+
222
+ **代理流程:**
223
+
224
+ 1. 使用 `action=list-events` 調用 `manage-automations` — 找到 `calendar.booking.created`。
225
+ 2. 與使用者確認計畫。
226
+ 3. 使用 `action=define` 調用 `manage-automations`:
227
+ - `name`: `slack-on-builder-booking`
228
+ - `trigger_type`: `event`
229
+ - `event`: `calendar.booking.created`
230
+ - `condition`: `attendee email ends with @builder.io`
231
+ - `mode`: `agentic`
232
+ - `domain`: `calendar`
233
+ - `body`: `Send a Slack message to #sales with the booking details. Use the web-request tool to POST to ${keys.SLACK_WEBHOOK}.`
234
+ 4. 自動化儲存為 `jobs/slack-on-builder-booking.md` 並立即開始監听。
235
+
236
+ ## 更多範例 {#more-examples}
237
+
238
+ ### 當計畫被評論時通過 webhook 通知
239
+
240
+ 詢問計畫代理:_“當有人對計畫新增人工評論時,POST a
241
+ 向我的 webhook 發出通知。"_
242
+
243
+ ```yaml
244
+ ---
245
+ triggerType: event
246
+ event: plan.commented
247
+ condition: "resolutionTarget is human or resolutionTarget is null"
248
+ mode: agentic
249
+ domain: plan
250
+ enabled: true
251
+ ---
252
+
253
+ POST to ${keys.NOTIFY_WEBHOOK} with a JSON body:
254
+ {"title": "<plan title>", "excerpt": "<comment excerpt>", "author": "<author email or null>", "url": "<app base url + path>"}
255
+ ```
256
+
257
+ 將 `NOTIFY_WEBHOOK` 設定為任何 HTTP 端點 - Slack 傳入 Webhook,通用
258
+ 通知服務,或自訂接收器。 `web-request`工具解決
259
+ `${keys.NOTIFY_WEBHOOK}` 伺服器端;原始的 URL 永遠不會出現在代理的
260
+ 上下文。見[Visual Plans — Events and notifications](/docs/template-plan#events)
261
+ 完整的 `plan.commented` 有效負載參考和所有四個計畫事件。
262
+
263
+ ## 下一步是什么
264
+
265
+ - [**Recurring Jobs**](/docs/recurring-jobs) - 計畫觸發的自動化重用相同的計畫程序
266
+ - [**Actions**](/docs/actions) - 自動化可以通過代理循環調用任何註冊的操作
267
+ - [**Security**](/docs/security) - 輸入驗證和秘密處理
268
+ - [**Visual Plans — Events**](/docs/template-plan#events) - 計畫事件參考和自動化秘訣