@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
@@ -238,6 +238,8 @@ VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE=1
238
238
  - URL은 브라우저 분석에서 사용하는 것과 동일한 `scrubUrl()` 도우미로 정제됩니다.
239
239
  - 리플레이 캡처는 웹 전용이며 옵트인 방식입니다. 네이티브 데스크톱 화면은 기록하지 않습니다.
240
240
 
241
+ 확장 프로그램과 렌더링된 이메일 콘텐츠를 포함하여 프레임워크가 관리하는 iframe은 리플레이 캡처에 포함됩니다. 기록된 프레임 내부에도 동일한 마스킹 및 차단 선택자가 적용됩니다. 타사 교차 출처 iframe은 자체 문서가 교차 출처 iframe 기록을 활성화한 호환 rrweb 레코더를 실행하지 않는 한 불투명하게 유지되며, 부모 페이지에서 브라우저의 출처 경계를 우회할 수 없습니다.
242
+
241
243
  기록하는 동안 세션 리플레이는 브라우저 콘솔 출력(`log`, `info`, `warn`, `error`, `debug` 및 window `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을 절대 받지 않습니다. 재생은 범위가 지정된 서버 경로를 거치며, 기본 에이전트 도구는 원시 청크 테이블 접근이 아닌 요약 또는 범위가 지정된 리플레이 이벤트를 반환합니다.
@@ -325,8 +325,10 @@ O servidor MCP fornece um **catálogo compacto por padrão para cada chamador**
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> descobre ferramentas da camada completa sob demanda;
329
+ o catálogo do conector ou a política de leituras autenticadas ainda precisa
330
+ permitir a execução, salvo quando o chamador opta explicitamente pela camada
331
+ completa.
330
332
  </p>
331
333
  ```
332
334
 
@@ -364,15 +366,45 @@ O servidor MCP fornece um **catálogo compacto por padrão para cada chamador**
364
366
 
365
367
  ### Camada compacta/conector (padrão) {#connector-tier}
366
368
 
367
- Por padrão, cada agente conectado vê um catálogo pequeno e selecionado (cerca de 20 a 30 ferramentas versus cerca de 105 na superfície completa):
369
+ Por padrão, cada agente conectado vê um catálogo pequeno e selecionado (cerca de 20 a 30 ferramentas versus cerca de 105 na superfície completa). Os aplicativos podem manter um `connectorCatalog` explícito ou optar pela política de leituras autenticadas:
368
370
 
369
371
  - **Aplicativo declarado por modelo actions** — a lista de permissões segura no nível do aplicativo. Para planos `create-visual-plan`, `get-visual-plan`, `share-resource`, `navigate`, `tool-search` e similares.
370
372
  - **Ferramentas integradas para vários aplicativos** — `list_apps`, `open_app`, `ask_app`, `create_embed_session`.
371
- - **`tool-search`** está sempre presente, então qualquer coisa fora da lista permanece acessível sob demanda (veja abaixo).
373
+ - **`tool-search`** está sempre presente para descoberta. Uma action descoberta ainda precisa estar no catálogo do conector, ser incluída pela política de leituras autenticadas ou ser habilitada pela opção explícita de catálogo completo antes que `tools/call` possa executá-la.
372
374
 
373
- Ferramentas fora da lista — por exemplo `db-exec`, `seed-*`, o conjunto de extensões, ferramentas de sessão de navegador e ferramentas de raio X de contexto — não são anunciadas e as chamadas para elas são rejeitadas com "Ferramenta desconhecida", a menos que o chamador tenha optado pelo catálogo completo. Isso mantém pequena a janela de contexto de cada agente conectado e remove armas de fogo que são seguras apenas para desenvolvimento local de locatário único. A camada do conector fica ativa **sempre que um modelo declara um `connectorCatalog`** — ele não está protegido por uma variável de ambiente.
375
+ Ferramentas fora da lista — por exemplo `db-exec`, `seed-*`, o conjunto de extensões, ferramentas de sessão de navegador e ferramentas de raio X de contexto — não são anunciadas e as chamadas para elas são rejeitadas com "Ferramenta desconhecida", a menos que o chamador tenha optado pelo catálogo completo. Isso mantém pequena a janela de contexto de cada agente conectado e remove armas de fogo que são seguras apenas para desenvolvimento local de locatário único.
374
376
 
375
- `tool-search` funciona de duas maneiras: chame-o com **sem consulta** para obter o menu completo de nomes de ferramentas mais descrições de uma linha (barato, sem esquemas) ou com uma consulta para correspondências classificadas com resumos de parâmetros. É assim que um cliente compactado descobre e carrega qualquer ferramenta de superfície completa quando precisa.
377
+ `tool-search` funciona de duas maneiras: chame-o **sem consulta** para obter o menu completo de nomes de ferramentas mais descrições de uma linha (barato, sem esquemas) ou com uma consulta para correspondências classificadas com resumos de parâmetros. Ele ajuda um cliente compacto a descobrir recursos; use `ask_app` para qualquer tarefa que exija o raciocínio mais amplo do agente do aplicativo ou uma gravação.
378
+
379
+ #### Leituras autenticadas por padrão
380
+
381
+ Aplicativos que desejam que as ferramentas de leitura direta funcionem sem manter uma lista longa podem optar por leituras 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 defesa em profundidade para leituras especialmente sensíveis.
390
+ denyActions: ["get-sensitive-export"],
391
+ },
392
+ });
393
+ ```
394
+
395
+ `authenticatedReads: "auto"` adiciona somente actions que declaram explicitamente todos os itens a seguir:
396
+
397
+ - `http: { method: "GET" }`
398
+ - `readOnly: true`
399
+ - `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
400
+
401
+ A política combina essas actions com entradas explícitas de `connectorCatalog` e depois aplica `denyActions`. Com `writes: "ask_app_only"` (o padrão quando as leituras automáticas estão habilitadas), ferramentas que alteram dados não podem ser chamadas diretamente; encaminhe trabalhos de várias etapas e mutações por `ask_app`. `writes: "allowlisted"` existe apenas para aplicativos que mantêm intencionalmente uma lista explícita de gravações permitidas.
402
+
403
+ A política é autenticada, não anônima. A identidade MCP OAuth/connect é transmitida por `runWithRequestContext`, portanto as verificações de acesso das actions, os escopos de proprietário/organização e os escopos de leitura OAuth continuam valendo. Actions públicas ou não autenticadas não são incluídas automaticamente.
404
+
405
+ Os `db-schema` e `db-query` do Core não são expostos automaticamente como leituras externas. Eles continuam disponíveis ao agente interno do aplicativo pelo caminho SQL com escopo normal, mas o acesso amplo ao esquema/SQL é poderoso demais para ser inferido apenas de metadados de leitura. Se o aplicativo precisar de consultas externas diretas, exponha uma action GET própria com controles e limites de acesso, ou uma lista explícita de tabelas/colunas com limites de linhas, bytes, tempo e auditoria. `db-exec` e `db-patch` permanecem fora da superfície automática.
406
+
407
+ DMs do Slack usam a identidade do usuário somente após verificar o e-mail e confirmar a associação à organização Agent Native. Canais compartilhados usam um principal de serviço e não herdam as permissões privadas de um participante. O OAuth gerenciado e o manifesto gerado do Slack solicitam `users:read.email`; instalações existentes precisam ser reconectadas após adicionar o escopo e tokens antigos de bot precisam ser atualizados manualmente no Slack.
376
408
 
377
409
  ### Nível completo (somente aceitação explícita) {#full-tier}
378
410
 
@@ -474,7 +506,7 @@ Além das ferramentas por ação, o servidor MCP expõe um conjunto de verbos es
474
506
 
475
507
  `create_workspace_app` rejeita qualquer modelo não listado na lista de permissões — a lista de permissões de modelos públicos no `packages/shared-app-config/templates.ts` é oficial e protegida por CI; um agente externo não pode ampliá-lo. Uma ação de modelo com o mesmo nome substitui uma ação interna (precedência de modelo sobre núcleo). Desative todo o conjunto com `MCPConfig.builtinCrossAppTools: false`.
476
508
 
477
- Os catálogos de ferramentas e recursos para hosts de aplicativos são compactos por padrão — consulte [Catalog tiers](#catalog-tiers). `publicAgent.expose` continua sendo a opção para ferramentas seguras de leitura/ingestão fora desse catálogo compacto; defina `mcpApp.compactCatalog: true` apenas como uma rara exceção para actions que deve aparecer na descoberta do host do chat.
509
+ Os catálogos de ferramentas e recursos para hosts de aplicativos são compactos por padrão — consulte [Catalog tiers](#catalog-tiers). `publicAgent.expose` continua sendo a opção no nível da action para ferramentas seguras de leitura/ingestão fora desse catálogo compacto; os aplicativos podem definir `externalAgents.authenticatedReads: "auto"` para anunciar essas leituras autenticadas sem um catálogo escrito à mão. Defina `mcpApp.compactCatalog: true` apenas como uma rara exceção para actions que precisam aparecer na descoberta do host do chat.
478
510
 
479
511
  Para transferências rápidas de ChatGPT/Claude, o caminho ideal é direto: chame a ação que cria ou abre o artefato e deixe o aplicativo MCP iniciar a rota. Uma solicitação de correio deve chamar `manage_draft` e renderizar a rota de composição real. Uma solicitação de painel deve chamar `open_app({ path, embed: true })` ou uma ação de painel com `mcpApp` e renderizar a rota completa do Analytics. Calendário, Formulários, Conteúdo, Slides, Design e Clipes devem seguir o mesmo padrão com seu rascunho/criação/pesquisa actions. `list_apps` é útil quando o modelo precisa escolher entre aplicativos concedidos; `resources/list` amplo, descoberta de catálogo completo ou delegação `ask_app` não devem ser o caminho normal para uma transferência óbvia de UI.
480
512
 
@@ -238,6 +238,8 @@ Os padrões de privacidade são intencionalmente conservadores, mas ainda úteis
238
238
  - As URLs são higienizadas com o mesmo auxiliar `scrubUrl()` usado pela análise do navegador.
239
239
  - A captura de replay é somente para web e opcional; ela não grava telas de desktop nativas.
240
240
 
241
+ Os iframes gerenciados pelo framework, incluindo extensões e conteúdo de e-mail renderizado, são incluídos na captura de replay. Os mesmos seletores de mascaramento e bloqueio se aplicam dentro dos frames gravados. Um iframe de terceiros com origem diferente permanece opaco, a menos que seu próprio documento execute um gravador rrweb compatível com a gravação de iframes entre origens habilitada; a página principal não pode contornar os limites de origem do navegador.
242
+
241
243
  Durante a gravação, o replay de sessão também captura a saída do console do navegador (`log`, `info`, `warn`, `error`, `debug`, além dos eventos `error`/`unhandledrejection` da janela) e metadados de solicitações de rede (`fetch` e XHR) como eventos personalizados do rrweb marcados, para que agentes e o visualizador de replay possam depurar problemas relatados por usuários. A captura é ativada por padrão quando o replay está habilitado; ajuste ou desabilite-a com as opções `sessionReplay.console` e `sessionReplay.network`, cada uma aceitando um booleano ou um objeto de opções (`{ maxEvents?: number }`, sendo que `network` também aceita `captureErrorBodies` e `maxErrorBodyLength`). Corpos e cabeçalhos de solicitação nunca são capturados; corpos de resposta são capturados apenas como um trecho limitado e higienizado para respostas 5xx (erro de servidor) (`captureErrorBodies`, padrão `true`, limitado a `maxErrorBodyLength` caracteres, padrão 2048) — respostas que não sejam 5xx e falhas de rede (status 0) nunca carregam um corpo. As URLs são higienizadas, as mensagens são truncadas, o próprio tráfego de ingestão/rastreamento do gravador é excluído, e os orçamentos por sessão (1000 eventos de console / 2000 eventos de rede) adicionam um aviso de truncamento quando excedidos.
242
244
 
243
245
  O modelo Analytics armazena os metadados de replay em SQL (`session_recordings`) e armazena os blocos por meio de referências privadas de blob (`session_replay_chunks`). Navegadores e agentes nunca recebem URLs de provedores. A reprodução passa por rotas de servidor com escopo definido, e as ferramentas padrão do agente retornam resumos ou eventos de replay limitados, não acesso bruto à tabela de blocos.
@@ -324,8 +324,8 @@ 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
  </p>
330
330
  ```
331
331
 
@@ -363,15 +363,45 @@ MCP 服务器默认为每个调用者提供一个**紧凑的目录** — 托管
363
363
 
364
364
  ### 紧凑/连接器层(默认) {#connector-tier}
365
365
 
366
- 默认情况下,每个连接的代理都会看到一个小型的、精心策划的目录(约 20–30 个工具,而整个表面上约 105 个工具):
366
+ 默认情况下,每个连接的代理都会看到一个小型的、精心策划的目录(约 20–30 个工具,而完整界面约有 105 个工具)。应用可以维护明确的 `connectorCatalog`,也可以选择已认证读取策略:
367
367
 
368
368
  - **模板声明的应用程序 actions** — 安全应用程序级别允许列表。对于 `create-visual-plan`、`get-visual-plan`、`share-resource`、`navigate`、`tool-search` 等类似计划。
369
369
  - **内置跨应用工具** - `list_apps`、`open_app`、`ask_app`、`create_embed_session`。
370
- - **`tool-search`** 始终存在,因此列表之外的任何内容都可以按需访问(见下文)。
370
+ - **`tool-search`** 始终用于发现。发现的 action 必须获得连接器目录、已认证读取策略或明确的完整目录选择允许,`tools/call` 才能执行它。
371
371
 
372
- 列表之外的工具(例如 `db-exec`、`seed-*`、扩展套件、浏览器会话工具和上下文 X 射线工具)不会公布,并且对它们的调用将被拒绝并显示“未知工具”,除非调用者选择加入完整目录。这使每个连接的代理的上下文窗口保持较小,并消除了仅对单租户本地开发安全的脚枪。 **每当模板声明 `connectorCatalog`** 时,连接器层就会处于活动状态 - 它不会受到环境变量的限制。
372
+ 列表之外的工具(例如 `db-exec`、`seed-*`、扩展套件、浏览器会话工具和上下文 X 射线工具)不会公布,并且对它们的调用将被拒绝并显示“未知工具”,除非调用者选择加入完整目录。这使每个连接的代理的上下文窗口保持较小,并消除了仅对单租户本地开发安全的危险工具。
373
373
 
374
- `tool-search` 有两种工作方式:使用**无查询**来调用它,以获取工具名称的完整菜单加上一行描述(便宜,无模式),或者使用参数摘要来查询排名匹配。这就是压缩客户端在需要时发现并加载任何全表面工具的方式。
374
+ `tool-search` 有两种工作方式:使用**无查询**调用它,以获取工具名称的完整菜单及单行描述(开销低、无 schema),或使用查询获取带参数摘要的排序匹配项。它帮助精简客户端发现功能;需要应用代理进行更广泛推理或写入时,请使用 `ask_app`。
375
+
376
+ #### 默认启用已认证读取
377
+
378
+ 希望直接工具无需维护长允许列表即可使用的应用,可以选择自动已认证读取:
379
+
380
+ ```ts
381
+ export default createAgentChatPlugin({
382
+ appId: "analytics",
383
+ externalAgents: {
384
+ authenticatedReads: "auto",
385
+ writes: "ask_app_only",
386
+ // 可选的纵深防御:拒绝特别敏感的读取。
387
+ denyActions: ["get-sensitive-export"],
388
+ },
389
+ });
390
+ ```
391
+
392
+ `authenticatedReads: "auto"` 只会添加明确声明了以下全部内容的 action:
393
+
394
+ - `http: { method: "GET" }`
395
+ - `readOnly: true`
396
+ - `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
397
+
398
+ 该策略会将这些 action 与任何明确的 `connectorCatalog` 条目合并,然后应用 `denyActions`。使用 `writes: "ask_app_only"`(启用自动读取时的默认值)时,变更类工具不能直接调用;多步骤工作和变更应通过 `ask_app` 完成。`writes: "allowlisted"` 仅适用于有意维护明确写入允许列表的应用。
399
+
400
+ 该策略面向已认证访问,而非匿名访问。MCP OAuth/连接身份仍通过 `runWithRequestContext` 传递,因此 action 级访问检查、所有者/组织作用域和 OAuth 读取作用域继续生效。公开/未认证 action 不会包含在自动读取中。
401
+
402
+ Core `db-schema` 和 `db-query` 不会自动作为外部读取公开。它们仍可通过正常的作用域 SQL 路径供应用内代理使用,但广泛的架构/SQL 访问过于强大,不能仅凭只读元数据推断。如果应用需要直接外部查询,应提供带访问检查和边界的应用自有 GET action,或明确的表/列允许列表,并限制行数、字节数、超时和审计。`db-exec` 和 `db-patch` 仍不属于自动公开范围。
403
+
404
+ Slack 私信只有在验证电子邮件并确认用户属于 Agent Native 组织后,才会使用用户身份运行。共享频道使用服务主体,不会借用参与者的私人权限。托管 OAuth 和生成的 Slack manifest 都会请求 `users:read.email`;已有安装在添加该 scope 后必须重新连接,旧 bot token 则必须在 Slack 中手动更新。
375
405
 
376
406
  ### 完整层(仅限明确选择加入) {#full-tier}
377
407
 
@@ -473,7 +503,7 @@ CSP 和沙箱权限等安全元数据存在于资源中
473
503
 
474
504
  `create_workspace_app` 拒绝任何非允许列表模板 - `packages/shared-app-config/templates.ts` 中的公共模板允许列表是权威且受 CI 保护的;外部代理无法扩大它。同名的模板操作会覆盖内置操作(模板优先于核心优先级)。使用 `MCPConfig.builtinCrossAppTools: false` 禁用整个设置。
475
505
 
476
- 应用程序主机的工具和资源目录默认是紧凑的 - 请参阅 [Catalog tiers](#catalog-tiers)。 `publicAgent.expose` 仍然是该紧凑目录之外安全读取/摄取工具的选择;仅将 `mcpApp.compactCatalog: true` 设置为 actions 的罕见例外,必须出现在聊天主机发现中。
506
+ 应用程序主机的工具和资源目录默认是紧凑的,请参阅[目录层级](#catalog-tiers)。`publicAgent.expose` 仍是紧凑目录之外安全读取/摄取工具的 action 级选择。应用可以设置 `externalAgents.authenticatedReads: "auto"`,无需手写目录即可公布这些已认证读取。仅将 `mcpApp.compactCatalog: true` 用作必须出现在聊天主机发现中的 action 的罕见例外。
477
507
 
478
508
  对于快速 ChatGPT/Claude 切换,理想的路径是直接的:调用创建或打开工件的操作,然后让 MCP 应用程序启动路线。邮件请求应调用 `manage_draft` 并呈现真实的撰写路由。仪表板请求应调用 `open_app({ path, embed: true })` 或使用 `mcpApp` 的仪表板操作并呈现完整的 Analytics 路径。日历、表单、内容、幻灯片、设计和剪辑的草稿/创建/搜索 actions 应遵循相同的模式。当模型必须在授予的应用程序中进行选择时,`list_apps` 非常有用;广泛的 `resources/list`、全目录发现或 `ask_app` 委派不应该是明显的 UI 切换的正常途径。
479
509
 
@@ -238,6 +238,8 @@ VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE=1
238
238
  - URL 会使用与浏览器分析相同的 `scrubUrl()` 辅助函数进行清理。
239
239
  - 重放采集仅限 Web 端且为选择性加入(opt-in);不会录制原生桌面屏幕。
240
240
 
241
+ 框架管理的 iframe(包括扩展和渲染后的电子邮件内容)会纳入重放采集。录制的 frame 内同样适用遮罩和屏蔽选择器。第三方跨源 iframe 会保持不可见,除非其自身文档运行兼容的 rrweb 录制器并启用跨源 iframe 录制;父页面无法绕过浏览器的源边界。
242
+
241
243
  录制期间,会话重放还会捕获浏览器控制台输出(`log`、`info`、`warn`、`error`、`debug`,以及 window 的 `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。回放通过受限的服务器路由进行,默认的代理工具返回的是摘要或有限范围的重放事件,而非原始数据块表的直接访问权限。
@@ -145,6 +145,20 @@ Netlify 背景函式是**付費方案**功能(Personal / Pro,不含免費方
145
145
 
146
146
  </Callout>
147
147
 
148
+ ## 前景自我續跑鏈:一個範圍較小、選用的退路 {#foreground-self-chain}
149
+
150
+ 還有第二個獨立旗標控制另一種續跑機制:`AGENT_CHAT_FOREGROUND_SELF_CHAIN`。持久背景執行會把整個長回合移到上面提到的 15 分鐘背景函式;相較之下,前景自我續跑鏈是讓一般(非持久背景)回合在遇到軟逾時的區塊邊界時,透過**一般**請求函式上的伺服器端自我分派來繼續,而不是依賴用戶端重新送出 `auto_continue`。
151
+
152
+ 它的組合條件與 `AGENT_CHAT_DURABLE_BACKGROUND` 相同:只有在旗標明確為真值(`true` / `1` / `yes` / `on`)、應用在託管環境中執行,且已設定 `A2A_SECRET` 時才會成立。這兩個旗標彼此獨立,不需要一致——應用可以只啟用這個範圍較小的功能,而不需要選用完整的背景函式 worker 路徑。當某個 run 已符合持久背景分派條件時,該決定會優先評估並生效;該 run 會透過背景 worker 續跑,而不會走這條路徑。
153
+
154
+ <Callout id="doc-block-fgschn1" tone="warning">
155
+
156
+ 這個旗標**預設為關閉,屬於選用功能**。一般 Netlify 函式有固定的 **60 秒**上限——遠短於上面背景函式的 15 分鐘預算——因此自我分派的後續呼叫可能會在完成前就被中止,導致還沒儲存下一段續跑內容,讓長回覆在句子中間被截斷。旗標關閉時,託管應用會改用既有的用戶端驅動 `auto_continue` 重新送出路徑,該路徑續跑速度較慢,但不會被伺服器端逾時中止。
157
+
158
+ </Callout>
159
+
160
+ 只有在確認託管環境的一般函式能在 60 秒上限內可靠完成自我分派的續跑之後,才建議啟用這個旗標。對於長時間、多步驟的回合,請優先使用上面的 `AGENT_CHAT_DURABLE_BACKGROUND`——它的背景函式預算大得多,是建議採用的路徑。
161
+
148
162
  ## 相關
149
163
 
150
164
  - [**持久恢復**](/docs/durable-resume) — 中斷的 run 如何恢復而不重複已完成的副作用(另一個永遠啟用的保護)。
@@ -324,8 +324,8 @@ 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
  </p>
330
330
  ```
331
331
 
@@ -363,15 +363,45 @@ MCP 伺服器預設為每個呼叫者提供一個**緊湊的目錄** — 託管
363
363
 
364
364
  ### 緊湊/連線器層(預設) {#connector-tier}
365
365
 
366
- 預設情況下,每個連線的代理都會看到一個小型的、精心策劃的目錄(約 20–30 個工具,而整個表面上約 105 個工具):
366
+ 預設情況下,每個連線的代理都會看到一個小型、精心規劃的目錄(約 20–30 個工具,而完整介面約有 105 個工具)。應用程式可以維護明確的 `connectorCatalog`,也可以選擇已驗證讀取政策:
367
367
 
368
368
  - **範本聲明的應用程式 actions** — 安全應用程式層級允許清單。對於 `create-visual-plan`、`get-visual-plan`、`share-resource`、`navigate`、`tool-search` 等類似計畫。
369
369
  - **內建跨應用工具** - `list_apps`、`open_app`、`ask_app`、`create_embed_session`。
370
- - **`tool-search`** 始終存在,因此清單之外的任何內容都可以按需存取(見下文)。
370
+ - **`tool-search`** 始終用於探索。探索到的 action 必須獲得連線器目錄、已驗證讀取政策或明確的完整目錄選擇允許,`tools/call` 才能執行它。
371
371
 
372
- 清單之外的工具(例如 `db-exec`、`seed-*`、擴充功能套件、瀏覽器工作階段工具和脈絡 X 射線工具)不會公布,並且對它們的呼叫將被拒絕並顯示“未知工具”,除非呼叫者選取加入完整目錄。這使每個連線的代理的脈絡視窗保持較小,並消除了僅對單租戶本機開發安全的腳槍。 **每當範本聲明 `connectorCatalog`** 時,連線器層就會處於活動狀態 - 它不會受到環境變數的限制。
372
+ 清單之外的工具(例如 `db-exec`、`seed-*`、擴充功能套件、瀏覽器工作階段工具和 context-xray 工具)不會公布,除非呼叫端選擇完整目錄,否則呼叫會以「未知工具」遭拒。這能縮小每個連線代理的脈絡視窗,並移除僅適合單一租戶本機開發的危險工具。
373
373
 
374
- `tool-search` 有兩種工作方式:使用**無查詢**來呼叫它,以取得工具名稱的完整選單加上一行描述(便宜,無模式),或者使用參數摘要來查詢排名匹配。這就是壓縮用戶端在需要時發現並載入任何全表面工具的方式。
374
+ `tool-search` 有兩種運作方式:以**無查詢**呼叫來取得工具名稱的完整選單與單行說明(成本低、無 schema),或使用查詢取得附參數摘要的排序結果。它協助精簡用戶端探索功能;需要應用程式代理進行更廣泛推理或寫入時,請使用 `ask_app`。
375
+
376
+ #### 預設啟用已驗證讀取
377
+
378
+ 希望直接工具不必維護冗長允許清單即可使用的應用程式,可以選擇自動已驗證讀取:
379
+
380
+ ```ts
381
+ export default createAgentChatPlugin({
382
+ appId: "analytics",
383
+ externalAgents: {
384
+ authenticatedReads: "auto",
385
+ writes: "ask_app_only",
386
+ // 選用的縱深防禦:拒絕特別敏感的讀取。
387
+ denyActions: ["get-sensitive-export"],
388
+ },
389
+ });
390
+ ```
391
+
392
+ `authenticatedReads: "auto"` 只會加入明確宣告以下全部內容的 action:
393
+
394
+ - `http: { method: "GET" }`
395
+ - `readOnly: true`
396
+ - `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`
397
+
398
+ 此政策會將這些 action 與任何明確的 `connectorCatalog` 項目合併,然後套用 `denyActions`。使用 `writes: "ask_app_only"`(啟用自動讀取時的預設值)時,變更類工具無法直接呼叫;多步驟工作與變更應透過 `ask_app` 完成。`writes: "allowlisted"` 僅適用於刻意維護明確寫入允許清單的應用程式。
399
+
400
+ 此政策用於已驗證存取,而非匿名存取。MCP OAuth/連線身分仍透過 `runWithRequestContext` 傳遞,因此 action 層級存取檢查、擁有者/組織範圍及 OAuth 讀取範圍仍會生效。公開/未驗證 action 不會包含在自動讀取中。
401
+
402
+ Core `db-schema` 與 `db-query` 不會自動公開為外部讀取。它們仍可透過一般的範圍 SQL 路徑供應用程式內代理使用,但廣泛的結構描述/SQL 存取過於強大,不能只從唯讀中繼資料推斷。若應用程式需要直接外部查詢,請提供具有存取檢查與限制的應用程式自有 GET action,或明確的資料表/欄位允許清單,並限制資料列、位元組、逾時與稽核。`db-exec` 與 `db-patch` 仍不屬於自動公開範圍。
403
+
404
+ Slack 私訊只有在驗證電子郵件並確認使用者屬於 Agent Native 組織後,才會使用使用者身分執行。共用頻道使用服務主體,不會借用參與者的私人權限。託管 OAuth 與產生的 Slack manifest 都會要求 `users:read.email`;現有安裝在新增 scope 後必須重新連線,舊 bot token 則必須在 Slack 中手動更新。
375
405
 
376
406
  ### 完整層(僅限明確選取加入) {#full-tier}
377
407
 
@@ -473,7 +503,7 @@ CSP 和沙箱權限等安全中繼資料存在於資源中
473
503
 
474
504
  `create_workspace_app` 拒絕任何非允許清單範本 - `packages/shared-app-config/templates.ts` 中的公開範本允許清單是權威且受 CI 保護的;外部代理無法擴大它。同名的範本操作會覆蓋內建操作(範本優先於核心優先級)。使用 `MCPConfig.builtinCrossAppTools: false` 停用整個設定。
475
505
 
476
- 應用程式主機的工具和資源目錄預設是緊湊的 - 請參閱 [Catalog tiers](#catalog-tiers)。 `publicAgent.expose` 仍然是該緊湊目錄之外安全讀取/攝取工具的選取;僅將 `mcpApp.compactCatalog: true` 設定為 actions 的罕見例外,必須出現在聊天主機發現中。
506
+ 應用程式主機的工具和資源目錄預設為精簡,請參閱[目錄層級](#catalog-tiers)。`publicAgent.expose` 仍是精簡目錄之外安全讀取/擷取工具的 action 層級選項。應用程式可設定 `externalAgents.authenticatedReads: "auto"`,不必手寫目錄即可公佈這些已驗證讀取。僅將 `mcpApp.compactCatalog: true` 用於必須出現在聊天主機探索中的 action 之罕見例外。
477
507
 
478
508
  對於快速 ChatGPT/Claude 切換,理想的路徑是直接的:呼叫建立或開啟工件的操作,然後讓 MCP 應用程式啟動路由。郵件請求應呼叫 `manage_draft` 並呈現真實的撰寫路由。儀表板請求應呼叫 `open_app({ path, embed: true })` 或使用 `mcpApp` 的儀表板操作並呈現完整的 Analytics 路徑。行事曆、表單、內容、幻燈片、設計和剪輯的草稿/建立/搜尋 actions 應遵循相同的模式。當模型必須在授予的應用程式中進行選取時,`list_apps` 非常有用;廣泛的 `resources/list`、全目錄發現或 `ask_app` 委派不應該是明顯的 UI 切換的正常途徑。
479
509
 
@@ -238,6 +238,8 @@ VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE=1
238
238
  - URL 會使用瀏覽器分析所用的同一個 `scrubUrl()` 輔助函式進行清理。
239
239
  - 重播擷取僅限於網頁,且為選擇加入;它不會錄製原生桌面畫面。
240
240
 
241
+ 由框架管理的 iframe(包括擴充功能與轉譯後的電子郵件內容)會納入重播擷取。錄製的 frame 內同樣套用遮罩與封鎖選擇器。第三方跨來源 iframe 會維持不透明,除非其本身的文件執行相容的 rrweb 記錄器並啟用跨來源 iframe 錄製;父頁面無法繞過瀏覽器的來源界線。
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。播放透過範圍受限的伺服器路由進行,且預設代理工具傳回摘要或範圍受限的重播事件,而非原始區塊資料表存取權。
@@ -237,6 +237,8 @@ Privacy defaults are intentionally conservative but still useful for playback:
237
237
  - URLs are scrubbed with the same `scrubUrl()` helper used by browser analytics.
238
238
  - Replay capture is web-only and opt-in; it does not record native desktop screens.
239
239
 
240
+ Framework-owned iframes, including extensions and rendered email content, are included in replay capture. The same masking and blocking selectors apply inside recorded frames. A third-party cross-origin iframe remains opaque unless its own document runs a compatible rrweb recorder with cross-origin iframe recording enabled; browser origin boundaries cannot be bypassed from the parent page.
241
+
240
242
  While recording, session replay also captures browser console output (`log`, `info`, `warn`, `error`, `debug`, plus window `error` / `unhandledrejection`) and network request metadata (`fetch` and XHR) as tagged rrweb custom events, so agents and the replay viewer can debug user-reported issues. Capture is on by default when replay is enabled; tune or disable it with the `sessionReplay.console` and `sessionReplay.network` options, each accepting a boolean or an options object (`{ maxEvents?: number }`, with `network` additionally accepting `captureErrorBodies` and `maxErrorBodyLength`). Request bodies and headers are never captured; response bodies are captured only as a bounded, redacted snippet for 5xx (server error) responses (`captureErrorBodies`, default true, capped at `maxErrorBodyLength` chars, default 2048) — non-5xx and network-failure responses never carry a body. URLs are scrubbed, messages are truncated, the recorder's own ingest/tracking traffic is excluded, and per-session budgets (1000 console / 2000 network events) add a truncation notice when exceeded.
241
243
 
242
244
  The Analytics template stores replay metadata in SQL (`session_recordings`) and stores chunks through private blob refs (`session_replay_chunks`). Browsers and agents never receive provider URLs. Playback goes through scoped server routes and the default agent tools return summaries or bounded replay events, not raw chunk table access.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.98.4",
3
+ "version": "0.98.6",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -333,7 +333,7 @@
333
333
  "y-protocols": "^1.0.7",
334
334
  "yjs": "^13.6.31",
335
335
  "zod": "^4.3.6",
336
- "@agent-native/toolkit": "^0.4.8"
336
+ "@agent-native/toolkit": "^0.4.9"
337
337
  },
338
338
  "devDependencies": {
339
339
  "@ai-sdk/anthropic": "^3.0.71",
@@ -160,15 +160,44 @@ tiny by default for ChatGPT/Claude-style app hosts, including OAuth MCP Apps
160
160
  callers and generic authenticated remote HTTP/static-token callers. The model
161
161
  sees the generic app-facing verbs (`list_apps`, `open_app`, `ask_app`, and
162
162
  app-only `create_embed_session`) and routes UI through
163
- `open_app({ embed: true })`. Stdio/code clients that explicitly identify as
164
- developer clients keep the full connected action surface, and
165
- `publicAgent.expose` remains the opt-in for safe read/ingest tools outside the
166
- compact MCP Apps catalog. Do not rely on action-specific `mcpApp` resources
167
- appearing in ChatGPT/Claude discovery by default; use `open_app` for the
163
+ `open_app({ embed: true })`. Stdio/code clients use the same compact surface
164
+ unless they explicitly opt into the full catalog, and
165
+ `publicAgent.expose` remains the action-level opt-in for safe read/ingest tools
166
+ outside the compact MCP Apps catalog. Apps can set
167
+ `externalAgents.authenticatedReads: "auto"` to automatically advertise every
168
+ action that is GET + `readOnly` + `publicAgent.requiresAuth`, instead of
169
+ maintaining a long connector allow-list. This policy never includes writes by
170
+ default; use `writes: "ask_app_only"` to keep mutations behind `ask_app`, and
171
+ use `denyActions` for defense-in-depth vetoes. `tool-search` remains available
172
+ for discovery, but a searched action still needs to be in the connector
173
+ catalog, included by the authenticated-read policy, or enabled by the explicit
174
+ full-catalog opt-in before `tools/call` can execute it. Do not rely on
175
+ action-specific `mcpApp` resources appearing in ChatGPT/Claude discovery by
176
+ default; use `open_app` for the
168
177
  first-class app embed path. If a specific
169
178
  action truly must remain visible in that compact app-host catalog, set
170
179
  `mcpApp.compactCatalog: true` as a rare escape hatch.
171
180
 
181
+ Generic core `db-schema` and `db-query` are intentionally not automatic
182
+ external reads. They remain available to the in-app agent through the normal
183
+ scoped SQL path, but broad schema/SQL access is too powerful to infer from
184
+ read-only metadata alone. If an app needs direct external querying, expose an
185
+ app-owned bounded GET action or add an explicit table/column allow-list with
186
+ row, byte, timeout, and audit limits. Keep `db-exec` and `db-patch` outside
187
+ automatic external-agent exposure.
188
+
189
+ Authentication and authorization are separate gates. A verified MCP OAuth or
190
+ connect token identifies the caller and organization; `publicAgent` only opts
191
+ an action into the external protocol surface and does not grant record access.
192
+ Actions still need `accessFilter`, `resolveAccess`, or `assertAccess` so private
193
+ documents/dashboards, shares, organization boundaries, and roles are enforced.
194
+ For Slack, verified DMs are linked to an existing Agent Native org member
195
+ before execution and run with that user's context; shared channels use a
196
+ service principal, and guests/external members cannot borrow personal access.
197
+ Managed Slack OAuth and the generated app manifest both request
198
+ `users:read.email`; existing installs must reconnect/reinstall after a scope
199
+ change, while legacy bot-token installs must add the scope in Slack manually.
200
+
172
201
  ### 1b. Fast-path expectations for MCP Apps hosts
173
202
 
174
203
  Keep ChatGPT/Claude paths short. For a known app-facing intent, the external
@@ -158,21 +158,6 @@ The agent loop reads active experiments via `resolveActiveExperimentConfig()` an
158
158
 
159
159
  Compute results with `POST /_agent-native/observability/experiments/:id/results`.
160
160
 
161
- #### First-party hosted default-model rollout
162
-
163
- First-party apps on `agent-native.com` automatically run the July 2026
164
- default-model experiment for authenticated users on the Builder engine:
165
-
166
- - 80% `claude-sonnet-5`
167
- - 20% `gpt-5-6-luna`
168
- - Assignment is sticky by normalized user email and shared across templates.
169
- - The rollout applies only when the user, app, and deployment have not selected
170
- a model. Explicit model choices and BYO provider engines always win.
171
- - Set `AGENT_NATIVE_HOSTED_MODEL_EXPERIMENT=off` for an emergency rollback, or
172
- `true` to exercise the rollout on a non-first-party preview.
173
- - `$ai_generation` tracking includes `experiment_id`,
174
- `experiment_variant`, and `model_selection_source` for central analysis.
175
-
176
161
  In production, experiment management routes require the caller's email in the
177
162
  comma-separated `AGENT_NATIVE_EXPERIMENT_ADMIN_EMAILS` allowlist. This gate is
178
163
  separate from normal app/org admin roles because an experiment affects every
@@ -1,118 +0,0 @@
1
- export const HOSTED_DEFAULT_MODEL_EXPERIMENT_ID =
2
- "hosted-default-model-sonnet-5-vs-gpt-5-6-luna-2026-07";
3
-
4
- export const HOSTED_DEFAULT_MODEL_CONTROL = {
5
- id: "sonnet-5",
6
- model: "claude-sonnet-5",
7
- weight: 80,
8
- } as const;
9
-
10
- export const HOSTED_DEFAULT_MODEL_TREATMENT = {
11
- id: "gpt-5-6-luna",
12
- model: "gpt-5-6-luna",
13
- weight: 20,
14
- } as const;
15
-
16
- export interface HostedDefaultModelExperimentAssignment {
17
- experimentId: string;
18
- variantId: string;
19
- }
20
-
21
- export interface HostedDefaultModelExperimentResolution {
22
- model: string;
23
- assignment: HostedDefaultModelExperimentAssignment;
24
- }
25
-
26
- type HostedExperimentEnv = Record<string, string | undefined>;
27
-
28
- const FIRST_PARTY_HOST_SUFFIX = ".agent-native.com";
29
- const ENABLED_VALUES = new Set(["1", "true", "on", "yes"]);
30
- const DISABLED_VALUES = new Set(["0", "false", "off", "no"]);
31
-
32
- function hostnameFromUrl(value: string | undefined): string | null {
33
- const trimmed = value?.trim();
34
- if (!trimmed) return null;
35
- try {
36
- const url = /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed)
37
- ? new URL(trimmed)
38
- : new URL(`https://${trimmed}`);
39
- return url.hostname.toLowerCase();
40
- } catch {
41
- return null;
42
- }
43
- }
44
-
45
- /**
46
- * The rollout is automatic only on first-party hosted app domains. Operators
47
- * can explicitly enable or disable it for preview and emergency rollback.
48
- */
49
- export function isHostedDefaultModelExperimentEnabled(
50
- env: HostedExperimentEnv = process.env,
51
- ): boolean {
52
- const override =
53
- env.AGENT_NATIVE_HOSTED_MODEL_EXPERIMENT?.trim().toLowerCase();
54
- if (override && DISABLED_VALUES.has(override)) return false;
55
- if (override && ENABLED_VALUES.has(override)) return true;
56
-
57
- const hostnames = [
58
- env.APP_URL,
59
- env.BETTER_AUTH_URL,
60
- env.URL,
61
- env.DEPLOY_URL,
62
- env.VERCEL_PROJECT_PRODUCTION_URL,
63
- env.VERCEL_URL,
64
- ]
65
- .map(hostnameFromUrl)
66
- .filter((hostname): hostname is string => Boolean(hostname));
67
-
68
- return hostnames.some(
69
- (hostname) =>
70
- hostname === "agent-native.com" ||
71
- hostname.endsWith(FIRST_PARTY_HOST_SUFFIX),
72
- );
73
- }
74
-
75
- /**
76
- * Stable cross-app bucket: the same authenticated user receives the same
77
- * variant in every hosted template for the life of this experiment id.
78
- */
79
- export function hostedDefaultModelExperimentBucket(userId: string): number {
80
- const input = `${HOSTED_DEFAULT_MODEL_EXPERIMENT_ID}:${userId.trim().toLowerCase()}`;
81
- let hash = 0x811c9dc5;
82
- for (let index = 0; index < input.length; index++) {
83
- hash ^= input.charCodeAt(index);
84
- hash = Math.imul(hash, 0x01000193);
85
- }
86
- return (hash >>> 0) % 100;
87
- }
88
-
89
- export function resolveHostedDefaultModelExperiment(args: {
90
- userId: string | null | undefined;
91
- engineName: string;
92
- isDefaultModelSelection: boolean;
93
- supportedModels?: readonly string[];
94
- env?: HostedExperimentEnv;
95
- }): HostedDefaultModelExperimentResolution | null {
96
- const userId = args.userId?.trim();
97
- if (!userId) return null;
98
- if (args.engineName !== "builder") return null;
99
- if (!args.isDefaultModelSelection) return null;
100
- if (!isHostedDefaultModelExperimentEnabled(args.env)) return null;
101
-
102
- const variant =
103
- hostedDefaultModelExperimentBucket(userId) <
104
- HOSTED_DEFAULT_MODEL_TREATMENT.weight
105
- ? HOSTED_DEFAULT_MODEL_TREATMENT
106
- : HOSTED_DEFAULT_MODEL_CONTROL;
107
- if (args.supportedModels && !args.supportedModels.includes(variant.model)) {
108
- return null;
109
- }
110
-
111
- return {
112
- model: variant.model,
113
- assignment: {
114
- experimentId: HOSTED_DEFAULT_MODEL_EXPERIMENT_ID,
115
- variantId: variant.id,
116
- },
117
- };
118
- }
@@ -1,39 +0,0 @@
1
- export declare const HOSTED_DEFAULT_MODEL_EXPERIMENT_ID = "hosted-default-model-sonnet-5-vs-gpt-5-6-luna-2026-07";
2
- export declare const HOSTED_DEFAULT_MODEL_CONTROL: {
3
- readonly id: "sonnet-5";
4
- readonly model: "claude-sonnet-5";
5
- readonly weight: 80;
6
- };
7
- export declare const HOSTED_DEFAULT_MODEL_TREATMENT: {
8
- readonly id: "gpt-5-6-luna";
9
- readonly model: "gpt-5-6-luna";
10
- readonly weight: 20;
11
- };
12
- export interface HostedDefaultModelExperimentAssignment {
13
- experimentId: string;
14
- variantId: string;
15
- }
16
- export interface HostedDefaultModelExperimentResolution {
17
- model: string;
18
- assignment: HostedDefaultModelExperimentAssignment;
19
- }
20
- type HostedExperimentEnv = Record<string, string | undefined>;
21
- /**
22
- * The rollout is automatic only on first-party hosted app domains. Operators
23
- * can explicitly enable or disable it for preview and emergency rollback.
24
- */
25
- export declare function isHostedDefaultModelExperimentEnabled(env?: HostedExperimentEnv): boolean;
26
- /**
27
- * Stable cross-app bucket: the same authenticated user receives the same
28
- * variant in every hosted template for the life of this experiment id.
29
- */
30
- export declare function hostedDefaultModelExperimentBucket(userId: string): number;
31
- export declare function resolveHostedDefaultModelExperiment(args: {
32
- userId: string | null | undefined;
33
- engineName: string;
34
- isDefaultModelSelection: boolean;
35
- supportedModels?: readonly string[];
36
- env?: HostedExperimentEnv;
37
- }): HostedDefaultModelExperimentResolution | null;
38
- export {};
39
- //# sourceMappingURL=hosted-model-experiment.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hosted-model-experiment.d.ts","sourceRoot":"","sources":["../../src/observability/hosted-model-experiment.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kCAAkC,0DACU,CAAC;AAE1D,eAAO,MAAM,4BAA4B;aACvC,EAAE,EAAE,UAAU;aACd,KAAK,EAAE,iBAAiB;aACxB,MAAM,EAAE,EAAE;CACF,CAAC;AAEX,eAAO,MAAM,8BAA8B;aACzC,EAAE,EAAE,cAAc;aAClB,KAAK,EAAE,cAAc;aACrB,MAAM,EAAE,EAAE;CACF,CAAC;AAEX,MAAM,WAAW,sCAAsC;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sCAAsC;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,sCAAsC,CAAC;CACpD;AAED,KAAK,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAmB9D;;;GAGG;AACH,wBAAgB,qCAAqC,CACnD,GAAG,GAAE,mBAAiC,GACrC,OAAO,CAsBT;AAED;;;GAGG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQzE;AAED,wBAAgB,mCAAmC,CAAC,IAAI,EAAE;IACxD,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB,EAAE,OAAO,CAAC;IACjC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,GAAG,CAAC,EAAE,mBAAmB,CAAC;CAC3B,GAAG,sCAAsC,GAAG,IAAI,CAuBhD"}