@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.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +24 -0
- package/corpus/core/docs/content/locales/zh-TW/a2a-protocol.md +392 -0
- package/corpus/core/docs/content/locales/zh-TW/actions.md +583 -0
- package/corpus/core/docs/content/locales/zh-TW/agent-mentions.md +164 -0
- package/corpus/core/docs/content/locales/zh-TW/agent-surfaces.md +397 -0
- package/corpus/core/docs/content/locales/zh-TW/agent-teams.md +171 -0
- package/corpus/core/docs/content/locales/zh-TW/agent-web-surfaces.md +161 -0
- package/corpus/core/docs/content/locales/zh-TW/audit-log.md +111 -0
- package/corpus/core/docs/content/locales/zh-TW/authentication.md +332 -0
- package/corpus/core/docs/content/locales/zh-TW/automations.md +268 -0
- package/corpus/core/docs/content/locales/zh-TW/blueprint-installer.md +83 -0
- package/corpus/core/docs/content/locales/zh-TW/cli-adapters.md +129 -0
- package/corpus/core/docs/content/locales/zh-TW/client.md +398 -0
- package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.md +114 -0
- package/corpus/core/docs/content/locales/zh-TW/code-agents-ui.md +436 -0
- package/corpus/core/docs/content/locales/zh-TW/components.md +368 -0
- package/corpus/core/docs/content/locales/zh-TW/context-awareness.md +373 -0
- package/corpus/core/docs/content/locales/zh-TW/creating-templates.md +411 -0
- package/corpus/core/docs/content/locales/zh-TW/cross-app-sso.md +188 -0
- package/corpus/core/docs/content/locales/zh-TW/database.md +183 -0
- package/corpus/core/docs/content/locales/zh-TW/deployment.md +348 -0
- package/corpus/core/docs/content/locales/zh-TW/dispatch.md +146 -0
- package/corpus/core/docs/content/locales/zh-TW/drop-in-agent.md +260 -0
- package/corpus/core/docs/content/locales/zh-TW/durable-resume.md +65 -0
- package/corpus/core/docs/content/locales/zh-TW/embedding-sdk.md +597 -0
- package/corpus/core/docs/content/locales/zh-TW/evals.md +155 -0
- package/corpus/core/docs/content/locales/zh-TW/extensions.md +360 -0
- package/corpus/core/docs/content/locales/zh-TW/external-agents.md +619 -0
- package/corpus/core/docs/content/locales/zh-TW/faq.md +142 -0
- package/corpus/core/docs/content/locales/zh-TW/file-uploads.md +122 -0
- package/corpus/core/docs/content/locales/zh-TW/frames.md +153 -0
- package/corpus/core/docs/content/locales/zh-TW/getting-started.md +199 -0
- package/corpus/core/docs/content/locales/zh-TW/harness-agents.md +349 -0
- package/corpus/core/docs/content/locales/zh-TW/human-approval.md +86 -0
- package/corpus/core/docs/content/locales/zh-TW/internationalization.md +147 -0
- package/corpus/core/docs/content/locales/zh-TW/key-concepts.md +312 -0
- package/corpus/core/docs/content/locales/zh-TW/local-file-mode.md +433 -0
- package/corpus/core/docs/content/locales/zh-TW/mcp-apps.md +147 -0
- package/corpus/core/docs/content/locales/zh-TW/mcp-clients.md +330 -0
- package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.md +279 -0
- package/corpus/core/docs/content/locales/zh-TW/messaging.md +461 -0
- package/corpus/core/docs/content/locales/zh-TW/migration-workbench.md +33 -0
- package/corpus/core/docs/content/locales/zh-TW/multi-app-workspace.md +312 -0
- package/corpus/core/docs/content/locales/zh-TW/multi-tenancy.md +52 -0
- package/corpus/core/docs/content/locales/zh-TW/native-chat-ui.md +321 -0
- package/corpus/core/docs/content/locales/zh-TW/notifications.md +231 -0
- package/corpus/core/docs/content/locales/zh-TW/observability.md +294 -0
- package/corpus/core/docs/content/locales/zh-TW/observational-memory.md +77 -0
- package/corpus/core/docs/content/locales/zh-TW/onboarding.md +216 -0
- package/corpus/core/docs/content/locales/zh-TW/plan-plugin.md +200 -0
- package/corpus/core/docs/content/locales/zh-TW/pr-visual-recap.md +384 -0
- package/corpus/core/docs/content/locales/zh-TW/processors.md +106 -0
- package/corpus/core/docs/content/locales/zh-TW/progress.md +199 -0
- package/corpus/core/docs/content/locales/zh-TW/pure-agent-apps.md +39 -0
- package/corpus/core/docs/content/locales/zh-TW/real-time-collaboration.md +680 -0
- package/corpus/core/docs/content/locales/zh-TW/recurring-jobs.md +142 -0
- package/corpus/core/docs/content/locales/zh-TW/routing.md +79 -0
- package/corpus/core/docs/content/locales/zh-TW/sandbox-adapters.md +227 -0
- package/corpus/core/docs/content/locales/zh-TW/security.md +330 -0
- package/corpus/core/docs/content/locales/zh-TW/server.md +265 -0
- package/corpus/core/docs/content/locales/zh-TW/sharing.md +219 -0
- package/corpus/core/docs/content/locales/zh-TW/skills-guide.md +281 -0
- package/corpus/core/docs/content/locales/zh-TW/template-analytics.md +259 -0
- package/corpus/core/docs/content/locales/zh-TW/template-assets.md +303 -0
- package/corpus/core/docs/content/locales/zh-TW/template-brain.md +324 -0
- package/corpus/core/docs/content/locales/zh-TW/template-calendar.md +194 -0
- package/corpus/core/docs/content/locales/zh-TW/template-chat.md +129 -0
- package/corpus/core/docs/content/locales/zh-TW/template-clips.md +368 -0
- package/corpus/core/docs/content/locales/zh-TW/template-content.md +402 -0
- package/corpus/core/docs/content/locales/zh-TW/template-design.md +173 -0
- package/corpus/core/docs/content/locales/zh-TW/template-dispatch.md +220 -0
- package/corpus/core/docs/content/locales/zh-TW/template-forms.md +178 -0
- package/corpus/core/docs/content/locales/zh-TW/template-mail.md +239 -0
- package/corpus/core/docs/content/locales/zh-TW/template-plan.md +814 -0
- package/corpus/core/docs/content/locales/zh-TW/template-slides.md +293 -0
- package/corpus/core/docs/content/locales/zh-TW/template-videos.md +222 -0
- package/corpus/core/docs/content/locales/zh-TW/tracking.md +236 -0
- package/corpus/core/docs/content/locales/zh-TW/using-your-agent.md +71 -0
- package/corpus/core/docs/content/locales/zh-TW/voice-input.md +81 -0
- package/corpus/core/docs/content/locales/zh-TW/what-is-agent-native.md +202 -0
- package/corpus/core/docs/content/locales/zh-TW/workspace-connections.md +321 -0
- package/corpus/core/docs/content/locales/zh-TW/workspace-management.md +175 -0
- package/corpus/core/docs/content/locales/zh-TW/workspace.md +323 -0
- package/corpus/core/docs/content/locales/zh-TW/writing-agent-instructions.md +173 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/client/ErrorBoundary.tsx +10 -0
- package/corpus/core/src/client/FeedbackButton.tsx +12 -0
- package/corpus/core/src/client/blocks/library/block-copy.ts +32 -0
- package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +33 -0
- package/corpus/core/src/client/i18n.tsx +5 -0
- package/corpus/core/src/localization/actions/set-localization-preference.ts +2 -1
- package/corpus/core/src/localization/shared.ts +45 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +38 -0
- package/corpus/core/src/server/onboarding-html.ts +99 -0
- package/corpus/core/src/templates/default/app/i18n/index.ts +2 -0
- package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +466 -0
- package/corpus/core/src/templates/default/app/root.tsx +8 -0
- package/corpus/templates/analytics/app/i18n/index.ts +2 -0
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +818 -0
- package/corpus/templates/analytics/app/i18n-data.ts +9 -0
- package/corpus/templates/assets/app/i18n/index.ts +2 -0
- package/corpus/templates/assets/app/i18n/zh-TW.ts +860 -0
- package/corpus/templates/assets/app/i18n-data.ts +3 -0
- package/corpus/templates/brain/app/i18n/index.ts +2 -0
- package/corpus/templates/brain/app/i18n/zh-TW.ts +709 -0
- package/corpus/templates/brain/app/i18n-data.ts +3 -0
- package/corpus/templates/calendar/app/i18n/zh-TW.ts +836 -0
- package/corpus/templates/calendar/app/i18n-data.ts +4 -0
- package/corpus/templates/chat/app/i18n/index.ts +2 -0
- package/corpus/templates/chat/app/i18n/zh-TW.ts +67 -0
- package/corpus/templates/chat/app/i18n-data.ts +3 -0
- package/corpus/templates/clips/app/i18n/index.ts +2 -0
- package/corpus/templates/clips/app/i18n/zh-TW.ts +1280 -0
- package/corpus/templates/content/app/i18n/index.ts +2 -0
- package/corpus/templates/content/app/i18n/zh-TW.ts +906 -0
- package/corpus/templates/content/app/i18n-data.ts +4 -0
- package/corpus/templates/design/app/i18n/index.ts +2 -0
- package/corpus/templates/design/app/i18n/zh-TW.ts +517 -0
- package/corpus/templates/design/app/i18n-data.ts +6 -0
- package/corpus/templates/dispatch/app/i18n/index.ts +2 -0
- package/corpus/templates/dispatch/app/i18n/zh-TW.ts +195 -0
- package/corpus/templates/dispatch/app/i18n-data.ts +3 -0
- package/corpus/templates/forms/app/i18n/index.ts +2 -0
- package/corpus/templates/forms/app/i18n/zh-TW.ts +349 -0
- package/corpus/templates/macros/app/i18n/index.ts +2 -0
- package/corpus/templates/macros/app/i18n/zh-TW.ts +224 -0
- package/corpus/templates/mail/app/i18n/index.ts +2 -0
- package/corpus/templates/mail/app/i18n/zh-TW.ts +562 -0
- package/corpus/templates/mail/app/root.tsx +6 -0
- package/corpus/templates/plan/app/i18n/index.ts +2 -0
- package/corpus/templates/plan/app/i18n/zh-TW.ts +712 -0
- package/corpus/templates/slides/app/i18n/index.ts +2 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +531 -0
- package/corpus/templates/videos/app/i18n/index.ts +2 -0
- package/corpus/templates/videos/app/i18n/zh-TW.ts +435 -0
- package/dist/client/ErrorBoundary.d.ts.map +1 -1
- package/dist/client/ErrorBoundary.js +10 -0
- package/dist/client/ErrorBoundary.js.map +1 -1
- package/dist/client/FeedbackButton.d.ts.map +1 -1
- package/dist/client/FeedbackButton.js +12 -0
- package/dist/client/FeedbackButton.js.map +1 -1
- package/dist/client/blocks/library/block-copy.d.ts.map +1 -1
- package/dist/client/blocks/library/block-copy.js +32 -0
- package/dist/client/blocks/library/block-copy.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +32 -0
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/i18n.d.ts.map +1 -1
- package/dist/client/i18n.js +5 -0
- package/dist/client/i18n.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/localization/actions/set-localization-preference.d.ts.map +1 -1
- package/dist/localization/actions/set-localization-preference.js +2 -2
- package/dist/localization/actions/set-localization-preference.js.map +1 -1
- package/dist/localization/shared.d.ts +1 -1
- package/dist/localization/shared.d.ts.map +1 -1
- package/dist/localization/shared.js +43 -0
- package/dist/localization/shared.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +3 -3
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +39 -0
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +2 -2
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +96 -0
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/templates/default/app/i18n/index.ts +2 -0
- package/dist/templates/default/app/i18n/zh-TW.ts +466 -0
- package/dist/templates/default/app/root.tsx +8 -0
- package/docs/content/locales/zh-TW/a2a-protocol.md +392 -0
- package/docs/content/locales/zh-TW/actions.md +583 -0
- package/docs/content/locales/zh-TW/agent-mentions.md +164 -0
- package/docs/content/locales/zh-TW/agent-surfaces.md +397 -0
- package/docs/content/locales/zh-TW/agent-teams.md +171 -0
- package/docs/content/locales/zh-TW/agent-web-surfaces.md +161 -0
- package/docs/content/locales/zh-TW/audit-log.md +111 -0
- package/docs/content/locales/zh-TW/authentication.md +332 -0
- package/docs/content/locales/zh-TW/automations.md +268 -0
- package/docs/content/locales/zh-TW/blueprint-installer.md +83 -0
- package/docs/content/locales/zh-TW/cli-adapters.md +129 -0
- package/docs/content/locales/zh-TW/client.md +398 -0
- package/docs/content/locales/zh-TW/cloneable-saas.md +114 -0
- package/docs/content/locales/zh-TW/code-agents-ui.md +436 -0
- package/docs/content/locales/zh-TW/components.md +368 -0
- package/docs/content/locales/zh-TW/context-awareness.md +373 -0
- package/docs/content/locales/zh-TW/creating-templates.md +411 -0
- package/docs/content/locales/zh-TW/cross-app-sso.md +188 -0
- package/docs/content/locales/zh-TW/database.md +183 -0
- package/docs/content/locales/zh-TW/deployment.md +348 -0
- package/docs/content/locales/zh-TW/dispatch.md +146 -0
- package/docs/content/locales/zh-TW/drop-in-agent.md +260 -0
- package/docs/content/locales/zh-TW/durable-resume.md +65 -0
- package/docs/content/locales/zh-TW/embedding-sdk.md +597 -0
- package/docs/content/locales/zh-TW/evals.md +155 -0
- package/docs/content/locales/zh-TW/extensions.md +360 -0
- package/docs/content/locales/zh-TW/external-agents.md +619 -0
- package/docs/content/locales/zh-TW/faq.md +142 -0
- package/docs/content/locales/zh-TW/file-uploads.md +122 -0
- package/docs/content/locales/zh-TW/frames.md +153 -0
- package/docs/content/locales/zh-TW/getting-started.md +199 -0
- package/docs/content/locales/zh-TW/harness-agents.md +349 -0
- package/docs/content/locales/zh-TW/human-approval.md +86 -0
- package/docs/content/locales/zh-TW/internationalization.md +147 -0
- package/docs/content/locales/zh-TW/key-concepts.md +312 -0
- package/docs/content/locales/zh-TW/local-file-mode.md +433 -0
- package/docs/content/locales/zh-TW/mcp-apps.md +147 -0
- package/docs/content/locales/zh-TW/mcp-clients.md +330 -0
- package/docs/content/locales/zh-TW/mcp-protocol.md +279 -0
- package/docs/content/locales/zh-TW/messaging.md +461 -0
- package/docs/content/locales/zh-TW/migration-workbench.md +33 -0
- package/docs/content/locales/zh-TW/multi-app-workspace.md +312 -0
- package/docs/content/locales/zh-TW/multi-tenancy.md +52 -0
- package/docs/content/locales/zh-TW/native-chat-ui.md +321 -0
- package/docs/content/locales/zh-TW/notifications.md +231 -0
- package/docs/content/locales/zh-TW/observability.md +294 -0
- package/docs/content/locales/zh-TW/observational-memory.md +77 -0
- package/docs/content/locales/zh-TW/onboarding.md +216 -0
- package/docs/content/locales/zh-TW/plan-plugin.md +200 -0
- package/docs/content/locales/zh-TW/pr-visual-recap.md +384 -0
- package/docs/content/locales/zh-TW/processors.md +106 -0
- package/docs/content/locales/zh-TW/progress.md +199 -0
- package/docs/content/locales/zh-TW/pure-agent-apps.md +39 -0
- package/docs/content/locales/zh-TW/real-time-collaboration.md +680 -0
- package/docs/content/locales/zh-TW/recurring-jobs.md +142 -0
- package/docs/content/locales/zh-TW/routing.md +79 -0
- package/docs/content/locales/zh-TW/sandbox-adapters.md +227 -0
- package/docs/content/locales/zh-TW/security.md +330 -0
- package/docs/content/locales/zh-TW/server.md +265 -0
- package/docs/content/locales/zh-TW/sharing.md +219 -0
- package/docs/content/locales/zh-TW/skills-guide.md +281 -0
- package/docs/content/locales/zh-TW/template-analytics.md +259 -0
- package/docs/content/locales/zh-TW/template-assets.md +303 -0
- package/docs/content/locales/zh-TW/template-brain.md +324 -0
- package/docs/content/locales/zh-TW/template-calendar.md +194 -0
- package/docs/content/locales/zh-TW/template-chat.md +129 -0
- package/docs/content/locales/zh-TW/template-clips.md +368 -0
- package/docs/content/locales/zh-TW/template-content.md +402 -0
- package/docs/content/locales/zh-TW/template-design.md +173 -0
- package/docs/content/locales/zh-TW/template-dispatch.md +220 -0
- package/docs/content/locales/zh-TW/template-forms.md +178 -0
- package/docs/content/locales/zh-TW/template-mail.md +239 -0
- package/docs/content/locales/zh-TW/template-plan.md +814 -0
- package/docs/content/locales/zh-TW/template-slides.md +293 -0
- package/docs/content/locales/zh-TW/template-videos.md +222 -0
- package/docs/content/locales/zh-TW/tracking.md +236 -0
- package/docs/content/locales/zh-TW/using-your-agent.md +71 -0
- package/docs/content/locales/zh-TW/voice-input.md +81 -0
- package/docs/content/locales/zh-TW/what-is-agent-native.md +202 -0
- package/docs/content/locales/zh-TW/workspace-connections.md +321 -0
- package/docs/content/locales/zh-TW/workspace-management.md +175 -0
- package/docs/content/locales/zh-TW/workspace.md +323 -0
- package/docs/content/locales/zh-TW/writing-agent-instructions.md +173 -0
- package/package.json +1 -1
- package/src/templates/default/app/i18n/index.ts +2 -0
- package/src/templates/default/app/i18n/zh-TW.ts +466 -0
- package/src/templates/default/app/root.tsx +8 -0
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "安全帶特工"
|
|
3
|
+
description: "將 Claude Code、Codex、Pi 和其他完整的編碼工具作為 Agent-Native 內的嵌入式代理執行,並具有自己的循環、沙箱、本機工具和可恢復的 SQL 支持的工作階段。"
|
|
4
|
+
search: "harness代理AgentHarness ai-sdk HarnessAgent Claude程式碼Codex Pi Cursor Mastra嵌入式編碼代理resolveAgentHarness startAgentHarnessRun可恢復工作階段沙箱主機工具"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 安全特工
|
|
8
|
+
|
|
9
|
+
> **這是給誰的:** 主機作者連線完整的編碼執行時(Claude 程式碼,
|
|
10
|
+
> Codex, Pi) 轉換為 Agent-Native 作為代理。建置應用程式?從
|
|
11
|
+
> [Creating Templates](/docs/creating-templates).
|
|
12
|
+
|
|
13
|
+
線束代理是一個完整的代理執行時 - Claude 程式碼、Codex、Pi 等 -
|
|
14
|
+
擁有自己的循環、工作區、本機檔案工具、工作階段狀態、壓縮,
|
|
15
|
+
審批模型和沙箱行為。 Agent-Native 通過
|
|
16
|
+
**`AgentHarness`** `@agent-native/core/agent/harness` 中的基質,流式傳輸它們
|
|
17
|
+
將事件放入正常的紀錄中,並保留其本機工作階段,以便成為一個線程
|
|
18
|
+
可以暫停和恢復。
|
|
19
|
+
|
|
20
|
+
這與內置聊天代理和自帶聊天功能不同
|
|
21
|
+
執行時。內置代理和`AgentEngine`為一個模型往返
|
|
22
|
+
在`runAgentLoop`下面。一個harness不是一個`AgentEngine`提供者——它執行它的
|
|
23
|
+
自己的端對端循環,因此 Agent-Native 將其作為工作階段驅動,而不是單個
|
|
24
|
+
模型調用。
|
|
25
|
+
|
|
26
|
+
```an-diagram title="安全帶擁有它的環; Agent-Native 驅動工作階段" summary="AgentHarness 底層 creates/resumes 本機工作階段,將其事件流式傳輸到正常轉錄本中,並在輪次之間將恢復狀態保留在 SQL 中。"
|
|
27
|
+
{
|
|
28
|
+
"html": "<div class=\"diagram-harness\"><div class=\"diagram-box\" data-rough><strong>AgentHarness substrate</strong><small class=\"diagram-muted\">@agent-native/core/agent/harness</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">→</div><div class=\"diagram-panel center\" data-rough><strong>Native harness loop</strong><small class=\"diagram-muted\">Claude Code · Codex · Pi — own tools, sandbox, compaction</small></div><div class=\"diagram-col\"><div class=\"diagram-pill accent\">events → transcript</div><div class=\"diagram-pill ok\">resumeState → SQL session</div></div></div>",
|
|
29
|
+
"css": ".diagram-harness{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.diagram-harness .diagram-col{display:flex;flex-direction:column;gap:8px}.diagram-harness .diagram-arrow{font-size:22px;line-height:1}.diagram-harness .center{display:flex;flex-direction:column;align-items:center;gap:4px}"
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 我需要哪個編碼檔案? {#which-doc}
|
|
34
|
+
|
|
35
|
+
| 你想要…… | 使用 |
|
|
36
|
+
| -------------------------------------------------------- | -------------------------------------------- |
|
|
37
|
+
| 使用自己的循環+工具**作為代理**執行Claude程式碼/Codex/Pi | **安全帶代理**(本頁面) |
|
|
38
|
+
| 渲染 Claude-Code/Codex 樣式 **編碼工作區 UI** | [Agent-Native Code UI](/docs/code-agents-ui) |
|
|
39
|
+
| 交換執行代理的 **`run-code` 工具**的後端 | [Adapters](/docs/sandbox-adapters) |
|
|
40
|
+
| 封裝一個CLI工具(`gh`、`ffmpeg`)供代理調用 | [Adapters](/docs/sandbox-adapters) |
|
|
41
|
+
|
|
42
|
+
相鄰表面:將您在其他地方建置的代理放在 Agent-Native 的聊天後面
|
|
43
|
+
UI 與 [`AgentChatRuntime`](/docs/native-chat-ui#byo-agent-runtimes);讓一個
|
|
44
|
+
外部 MCP 主機通過 [External Agents](/docs/external-agents) 調用您的應用;
|
|
45
|
+
生成後台/子代理與 [Custom Agents & Teams](/docs/agent-teams) 一起執行。
|
|
46
|
+
|
|
47
|
+
## 內置安全帶 {#built-in}
|
|
48
|
+
|
|
49
|
+
`registerBuiltinAgentHarnesses()` 註冊由 AI SDK 支持的三個適配器
|
|
50
|
+
`HarnessAgent`:
|
|
51
|
+
|
|
52
|
+
| 姓名 | 執行時 | 沙盒 | 批準 |
|
|
53
|
+
| ---------------------------- | ------------ | ---- | ---- |
|
|
54
|
+
| `ai-sdk-harness:claude-code` | Claude程式碼 | 是的 | 是的 |
|
|
55
|
+
| `ai-sdk-harness:codex` | Codex | 是的 | 沒有 |
|
|
56
|
+
| `ai-sdk-harness:pi` | 圓週率 | 沒有 | 是的 |
|
|
57
|
+
|
|
58
|
+
它們的執行時包是**可選的對等依賴項**並且延遲載入,因此
|
|
59
|
+
從不使用安全帶的應用程式無需付費。每個適配器都帶有一個
|
|
60
|
+
`installPackage` 提示(例如`@ai-sdk/harness@canary
|
|
61
|
+
@ai-sdk/harness-codex@canary`); `resolveAgentHarness`拋出一個明確的安裝
|
|
62
|
+
如果缺少包,則會出現錯誤,並且 `isAgentHarnessPackageInstalled(entry)`
|
|
63
|
+
讓您先檢查。
|
|
64
|
+
|
|
65
|
+
`registerBuiltinAgentHarnesses()` 還註冊了 [ACP](#acp) 線束
|
|
66
|
+
(`acp`, `acp:gemini`, `acp:claude-code`).
|
|
67
|
+
|
|
68
|
+
## ACP代理 {#acp}
|
|
69
|
+
|
|
70
|
+
Agent-Native可以充當[ACP](https://agentclientprotocol.com)(代理用戶端
|
|
71
|
+
協議)**用戶端**並驅動本機編碼代理 - Gemini CLI、Claude 程式碼,
|
|
72
|
+
或任何符合ACP標準的代理——通過相同的基材。代理作為
|
|
73
|
+
本機子進程通過stdio使用換行符分隔的JSON-RPC; ACP的編輯
|
|
74
|
+
↔ 代理模型就是這個形狀。
|
|
75
|
+
|
|
76
|
+
此適配器的範圍是**本機編碼**。子進程繼承
|
|
77
|
+
父環境,因此代理重用它已有的任何本機 CLI 登入
|
|
78
|
+
(例如使用者主目錄中的 `gemini` 或 `claude` 驗證)。這不是一個
|
|
79
|
+
託管或沙盒傳輸,並且它不是聊天/A2A 傳輸 - 對於這些,
|
|
80
|
+
參見[Agent Surfaces](/docs/agent-surfaces)。
|
|
81
|
+
|
|
82
|
+
| 姓名 | 預設指令 | 可恢復\* |
|
|
83
|
+
| ----------------- | ---------------------------------------------- | -------- |
|
|
84
|
+
| `acp` | _(通過設定提供`command`/`args`)_ | 是的 |
|
|
85
|
+
| `acp:gemini` | `npx -y @google/gemini-cli --experimental-acp` | 是的 |
|
|
86
|
+
| `acp:claude-code` | `npx -y @zed-industries/claude-code-acp` | 是的 |
|
|
87
|
+
|
|
88
|
+
\*當代理通告 `loadSession` 功能時恢復工作並且
|
|
89
|
+
否則將降級為新工作階段。
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
import {
|
|
93
|
+
registerBuiltinAgentHarnesses,
|
|
94
|
+
resolveAgentHarness,
|
|
95
|
+
} from "@agent-native/core/agent/harness";
|
|
96
|
+
|
|
97
|
+
registerBuiltinAgentHarnesses();
|
|
98
|
+
|
|
99
|
+
// A built-in preset (command/args are overridable through the resolve config):
|
|
100
|
+
const adapter = resolveAgentHarness("acp:gemini");
|
|
101
|
+
|
|
102
|
+
// Or any ACP agent by command:
|
|
103
|
+
const custom = resolveAgentHarness("acp", {
|
|
104
|
+
command: "gemini",
|
|
105
|
+
args: ["--experimental-acp"],
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
協議傳輸(`@zed-industries/agent-client-protocol`)是可選的
|
|
110
|
+
通過`installPackage`提示延遲載入依賴,就像AI SDK一樣
|
|
111
|
+
安全帶。代理二進制檔案本身(`@google/gemini-cli`,
|
|
112
|
+
`@zed-industries/claude-code-acp`, …) 是一個單獨的外部 CLI;預設
|
|
113
|
+
通過 `npx` 啟動它,並且指令/參數保持可重寫,因為代理 ACP
|
|
114
|
+
入口標志仍在演變。
|
|
115
|
+
|
|
116
|
+
`permissionMode` 使用工具調用對應到 ACP `session/request_permission`
|
|
117
|
+
設定代理報告:讀取始終執行,編輯在 `allow-edits` 下執行,以及
|
|
118
|
+
一切有風險的提示,除非`allow-all`。批準表面正常
|
|
119
|
+
`approval-request` 事件。該適配器服務於 `fs/read_text_file` 和
|
|
120
|
+
`fs/write_text_file` 針對工作階段工作區(拒絕逃逸路徑
|
|
121
|
+
it) 並寫入發出 `file-change` 事件;終端方法未公布,
|
|
122
|
+
因此代理使用自己的 shell。
|
|
123
|
+
|
|
124
|
+
## Codex 驗證:程式碼 UI 與 Harness 沙箱 {#codex-auth}
|
|
125
|
+
|
|
126
|
+
有兩個 Codex 表面,它們的驗證方式不同:
|
|
127
|
+
|
|
128
|
+
- **Agent-Native 程式碼/桌面** 在使用者計算機上執行 `codex exec`。如果
|
|
129
|
+
使用者已執行`codex login`,此本機執行重用任何ChatGPT
|
|
130
|
+
通過訂閱或API金鑰驗證已安裝的Codex CLI報告
|
|
131
|
+
`codex login status`.
|
|
132
|
+
- **`ai-sdk-harness:codex`**載入`@ai-sdk/harness-codex`,它驅動Codex
|
|
133
|
+
通過 `@openai/codex-sdk` 進入線束沙箱。它不會默默地
|
|
134
|
+
繼承使用者的桌面 `~/.codex` 登入名,因為沙箱可能是遠端的
|
|
135
|
+
或孤立。對於可信/私人沙箱,請選取使用 `codexCliAuth: true`;
|
|
136
|
+
Agent-Native 將本機 Codex CLI auth 檔案複製到沙箱中
|
|
137
|
+
安全帶啟動。對於託管或共用沙箱,設定 API-key / gateway
|
|
138
|
+
改為驗證。
|
|
139
|
+
|
|
140
|
+
因此,如果有人詢問哪個包帶有 Codex OAuth 路徑:用於本機編碼
|
|
141
|
+
工作階段,使用`@agent-native/core` /桌面加上已安裝的
|
|
142
|
+
`@openai/codex` CLI 和 `codex login`。對於沙盒 `ai-sdk-harness:codex`,
|
|
143
|
+
將登入資訊複製到沙箱時使用顯式 `codexCliAuth` 選取加入
|
|
144
|
+
可以接受。
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
const adapter = resolveAgentHarness("ai-sdk-harness:codex", {
|
|
148
|
+
codexCliAuth: true,
|
|
149
|
+
});
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
`codexCliAuth: true` 讀取為 `CODEX_HOME/auth.json` 或 `~/.codex/auth.json`。至
|
|
153
|
+
指向不同的本機登入,通過
|
|
154
|
+
`{ codexCliAuth: { codexHome: "/path/to/.codex" } }` 或
|
|
155
|
+
`{ codexCliAuth: { authJsonPath: "/path/to/auth.json" } }`.
|
|
156
|
+
|
|
157
|
+
## 註冊並解析 {#register-resolve}
|
|
158
|
+
|
|
159
|
+
```ts
|
|
160
|
+
import {
|
|
161
|
+
registerBuiltinAgentHarnesses,
|
|
162
|
+
resolveAgentHarness,
|
|
163
|
+
} from "@agent-native/core/agent/harness";
|
|
164
|
+
|
|
165
|
+
registerBuiltinAgentHarnesses();
|
|
166
|
+
const adapter = resolveAgentHarness("ai-sdk-harness:codex");
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
`resolveAgentHarness(name, config?)` 返回 `AgentHarnessAdapter`。
|
|
170
|
+
可選的 `config` 被轉發到適配器工廠 - 用於 AI SDK 適配器
|
|
171
|
+
對應到 `AiSdkHarnessAdapterOptions`(`label`、`description`,
|
|
172
|
+
僅 `permissionMode`、`harnessOptions`、`agentOptions` 和 Codex
|
|
173
|
+
`codexCliAuth`)。使用`listAgentHarnesses()`枚舉註冊的內容
|
|
174
|
+
一個選取器。
|
|
175
|
+
|
|
176
|
+
## 跑一圈 {#run-a-turn}
|
|
177
|
+
|
|
178
|
+
`startAgentHarnessRun` 將線束工作階段橋接到共用執行管理器
|
|
179
|
+
生命週期。它建立(或重用)本機工作階段,保留它,流式傳輸
|
|
180
|
+
turn,將每個線束事件轉換為轉錄事件,並分離
|
|
181
|
+
回合完成時可恢復狀態。
|
|
182
|
+
|
|
183
|
+
```ts
|
|
184
|
+
import { startAgentHarnessRun } from "@agent-native/core/agent/harness";
|
|
185
|
+
|
|
186
|
+
const run = startAgentHarnessRun({
|
|
187
|
+
runId,
|
|
188
|
+
threadId,
|
|
189
|
+
adapter,
|
|
190
|
+
input: { prompt },
|
|
191
|
+
createSession: {
|
|
192
|
+
sessionId,
|
|
193
|
+
resumeState, // opaque value from a previous turn, if resuming
|
|
194
|
+
instructions,
|
|
195
|
+
sandbox, // required for sandboxed harnesses — see Sandbox Adapters
|
|
196
|
+
permissionMode: "allow-reads",
|
|
197
|
+
tools, // a narrow, intentional set of host tools (see below)
|
|
198
|
+
},
|
|
199
|
+
ownerEmail,
|
|
200
|
+
orgId,
|
|
201
|
+
});
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
`startAgentHarnessRun`從執行管理器返回`ActiveRun`,所以輪到
|
|
205
|
+
通過現有的跑步路線、成績單和取消顯示,就像
|
|
206
|
+
任何其他代理執行。傳遞已經建立的 `session` 而不是 `createSession`
|
|
207
|
+
繼續您在內存中儲存的工作階段。
|
|
208
|
+
|
|
209
|
+
## 會議和簡歷 {#sessions}
|
|
210
|
+
|
|
211
|
+
線束擁有長期存在的本機工作階段狀態。 Agent-Native 將其保留在 SQL
|
|
212
|
+
因此線程可以在輪流、進程和部署中生存。 `resumeState`
|
|
213
|
+
是**不透明** - Agent-Native 存儲它並將其返還,但從不檢查或
|
|
214
|
+
解釋它。
|
|
215
|
+
|
|
216
|
+
```an-diagram title="跨回合、流程和部署恢復" summary="每一輪都會將一個不透明的resumeState分離到SQL中;下一回合將其意見回饋到 createSession 而不是重播聊天紀錄。"
|
|
217
|
+
{
|
|
218
|
+
"html": "<div class=\"diagram-resume\"><div class=\"diagram-node\" data-rough>第 N 輪<br><small class=\"diagram-muted\">streamTurn</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">→</div><div class=\"diagram-box\" data-rough>detach → resumeState<br><small class=\"diagram-muted\">不透明 · SQL harness 工作階段</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">→</div><div class=\"diagram-node\" data-rough>第 N+1 輪<br><small class=\"diagram-muted\">createSession.resumeState</small></div></div>",
|
|
219
|
+
"css": ".diagram-resume{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.diagram-resume .diagram-arrow{font-size:22px;line-height:1}"
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
```ts
|
|
224
|
+
import {
|
|
225
|
+
getLatestAgentHarnessSessionForThread,
|
|
226
|
+
listAgentHarnessSessions,
|
|
227
|
+
} from "@agent-native/core/agent/harness";
|
|
228
|
+
|
|
229
|
+
const last = await getLatestAgentHarnessSessionForThread(threadId);
|
|
230
|
+
// Feed last?.resumeState into createSession.resumeState on the next turn.
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
商店還公開了`saveAgentHarnessSession`、`updateAgentHarnessSession`,
|
|
234
|
+
`getAgentHarnessSession`, `getAgentHarnessSessionByRunId`,
|
|
235
|
+
`markAgentHarnessSessionStopped` 和 `ensureAgentHarnessSessionTables`。
|
|
236
|
+
`startAgentHarnessRun` 為您調用儲存/更新/停止路徑;伸手去夠他們
|
|
237
|
+
僅直接在自訂主機中。
|
|
238
|
+
|
|
239
|
+
## 託管工具和權限 {#host-tools}
|
|
240
|
+
|
|
241
|
+
線束帶有自己的本機工具(讀取、編輯、寫入、shell 等),因此
|
|
242
|
+
您**不**將檔案編輯重新公開為主機工具。僅通過**狹窄,
|
|
243
|
+
當您通過 `createSession.tools` 有意設定** Agent-Native actions
|
|
244
|
+
希望該工具能夠實現特定的應用操作 - 並保留 `defineAction`
|
|
245
|
+
驗證、請求上下文、超時、截斷和唯讀元資料完好無損
|
|
246
|
+
你知道。
|
|
247
|
+
|
|
248
|
+
`permissionMode` 控制安全帶在未經批準的情況下可以執行的操作:
|
|
249
|
+
|
|
250
|
+
| 模式 | 含義 |
|
|
251
|
+
| ------------- | ----------------------------------------- |
|
|
252
|
+
| `allow-reads` | 預設。讀取執行;編輯和有風險的actions提示 |
|
|
253
|
+
| `allow-edits` | 讀取和編輯執行;其他有風險actions提示 |
|
|
254
|
+
| `allow-all` | 無審批門控 |
|
|
255
|
+
|
|
256
|
+
當線束暫停等待批準時,它會發出 `approval-request` 事件,並且
|
|
257
|
+
工作階段標記為 `idle`,並紀錄待批準,因此 UI 可以
|
|
258
|
+
將其浮出水面並根據使用者的決定繼續。請參閱
|
|
259
|
+
[Human Approval](/docs/human-approval) 為批準表面。
|
|
260
|
+
|
|
261
|
+
## 活動 {#events}
|
|
262
|
+
|
|
263
|
+
線束工作階段流式傳輸 `AgentHarnessEvent` 值,其中 Agent-Native
|
|
264
|
+
轉換為標準 `AgentChatEvent` 流
|
|
265
|
+
`agentHarnessEventToAgentChatEvents`。事件聯盟覆蓋`text-delta`,
|
|
266
|
+
`thinking-delta`、`activity`、`tool-start`、`tool-done`(可攜帶
|
|
267
|
+
`mcpApp` 原生小部件的負載)、`approval-request`、`file-change`,
|
|
268
|
+
`compaction`、`usage`、`error` 和 `done`。因為工具結果流經
|
|
269
|
+
相同的翻譯,動作聲明的本機小部件仍然呈現 - 請參閱
|
|
270
|
+
[Native 聊天介面](/docs/native-chat-ui).
|
|
271
|
+
|
|
272
|
+
## 後台執行和UI {#background-runs}
|
|
273
|
+
|
|
274
|
+
Harness 將專案執行到共用的 `BackgroundAgentRun` 形狀中
|
|
275
|
+
`createAgentHarnessBackgroundAgentController()` 並可通過
|
|
276
|
+
現有執行路線為`goalId=agent-harness`。這意味著長期執行的 Claude
|
|
277
|
+
程式碼或 Codex 工作階段出現在相同的後台執行和轉錄表面中
|
|
278
|
+
作為代理團隊和其他適配器,使用 `listAgentHarnessBackgroundRuns`,
|
|
279
|
+
`listAgentHarnessBackgroundTranscriptEvents`、`getAgentHarnessBackgroundRun` 和
|
|
280
|
+
`stopAgentHarnessBackgroundRun` 可用於自訂主機。
|
|
281
|
+
|
|
282
|
+
## 自訂適配器 {#custom-adapters}
|
|
283
|
+
|
|
284
|
+
要包裝不是內置函數之一的執行時,請實現
|
|
285
|
+
`AgentHarnessAdapter` 並註冊它。適配器聲明其功能並且
|
|
286
|
+
建立工作階段;工作階段公開 `streamTurn` 和可選的 `continueTurn`,
|
|
287
|
+
`approve`、`detach`、`stop` 和 `destroy`。
|
|
288
|
+
|
|
289
|
+
```ts
|
|
290
|
+
import {
|
|
291
|
+
registerAgentHarness,
|
|
292
|
+
type AgentHarnessAdapter,
|
|
293
|
+
} from "@agent-native/core/agent/harness";
|
|
294
|
+
|
|
295
|
+
const myHarness: AgentHarnessAdapter = {
|
|
296
|
+
name: "acme:my-coder",
|
|
297
|
+
label: "Acme Coder",
|
|
298
|
+
description: "Runs the Acme coding agent.",
|
|
299
|
+
installPackage: "@acme/coder",
|
|
300
|
+
capabilities: {
|
|
301
|
+
sandbox: true,
|
|
302
|
+
resumable: true,
|
|
303
|
+
approvals: true,
|
|
304
|
+
hostTools: true,
|
|
305
|
+
fileEvents: true,
|
|
306
|
+
},
|
|
307
|
+
async createSession(opts) {
|
|
308
|
+
// Build your native session and adapt it to AgentHarnessSession.
|
|
309
|
+
return createAcmeSession(opts);
|
|
310
|
+
},
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
registerAgentHarness({
|
|
314
|
+
name: myHarness.name,
|
|
315
|
+
label: myHarness.label,
|
|
316
|
+
description: myHarness.description,
|
|
317
|
+
installPackage: myHarness.installPackage,
|
|
318
|
+
capabilities: myHarness.capabilities,
|
|
319
|
+
create: () => myHarness,
|
|
320
|
+
});
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
通過 `createSession` 中的動態匯入和一個
|
|
324
|
+
`installPackage` 提示。對於橋支持的編碼線束,需要真正的
|
|
325
|
+
沙箱/工作區提供程序,而不是在中執行任意編碼代理
|
|
326
|
+
主機進程 - 請參閱 [Sandbox Adapters](/docs/sandbox-adapters)。 AI SDK適配器
|
|
327
|
+
(`createAiSdkHarnessAdapter`,由 `@ai-sdk/harness` 的 `HarnessAgent` 支持)是
|
|
328
|
+
此合約的一個實現,而不是公開抽象。
|
|
329
|
+
|
|
330
|
+
## 不要 {#donts}
|
|
331
|
+
|
|
332
|
+
- 請勿將 Claude 程式碼、Codex、光標、Mastra 或 Pi 新增為 `AgentEngine`。他們
|
|
333
|
+
擁有自己的循環;在 `AgentEngine.stream()` 下執行一個雙執行循環
|
|
334
|
+
並丟失工作階段生命週期語義。
|
|
335
|
+
- 不要每回合將完整的 Agent-Native 聊天歷史紀錄重播到安全帶中。簡歷
|
|
336
|
+
使用 `resumeState` 的線束工作階段。
|
|
337
|
+
- 不要將`resumeState`存儲在`application_state`中。它屬於安全帶
|
|
338
|
+
工作階段 SQL 表。
|
|
339
|
+
- 預設情況下,不要將每個應用操作公開給每個線束工作階段。遞給它
|
|
340
|
+
小型、專用工具集。
|
|
341
|
+
|
|
342
|
+
## 相關檔案 {#related-docs}
|
|
343
|
+
|
|
344
|
+
- [Native 聊天介面](/docs/native-chat-ui) — 將您自己的代理置於 UI 與 `AgentChatRuntime` 的聊天後面。
|
|
345
|
+
- [Agent Surfaces](/docs/agent-surfaces) — 選取無頭、聊天、邊車或完整應用。
|
|
346
|
+
- [Agent-Native Code UI](/docs/code-agents-ui) — 可重用的編碼工作區表面。
|
|
347
|
+
- [Custom Agents & Teams](/docs/agent-teams) — 後台執行和子代理委派。
|
|
348
|
+
- [Sandbox Adapters](/docs/sandbox-adapters) — 用於編碼工具的可插入執行後端。
|
|
349
|
+
- [Human Approval](/docs/human-approval) — 批準表面線束執行使用。
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "人在環批準"
|
|
3
|
+
description: "在高後果操作執行之前暫停代理 - defineAction 的 needApproval 門會發出一個approval_required 事件,人工批準,然後工具才會執行。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 人在環批準
|
|
7
|
+
|
|
8
|
+
大多數 actions 應該直接執行。其中一些操作(發送電子郵件、為卡充值、刪除帳戶)是面向外部且難以撤消的,您不希望代理自主執行這些操作。對於這些,`defineAction` 有一個選取加入的**批準門**:當代理嘗試調用該操作時,循環會暫停,向人類顯示批準/拒絕功能,並*僅*在人類批準該特定調用後才執行該操作。
|
|
9
|
+
|
|
10
|
+
> [!WARNING]
|
|
11
|
+
> 保持很少的批準。每個門控操作都是代理循環中的硬停止——它會中斷執行並需要人工往返。僅將 `needsApproval` 用於真正後果嚴重、難以撤銷、面向外的操作。如果您發現自己對讀取或例行寫入進行門控,那么您就錯了。預設為**關閉**,幾乎每個操作都應將其關閉。
|
|
12
|
+
|
|
13
|
+
## `needsApproval` 門 {#needs-approval}
|
|
14
|
+
|
|
15
|
+
在 `defineAction` 上設定 `needsApproval`。它接受布爾值或謂詞:
|
|
16
|
+
|
|
17
|
+
```an-annotated-code title="限制一項後果性行動"
|
|
18
|
+
{
|
|
19
|
+
"filename": "actions/send-email.ts",
|
|
20
|
+
"language": "ts",
|
|
21
|
+
"code": "export default defineAction({\n description: \"Send an email via Gmail.\",\n schema: z.object({\n to: z.string(),\n subject: z.string(),\n body: z.string(),\n }),\n // Sending is outward-facing and hard to undo, so the agent can never send\n // without a human approving the specific call. Drafting/queueing is\n // unaffected — only the real send is gated.\n needsApproval: true,\n run: async (args) => {\n /* ...actually send... */\n },\n});",
|
|
22
|
+
"annotations": [
|
|
23
|
+
{ "lines": "10", "label": "整個大門", "note": "一面旗帜。當它為真且調用未獲批準時,循環會在 `run` 之前停止 - 模型本身永遠不會達到副作用。" },
|
|
24
|
+
{ "lines": "11-13", "label": "run() is untouched", "note": "處理程序保持不變。批準是由其週圍的循環強制執行的,而不是由 `run` 內的任何內容強制執行。" }
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- **`needsApproval: true`** — 始終需要批準。
|
|
30
|
+
- **`needsApproval: (args, ctx) => boolean | Promise<boolean>`** — 僅當謂詞返回 true 時才需要批準。有條件地選取門,例如僅適用於外部收件人或僅高於美元閾值:
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
needsApproval: (args) => !args.to.endsWith("@your-company.com"),
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
保持謂詞純粹且快速。 **關閉失敗**:如果謂詞拋出異常,框架會將其視為“需要批準”,而不是默默地執行後果嚴重的操作。
|
|
37
|
+
|
|
38
|
+
當 `needsApproval` 被省略時,行為是逐字節不變的——公開路徑上沒有額外的成本。
|
|
39
|
+
|
|
40
|
+
這對於舊版 `parameters` 樣式的 actions 和基於架構的 actions,以及應用內代理、子代理、A2A 和 MCP 調用者(每個代理通過同一循環進行表面路由)的工作原理相同。
|
|
41
|
+
|
|
42
|
+
## 循環如何暫停 {#loop}
|
|
43
|
+
|
|
44
|
+
當代理調用門控操作並且此特定調用尚未獲得批準時,循環不會執行 `run()`。相反,它:
|
|
45
|
+
|
|
46
|
+
1. 解析門。對於謂詞,它調用`needsApproval(input, ctx)`;拋出被視為“必須批準”(失敗關閉)。
|
|
47
|
+
2. 發出 `tool_start` 事件(以便 UI 顯示呼叫),然後立即發出 **`approval_required`** 事件,然後停止轉彎。該操作的副作用永遠不會發生。
|
|
48
|
+
|
|
49
|
+
`approval_required` 事件包含用戶端呈現可供性所需的一切:
|
|
50
|
+
|
|
51
|
+
| 欄位 | 型別 | 注釋 |
|
|
52
|
+
| ------------- | -------- | -------------------------------------------- |
|
|
53
|
+
| `tool` | `string` | 代理嘗試調用的操作名稱。 |
|
|
54
|
+
| `input` | 物件 | 代理傳遞的參數。 |
|
|
55
|
+
| `approvalKey` | `string` | **穩定金鑰**用戶端回顯以批準*此確切的調用*。 |
|
|
56
|
+
| `toolCallId` | `string` | 模型端工具調用 ID(如果可用)。 |
|
|
57
|
+
|
|
58
|
+
`approvalKey` 是根據工具名稱及其輸入確定性派生的,因此相同的邏輯調用始終會生成相同的金鑰。模型永遠不會看到或設定它 - 它純粹是框架和人類的批準功能之間的握手。
|
|
59
|
+
|
|
60
|
+
暫停工具返回一個結果,告訴模型轉動已暫停並且不再重試,因此模型不會旋轉。
|
|
61
|
+
|
|
62
|
+
## 人類如何認可 {#approve}
|
|
63
|
+
|
|
64
|
+
在 `approval_required` 上,聊天 UI 在暫停的工具調用上呈現 **批準/拒絕** 提示。這是在 `AssistantChat` 中自動連線的 - 您無需根據範本建置它。
|
|
65
|
+
|
|
66
|
+
- **批準**重新發出在 `approvedToolCalls: [approvalKey]` 中攜帶呼叫金鑰的輪次(普通的繼續訊息)。在重新發出的回合中,門會看到已批準的集合中的金鑰,並讓特定的調用正常執行。
|
|
67
|
+
- **Deny** 在本機消除可供性;沒有重新發出任何內容,因此該操作永遠不會執行。
|
|
68
|
+
|
|
69
|
+
`approvedToolCalls` 是聊天請求 (`AgentChatRequest.approvedToolCalls`) 上的欄位。其中不存在的金鑰將保持暫停狀態 - 批準一個呼叫永遠不會茫然地批準其他呼叫。因為金鑰是內容尋址的,所以批準授權*使用這些參數進行調用*;如果模型稍後建議不同的發送,那就是新的金鑰和新的批準。
|
|
70
|
+
|
|
71
|
+
## 端對端 {#flow}
|
|
72
|
+
|
|
73
|
+
```an-diagram title="審批中斷" summary="門控調用會在 run() 觸發之前暫停回合。批準重新發出攜帶呼叫金鑰的回合;只有這樣,副作用才會發生。"
|
|
74
|
+
{
|
|
75
|
+
"html": "<div class=\"diagram-approve\"><div class=\"diagram-box\" data-rough>代理調用 send-email</div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">↓</div><div class=\"diagram-panel warn\" data-rough><strong>Gate 為真,調用尚未批準</strong><small class=\"diagram-muted\">loop emits tool_start + approval_required { tool, input, approvalKey }</small><span class=\"diagram-pill warn\">turn pauses — run() did NOT execute</span></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">↓</div><div class=\"diagram-box\" data-rough>人在聊天中點擊批準<br><small class=\"diagram-muted\">用戶端用 approvedToolCalls: [approvalKey] 重新發起本輪</small></div><div class=\"diagram-arrow diagram-muted\" aria-hidden=\"true\">↓</div><div class=\"diagram-panel ok\" data-rough><span class=\"diagram-pill ok\">Gate sees the key → run() executes → email sends</span></div></div>",
|
|
76
|
+
"css": ".diagram-approve{display:flex;flex-direction:column;align-items:center;gap:8px}.diagram-approve .diagram-panel{display:flex;flex-direction:column;gap:6px;align-items:center;padding:12px 16px;text-align:center}.diagram-approve .diagram-arrow{font-size:22px;line-height:1}"
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
在框架中此門的典型(並且故意很少)使用是郵件範本的 `send-email` 操作,該操作設定 `needsApproval: true`,以便代理可以自由起草和排隊,但在沒有人工批準特定發送的情況下永遠無法實際發送訊息。
|
|
81
|
+
|
|
82
|
+
## 相關
|
|
83
|
+
|
|
84
|
+
- [**Actions**](/docs/actions#needs-approval) — 完整的 `defineAction` 表面,包括用於驗證返回值的 `outputSchema`。
|
|
85
|
+
- [**Security**](/docs/security) - 何時達到批準門與向模型隱藏操作。
|
|
86
|
+
- [**Mail template**](/docs/template-mail) — `send-email` 是參考範例。
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "國際化"
|
|
3
|
+
description: "使用共用區域設定目錄、語言選取器、瀏覽器語言回退和區域設定感知檔案內容本機化 Agent Native 應用。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 國際化
|
|
7
|
+
|
|
8
|
+
Agent Native應用程式可以通過共用本機化框架和範本UI
|
|
9
|
+
`@agent-native/core/client/i18n` 執行時。框架存儲使用者的
|
|
10
|
+
SQL 設定中的語言選取,將其公開為 actions,並回退到
|
|
11
|
+
當應用尚未翻譯字串時為英語。
|
|
12
|
+
|
|
13
|
+
## 執行時
|
|
14
|
+
|
|
15
|
+
通過`AppProviders`使用提供者:
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import { AppProviders, getLocaleInitScript } from "@agent-native/core/client";
|
|
19
|
+
import { i18nCatalog } from "./i18n";
|
|
20
|
+
|
|
21
|
+
const LOCALE_INIT_SCRIPT = getLocaleInitScript();
|
|
22
|
+
|
|
23
|
+
<script
|
|
24
|
+
data-agent-native-locale-init
|
|
25
|
+
dangerouslySetInnerHTML={{ __html: LOCALE_INIT_SCRIPT }}
|
|
26
|
+
/>;
|
|
27
|
+
|
|
28
|
+
<AppProviders queryClient={queryClient} i18n={{ catalog: i18nCatalog }}>
|
|
29
|
+
<Outlet />
|
|
30
|
+
</AppProviders>;
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`getLocaleInitScript()` 設定初始 `lang`、`dir` 和
|
|
34
|
+
`window.__AGENT_NATIVE_LOCALE__` 在 React 水合之前。公開SSR路線可以
|
|
35
|
+
從`@agent-native/core/server`調用`resolveLocaleFromRequest()`並傳遞
|
|
36
|
+
將區域設定/目錄解析到該腳本中以避免水合不匹配。
|
|
37
|
+
|
|
38
|
+
## 目錄
|
|
39
|
+
|
|
40
|
+
每個本機化範本都將目錄儲存在 `app/i18n/` 下:
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
// app/i18n/index.ts
|
|
44
|
+
import enUS from "./en-US";
|
|
45
|
+
import type { AgentNativeI18nCatalog } from "@agent-native/core/client";
|
|
46
|
+
|
|
47
|
+
export const i18nCatalog = {
|
|
48
|
+
sourceLocale: "en-US",
|
|
49
|
+
messages: enUS,
|
|
50
|
+
loadMessages: async (locale) => {
|
|
51
|
+
switch (locale) {
|
|
52
|
+
case "zh-CN":
|
|
53
|
+
return (await import("./zh-CN")).default;
|
|
54
|
+
default:
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
} satisfies AgentNativeI18nCatalog;
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
始終捆綁 `en-US`。動態匯入非英語目錄,僅限使用者
|
|
62
|
+
下載活動區域設定。支援的區域設定程式碼為 `en-US`、`zh-CN`、
|
|
63
|
+
`es-ES`、`fr-FR`、`de-DE`、`ja-JP`、`ko-KR`、`pt-BR`、`hi-IN` 和 `ar-SA`。
|
|
64
|
+
|
|
65
|
+
## UI
|
|
66
|
+
|
|
67
|
+
使用 `useT()` 作為介面字串,並將 `<LanguagePicker />` 放在應用程式的
|
|
68
|
+
`/settings` 頁面。側邊欄應用程式應在應用程式側邊欄中公開**設定**;
|
|
69
|
+
標題語言圖標只是一個快捷方式。
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
import {
|
|
73
|
+
LanguagePicker,
|
|
74
|
+
openAgentSettings,
|
|
75
|
+
useT,
|
|
76
|
+
} from "@agent-native/core/client";
|
|
77
|
+
|
|
78
|
+
function SettingsPage() {
|
|
79
|
+
const t = useT();
|
|
80
|
+
return (
|
|
81
|
+
<>
|
|
82
|
+
<h2>{t("settings.languageTitle")}</h2>
|
|
83
|
+
<LanguagePicker label={t("settings.languageLabel")} />
|
|
84
|
+
|
|
85
|
+
<h2>{t("settings.agentTitle")}</h2>
|
|
86
|
+
<p>{t("settings.agentDescription")}</p>
|
|
87
|
+
<button type="button" onClick={() => openAgentSettings()}>
|
|
88
|
+
{t("settings.openAgentSettings")}
|
|
89
|
+
</button>
|
|
90
|
+
</>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
“代理設定”控件應開啟右側代理側邊欄的“設定”分頁
|
|
96
|
+
用於模型、API 按鍵、自動化、語音和其他框架級控件。
|
|
97
|
+
應用可能會在自己的設定頁面中複製高價值的框架設定
|
|
98
|
+
當設定是應用程式的核心,但側邊欄設定分頁仍然是
|
|
99
|
+
事實來源。
|
|
100
|
+
|
|
101
|
+
使用 `useFormatters()` 表示日期、數字、相對時間和列表。不要放
|
|
102
|
+
翻譯字串中區域設定敏感的日期/數字格式。
|
|
103
|
+
|
|
104
|
+
## 檔案網站內容 {#docs-site-content}
|
|
105
|
+
|
|
106
|
+
公開檔案頁面使用相同的核心提供程序,但具有
|
|
107
|
+
`persistPreference={false}` 因此匿名檔案流量使用 localStorage 和
|
|
108
|
+
瀏覽器語言而不是 SQL 設定 actions。英文來源程式碼保留在
|
|
109
|
+
`packages/core/docs/content/*.md`。本機化頁面覆蓋其旁邊的實時頁面
|
|
110
|
+
`packages/core/docs/content/locales/<locale>/<slug>.md`.
|
|
111
|
+
|
|
112
|
+
使用與應用程式目錄相同的 BCP-47 區域設定程式碼。保留與
|
|
113
|
+
英文來源,在翻譯的標題上使用 `{#anchor}` 保留穩定的錨點,
|
|
114
|
+
並留下路由、操作名稱、協議欄位、環境變數和提供程序名稱
|
|
115
|
+
未翻譯。如果某個語言環境沒有為頁面翻譯 Markdown,則檔案站點
|
|
116
|
+
該頁面恢復為英語,同時仍本機化導覽和 Chrome。
|
|
117
|
+
|
|
118
|
+
Docs Markdown 可能包含結構化的 `an-*` 可視塊。請在合理時翻譯其中面向使用者的文本欄位,例如 file-tree 標題和 `entries[].note`、callout 內文、tab 標籤以及 annotated-code 的 labels/notes。保持穩定標識符不變:檔案名、路徑、env vars、路由字串、action 名稱、language tags、程式碼片段、JSON keys 和協議名稱。
|
|
119
|
+
|
|
120
|
+
## Actions和堅持
|
|
121
|
+
|
|
122
|
+
每個應用程式都會繼承:
|
|
123
|
+
|
|
124
|
+
- `get-localization-preference` — 讀取目前使用者的`{ locale }`
|
|
125
|
+
- `set-localization-preference` — 設定 `"system"` 或支援的區域設定
|
|
126
|
+
|
|
127
|
+
持久值存在於 `localization` 下的使用者範圍 SQL 設定中。
|
|
128
|
+
`localStorage` 僅用於預水合和匿名回退。主動
|
|
129
|
+
區域設定作為環境上下文鏡像到應用程式狀態中,以便代理可以看到
|
|
130
|
+
目前介面語言。
|
|
131
|
+
|
|
132
|
+
## 守衛
|
|
133
|
+
|
|
134
|
+
執行:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
pnpm guard:i18n-catalogs
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
守衛驗證支援的區域設定檔案名、金鑰對等、預留位置對等,
|
|
141
|
+
過時的金鑰,以及 CLDR 複數類別到 `Intl.PluralRules`。它檢查
|
|
142
|
+
結構,而不是翻譯品質;高可見度字串仍然需要人類
|
|
143
|
+
審查。
|
|
144
|
+
|
|
145
|
+
不要翻譯穩定的標識符,例如操作名稱、路由、枚舉值,
|
|
146
|
+
應用程式狀態鍵、資料庫值、協議欄位、環境變數名稱或提供程序
|
|
147
|
+
名字。
|