@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.
Files changed (314) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +28 -0
  3. package/corpus/core/docs/content/durable-background-runs.mdx +37 -0
  4. package/corpus/core/docs/content/external-agents.mdx +62 -7
  5. package/corpus/core/docs/content/locales/ar-SA/external-agents.mdx +38 -7
  6. package/corpus/core/docs/content/locales/ar-SA/tracking.mdx +2 -0
  7. package/corpus/core/docs/content/locales/de-DE/external-agents.mdx +39 -7
  8. package/corpus/core/docs/content/locales/de-DE/tracking.mdx +2 -0
  9. package/corpus/core/docs/content/locales/es-ES/external-agents.mdx +39 -7
  10. package/corpus/core/docs/content/locales/es-ES/tracking.mdx +2 -0
  11. package/corpus/core/docs/content/locales/fr-FR/external-agents.mdx +39 -7
  12. package/corpus/core/docs/content/locales/fr-FR/tracking.mdx +4 -2
  13. package/corpus/core/docs/content/locales/hi-IN/external-agents.mdx +38 -7
  14. package/corpus/core/docs/content/locales/hi-IN/tracking.mdx +2 -0
  15. package/corpus/core/docs/content/locales/ja-JP/external-agents.mdx +38 -7
  16. package/corpus/core/docs/content/locales/ja-JP/tracking.mdx +2 -0
  17. package/corpus/core/docs/content/locales/ko-KR/external-agents.mdx +38 -7
  18. package/corpus/core/docs/content/locales/ko-KR/tracking.mdx +2 -0
  19. package/corpus/core/docs/content/locales/pt-BR/external-agents.mdx +39 -7
  20. package/corpus/core/docs/content/locales/pt-BR/tracking.mdx +2 -0
  21. package/corpus/core/docs/content/locales/zh-CN/external-agents.mdx +37 -7
  22. package/corpus/core/docs/content/locales/zh-CN/tracking.mdx +2 -0
  23. package/corpus/core/docs/content/locales/zh-TW/durable-background-runs.mdx +14 -0
  24. package/corpus/core/docs/content/locales/zh-TW/external-agents.mdx +37 -7
  25. package/corpus/core/docs/content/locales/zh-TW/tracking.mdx +2 -0
  26. package/corpus/core/docs/content/tracking.mdx +2 -0
  27. package/corpus/core/package.json +1 -1
  28. package/corpus/core/src/a2a/handlers.ts +95 -21
  29. package/corpus/core/src/a2a/task-store.ts +65 -3
  30. package/corpus/core/src/agent/durable-background.ts +16 -16
  31. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +25 -8
  32. package/corpus/core/src/agent/engine/anthropic-engine.ts +17 -3
  33. package/corpus/core/src/agent/engine/output-tokens.ts +6 -6
  34. package/corpus/core/src/agent/production-agent.ts +200 -27
  35. package/corpus/core/src/agent/run-manager.ts +81 -1
  36. package/corpus/core/src/agent/run-store.ts +301 -41
  37. package/corpus/core/src/client/AgentPanel.tsx +6 -2
  38. package/corpus/core/src/client/AssistantChat.tsx +364 -69
  39. package/corpus/core/src/client/agent-chat-adapter.ts +169 -1
  40. package/corpus/core/src/client/chat/message-components.tsx +3 -0
  41. package/corpus/core/src/client/chat/tool-call-display.tsx +20 -36
  42. package/corpus/core/src/client/conversation/use-near-bottom-autoscroll.ts +7 -0
  43. package/corpus/core/src/client/extensions/AgentNativeExtensionFrame.tsx +2 -0
  44. package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +2 -0
  45. package/corpus/core/src/client/extensions/ExtensionEditor.tsx +9 -2
  46. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +2 -0
  47. package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +2 -0
  48. package/corpus/core/src/client/extensions/portable-extension.ts +2 -0
  49. package/corpus/core/src/client/session-replay.ts +361 -29
  50. package/corpus/core/src/client/sse-event-processor.ts +43 -1
  51. package/corpus/core/src/demo/actions/toggle-demo-mode.ts +1 -1
  52. package/corpus/core/src/demo/config.ts +6 -6
  53. package/corpus/core/src/demo/fetch-interceptor.ts +13 -4
  54. package/corpus/core/src/demo/redact.ts +13 -149
  55. package/corpus/core/src/extensions/html-shell.ts +3 -0
  56. package/corpus/core/src/extensions/session-replay-iframe.ts +131 -0
  57. package/corpus/core/src/integrations/adapters/slack.ts +123 -13
  58. package/corpus/core/src/integrations/identity-links-store.ts +210 -0
  59. package/corpus/core/src/integrations/identity.ts +132 -0
  60. package/corpus/core/src/integrations/index.ts +6 -0
  61. package/corpus/core/src/integrations/plugin.ts +58 -1
  62. package/corpus/core/src/integrations/types.ts +7 -0
  63. package/corpus/core/src/mcp/build-server.ts +127 -22
  64. package/corpus/core/src/mcp/external-agent-policy.ts +18 -0
  65. package/corpus/core/src/mcp/index.ts +1 -0
  66. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +1 -20
  67. package/corpus/core/src/server/agent-chat/plugin-options.ts +12 -1
  68. package/corpus/core/src/server/agent-chat/script-entries.ts +20 -3
  69. package/corpus/core/src/server/agent-chat-plugin.ts +3 -0
  70. package/corpus/core/src/session-replay-iframe-protocol.ts +58 -0
  71. package/corpus/core/src/shared/reasoning-effort.ts +35 -0
  72. package/corpus/core/src/styles/agent-conversation.css +26 -0
  73. package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +34 -5
  74. package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
  75. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +30 -21
  76. package/corpus/templates/analytics/AGENTS.md +27 -0
  77. package/corpus/templates/analytics/actions/create-session-replay-agent-link.ts +0 -1
  78. package/corpus/templates/analytics/actions/get-error-issue.ts +1 -0
  79. package/corpus/templates/analytics/actions/get-session-replay-summary.ts +1 -0
  80. package/corpus/templates/analytics/actions/get-session-replay-timeline.ts +40 -0
  81. package/corpus/templates/analytics/actions/list-error-issues.ts +13 -0
  82. package/corpus/templates/analytics/actions/list-session-recordings.ts +1 -0
  83. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +4 -0
  84. package/corpus/templates/analytics/app/global.css +2 -2
  85. package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +41 -4
  86. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +52 -203
  87. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +69 -16
  88. package/corpus/templates/analytics/changelog/2026-07-12-analytics-chat-retries-before-showing-a-generic-no-data-mess.md +6 -0
  89. package/corpus/templates/analytics/changelog/2026-07-12-analytics-sessions-search-no-longer-loses-fast-keystrokes-an.md +6 -0
  90. package/corpus/templates/analytics/changelog/2026-07-12-chart-selection-respects-chat-state.md +6 -0
  91. package/corpus/templates/analytics/changelog/2026-07-12-connected-external-agents-can-now-look-up-sessions-error-iss.md +6 -0
  92. package/corpus/templates/analytics/changelog/2026-07-12-demo-mode-anonymizes-error-reporting-emails.md +6 -0
  93. package/corpus/templates/analytics/changelog/2026-07-12-session-identities-stay-visible-when-demo-mode-is-off.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-12-session-replays-show-iframe-content.md +6 -0
  95. package/corpus/templates/analytics/netlify.toml +0 -3
  96. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +14 -0
  97. package/corpus/templates/analytics/server/lib/error-capture.ts +101 -2
  98. package/corpus/templates/analytics/server/lib/real-data-actions.ts +24 -0
  99. package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +49 -17
  100. package/corpus/templates/analytics/server/lib/session-replay.ts +18 -16
  101. package/corpus/templates/analytics/server/plugins/agent-chat.ts +43 -6
  102. package/corpus/templates/analytics/server/plugins/db.ts +15 -0
  103. package/corpus/templates/assets/app/global.css +1 -1
  104. package/corpus/templates/brain/app/global.css +2 -2
  105. package/corpus/templates/brain/changelog/2026-07-12-fix-long-response-progress.md +6 -0
  106. package/corpus/templates/forms/app/components/CloudUpgrade.tsx +1 -1
  107. package/corpus/templates/forms/app/components/ThemeToggle.tsx +22 -6
  108. package/corpus/templates/forms/app/components/builder/FieldPropertiesPanel.tsx +5 -5
  109. package/corpus/templates/forms/app/components/builder/FieldRenderer.tsx +3 -3
  110. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +16 -16
  111. package/corpus/templates/forms/app/global.css +164 -13
  112. package/corpus/templates/forms/app/pages/AskPage.tsx +35 -13
  113. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +143 -67
  114. package/corpus/templates/forms/app/pages/FormFillPage.tsx +44 -11
  115. package/corpus/templates/forms/app/pages/FormsListPage.tsx +42 -24
  116. package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +28 -15
  117. package/corpus/templates/forms/app/pages/ResponsesPage.tsx +46 -20
  118. package/corpus/templates/forms/app/routes/_app.settings.tsx +1 -1
  119. package/corpus/templates/forms/changelog/2026-07-12-ask-forms-suggestions-now-sit-beneath-the-composer-for-a-tig.md +6 -0
  120. package/corpus/templates/forms/changelog/2026-07-12-builder-response-tables-now-fill-the-view-without-a-redundan.md +6 -0
  121. package/corpus/templates/forms/changelog/2026-07-12-form-builder-surfaces-are-calmer-fields-stay-stable-on-hover.md +6 -0
  122. package/corpus/templates/forms/changelog/2026-07-12-response-tables-now-fill-the-available-pane-with-a-flexible-.md +6 -0
  123. package/corpus/templates/forms/changelog/2026-07-12-smoother-more-tactile-controls-throughout-animated-icon-and-.md +6 -0
  124. package/corpus/templates/mail/AGENTS.md +3 -1
  125. package/corpus/templates/mail/app/components/email/EmailThread.tsx +21 -13
  126. package/corpus/templates/mail/app/components/email/email-iframe-document.ts +18 -0
  127. package/corpus/templates/mail/server/lib/mail-integrations.ts +3 -0
  128. package/dist/a2a/handlers.d.ts.map +1 -1
  129. package/dist/a2a/handlers.js +84 -15
  130. package/dist/a2a/handlers.js.map +1 -1
  131. package/dist/a2a/task-store.d.ts +20 -1
  132. package/dist/a2a/task-store.d.ts.map +1 -1
  133. package/dist/a2a/task-store.js +57 -4
  134. package/dist/a2a/task-store.js.map +1 -1
  135. package/dist/agent/durable-background.d.ts +10 -10
  136. package/dist/agent/durable-background.d.ts.map +1 -1
  137. package/dist/agent/durable-background.js +16 -16
  138. package/dist/agent/durable-background.js.map +1 -1
  139. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  140. package/dist/agent/engine/ai-sdk-engine.js +19 -8
  141. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  142. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  143. package/dist/agent/engine/anthropic-engine.js +11 -3
  144. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  145. package/dist/agent/engine/output-tokens.js +6 -6
  146. package/dist/agent/engine/output-tokens.js.map +1 -1
  147. package/dist/agent/production-agent.d.ts +52 -0
  148. package/dist/agent/production-agent.d.ts.map +1 -1
  149. package/dist/agent/production-agent.js +154 -26
  150. package/dist/agent/production-agent.js.map +1 -1
  151. package/dist/agent/run-manager.d.ts +9 -0
  152. package/dist/agent/run-manager.d.ts.map +1 -1
  153. package/dist/agent/run-manager.js +71 -1
  154. package/dist/agent/run-manager.js.map +1 -1
  155. package/dist/agent/run-store.d.ts +9 -0
  156. package/dist/agent/run-store.d.ts.map +1 -1
  157. package/dist/agent/run-store.js +243 -48
  158. package/dist/agent/run-store.js.map +1 -1
  159. package/dist/client/AgentPanel.d.ts.map +1 -1
  160. package/dist/client/AgentPanel.js +6 -2
  161. package/dist/client/AgentPanel.js.map +1 -1
  162. package/dist/client/AssistantChat.d.ts +21 -0
  163. package/dist/client/AssistantChat.d.ts.map +1 -1
  164. package/dist/client/AssistantChat.js +298 -67
  165. package/dist/client/AssistantChat.js.map +1 -1
  166. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  167. package/dist/client/agent-chat-adapter.js +146 -1
  168. package/dist/client/agent-chat-adapter.js.map +1 -1
  169. package/dist/client/chat/message-components.d.ts.map +1 -1
  170. package/dist/client/chat/message-components.js +2 -1
  171. package/dist/client/chat/message-components.js.map +1 -1
  172. package/dist/client/chat/tool-call-display.d.ts +3 -1
  173. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  174. package/dist/client/chat/tool-call-display.js +13 -37
  175. package/dist/client/chat/tool-call-display.js.map +1 -1
  176. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts +1 -0
  177. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts.map +1 -1
  178. package/dist/client/conversation/use-near-bottom-autoscroll.js +6 -0
  179. package/dist/client/conversation/use-near-bottom-autoscroll.js.map +1 -1
  180. package/dist/client/extensions/AgentNativeExtensionFrame.d.ts.map +1 -1
  181. package/dist/client/extensions/AgentNativeExtensionFrame.js +2 -1
  182. package/dist/client/extensions/AgentNativeExtensionFrame.js.map +1 -1
  183. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  184. package/dist/client/extensions/EmbeddedExtension.js +2 -1
  185. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  186. package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -1
  187. package/dist/client/extensions/ExtensionEditor.js +5 -2
  188. package/dist/client/extensions/ExtensionEditor.js.map +1 -1
  189. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  190. package/dist/client/extensions/ExtensionViewer.js +2 -1
  191. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  192. package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
  193. package/dist/client/extensions/InlineExtensionFrame.js +2 -1
  194. package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
  195. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  196. package/dist/client/extensions/portable-extension.js +2 -0
  197. package/dist/client/extensions/portable-extension.js.map +1 -1
  198. package/dist/client/session-replay.d.ts.map +1 -1
  199. package/dist/client/session-replay.js +308 -29
  200. package/dist/client/session-replay.js.map +1 -1
  201. package/dist/client/sse-event-processor.d.ts +5 -0
  202. package/dist/client/sse-event-processor.d.ts.map +1 -1
  203. package/dist/client/sse-event-processor.js +37 -1
  204. package/dist/client/sse-event-processor.js.map +1 -1
  205. package/dist/collab/routes.d.ts +1 -1
  206. package/dist/demo/actions/toggle-demo-mode.js +1 -1
  207. package/dist/demo/actions/toggle-demo-mode.js.map +1 -1
  208. package/dist/demo/config.js +6 -6
  209. package/dist/demo/config.js.map +1 -1
  210. package/dist/demo/fetch-interceptor.d.ts.map +1 -1
  211. package/dist/demo/fetch-interceptor.js +13 -4
  212. package/dist/demo/fetch-interceptor.js.map +1 -1
  213. package/dist/demo/redact.d.ts +7 -7
  214. package/dist/demo/redact.d.ts.map +1 -1
  215. package/dist/demo/redact.js +8 -145
  216. package/dist/demo/redact.js.map +1 -1
  217. package/dist/extensions/html-shell.d.ts.map +1 -1
  218. package/dist/extensions/html-shell.js +2 -0
  219. package/dist/extensions/html-shell.js.map +1 -1
  220. package/dist/extensions/session-replay-iframe.d.ts +10 -0
  221. package/dist/extensions/session-replay-iframe.d.ts.map +1 -0
  222. package/dist/extensions/session-replay-iframe.js +121 -0
  223. package/dist/extensions/session-replay-iframe.js.map +1 -0
  224. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  225. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  226. package/dist/integrations/adapters/slack.js +98 -13
  227. package/dist/integrations/adapters/slack.js.map +1 -1
  228. package/dist/integrations/identity-links-store.d.ts +23 -0
  229. package/dist/integrations/identity-links-store.d.ts.map +1 -0
  230. package/dist/integrations/identity-links-store.js +158 -0
  231. package/dist/integrations/identity-links-store.js.map +1 -0
  232. package/dist/integrations/identity.d.ts +11 -0
  233. package/dist/integrations/identity.d.ts.map +1 -0
  234. package/dist/integrations/identity.js +100 -0
  235. package/dist/integrations/identity.js.map +1 -0
  236. package/dist/integrations/index.d.ts +2 -0
  237. package/dist/integrations/index.d.ts.map +1 -1
  238. package/dist/integrations/index.js +2 -0
  239. package/dist/integrations/index.js.map +1 -1
  240. package/dist/integrations/plugin.d.ts.map +1 -1
  241. package/dist/integrations/plugin.js +43 -1
  242. package/dist/integrations/plugin.js.map +1 -1
  243. package/dist/integrations/types.d.ts +6 -0
  244. package/dist/integrations/types.d.ts.map +1 -1
  245. package/dist/integrations/types.js.map +1 -1
  246. package/dist/mcp/build-server.d.ts +9 -2
  247. package/dist/mcp/build-server.d.ts.map +1 -1
  248. package/dist/mcp/build-server.js +97 -20
  249. package/dist/mcp/build-server.js.map +1 -1
  250. package/dist/mcp/external-agent-policy.d.ts +19 -0
  251. package/dist/mcp/external-agent-policy.d.ts.map +1 -0
  252. package/dist/mcp/external-agent-policy.js +2 -0
  253. package/dist/mcp/external-agent-policy.js.map +1 -0
  254. package/dist/mcp/index.d.ts +1 -0
  255. package/dist/mcp/index.d.ts.map +1 -1
  256. package/dist/mcp/index.js.map +1 -1
  257. package/dist/notifications/routes.d.ts +1 -1
  258. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  259. package/dist/scripts/agent-engines/list-agent-engines.js +1 -19
  260. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  261. package/dist/server/agent-chat/plugin-options.d.ts +11 -1
  262. package/dist/server/agent-chat/plugin-options.d.ts.map +1 -1
  263. package/dist/server/agent-chat/plugin-options.js.map +1 -1
  264. package/dist/server/agent-chat/script-entries.d.ts.map +1 -1
  265. package/dist/server/agent-chat/script-entries.js +16 -2
  266. package/dist/server/agent-chat/script-entries.js.map +1 -1
  267. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  268. package/dist/server/agent-chat-plugin.js +3 -0
  269. package/dist/server/agent-chat-plugin.js.map +1 -1
  270. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  271. package/dist/server/transcribe-voice.d.ts +1 -1
  272. package/dist/session-replay-iframe-protocol.d.ts +36 -0
  273. package/dist/session-replay-iframe-protocol.d.ts.map +1 -0
  274. package/dist/session-replay-iframe-protocol.js +24 -0
  275. package/dist/session-replay-iframe-protocol.js.map +1 -0
  276. package/dist/shared/reasoning-effort.d.ts +11 -0
  277. package/dist/shared/reasoning-effort.d.ts.map +1 -1
  278. package/dist/shared/reasoning-effort.js +36 -0
  279. package/dist/shared/reasoning-effort.js.map +1 -1
  280. package/dist/styles/agent-conversation.css +26 -0
  281. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +34 -5
  282. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
  283. package/docs/content/durable-background-runs.mdx +37 -0
  284. package/docs/content/external-agents.mdx +62 -7
  285. package/docs/content/locales/ar-SA/external-agents.mdx +38 -7
  286. package/docs/content/locales/ar-SA/tracking.mdx +2 -0
  287. package/docs/content/locales/de-DE/external-agents.mdx +39 -7
  288. package/docs/content/locales/de-DE/tracking.mdx +2 -0
  289. package/docs/content/locales/es-ES/external-agents.mdx +39 -7
  290. package/docs/content/locales/es-ES/tracking.mdx +2 -0
  291. package/docs/content/locales/fr-FR/external-agents.mdx +39 -7
  292. package/docs/content/locales/fr-FR/tracking.mdx +4 -2
  293. package/docs/content/locales/hi-IN/external-agents.mdx +38 -7
  294. package/docs/content/locales/hi-IN/tracking.mdx +2 -0
  295. package/docs/content/locales/ja-JP/external-agents.mdx +38 -7
  296. package/docs/content/locales/ja-JP/tracking.mdx +2 -0
  297. package/docs/content/locales/ko-KR/external-agents.mdx +38 -7
  298. package/docs/content/locales/ko-KR/tracking.mdx +2 -0
  299. package/docs/content/locales/pt-BR/external-agents.mdx +39 -7
  300. package/docs/content/locales/pt-BR/tracking.mdx +2 -0
  301. package/docs/content/locales/zh-CN/external-agents.mdx +37 -7
  302. package/docs/content/locales/zh-CN/tracking.mdx +2 -0
  303. package/docs/content/locales/zh-TW/durable-background-runs.mdx +14 -0
  304. package/docs/content/locales/zh-TW/external-agents.mdx +37 -7
  305. package/docs/content/locales/zh-TW/tracking.mdx +2 -0
  306. package/docs/content/tracking.mdx +2 -0
  307. package/package.json +2 -2
  308. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +34 -5
  309. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
  310. package/corpus/core/src/observability/hosted-model-experiment.ts +0 -118
  311. package/dist/observability/hosted-model-experiment.d.ts +0 -39
  312. package/dist/observability/hosted-model-experiment.d.ts.map +0 -1
  313. package/dist/observability/hosted-model-experiment.js +0 -90
  314. package/dist/observability/hosted-model-experiment.js.map +0 -1
package/corpus/README.md CHANGED
@@ -27,5 +27,5 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
27
27
 
28
28
  ## Generated Counts
29
29
 
30
- - core files: 2235
31
- - template files: 5491
30
+ - core files: 2239
31
+ - template files: 5507
@@ -1,5 +1,33 @@
1
1
  # @agent-native/core
2
2
 
3
+ ## 0.98.6
4
+
5
+ ### Patch Changes
6
+
7
+ - c4bb9ee: Add an opt-in authenticated-read MCP policy that automatically exposes explicitly safe GET actions while keeping external writes behind `ask_app`. Generic SQL stays out of that automatic surface.
8
+
9
+ The `authenticatedReads: "auto"` derivation now also applies a hard, name-based exclusion for generic database (`db-query`/`db-schema`/`db-exec`/`db-patch`), template `seed-*`, extension-management, browser-session, and Context X-Ray actions, so they can never be auto-exposed even if one is mis-annotated with the full authenticated-read flag set — only an explicit `connectorCatalog` entry can expose them.
10
+
11
+ - c4bb9ee: Bound queued and processing A2A task lifetimes, preserve asynchronous dispatch semantics, and fail unrecoverable handoffs deterministically.
12
+ - c4bb9ee: Slack identity lookups no longer cache a failed users.info result for the full 10-minute TTL. Transient Slack API failures now use a short 30-second negative cache, so a brief blip cannot fail-close a sender's identity (and their DMs) for 10 minutes.
13
+ - c4bb9ee: Run verified Slack direct messages with the linked Agent Native user's organization-scoped identity while keeping shared-channel messages service-scoped and rejecting unverified, guest, external, or cross-organization identities.
14
+
15
+ ## 0.98.5
16
+
17
+ ### Patch Changes
18
+
19
+ - 10dc602: Keep session replay upload backlogs within byte and event caps, and safely split server-rejected oversized batches without losing or duplicating events.
20
+ - 10dc602: Collapse completed reasoning segments into timed thought disclosures while keeping the active thought expanded.
21
+ - 10dc602: Use `anonymous@builder.io` for every email address anonymized by Demo mode.
22
+ - 10dc602: Keep long agent responses visibly active across automatic continuations, reliably follow streamed output until the user scrolls away, and default unsafe regular-function self-chaining off on hosted deployments (opt back in with `AGENT_CHAT_FOREGROUND_SELF_CHAIN`).
23
+ - 10dc602: Use Claude Haiku 4.5's supported manual thinking budget instead of sending the unsupported adaptive-thinking request.
24
+ - 10dc602: Capture framework-owned iframe content and interactions in browser session replays.
25
+ - 10dc602: Fix a durable-background chat turn dying mid-sentence with no recovery: `/runs/active` now prefers a live successor over a stale in-memory terminal run, a hung first model-stream event checkpoints within 25s instead of riding the full 90s watchdog past the foreground platform kill, and the stale-run reapers now insert a claimable recovery successor (instead of leaving the turn dead) when a background worker dies silently.
26
+ - 10dc602: Stop assigning first-party hosted app users between Sonnet and Luna so default model selection follows the normal engine configuration.
27
+ - 10dc602: Also skip demo-mode number redaction on session replay manifest requests, alongside the existing chunk/event payload skip, so replay geometry and pointer data can never be faked at view time.
28
+ - 10dc602: Fixed a bug where a long-running background agent turn could flip the chat to a finished state mid-turn: if the client re-polled a chunk's terminal run row before its server-chained successor became visible, it now keeps following instead of prematurely completing the message. Background runs that die between chunks now get a short grace window to recover onto a claimable successor before surfacing an error, and the "Resuming…" indicator stays warm while the client waits, so the UI never drops into a false-idle state during the handoff.
29
+ - 10dc602: Widen centered full-page Ask and Chat composers by 20% while keeping their responsive viewport cap.
30
+
3
31
  ## 0.98.4
4
32
 
5
33
  ### Patch Changes
@@ -194,6 +194,43 @@ Durable runs are opt-in per app and default OFF. Enable with AGENT_CHAT_DURABLE_
194
194
 
195
195
  </Callout>
196
196
 
197
+ ## The foreground self-chain: a narrower, opt-in escape hatch {#foreground-self-chain}
198
+
199
+ A second, independent flag governs a different continuation mechanism:
200
+ `AGENT_CHAT_FOREGROUND_SELF_CHAIN`. Where durable background runs move a whole
201
+ long turn onto the 15-minute background function above, the foreground
202
+ self-chain lets a normal (non-durable-background) turn that hits its
203
+ soft-timeout chunk boundary continue via a server-side self-dispatch on the
204
+ **regular** request function, instead of depending on the client to re-POST
205
+ `auto_continue`.
206
+
207
+ It composes the same way as `AGENT_CHAT_DURABLE_BACKGROUND`: true only when
208
+ the env flag is explicitly truthy (`true` / `1` / `yes` / `on`), the runtime
209
+ is hosted, and `A2A_SECRET` is configured. The two flags are independent and
210
+ never need to agree — an app can enable this narrower capability without
211
+ opting into the full background-function worker path. When a run already
212
+ qualifies for durable background dispatch, that decision is evaluated first
213
+ and takes precedence; the run chains through the background worker instead of
214
+ this path.
215
+
216
+ <Callout id="doc-block-fgschn1" tone="warning">
217
+
218
+ This flag is **opt-in and default OFF**. A regular Netlify function has a
219
+ fixed **60-second** wall — far shorter than the 15-minute background-function
220
+ budget above — so a self-dispatched successor can be killed mid-run before it
221
+ persists its next continuation, cutting a long response off mid-sentence.
222
+ With the flag off, hosted apps use the existing client-driven `auto_continue`
223
+ re-POST path instead, which is slower to resume but cannot be killed by a
224
+ server-side timeout.
225
+
226
+ </Callout>
227
+
228
+ Only enable this once you've verified the hosted deployment's regular
229
+ function reliably completes self-dispatched continuations inside that
230
+ 60-second wall. For long, multi-step turns, prefer
231
+ `AGENT_CHAT_DURABLE_BACKGROUND` above — its background function has a much
232
+ larger budget and is the recommended path.
233
+
197
234
  ## What's next
198
235
 
199
236
  - [**Durable Resume**](/docs/durable-resume) — how an interrupted run resumes
@@ -325,8 +325,9 @@ The MCP server serves a **compact catalog by default to every caller** — hoste
325
325
  </div>
326
326
  </div>
327
327
  <p class="diagram-muted note">
328
- <code>tool-search</code> reaches any full-tier tool on demand &mdash; so the
329
- compact default keeps context small without hiding capability.
328
+ <code>tool-search</code> discovers full-tier tools on demand; the connector
329
+ catalog or authenticated-read policy must still permit execution unless the
330
+ caller explicitly opts into the full tier.
330
331
  </p>
331
332
  ```
332
333
 
@@ -364,15 +365,69 @@ The MCP server serves a **compact catalog by default to every caller** — hoste
364
365
 
365
366
  ### Compact / connector tier (default) {#connector-tier}
366
367
 
367
- By default every connected agent sees a small, curated catalog (~20–30 tools vs. ~105 in the full surface):
368
+ By default every connected agent sees a small, curated catalog (~20–30 tools vs. ~105 in the full surface). Apps can either maintain an explicit `connectorCatalog`, or opt into the authenticated-read policy:
368
369
 
369
370
  - **Template-declared app actions** — the safe app-level allow-list. For Plan that is `create-visual-plan`, `get-visual-plan`, `share-resource`, `navigate`, `tool-search`, and similar.
370
371
  - **Builtin cross-app tools** — `list_apps`, `open_app`, `ask_app`, `create_embed_session`.
371
- - **`tool-search`** is always present, so anything outside the list stays reachable on demand (see below).
372
+ - **`tool-search`** is always present for discovery. A discovered action still needs to be in the connector catalog, included by the authenticated-read policy, or reached through the explicit full-catalog opt-in before `tools/call` can execute it.
372
373
 
373
- Tools outside the list — for example `db-exec`, `seed-*`, the extension suite, browser-session tools, and context-xray tools — are not advertised, and calls to them are rejected with "Unknown tool" unless the caller has opted into the full catalog. This keeps each connected agent's context window small and removes footguns that are only safe for single-tenant local development. The connector tier is active **whenever a template declares a `connectorCatalog`** — it is not gated behind an environment variable.
374
+ Tools outside the list — for example `db-exec`, `seed-*`, the extension suite, browser-session tools, and context-xray tools — are not advertised, and calls to them are rejected with "Unknown tool" unless the caller has opted into the full catalog. This keeps each connected agent's context window small and removes footguns that are only safe for single-tenant local development.
374
375
 
375
- `tool-search` works two ways: call it with **no query** for the full menu of tool names plus one-line descriptions (cheap, no schemas), or with a query for ranked matches with parameter summaries. That is how a compacted client discovers and loads any full-surface tool when it needs one.
376
+ `tool-search` works two ways: call it with **no query** for the full menu of tool names plus one-line descriptions (cheap, no schemas), or with a query for ranked matches with parameter summaries. It helps a compacted client discover capabilities; use `ask_app` for anything that requires the app agent's broader reasoning or a write.
377
+
378
+ #### Authenticated reads by default
379
+
380
+ Apps that want direct tools to "just work" without maintaining a long allow-list can opt into automatic authenticated reads:
381
+
382
+ ```ts
383
+ export default createAgentChatPlugin({
384
+ appId: "analytics",
385
+ externalAgents: {
386
+ authenticatedReads: "auto",
387
+ writes: "ask_app_only",
388
+ // Optional defense-in-depth veto for especially sensitive reads.
389
+ denyActions: ["get-sensitive-export"],
390
+ },
391
+ });
392
+ ```
393
+
394
+ `authenticatedReads: "auto"` adds only actions that explicitly declare all of the following:
395
+
396
+ - `http: { method: "GET" }`
397
+ - `readOnly: true`
398
+ - `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
399
+
400
+ The policy combines those actions with any explicit `connectorCatalog` entries, then applies `denyActions`. With `writes: "ask_app_only"` (the default when automatic reads are enabled), mutating tools are not directly callable; route multi-step work and mutations through `ask_app`. `writes: "allowlisted"` exists only for apps that intentionally maintain an explicit write allow-list.
401
+
402
+ The policy is authenticated, not anonymous. MCP OAuth/connect identity is still carried through `runWithRequestContext`, so action-level access checks, owner/org scoping, and OAuth read scopes remain in force. Public/unauthenticated actions are not included by automatic reads.
403
+
404
+ Generic core `db-schema` and `db-query` are intentionally **not** automatic external reads. They remain available to the in-app agent through the normal scoped SQL path, but broad schema/SQL access is too powerful to infer from read-only metadata alone. If an app needs direct external querying, expose an app-owned GET action with its own access checks and bounded query contract, or add an explicit app-level table/column allow-list with row, byte, timeout, and audit limits. `db-exec` and `db-patch` remain outside the automatic surface.
405
+
406
+ This is a hard, name-based exclusion, not just a metadata omission: generic database/seed/browser-session/extension/Context X-Ray tools are never auto-exposed even if a future change accidentally annotates one with the full authenticated-read flag set — they always require an explicit `connectorCatalog` entry.
407
+
408
+ #### Identity and authorization
409
+
410
+ Authentication and authorization are separate gates. A verified MCP OAuth or
411
+ connect token identifies the caller and organization; `publicAgent` only opts
412
+ an action into the external protocol surface. It does not grant access to a
413
+ record. Actions must still use the normal `accessFilter`, `resolveAccess`, or
414
+ `assertAccess` helpers, so private documents and dashboards remain private,
415
+ shared resources follow their share/org rules, and cross-organization reads are
416
+ rejected.
417
+
418
+ The default Slack integration follows the same rule. A verified Slack DM is
419
+ matched to an existing Agent Native organization member and persisted as a
420
+ workspace/user identity link before the agent runs. The resulting user/org
421
+ context loads that user's resources, instructions, and skills. Shared Slack
422
+ channels use a service principal instead of borrowing one participant's
423
+ private permissions; guests and external Slack members cannot use personal
424
+ Agent Native access by default. If a Slack identity cannot be verified or its
425
+ link changes, the message is rejected rather than downgraded to a broad
426
+ service identity. Managed Slack OAuth requests the `users:read.email` bot
427
+ scope, and the generated Slack app manifest requests it too. Existing Slack
428
+ installs must be reconnected/reinstalled to grant a newly added scope; legacy
429
+ bot-token installs must add the scope in Slack manually. Without it, personal
430
+ DM execution fails closed.
376
431
 
377
432
  ### Full tier (explicit opt-in only) {#full-tier}
378
433
 
@@ -469,7 +524,7 @@ On top of the per-action tools the MCP server exposes a stable verb set, so an e
469
524
 
470
525
  `create_workspace_app` rejects any non-allow-listed template — the public template allow-list in `packages/shared-app-config/templates.ts` is authoritative and CI-guarded; an external agent cannot widen it. A same-named template action overrides a builtin (template-over-core precedence). Disable the whole set with `MCPConfig.builtinCrossAppTools: false`.
471
526
 
472
- The tool and resource catalogs for app hosts are compact by default — see [Catalog tiers](#catalog-tiers). `publicAgent.expose` remains the opt-in for safe read/ingest tools outside that compact catalog; set `mcpApp.compactCatalog: true` only as a rare exception for actions that must appear in chat-host discovery.
527
+ The tool and resource catalogs for app hosts are compact by default — see [Catalog tiers](#catalog-tiers). `publicAgent.expose` remains the action-level opt-in for safe read/ingest tools outside that compact catalog; apps may set `externalAgents.authenticatedReads: "auto"` to advertise those authenticated reads without a hand-written catalog. Set `mcpApp.compactCatalog: true` only as a rare exception for actions that must appear in chat-host discovery.
473
528
 
474
529
  For fast ChatGPT/Claude handoffs, the ideal path is direct: call the action that creates or opens the artifact, then let the MCP App launch the route. A Mail request should call `manage_draft` and render the real compose route. A dashboard request should call `open_app({ path, embed: true })` or a dashboard action with `mcpApp` and render the full Analytics route. Calendar, Forms, Content, Slides, Design, and Clips should follow the same pattern with their draft/create/search actions. `list_apps` is useful when the model must choose among granted apps; broad `resources/list`, full-catalog discovery, or `ask_app` delegation should not be the normal route for an obvious UI handoff.
475
530
 
@@ -324,8 +324,9 @@ https://dispatch.agent-native.com/_agent-native/mcp
324
324
  </div>
325
325
  </div>
326
326
  <p class="diagram-muted note">
327
- <code>tool-search</code> reaches any full-tier tool on demand &mdash; so the
328
- compact default keeps context small without hiding capability.
327
+ يكتشف <code>tool-search</code> أدوات الطبقة الكاملة عند الطلب؛ ويجب أن يسمح
328
+ كتالوج الموصل أو سياسة القراءة المصادق عليها بالتنفيذ، ما لم يشترك المتصل
329
+ صراحةً في الطبقة الكاملة.
329
330
  </p>
330
331
  ```
331
332
 
@@ -363,15 +364,45 @@ https://dispatch.agent-native.com/_agent-native/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`** موجود دائمًا للاكتشاف. لا يزال الإجراء المكتشف بحاجة إلى أن يكون في كتالوج الموصل، أو مشمولًا بسياسة القراءة المصادق عليها، أو متاحًا عبر الاشتراك الصريح في الكتالوج الكامل قبل أن يتمكن `tools/call` من تنفيذه.
371
372
 
372
- لا يتم الإعلان عن الأدوات الموجودة خارج القائمة — على سبيل المثال `db-exec`، و`seed-*`، ومجموعة الامتدادات، وأدوات جلسة المتصفح، وأدوات سياق الأشعة السينية —، ويتم رفض الاستدعاءات إليها باستخدام "أداة غير معروفة" ما لم يشترك المتصل في الكتالوج الكامل. يؤدي هذا إلى إبقاء نافذة سياق كل وكيل متصل صغيرة وإزالة الأدوات الآمنة فقط للتطوير المحلي للمستأجر الواحد. تكون طبقة الموصل نشطة **عندما يعلن القالب عن `connectorCatalog`** — فهو ليس محاطًا بمتغير بيئة.
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"` فقط الإجراءات التي تعلن صراحةً كل ما يلي:
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/connect عبر `runWithRequestContext`، لذلك تظل فحوصات الوصول على مستوى الإجراء ونطاق المالك/المؤسسة ونطاقات قراءة OAuth سارية. لا تتضمن القراءة التلقائية الإجراءات العامة أو غير المصادق عليها.
402
+
403
+ لا يتم تضمين `db-schema` و`db-query` الأساسيين تلقائيًا في القراءات الخارجية. يظلان متاحين لوكيل التطبيق داخل التطبيق عبر مسار SQL المقيّد المعتاد، لكن الوصول العام إلى المخطط وSQL واسع جدًا لاستنتاجه من بيانات القراءة فقط. إذا احتاج التطبيق إلى استعلام خارجي مباشر، فعليه إضافة action مملوك للتطبيق بحدود وصول واضحة أو قائمة سماح صريحة للجداول والأعمدة مع حدود للصفوف والبايت والمهلة والتدقيق. يبقى `db-exec` و`db-patch` خارج السطح التلقائي.
404
+
405
+ تستخدم رسائل Slack الخاصة هوية المستخدم فقط بعد التحقق من البريد الإلكتروني وربطه بعضوية موجودة في مؤسسة Agent Native. أما القنوات المشتركة فتستخدم هوية خدمة ولا تستعير أذونات أحد المشاركين الخاصة. يطلب OAuth المُدار والنموذج المُنشأ لتطبيق Slack النطاق `users:read.email`؛ يجب إعادة ربط التثبيتات الحالية بعد إضافة النطاق، بينما يجب تحديث الرموز القديمة يدويًا في Slack.
375
406
 
376
407
  ### الطبقة الكاملة (الاشتراك الصريح فقط) {#full-tier}
377
408
 
@@ -473,7 +504,7 @@ Claude Code calls: manage-draft(to: "john@example.com", subject: "Q3 Report", bo
473
504
 
474
505
  يرفض `create_workspace_app` أي قالب غير مدرج في القائمة المسموح بها - القائمة المسموح بها للقالب العام في `packages/shared-app-config/templates.ts` موثوقة ومحمية بواسطة CI؛ ولا يمكن لعامل خارجي توسيعه. يتجاوز إجراء القالب الذي يحمل نفس الاسم الإجراء المدمج (أسبقية القالب على المركز الأساسي). قم بتعطيل المجموعة بأكملها باستخدام `MCPConfig.builtinCrossAppTools: false`.
475
506
 
476
- يتم ضغط كتالوجات الأدوات والموارد لمضيفي التطبيقات بشكل افتراضي - راجع [Catalog tiers](#catalog-tiers). يظل `publicAgent.expose` خيار الاشتراك في أدوات القراءة/التناول الآمن خارج هذا الكتالوج المدمج؛ قم بتعيين `mcpApp.compactCatalog: true` فقط كاستثناء نادر لـ actions والذي يجب أن يظهر في اكتشاف مضيف الدردشة.
507
+ يتم ضغط كتالوجات الأدوات والموارد لمضيفي التطبيقات بشكل افتراضي - راجع [Catalog tiers](#catalog-tiers). يظل `publicAgent.expose` خيار الاشتراك على مستوى الإجراء لأدوات القراءة/التناول الآمن خارج هذا الكتالوج المدمج؛ ويمكن للتطبيقات تعيين `externalAgents.authenticatedReads: "auto"` للإعلان عن عمليات القراءة المصادق عليها دون كتالوج مكتوب يدويًا. قم بتعيين `mcpApp.compactCatalog: true` فقط كاستثناء نادر لـ actions التي يجب أن تظهر في اكتشاف مضيف الدردشة.
477
508
 
478
509
  بالنسبة لعمليات التسليم السريعة لـ ChatGPT/Claude، يكون المسار المثالي مباشرًا: اتصل بالإجراء الذي ينشئ القطعة الأثرية أو يفتحها، ثم اسمح لتطبيق MCP بتشغيل المسار. يجب أن يستدعي طلب البريد `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
  - التقاط إعادة التشغيل مخصص للويب فقط وباختيار المستخدم؛ فهو لا يسجل شاشات سطح المكتب الأصلية.
240
240
 
241
+ تُضمَّن إطارات iframe التي يديرها إطار العمل، بما في ذلك الامتدادات ومحتوى البريد الإلكتروني المعروض، في التقاط إعادة التشغيل. تنطبق محددات الإخفاء والحظر نفسها داخل الإطارات المسجلة. يظل iframe تابع لجهة خارجية ومن أصل مختلف غير مرئي ما لم تُشغِّل وثيقته مسجِّل rrweb متوافقًا مع تمكين تسجيل إطارات iframe من أصول مختلفة؛ ولا يمكن للصفحة الأم تجاوز حدود الأصل التي يفرضها المتصفح.
242
+
241
243
  أثناء التسجيل، تلتقط إعادة تشغيل الجلسة أيضًا مخرجات وحدة تحكم المتصفح (`log`، و`info`، و`warn`، و`error`، و`debug`، بالإضافة إلى `error` / `unhandledrejection` الخاصة بالنافذة) وبيانات وصفية لطلبات الشبكة (`fetch` و XHR) كأحداث rrweb مخصصة موسومة، بحيث يمكن للوكلاء وعارض إعادة التشغيل تصحيح المشكلات التي يبلغ عنها المستخدمون. الالتقاط مفعّل افتراضيًا عند تفعيل إعادة التشغيل؛ اضبطه أو عطّله باستخدام خياري `sessionReplay.console` و`sessionReplay.network`، حيث يقبل كل منهما قيمة منطقية (boolean) أو كائن خيارات (`{ maxEvents?: number }`، مع قبول `network` إضافيًا لـ `captureErrorBodies` و`maxErrorBodyLength`). لا يتم التقاط نصوص/رؤوس الطلبات مطلقًا؛ أما نصوص الاستجابات فلا تُلتقط إلا كمقتطف محدود ومُنقّح لاستجابات 5xx (أخطاء الخادم) فقط (`captureErrorBodies`، الافتراضي true، بحد أقصى `maxErrorBodyLength` حرفًا، الافتراضي 2048) — استجابات غير 5xx وحالات فشل الشبكة لا تحمل أي نص استجابة أبدًا. يتم تنظيف عناوين URL، ويتم اقتطاع الرسائل، ويُستثنى حركة استيعاب/تتبع المسجِّل نفسه، وتضيف ميزانيات كل جلسة (1000 حدث وحدة تحكم / 2000 حدث شبكة) إشعار اقتطاع عند تجاوزها.
242
244
 
243
245
  يخزّن قالب Analytics بيانات إعادة التشغيل الوصفية في SQL (`session_recordings`) ويخزّن الأجزاء عبر مراجع blob خاصة (`session_replay_chunks`). لا تتلقى المتصفحات والوكلاء أبدًا عناوين URL الخاصة بالموفر. تمر إعادة التشغيل عبر مسارات خادم محددة النطاق، وتُرجع أدوات الوكيل الافتراضية ملخصات أو أحداث إعادة تشغيل محدودة، وليس وصولاً خامًا إلى جدول الأجزاء.
@@ -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> reaches any full-tier tool on demand &mdash; so the
329
- compact default keeps context small without hiding capability.
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, sodass alles außerhalb der Liste bei Bedarf erreichbar bleibt (siehe unten).
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. Die Connector-Ebene ist aktiv, **immer wenn eine Vorlage ein `connectorCatalog` deklariert** – sie ist nicht hinter einer Umgebungsvariablen geschützt.
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 **keine Abfrage** für das vollständige Menü der Werkzeugnamen plus einzeilige Beschreibungen (günstig, keine Schemata) oder mit einer Abfrage für Rangfolgeübereinstimmungen mit Parameterzusammenfassungen. Auf diese Weise erkennt und lädt ein kompakter Client jedes vollflächige Werkzeug, wenn er eines benötigt.
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 die Option für sichere Lese-/Ingest-Tools außerhalb dieses kompakten Katalogs; Legen Sie `mcpApp.compactCatalog: true` nur als seltene Ausnahme für actions fest, das in der Chat-Host-Erkennung erscheinen muss.
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> reaches any full-tier tool on demand &mdash; so the
329
- compact default keeps context small without hiding capability.
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 lo que todo lo que esté fuera de la lista permanece accesible bajo demanda (ver más abajo).
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. El nivel del conector está activo **siempre que una plantilla declara un `connectorCatalog`**; no está cerrado detrás de una variable de entorno.
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 con **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 coincidencias clasificadas con resúmenes de parámetros. Así es como un cliente compactado descubre y carga cualquier herramienta de superficie completa cuando la necesita.
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; configure `mcpApp.compactCatalog: true` solo como una rara excepción para actions que debe aparecer en el descubrimiento de host de chat.
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> reaches any full-tier tool on demand &mdash; so the
329
- compact default keeps context small without hiding capability.
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, donc tout ce qui se trouve en dehors de la liste reste accessible à la demande (voir ci-dessous).
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. Le niveau de connecteur est actif **chaque fois qu'un modèle déclare un `connectorCatalog`** — il n'est pas protégé par une variable d'environnement.
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 avec **aucune requête** pour le menu complet des noms d'outils ainsi que des descriptions sur une ligne (bon marché, sans schémas), ou avec une requête pour les correspondances classées avec des résumés de paramètres. C'est ainsi qu'un client compact découvre et charge n'importe quel outil pleine surface lorsqu'il en a besoin.
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 d'adhésion pour les outils de lecture/ingestion sécurisés en dehors de ce catalogue compact ; définissez `mcpApp.compactCatalog: true` uniquement comme une exception rare pour actions qui doit apparaître dans la découverte de l'hôte de discussion.
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 ; elle n'enregistre pas les écrans natifs du bureau.
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
- 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.
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