@agent-native/core 0.98.4 → 0.98.6
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 +28 -0
- package/corpus/core/docs/content/durable-background-runs.mdx +37 -0
- package/corpus/core/docs/content/external-agents.mdx +62 -7
- package/corpus/core/docs/content/locales/ar-SA/external-agents.mdx +38 -7
- package/corpus/core/docs/content/locales/ar-SA/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/de-DE/external-agents.mdx +39 -7
- package/corpus/core/docs/content/locales/de-DE/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/es-ES/external-agents.mdx +39 -7
- package/corpus/core/docs/content/locales/es-ES/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/fr-FR/external-agents.mdx +39 -7
- package/corpus/core/docs/content/locales/fr-FR/tracking.mdx +4 -2
- package/corpus/core/docs/content/locales/hi-IN/external-agents.mdx +38 -7
- package/corpus/core/docs/content/locales/hi-IN/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/ja-JP/external-agents.mdx +38 -7
- package/corpus/core/docs/content/locales/ja-JP/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/ko-KR/external-agents.mdx +38 -7
- package/corpus/core/docs/content/locales/ko-KR/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/pt-BR/external-agents.mdx +39 -7
- package/corpus/core/docs/content/locales/pt-BR/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/zh-CN/external-agents.mdx +37 -7
- package/corpus/core/docs/content/locales/zh-CN/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/zh-TW/durable-background-runs.mdx +14 -0
- package/corpus/core/docs/content/locales/zh-TW/external-agents.mdx +37 -7
- package/corpus/core/docs/content/locales/zh-TW/tracking.mdx +2 -0
- package/corpus/core/docs/content/tracking.mdx +2 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/a2a/handlers.ts +95 -21
- package/corpus/core/src/a2a/task-store.ts +65 -3
- package/corpus/core/src/agent/durable-background.ts +16 -16
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +25 -8
- package/corpus/core/src/agent/engine/anthropic-engine.ts +17 -3
- package/corpus/core/src/agent/engine/output-tokens.ts +6 -6
- package/corpus/core/src/agent/production-agent.ts +200 -27
- package/corpus/core/src/agent/run-manager.ts +81 -1
- package/corpus/core/src/agent/run-store.ts +301 -41
- package/corpus/core/src/client/AgentPanel.tsx +6 -2
- package/corpus/core/src/client/AssistantChat.tsx +364 -69
- package/corpus/core/src/client/agent-chat-adapter.ts +169 -1
- package/corpus/core/src/client/chat/message-components.tsx +3 -0
- package/corpus/core/src/client/chat/tool-call-display.tsx +20 -36
- package/corpus/core/src/client/conversation/use-near-bottom-autoscroll.ts +7 -0
- package/corpus/core/src/client/extensions/AgentNativeExtensionFrame.tsx +2 -0
- package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +2 -0
- package/corpus/core/src/client/extensions/ExtensionEditor.tsx +9 -2
- package/corpus/core/src/client/extensions/ExtensionViewer.tsx +2 -0
- package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +2 -0
- package/corpus/core/src/client/extensions/portable-extension.ts +2 -0
- package/corpus/core/src/client/session-replay.ts +361 -29
- package/corpus/core/src/client/sse-event-processor.ts +43 -1
- package/corpus/core/src/demo/actions/toggle-demo-mode.ts +1 -1
- package/corpus/core/src/demo/config.ts +6 -6
- package/corpus/core/src/demo/fetch-interceptor.ts +13 -4
- package/corpus/core/src/demo/redact.ts +13 -149
- package/corpus/core/src/extensions/html-shell.ts +3 -0
- package/corpus/core/src/extensions/session-replay-iframe.ts +131 -0
- package/corpus/core/src/integrations/adapters/slack.ts +123 -13
- package/corpus/core/src/integrations/identity-links-store.ts +210 -0
- package/corpus/core/src/integrations/identity.ts +132 -0
- package/corpus/core/src/integrations/index.ts +6 -0
- package/corpus/core/src/integrations/plugin.ts +58 -1
- package/corpus/core/src/integrations/types.ts +7 -0
- package/corpus/core/src/mcp/build-server.ts +127 -22
- package/corpus/core/src/mcp/external-agent-policy.ts +18 -0
- package/corpus/core/src/mcp/index.ts +1 -0
- package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +1 -20
- package/corpus/core/src/server/agent-chat/plugin-options.ts +12 -1
- package/corpus/core/src/server/agent-chat/script-entries.ts +20 -3
- package/corpus/core/src/server/agent-chat-plugin.ts +3 -0
- package/corpus/core/src/session-replay-iframe-protocol.ts +58 -0
- package/corpus/core/src/shared/reasoning-effort.ts +35 -0
- package/corpus/core/src/styles/agent-conversation.css +26 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +34 -5
- package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
- package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +30 -21
- package/corpus/templates/analytics/AGENTS.md +27 -0
- package/corpus/templates/analytics/actions/create-session-replay-agent-link.ts +0 -1
- package/corpus/templates/analytics/actions/get-error-issue.ts +1 -0
- package/corpus/templates/analytics/actions/get-session-replay-summary.ts +1 -0
- package/corpus/templates/analytics/actions/get-session-replay-timeline.ts +40 -0
- package/corpus/templates/analytics/actions/list-error-issues.ts +13 -0
- package/corpus/templates/analytics/actions/list-session-recordings.ts +1 -0
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +4 -0
- package/corpus/templates/analytics/app/global.css +2 -2
- package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +41 -4
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +52 -203
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +69 -16
- package/corpus/templates/analytics/changelog/2026-07-12-analytics-chat-retries-before-showing-a-generic-no-data-mess.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-12-analytics-sessions-search-no-longer-loses-fast-keystrokes-an.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-12-chart-selection-respects-chat-state.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-12-connected-external-agents-can-now-look-up-sessions-error-iss.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-12-demo-mode-anonymizes-error-reporting-emails.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-12-session-identities-stay-visible-when-demo-mode-is-off.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-12-session-replays-show-iframe-content.md +6 -0
- package/corpus/templates/analytics/netlify.toml +0 -3
- package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +14 -0
- package/corpus/templates/analytics/server/lib/error-capture.ts +101 -2
- package/corpus/templates/analytics/server/lib/real-data-actions.ts +24 -0
- package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +49 -17
- package/corpus/templates/analytics/server/lib/session-replay.ts +18 -16
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +43 -6
- package/corpus/templates/analytics/server/plugins/db.ts +15 -0
- package/corpus/templates/assets/app/global.css +1 -1
- package/corpus/templates/brain/app/global.css +2 -2
- package/corpus/templates/brain/changelog/2026-07-12-fix-long-response-progress.md +6 -0
- package/corpus/templates/forms/app/components/CloudUpgrade.tsx +1 -1
- package/corpus/templates/forms/app/components/ThemeToggle.tsx +22 -6
- package/corpus/templates/forms/app/components/builder/FieldPropertiesPanel.tsx +5 -5
- package/corpus/templates/forms/app/components/builder/FieldRenderer.tsx +3 -3
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +16 -16
- package/corpus/templates/forms/app/global.css +164 -13
- package/corpus/templates/forms/app/pages/AskPage.tsx +35 -13
- package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +143 -67
- package/corpus/templates/forms/app/pages/FormFillPage.tsx +44 -11
- package/corpus/templates/forms/app/pages/FormsListPage.tsx +42 -24
- package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +28 -15
- package/corpus/templates/forms/app/pages/ResponsesPage.tsx +46 -20
- package/corpus/templates/forms/app/routes/_app.settings.tsx +1 -1
- package/corpus/templates/forms/changelog/2026-07-12-ask-forms-suggestions-now-sit-beneath-the-composer-for-a-tig.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-12-builder-response-tables-now-fill-the-view-without-a-redundan.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-12-form-builder-surfaces-are-calmer-fields-stay-stable-on-hover.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-12-response-tables-now-fill-the-available-pane-with-a-flexible-.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-12-smoother-more-tactile-controls-throughout-animated-icon-and-.md +6 -0
- package/corpus/templates/mail/AGENTS.md +3 -1
- package/corpus/templates/mail/app/components/email/EmailThread.tsx +21 -13
- package/corpus/templates/mail/app/components/email/email-iframe-document.ts +18 -0
- package/corpus/templates/mail/server/lib/mail-integrations.ts +3 -0
- package/dist/a2a/handlers.d.ts.map +1 -1
- package/dist/a2a/handlers.js +84 -15
- package/dist/a2a/handlers.js.map +1 -1
- package/dist/a2a/task-store.d.ts +20 -1
- package/dist/a2a/task-store.d.ts.map +1 -1
- package/dist/a2a/task-store.js +57 -4
- package/dist/a2a/task-store.js.map +1 -1
- package/dist/agent/durable-background.d.ts +10 -10
- package/dist/agent/durable-background.d.ts.map +1 -1
- package/dist/agent/durable-background.js +16 -16
- package/dist/agent/durable-background.js.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +19 -8
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +11 -3
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/output-tokens.js +6 -6
- package/dist/agent/engine/output-tokens.js.map +1 -1
- package/dist/agent/production-agent.d.ts +52 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +154 -26
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts +9 -0
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +71 -1
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +9 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +243 -48
- package/dist/agent/run-store.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +6 -2
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +21 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +298 -67
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +146 -1
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +2 -1
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +3 -1
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +13 -37
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/conversation/use-near-bottom-autoscroll.d.ts +1 -0
- package/dist/client/conversation/use-near-bottom-autoscroll.d.ts.map +1 -1
- package/dist/client/conversation/use-near-bottom-autoscroll.js +6 -0
- package/dist/client/conversation/use-near-bottom-autoscroll.js.map +1 -1
- package/dist/client/extensions/AgentNativeExtensionFrame.d.ts.map +1 -1
- package/dist/client/extensions/AgentNativeExtensionFrame.js +2 -1
- package/dist/client/extensions/AgentNativeExtensionFrame.js.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.js +2 -1
- package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
- package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionEditor.js +5 -2
- package/dist/client/extensions/ExtensionEditor.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +2 -1
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
- package/dist/client/extensions/InlineExtensionFrame.js +2 -1
- package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
- package/dist/client/extensions/portable-extension.d.ts.map +1 -1
- package/dist/client/extensions/portable-extension.js +2 -0
- package/dist/client/extensions/portable-extension.js.map +1 -1
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +308 -29
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +5 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +37 -1
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/demo/actions/toggle-demo-mode.js +1 -1
- package/dist/demo/actions/toggle-demo-mode.js.map +1 -1
- package/dist/demo/config.js +6 -6
- package/dist/demo/config.js.map +1 -1
- package/dist/demo/fetch-interceptor.d.ts.map +1 -1
- package/dist/demo/fetch-interceptor.js +13 -4
- package/dist/demo/fetch-interceptor.js.map +1 -1
- package/dist/demo/redact.d.ts +7 -7
- package/dist/demo/redact.d.ts.map +1 -1
- package/dist/demo/redact.js +8 -145
- package/dist/demo/redact.js.map +1 -1
- package/dist/extensions/html-shell.d.ts.map +1 -1
- package/dist/extensions/html-shell.js +2 -0
- package/dist/extensions/html-shell.js.map +1 -1
- package/dist/extensions/session-replay-iframe.d.ts +10 -0
- package/dist/extensions/session-replay-iframe.d.ts.map +1 -0
- package/dist/extensions/session-replay-iframe.js +121 -0
- package/dist/extensions/session-replay-iframe.js.map +1 -0
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/integrations/adapters/slack.d.ts.map +1 -1
- package/dist/integrations/adapters/slack.js +98 -13
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/integrations/identity-links-store.d.ts +23 -0
- package/dist/integrations/identity-links-store.d.ts.map +1 -0
- package/dist/integrations/identity-links-store.js +158 -0
- package/dist/integrations/identity-links-store.js.map +1 -0
- package/dist/integrations/identity.d.ts +11 -0
- package/dist/integrations/identity.d.ts.map +1 -0
- package/dist/integrations/identity.js +100 -0
- package/dist/integrations/identity.js.map +1 -0
- package/dist/integrations/index.d.ts +2 -0
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +2 -0
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +43 -1
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/types.d.ts +6 -0
- package/dist/integrations/types.d.ts.map +1 -1
- package/dist/integrations/types.js.map +1 -1
- package/dist/mcp/build-server.d.ts +9 -2
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js +97 -20
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/mcp/external-agent-policy.d.ts +19 -0
- package/dist/mcp/external-agent-policy.d.ts.map +1 -0
- package/dist/mcp/external-agent-policy.js +2 -0
- package/dist/mcp/external-agent-policy.js.map +1 -0
- package/dist/mcp/index.d.ts +1 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +1 -19
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/server/agent-chat/plugin-options.d.ts +11 -1
- package/dist/server/agent-chat/plugin-options.d.ts.map +1 -1
- package/dist/server/agent-chat/plugin-options.js.map +1 -1
- package/dist/server/agent-chat/script-entries.d.ts.map +1 -1
- package/dist/server/agent-chat/script-entries.js +16 -2
- package/dist/server/agent-chat/script-entries.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +3 -0
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/session-replay-iframe-protocol.d.ts +36 -0
- package/dist/session-replay-iframe-protocol.d.ts.map +1 -0
- package/dist/session-replay-iframe-protocol.js +24 -0
- package/dist/session-replay-iframe-protocol.js.map +1 -0
- package/dist/shared/reasoning-effort.d.ts +11 -0
- package/dist/shared/reasoning-effort.d.ts.map +1 -1
- package/dist/shared/reasoning-effort.js +36 -0
- package/dist/shared/reasoning-effort.js.map +1 -1
- package/dist/styles/agent-conversation.css +26 -0
- package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +34 -5
- package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
- package/docs/content/durable-background-runs.mdx +37 -0
- package/docs/content/external-agents.mdx +62 -7
- package/docs/content/locales/ar-SA/external-agents.mdx +38 -7
- package/docs/content/locales/ar-SA/tracking.mdx +2 -0
- package/docs/content/locales/de-DE/external-agents.mdx +39 -7
- package/docs/content/locales/de-DE/tracking.mdx +2 -0
- package/docs/content/locales/es-ES/external-agents.mdx +39 -7
- package/docs/content/locales/es-ES/tracking.mdx +2 -0
- package/docs/content/locales/fr-FR/external-agents.mdx +39 -7
- package/docs/content/locales/fr-FR/tracking.mdx +4 -2
- package/docs/content/locales/hi-IN/external-agents.mdx +38 -7
- package/docs/content/locales/hi-IN/tracking.mdx +2 -0
- package/docs/content/locales/ja-JP/external-agents.mdx +38 -7
- package/docs/content/locales/ja-JP/tracking.mdx +2 -0
- package/docs/content/locales/ko-KR/external-agents.mdx +38 -7
- package/docs/content/locales/ko-KR/tracking.mdx +2 -0
- package/docs/content/locales/pt-BR/external-agents.mdx +39 -7
- package/docs/content/locales/pt-BR/tracking.mdx +2 -0
- package/docs/content/locales/zh-CN/external-agents.mdx +37 -7
- package/docs/content/locales/zh-CN/tracking.mdx +2 -0
- package/docs/content/locales/zh-TW/durable-background-runs.mdx +14 -0
- package/docs/content/locales/zh-TW/external-agents.mdx +37 -7
- package/docs/content/locales/zh-TW/tracking.mdx +2 -0
- package/docs/content/tracking.mdx +2 -0
- package/package.json +2 -2
- package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +34 -5
- package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
- package/corpus/core/src/observability/hosted-model-experiment.ts +0 -118
- package/dist/observability/hosted-model-experiment.d.ts +0 -39
- package/dist/observability/hosted-model-experiment.d.ts.map +0 -1
- package/dist/observability/hosted-model-experiment.js +0 -90
- package/dist/observability/hosted-model-experiment.js.map +0 -1
|
@@ -325,8 +325,10 @@ Der MCP-Server stellt jedem Aufrufer standardmäßig einen kompakten Katalog ber
|
|
|
325
325
|
</div>
|
|
326
326
|
</div>
|
|
327
327
|
<p class="diagram-muted note">
|
|
328
|
-
<code>tool-search</code>
|
|
329
|
-
|
|
328
|
+
<code>tool-search</code> entdeckt Tools der vollständigen Stufe bei Bedarf;
|
|
329
|
+
der Connector-Katalog oder die Richtlinie für authentifizierte Lesezugriffe
|
|
330
|
+
muss die Ausführung weiterhin erlauben, sofern der Aufrufer nicht ausdrücklich
|
|
331
|
+
die vollständige Stufe gewählt hat.
|
|
330
332
|
</p>
|
|
331
333
|
```
|
|
332
334
|
|
|
@@ -364,15 +366,45 @@ Der MCP-Server stellt jedem Aufrufer standardmäßig einen kompakten Katalog ber
|
|
|
364
366
|
|
|
365
367
|
### Kompakt-/Connector-Stufe (Standard) {#connector-tier}
|
|
366
368
|
|
|
367
|
-
Standardmäßig sieht jeder verbundene Agent einen kleinen, kuratierten Katalog (ca. 20–30 Tools gegenüber ca. 105 in der gesamten Oberfläche):
|
|
369
|
+
Standardmäßig sieht jeder verbundene Agent einen kleinen, kuratierten Katalog (ca. 20–30 Tools gegenüber ca. 105 in der gesamten Oberfläche). Apps können entweder einen expliziten `connectorCatalog` pflegen oder die Richtlinie für authentifizierte Lesezugriffe aktivieren:
|
|
368
370
|
|
|
369
371
|
- **Von der Vorlage deklarierte App actions** – die sichere Zulassungsliste auf App-Ebene. Für den Plan sind das `create-visual-plan`, `get-visual-plan`, `share-resource`, `navigate`, `tool-search` und ähnliche.
|
|
370
372
|
- **Integrierte App-übergreifende Tools** – `list_apps`, `open_app`, `ask_app`, `create_embed_session`.
|
|
371
|
-
- **`tool-search`** ist immer vorhanden
|
|
373
|
+
- **`tool-search`** ist für die Erkennung immer vorhanden. Eine gefundene Action muss weiterhin im Connector-Katalog stehen, von der Richtlinie für authentifizierte Lesezugriffe erfasst oder über das explizite Opt-in für den vollständigen Katalog aktiviert sein, bevor `tools/call` sie ausführen kann.
|
|
372
374
|
|
|
373
|
-
Tools außerhalb der Liste – zum Beispiel `db-exec`, `seed-*`, die Erweiterungssuite, Browser-Sitzungstools und Kontext-Röntgentools – werden nicht angekündigt und Aufrufe an sie werden mit „Unbekanntes Tool“ abgelehnt, es sei denn, der Aufrufer hat sich für den vollständigen Katalog entschieden. Dies hält das Kontextfenster jedes verbundenen Agenten klein und entfernt Fußfeuerwaffen, die nur für die lokale Entwicklung mit einem Mandanten sicher sind.
|
|
375
|
+
Tools außerhalb der Liste – zum Beispiel `db-exec`, `seed-*`, die Erweiterungssuite, Browser-Sitzungstools und Kontext-Röntgentools – werden nicht angekündigt und Aufrufe an sie werden mit „Unbekanntes Tool“ abgelehnt, es sei denn, der Aufrufer hat sich für den vollständigen Katalog entschieden. Dies hält das Kontextfenster jedes verbundenen Agenten klein und entfernt Fußfeuerwaffen, die nur für die lokale Entwicklung mit einem Mandanten sicher sind.
|
|
374
376
|
|
|
375
|
-
`tool-search` funktioniert auf zwei Arten: Aufruf mit **
|
|
377
|
+
`tool-search` funktioniert auf zwei Arten: Aufruf mit **keiner Abfrage** für das vollständige Menü der Tool-Namen plus einzeilige Beschreibungen (günstig, keine Schemata) oder mit einer Abfrage für sortierte Treffer mit Parameterzusammenfassungen. Es hilft kompakten Clients, Funktionen zu entdecken; verwenden Sie `ask_app` für Aufgaben, die das umfassendere Schlussfolgern des App-Agenten oder einen Schreibvorgang benötigen.
|
|
378
|
+
|
|
379
|
+
#### Authentifizierte Lesezugriffe als Standard
|
|
380
|
+
|
|
381
|
+
Apps, deren direkte Lesetools ohne lange Zulassungsliste funktionieren sollen, können automatische authentifizierte Lesezugriffe aktivieren:
|
|
382
|
+
|
|
383
|
+
```ts
|
|
384
|
+
export default createAgentChatPlugin({
|
|
385
|
+
appId: "analytics",
|
|
386
|
+
externalAgents: {
|
|
387
|
+
authenticatedReads: "auto",
|
|
388
|
+
writes: "ask_app_only",
|
|
389
|
+
// Optionale zusätzliche Sperre für besonders sensible Lesezugriffe.
|
|
390
|
+
denyActions: ["get-sensitive-export"],
|
|
391
|
+
},
|
|
392
|
+
});
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
`authenticatedReads: "auto"` fügt nur Actions hinzu, die ausdrücklich alle folgenden Merkmale deklarieren:
|
|
396
|
+
|
|
397
|
+
- `http: { method: "GET" }`
|
|
398
|
+
- `readOnly: true`
|
|
399
|
+
- `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
|
|
400
|
+
|
|
401
|
+
Die Richtlinie kombiniert diese Actions mit expliziten `connectorCatalog`-Einträgen und wendet anschließend `denyActions` an. Mit `writes: "ask_app_only"` (dem Standard bei aktivierten automatischen Lesezugriffen) sind mutierende Tools nicht direkt aufrufbar; leiten Sie mehrstufige Arbeit und Mutationen über `ask_app`. `writes: "allowlisted"` ist nur für Apps vorgesehen, die bewusst eine explizite Schreib-Zulassungsliste pflegen.
|
|
402
|
+
|
|
403
|
+
Die Richtlinie ist authentifiziert, nicht anonym. Die MCP-OAuth-/Connect-Identität wird über `runWithRequestContext` weitergegeben, sodass Action-Zugriffsprüfungen, Eigentümer-/Organisationsbereiche und OAuth-Leseberechtigungen wirksam bleiben. Öffentliche oder nicht authentifizierte Actions werden nicht automatisch aufgenommen.
|
|
404
|
+
|
|
405
|
+
Core-`db-schema` und `db-query` werden nicht automatisch als externe Lesezugriffe veröffentlicht. Sie bleiben für den internen App-Agenten über den normalen, abgegrenzten SQL-Pfad verfügbar, aber ein breiter Schema-/SQL-Zugriff ist zu mächtig, um ihn allein aus Read-only-Metadaten abzuleiten. Benötigt eine App direkte externe Abfragen, muss sie eine eigene GET-Action mit Zugriffsprüfungen und festen Grenzen oder eine explizite Tabellen-/Spalten-Allowlist mit Zeilen-, Byte-, Zeit- und Audit-Limits bereitstellen. `db-exec` und `db-patch` bleiben außerhalb der automatischen Oberfläche.
|
|
406
|
+
|
|
407
|
+
Slack-DMs verwenden die Benutzeridentität erst nach verifizierter E-Mail und einer bestehenden Mitgliedschaft in der Agent-Native-Organisation. Gemeinsame Kanäle verwenden dagegen einen Service-Principal und übernehmen keine privaten Berechtigungen eines Teilnehmers. Managed OAuth und das generierte Slack-Manifest fordern `users:read.email`; bestehende Installationen müssen nach einer Scope-Änderung neu verbunden werden, alte Bot-Tokens müssen in Slack manuell aktualisiert werden.
|
|
376
408
|
|
|
377
409
|
### Vollständige Stufe (nur explizites Opt-in) {#full-tier}
|
|
378
410
|
|
|
@@ -474,7 +506,7 @@ Zusätzlich zu den Tools pro Aktion stellt der MCP-Server einen stabilen Verbsat
|
|
|
474
506
|
|
|
475
507
|
`create_workspace_app` lehnt alle nicht auf der Zulassungsliste aufgeführten Vorlagen ab – die öffentliche Zulassungsliste für Vorlagen in `packages/shared-app-config/templates.ts` ist maßgeblich und CI-geschützt; ein externer Agent kann es nicht erweitern. Eine gleichnamige Vorlagenaktion überschreibt eine integrierte Aktion (Vorrang der Vorlage vor dem Kern). Deaktivieren Sie das gesamte Set mit `MCPConfig.builtinCrossAppTools: false`.
|
|
476
508
|
|
|
477
|
-
Die Tool- und Ressourcenkataloge für App-Hosts sind standardmäßig kompakt – siehe [Catalog tiers](#catalog-tiers). `publicAgent.expose` bleibt
|
|
509
|
+
Die Tool- und Ressourcenkataloge für App-Hosts sind standardmäßig kompakt – siehe [Catalog tiers](#catalog-tiers). `publicAgent.expose` bleibt das Opt-in auf Action-Ebene für sichere Lese-/Ingest-Tools außerhalb dieses kompakten Katalogs; Apps können mit `externalAgents.authenticatedReads: "auto"` solche authentifizierten Lesezugriffe ohne handgeschriebenen Katalog veröffentlichen. Legen Sie `mcpApp.compactCatalog: true` nur als seltene Ausnahme für Actions fest, die in der Chat-Host-Erkennung erscheinen müssen.
|
|
478
510
|
|
|
479
511
|
Für schnelle ChatGPT/Claude-Übergaben ist der ideale Pfad direkt: Rufen Sie die Aktion auf, die das Artefakt erstellt oder öffnet, und lassen Sie dann die MCP-App die Route starten. Eine Mail-Anfrage sollte `manage_draft` aufrufen und die tatsächliche Verfassen-Route rendern. Eine Dashboard-Anfrage sollte `open_app({ path, embed: true })` oder eine Dashboard-Aktion mit `mcpApp` aufrufen und die vollständige Analytics-Route rendern. Kalender, Formulare, Inhalte, Folien, Design und Clips sollten beim Entwerfen/Erstellen/Suchen dem gleichen Muster folgen actions. `list_apps` ist nützlich, wenn das Modell zwischen verfügbaren Apps wählen muss; Breites `resources/list`, vollständige Katalogerkennung oder `ask_app`-Delegierung sollten nicht der normale Weg für eine offensichtliche UI-Übergabe sein.
|
|
480
512
|
|
|
@@ -238,6 +238,8 @@ Die Datenschutz-Standardeinstellungen sind bewusst konservativ, aber für die Wi
|
|
|
238
238
|
- URLs werden mit demselben `scrubUrl()`-Helfer bereinigt, der auch von der Browser-Analyse verwendet wird.
|
|
239
239
|
- Die Replay-Aufzeichnung ist ausschließlich webbasiert und opt-in; native Desktop-Bildschirme werden nicht aufgezeichnet.
|
|
240
240
|
|
|
241
|
+
Framework-eigene iframes, einschließlich Erweiterungen und gerenderten E-Mail-Inhalten, werden in der Replay-Aufzeichnung erfasst. Innerhalb aufgezeichneter Frames gelten dieselben Maskierungs- und Blockierungsselektoren. Ein fremdes Cross-Origin-iframe bleibt undurchsichtig, sofern sein eigenes Dokument nicht einen kompatiblen rrweb-Recorder mit aktivierter Cross-Origin-iframe-Aufzeichnung ausführt; die Ursprungsgrenzen des Browsers können von der übergeordneten Seite nicht umgangen werden.
|
|
242
|
+
|
|
241
243
|
Während der Aufzeichnung erfasst Session Replay außerdem die Browser-Konsolenausgabe (`log`, `info`, `warn`, `error`, `debug`, sowie die Fenster-Ereignisse `error` / `unhandledrejection`) und Netzwerkanfrage-Metadaten (`fetch` und XHR) als getaggte rrweb-Custom-Events, damit Agenten und der Replay-Viewer von Nutzern gemeldete Probleme debuggen können. Die Erfassung ist standardmäßig aktiviert, wenn Replay aktiviert ist; passen Sie sie mit den Optionen `sessionReplay.console` und `sessionReplay.network` an oder deaktivieren Sie sie, wobei jede Option entweder einen booleschen Wert oder ein Optionsobjekt akzeptiert (`{ maxEvents?: number }`, wobei `network` zusätzlich `captureErrorBodies` und `maxErrorBodyLength` akzeptiert). Request-Bodies und -Header sowie Response-Header werden nie erfasst; Response-Bodies werden nur als begrenzter, redigierter Ausschnitt für 5xx-Antworten (Serverfehler) erfasst (`captureErrorBodies`, Standard true, begrenzt auf `maxErrorBodyLength` Zeichen, Standard 2048) — bei Antworten außerhalb des 5xx-Bereichs sowie bei Netzwerkfehlern wird nie ein Body mitgeführt. URLs werden bereinigt, Nachrichten werden gekürzt, der eigene Ingest-/Tracking-Traffic des Recorders wird ausgeschlossen, und sitzungsbezogene Budgets (1000 Konsolen- / 2000 Netzwerkereignisse) fügen bei Überschreitung einen Kürzungshinweis hinzu.
|
|
242
244
|
|
|
243
245
|
Das Analytics-Template speichert Replay-Metadaten in SQL (`session_recordings`) und Chunks über private Blob-Referenzen (`session_replay_chunks`). Browser und Agenten erhalten niemals Anbieter-URLs. Die Wiedergabe läuft über zugriffsbeschränkte Server-Routen, und die Standard-Agent-Tools liefern Zusammenfassungen oder begrenzte Replay-Ereignisse zurück, keinen Rohzugriff auf die Chunk-Tabelle.
|
|
@@ -325,8 +325,10 @@ El servidor MCP ofrece un **catálogo compacto de forma predeterminada para cada
|
|
|
325
325
|
</div>
|
|
326
326
|
</div>
|
|
327
327
|
<p class="diagram-muted note">
|
|
328
|
-
<code>tool-search</code>
|
|
329
|
-
|
|
328
|
+
<code>tool-search</code> descubre herramientas del nivel completo bajo
|
|
329
|
+
demanda; el catálogo del conector o la política de lecturas autenticadas
|
|
330
|
+
todavía debe permitir la ejecución, salvo que el cliente opte explícitamente
|
|
331
|
+
por el nivel completo.
|
|
330
332
|
</p>
|
|
331
333
|
```
|
|
332
334
|
|
|
@@ -364,15 +366,45 @@ El servidor MCP ofrece un **catálogo compacto de forma predeterminada para cada
|
|
|
364
366
|
|
|
365
367
|
### Nivel compacto/conector (predeterminado) {#connector-tier}
|
|
366
368
|
|
|
367
|
-
De forma predeterminada, cada agente conectado ve un catálogo pequeño y seleccionado (entre 20 y 30 herramientas frente a 105 en la superficie completa):
|
|
369
|
+
De forma predeterminada, cada agente conectado ve un catálogo pequeño y seleccionado (entre 20 y 30 herramientas frente a 105 en la superficie completa). Las aplicaciones pueden mantener un `connectorCatalog` explícito u optar por la política de lecturas autenticadas:
|
|
368
370
|
|
|
369
371
|
- **Aplicación declarada por plantilla actions**: la lista de aplicaciones seguras permitidas a nivel. Para Plan que es `create-visual-plan`, `get-visual-plan`, `share-resource`, `navigate`, `tool-search` y similares.
|
|
370
372
|
- **Herramientas integradas entre aplicaciones**: `list_apps`, `open_app`, `ask_app`, `create_embed_session`.
|
|
371
|
-
- **`tool-search`** siempre está presente, por
|
|
373
|
+
- **`tool-search`** siempre está presente para el descubrimiento. Una action descubierta aún debe estar en el catálogo del conector, incluida por la política de lecturas autenticadas o habilitada mediante la opción explícita de catálogo completo antes de que `tools/call` pueda ejecutarla.
|
|
372
374
|
|
|
373
|
-
Las herramientas fuera de la lista (por ejemplo, `db-exec`, `seed-*`, el conjunto de extensiones, las herramientas de sesión del navegador y las herramientas de rayos X de contexto) no se anuncian y las llamadas a ellas se rechazan con "Herramienta desconocida" a menos que la persona que llama haya optado por el catálogo completo. Esto mantiene pequeña la ventana de contexto de cada agente conectado y elimina las barreras que solo son seguras para el desarrollo local de un solo inquilino.
|
|
375
|
+
Las herramientas fuera de la lista (por ejemplo, `db-exec`, `seed-*`, el conjunto de extensiones, las herramientas de sesión del navegador y las herramientas de rayos X de contexto) no se anuncian y las llamadas a ellas se rechazan con "Herramienta desconocida" a menos que la persona que llama haya optado por el catálogo completo. Esto mantiene pequeña la ventana de contexto de cada agente conectado y elimina las barreras que solo son seguras para el desarrollo local de un solo inquilino.
|
|
374
376
|
|
|
375
|
-
`tool-search` funciona de dos maneras: llámelo
|
|
377
|
+
`tool-search` funciona de dos maneras: llámelo **sin consulta** para ver el menú completo de nombres de herramientas más descripciones de una línea (barato, sin esquemas), o con una consulta para obtener coincidencias clasificadas con resúmenes de parámetros. Ayuda a un cliente compacto a descubrir capacidades; use `ask_app` para cualquier tarea que requiera el razonamiento más amplio del agente de la aplicación o una escritura.
|
|
378
|
+
|
|
379
|
+
#### Lecturas autenticadas de forma predeterminada
|
|
380
|
+
|
|
381
|
+
Las aplicaciones que quieran que las herramientas de lectura directas funcionen sin mantener una lista larga pueden optar por lecturas autenticadas automáticas:
|
|
382
|
+
|
|
383
|
+
```ts
|
|
384
|
+
export default createAgentChatPlugin({
|
|
385
|
+
appId: "analytics",
|
|
386
|
+
externalAgents: {
|
|
387
|
+
authenticatedReads: "auto",
|
|
388
|
+
writes: "ask_app_only",
|
|
389
|
+
// Veto opcional de defensa en profundidad para lecturas especialmente sensibles.
|
|
390
|
+
denyActions: ["get-sensitive-export"],
|
|
391
|
+
},
|
|
392
|
+
});
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
`authenticatedReads: "auto"` añade solo las actions que declaran explícitamente todo lo siguiente:
|
|
396
|
+
|
|
397
|
+
- `http: { method: "GET" }`
|
|
398
|
+
- `readOnly: true`
|
|
399
|
+
- `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
|
|
400
|
+
|
|
401
|
+
La política combina esas actions con las entradas explícitas de `connectorCatalog` y luego aplica `denyActions`. Con `writes: "ask_app_only"` (el valor predeterminado al habilitar lecturas automáticas), las herramientas que mutan datos no pueden invocarse directamente; dirija el trabajo de varios pasos y las mutaciones mediante `ask_app`. `writes: "allowlisted"` existe solo para aplicaciones que mantienen intencionadamente una lista explícita de escrituras.
|
|
402
|
+
|
|
403
|
+
La política es autenticada, no anónima. La identidad de MCP OAuth/connect se conserva mediante `runWithRequestContext`, por lo que siguen vigentes las comprobaciones de acceso de cada action, el ámbito de propietario/organización y los ámbitos de lectura de OAuth. Las actions públicas o no autenticadas no se incluyen automáticamente.
|
|
404
|
+
|
|
405
|
+
`db-schema` y `db-query` de Core no se exponen automáticamente como lecturas externas. Siguen disponibles para el agente interno de la aplicación mediante el flujo SQL con ámbito habitual, pero el acceso amplio al esquema/SQL es demasiado potente para inferirlo solo de metadatos de lectura. Si una aplicación necesita consultas externas directas, debe exponer una action GET propia con controles y límites de acceso, o una lista explícita de tablas/columnas con límites de filas, bytes, tiempo y auditoría. `db-exec` y `db-patch` quedan fuera de la superficie automática.
|
|
406
|
+
|
|
407
|
+
Los mensajes directos de Slack usan la identidad del usuario solo después de verificar su correo y confirmar que pertenece a la organización de Agent Native. Los canales compartidos usan un principal de servicio y no heredan los permisos privados de un participante. OAuth administrado y el manifiesto generado de Slack solicitan `users:read.email`; las instalaciones existentes deben reconectarse tras añadir el ámbito y los tokens de bot antiguos deben actualizarse manualmente en Slack.
|
|
376
408
|
|
|
377
409
|
### Nivel completo (solo suscripción explícita) {#full-tier}
|
|
378
410
|
|
|
@@ -474,7 +506,7 @@ Además de las herramientas por acción, el servidor MCP expone un conjunto de v
|
|
|
474
506
|
|
|
475
507
|
`create_workspace_app` rechaza cualquier plantilla no incluida en la lista de permitidos: la lista de plantillas públicas permitidas en `packages/shared-app-config/templates.ts` tiene autoridad y está protegida por CI; un agente externo no puede ampliarlo. Una acción de plantilla con el mismo nombre anula una acción incorporada (precedencia de plantilla sobre núcleo). Desactive todo el conjunto con `MCPConfig.builtinCrossAppTools: false`.
|
|
476
508
|
|
|
477
|
-
Los catálogos de herramientas y recursos para hosts de aplicaciones son compactos de forma predeterminada; consulte [Catalog tiers](#catalog-tiers). `publicAgent.expose` sigue siendo la opción para herramientas de lectura/ingesta seguras fuera de ese catálogo compacto;
|
|
509
|
+
Los catálogos de herramientas y recursos para hosts de aplicaciones son compactos de forma predeterminada; consulte [Catalog tiers](#catalog-tiers). `publicAgent.expose` sigue siendo la opción a nivel de action para herramientas de lectura/ingesta seguras fuera de ese catálogo compacto; las aplicaciones pueden configurar `externalAgents.authenticatedReads: "auto"` para anunciar esas lecturas autenticadas sin un catálogo escrito a mano. Configure `mcpApp.compactCatalog: true` solo como una rara excepción para actions que deban aparecer en el descubrimiento del host de chat.
|
|
478
510
|
|
|
479
511
|
Para transferencias rápidas de ChatGPT/Claude, la ruta ideal es directa: llame a la acción que crea o abre el artefacto, luego deje que la aplicación MCP inicie la ruta. Una solicitud de correo debe llamar a `manage_draft` y representar la ruta de redacción real. Una solicitud de panel debe llamar a `open_app({ path, embed: true })` o una acción de panel con `mcpApp` y representar la ruta de análisis completa. Calendario, formularios, contenido, diapositivas, diseño y clips deben seguir el mismo patrón con su borrador/creación/búsqueda actions. `list_apps` es útil cuando el modelo debe elegir entre las aplicaciones otorgadas; `resources/list` amplio, descubrimiento de catálogo completo o delegación de `ask_app` no deberían ser la ruta normal para una transferencia obvia de UI.
|
|
480
512
|
|
|
@@ -238,6 +238,8 @@ Los valores predeterminados de privacidad son intencionalmente conservadores per
|
|
|
238
238
|
- Las URL se depuran con el mismo ayudante `scrubUrl()` que utiliza el análisis del navegador.
|
|
239
239
|
- La captura de repetición es solo para web y opcional; no graba pantallas de escritorio nativas.
|
|
240
240
|
|
|
241
|
+
Los iframes administrados por el framework, incluidas las extensiones y el contenido de correo electrónico renderizado, se incluyen en la captura de repetición. Los mismos selectores de enmascaramiento y bloqueo se aplican dentro de los frames grabados. Un iframe de terceros con origen distinto permanece opaco a menos que su propio documento ejecute un grabador rrweb compatible con la grabación de iframes de origen cruzado habilitada; la página principal no puede eludir los límites de origen del navegador.
|
|
242
|
+
|
|
241
243
|
Durante la grabación, la repetición de sesión también captura la salida de la consola del navegador (`log`, `info`, `warn`, `error`, `debug`, además de `error`/`unhandledrejection` de la ventana) y los metadatos de solicitudes de red (`fetch` y XHR) como eventos personalizados de rrweb etiquetados, para que los agentes y el visor de repeticiones puedan depurar los problemas reportados por los usuarios. La captura está habilitada de forma predeterminada cuando la repetición está activada; ajuste o desactive con las opciones `sessionReplay.console` y `sessionReplay.network`, cada una acepta un booleano o un objeto de opciones (`{ maxEvents?: number }`, y `network` acepta además `captureErrorBodies` y `maxErrorBodyLength`). Los cuerpos y encabezados de solicitud nunca se capturan; los cuerpos de respuesta solo se capturan como un fragmento acotado y redactado para respuestas 5xx (error del servidor) (`captureErrorBodies`, predeterminado true, limitado a `maxErrorBodyLength` caracteres, predeterminado 2048) — las respuestas que no son 5xx y los fallos de red nunca incluyen un cuerpo. Las URL se depuran, los mensajes se truncan, el propio tráfico de ingesta/seguimiento del grabador se excluye, y los presupuestos por sesión (1000 eventos de consola / 2000 eventos de red) agregan un aviso de truncamiento cuando se superan.
|
|
242
244
|
|
|
243
245
|
La plantilla de Analytics almacena los metadatos de repetición en SQL (`session_recordings`) y almacena los fragmentos mediante referencias de blob privadas (`session_replay_chunks`). Los navegadores y los agentes nunca reciben las URL del proveedor. La reproducción pasa por rutas del servidor con alcance limitado y las herramientas del agente predeterminadas devuelven resúmenes o eventos de repetición acotados, no acceso sin procesar a la tabla de fragmentos.
|
|
@@ -325,8 +325,10 @@ Le serveur MCP propose par défaut un **catalogue compact à chaque appelant**
|
|
|
325
325
|
</div>
|
|
326
326
|
</div>
|
|
327
327
|
<p class="diagram-muted note">
|
|
328
|
-
<code>tool-search</code>
|
|
329
|
-
|
|
328
|
+
<code>tool-search</code> découvre les outils du niveau complet à la demande ;
|
|
329
|
+
le catalogue du connecteur ou la politique de lectures authentifiées doit
|
|
330
|
+
encore autoriser l'exécution, sauf si l'appelant choisit explicitement le
|
|
331
|
+
niveau complet.
|
|
330
332
|
</p>
|
|
331
333
|
```
|
|
332
334
|
|
|
@@ -364,15 +366,45 @@ Le serveur MCP propose par défaut un **catalogue compact à chaque appelant**
|
|
|
364
366
|
|
|
365
367
|
### Niveau Compact/Connecteur (par défaut) {#connector-tier}
|
|
366
368
|
|
|
367
|
-
Par défaut, chaque agent connecté voit un petit catalogue organisé (environ 20 à 30 outils contre environ 105 dans la surface complète) :
|
|
369
|
+
Par défaut, chaque agent connecté voit un petit catalogue organisé (environ 20 à 30 outils contre environ 105 dans la surface complète). Les applications peuvent maintenir un `connectorCatalog` explicite ou choisir la politique de lectures authentifiées :
|
|
368
370
|
|
|
369
371
|
- **Application déclarée par modèle actions** — la liste verte sécurisée au niveau de l'application. Pour les plans `create-visual-plan`, `get-visual-plan`, `share-resource`, `navigate`, `tool-search` et similaires.
|
|
370
372
|
- **Outils multi-applications intégrés** : `list_apps`, `open_app`, `ask_app`, `create_embed_session`.
|
|
371
|
-
- **`tool-search`** est toujours présent
|
|
373
|
+
- **`tool-search`** est toujours présent pour la découverte. Une action découverte doit encore figurer dans le catalogue du connecteur, être incluse par la politique de lectures authentifiées ou être activée par l'option explicite de catalogue complet avant que `tools/call` puisse l'exécuter.
|
|
372
374
|
|
|
373
|
-
Les outils en dehors de la liste (par exemple `db-exec`, `seed-*`, la suite d'extensions, les outils de session de navigateur et les outils de radiographie contextuelle) ne sont pas annoncés et les appels vers ces outils sont rejetés avec « Outil inconnu », sauf si l'appelant a choisi d'accéder au catalogue complet. Cela permet de garder la fenêtre contextuelle de chaque agent connecté petite et de supprimer les armes à pied qui ne sont sûres que pour le développement local à locataire unique.
|
|
375
|
+
Les outils en dehors de la liste (par exemple `db-exec`, `seed-*`, la suite d'extensions, les outils de session de navigateur et les outils de radiographie contextuelle) ne sont pas annoncés et les appels vers ces outils sont rejetés avec « Outil inconnu », sauf si l'appelant a choisi d'accéder au catalogue complet. Cela permet de garder la fenêtre contextuelle de chaque agent connecté petite et de supprimer les armes à pied qui ne sont sûres que pour le développement local à locataire unique.
|
|
374
376
|
|
|
375
|
-
`tool-search` fonctionne de deux manières : appelez-le
|
|
377
|
+
`tool-search` fonctionne de deux manières : appelez-le **sans requête** pour obtenir le menu complet des noms d'outils et des descriptions sur une ligne (peu coûteux, sans schémas), ou avec une requête pour obtenir des correspondances classées et des résumés de paramètres. Il aide un client compact à découvrir les capacités ; utilisez `ask_app` pour tout ce qui nécessite le raisonnement plus large de l'agent de l'application ou une écriture.
|
|
378
|
+
|
|
379
|
+
#### Lectures authentifiées par défaut
|
|
380
|
+
|
|
381
|
+
Les applications qui souhaitent que les outils de lecture directe fonctionnent sans maintenir une longue liste d'autorisation peuvent activer les lectures authentifiées automatiques :
|
|
382
|
+
|
|
383
|
+
```ts
|
|
384
|
+
export default createAgentChatPlugin({
|
|
385
|
+
appId: "analytics",
|
|
386
|
+
externalAgents: {
|
|
387
|
+
authenticatedReads: "auto",
|
|
388
|
+
writes: "ask_app_only",
|
|
389
|
+
// Veto facultatif de défense en profondeur pour les lectures particulièrement sensibles.
|
|
390
|
+
denyActions: ["get-sensitive-export"],
|
|
391
|
+
},
|
|
392
|
+
});
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
`authenticatedReads: "auto"` ajoute uniquement les actions qui déclarent explicitement tous les éléments suivants :
|
|
396
|
+
|
|
397
|
+
- `http: { method: "GET" }`
|
|
398
|
+
- `readOnly: true`
|
|
399
|
+
- `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
|
|
400
|
+
|
|
401
|
+
La politique combine ces actions avec les entrées explicites de `connectorCatalog`, puis applique `denyActions`. Avec `writes: "ask_app_only"` (la valeur par défaut quand les lectures automatiques sont activées), les outils qui modifient des données ne sont pas directement appelables ; acheminez le travail en plusieurs étapes et les mutations via `ask_app`. `writes: "allowlisted"` est réservé aux applications qui maintiennent volontairement une liste explicite d'écritures autorisées.
|
|
402
|
+
|
|
403
|
+
La politique est authentifiée, et non anonyme. L'identité MCP OAuth/connect est transmise via `runWithRequestContext`, de sorte que les contrôles d'accès des actions, les périmètres propriétaire/organisation et les portées de lecture OAuth restent appliqués. Les actions publiques ou non authentifiées ne sont pas incluses automatiquement.
|
|
404
|
+
|
|
405
|
+
Les outils Core `db-schema` et `db-query` ne sont pas automatiquement exposés comme lectures externes. Ils restent disponibles pour l'agent interne de l'application via le chemin SQL habituellement délimité, mais un accès large au schéma/SQL est trop puissant pour être déduit de simples métadonnées de lecture. Si une application a besoin de requêtes externes directes, elle doit exposer une action GET propre avec des contrôles d'accès et des limites, ou une liste explicite de tables/colonnes avec des limites de lignes, d'octets, de durée et d'audit. `db-exec` et `db-patch` restent hors de la surface automatique.
|
|
406
|
+
|
|
407
|
+
Les messages directs Slack utilisent l'identité de l'utilisateur uniquement après vérification de son adresse e-mail et confirmation de son appartenance à l'organisation Agent Native. Les canaux partagés utilisent un principal de service et n'empruntent pas les autorisations privées d'un participant. OAuth géré et le manifeste Slack généré demandent `users:read.email` ; les installations existantes doivent être reconnectées après l'ajout de cette portée et les anciens jetons bot doivent être mis à jour manuellement dans Slack.
|
|
376
408
|
|
|
377
409
|
### Niveau complet (adhésion explicite uniquement) {#full-tier}
|
|
378
410
|
|
|
@@ -474,7 +506,7 @@ En plus des outils par action, le serveur MCP expose un ensemble de verbes stabl
|
|
|
474
506
|
|
|
475
507
|
`create_workspace_app` rejette tout modèle non autorisé : la liste verte de modèles publics dans `packages/shared-app-config/templates.ts` fait autorité et est protégée par CI ; un agent extérieur ne peut pas l’élargir. Une action de modèle du même nom remplace une action intégrée (précédence du modèle sur le noyau). Désactivez l'ensemble avec `MCPConfig.builtinCrossAppTools: false`.
|
|
476
508
|
|
|
477
|
-
Les catalogues d'outils et de ressources pour les hôtes d'applications sont compacts par défaut – voir [Catalog tiers](#catalog-tiers). `publicAgent.expose` reste l'option
|
|
509
|
+
Les catalogues d'outils et de ressources pour les hôtes d'applications sont compacts par défaut – voir [Catalog tiers](#catalog-tiers). `publicAgent.expose` reste l'option au niveau de l'action pour les outils de lecture/ingestion sécurisés en dehors de ce catalogue compact ; les applications peuvent définir `externalAgents.authenticatedReads: "auto"` pour annoncer ces lectures authentifiées sans catalogue rédigé à la main. Définissez `mcpApp.compactCatalog: true` uniquement comme une exception rare pour les actions qui doivent apparaître dans la découverte de l'hôte de discussion.
|
|
478
510
|
|
|
479
511
|
Pour des transferts rapides ChatGPT/Claude, le chemin idéal est direct : appelez l'action qui crée ou ouvre l'artefact, puis laissez l'application MCP lancer l'itinéraire. Une requête Mail doit appeler `manage_draft` et afficher la véritable route de composition. Une demande de tableau de bord doit appeler `open_app({ path, embed: true })` ou une action de tableau de bord avec `mcpApp` et afficher l'itinéraire Analytics complet. Le calendrier, les formulaires, le contenu, les diapositives, la conception et les clips doivent suivre le même modèle avec leur brouillon/création/recherche actions. `list_apps` est utile lorsque le modèle doit choisir parmi les applications accordées ; Une large `resources/list`, une découverte de catalogue complet ou une délégation `ask_app` ne devraient pas être la voie normale pour un transfert évident de UI.
|
|
480
512
|
|
|
@@ -236,9 +236,11 @@ Les paramètres de confidentialité par défaut sont volontairement prudents tou
|
|
|
236
236
|
- Le texte de la page reste visible sauf si un élément est marqué avec `.an-mask` ou `data-an-mask`.
|
|
237
237
|
- Les zones sensibles sont bloquées avec des sélecteurs tels que `[data-sensitive]`, `.an-block`, `.an-private`, `data-an-block`, `data-an-private`, ainsi que les champs de type carte bancaire/mot de passe/numéro de sécurité sociale.
|
|
238
238
|
- Les URL sont nettoyées avec le même assistant `scrubUrl()` utilisé par les analyses du navigateur.
|
|
239
|
-
- La capture de relecture est réservée au web et opt-in
|
|
239
|
+
- La capture de relecture est réservée au web et opt-in ; elle n'enregistre pas les écrans natifs du bureau.
|
|
240
240
|
|
|
241
|
-
|
|
241
|
+
Les iframes gérées par le framework, notamment les extensions et le contenu d'e-mail rendu, sont incluses dans la capture de relecture. Les mêmes sélecteurs de masquage et de blocage s'appliquent dans les frames enregistrées. Une iframe tierce d'origine différente reste opaque, sauf si son propre document exécute un enregistreur rrweb compatible avec l'enregistrement des iframes inter-origines activé ; la page parente ne peut pas contourner les limites d'origine imposées par le navigateur.
|
|
242
|
+
|
|
243
|
+
Pendant l'enregistrement, la relecture de session capture également la sortie de la console du navigateur (`log`, `info`, `warn`, `error`, `debug`, ainsi que les événements globaux `error` / `unhandledrejection`) et les métadonnées des requêtes réseau (`fetch` et XHR) sous forme d'événements personnalisés rrweb balisés, afin que les agents et la visionneuse de relecture puissent déboguer les problèmes signalés par les utilisateurs. La capture est activée par défaut lorsque la relecture est activée ; ajustez-la ou désactivez-la avec les options `sessionReplay.console` et `sessionReplay.network`, chacune acceptant un booléen ou un objet d'options (`{ maxEvents?: number }`, `network` acceptant en plus `captureErrorBodies` et `maxErrorBodyLength`). Les corps et en-têtes des requêtes ne sont jamais capturés ; les corps des réponses ne sont capturés que sous forme d'extrait borné et expurgé pour les réponses 5xx (erreur serveur) (`captureErrorBodies`, activé par défaut, plafonné à `maxErrorBodyLength` caractères, 2048 par défaut) — les réponses hors 5xx et les échecs réseau ne comportent jamais de corps. Les URL sont nettoyées, les messages sont tronqués, le trafic d'ingestion/de suivi propre à l'enregistreur est exclu, et des budgets par session (1000 événements console / 2000 événements réseau) ajoutent une notice de troncature en cas de dépassement.
|
|
242
244
|
|
|
243
245
|
Le modèle Analytics stocke les métadonnées de relecture en SQL (`session_recordings`) et stocke les blocs via des références blob privées (`session_replay_chunks`). Les navigateurs et les agents ne reçoivent jamais les URL du fournisseur. La lecture passe par des routes serveur à portée limitée, et les outils d'agent par défaut renvoient des résumés ou des événements de relecture bornés, et non un accès brut à la table des blocs.
|
|
244
246
|
|
|
@@ -324,8 +324,9 @@ MCP सर्वर प्रत्येक कॉलर को डिफ़ॉ
|
|
|
324
324
|
</div>
|
|
325
325
|
</div>
|
|
326
326
|
<p class="diagram-muted note">
|
|
327
|
-
<code>tool-search</code>
|
|
328
|
-
|
|
327
|
+
<code>tool-search</code> मांग पर पूर्ण-स्तरीय टूल खोजता है; निष्पादन के लिए
|
|
328
|
+
कनेक्टर कैटलॉग या प्रमाणित-पठन नीति की अनुमति अब भी आवश्यक है, जब तक कॉलर
|
|
329
|
+
स्पष्ट रूप से पूर्ण स्तर नहीं चुनता।
|
|
329
330
|
</p>
|
|
330
331
|
```
|
|
331
332
|
|
|
@@ -363,15 +364,45 @@ MCP सर्वर प्रत्येक कॉलर को डिफ़ॉ
|
|
|
363
364
|
|
|
364
365
|
### कॉम्पैक्ट / कनेक्टर टियर (डिफ़ॉल्ट) {#connector-tier}
|
|
365
366
|
|
|
366
|
-
डिफ़ॉल्ट रूप से प्रत्येक कनेक्टेड एजेंट एक छोटा, क्यूरेटेड कैटलॉग देखता है (~20-30 टूल बनाम पूर्ण सतह में ~105)
|
|
367
|
+
डिफ़ॉल्ट रूप से प्रत्येक कनेक्टेड एजेंट एक छोटा, क्यूरेटेड कैटलॉग देखता है (~20-30 टूल बनाम पूर्ण सतह में ~105)। ऐप या तो स्पष्ट `connectorCatalog` बनाए रख सकते हैं, या प्रमाणित-पठन नीति चुन सकते हैं:
|
|
367
368
|
|
|
368
369
|
- **टेम्पलेट-घोषित ऐप actions** — सुरक्षित ऐप-स्तरीय अनुमति-सूची। योजना के लिए जो `create-visual-plan`, `get-visual-plan`, `share-resource`, `navigate`, `tool-search`, और समान है।
|
|
369
370
|
- **अंतर्निहित क्रॉस-ऐप टूल** - `list_apps`, `open_app`, `ask_app`, `create_embed_session`।
|
|
370
|
-
- **`tool-search`** हमेशा मौजूद रहता
|
|
371
|
+
- **`tool-search`** खोज के लिए हमेशा मौजूद रहता है। खोजे गए action को `tools/call` से चलाने से पहले कनेक्टर कैटलॉग में होना, प्रमाणित-पठन नीति में शामिल होना, या स्पष्ट पूर्ण-कैटलॉग ऑप्ट-इन से सक्षम होना आवश्यक है।
|
|
371
372
|
|
|
372
|
-
सूची से बाहर के उपकरण - उदाहरण के लिए `db-exec`, `seed-*`, एक्सटेंशन सूट, ब्राउज़र-सत्र उपकरण और संदर्भ-एक्सरे उपकरण - विज्ञापित नहीं किए जाते हैं, और जब तक कॉल करने वाले ने पूरी सूची में शामिल नहीं किया है, तब तक उन पर कॉल को "अज्ञात टूल" के साथ अस्वीकार कर दिया जाता है। यह प्रत्येक कनेक्टेड एजेंट की संदर्भ विंडो को छोटा रखता है और फ़ुटगन को हटा देता है जो केवल एकल-किरायेदार स्थानीय विकास के लिए सुरक्षित हैं।
|
|
373
|
+
सूची से बाहर के उपकरण - उदाहरण के लिए `db-exec`, `seed-*`, एक्सटेंशन सूट, ब्राउज़र-सत्र उपकरण और संदर्भ-एक्सरे उपकरण - विज्ञापित नहीं किए जाते हैं, और जब तक कॉल करने वाले ने पूरी सूची में शामिल नहीं किया है, तब तक उन पर कॉल को "अज्ञात टूल" के साथ अस्वीकार कर दिया जाता है। यह प्रत्येक कनेक्टेड एजेंट की संदर्भ विंडो को छोटा रखता है और फ़ुटगन को हटा देता है जो केवल एकल-किरायेदार स्थानीय विकास के लिए सुरक्षित हैं।
|
|
373
374
|
|
|
374
|
-
`tool-search` दो तरीकों से काम करता है: इसे टूल नामों के पूर्ण मेनू और एक-पंक्ति विवरण (सस्ता, कोई स्कीमा नहीं) के लिए **कोई क्वेरी नहीं** के साथ कॉल करें, या पैरामीटर सारांश के साथ रैंक किए गए मिलान के लिए एक क्वेरी के साथ।
|
|
375
|
+
`tool-search` दो तरीकों से काम करता है: इसे टूल नामों के पूर्ण मेनू और एक-पंक्ति विवरण (सस्ता, कोई स्कीमा नहीं) के लिए **कोई क्वेरी नहीं** के साथ कॉल करें, या पैरामीटर सारांश के साथ रैंक किए गए मिलान के लिए एक क्वेरी के साथ। यह कॉम्पैक्ट क्लाइंट को क्षमताएँ खोजने में मदद करता है; ऐप एजेंट के व्यापक तर्क या किसी लिखने की क्रिया के लिए `ask_app` का उपयोग करें।
|
|
376
|
+
|
|
377
|
+
#### डिफ़ॉल्ट रूप से प्रमाणित पठन
|
|
378
|
+
|
|
379
|
+
जो ऐप लंबी अनुमति-सूची बनाए बिना सीधे पठन टूल चलाना चाहते हैं, वे स्वचालित प्रमाणित पठन चुन सकते हैं:
|
|
380
|
+
|
|
381
|
+
```ts
|
|
382
|
+
export default createAgentChatPlugin({
|
|
383
|
+
appId: "analytics",
|
|
384
|
+
externalAgents: {
|
|
385
|
+
authenticatedReads: "auto",
|
|
386
|
+
writes: "ask_app_only",
|
|
387
|
+
// विशेष रूप से संवेदनशील पठन के लिए वैकल्पिक रक्षा-गहन निषेध।
|
|
388
|
+
denyActions: ["get-sensitive-export"],
|
|
389
|
+
},
|
|
390
|
+
});
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
`authenticatedReads: "auto"` केवल उन actions को जोड़ता है जो स्पष्ट रूप से ये सभी घोषित करते हैं:
|
|
394
|
+
|
|
395
|
+
- `http: { method: "GET" }`
|
|
396
|
+
- `readOnly: true`
|
|
397
|
+
- `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
|
|
398
|
+
|
|
399
|
+
नीति इन actions को स्पष्ट `connectorCatalog` प्रविष्टियों के साथ जोड़ती है, फिर `denyActions` लागू करती है। `writes: "ask_app_only"` (स्वचालित पठन चालू होने पर डिफ़ॉल्ट) के साथ बदलने वाले टूल सीधे कॉल नहीं किए जा सकते; बहु-चरणीय काम और बदलाव `ask_app` के माध्यम से भेजें। `writes: "allowlisted"` केवल उन ऐप के लिए है जो जानबूझकर स्पष्ट लिखने की अनुमति-सूची रखते हैं।
|
|
400
|
+
|
|
401
|
+
यह नीति प्रमाणित है, अनाम नहीं। MCP OAuth/connect पहचान `runWithRequestContext` से आगे जाती है, इसलिए action-स्तरीय पहुँच जाँच, मालिक/संगठन स्कोप और OAuth पठन स्कोप लागू रहते हैं। सार्वजनिक या अप्रमाणित actions स्वचालित पठन में शामिल नहीं होते।
|
|
402
|
+
|
|
403
|
+
Core के `db-schema` और `db-query` को स्वचालित बाहरी रीड के रूप में प्रकाशित नहीं किया जाता। वे सामान्य स्कोप किए गए SQL पथ के माध्यम से ऐप एजेंट के लिए उपलब्ध रहते हैं, लेकिन व्यापक स्कीमा/SQL पहुँच केवल read-only मेटाडेटा से अनुमान लगाने के लिए बहुत शक्तिशाली है। सीधे बाहरी क्वेरी की आवश्यकता होने पर ऐप को अपने access checks और सीमाओं वाला GET action, या rows, bytes, timeout और audit limits वाली स्पष्ट table/column allow-list देनी चाहिए। `db-exec` और `db-patch` स्वचालित सतह से बाहर रहते हैं।
|
|
404
|
+
|
|
405
|
+
Slack DM में उपयोगकर्ता की पहचान तभी इस्तेमाल होती है जब ईमेल सत्यापित हो और वह Agent Native संगठन का सदस्य हो। साझा चैनल service principal का उपयोग करते हैं और किसी प्रतिभागी की निजी permissions नहीं लेते। Managed OAuth और generated Slack manifest दोनों `users:read.email` मांगते हैं; मौजूदा installations को scope जोड़ने के बाद reconnect करना होगा और पुराने bot tokens को Slack में manually update करना होगा।
|
|
375
406
|
|
|
376
407
|
### पूर्ण स्तरीय (केवल स्पष्ट ऑप्ट-इन) {#full-tier}
|
|
377
408
|
|
|
@@ -473,7 +504,7 @@ ChatGPT/Claude-शैली OAuth ऐप होस्ट के लिए, ख
|
|
|
473
504
|
|
|
474
505
|
`create_workspace_app` किसी भी गैर-अनुमति-सूचीबद्ध टेम्पलेट को अस्वीकार करता है - `packages/shared-app-config/templates.ts` में सार्वजनिक टेम्पलेट अनुमति-सूची आधिकारिक और सीआई-संरक्षित है; कोई बाहरी एजेंट इसे चौड़ा नहीं कर सकता. एक समान-नामित टेम्पलेट क्रिया एक बिल्टिन (टेम्पलेट-ओवर-कोर प्राथमिकता) को ओवरराइड करती है। `MCPConfig.builtinCrossAppTools: false` के साथ पूरे सेट को अक्षम करें।
|
|
475
506
|
|
|
476
|
-
ऐप होस्ट के लिए टूल और संसाधन कैटलॉग डिफ़ॉल्ट रूप से कॉम्पैक्ट होते हैं - [Catalog tiers](#catalog-tiers) देखें। `publicAgent.expose` उस कॉम्पैक्ट कैटलॉग के बाहर सुरक्षित पढ़ने/निगलने वाले टूल के लिए ऑप्ट-इन बना
|
|
507
|
+
ऐप होस्ट के लिए टूल और संसाधन कैटलॉग डिफ़ॉल्ट रूप से कॉम्पैक्ट होते हैं - [Catalog tiers](#catalog-tiers) देखें। `publicAgent.expose` उस कॉम्पैक्ट कैटलॉग के बाहर सुरक्षित पढ़ने/निगलने वाले टूल के लिए action-स्तरीय ऑप्ट-इन बना रहता है; ऐप हाथ से लिखे कैटलॉग के बिना प्रमाणित पठन विज्ञापित करने के लिए `externalAgents.authenticatedReads: "auto"` सेट कर सकते हैं। `mcpApp.compactCatalog: true` को केवल actions के लिए दुर्लभ अपवाद के रूप में सेट करें जिन्हें चैट-होस्ट डिस्कवरी में प्रदर्शित होना चाहिए।
|
|
477
508
|
|
|
478
509
|
तेज़ ChatGPT/Claude हैंडऑफ़ के लिए, आदर्श पथ सीधा है: उस क्रिया को कॉल करें जो आर्टिफैक्ट बनाता है या खोलता है, फिर MCP ऐप को रूट लॉन्च करने दें। एक मेल अनुरोध को `manage_draft` पर कॉल करना चाहिए और वास्तविक कंपोज़ रूट प्रस्तुत करना चाहिए। डैशबोर्ड अनुरोध को `open_app({ path, embed: true })` या `mcpApp` के साथ डैशबोर्ड कार्रवाई को कॉल करना चाहिए और संपूर्ण एनालिटिक्स रूट प्रस्तुत करना चाहिए। कैलेंडर, फॉर्म, सामग्री, स्लाइड, डिज़ाइन और क्लिप्स को अपने ड्राफ्ट/निर्माण/खोज actions के साथ समान पैटर्न का पालन करना चाहिए। `list_apps` तब उपयोगी होता है जब मॉडल को स्वीकृत ऐप्स में से चयन करना होता है; व्यापक `resources/list`, पूर्ण-कैटलॉग खोज, या `ask_app` प्रतिनिधिमंडल स्पष्ट UI हैंडऑफ़ के लिए सामान्य मार्ग नहीं होना चाहिए।
|
|
479
510
|
|
|
@@ -238,6 +238,8 @@ Session replay प्रत्येक ब्राउज़र session के
|
|
|
238
238
|
- URLs को ब्राउज़र एनालिटिक्स द्वारा उपयोग किए जाने वाले समान `scrubUrl()` हेल्पर के साथ स्क्रब किया जाता है।
|
|
239
239
|
- Replay capture केवल-वेब और ऑप्ट-इन है; यह नेटिव डेस्कटॉप स्क्रीन को रिकॉर्ड नहीं करता।
|
|
240
240
|
|
|
241
|
+
Framework के स्वामित्व वाले iframes, जिनमें extensions और render किया गया email content शामिल है, replay capture में शामिल किए जाते हैं। रिकॉर्ड किए गए frames के अंदर भी वही masking और blocking selectors लागू होते हैं। कोई third-party cross-origin iframe तब तक opaque रहता है जब तक उसका अपना document cross-origin iframe recording सक्षम किए हुए compatible rrweb recorder को न चलाए; parent page ब्राउज़र की origin boundaries को bypass नहीं कर सकता।
|
|
242
|
+
|
|
241
243
|
रिकॉर्डिंग के दौरान, session replay ब्राउज़र कंसोल आउटपुट (`log`, `info`, `warn`, `error`, `debug`, साथ ही window `error` / `unhandledrejection`) और नेटवर्क रिक्वेस्ट मेटाडेटा (`fetch` और XHR) को टैग किए गए rrweb कस्टम इवेंट्स के रूप में भी कैप्चर करता है, ताकि एजेंट और replay viewer उपयोगकर्ता-रिपोर्ट की गई समस्याओं को डीबग कर सकें। जब replay सक्षम होता है तो capture डिफ़ॉल्ट रूप से चालू होता है; इसे `sessionReplay.console` और `sessionReplay.network` विकल्पों के साथ ट्यून या अक्षम करें, प्रत्येक एक बूलियन या एक विकल्प ऑब्जेक्ट स्वीकार करता है (`{ maxEvents?: number }`, जिसमें `network` अतिरिक्त रूप से `captureErrorBodies` और `maxErrorBodyLength` भी स्वीकार करता है)। Request bodies और headers कभी कैप्चर नहीं किए जाते; response bodies केवल 5xx (सर्वर एरर) रिस्पॉन्स के लिए एक बाउंडेड, रिडैक्टेड स्निपेट के रूप में कैप्चर किए जाते हैं (`captureErrorBodies`, डिफ़ॉल्ट true, `maxErrorBodyLength` वर्णों तक सीमित, डिफ़ॉल्ट 2048) — non-5xx और नेटवर्क-फेलियर (status 0) रिस्पॉन्स में कभी कोई body नहीं होती। URLs स्क्रब किए जाते हैं, संदेश छोटे किए जाते हैं, रिकॉर्डर का अपना ingest/tracking ट्रैफ़िक बाहर रखा जाता है, और प्रति-session बजट (1000 console / 2000 network events) से अधिक होने पर एक truncation नोटिस जोड़ते हैं।
|
|
242
244
|
|
|
243
245
|
Analytics टेम्पलेट replay मेटाडेटा को SQL (`session_recordings`) में संग्रहीत करता है और chunks को प्राइवेट blob refs (`session_replay_chunks`) के माध्यम से संग्रहीत करता है। ब्राउज़र और एजेंट को कभी भी प्रदाता URLs प्राप्त नहीं होते। Playback स्कोप्ड सर्वर रूट्स के माध्यम से जाता है और डिफ़ॉल्ट एजेंट टूल्स सारांश या बाउंडेड replay events लौटाते हैं, कच्ची chunk table एक्सेस नहीं।
|
|
@@ -324,8 +324,9 @@ MCP サーバーは、ホスト型コネクタ (ChatGPT、Claude)、コード
|
|
|
324
324
|
</div>
|
|
325
325
|
</div>
|
|
326
326
|
<p class="diagram-muted note">
|
|
327
|
-
<code>tool-search</code>
|
|
328
|
-
|
|
327
|
+
<code>tool-search</code> はオンデマンドでフル階層のツールを検出しますが、
|
|
328
|
+
明示的にフル階層を選択しない限り、実行にはコネクタ カタログまたは
|
|
329
|
+
認証済み読み取りポリシーによる許可が必要です。
|
|
329
330
|
</p>
|
|
330
331
|
```
|
|
331
332
|
|
|
@@ -363,15 +364,45 @@ MCP サーバーは、ホスト型コネクタ (ChatGPT、Claude)、コード
|
|
|
363
364
|
|
|
364
365
|
### コンパクト / コネクタ層 (デフォルト) {#connector-tier}
|
|
365
366
|
|
|
366
|
-
デフォルトでは、接続されているすべてのエージェントに、厳選された小規模なカタログが表示されます (
|
|
367
|
+
デフォルトでは、接続されているすべてのエージェントに、厳選された小規模なカタログが表示されます (約 20 ~ 30 個に対し、フル サーフェスでは約 105 個)。アプリは明示的な `connectorCatalog` を管理するか、認証済み読み取りポリシーを有効にできます。
|
|
367
368
|
|
|
368
369
|
- **テンプレートで宣言されたアプリ actions** — 安全なアプリレベルの許可リスト。プランの場合は、`create-visual-plan`、`get-visual-plan`、`share-resource`、`navigate`、`tool-search` などです。
|
|
369
370
|
- **組み込みクロスアプリ ツール** — `list_apps`、`open_app`、`ask_app`、`create_embed_session`。
|
|
370
|
-
- **`tool-search`**
|
|
371
|
+
- **`tool-search`** は検出用として常に存在します。検出されたアクションを `tools/call` で実行するには、コネクタ カタログ、認証済み読み取りポリシー、または明示的なフル カタログのオプトインによる許可が必要です。
|
|
371
372
|
|
|
372
|
-
リスト外のツール (`db-exec`、`seed-*`、拡張スイート、ブラウザ セッション ツール、コンテキスト Xray ツールなど) はアドバタイズされず、呼び出し元が完全なカタログを選択していない限り、それらへの呼び出しは「不明なツール」として拒否されます。これにより、接続されている各エージェントのコンテキスト ウィンドウが小さく保たれ、シングル
|
|
373
|
+
リスト外のツール (`db-exec`、`seed-*`、拡張スイート、ブラウザ セッション ツール、コンテキスト Xray ツールなど) はアドバタイズされず、呼び出し元が完全なカタログを選択していない限り、それらへの呼び出しは「不明なツール」として拒否されます。これにより、接続されている各エージェントのコンテキスト ウィンドウが小さく保たれ、シングル テナントのローカル開発でのみ安全なフットガンが削除されます。
|
|
373
374
|
|
|
374
|
-
`tool-search` は 2 つの方法で動作します。ツール名の完全なメニューと 1 行の説明 (安価、スキーマなし) を取得する **クエリなし**
|
|
375
|
+
`tool-search` は 2 つの方法で動作します。ツール名の完全なメニューと 1 行の説明 (安価、スキーマなし) を取得する **クエリなし** で呼び出すか、パラメータの概要を使用したランク付けされた一致のクエリを使用して呼び出します。コンパクト化されたクライアントが機能を検出するためのものであり、アプリ エージェントのより広い推論や書き込みが必要な処理には `ask_app` を使用します。
|
|
376
|
+
|
|
377
|
+
#### 認証済み読み取りをデフォルトで有効にする
|
|
378
|
+
|
|
379
|
+
長い許可リストを管理せずに直接ツールを利用したいアプリは、認証済み読み取りの自動公開を有効にできます。
|
|
380
|
+
|
|
381
|
+
```ts
|
|
382
|
+
export default createAgentChatPlugin({
|
|
383
|
+
appId: "analytics",
|
|
384
|
+
externalAgents: {
|
|
385
|
+
authenticatedReads: "auto",
|
|
386
|
+
writes: "ask_app_only",
|
|
387
|
+
// 特に機密性の高い読み取りを拒否する、任意の多層防御。
|
|
388
|
+
denyActions: ["get-sensitive-export"],
|
|
389
|
+
},
|
|
390
|
+
});
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
`authenticatedReads: "auto"` が追加するのは、次のすべてを明示的に宣言したアクションだけです。
|
|
394
|
+
|
|
395
|
+
- `http: { method: "GET" }`
|
|
396
|
+
- `readOnly: true`
|
|
397
|
+
- `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
|
|
398
|
+
|
|
399
|
+
このポリシーは、それらのアクションを明示的な `connectorCatalog` エントリと結合してから `denyActions` を適用します。`writes: "ask_app_only"` (自動読み取りが有効な場合のデフォルト) では、変更を伴うツールを直接呼び出せません。複数ステップの処理や変更は `ask_app` 経由で行います。`writes: "allowlisted"` は、明示的な書き込み許可リストを意図的に管理するアプリ専用です。
|
|
400
|
+
|
|
401
|
+
このポリシーは認証済みアクセス向けであり、匿名アクセス向けではありません。MCP OAuth/接続の ID は引き続き `runWithRequestContext` を通じて伝播するため、アクション レベルのアクセス チェック、所有者/組織のスコープ、OAuth の読み取りスコープが適用されます。公開/未認証アクションは自動読み取りに含まれません。
|
|
402
|
+
|
|
403
|
+
Core の `db-schema` と `db-query` は外部の自動読み取りとして公開されません。通常のスコープ付き SQL パスを通じてアプリ内エージェントからは利用できますが、広範なスキーマ/SQL アクセスは read-only メタデータだけから推測するには強力すぎます。外部クエリを直接許可する場合は、アクセスチェックと上限を持つアプリ所有の GET action、または行数・バイト数・タイムアウト・監査の制限を備えた明示的なテーブル/カラム許可リストを追加してください。`db-exec` と `db-patch` は自動公開の対象外です。
|
|
404
|
+
|
|
405
|
+
Slack の DM は、メールアドレスを検証し Agent Native 組織のメンバーであることを確認した後にだけユーザー ID を使用します。共有チャンネルはサービスプリンシパルを使い、参加者の個人的な権限を借用しません。管理対象 OAuth と生成される Slack マニフェストは `users:read.email` を要求します。既存のインストールはスコープ追加後に再接続し、古い bot トークンは Slack で手動更新してください。
|
|
375
406
|
|
|
376
407
|
### フルティア (明示的なオプトインのみ) {#full-tier}
|
|
377
408
|
|
|
@@ -473,7 +504,7 @@ ChatGPT/Claude スタイルの OAuth アプリ ホストの場合、検出サー
|
|
|
473
504
|
|
|
474
505
|
`create_workspace_app` は、許可リストに登録されていないテンプレートを拒否します。`packages/shared-app-config/templates.ts` のパブリック テンプレートの許可リストは権限があり、CI で保護されています。外部エージェントがそれを広げることはできません。同じ名前のテンプレート アクションは、組み込みをオーバーライドします (コアよりテンプレートが優先されます)。 `MCPConfig.builtinCrossAppTools: false` でセット全体を無効にします。
|
|
475
506
|
|
|
476
|
-
アプリ
|
|
507
|
+
アプリ ホストのツールおよびリソース カタログはデフォルトでコンパクトです。[カタログ階層](#catalog-tiers) を参照してください。`publicAgent.expose` は、コンパクト カタログ外の安全な読み取り/取り込みツールをアクション単位で有効にする設定です。アプリは `externalAgents.authenticatedReads: "auto"` を設定することで、手書きのカタログなしに認証済み読み取りを公開できます。`mcpApp.compactCatalog: true` は、チャット ホストの検出に必ず表示する必要があるアクションのまれな例外としてのみ設定してください。
|
|
477
508
|
|
|
478
509
|
高速 ChatGPT/Claude ハンドオフの場合、理想的なパスは直接パスです。アーティファクトを作成または開くアクションを呼び出してから、MCP アプリにルートを起動させます。 Mail リクエストは `manage_draft` を呼び出し、実際の作成ルートをレンダリングする必要があります。ダッシュボード リクエストでは、`open_app({ path, embed: true })` を呼び出すか、`mcpApp` を使用してダッシュボード アクションを呼び出し、完全な Analytics ルートをレンダリングする必要があります。カレンダー、フォーム、コンテンツ、スライド、デザイン、クリップは、下書き/作成/検索 actions と同じパターンに従う必要があります。 `list_apps` は、モデルが許可されたアプリの中から選択する必要がある場合に便利です。広範な `resources/list`、フルカタログ検出、または `ask_app` 委任は、明らかな UI ハンドオフの通常のルートであってはなりません。
|
|
479
510
|
|
|
@@ -238,6 +238,8 @@ VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE=1
|
|
|
238
238
|
- URL は、ブラウザー分析で使用されるものと同じ `scrubUrl()` ヘルパーでスクラブされます。
|
|
239
239
|
- リプレイ キャプチャは Web 専用でオプトインです。ネイティブ デスクトップ画面は記録しません。
|
|
240
240
|
|
|
241
|
+
拡張機能やレンダリングされたメール コンテンツなど、フレームワークが管理する iframe はリプレイ キャプチャに含まれます。記録されたフレーム内でも、同じマスキングおよびブロック用セレクターが適用されます。サードパーティのクロスオリジン iframe は、そのドキュメント自体がクロスオリジン iframe 記録を有効にした互換性のある rrweb レコーダーを実行しない限り不透明なままです。親ページからブラウザーのオリジン境界を回避することはできません。
|
|
242
|
+
|
|
241
243
|
記録中、セッション リプレイはブラウザーのコンソール出力 (`log`、`info`、`warn`、`error`、`debug`、およびウィンドウの `error`/`unhandledrejection`) とネットワーク リクエストのメタデータ (`fetch` および XHR) もタグ付けされた rrweb カスタム イベントとしてキャプチャするため、エージェントとリプレイ ビューアーがユーザー報告の問題をデバッグできます。キャプチャは、リプレイが有効な場合デフォルトでオンになっています。`sessionReplay.console` と `sessionReplay.network` オプション (それぞれ真偽値またはオプション オブジェクト `{ maxEvents?: number }` を受け取り、`network` はさらに `captureErrorBodies` と `maxErrorBodyLength` を受け取ります) で調整または無効化できます。リクエストの本文とヘッダーは記録されませんが、レスポンスの本文は 5xx (サーバー エラー) レスポンスに限り、境界付きでレダクト済みのスニペットとしてキャプチャされます (`captureErrorBodies`、デフォルトは `true`、上限は `maxErrorBodyLength` 文字、デフォルト 2048) — 5xx 以外およびネットワーク障害 (ステータス 0) のレスポンスに本文が含まれることはありません。URL はスクラブされ、メッセージは切り詰められ、レコーダー自身の取り込み/追跡トラフィックは除外されます。セッションごとの上限 (コンソール 1000 件/ネットワーク 2000 件) を超えると切り詰めの通知が追加されます。
|
|
242
244
|
|
|
243
245
|
Analytics テンプレートは、リプレイ メタデータを SQL (`session_recordings`) に保存し、チャンクはプライベートな blob 参照 (`session_replay_chunks`) を通じて保存します。ブラウザーとエージェントはプロバイダーの URL を受け取ることはありません。再生はスコープ付きのサーバー ルートを経由し、デフォルトのエージェント ツールは要約または範囲を限定したリプレイ イベントを返すのみで、生のチャンク テーブルへのアクセスはできません。
|
|
@@ -324,8 +324,9 @@ MCP 서버는 호스팅된 커넥터(ChatGPT, Claude), 코드 클라이언트(Cl
|
|
|
324
324
|
</div>
|
|
325
325
|
</div>
|
|
326
326
|
<p class="diagram-muted note">
|
|
327
|
-
<code>tool-search</code
|
|
328
|
-
|
|
327
|
+
<code>tool-search</code>는 필요할 때 전체 계층 도구를 검색하지만, 명시적으로
|
|
328
|
+
전체 계층을 선택하지 않는 한 실행에는 커넥터 카탈로그 또는 인증된 읽기 정책의
|
|
329
|
+
허용이 필요합니다.
|
|
329
330
|
</p>
|
|
330
331
|
```
|
|
331
332
|
|
|
@@ -363,15 +364,45 @@ MCP 서버는 호스팅된 커넥터(ChatGPT, Claude), 코드 클라이언트(Cl
|
|
|
363
364
|
|
|
364
365
|
### 컴팩트/커넥터 계층(기본값) {#connector-tier}
|
|
365
366
|
|
|
366
|
-
기본적으로 연결된 모든 에이전트는 작고 선별된 카탈로그를 봅니다(
|
|
367
|
+
기본적으로 연결된 모든 에이전트는 작고 선별된 카탈로그를 봅니다(약 20~30개의 도구 대 전체 표면의 약 105개). 앱은 명시적인 `connectorCatalog`를 관리하거나 인증된 읽기 정책을 선택할 수 있습니다.
|
|
367
368
|
|
|
368
369
|
- **템플릿에서 선언된 앱 actions** — 안전한 앱 수준 허용 목록입니다. `create-visual-plan`, `get-visual-plan`, `share-resource`, `navigate`, `tool-search` 및 유사한 계획의 경우
|
|
369
370
|
- **내장된 교차 앱 도구** — `list_apps`, `open_app`, `ask_app`, `create_embed_session`.
|
|
370
|
-
- **`tool-search`**는 항상
|
|
371
|
+
- **`tool-search`**는 검색을 위해 항상 제공됩니다. 검색된 action을 `tools/call`로 실행하려면 커넥터 카탈로그, 인증된 읽기 정책 또는 명시적인 전체 카탈로그 선택에서 허용되어야 합니다.
|
|
371
372
|
|
|
372
|
-
목록 외부의 도구(예: `db-exec`, `seed-*`, 확장 제품군, 브라우저 세션 도구 및 context-xray 도구)는 광고되지 않으며 호출자가 전체 카탈로그를 선택하지 않는 한 "알 수 없는 도구"와 함께 해당 호출이 거부됩니다. 이렇게 하면 연결된 각 에이전트의 컨텍스트 창을 작게 유지하고 단일 테넌트 로컬 개발에만 안전한
|
|
373
|
+
목록 외부의 도구(예: `db-exec`, `seed-*`, 확장 제품군, 브라우저 세션 도구 및 context-xray 도구)는 광고되지 않으며 호출자가 전체 카탈로그를 선택하지 않는 한 "알 수 없는 도구"와 함께 해당 호출이 거부됩니다. 이렇게 하면 연결된 각 에이전트의 컨텍스트 창을 작게 유지하고 단일 테넌트 로컬 개발에만 안전한 위험한 도구를 제거합니다.
|
|
373
374
|
|
|
374
|
-
`tool-search`는 두 가지 방식으로 작동합니다. 도구 이름의 전체 메뉴와 한 줄 설명(저렴함, 스키마 없음)
|
|
375
|
+
`tool-search`는 두 가지 방식으로 작동합니다. 도구 이름의 전체 메뉴와 한 줄 설명(저렴함, 스키마 없음)은 **쿼리 없이** 호출하고, 매개변수 요약이 포함된 순위 결과는 쿼리와 함께 호출합니다. 이는 압축된 클라이언트가 기능을 찾도록 돕습니다. 앱 에이전트의 더 폭넓은 추론이나 쓰기가 필요한 작업에는 `ask_app`을 사용하세요.
|
|
376
|
+
|
|
377
|
+
#### 인증된 읽기를 기본으로 활성화
|
|
378
|
+
|
|
379
|
+
긴 허용 목록을 관리하지 않고 직접 도구가 바로 작동하도록 하려는 앱은 자동 인증 읽기를 선택할 수 있습니다.
|
|
380
|
+
|
|
381
|
+
```ts
|
|
382
|
+
export default createAgentChatPlugin({
|
|
383
|
+
appId: "analytics",
|
|
384
|
+
externalAgents: {
|
|
385
|
+
authenticatedReads: "auto",
|
|
386
|
+
writes: "ask_app_only",
|
|
387
|
+
// 특히 민감한 읽기를 거부하기 위한 선택적 심층 방어입니다.
|
|
388
|
+
denyActions: ["get-sensitive-export"],
|
|
389
|
+
},
|
|
390
|
+
});
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
`authenticatedReads: "auto"`는 다음을 모두 명시적으로 선언한 action만 추가합니다.
|
|
394
|
+
|
|
395
|
+
- `http: { method: "GET" }`
|
|
396
|
+
- `readOnly: true`
|
|
397
|
+
- `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
|
|
398
|
+
|
|
399
|
+
정책은 이러한 action을 명시적인 `connectorCatalog` 항목과 결합한 다음 `denyActions`를 적용합니다. `writes: "ask_app_only"`(자동 읽기가 활성화된 경우 기본값)를 사용하면 변경 도구를 직접 호출할 수 없습니다. 여러 단계의 작업과 변경은 `ask_app`을 통해 처리하세요. `writes: "allowlisted"`는 명시적인 쓰기 허용 목록을 의도적으로 관리하는 앱에만 사용합니다.
|
|
400
|
+
|
|
401
|
+
이 정책은 인증된 액세스를 위한 것이며 익명 액세스를 위한 것이 아닙니다. MCP OAuth/연결 ID는 계속 `runWithRequestContext`를 통해 전달되므로 action 수준 액세스 검사, 소유자/조직 범위 지정 및 OAuth 읽기 범위가 그대로 적용됩니다. 공개/미인증 action은 자동 읽기에 포함되지 않습니다.
|
|
402
|
+
|
|
403
|
+
Core `db-schema`와 `db-query`는 자동 외부 읽기로 공개되지 않습니다. 일반적인 범위 지정 SQL 경로를 통해 앱 내부 에이전트에서는 사용할 수 있지만, 광범위한 스키마/SQL 접근은 읽기 전용 메타데이터만으로 추론하기에는 너무 강력합니다. 외부 쿼리가 필요하면 접근 검사와 제한을 갖춘 앱 소유 GET action 또는 행·바이트·시간 제한과 감사를 포함한 명시적 테이블/열 허용 목록을 제공하세요. `db-exec`와 `db-patch`는 자동 표면에 포함되지 않습니다.
|
|
404
|
+
|
|
405
|
+
Slack DM은 이메일을 검증하고 Agent Native 조직의 구성원임을 확인한 뒤에만 사용자 ID로 실행됩니다. 공유 채널은 서비스 주체를 사용하며 참여자의 개인 권한을 빌리지 않습니다. 관리형 OAuth와 생성된 Slack 매니페스트는 모두 `users:read.email`을 요청합니다. 기존 설치는 범위를 추가한 후 다시 연결해야 하며, 이전 봇 토큰은 Slack에서 수동으로 업데이트해야 합니다.
|
|
375
406
|
|
|
376
407
|
### 전체 등급(명시적 선택만 해당) {#full-tier}
|
|
377
408
|
|
|
@@ -475,7 +506,7 @@ ChatGPT/Claude 스타일 OAuth 앱 호스트의 경우 검색 표면은 기본
|
|
|
475
506
|
|
|
476
507
|
`create_workspace_app`는 허용 목록에 없는 템플릿을 거부합니다. `packages/shared-app-config/templates.ts`의 공개 템플릿 허용 목록은 신뢰할 수 있고 CI로 보호됩니다. 외부 에이전트는 이를 확장할 수 없습니다. 동일한 이름의 템플릿 작업은 기본 제공(코어보다 템플릿 우선 순위)을 재정의합니다. `MCPConfig.builtinCrossAppTools: false`로 전체 세트를 비활성화하세요.
|
|
477
508
|
|
|
478
|
-
앱
|
|
509
|
+
앱 호스트의 도구 및 리소스 카탈로그는 기본적으로 컴팩트합니다. [카탈로그 계층](#catalog-tiers)을 참조하세요. `publicAgent.expose`는 컴팩트 카탈로그 외부의 안전한 읽기/수집 도구를 action 단위로 선택하는 설정입니다. 앱은 `externalAgents.authenticatedReads: "auto"`를 설정하여 수동 카탈로그 없이 인증된 읽기를 노출할 수 있습니다. `mcpApp.compactCatalog: true`는 채팅 호스트 검색에 반드시 표시되어야 하는 action의 드문 예외에만 설정하세요.
|
|
479
510
|
|
|
480
511
|
빠른 ChatGPT/Claude 핸드오프를 위해 이상적인 경로는 직접입니다. 아티팩트를 생성하거나 여는 작업을 호출한 다음 MCP 앱이 경로를 시작하도록 합니다. 메일 요청은 `manage_draft`를 호출하고 실제 작성 경로를 렌더링해야 합니다. 대시보드 요청은 `open_app({ path, embed: true })` 또는 `mcpApp`를 사용한 대시보드 작업을 호출하고 전체 Analytics 경로를 렌더링해야 합니다. 달력, 양식, 콘텐츠, 슬라이드, 디자인 및 클립은 초안/생성/검색 actions와 동일한 패턴을 따라야 합니다. `list_apps`는 모델이 부여된 앱 중에서 선택해야 할 때 유용합니다. 광범위한 `resources/list`, 전체 카탈로그 검색 또는 `ask_app` 위임은 명백한 UI 핸드오프를 위한 일반적인 경로가 되어서는 안 됩니다.
|
|
481
512
|
|