@agent-native/core 0.97.0 → 0.98.1

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 (1019) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +56 -0
  3. package/corpus/core/docs/content/authentication.mdx +3 -3
  4. package/corpus/core/docs/content/doctor.mdx +170 -0
  5. package/corpus/core/docs/content/external-agents.mdx +8 -7
  6. package/corpus/core/docs/content/locales/ar-SA/authentication.mdx +2 -2
  7. package/corpus/core/docs/content/locales/ar-SA/external-agents.mdx +8 -7
  8. package/corpus/core/docs/content/locales/ar-SA/mcp-protocol.mdx +1 -1
  9. package/corpus/core/docs/content/locales/ar-SA/security.mdx +2 -0
  10. package/corpus/core/docs/content/locales/de-DE/authentication.mdx +1 -1
  11. package/corpus/core/docs/content/locales/de-DE/external-agents.mdx +8 -7
  12. package/corpus/core/docs/content/locales/de-DE/mcp-protocol.mdx +1 -1
  13. package/corpus/core/docs/content/locales/de-DE/security.mdx +2 -0
  14. package/corpus/core/docs/content/locales/es-ES/authentication.mdx +2 -2
  15. package/corpus/core/docs/content/locales/es-ES/external-agents.mdx +8 -7
  16. package/corpus/core/docs/content/locales/es-ES/mcp-protocol.mdx +1 -1
  17. package/corpus/core/docs/content/locales/es-ES/security.mdx +2 -0
  18. package/corpus/core/docs/content/locales/fr-FR/authentication.mdx +1 -1
  19. package/corpus/core/docs/content/locales/fr-FR/external-agents.mdx +8 -7
  20. package/corpus/core/docs/content/locales/fr-FR/mcp-protocol.mdx +1 -1
  21. package/corpus/core/docs/content/locales/fr-FR/security.mdx +2 -0
  22. package/corpus/core/docs/content/locales/hi-IN/authentication.mdx +2 -2
  23. package/corpus/core/docs/content/locales/hi-IN/external-agents.mdx +8 -7
  24. package/corpus/core/docs/content/locales/hi-IN/mcp-protocol.mdx +1 -1
  25. package/corpus/core/docs/content/locales/hi-IN/security.mdx +2 -0
  26. package/corpus/core/docs/content/locales/ja-JP/authentication.mdx +2 -2
  27. package/corpus/core/docs/content/locales/ja-JP/external-agents.mdx +8 -7
  28. package/corpus/core/docs/content/locales/ja-JP/mcp-protocol.mdx +1 -1
  29. package/corpus/core/docs/content/locales/ja-JP/security.mdx +2 -0
  30. package/corpus/core/docs/content/locales/ko-KR/authentication.mdx +2 -2
  31. package/corpus/core/docs/content/locales/ko-KR/external-agents.mdx +8 -7
  32. package/corpus/core/docs/content/locales/ko-KR/mcp-protocol.mdx +1 -1
  33. package/corpus/core/docs/content/locales/ko-KR/security.mdx +2 -0
  34. package/corpus/core/docs/content/locales/pt-BR/authentication.mdx +2 -2
  35. package/corpus/core/docs/content/locales/pt-BR/external-agents.mdx +8 -7
  36. package/corpus/core/docs/content/locales/pt-BR/mcp-protocol.mdx +1 -1
  37. package/corpus/core/docs/content/locales/pt-BR/security.mdx +2 -0
  38. package/corpus/core/docs/content/locales/zh-CN/authentication.mdx +2 -2
  39. package/corpus/core/docs/content/locales/zh-CN/external-agents.mdx +8 -7
  40. package/corpus/core/docs/content/locales/zh-CN/mcp-protocol.mdx +1 -1
  41. package/corpus/core/docs/content/locales/zh-CN/security.mdx +2 -0
  42. package/corpus/core/docs/content/locales/zh-TW/authentication.mdx +2 -2
  43. package/corpus/core/docs/content/locales/zh-TW/external-agents.mdx +8 -7
  44. package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.mdx +1 -1
  45. package/corpus/core/docs/content/locales/zh-TW/security.mdx +2 -0
  46. package/corpus/core/docs/content/mcp-protocol.mdx +1 -1
  47. package/corpus/core/docs/content/security.mdx +2 -0
  48. package/corpus/core/package.json +6 -2
  49. package/corpus/core/scripts/finalize-build.mjs +63 -3
  50. package/corpus/core/scripts/materialize-source-corpus.mjs +101 -15
  51. package/corpus/core/src/action-change-marker.ts +8 -1
  52. package/corpus/core/src/action.ts +42 -0
  53. package/corpus/core/src/agent/engine/builder-engine.ts +3 -0
  54. package/corpus/core/src/agent/engine/context-directives-transform.ts +69 -0
  55. package/corpus/core/src/agent/engine/continuation-dispatch-retry.ts +168 -0
  56. package/corpus/core/src/agent/engine/tool-call-journal-seed.ts +85 -0
  57. package/corpus/core/src/agent/production-agent.ts +129 -244
  58. package/corpus/core/src/changelog/parse.ts +8 -3
  59. package/corpus/core/src/cli/doctor.ts +9 -3
  60. package/corpus/core/src/cli/plan-local.ts +10 -2
  61. package/corpus/core/src/cli/skills-content/assets-skill.ts +83 -0
  62. package/corpus/core/src/cli/skills-content/canvas.ts +153 -0
  63. package/corpus/core/src/cli/skills-content/connection.ts +52 -0
  64. package/corpus/core/src/cli/skills-content/content-skill.ts +109 -0
  65. package/corpus/core/src/cli/skills-content/design-exploration-skill.ts +118 -0
  66. package/corpus/core/src/cli/skills-content/design-visual-edit-skill.ts +228 -0
  67. package/corpus/core/src/cli/skills-content/document-quality.ts +196 -0
  68. package/corpus/core/src/cli/skills-content/exemplar.ts +69 -0
  69. package/corpus/core/src/cli/skills-content/help.ts +77 -0
  70. package/corpus/core/src/cli/skills-content/index.ts +22 -0
  71. package/corpus/core/src/cli/skills-content/local-files.ts +95 -0
  72. package/corpus/core/src/cli/skills-content/plan-setup-auth.ts +80 -0
  73. package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +470 -0
  74. package/corpus/core/src/cli/skills-content/visual-recap-skill.ts +547 -0
  75. package/corpus/core/src/cli/skills-content/visualize-repo-skill.ts +93 -0
  76. package/corpus/core/src/cli/skills-content/wireframe.ts +349 -0
  77. package/corpus/core/src/cli/skills.ts +27 -2733
  78. package/corpus/core/src/client/AgentPanel.tsx +8 -8
  79. package/corpus/core/src/client/AssistantChat.tsx +83 -39
  80. package/corpus/core/src/client/CommandMenu.tsx +16 -5
  81. package/corpus/core/src/client/FeedbackButton.tsx +2 -2
  82. package/corpus/core/src/client/analytics.ts +29 -0
  83. package/corpus/core/src/client/app-providers.tsx +18 -5
  84. package/corpus/core/src/client/blocks/library/wireframe-kit.tsx +16 -2
  85. package/corpus/core/src/client/chat/tool-call-display.tsx +3 -3
  86. package/corpus/core/src/client/chat-model-groups.ts +28 -0
  87. package/corpus/core/src/client/composer/PastedTextChip.tsx +1 -1
  88. package/corpus/core/src/client/composer/RealtimeVoiceMode.tsx +523 -68
  89. package/corpus/core/src/client/composer/TiptapComposer.tsx +47 -30
  90. package/corpus/core/src/client/composer/VoiceButton.tsx +22 -5
  91. package/corpus/core/src/client/composer/index.ts +5 -0
  92. package/corpus/core/src/client/composer/useRealtimeVoiceMode.tsx +1271 -35
  93. package/corpus/core/src/client/context-xray/ContextXRayPanel.tsx +5 -2
  94. package/corpus/core/src/client/extensions/ExtensionEditor.tsx +37 -4
  95. package/corpus/core/src/client/extensions/ExtensionQueryErrorState.tsx +47 -0
  96. package/corpus/core/src/client/extensions/ExtensionSlot.tsx +39 -10
  97. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +44 -6
  98. package/corpus/core/src/client/extensions/ExtensionsListPage.tsx +12 -3
  99. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +49 -11
  100. package/corpus/core/src/client/index.ts +5 -13
  101. package/corpus/core/src/client/progress/RunsTray.tsx +23 -4
  102. package/corpus/core/src/client/settings/SecretsSection.tsx +387 -266
  103. package/corpus/core/src/client/settings/SettingsPanel.tsx +117 -38
  104. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +7 -0
  105. package/corpus/core/src/client/settings/useBuilderStatus.ts +6 -0
  106. package/corpus/core/src/client/tool-cells/EditCell.tsx +19 -16
  107. package/corpus/core/src/client/tool-cells/FilesChangedSummary.tsx +26 -23
  108. package/corpus/core/src/client/tool-cells/WriteCell.tsx +19 -16
  109. package/corpus/core/src/client/use-action.ts +12 -0
  110. package/corpus/core/src/client/use-agent-chat-home-handoff.ts +8 -1
  111. package/corpus/core/src/client/use-agent-engine-configured.ts +17 -3
  112. package/corpus/core/src/client/use-db-sync.ts +84 -34
  113. package/corpus/core/src/client/use-pausing-interval.ts +14 -4
  114. package/corpus/core/src/client/visual-style-controls.tsx +1 -1
  115. package/corpus/core/src/deploy/build.ts +36 -14
  116. package/corpus/core/src/integrations/google-docs-poller.ts +23 -2
  117. package/corpus/core/src/integrations/plugin.ts +10 -0
  118. package/corpus/core/src/integrations/scope-store.ts +1 -1
  119. package/corpus/core/src/integrations/usage-budget-store.ts +1 -1
  120. package/corpus/core/src/integrations/webhook-handler.ts +27 -2
  121. package/corpus/core/src/jobs/scheduler.ts +28 -2
  122. package/corpus/core/src/localization/default-messages.ts +51 -1
  123. package/corpus/core/src/mcp/oauth-token.ts +6 -1
  124. package/corpus/core/src/mcp-client/workspace-servers.ts +4 -4
  125. package/corpus/core/src/observability/routes.ts +36 -0
  126. package/corpus/core/src/observability/sentiment.ts +261 -0
  127. package/corpus/core/src/observability/store.ts +23 -0
  128. package/corpus/core/src/observability/traces.ts +49 -63
  129. package/corpus/core/src/observability/tracking-identity.ts +55 -0
  130. package/corpus/core/src/observability/types.ts +13 -0
  131. package/corpus/core/src/secrets/crypto.ts +28 -8
  132. package/corpus/core/src/secrets/storage.ts +67 -3
  133. package/corpus/core/src/server/action-change.ts +5 -1
  134. package/corpus/core/src/server/action-routes.ts +8 -0
  135. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +199 -0
  136. package/corpus/core/src/server/agent-chat/browser-team-tools.ts +510 -0
  137. package/corpus/core/src/server/agent-chat/context-tools.ts +595 -0
  138. package/corpus/core/src/server/agent-chat/framework-prompts.ts +470 -0
  139. package/corpus/core/src/server/agent-chat/lazy-fs.ts +11 -0
  140. package/corpus/core/src/server/agent-chat/mcp-glue.ts +91 -0
  141. package/corpus/core/src/server/agent-chat/plugin-options.ts +350 -0
  142. package/corpus/core/src/server/agent-chat/process-run-failure.ts +62 -0
  143. package/corpus/core/src/server/agent-chat/prompt-resources.ts +688 -0
  144. package/corpus/core/src/server/agent-chat/recurring-jobs-runtime.ts +80 -0
  145. package/corpus/core/src/server/agent-chat/request-surface.ts +71 -0
  146. package/corpus/core/src/server/agent-chat/run-code-tools.ts +67 -0
  147. package/corpus/core/src/server/agent-chat/script-entries.ts +779 -0
  148. package/corpus/core/src/server/agent-chat/shared-thread.ts +301 -0
  149. package/corpus/core/src/server/agent-chat/skill-frontmatter.ts +41 -0
  150. package/corpus/core/src/server/agent-chat-plugin.ts +364 -4182
  151. package/corpus/core/src/server/agent-teams.ts +26 -3
  152. package/corpus/core/src/server/auth.ts +55 -57
  153. package/corpus/core/src/server/credential-provider.ts +22 -25
  154. package/corpus/core/src/server/edge.ts +1 -0
  155. package/corpus/core/src/server/onboarding-html.ts +1 -16
  156. package/corpus/core/src/server/poll.ts +1 -0
  157. package/corpus/core/src/server/realtime-voice.ts +335 -14
  158. package/corpus/core/src/server/request-origin.ts +6 -2
  159. package/corpus/core/src/server/ssr-handler.ts +55 -2
  160. package/corpus/core/src/sharing/access.ts +155 -11
  161. package/corpus/core/src/sharing/registry.ts +7 -0
  162. package/corpus/core/src/styles/agent-native.css +17 -16
  163. package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +1 -1
  164. package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +2 -2
  165. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +6 -0
  166. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +6 -0
  167. package/corpus/core/src/templates/default/app/i18n/en-US.ts +6 -0
  168. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +6 -0
  169. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +6 -0
  170. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +6 -0
  171. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +6 -0
  172. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +6 -0
  173. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +6 -0
  174. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +6 -0
  175. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +6 -0
  176. package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +27 -29
  177. package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +2 -1
  178. package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +1 -1
  179. package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +32 -0
  180. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +2 -2
  181. package/corpus/core/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +7 -3
  182. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +39 -9
  183. package/corpus/core/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +25 -0
  184. package/corpus/core/src/templates/workspace-core/src/server/index.ts +4 -2
  185. package/corpus/core/src/testing.ts +26 -0
  186. package/corpus/core/src/triggers/dispatcher.ts +23 -2
  187. package/corpus/core/src/vite/client.ts +135 -3
  188. package/corpus/core/tsconfig.cli.json +1 -1
  189. package/corpus/core/tsconfig.json +5 -1
  190. package/corpus/templates/analytics/.agents/skills/bigquery/SKILL.md +2 -2
  191. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +1 -1
  192. package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +2 -2
  193. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +10 -5
  194. package/corpus/templates/analytics/AGENTS.md +15 -6
  195. package/corpus/templates/analytics/actions/install-dashboard-template.ts +79 -43
  196. package/corpus/templates/analytics/actions/list-explorer-dashboards.ts +3 -3
  197. package/corpus/templates/analytics/actions/list-sql-dashboards.ts +8 -3
  198. package/corpus/templates/analytics/actions/navigate.ts +59 -5
  199. package/corpus/templates/analytics/actions/rename-analysis.ts +8 -2
  200. package/corpus/templates/analytics/actions/rename-dashboard.ts +8 -7
  201. package/corpus/templates/analytics/actions/view-screen.ts +7 -29
  202. package/corpus/templates/analytics/app/components/ProviderCorpusJobNotifier.tsx +20 -3
  203. package/corpus/templates/analytics/app/components/ResourceLoadError.tsx +42 -0
  204. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +2 -1
  205. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +85 -70
  206. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -1
  207. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +128 -95
  208. package/corpus/templates/analytics/app/components/layout/SidebarLoadError.tsx +24 -0
  209. package/corpus/templates/analytics/app/global.css +19 -20
  210. package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +15 -5
  211. package/corpus/templates/analytics/app/i18n/zh-TW.ts +4 -0
  212. package/corpus/templates/analytics/app/i18n-data.ts +40 -0
  213. package/corpus/templates/analytics/app/lib/provider-corpus-job-sync.ts +26 -0
  214. package/corpus/templates/analytics/app/pages/Settings.tsx +41 -343
  215. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/SqlPreview.tsx +36 -20
  216. package/corpus/templates/analytics/app/pages/adhoc/explorer/index.tsx +34 -20
  217. package/corpus/templates/analytics/app/pages/adhoc/explorer/use-explorer-config.ts +42 -41
  218. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +43 -36
  219. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +11 -2
  220. package/corpus/templates/analytics/app/pages/monitoring/ErrorsPanel.tsx +38 -7
  221. package/corpus/templates/analytics/app/pages/monitoring/MonitoringPage.tsx +1 -1
  222. package/corpus/templates/analytics/app/pages/monitoring/errors/i18n.ts +3 -0
  223. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +333 -272
  224. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +72 -17
  225. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +297 -108
  226. package/corpus/templates/analytics/app/root.tsx +40 -8
  227. package/corpus/templates/analytics/app/routes/_index.tsx +14 -2
  228. package/corpus/templates/analytics/changelog/2026-06-24-first-party-signup-and-pageview-panels-now-honor-dashboard-filters.md +2 -1
  229. package/corpus/templates/analytics/changelog/2026-06-25-referrer-dashboard-panels-show-external-domains.md +2 -1
  230. package/corpus/templates/analytics/changelog/2026-07-03-agent-llm-observability-dashboard.md +1 -1
  231. package/corpus/templates/analytics/changelog/2026-07-06-mobile-chat-header-is-more-compact-and-the-menu-button-opens-navigation.md +1 -0
  232. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-history-and-chat-context.md +1 -0
  233. package/corpus/templates/analytics/changelog/2026-07-08-settings-are-cleaner-searchable-and-alerts-have-their-own-tab.md +1 -0
  234. package/corpus/templates/analytics/changelog/2026-07-08-sidebar-sections-stay-collapsed-until-opened.md +1 -0
  235. package/corpus/templates/analytics/changelog/2026-07-11-agent-feedback-sentiment-dashboard.md +6 -0
  236. package/corpus/templates/analytics/changelog/2026-07-11-analytics-chats-now-start-faster-by-loading-metric-definitio.md +6 -0
  237. package/corpus/templates/analytics/changelog/2026-07-11-analytics-no-longer-repeatedly-restarts-background-requests-.md +6 -0
  238. package/corpus/templates/analytics/changelog/2026-07-11-analytics-only-asks-for-replay-storage-when-you-enable-sessi.md +6 -0
  239. package/corpus/templates/analytics/changelog/2026-07-11-charts-now-show-their-loading-skeleton-while-refreshing.md +6 -0
  240. package/corpus/templates/analytics/changelog/2026-07-11-command-and-sql-previews-now-respond-without-lag.md +6 -0
  241. package/corpus/templates/analytics/changelog/2026-07-11-command-search-now-reports-loading-failures-and-lets-you-ret.md +6 -0
  242. package/corpus/templates/analytics/changelog/2026-07-11-dashboard-navigation-now-loads-faster-and-reports-request-fa.md +6 -0
  243. package/corpus/templates/analytics/changelog/2026-07-11-inferred-message-sentiment-dashboard.md +6 -0
  244. package/corpus/templates/analytics/changelog/2026-07-11-microphone-settings-from-realtime-voice-mode-now-open-the-vo.md +6 -0
  245. package/corpus/templates/analytics/changelog/2026-07-11-more-dashboard-edit-paths-are-now-safe-against-simultaneous-.md +6 -0
  246. package/corpus/templates/analytics/changelog/2026-07-11-realtime-voice-now-shows-a-clear-connection-indicator-comple.md +6 -0
  247. package/corpus/templates/analytics/changelog/2026-07-11-renaming-a-dashboard-is-now-safe-against-simultaneous-agent-.md +6 -0
  248. package/corpus/templates/analytics/changelog/2026-07-11-renaming-an-analysis-is-now-safe-against-simultaneous-edits.md +6 -0
  249. package/corpus/templates/analytics/changelog/2026-07-11-replay-event-counts-stay-hidden-until-recordings-finish-load.md +6 -0
  250. package/corpus/templates/analytics/changelog/2026-07-11-replay-storage-key-mismatches-show-actionable-setup-guidance.md +6 -0
  251. package/corpus/templates/analytics/changelog/2026-07-11-replay-timelines-group-continuous-scrolling-and-dev-tools-co.md +6 -0
  252. package/corpus/templates/analytics/changelog/2026-07-11-session-filters-now-stay-compact-in-a-settings-menu-at-mediu.md +6 -0
  253. package/corpus/templates/analytics/changelog/2026-07-11-session-replay-console-errors-now-link-to-matching-issues-or.md +6 -0
  254. package/corpus/templates/analytics/changelog/2026-07-11-session-replays-load-large-recordings-faster-and-surface-fai.md +6 -0
  255. package/corpus/templates/analytics/changelog/2026-07-11-session-replays-preserve-recorded-styles-and-viewport-layout.md +6 -0
  256. package/corpus/templates/analytics/changelog/2026-07-11-session-replays-stay-centered-instead-of-clipping-wide-recor.md +6 -0
  257. package/corpus/templates/analytics/changelog/2026-07-11-workspace-mounted-analytics-now-opens-ask-reliably-and-route.md +6 -0
  258. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +37 -3
  259. package/corpus/templates/analytics/package.json +1 -1
  260. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +37 -1
  261. package/corpus/templates/analytics/server/handlers/session-replay.ts +57 -0
  262. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -24
  263. package/corpus/templates/analytics/server/lib/dashboard-seeds.ts +0 -5
  264. package/corpus/templates/analytics/server/lib/dashboards-store.ts +289 -20
  265. package/corpus/templates/analytics/server/lib/data-dictionary-context.ts +106 -34
  266. package/corpus/templates/analytics/server/lib/demo-dashboards.ts +20 -4
  267. package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +12 -0
  268. package/corpus/templates/analytics/server/lib/session-replay.ts +208 -2
  269. package/corpus/templates/analytics/server/plugins/agent-chat.ts +11 -39
  270. package/corpus/templates/analytics/server/plugins/onboarding.ts +7 -79
  271. package/corpus/templates/analytics/server/routes/api/session-replay/recordings/[recordingId]/chunks.get.ts +1 -0
  272. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +1 -1
  273. package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +2 -2
  274. package/corpus/templates/assets/app/components/create/RecentDraftsSection.tsx +30 -4
  275. package/corpus/templates/assets/app/global.css +4 -4
  276. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +0 -1
  277. package/corpus/templates/assets/app/routes/library.tsx +49 -6
  278. package/corpus/templates/assets/changelog/2026-07-11-library-load-failures-now-show-a-retry-action.md +6 -0
  279. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +1 -1
  280. package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +2 -2
  281. package/corpus/templates/brain/app/global.css +5 -5
  282. package/corpus/templates/brain/app/root.tsx +0 -3
  283. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +1 -1
  284. package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +2 -2
  285. package/corpus/templates/calendar/.env.example +5 -0
  286. package/corpus/templates/calendar/app/components/calendar/EventCard.tsx +2 -2
  287. package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
  288. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  289. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +37 -1
  290. package/corpus/templates/calendar/app/pages/BookingsList.tsx +20 -3
  291. package/corpus/templates/calendar/app/root.tsx +1 -0
  292. package/corpus/templates/calendar/changelog/2026-07-11-booking-load-failures-now-show-a-retry-action.md +6 -0
  293. package/corpus/templates/calendar/changelog/2026-07-11-event-cards-give-subtle-press-feedback-and-smoother-hover.md +6 -0
  294. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +1 -1
  295. package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +2 -2
  296. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +1 -1
  297. package/corpus/templates/clips/actions/decline-invite.ts +8 -0
  298. package/corpus/templates/clips/app/components/library/folder-tree.tsx +209 -187
  299. package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +2 -2
  300. package/corpus/templates/clips/app/components/player/reactions-tray.tsx +17 -5
  301. package/corpus/templates/clips/app/components/player/scrubber.tsx +5 -3
  302. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +2 -2
  303. package/corpus/templates/clips/app/components/workspace/insights-hub.tsx +119 -95
  304. package/corpus/templates/clips/app/global.css +45 -0
  305. package/corpus/templates/clips/app/hooks/use-auto-title.ts +74 -8
  306. package/corpus/templates/clips/app/hooks/use-library.ts +12 -25
  307. package/corpus/templates/clips/app/root.tsx +4 -0
  308. package/corpus/templates/clips/app/routes/_app.notifications.tsx +23 -2
  309. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +20 -22
  310. package/corpus/templates/clips/app/routes/_app.trash.tsx +24 -2
  311. package/corpus/templates/clips/changelog/2026-07-11-controls-and-folders-now-move-more-smoothly.md +6 -0
  312. package/corpus/templates/clips/changelog/2026-07-11-declining-an-invitation-now-requires-being-its-recipient.md +6 -0
  313. package/corpus/templates/clips/changelog/2026-07-11-generated-titles-no-longer-cause-continuous-background-refreshes.md +6 -0
  314. package/corpus/templates/clips/changelog/2026-07-11-recording-overlays-are-lighter-weight-and-no-longer-cause-pa.md +6 -0
  315. package/corpus/templates/clips/changelog/2026-07-11-s3-storage-setup-stays-collapsed-until-you-choose-it-as-the-.md +6 -0
  316. package/corpus/templates/clips/changelog/2026-07-11-workspace-load-failures-now-show-a-retry-action.md +6 -0
  317. package/corpus/templates/clips/chrome-extension/src/overlay.css +34 -5
  318. package/corpus/templates/clips/chrome-extension/src/styles.css +2 -2
  319. package/corpus/templates/clips/desktop/src/styles.css +71 -26
  320. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +1 -1
  321. package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +2 -2
  322. package/corpus/templates/content/actions/move-document.ts +34 -18
  323. package/corpus/templates/content/app/components/QueryErrorState.tsx +39 -0
  324. package/corpus/templates/content/app/components/editor/LinkHoverPreview.tsx +1 -1
  325. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +225 -1435
  326. package/corpus/templates/content/app/components/editor/database/GalleryView.tsx +368 -0
  327. package/corpus/templates/content/app/components/editor/database/ListView.tsx +353 -0
  328. package/corpus/templates/content/app/components/editor/database/TimelineView.tsx +580 -0
  329. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +11 -2
  330. package/corpus/templates/content/app/global.css +19 -19
  331. package/corpus/templates/content/app/hooks/use-comments.ts +0 -1
  332. package/corpus/templates/content/app/root.tsx +2 -2
  333. package/corpus/templates/content/app/routes/_app._index.tsx +11 -1
  334. package/corpus/templates/content/changelog/2026-07-11-comments-now-update-from-live-collaboration-events-without-c.md +6 -0
  335. package/corpus/templates/content/changelog/2026-07-11-document-load-failures-now-show-a-retry-action.md +6 -0
  336. package/corpus/templates/content/changelog/2026-07-11-editor-toggle-feedback-now-feels-more-responsive.md +6 -0
  337. package/corpus/templates/content/changelog/2026-07-11-moving-documents-at-the-same-time-no-longer-scrambles-their-.md +6 -0
  338. package/corpus/templates/content/changelog/2026-07-11-public-document-chats-now-start-faster-while-keeping-full-do.md +6 -0
  339. package/corpus/templates/content/changelog/2026-07-11-reopening-a-comment-now-uses-consistent-permissions-everywhe.md +6 -0
  340. package/corpus/templates/content/changelog/2026-07-11-sidebar-resizing-now-tracks-your-cursor-instantly-instead-of.md +6 -0
  341. package/corpus/templates/content/server/lib/public-documents.ts +47 -10
  342. package/corpus/templates/content/server/routes/api/comments/[id].patch.ts +24 -24
  343. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +1 -1
  344. package/corpus/templates/design/app/components/QueryErrorState.tsx +24 -0
  345. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +1 -1
  346. package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +5 -2
  347. package/corpus/templates/design/app/components/design/EditPanel.tsx +326 -319
  348. package/corpus/templates/design/app/components/design/LayersPanel.tsx +198 -193
  349. package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +11 -4
  350. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +1 -1
  351. package/corpus/templates/design/app/components/layout/Header.tsx +1 -1
  352. package/corpus/templates/design/app/components/layout/Layout.tsx +1 -1
  353. package/corpus/templates/design/app/pages/DesignSystems.tsx +7 -1
  354. package/corpus/templates/design/app/pages/Index.tsx +14 -2
  355. package/corpus/templates/design/app/pages/Present.tsx +16 -3
  356. package/corpus/templates/design/app/pages/Templates.tsx +10 -4
  357. package/corpus/templates/design/app/pages/design-editor/canvas-primitive-insert.ts +484 -0
  358. package/corpus/templates/design/app/pages/design-editor/clone-and-pen-edit.ts +378 -0
  359. package/corpus/templates/design/app/pages/design-editor/design-data-geometry-utils.ts +138 -0
  360. package/corpus/templates/design/app/pages/design-editor/dom-utils.ts +15 -0
  361. package/corpus/templates/design/app/pages/design-editor/generation-prompt-directives.ts +180 -0
  362. package/corpus/templates/design/app/pages/design-editor/html-layer-positioning.ts +226 -0
  363. package/corpus/templates/design/app/pages/design-editor/png-export-render.ts +348 -0
  364. package/corpus/templates/design/app/pages/design-editor/screen-command-utils.ts +160 -0
  365. package/corpus/templates/design/app/pages/design-editor/text-edit-utils.ts +238 -0
  366. package/corpus/templates/design/app/pages/design-editor/tool-state.ts +23 -1
  367. package/corpus/templates/design/app/pages/design-editor/types.ts +25 -0
  368. package/corpus/templates/design/app/root.tsx +10 -1
  369. package/corpus/templates/design/changelog/2026-07-11-canvas-context-menus-now-open-without-motion-jitter.md +6 -0
  370. package/corpus/templates/design/changelog/2026-07-11-design-load-failures-now-show-a-retry-action.md +6 -0
  371. package/corpus/templates/design/changelog/2026-07-11-inspector-tooltips-appear-instantly-as-you-sweep-across-icon.md +6 -0
  372. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +1 -1
  373. package/corpus/templates/dispatch/app/i18n/zh-TW.ts +10 -0
  374. package/corpus/templates/dispatch/app/i18n-data.ts +123 -0
  375. package/corpus/templates/dispatch/app/routes/integrations.tsx +163 -144
  376. package/corpus/templates/dispatch/changelog/2026-07-11-dispatch-mcp-connections-now-start-with-safer-app-access-and.md +6 -0
  377. package/corpus/templates/dispatch/changelog/2026-07-11-overview-and-chat-now-share-a-cleaner-more-stable-flow.md +6 -0
  378. package/corpus/templates/dispatch/changelog/2026-07-11-query-errors-now-show-a-retry-option.md +6 -0
  379. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +1 -1
  380. package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +2 -2
  381. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +3 -3
  382. package/corpus/templates/forms/app/root.tsx +34 -8
  383. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +1 -1
  384. package/corpus/templates/macros/app/components/DailyProgress.tsx +25 -5
  385. package/corpus/templates/macros/app/components/QueryErrorState.tsx +31 -0
  386. package/corpus/templates/macros/app/components/WeightTracker.tsx +5 -1
  387. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +1 -2
  388. package/corpus/templates/macros/app/components/ui/button.tsx +1 -1
  389. package/corpus/templates/macros/app/components/ui/progress.tsx +1 -1
  390. package/corpus/templates/macros/app/components/ui/tabs.tsx +1 -1
  391. package/corpus/templates/macros/app/i18n/ar-SA.ts +2 -0
  392. package/corpus/templates/macros/app/i18n/de-DE.ts +2 -0
  393. package/corpus/templates/macros/app/i18n/en-US.ts +2 -0
  394. package/corpus/templates/macros/app/i18n/es-ES.ts +2 -0
  395. package/corpus/templates/macros/app/i18n/fr-FR.ts +2 -0
  396. package/corpus/templates/macros/app/i18n/hi-IN.ts +2 -0
  397. package/corpus/templates/macros/app/i18n/ja-JP.ts +2 -0
  398. package/corpus/templates/macros/app/i18n/ko-KR.ts +2 -0
  399. package/corpus/templates/macros/app/i18n/pt-BR.ts +2 -0
  400. package/corpus/templates/macros/app/i18n/zh-CN.ts +2 -0
  401. package/corpus/templates/macros/app/i18n/zh-TW.ts +2 -0
  402. package/corpus/templates/macros/app/root.tsx +0 -3
  403. package/corpus/templates/macros/app/routes/_index.tsx +22 -12
  404. package/corpus/templates/macros/app/routes/analytics.tsx +31 -10
  405. package/corpus/templates/macros/changelog/2026-07-11-daily-tracking-now-loads-and-updates-more-quickly.md +6 -0
  406. package/corpus/templates/macros/changelog/2026-07-11-data-load-failures-now-show-a-clear-error-with-a-retry-actio.md +6 -0
  407. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +1 -1
  408. package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +2 -2
  409. package/corpus/templates/mail/.env.example +16 -11
  410. package/corpus/templates/mail/actions/list-emails.ts +39 -35
  411. package/corpus/templates/mail/app/components/email/ComposeModal.tsx +58 -6
  412. package/corpus/templates/mail/app/components/email/EmailListItem.tsx +35 -2
  413. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +113 -104
  414. package/corpus/templates/mail/app/hooks/use-compose-state.ts +1 -0
  415. package/corpus/templates/mail/app/root.tsx +9 -22
  416. package/corpus/templates/mail/changelog/2026-07-11-compose-and-navigation-motion-now-feel-faster-and-smoother.md +6 -0
  417. package/corpus/templates/mail/changelog/2026-07-11-swipe-to-archive-or-snooze-now-responds-to-quick-flicks-not-.md +6 -0
  418. package/corpus/templates/mail/changelog/2026-07-11-the-assistant-now-sees-the-same-inbox-you-do-snoozed-mail-st.md +6 -0
  419. package/corpus/templates/mail/server/handlers/emails.ts +25 -69
  420. package/corpus/templates/mail/server/lib/list-inbox-emails.ts +169 -0
  421. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +1 -1
  422. package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +2 -2
  423. package/corpus/templates/plan/.env.example +4 -0
  424. package/corpus/templates/plan/actions/create-plan-design.ts +89 -81
  425. package/corpus/templates/plan/actions/create-prototype-plan.ts +72 -59
  426. package/corpus/templates/plan/actions/create-ui-plan.ts +70 -55
  427. package/corpus/templates/plan/actions/create-visual-plan.ts +65 -51
  428. package/corpus/templates/plan/actions/update-local-plan-folder.ts +43 -30
  429. package/corpus/templates/plan/actions/update-visual-plan.ts +81 -64
  430. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +17 -0
  431. package/corpus/templates/plan/app/components/ui/tabs.tsx +1 -1
  432. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +5 -2
  433. package/corpus/templates/plan/app/hooks/use-plans.ts +6 -13
  434. package/corpus/templates/plan/app/i18n/ar-SA.ts +10 -0
  435. package/corpus/templates/plan/app/i18n/de-DE.ts +10 -0
  436. package/corpus/templates/plan/app/i18n/en-US.ts +10 -0
  437. package/corpus/templates/plan/app/i18n/es-ES.ts +10 -0
  438. package/corpus/templates/plan/app/i18n/fr-FR.ts +10 -0
  439. package/corpus/templates/plan/app/i18n/hi-IN.ts +10 -0
  440. package/corpus/templates/plan/app/i18n/ja-JP.ts +10 -0
  441. package/corpus/templates/plan/app/i18n/ko-KR.ts +10 -0
  442. package/corpus/templates/plan/app/i18n/pt-BR.ts +10 -0
  443. package/corpus/templates/plan/app/i18n/zh-CN.ts +10 -0
  444. package/corpus/templates/plan/app/i18n/zh-TW.ts +10 -0
  445. package/corpus/templates/plan/app/lib/plan-local-bridge.ts +80 -1
  446. package/corpus/templates/plan/app/pages/PlansPage.tsx +157 -31
  447. package/corpus/templates/plan/app/root.tsx +11 -0
  448. package/corpus/templates/plan/changelog/2026-07-11-local-plans-now-explain-and-recover-from-browser-permission-.md +6 -0
  449. package/corpus/templates/plan/changelog/2026-07-11-plan-edits-now-save-atomically-and-can-no-longer-partially-a.md +6 -0
  450. package/corpus/templates/plan/changelog/2026-07-11-plan-lists-now-show-a-clear-error-with-a-retry-action-when-t.md +6 -0
  451. package/corpus/templates/plan/changelog/2026-07-11-plan-refreshes-only-when-content-changes.md +6 -0
  452. package/corpus/templates/plan/shared/plan-content.ts +546 -260
  453. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +1 -1
  454. package/corpus/templates/slides/actions/delete-slide-comment.ts +49 -0
  455. package/corpus/templates/slides/actions/update-slide-comment.ts +93 -0
  456. package/corpus/templates/slides/actions/view-screen.ts +14 -6
  457. package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +37 -11
  458. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +1 -1
  459. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +2 -2
  460. package/corpus/templates/slides/app/components/editor/GenerateSlidesDialog.tsx +2 -2
  461. package/corpus/templates/slides/app/components/layout/Header.tsx +1 -1
  462. package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +4 -2
  463. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +4 -3
  464. package/corpus/templates/slides/app/context/DeckContext.tsx +10 -0
  465. package/corpus/templates/slides/app/hooks/use-slide-comments.ts +7 -31
  466. package/corpus/templates/slides/app/i18n/ar-SA.ts +6 -0
  467. package/corpus/templates/slides/app/i18n/de-DE.ts +6 -0
  468. package/corpus/templates/slides/app/i18n/en-US.ts +6 -0
  469. package/corpus/templates/slides/app/i18n/es-ES.ts +6 -0
  470. package/corpus/templates/slides/app/i18n/fr-FR.ts +6 -0
  471. package/corpus/templates/slides/app/i18n/hi-IN.ts +6 -0
  472. package/corpus/templates/slides/app/i18n/ja-JP.ts +6 -0
  473. package/corpus/templates/slides/app/i18n/ko-KR.ts +6 -0
  474. package/corpus/templates/slides/app/i18n/pt-BR.ts +6 -0
  475. package/corpus/templates/slides/app/i18n/zh-CN.ts +5 -0
  476. package/corpus/templates/slides/app/i18n/zh-TW.ts +5 -0
  477. package/corpus/templates/slides/app/pages/DesignSystems.tsx +23 -2
  478. package/corpus/templates/slides/app/pages/Index.tsx +29 -1
  479. package/corpus/templates/slides/changelog/2026-07-11-comment-load-failures-now-show-a-retry-action-instead-of-say.md +6 -0
  480. package/corpus/templates/slides/changelog/2026-07-11-comment-pins-now-clear-with-a-faster-smoother-confirmation.md +6 -0
  481. package/corpus/templates/slides/changelog/2026-07-11-comments-now-update-from-live-collaboration-events-without-c.md +6 -0
  482. package/corpus/templates/slides/changelog/2026-07-11-deck-and-design-system-load-failures-now-show-a-retry-action.md +6 -0
  483. package/corpus/templates/slides/changelog/2026-07-11-editor-toggles-and-toolbar-menus-now-animate-smoothly.md +6 -0
  484. package/corpus/templates/slides/changelog/2026-07-11-the-assistant-can-now-resolve-reopen-and-delete-slide-commen.md +6 -0
  485. package/corpus/templates/slides/changelog/2026-07-11-viewing-slides-no-longer-loads-every-deck-s-full-contents-in.md +6 -0
  486. package/corpus/templates/slides/server/routes/api/comments/[id].delete.ts +29 -48
  487. package/corpus/templates/slides/server/routes/api/comments/[id].patch.ts +29 -65
  488. package/dist/action-change-marker.d.ts +1 -0
  489. package/dist/action-change-marker.d.ts.map +1 -1
  490. package/dist/action-change-marker.js +7 -1
  491. package/dist/action-change-marker.js.map +1 -1
  492. package/dist/action.d.ts +23 -0
  493. package/dist/action.d.ts.map +1 -1
  494. package/dist/action.js +13 -0
  495. package/dist/action.js.map +1 -1
  496. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  497. package/dist/agent/engine/builder-engine.js +3 -0
  498. package/dist/agent/engine/builder-engine.js.map +1 -1
  499. package/dist/agent/engine/context-directives-transform.d.ts +25 -0
  500. package/dist/agent/engine/context-directives-transform.d.ts.map +1 -0
  501. package/dist/agent/engine/context-directives-transform.js +53 -0
  502. package/dist/agent/engine/context-directives-transform.js.map +1 -0
  503. package/dist/agent/engine/continuation-dispatch-retry.d.ts +40 -0
  504. package/dist/agent/engine/continuation-dispatch-retry.d.ts.map +1 -0
  505. package/dist/agent/engine/continuation-dispatch-retry.js +109 -0
  506. package/dist/agent/engine/continuation-dispatch-retry.js.map +1 -0
  507. package/dist/agent/engine/tool-call-journal-seed.d.ts +46 -0
  508. package/dist/agent/engine/tool-call-journal-seed.d.ts.map +1 -0
  509. package/dist/agent/engine/tool-call-journal-seed.js +60 -0
  510. package/dist/agent/engine/tool-call-journal-seed.js.map +1 -0
  511. package/dist/agent/production-agent.d.ts +7 -0
  512. package/dist/agent/production-agent.d.ts.map +1 -1
  513. package/dist/agent/production-agent.js +102 -222
  514. package/dist/agent/production-agent.js.map +1 -1
  515. package/dist/changelog/parse.d.ts +4 -2
  516. package/dist/changelog/parse.d.ts.map +1 -1
  517. package/dist/changelog/parse.js +5 -3
  518. package/dist/changelog/parse.js.map +1 -1
  519. package/dist/cli/doctor.d.ts.map +1 -1
  520. package/dist/cli/doctor.js +7 -3
  521. package/dist/cli/doctor.js.map +1 -1
  522. package/dist/cli/plan-local.d.ts.map +1 -1
  523. package/dist/cli/plan-local.js +8 -2
  524. package/dist/cli/plan-local.js.map +1 -1
  525. package/dist/cli/skills-content/assets-skill.d.ts +2 -0
  526. package/dist/cli/skills-content/assets-skill.d.ts.map +1 -0
  527. package/dist/cli/skills-content/assets-skill.js +84 -0
  528. package/dist/cli/skills-content/assets-skill.js.map +1 -0
  529. package/dist/cli/skills-content/canvas.d.ts +4 -0
  530. package/dist/cli/skills-content/canvas.d.ts.map +1 -0
  531. package/dist/cli/skills-content/canvas.js +152 -0
  532. package/dist/cli/skills-content/canvas.js.map +1 -0
  533. package/dist/cli/skills-content/connection.d.ts +2 -0
  534. package/dist/cli/skills-content/connection.d.ts.map +1 -0
  535. package/dist/cli/skills-content/connection.js +53 -0
  536. package/dist/cli/skills-content/connection.js.map +1 -0
  537. package/dist/cli/skills-content/content-skill.d.ts +2 -0
  538. package/dist/cli/skills-content/content-skill.d.ts.map +1 -0
  539. package/dist/cli/skills-content/content-skill.js +110 -0
  540. package/dist/cli/skills-content/content-skill.js.map +1 -0
  541. package/dist/cli/skills-content/design-exploration-skill.d.ts +2 -0
  542. package/dist/cli/skills-content/design-exploration-skill.d.ts.map +1 -0
  543. package/dist/cli/skills-content/design-exploration-skill.js +119 -0
  544. package/dist/cli/skills-content/design-exploration-skill.js.map +1 -0
  545. package/dist/cli/skills-content/design-visual-edit-skill.d.ts +2 -0
  546. package/dist/cli/skills-content/design-visual-edit-skill.d.ts.map +1 -0
  547. package/dist/cli/skills-content/design-visual-edit-skill.js +229 -0
  548. package/dist/cli/skills-content/design-visual-edit-skill.js.map +1 -0
  549. package/dist/cli/skills-content/document-quality.d.ts +4 -0
  550. package/dist/cli/skills-content/document-quality.d.ts.map +1 -0
  551. package/dist/cli/skills-content/document-quality.js +195 -0
  552. package/dist/cli/skills-content/document-quality.js.map +1 -0
  553. package/dist/cli/skills-content/exemplar.d.ts +4 -0
  554. package/dist/cli/skills-content/exemplar.d.ts.map +1 -0
  555. package/dist/cli/skills-content/exemplar.js +68 -0
  556. package/dist/cli/skills-content/exemplar.js.map +1 -0
  557. package/dist/cli/skills-content/help.d.ts +2 -0
  558. package/dist/cli/skills-content/help.d.ts.map +1 -0
  559. package/dist/cli/skills-content/help.js +78 -0
  560. package/dist/cli/skills-content/help.js.map +1 -0
  561. package/dist/cli/skills-content/index.d.ts +23 -0
  562. package/dist/cli/skills-content/index.d.ts.map +1 -0
  563. package/dist/cli/skills-content/index.js +23 -0
  564. package/dist/cli/skills-content/index.js.map +1 -0
  565. package/dist/cli/skills-content/local-files.d.ts +2 -0
  566. package/dist/cli/skills-content/local-files.d.ts.map +1 -0
  567. package/dist/cli/skills-content/local-files.js +96 -0
  568. package/dist/cli/skills-content/local-files.js.map +1 -0
  569. package/dist/cli/skills-content/plan-setup-auth.d.ts +9 -0
  570. package/dist/cli/skills-content/plan-setup-auth.d.ts.map +1 -0
  571. package/dist/cli/skills-content/plan-setup-auth.js +81 -0
  572. package/dist/cli/skills-content/plan-setup-auth.js.map +1 -0
  573. package/dist/cli/skills-content/visual-plan-skill.d.ts +2 -0
  574. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -0
  575. package/dist/cli/skills-content/visual-plan-skill.js +471 -0
  576. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -0
  577. package/dist/cli/skills-content/visual-recap-skill.d.ts +2 -0
  578. package/dist/cli/skills-content/visual-recap-skill.d.ts.map +1 -0
  579. package/dist/cli/skills-content/visual-recap-skill.js +548 -0
  580. package/dist/cli/skills-content/visual-recap-skill.js.map +1 -0
  581. package/dist/cli/skills-content/visualize-repo-skill.d.ts +2 -0
  582. package/dist/cli/skills-content/visualize-repo-skill.d.ts.map +1 -0
  583. package/dist/cli/skills-content/visualize-repo-skill.js +94 -0
  584. package/dist/cli/skills-content/visualize-repo-skill.js.map +1 -0
  585. package/dist/cli/skills-content/wireframe.d.ts +4 -0
  586. package/dist/cli/skills-content/wireframe.d.ts.map +1 -0
  587. package/dist/cli/skills-content/wireframe.js +347 -0
  588. package/dist/cli/skills-content/wireframe.js.map +1 -0
  589. package/dist/cli/skills.d.ts +2 -10
  590. package/dist/cli/skills.d.ts.map +1 -1
  591. package/dist/cli/skills.js +2 -2710
  592. package/dist/cli/skills.js.map +1 -1
  593. package/dist/client/AgentPanel.d.ts.map +1 -1
  594. package/dist/client/AgentPanel.js +6 -5
  595. package/dist/client/AgentPanel.js.map +1 -1
  596. package/dist/client/AssistantChat.d.ts +7 -0
  597. package/dist/client/AssistantChat.d.ts.map +1 -1
  598. package/dist/client/AssistantChat.js +62 -40
  599. package/dist/client/AssistantChat.js.map +1 -1
  600. package/dist/client/CommandMenu.d.ts.map +1 -1
  601. package/dist/client/CommandMenu.js +15 -3
  602. package/dist/client/CommandMenu.js.map +1 -1
  603. package/dist/client/FeedbackButton.js +2 -2
  604. package/dist/client/FeedbackButton.js.map +1 -1
  605. package/dist/client/analytics.d.ts.map +1 -1
  606. package/dist/client/analytics.js +26 -0
  607. package/dist/client/analytics.js.map +1 -1
  608. package/dist/client/app-providers.d.ts +13 -5
  609. package/dist/client/app-providers.d.ts.map +1 -1
  610. package/dist/client/app-providers.js +9 -6
  611. package/dist/client/app-providers.js.map +1 -1
  612. package/dist/client/blocks/library/wireframe-kit.d.ts +2 -0
  613. package/dist/client/blocks/library/wireframe-kit.d.ts.map +1 -1
  614. package/dist/client/blocks/library/wireframe-kit.js +9 -2
  615. package/dist/client/blocks/library/wireframe-kit.js.map +1 -1
  616. package/dist/client/chat/tool-call-display.d.ts +4 -0
  617. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  618. package/dist/client/chat/tool-call-display.js +3 -3
  619. package/dist/client/chat/tool-call-display.js.map +1 -1
  620. package/dist/client/chat-model-groups.d.ts.map +1 -1
  621. package/dist/client/chat-model-groups.js +24 -0
  622. package/dist/client/chat-model-groups.js.map +1 -1
  623. package/dist/client/composer/PastedTextChip.js +1 -1
  624. package/dist/client/composer/PastedTextChip.js.map +1 -1
  625. package/dist/client/composer/RealtimeVoiceMode.d.ts +40 -2
  626. package/dist/client/composer/RealtimeVoiceMode.d.ts.map +1 -1
  627. package/dist/client/composer/RealtimeVoiceMode.js +186 -35
  628. package/dist/client/composer/RealtimeVoiceMode.js.map +1 -1
  629. package/dist/client/composer/TiptapComposer.d.ts +4 -0
  630. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  631. package/dist/client/composer/TiptapComposer.js +48 -30
  632. package/dist/client/composer/TiptapComposer.js.map +1 -1
  633. package/dist/client/composer/VoiceButton.d.ts +2 -0
  634. package/dist/client/composer/VoiceButton.d.ts.map +1 -1
  635. package/dist/client/composer/VoiceButton.js +9 -3
  636. package/dist/client/composer/VoiceButton.js.map +1 -1
  637. package/dist/client/composer/index.d.ts +2 -2
  638. package/dist/client/composer/index.d.ts.map +1 -1
  639. package/dist/client/composer/index.js +1 -1
  640. package/dist/client/composer/index.js.map +1 -1
  641. package/dist/client/composer/useRealtimeVoiceMode.d.ts +104 -2
  642. package/dist/client/composer/useRealtimeVoiceMode.d.ts.map +1 -1
  643. package/dist/client/composer/useRealtimeVoiceMode.js +1015 -35
  644. package/dist/client/composer/useRealtimeVoiceMode.js.map +1 -1
  645. package/dist/client/context-xray/ContextXRayPanel.d.ts.map +1 -1
  646. package/dist/client/context-xray/ContextXRayPanel.js +4 -1
  647. package/dist/client/context-xray/ContextXRayPanel.js.map +1 -1
  648. package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -1
  649. package/dist/client/extensions/ExtensionEditor.js +15 -5
  650. package/dist/client/extensions/ExtensionEditor.js.map +1 -1
  651. package/dist/client/extensions/ExtensionQueryErrorState.d.ts +8 -0
  652. package/dist/client/extensions/ExtensionQueryErrorState.d.ts.map +1 -0
  653. package/dist/client/extensions/ExtensionQueryErrorState.js +11 -0
  654. package/dist/client/extensions/ExtensionQueryErrorState.js.map +1 -0
  655. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  656. package/dist/client/extensions/ExtensionSlot.js +17 -7
  657. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  658. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  659. package/dist/client/extensions/ExtensionViewer.js +17 -7
  660. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  661. package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
  662. package/dist/client/extensions/ExtensionsListPage.js +5 -3
  663. package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
  664. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  665. package/dist/client/extensions/ExtensionsSidebarSection.js +21 -8
  666. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  667. package/dist/client/index.d.ts +1 -3
  668. package/dist/client/index.d.ts.map +1 -1
  669. package/dist/client/index.js +1 -6
  670. package/dist/client/index.js.map +1 -1
  671. package/dist/client/progress/RunsTray.d.ts.map +1 -1
  672. package/dist/client/progress/RunsTray.js +17 -4
  673. package/dist/client/progress/RunsTray.js.map +1 -1
  674. package/dist/client/settings/SecretsSection.d.ts +2 -3
  675. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  676. package/dist/client/settings/SecretsSection.js +46 -22
  677. package/dist/client/settings/SecretsSection.js.map +1 -1
  678. package/dist/client/settings/SettingsPanel.d.ts +9 -0
  679. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  680. package/dist/client/settings/SettingsPanel.js +46 -12
  681. package/dist/client/settings/SettingsPanel.js.map +1 -1
  682. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  683. package/dist/client/settings/SettingsTabsPage.js +4 -0
  684. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  685. package/dist/client/settings/useBuilderStatus.d.ts +2 -0
  686. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  687. package/dist/client/settings/useBuilderStatus.js +4 -0
  688. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  689. package/dist/client/tool-cells/EditCell.d.ts.map +1 -1
  690. package/dist/client/tool-cells/EditCell.js +2 -1
  691. package/dist/client/tool-cells/EditCell.js.map +1 -1
  692. package/dist/client/tool-cells/FilesChangedSummary.d.ts.map +1 -1
  693. package/dist/client/tool-cells/FilesChangedSummary.js +2 -1
  694. package/dist/client/tool-cells/FilesChangedSummary.js.map +1 -1
  695. package/dist/client/tool-cells/WriteCell.d.ts.map +1 -1
  696. package/dist/client/tool-cells/WriteCell.js +2 -1
  697. package/dist/client/tool-cells/WriteCell.js.map +1 -1
  698. package/dist/client/use-action.d.ts +2 -0
  699. package/dist/client/use-action.d.ts.map +1 -1
  700. package/dist/client/use-action.js +10 -0
  701. package/dist/client/use-action.js.map +1 -1
  702. package/dist/client/use-agent-chat-home-handoff.d.ts +2 -0
  703. package/dist/client/use-agent-chat-home-handoff.d.ts.map +1 -1
  704. package/dist/client/use-agent-chat-home-handoff.js +7 -1
  705. package/dist/client/use-agent-chat-home-handoff.js.map +1 -1
  706. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  707. package/dist/client/use-agent-engine-configured.js +17 -3
  708. package/dist/client/use-agent-engine-configured.js.map +1 -1
  709. package/dist/client/use-db-sync.d.ts +8 -2
  710. package/dist/client/use-db-sync.d.ts.map +1 -1
  711. package/dist/client/use-db-sync.js +57 -32
  712. package/dist/client/use-db-sync.js.map +1 -1
  713. package/dist/client/use-pausing-interval.d.ts.map +1 -1
  714. package/dist/client/use-pausing-interval.js +16 -4
  715. package/dist/client/use-pausing-interval.js.map +1 -1
  716. package/dist/client/visual-style-controls.js +1 -1
  717. package/dist/client/visual-style-controls.js.map +1 -1
  718. package/dist/collab/routes.d.ts +1 -1
  719. package/dist/deploy/build.d.ts.map +1 -1
  720. package/dist/deploy/build.js +36 -14
  721. package/dist/deploy/build.js.map +1 -1
  722. package/dist/integrations/google-docs-poller.d.ts +7 -0
  723. package/dist/integrations/google-docs-poller.d.ts.map +1 -1
  724. package/dist/integrations/google-docs-poller.js +13 -3
  725. package/dist/integrations/google-docs-poller.js.map +1 -1
  726. package/dist/integrations/plugin.d.ts.map +1 -1
  727. package/dist/integrations/plugin.js +10 -0
  728. package/dist/integrations/plugin.js.map +1 -1
  729. package/dist/integrations/scope-store.js +1 -1
  730. package/dist/integrations/scope-store.js.map +1 -1
  731. package/dist/integrations/usage-budget-store.js +1 -1
  732. package/dist/integrations/usage-budget-store.js.map +1 -1
  733. package/dist/integrations/webhook-handler.d.ts +11 -0
  734. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  735. package/dist/integrations/webhook-handler.js +16 -4
  736. package/dist/integrations/webhook-handler.js.map +1 -1
  737. package/dist/jobs/scheduler.d.ts +12 -0
  738. package/dist/jobs/scheduler.d.ts.map +1 -1
  739. package/dist/jobs/scheduler.js +13 -3
  740. package/dist/jobs/scheduler.js.map +1 -1
  741. package/dist/localization/default-messages.d.ts +47 -0
  742. package/dist/localization/default-messages.d.ts.map +1 -1
  743. package/dist/localization/default-messages.js +48 -1
  744. package/dist/localization/default-messages.js.map +1 -1
  745. package/dist/mcp/oauth-token.d.ts +1 -1
  746. package/dist/mcp/oauth-token.d.ts.map +1 -1
  747. package/dist/mcp/oauth-token.js +6 -1
  748. package/dist/mcp/oauth-token.js.map +1 -1
  749. package/dist/mcp-client/workspace-servers.js +4 -4
  750. package/dist/mcp-client/workspace-servers.js.map +1 -1
  751. package/dist/notifications/routes.d.ts +2 -2
  752. package/dist/observability/routes.d.ts +5 -5
  753. package/dist/observability/routes.d.ts.map +1 -1
  754. package/dist/observability/routes.js +32 -0
  755. package/dist/observability/routes.js.map +1 -1
  756. package/dist/observability/sentiment.d.ts +42 -0
  757. package/dist/observability/sentiment.d.ts.map +1 -0
  758. package/dist/observability/sentiment.js +196 -0
  759. package/dist/observability/sentiment.js.map +1 -0
  760. package/dist/observability/store.d.ts +5 -0
  761. package/dist/observability/store.d.ts.map +1 -1
  762. package/dist/observability/store.js +17 -0
  763. package/dist/observability/store.js.map +1 -1
  764. package/dist/observability/traces.d.ts +2 -0
  765. package/dist/observability/traces.d.ts.map +1 -1
  766. package/dist/observability/traces.js +42 -57
  767. package/dist/observability/traces.js.map +1 -1
  768. package/dist/observability/tracking-identity.d.ts +3 -0
  769. package/dist/observability/tracking-identity.d.ts.map +1 -0
  770. package/dist/observability/tracking-identity.js +51 -0
  771. package/dist/observability/tracking-identity.js.map +1 -0
  772. package/dist/observability/types.d.ts +10 -0
  773. package/dist/observability/types.d.ts.map +1 -1
  774. package/dist/observability/types.js +3 -0
  775. package/dist/observability/types.js.map +1 -1
  776. package/dist/progress/routes.d.ts +1 -1
  777. package/dist/resources/handlers.d.ts +1 -1
  778. package/dist/secrets/crypto.d.ts +7 -6
  779. package/dist/secrets/crypto.d.ts.map +1 -1
  780. package/dist/secrets/crypto.js +30 -11
  781. package/dist/secrets/crypto.js.map +1 -1
  782. package/dist/secrets/routes.d.ts +9 -9
  783. package/dist/secrets/storage.d.ts +6 -0
  784. package/dist/secrets/storage.d.ts.map +1 -1
  785. package/dist/secrets/storage.js +61 -3
  786. package/dist/secrets/storage.js.map +1 -1
  787. package/dist/server/action-change.d.ts +1 -0
  788. package/dist/server/action-change.d.ts.map +1 -1
  789. package/dist/server/action-change.js +4 -1
  790. package/dist/server/action-change.js.map +1 -1
  791. package/dist/server/action-routes.d.ts.map +1 -1
  792. package/dist/server/action-routes.js +5 -0
  793. package/dist/server/action-routes.js.map +1 -1
  794. package/dist/server/agent-chat/action-filters-a2a.d.ts +50 -0
  795. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -0
  796. package/dist/server/agent-chat/action-filters-a2a.js +127 -0
  797. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -0
  798. package/dist/server/agent-chat/browser-team-tools.d.ts +21 -0
  799. package/dist/server/agent-chat/browser-team-tools.d.ts.map +1 -0
  800. package/dist/server/agent-chat/browser-team-tools.js +417 -0
  801. package/dist/server/agent-chat/browser-team-tools.js.map +1 -0
  802. package/dist/server/agent-chat/context-tools.d.ts +33 -0
  803. package/dist/server/agent-chat/context-tools.d.ts.map +1 -0
  804. package/dist/server/agent-chat/context-tools.js +520 -0
  805. package/dist/server/agent-chat/context-tools.js.map +1 -0
  806. package/dist/server/agent-chat/framework-prompts.d.ts +65 -0
  807. package/dist/server/agent-chat/framework-prompts.d.ts.map +1 -0
  808. package/dist/server/agent-chat/framework-prompts.js +403 -0
  809. package/dist/server/agent-chat/framework-prompts.js.map +1 -0
  810. package/dist/server/agent-chat/lazy-fs.d.ts +2 -0
  811. package/dist/server/agent-chat/lazy-fs.d.ts.map +1 -0
  812. package/dist/server/agent-chat/lazy-fs.js +11 -0
  813. package/dist/server/agent-chat/lazy-fs.js.map +1 -0
  814. package/dist/server/agent-chat/mcp-glue.d.ts +9 -0
  815. package/dist/server/agent-chat/mcp-glue.d.ts.map +1 -0
  816. package/dist/server/agent-chat/mcp-glue.js +63 -0
  817. package/dist/server/agent-chat/mcp-glue.js.map +1 -0
  818. package/dist/server/agent-chat/plugin-options.d.ts +322 -0
  819. package/dist/server/agent-chat/plugin-options.d.ts.map +1 -0
  820. package/dist/server/agent-chat/plugin-options.js +2 -0
  821. package/dist/server/agent-chat/plugin-options.js.map +1 -0
  822. package/dist/server/agent-chat/process-run-failure.d.ts +12 -0
  823. package/dist/server/agent-chat/process-run-failure.d.ts.map +1 -0
  824. package/dist/server/agent-chat/process-run-failure.js +24 -0
  825. package/dist/server/agent-chat/process-run-failure.js.map +1 -0
  826. package/dist/server/agent-chat/prompt-resources.d.ts +28 -0
  827. package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -0
  828. package/dist/server/agent-chat/prompt-resources.js +514 -0
  829. package/dist/server/agent-chat/prompt-resources.js.map +1 -0
  830. package/dist/server/agent-chat/recurring-jobs-runtime.d.ts +5 -0
  831. package/dist/server/agent-chat/recurring-jobs-runtime.d.ts.map +1 -0
  832. package/dist/server/agent-chat/recurring-jobs-runtime.js +53 -0
  833. package/dist/server/agent-chat/recurring-jobs-runtime.js.map +1 -0
  834. package/dist/server/agent-chat/request-surface.d.ts +8 -0
  835. package/dist/server/agent-chat/request-surface.d.ts.map +1 -0
  836. package/dist/server/agent-chat/request-surface.js +56 -0
  837. package/dist/server/agent-chat/request-surface.js.map +1 -0
  838. package/dist/server/agent-chat/run-code-tools.d.ts +17 -0
  839. package/dist/server/agent-chat/run-code-tools.d.ts.map +1 -0
  840. package/dist/server/agent-chat/run-code-tools.js +55 -0
  841. package/dist/server/agent-chat/run-code-tools.js.map +1 -0
  842. package/dist/server/agent-chat/script-entries.d.ts +47 -0
  843. package/dist/server/agent-chat/script-entries.d.ts.map +1 -0
  844. package/dist/server/agent-chat/script-entries.js +633 -0
  845. package/dist/server/agent-chat/script-entries.js.map +1 -0
  846. package/dist/server/agent-chat/shared-thread.d.ts +33 -0
  847. package/dist/server/agent-chat/shared-thread.d.ts.map +1 -0
  848. package/dist/server/agent-chat/shared-thread.js +242 -0
  849. package/dist/server/agent-chat/shared-thread.js.map +1 -0
  850. package/dist/server/agent-chat/skill-frontmatter.d.ts +7 -0
  851. package/dist/server/agent-chat/skill-frontmatter.d.ts.map +1 -0
  852. package/dist/server/agent-chat/skill-frontmatter.js +26 -0
  853. package/dist/server/agent-chat/skill-frontmatter.js.map +1 -0
  854. package/dist/server/agent-chat-plugin.d.ts +45 -486
  855. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  856. package/dist/server/agent-chat-plugin.js +173 -3005
  857. package/dist/server/agent-chat-plugin.js.map +1 -1
  858. package/dist/server/agent-teams.d.ts +10 -0
  859. package/dist/server/agent-teams.d.ts.map +1 -1
  860. package/dist/server/agent-teams.js +13 -3
  861. package/dist/server/agent-teams.js.map +1 -1
  862. package/dist/server/auth.d.ts.map +1 -1
  863. package/dist/server/auth.js +50 -52
  864. package/dist/server/auth.js.map +1 -1
  865. package/dist/server/credential-provider.d.ts.map +1 -1
  866. package/dist/server/credential-provider.js +22 -21
  867. package/dist/server/credential-provider.js.map +1 -1
  868. package/dist/server/edge.d.ts +1 -0
  869. package/dist/server/edge.d.ts.map +1 -1
  870. package/dist/server/edge.js +1 -0
  871. package/dist/server/edge.js.map +1 -1
  872. package/dist/server/onboarding-html.d.ts.map +1 -1
  873. package/dist/server/onboarding-html.js +1 -16
  874. package/dist/server/onboarding-html.js.map +1 -1
  875. package/dist/server/poll.d.ts.map +1 -1
  876. package/dist/server/poll.js +1 -0
  877. package/dist/server/poll.js.map +1 -1
  878. package/dist/server/realtime-voice.d.ts +10 -0
  879. package/dist/server/realtime-voice.d.ts.map +1 -1
  880. package/dist/server/realtime-voice.js +249 -15
  881. package/dist/server/realtime-voice.js.map +1 -1
  882. package/dist/server/request-origin.d.ts.map +1 -1
  883. package/dist/server/request-origin.js +6 -3
  884. package/dist/server/request-origin.js.map +1 -1
  885. package/dist/server/ssr-handler.d.ts.map +1 -1
  886. package/dist/server/ssr-handler.js +47 -2
  887. package/dist/server/ssr-handler.js.map +1 -1
  888. package/dist/sharing/access.d.ts +63 -3
  889. package/dist/sharing/access.d.ts.map +1 -1
  890. package/dist/sharing/access.js +53 -15
  891. package/dist/sharing/access.js.map +1 -1
  892. package/dist/sharing/registry.d.ts +7 -0
  893. package/dist/sharing/registry.d.ts.map +1 -1
  894. package/dist/sharing/registry.js.map +1 -1
  895. package/dist/styles/agent-native.css +17 -16
  896. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +1 -1
  897. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +2 -2
  898. package/dist/templates/default/app/i18n/ar-SA.ts +6 -0
  899. package/dist/templates/default/app/i18n/de-DE.ts +6 -0
  900. package/dist/templates/default/app/i18n/en-US.ts +6 -0
  901. package/dist/templates/default/app/i18n/es-ES.ts +6 -0
  902. package/dist/templates/default/app/i18n/fr-FR.ts +6 -0
  903. package/dist/templates/default/app/i18n/hi-IN.ts +6 -0
  904. package/dist/templates/default/app/i18n/ja-JP.ts +6 -0
  905. package/dist/templates/default/app/i18n/ko-KR.ts +6 -0
  906. package/dist/templates/default/app/i18n/pt-BR.ts +6 -0
  907. package/dist/templates/default/app/i18n/zh-CN.ts +6 -0
  908. package/dist/templates/default/app/i18n/zh-TW.ts +6 -0
  909. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +27 -29
  910. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +2 -1
  911. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +1 -1
  912. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +32 -0
  913. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +2 -2
  914. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +7 -3
  915. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +39 -9
  916. package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +25 -0
  917. package/dist/templates/workspace-core/src/server/index.ts +4 -2
  918. package/dist/testing.d.ts +16 -0
  919. package/dist/testing.d.ts.map +1 -0
  920. package/dist/testing.js +16 -0
  921. package/dist/testing.js.map +1 -0
  922. package/dist/triggers/dispatcher.d.ts +7 -0
  923. package/dist/triggers/dispatcher.d.ts.map +1 -1
  924. package/dist/triggers/dispatcher.js +13 -3
  925. package/dist/triggers/dispatcher.js.map +1 -1
  926. package/dist/vite/client.d.ts +16 -1
  927. package/dist/vite/client.d.ts.map +1 -1
  928. package/dist/vite/client.js +111 -3
  929. package/dist/vite/client.js.map +1 -1
  930. package/docs/content/authentication.mdx +3 -3
  931. package/docs/content/doctor.mdx +170 -0
  932. package/docs/content/external-agents.mdx +8 -7
  933. package/docs/content/locales/ar-SA/authentication.mdx +2 -2
  934. package/docs/content/locales/ar-SA/external-agents.mdx +8 -7
  935. package/docs/content/locales/ar-SA/mcp-protocol.mdx +1 -1
  936. package/docs/content/locales/ar-SA/security.mdx +2 -0
  937. package/docs/content/locales/de-DE/authentication.mdx +1 -1
  938. package/docs/content/locales/de-DE/external-agents.mdx +8 -7
  939. package/docs/content/locales/de-DE/mcp-protocol.mdx +1 -1
  940. package/docs/content/locales/de-DE/security.mdx +2 -0
  941. package/docs/content/locales/es-ES/authentication.mdx +2 -2
  942. package/docs/content/locales/es-ES/external-agents.mdx +8 -7
  943. package/docs/content/locales/es-ES/mcp-protocol.mdx +1 -1
  944. package/docs/content/locales/es-ES/security.mdx +2 -0
  945. package/docs/content/locales/fr-FR/authentication.mdx +1 -1
  946. package/docs/content/locales/fr-FR/external-agents.mdx +8 -7
  947. package/docs/content/locales/fr-FR/mcp-protocol.mdx +1 -1
  948. package/docs/content/locales/fr-FR/security.mdx +2 -0
  949. package/docs/content/locales/hi-IN/authentication.mdx +2 -2
  950. package/docs/content/locales/hi-IN/external-agents.mdx +8 -7
  951. package/docs/content/locales/hi-IN/mcp-protocol.mdx +1 -1
  952. package/docs/content/locales/hi-IN/security.mdx +2 -0
  953. package/docs/content/locales/ja-JP/authentication.mdx +2 -2
  954. package/docs/content/locales/ja-JP/external-agents.mdx +8 -7
  955. package/docs/content/locales/ja-JP/mcp-protocol.mdx +1 -1
  956. package/docs/content/locales/ja-JP/security.mdx +2 -0
  957. package/docs/content/locales/ko-KR/authentication.mdx +2 -2
  958. package/docs/content/locales/ko-KR/external-agents.mdx +8 -7
  959. package/docs/content/locales/ko-KR/mcp-protocol.mdx +1 -1
  960. package/docs/content/locales/ko-KR/security.mdx +2 -0
  961. package/docs/content/locales/pt-BR/authentication.mdx +2 -2
  962. package/docs/content/locales/pt-BR/external-agents.mdx +8 -7
  963. package/docs/content/locales/pt-BR/mcp-protocol.mdx +1 -1
  964. package/docs/content/locales/pt-BR/security.mdx +2 -0
  965. package/docs/content/locales/zh-CN/authentication.mdx +2 -2
  966. package/docs/content/locales/zh-CN/external-agents.mdx +8 -7
  967. package/docs/content/locales/zh-CN/mcp-protocol.mdx +1 -1
  968. package/docs/content/locales/zh-CN/security.mdx +2 -0
  969. package/docs/content/locales/zh-TW/authentication.mdx +2 -2
  970. package/docs/content/locales/zh-TW/external-agents.mdx +8 -7
  971. package/docs/content/locales/zh-TW/mcp-protocol.mdx +1 -1
  972. package/docs/content/locales/zh-TW/security.mdx +2 -0
  973. package/docs/content/mcp-protocol.mdx +1 -1
  974. package/docs/content/security.mdx +2 -0
  975. package/package.json +7 -3
  976. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +1 -1
  977. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +2 -2
  978. package/src/templates/default/app/i18n/ar-SA.ts +6 -0
  979. package/src/templates/default/app/i18n/de-DE.ts +6 -0
  980. package/src/templates/default/app/i18n/en-US.ts +6 -0
  981. package/src/templates/default/app/i18n/es-ES.ts +6 -0
  982. package/src/templates/default/app/i18n/fr-FR.ts +6 -0
  983. package/src/templates/default/app/i18n/hi-IN.ts +6 -0
  984. package/src/templates/default/app/i18n/ja-JP.ts +6 -0
  985. package/src/templates/default/app/i18n/ko-KR.ts +6 -0
  986. package/src/templates/default/app/i18n/pt-BR.ts +6 -0
  987. package/src/templates/default/app/i18n/zh-CN.ts +6 -0
  988. package/src/templates/default/app/i18n/zh-TW.ts +6 -0
  989. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +27 -29
  990. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +2 -1
  991. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +1 -1
  992. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +32 -0
  993. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +2 -2
  994. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +7 -3
  995. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +39 -9
  996. package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +25 -0
  997. package/src/templates/workspace-core/src/server/index.ts +4 -2
  998. package/corpus/core/src/client/ProductionAgentPanel.tsx +0 -9
  999. package/corpus/core/src/client/auth-redirect-url.ts +0 -23
  1000. package/corpus/core/src/client/useProductionAgent.ts +0 -253
  1001. package/corpus/core/src/shared/auth-redirect-url.ts +0 -1
  1002. package/corpus/templates/analytics/app/pages/Index.tsx +0 -16
  1003. package/corpus/templates/analytics/seeds/dashboards/agent-observability-llm.json +0 -173
  1004. package/dist/client/ProductionAgentPanel.d.ts +0 -6
  1005. package/dist/client/ProductionAgentPanel.d.ts.map +0 -1
  1006. package/dist/client/ProductionAgentPanel.js +0 -6
  1007. package/dist/client/ProductionAgentPanel.js.map +0 -1
  1008. package/dist/client/auth-redirect-url.d.ts +0 -2
  1009. package/dist/client/auth-redirect-url.d.ts.map +0 -1
  1010. package/dist/client/auth-redirect-url.js +0 -19
  1011. package/dist/client/auth-redirect-url.js.map +0 -1
  1012. package/dist/client/useProductionAgent.d.ts +0 -24
  1013. package/dist/client/useProductionAgent.d.ts.map +0 -1
  1014. package/dist/client/useProductionAgent.js +0 -179
  1015. package/dist/client/useProductionAgent.js.map +0 -1
  1016. package/dist/shared/auth-redirect-url.d.ts +0 -2
  1017. package/dist/shared/auth-redirect-url.d.ts.map +0 -1
  1018. package/dist/shared/auth-redirect-url.js +0 -2
  1019. package/dist/shared/auth-redirect-url.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useRealtimeVoiceMode.js","sourceRoot":"","sources":["../../../src/client/composer/useRealtimeVoiceMode.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { requestAgentChatThreadOpen } from \"../agent-chat.js\";\nimport {\n SIDEBAR_STATE_CHANGE_EVENT,\n type AgentSidebarStateChangeDetail,\n} from \"../agent-sidebar-state.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { readClientAppState, setClientAppState } from \"../application-state.js\";\nimport { getBrowserTabId } from \"../browser-tab-id.js\";\nimport { useT } from \"../i18n.js\";\nimport {\n createRealtimeVoiceAudioLevelStore,\n normalizeRealtimeVoiceRms,\n smoothRealtimeVoiceLevel,\n type RealtimeVoiceAudioLevelStore,\n} from \"./realtime-voice-audio-level.js\";\nimport { realtimeVoiceTranscriptRegistry } from \"./realtime-voice-transcript.js\";\nimport {\n RealtimeVoiceModeDock,\n type RealtimeVoiceModeCopy,\n type RealtimeVoiceModeState,\n} from \"./RealtimeVoiceMode.js\";\n\nconst REALTIME_VOICE_STATE_KEY = \"realtime-voice-session\";\nconst REALTIME_VOICE_REQUEST_SOURCE = \"realtime-voice\";\nconst REALTIME_VOICE_SESSION_PATH = \"/_agent-native/realtime-voice/session\";\nconst REALTIME_VOICE_TOOL_PATH = \"/_agent-native/realtime-voice/tool\";\n\ntype RealtimeServerEvent = Record<string, unknown> & { type?: string };\n\nexport interface RealtimeVoiceToolResult {\n callId: string;\n status: \"completed\" | \"failed\" | \"approval_required\";\n output: string;\n approvalKey?: string;\n}\n\nexport interface RealtimeVoiceModeApi {\n state: \"idle\" | RealtimeVoiceModeState;\n active: boolean;\n errorMessage: string | null;\n chatVisible: boolean;\n audioLevels: RealtimeVoiceAudioLevelStore;\n start: () => Promise<void>;\n end: () => void;\n toggleChat: () => void;\n}\n\nexport interface CompletedRealtimeVoiceTranscript {\n role: \"user\" | \"assistant\";\n text: string;\n providerId?: string;\n}\n\n/**\n * Voice mode owns the chat only temporarily. Restore the captured transcript\n * when it is still the user's active thread (or the chat has no active thread)\n * but never pull them back after they deliberately selected another thread.\n */\nexport function shouldRestoreRealtimeVoiceTranscriptThread(\n transcriptThreadId: string | undefined,\n activeThreadId: string | undefined,\n): transcriptThreadId is string {\n return Boolean(\n transcriptThreadId &&\n (!activeThreadId || activeThreadId === transcriptThreadId),\n );\n}\n\nexport function extractCompletedRealtimeVoiceTranscript(\n event: RealtimeServerEvent,\n): CompletedRealtimeVoiceTranscript | null {\n const userCompleted =\n event.type === \"conversation.item.input_audio_transcription.completed\";\n const assistantCompleted =\n event.type === \"response.output_audio_transcript.done\";\n if (!userCompleted && !assistantCompleted) return null;\n const text =\n typeof event.transcript === \"string\" ? event.transcript.trim() : \"\";\n if (!text) return null;\n const providerId = [event.item_id, event.response_id, event.event_id].find(\n (value): value is string => typeof value === \"string\" && value.length > 0,\n );\n return {\n role: userCompleted ? \"user\" : \"assistant\",\n text,\n ...(providerId ? { providerId } : {}),\n };\n}\n\nexport interface RealtimeVoiceModeProviderProps {\n children: ReactNode;\n browserTabId?: string;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nasync function readErrorResponse(response: Response): Promise<string> {\n const raw = await response.text().catch(() => \"\");\n if (!raw) return response.statusText || `HTTP ${response.status}`;\n try {\n const parsed = JSON.parse(raw) as { error?: unknown; message?: unknown };\n return String(parsed.error ?? parsed.message ?? raw);\n } catch {\n return raw.slice(0, 500);\n }\n}\n\nexport async function createRealtimeVoiceSession(\n offerSdp: string,\n options: { browserTabId?: string; signal?: AbortSignal } = {},\n): Promise<string> {\n const response = await fetch(agentNativePath(REALTIME_VOICE_SESSION_PATH), {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n \"Content-Type\": \"application/sdp\",\n ...(options.browserTabId\n ? { \"X-Agent-Native-Browser-Tab\": options.browserTabId }\n : {}),\n },\n body: offerSdp,\n signal: options.signal,\n });\n if (!response.ok) {\n const message = await readErrorResponse(response);\n const error = new Error(message);\n (error as { status?: number }).status = response.status;\n throw error;\n }\n return response.text();\n}\n\nexport async function executeRealtimeVoiceTool(input: {\n name: string;\n args: Record<string, unknown>;\n callId: string;\n sessionId?: string;\n browserTabId?: string;\n signal?: AbortSignal;\n}): Promise<RealtimeVoiceToolResult> {\n const response = await fetch(agentNativePath(REALTIME_VOICE_TOOL_PATH), {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(input.browserTabId\n ? { \"X-Agent-Native-Browser-Tab\": input.browserTabId }\n : {}),\n },\n body: JSON.stringify({\n name: input.name,\n args: input.args,\n callId: input.callId,\n sessionId: input.sessionId,\n browserTabId: input.browserTabId,\n }),\n signal: input.signal,\n });\n if (!response.ok) {\n throw new Error(await readErrorResponse(response));\n }\n return (await response.json()) as RealtimeVoiceToolResult;\n}\n\nexport function extractRealtimeVoiceFunctionCalls(\n event: RealtimeServerEvent,\n): Array<{ name: string; callId: string; argumentsText: string }> {\n if (event.type === \"response.function_call_arguments.done\") {\n const name = typeof event.name === \"string\" ? event.name : \"\";\n const callId = typeof event.call_id === \"string\" ? event.call_id : \"\";\n if (!name || !callId) return [];\n return [\n {\n name,\n callId,\n argumentsText:\n typeof event.arguments === \"string\" ? event.arguments : \"{}\",\n },\n ];\n }\n if (event.type !== \"response.done\") return [];\n const response = event.response;\n if (!response || typeof response !== \"object\") return [];\n const output = (response as { output?: unknown }).output;\n if (!Array.isArray(output)) return [];\n return output.flatMap((item) => {\n if (!item || typeof item !== \"object\") return [];\n const record = item as Record<string, unknown>;\n if (record.type !== \"function_call\") return [];\n const name = typeof record.name === \"string\" ? record.name : \"\";\n const callId = typeof record.call_id === \"string\" ? record.call_id : \"\";\n if (!name || !callId) return [];\n return [\n {\n name,\n callId,\n argumentsText:\n typeof record.arguments === \"string\" ? record.arguments : \"{}\",\n },\n ];\n });\n}\n\nfunction parseFunctionArguments(text: string): Record<string, unknown> {\n const parsed = JSON.parse(text || \"{}\");\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"The voice model returned invalid tool arguments.\");\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction sendDataChannelEvent(\n channel: RTCDataChannel | null,\n event: Record<string, unknown>,\n): void {\n if (!channel || channel.readyState !== \"open\") return;\n channel.send(JSON.stringify(event));\n}\n\nfunction openOpenAiKeySettings(): void {\n if (typeof window === \"undefined\") return;\n window.location.hash = \"#secrets:OPENAI_API_KEY\";\n window.dispatchEvent(new Event(\"agent-panel:open\"));\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:open-settings\", {\n detail: { section: \"secrets\" },\n }),\n );\n}\n\nfunction voiceCopy(t: ReturnType<typeof useT>): RealtimeVoiceModeCopy {\n return {\n entryButtonLabel: t(\"agentPanel.voiceMode.entryButtonLabel\"),\n promptTitle: t(\"agentPanel.voiceMode.promptTitle\"),\n promptDescription: t(\"agentPanel.voiceMode.promptDescription\"),\n setupTitle: t(\"agentPanel.voiceMode.setupTitle\"),\n setupDescription: t(\"agentPanel.voiceMode.setupDescription\"),\n connectBuilder: t(\"agentPanel.voiceMode.connectBuilder\"),\n useOpenAiKey: t(\"agentPanel.voiceMode.useOpenAiKey\"),\n startWithOpenAiKey: t(\"agentPanel.voiceMode.startWithOpenAiKey\"),\n startVoiceMode: t(\"agentPanel.voiceMode.start\"),\n keepDictating: t(\"agentPanel.voiceMode.keepDictating\"),\n showChat: t(\"agentPanel.voiceMode.showChat\"),\n hideChat: t(\"agentPanel.voiceMode.hideChat\"),\n endVoiceMode: t(\"agentPanel.voiceMode.end\"),\n status: {\n connecting: t(\"agentPanel.voiceMode.status.connecting\"),\n listening: t(\"agentPanel.voiceMode.status.listening\"),\n speaking: t(\"agentPanel.voiceMode.status.speaking\"),\n working: t(\"agentPanel.voiceMode.status.working\"),\n error: t(\"agentPanel.voiceMode.status.error\"),\n ending: t(\"agentPanel.voiceMode.status.ending\"),\n },\n errors: {\n unsupported: t(\"agentPanel.voiceMode.errors.unsupported\"),\n responseFailed: t(\"agentPanel.voiceMode.errors.responseFailed\"),\n sessionFailed: t(\"agentPanel.voiceMode.errors.sessionFailed\"),\n channelDisconnected: t(\"agentPanel.voiceMode.errors.channelDisconnected\"),\n connectionFailed: t(\"agentPanel.voiceMode.errors.connectionFailed\"),\n offerFailed: t(\"agentPanel.voiceMode.errors.offerFailed\"),\n },\n };\n}\n\nexport function useRealtimeVoiceModeCopy(): RealtimeVoiceModeCopy {\n const t = useT();\n return useMemo(() => voiceCopy(t), [t]);\n}\n\nfunction useRealtimeVoiceModeController(\n browserTabId?: string,\n copy?: RealtimeVoiceModeCopy,\n): RealtimeVoiceModeApi {\n const [state, setState] = useState<\"idle\" | RealtimeVoiceModeState>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n const [chatVisible, setChatVisible] = useState(false);\n const [audioLevels] = useState(createRealtimeVoiceAudioLevelStore);\n const stateRef = useRef(state);\n const peerRef = useRef<RTCPeerConnection | null>(null);\n const channelRef = useRef<RTCDataChannel | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const inputAnalyserRef = useRef<AnalyserNode | null>(null);\n const outputAnalyserRef = useRef<AnalyserNode | null>(null);\n const inputMeterBufferRef = useRef<Uint8Array<ArrayBuffer> | null>(null);\n const outputMeterBufferRef = useRef<Uint8Array<ArrayBuffer> | null>(null);\n const inputSourceRef = useRef<MediaStreamAudioSourceNode | null>(null);\n const outputSourceRef = useRef<MediaStreamAudioSourceNode | null>(null);\n const meterFrameRef = useRef<number | null>(null);\n const lastMeterSampleRef = useRef(0);\n const abortRef = useRef<AbortController | null>(null);\n const handledCallsRef = useRef(new Set<string>());\n const sessionIdRef = useRef<string | undefined>(undefined);\n const startedAtRef = useRef<string | undefined>(undefined);\n const lastUserTextRef = useRef(\"\");\n const lastAssistantTextRef = useRef(\"\");\n const transcriptThreadIdRef = useRef<string | undefined>(undefined);\n const transcriptSequenceRef = useRef(0);\n\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n const syncAppState = useCallback(\n (nextState: \"idle\" | RealtimeVoiceModeState) => {\n const value =\n nextState === \"idle\"\n ? null\n : {\n active: true,\n status: nextState,\n model: \"gpt-realtime-2.1\",\n startedAt: startedAtRef.current,\n sessionId: sessionIdRef.current,\n browserTabId,\n lastUserText: lastUserTextRef.current || undefined,\n lastAssistantText: lastAssistantTextRef.current || undefined,\n };\n void setClientAppState(REALTIME_VOICE_STATE_KEY, value, {\n requestSource: REALTIME_VOICE_REQUEST_SOURCE,\n }).catch(() => undefined);\n },\n [browserTabId],\n );\n\n const transition = useCallback(\n (nextState: \"idle\" | RealtimeVoiceModeState) => {\n stateRef.current = nextState;\n setState(nextState);\n syncAppState(nextState);\n },\n [syncAppState],\n );\n\n const startMeterLoop = useCallback(() => {\n if (meterFrameRef.current !== null) return;\n const sample = (timestamp: number) => {\n meterFrameRef.current = requestAnimationFrame(sample);\n if (timestamp - lastMeterSampleRef.current < 50) return;\n lastMeterSampleRef.current = timestamp;\n\n const current = audioLevels.getSnapshot();\n let input = current.input;\n let output = current.output;\n const inputAnalyser = inputAnalyserRef.current;\n const inputBuffer = inputMeterBufferRef.current;\n if (inputAnalyser && inputBuffer) {\n inputAnalyser.getByteTimeDomainData(inputBuffer);\n input = smoothRealtimeVoiceLevel(\n input,\n normalizeRealtimeVoiceRms(inputBuffer),\n );\n }\n const outputAnalyser = outputAnalyserRef.current;\n const outputBuffer = outputMeterBufferRef.current;\n if (outputAnalyser && outputBuffer) {\n outputAnalyser.getByteTimeDomainData(outputBuffer);\n output = smoothRealtimeVoiceLevel(\n output,\n normalizeRealtimeVoiceRms(outputBuffer),\n );\n }\n audioLevels.set({ input, output });\n };\n meterFrameRef.current = requestAnimationFrame(sample);\n }, [audioLevels]);\n\n const attachAudioMeter = useCallback(\n (stream: MediaStream, channel: \"input\" | \"output\") => {\n try {\n const AudioCtor =\n window.AudioContext ??\n (\n window as typeof window & {\n webkitAudioContext?: typeof AudioContext;\n }\n ).webkitAudioContext;\n if (!AudioCtor) return;\n const context = audioContextRef.current ?? new AudioCtor();\n audioContextRef.current = context;\n void context.resume().catch(() => undefined);\n const analyser = context.createAnalyser();\n analyser.fftSize = 512;\n const source = context.createMediaStreamSource(stream);\n source.connect(analyser);\n const buffer = new Uint8Array(analyser.frequencyBinCount);\n if (channel === \"input\") {\n inputSourceRef.current?.disconnect();\n inputSourceRef.current = source;\n inputAnalyserRef.current = analyser;\n inputMeterBufferRef.current = buffer;\n } else {\n outputSourceRef.current?.disconnect();\n outputSourceRef.current = source;\n outputAnalyserRef.current = analyser;\n outputMeterBufferRef.current = buffer;\n }\n startMeterLoop();\n } catch {\n // Audio metering is visual-only; keep the realtime call healthy.\n }\n },\n [startMeterLoop],\n );\n\n const cleanupTransport = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = null;\n channelRef.current?.close();\n channelRef.current = null;\n peerRef.current?.close();\n peerRef.current = null;\n for (const track of streamRef.current?.getTracks() ?? []) track.stop();\n streamRef.current = null;\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current.srcObject = null;\n }\n audioRef.current = null;\n if (meterFrameRef.current !== null) {\n cancelAnimationFrame(meterFrameRef.current);\n meterFrameRef.current = null;\n }\n inputSourceRef.current?.disconnect();\n outputSourceRef.current?.disconnect();\n inputSourceRef.current = null;\n outputSourceRef.current = null;\n inputAnalyserRef.current = null;\n outputAnalyserRef.current = null;\n inputMeterBufferRef.current = null;\n outputMeterBufferRef.current = null;\n lastMeterSampleRef.current = 0;\n const audioContext = audioContextRef.current;\n audioContextRef.current = null;\n if (audioContext) void audioContext.close().catch(() => undefined);\n audioLevels.reset();\n handledCallsRef.current.clear();\n }, [audioLevels]);\n\n const fail = useCallback(\n (message: string, options?: { openKeySettings?: boolean }) => {\n cleanupTransport();\n setError(message);\n transition(\"error\");\n if (options?.openKeySettings) openOpenAiKeySettings();\n },\n [cleanupTransport, transition],\n );\n\n const handleFunctionCall = useCallback(\n async (call: { name: string; callId: string; argumentsText: string }) => {\n if (handledCallsRef.current.has(call.callId)) return;\n handledCallsRef.current.add(call.callId);\n transition(\"working\");\n let result: RealtimeVoiceToolResult;\n try {\n const args = parseFunctionArguments(call.argumentsText);\n result = await executeRealtimeVoiceTool({\n name: call.name,\n args,\n callId: call.callId,\n sessionId: sessionIdRef.current,\n browserTabId,\n signal: abortRef.current?.signal,\n });\n } catch (toolError) {\n result = {\n callId: call.callId,\n status: \"failed\",\n output: errorMessage(toolError),\n };\n }\n sendDataChannelEvent(channelRef.current, {\n type: \"conversation.item.create\",\n item: {\n type: \"function_call_output\",\n call_id: call.callId,\n output: JSON.stringify(result),\n },\n });\n sendDataChannelEvent(channelRef.current, { type: \"response.create\" });\n },\n [browserTabId, transition],\n );\n\n const persistCompletedTranscript = useCallback(\n (event: RealtimeServerEvent) => {\n const transcript = extractCompletedRealtimeVoiceTranscript(event);\n const threadId = transcriptThreadIdRef.current;\n if (!transcript || !threadId) return;\n const sessionIdentity =\n sessionIdRef.current ?? startedAtRef.current ?? \"pending\";\n const providerIdentity =\n transcript.providerId ?? `sequence-${++transcriptSequenceRef.current}`;\n realtimeVoiceTranscriptRegistry.publish({\n id: `realtime-voice:${sessionIdentity}:${transcript.role}:${providerIdentity}`,\n threadId,\n role: transcript.role,\n text: transcript.text,\n createdAt: new Date().toISOString(),\n });\n },\n [],\n );\n\n const handleServerEvent = useCallback(\n (event: RealtimeServerEvent) => {\n if (event.type === \"session.created\") {\n const session = event.session;\n if (session && typeof session === \"object\") {\n const id = (session as { id?: unknown }).id;\n if (typeof id === \"string\") sessionIdRef.current = id;\n }\n transition(\"listening\");\n } else if (event.type === \"input_audio_buffer.speech_started\") {\n transition(\"listening\");\n } else if (event.type === \"input_audio_buffer.speech_stopped\") {\n transition(\"working\");\n } else if (event.type === \"response.created\") {\n lastAssistantTextRef.current = \"\";\n transition(\"working\");\n } else if (event.type === \"response.output_audio_transcript.delta\") {\n if (typeof event.delta === \"string\") {\n lastAssistantTextRef.current += event.delta;\n }\n transition(\"speaking\");\n } else if (event.type === \"response.output_audio_transcript.done\") {\n if (typeof event.transcript === \"string\") {\n lastAssistantTextRef.current = event.transcript;\n }\n persistCompletedTranscript(event);\n syncAppState(\"speaking\");\n } else if (\n event.type === \"conversation.item.input_audio_transcription.completed\"\n ) {\n if (typeof event.transcript === \"string\") {\n lastUserTextRef.current = event.transcript;\n }\n persistCompletedTranscript(event);\n syncAppState(\"working\");\n } else if (event.type === \"response.done\") {\n const response = event.response;\n const status =\n response && typeof response === \"object\"\n ? (response as { status?: unknown }).status\n : undefined;\n if (status === \"failed\") {\n fail(\n copy?.errors.responseFailed ??\n \"OpenAI could not complete the voice response.\",\n );\n return;\n }\n } else if (event.type === \"error\") {\n const detail = event.error;\n const message =\n detail && typeof detail === \"object\"\n ? String((detail as { message?: unknown }).message ?? \"\")\n : typeof detail === \"string\"\n ? detail\n : \"\";\n fail(\n message ||\n copy?.errors.sessionFailed ||\n \"The realtime voice session encountered an error.\",\n );\n return;\n }\n\n const calls = extractRealtimeVoiceFunctionCalls(event);\n for (const call of calls) void handleFunctionCall(call);\n if (event.type === \"response.done\" && calls.length === 0) {\n transition(\"listening\");\n }\n },\n [\n copy,\n fail,\n handleFunctionCall,\n persistCompletedTranscript,\n syncAppState,\n transition,\n ],\n );\n\n const start = useCallback(async () => {\n if (stateRef.current !== \"idle\") return;\n if (\n typeof RTCPeerConnection === \"undefined\" ||\n !navigator.mediaDevices?.getUserMedia\n ) {\n fail(\n copy?.errors.unsupported ??\n \"This browser does not support realtime voice conversations.\",\n );\n return;\n }\n setError(null);\n startedAtRef.current = new Date().toISOString();\n lastUserTextRef.current = \"\";\n lastAssistantTextRef.current = \"\";\n sessionIdRef.current = undefined;\n transcriptThreadIdRef.current =\n realtimeVoiceTranscriptRegistry.activeThreadId();\n transcriptSequenceRef.current = 0;\n transition(\"connecting\");\n setChatVisible(false);\n window.dispatchEvent(new Event(\"agent-panel:close\"));\n\n const abortController = new AbortController();\n abortRef.current = abortController;\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n streamRef.current = stream;\n attachAudioMeter(stream, \"input\");\n\n const peer = new RTCPeerConnection();\n peerRef.current = peer;\n for (const track of stream.getAudioTracks()) peer.addTrack(track, stream);\n\n const audio = document.createElement(\"audio\");\n audio.autoplay = true;\n audio.setAttribute(\"playsinline\", \"\");\n audioRef.current = audio;\n peer.ontrack = (trackEvent) => {\n const remoteStream = trackEvent.streams[0] ?? null;\n audio.srcObject = remoteStream;\n if (remoteStream) attachAudioMeter(remoteStream, \"output\");\n void audio.play().catch(() => undefined);\n };\n\n const channel = peer.createDataChannel(\"oai-events\");\n channelRef.current = channel;\n channel.onopen = () => transition(\"listening\");\n channel.onmessage = (messageEvent) => {\n try {\n handleServerEvent(JSON.parse(String(messageEvent.data)));\n } catch {\n // Ignore malformed provider events without ending a healthy call.\n }\n };\n channel.onerror = () =>\n fail(\n copy?.errors.channelDisconnected ??\n \"The realtime voice control channel disconnected.\",\n );\n peer.onconnectionstatechange = () => {\n if (peer.connectionState === \"connected\") transition(\"listening\");\n if (peer.connectionState === \"failed\") {\n fail(\n copy?.errors.connectionFailed ??\n \"The realtime voice connection failed.\",\n );\n }\n };\n\n const offer = await peer.createOffer();\n await peer.setLocalDescription(offer);\n if (!offer.sdp) {\n throw new Error(\n copy?.errors.offerFailed ??\n \"The browser did not create an audio offer.\",\n );\n }\n const answerSdp = await createRealtimeVoiceSession(offer.sdp, {\n browserTabId,\n signal: abortController.signal,\n });\n await peer.setRemoteDescription({ type: \"answer\", sdp: answerSdp });\n } catch (startError) {\n const status = (startError as { status?: unknown })?.status;\n fail(errorMessage(startError), { openKeySettings: status === 400 });\n }\n }, [\n attachAudioMeter,\n browserTabId,\n copy,\n fail,\n handleServerEvent,\n transition,\n ]);\n\n const end = useCallback(() => {\n if (stateRef.current === \"idle\" || stateRef.current === \"ending\") return;\n const transcriptThreadId = transcriptThreadIdRef.current;\n const activeThreadId = realtimeVoiceTranscriptRegistry.activeThreadId();\n transition(\"ending\");\n cleanupTransport();\n setError(null);\n sessionIdRef.current = undefined;\n startedAtRef.current = undefined;\n transcriptThreadIdRef.current = undefined;\n setChatVisible(true);\n if (\n shouldRestoreRealtimeVoiceTranscriptThread(\n transcriptThreadId,\n activeThreadId,\n )\n ) {\n requestAgentChatThreadOpen({\n threadId: transcriptThreadId,\n // The request is delivered asynchronously. Re-checking this at the\n // receiver prevents a navigation that happened during that gap from\n // being overwritten.\n onlyIfActiveThreadId: transcriptThreadId,\n });\n } else {\n window.dispatchEvent(new Event(\"agent-panel:open\"));\n }\n transition(\"idle\");\n }, [cleanupTransport, transition]);\n\n const toggleChat = useCallback(() => {\n setChatVisible((current) => !current);\n window.dispatchEvent(new Event(\"agent-panel:toggle\"));\n }, []);\n\n useEffect(() => {\n const onSidebarState = (event: Event) => {\n const detail = (event as CustomEvent<AgentSidebarStateChangeDetail>)\n .detail;\n if (detail && typeof detail.open === \"boolean\") {\n setChatVisible(detail.open);\n }\n };\n window.addEventListener(SIDEBAR_STATE_CHANGE_EVENT, onSidebarState);\n return () =>\n window.removeEventListener(SIDEBAR_STATE_CHANGE_EVENT, onSidebarState);\n }, []);\n\n useEffect(() => cleanupTransport, [cleanupTransport]);\n\n return {\n state,\n active: state !== \"idle\",\n errorMessage: error,\n chatVisible,\n audioLevels,\n start,\n end,\n toggleChat,\n };\n}\n\nconst RealtimeVoiceModeContext = createContext<RealtimeVoiceModeApi | null>(\n null,\n);\n\nexport function RealtimeVoiceModeProvider({\n children,\n browserTabId,\n}: RealtimeVoiceModeProviderProps) {\n const resolvedBrowserTabId = useMemo(\n () => browserTabId ?? getBrowserTabId(),\n [browserTabId],\n );\n const copy = useRealtimeVoiceModeCopy();\n const voice = useRealtimeVoiceModeController(resolvedBrowserTabId, copy);\n\n return (\n <RealtimeVoiceModeContext.Provider value={voice}>\n {children}\n {voice.active && typeof document !== \"undefined\"\n ? createPortal(\n <RealtimeVoiceModeDock\n state={voice.state === \"idle\" ? \"ending\" : voice.state}\n copy={copy}\n chatVisible={voice.chatVisible}\n audioLevels={voice.audioLevels}\n onToggleChat={voice.toggleChat}\n onEndVoiceMode={voice.end}\n errorMessage={voice.errorMessage}\n />,\n document.body,\n )\n : null}\n </RealtimeVoiceModeContext.Provider>\n );\n}\n\n/**\n * Ensure standalone/full-page composers get realtime voice without nesting a\n * second session owner inside the persistent AgentSidebar provider.\n */\nexport function RealtimeVoiceModeBoundary({\n children,\n browserTabId,\n}: RealtimeVoiceModeProviderProps) {\n const existing = useRealtimeVoiceModeOptional();\n if (existing) {\n return (\n <RealtimeVoiceModeComposerSurface>\n {children}\n </RealtimeVoiceModeComposerSurface>\n );\n }\n return (\n <RealtimeVoiceModeProvider browserTabId={browserTabId}>\n <RealtimeVoiceModeComposerSurface>\n {children}\n </RealtimeVoiceModeComposerSurface>\n </RealtimeVoiceModeProvider>\n );\n}\n\n/** Hide a composer while voice owns input; the dock can reveal it on demand. */\nfunction RealtimeVoiceModeComposerSurface({\n children,\n}: Pick<RealtimeVoiceModeProviderProps, \"children\">) {\n const voice = useRealtimeVoiceModeOptional();\n if (voice?.active && !voice.chatVisible) return null;\n return children;\n}\n\nexport function useRealtimeVoiceMode(): RealtimeVoiceModeApi {\n const value = useContext(RealtimeVoiceModeContext);\n if (!value) {\n throw new Error(\n \"useRealtimeVoiceMode must be used inside RealtimeVoiceModeProvider.\",\n );\n }\n return value;\n}\n\nexport function useRealtimeVoiceModeOptional(): RealtimeVoiceModeApi | null {\n return useContext(RealtimeVoiceModeContext);\n}\n\nexport async function readRealtimeVoiceContext(): Promise<{\n navigation: unknown;\n url: unknown;\n}> {\n const [navigation, url] = await Promise.all([\n readClientAppState(\"navigation\").catch(() => null),\n readClientAppState(\"__url__\").catch(() => null),\n ]);\n return { navigation, url };\n}\n"]}
1
+ {"version":3,"file":"useRealtimeVoiceMode.js","sourceRoot":"","sources":["../../../src/client/composer/useRealtimeVoiceMode.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { requestAgentChatThreadOpen } from \"../agent-chat.js\";\nimport {\n SIDEBAR_STATE_CHANGE_EVENT,\n type AgentSidebarStateChangeDetail,\n} from \"../agent-sidebar-state.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { readClientAppState, setClientAppState } from \"../application-state.js\";\nimport { getBrowserTabId } from \"../browser-tab-id.js\";\nimport { useT } from \"../i18n.js\";\nimport {\n createRealtimeVoiceAudioLevelStore,\n normalizeRealtimeVoiceRms,\n smoothRealtimeVoiceLevel,\n type RealtimeVoiceAudioLevelStore,\n} from \"./realtime-voice-audio-level.js\";\nimport { realtimeVoiceTranscriptRegistry } from \"./realtime-voice-transcript.js\";\nimport {\n RealtimeVoiceModeDock,\n type RealtimeVoiceModeCopy,\n type RealtimeVoiceModeState,\n} from \"./RealtimeVoiceMode.js\";\n\nconst REALTIME_VOICE_STATE_KEY = \"realtime-voice-session\";\nconst REALTIME_VOICE_PREFERENCES_KEY = \"realtime-voice-prefs\";\nconst REALTIME_VOICE_REQUEST_SOURCE = \"realtime-voice\";\nconst REALTIME_VOICE_SESSION_PATH = \"/_agent-native/realtime-voice/session\";\nconst REALTIME_VOICE_TOOL_PATH = \"/_agent-native/realtime-voice/tool\";\nconst REALTIME_VOICE_CAPABILITY_HEADER = \"X-Agent-Native-Realtime-Capability\";\nconst REALTIME_VOICE_CONNECTION_TIMEOUT_MS = 15_000;\nconst REALTIME_VOICE_MAX_TOOLS = 32;\nconst REALTIME_VOICE_MAX_TOOL_SCHEMA_BYTES = 32_000;\nconst REALTIME_VOICE_MAX_SESSION_BYTES = 64_000;\nconst REALTIME_VOICE_TOOL_UPDATE_TIMEOUT_MS = 5_000;\nconst REALTIME_VOICE_PRIORITY_TOOL_NAMES = [\n \"navigate\",\n \"set-url-path\",\n \"set-search-params\",\n \"view-screen\",\n \"tool-search\",\n] as const;\nconst REALTIME_VOICE_TOOL_NAME = /^[A-Za-z0-9_-]{1,64}$/;\nconst REALTIME_VOICE_MICROPHONE_STORAGE_KEY =\n \"agent-native:realtime-voice-microphone\";\n\nexport const REALTIME_VOICE_LANGUAGES = [\n \"auto\",\n \"en\",\n \"es\",\n \"fr\",\n \"de\",\n \"it\",\n \"pt\",\n \"ja\",\n \"ko\",\n \"zh\",\n] as const;\nexport const REALTIME_VOICE_INTELLIGENCE_LEVELS = [\n \"instant\",\n \"balanced\",\n \"deep\",\n] as const;\nexport const REALTIME_VOICES = [\n \"marin\",\n \"cedar\",\n \"coral\",\n \"sage\",\n \"verse\",\n \"alloy\",\n \"ash\",\n \"ballad\",\n \"echo\",\n \"shimmer\",\n] as const;\n\nexport type RealtimeVoiceLanguage = (typeof REALTIME_VOICE_LANGUAGES)[number];\nexport type RealtimeVoiceIntelligence =\n (typeof REALTIME_VOICE_INTELLIGENCE_LEVELS)[number];\nexport type RealtimeVoice = (typeof REALTIME_VOICES)[number];\n\nexport interface RealtimeVoicePreferences {\n language: RealtimeVoiceLanguage;\n intelligence: RealtimeVoiceIntelligence;\n voice: RealtimeVoice;\n}\n\nexport const DEFAULT_REALTIME_VOICE_PREFERENCES: RealtimeVoicePreferences = {\n language: \"auto\",\n intelligence: \"instant\",\n voice: \"marin\",\n};\n\nexport const REALTIME_VOICE_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n // Prefer the browser/OS-selected input instead of whichever physical device\n // happens to be enumerated first. `ideal` keeps browsers without the\n // synthetic `default` device from failing with OverconstrainedError.\n deviceId: { ideal: \"default\" },\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n};\n\ntype RealtimeServerEvent = Record<string, unknown> & { type?: string };\n\nexport interface RealtimeVoiceToolResult {\n callId: string;\n status: \"completed\" | \"failed\" | \"approval_required\";\n output: string;\n approvalKey?: string;\n expandedTools?: RealtimeVoiceFunctionTool[];\n}\n\nexport interface RealtimeVoiceSessionAnswer {\n sdp: string;\n capability?: string;\n}\n\nexport interface RealtimeVoiceFunctionTool {\n type: \"function\";\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n}\n\nexport interface RealtimeVoiceModeApi {\n state: \"idle\" | RealtimeVoiceModeState;\n active: boolean;\n errorMessage: string | null;\n chatVisible: boolean;\n audioLevels: RealtimeVoiceAudioLevelStore;\n preferences: RealtimeVoicePreferences;\n microphones: readonly RealtimeVoiceMicrophone[];\n microphoneDeviceId: string;\n microphoneSwitching: boolean;\n microphoneError: string | null;\n voiceChangePending: boolean;\n setLanguage: (language: RealtimeVoiceLanguage) => void;\n setIntelligence: (intelligence: RealtimeVoiceIntelligence) => void;\n setVoice: (voice: RealtimeVoice) => void;\n setMicrophone: (deviceId: string) => Promise<void>;\n start: () => Promise<void>;\n end: () => void;\n toggleChat: () => void;\n}\n\nexport interface RealtimeVoiceMicrophone {\n deviceId: string;\n label: string;\n}\n\nexport function createRealtimeVoiceAudioConstraints(\n deviceId = \"default\",\n exact = false,\n): MediaTrackConstraints {\n return {\n ...REALTIME_VOICE_AUDIO_CONSTRAINTS,\n deviceId:\n deviceId === \"default\"\n ? { ideal: \"default\" }\n : exact\n ? { exact: deviceId }\n : { ideal: deviceId },\n };\n}\n\nexport async function replaceRealtimeVoiceMicrophone(options: {\n mediaDevices: Pick<MediaDevices, \"getUserMedia\">;\n peer: Pick<RTCPeerConnection, \"getSenders\">;\n currentStream: MediaStream | null;\n deviceId: string;\n}): Promise<MediaStream> {\n const replacementStream = await options.mediaDevices.getUserMedia({\n audio: createRealtimeVoiceAudioConstraints(options.deviceId, true),\n });\n try {\n const replacementTrack = replacementStream.getAudioTracks()[0];\n const sender = options.peer\n .getSenders()\n .find((candidate) => candidate.track?.kind === \"audio\");\n if (!replacementTrack || !sender) {\n throw new Error(\"No active microphone track is available.\");\n }\n\n await sender.replaceTrack(replacementTrack);\n for (const track of options.currentStream?.getTracks() ?? []) {\n track.onended = null;\n track.stop();\n }\n return replacementStream;\n } catch (error) {\n for (const track of replacementStream.getTracks()) track.stop();\n throw error;\n }\n}\n\nfunction readRealtimeVoiceMicrophoneId(): string {\n if (typeof window === \"undefined\") return \"default\";\n try {\n return (\n window.localStorage.getItem(REALTIME_VOICE_MICROPHONE_STORAGE_KEY) ||\n \"default\"\n );\n } catch {\n return \"default\";\n }\n}\n\nfunction writeRealtimeVoiceMicrophoneId(deviceId: string): void {\n try {\n window.localStorage.setItem(\n REALTIME_VOICE_MICROPHONE_STORAGE_KEY,\n deviceId,\n );\n } catch {\n // A remembered local device is optional and must never block voice mode.\n }\n}\n\nfunction isOneOf<T extends readonly string[]>(\n values: T,\n value: unknown,\n): value is T[number] {\n return typeof value === \"string\" && values.includes(value);\n}\n\nexport function normalizeRealtimeVoicePreferences(\n value: unknown,\n): RealtimeVoicePreferences {\n const record =\n value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n return {\n language: isOneOf(REALTIME_VOICE_LANGUAGES, record.language)\n ? record.language\n : DEFAULT_REALTIME_VOICE_PREFERENCES.language,\n intelligence: isOneOf(\n REALTIME_VOICE_INTELLIGENCE_LEVELS,\n record.intelligence,\n )\n ? record.intelligence\n : DEFAULT_REALTIME_VOICE_PREFERENCES.intelligence,\n voice: isOneOf(REALTIME_VOICES, record.voice)\n ? record.voice\n : DEFAULT_REALTIME_VOICE_PREFERENCES.voice,\n };\n}\n\nexport function resolveRealtimeVoiceLanguage(\n language: RealtimeVoiceLanguage,\n browserLanguages: readonly string[] = [],\n): Exclude<RealtimeVoiceLanguage, \"auto\"> {\n if (language !== \"auto\") return language;\n for (const locale of browserLanguages) {\n const primary = locale.trim().split(\"-\")[0]?.toLowerCase();\n if (isOneOf(REALTIME_VOICE_LANGUAGES, primary) && primary !== \"auto\") {\n return primary;\n }\n }\n return \"en\";\n}\n\nexport function realtimeVoiceReasoningEffort(\n intelligence: RealtimeVoiceIntelligence,\n): \"minimal\" | \"low\" | \"medium\" {\n if (intelligence === \"balanced\") return \"low\";\n if (intelligence === \"deep\") return \"medium\";\n return \"minimal\";\n}\n\nexport function createRealtimeVoicePreferenceUpdate(\n preferences: RealtimeVoicePreferences,\n options: {\n browserLanguages?: readonly string[];\n includeVoice?: boolean;\n } = {},\n): Record<string, unknown> {\n return {\n type: \"session.update\",\n session: {\n type: \"realtime\",\n reasoning: {\n effort: realtimeVoiceReasoningEffort(preferences.intelligence),\n },\n audio: {\n input: {\n transcription: {\n model: \"gpt-4o-mini-transcribe\",\n language: resolveRealtimeVoiceLanguage(\n preferences.language,\n options.browserLanguages,\n ),\n },\n },\n ...(options.includeVoice\n ? { output: { voice: preferences.voice } }\n : {}),\n },\n },\n };\n}\n\nexport interface CompletedRealtimeVoiceTranscript {\n role: \"user\" | \"assistant\";\n text: string;\n providerId?: string;\n}\n\nexport interface RealtimeVoiceTranscriptSequencer {\n handle: (event: RealtimeServerEvent) => void;\n reset: () => void;\n}\n\ninterface SequencedRealtimeVoiceTranscript {\n status: \"pending\" | \"completed\" | \"skipped\";\n role?: CompletedRealtimeVoiceTranscript[\"role\"];\n transcript?: CompletedRealtimeVoiceTranscript;\n}\n\n/**\n * Input transcription is produced by a separate ASR model and can finish after\n * the assistant response. Reserve each message's position when OpenAI adds it\n * to the conversation, then publish only the contiguous completed prefix.\n */\nexport function createRealtimeVoiceTranscriptSequencer(\n publish: (transcript: CompletedRealtimeVoiceTranscript) => void,\n): RealtimeVoiceTranscriptSequencer {\n const order: string[] = [];\n const items = new Map<string, SequencedRealtimeVoiceTranscript>();\n const settledItemIds = new Set<string>();\n const receivedTranscriptIds = new Set<string>();\n\n const reserve = (\n id: string,\n role?: CompletedRealtimeVoiceTranscript[\"role\"],\n ) => {\n if (settledItemIds.has(id)) return;\n const existing = items.get(id);\n if (existing) {\n existing.role ??= role;\n return;\n }\n order.push(id);\n items.set(id, { status: \"pending\", role });\n };\n\n const drain = () => {\n while (order.length > 0) {\n const id = order[0]!;\n const entry = items.get(id);\n if (!entry || entry.status === \"pending\") return;\n order.shift();\n items.delete(id);\n settledItemIds.add(id);\n if (entry.status === \"completed\" && entry.transcript) {\n publish(entry.transcript);\n }\n }\n };\n\n const skip = (id: unknown) => {\n if (typeof id !== \"string\" || !id) return;\n reserve(id);\n const entry = items.get(id)!;\n if (entry.status === \"pending\") entry.status = \"skipped\";\n };\n\n return {\n handle(event) {\n if (\n event.type === \"conversation.item.added\" ||\n event.type === \"conversation.item.created\"\n ) {\n const item = event.item;\n if (item && typeof item === \"object\") {\n const record = item as Record<string, unknown>;\n if (\n record.type === \"message\" &&\n (record.role === \"user\" || record.role === \"assistant\") &&\n typeof record.id === \"string\"\n ) {\n reserve(record.id, record.role);\n }\n }\n }\n\n const transcript = extractCompletedRealtimeVoiceTranscript(event);\n if (transcript) {\n const transcriptId = transcript.providerId\n ? `${transcript.role}:${transcript.providerId}`\n : undefined;\n if (transcriptId && receivedTranscriptIds.has(transcriptId)) return;\n if (transcriptId) receivedTranscriptIds.add(transcriptId);\n const itemId =\n typeof event.item_id === \"string\" ? event.item_id : undefined;\n if (!itemId) {\n // Older providers may omit item_id. Match the first reserved slot for\n // that role so one incomplete legacy event cannot strand the queue.\n const reservedId = order.find((id) => {\n const entry = items.get(id);\n return (\n entry?.status === \"pending\" && entry.role === transcript.role\n );\n });\n if (reservedId) {\n items.set(reservedId, {\n status: \"completed\",\n role: transcript.role,\n transcript,\n });\n } else {\n publish(transcript);\n }\n } else {\n if (settledItemIds.has(itemId)) return;\n reserve(itemId, transcript.role);\n items.set(itemId, {\n status: \"completed\",\n role: transcript.role,\n transcript,\n });\n }\n } else if (\n event.type === \"conversation.item.input_audio_transcription.failed\" ||\n event.type === \"conversation.item.deleted\"\n ) {\n skip(event.item_id);\n } else if (event.type === \"response.done\") {\n const response = event.response;\n const output =\n response && typeof response === \"object\"\n ? (response as { output?: unknown }).output\n : undefined;\n if (Array.isArray(output)) {\n for (const item of output) {\n if (!item || typeof item !== \"object\") continue;\n const record = item as Record<string, unknown>;\n if (record.type === \"message\") skip(record.id);\n }\n }\n }\n drain();\n },\n reset() {\n order.length = 0;\n items.clear();\n settledItemIds.clear();\n receivedTranscriptIds.clear();\n },\n };\n}\n\nexport function createRealtimeVoiceGreetingEvent(): Record<string, unknown> {\n return {\n type: \"response.create\",\n response: {\n output_modalities: [\"audio\"],\n instructions:\n 'Say exactly: \"How can I help you?\" Do not add anything else.',\n // Do not set max_output_tokens here. Realtime counts assistant audio at\n // roughly one token per 50 ms, so a text-sized cap can cut speech off.\n // The exact-response instruction already keeps this greeting bounded.\n },\n };\n}\n\nexport function createRealtimeVoiceGreetingStarter(\n send: (event: Record<string, unknown>) => void,\n): { start: () => boolean; reset: () => void } {\n let started = false;\n return {\n start() {\n if (started) return false;\n started = true;\n send(createRealtimeVoiceGreetingEvent());\n return true;\n },\n reset() {\n started = false;\n },\n };\n}\n\n/**\n * Voice mode owns the chat only temporarily. Restore the captured transcript\n * when it is still the user's active thread (or the chat has no active thread)\n * but never pull them back after they deliberately selected another thread.\n */\nexport function shouldRestoreRealtimeVoiceTranscriptThread(\n transcriptThreadId: string | undefined,\n activeThreadId: string | undefined,\n): transcriptThreadId is string {\n return Boolean(\n transcriptThreadId &&\n (!activeThreadId || activeThreadId === transcriptThreadId),\n );\n}\n\nexport function extractCompletedRealtimeVoiceTranscript(\n event: RealtimeServerEvent,\n): CompletedRealtimeVoiceTranscript | null {\n const userCompleted =\n event.type === \"conversation.item.input_audio_transcription.completed\";\n const assistantCompleted =\n event.type === \"response.output_audio_transcript.done\";\n if (!userCompleted && !assistantCompleted) return null;\n const text =\n typeof event.transcript === \"string\" ? event.transcript.trim() : \"\";\n if (!text) return null;\n const providerId = [event.item_id, event.response_id, event.event_id].find(\n (value): value is string => typeof value === \"string\" && value.length > 0,\n );\n return {\n role: userCompleted ? \"user\" : \"assistant\",\n text,\n ...(providerId ? { providerId } : {}),\n };\n}\n\nexport interface RealtimeVoiceModeProviderProps {\n children: ReactNode;\n browserTabId?: string;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport function isRealtimeVoiceAbortError(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n (error as { name?: unknown }).name === \"AbortError\",\n );\n}\n\nexport function isRealtimeVoiceSetupRequiredError(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n (error as { status?: unknown }).status === 409,\n );\n}\n\nexport function createRealtimeVoiceConnectionTimeout(\n onTimeout: () => void,\n timeoutMs = REALTIME_VOICE_CONNECTION_TIMEOUT_MS,\n): () => void {\n const timeout = window.setTimeout(onTimeout, timeoutMs);\n return () => window.clearTimeout(timeout);\n}\n\nexport function createRealtimeVoiceConnectionGate(\n onTimeout: () => void,\n timeoutMs = REALTIME_VOICE_CONNECTION_TIMEOUT_MS,\n): {\n markTransportReady: () => void;\n markSessionCreated: () => void;\n cancel: () => void;\n} {\n const cancel = createRealtimeVoiceConnectionTimeout(onTimeout, timeoutMs);\n return {\n // RTC connectivity alone is not enough: the session may never finish its\n // Realtime handshake. Keep the deadline armed until session.created.\n markTransportReady() {},\n markSessionCreated: cancel,\n cancel,\n };\n}\n\nasync function readErrorResponse(response: Response): Promise<string> {\n const raw = await response.text().catch(() => \"\");\n if (!raw) return response.statusText || `HTTP ${response.status}`;\n try {\n const parsed = JSON.parse(raw) as { error?: unknown; message?: unknown };\n return String(parsed.error ?? parsed.message ?? raw);\n } catch {\n return raw.slice(0, 500);\n }\n}\n\ninterface RealtimeVoiceSessionOptions {\n browserTabId?: string;\n signal?: AbortSignal;\n preferences?: RealtimeVoicePreferences;\n browserLanguages?: readonly string[];\n}\n\nexport async function createRealtimeVoiceSessionWithCapability(\n offerSdp: string,\n options: RealtimeVoiceSessionOptions = {},\n): Promise<RealtimeVoiceSessionAnswer> {\n const preferences = options.preferences;\n const response = await fetch(agentNativePath(REALTIME_VOICE_SESSION_PATH), {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n \"Content-Type\": \"application/sdp\",\n ...(options.browserTabId\n ? { \"X-Agent-Native-Browser-Tab\": options.browserTabId }\n : {}),\n ...(preferences\n ? {\n \"X-Agent-Native-Realtime-Language\": resolveRealtimeVoiceLanguage(\n preferences.language,\n options.browserLanguages,\n ),\n \"X-Agent-Native-Realtime-Intelligence\": preferences.intelligence,\n \"X-Agent-Native-Realtime-Voice\": preferences.voice,\n }\n : {}),\n },\n body: offerSdp,\n signal: options.signal,\n });\n if (!response.ok) {\n const message = await readErrorResponse(response);\n const error = new Error(message);\n (error as { status?: number }).status = response.status;\n throw error;\n }\n const sdp = await response.text();\n const capability = response.headers.get(REALTIME_VOICE_CAPABILITY_HEADER);\n return {\n sdp,\n ...(capability ? { capability } : {}),\n };\n}\n\n/** Backwards-compatible SDP-only session helper for existing client callers. */\nexport async function createRealtimeVoiceSession(\n offerSdp: string,\n options: RealtimeVoiceSessionOptions = {},\n): Promise<string> {\n return (await createRealtimeVoiceSessionWithCapability(offerSdp, options))\n .sdp;\n}\n\nexport async function executeRealtimeVoiceTool(input: {\n name: string;\n args: Record<string, unknown>;\n callId: string;\n sessionId?: string;\n browserTabId?: string;\n capability?: string;\n signal?: AbortSignal;\n}): Promise<RealtimeVoiceToolResult> {\n const response = await fetch(agentNativePath(REALTIME_VOICE_TOOL_PATH), {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(input.browserTabId\n ? { \"X-Agent-Native-Browser-Tab\": input.browserTabId }\n : {}),\n ...(input.capability\n ? { [REALTIME_VOICE_CAPABILITY_HEADER]: input.capability }\n : {}),\n },\n body: JSON.stringify({\n name: input.name,\n args: input.args,\n callId: input.callId,\n sessionId: input.sessionId,\n browserTabId: input.browserTabId,\n }),\n signal: input.signal,\n });\n if (!response.ok) {\n throw new Error(await readErrorResponse(response));\n }\n return (await response.json()) as RealtimeVoiceToolResult;\n}\n\nfunction jsonByteLength(value: unknown): number {\n return new TextEncoder().encode(JSON.stringify(value)).byteLength;\n}\n\nfunction normalizeRealtimeVoiceFunctionTool(\n value: unknown,\n): RealtimeVoiceFunctionTool | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const record = value as Record<string, unknown>;\n if (\n record.type !== \"function\" ||\n typeof record.name !== \"string\" ||\n !REALTIME_VOICE_TOOL_NAME.test(record.name)\n ) {\n return null;\n }\n if (\n record.description !== undefined &&\n typeof record.description !== \"string\"\n ) {\n return null;\n }\n if (\n record.parameters !== undefined &&\n (!record.parameters ||\n typeof record.parameters !== \"object\" ||\n Array.isArray(record.parameters))\n ) {\n return null;\n }\n try {\n if (jsonByteLength(record) > REALTIME_VOICE_MAX_TOOL_SCHEMA_BYTES) {\n return null;\n }\n return JSON.parse(JSON.stringify(record)) as RealtimeVoiceFunctionTool;\n } catch {\n return null;\n }\n}\n\nexport function extractRealtimeVoiceSessionTools(\n event: RealtimeServerEvent,\n): RealtimeVoiceFunctionTool[] | null {\n if (event.type !== \"session.created\" && event.type !== \"session.updated\") {\n return null;\n }\n const session = event.session;\n if (!session || typeof session !== \"object\") return null;\n const tools = (session as { tools?: unknown }).tools;\n if (!Array.isArray(tools)) return null;\n return tools\n .map(normalizeRealtimeVoiceFunctionTool)\n .filter((tool): tool is RealtimeVoiceFunctionTool => Boolean(tool));\n}\n\nfunction createRealtimeVoiceToolManifestUpdate(\n tools: RealtimeVoiceFunctionTool[],\n eventId?: string,\n): Record<string, unknown> {\n return {\n type: \"session.update\",\n ...(eventId ? { event_id: eventId } : {}),\n session: {\n type: \"realtime\",\n tools,\n tool_choice: \"auto\",\n },\n };\n}\n\n/**\n * Merge search-discovered schemas into the live manifest. Pinned navigation\n * and discovery tools stay available, then the newest discoveries take the\n * remaining slots ahead of lower-priority tools from the original manifest.\n */\nexport function mergeRealtimeVoiceToolManifest(\n currentTools: readonly RealtimeVoiceFunctionTool[],\n expandedTools: readonly RealtimeVoiceFunctionTool[],\n): RealtimeVoiceFunctionTool[] {\n const current = new Map<string, RealtimeVoiceFunctionTool>();\n for (const value of currentTools) {\n const tool = normalizeRealtimeVoiceFunctionTool(value);\n if (tool) current.set(tool.name, tool);\n }\n const expanded = new Map<string, RealtimeVoiceFunctionTool>();\n for (const value of expandedTools) {\n const tool = normalizeRealtimeVoiceFunctionTool(value);\n if (tool) expanded.set(tool.name, tool);\n }\n\n const candidates: RealtimeVoiceFunctionTool[] = [];\n const seen = new Set<string>();\n const add = (tool: RealtimeVoiceFunctionTool | undefined) => {\n if (!tool || seen.has(tool.name)) return;\n seen.add(tool.name);\n candidates.push(tool);\n };\n for (const name of REALTIME_VOICE_PRIORITY_TOOL_NAMES) {\n add(expanded.get(name) ?? current.get(name));\n }\n for (const tool of expanded.values()) add(tool);\n for (const tool of current.values()) add(tool);\n\n const packed: RealtimeVoiceFunctionTool[] = [];\n for (const tool of candidates) {\n if (packed.length >= REALTIME_VOICE_MAX_TOOLS) break;\n const candidate = [...packed, tool];\n if (\n jsonByteLength(\n createRealtimeVoiceToolManifestUpdate(\n candidate,\n \"realtime_tool_manifest_999999999\",\n ),\n ) <= REALTIME_VOICE_MAX_SESSION_BYTES\n ) {\n packed.push(tool);\n }\n }\n return packed;\n}\n\nfunction createRealtimeVoiceToolResultEvent(\n result: RealtimeVoiceToolResult,\n): Record<string, unknown> {\n const modelResult = {\n callId: result.callId,\n status: result.status,\n output: result.output,\n ...(result.approvalKey ? { approvalKey: result.approvalKey } : {}),\n };\n return {\n type: \"conversation.item.create\",\n item: {\n type: \"function_call_output\",\n call_id: result.callId,\n output: JSON.stringify(modelResult),\n },\n };\n}\n\nexport interface RealtimeVoiceToolManifestCoordinator {\n enqueue: (result: RealtimeVoiceToolResult) => void;\n setSessionTools: (tools: readonly RealtimeVoiceFunctionTool[]) => void;\n handleError: (eventId: string | undefined, message?: string) => boolean;\n reset: () => void;\n getTools: () => readonly RealtimeVoiceFunctionTool[];\n}\n\n/**\n * Realtime treats `session.update.tools` as a full replacement. Serialize\n * discovery updates and wait for a confirming `session.updated` manifest\n * before returning the search result and allowing the next model response.\n */\nexport function createRealtimeVoiceToolManifestCoordinator(\n send: (event: Record<string, unknown>) => void,\n timeoutMs = REALTIME_VOICE_TOOL_UPDATE_TIMEOUT_MS,\n): RealtimeVoiceToolManifestCoordinator {\n let currentTools: RealtimeVoiceFunctionTool[] = [];\n const queue: RealtimeVoiceToolResult[] = [];\n let updateSequence = 0;\n let active:\n | {\n result: RealtimeVoiceToolResult;\n expectedNames: string[];\n eventId: string;\n timer: ReturnType<typeof setTimeout>;\n }\n | undefined;\n\n const finish = (failureMessage?: string) => {\n if (!active) return;\n const { result, timer } = active;\n clearTimeout(timer);\n active = undefined;\n send(\n createRealtimeVoiceToolResultEvent(\n failureMessage\n ? {\n callId: result.callId,\n status: \"failed\",\n output: `${failureMessage} The discovered tools were not added to this voice session. Original tool result: ${result.output}`,\n }\n : result,\n ),\n );\n send({ type: \"response.create\" });\n drain();\n };\n\n const drain = () => {\n if (active) return;\n const result = queue.shift();\n if (!result) return;\n const expanded = Array.isArray(result.expandedTools)\n ? result.expandedTools\n .map(normalizeRealtimeVoiceFunctionTool)\n .filter((tool): tool is RealtimeVoiceFunctionTool => Boolean(tool))\n : [];\n if (result.status !== \"completed\" || expanded.length === 0) {\n send(createRealtimeVoiceToolResultEvent(result));\n send({ type: \"response.create\" });\n drain();\n return;\n }\n\n const merged = mergeRealtimeVoiceToolManifest(currentTools, expanded);\n const mergedNames = new Set(merged.map((tool) => tool.name));\n const expectedNames = expanded\n .map((tool) => tool.name)\n .filter((name) => mergedNames.has(name));\n if (expectedNames.length === 0) {\n send(createRealtimeVoiceToolResultEvent(result));\n send({ type: \"response.create\" });\n drain();\n return;\n }\n\n const eventId = `realtime_tool_manifest_${++updateSequence}`;\n active = {\n result,\n expectedNames,\n eventId,\n timer: setTimeout(\n () => finish(\"Timed out while installing the discovered tools.\"),\n timeoutMs,\n ),\n };\n send(createRealtimeVoiceToolManifestUpdate(merged, eventId));\n };\n\n return {\n enqueue(result) {\n queue.push(result);\n drain();\n },\n setSessionTools(tools) {\n currentTools = mergeRealtimeVoiceToolManifest([], tools);\n if (!active) return;\n const names = new Set(currentTools.map((tool) => tool.name));\n if (active.expectedNames.every((name) => names.has(name))) finish();\n },\n handleError(eventId, message) {\n if (!active || !eventId || active.eventId !== eventId) return false;\n finish(message || \"The provider rejected the discovered tool update.\");\n return true;\n },\n reset() {\n if (active) clearTimeout(active.timer);\n active = undefined;\n queue.length = 0;\n currentTools = [];\n },\n getTools() {\n return currentTools;\n },\n };\n}\n\nexport function extractRealtimeVoiceFunctionCalls(\n event: RealtimeServerEvent,\n): Array<{ name: string; callId: string; argumentsText: string }> {\n if (event.type === \"response.function_call_arguments.done\") {\n const name = typeof event.name === \"string\" ? event.name : \"\";\n const callId = typeof event.call_id === \"string\" ? event.call_id : \"\";\n if (!name || !callId) return [];\n return [\n {\n name,\n callId,\n argumentsText:\n typeof event.arguments === \"string\" ? event.arguments : \"{}\",\n },\n ];\n }\n if (event.type !== \"response.done\") return [];\n const response = event.response;\n if (!response || typeof response !== \"object\") return [];\n const output = (response as { output?: unknown }).output;\n if (!Array.isArray(output)) return [];\n return output.flatMap((item) => {\n if (!item || typeof item !== \"object\") return [];\n const record = item as Record<string, unknown>;\n if (record.type !== \"function_call\") return [];\n const name = typeof record.name === \"string\" ? record.name : \"\";\n const callId = typeof record.call_id === \"string\" ? record.call_id : \"\";\n if (!name || !callId) return [];\n return [\n {\n name,\n callId,\n argumentsText:\n typeof record.arguments === \"string\" ? record.arguments : \"{}\",\n },\n ];\n });\n}\n\nfunction parseFunctionArguments(text: string): Record<string, unknown> {\n const parsed = JSON.parse(text || \"{}\");\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"The voice model returned invalid tool arguments.\");\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction sendDataChannelEvent(\n channel: RTCDataChannel | null,\n event: Record<string, unknown>,\n): void {\n if (!channel || channel.readyState !== \"open\") return;\n channel.send(JSON.stringify(event));\n}\n\nfunction openOpenAiKeySettings(): void {\n if (typeof window === \"undefined\") return;\n window.location.hash = \"#secrets:OPENAI_API_KEY\";\n window.dispatchEvent(new Event(\"agent-panel:open\"));\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:open-settings\", {\n detail: { section: \"secrets\" },\n }),\n );\n}\n\nexport function listenForRealtimeVoicePageHide(\n cleanup: () => void,\n): () => void {\n window.addEventListener(\"pagehide\", cleanup);\n return () => window.removeEventListener(\"pagehide\", cleanup);\n}\n\nfunction voiceCopy(t: ReturnType<typeof useT>): RealtimeVoiceModeCopy {\n return {\n entryButtonLabel: t(\"agentPanel.voiceMode.entryButtonLabel\"),\n promptTitle: t(\"agentPanel.voiceMode.promptTitle\"),\n promptDescription: t(\"agentPanel.voiceMode.promptDescription\"),\n setupTitle: t(\"agentPanel.voiceMode.setupTitle\"),\n setupDescription: t(\"agentPanel.voiceMode.setupDescription\"),\n connectBuilder: t(\"agentPanel.voiceMode.connectBuilder\"),\n useOpenAiKey: t(\"agentPanel.voiceMode.useOpenAiKey\"),\n startWithOpenAiKey: t(\"agentPanel.voiceMode.startWithOpenAiKey\"),\n startVoiceMode: t(\"agentPanel.voiceMode.start\"),\n keepDictating: t(\"agentPanel.voiceMode.keepDictating\"),\n showChat: t(\"agentPanel.voiceMode.showChat\"),\n hideChat: t(\"agentPanel.voiceMode.hideChat\"),\n endVoiceMode: t(\"agentPanel.voiceMode.end\"),\n voiceSettings: t(\"agentPanel.voiceMode.voiceSettings\"),\n settings: {\n language: t(\"agentPanel.voiceMode.settings.language\"),\n autoLanguage: t(\"agentPanel.voiceMode.settings.autoLanguage\"),\n languages: {\n en: t(\"agentPanel.voiceMode.settings.languages.en\"),\n es: t(\"agentPanel.voiceMode.settings.languages.es\"),\n fr: t(\"agentPanel.voiceMode.settings.languages.fr\"),\n de: t(\"agentPanel.voiceMode.settings.languages.de\"),\n it: t(\"agentPanel.voiceMode.settings.languages.it\"),\n pt: t(\"agentPanel.voiceMode.settings.languages.pt\"),\n ja: t(\"agentPanel.voiceMode.settings.languages.ja\"),\n ko: t(\"agentPanel.voiceMode.settings.languages.ko\"),\n zh: t(\"agentPanel.voiceMode.settings.languages.zh\"),\n },\n intelligence: t(\"agentPanel.voiceMode.settings.intelligence\"),\n intelligenceLevels: {\n instant: t(\"agentPanel.voiceMode.settings.intelligenceLevels.instant\"),\n balanced: t(\n \"agentPanel.voiceMode.settings.intelligenceLevels.balanced\",\n ),\n deep: t(\"agentPanel.voiceMode.settings.intelligenceLevels.deep\"),\n },\n voiceStyle: t(\"agentPanel.voiceMode.settings.voiceStyle\"),\n microphone: t(\"agentPanel.voiceMode.settings.microphone\"),\n defaultMicrophone: t(\"agentPanel.voiceMode.settings.defaultMicrophone\"),\n microphoneSwitchFailed: t(\n \"agentPanel.voiceMode.settings.microphoneSwitchFailed\",\n ),\n voiceChangePending: t(\"agentPanel.voiceMode.settings.voiceChangePending\"),\n voiceDescriptions: {\n marin: t(\"agentPanel.voiceMode.settings.voiceDescriptions.marin\"),\n cedar: t(\"agentPanel.voiceMode.settings.voiceDescriptions.cedar\"),\n coral: t(\"agentPanel.voiceMode.settings.voiceDescriptions.coral\"),\n sage: t(\"agentPanel.voiceMode.settings.voiceDescriptions.sage\"),\n verse: t(\"agentPanel.voiceMode.settings.voiceDescriptions.verse\"),\n alloy: t(\"agentPanel.voiceMode.settings.voiceDescriptions.alloy\"),\n ash: t(\"agentPanel.voiceMode.settings.voiceDescriptions.ash\"),\n ballad: t(\"agentPanel.voiceMode.settings.voiceDescriptions.ballad\"),\n echo: t(\"agentPanel.voiceMode.settings.voiceDescriptions.echo\"),\n shimmer: t(\"agentPanel.voiceMode.settings.voiceDescriptions.shimmer\"),\n },\n },\n status: {\n connecting: t(\"agentPanel.voiceMode.status.connecting\"),\n listening: t(\"agentPanel.voiceMode.status.listening\"),\n speaking: t(\"agentPanel.voiceMode.status.speaking\"),\n working: t(\"agentPanel.voiceMode.status.working\"),\n error: t(\"agentPanel.voiceMode.status.error\"),\n ending: t(\"agentPanel.voiceMode.status.ending\"),\n },\n errors: {\n unsupported: t(\"agentPanel.voiceMode.errors.unsupported\"),\n responseFailed: t(\"agentPanel.voiceMode.errors.responseFailed\"),\n sessionFailed: t(\"agentPanel.voiceMode.errors.sessionFailed\"),\n channelDisconnected: t(\"agentPanel.voiceMode.errors.channelDisconnected\"),\n connectionTimedOut: t(\"agentPanel.voiceMode.errors.connectionTimedOut\"),\n connectionFailed: t(\"agentPanel.voiceMode.errors.connectionFailed\"),\n offerFailed: t(\"agentPanel.voiceMode.errors.offerFailed\"),\n },\n };\n}\n\nexport function useRealtimeVoiceModeCopy(): RealtimeVoiceModeCopy {\n const t = useT();\n return useMemo(() => voiceCopy(t), [t]);\n}\n\nfunction useRealtimeVoiceModeController(\n browserTabId?: string,\n copy?: RealtimeVoiceModeCopy,\n): RealtimeVoiceModeApi {\n const [state, setState] = useState<\"idle\" | RealtimeVoiceModeState>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n const [chatVisible, setChatVisible] = useState(false);\n const [preferences, setPreferences] = useState(\n DEFAULT_REALTIME_VOICE_PREFERENCES,\n );\n const [voiceChangePending, setVoiceChangePending] = useState(false);\n const [microphones, setMicrophones] = useState<RealtimeVoiceMicrophone[]>([]);\n const [microphoneDeviceId, setMicrophoneDeviceId] = useState(\n readRealtimeVoiceMicrophoneId,\n );\n const [microphoneSwitching, setMicrophoneSwitching] = useState(false);\n const [microphoneError, setMicrophoneError] = useState<string | null>(null);\n const [audioLevels] = useState(createRealtimeVoiceAudioLevelStore);\n const stateRef = useRef(state);\n const preferencesRef = useRef(preferences);\n const hasOutputAudioRef = useRef(false);\n const peerRef = useRef<RTCPeerConnection | null>(null);\n const channelRef = useRef<RTCDataChannel | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const inputAnalyserRef = useRef<AnalyserNode | null>(null);\n const outputAnalyserRef = useRef<AnalyserNode | null>(null);\n const inputMeterBufferRef = useRef<Uint8Array<ArrayBuffer> | null>(null);\n const outputMeterBufferRef = useRef<Uint8Array<ArrayBuffer> | null>(null);\n const inputSourceRef = useRef<MediaStreamAudioSourceNode | null>(null);\n const outputSourceRef = useRef<MediaStreamAudioSourceNode | null>(null);\n const meterFrameRef = useRef<number | null>(null);\n const lastMeterSampleRef = useRef(0);\n const abortRef = useRef<AbortController | null>(null);\n const connectionGateRef = useRef<ReturnType<\n typeof createRealtimeVoiceConnectionGate\n > | null>(null);\n const handledCallsRef = useRef(new Set<string>());\n const sessionIdRef = useRef<string | undefined>(undefined);\n const capabilityRef = useRef<string | undefined>(undefined);\n const transportGenerationRef = useRef(0);\n const startedAtRef = useRef<string | undefined>(undefined);\n const lastUserTextRef = useRef(\"\");\n const lastAssistantTextRef = useRef(\"\");\n const transcriptThreadIdRef = useRef<string | undefined>(undefined);\n const transcriptSequenceRef = useRef(0);\n const preferencesHydratedRef = useRef(false);\n const preferencesEditedRef = useRef(false);\n const preferenceWriteChainRef = useRef<Promise<void>>(Promise.resolve());\n const toolManifestCoordinator = useMemo(\n () =>\n createRealtimeVoiceToolManifestCoordinator((event) => {\n sendDataChannelEvent(channelRef.current, event);\n }),\n [],\n );\n const switchMicrophoneRef = useRef<\n (deviceId: string, force?: boolean) => Promise<void>\n >(async () => undefined);\n\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n useEffect(() => {\n preferencesRef.current = preferences;\n }, [preferences]);\n\n const hydratePreferences = useCallback(async () => {\n if (preferencesHydratedRef.current) return;\n try {\n const stored = await readClientAppState(REALTIME_VOICE_PREFERENCES_KEY);\n if (!preferencesEditedRef.current && stored != null) {\n const next = normalizeRealtimeVoicePreferences(stored);\n preferencesRef.current = next;\n setPreferences(next);\n }\n } catch {\n // Preferences are optional; keep safe defaults when storage is unavailable.\n } finally {\n preferencesHydratedRef.current = true;\n }\n }, []);\n\n const syncAppState = useCallback(\n (nextState: \"idle\" | RealtimeVoiceModeState) => {\n const value =\n nextState === \"idle\"\n ? null\n : {\n active: true,\n status: nextState,\n model: \"gpt-realtime-2.1\",\n startedAt: startedAtRef.current,\n sessionId: sessionIdRef.current,\n browserTabId,\n preferences: preferencesRef.current,\n lastUserText: lastUserTextRef.current || undefined,\n lastAssistantText: lastAssistantTextRef.current || undefined,\n };\n void setClientAppState(REALTIME_VOICE_STATE_KEY, value, {\n requestSource: REALTIME_VOICE_REQUEST_SOURCE,\n }).catch(() => undefined);\n },\n [browserTabId],\n );\n\n const transition = useCallback(\n (nextState: \"idle\" | RealtimeVoiceModeState) => {\n stateRef.current = nextState;\n setState(nextState);\n syncAppState(nextState);\n },\n [syncAppState],\n );\n\n const savePreferences = useCallback((next: RealtimeVoicePreferences) => {\n preferencesEditedRef.current = true;\n preferencesHydratedRef.current = true;\n preferencesRef.current = next;\n setPreferences(next);\n preferenceWriteChainRef.current = preferenceWriteChainRef.current\n .catch(() => undefined)\n .then(async () => {\n await setClientAppState(REALTIME_VOICE_PREFERENCES_KEY, next, {\n requestSource: REALTIME_VOICE_REQUEST_SOURCE,\n });\n })\n .catch(() => undefined);\n }, []);\n\n const updateLivePreferences = useCallback(\n (next: RealtimeVoicePreferences, includeVoice = false) => {\n sendDataChannelEvent(\n channelRef.current,\n createRealtimeVoicePreferenceUpdate(next, {\n browserLanguages:\n typeof navigator === \"undefined\" ? [] : navigator.languages,\n includeVoice,\n }),\n );\n },\n [],\n );\n\n const setLanguage = useCallback(\n (language: RealtimeVoiceLanguage) => {\n const next = { ...preferencesRef.current, language };\n savePreferences(next);\n updateLivePreferences(next);\n },\n [savePreferences, updateLivePreferences],\n );\n\n const setIntelligence = useCallback(\n (intelligence: RealtimeVoiceIntelligence) => {\n const next = { ...preferencesRef.current, intelligence };\n savePreferences(next);\n updateLivePreferences(next);\n },\n [savePreferences, updateLivePreferences],\n );\n\n const setVoice = useCallback(\n (voice: RealtimeVoice) => {\n const next = { ...preferencesRef.current, voice };\n savePreferences(next);\n if (hasOutputAudioRef.current) {\n setVoiceChangePending(true);\n updateLivePreferences(next);\n return;\n }\n setVoiceChangePending(false);\n updateLivePreferences(next, true);\n },\n [savePreferences, updateLivePreferences],\n );\n\n const refreshMicrophones = useCallback(async (): Promise<\n RealtimeVoiceMicrophone[] | null\n > => {\n const mediaDevices = navigator.mediaDevices;\n if (!mediaDevices?.enumerateDevices) return null;\n try {\n const devices = await mediaDevices.enumerateDevices();\n const inputs = devices\n .filter(\n (device) =>\n device.kind === \"audioinput\" &&\n device.deviceId &&\n device.deviceId !== \"default\" &&\n device.deviceId !== \"communications\",\n )\n .map((device, index) => ({\n deviceId: device.deviceId,\n label: device.label || `Microphone ${index + 1}`,\n }));\n setMicrophones(inputs);\n return inputs;\n } catch {\n // Enumeration is progressive enhancement; system default remains usable.\n return null;\n }\n }, []);\n\n const startMeterLoop = useCallback(() => {\n if (meterFrameRef.current !== null) return;\n const sample = (timestamp: number) => {\n meterFrameRef.current = requestAnimationFrame(sample);\n if (timestamp - lastMeterSampleRef.current < 50) return;\n lastMeterSampleRef.current = timestamp;\n\n const current = audioLevels.getSnapshot();\n let input = current.input;\n let output = current.output;\n const inputAnalyser = inputAnalyserRef.current;\n const inputBuffer = inputMeterBufferRef.current;\n if (inputAnalyser && inputBuffer) {\n inputAnalyser.getByteTimeDomainData(inputBuffer);\n input = smoothRealtimeVoiceLevel(\n input,\n normalizeRealtimeVoiceRms(inputBuffer),\n );\n }\n const outputAnalyser = outputAnalyserRef.current;\n const outputBuffer = outputMeterBufferRef.current;\n if (outputAnalyser && outputBuffer) {\n outputAnalyser.getByteTimeDomainData(outputBuffer);\n output = smoothRealtimeVoiceLevel(\n output,\n normalizeRealtimeVoiceRms(outputBuffer),\n );\n }\n audioLevels.set({ input, output });\n };\n meterFrameRef.current = requestAnimationFrame(sample);\n }, [audioLevels]);\n\n const attachAudioMeter = useCallback(\n (stream: MediaStream, channel: \"input\" | \"output\") => {\n try {\n const AudioCtor =\n window.AudioContext ??\n (\n window as typeof window & {\n webkitAudioContext?: typeof AudioContext;\n }\n ).webkitAudioContext;\n if (!AudioCtor) return;\n const context = audioContextRef.current ?? new AudioCtor();\n audioContextRef.current = context;\n void context.resume().catch(() => undefined);\n const analyser = context.createAnalyser();\n analyser.fftSize = 512;\n const source = context.createMediaStreamSource(stream);\n source.connect(analyser);\n const buffer = new Uint8Array(analyser.frequencyBinCount);\n if (channel === \"input\") {\n inputSourceRef.current?.disconnect();\n inputSourceRef.current = source;\n inputAnalyserRef.current = analyser;\n inputMeterBufferRef.current = buffer;\n } else {\n outputSourceRef.current?.disconnect();\n outputSourceRef.current = source;\n outputAnalyserRef.current = analyser;\n outputMeterBufferRef.current = buffer;\n }\n startMeterLoop();\n } catch {\n // Audio metering is visual-only; keep the realtime call healthy.\n }\n },\n [startMeterLoop],\n );\n\n const setMicrophone = useCallback(\n async (deviceId: string, force = false) => {\n if ((!force && deviceId === microphoneDeviceId) || microphoneSwitching) {\n return;\n }\n const mediaDevices = navigator.mediaDevices;\n const peer = peerRef.current;\n if (!mediaDevices?.getUserMedia || !peer) return;\n\n setMicrophoneSwitching(true);\n setMicrophoneError(null);\n try {\n const replacementStream = await replaceRealtimeVoiceMicrophone({\n mediaDevices,\n peer,\n currentStream: streamRef.current,\n deviceId,\n });\n const replacementTrack = replacementStream.getAudioTracks()[0];\n streamRef.current = replacementStream;\n if (replacementTrack) {\n replacementTrack.onended = () => {\n void switchMicrophoneRef.current(\"default\", true);\n };\n }\n attachAudioMeter(streamRef.current, \"input\");\n writeRealtimeVoiceMicrophoneId(deviceId);\n setMicrophoneDeviceId(deviceId);\n await refreshMicrophones();\n } catch {\n setMicrophoneError(\n copy?.settings.microphoneSwitchFailed ??\n \"Could not switch microphones. Your current microphone is still active.\",\n );\n } finally {\n setMicrophoneSwitching(false);\n }\n },\n [\n attachAudioMeter,\n copy,\n microphoneDeviceId,\n microphoneSwitching,\n refreshMicrophones,\n ],\n );\n switchMicrophoneRef.current = setMicrophone;\n\n const cleanupTransport = useCallback(() => {\n connectionGateRef.current?.cancel();\n connectionGateRef.current = null;\n transportGenerationRef.current += 1;\n capabilityRef.current = undefined;\n abortRef.current?.abort();\n abortRef.current = null;\n channelRef.current?.close();\n channelRef.current = null;\n peerRef.current?.close();\n peerRef.current = null;\n for (const track of streamRef.current?.getTracks() ?? []) {\n track.onended = null;\n track.stop();\n }\n streamRef.current = null;\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current.srcObject = null;\n }\n audioRef.current = null;\n if (meterFrameRef.current !== null) {\n cancelAnimationFrame(meterFrameRef.current);\n meterFrameRef.current = null;\n }\n inputSourceRef.current?.disconnect();\n outputSourceRef.current?.disconnect();\n inputSourceRef.current = null;\n outputSourceRef.current = null;\n inputAnalyserRef.current = null;\n outputAnalyserRef.current = null;\n inputMeterBufferRef.current = null;\n outputMeterBufferRef.current = null;\n lastMeterSampleRef.current = 0;\n const audioContext = audioContextRef.current;\n audioContextRef.current = null;\n if (audioContext) void audioContext.close().catch(() => undefined);\n audioLevels.reset();\n handledCallsRef.current.clear();\n toolManifestCoordinator.reset();\n }, [audioLevels, toolManifestCoordinator]);\n\n const fail = useCallback(\n (message: string, options?: { openKeySettings?: boolean }) => {\n cleanupTransport();\n setError(message);\n transition(\"error\");\n if (options?.openKeySettings) openOpenAiKeySettings();\n },\n [cleanupTransport, transition],\n );\n\n const handleFunctionCall = useCallback(\n async (call: { name: string; callId: string; argumentsText: string }) => {\n if (handledCallsRef.current.has(call.callId)) return;\n handledCallsRef.current.add(call.callId);\n const transportGeneration = transportGenerationRef.current;\n const transportChannel = channelRef.current;\n transition(\"working\");\n let result: RealtimeVoiceToolResult;\n try {\n const args = parseFunctionArguments(call.argumentsText);\n result = await executeRealtimeVoiceTool({\n name: call.name,\n args,\n callId: call.callId,\n sessionId: sessionIdRef.current,\n browserTabId,\n capability: capabilityRef.current,\n signal: abortRef.current?.signal,\n });\n } catch (toolError) {\n result = {\n callId: call.callId,\n status: \"failed\",\n output: errorMessage(toolError),\n };\n }\n if (\n transportGeneration !== transportGenerationRef.current ||\n channelRef.current !== transportChannel\n ) {\n return;\n }\n toolManifestCoordinator.enqueue(result);\n },\n [browserTabId, toolManifestCoordinator, transition],\n );\n\n const publishCompletedTranscript = useCallback(\n (transcript: CompletedRealtimeVoiceTranscript) => {\n const threadId = transcriptThreadIdRef.current;\n if (!threadId) return;\n const sessionIdentity =\n sessionIdRef.current ?? startedAtRef.current ?? \"pending\";\n const providerIdentity =\n transcript.providerId ?? `sequence-${++transcriptSequenceRef.current}`;\n realtimeVoiceTranscriptRegistry.publish({\n id: `realtime-voice:${sessionIdentity}:${transcript.role}:${providerIdentity}`,\n threadId,\n role: transcript.role,\n text: transcript.text,\n createdAt: new Date().toISOString(),\n });\n },\n [],\n );\n\n const transcriptSequencer = useMemo(\n () => createRealtimeVoiceTranscriptSequencer(publishCompletedTranscript),\n [publishCompletedTranscript],\n );\n const greetingStarter = useMemo(\n () =>\n createRealtimeVoiceGreetingStarter((event) => {\n sendDataChannelEvent(channelRef.current, event);\n }),\n [],\n );\n\n const handleServerEvent = useCallback(\n (event: RealtimeServerEvent) => {\n transcriptSequencer.handle(event);\n const sessionTools = extractRealtimeVoiceSessionTools(event);\n if (sessionTools) toolManifestCoordinator.setSessionTools(sessionTools);\n if (event.type === \"session.created\") {\n connectionGateRef.current?.markSessionCreated();\n connectionGateRef.current = null;\n const session = event.session;\n if (session && typeof session === \"object\") {\n const id = (session as { id?: unknown }).id;\n if (typeof id === \"string\") sessionIdRef.current = id;\n }\n updateLivePreferences(preferencesRef.current, true);\n greetingStarter.start();\n transition(\"working\");\n } else if (event.type === \"input_audio_buffer.speech_started\") {\n transition(\"listening\");\n } else if (event.type === \"input_audio_buffer.speech_stopped\") {\n transition(\"working\");\n } else if (event.type === \"response.created\") {\n // From this point onward the response is committed to audio output, so\n // changing voices risks violating Realtime's per-session voice lock.\n hasOutputAudioRef.current = true;\n lastAssistantTextRef.current = \"\";\n transition(\"working\");\n } else if (event.type === \"response.output_audio_transcript.delta\") {\n hasOutputAudioRef.current = true;\n if (typeof event.delta === \"string\") {\n lastAssistantTextRef.current += event.delta;\n }\n transition(\"speaking\");\n } else if (event.type === \"response.output_audio_transcript.done\") {\n if (typeof event.transcript === \"string\") {\n lastAssistantTextRef.current = event.transcript;\n }\n syncAppState(\"speaking\");\n } else if (\n event.type === \"conversation.item.input_audio_transcription.completed\"\n ) {\n if (typeof event.transcript === \"string\") {\n lastUserTextRef.current = event.transcript;\n }\n syncAppState(\"working\");\n } else if (event.type === \"response.done\") {\n const response = event.response;\n const status =\n response && typeof response === \"object\"\n ? (response as { status?: unknown }).status\n : undefined;\n if (status === \"failed\") {\n fail(\n copy?.errors.responseFailed ??\n \"OpenAI could not complete the voice response.\",\n );\n return;\n }\n } else if (event.type === \"error\") {\n const detail = event.error;\n const message =\n detail && typeof detail === \"object\"\n ? String((detail as { message?: unknown }).message ?? \"\")\n : typeof detail === \"string\"\n ? detail\n : \"\";\n const expansionEventId =\n detail && typeof detail === \"object\"\n ? ((detail as { event_id?: unknown }).event_id ?? event.event_id)\n : event.event_id;\n if (\n toolManifestCoordinator.handleError(\n typeof expansionEventId === \"string\" ? expansionEventId : undefined,\n message,\n )\n ) {\n return;\n }\n fail(\n message ||\n copy?.errors.sessionFailed ||\n \"The realtime voice session encountered an error.\",\n );\n return;\n }\n\n const calls = extractRealtimeVoiceFunctionCalls(event);\n for (const call of calls) void handleFunctionCall(call);\n if (event.type === \"response.done\" && calls.length === 0) {\n transition(\"listening\");\n }\n },\n [\n copy,\n fail,\n greetingStarter,\n handleFunctionCall,\n syncAppState,\n transcriptSequencer,\n transition,\n toolManifestCoordinator,\n updateLivePreferences,\n ],\n );\n\n const start = useCallback(async () => {\n if (stateRef.current !== \"idle\") return;\n if (\n typeof RTCPeerConnection === \"undefined\" ||\n !navigator.mediaDevices?.getUserMedia\n ) {\n fail(\n copy?.errors.unsupported ??\n \"This browser does not support realtime voice conversations.\",\n );\n return;\n }\n setError(null);\n startedAtRef.current = new Date().toISOString();\n lastUserTextRef.current = \"\";\n lastAssistantTextRef.current = \"\";\n sessionIdRef.current = undefined;\n hasOutputAudioRef.current = false;\n greetingStarter.reset();\n setVoiceChangePending(false);\n transcriptThreadIdRef.current =\n realtimeVoiceTranscriptRegistry.activeThreadId();\n transcriptSequenceRef.current = 0;\n transcriptSequencer.reset();\n transition(\"connecting\");\n setChatVisible(false);\n window.dispatchEvent(new Event(\"agent-panel:close\"));\n\n await hydratePreferences();\n if ((stateRef.current as string) !== \"connecting\") return;\n\n const abortController = new AbortController();\n abortRef.current = abortController;\n const isCurrentAttempt = () =>\n abortRef.current === abortController && !abortController.signal.aborted;\n const connectionGate = createRealtimeVoiceConnectionGate(() => {\n if (!isCurrentAttempt()) return;\n fail(\n copy?.errors.connectionTimedOut ??\n \"The realtime voice connection timed out.\",\n );\n });\n connectionGateRef.current = connectionGate;\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: createRealtimeVoiceAudioConstraints(\n readRealtimeVoiceMicrophoneId(),\n ),\n });\n if (!isCurrentAttempt()) {\n for (const track of stream.getTracks()) track.stop();\n return;\n }\n streamRef.current = stream;\n for (const track of stream.getAudioTracks()) {\n track.onended = () => {\n void switchMicrophoneRef.current(\"default\", true);\n };\n }\n attachAudioMeter(stream, \"input\");\n void refreshMicrophones().then((inputs) => {\n const selected = readRealtimeVoiceMicrophoneId();\n if (\n inputs &&\n selected !== \"default\" &&\n !inputs.some((device) => device.deviceId === selected)\n ) {\n // The persisted device was only an ideal preference, so getUserMedia\n // already selected a usable fallback for this new session.\n writeRealtimeVoiceMicrophoneId(\"default\");\n setMicrophoneDeviceId(\"default\");\n }\n });\n\n const peer = new RTCPeerConnection();\n peerRef.current = peer;\n for (const track of stream.getAudioTracks()) peer.addTrack(track, stream);\n\n const audio = document.createElement(\"audio\");\n audio.autoplay = true;\n audio.setAttribute(\"playsinline\", \"\");\n audioRef.current = audio;\n peer.ontrack = (trackEvent) => {\n const remoteStream = trackEvent.streams[0] ?? null;\n audio.srcObject = remoteStream;\n if (remoteStream) attachAudioMeter(remoteStream, \"output\");\n void audio.play().catch(() => undefined);\n };\n\n const channel = peer.createDataChannel(\"oai-events\");\n channelRef.current = channel;\n channel.onopen = connectionGate.markTransportReady;\n channel.onmessage = (messageEvent) => {\n if (!isCurrentAttempt()) return;\n try {\n handleServerEvent(JSON.parse(String(messageEvent.data)));\n } catch {\n // Ignore malformed provider events without ending a healthy call.\n }\n };\n channel.onerror = () => {\n if (!isCurrentAttempt()) return;\n fail(\n copy?.errors.channelDisconnected ??\n \"The realtime voice control channel disconnected.\",\n );\n };\n peer.onconnectionstatechange = () => {\n if (!isCurrentAttempt()) return;\n if (peer.connectionState === \"connected\") {\n connectionGate.markTransportReady();\n }\n if (peer.connectionState === \"failed\") {\n fail(\n copy?.errors.connectionFailed ??\n \"The realtime voice connection failed.\",\n );\n }\n };\n\n const offer = await peer.createOffer();\n if (!isCurrentAttempt()) return;\n await peer.setLocalDescription(offer);\n if (!isCurrentAttempt()) return;\n if (!offer.sdp) {\n throw new Error(\n copy?.errors.offerFailed ??\n \"The browser did not create an audio offer.\",\n );\n }\n const answer = await createRealtimeVoiceSessionWithCapability(offer.sdp, {\n browserTabId,\n signal: abortController.signal,\n preferences: preferencesRef.current,\n browserLanguages: navigator.languages,\n });\n if (!isCurrentAttempt()) return;\n capabilityRef.current = answer.capability;\n await peer.setRemoteDescription({ type: \"answer\", sdp: answer.sdp });\n } catch (startError) {\n // Ending a connection aborts the SDP request by design. A superseded\n // attempt must never resurrect the dock or surface that cancellation as\n // an error after cleanup.\n if (\n isRealtimeVoiceAbortError(startError) ||\n abortController.signal.aborted ||\n abortRef.current !== abortController\n ) {\n return;\n }\n if (isRealtimeVoiceSetupRequiredError(startError)) {\n // Credentials can disappear after the entry-point status check. Treat\n // the authoritative setup response as a gate, not as an active voice\n // session failure: clean up the mic/RTC attempt, reopen chat, and\n // refresh both the chat and voice provider setup surfaces.\n cleanupTransport();\n setError(null);\n startedAtRef.current = undefined;\n sessionIdRef.current = undefined;\n transcriptThreadIdRef.current = undefined;\n transition(\"idle\");\n setChatVisible(true);\n window.dispatchEvent(new Event(\"agent-panel:open\"));\n window.dispatchEvent(new Event(\"agent-engine:configured-changed\"));\n return;\n }\n const status = (startError as { status?: unknown })?.status;\n fail(errorMessage(startError), { openKeySettings: status === 400 });\n }\n }, [\n attachAudioMeter,\n browserTabId,\n cleanupTransport,\n copy,\n fail,\n greetingStarter,\n handleServerEvent,\n hydratePreferences,\n refreshMicrophones,\n transcriptSequencer,\n transition,\n ]);\n\n const end = useCallback(() => {\n if (stateRef.current === \"idle\" || stateRef.current === \"ending\") return;\n const transcriptThreadId = transcriptThreadIdRef.current;\n const activeThreadId = realtimeVoiceTranscriptRegistry.activeThreadId();\n transition(\"ending\");\n cleanupTransport();\n setError(null);\n sessionIdRef.current = undefined;\n startedAtRef.current = undefined;\n transcriptThreadIdRef.current = undefined;\n setChatVisible(true);\n if (\n shouldRestoreRealtimeVoiceTranscriptThread(\n transcriptThreadId,\n activeThreadId,\n )\n ) {\n requestAgentChatThreadOpen({\n threadId: transcriptThreadId,\n // The request is delivered asynchronously. Re-checking this at the\n // receiver prevents a navigation that happened during that gap from\n // being overwritten.\n onlyIfActiveThreadId: transcriptThreadId,\n });\n } else {\n window.dispatchEvent(new Event(\"agent-panel:open\"));\n }\n transition(\"idle\");\n }, [cleanupTransport, transition]);\n\n const toggleChat = useCallback(() => {\n setChatVisible((current) => !current);\n window.dispatchEvent(new Event(\"agent-panel:toggle\"));\n }, []);\n\n useEffect(() => {\n const mediaDevices = navigator.mediaDevices;\n if (!mediaDevices?.addEventListener) return;\n const handleDeviceChange = () => {\n const selected = readRealtimeVoiceMicrophoneId();\n void refreshMicrophones().then((inputs) => {\n if (\n inputs &&\n selected !== \"default\" &&\n !inputs.some((device) => device.deviceId === selected)\n ) {\n void setMicrophone(\"default\");\n }\n });\n };\n mediaDevices.addEventListener(\"devicechange\", handleDeviceChange);\n return () =>\n mediaDevices.removeEventListener(\"devicechange\", handleDeviceChange);\n }, [refreshMicrophones, setMicrophone]);\n\n useEffect(() => {\n const onSidebarState = (event: Event) => {\n const detail = (event as CustomEvent<AgentSidebarStateChangeDetail>)\n .detail;\n if (detail && typeof detail.open === \"boolean\") {\n setChatVisible(detail.open);\n }\n };\n window.addEventListener(SIDEBAR_STATE_CHANGE_EVENT, onSidebarState);\n return () =>\n window.removeEventListener(SIDEBAR_STATE_CHANGE_EVENT, onSidebarState);\n }, []);\n\n useEffect(() => {\n const stopListening = listenForRealtimeVoicePageHide(cleanupTransport);\n return () => {\n stopListening();\n cleanupTransport();\n };\n }, [cleanupTransport]);\n\n return {\n state,\n active: state !== \"idle\",\n errorMessage: error,\n chatVisible,\n audioLevels,\n preferences,\n microphones,\n microphoneDeviceId,\n microphoneSwitching,\n microphoneError,\n voiceChangePending,\n setLanguage,\n setIntelligence,\n setVoice,\n setMicrophone,\n start,\n end,\n toggleChat,\n };\n}\n\nconst RealtimeVoiceModeContext = createContext<RealtimeVoiceModeApi | null>(\n null,\n);\n\nexport function RealtimeVoiceModeProvider({\n children,\n browserTabId,\n}: RealtimeVoiceModeProviderProps) {\n const resolvedBrowserTabId = useMemo(\n () => browserTabId ?? getBrowserTabId(),\n [browserTabId],\n );\n const copy = useRealtimeVoiceModeCopy();\n const voice = useRealtimeVoiceModeController(resolvedBrowserTabId, copy);\n const inlineSettings = useMemo(\n () => ({\n dialogLabel: copy.voiceSettings,\n ...(voice.voiceChangePending\n ? { appliesNextConversationNote: copy.settings.voiceChangePending }\n : {}),\n ...(voice.microphoneError\n ? { microphoneError: voice.microphoneError }\n : {}),\n microphone: {\n label: copy.settings.microphone,\n value: voice.microphoneDeviceId,\n disabled: voice.microphoneSwitching,\n options: [\n {\n value: \"default\",\n label: copy.settings.defaultMicrophone,\n },\n ...voice.microphones.map((microphone) => ({\n value: microphone.deviceId,\n label: microphone.label,\n })),\n ],\n onValueChange: (value: string) => {\n void voice.setMicrophone(value);\n },\n },\n language: {\n label: copy.settings.language,\n value: voice.preferences.language,\n options: REALTIME_VOICE_LANGUAGES.map((language) => ({\n value: language,\n label:\n language === \"auto\"\n ? copy.settings.autoLanguage\n : copy.settings.languages[language],\n })),\n onValueChange: (value: string) => {\n if (isOneOf(REALTIME_VOICE_LANGUAGES, value)) {\n voice.setLanguage(value);\n }\n },\n },\n intelligence: {\n label: copy.settings.intelligence,\n value: voice.preferences.intelligence,\n options: REALTIME_VOICE_INTELLIGENCE_LEVELS.map((intelligence) => ({\n value: intelligence,\n label: copy.settings.intelligenceLevels[intelligence],\n })),\n onValueChange: (value: string) => {\n if (isOneOf(REALTIME_VOICE_INTELLIGENCE_LEVELS, value)) {\n voice.setIntelligence(value);\n }\n },\n },\n voiceStyle: {\n label: copy.settings.voiceStyle,\n value: voice.preferences.voice,\n options: REALTIME_VOICES.map((voiceName) => ({\n value: voiceName,\n label: `${voiceName[0]!.toUpperCase()}${voiceName.slice(1)}`,\n description: copy.settings.voiceDescriptions[voiceName],\n })),\n onValueChange: (value: string) => {\n if (isOneOf(REALTIME_VOICES, value)) voice.setVoice(value);\n },\n },\n }),\n [copy, voice],\n );\n\n return (\n <RealtimeVoiceModeContext.Provider value={voice}>\n {children}\n {voice.active && typeof document !== \"undefined\"\n ? createPortal(\n <RealtimeVoiceModeDock\n state={voice.state === \"idle\" ? \"ending\" : voice.state}\n copy={copy}\n chatVisible={voice.chatVisible}\n audioLevels={voice.audioLevels}\n onToggleChat={voice.toggleChat}\n onEndVoiceMode={voice.end}\n settings={inlineSettings}\n errorMessage={voice.errorMessage}\n />,\n document.body,\n )\n : null}\n </RealtimeVoiceModeContext.Provider>\n );\n}\n\n/**\n * Ensure standalone/full-page composers get realtime voice without nesting a\n * second session owner inside the persistent AgentSidebar provider.\n */\nexport function RealtimeVoiceModeBoundary({\n children,\n browserTabId,\n}: RealtimeVoiceModeProviderProps) {\n const existing = useRealtimeVoiceModeOptional();\n if (existing) {\n return (\n <RealtimeVoiceModeComposerSurface>\n {children}\n </RealtimeVoiceModeComposerSurface>\n );\n }\n return (\n <RealtimeVoiceModeProvider browserTabId={browserTabId}>\n <RealtimeVoiceModeComposerSurface>\n {children}\n </RealtimeVoiceModeComposerSurface>\n </RealtimeVoiceModeProvider>\n );\n}\n\n/** Hide a composer while voice owns input; the dock can reveal it on demand. */\nfunction RealtimeVoiceModeComposerSurface({\n children,\n}: Pick<RealtimeVoiceModeProviderProps, \"children\">) {\n const voice = useRealtimeVoiceModeOptional();\n if (voice?.active && !voice.chatVisible) return null;\n return children;\n}\n\nexport function useRealtimeVoiceMode(): RealtimeVoiceModeApi {\n const value = useContext(RealtimeVoiceModeContext);\n if (!value) {\n throw new Error(\n \"useRealtimeVoiceMode must be used inside RealtimeVoiceModeProvider.\",\n );\n }\n return value;\n}\n\nexport function useRealtimeVoiceModeOptional(): RealtimeVoiceModeApi | null {\n return useContext(RealtimeVoiceModeContext);\n}\n\nexport async function readRealtimeVoiceContext(): Promise<{\n navigation: unknown;\n url: unknown;\n}> {\n const [navigation, url] = await Promise.all([\n readClientAppState(\"navigation\").catch(() => null),\n readClientAppState(\"__url__\").catch(() => null),\n ]);\n return { navigation, url };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ContextXRayPanel.d.ts","sourceRoot":"","sources":["../../../src/client/context-xray/ContextXRayPanel.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,eAAe,EAEf,oBAAoB,EACrB,MAAM,8BAA8B,CAAC;AA8DtC,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,UAAU,EACV,KAAK,EACL,OAAO,EACP,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC9C,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,+BAoKA"}
1
+ {"version":3,"file":"ContextXRayPanel.d.ts","sourceRoot":"","sources":["../../../src/client/context-xray/ContextXRayPanel.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,eAAe,EAEf,oBAAoB,EACrB,MAAM,8BAA8B,CAAC;AA8DtC,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,UAAU,EACV,KAAK,EACL,OAAO,EACP,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC9C,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,+BAuKA"}
@@ -64,7 +64,10 @@ export function ContextXRayPanel({ manifest, optimistic, onPin, onEvict, onResto
64
64
  manifest.tokenCountMethod === "estimate" ? "estimated" : null,
65
65
  !manifest.enforceable ? "advisory" : null,
66
66
  ].filter((item) => Boolean(item));
67
- return (_jsxs("div", { className: "flex max-h-[min(72vh,520px)] flex-col", children: [_jsxs("div", { className: "border-b border-border/60 px-3 py-2.5", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx("h2", { className: "min-w-0 truncate text-sm font-medium text-foreground", children: "Context X-Ray" }), _jsxs("div", { className: "shrink-0 text-xs tabular-nums text-muted-foreground", children: [formatTokens(manifest.totalTokens), " \u00B7 ", pct, "%"] })] }), _jsx("div", { className: "mt-2 h-1 overflow-hidden rounded-full bg-muted/70", children: _jsx("div", { className: "h-full rounded-full bg-foreground transition-[width] duration-200", style: { width: `${pct}%` } }) }), _jsxs("div", { className: "mt-1.5 flex flex-wrap items-center gap-x-2 gap-y-1 text-[11px] text-muted-foreground", children: [details.map((detail) => (_jsx("span", { children: detail }, detail))), manifest.reclaimedTokens > 0 && (_jsxs("span", { className: "font-medium text-emerald-600 dark:text-emerald-400", children: ["-", formatTokens(manifest.reclaimedTokens)] }))] })] }), _jsxs("div", { className: "overflow-y-auto px-2 py-2", children: [_jsx("div", { className: "mb-1 flex items-center justify-end", children: _jsxs("div", { className: "inline-flex rounded-md bg-muted/40 p-0.5", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => setMode("list"), "aria-label": "Show context list", className: cn("flex size-7 items-center justify-center rounded text-muted-foreground", mode === "list"
67
+ return (_jsxs("div", { className: "flex max-h-[min(72vh,520px)] flex-col", children: [_jsxs("div", { className: "border-b border-border/60 px-3 py-2.5", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx("h2", { className: "min-w-0 truncate text-sm font-medium text-foreground", children: "Context X-Ray" }), _jsxs("div", { className: "shrink-0 text-xs tabular-nums text-muted-foreground", children: [formatTokens(manifest.totalTokens), " \u00B7 ", pct, "%"] })] }), _jsx("div", { className: "mt-2 h-1 overflow-hidden rounded-full bg-muted/70", children: _jsx("div", { className: "h-full rounded-full bg-foreground origin-left transition-transform duration-200", style: {
68
+ transform: `scaleX(${Math.min(1, pct / 100)})`,
69
+ width: "100%",
70
+ } }) }), _jsxs("div", { className: "mt-1.5 flex flex-wrap items-center gap-x-2 gap-y-1 text-[11px] text-muted-foreground", children: [details.map((detail) => (_jsx("span", { children: detail }, detail))), manifest.reclaimedTokens > 0 && (_jsxs("span", { className: "font-medium text-emerald-600 dark:text-emerald-400", children: ["-", formatTokens(manifest.reclaimedTokens)] }))] })] }), _jsxs("div", { className: "overflow-y-auto px-2 py-2", children: [_jsx("div", { className: "mb-1 flex items-center justify-end", children: _jsxs("div", { className: "inline-flex rounded-md bg-muted/40 p-0.5", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => setMode("list"), "aria-label": "Show context list", className: cn("flex size-7 items-center justify-center rounded text-muted-foreground", mode === "list"
68
71
  ? "bg-background text-foreground shadow-sm"
69
72
  : "hover:text-foreground"), children: _jsx(IconListDetails, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "List" })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => setMode("map"), "aria-label": "Show context map", className: cn("flex size-7 items-center justify-center rounded text-muted-foreground", mode === "map"
70
73
  ? "bg-background text-foreground shadow-sm"
@@ -1 +1 @@
1
- {"version":3,"file":"ContextXRayPanel.js","sourceRoot":"","sources":["../../../src/client/context-xray/ContextXRayPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAO1C,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAQ7E,SAAS,qBAAqB,CAC5B,QAAkC,EAClC,UAA6C;IAE7C,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3C,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,QAAkC;IACzD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAiB,CAAC;IACrC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,SAAS,GACb,OAAO,CAAC,MAAM,KAAK,QAAQ;YACzB,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS;gBAC5B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QACtB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI;YAClC,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,CAAC;YACT,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC;QACnC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,KAAK,GAAG;QACZ,QAAQ;QACR,cAAc;QACd,YAAY;QACZ,cAAc;QACd,UAAU;QACV,SAAS;KACV,CAAC;IACF,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;YAAE,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAC/B,QAAQ,EACR,UAAU,EACV,KAAK,EACL,OAAO,EACP,SAAS,GAOV;IACC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAiB,MAAM,CAAC,CAAC;IACzD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,EAC1D,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAChC,CAAC;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpE,MAAM,aAAa,GAAG,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB,GAAG,EACH,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CACzD,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACpE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IACtE,MAAM,OAAO,GAAG;QACd,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO;QAChC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,IAAI;QACtC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI;QACzC,QAAQ,CAAC,gBAAgB,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;QAC7D,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;KAC1C,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAElD,OAAO,CACL,eAAK,SAAS,EAAC,uCAAuC,aACpD,eAAK,SAAS,EAAC,uCAAuC,aACpD,eAAK,SAAS,EAAC,yCAAyC,aACtD,aAAI,SAAS,EAAC,sDAAsD,8BAE/D,EACL,eAAK,SAAS,EAAC,qDAAqD,aACjE,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,cAAK,GAAG,SACvC,IACF,EACN,cAAK,SAAS,EAAC,mDAAmD,YAChE,cACE,SAAS,EAAC,mEAAmE,EAC7E,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,GAC3B,GACE,EACN,eAAK,SAAS,EAAC,sFAAsF,aAClG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,yBAAoB,MAAM,IAAf,MAAM,CAAiB,CACnC,CAAC,EACD,QAAQ,CAAC,eAAe,GAAG,CAAC,IAAI,CAC/B,gBAAM,SAAS,EAAC,oDAAoD,kBAChE,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,IACnC,CACR,IACG,IACF,EAEN,eAAK,SAAS,EAAC,2BAA2B,aACxC,cAAK,SAAS,EAAC,oCAAoC,YACjD,eAAK,SAAS,EAAC,0CAA0C,aACvD,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,gBACnB,mBAAmB,EAC9B,SAAS,EAAE,EAAE,CACX,uEAAuE,EACvE,IAAI,KAAK,MAAM;oDACb,CAAC,CAAC,yCAAyC;oDAC3C,CAAC,CAAC,uBAAuB,CAC5B,YAED,KAAC,eAAe,IAAC,SAAS,EAAC,aAAa,GAAG,GACpC,GACM,EACjB,KAAC,cAAc,uBAAsB,IAC7B,EACV,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,gBAClB,kBAAkB,EAC7B,SAAS,EAAE,EAAE,CACX,uEAAuE,EACvE,IAAI,KAAK,KAAK;oDACZ,CAAC,CAAC,yCAAyC;oDAC3C,CAAC,CAAC,uBAAuB,CAC5B,YAED,KAAC,gBAAgB,IAAC,SAAS,EAAC,aAAa,GAAG,GACrC,GACM,EACjB,KAAC,cAAc,sBAAqB,IAC5B,IACN,GACF,EAEL,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAChB,KAAC,cAAc,IACb,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE;4BACtB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;4BAChE,IAAI,OAAO;gCAAE,YAAY,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;wBACvC,CAAC,GACD,CACH,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,2BAA2B,YACvC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;4BACpB,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;4BAC9C,OAAO,CACL,0BACE,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE;4CACZ,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;gDACpB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;gDAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oDAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;;oDAC7C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gDAC1B,OAAO,IAAI,CAAC;4CACd,CAAC,CAAC,CAAC;wCACL,CAAC,EACD,SAAS,EAAC,oFAAoF,aAE7F,WAAW,CAAC,CAAC,CAAC,CACb,KAAC,gBAAgB,IAAC,SAAS,EAAC,mCAAmC,GAAG,CACnE,CAAC,CAAC,CAAC,CACF,KAAC,eAAe,IAAC,SAAS,EAAC,mCAAmC,GAAG,CAClE,EACD,eACE,SAAS,EAAE,EAAE,CACX,sBAAsB,EACtB,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CACvB,GACD,EACF,eAAM,SAAS,EAAC,6CAA6C,YAC1D,KAAK,CAAC,IAAI,GACN,EACP,eAAM,SAAS,EAAC,mCAAmC,YAChD,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,GACtB,IACA,EACR,CAAC,WAAW,IAAI,CACf,cAAK,SAAS,EAAC,MAAM,YAClB,KAAK,CAAC,QAAQ;6CACZ,KAAK,EAAE;6CACP,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;6CAC3C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAChB,KAAC,iBAAiB,IAEhB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,EAC/B,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EACrC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EACzC,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,IALxC,OAAO,CAAC,SAAS,CAMtB,CACH,CAAC,GACA,CACP,KA/CO,KAAK,CAAC,IAAI,CAgDd,CACP,CAAC;wBACJ,CAAC,CAAC,GACE,CACP,IACG,IACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["import {\n IconChartTreemap,\n IconChevronDown,\n IconChevronRight,\n IconListDetails,\n} from \"@tabler/icons-react\";\nimport { useMemo, useState } from \"react\";\n\nimport type {\n ContextManifest,\n ContextManifestSegment,\n ContextSegmentStatus,\n} from \"../../shared/context-xray.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { cn } from \"../utils.js\";\nimport { ContextSegmentRow } from \"./ContextSegmentRow.js\";\nimport { ContextTreemap } from \"./ContextTreemap.js\";\nimport { formatTokens, groupColor, resolveContextWindow } from \"./format.js\";\n\ninterface Group {\n name: string;\n tokens: number;\n segments: ContextManifestSegment[];\n}\n\nfunction applyOptimisticStatus(\n segments: ContextManifestSegment[],\n optimistic: Map<string, ContextSegmentStatus>,\n): ContextManifestSegment[] {\n if (optimistic.size === 0) return segments;\n return segments.map((segment) => {\n const status = optimistic.get(segment.segmentId);\n return status ? { ...segment, status } : segment;\n });\n}\n\nfunction groupedSegments(segments: ContextManifestSegment[]): Group[] {\n const map = new Map<string, Group>();\n for (const segment of segments) {\n const groupName =\n segment.status === \"pinned\"\n ? \"Pinned\"\n : segment.status === \"evicted\"\n ? \"Evicted\"\n : segment.group;\n const group = map.get(groupName) ?? {\n name: groupName,\n tokens: 0,\n segments: [],\n };\n group.tokens += segment.tokenCount;\n group.segments.push(segment);\n map.set(groupName, group);\n }\n const order = [\n \"Pinned\",\n \"Tool results\",\n \"Files read\",\n \"Conversation\",\n \"Thinking\",\n \"Evicted\",\n ];\n return [...map.values()].sort((a, b) => {\n const ai = order.indexOf(a.name);\n const bi = order.indexOf(b.name);\n if (ai >= 0 || bi >= 0) return (ai < 0 ? 99 : ai) - (bi < 0 ? 99 : bi);\n return b.tokens - a.tokens;\n });\n}\n\nexport function ContextXRayPanel({\n manifest,\n optimistic,\n onPin,\n onEvict,\n onRestore,\n}: {\n manifest: ContextManifest;\n optimistic: Map<string, ContextSegmentStatus>;\n onPin: (segmentId: string) => void;\n onEvict: (segmentId: string) => void;\n onRestore: (segmentId: string) => void;\n}) {\n const [mode, setMode] = useState<\"list\" | \"map\">(\"list\");\n const [collapsed, setCollapsed] = useState<Set<string>>(new Set());\n const segments = useMemo(\n () => applyOptimisticStatus(manifest.segments, optimistic),\n [manifest.segments, optimistic],\n );\n const groups = useMemo(() => groupedSegments(segments), [segments]);\n const contextWindow = resolveContextWindow(manifest.model);\n const pct = Math.min(\n 100,\n Math.round((manifest.totalTokens / contextWindow) * 100),\n );\n const headroom = Math.max(0, contextWindow - manifest.totalTokens);\n const pinned = segments.filter((s) => s.status === \"pinned\").length;\n const evicted = segments.filter((s) => s.status === \"evicted\").length;\n const details = [\n `${formatTokens(headroom)} free`,\n pinned > 0 ? `${pinned} pinned` : null,\n evicted > 0 ? `${evicted} evicted` : null,\n manifest.tokenCountMethod === \"estimate\" ? \"estimated\" : null,\n !manifest.enforceable ? \"advisory\" : null,\n ].filter((item): item is string => Boolean(item));\n\n return (\n <div className=\"flex max-h-[min(72vh,520px)] flex-col\">\n <div className=\"border-b border-border/60 px-3 py-2.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"min-w-0 truncate text-sm font-medium text-foreground\">\n Context X-Ray\n </h2>\n <div className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {formatTokens(manifest.totalTokens)} · {pct}%\n </div>\n </div>\n <div className=\"mt-2 h-1 overflow-hidden rounded-full bg-muted/70\">\n <div\n className=\"h-full rounded-full bg-foreground transition-[width] duration-200\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <div className=\"mt-1.5 flex flex-wrap items-center gap-x-2 gap-y-1 text-[11px] text-muted-foreground\">\n {details.map((detail) => (\n <span key={detail}>{detail}</span>\n ))}\n {manifest.reclaimedTokens > 0 && (\n <span className=\"font-medium text-emerald-600 dark:text-emerald-400\">\n -{formatTokens(manifest.reclaimedTokens)}\n </span>\n )}\n </div>\n </div>\n\n <div className=\"overflow-y-auto px-2 py-2\">\n <div className=\"mb-1 flex items-center justify-end\">\n <div className=\"inline-flex rounded-md bg-muted/40 p-0.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setMode(\"list\")}\n aria-label=\"Show context list\"\n className={cn(\n \"flex size-7 items-center justify-center rounded text-muted-foreground\",\n mode === \"list\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"hover:text-foreground\",\n )}\n >\n <IconListDetails className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>List</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setMode(\"map\")}\n aria-label=\"Show context map\"\n className={cn(\n \"flex size-7 items-center justify-center rounded text-muted-foreground\",\n mode === \"map\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"hover:text-foreground\",\n )}\n >\n <IconChartTreemap className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Map</TooltipContent>\n </Tooltip>\n </div>\n </div>\n\n {mode === \"map\" ? (\n <ContextTreemap\n segments={segments}\n onSelect={(segmentId) => {\n const segment = segments.find((s) => s.segmentId === segmentId);\n if (segment) setCollapsed(new Set());\n }}\n />\n ) : (\n <div className=\"divide-y divide-border/60\">\n {groups.map((group) => {\n const isCollapsed = collapsed.has(group.name);\n return (\n <div key={group.name}>\n <button\n type=\"button\"\n onClick={() => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(group.name)) next.delete(group.name);\n else next.add(group.name);\n return next;\n });\n }}\n className=\"flex w-full items-center gap-2 rounded-sm px-1.5 py-2 text-left hover:bg-accent/35\"\n >\n {isCollapsed ? (\n <IconChevronRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\n ) : (\n <IconChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n <span\n className={cn(\n \"h-2 w-2 rounded-full\",\n groupColor(group.name),\n )}\n />\n <span className=\"min-w-0 flex-1 truncate text-xs font-medium\">\n {group.name}\n </span>\n <span className=\"text-[11px] text-muted-foreground\">\n {formatTokens(group.tokens)}\n </span>\n </button>\n {!isCollapsed && (\n <div className=\"pb-1\">\n {group.segments\n .slice()\n .sort((a, b) => b.tokenCount - a.tokenCount)\n .map((segment) => (\n <ContextSegmentRow\n key={segment.segmentId}\n segment={segment}\n advisory={!manifest.enforceable}\n onPin={() => onPin(segment.segmentId)}\n onEvict={() => onEvict(segment.segmentId)}\n onRestore={() => onRestore(segment.segmentId)}\n />\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"ContextXRayPanel.js","sourceRoot":"","sources":["../../../src/client/context-xray/ContextXRayPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconChartTreemap,\n IconChevronDown,\n IconChevronRight,\n IconListDetails,\n} from \"@tabler/icons-react\";\nimport { useMemo, useState } from \"react\";\n\nimport type {\n ContextManifest,\n ContextManifestSegment,\n ContextSegmentStatus,\n} from \"../../shared/context-xray.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { cn } from \"../utils.js\";\nimport { ContextSegmentRow } from \"./ContextSegmentRow.js\";\nimport { ContextTreemap } from \"./ContextTreemap.js\";\nimport { formatTokens, groupColor, resolveContextWindow } from \"./format.js\";\n\ninterface Group {\n name: string;\n tokens: number;\n segments: ContextManifestSegment[];\n}\n\nfunction applyOptimisticStatus(\n segments: ContextManifestSegment[],\n optimistic: Map<string, ContextSegmentStatus>,\n): ContextManifestSegment[] {\n if (optimistic.size === 0) return segments;\n return segments.map((segment) => {\n const status = optimistic.get(segment.segmentId);\n return status ? { ...segment, status } : segment;\n });\n}\n\nfunction groupedSegments(segments: ContextManifestSegment[]): Group[] {\n const map = new Map<string, Group>();\n for (const segment of segments) {\n const groupName =\n segment.status === \"pinned\"\n ? \"Pinned\"\n : segment.status === \"evicted\"\n ? \"Evicted\"\n : segment.group;\n const group = map.get(groupName) ?? {\n name: groupName,\n tokens: 0,\n segments: [],\n };\n group.tokens += segment.tokenCount;\n group.segments.push(segment);\n map.set(groupName, group);\n }\n const order = [\n \"Pinned\",\n \"Tool results\",\n \"Files read\",\n \"Conversation\",\n \"Thinking\",\n \"Evicted\",\n ];\n return [...map.values()].sort((a, b) => {\n const ai = order.indexOf(a.name);\n const bi = order.indexOf(b.name);\n if (ai >= 0 || bi >= 0) return (ai < 0 ? 99 : ai) - (bi < 0 ? 99 : bi);\n return b.tokens - a.tokens;\n });\n}\n\nexport function ContextXRayPanel({\n manifest,\n optimistic,\n onPin,\n onEvict,\n onRestore,\n}: {\n manifest: ContextManifest;\n optimistic: Map<string, ContextSegmentStatus>;\n onPin: (segmentId: string) => void;\n onEvict: (segmentId: string) => void;\n onRestore: (segmentId: string) => void;\n}) {\n const [mode, setMode] = useState<\"list\" | \"map\">(\"list\");\n const [collapsed, setCollapsed] = useState<Set<string>>(new Set());\n const segments = useMemo(\n () => applyOptimisticStatus(manifest.segments, optimistic),\n [manifest.segments, optimistic],\n );\n const groups = useMemo(() => groupedSegments(segments), [segments]);\n const contextWindow = resolveContextWindow(manifest.model);\n const pct = Math.min(\n 100,\n Math.round((manifest.totalTokens / contextWindow) * 100),\n );\n const headroom = Math.max(0, contextWindow - manifest.totalTokens);\n const pinned = segments.filter((s) => s.status === \"pinned\").length;\n const evicted = segments.filter((s) => s.status === \"evicted\").length;\n const details = [\n `${formatTokens(headroom)} free`,\n pinned > 0 ? `${pinned} pinned` : null,\n evicted > 0 ? `${evicted} evicted` : null,\n manifest.tokenCountMethod === \"estimate\" ? \"estimated\" : null,\n !manifest.enforceable ? \"advisory\" : null,\n ].filter((item): item is string => Boolean(item));\n\n return (\n <div className=\"flex max-h-[min(72vh,520px)] flex-col\">\n <div className=\"border-b border-border/60 px-3 py-2.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"min-w-0 truncate text-sm font-medium text-foreground\">\n Context X-Ray\n </h2>\n <div className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {formatTokens(manifest.totalTokens)} · {pct}%\n </div>\n </div>\n <div className=\"mt-2 h-1 overflow-hidden rounded-full bg-muted/70\">\n <div\n className=\"h-full rounded-full bg-foreground origin-left transition-transform duration-200\"\n style={{\n transform: `scaleX(${Math.min(1, pct / 100)})`,\n width: \"100%\",\n }}\n />\n </div>\n <div className=\"mt-1.5 flex flex-wrap items-center gap-x-2 gap-y-1 text-[11px] text-muted-foreground\">\n {details.map((detail) => (\n <span key={detail}>{detail}</span>\n ))}\n {manifest.reclaimedTokens > 0 && (\n <span className=\"font-medium text-emerald-600 dark:text-emerald-400\">\n -{formatTokens(manifest.reclaimedTokens)}\n </span>\n )}\n </div>\n </div>\n\n <div className=\"overflow-y-auto px-2 py-2\">\n <div className=\"mb-1 flex items-center justify-end\">\n <div className=\"inline-flex rounded-md bg-muted/40 p-0.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setMode(\"list\")}\n aria-label=\"Show context list\"\n className={cn(\n \"flex size-7 items-center justify-center rounded text-muted-foreground\",\n mode === \"list\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"hover:text-foreground\",\n )}\n >\n <IconListDetails className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>List</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setMode(\"map\")}\n aria-label=\"Show context map\"\n className={cn(\n \"flex size-7 items-center justify-center rounded text-muted-foreground\",\n mode === \"map\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"hover:text-foreground\",\n )}\n >\n <IconChartTreemap className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Map</TooltipContent>\n </Tooltip>\n </div>\n </div>\n\n {mode === \"map\" ? (\n <ContextTreemap\n segments={segments}\n onSelect={(segmentId) => {\n const segment = segments.find((s) => s.segmentId === segmentId);\n if (segment) setCollapsed(new Set());\n }}\n />\n ) : (\n <div className=\"divide-y divide-border/60\">\n {groups.map((group) => {\n const isCollapsed = collapsed.has(group.name);\n return (\n <div key={group.name}>\n <button\n type=\"button\"\n onClick={() => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(group.name)) next.delete(group.name);\n else next.add(group.name);\n return next;\n });\n }}\n className=\"flex w-full items-center gap-2 rounded-sm px-1.5 py-2 text-left hover:bg-accent/35\"\n >\n {isCollapsed ? (\n <IconChevronRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\n ) : (\n <IconChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n <span\n className={cn(\n \"h-2 w-2 rounded-full\",\n groupColor(group.name),\n )}\n />\n <span className=\"min-w-0 flex-1 truncate text-xs font-medium\">\n {group.name}\n </span>\n <span className=\"text-[11px] text-muted-foreground\">\n {formatTokens(group.tokens)}\n </span>\n </button>\n {!isCollapsed && (\n <div className=\"pb-1\">\n {group.segments\n .slice()\n .sort((a, b) => b.tokenCount - a.tokenCount)\n .map((segment) => (\n <ContextSegmentRow\n key={segment.segmentId}\n segment={segment}\n advisory={!manifest.enforceable}\n onPin={() => onPin(segment.segmentId)}\n onEvict={() => onEvict(segment.segmentId)}\n onRestore={() => onRestore(segment.segmentId)}\n />\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionEditor.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionEditor.tsx"],"names":[],"mappings":"AA6CA,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,EAAE,oBAAoB,+BAwWpE"}
1
+ {"version":3,"file":"ExtensionEditor.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionEditor.tsx"],"names":[],"mappings":"AA8CA,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,EAAE,oBAAoB,+BAwYpE"}