@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
@@ -27,11 +27,11 @@ export declare function resolveAgentEngineApiKeyWriteTarget(event: H3Event, scop
27
27
  export declare function createAgentEngineApiKeyHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
28
28
  error: any;
29
29
  } | {
30
- error?: undefined;
31
30
  ok: boolean;
32
31
  key: string;
33
32
  baseUrlKey?: string;
34
33
  scope: AgentEngineApiKeyScope;
34
+ error?: undefined;
35
35
  }>>;
36
36
  export {};
37
37
  //# sourceMappingURL=agent-engine-api-key-route.d.ts.map
@@ -20,7 +20,7 @@ export declare function createTranscribeVoiceHandler(): import("h3").EventHandle
20
20
  error: string;
21
21
  text?: undefined;
22
22
  } | {
23
- error?: undefined;
24
23
  text: string;
24
+ error?: undefined;
25
25
  }>>;
26
26
  //# sourceMappingURL=transcribe-voice.d.ts.map
@@ -0,0 +1,36 @@
1
+ export declare const SESSION_REPLAY_IFRAME_ATTRIBUTE = "data-agent-native-session-replay";
2
+ export declare const SESSION_REPLAY_IFRAME_PROBE = "agent-native-session-replay:probe";
3
+ export declare const SESSION_REPLAY_IFRAME_START = "agent-native-session-replay:start";
4
+ export declare const SESSION_REPLAY_IFRAME_STOP = "agent-native-session-replay:stop";
5
+ export interface SessionReplayIframePrivacyOptions {
6
+ blockSelector: string;
7
+ ignoreSelector: string;
8
+ maskTextClass?: string | RegExp;
9
+ maskTextSelector: string;
10
+ maskAllInputs: boolean;
11
+ maskInputOptions?: Record<string, boolean>;
12
+ recordCanvas: boolean;
13
+ collectFonts: boolean;
14
+ inlineImages: boolean;
15
+ sampling: Record<string, unknown>;
16
+ }
17
+ export interface SessionReplayIframeProbeMessage {
18
+ type: typeof SESSION_REPLAY_IFRAME_PROBE;
19
+ }
20
+ export interface SessionReplayIframeStartMessage {
21
+ type: typeof SESSION_REPLAY_IFRAME_START;
22
+ options: SessionReplayIframePrivacyOptions;
23
+ }
24
+ export interface SessionReplayIframeStopMessage {
25
+ type: typeof SESSION_REPLAY_IFRAME_STOP;
26
+ }
27
+ export type SessionReplayIframeMessage = SessionReplayIframeProbeMessage | SessionReplayIframeStartMessage | SessionReplayIframeStopMessage;
28
+ /**
29
+ * `srcdoc` HTML came from the immediate parent, so that parent already owns the
30
+ * document being rendered. Server-rendered extension URLs are stricter: only a
31
+ * parent on the render URL's origin may activate recording. That supports
32
+ * custom app domains without allowing an external embed host to make an opaque
33
+ * extension frame disclose its DOM through rrweb's postMessage transport.
34
+ */
35
+ export declare function isTrustedSessionReplayIframeParentOrigin(parentOrigin: string, frameHref: string): boolean;
36
+ //# sourceMappingURL=session-replay-iframe-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-replay-iframe-protocol.d.ts","sourceRoot":"","sources":["../src/session-replay-iframe-protocol.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,+BAA+B,qCACR,CAAC;AACrC,eAAO,MAAM,2BAA2B,sCAAsC,CAAC;AAC/E,eAAO,MAAM,2BAA2B,sCAAsC,CAAC;AAC/E,eAAO,MAAM,0BAA0B,qCAAqC,CAAC;AAE7E,MAAM,WAAW,iCAAiC;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,OAAO,2BAA2B,CAAC;CAC1C;AAED,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,OAAO,2BAA2B,CAAC;IACzC,OAAO,EAAE,iCAAiC,CAAC;CAC5C;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,OAAO,0BAA0B,CAAC;CACzC;AAED,MAAM,MAAM,0BAA0B,GAClC,+BAA+B,GAC/B,+BAA+B,GAC/B,8BAA8B,CAAC;AAEnC;;;;;;GAMG;AACH,wBAAgB,wCAAwC,CACtD,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAUT"}
@@ -0,0 +1,24 @@
1
+ export const SESSION_REPLAY_IFRAME_ATTRIBUTE = "data-agent-native-session-replay";
2
+ export const SESSION_REPLAY_IFRAME_PROBE = "agent-native-session-replay:probe";
3
+ export const SESSION_REPLAY_IFRAME_START = "agent-native-session-replay:start";
4
+ export const SESSION_REPLAY_IFRAME_STOP = "agent-native-session-replay:stop";
5
+ /**
6
+ * `srcdoc` HTML came from the immediate parent, so that parent already owns the
7
+ * document being rendered. Server-rendered extension URLs are stricter: only a
8
+ * parent on the render URL's origin may activate recording. That supports
9
+ * custom app domains without allowing an external embed host to make an opaque
10
+ * extension frame disclose its DOM through rrweb's postMessage transport.
11
+ */
12
+ export function isTrustedSessionReplayIframeParentOrigin(parentOrigin, frameHref) {
13
+ if (frameHref === "about:srcdoc") {
14
+ return parentOrigin !== "null" && parentOrigin !== "";
15
+ }
16
+ try {
17
+ const frameOrigin = new URL(frameHref).origin;
18
+ return frameOrigin !== "null" && parentOrigin === frameOrigin;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ //# sourceMappingURL=session-replay-iframe-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-replay-iframe-protocol.js","sourceRoot":"","sources":["../src/session-replay-iframe-protocol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,+BAA+B,GAC1C,kCAAkC,CAAC;AACrC,MAAM,CAAC,MAAM,2BAA2B,GAAG,mCAAmC,CAAC;AAC/E,MAAM,CAAC,MAAM,2BAA2B,GAAG,mCAAmC,CAAC;AAC/E,MAAM,CAAC,MAAM,0BAA0B,GAAG,kCAAkC,CAAC;AAiC7E;;;;;;GAMG;AACH,MAAM,UAAU,wCAAwC,CACtD,YAAoB,EACpB,SAAiB;IAEjB,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;QACjC,OAAO,YAAY,KAAK,MAAM,IAAI,YAAY,KAAK,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QAC9C,OAAO,WAAW,KAAK,MAAM,IAAI,YAAY,KAAK,WAAW,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC","sourcesContent":["export const SESSION_REPLAY_IFRAME_ATTRIBUTE =\n \"data-agent-native-session-replay\";\nexport const SESSION_REPLAY_IFRAME_PROBE = \"agent-native-session-replay:probe\";\nexport const SESSION_REPLAY_IFRAME_START = \"agent-native-session-replay:start\";\nexport const SESSION_REPLAY_IFRAME_STOP = \"agent-native-session-replay:stop\";\n\nexport interface SessionReplayIframePrivacyOptions {\n blockSelector: string;\n ignoreSelector: string;\n maskTextClass?: string | RegExp;\n maskTextSelector: string;\n maskAllInputs: boolean;\n maskInputOptions?: Record<string, boolean>;\n recordCanvas: boolean;\n collectFonts: boolean;\n inlineImages: boolean;\n sampling: Record<string, unknown>;\n}\n\nexport interface SessionReplayIframeProbeMessage {\n type: typeof SESSION_REPLAY_IFRAME_PROBE;\n}\n\nexport interface SessionReplayIframeStartMessage {\n type: typeof SESSION_REPLAY_IFRAME_START;\n options: SessionReplayIframePrivacyOptions;\n}\n\nexport interface SessionReplayIframeStopMessage {\n type: typeof SESSION_REPLAY_IFRAME_STOP;\n}\n\nexport type SessionReplayIframeMessage =\n | SessionReplayIframeProbeMessage\n | SessionReplayIframeStartMessage\n | SessionReplayIframeStopMessage;\n\n/**\n * `srcdoc` HTML came from the immediate parent, so that parent already owns the\n * document being rendered. Server-rendered extension URLs are stricter: only a\n * parent on the render URL's origin may activate recording. That supports\n * custom app domains without allowing an external embed host to make an opaque\n * extension frame disclose its DOM through rrweb's postMessage transport.\n */\nexport function isTrustedSessionReplayIframeParentOrigin(\n parentOrigin: string,\n frameHref: string,\n): boolean {\n if (frameHref === \"about:srcdoc\") {\n return parentOrigin !== \"null\" && parentOrigin !== \"\";\n }\n try {\n const frameOrigin = new URL(frameHref).origin;\n return frameOrigin !== \"null\" && parentOrigin === frameOrigin;\n } catch {\n return false;\n }\n}\n"]}
@@ -26,4 +26,15 @@ export declare function reasoningEffortLabel(effort: ReasoningEffort | undefined
26
26
  */
27
27
  export declare function resolveReasoningEffortSelection(model: string | undefined, effort: ReasoningEffort | undefined): ReasoningEffort;
28
28
  export declare function stepDownReasoningEffort(effort: ReasoningEffort | undefined): ReasoningEffort | undefined;
29
+ /**
30
+ * Anthropic's adaptive-thinking API is only available on the newer Claude
31
+ * model families. Claude Haiku 4.5 is reasoning-capable, but it still
32
+ * requires the legacy manual `budget_tokens` configuration.
33
+ */
34
+ export declare function supportsClaudeAdaptiveThinking(model: string | undefined): boolean;
35
+ /**
36
+ * Map the shared reasoning ladder to Anthropic's manual thinking budgets for
37
+ * models that do not support adaptive thinking (currently Claude Haiku 4.5).
38
+ */
39
+ export declare function anthropicManualThinkingBudget(effort: ReasoningEffort): 1024 | 4096 | 8000 | 16000 | 32000;
29
40
  //# sourceMappingURL=reasoning-effort.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reasoning-effort.d.ts","sourceRoot":"","sources":["../../src/shared/reasoning-effort.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,YAC5B,MAAM,EACN,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,MAAM,EACN,OAAO,EACP,KAAK,CACG,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,eAA0B,CAAC;AAElE,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CASnE,CAAC;AAsBF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,eAAe,EAAE,CAcnB;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAmB7B;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAG7B;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,UAIvE;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,CAOjB;AAkBD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAG7B"}
1
+ {"version":3,"file":"reasoning-effort.d.ts","sourceRoot":"","sources":["../../src/shared/reasoning-effort.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,YAC5B,MAAM,EACN,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,MAAM,EACN,OAAO,EACP,KAAK,CACG,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,eAA0B,CAAC;AAElE,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CASnE,CAAC;AAsBF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,eAAe,EAAE,CAcnB;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAmB7B;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAG7B;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,UAIvE;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,CAOjB;AAkBD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAG7B;AAgBD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,WAOvE;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,eAAe,sCAepE"}
@@ -136,6 +136,42 @@ function isClaudeReasoningModel(model) {
136
136
  const opusMatch = id.match(/opus-4[-.](\d+)/);
137
137
  return opusMatch ? parseInt(opusMatch[1], 10) >= 6 : false;
138
138
  }
139
+ /**
140
+ * Anthropic's adaptive-thinking API is only available on the newer Claude
141
+ * model families. Claude Haiku 4.5 is reasoning-capable, but it still
142
+ * requires the legacy manual `budget_tokens` configuration.
143
+ */
144
+ export function supportsClaudeAdaptiveThinking(model) {
145
+ if (!model)
146
+ return false;
147
+ const id = model.toLowerCase().replace(/^anthropic\//, "");
148
+ if (id.includes("fable-5") || id.includes("mythos-5"))
149
+ return true;
150
+ if (id.includes("sonnet-5") || id.includes("sonnet-4-6"))
151
+ return true;
152
+ const opusMatch = id.match(/opus-4[-.](\d+)/);
153
+ return opusMatch ? parseInt(opusMatch[1], 10) >= 6 : false;
154
+ }
155
+ /**
156
+ * Map the shared reasoning ladder to Anthropic's manual thinking budgets for
157
+ * models that do not support adaptive thinking (currently Claude Haiku 4.5).
158
+ */
159
+ export function anthropicManualThinkingBudget(effort) {
160
+ switch (effort) {
161
+ case "low":
162
+ return 1_024;
163
+ case "medium":
164
+ return 4_096;
165
+ case "high":
166
+ return 8_000;
167
+ case "xhigh":
168
+ return 16_000;
169
+ case "max":
170
+ return 32_000;
171
+ default:
172
+ return 4_096;
173
+ }
174
+ }
139
175
  function supportsClaudeXHigh(model) {
140
176
  const id = model.toLowerCase().replace(/^anthropic\//, "");
141
177
  // Models that support the xhigh effort tier (built-in extended thinking via
@@ -1 +1 @@
1
- {"version":3,"file":"reasoning-effort.js","sourceRoot":"","sources":["../../src/shared/reasoning-effort.ts"],"names":[],"mappings":"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","sourcesContent":["export const REASONING_EFFORTS = [\n \"auto\",\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n] as const;\n\nexport type ReasoningEffort = (typeof REASONING_EFFORTS)[number];\n\n/**\n * Shared chat always chooses an explicit reasoning tier. Keep `auto` in the\n * accepted type only so older persisted selections and external callers can\n * migrate cleanly; new UI and engine defaults resolve it to Medium.\n */\nexport const DEFAULT_REASONING_EFFORT: ReasoningEffort = \"medium\";\n\nexport const REASONING_EFFORT_LABELS: Record<ReasoningEffort, string> = {\n auto: \"Auto\",\n none: \"None\",\n minimal: \"Minimal\",\n low: \"Low\",\n medium: \"Medium\",\n high: \"High\",\n xhigh: \"Extra High\",\n max: \"Max\",\n};\n\nconst VISIBLE_STANDARD_EFFORTS: ReasoningEffort[] = [\"low\", \"medium\", \"high\"];\n\nconst VISIBLE_GPT_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"xhigh\",\n];\n\nconst VISIBLE_CLAUDE_BUILT_IN_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"xhigh\",\n \"max\",\n];\n\nconst VISIBLE_CLAUDE_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"max\",\n];\n\nconst effortSet = new Set<string>(REASONING_EFFORTS);\n\nexport function isReasoningEffort(value: unknown): value is ReasoningEffort {\n return typeof value === \"string\" && effortSet.has(value);\n}\n\nexport function getReasoningEffortOptionsForModel(\n model: string | undefined,\n): ReasoningEffort[] {\n if (!model) return [];\n if (isGPTReasoningModel(model)) {\n return VISIBLE_GPT_EFFORTS;\n }\n if (isClaudeReasoningModel(model)) {\n return supportsClaudeXHigh(model)\n ? VISIBLE_CLAUDE_BUILT_IN_EFFORTS\n : VISIBLE_CLAUDE_EFFORTS;\n }\n if (isGeminiReasoningModel(model)) {\n return VISIBLE_STANDARD_EFFORTS;\n }\n return [];\n}\n\nexport function normalizeReasoningEffortForModel(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (!model) return undefined;\n let normalized =\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort;\n if (\n normalized === \"xhigh\" &&\n isClaudeReasoningModel(model) &&\n !supportsClaudeXHigh(model)\n ) {\n normalized = \"high\";\n }\n if (normalized === \"max\" && isGPTReasoningModel(model)) {\n normalized = \"xhigh\";\n }\n const options = getReasoningEffortOptionsForModel(model);\n if (!options.length || !options.includes(normalized)) {\n return undefined;\n }\n return normalized;\n}\n\n/**\n * Normalize a chat request before it reaches an engine. Explicit off/minimal\n * sentinels must survive this layer so the engine can distinguish them from a\n * missing selection, which now means the Medium default.\n */\nexport function normalizeReasoningEffortForRequest(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (effort === \"none\" || effort === \"minimal\") return effort;\n return normalizeReasoningEffortForModel(model, effort);\n}\n\nexport function reasoningEffortLabel(effort: ReasoningEffort | undefined) {\n return REASONING_EFFORT_LABELS[\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort\n ];\n}\n\n/**\n * Resolve a user-facing selection for a model. Legacy `auto`, missing values,\n * and tiers unsupported by the newly selected model all become Medium.\n * Non-reasoning models still retain Medium in persisted chat state so moving\n * back to a reasoning model has a predictable default; their engines omit the\n * effort through `normalizeReasoningEffortForModel`.\n */\nexport function resolveReasoningEffortSelection(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort {\n const requested =\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort;\n const options = getReasoningEffortOptionsForModel(model);\n return options.length === 0 || options.includes(requested)\n ? requested\n : DEFAULT_REASONING_EFFORT;\n}\n\n/**\n * One tier down from each effort, stopping at \"minimal\" — legacy `auto`,\n * \"none\", and \"minimal\" itself are left unchanged. Used by the\n * empty-final-response retry so a retried turn asks for meaningfully less\n * reasoning instead of repeating the exact request that came back empty.\n */\nconst REASONING_EFFORT_STEP_DOWN: Partial<\n Record<ReasoningEffort, ReasoningEffort>\n> = {\n max: \"xhigh\",\n xhigh: \"high\",\n high: \"medium\",\n medium: \"low\",\n low: \"minimal\",\n};\n\nexport function stepDownReasoningEffort(\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (!effort) return effort;\n return REASONING_EFFORT_STEP_DOWN[effort] ?? effort;\n}\n\nfunction isGPTReasoningModel(model: string) {\n const id = model.toLowerCase().replace(/^openai\\//, \"\");\n return /^gpt-5/.test(id) || /^o\\d/.test(id);\n}\n\nfunction isClaudeReasoningModel(model: string) {\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n if (id.includes(\"fable-5\") || id.includes(\"mythos-5\")) return true;\n if (id.includes(\"sonnet-5\") || id.includes(\"sonnet-4-6\")) return true;\n if (id.includes(\"haiku-4-5\")) return true;\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n return opusMatch ? parseInt(opusMatch[1], 10) >= 6 : false;\n}\n\nfunction supportsClaudeXHigh(model: string) {\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n // Models that support the xhigh effort tier (built-in extended thinking via\n // output_config.effort). Keep this version-aware so any future Claude model\n // with a higher patch/minor number is automatically included rather than\n // silently falling back to the lower \"high\" tier.\n // claude-fable-5 is a Mythos-class model and also supports xhigh.\n if (id.includes(\"fable-5\")) return true;\n // Sonnet 5 supports the expanded effort ladder through Builder/Anthropic.\n if (id.includes(\"sonnet-5\")) return true;\n // opus-4-7 introduced xhigh; all opus-4.x successors (4-8, 4-9…) should too.\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n if (opusMatch) {\n return parseInt(opusMatch[1], 10) >= 7;\n }\n return false;\n}\n\nfunction isGeminiReasoningModel(model: string) {\n return /^gemini-/.test(model.toLowerCase().replace(/^google\\//, \"\"));\n}\n"]}
1
+ {"version":3,"file":"reasoning-effort.js","sourceRoot":"","sources":["../../src/shared/reasoning-effort.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,MAAM;IACN,MAAM;IACN,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;IACP,KAAK;CACG,CAAC;AAIX;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAoB,QAAQ,CAAC;AAElE,MAAM,CAAC,MAAM,uBAAuB,GAAoC;IACtE,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,YAAY;IACnB,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,MAAM,wBAAwB,GAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAE9E,MAAM,mBAAmB,GAAsB;IAC7C,GAAG,wBAAwB;IAC3B,OAAO;CACR,CAAC;AAEF,MAAM,+BAA+B,GAAsB;IACzD,GAAG,wBAAwB;IAC3B,OAAO;IACP,KAAK;CACN,CAAC;AAEF,MAAM,sBAAsB,GAAsB;IAChD,GAAG,wBAAwB;IAC3B,KAAK;CACN,CAAC;AAEF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAS,iBAAiB,CAAC,CAAC;AAErD,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,KAAyB;IAEzB,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,mBAAmB,CAAC,KAAK,CAAC;YAC/B,CAAC,CAAC,+BAA+B;YACjC,CAAC,CAAC,sBAAsB,CAAC;IAC7B,CAAC;IACD,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,wBAAwB,CAAC;IAClC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,KAAyB,EACzB,MAAmC;IAEnC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,UAAU,GACZ,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,MAAM,CAAC;IACnE,IACE,UAAU,KAAK,OAAO;QACtB,sBAAsB,CAAC,KAAK,CAAC;QAC7B,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAC3B,CAAC;QACD,UAAU,GAAG,MAAM,CAAC;IACtB,CAAC;IACD,IAAI,UAAU,KAAK,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,UAAU,GAAG,OAAO,CAAC;IACvB,CAAC;IACD,MAAM,OAAO,GAAG,iCAAiC,CAAC,KAAK,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACrD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kCAAkC,CAChD,KAAyB,EACzB,MAAmC;IAEnC,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAC7D,OAAO,gCAAgC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAmC;IACtE,OAAO,uBAAuB,CAC5B,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,MAAM,CACjE,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,+BAA+B,CAC7C,KAAyB,EACzB,MAAmC;IAEnC,MAAM,SAAS,GACb,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,MAAM,CAAC;IACnE,MAAM,OAAO,GAAG,iCAAiC,CAAC,KAAK,CAAC,CAAC;IACzD,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QACxD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,wBAAwB,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,MAAM,0BAA0B,GAE5B;IACF,GAAG,EAAE,OAAO;IACZ,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,KAAK;IACb,GAAG,EAAE,SAAS;CACf,CAAC;AAEF,MAAM,UAAU,uBAAuB,CACrC,MAAmC;IAEnC,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,OAAO,0BAA0B,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;AACtD,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACxD,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa;IAC3C,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC3D,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,IAAI,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IACtE,IAAI,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC9C,OAAO,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,8BAA8B,CAAC,KAAyB;IACtE,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC3D,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,IAAI,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IACtE,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC9C,OAAO,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,6BAA6B,CAAC,MAAuB;IACnE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC;QACf,KAAK,MAAM;YACT,OAAO,KAAK,CAAC;QACf,KAAK,OAAO;YACV,OAAO,MAAM,CAAC;QAChB,KAAK,KAAK;YACR,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC3D,4EAA4E;IAC5E,4EAA4E;IAC5E,yEAAyE;IACzE,kDAAkD;IAClD,kEAAkE;IAClE,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,0EAA0E;IAC1E,IAAI,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,6EAA6E;IAC7E,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC9C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa;IAC3C,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC","sourcesContent":["export const REASONING_EFFORTS = [\n \"auto\",\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n] as const;\n\nexport type ReasoningEffort = (typeof REASONING_EFFORTS)[number];\n\n/**\n * Shared chat always chooses an explicit reasoning tier. Keep `auto` in the\n * accepted type only so older persisted selections and external callers can\n * migrate cleanly; new UI and engine defaults resolve it to Medium.\n */\nexport const DEFAULT_REASONING_EFFORT: ReasoningEffort = \"medium\";\n\nexport const REASONING_EFFORT_LABELS: Record<ReasoningEffort, string> = {\n auto: \"Auto\",\n none: \"None\",\n minimal: \"Minimal\",\n low: \"Low\",\n medium: \"Medium\",\n high: \"High\",\n xhigh: \"Extra High\",\n max: \"Max\",\n};\n\nconst VISIBLE_STANDARD_EFFORTS: ReasoningEffort[] = [\"low\", \"medium\", \"high\"];\n\nconst VISIBLE_GPT_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"xhigh\",\n];\n\nconst VISIBLE_CLAUDE_BUILT_IN_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"xhigh\",\n \"max\",\n];\n\nconst VISIBLE_CLAUDE_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"max\",\n];\n\nconst effortSet = new Set<string>(REASONING_EFFORTS);\n\nexport function isReasoningEffort(value: unknown): value is ReasoningEffort {\n return typeof value === \"string\" && effortSet.has(value);\n}\n\nexport function getReasoningEffortOptionsForModel(\n model: string | undefined,\n): ReasoningEffort[] {\n if (!model) return [];\n if (isGPTReasoningModel(model)) {\n return VISIBLE_GPT_EFFORTS;\n }\n if (isClaudeReasoningModel(model)) {\n return supportsClaudeXHigh(model)\n ? VISIBLE_CLAUDE_BUILT_IN_EFFORTS\n : VISIBLE_CLAUDE_EFFORTS;\n }\n if (isGeminiReasoningModel(model)) {\n return VISIBLE_STANDARD_EFFORTS;\n }\n return [];\n}\n\nexport function normalizeReasoningEffortForModel(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (!model) return undefined;\n let normalized =\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort;\n if (\n normalized === \"xhigh\" &&\n isClaudeReasoningModel(model) &&\n !supportsClaudeXHigh(model)\n ) {\n normalized = \"high\";\n }\n if (normalized === \"max\" && isGPTReasoningModel(model)) {\n normalized = \"xhigh\";\n }\n const options = getReasoningEffortOptionsForModel(model);\n if (!options.length || !options.includes(normalized)) {\n return undefined;\n }\n return normalized;\n}\n\n/**\n * Normalize a chat request before it reaches an engine. Explicit off/minimal\n * sentinels must survive this layer so the engine can distinguish them from a\n * missing selection, which now means the Medium default.\n */\nexport function normalizeReasoningEffortForRequest(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (effort === \"none\" || effort === \"minimal\") return effort;\n return normalizeReasoningEffortForModel(model, effort);\n}\n\nexport function reasoningEffortLabel(effort: ReasoningEffort | undefined) {\n return REASONING_EFFORT_LABELS[\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort\n ];\n}\n\n/**\n * Resolve a user-facing selection for a model. Legacy `auto`, missing values,\n * and tiers unsupported by the newly selected model all become Medium.\n * Non-reasoning models still retain Medium in persisted chat state so moving\n * back to a reasoning model has a predictable default; their engines omit the\n * effort through `normalizeReasoningEffortForModel`.\n */\nexport function resolveReasoningEffortSelection(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort {\n const requested =\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort;\n const options = getReasoningEffortOptionsForModel(model);\n return options.length === 0 || options.includes(requested)\n ? requested\n : DEFAULT_REASONING_EFFORT;\n}\n\n/**\n * One tier down from each effort, stopping at \"minimal\" — legacy `auto`,\n * \"none\", and \"minimal\" itself are left unchanged. Used by the\n * empty-final-response retry so a retried turn asks for meaningfully less\n * reasoning instead of repeating the exact request that came back empty.\n */\nconst REASONING_EFFORT_STEP_DOWN: Partial<\n Record<ReasoningEffort, ReasoningEffort>\n> = {\n max: \"xhigh\",\n xhigh: \"high\",\n high: \"medium\",\n medium: \"low\",\n low: \"minimal\",\n};\n\nexport function stepDownReasoningEffort(\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (!effort) return effort;\n return REASONING_EFFORT_STEP_DOWN[effort] ?? effort;\n}\n\nfunction isGPTReasoningModel(model: string) {\n const id = model.toLowerCase().replace(/^openai\\//, \"\");\n return /^gpt-5/.test(id) || /^o\\d/.test(id);\n}\n\nfunction isClaudeReasoningModel(model: string) {\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n if (id.includes(\"fable-5\") || id.includes(\"mythos-5\")) return true;\n if (id.includes(\"sonnet-5\") || id.includes(\"sonnet-4-6\")) return true;\n if (id.includes(\"haiku-4-5\")) return true;\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n return opusMatch ? parseInt(opusMatch[1], 10) >= 6 : false;\n}\n\n/**\n * Anthropic's adaptive-thinking API is only available on the newer Claude\n * model families. Claude Haiku 4.5 is reasoning-capable, but it still\n * requires the legacy manual `budget_tokens` configuration.\n */\nexport function supportsClaudeAdaptiveThinking(model: string | undefined) {\n if (!model) return false;\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n if (id.includes(\"fable-5\") || id.includes(\"mythos-5\")) return true;\n if (id.includes(\"sonnet-5\") || id.includes(\"sonnet-4-6\")) return true;\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n return opusMatch ? parseInt(opusMatch[1], 10) >= 6 : false;\n}\n\n/**\n * Map the shared reasoning ladder to Anthropic's manual thinking budgets for\n * models that do not support adaptive thinking (currently Claude Haiku 4.5).\n */\nexport function anthropicManualThinkingBudget(effort: ReasoningEffort) {\n switch (effort) {\n case \"low\":\n return 1_024;\n case \"medium\":\n return 4_096;\n case \"high\":\n return 8_000;\n case \"xhigh\":\n return 16_000;\n case \"max\":\n return 32_000;\n default:\n return 4_096;\n }\n}\n\nfunction supportsClaudeXHigh(model: string) {\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n // Models that support the xhigh effort tier (built-in extended thinking via\n // output_config.effort). Keep this version-aware so any future Claude model\n // with a higher patch/minor number is automatically included rather than\n // silently falling back to the lower \"high\" tier.\n // claude-fable-5 is a Mythos-class model and also supports xhigh.\n if (id.includes(\"fable-5\")) return true;\n // Sonnet 5 supports the expanded effort ladder through Builder/Anthropic.\n if (id.includes(\"sonnet-5\")) return true;\n // opus-4-7 introduced xhigh; all opus-4.x successors (4-8, 4-9…) should too.\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n if (opusMatch) {\n return parseInt(opusMatch[1], 10) >= 7;\n }\n return false;\n}\n\nfunction isGeminiReasoningModel(model: string) {\n return /^gemini-/.test(model.toLowerCase().replace(/^google\\//, \"\"));\n}\n"]}
@@ -493,6 +493,32 @@
493
493
  -webkit-mask-image: linear-gradient(to bottom, transparent, black 1.5rem);
494
494
  }
495
495
 
496
+ .agent-chat-collapse {
497
+ display: grid;
498
+ grid-template-rows: 1fr;
499
+ opacity: 1;
500
+ transition:
501
+ grid-template-rows 200ms var(--ease-collapse),
502
+ opacity 150ms ease-out;
503
+ }
504
+
505
+ .agent-chat-collapse[data-state="closed"] {
506
+ grid-template-rows: 0fr;
507
+ opacity: 0;
508
+ pointer-events: none;
509
+ }
510
+
511
+ .agent-chat-collapse__content {
512
+ min-height: 0;
513
+ overflow: hidden;
514
+ }
515
+
516
+ @media (prefers-reduced-motion: reduce) {
517
+ .agent-chat-collapse {
518
+ transition-duration: 0.01ms;
519
+ }
520
+ }
521
+
496
522
  /* ─── Agent-Markdown (AssistantChat react-markdown render surface) ─────────── */
497
523
  /* These classes are applied by the SmoothMarkdownText/MarkdownText components */
498
524
  /* in the AssistantChat/AssistantChatInner tree. The shiki dual-theme rules */
@@ -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
@@ -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 الخاصة بالموفر. تمر إعادة التشغيل عبر مسارات خادم محددة النطاق، وتُرجع أدوات الوكيل الافتراضية ملخصات أو أحداث إعادة تشغيل محدودة، وليس وصولاً خامًا إلى جدول الأجزاء.