@agent-native/core 0.77.3 → 0.77.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2019) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +27 -0
  3. package/corpus/core/docs/content/locales/ar-SA/a2a-protocol.md +2 -2
  4. package/corpus/core/docs/content/locales/ar-SA/actions.md +6 -6
  5. package/corpus/core/docs/content/locales/ar-SA/agent-surfaces.md +5 -5
  6. package/corpus/core/docs/content/locales/ar-SA/agent-teams.md +4 -4
  7. package/corpus/core/docs/content/locales/ar-SA/agent-web-surfaces.md +2 -2
  8. package/corpus/core/docs/content/locales/ar-SA/authentication.md +4 -4
  9. package/corpus/core/docs/content/locales/ar-SA/automations.md +3 -3
  10. package/corpus/core/docs/content/locales/ar-SA/blueprint-installer.md +2 -2
  11. package/corpus/core/docs/content/locales/ar-SA/cli-adapters.md +1 -1
  12. package/corpus/core/docs/content/locales/ar-SA/code-agents-ui.md +2 -2
  13. package/corpus/core/docs/content/locales/ar-SA/components.md +14 -14
  14. package/corpus/core/docs/content/locales/ar-SA/context-awareness.md +3 -3
  15. package/corpus/core/docs/content/locales/ar-SA/creating-templates.md +12 -12
  16. package/corpus/core/docs/content/locales/ar-SA/cross-app-sso.md +3 -3
  17. package/corpus/core/docs/content/locales/ar-SA/database.md +7 -7
  18. package/corpus/core/docs/content/locales/ar-SA/deployment.md +4 -4
  19. package/corpus/core/docs/content/locales/ar-SA/dispatch.md +3 -3
  20. package/corpus/core/docs/content/locales/ar-SA/drop-in-agent.md +8 -8
  21. package/corpus/core/docs/content/locales/ar-SA/durable-resume.md +1 -1
  22. package/corpus/core/docs/content/locales/ar-SA/embedding-sdk.md +2 -2
  23. package/corpus/core/docs/content/locales/ar-SA/evals.md +3 -3
  24. package/corpus/core/docs/content/locales/ar-SA/extensions.md +2 -2
  25. package/corpus/core/docs/content/locales/ar-SA/external-agents.md +8 -8
  26. package/corpus/core/docs/content/locales/ar-SA/faq.md +3 -3
  27. package/corpus/core/docs/content/locales/ar-SA/file-uploads.md +4 -4
  28. package/corpus/core/docs/content/locales/ar-SA/frames.md +1 -1
  29. package/corpus/core/docs/content/locales/ar-SA/getting-started.md +13 -13
  30. package/corpus/core/docs/content/locales/ar-SA/harness-agents.md +3 -3
  31. package/corpus/core/docs/content/locales/ar-SA/human-approval.md +3 -3
  32. package/corpus/core/docs/content/locales/ar-SA/key-concepts.md +14 -14
  33. package/corpus/core/docs/content/locales/ar-SA/local-file-mode.md +5 -5
  34. package/corpus/core/docs/content/locales/ar-SA/mcp-apps.md +9 -9
  35. package/corpus/core/docs/content/locales/ar-SA/mcp-clients.md +9 -9
  36. package/corpus/core/docs/content/locales/ar-SA/mcp-protocol.md +5 -5
  37. package/corpus/core/docs/content/locales/ar-SA/messaging.md +5 -5
  38. package/corpus/core/docs/content/locales/ar-SA/migration-workbench.md +1 -1
  39. package/corpus/core/docs/content/locales/ar-SA/multi-app-workspace.md +1 -1
  40. package/corpus/core/docs/content/locales/ar-SA/multi-tenancy.md +2 -2
  41. package/corpus/core/docs/content/locales/ar-SA/native-chat-ui.md +4 -4
  42. package/corpus/core/docs/content/locales/ar-SA/notifications.md +5 -5
  43. package/corpus/core/docs/content/locales/ar-SA/observability.md +1 -1
  44. package/corpus/core/docs/content/locales/ar-SA/observational-memory.md +2 -2
  45. package/corpus/core/docs/content/locales/ar-SA/onboarding.md +8 -8
  46. package/corpus/core/docs/content/locales/ar-SA/plan-plugin.md +3 -3
  47. package/corpus/core/docs/content/locales/ar-SA/pr-visual-recap.md +11 -11
  48. package/corpus/core/docs/content/locales/ar-SA/processors.md +2 -2
  49. package/corpus/core/docs/content/locales/ar-SA/progress.md +3 -3
  50. package/corpus/core/docs/content/locales/ar-SA/pure-agent-apps.md +1 -1
  51. package/corpus/core/docs/content/locales/ar-SA/real-time-collaboration.md +6 -6
  52. package/corpus/core/docs/content/locales/ar-SA/recurring-jobs.md +5 -5
  53. package/corpus/core/docs/content/locales/ar-SA/routing.md +1 -1
  54. package/corpus/core/docs/content/locales/ar-SA/sandbox-adapters.md +3 -3
  55. package/corpus/core/docs/content/locales/ar-SA/security.md +10 -10
  56. package/corpus/core/docs/content/locales/ar-SA/server.md +9 -9
  57. package/corpus/core/docs/content/locales/ar-SA/sharing.md +7 -7
  58. package/corpus/core/docs/content/locales/ar-SA/skills-guide.md +16 -16
  59. package/corpus/core/docs/content/locales/ar-SA/template-analytics.md +10 -10
  60. package/corpus/core/docs/content/locales/ar-SA/template-assets.md +19 -19
  61. package/corpus/core/docs/content/locales/ar-SA/template-brain.md +11 -11
  62. package/corpus/core/docs/content/locales/ar-SA/template-calendar.md +9 -9
  63. package/corpus/core/docs/content/locales/ar-SA/template-chat.md +3 -3
  64. package/corpus/core/docs/content/locales/ar-SA/template-clips.md +13 -13
  65. package/corpus/core/docs/content/locales/ar-SA/template-content.md +15 -15
  66. package/corpus/core/docs/content/locales/ar-SA/template-design.md +7 -7
  67. package/corpus/core/docs/content/locales/ar-SA/template-dispatch.md +8 -8
  68. package/corpus/core/docs/content/locales/ar-SA/template-forms.md +9 -9
  69. package/corpus/core/docs/content/locales/ar-SA/template-mail.md +7 -7
  70. package/corpus/core/docs/content/locales/ar-SA/template-plan.md +3 -3
  71. package/corpus/core/docs/content/locales/ar-SA/template-slides.md +8 -8
  72. package/corpus/core/docs/content/locales/ar-SA/template-videos.md +5 -5
  73. package/corpus/core/docs/content/locales/ar-SA/tracking.md +6 -6
  74. package/corpus/core/docs/content/locales/ar-SA/using-your-agent.md +4 -4
  75. package/corpus/core/docs/content/locales/ar-SA/voice-input.md +4 -4
  76. package/corpus/core/docs/content/locales/ar-SA/what-is-agent-native.md +4 -4
  77. package/corpus/core/docs/content/locales/ar-SA/workspace-connections.md +8 -8
  78. package/corpus/core/docs/content/locales/ar-SA/workspace-management.md +4 -4
  79. package/corpus/core/docs/content/locales/ar-SA/workspace.md +24 -24
  80. package/corpus/core/docs/content/locales/ar-SA/writing-agent-instructions.md +18 -18
  81. package/corpus/core/docs/content/locales/de-DE/a2a-protocol.md +7 -7
  82. package/corpus/core/docs/content/locales/de-DE/actions.md +5 -5
  83. package/corpus/core/docs/content/locales/de-DE/agent-mentions.md +4 -4
  84. package/corpus/core/docs/content/locales/de-DE/agent-surfaces.md +22 -22
  85. package/corpus/core/docs/content/locales/de-DE/agent-teams.md +4 -4
  86. package/corpus/core/docs/content/locales/de-DE/agent-web-surfaces.md +4 -4
  87. package/corpus/core/docs/content/locales/de-DE/authentication.md +6 -6
  88. package/corpus/core/docs/content/locales/de-DE/automations.md +8 -8
  89. package/corpus/core/docs/content/locales/de-DE/blueprint-installer.md +2 -2
  90. package/corpus/core/docs/content/locales/de-DE/client.md +6 -6
  91. package/corpus/core/docs/content/locales/de-DE/cloneable-saas.md +2 -2
  92. package/corpus/core/docs/content/locales/de-DE/code-agents-ui.md +9 -9
  93. package/corpus/core/docs/content/locales/de-DE/components.md +15 -15
  94. package/corpus/core/docs/content/locales/de-DE/context-awareness.md +8 -8
  95. package/corpus/core/docs/content/locales/de-DE/creating-templates.md +13 -13
  96. package/corpus/core/docs/content/locales/de-DE/cross-app-sso.md +3 -3
  97. package/corpus/core/docs/content/locales/de-DE/database.md +5 -5
  98. package/corpus/core/docs/content/locales/de-DE/deployment.md +6 -6
  99. package/corpus/core/docs/content/locales/de-DE/dispatch.md +3 -3
  100. package/corpus/core/docs/content/locales/de-DE/drop-in-agent.md +14 -14
  101. package/corpus/core/docs/content/locales/de-DE/durable-resume.md +1 -1
  102. package/corpus/core/docs/content/locales/de-DE/embedding-sdk.md +2 -2
  103. package/corpus/core/docs/content/locales/de-DE/evals.md +2 -2
  104. package/corpus/core/docs/content/locales/de-DE/extensions.md +2 -2
  105. package/corpus/core/docs/content/locales/de-DE/external-agents.md +6 -6
  106. package/corpus/core/docs/content/locales/de-DE/faq.md +5 -5
  107. package/corpus/core/docs/content/locales/de-DE/file-uploads.md +4 -4
  108. package/corpus/core/docs/content/locales/de-DE/frames.md +2 -2
  109. package/corpus/core/docs/content/locales/de-DE/getting-started.md +16 -16
  110. package/corpus/core/docs/content/locales/de-DE/harness-agents.md +3 -3
  111. package/corpus/core/docs/content/locales/de-DE/human-approval.md +4 -4
  112. package/corpus/core/docs/content/locales/de-DE/key-concepts.md +14 -14
  113. package/corpus/core/docs/content/locales/de-DE/local-file-mode.md +8 -8
  114. package/corpus/core/docs/content/locales/de-DE/mcp-apps.md +4 -4
  115. package/corpus/core/docs/content/locales/de-DE/mcp-clients.md +7 -7
  116. package/corpus/core/docs/content/locales/de-DE/mcp-protocol.md +3 -3
  117. package/corpus/core/docs/content/locales/de-DE/messaging.md +5 -5
  118. package/corpus/core/docs/content/locales/de-DE/migration-workbench.md +1 -1
  119. package/corpus/core/docs/content/locales/de-DE/multi-app-workspace.md +2 -2
  120. package/corpus/core/docs/content/locales/de-DE/multi-tenancy.md +1 -1
  121. package/corpus/core/docs/content/locales/de-DE/native-chat-ui.md +8 -8
  122. package/corpus/core/docs/content/locales/de-DE/notifications.md +3 -3
  123. package/corpus/core/docs/content/locales/de-DE/observability.md +2 -2
  124. package/corpus/core/docs/content/locales/de-DE/observational-memory.md +2 -2
  125. package/corpus/core/docs/content/locales/de-DE/onboarding.md +8 -8
  126. package/corpus/core/docs/content/locales/de-DE/plan-plugin.md +3 -3
  127. package/corpus/core/docs/content/locales/de-DE/pr-visual-recap.md +11 -11
  128. package/corpus/core/docs/content/locales/de-DE/processors.md +1 -1
  129. package/corpus/core/docs/content/locales/de-DE/progress.md +2 -2
  130. package/corpus/core/docs/content/locales/de-DE/pure-agent-apps.md +1 -1
  131. package/corpus/core/docs/content/locales/de-DE/real-time-collaboration.md +8 -8
  132. package/corpus/core/docs/content/locales/de-DE/recurring-jobs.md +5 -5
  133. package/corpus/core/docs/content/locales/de-DE/routing.md +1 -1
  134. package/corpus/core/docs/content/locales/de-DE/sandbox-adapters.md +2 -2
  135. package/corpus/core/docs/content/locales/de-DE/security.md +10 -10
  136. package/corpus/core/docs/content/locales/de-DE/server.md +10 -10
  137. package/corpus/core/docs/content/locales/de-DE/sharing.md +6 -6
  138. package/corpus/core/docs/content/locales/de-DE/skills-guide.md +17 -17
  139. package/corpus/core/docs/content/locales/de-DE/template-analytics.md +10 -10
  140. package/corpus/core/docs/content/locales/de-DE/template-assets.md +21 -21
  141. package/corpus/core/docs/content/locales/de-DE/template-brain.md +11 -11
  142. package/corpus/core/docs/content/locales/de-DE/template-calendar.md +10 -10
  143. package/corpus/core/docs/content/locales/de-DE/template-chat.md +5 -5
  144. package/corpus/core/docs/content/locales/de-DE/template-clips.md +14 -14
  145. package/corpus/core/docs/content/locales/de-DE/template-content.md +14 -14
  146. package/corpus/core/docs/content/locales/de-DE/template-design.md +7 -7
  147. package/corpus/core/docs/content/locales/de-DE/template-dispatch.md +12 -12
  148. package/corpus/core/docs/content/locales/de-DE/template-forms.md +9 -9
  149. package/corpus/core/docs/content/locales/de-DE/template-mail.md +6 -6
  150. package/corpus/core/docs/content/locales/de-DE/template-plan.md +3 -3
  151. package/corpus/core/docs/content/locales/de-DE/template-slides.md +8 -8
  152. package/corpus/core/docs/content/locales/de-DE/template-videos.md +6 -6
  153. package/corpus/core/docs/content/locales/de-DE/tracking.md +3 -3
  154. package/corpus/core/docs/content/locales/de-DE/using-your-agent.md +6 -6
  155. package/corpus/core/docs/content/locales/de-DE/voice-input.md +9 -9
  156. package/corpus/core/docs/content/locales/de-DE/what-is-agent-native.md +6 -6
  157. package/corpus/core/docs/content/locales/de-DE/workspace-connections.md +9 -9
  158. package/corpus/core/docs/content/locales/de-DE/workspace-management.md +5 -5
  159. package/corpus/core/docs/content/locales/de-DE/workspace.md +23 -23
  160. package/corpus/core/docs/content/locales/de-DE/writing-agent-instructions.md +30 -30
  161. package/corpus/core/docs/content/locales/es-ES/a2a-protocol.md +7 -7
  162. package/corpus/core/docs/content/locales/es-ES/actions.md +2 -2
  163. package/corpus/core/docs/content/locales/es-ES/agent-mentions.md +3 -3
  164. package/corpus/core/docs/content/locales/es-ES/agent-surfaces.md +7 -7
  165. package/corpus/core/docs/content/locales/es-ES/agent-teams.md +3 -3
  166. package/corpus/core/docs/content/locales/es-ES/agent-web-surfaces.md +5 -5
  167. package/corpus/core/docs/content/locales/es-ES/authentication.md +6 -6
  168. package/corpus/core/docs/content/locales/es-ES/automations.md +8 -8
  169. package/corpus/core/docs/content/locales/es-ES/blueprint-installer.md +2 -2
  170. package/corpus/core/docs/content/locales/es-ES/client.md +1 -1
  171. package/corpus/core/docs/content/locales/es-ES/cloneable-saas.md +2 -2
  172. package/corpus/core/docs/content/locales/es-ES/code-agents-ui.md +4 -4
  173. package/corpus/core/docs/content/locales/es-ES/components.md +5 -5
  174. package/corpus/core/docs/content/locales/es-ES/context-awareness.md +8 -8
  175. package/corpus/core/docs/content/locales/es-ES/creating-templates.md +12 -12
  176. package/corpus/core/docs/content/locales/es-ES/cross-app-sso.md +3 -3
  177. package/corpus/core/docs/content/locales/es-ES/database.md +5 -5
  178. package/corpus/core/docs/content/locales/es-ES/deployment.md +4 -4
  179. package/corpus/core/docs/content/locales/es-ES/dispatch.md +3 -3
  180. package/corpus/core/docs/content/locales/es-ES/drop-in-agent.md +8 -8
  181. package/corpus/core/docs/content/locales/es-ES/durable-resume.md +1 -1
  182. package/corpus/core/docs/content/locales/es-ES/embedding-sdk.md +2 -2
  183. package/corpus/core/docs/content/locales/es-ES/evals.md +2 -2
  184. package/corpus/core/docs/content/locales/es-ES/extensions.md +2 -2
  185. package/corpus/core/docs/content/locales/es-ES/external-agents.md +5 -5
  186. package/corpus/core/docs/content/locales/es-ES/faq.md +3 -3
  187. package/corpus/core/docs/content/locales/es-ES/file-uploads.md +4 -4
  188. package/corpus/core/docs/content/locales/es-ES/frames.md +1 -1
  189. package/corpus/core/docs/content/locales/es-ES/getting-started.md +13 -13
  190. package/corpus/core/docs/content/locales/es-ES/harness-agents.md +3 -3
  191. package/corpus/core/docs/content/locales/es-ES/human-approval.md +3 -3
  192. package/corpus/core/docs/content/locales/es-ES/key-concepts.md +14 -14
  193. package/corpus/core/docs/content/locales/es-ES/local-file-mode.md +6 -6
  194. package/corpus/core/docs/content/locales/es-ES/mcp-apps.md +4 -4
  195. package/corpus/core/docs/content/locales/es-ES/mcp-clients.md +8 -8
  196. package/corpus/core/docs/content/locales/es-ES/mcp-protocol.md +3 -3
  197. package/corpus/core/docs/content/locales/es-ES/messaging.md +4 -4
  198. package/corpus/core/docs/content/locales/es-ES/migration-workbench.md +1 -1
  199. package/corpus/core/docs/content/locales/es-ES/multi-app-workspace.md +1 -1
  200. package/corpus/core/docs/content/locales/es-ES/multi-tenancy.md +1 -1
  201. package/corpus/core/docs/content/locales/es-ES/native-chat-ui.md +3 -3
  202. package/corpus/core/docs/content/locales/es-ES/notifications.md +3 -3
  203. package/corpus/core/docs/content/locales/es-ES/observability.md +2 -2
  204. package/corpus/core/docs/content/locales/es-ES/observational-memory.md +2 -2
  205. package/corpus/core/docs/content/locales/es-ES/onboarding.md +8 -8
  206. package/corpus/core/docs/content/locales/es-ES/plan-plugin.md +3 -3
  207. package/corpus/core/docs/content/locales/es-ES/pr-visual-recap.md +11 -11
  208. package/corpus/core/docs/content/locales/es-ES/processors.md +1 -1
  209. package/corpus/core/docs/content/locales/es-ES/progress.md +2 -2
  210. package/corpus/core/docs/content/locales/es-ES/pure-agent-apps.md +1 -1
  211. package/corpus/core/docs/content/locales/es-ES/real-time-collaboration.md +6 -6
  212. package/corpus/core/docs/content/locales/es-ES/recurring-jobs.md +5 -5
  213. package/corpus/core/docs/content/locales/es-ES/routing.md +1 -1
  214. package/corpus/core/docs/content/locales/es-ES/sandbox-adapters.md +2 -2
  215. package/corpus/core/docs/content/locales/es-ES/security.md +8 -8
  216. package/corpus/core/docs/content/locales/es-ES/server.md +11 -11
  217. package/corpus/core/docs/content/locales/es-ES/sharing.md +6 -6
  218. package/corpus/core/docs/content/locales/es-ES/skills-guide.md +16 -16
  219. package/corpus/core/docs/content/locales/es-ES/template-analytics.md +10 -10
  220. package/corpus/core/docs/content/locales/es-ES/template-assets.md +19 -19
  221. package/corpus/core/docs/content/locales/es-ES/template-brain.md +11 -11
  222. package/corpus/core/docs/content/locales/es-ES/template-calendar.md +9 -9
  223. package/corpus/core/docs/content/locales/es-ES/template-chat.md +3 -3
  224. package/corpus/core/docs/content/locales/es-ES/template-clips.md +14 -14
  225. package/corpus/core/docs/content/locales/es-ES/template-content.md +13 -13
  226. package/corpus/core/docs/content/locales/es-ES/template-design.md +7 -7
  227. package/corpus/core/docs/content/locales/es-ES/template-dispatch.md +8 -8
  228. package/corpus/core/docs/content/locales/es-ES/template-forms.md +9 -9
  229. package/corpus/core/docs/content/locales/es-ES/template-mail.md +6 -6
  230. package/corpus/core/docs/content/locales/es-ES/template-plan.md +3 -3
  231. package/corpus/core/docs/content/locales/es-ES/template-slides.md +8 -8
  232. package/corpus/core/docs/content/locales/es-ES/template-videos.md +5 -5
  233. package/corpus/core/docs/content/locales/es-ES/tracking.md +3 -3
  234. package/corpus/core/docs/content/locales/es-ES/using-your-agent.md +5 -5
  235. package/corpus/core/docs/content/locales/es-ES/voice-input.md +4 -4
  236. package/corpus/core/docs/content/locales/es-ES/what-is-agent-native.md +6 -6
  237. package/corpus/core/docs/content/locales/es-ES/workspace-connections.md +8 -8
  238. package/corpus/core/docs/content/locales/es-ES/workspace-management.md +4 -4
  239. package/corpus/core/docs/content/locales/es-ES/workspace.md +23 -23
  240. package/corpus/core/docs/content/locales/es-ES/writing-agent-instructions.md +18 -18
  241. package/corpus/core/docs/content/locales/fr-FR/a2a-protocol.md +7 -7
  242. package/corpus/core/docs/content/locales/fr-FR/actions.md +2 -2
  243. package/corpus/core/docs/content/locales/fr-FR/agent-mentions.md +3 -3
  244. package/corpus/core/docs/content/locales/fr-FR/agent-surfaces.md +7 -7
  245. package/corpus/core/docs/content/locales/fr-FR/agent-teams.md +3 -3
  246. package/corpus/core/docs/content/locales/fr-FR/agent-web-surfaces.md +5 -5
  247. package/corpus/core/docs/content/locales/fr-FR/authentication.md +6 -6
  248. package/corpus/core/docs/content/locales/fr-FR/automations.md +8 -8
  249. package/corpus/core/docs/content/locales/fr-FR/blueprint-installer.md +2 -2
  250. package/corpus/core/docs/content/locales/fr-FR/client.md +1 -1
  251. package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.md +2 -2
  252. package/corpus/core/docs/content/locales/fr-FR/code-agents-ui.md +4 -4
  253. package/corpus/core/docs/content/locales/fr-FR/components.md +5 -5
  254. package/corpus/core/docs/content/locales/fr-FR/context-awareness.md +8 -8
  255. package/corpus/core/docs/content/locales/fr-FR/creating-templates.md +12 -12
  256. package/corpus/core/docs/content/locales/fr-FR/cross-app-sso.md +4 -4
  257. package/corpus/core/docs/content/locales/fr-FR/database.md +5 -5
  258. package/corpus/core/docs/content/locales/fr-FR/deployment.md +5 -5
  259. package/corpus/core/docs/content/locales/fr-FR/dispatch.md +3 -3
  260. package/corpus/core/docs/content/locales/fr-FR/drop-in-agent.md +9 -9
  261. package/corpus/core/docs/content/locales/fr-FR/durable-resume.md +1 -1
  262. package/corpus/core/docs/content/locales/fr-FR/embedding-sdk.md +7 -7
  263. package/corpus/core/docs/content/locales/fr-FR/evals.md +2 -2
  264. package/corpus/core/docs/content/locales/fr-FR/extensions.md +2 -2
  265. package/corpus/core/docs/content/locales/fr-FR/external-agents.md +5 -5
  266. package/corpus/core/docs/content/locales/fr-FR/faq.md +3 -3
  267. package/corpus/core/docs/content/locales/fr-FR/file-uploads.md +5 -5
  268. package/corpus/core/docs/content/locales/fr-FR/frames.md +1 -1
  269. package/corpus/core/docs/content/locales/fr-FR/getting-started.md +13 -13
  270. package/corpus/core/docs/content/locales/fr-FR/harness-agents.md +3 -3
  271. package/corpus/core/docs/content/locales/fr-FR/human-approval.md +3 -3
  272. package/corpus/core/docs/content/locales/fr-FR/key-concepts.md +15 -15
  273. package/corpus/core/docs/content/locales/fr-FR/local-file-mode.md +5 -5
  274. package/corpus/core/docs/content/locales/fr-FR/mcp-apps.md +4 -4
  275. package/corpus/core/docs/content/locales/fr-FR/mcp-clients.md +8 -8
  276. package/corpus/core/docs/content/locales/fr-FR/mcp-protocol.md +3 -3
  277. package/corpus/core/docs/content/locales/fr-FR/messaging.md +4 -4
  278. package/corpus/core/docs/content/locales/fr-FR/migration-workbench.md +1 -1
  279. package/corpus/core/docs/content/locales/fr-FR/multi-app-workspace.md +1 -1
  280. package/corpus/core/docs/content/locales/fr-FR/multi-tenancy.md +1 -1
  281. package/corpus/core/docs/content/locales/fr-FR/native-chat-ui.md +3 -3
  282. package/corpus/core/docs/content/locales/fr-FR/notifications.md +3 -3
  283. package/corpus/core/docs/content/locales/fr-FR/observability.md +2 -2
  284. package/corpus/core/docs/content/locales/fr-FR/observational-memory.md +2 -2
  285. package/corpus/core/docs/content/locales/fr-FR/onboarding.md +8 -8
  286. package/corpus/core/docs/content/locales/fr-FR/plan-plugin.md +3 -3
  287. package/corpus/core/docs/content/locales/fr-FR/pr-visual-recap.md +11 -11
  288. package/corpus/core/docs/content/locales/fr-FR/processors.md +1 -1
  289. package/corpus/core/docs/content/locales/fr-FR/progress.md +2 -2
  290. package/corpus/core/docs/content/locales/fr-FR/pure-agent-apps.md +1 -1
  291. package/corpus/core/docs/content/locales/fr-FR/real-time-collaboration.md +8 -8
  292. package/corpus/core/docs/content/locales/fr-FR/recurring-jobs.md +5 -5
  293. package/corpus/core/docs/content/locales/fr-FR/routing.md +1 -1
  294. package/corpus/core/docs/content/locales/fr-FR/sandbox-adapters.md +2 -2
  295. package/corpus/core/docs/content/locales/fr-FR/security.md +8 -8
  296. package/corpus/core/docs/content/locales/fr-FR/server.md +10 -10
  297. package/corpus/core/docs/content/locales/fr-FR/sharing.md +6 -6
  298. package/corpus/core/docs/content/locales/fr-FR/skills-guide.md +16 -16
  299. package/corpus/core/docs/content/locales/fr-FR/template-analytics.md +10 -10
  300. package/corpus/core/docs/content/locales/fr-FR/template-assets.md +20 -20
  301. package/corpus/core/docs/content/locales/fr-FR/template-brain.md +11 -11
  302. package/corpus/core/docs/content/locales/fr-FR/template-calendar.md +9 -9
  303. package/corpus/core/docs/content/locales/fr-FR/template-chat.md +3 -3
  304. package/corpus/core/docs/content/locales/fr-FR/template-clips.md +15 -15
  305. package/corpus/core/docs/content/locales/fr-FR/template-content.md +13 -13
  306. package/corpus/core/docs/content/locales/fr-FR/template-design.md +8 -8
  307. package/corpus/core/docs/content/locales/fr-FR/template-dispatch.md +8 -8
  308. package/corpus/core/docs/content/locales/fr-FR/template-forms.md +10 -10
  309. package/corpus/core/docs/content/locales/fr-FR/template-mail.md +6 -6
  310. package/corpus/core/docs/content/locales/fr-FR/template-plan.md +3 -3
  311. package/corpus/core/docs/content/locales/fr-FR/template-slides.md +9 -9
  312. package/corpus/core/docs/content/locales/fr-FR/template-videos.md +5 -5
  313. package/corpus/core/docs/content/locales/fr-FR/tracking.md +3 -3
  314. package/corpus/core/docs/content/locales/fr-FR/using-your-agent.md +5 -5
  315. package/corpus/core/docs/content/locales/fr-FR/voice-input.md +4 -4
  316. package/corpus/core/docs/content/locales/fr-FR/what-is-agent-native.md +6 -6
  317. package/corpus/core/docs/content/locales/fr-FR/workspace-connections.md +8 -8
  318. package/corpus/core/docs/content/locales/fr-FR/workspace-management.md +5 -5
  319. package/corpus/core/docs/content/locales/fr-FR/workspace.md +23 -23
  320. package/corpus/core/docs/content/locales/fr-FR/writing-agent-instructions.md +18 -18
  321. package/corpus/core/docs/content/locales/hi-IN/a2a-protocol.md +7 -7
  322. package/corpus/core/docs/content/locales/hi-IN/actions.md +3 -3
  323. package/corpus/core/docs/content/locales/hi-IN/agent-mentions.md +3 -3
  324. package/corpus/core/docs/content/locales/hi-IN/agent-surfaces.md +7 -7
  325. package/corpus/core/docs/content/locales/hi-IN/agent-teams.md +3 -3
  326. package/corpus/core/docs/content/locales/hi-IN/agent-web-surfaces.md +5 -5
  327. package/corpus/core/docs/content/locales/hi-IN/authentication.md +6 -6
  328. package/corpus/core/docs/content/locales/hi-IN/automations.md +8 -8
  329. package/corpus/core/docs/content/locales/hi-IN/blueprint-installer.md +2 -2
  330. package/corpus/core/docs/content/locales/hi-IN/client.md +1 -1
  331. package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.md +2 -2
  332. package/corpus/core/docs/content/locales/hi-IN/code-agents-ui.md +4 -4
  333. package/corpus/core/docs/content/locales/hi-IN/components.md +5 -5
  334. package/corpus/core/docs/content/locales/hi-IN/context-awareness.md +8 -8
  335. package/corpus/core/docs/content/locales/hi-IN/creating-templates.md +14 -14
  336. package/corpus/core/docs/content/locales/hi-IN/cross-app-sso.md +3 -3
  337. package/corpus/core/docs/content/locales/hi-IN/database.md +5 -5
  338. package/corpus/core/docs/content/locales/hi-IN/deployment.md +5 -5
  339. package/corpus/core/docs/content/locales/hi-IN/dispatch.md +4 -4
  340. package/corpus/core/docs/content/locales/hi-IN/drop-in-agent.md +8 -8
  341. package/corpus/core/docs/content/locales/hi-IN/durable-resume.md +1 -1
  342. package/corpus/core/docs/content/locales/hi-IN/embedding-sdk.md +2 -2
  343. package/corpus/core/docs/content/locales/hi-IN/evals.md +2 -2
  344. package/corpus/core/docs/content/locales/hi-IN/extensions.md +2 -2
  345. package/corpus/core/docs/content/locales/hi-IN/external-agents.md +5 -5
  346. package/corpus/core/docs/content/locales/hi-IN/faq.md +3 -3
  347. package/corpus/core/docs/content/locales/hi-IN/file-uploads.md +4 -4
  348. package/corpus/core/docs/content/locales/hi-IN/frames.md +1 -1
  349. package/corpus/core/docs/content/locales/hi-IN/getting-started.md +14 -14
  350. package/corpus/core/docs/content/locales/hi-IN/harness-agents.md +3 -3
  351. package/corpus/core/docs/content/locales/hi-IN/human-approval.md +3 -3
  352. package/corpus/core/docs/content/locales/hi-IN/key-concepts.md +14 -14
  353. package/corpus/core/docs/content/locales/hi-IN/local-file-mode.md +5 -5
  354. package/corpus/core/docs/content/locales/hi-IN/mcp-apps.md +4 -4
  355. package/corpus/core/docs/content/locales/hi-IN/mcp-clients.md +7 -7
  356. package/corpus/core/docs/content/locales/hi-IN/mcp-protocol.md +3 -3
  357. package/corpus/core/docs/content/locales/hi-IN/messaging.md +6 -6
  358. package/corpus/core/docs/content/locales/hi-IN/migration-workbench.md +1 -1
  359. package/corpus/core/docs/content/locales/hi-IN/multi-app-workspace.md +1 -1
  360. package/corpus/core/docs/content/locales/hi-IN/multi-tenancy.md +1 -1
  361. package/corpus/core/docs/content/locales/hi-IN/native-chat-ui.md +3 -3
  362. package/corpus/core/docs/content/locales/hi-IN/notifications.md +3 -3
  363. package/corpus/core/docs/content/locales/hi-IN/observability.md +2 -2
  364. package/corpus/core/docs/content/locales/hi-IN/observational-memory.md +2 -2
  365. package/corpus/core/docs/content/locales/hi-IN/onboarding.md +8 -8
  366. package/corpus/core/docs/content/locales/hi-IN/plan-plugin.md +3 -3
  367. package/corpus/core/docs/content/locales/hi-IN/pr-visual-recap.md +11 -11
  368. package/corpus/core/docs/content/locales/hi-IN/processors.md +1 -1
  369. package/corpus/core/docs/content/locales/hi-IN/progress.md +2 -2
  370. package/corpus/core/docs/content/locales/hi-IN/pure-agent-apps.md +1 -1
  371. package/corpus/core/docs/content/locales/hi-IN/real-time-collaboration.md +6 -6
  372. package/corpus/core/docs/content/locales/hi-IN/recurring-jobs.md +5 -5
  373. package/corpus/core/docs/content/locales/hi-IN/routing.md +1 -1
  374. package/corpus/core/docs/content/locales/hi-IN/sandbox-adapters.md +2 -2
  375. package/corpus/core/docs/content/locales/hi-IN/security.md +8 -8
  376. package/corpus/core/docs/content/locales/hi-IN/server.md +10 -10
  377. package/corpus/core/docs/content/locales/hi-IN/sharing.md +6 -6
  378. package/corpus/core/docs/content/locales/hi-IN/skills-guide.md +16 -16
  379. package/corpus/core/docs/content/locales/hi-IN/template-analytics.md +10 -10
  380. package/corpus/core/docs/content/locales/hi-IN/template-assets.md +19 -19
  381. package/corpus/core/docs/content/locales/hi-IN/template-brain.md +11 -11
  382. package/corpus/core/docs/content/locales/hi-IN/template-calendar.md +9 -9
  383. package/corpus/core/docs/content/locales/hi-IN/template-chat.md +3 -3
  384. package/corpus/core/docs/content/locales/hi-IN/template-clips.md +14 -14
  385. package/corpus/core/docs/content/locales/hi-IN/template-content.md +13 -13
  386. package/corpus/core/docs/content/locales/hi-IN/template-design.md +7 -7
  387. package/corpus/core/docs/content/locales/hi-IN/template-dispatch.md +9 -9
  388. package/corpus/core/docs/content/locales/hi-IN/template-forms.md +9 -9
  389. package/corpus/core/docs/content/locales/hi-IN/template-mail.md +6 -6
  390. package/corpus/core/docs/content/locales/hi-IN/template-plan.md +3 -3
  391. package/corpus/core/docs/content/locales/hi-IN/template-slides.md +8 -8
  392. package/corpus/core/docs/content/locales/hi-IN/template-videos.md +5 -5
  393. package/corpus/core/docs/content/locales/hi-IN/tracking.md +3 -3
  394. package/corpus/core/docs/content/locales/hi-IN/using-your-agent.md +1 -1
  395. package/corpus/core/docs/content/locales/hi-IN/voice-input.md +4 -4
  396. package/corpus/core/docs/content/locales/hi-IN/what-is-agent-native.md +4 -4
  397. package/corpus/core/docs/content/locales/hi-IN/workspace-connections.md +8 -8
  398. package/corpus/core/docs/content/locales/hi-IN/workspace-management.md +4 -4
  399. package/corpus/core/docs/content/locales/hi-IN/workspace.md +23 -23
  400. package/corpus/core/docs/content/locales/hi-IN/writing-agent-instructions.md +18 -18
  401. package/corpus/core/docs/content/locales/ja-JP/a2a-protocol.md +7 -7
  402. package/corpus/core/docs/content/locales/ja-JP/actions.md +3 -3
  403. package/corpus/core/docs/content/locales/ja-JP/agent-mentions.md +3 -3
  404. package/corpus/core/docs/content/locales/ja-JP/agent-surfaces.md +7 -7
  405. package/corpus/core/docs/content/locales/ja-JP/agent-teams.md +3 -3
  406. package/corpus/core/docs/content/locales/ja-JP/agent-web-surfaces.md +5 -5
  407. package/corpus/core/docs/content/locales/ja-JP/authentication.md +6 -6
  408. package/corpus/core/docs/content/locales/ja-JP/automations.md +8 -8
  409. package/corpus/core/docs/content/locales/ja-JP/blueprint-installer.md +2 -2
  410. package/corpus/core/docs/content/locales/ja-JP/client.md +1 -1
  411. package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.md +2 -2
  412. package/corpus/core/docs/content/locales/ja-JP/code-agents-ui.md +4 -4
  413. package/corpus/core/docs/content/locales/ja-JP/components.md +5 -5
  414. package/corpus/core/docs/content/locales/ja-JP/context-awareness.md +8 -8
  415. package/corpus/core/docs/content/locales/ja-JP/creating-templates.md +12 -12
  416. package/corpus/core/docs/content/locales/ja-JP/cross-app-sso.md +3 -3
  417. package/corpus/core/docs/content/locales/ja-JP/database.md +7 -7
  418. package/corpus/core/docs/content/locales/ja-JP/deployment.md +4 -4
  419. package/corpus/core/docs/content/locales/ja-JP/dispatch.md +4 -4
  420. package/corpus/core/docs/content/locales/ja-JP/drop-in-agent.md +8 -8
  421. package/corpus/core/docs/content/locales/ja-JP/durable-resume.md +1 -1
  422. package/corpus/core/docs/content/locales/ja-JP/embedding-sdk.md +2 -2
  423. package/corpus/core/docs/content/locales/ja-JP/evals.md +2 -2
  424. package/corpus/core/docs/content/locales/ja-JP/extensions.md +2 -2
  425. package/corpus/core/docs/content/locales/ja-JP/external-agents.md +5 -5
  426. package/corpus/core/docs/content/locales/ja-JP/faq.md +3 -3
  427. package/corpus/core/docs/content/locales/ja-JP/file-uploads.md +4 -4
  428. package/corpus/core/docs/content/locales/ja-JP/frames.md +1 -1
  429. package/corpus/core/docs/content/locales/ja-JP/getting-started.md +13 -13
  430. package/corpus/core/docs/content/locales/ja-JP/harness-agents.md +3 -3
  431. package/corpus/core/docs/content/locales/ja-JP/human-approval.md +3 -3
  432. package/corpus/core/docs/content/locales/ja-JP/key-concepts.md +14 -14
  433. package/corpus/core/docs/content/locales/ja-JP/local-file-mode.md +5 -5
  434. package/corpus/core/docs/content/locales/ja-JP/mcp-apps.md +4 -4
  435. package/corpus/core/docs/content/locales/ja-JP/mcp-clients.md +8 -8
  436. package/corpus/core/docs/content/locales/ja-JP/mcp-protocol.md +3 -3
  437. package/corpus/core/docs/content/locales/ja-JP/messaging.md +6 -6
  438. package/corpus/core/docs/content/locales/ja-JP/migration-workbench.md +1 -1
  439. package/corpus/core/docs/content/locales/ja-JP/multi-app-workspace.md +1 -1
  440. package/corpus/core/docs/content/locales/ja-JP/multi-tenancy.md +1 -1
  441. package/corpus/core/docs/content/locales/ja-JP/native-chat-ui.md +3 -3
  442. package/corpus/core/docs/content/locales/ja-JP/notifications.md +3 -3
  443. package/corpus/core/docs/content/locales/ja-JP/observability.md +2 -2
  444. package/corpus/core/docs/content/locales/ja-JP/observational-memory.md +2 -2
  445. package/corpus/core/docs/content/locales/ja-JP/onboarding.md +8 -8
  446. package/corpus/core/docs/content/locales/ja-JP/plan-plugin.md +3 -3
  447. package/corpus/core/docs/content/locales/ja-JP/pr-visual-recap.md +11 -11
  448. package/corpus/core/docs/content/locales/ja-JP/processors.md +1 -1
  449. package/corpus/core/docs/content/locales/ja-JP/progress.md +2 -2
  450. package/corpus/core/docs/content/locales/ja-JP/pure-agent-apps.md +1 -1
  451. package/corpus/core/docs/content/locales/ja-JP/real-time-collaboration.md +6 -6
  452. package/corpus/core/docs/content/locales/ja-JP/recurring-jobs.md +5 -5
  453. package/corpus/core/docs/content/locales/ja-JP/routing.md +1 -1
  454. package/corpus/core/docs/content/locales/ja-JP/sandbox-adapters.md +2 -2
  455. package/corpus/core/docs/content/locales/ja-JP/security.md +8 -8
  456. package/corpus/core/docs/content/locales/ja-JP/server.md +10 -10
  457. package/corpus/core/docs/content/locales/ja-JP/sharing.md +6 -6
  458. package/corpus/core/docs/content/locales/ja-JP/skills-guide.md +16 -16
  459. package/corpus/core/docs/content/locales/ja-JP/template-analytics.md +10 -10
  460. package/corpus/core/docs/content/locales/ja-JP/template-assets.md +19 -19
  461. package/corpus/core/docs/content/locales/ja-JP/template-brain.md +11 -11
  462. package/corpus/core/docs/content/locales/ja-JP/template-calendar.md +9 -9
  463. package/corpus/core/docs/content/locales/ja-JP/template-chat.md +3 -3
  464. package/corpus/core/docs/content/locales/ja-JP/template-clips.md +14 -14
  465. package/corpus/core/docs/content/locales/ja-JP/template-content.md +13 -13
  466. package/corpus/core/docs/content/locales/ja-JP/template-design.md +7 -7
  467. package/corpus/core/docs/content/locales/ja-JP/template-dispatch.md +12 -12
  468. package/corpus/core/docs/content/locales/ja-JP/template-forms.md +9 -9
  469. package/corpus/core/docs/content/locales/ja-JP/template-mail.md +6 -6
  470. package/corpus/core/docs/content/locales/ja-JP/template-plan.md +3 -3
  471. package/corpus/core/docs/content/locales/ja-JP/template-slides.md +8 -8
  472. package/corpus/core/docs/content/locales/ja-JP/template-videos.md +5 -5
  473. package/corpus/core/docs/content/locales/ja-JP/tracking.md +3 -3
  474. package/corpus/core/docs/content/locales/ja-JP/using-your-agent.md +4 -4
  475. package/corpus/core/docs/content/locales/ja-JP/voice-input.md +4 -4
  476. package/corpus/core/docs/content/locales/ja-JP/what-is-agent-native.md +4 -4
  477. package/corpus/core/docs/content/locales/ja-JP/workspace-connections.md +8 -8
  478. package/corpus/core/docs/content/locales/ja-JP/workspace-management.md +5 -5
  479. package/corpus/core/docs/content/locales/ja-JP/workspace.md +23 -23
  480. package/corpus/core/docs/content/locales/ja-JP/writing-agent-instructions.md +18 -18
  481. package/corpus/core/docs/content/locales/ko-KR/a2a-protocol.md +7 -7
  482. package/corpus/core/docs/content/locales/ko-KR/actions.md +3 -3
  483. package/corpus/core/docs/content/locales/ko-KR/agent-mentions.md +3 -3
  484. package/corpus/core/docs/content/locales/ko-KR/agent-surfaces.md +15 -15
  485. package/corpus/core/docs/content/locales/ko-KR/agent-teams.md +3 -3
  486. package/corpus/core/docs/content/locales/ko-KR/agent-web-surfaces.md +5 -5
  487. package/corpus/core/docs/content/locales/ko-KR/authentication.md +13 -13
  488. package/corpus/core/docs/content/locales/ko-KR/automations.md +8 -8
  489. package/corpus/core/docs/content/locales/ko-KR/blueprint-installer.md +2 -2
  490. package/corpus/core/docs/content/locales/ko-KR/client.md +1 -1
  491. package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.md +2 -2
  492. package/corpus/core/docs/content/locales/ko-KR/code-agents-ui.md +4 -4
  493. package/corpus/core/docs/content/locales/ko-KR/components.md +5 -5
  494. package/corpus/core/docs/content/locales/ko-KR/context-awareness.md +8 -8
  495. package/corpus/core/docs/content/locales/ko-KR/creating-templates.md +12 -12
  496. package/corpus/core/docs/content/locales/ko-KR/cross-app-sso.md +3 -3
  497. package/corpus/core/docs/content/locales/ko-KR/database.md +7 -7
  498. package/corpus/core/docs/content/locales/ko-KR/deployment.md +4 -4
  499. package/corpus/core/docs/content/locales/ko-KR/dispatch.md +4 -4
  500. package/corpus/core/docs/content/locales/ko-KR/drop-in-agent.md +8 -8
  501. package/corpus/core/docs/content/locales/ko-KR/durable-resume.md +1 -1
  502. package/corpus/core/docs/content/locales/ko-KR/embedding-sdk.md +2 -2
  503. package/corpus/core/docs/content/locales/ko-KR/evals.md +2 -2
  504. package/corpus/core/docs/content/locales/ko-KR/extensions.md +2 -2
  505. package/corpus/core/docs/content/locales/ko-KR/external-agents.md +5 -5
  506. package/corpus/core/docs/content/locales/ko-KR/faq.md +3 -3
  507. package/corpus/core/docs/content/locales/ko-KR/file-uploads.md +4 -4
  508. package/corpus/core/docs/content/locales/ko-KR/frames.md +1 -1
  509. package/corpus/core/docs/content/locales/ko-KR/getting-started.md +13 -13
  510. package/corpus/core/docs/content/locales/ko-KR/harness-agents.md +3 -3
  511. package/corpus/core/docs/content/locales/ko-KR/human-approval.md +3 -3
  512. package/corpus/core/docs/content/locales/ko-KR/key-concepts.md +14 -14
  513. package/corpus/core/docs/content/locales/ko-KR/local-file-mode.md +5 -5
  514. package/corpus/core/docs/content/locales/ko-KR/mcp-apps.md +4 -4
  515. package/corpus/core/docs/content/locales/ko-KR/mcp-clients.md +8 -8
  516. package/corpus/core/docs/content/locales/ko-KR/mcp-protocol.md +3 -3
  517. package/corpus/core/docs/content/locales/ko-KR/messaging.md +6 -6
  518. package/corpus/core/docs/content/locales/ko-KR/migration-workbench.md +1 -1
  519. package/corpus/core/docs/content/locales/ko-KR/multi-app-workspace.md +1 -1
  520. package/corpus/core/docs/content/locales/ko-KR/multi-tenancy.md +1 -1
  521. package/corpus/core/docs/content/locales/ko-KR/native-chat-ui.md +3 -3
  522. package/corpus/core/docs/content/locales/ko-KR/notifications.md +3 -3
  523. package/corpus/core/docs/content/locales/ko-KR/observability.md +2 -2
  524. package/corpus/core/docs/content/locales/ko-KR/observational-memory.md +2 -2
  525. package/corpus/core/docs/content/locales/ko-KR/onboarding.md +8 -8
  526. package/corpus/core/docs/content/locales/ko-KR/plan-plugin.md +3 -3
  527. package/corpus/core/docs/content/locales/ko-KR/pr-visual-recap.md +11 -11
  528. package/corpus/core/docs/content/locales/ko-KR/processors.md +1 -1
  529. package/corpus/core/docs/content/locales/ko-KR/progress.md +2 -2
  530. package/corpus/core/docs/content/locales/ko-KR/pure-agent-apps.md +1 -1
  531. package/corpus/core/docs/content/locales/ko-KR/real-time-collaboration.md +6 -6
  532. package/corpus/core/docs/content/locales/ko-KR/recurring-jobs.md +5 -5
  533. package/corpus/core/docs/content/locales/ko-KR/routing.md +1 -1
  534. package/corpus/core/docs/content/locales/ko-KR/sandbox-adapters.md +2 -2
  535. package/corpus/core/docs/content/locales/ko-KR/security.md +8 -8
  536. package/corpus/core/docs/content/locales/ko-KR/server.md +10 -10
  537. package/corpus/core/docs/content/locales/ko-KR/sharing.md +6 -6
  538. package/corpus/core/docs/content/locales/ko-KR/skills-guide.md +16 -16
  539. package/corpus/core/docs/content/locales/ko-KR/template-analytics.md +10 -10
  540. package/corpus/core/docs/content/locales/ko-KR/template-assets.md +19 -19
  541. package/corpus/core/docs/content/locales/ko-KR/template-brain.md +11 -11
  542. package/corpus/core/docs/content/locales/ko-KR/template-calendar.md +9 -9
  543. package/corpus/core/docs/content/locales/ko-KR/template-chat.md +3 -3
  544. package/corpus/core/docs/content/locales/ko-KR/template-clips.md +14 -14
  545. package/corpus/core/docs/content/locales/ko-KR/template-content.md +13 -13
  546. package/corpus/core/docs/content/locales/ko-KR/template-design.md +7 -7
  547. package/corpus/core/docs/content/locales/ko-KR/template-dispatch.md +11 -11
  548. package/corpus/core/docs/content/locales/ko-KR/template-forms.md +9 -9
  549. package/corpus/core/docs/content/locales/ko-KR/template-mail.md +6 -6
  550. package/corpus/core/docs/content/locales/ko-KR/template-plan.md +3 -3
  551. package/corpus/core/docs/content/locales/ko-KR/template-slides.md +8 -8
  552. package/corpus/core/docs/content/locales/ko-KR/template-videos.md +5 -5
  553. package/corpus/core/docs/content/locales/ko-KR/tracking.md +3 -3
  554. package/corpus/core/docs/content/locales/ko-KR/using-your-agent.md +5 -5
  555. package/corpus/core/docs/content/locales/ko-KR/voice-input.md +4 -4
  556. package/corpus/core/docs/content/locales/ko-KR/what-is-agent-native.md +6 -6
  557. package/corpus/core/docs/content/locales/ko-KR/workspace-connections.md +8 -8
  558. package/corpus/core/docs/content/locales/ko-KR/workspace-management.md +4 -4
  559. package/corpus/core/docs/content/locales/ko-KR/workspace.md +23 -23
  560. package/corpus/core/docs/content/locales/ko-KR/writing-agent-instructions.md +18 -18
  561. package/corpus/core/docs/content/locales/pt-BR/a2a-protocol.md +7 -7
  562. package/corpus/core/docs/content/locales/pt-BR/actions.md +2 -2
  563. package/corpus/core/docs/content/locales/pt-BR/agent-mentions.md +3 -3
  564. package/corpus/core/docs/content/locales/pt-BR/agent-surfaces.md +7 -7
  565. package/corpus/core/docs/content/locales/pt-BR/agent-teams.md +3 -3
  566. package/corpus/core/docs/content/locales/pt-BR/agent-web-surfaces.md +5 -5
  567. package/corpus/core/docs/content/locales/pt-BR/authentication.md +6 -6
  568. package/corpus/core/docs/content/locales/pt-BR/automations.md +8 -8
  569. package/corpus/core/docs/content/locales/pt-BR/blueprint-installer.md +2 -2
  570. package/corpus/core/docs/content/locales/pt-BR/client.md +2 -2
  571. package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.md +2 -2
  572. package/corpus/core/docs/content/locales/pt-BR/code-agents-ui.md +4 -4
  573. package/corpus/core/docs/content/locales/pt-BR/components.md +5 -5
  574. package/corpus/core/docs/content/locales/pt-BR/context-awareness.md +8 -8
  575. package/corpus/core/docs/content/locales/pt-BR/creating-templates.md +12 -12
  576. package/corpus/core/docs/content/locales/pt-BR/cross-app-sso.md +3 -3
  577. package/corpus/core/docs/content/locales/pt-BR/database.md +5 -5
  578. package/corpus/core/docs/content/locales/pt-BR/deployment.md +5 -5
  579. package/corpus/core/docs/content/locales/pt-BR/dispatch.md +3 -3
  580. package/corpus/core/docs/content/locales/pt-BR/drop-in-agent.md +9 -9
  581. package/corpus/core/docs/content/locales/pt-BR/durable-resume.md +1 -1
  582. package/corpus/core/docs/content/locales/pt-BR/embedding-sdk.md +2 -2
  583. package/corpus/core/docs/content/locales/pt-BR/evals.md +2 -2
  584. package/corpus/core/docs/content/locales/pt-BR/extensions.md +2 -2
  585. package/corpus/core/docs/content/locales/pt-BR/external-agents.md +5 -5
  586. package/corpus/core/docs/content/locales/pt-BR/faq.md +3 -3
  587. package/corpus/core/docs/content/locales/pt-BR/file-uploads.md +4 -4
  588. package/corpus/core/docs/content/locales/pt-BR/frames.md +2 -2
  589. package/corpus/core/docs/content/locales/pt-BR/getting-started.md +13 -13
  590. package/corpus/core/docs/content/locales/pt-BR/harness-agents.md +3 -3
  591. package/corpus/core/docs/content/locales/pt-BR/human-approval.md +3 -3
  592. package/corpus/core/docs/content/locales/pt-BR/key-concepts.md +15 -15
  593. package/corpus/core/docs/content/locales/pt-BR/local-file-mode.md +5 -5
  594. package/corpus/core/docs/content/locales/pt-BR/mcp-apps.md +4 -4
  595. package/corpus/core/docs/content/locales/pt-BR/mcp-clients.md +8 -8
  596. package/corpus/core/docs/content/locales/pt-BR/mcp-protocol.md +3 -3
  597. package/corpus/core/docs/content/locales/pt-BR/messaging.md +4 -4
  598. package/corpus/core/docs/content/locales/pt-BR/migration-workbench.md +1 -1
  599. package/corpus/core/docs/content/locales/pt-BR/multi-app-workspace.md +1 -1
  600. package/corpus/core/docs/content/locales/pt-BR/multi-tenancy.md +1 -1
  601. package/corpus/core/docs/content/locales/pt-BR/native-chat-ui.md +3 -3
  602. package/corpus/core/docs/content/locales/pt-BR/notifications.md +3 -3
  603. package/corpus/core/docs/content/locales/pt-BR/observability.md +2 -2
  604. package/corpus/core/docs/content/locales/pt-BR/observational-memory.md +2 -2
  605. package/corpus/core/docs/content/locales/pt-BR/onboarding.md +8 -8
  606. package/corpus/core/docs/content/locales/pt-BR/plan-plugin.md +3 -3
  607. package/corpus/core/docs/content/locales/pt-BR/pr-visual-recap.md +11 -11
  608. package/corpus/core/docs/content/locales/pt-BR/processors.md +1 -1
  609. package/corpus/core/docs/content/locales/pt-BR/progress.md +2 -2
  610. package/corpus/core/docs/content/locales/pt-BR/pure-agent-apps.md +1 -1
  611. package/corpus/core/docs/content/locales/pt-BR/real-time-collaboration.md +6 -6
  612. package/corpus/core/docs/content/locales/pt-BR/recurring-jobs.md +5 -5
  613. package/corpus/core/docs/content/locales/pt-BR/routing.md +1 -1
  614. package/corpus/core/docs/content/locales/pt-BR/sandbox-adapters.md +2 -2
  615. package/corpus/core/docs/content/locales/pt-BR/security.md +9 -9
  616. package/corpus/core/docs/content/locales/pt-BR/server.md +10 -10
  617. package/corpus/core/docs/content/locales/pt-BR/sharing.md +6 -6
  618. package/corpus/core/docs/content/locales/pt-BR/skills-guide.md +16 -16
  619. package/corpus/core/docs/content/locales/pt-BR/template-analytics.md +10 -10
  620. package/corpus/core/docs/content/locales/pt-BR/template-assets.md +20 -20
  621. package/corpus/core/docs/content/locales/pt-BR/template-brain.md +11 -11
  622. package/corpus/core/docs/content/locales/pt-BR/template-calendar.md +9 -9
  623. package/corpus/core/docs/content/locales/pt-BR/template-chat.md +3 -3
  624. package/corpus/core/docs/content/locales/pt-BR/template-clips.md +15 -15
  625. package/corpus/core/docs/content/locales/pt-BR/template-content.md +13 -13
  626. package/corpus/core/docs/content/locales/pt-BR/template-design.md +8 -8
  627. package/corpus/core/docs/content/locales/pt-BR/template-dispatch.md +8 -8
  628. package/corpus/core/docs/content/locales/pt-BR/template-forms.md +10 -10
  629. package/corpus/core/docs/content/locales/pt-BR/template-mail.md +6 -6
  630. package/corpus/core/docs/content/locales/pt-BR/template-plan.md +3 -3
  631. package/corpus/core/docs/content/locales/pt-BR/template-slides.md +9 -9
  632. package/corpus/core/docs/content/locales/pt-BR/template-videos.md +5 -5
  633. package/corpus/core/docs/content/locales/pt-BR/tracking.md +3 -3
  634. package/corpus/core/docs/content/locales/pt-BR/using-your-agent.md +5 -5
  635. package/corpus/core/docs/content/locales/pt-BR/voice-input.md +4 -4
  636. package/corpus/core/docs/content/locales/pt-BR/what-is-agent-native.md +5 -5
  637. package/corpus/core/docs/content/locales/pt-BR/workspace-connections.md +8 -8
  638. package/corpus/core/docs/content/locales/pt-BR/workspace-management.md +4 -4
  639. package/corpus/core/docs/content/locales/pt-BR/workspace.md +23 -23
  640. package/corpus/core/docs/content/locales/pt-BR/writing-agent-instructions.md +18 -18
  641. package/corpus/core/docs/content/locales/zh-CN/a2a-protocol.md +7 -7
  642. package/corpus/core/docs/content/locales/zh-CN/actions.md +3 -3
  643. package/corpus/core/docs/content/locales/zh-CN/agent-mentions.md +3 -3
  644. package/corpus/core/docs/content/locales/zh-CN/agent-surfaces.md +7 -7
  645. package/corpus/core/docs/content/locales/zh-CN/agent-teams.md +3 -3
  646. package/corpus/core/docs/content/locales/zh-CN/agent-web-surfaces.md +5 -5
  647. package/corpus/core/docs/content/locales/zh-CN/authentication.md +13 -13
  648. package/corpus/core/docs/content/locales/zh-CN/automations.md +8 -8
  649. package/corpus/core/docs/content/locales/zh-CN/blueprint-installer.md +2 -2
  650. package/corpus/core/docs/content/locales/zh-CN/client.md +1 -1
  651. package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.md +2 -2
  652. package/corpus/core/docs/content/locales/zh-CN/code-agents-ui.md +4 -4
  653. package/corpus/core/docs/content/locales/zh-CN/components.md +7 -7
  654. package/corpus/core/docs/content/locales/zh-CN/context-awareness.md +8 -8
  655. package/corpus/core/docs/content/locales/zh-CN/creating-templates.md +12 -12
  656. package/corpus/core/docs/content/locales/zh-CN/cross-app-sso.md +3 -3
  657. package/corpus/core/docs/content/locales/zh-CN/database.md +7 -7
  658. package/corpus/core/docs/content/locales/zh-CN/deployment.md +4 -4
  659. package/corpus/core/docs/content/locales/zh-CN/dispatch.md +4 -4
  660. package/corpus/core/docs/content/locales/zh-CN/drop-in-agent.md +8 -8
  661. package/corpus/core/docs/content/locales/zh-CN/durable-resume.md +1 -1
  662. package/corpus/core/docs/content/locales/zh-CN/embedding-sdk.md +2 -2
  663. package/corpus/core/docs/content/locales/zh-CN/evals.md +2 -2
  664. package/corpus/core/docs/content/locales/zh-CN/extensions.md +2 -2
  665. package/corpus/core/docs/content/locales/zh-CN/external-agents.md +5 -5
  666. package/corpus/core/docs/content/locales/zh-CN/faq.md +3 -3
  667. package/corpus/core/docs/content/locales/zh-CN/file-uploads.md +4 -4
  668. package/corpus/core/docs/content/locales/zh-CN/frames.md +2 -2
  669. package/corpus/core/docs/content/locales/zh-CN/getting-started.md +13 -13
  670. package/corpus/core/docs/content/locales/zh-CN/harness-agents.md +3 -3
  671. package/corpus/core/docs/content/locales/zh-CN/human-approval.md +3 -3
  672. package/corpus/core/docs/content/locales/zh-CN/key-concepts.md +14 -14
  673. package/corpus/core/docs/content/locales/zh-CN/local-file-mode.md +5 -5
  674. package/corpus/core/docs/content/locales/zh-CN/mcp-apps.md +4 -4
  675. package/corpus/core/docs/content/locales/zh-CN/mcp-clients.md +7 -7
  676. package/corpus/core/docs/content/locales/zh-CN/mcp-protocol.md +3 -3
  677. package/corpus/core/docs/content/locales/zh-CN/messaging.md +6 -6
  678. package/corpus/core/docs/content/locales/zh-CN/migration-workbench.md +1 -1
  679. package/corpus/core/docs/content/locales/zh-CN/multi-app-workspace.md +1 -1
  680. package/corpus/core/docs/content/locales/zh-CN/multi-tenancy.md +1 -1
  681. package/corpus/core/docs/content/locales/zh-CN/native-chat-ui.md +3 -3
  682. package/corpus/core/docs/content/locales/zh-CN/notifications.md +3 -3
  683. package/corpus/core/docs/content/locales/zh-CN/observability.md +2 -2
  684. package/corpus/core/docs/content/locales/zh-CN/observational-memory.md +2 -2
  685. package/corpus/core/docs/content/locales/zh-CN/onboarding.md +8 -8
  686. package/corpus/core/docs/content/locales/zh-CN/plan-plugin.md +3 -3
  687. package/corpus/core/docs/content/locales/zh-CN/pr-visual-recap.md +11 -11
  688. package/corpus/core/docs/content/locales/zh-CN/processors.md +1 -1
  689. package/corpus/core/docs/content/locales/zh-CN/progress.md +2 -2
  690. package/corpus/core/docs/content/locales/zh-CN/pure-agent-apps.md +1 -1
  691. package/corpus/core/docs/content/locales/zh-CN/real-time-collaboration.md +6 -6
  692. package/corpus/core/docs/content/locales/zh-CN/recurring-jobs.md +5 -5
  693. package/corpus/core/docs/content/locales/zh-CN/routing.md +1 -1
  694. package/corpus/core/docs/content/locales/zh-CN/sandbox-adapters.md +2 -2
  695. package/corpus/core/docs/content/locales/zh-CN/security.md +8 -8
  696. package/corpus/core/docs/content/locales/zh-CN/server.md +10 -10
  697. package/corpus/core/docs/content/locales/zh-CN/sharing.md +6 -6
  698. package/corpus/core/docs/content/locales/zh-CN/skills-guide.md +16 -16
  699. package/corpus/core/docs/content/locales/zh-CN/template-analytics.md +10 -10
  700. package/corpus/core/docs/content/locales/zh-CN/template-assets.md +20 -20
  701. package/corpus/core/docs/content/locales/zh-CN/template-brain.md +11 -11
  702. package/corpus/core/docs/content/locales/zh-CN/template-calendar.md +9 -9
  703. package/corpus/core/docs/content/locales/zh-CN/template-chat.md +3 -3
  704. package/corpus/core/docs/content/locales/zh-CN/template-clips.md +14 -14
  705. package/corpus/core/docs/content/locales/zh-CN/template-content.md +13 -13
  706. package/corpus/core/docs/content/locales/zh-CN/template-design.md +7 -7
  707. package/corpus/core/docs/content/locales/zh-CN/template-dispatch.md +11 -11
  708. package/corpus/core/docs/content/locales/zh-CN/template-forms.md +9 -9
  709. package/corpus/core/docs/content/locales/zh-CN/template-mail.md +6 -6
  710. package/corpus/core/docs/content/locales/zh-CN/template-plan.md +3 -3
  711. package/corpus/core/docs/content/locales/zh-CN/template-slides.md +8 -8
  712. package/corpus/core/docs/content/locales/zh-CN/template-videos.md +5 -5
  713. package/corpus/core/docs/content/locales/zh-CN/tracking.md +3 -3
  714. package/corpus/core/docs/content/locales/zh-CN/using-your-agent.md +5 -5
  715. package/corpus/core/docs/content/locales/zh-CN/voice-input.md +4 -4
  716. package/corpus/core/docs/content/locales/zh-CN/what-is-agent-native.md +5 -5
  717. package/corpus/core/docs/content/locales/zh-CN/workspace-connections.md +8 -8
  718. package/corpus/core/docs/content/locales/zh-CN/workspace-management.md +5 -5
  719. package/corpus/core/docs/content/locales/zh-CN/workspace.md +23 -23
  720. package/corpus/core/docs/content/locales/zh-CN/writing-agent-instructions.md +18 -18
  721. package/corpus/core/package.json +1 -1
  722. package/corpus/core/src/agent/production-agent.ts +35 -0
  723. package/corpus/core/src/agent/run-store.ts +2 -0
  724. package/corpus/core/src/client/changelog/Changelog.tsx +22 -10
  725. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +405 -35
  726. package/corpus/core/src/client/i18n.tsx +13 -1
  727. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +275 -274
  728. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +270 -260
  729. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +282 -270
  730. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +275 -266
  731. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +274 -276
  732. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +280 -273
  733. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +274 -274
  734. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +273 -266
  735. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +273 -285
  736. package/corpus/templates/analytics/app/components/Markdown.tsx +36 -10
  737. package/corpus/templates/analytics/app/components/ProviderCorpusJobNotifier.tsx +41 -17
  738. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +3 -1
  739. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +4 -2
  740. package/corpus/templates/analytics/app/components/dashboard/RecentActivity.tsx +13 -7
  741. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +4 -1
  742. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +3 -1
  743. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +13 -50
  744. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +3 -1
  745. package/corpus/templates/analytics/app/i18n-data.ts +5172 -1
  746. package/corpus/templates/analytics/app/pages/Ask.tsx +7 -4
  747. package/corpus/templates/analytics/app/pages/DataDictionary.tsx +66 -59
  748. package/corpus/templates/analytics/app/pages/DataSources.tsx +131 -96
  749. package/corpus/templates/analytics/app/pages/NotFound.tsx +8 -3
  750. package/corpus/templates/analytics/app/pages/Placeholder.tsx +4 -3
  751. package/corpus/templates/analytics/app/pages/adhoc/BlankDashboard.tsx +8 -5
  752. package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +4 -2
  753. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventCombobox.tsx +16 -6
  754. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventPanel.tsx +6 -2
  755. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ExplorerChart.tsx +14 -5
  756. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/FilterBuilder.tsx +6 -3
  757. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/GroupByPicker.tsx +7 -3
  758. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/PropertyCombobox.tsx +12 -6
  759. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/PropertyValueCombobox.tsx +9 -5
  760. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/SqlPreview.tsx +3 -1
  761. package/corpus/templates/analytics/app/pages/adhoc/explorer/index.tsx +25 -15
  762. package/corpus/templates/analytics/app/pages/adhoc/explorer/types.ts +32 -30
  763. package/corpus/templates/analytics/app/pages/adhoc/explorer/use-explorer-config.ts +10 -6
  764. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/ChartCard.tsx +20 -10
  765. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +50 -33
  766. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +23 -14
  767. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +61 -55
  768. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +88 -106
  769. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewSqlPopover.tsx +37 -49
  770. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +23 -16
  771. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +46 -40
  772. package/corpus/templates/analytics/app/pages/analyses/AnalysesList.tsx +11 -8
  773. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +25 -21
  774. package/corpus/templates/analytics/app/pages/analyses/LegacyFusionAnalysis.tsx +175 -99
  775. package/corpus/templates/analytics/app/pages/overview/OverviewPage.tsx +30 -12
  776. package/corpus/templates/analytics/app/routes/$.tsx +2 -1
  777. package/corpus/templates/analytics/app/routes/analyses.$id.tsx +2 -1
  778. package/corpus/templates/analytics/app/routes/analyses._index.tsx +2 -1
  779. package/corpus/templates/analytics/app/routes/ask.tsx +2 -1
  780. package/corpus/templates/analytics/app/routes/catalog.tsx +38 -16
  781. package/corpus/templates/analytics/app/routes/chart.tsx +12 -3
  782. package/corpus/templates/analytics/app/routes/dashboards.$id.tsx +2 -1
  783. package/corpus/templates/analytics/app/routes/data-dictionary.tsx +2 -1
  784. package/corpus/templates/analytics/app/routes/data-sources.tsx +2 -1
  785. package/corpus/templates/analytics/app/routes/extensions.$id.tsx +3 -1
  786. package/corpus/templates/analytics/app/routes/extensions._index.tsx +3 -1
  787. package/corpus/templates/analytics/app/routes/overview.tsx +2 -1
  788. package/corpus/templates/analytics/app/routes/settings.tsx +2 -1
  789. package/corpus/templates/analytics/app/routes/team.tsx +2 -1
  790. package/corpus/templates/assets/app/components/library/CreateLibraryDialog.tsx +25 -15
  791. package/corpus/templates/assets/app/components/library/EditLibraryDialog.tsx +17 -10
  792. package/corpus/templates/assets/app/components/library/LibraryCard.tsx +20 -8
  793. package/corpus/templates/assets/app/i18n-data.ts +4065 -1
  794. package/corpus/templates/assets/app/routes/_index.tsx +15 -4
  795. package/corpus/templates/assets/app/routes/audit.tsx +79 -56
  796. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +565 -330
  797. package/corpus/templates/assets/app/routes/brand-kits.tsx +3 -1
  798. package/corpus/templates/assets/app/routes/extensions.$id.tsx +3 -1
  799. package/corpus/templates/assets/app/routes/extensions._index.tsx +3 -1
  800. package/corpus/templates/assets/app/routes/extensions.tsx +3 -1
  801. package/corpus/templates/assets/app/routes/library.tsx +107 -74
  802. package/corpus/templates/assets/app/routes/team.tsx +6 -3
  803. package/corpus/templates/brain/app/components/brain/CanonicalPreviewSheet.tsx +14 -10
  804. package/corpus/templates/brain/app/i18n-data.ts +5609 -1
  805. package/corpus/templates/brain/app/routes/extensions.$id.tsx +3 -1
  806. package/corpus/templates/brain/app/routes/extensions._index.tsx +3 -1
  807. package/corpus/templates/brain/app/routes/extensions.tsx +3 -1
  808. package/corpus/templates/brain/app/routes/knowledge.tsx +51 -38
  809. package/corpus/templates/brain/app/routes/review.tsx +259 -154
  810. package/corpus/templates/brain/app/routes/settings.tsx +114 -116
  811. package/corpus/templates/brain/app/routes/sources.tsx +421 -352
  812. package/corpus/templates/brain/app/routes/team.tsx +6 -2
  813. package/corpus/templates/calendar/app/components/CloudUpgrade.tsx +33 -51
  814. package/corpus/templates/calendar/app/components/ThemeToggle.tsx +3 -1
  815. package/corpus/templates/calendar/app/components/TimezoneCombobox.tsx +5 -3
  816. package/corpus/templates/calendar/app/components/booking/BookingConfirmation.tsx +27 -13
  817. package/corpus/templates/calendar/app/components/booking/BookingForm.tsx +25 -13
  818. package/corpus/templates/calendar/app/components/booking/TimeSlotPicker.tsx +4 -1
  819. package/corpus/templates/calendar/app/components/calendar/AddCalendarDialog.tsx +22 -16
  820. package/corpus/templates/calendar/app/components/calendar/ApolloPanel.tsx +14 -13
  821. package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +22 -11
  822. package/corpus/templates/calendar/app/components/calendar/CommandPalette.tsx +19 -16
  823. package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +112 -72
  824. package/corpus/templates/calendar/app/components/calendar/DayView.tsx +3 -1
  825. package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +62 -24
  826. package/corpus/templates/calendar/app/components/calendar/EventDescription.tsx +4 -2
  827. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +17 -11
  828. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +167 -97
  829. package/corpus/templates/calendar/app/components/calendar/EventOptionControls.tsx +39 -25
  830. package/corpus/templates/calendar/app/components/calendar/FindTimePanel.tsx +28 -16
  831. package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +90 -74
  832. package/corpus/templates/calendar/app/components/calendar/GoogleSetupWizard.tsx +42 -34
  833. package/corpus/templates/calendar/app/components/calendar/GoogleSyncButton.tsx +6 -6
  834. package/corpus/templates/calendar/app/components/calendar/GuestNotificationDialog.tsx +44 -37
  835. package/corpus/templates/calendar/app/components/calendar/IntegrationsSidebar.tsx +46 -52
  836. package/corpus/templates/calendar/app/components/calendar/KeyboardShortcutsHelp.tsx +31 -19
  837. package/corpus/templates/calendar/app/components/calendar/PeopleSearchDialog.tsx +13 -9
  838. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +6 -4
  839. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +13 -7
  840. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +19 -18
  841. package/corpus/templates/calendar/app/i18n/ar-SA.ts +2 -56
  842. package/corpus/templates/calendar/app/i18n/de-DE.ts +2 -57
  843. package/corpus/templates/calendar/app/i18n/en-US.ts +2 -56
  844. package/corpus/templates/calendar/app/i18n/es-ES.ts +2 -57
  845. package/corpus/templates/calendar/app/i18n/fr-FR.ts +2 -57
  846. package/corpus/templates/calendar/app/i18n/hi-IN.ts +2 -56
  847. package/corpus/templates/calendar/app/i18n/ja-JP.ts +2 -57
  848. package/corpus/templates/calendar/app/i18n/ko-KR.ts +2 -56
  849. package/corpus/templates/calendar/app/i18n/pt-BR.ts +2 -56
  850. package/corpus/templates/calendar/app/i18n/zh-CN.ts +2 -56
  851. package/corpus/templates/calendar/app/i18n-data.ts +8680 -7
  852. package/corpus/templates/calendar/app/pages/AvailabilitySettings.tsx +66 -34
  853. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +286 -186
  854. package/corpus/templates/calendar/app/pages/BookingPage.tsx +37 -21
  855. package/corpus/templates/calendar/app/pages/BookingsList.tsx +36 -25
  856. package/corpus/templates/calendar/app/pages/CalendarView.tsx +66 -49
  857. package/corpus/templates/calendar/app/pages/ManageBookingPage.tsx +41 -29
  858. package/corpus/templates/calendar/app/pages/NotFound.tsx +4 -2
  859. package/corpus/templates/calendar/app/routes/_app.$.tsx +2 -1
  860. package/corpus/templates/calendar/app/routes/_app.booking-links.tsx +3 -1
  861. package/corpus/templates/calendar/app/routes/_app.settings.tsx +6 -3
  862. package/corpus/templates/calendar/app/routes/_app.team.tsx +8 -3
  863. package/corpus/templates/calendar/app/routes/booking-og-meta.ts +7 -4
  864. package/corpus/templates/calendar/app/routes/booking.manage.$token.tsx +2 -1
  865. package/corpus/templates/calendar/app/routes/event.tsx +14 -8
  866. package/corpus/templates/chat/app/i18n/ar-SA.ts +29 -23
  867. package/corpus/templates/chat/app/i18n/de-DE.ts +30 -22
  868. package/corpus/templates/chat/app/i18n/en-US.ts +7 -0
  869. package/corpus/templates/chat/app/i18n/es-ES.ts +30 -22
  870. package/corpus/templates/chat/app/i18n/fr-FR.ts +33 -25
  871. package/corpus/templates/chat/app/i18n/hi-IN.ts +30 -23
  872. package/corpus/templates/chat/app/i18n/ja-JP.ts +30 -23
  873. package/corpus/templates/chat/app/i18n/ko-KR.ts +30 -23
  874. package/corpus/templates/chat/app/i18n/pt-BR.ts +30 -22
  875. package/corpus/templates/chat/app/i18n/zh-CN.ts +29 -23
  876. package/corpus/templates/chat/app/routes/observability.tsx +2 -1
  877. package/corpus/templates/clips/app/components/capture-install-options.tsx +16 -11
  878. package/corpus/templates/clips/app/components/editable-recording-title.tsx +8 -7
  879. package/corpus/templates/clips/app/components/editor/chapters-editor.tsx +12 -9
  880. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +15 -9
  881. package/corpus/templates/clips/app/components/editor/editor-toolbar.tsx +71 -57
  882. package/corpus/templates/clips/app/components/editor/split-button.tsx +6 -5
  883. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +21 -19
  884. package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +39 -26
  885. package/corpus/templates/clips/app/components/editor/transcript-editor.tsx +10 -6
  886. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +11 -7
  887. package/corpus/templates/clips/app/components/library/create-space-dialog.tsx +13 -9
  888. package/corpus/templates/clips/app/components/library/folder-tree.tsx +26 -24
  889. package/corpus/templates/clips/app/components/library/library-grid.tsx +118 -14
  890. package/corpus/templates/clips/app/components/library/library-layout.tsx +3 -1
  891. package/corpus/templates/clips/app/components/library/organization-switcher.tsx +24 -13
  892. package/corpus/templates/clips/app/components/library/recording-card.tsx +51 -34
  893. package/corpus/templates/clips/app/components/library/search-bar.tsx +14 -11
  894. package/corpus/templates/clips/app/components/meetings/auto-record-prompt.tsx +10 -6
  895. package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +8 -4
  896. package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +32 -16
  897. package/corpus/templates/clips/app/components/meetings/quick-ask-sidebar.tsx +23 -23
  898. package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +11 -7
  899. package/corpus/templates/clips/app/components/meetings/transcript-bubbles.tsx +8 -4
  900. package/corpus/templates/clips/app/components/player/access-password-prompt.tsx +6 -4
  901. package/corpus/templates/clips/app/components/player/comments-panel.tsx +22 -13
  902. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +24 -79
  903. package/corpus/templates/clips/app/components/player/insights-panel.tsx +29 -15
  904. package/corpus/templates/clips/app/components/player/player-controls.tsx +3 -1
  905. package/corpus/templates/clips/app/components/player/settings-panel.tsx +44 -27
  906. package/corpus/templates/clips/app/components/player/share-dialog.tsx +38 -32
  907. package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +7 -5
  908. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +46 -35
  909. package/corpus/templates/clips/app/components/player/video-player.tsx +11 -5
  910. package/corpus/templates/clips/app/components/recorder/camera-visualizer.tsx +20 -6
  911. package/corpus/templates/clips/app/components/recorder/countdown-overlay.tsx +6 -4
  912. package/corpus/templates/clips/app/components/recorder/microphone-visualizer.tsx +3 -1
  913. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +120 -156
  914. package/corpus/templates/clips/app/components/recorder/recording-toolbar.tsx +16 -8
  915. package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +8 -8
  916. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +33 -31
  917. package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +15 -8
  918. package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +35 -20
  919. package/corpus/templates/clips/app/components/workspace/engagement-chart.tsx +6 -4
  920. package/corpus/templates/clips/app/components/workspace/insights-hub.tsx +35 -22
  921. package/corpus/templates/clips/app/components/workspace/invite-dialog.tsx +27 -17
  922. package/corpus/templates/clips/app/components/workspace/members-list.tsx +30 -19
  923. package/corpus/templates/clips/app/components/workspace/notifications-list.tsx +37 -25
  924. package/corpus/templates/clips/app/components/workspace/top-creators-table.tsx +14 -5
  925. package/corpus/templates/clips/app/i18n/ar-SA.ts +1117 -1
  926. package/corpus/templates/clips/app/i18n/de-DE.ts +1147 -1
  927. package/corpus/templates/clips/app/i18n/en-US.ts +1110 -0
  928. package/corpus/templates/clips/app/i18n/es-ES.ts +1139 -0
  929. package/corpus/templates/clips/app/i18n/fr-FR.ts +1145 -5
  930. package/corpus/templates/clips/app/i18n/hi-IN.ts +1113 -1
  931. package/corpus/templates/clips/app/i18n/ja-JP.ts +1138 -2
  932. package/corpus/templates/clips/app/i18n/ko-KR.ts +1124 -1
  933. package/corpus/templates/clips/app/i18n/pt-BR.ts +1137 -1
  934. package/corpus/templates/clips/app/i18n/zh-CN.ts +1094 -2
  935. package/corpus/templates/clips/app/root.tsx +2 -2
  936. package/corpus/templates/clips/app/routes/_app.archive.tsx +12 -2
  937. package/corpus/templates/clips/app/routes/_app.dictate.tsx +71 -49
  938. package/corpus/templates/clips/app/routes/_app.extensions.$id.tsx +4 -1
  939. package/corpus/templates/clips/app/routes/_app.extensions._index.tsx +4 -1
  940. package/corpus/templates/clips/app/routes/_app.insights._index.tsx +2 -1
  941. package/corpus/templates/clips/app/routes/_app.library.folder.$folderId.tsx +5 -2
  942. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +54 -38
  943. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +41 -30
  944. package/corpus/templates/clips/app/routes/_app.notifications.tsx +34 -19
  945. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +28 -17
  946. package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +25 -18
  947. package/corpus/templates/clips/app/routes/_app.spaces.$spaceId.folder.$folderId.tsx +5 -2
  948. package/corpus/templates/clips/app/routes/_app.spaces.$spaceId.tsx +8 -5
  949. package/corpus/templates/clips/app/routes/_app.spaces._index.tsx +8 -3
  950. package/corpus/templates/clips/app/routes/_app.trash.tsx +2 -1
  951. package/corpus/templates/clips/app/routes/download.tsx +39 -30
  952. package/corpus/templates/clips/app/routes/embed.$shareId.tsx +4 -3
  953. package/corpus/templates/clips/app/routes/invite.$token.tsx +41 -32
  954. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +111 -106
  955. package/corpus/templates/clips/app/routes/record.tsx +101 -87
  956. package/corpus/templates/clips/app/routes/share.$shareId.tsx +78 -62
  957. package/corpus/templates/clips/app/routes/share.meeting.$meetingId.tsx +15 -12
  958. package/corpus/templates/clips/changelog/2026-06-25-localized-clips-settings-changelog-and-extension-sidebar-lab.md +6 -0
  959. package/corpus/templates/clips/desktop/src/overlays/countdown.tsx +4 -2
  960. package/corpus/templates/clips/desktop/src/styles.css +15 -1
  961. package/corpus/templates/content/app/components/ThemeToggle.tsx +3 -3
  962. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +14 -12
  963. package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +19 -14
  964. package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +16 -4
  965. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +13670 -10
  966. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +15 -12
  967. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +219 -135
  968. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +114 -81
  969. package/corpus/templates/content/app/components/editor/EmojiPicker.tsx +27 -9
  970. package/corpus/templates/content/app/components/editor/LinkHoverPreview.tsx +7 -5
  971. package/corpus/templates/content/app/components/editor/NotionConflictBanner.tsx +12 -6
  972. package/corpus/templates/content/app/components/editor/NotionSyncBar.tsx +54 -34
  973. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +111 -122
  974. package/corpus/templates/content/app/components/editor/TableHoverControls.tsx +27 -22
  975. package/corpus/templates/content/app/components/editor/VersionHistoryPanel.tsx +23 -19
  976. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +6 -2
  977. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +245 -238
  978. package/corpus/templates/content/app/components/editor/database/calculations.ts +1 -0
  979. package/corpus/templates/content/app/components/editor/database/filter-sort.ts +1 -0
  980. package/corpus/templates/content/app/components/editor/database/grouping.ts +1 -0
  981. package/corpus/templates/content/app/components/editor/database/navigation-state.ts +1 -0
  982. package/corpus/templates/content/app/components/editor/database/shared.tsx +1 -0
  983. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +92 -53
  984. package/corpus/templates/content/app/components/editor/extensions/AudioBlock.tsx +86 -49
  985. package/corpus/templates/content/app/components/editor/extensions/CodeBlockNode.tsx +22 -12
  986. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +138 -74
  987. package/corpus/templates/content/app/components/editor/extensions/LocalMdxComponentNode.tsx +16 -7
  988. package/corpus/templates/content/app/components/editor/extensions/VideoBlock.tsx +86 -49
  989. package/corpus/templates/content/app/components/editor/image-upload.ts +3 -3
  990. package/corpus/templates/content/app/components/editor/localComponentSlashItems.ts +2 -1
  991. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +205 -484
  992. package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +34 -110
  993. package/corpus/templates/content/app/components/sidebar/NotionButton.tsx +56 -43
  994. package/corpus/templates/content/app/i18n-data.ts +6977 -10
  995. package/corpus/templates/content/app/routes/_app.local-files.tsx +111 -85
  996. package/corpus/templates/content/app/routes/_app.page.$id.tsx +7 -7
  997. package/corpus/templates/content/app/routes/_app.settings.tsx +2 -1
  998. package/corpus/templates/content/app/routes/_app.team.tsx +2 -1
  999. package/corpus/templates/content/app/routes/_app.tsx +4 -6
  1000. package/corpus/templates/content/app/routes/p.$id.tsx +9 -6
  1001. package/corpus/templates/design/app/components/ThemeToggle.tsx +3 -1
  1002. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +6 -4
  1003. package/corpus/templates/design/app/components/design/DesignToolbar.tsx +27 -22
  1004. package/corpus/templates/design/app/components/design/DrawOverlay.tsx +4 -2
  1005. package/corpus/templates/design/app/components/design/EditPanel.tsx +130 -100
  1006. package/corpus/templates/design/app/components/design/PresentMode.tsx +3 -1
  1007. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +8 -6
  1008. package/corpus/templates/design/app/components/design/VariantGrid.tsx +6 -4
  1009. package/corpus/templates/design/app/components/design/VariantHandoffCard.tsx +8 -4
  1010. package/corpus/templates/design/app/components/design/ViewportTabs.tsx +5 -3
  1011. package/corpus/templates/design/app/components/design/ZoomControls.tsx +3 -1
  1012. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +31 -18
  1013. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +12 -8
  1014. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +14 -10
  1015. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +4 -2
  1016. package/corpus/templates/design/app/i18n-data.ts +6107 -332
  1017. package/corpus/templates/design/app/pages/DesignEditor.tsx +106 -81
  1018. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +110 -115
  1019. package/corpus/templates/design/app/pages/DesignSystems.tsx +154 -83
  1020. package/corpus/templates/design/app/pages/Index.tsx +69 -57
  1021. package/corpus/templates/design/app/pages/NotFound.tsx +4 -2
  1022. package/corpus/templates/design/app/pages/Present.tsx +1 -1
  1023. package/corpus/templates/design/app/pages/Templates.tsx +18 -12
  1024. package/corpus/templates/design/app/routes/$.tsx +2 -1
  1025. package/corpus/templates/design/app/routes/design-systems.tsx +2 -1
  1026. package/corpus/templates/design/app/routes/design-systems_.setup.tsx +2 -1
  1027. package/corpus/templates/design/app/routes/design.$id.tsx +2 -1
  1028. package/corpus/templates/design/app/routes/examples.tsx +3 -1
  1029. package/corpus/templates/design/app/routes/extensions.$id.tsx +3 -1
  1030. package/corpus/templates/design/app/routes/extensions._index.tsx +3 -1
  1031. package/corpus/templates/design/app/routes/extensions.tsx +3 -1
  1032. package/corpus/templates/design/app/routes/observability.tsx +3 -1
  1033. package/corpus/templates/design/app/routes/present.$id.tsx +2 -1
  1034. package/corpus/templates/design/app/routes/settings.tsx +2 -1
  1035. package/corpus/templates/design/app/routes/team.tsx +3 -1
  1036. package/corpus/templates/design/app/routes/templates.tsx +2 -1
  1037. package/corpus/templates/dispatch/app/i18n-data.ts +1881 -1
  1038. package/corpus/templates/dispatch/app/routes/chat.$threadId.tsx +10 -7
  1039. package/corpus/templates/dispatch/app/routes/chat.tsx +9 -7
  1040. package/corpus/templates/dispatch/app/routes/extensions.$id.tsx +2 -1
  1041. package/corpus/templates/dispatch/app/routes/extensions._index.tsx +2 -1
  1042. package/corpus/templates/dispatch/app/routes/integrations.tsx +327 -209
  1043. package/corpus/templates/dispatch/app/routes/settings.tsx +3 -1
  1044. package/corpus/templates/dispatch/app/routes/tools.$id.tsx +2 -1
  1045. package/corpus/templates/dispatch/app/routes/tools._index.tsx +2 -1
  1046. package/corpus/templates/forms/app/components/CloudUpgrade.tsx +38 -28
  1047. package/corpus/templates/forms/app/components/ThemeToggle.tsx +3 -1
  1048. package/corpus/templates/forms/app/components/builder/FieldPropertiesPanel.tsx +33 -29
  1049. package/corpus/templates/forms/app/i18n/ar-SA.ts +279 -53
  1050. package/corpus/templates/forms/app/i18n/de-DE.ts +287 -53
  1051. package/corpus/templates/forms/app/i18n/en-US.ts +225 -0
  1052. package/corpus/templates/forms/app/i18n/es-ES.ts +233 -1
  1053. package/corpus/templates/forms/app/i18n/fr-FR.ts +290 -54
  1054. package/corpus/templates/forms/app/i18n/hi-IN.ts +275 -55
  1055. package/corpus/templates/forms/app/i18n/ja-JP.ts +278 -55
  1056. package/corpus/templates/forms/app/i18n/ko-KR.ts +271 -55
  1057. package/corpus/templates/forms/app/i18n/pt-BR.ts +286 -52
  1058. package/corpus/templates/forms/app/i18n/zh-CN.ts +261 -56
  1059. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +214 -148
  1060. package/corpus/templates/forms/app/pages/FormFillPage.tsx +12 -7
  1061. package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +8 -4
  1062. package/corpus/templates/forms/app/routes/_app.extensions.$id.tsx +3 -1
  1063. package/corpus/templates/forms/app/routes/_app.extensions._index.tsx +3 -1
  1064. package/corpus/templates/forms/app/routes/_app.forms.$id.tsx +2 -1
  1065. package/corpus/templates/forms/app/routes/_app.forms.$id_.responses.tsx +2 -1
  1066. package/corpus/templates/forms/app/routes/_app.forms._index.tsx +3 -4
  1067. package/corpus/templates/forms/app/routes/_app.response-insights.tsx +3 -2
  1068. package/corpus/templates/forms/app/routes/_app.settings.tsx +2 -1
  1069. package/corpus/templates/forms/app/routes/_index.tsx +3 -4
  1070. package/corpus/templates/forms/app/routes/form-preview.tsx +25 -26
  1071. package/corpus/templates/macros/app/components/AddExerciseDialog.tsx +18 -15
  1072. package/corpus/templates/macros/app/components/AddMealDialog.tsx +22 -19
  1073. package/corpus/templates/macros/app/components/AddWeightDialog.tsx +17 -16
  1074. package/corpus/templates/macros/app/components/DailyProgress.tsx +24 -18
  1075. package/corpus/templates/macros/app/components/ExerciseCard.tsx +5 -3
  1076. package/corpus/templates/macros/app/components/MealCard.tsx +5 -3
  1077. package/corpus/templates/macros/app/components/VoiceDictation.tsx +14 -13
  1078. package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +37 -20
  1079. package/corpus/templates/macros/app/components/WeightCard.tsx +16 -9
  1080. package/corpus/templates/macros/app/components/WeightTracker.tsx +13 -6
  1081. package/corpus/templates/macros/app/i18n/ar-SA.ts +154 -2
  1082. package/corpus/templates/macros/app/i18n/de-DE.ts +158 -2
  1083. package/corpus/templates/macros/app/i18n/en-US.ts +152 -0
  1084. package/corpus/templates/macros/app/i18n/es-ES.ts +154 -0
  1085. package/corpus/templates/macros/app/i18n/fr-FR.ts +157 -2
  1086. package/corpus/templates/macros/app/i18n/hi-IN.ts +154 -3
  1087. package/corpus/templates/macros/app/i18n/ja-JP.ts +153 -2
  1088. package/corpus/templates/macros/app/i18n/ko-KR.ts +153 -2
  1089. package/corpus/templates/macros/app/i18n/pt-BR.ts +155 -0
  1090. package/corpus/templates/macros/app/i18n/zh-CN.ts +152 -2
  1091. package/corpus/templates/macros/app/routes/_index.tsx +20 -16
  1092. package/corpus/templates/macros/app/routes/analytics.tsx +3 -3
  1093. package/corpus/templates/macros/app/routes/extensions.$id.tsx +3 -1
  1094. package/corpus/templates/macros/app/routes/extensions._index.tsx +3 -1
  1095. package/corpus/templates/macros/app/routes/settings.tsx +2 -1
  1096. package/corpus/templates/macros/app/routes/team.tsx +6 -3
  1097. package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +69 -62
  1098. package/corpus/templates/mail/app/components/ThemeToggle.tsx +10 -3
  1099. package/corpus/templates/mail/app/components/agent-engine-picker.tsx +6 -5
  1100. package/corpus/templates/mail/app/components/email/CodeBlockLangPicker.tsx +1 -1
  1101. package/corpus/templates/mail/app/components/email/ComposeModal.tsx +6 -8
  1102. package/corpus/templates/mail/app/components/email/ComposeSlashMenu.tsx +45 -34
  1103. package/corpus/templates/mail/app/components/email/EmailThread.tsx +5 -3
  1104. package/corpus/templates/mail/app/components/email/InlineReplyComposer.tsx +4 -6
  1105. package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +16 -10
  1106. package/corpus/templates/mail/app/components/email/MobileActionBar.tsx +28 -20
  1107. package/corpus/templates/mail/app/components/email/SendLaterButton.tsx +12 -7
  1108. package/corpus/templates/mail/app/components/email/SnoozeModal.tsx +9 -6
  1109. package/corpus/templates/mail/app/components/email/SnoozePopover.tsx +9 -9
  1110. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +2 -2
  1111. package/corpus/templates/mail/app/components/settings/GmailFiltersSection.tsx +40 -30
  1112. package/corpus/templates/mail/app/i18n/ar-SA.ts +435 -134
  1113. package/corpus/templates/mail/app/i18n/de-DE.ts +441 -131
  1114. package/corpus/templates/mail/app/i18n/en-US.ts +300 -1
  1115. package/corpus/templates/mail/app/i18n/es-ES.ts +443 -134
  1116. package/corpus/templates/mail/app/i18n/fr-FR.ts +444 -134
  1117. package/corpus/templates/mail/app/i18n/hi-IN.ts +441 -138
  1118. package/corpus/templates/mail/app/i18n/ja-JP.ts +437 -134
  1119. package/corpus/templates/mail/app/i18n/ko-KR.ts +437 -134
  1120. package/corpus/templates/mail/app/i18n/pt-BR.ts +440 -133
  1121. package/corpus/templates/mail/app/i18n/zh-CN.ts +361 -70
  1122. package/corpus/templates/mail/app/pages/DraftQueuePage.tsx +66 -41
  1123. package/corpus/templates/mail/app/pages/InboxPage.tsx +5 -1
  1124. package/corpus/templates/mail/app/pages/SettingsPage.tsx +125 -108
  1125. package/corpus/templates/mail/app/routes/$.tsx +2 -1
  1126. package/corpus/templates/mail/app/routes/draft-queue.$id.tsx +2 -1
  1127. package/corpus/templates/mail/app/routes/draft-queue.tsx +2 -1
  1128. package/corpus/templates/mail/app/routes/email.tsx +10 -7
  1129. package/corpus/templates/mail/app/routes/settings.tsx +2 -1
  1130. package/corpus/templates/mail/app/routes/team.tsx +2 -1
  1131. package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +7 -4
  1132. package/corpus/templates/plan/app/components/editor/planSlashCommands.ts +51 -26
  1133. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +2 -2
  1134. package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +7 -4
  1135. package/corpus/templates/plan/app/components/plan/DocumentArea.tsx +19 -15
  1136. package/corpus/templates/plan/app/components/plan/LocalCodebasePicker.tsx +34 -17
  1137. package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +9 -5
  1138. package/corpus/templates/plan/app/components/plan/PlanImageNode.tsx +9 -4
  1139. package/corpus/templates/plan/app/components/plan/PlanImageViewer.tsx +47 -20
  1140. package/corpus/templates/plan/app/components/plan/PlanMarkdownReader.tsx +4 -2
  1141. package/corpus/templates/plan/app/components/plan/PlanTableOfContents.tsx +6 -1
  1142. package/corpus/templates/plan/app/components/plan/PlanVisualSurface.tsx +10 -5
  1143. package/corpus/templates/plan/app/components/plan/PrototypeViewer.tsx +3 -1
  1144. package/corpus/templates/plan/app/components/plan/image-actions.ts +29 -7
  1145. package/corpus/templates/plan/app/components/plan/planBlocks.tsx +16 -8
  1146. package/corpus/templates/plan/app/components/plan/wireframe/LegacyRegionWireframe.tsx +27 -18
  1147. package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +3 -1
  1148. package/corpus/templates/plan/app/components/plan/wireframe/wireframe-icons.ts +1 -0
  1149. package/corpus/templates/plan/app/i18n/ar-SA.ts +663 -1
  1150. package/corpus/templates/plan/app/i18n/de-DE.ts +670 -0
  1151. package/corpus/templates/plan/app/i18n/en-US.ts +643 -0
  1152. package/corpus/templates/plan/app/i18n/es-ES.ts +667 -0
  1153. package/corpus/templates/plan/app/i18n/fr-FR.ts +672 -2
  1154. package/corpus/templates/plan/app/i18n/hi-IN.ts +641 -1
  1155. package/corpus/templates/plan/app/i18n/ja-JP.ts +633 -1
  1156. package/corpus/templates/plan/app/i18n/ko-KR.ts +623 -1
  1157. package/corpus/templates/plan/app/i18n/pt-BR.ts +671 -3
  1158. package/corpus/templates/plan/app/i18n/zh-CN.ts +620 -1
  1159. package/corpus/templates/plan/app/pages/PlansPage.tsx +697 -488
  1160. package/corpus/templates/slides/app/components/CloudUpgrade.tsx +16 -13
  1161. package/corpus/templates/slides/app/components/ThemeToggle.tsx +3 -1
  1162. package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +37 -25
  1163. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +3 -2
  1164. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +3 -1
  1165. package/corpus/templates/slides/app/components/design-system/DesignSystemPreview.tsx +6 -4
  1166. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +104 -73
  1167. package/corpus/templates/slides/app/components/editor/AnimationsPanel.tsx +21 -17
  1168. package/corpus/templates/slides/app/components/editor/AssetLibraryPanel.tsx +6 -3
  1169. package/corpus/templates/slides/app/components/editor/BlockBubbleMenu.tsx +4 -2
  1170. package/corpus/templates/slides/app/components/editor/CodeEditor.tsx +7 -4
  1171. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +26 -18
  1172. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +116 -91
  1173. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +21 -21
  1174. package/corpus/templates/slides/app/components/editor/GenerateSlidesDialog.tsx +16 -16
  1175. package/corpus/templates/slides/app/components/editor/GeneratingOverlay.tsx +4 -2
  1176. package/corpus/templates/slides/app/components/editor/GoogleDocImportHint.tsx +9 -5
  1177. package/corpus/templates/slides/app/components/editor/HistoryPanel.tsx +44 -54
  1178. package/corpus/templates/slides/app/components/editor/ImageDropPromptPopover.tsx +10 -11
  1179. package/corpus/templates/slides/app/components/editor/ImageGenPanel.tsx +4 -2
  1180. package/corpus/templates/slides/app/components/editor/ImageOverlay.tsx +3 -1
  1181. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +8 -5
  1182. package/corpus/templates/slides/app/components/editor/ImportButton.tsx +3 -2
  1183. package/corpus/templates/slides/app/components/editor/LogoSearchPanel.tsx +20 -10
  1184. package/corpus/templates/slides/app/components/editor/MermaidToExcalidrawPanel.tsx +3 -1
  1185. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +5 -4
  1186. package/corpus/templates/slides/app/components/editor/ShareDialog.tsx +22 -21
  1187. package/corpus/templates/slides/app/components/editor/SlideBubbleMenu.tsx +32 -21
  1188. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +19 -34
  1189. package/corpus/templates/slides/app/components/editor/SlideInlineEditor.tsx +9 -8
  1190. package/corpus/templates/slides/app/components/editor/SlideSlashMenu.tsx +32 -27
  1191. package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +7 -2
  1192. package/corpus/templates/slides/app/components/layout/AgentWorkIndicator.tsx +6 -3
  1193. package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +11 -8
  1194. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +6 -5
  1195. package/corpus/templates/slides/app/components/visual-editor/DrawOverlay.tsx +8 -6
  1196. package/corpus/templates/slides/app/components/visual-editor/MultiSelectChip.tsx +7 -3
  1197. package/corpus/templates/slides/app/components/visual-editor/SaveStatusIndicator.tsx +4 -2
  1198. package/corpus/templates/slides/app/i18n/ar-SA.ts +525 -3
  1199. package/corpus/templates/slides/app/i18n/de-DE.ts +504 -4
  1200. package/corpus/templates/slides/app/i18n/en-US.ts +490 -0
  1201. package/corpus/templates/slides/app/i18n/es-ES.ts +514 -4
  1202. package/corpus/templates/slides/app/i18n/fr-FR.ts +519 -5
  1203. package/corpus/templates/slides/app/i18n/hi-IN.ts +489 -4
  1204. package/corpus/templates/slides/app/i18n/ja-JP.ts +485 -3
  1205. package/corpus/templates/slides/app/i18n/ko-KR.ts +481 -3
  1206. package/corpus/templates/slides/app/i18n/pt-BR.ts +507 -2
  1207. package/corpus/templates/slides/app/i18n/zh-CN.ts +475 -3
  1208. package/corpus/templates/slides/app/pages/DeckEditor.tsx +25 -21
  1209. package/corpus/templates/slides/app/pages/Index.tsx +47 -45
  1210. package/corpus/templates/slides/app/pages/SharedPresentation.tsx +4 -3
  1211. package/corpus/templates/slides/app/routes/$.tsx +2 -1
  1212. package/corpus/templates/slides/app/routes/deck.$id.tsx +2 -1
  1213. package/corpus/templates/slides/app/routes/design-systems.tsx +2 -1
  1214. package/corpus/templates/slides/app/routes/settings.tsx +2 -1
  1215. package/corpus/templates/slides/app/routes/share.$token.tsx +2 -1
  1216. package/corpus/templates/slides/app/routes/slide.tsx +11 -5
  1217. package/corpus/templates/slides/app/routes/team.tsx +6 -3
  1218. package/corpus/templates/videos/app/components/CameraControls.tsx +11 -7
  1219. package/corpus/templates/videos/app/components/CameraToolbar.tsx +13 -11
  1220. package/corpus/templates/videos/app/components/CloudUpgrade.tsx +19 -16
  1221. package/corpus/templates/videos/app/components/CompSettingsEditor.tsx +6 -1
  1222. package/corpus/templates/videos/app/components/ComponentLibrarySidebar.tsx +29 -29
  1223. package/corpus/templates/videos/app/components/ComponentPropsPanel.tsx +37 -17
  1224. package/corpus/templates/videos/app/components/ComponentsSidebar.tsx +8 -3
  1225. package/corpus/templates/videos/app/components/CompositionCard.tsx +11 -3
  1226. package/corpus/templates/videos/app/components/CurrentElementPanel.tsx +45 -42
  1227. package/corpus/templates/videos/app/components/CursorControls.tsx +37 -18
  1228. package/corpus/templates/videos/app/components/CursorPositioningOverlay.tsx +3 -1
  1229. package/corpus/templates/videos/app/components/LibraryFolderRow.tsx +8 -4
  1230. package/corpus/templates/videos/app/components/MotionCurveSelect.tsx +9 -6
  1231. package/corpus/templates/videos/app/components/PropsEditor.tsx +6 -2
  1232. package/corpus/templates/videos/app/components/Sidebar.tsx +7 -7
  1233. package/corpus/templates/videos/app/components/Timeline.tsx +8 -6
  1234. package/corpus/templates/videos/app/components/TrackPropertiesPanel.tsx +50 -33
  1235. package/corpus/templates/videos/app/components/TweaksPanel.tsx +18 -9
  1236. package/corpus/templates/videos/app/components/VideoPlayer.tsx +9 -5
  1237. package/corpus/templates/videos/app/components/design-system/DesignSystemPreview.tsx +14 -12
  1238. package/corpus/templates/videos/app/components/design-system/DesignSystemSetup.tsx +31 -29
  1239. package/corpus/templates/videos/app/components/keyframes/KeyframeActionButtons.tsx +11 -7
  1240. package/corpus/templates/videos/app/i18n/ar-SA.ts +358 -1
  1241. package/corpus/templates/videos/app/i18n/de-DE.ts +378 -0
  1242. package/corpus/templates/videos/app/i18n/en-US.ts +362 -0
  1243. package/corpus/templates/videos/app/i18n/es-ES.ts +377 -1
  1244. package/corpus/templates/videos/app/i18n/fr-FR.ts +379 -2
  1245. package/corpus/templates/videos/app/i18n/hi-IN.ts +359 -1
  1246. package/corpus/templates/videos/app/i18n/ja-JP.ts +371 -1
  1247. package/corpus/templates/videos/app/i18n/ko-KR.ts +364 -1
  1248. package/corpus/templates/videos/app/i18n/pt-BR.ts +371 -1
  1249. package/corpus/templates/videos/app/i18n/zh-CN.ts +351 -1
  1250. package/corpus/templates/videos/app/pages/ComponentLibrary.tsx +6 -2
  1251. package/corpus/templates/videos/app/pages/ComponentLibraryView.tsx +45 -24
  1252. package/corpus/templates/videos/app/pages/CompositionView.tsx +61 -34
  1253. package/corpus/templates/videos/app/routes/$.tsx +2 -1
  1254. package/corpus/templates/videos/app/routes/c.$compositionId.tsx +2 -1
  1255. package/corpus/templates/videos/app/routes/components.tsx +2 -1
  1256. package/corpus/templates/videos/app/routes/design-systems.tsx +2 -1
  1257. package/corpus/templates/videos/app/routes/settings.tsx +2 -1
  1258. package/corpus/templates/videos/app/routes/team.tsx +2 -1
  1259. package/dist/agent/production-agent.d.ts.map +1 -1
  1260. package/dist/agent/production-agent.js +31 -0
  1261. package/dist/agent/production-agent.js.map +1 -1
  1262. package/dist/agent/run-store.d.ts +2 -0
  1263. package/dist/agent/run-store.d.ts.map +1 -1
  1264. package/dist/agent/run-store.js +2 -0
  1265. package/dist/agent/run-store.js.map +1 -1
  1266. package/dist/client/changelog/Changelog.d.ts +7 -2
  1267. package/dist/client/changelog/Changelog.d.ts.map +1 -1
  1268. package/dist/client/changelog/Changelog.js +9 -7
  1269. package/dist/client/changelog/Changelog.js.map +1 -1
  1270. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  1271. package/dist/client/extensions/ExtensionsSidebarSection.js +339 -11
  1272. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  1273. package/dist/client/i18n.d.ts.map +1 -1
  1274. package/dist/client/i18n.js +12 -1
  1275. package/dist/client/i18n.js.map +1 -1
  1276. package/dist/collab/routes.d.ts +1 -1
  1277. package/dist/notifications/routes.d.ts +1 -1
  1278. package/dist/observability/routes.d.ts +5 -5
  1279. package/dist/progress/routes.d.ts +1 -1
  1280. package/dist/resources/handlers.d.ts +3 -3
  1281. package/dist/server/agent-engine-api-key-route.d.ts +2 -2
  1282. package/dist/server/transcribe-voice.d.ts +1 -1
  1283. package/dist/templates/default/app/i18n/ar-SA.ts +275 -274
  1284. package/dist/templates/default/app/i18n/de-DE.ts +270 -260
  1285. package/dist/templates/default/app/i18n/es-ES.ts +282 -270
  1286. package/dist/templates/default/app/i18n/fr-FR.ts +275 -266
  1287. package/dist/templates/default/app/i18n/hi-IN.ts +274 -276
  1288. package/dist/templates/default/app/i18n/ja-JP.ts +280 -273
  1289. package/dist/templates/default/app/i18n/ko-KR.ts +274 -274
  1290. package/dist/templates/default/app/i18n/pt-BR.ts +273 -266
  1291. package/dist/templates/default/app/i18n/zh-CN.ts +273 -285
  1292. package/docs/content/locales/ar-SA/a2a-protocol.md +2 -2
  1293. package/docs/content/locales/ar-SA/actions.md +6 -6
  1294. package/docs/content/locales/ar-SA/agent-surfaces.md +5 -5
  1295. package/docs/content/locales/ar-SA/agent-teams.md +4 -4
  1296. package/docs/content/locales/ar-SA/agent-web-surfaces.md +2 -2
  1297. package/docs/content/locales/ar-SA/authentication.md +4 -4
  1298. package/docs/content/locales/ar-SA/automations.md +3 -3
  1299. package/docs/content/locales/ar-SA/blueprint-installer.md +2 -2
  1300. package/docs/content/locales/ar-SA/cli-adapters.md +1 -1
  1301. package/docs/content/locales/ar-SA/code-agents-ui.md +2 -2
  1302. package/docs/content/locales/ar-SA/components.md +14 -14
  1303. package/docs/content/locales/ar-SA/context-awareness.md +3 -3
  1304. package/docs/content/locales/ar-SA/creating-templates.md +12 -12
  1305. package/docs/content/locales/ar-SA/cross-app-sso.md +3 -3
  1306. package/docs/content/locales/ar-SA/database.md +7 -7
  1307. package/docs/content/locales/ar-SA/deployment.md +4 -4
  1308. package/docs/content/locales/ar-SA/dispatch.md +3 -3
  1309. package/docs/content/locales/ar-SA/drop-in-agent.md +8 -8
  1310. package/docs/content/locales/ar-SA/durable-resume.md +1 -1
  1311. package/docs/content/locales/ar-SA/embedding-sdk.md +2 -2
  1312. package/docs/content/locales/ar-SA/evals.md +3 -3
  1313. package/docs/content/locales/ar-SA/extensions.md +2 -2
  1314. package/docs/content/locales/ar-SA/external-agents.md +8 -8
  1315. package/docs/content/locales/ar-SA/faq.md +3 -3
  1316. package/docs/content/locales/ar-SA/file-uploads.md +4 -4
  1317. package/docs/content/locales/ar-SA/frames.md +1 -1
  1318. package/docs/content/locales/ar-SA/getting-started.md +13 -13
  1319. package/docs/content/locales/ar-SA/harness-agents.md +3 -3
  1320. package/docs/content/locales/ar-SA/human-approval.md +3 -3
  1321. package/docs/content/locales/ar-SA/key-concepts.md +14 -14
  1322. package/docs/content/locales/ar-SA/local-file-mode.md +5 -5
  1323. package/docs/content/locales/ar-SA/mcp-apps.md +9 -9
  1324. package/docs/content/locales/ar-SA/mcp-clients.md +9 -9
  1325. package/docs/content/locales/ar-SA/mcp-protocol.md +5 -5
  1326. package/docs/content/locales/ar-SA/messaging.md +5 -5
  1327. package/docs/content/locales/ar-SA/migration-workbench.md +1 -1
  1328. package/docs/content/locales/ar-SA/multi-app-workspace.md +1 -1
  1329. package/docs/content/locales/ar-SA/multi-tenancy.md +2 -2
  1330. package/docs/content/locales/ar-SA/native-chat-ui.md +4 -4
  1331. package/docs/content/locales/ar-SA/notifications.md +5 -5
  1332. package/docs/content/locales/ar-SA/observability.md +1 -1
  1333. package/docs/content/locales/ar-SA/observational-memory.md +2 -2
  1334. package/docs/content/locales/ar-SA/onboarding.md +8 -8
  1335. package/docs/content/locales/ar-SA/plan-plugin.md +3 -3
  1336. package/docs/content/locales/ar-SA/pr-visual-recap.md +11 -11
  1337. package/docs/content/locales/ar-SA/processors.md +2 -2
  1338. package/docs/content/locales/ar-SA/progress.md +3 -3
  1339. package/docs/content/locales/ar-SA/pure-agent-apps.md +1 -1
  1340. package/docs/content/locales/ar-SA/real-time-collaboration.md +6 -6
  1341. package/docs/content/locales/ar-SA/recurring-jobs.md +5 -5
  1342. package/docs/content/locales/ar-SA/routing.md +1 -1
  1343. package/docs/content/locales/ar-SA/sandbox-adapters.md +3 -3
  1344. package/docs/content/locales/ar-SA/security.md +10 -10
  1345. package/docs/content/locales/ar-SA/server.md +9 -9
  1346. package/docs/content/locales/ar-SA/sharing.md +7 -7
  1347. package/docs/content/locales/ar-SA/skills-guide.md +16 -16
  1348. package/docs/content/locales/ar-SA/template-analytics.md +10 -10
  1349. package/docs/content/locales/ar-SA/template-assets.md +19 -19
  1350. package/docs/content/locales/ar-SA/template-brain.md +11 -11
  1351. package/docs/content/locales/ar-SA/template-calendar.md +9 -9
  1352. package/docs/content/locales/ar-SA/template-chat.md +3 -3
  1353. package/docs/content/locales/ar-SA/template-clips.md +13 -13
  1354. package/docs/content/locales/ar-SA/template-content.md +15 -15
  1355. package/docs/content/locales/ar-SA/template-design.md +7 -7
  1356. package/docs/content/locales/ar-SA/template-dispatch.md +8 -8
  1357. package/docs/content/locales/ar-SA/template-forms.md +9 -9
  1358. package/docs/content/locales/ar-SA/template-mail.md +7 -7
  1359. package/docs/content/locales/ar-SA/template-plan.md +3 -3
  1360. package/docs/content/locales/ar-SA/template-slides.md +8 -8
  1361. package/docs/content/locales/ar-SA/template-videos.md +5 -5
  1362. package/docs/content/locales/ar-SA/tracking.md +6 -6
  1363. package/docs/content/locales/ar-SA/using-your-agent.md +4 -4
  1364. package/docs/content/locales/ar-SA/voice-input.md +4 -4
  1365. package/docs/content/locales/ar-SA/what-is-agent-native.md +4 -4
  1366. package/docs/content/locales/ar-SA/workspace-connections.md +8 -8
  1367. package/docs/content/locales/ar-SA/workspace-management.md +4 -4
  1368. package/docs/content/locales/ar-SA/workspace.md +24 -24
  1369. package/docs/content/locales/ar-SA/writing-agent-instructions.md +18 -18
  1370. package/docs/content/locales/de-DE/a2a-protocol.md +7 -7
  1371. package/docs/content/locales/de-DE/actions.md +5 -5
  1372. package/docs/content/locales/de-DE/agent-mentions.md +4 -4
  1373. package/docs/content/locales/de-DE/agent-surfaces.md +22 -22
  1374. package/docs/content/locales/de-DE/agent-teams.md +4 -4
  1375. package/docs/content/locales/de-DE/agent-web-surfaces.md +4 -4
  1376. package/docs/content/locales/de-DE/authentication.md +6 -6
  1377. package/docs/content/locales/de-DE/automations.md +8 -8
  1378. package/docs/content/locales/de-DE/blueprint-installer.md +2 -2
  1379. package/docs/content/locales/de-DE/client.md +6 -6
  1380. package/docs/content/locales/de-DE/cloneable-saas.md +2 -2
  1381. package/docs/content/locales/de-DE/code-agents-ui.md +9 -9
  1382. package/docs/content/locales/de-DE/components.md +15 -15
  1383. package/docs/content/locales/de-DE/context-awareness.md +8 -8
  1384. package/docs/content/locales/de-DE/creating-templates.md +13 -13
  1385. package/docs/content/locales/de-DE/cross-app-sso.md +3 -3
  1386. package/docs/content/locales/de-DE/database.md +5 -5
  1387. package/docs/content/locales/de-DE/deployment.md +6 -6
  1388. package/docs/content/locales/de-DE/dispatch.md +3 -3
  1389. package/docs/content/locales/de-DE/drop-in-agent.md +14 -14
  1390. package/docs/content/locales/de-DE/durable-resume.md +1 -1
  1391. package/docs/content/locales/de-DE/embedding-sdk.md +2 -2
  1392. package/docs/content/locales/de-DE/evals.md +2 -2
  1393. package/docs/content/locales/de-DE/extensions.md +2 -2
  1394. package/docs/content/locales/de-DE/external-agents.md +6 -6
  1395. package/docs/content/locales/de-DE/faq.md +5 -5
  1396. package/docs/content/locales/de-DE/file-uploads.md +4 -4
  1397. package/docs/content/locales/de-DE/frames.md +2 -2
  1398. package/docs/content/locales/de-DE/getting-started.md +16 -16
  1399. package/docs/content/locales/de-DE/harness-agents.md +3 -3
  1400. package/docs/content/locales/de-DE/human-approval.md +4 -4
  1401. package/docs/content/locales/de-DE/key-concepts.md +14 -14
  1402. package/docs/content/locales/de-DE/local-file-mode.md +8 -8
  1403. package/docs/content/locales/de-DE/mcp-apps.md +4 -4
  1404. package/docs/content/locales/de-DE/mcp-clients.md +7 -7
  1405. package/docs/content/locales/de-DE/mcp-protocol.md +3 -3
  1406. package/docs/content/locales/de-DE/messaging.md +5 -5
  1407. package/docs/content/locales/de-DE/migration-workbench.md +1 -1
  1408. package/docs/content/locales/de-DE/multi-app-workspace.md +2 -2
  1409. package/docs/content/locales/de-DE/multi-tenancy.md +1 -1
  1410. package/docs/content/locales/de-DE/native-chat-ui.md +8 -8
  1411. package/docs/content/locales/de-DE/notifications.md +3 -3
  1412. package/docs/content/locales/de-DE/observability.md +2 -2
  1413. package/docs/content/locales/de-DE/observational-memory.md +2 -2
  1414. package/docs/content/locales/de-DE/onboarding.md +8 -8
  1415. package/docs/content/locales/de-DE/plan-plugin.md +3 -3
  1416. package/docs/content/locales/de-DE/pr-visual-recap.md +11 -11
  1417. package/docs/content/locales/de-DE/processors.md +1 -1
  1418. package/docs/content/locales/de-DE/progress.md +2 -2
  1419. package/docs/content/locales/de-DE/pure-agent-apps.md +1 -1
  1420. package/docs/content/locales/de-DE/real-time-collaboration.md +8 -8
  1421. package/docs/content/locales/de-DE/recurring-jobs.md +5 -5
  1422. package/docs/content/locales/de-DE/routing.md +1 -1
  1423. package/docs/content/locales/de-DE/sandbox-adapters.md +2 -2
  1424. package/docs/content/locales/de-DE/security.md +10 -10
  1425. package/docs/content/locales/de-DE/server.md +10 -10
  1426. package/docs/content/locales/de-DE/sharing.md +6 -6
  1427. package/docs/content/locales/de-DE/skills-guide.md +17 -17
  1428. package/docs/content/locales/de-DE/template-analytics.md +10 -10
  1429. package/docs/content/locales/de-DE/template-assets.md +21 -21
  1430. package/docs/content/locales/de-DE/template-brain.md +11 -11
  1431. package/docs/content/locales/de-DE/template-calendar.md +10 -10
  1432. package/docs/content/locales/de-DE/template-chat.md +5 -5
  1433. package/docs/content/locales/de-DE/template-clips.md +14 -14
  1434. package/docs/content/locales/de-DE/template-content.md +14 -14
  1435. package/docs/content/locales/de-DE/template-design.md +7 -7
  1436. package/docs/content/locales/de-DE/template-dispatch.md +12 -12
  1437. package/docs/content/locales/de-DE/template-forms.md +9 -9
  1438. package/docs/content/locales/de-DE/template-mail.md +6 -6
  1439. package/docs/content/locales/de-DE/template-plan.md +3 -3
  1440. package/docs/content/locales/de-DE/template-slides.md +8 -8
  1441. package/docs/content/locales/de-DE/template-videos.md +6 -6
  1442. package/docs/content/locales/de-DE/tracking.md +3 -3
  1443. package/docs/content/locales/de-DE/using-your-agent.md +6 -6
  1444. package/docs/content/locales/de-DE/voice-input.md +9 -9
  1445. package/docs/content/locales/de-DE/what-is-agent-native.md +6 -6
  1446. package/docs/content/locales/de-DE/workspace-connections.md +9 -9
  1447. package/docs/content/locales/de-DE/workspace-management.md +5 -5
  1448. package/docs/content/locales/de-DE/workspace.md +23 -23
  1449. package/docs/content/locales/de-DE/writing-agent-instructions.md +30 -30
  1450. package/docs/content/locales/es-ES/a2a-protocol.md +7 -7
  1451. package/docs/content/locales/es-ES/actions.md +2 -2
  1452. package/docs/content/locales/es-ES/agent-mentions.md +3 -3
  1453. package/docs/content/locales/es-ES/agent-surfaces.md +7 -7
  1454. package/docs/content/locales/es-ES/agent-teams.md +3 -3
  1455. package/docs/content/locales/es-ES/agent-web-surfaces.md +5 -5
  1456. package/docs/content/locales/es-ES/authentication.md +6 -6
  1457. package/docs/content/locales/es-ES/automations.md +8 -8
  1458. package/docs/content/locales/es-ES/blueprint-installer.md +2 -2
  1459. package/docs/content/locales/es-ES/client.md +1 -1
  1460. package/docs/content/locales/es-ES/cloneable-saas.md +2 -2
  1461. package/docs/content/locales/es-ES/code-agents-ui.md +4 -4
  1462. package/docs/content/locales/es-ES/components.md +5 -5
  1463. package/docs/content/locales/es-ES/context-awareness.md +8 -8
  1464. package/docs/content/locales/es-ES/creating-templates.md +12 -12
  1465. package/docs/content/locales/es-ES/cross-app-sso.md +3 -3
  1466. package/docs/content/locales/es-ES/database.md +5 -5
  1467. package/docs/content/locales/es-ES/deployment.md +4 -4
  1468. package/docs/content/locales/es-ES/dispatch.md +3 -3
  1469. package/docs/content/locales/es-ES/drop-in-agent.md +8 -8
  1470. package/docs/content/locales/es-ES/durable-resume.md +1 -1
  1471. package/docs/content/locales/es-ES/embedding-sdk.md +2 -2
  1472. package/docs/content/locales/es-ES/evals.md +2 -2
  1473. package/docs/content/locales/es-ES/extensions.md +2 -2
  1474. package/docs/content/locales/es-ES/external-agents.md +5 -5
  1475. package/docs/content/locales/es-ES/faq.md +3 -3
  1476. package/docs/content/locales/es-ES/file-uploads.md +4 -4
  1477. package/docs/content/locales/es-ES/frames.md +1 -1
  1478. package/docs/content/locales/es-ES/getting-started.md +13 -13
  1479. package/docs/content/locales/es-ES/harness-agents.md +3 -3
  1480. package/docs/content/locales/es-ES/human-approval.md +3 -3
  1481. package/docs/content/locales/es-ES/key-concepts.md +14 -14
  1482. package/docs/content/locales/es-ES/local-file-mode.md +6 -6
  1483. package/docs/content/locales/es-ES/mcp-apps.md +4 -4
  1484. package/docs/content/locales/es-ES/mcp-clients.md +8 -8
  1485. package/docs/content/locales/es-ES/mcp-protocol.md +3 -3
  1486. package/docs/content/locales/es-ES/messaging.md +4 -4
  1487. package/docs/content/locales/es-ES/migration-workbench.md +1 -1
  1488. package/docs/content/locales/es-ES/multi-app-workspace.md +1 -1
  1489. package/docs/content/locales/es-ES/multi-tenancy.md +1 -1
  1490. package/docs/content/locales/es-ES/native-chat-ui.md +3 -3
  1491. package/docs/content/locales/es-ES/notifications.md +3 -3
  1492. package/docs/content/locales/es-ES/observability.md +2 -2
  1493. package/docs/content/locales/es-ES/observational-memory.md +2 -2
  1494. package/docs/content/locales/es-ES/onboarding.md +8 -8
  1495. package/docs/content/locales/es-ES/plan-plugin.md +3 -3
  1496. package/docs/content/locales/es-ES/pr-visual-recap.md +11 -11
  1497. package/docs/content/locales/es-ES/processors.md +1 -1
  1498. package/docs/content/locales/es-ES/progress.md +2 -2
  1499. package/docs/content/locales/es-ES/pure-agent-apps.md +1 -1
  1500. package/docs/content/locales/es-ES/real-time-collaboration.md +6 -6
  1501. package/docs/content/locales/es-ES/recurring-jobs.md +5 -5
  1502. package/docs/content/locales/es-ES/routing.md +1 -1
  1503. package/docs/content/locales/es-ES/sandbox-adapters.md +2 -2
  1504. package/docs/content/locales/es-ES/security.md +8 -8
  1505. package/docs/content/locales/es-ES/server.md +11 -11
  1506. package/docs/content/locales/es-ES/sharing.md +6 -6
  1507. package/docs/content/locales/es-ES/skills-guide.md +16 -16
  1508. package/docs/content/locales/es-ES/template-analytics.md +10 -10
  1509. package/docs/content/locales/es-ES/template-assets.md +19 -19
  1510. package/docs/content/locales/es-ES/template-brain.md +11 -11
  1511. package/docs/content/locales/es-ES/template-calendar.md +9 -9
  1512. package/docs/content/locales/es-ES/template-chat.md +3 -3
  1513. package/docs/content/locales/es-ES/template-clips.md +14 -14
  1514. package/docs/content/locales/es-ES/template-content.md +13 -13
  1515. package/docs/content/locales/es-ES/template-design.md +7 -7
  1516. package/docs/content/locales/es-ES/template-dispatch.md +8 -8
  1517. package/docs/content/locales/es-ES/template-forms.md +9 -9
  1518. package/docs/content/locales/es-ES/template-mail.md +6 -6
  1519. package/docs/content/locales/es-ES/template-plan.md +3 -3
  1520. package/docs/content/locales/es-ES/template-slides.md +8 -8
  1521. package/docs/content/locales/es-ES/template-videos.md +5 -5
  1522. package/docs/content/locales/es-ES/tracking.md +3 -3
  1523. package/docs/content/locales/es-ES/using-your-agent.md +5 -5
  1524. package/docs/content/locales/es-ES/voice-input.md +4 -4
  1525. package/docs/content/locales/es-ES/what-is-agent-native.md +6 -6
  1526. package/docs/content/locales/es-ES/workspace-connections.md +8 -8
  1527. package/docs/content/locales/es-ES/workspace-management.md +4 -4
  1528. package/docs/content/locales/es-ES/workspace.md +23 -23
  1529. package/docs/content/locales/es-ES/writing-agent-instructions.md +18 -18
  1530. package/docs/content/locales/fr-FR/a2a-protocol.md +7 -7
  1531. package/docs/content/locales/fr-FR/actions.md +2 -2
  1532. package/docs/content/locales/fr-FR/agent-mentions.md +3 -3
  1533. package/docs/content/locales/fr-FR/agent-surfaces.md +7 -7
  1534. package/docs/content/locales/fr-FR/agent-teams.md +3 -3
  1535. package/docs/content/locales/fr-FR/agent-web-surfaces.md +5 -5
  1536. package/docs/content/locales/fr-FR/authentication.md +6 -6
  1537. package/docs/content/locales/fr-FR/automations.md +8 -8
  1538. package/docs/content/locales/fr-FR/blueprint-installer.md +2 -2
  1539. package/docs/content/locales/fr-FR/client.md +1 -1
  1540. package/docs/content/locales/fr-FR/cloneable-saas.md +2 -2
  1541. package/docs/content/locales/fr-FR/code-agents-ui.md +4 -4
  1542. package/docs/content/locales/fr-FR/components.md +5 -5
  1543. package/docs/content/locales/fr-FR/context-awareness.md +8 -8
  1544. package/docs/content/locales/fr-FR/creating-templates.md +12 -12
  1545. package/docs/content/locales/fr-FR/cross-app-sso.md +4 -4
  1546. package/docs/content/locales/fr-FR/database.md +5 -5
  1547. package/docs/content/locales/fr-FR/deployment.md +5 -5
  1548. package/docs/content/locales/fr-FR/dispatch.md +3 -3
  1549. package/docs/content/locales/fr-FR/drop-in-agent.md +9 -9
  1550. package/docs/content/locales/fr-FR/durable-resume.md +1 -1
  1551. package/docs/content/locales/fr-FR/embedding-sdk.md +7 -7
  1552. package/docs/content/locales/fr-FR/evals.md +2 -2
  1553. package/docs/content/locales/fr-FR/extensions.md +2 -2
  1554. package/docs/content/locales/fr-FR/external-agents.md +5 -5
  1555. package/docs/content/locales/fr-FR/faq.md +3 -3
  1556. package/docs/content/locales/fr-FR/file-uploads.md +5 -5
  1557. package/docs/content/locales/fr-FR/frames.md +1 -1
  1558. package/docs/content/locales/fr-FR/getting-started.md +13 -13
  1559. package/docs/content/locales/fr-FR/harness-agents.md +3 -3
  1560. package/docs/content/locales/fr-FR/human-approval.md +3 -3
  1561. package/docs/content/locales/fr-FR/key-concepts.md +15 -15
  1562. package/docs/content/locales/fr-FR/local-file-mode.md +5 -5
  1563. package/docs/content/locales/fr-FR/mcp-apps.md +4 -4
  1564. package/docs/content/locales/fr-FR/mcp-clients.md +8 -8
  1565. package/docs/content/locales/fr-FR/mcp-protocol.md +3 -3
  1566. package/docs/content/locales/fr-FR/messaging.md +4 -4
  1567. package/docs/content/locales/fr-FR/migration-workbench.md +1 -1
  1568. package/docs/content/locales/fr-FR/multi-app-workspace.md +1 -1
  1569. package/docs/content/locales/fr-FR/multi-tenancy.md +1 -1
  1570. package/docs/content/locales/fr-FR/native-chat-ui.md +3 -3
  1571. package/docs/content/locales/fr-FR/notifications.md +3 -3
  1572. package/docs/content/locales/fr-FR/observability.md +2 -2
  1573. package/docs/content/locales/fr-FR/observational-memory.md +2 -2
  1574. package/docs/content/locales/fr-FR/onboarding.md +8 -8
  1575. package/docs/content/locales/fr-FR/plan-plugin.md +3 -3
  1576. package/docs/content/locales/fr-FR/pr-visual-recap.md +11 -11
  1577. package/docs/content/locales/fr-FR/processors.md +1 -1
  1578. package/docs/content/locales/fr-FR/progress.md +2 -2
  1579. package/docs/content/locales/fr-FR/pure-agent-apps.md +1 -1
  1580. package/docs/content/locales/fr-FR/real-time-collaboration.md +8 -8
  1581. package/docs/content/locales/fr-FR/recurring-jobs.md +5 -5
  1582. package/docs/content/locales/fr-FR/routing.md +1 -1
  1583. package/docs/content/locales/fr-FR/sandbox-adapters.md +2 -2
  1584. package/docs/content/locales/fr-FR/security.md +8 -8
  1585. package/docs/content/locales/fr-FR/server.md +10 -10
  1586. package/docs/content/locales/fr-FR/sharing.md +6 -6
  1587. package/docs/content/locales/fr-FR/skills-guide.md +16 -16
  1588. package/docs/content/locales/fr-FR/template-analytics.md +10 -10
  1589. package/docs/content/locales/fr-FR/template-assets.md +20 -20
  1590. package/docs/content/locales/fr-FR/template-brain.md +11 -11
  1591. package/docs/content/locales/fr-FR/template-calendar.md +9 -9
  1592. package/docs/content/locales/fr-FR/template-chat.md +3 -3
  1593. package/docs/content/locales/fr-FR/template-clips.md +15 -15
  1594. package/docs/content/locales/fr-FR/template-content.md +13 -13
  1595. package/docs/content/locales/fr-FR/template-design.md +8 -8
  1596. package/docs/content/locales/fr-FR/template-dispatch.md +8 -8
  1597. package/docs/content/locales/fr-FR/template-forms.md +10 -10
  1598. package/docs/content/locales/fr-FR/template-mail.md +6 -6
  1599. package/docs/content/locales/fr-FR/template-plan.md +3 -3
  1600. package/docs/content/locales/fr-FR/template-slides.md +9 -9
  1601. package/docs/content/locales/fr-FR/template-videos.md +5 -5
  1602. package/docs/content/locales/fr-FR/tracking.md +3 -3
  1603. package/docs/content/locales/fr-FR/using-your-agent.md +5 -5
  1604. package/docs/content/locales/fr-FR/voice-input.md +4 -4
  1605. package/docs/content/locales/fr-FR/what-is-agent-native.md +6 -6
  1606. package/docs/content/locales/fr-FR/workspace-connections.md +8 -8
  1607. package/docs/content/locales/fr-FR/workspace-management.md +5 -5
  1608. package/docs/content/locales/fr-FR/workspace.md +23 -23
  1609. package/docs/content/locales/fr-FR/writing-agent-instructions.md +18 -18
  1610. package/docs/content/locales/hi-IN/a2a-protocol.md +7 -7
  1611. package/docs/content/locales/hi-IN/actions.md +3 -3
  1612. package/docs/content/locales/hi-IN/agent-mentions.md +3 -3
  1613. package/docs/content/locales/hi-IN/agent-surfaces.md +7 -7
  1614. package/docs/content/locales/hi-IN/agent-teams.md +3 -3
  1615. package/docs/content/locales/hi-IN/agent-web-surfaces.md +5 -5
  1616. package/docs/content/locales/hi-IN/authentication.md +6 -6
  1617. package/docs/content/locales/hi-IN/automations.md +8 -8
  1618. package/docs/content/locales/hi-IN/blueprint-installer.md +2 -2
  1619. package/docs/content/locales/hi-IN/client.md +1 -1
  1620. package/docs/content/locales/hi-IN/cloneable-saas.md +2 -2
  1621. package/docs/content/locales/hi-IN/code-agents-ui.md +4 -4
  1622. package/docs/content/locales/hi-IN/components.md +5 -5
  1623. package/docs/content/locales/hi-IN/context-awareness.md +8 -8
  1624. package/docs/content/locales/hi-IN/creating-templates.md +14 -14
  1625. package/docs/content/locales/hi-IN/cross-app-sso.md +3 -3
  1626. package/docs/content/locales/hi-IN/database.md +5 -5
  1627. package/docs/content/locales/hi-IN/deployment.md +5 -5
  1628. package/docs/content/locales/hi-IN/dispatch.md +4 -4
  1629. package/docs/content/locales/hi-IN/drop-in-agent.md +8 -8
  1630. package/docs/content/locales/hi-IN/durable-resume.md +1 -1
  1631. package/docs/content/locales/hi-IN/embedding-sdk.md +2 -2
  1632. package/docs/content/locales/hi-IN/evals.md +2 -2
  1633. package/docs/content/locales/hi-IN/extensions.md +2 -2
  1634. package/docs/content/locales/hi-IN/external-agents.md +5 -5
  1635. package/docs/content/locales/hi-IN/faq.md +3 -3
  1636. package/docs/content/locales/hi-IN/file-uploads.md +4 -4
  1637. package/docs/content/locales/hi-IN/frames.md +1 -1
  1638. package/docs/content/locales/hi-IN/getting-started.md +14 -14
  1639. package/docs/content/locales/hi-IN/harness-agents.md +3 -3
  1640. package/docs/content/locales/hi-IN/human-approval.md +3 -3
  1641. package/docs/content/locales/hi-IN/key-concepts.md +14 -14
  1642. package/docs/content/locales/hi-IN/local-file-mode.md +5 -5
  1643. package/docs/content/locales/hi-IN/mcp-apps.md +4 -4
  1644. package/docs/content/locales/hi-IN/mcp-clients.md +7 -7
  1645. package/docs/content/locales/hi-IN/mcp-protocol.md +3 -3
  1646. package/docs/content/locales/hi-IN/messaging.md +6 -6
  1647. package/docs/content/locales/hi-IN/migration-workbench.md +1 -1
  1648. package/docs/content/locales/hi-IN/multi-app-workspace.md +1 -1
  1649. package/docs/content/locales/hi-IN/multi-tenancy.md +1 -1
  1650. package/docs/content/locales/hi-IN/native-chat-ui.md +3 -3
  1651. package/docs/content/locales/hi-IN/notifications.md +3 -3
  1652. package/docs/content/locales/hi-IN/observability.md +2 -2
  1653. package/docs/content/locales/hi-IN/observational-memory.md +2 -2
  1654. package/docs/content/locales/hi-IN/onboarding.md +8 -8
  1655. package/docs/content/locales/hi-IN/plan-plugin.md +3 -3
  1656. package/docs/content/locales/hi-IN/pr-visual-recap.md +11 -11
  1657. package/docs/content/locales/hi-IN/processors.md +1 -1
  1658. package/docs/content/locales/hi-IN/progress.md +2 -2
  1659. package/docs/content/locales/hi-IN/pure-agent-apps.md +1 -1
  1660. package/docs/content/locales/hi-IN/real-time-collaboration.md +6 -6
  1661. package/docs/content/locales/hi-IN/recurring-jobs.md +5 -5
  1662. package/docs/content/locales/hi-IN/routing.md +1 -1
  1663. package/docs/content/locales/hi-IN/sandbox-adapters.md +2 -2
  1664. package/docs/content/locales/hi-IN/security.md +8 -8
  1665. package/docs/content/locales/hi-IN/server.md +10 -10
  1666. package/docs/content/locales/hi-IN/sharing.md +6 -6
  1667. package/docs/content/locales/hi-IN/skills-guide.md +16 -16
  1668. package/docs/content/locales/hi-IN/template-analytics.md +10 -10
  1669. package/docs/content/locales/hi-IN/template-assets.md +19 -19
  1670. package/docs/content/locales/hi-IN/template-brain.md +11 -11
  1671. package/docs/content/locales/hi-IN/template-calendar.md +9 -9
  1672. package/docs/content/locales/hi-IN/template-chat.md +3 -3
  1673. package/docs/content/locales/hi-IN/template-clips.md +14 -14
  1674. package/docs/content/locales/hi-IN/template-content.md +13 -13
  1675. package/docs/content/locales/hi-IN/template-design.md +7 -7
  1676. package/docs/content/locales/hi-IN/template-dispatch.md +9 -9
  1677. package/docs/content/locales/hi-IN/template-forms.md +9 -9
  1678. package/docs/content/locales/hi-IN/template-mail.md +6 -6
  1679. package/docs/content/locales/hi-IN/template-plan.md +3 -3
  1680. package/docs/content/locales/hi-IN/template-slides.md +8 -8
  1681. package/docs/content/locales/hi-IN/template-videos.md +5 -5
  1682. package/docs/content/locales/hi-IN/tracking.md +3 -3
  1683. package/docs/content/locales/hi-IN/using-your-agent.md +1 -1
  1684. package/docs/content/locales/hi-IN/voice-input.md +4 -4
  1685. package/docs/content/locales/hi-IN/what-is-agent-native.md +4 -4
  1686. package/docs/content/locales/hi-IN/workspace-connections.md +8 -8
  1687. package/docs/content/locales/hi-IN/workspace-management.md +4 -4
  1688. package/docs/content/locales/hi-IN/workspace.md +23 -23
  1689. package/docs/content/locales/hi-IN/writing-agent-instructions.md +18 -18
  1690. package/docs/content/locales/ja-JP/a2a-protocol.md +7 -7
  1691. package/docs/content/locales/ja-JP/actions.md +3 -3
  1692. package/docs/content/locales/ja-JP/agent-mentions.md +3 -3
  1693. package/docs/content/locales/ja-JP/agent-surfaces.md +7 -7
  1694. package/docs/content/locales/ja-JP/agent-teams.md +3 -3
  1695. package/docs/content/locales/ja-JP/agent-web-surfaces.md +5 -5
  1696. package/docs/content/locales/ja-JP/authentication.md +6 -6
  1697. package/docs/content/locales/ja-JP/automations.md +8 -8
  1698. package/docs/content/locales/ja-JP/blueprint-installer.md +2 -2
  1699. package/docs/content/locales/ja-JP/client.md +1 -1
  1700. package/docs/content/locales/ja-JP/cloneable-saas.md +2 -2
  1701. package/docs/content/locales/ja-JP/code-agents-ui.md +4 -4
  1702. package/docs/content/locales/ja-JP/components.md +5 -5
  1703. package/docs/content/locales/ja-JP/context-awareness.md +8 -8
  1704. package/docs/content/locales/ja-JP/creating-templates.md +12 -12
  1705. package/docs/content/locales/ja-JP/cross-app-sso.md +3 -3
  1706. package/docs/content/locales/ja-JP/database.md +7 -7
  1707. package/docs/content/locales/ja-JP/deployment.md +4 -4
  1708. package/docs/content/locales/ja-JP/dispatch.md +4 -4
  1709. package/docs/content/locales/ja-JP/drop-in-agent.md +8 -8
  1710. package/docs/content/locales/ja-JP/durable-resume.md +1 -1
  1711. package/docs/content/locales/ja-JP/embedding-sdk.md +2 -2
  1712. package/docs/content/locales/ja-JP/evals.md +2 -2
  1713. package/docs/content/locales/ja-JP/extensions.md +2 -2
  1714. package/docs/content/locales/ja-JP/external-agents.md +5 -5
  1715. package/docs/content/locales/ja-JP/faq.md +3 -3
  1716. package/docs/content/locales/ja-JP/file-uploads.md +4 -4
  1717. package/docs/content/locales/ja-JP/frames.md +1 -1
  1718. package/docs/content/locales/ja-JP/getting-started.md +13 -13
  1719. package/docs/content/locales/ja-JP/harness-agents.md +3 -3
  1720. package/docs/content/locales/ja-JP/human-approval.md +3 -3
  1721. package/docs/content/locales/ja-JP/key-concepts.md +14 -14
  1722. package/docs/content/locales/ja-JP/local-file-mode.md +5 -5
  1723. package/docs/content/locales/ja-JP/mcp-apps.md +4 -4
  1724. package/docs/content/locales/ja-JP/mcp-clients.md +8 -8
  1725. package/docs/content/locales/ja-JP/mcp-protocol.md +3 -3
  1726. package/docs/content/locales/ja-JP/messaging.md +6 -6
  1727. package/docs/content/locales/ja-JP/migration-workbench.md +1 -1
  1728. package/docs/content/locales/ja-JP/multi-app-workspace.md +1 -1
  1729. package/docs/content/locales/ja-JP/multi-tenancy.md +1 -1
  1730. package/docs/content/locales/ja-JP/native-chat-ui.md +3 -3
  1731. package/docs/content/locales/ja-JP/notifications.md +3 -3
  1732. package/docs/content/locales/ja-JP/observability.md +2 -2
  1733. package/docs/content/locales/ja-JP/observational-memory.md +2 -2
  1734. package/docs/content/locales/ja-JP/onboarding.md +8 -8
  1735. package/docs/content/locales/ja-JP/plan-plugin.md +3 -3
  1736. package/docs/content/locales/ja-JP/pr-visual-recap.md +11 -11
  1737. package/docs/content/locales/ja-JP/processors.md +1 -1
  1738. package/docs/content/locales/ja-JP/progress.md +2 -2
  1739. package/docs/content/locales/ja-JP/pure-agent-apps.md +1 -1
  1740. package/docs/content/locales/ja-JP/real-time-collaboration.md +6 -6
  1741. package/docs/content/locales/ja-JP/recurring-jobs.md +5 -5
  1742. package/docs/content/locales/ja-JP/routing.md +1 -1
  1743. package/docs/content/locales/ja-JP/sandbox-adapters.md +2 -2
  1744. package/docs/content/locales/ja-JP/security.md +8 -8
  1745. package/docs/content/locales/ja-JP/server.md +10 -10
  1746. package/docs/content/locales/ja-JP/sharing.md +6 -6
  1747. package/docs/content/locales/ja-JP/skills-guide.md +16 -16
  1748. package/docs/content/locales/ja-JP/template-analytics.md +10 -10
  1749. package/docs/content/locales/ja-JP/template-assets.md +19 -19
  1750. package/docs/content/locales/ja-JP/template-brain.md +11 -11
  1751. package/docs/content/locales/ja-JP/template-calendar.md +9 -9
  1752. package/docs/content/locales/ja-JP/template-chat.md +3 -3
  1753. package/docs/content/locales/ja-JP/template-clips.md +14 -14
  1754. package/docs/content/locales/ja-JP/template-content.md +13 -13
  1755. package/docs/content/locales/ja-JP/template-design.md +7 -7
  1756. package/docs/content/locales/ja-JP/template-dispatch.md +12 -12
  1757. package/docs/content/locales/ja-JP/template-forms.md +9 -9
  1758. package/docs/content/locales/ja-JP/template-mail.md +6 -6
  1759. package/docs/content/locales/ja-JP/template-plan.md +3 -3
  1760. package/docs/content/locales/ja-JP/template-slides.md +8 -8
  1761. package/docs/content/locales/ja-JP/template-videos.md +5 -5
  1762. package/docs/content/locales/ja-JP/tracking.md +3 -3
  1763. package/docs/content/locales/ja-JP/using-your-agent.md +4 -4
  1764. package/docs/content/locales/ja-JP/voice-input.md +4 -4
  1765. package/docs/content/locales/ja-JP/what-is-agent-native.md +4 -4
  1766. package/docs/content/locales/ja-JP/workspace-connections.md +8 -8
  1767. package/docs/content/locales/ja-JP/workspace-management.md +5 -5
  1768. package/docs/content/locales/ja-JP/workspace.md +23 -23
  1769. package/docs/content/locales/ja-JP/writing-agent-instructions.md +18 -18
  1770. package/docs/content/locales/ko-KR/a2a-protocol.md +7 -7
  1771. package/docs/content/locales/ko-KR/actions.md +3 -3
  1772. package/docs/content/locales/ko-KR/agent-mentions.md +3 -3
  1773. package/docs/content/locales/ko-KR/agent-surfaces.md +15 -15
  1774. package/docs/content/locales/ko-KR/agent-teams.md +3 -3
  1775. package/docs/content/locales/ko-KR/agent-web-surfaces.md +5 -5
  1776. package/docs/content/locales/ko-KR/authentication.md +13 -13
  1777. package/docs/content/locales/ko-KR/automations.md +8 -8
  1778. package/docs/content/locales/ko-KR/blueprint-installer.md +2 -2
  1779. package/docs/content/locales/ko-KR/client.md +1 -1
  1780. package/docs/content/locales/ko-KR/cloneable-saas.md +2 -2
  1781. package/docs/content/locales/ko-KR/code-agents-ui.md +4 -4
  1782. package/docs/content/locales/ko-KR/components.md +5 -5
  1783. package/docs/content/locales/ko-KR/context-awareness.md +8 -8
  1784. package/docs/content/locales/ko-KR/creating-templates.md +12 -12
  1785. package/docs/content/locales/ko-KR/cross-app-sso.md +3 -3
  1786. package/docs/content/locales/ko-KR/database.md +7 -7
  1787. package/docs/content/locales/ko-KR/deployment.md +4 -4
  1788. package/docs/content/locales/ko-KR/dispatch.md +4 -4
  1789. package/docs/content/locales/ko-KR/drop-in-agent.md +8 -8
  1790. package/docs/content/locales/ko-KR/durable-resume.md +1 -1
  1791. package/docs/content/locales/ko-KR/embedding-sdk.md +2 -2
  1792. package/docs/content/locales/ko-KR/evals.md +2 -2
  1793. package/docs/content/locales/ko-KR/extensions.md +2 -2
  1794. package/docs/content/locales/ko-KR/external-agents.md +5 -5
  1795. package/docs/content/locales/ko-KR/faq.md +3 -3
  1796. package/docs/content/locales/ko-KR/file-uploads.md +4 -4
  1797. package/docs/content/locales/ko-KR/frames.md +1 -1
  1798. package/docs/content/locales/ko-KR/getting-started.md +13 -13
  1799. package/docs/content/locales/ko-KR/harness-agents.md +3 -3
  1800. package/docs/content/locales/ko-KR/human-approval.md +3 -3
  1801. package/docs/content/locales/ko-KR/key-concepts.md +14 -14
  1802. package/docs/content/locales/ko-KR/local-file-mode.md +5 -5
  1803. package/docs/content/locales/ko-KR/mcp-apps.md +4 -4
  1804. package/docs/content/locales/ko-KR/mcp-clients.md +8 -8
  1805. package/docs/content/locales/ko-KR/mcp-protocol.md +3 -3
  1806. package/docs/content/locales/ko-KR/messaging.md +6 -6
  1807. package/docs/content/locales/ko-KR/migration-workbench.md +1 -1
  1808. package/docs/content/locales/ko-KR/multi-app-workspace.md +1 -1
  1809. package/docs/content/locales/ko-KR/multi-tenancy.md +1 -1
  1810. package/docs/content/locales/ko-KR/native-chat-ui.md +3 -3
  1811. package/docs/content/locales/ko-KR/notifications.md +3 -3
  1812. package/docs/content/locales/ko-KR/observability.md +2 -2
  1813. package/docs/content/locales/ko-KR/observational-memory.md +2 -2
  1814. package/docs/content/locales/ko-KR/onboarding.md +8 -8
  1815. package/docs/content/locales/ko-KR/plan-plugin.md +3 -3
  1816. package/docs/content/locales/ko-KR/pr-visual-recap.md +11 -11
  1817. package/docs/content/locales/ko-KR/processors.md +1 -1
  1818. package/docs/content/locales/ko-KR/progress.md +2 -2
  1819. package/docs/content/locales/ko-KR/pure-agent-apps.md +1 -1
  1820. package/docs/content/locales/ko-KR/real-time-collaboration.md +6 -6
  1821. package/docs/content/locales/ko-KR/recurring-jobs.md +5 -5
  1822. package/docs/content/locales/ko-KR/routing.md +1 -1
  1823. package/docs/content/locales/ko-KR/sandbox-adapters.md +2 -2
  1824. package/docs/content/locales/ko-KR/security.md +8 -8
  1825. package/docs/content/locales/ko-KR/server.md +10 -10
  1826. package/docs/content/locales/ko-KR/sharing.md +6 -6
  1827. package/docs/content/locales/ko-KR/skills-guide.md +16 -16
  1828. package/docs/content/locales/ko-KR/template-analytics.md +10 -10
  1829. package/docs/content/locales/ko-KR/template-assets.md +19 -19
  1830. package/docs/content/locales/ko-KR/template-brain.md +11 -11
  1831. package/docs/content/locales/ko-KR/template-calendar.md +9 -9
  1832. package/docs/content/locales/ko-KR/template-chat.md +3 -3
  1833. package/docs/content/locales/ko-KR/template-clips.md +14 -14
  1834. package/docs/content/locales/ko-KR/template-content.md +13 -13
  1835. package/docs/content/locales/ko-KR/template-design.md +7 -7
  1836. package/docs/content/locales/ko-KR/template-dispatch.md +11 -11
  1837. package/docs/content/locales/ko-KR/template-forms.md +9 -9
  1838. package/docs/content/locales/ko-KR/template-mail.md +6 -6
  1839. package/docs/content/locales/ko-KR/template-plan.md +3 -3
  1840. package/docs/content/locales/ko-KR/template-slides.md +8 -8
  1841. package/docs/content/locales/ko-KR/template-videos.md +5 -5
  1842. package/docs/content/locales/ko-KR/tracking.md +3 -3
  1843. package/docs/content/locales/ko-KR/using-your-agent.md +5 -5
  1844. package/docs/content/locales/ko-KR/voice-input.md +4 -4
  1845. package/docs/content/locales/ko-KR/what-is-agent-native.md +6 -6
  1846. package/docs/content/locales/ko-KR/workspace-connections.md +8 -8
  1847. package/docs/content/locales/ko-KR/workspace-management.md +4 -4
  1848. package/docs/content/locales/ko-KR/workspace.md +23 -23
  1849. package/docs/content/locales/ko-KR/writing-agent-instructions.md +18 -18
  1850. package/docs/content/locales/pt-BR/a2a-protocol.md +7 -7
  1851. package/docs/content/locales/pt-BR/actions.md +2 -2
  1852. package/docs/content/locales/pt-BR/agent-mentions.md +3 -3
  1853. package/docs/content/locales/pt-BR/agent-surfaces.md +7 -7
  1854. package/docs/content/locales/pt-BR/agent-teams.md +3 -3
  1855. package/docs/content/locales/pt-BR/agent-web-surfaces.md +5 -5
  1856. package/docs/content/locales/pt-BR/authentication.md +6 -6
  1857. package/docs/content/locales/pt-BR/automations.md +8 -8
  1858. package/docs/content/locales/pt-BR/blueprint-installer.md +2 -2
  1859. package/docs/content/locales/pt-BR/client.md +2 -2
  1860. package/docs/content/locales/pt-BR/cloneable-saas.md +2 -2
  1861. package/docs/content/locales/pt-BR/code-agents-ui.md +4 -4
  1862. package/docs/content/locales/pt-BR/components.md +5 -5
  1863. package/docs/content/locales/pt-BR/context-awareness.md +8 -8
  1864. package/docs/content/locales/pt-BR/creating-templates.md +12 -12
  1865. package/docs/content/locales/pt-BR/cross-app-sso.md +3 -3
  1866. package/docs/content/locales/pt-BR/database.md +5 -5
  1867. package/docs/content/locales/pt-BR/deployment.md +5 -5
  1868. package/docs/content/locales/pt-BR/dispatch.md +3 -3
  1869. package/docs/content/locales/pt-BR/drop-in-agent.md +9 -9
  1870. package/docs/content/locales/pt-BR/durable-resume.md +1 -1
  1871. package/docs/content/locales/pt-BR/embedding-sdk.md +2 -2
  1872. package/docs/content/locales/pt-BR/evals.md +2 -2
  1873. package/docs/content/locales/pt-BR/extensions.md +2 -2
  1874. package/docs/content/locales/pt-BR/external-agents.md +5 -5
  1875. package/docs/content/locales/pt-BR/faq.md +3 -3
  1876. package/docs/content/locales/pt-BR/file-uploads.md +4 -4
  1877. package/docs/content/locales/pt-BR/frames.md +2 -2
  1878. package/docs/content/locales/pt-BR/getting-started.md +13 -13
  1879. package/docs/content/locales/pt-BR/harness-agents.md +3 -3
  1880. package/docs/content/locales/pt-BR/human-approval.md +3 -3
  1881. package/docs/content/locales/pt-BR/key-concepts.md +15 -15
  1882. package/docs/content/locales/pt-BR/local-file-mode.md +5 -5
  1883. package/docs/content/locales/pt-BR/mcp-apps.md +4 -4
  1884. package/docs/content/locales/pt-BR/mcp-clients.md +8 -8
  1885. package/docs/content/locales/pt-BR/mcp-protocol.md +3 -3
  1886. package/docs/content/locales/pt-BR/messaging.md +4 -4
  1887. package/docs/content/locales/pt-BR/migration-workbench.md +1 -1
  1888. package/docs/content/locales/pt-BR/multi-app-workspace.md +1 -1
  1889. package/docs/content/locales/pt-BR/multi-tenancy.md +1 -1
  1890. package/docs/content/locales/pt-BR/native-chat-ui.md +3 -3
  1891. package/docs/content/locales/pt-BR/notifications.md +3 -3
  1892. package/docs/content/locales/pt-BR/observability.md +2 -2
  1893. package/docs/content/locales/pt-BR/observational-memory.md +2 -2
  1894. package/docs/content/locales/pt-BR/onboarding.md +8 -8
  1895. package/docs/content/locales/pt-BR/plan-plugin.md +3 -3
  1896. package/docs/content/locales/pt-BR/pr-visual-recap.md +11 -11
  1897. package/docs/content/locales/pt-BR/processors.md +1 -1
  1898. package/docs/content/locales/pt-BR/progress.md +2 -2
  1899. package/docs/content/locales/pt-BR/pure-agent-apps.md +1 -1
  1900. package/docs/content/locales/pt-BR/real-time-collaboration.md +6 -6
  1901. package/docs/content/locales/pt-BR/recurring-jobs.md +5 -5
  1902. package/docs/content/locales/pt-BR/routing.md +1 -1
  1903. package/docs/content/locales/pt-BR/sandbox-adapters.md +2 -2
  1904. package/docs/content/locales/pt-BR/security.md +9 -9
  1905. package/docs/content/locales/pt-BR/server.md +10 -10
  1906. package/docs/content/locales/pt-BR/sharing.md +6 -6
  1907. package/docs/content/locales/pt-BR/skills-guide.md +16 -16
  1908. package/docs/content/locales/pt-BR/template-analytics.md +10 -10
  1909. package/docs/content/locales/pt-BR/template-assets.md +20 -20
  1910. package/docs/content/locales/pt-BR/template-brain.md +11 -11
  1911. package/docs/content/locales/pt-BR/template-calendar.md +9 -9
  1912. package/docs/content/locales/pt-BR/template-chat.md +3 -3
  1913. package/docs/content/locales/pt-BR/template-clips.md +15 -15
  1914. package/docs/content/locales/pt-BR/template-content.md +13 -13
  1915. package/docs/content/locales/pt-BR/template-design.md +8 -8
  1916. package/docs/content/locales/pt-BR/template-dispatch.md +8 -8
  1917. package/docs/content/locales/pt-BR/template-forms.md +10 -10
  1918. package/docs/content/locales/pt-BR/template-mail.md +6 -6
  1919. package/docs/content/locales/pt-BR/template-plan.md +3 -3
  1920. package/docs/content/locales/pt-BR/template-slides.md +9 -9
  1921. package/docs/content/locales/pt-BR/template-videos.md +5 -5
  1922. package/docs/content/locales/pt-BR/tracking.md +3 -3
  1923. package/docs/content/locales/pt-BR/using-your-agent.md +5 -5
  1924. package/docs/content/locales/pt-BR/voice-input.md +4 -4
  1925. package/docs/content/locales/pt-BR/what-is-agent-native.md +5 -5
  1926. package/docs/content/locales/pt-BR/workspace-connections.md +8 -8
  1927. package/docs/content/locales/pt-BR/workspace-management.md +4 -4
  1928. package/docs/content/locales/pt-BR/workspace.md +23 -23
  1929. package/docs/content/locales/pt-BR/writing-agent-instructions.md +18 -18
  1930. package/docs/content/locales/zh-CN/a2a-protocol.md +7 -7
  1931. package/docs/content/locales/zh-CN/actions.md +3 -3
  1932. package/docs/content/locales/zh-CN/agent-mentions.md +3 -3
  1933. package/docs/content/locales/zh-CN/agent-surfaces.md +7 -7
  1934. package/docs/content/locales/zh-CN/agent-teams.md +3 -3
  1935. package/docs/content/locales/zh-CN/agent-web-surfaces.md +5 -5
  1936. package/docs/content/locales/zh-CN/authentication.md +13 -13
  1937. package/docs/content/locales/zh-CN/automations.md +8 -8
  1938. package/docs/content/locales/zh-CN/blueprint-installer.md +2 -2
  1939. package/docs/content/locales/zh-CN/client.md +1 -1
  1940. package/docs/content/locales/zh-CN/cloneable-saas.md +2 -2
  1941. package/docs/content/locales/zh-CN/code-agents-ui.md +4 -4
  1942. package/docs/content/locales/zh-CN/components.md +7 -7
  1943. package/docs/content/locales/zh-CN/context-awareness.md +8 -8
  1944. package/docs/content/locales/zh-CN/creating-templates.md +12 -12
  1945. package/docs/content/locales/zh-CN/cross-app-sso.md +3 -3
  1946. package/docs/content/locales/zh-CN/database.md +7 -7
  1947. package/docs/content/locales/zh-CN/deployment.md +4 -4
  1948. package/docs/content/locales/zh-CN/dispatch.md +4 -4
  1949. package/docs/content/locales/zh-CN/drop-in-agent.md +8 -8
  1950. package/docs/content/locales/zh-CN/durable-resume.md +1 -1
  1951. package/docs/content/locales/zh-CN/embedding-sdk.md +2 -2
  1952. package/docs/content/locales/zh-CN/evals.md +2 -2
  1953. package/docs/content/locales/zh-CN/extensions.md +2 -2
  1954. package/docs/content/locales/zh-CN/external-agents.md +5 -5
  1955. package/docs/content/locales/zh-CN/faq.md +3 -3
  1956. package/docs/content/locales/zh-CN/file-uploads.md +4 -4
  1957. package/docs/content/locales/zh-CN/frames.md +2 -2
  1958. package/docs/content/locales/zh-CN/getting-started.md +13 -13
  1959. package/docs/content/locales/zh-CN/harness-agents.md +3 -3
  1960. package/docs/content/locales/zh-CN/human-approval.md +3 -3
  1961. package/docs/content/locales/zh-CN/key-concepts.md +14 -14
  1962. package/docs/content/locales/zh-CN/local-file-mode.md +5 -5
  1963. package/docs/content/locales/zh-CN/mcp-apps.md +4 -4
  1964. package/docs/content/locales/zh-CN/mcp-clients.md +7 -7
  1965. package/docs/content/locales/zh-CN/mcp-protocol.md +3 -3
  1966. package/docs/content/locales/zh-CN/messaging.md +6 -6
  1967. package/docs/content/locales/zh-CN/migration-workbench.md +1 -1
  1968. package/docs/content/locales/zh-CN/multi-app-workspace.md +1 -1
  1969. package/docs/content/locales/zh-CN/multi-tenancy.md +1 -1
  1970. package/docs/content/locales/zh-CN/native-chat-ui.md +3 -3
  1971. package/docs/content/locales/zh-CN/notifications.md +3 -3
  1972. package/docs/content/locales/zh-CN/observability.md +2 -2
  1973. package/docs/content/locales/zh-CN/observational-memory.md +2 -2
  1974. package/docs/content/locales/zh-CN/onboarding.md +8 -8
  1975. package/docs/content/locales/zh-CN/plan-plugin.md +3 -3
  1976. package/docs/content/locales/zh-CN/pr-visual-recap.md +11 -11
  1977. package/docs/content/locales/zh-CN/processors.md +1 -1
  1978. package/docs/content/locales/zh-CN/progress.md +2 -2
  1979. package/docs/content/locales/zh-CN/pure-agent-apps.md +1 -1
  1980. package/docs/content/locales/zh-CN/real-time-collaboration.md +6 -6
  1981. package/docs/content/locales/zh-CN/recurring-jobs.md +5 -5
  1982. package/docs/content/locales/zh-CN/routing.md +1 -1
  1983. package/docs/content/locales/zh-CN/sandbox-adapters.md +2 -2
  1984. package/docs/content/locales/zh-CN/security.md +8 -8
  1985. package/docs/content/locales/zh-CN/server.md +10 -10
  1986. package/docs/content/locales/zh-CN/sharing.md +6 -6
  1987. package/docs/content/locales/zh-CN/skills-guide.md +16 -16
  1988. package/docs/content/locales/zh-CN/template-analytics.md +10 -10
  1989. package/docs/content/locales/zh-CN/template-assets.md +20 -20
  1990. package/docs/content/locales/zh-CN/template-brain.md +11 -11
  1991. package/docs/content/locales/zh-CN/template-calendar.md +9 -9
  1992. package/docs/content/locales/zh-CN/template-chat.md +3 -3
  1993. package/docs/content/locales/zh-CN/template-clips.md +14 -14
  1994. package/docs/content/locales/zh-CN/template-content.md +13 -13
  1995. package/docs/content/locales/zh-CN/template-design.md +7 -7
  1996. package/docs/content/locales/zh-CN/template-dispatch.md +11 -11
  1997. package/docs/content/locales/zh-CN/template-forms.md +9 -9
  1998. package/docs/content/locales/zh-CN/template-mail.md +6 -6
  1999. package/docs/content/locales/zh-CN/template-plan.md +3 -3
  2000. package/docs/content/locales/zh-CN/template-slides.md +8 -8
  2001. package/docs/content/locales/zh-CN/template-videos.md +5 -5
  2002. package/docs/content/locales/zh-CN/tracking.md +3 -3
  2003. package/docs/content/locales/zh-CN/using-your-agent.md +5 -5
  2004. package/docs/content/locales/zh-CN/voice-input.md +4 -4
  2005. package/docs/content/locales/zh-CN/what-is-agent-native.md +5 -5
  2006. package/docs/content/locales/zh-CN/workspace-connections.md +8 -8
  2007. package/docs/content/locales/zh-CN/workspace-management.md +5 -5
  2008. package/docs/content/locales/zh-CN/workspace.md +23 -23
  2009. package/docs/content/locales/zh-CN/writing-agent-instructions.md +18 -18
  2010. package/package.json +1 -1
  2011. package/src/templates/default/app/i18n/ar-SA.ts +275 -274
  2012. package/src/templates/default/app/i18n/de-DE.ts +270 -260
  2013. package/src/templates/default/app/i18n/es-ES.ts +282 -270
  2014. package/src/templates/default/app/i18n/fr-FR.ts +275 -266
  2015. package/src/templates/default/app/i18n/hi-IN.ts +274 -276
  2016. package/src/templates/default/app/i18n/ja-JP.ts +280 -273
  2017. package/src/templates/default/app/i18n/ko-KR.ts +274 -274
  2018. package/src/templates/default/app/i18n/pt-BR.ts +273 -266
  2019. package/src/templates/default/app/i18n/zh-CN.ts +273 -285
@@ -9,6 +9,7 @@ import {
9
9
  setAgentChatContextItem,
10
10
  useAgentEngineConfigured,
11
11
  useActionQuery,
12
+ useT,
12
13
  useSession,
13
14
  track,
14
15
  emailToColor,
@@ -279,28 +280,27 @@ function GoogleLogoIcon({ className }: { className?: string }) {
279
280
  );
280
281
  }
281
282
 
282
- const SOURCE_OPTIONS: Array<{ value: PlanSource; label: string }> = [
283
- { value: "codex", label: "Codex" },
284
- { value: "claude-code", label: "Claude Code" },
285
- { value: "cursor", label: "Cursor" },
286
- { value: "pi", label: "Pi" },
287
- { value: "manual", label: "Manual" },
288
- { value: "imported", label: "Imported" },
283
+ const SOURCE_OPTIONS: Array<{ value: PlanSource }> = [
284
+ { value: "codex" },
285
+ { value: "claude-code" },
286
+ { value: "cursor" },
287
+ { value: "pi" },
288
+ { value: "manual" },
289
+ { value: "imported" },
289
290
  ];
290
291
 
291
292
  const REPORT_REASON_OPTIONS: Array<{
292
293
  value: PlanReportReason;
293
- label: string;
294
294
  }> = [
295
- { value: "spam", label: "Spam or deceptive" },
296
- { value: "harassment", label: "Harassment" },
297
- { value: "hate", label: "Hateful content" },
298
- { value: "sexual", label: "Sexual content" },
299
- { value: "violence", label: "Violence or threats" },
300
- { value: "self-harm", label: "Self-harm" },
301
- { value: "privacy", label: "Privacy concern" },
302
- { value: "illegal", label: "Illegal activity" },
303
- { value: "other", label: "Something else" },
295
+ { value: "spam" },
296
+ { value: "harassment" },
297
+ { value: "hate" },
298
+ { value: "sexual" },
299
+ { value: "violence" },
300
+ { value: "self-harm" },
301
+ { value: "privacy" },
302
+ { value: "illegal" },
303
+ { value: "other" },
304
304
  ];
305
305
 
306
306
  const PLAN_READER_VIEW_EVENT = "plans-reader-view-change";
@@ -338,21 +338,21 @@ const PREFERRED_EDITOR_VALUES: PreferredEditor[] = [
338
338
  ];
339
339
 
340
340
  const EDITOR_OPTIONS: Array<{ value: PreferredEditor; label: string }> = [
341
- { value: "vscode", label: "VS Code" },
342
- { value: "cursor", label: "Cursor" },
343
- { value: "finder", label: "Finder" },
344
- { value: "terminal", label: "Terminal" },
345
- { value: "ghostty", label: "Ghostty" },
346
- { value: "xcode", label: "Xcode" },
341
+ { value: "vscode", label: "VS Code" }, // i18n-ignore stable app name
342
+ { value: "cursor", label: "Cursor" }, // i18n-ignore stable app name
343
+ { value: "finder", label: "Finder" }, // i18n-ignore stable app name
344
+ { value: "terminal", label: "Terminal" }, // i18n-ignore stable app name
345
+ { value: "ghostty", label: "Ghostty" }, // i18n-ignore stable app name
346
+ { value: "xcode", label: "Xcode" }, // i18n-ignore stable app name
347
347
  ];
348
348
 
349
349
  const EDITOR_ICON_HTML: Record<PreferredEditor, string> = {
350
- vscode: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-brand-vscode" aria-hidden="true"><path d="M16 3v18l4 -2.5v-13l-4 -2.5"></path><path d="M9.165 13.903l-4.165 3.597l-2 -1l4.333 -4.5m1.735 -1.802l6.932 -7.198v5l-4.795 4.141"></path><path d="M16 16.5l-11 -10l-2 1l13 13.5"></path></svg>`,
351
- cursor: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-cube" aria-hidden="true"><path d="M21 16.008v-8.018a1.98 1.98 0 0 0 -1 -1.717l-7 -4.008a2.016 2.016 0 0 0 -2 0l-7 4.008c-.619 .355 -1 1.01 -1 1.718v8.018c0 .709 .381 1.363 1 1.717l7 4.008a2.016 2.016 0 0 0 2 0l7 -4.008c.619 -.355 1 -1.01 1 -1.718"></path><path d="M12 22v-10"></path><path d="M12 12l8.73 -5.04"></path><path d="M3.27 6.96l8.73 5.04"></path></svg>`,
352
- finder: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-brand-finder" aria-hidden="true"><path d="M3 5a1 1 0 0 1 1 -1h16a1 1 0 0 1 1 1v14a1 1 0 0 1 -1 1h-16a1 1 0 0 1 -1 -1l0 -14"></path><path d="M7 8v1"></path><path d="M17 8v1"></path><path d="M12.5 4c-.654 1.486 -1.26 3.443 -1.5 9h2.5c-.19 2.867 .094 5.024 .5 7"></path><path d="M7 15.5c3.667 2 6.333 2 10 0"></path></svg>`,
353
- terminal: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-terminal-2" aria-hidden="true"><path d="M8 9l3 3l-3 3"></path><path d="M13 15l3 0"></path><path d="M3 6a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2l0 -12"></path></svg>`,
354
- ghostty: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-ghost-3" aria-hidden="true"><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7"></path><path d="M10 10h.01"></path><path d="M14 10h.01"></path></svg>`,
355
- xcode: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-hammer" aria-hidden="true"><path d="M11.414 10l-7.383 7.418a2.091 2.091 0 0 0 0 2.967a2.11 2.11 0 0 0 2.976 0l7.407 -7.385"></path><path d="M18.121 15.293l2.586 -2.586a1 1 0 0 0 0 -1.414l-7.586 -7.586a1 1 0 0 0 -1.414 0l-2.586 2.586a1 1 0 0 0 0 1.414l7.586 7.586a1 1 0 0 0 1.414 0"></path></svg>`,
350
+ vscode: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-brand-vscode" aria-hidden="true"><path d="M16 3v18l4 -2.5v-13l-4 -2.5"></path><path d="M9.165 13.903l-4.165 3.597l-2 -1l4.333 -4.5m1.735 -1.802l6.932 -7.198v5l-4.795 4.141"></path><path d="M16 16.5l-11 -10l-2 1l13 13.5"></path></svg>`, // i18n-ignore inline SVG icon markup
351
+ cursor: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-cube" aria-hidden="true"><path d="M21 16.008v-8.018a1.98 1.98 0 0 0 -1 -1.717l-7 -4.008a2.016 2.016 0 0 0 -2 0l-7 4.008c-.619 .355 -1 1.01 -1 1.718v8.018c0 .709 .381 1.363 1 1.717l7 4.008a2.016 2.016 0 0 0 2 0l7 -4.008c.619 -.355 1 -1.01 1 -1.718"></path><path d="M12 22v-10"></path><path d="M12 12l8.73 -5.04"></path><path d="M3.27 6.96l8.73 5.04"></path></svg>`, // i18n-ignore inline SVG icon markup
352
+ finder: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-brand-finder" aria-hidden="true"><path d="M3 5a1 1 0 0 1 1 -1h16a1 1 0 0 1 1 1v14a1 1 0 0 1 -1 1h-16a1 1 0 0 1 -1 -1l0 -14"></path><path d="M7 8v1"></path><path d="M17 8v1"></path><path d="M12.5 4c-.654 1.486 -1.26 3.443 -1.5 9h2.5c-.19 2.867 .094 5.024 .5 7"></path><path d="M7 15.5c3.667 2 6.333 2 10 0"></path></svg>`, // i18n-ignore inline SVG icon markup
353
+ terminal: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-terminal-2" aria-hidden="true"><path d="M8 9l3 3l-3 3"></path><path d="M13 15l3 0"></path><path d="M3 6a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2l0 -12"></path></svg>`, // i18n-ignore inline SVG icon markup
354
+ ghostty: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-ghost-3" aria-hidden="true"><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7"></path><path d="M10 10h.01"></path><path d="M14 10h.01"></path></svg>`, // i18n-ignore inline SVG icon markup
355
+ xcode: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-hammer" aria-hidden="true"><path d="M11.414 10l-7.383 7.418a2.091 2.091 0 0 0 0 2.967a2.11 2.11 0 0 0 2.976 0l7.407 -7.385"></path><path d="M18.121 15.293l2.586 -2.586a1 1 0 0 0 0 -1.414l-7.586 -7.586a1 1 0 0 0 -1.414 0l-2.586 2.586a1 1 0 0 0 0 1.414l7.586 7.586a1 1 0 0 0 1.414 0"></path></svg>`, // i18n-ignore inline SVG icon markup
356
356
  };
357
357
 
358
358
  function readPreferredEditor(): PreferredEditor {
@@ -656,8 +656,8 @@ export function resolvePlanOrgAccessPrompt(input: {
656
656
  organizationName: orgName,
657
657
  invitationId: pendingInvitation.id,
658
658
  invitedBy: pendingInvitation.invitedBy,
659
- buttonLabel: "Accept invite",
660
- message: `You already have an invite to ${orgName}. Accept it to open this plan.`,
659
+ buttonLabel: "",
660
+ message: "",
661
661
  };
662
662
  }
663
663
 
@@ -671,10 +671,8 @@ export function resolvePlanOrgAccessPrompt(input: {
671
671
  organizationId: orgId,
672
672
  organizationName: orgName,
673
673
  domain,
674
- buttonLabel: `Join ${orgName}`,
675
- message: domain
676
- ? `Your @${domain} email can join ${orgName}. Join it to open this plan.`
677
- : `You can join ${orgName} to open this plan.`,
674
+ buttonLabel: "",
675
+ message: "",
678
676
  };
679
677
  }
680
678
 
@@ -827,7 +825,7 @@ async function fetchLocalPlanBridgeBundle(
827
825
  const slug = payload.slug || fallbackSlug || "local-plan";
828
826
  const kind = payload.kind === "recap" ? "recap" : "plan";
829
827
  const title = content.title || payload.title || slug;
830
- const brief = content.brief || payload.brief || "Local files preview.";
828
+ const brief = content.brief || payload.brief || "";
831
829
  const url = localPlanRouteUrl(slug);
832
830
  const bundle: LocalPlanBundle = {
833
831
  plan: {
@@ -985,8 +983,10 @@ function commentDescendantCount(
985
983
  return count;
986
984
  }
987
985
 
988
- function deleteCommentLabel(replyCount: number) {
989
- return replyCount > 0 ? "Delete thread" : "Delete comment";
986
+ function deleteCommentLabel(replyCount: number, t: ReturnType<typeof useT>) {
987
+ return replyCount > 0
988
+ ? t("plansPage.comments.deleteThread")
989
+ : t("plansPage.comments.deleteComment");
990
990
  }
991
991
 
992
992
  export function shouldKeepCommentPopoverOpenForTarget(
@@ -1057,9 +1057,9 @@ function commentAuthorName(
1057
1057
  if (explicitName) return explicitName;
1058
1058
  const email = normalizeCommentEmail(source.authorEmail);
1059
1059
  if (email) return emailToName(email);
1060
- if (source.createdBy === "agent") return "Agent";
1061
- if (source.createdBy === "import") return "Imported";
1062
- return "Reviewer";
1060
+ if (source.createdBy === "agent") return "Agent"; // i18n-key-ignore stable actor id fallback
1061
+ if (source.createdBy === "import") return "Imported"; // i18n-key-ignore stable import actor fallback
1062
+ return "Reviewer"; // i18n-key-ignore stable anonymous reviewer fallback
1063
1063
  }
1064
1064
 
1065
1065
  function commentAuthorInitials(name: string) {
@@ -2699,15 +2699,6 @@ const APPROVAL_STATUSES: PlanStatus[] = [
2699
2699
  "complete",
2700
2700
  ];
2701
2701
 
2702
- const STATUS_LABELS: Record<PlanStatus, string> = {
2703
- draft: "Draft",
2704
- review: "In review",
2705
- approved: "Approved",
2706
- in_progress: "In progress",
2707
- complete: "Complete",
2708
- archived: "Archived",
2709
- };
2710
-
2711
2702
  function statusBadgeClasses(status: PlanStatus): string {
2712
2703
  if (status === "approved") {
2713
2704
  return "border-emerald-500/40 bg-emerald-500/10 text-emerald-700 dark:text-emerald-400";
@@ -2739,6 +2730,7 @@ function PlanStatusControl({
2739
2730
  status: PlanStatus;
2740
2731
  canEdit: boolean;
2741
2732
  }) {
2733
+ const t = useT();
2742
2734
  const qc = useQueryClient();
2743
2735
  const updateStatus = useUpdatePlanStatus();
2744
2736
 
@@ -2773,12 +2765,12 @@ function PlanStatusControl({
2773
2765
  qc.setQueryData(ACTIVE_PLANS_QUERY_KEY, prevActiveList);
2774
2766
  if (prevAllList !== undefined)
2775
2767
  qc.setQueryData(ALL_PLANS_QUERY_KEY, prevAllList);
2776
- toast.error("Failed to update plan status.");
2768
+ toast.error(t("plansPage.status.updateFailed"));
2777
2769
  },
2778
2770
  },
2779
2771
  );
2780
2772
  },
2781
- [planId, qc, status, updateStatus],
2773
+ [planId, qc, status, t, updateStatus],
2782
2774
  );
2783
2775
 
2784
2776
  const badgeClassName = cn(
@@ -2791,7 +2783,7 @@ function PlanStatusControl({
2791
2783
  {status === "approved" && (
2792
2784
  <IconCircleCheck className="size-3.5 shrink-0" />
2793
2785
  )}
2794
- {STATUS_LABELS[status] ?? statusLabel(status)}
2786
+ {t(`plansPage.status.labels.${status}`)}
2795
2787
  {canEdit && <IconChevronDown className="size-3 shrink-0 opacity-60" />}
2796
2788
  </>
2797
2789
  );
@@ -2805,14 +2797,14 @@ function PlanStatusControl({
2805
2797
  <DropdownMenuTrigger asChild>
2806
2798
  <button
2807
2799
  type="button"
2808
- aria-label="Set plan status"
2800
+ aria-label={t("plansPage.status.setPlanStatus")}
2809
2801
  className={badgeClassName}
2810
2802
  >
2811
2803
  {badgeInner}
2812
2804
  </button>
2813
2805
  </DropdownMenuTrigger>
2814
2806
  <DropdownMenuContent align="end" className="w-44 rounded-xl">
2815
- <DropdownMenuLabel>Set status</DropdownMenuLabel>
2807
+ <DropdownMenuLabel>{t("plansPage.status.setStatus")}</DropdownMenuLabel>
2816
2808
  <DropdownMenuGroup>
2817
2809
  {APPROVAL_STATUSES.map((s) => (
2818
2810
  <DropdownMenuItem
@@ -2825,7 +2817,7 @@ function PlanStatusControl({
2825
2817
  ) : (
2826
2818
  <span className="size-4" />
2827
2819
  )}
2828
- {STATUS_LABELS[s]}
2820
+ {t(`plansPage.status.labels.${s}`)}
2829
2821
  </DropdownMenuItem>
2830
2822
  ))}
2831
2823
  </DropdownMenuGroup>
@@ -2835,6 +2827,7 @@ function PlanStatusControl({
2835
2827
  }
2836
2828
 
2837
2829
  function LocalModeBadge() {
2830
+ const t = useT();
2838
2831
  return (
2839
2832
  <Tooltip>
2840
2833
  <TooltipTrigger asChild>
@@ -2843,22 +2836,23 @@ function LocalModeBadge() {
2843
2836
  target="_blank"
2844
2837
  rel="noreferrer"
2845
2838
  className="pointer-events-auto inline-flex h-8 items-center gap-1.5 rounded-md border border-emerald-500/35 bg-emerald-500/10 px-2.5 text-xs font-medium text-emerald-700 outline-none transition-colors hover:bg-emerald-500/15 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 dark:text-emerald-300"
2846
- aria-label="Local mode privacy details"
2839
+ aria-label={t("plansPage.localMode.privacyDetails")}
2847
2840
  >
2848
2841
  <span className="size-1.5 rounded-full bg-emerald-500" />
2849
- <span>Local mode</span>
2842
+ <span>{t("plansPage.localMode.badge")}</span>
2850
2843
  <IconHelpCircle className="size-3.5 opacity-75" />
2851
2844
  </a>
2852
2845
  </TooltipTrigger>
2853
2846
  <TooltipContent align="end" side="bottom" className="max-w-xs p-3">
2854
2847
  <div className="grid gap-1.5">
2855
- <p className="font-medium leading-5">100% private local mode</p>
2848
+ <p className="font-medium leading-5">
2849
+ {t("plansPage.localMode.title")}
2850
+ </p>
2856
2851
  <p className="text-xs leading-5 text-muted-foreground">
2857
- Your data is never saved to our backend or seen by us. This page
2858
- only renders and edits your local MDX files.
2852
+ {t("plansPage.localMode.description")}
2859
2853
  </p>
2860
2854
  <p className="text-xs font-medium leading-5 text-foreground">
2861
- Open docs.
2855
+ {t("plansPage.localMode.openDocs")}
2862
2856
  </p>
2863
2857
  </div>
2864
2858
  </TooltipContent>
@@ -2871,6 +2865,7 @@ export function canEditPlanContentRole(role?: PlanAccessRole | null) {
2871
2865
  }
2872
2866
 
2873
2867
  export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
2868
+ const t = useT();
2874
2869
  const params = useParams<{ id?: string }>();
2875
2870
  const navigate = useNavigate();
2876
2871
  const location = useLocation();
@@ -3470,13 +3465,15 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
3470
3465
  if (prevAll !== undefined)
3471
3466
  queryClient.setQueryData(ALL_PLANS_QUERY_KEY, prevAll);
3472
3467
  toast.error(
3473
- archive ? "Failed to archive plan." : "Failed to unarchive plan.",
3468
+ archive
3469
+ ? t("plansPage.reader.archiveFailed")
3470
+ : t("plansPage.reader.unarchiveFailed"),
3474
3471
  );
3475
3472
  },
3476
3473
  },
3477
3474
  );
3478
3475
  },
3479
- [queryClient, updatePlan],
3476
+ [queryClient, t, updatePlan],
3480
3477
  );
3481
3478
 
3482
3479
  const updatePlanListCaches = useCallback(
@@ -3519,7 +3516,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
3519
3516
  ),
3520
3517
  );
3521
3518
  toast.success(
3522
- `${target.kind === "recap" ? "Recap" : "Plan"} moved to Deleted.`,
3519
+ target.kind === "recap"
3520
+ ? t("plansPage.reader.recapMovedToDeleted")
3521
+ : t("plansPage.reader.planMovedToDeleted"),
3523
3522
  );
3524
3523
  if (selectedId === target.id) navigate("/plans");
3525
3524
  } else if (result.mode === "restore") {
@@ -3531,7 +3530,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
3531
3530
  ),
3532
3531
  );
3533
3532
  toast.success(
3534
- `${target.kind === "recap" ? "Recap" : "Plan"} restored.`,
3533
+ target.kind === "recap"
3534
+ ? t("plansPage.reader.recapRestored")
3535
+ : t("plansPage.reader.planRestored"),
3535
3536
  );
3536
3537
  } else {
3537
3538
  updatePlanListCaches((items) =>
@@ -3541,7 +3542,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
3541
3542
  queryKey: planBundleQueryKey(target.id),
3542
3543
  });
3543
3544
  toast.success(
3544
- `${target.kind === "recap" ? "Recap" : "Plan"} permanently deleted.`,
3545
+ target.kind === "recap"
3546
+ ? t("plansPage.reader.recapPermanentlyDeleted")
3547
+ : t("plansPage.reader.planPermanentlyDeleted"),
3545
3548
  );
3546
3549
  if (selectedId === target.id) navigate("/plans");
3547
3550
  }
@@ -3556,6 +3559,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
3556
3559
  navigate,
3557
3560
  queryClient,
3558
3561
  selectedId,
3562
+ t,
3559
3563
  updatePlanListCaches,
3560
3564
  ],
3561
3565
  );
@@ -3586,14 +3590,12 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
3586
3590
  },
3587
3591
  {
3588
3592
  onError: () => {
3589
- toast.error(
3590
- "Could not save answers — they were sent to the agent chat only.",
3591
- );
3593
+ toast.error(t("plansPage.reader.saveAnswersFailed"));
3592
3594
  },
3593
3595
  },
3594
3596
  );
3595
3597
  },
3596
- [collabUser?.email, collabUser?.name],
3598
+ [collabUser?.email, collabUser?.name, t],
3597
3599
  );
3598
3600
 
3599
3601
  const exportPlan = useExportPlan(localPlanMode ? undefined : selectedId);
@@ -3685,7 +3687,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
3685
3687
  size="sm"
3686
3688
  onClick={() => openSignIn()}
3687
3689
  >
3688
- Sign in
3690
+ {t("plansPage.loadError.signIn")}
3689
3691
  </Button>
3690
3692
  ) : null,
3691
3693
  );
@@ -3741,8 +3743,14 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
3741
3743
 
3742
3744
  const documentHtml = useMemo(() => {
3743
3745
  if (!bundle) return "";
3744
- return bundle.html || bundle.plan.html || buildClientPlanHtml(bundle);
3745
- }, [bundle]);
3746
+ return (
3747
+ bundle.html ||
3748
+ bundle.plan.html ||
3749
+ buildClientPlanHtml(bundle, {
3750
+ workingPlan: t("plansPage.reader.clientHtmlWorkingPlan"),
3751
+ })
3752
+ );
3753
+ }, [bundle, t]);
3746
3754
 
3747
3755
  const annotatedDocumentHtml = useMemo(() => {
3748
3756
  if (!bundle) return "";
@@ -3753,6 +3761,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
3753
3761
  false,
3754
3762
  defaults.planTheme,
3755
3763
  defaults.preferredEditor,
3764
+ {
3765
+ closeCodePreview: t("plansPage.reader.runtimeCloseCodePreview"),
3766
+ },
3756
3767
  commentAvatarUrls,
3757
3768
  currentCommentAuthor,
3758
3769
  );
@@ -3761,6 +3772,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
3761
3772
  commentAvatarUrls,
3762
3773
  currentCommentAuthor,
3763
3774
  documentHtml,
3775
+ t,
3764
3776
  visiblePlanComments,
3765
3777
  ]);
3766
3778
 
@@ -4132,7 +4144,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4132
4144
  /^file:\/\//i.test(data.href)
4133
4145
  ) {
4134
4146
  window.location.href = data.href;
4135
- toast.info("Opening file in your editor");
4147
+ toast.info(t("plansPage.reader.openingFile"));
4136
4148
  }
4137
4149
  }
4138
4150
  if (data?.type === "agent-native-plan-editor-preference") {
@@ -4145,7 +4157,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4145
4157
  window.localStorage.setItem(PREFERRED_EDITOR_STORAGE_KEY, editor);
4146
4158
  }
4147
4159
  if (data?.type === "agent-native-plan-link-blocked") {
4148
- toast.info("Links are disabled in review so the document stays put.");
4160
+ toast.info(t("plansPage.reader.linksDisabled"));
4149
4161
  }
4150
4162
  if (data?.type === "agent-native-plan-doc-state" && data.state) {
4151
4163
  documentStateRef.current = data.state;
@@ -4160,7 +4172,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4160
4172
  typeof data.summary === "string"
4161
4173
  ) {
4162
4174
  void navigator.clipboard.writeText(data.summary).then(() => {
4163
- toast.success("Visual intake prompt copied");
4175
+ toast.success(t("plansPage.reader.visualPromptCopied"));
4164
4176
  });
4165
4177
  }
4166
4178
  if (
@@ -4174,7 +4186,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4174
4186
  message: buildQuestionFormRevisionMessage(data.summary),
4175
4187
  });
4176
4188
  persistQuestionFormAnswers(data.summary, bundle?.plan.id);
4177
- toast.success("Sent answers to the agent");
4189
+ toast.success(t("plansPage.reader.sentAnswers"));
4178
4190
  }
4179
4191
  };
4180
4192
  window.addEventListener("message", onMessage);
@@ -4196,12 +4208,16 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4196
4208
  const copyPlanLink = async () => {
4197
4209
  if (!planShareUrl) return;
4198
4210
  await navigator.clipboard.writeText(planShareUrl);
4199
- toast.success(isRecap ? "Recap link copied" : "Plan link copied");
4211
+ toast.success(
4212
+ isRecap
4213
+ ? t("plansPage.reader.recapLinkCopied")
4214
+ : t("plansPage.reader.planLinkCopied"),
4215
+ );
4200
4216
  };
4201
4217
 
4202
4218
  const copyLocalPlanFolder = async () => {
4203
4219
  await navigator.clipboard.writeText(localPlanDisplayFolder);
4204
- toast.success("Local path copied");
4220
+ toast.success(t("plansPage.reader.localPathCopied"));
4205
4221
  };
4206
4222
 
4207
4223
  const openPromoteLocalPlanDialog = () => {
@@ -4217,7 +4233,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4217
4233
  if (!localPlanSlug || localPlanBridgeUrl) return;
4218
4234
  const targetPath = promoteLocalPlanTargetPath.trim();
4219
4235
  if (!targetPath) {
4220
- toast.error("Enter a repo-relative folder path.");
4236
+ toast.error(t("plansPage.reader.enterRepoFolder"));
4221
4237
  return;
4222
4238
  }
4223
4239
 
@@ -4230,10 +4246,11 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4230
4246
  setPromoteLocalPlanOpen(false);
4231
4247
  toast.success(
4232
4248
  result.alreadyPromoted
4233
- ? "Local plan is already saved in the repo"
4234
- : `Saved ${result.localFiles?.files.length ?? 0} local files to ${
4235
- result.targetPath ?? targetPath
4236
- }`,
4249
+ ? t("plansPage.reader.localPlanAlreadySaved")
4250
+ : t("plansPage.reader.savedLocalFiles", {
4251
+ count: result.localFiles?.files.length ?? 0,
4252
+ path: result.targetPath ?? targetPath,
4253
+ }),
4237
4254
  );
4238
4255
  navigate(localPlanRoutePath(result.slug, result.repoPath ?? targetPath));
4239
4256
  };
@@ -4263,7 +4280,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4263
4280
  if (localPlanMode) {
4264
4281
  const localBundle = bundle as LocalPlanBundle | undefined;
4265
4282
  if (!localBundle) {
4266
- throw new Error("Local plan source was not available yet.");
4283
+ throw new Error(t("plansPage.reader.localSourceUnavailable"));
4267
4284
  }
4268
4285
  const mdx =
4269
4286
  localBundle.mdx ??
@@ -4271,7 +4288,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4271
4288
  ? { "plan.mdx": localBundle.plan.markdown }
4272
4289
  : undefined);
4273
4290
  if (!mdx?.["plan.mdx"]) {
4274
- throw new Error("Local plan source files were not available yet.");
4291
+ throw new Error(t("plansPage.reader.localSourceFilesUnavailable"));
4275
4292
  }
4276
4293
  return {
4277
4294
  markdown: localBundle.plan.markdown ?? mdx["plan.mdx"],
@@ -4293,7 +4310,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4293
4310
  const result = await exportPlan.refetch();
4294
4311
  const data = result.data ?? exportPlan.data;
4295
4312
  if (!data) {
4296
- throw new Error("Plan export was not available yet.");
4313
+ throw new Error(t("plansPage.reader.exportUnavailable"));
4297
4314
  }
4298
4315
  return data;
4299
4316
  }, [
@@ -4311,7 +4328,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4311
4328
  const plan = bundle?.plan;
4312
4329
  const planFiles = getDesktopPlanFiles();
4313
4330
  if (!plan || !planFiles) {
4314
- throw new Error("Desktop local file sync is not available.");
4331
+ throw new Error(t("plansPage.reader.desktopSyncUnavailable"));
4315
4332
  }
4316
4333
 
4317
4334
  setDesktopPlanSyncing(true);
@@ -4339,7 +4356,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4339
4356
 
4340
4357
  const data = await readPlanExport();
4341
4358
  if (!data.mdx || !data.mdx["plan.mdx"]) {
4342
- throw new Error("Plan source files were not available yet.");
4359
+ throw new Error(t("plansPage.reader.sourceFilesUnavailable"));
4343
4360
  }
4344
4361
  const written = await planFiles.writePlan({
4345
4362
  planId: plan.id,
@@ -4357,7 +4374,11 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4357
4374
  }
4358
4375
  desktopAutoSyncedVersionRef.current[plan.id] = plan.updatedAt;
4359
4376
  if (!options.quiet) {
4360
- toast.success(`Synced ${written.files?.length ?? 0} local files`);
4377
+ toast.success(
4378
+ t("plansPage.reader.syncedLocalFiles", {
4379
+ count: written.files?.length ?? 0,
4380
+ }),
4381
+ );
4361
4382
  }
4362
4383
  return written.folder;
4363
4384
  } finally {
@@ -4371,14 +4392,14 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4371
4392
  const plan = bundle?.plan;
4372
4393
  const planFiles = getDesktopPlanFiles();
4373
4394
  if (!plan || !planFiles) {
4374
- throw new Error("Desktop local file sync is not available.");
4395
+ throw new Error(t("plansPage.reader.desktopSyncUnavailable"));
4375
4396
  }
4376
4397
 
4377
4398
  setDesktopPlanImporting(true);
4378
4399
  try {
4379
4400
  const result = await planFiles.readPlan({ planId: plan.id });
4380
4401
  if (result.ok === false) throw new Error(result.error);
4381
- if (!result.mdx) throw new Error("No Plan source files were found.");
4402
+ if (!result.mdx) throw new Error(t("plansPage.reader.noSourceFiles"));
4382
4403
  const synced = await syncLocalControlResources({
4383
4404
  folderName: result.folder.name,
4384
4405
  files: result.controlResources,
@@ -4393,7 +4414,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4393
4414
  currentFocus: "desktop local files sync",
4394
4415
  });
4395
4416
  setDesktopPlanFolder(result.folder);
4396
- toast.success("Imported local source files");
4417
+ toast.success(t("plansPage.reader.importedLocalSource"));
4397
4418
  const updatedAt = imported.plan?.updatedAt;
4398
4419
  if (updatedAt) {
4399
4420
  desktopAutoSyncedVersionRef.current[plan.id] = updatedAt;
@@ -4416,7 +4437,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4416
4437
  toast.error(
4417
4438
  error instanceof Error
4418
4439
  ? error.message
4419
- : "Could not enable local file sync.",
4440
+ : t("plansPage.reader.enableLocalSyncFailed"),
4420
4441
  );
4421
4442
  },
4422
4443
  );
@@ -4440,7 +4461,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4440
4461
  toast.error(
4441
4462
  error instanceof Error
4442
4463
  ? error.message
4443
- : "Could not sync plan to local files.",
4464
+ : t("plansPage.reader.syncLocalFailed"),
4444
4465
  );
4445
4466
  });
4446
4467
  }, [
@@ -4453,13 +4474,13 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4453
4474
  const copyPlanHtml = async () => {
4454
4475
  const data = await readPlanExport();
4455
4476
  await navigator.clipboard.writeText(data.html);
4456
- toast.success("Plan HTML copied");
4477
+ toast.success(t("plansPage.reader.planHtmlCopied"));
4457
4478
  };
4458
4479
 
4459
4480
  const copyPlanMarkdown = async () => {
4460
4481
  const data = await readPlanExport();
4461
4482
  await navigator.clipboard.writeText(data.markdown);
4462
- toast.success("Plan Markdown copied");
4483
+ toast.success(t("plansPage.reader.planMarkdownCopied"));
4463
4484
  };
4464
4485
 
4465
4486
  const downloadPlanHtml = async () => {
@@ -4480,7 +4501,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4480
4501
  const data = await readPlanExport();
4481
4502
  const files = data.mdx;
4482
4503
  if (!files || Object.keys(files).length === 0) {
4483
- throw new Error("Plan source files were not available yet.");
4504
+ throw new Error(t("plansPage.reader.sourceFilesUnavailable"));
4484
4505
  }
4485
4506
  const { default: JSZip } = await import("jszip");
4486
4507
  const zip = new JSZip();
@@ -4495,7 +4516,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4495
4516
  }
4496
4517
  const blob = await zip.generateAsync({ type: "blob" });
4497
4518
  downloadBlob(planExportFilename(bundle?.plan.title, "zip"), blob);
4498
- toast.success("Plan source downloaded");
4519
+ toast.success(t("plansPage.reader.planSourceDownloaded"));
4499
4520
  };
4500
4521
 
4501
4522
  const runPlanExportAction = (action: () => Promise<void>) => {
@@ -4504,7 +4525,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
4504
4525
  toast.error(
4505
4526
  error instanceof Error
4506
4527
  ? error.message
4507
- : "Plan export was not available.",
4528
+ : t("plansPage.reader.exportUnavailable"),
4508
4529
  );
4509
4530
  });
4510
4531
  });
@@ -5099,8 +5120,8 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5099
5120
  });
5100
5121
  toast.success(
5101
5122
  capture.images.length > 0
5102
- ? "Sent comments and focused screenshots to the agent"
5103
- : "Sent comments to the agent",
5123
+ ? t("plansPage.reader.sentCommentsWithScreenshots")
5124
+ : t("plansPage.reader.sentComments"),
5104
5125
  );
5105
5126
  } finally {
5106
5127
  setSendingFeedback(false);
@@ -5119,7 +5140,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5119
5140
  "\n",
5120
5141
  ),
5121
5142
  );
5122
- toast.success("Feedback instructions copied");
5143
+ toast.success(t("plansPage.reader.feedbackCopied"));
5123
5144
  };
5124
5145
 
5125
5146
  // Route comment writes to the DB (hosted) or comments.json (local); both
@@ -5291,7 +5312,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5291
5312
  )
5292
5313
  .then(() => {
5293
5314
  setActiveAnnotation(null);
5294
- toast.success("Comment updated");
5315
+ toast.success(t("plansPage.comments.commentUpdated"));
5295
5316
  })
5296
5317
  .catch(() => {
5297
5318
  // The mutation hook surfaces the failure toast; just clear pending.
@@ -5366,7 +5387,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5366
5387
  if (selectedPlanQueryKey) {
5367
5388
  queryClient.setQueryData(selectedPlanQueryKey, updated);
5368
5389
  }
5369
- toast.success("Reply added");
5390
+ toast.success(t("plansPage.comments.replyAdded"));
5370
5391
  } catch {
5371
5392
  // Roll back the optimistic reply on error.
5372
5393
  queryClient.setQueryData(
@@ -5433,7 +5454,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5433
5454
  )
5434
5455
  .then(() => {
5435
5456
  toast.success(
5436
- status === "resolved" ? "Comment resolved" : "Comment reopened",
5457
+ status === "resolved"
5458
+ ? t("plansPage.comments.commentResolved")
5459
+ : t("plansPage.comments.commentReopened"),
5437
5460
  );
5438
5461
  })
5439
5462
  .catch(() => {
@@ -5484,7 +5507,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5484
5507
  setDeleteCommentRequest(null);
5485
5508
  try {
5486
5509
  await removeCommentById(commentId);
5487
- toast.success("Comment deleted");
5510
+ toast.success(t("plansPage.comments.commentDeleted"));
5488
5511
  } catch (error) {
5489
5512
  if (prevBundle !== undefined) {
5490
5513
  queryClient.setQueryData(selectedPlanQueryKey, prevBundle);
@@ -5617,12 +5640,14 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5617
5640
  window.location.href = appPath("/plans");
5618
5641
  }
5619
5642
  }}
5620
- aria-label="Back to plans"
5643
+ aria-label={t("plansPage.reader.backToPlans")}
5621
5644
  >
5622
5645
  <IconArrowLeft className="size-4" />
5623
5646
  </Button>
5624
5647
  </TooltipTrigger>
5625
- <TooltipContent>Back to plans</TooltipContent>
5648
+ <TooltipContent>
5649
+ {t("plansPage.reader.backToPlans")}
5650
+ </TooltipContent>
5626
5651
  </Tooltip>
5627
5652
  </div>
5628
5653
  )}
@@ -5685,8 +5710,8 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5685
5710
  }
5686
5711
  aria-label={
5687
5712
  prototypeOnly
5688
- ? "Open full plan"
5689
- : "Open prototype window"
5713
+ ? t("plansPage.reader.openFullPlan")
5714
+ : t("plansPage.reader.openPrototypeWindow")
5690
5715
  }
5691
5716
  >
5692
5717
  <IconExternalLink className="size-4" />
@@ -5694,8 +5719,8 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5694
5719
  </TooltipTrigger>
5695
5720
  <TooltipContent>
5696
5721
  {prototypeOnly
5697
- ? "Open full plan"
5698
- : "Open prototype window"}
5722
+ ? t("plansPage.reader.openFullPlan")
5723
+ : t("plansPage.reader.openPrototypeWindow")}
5699
5724
  </TooltipContent>
5700
5725
  </Tooltip>
5701
5726
  )}
@@ -5709,7 +5734,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5709
5734
  className="pointer-events-auto gap-1.5"
5710
5735
  disabled={sendingFeedback}
5711
5736
  >
5712
- {sendingFeedback ? "Sending" : "Send to agent"}
5737
+ {sendingFeedback
5738
+ ? t("plansPage.reader.sending")
5739
+ : t("plansPage.reader.sendToAgent")}
5713
5740
  <span className="flex size-4 items-center justify-center rounded-full bg-background/20 text-[10px] font-medium">
5714
5741
  {bundle.summary.openCommentCount}
5715
5742
  </span>
@@ -5720,7 +5747,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5720
5747
  align="end"
5721
5748
  className="w-64 rounded-xl"
5722
5749
  >
5723
- <DropdownMenuLabel>Send feedback</DropdownMenuLabel>
5750
+ <DropdownMenuLabel>
5751
+ {t("plansPage.reader.sendFeedback")}
5752
+ </DropdownMenuLabel>
5724
5753
  <DropdownMenuGroup>
5725
5754
  <DropdownMenuItem
5726
5755
  onClick={() =>
@@ -5732,9 +5761,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5732
5761
  >
5733
5762
  <IconClipboardText className="mt-0.5 size-4" />
5734
5763
  <span className="grid gap-0.5">
5735
- <span>Copy for your agent</span>
5764
+ <span>{t("plansPage.reader.copyForAgent")}</span>
5736
5765
  <span className="text-xs font-normal leading-4 text-muted-foreground">
5737
- Copies a prompt you can paste into chat.
5766
+ {t("plansPage.reader.copyForAgentDescription")}
5738
5767
  </span>
5739
5768
  </span>
5740
5769
  </DropdownMenuItem>
@@ -5749,9 +5778,13 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5749
5778
  >
5750
5779
  <IconSend className="mt-0.5 size-4" />
5751
5780
  <span className="grid gap-0.5">
5752
- <span>Send to inline agent</span>
5781
+ <span>
5782
+ {t("plansPage.reader.sendToInlineAgent")}
5783
+ </span>
5753
5784
  <span className="text-xs font-normal leading-4 text-muted-foreground">
5754
- Posts open comments into the app side agent.
5785
+ {t(
5786
+ "plansPage.reader.sendToInlineAgentDescription",
5787
+ )}
5755
5788
  </span>
5756
5789
  </span>
5757
5790
  </DropdownMenuItem>
@@ -5773,7 +5806,8 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5773
5806
  variant="ghost"
5774
5807
  size="icon"
5775
5808
  className="pointer-events-auto size-8"
5776
- aria-label="Plan actions"
5809
+ data-plan-actions-trigger
5810
+ aria-label={t("plansPage.overview.planActions")}
5777
5811
  >
5778
5812
  <IconDotsVertical className="size-4" />
5779
5813
  </Button>
@@ -5782,7 +5816,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5782
5816
  {localPlanMode && (
5783
5817
  <>
5784
5818
  <DropdownMenuLabel className="text-xs font-medium text-muted-foreground">
5785
- Local files
5819
+ {t("plansPage.reader.localFiles")}
5786
5820
  </DropdownMenuLabel>
5787
5821
  <div className="px-2 pb-1 text-xs leading-5 text-muted-foreground">
5788
5822
  <div
@@ -5791,7 +5825,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5791
5825
  >
5792
5826
  {localPlanMenuPath}
5793
5827
  </div>
5794
- <div>No hosted database writes or sharing.</div>
5828
+ <div>{t("plansPage.reader.localFilesNoHosted")}</div>
5795
5829
  </div>
5796
5830
  <DropdownMenuItem
5797
5831
  onClick={() =>
@@ -5800,7 +5834,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5800
5834
  className="gap-2"
5801
5835
  >
5802
5836
  <IconFolder className="size-4" />
5803
- Copy local path
5837
+ {t("plansPage.reader.copyLocalPath")}
5804
5838
  </DropdownMenuItem>
5805
5839
  {!localPlanBridgeUrl && (
5806
5840
  <DropdownMenuItem
@@ -5817,7 +5851,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5817
5851
  ) : (
5818
5852
  <IconFolder className="size-4" />
5819
5853
  )}
5820
- Save to repo...
5854
+ {t("plansPage.reader.saveToRepo")}
5821
5855
  </DropdownMenuItem>
5822
5856
  )}
5823
5857
  {localPlanBridgeUrl && desktopPlanFilesAvailable && (
@@ -5835,7 +5869,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5835
5869
  ) : (
5836
5870
  <IconFolder className="size-4" />
5837
5871
  )}
5838
- Save source to folder...
5872
+ {t("plansPage.reader.saveSourceToFolder")}
5839
5873
  </DropdownMenuItem>
5840
5874
  )}
5841
5875
  <DropdownMenuSeparator />
@@ -5845,20 +5879,22 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5845
5879
  {!localPlanMode && (
5846
5880
  <>
5847
5881
  <DropdownMenuLabel className="text-xs font-medium text-muted-foreground">
5848
- Comments
5882
+ {t("plansPage.comments.comments")}
5849
5883
  </DropdownMenuLabel>
5850
5884
  <DropdownMenuRadioGroup value={commentVisibility}>
5851
5885
  <DropdownMenuRadioItem
5852
5886
  value="hidden"
5853
5887
  onSelect={() => chooseCommentVisibility("hidden")}
5854
5888
  >
5855
- Hide comments
5889
+ {t("plansPage.reader.hideComments")}
5856
5890
  </DropdownMenuRadioItem>
5857
5891
  <DropdownMenuRadioItem
5858
5892
  value="open"
5859
5893
  onSelect={() => chooseCommentVisibility("open")}
5860
5894
  >
5861
- <span className="flex-1">Show comments</span>
5895
+ <span className="flex-1">
5896
+ {t("plansPage.reader.showComments")}
5897
+ </span>
5862
5898
  {hasOpenThreads && (
5863
5899
  <span className="text-xs text-muted-foreground">
5864
5900
  {bundle.summary.openCommentCount}
@@ -5869,7 +5905,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5869
5905
  value="all"
5870
5906
  onSelect={() => chooseCommentVisibility("all")}
5871
5907
  >
5872
- <span className="flex-1">Show all comments</span>
5908
+ <span className="flex-1">
5909
+ {t("plansPage.reader.showAllComments")}
5910
+ </span>
5873
5911
  {resolvedCommentThreadCount > 0 && (
5874
5912
  <span className="text-xs text-muted-foreground">
5875
5913
  {commentThreads.length}
@@ -5887,7 +5925,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5887
5925
  className="gap-2"
5888
5926
  >
5889
5927
  <IconHistory className="size-4" />
5890
- History
5928
+ {t("plansPage.history.title")}
5891
5929
  </DropdownMenuItem>
5892
5930
  </>
5893
5931
  )}
@@ -5913,10 +5951,10 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5913
5951
  <IconArrowsMaximize className="size-4" />
5914
5952
  )}
5915
5953
  {prototypeOnly
5916
- ? "Full plan"
5954
+ ? t("plansPage.reader.fullPlan")
5917
5955
  : immersiveReader
5918
- ? "App view"
5919
- : "Full screen"}
5956
+ ? t("plansPage.reader.appView")
5957
+ : t("plansPage.reader.fullScreen")}
5920
5958
  </DropdownMenuItem>
5921
5959
  <DropdownMenuItem
5922
5960
  onClick={() =>
@@ -5931,7 +5969,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5931
5969
  ) : (
5932
5970
  <IconMoon className="size-4" />
5933
5971
  )}
5934
- {isDarkTheme ? "Light mode" : "Dark mode"}
5972
+ {isDarkTheme
5973
+ ? t("plansPage.reader.lightMode")
5974
+ : t("plansPage.reader.darkMode")}
5935
5975
  </DropdownMenuItem>
5936
5976
  <DropdownMenuItem
5937
5977
  onClick={() =>
@@ -5941,8 +5981,8 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5941
5981
  >
5942
5982
  <IconPencil className="size-4" />
5943
5983
  {wireframeStyle === "sketchy"
5944
- ? "Clean wireframes"
5945
- : "Sketchy wireframes"}
5984
+ ? t("plansPage.reader.cleanWireframes")
5985
+ : t("plansPage.reader.sketchyWireframes")}
5946
5986
  </DropdownMenuItem>
5947
5987
  {bundle.plan.content?.prototype ? (
5948
5988
  <DropdownMenuItem
@@ -5952,7 +5992,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5952
5992
  className="gap-2"
5953
5993
  >
5954
5994
  <IconExternalLink className="size-4" />
5955
- Open prototype window
5995
+ {t("plansPage.reader.openPrototypeWindow")}
5956
5996
  </DropdownMenuItem>
5957
5997
  ) : null}
5958
5998
  </DropdownMenuGroup>
@@ -5963,7 +6003,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5963
6003
  className="gap-2"
5964
6004
  >
5965
6005
  <IconCopy className="size-4" />
5966
- Copy link
6006
+ {t("plansPage.reader.copyLink")}
5967
6007
  </DropdownMenuItem>
5968
6008
  <DropdownMenuItem asChild className="gap-2">
5969
6009
  <a
@@ -5972,7 +6012,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5972
6012
  rel="noreferrer"
5973
6013
  >
5974
6014
  <IconHelpCircle className="size-4" />
5975
- Open docs
6015
+ {t("plansPage.reader.openDocs")}
5976
6016
  </a>
5977
6017
  </DropdownMenuItem>
5978
6018
  <DropdownMenuItem
@@ -5980,13 +6020,13 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
5980
6020
  className="gap-2"
5981
6021
  >
5982
6022
  <IconFileZip className="size-4" />
5983
- Download source (.zip)
6023
+ {t("plansPage.reader.downloadSourceZip")}
5984
6024
  </DropdownMenuItem>
5985
6025
  {desktopPlanFilesAvailable && !localPlanMode && (
5986
6026
  <>
5987
6027
  <DropdownMenuSeparator />
5988
6028
  <DropdownMenuLabel className="text-xs font-medium text-muted-foreground">
5989
- Local files
6029
+ {t("plansPage.reader.localFiles")}
5990
6030
  </DropdownMenuLabel>
5991
6031
  <DropdownMenuItem
5992
6032
  onClick={() =>
@@ -6005,8 +6045,8 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6005
6045
  <IconFolder className="size-4" />
6006
6046
  )}
6007
6047
  {desktopPlanFolder
6008
- ? "Change local folder"
6009
- : "Link local folder"}
6048
+ ? t("plansPage.reader.changeLocalFolder")
6049
+ : t("plansPage.reader.linkLocalFolder")}
6010
6050
  </DropdownMenuItem>
6011
6051
  <DropdownMenuItem
6012
6052
  onClick={() =>
@@ -6022,7 +6062,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6022
6062
  ) : (
6023
6063
  <IconRefresh className="size-4" />
6024
6064
  )}
6025
- Sync to local folder
6065
+ {t("plansPage.reader.syncToLocalFolder")}
6026
6066
  </DropdownMenuItem>
6027
6067
  <DropdownMenuItem
6028
6068
  onClick={() =>
@@ -6040,7 +6080,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6040
6080
  ) : (
6041
6081
  <IconDownload className="size-4" />
6042
6082
  )}
6043
- Import local edits
6083
+ {t("plansPage.reader.importLocalEdits")}
6044
6084
  </DropdownMenuItem>
6045
6085
  <DropdownMenuCheckboxItem
6046
6086
  checked={desktopPlanAutoSync}
@@ -6049,14 +6089,14 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6049
6089
  setDesktopPlanAutoSyncEnabled(checked === true)
6050
6090
  }
6051
6091
  >
6052
- Auto-sync changes
6092
+ {t("plansPage.reader.autoSyncChanges")}
6053
6093
  </DropdownMenuCheckboxItem>
6054
6094
  </>
6055
6095
  )}
6056
6096
  <DropdownMenuSub>
6057
6097
  <DropdownMenuSubTrigger className="gap-2">
6058
6098
  <IconDownload className="size-4" />
6059
- Export
6099
+ {t("plansPage.reader.export")}
6060
6100
  </DropdownMenuSubTrigger>
6061
6101
  <DropdownMenuSubContent className="w-56 rounded-xl">
6062
6102
  <DropdownMenuItem
@@ -6066,7 +6106,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6066
6106
  className="gap-2"
6067
6107
  >
6068
6108
  <IconClipboardText className="size-4" />
6069
- Copy Markdown
6109
+ {t("plansPage.reader.copyMarkdown")}
6070
6110
  </DropdownMenuItem>
6071
6111
  <DropdownMenuItem
6072
6112
  onClick={() =>
@@ -6075,14 +6115,14 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6075
6115
  className="gap-2"
6076
6116
  >
6077
6117
  <IconDownload className="size-4" />
6078
- Download Markdown
6118
+ {t("plansPage.reader.downloadMarkdown")}
6079
6119
  </DropdownMenuItem>
6080
6120
  <DropdownMenuItem
6081
6121
  onClick={() => runPlanExportAction(copyPlanHtml)}
6082
6122
  className="gap-2"
6083
6123
  >
6084
6124
  <IconCopy className="size-4" />
6085
- Copy HTML
6125
+ {t("plansPage.reader.copyHtml")}
6086
6126
  </DropdownMenuItem>
6087
6127
  <DropdownMenuItem
6088
6128
  onClick={() =>
@@ -6091,7 +6131,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6091
6131
  className="gap-2"
6092
6132
  >
6093
6133
  <IconDownload className="size-4" />
6094
- Download HTML
6134
+ {t("plansPage.reader.downloadHtml")}
6095
6135
  </DropdownMenuItem>
6096
6136
  </DropdownMenuSubContent>
6097
6137
  </DropdownMenuSub>
@@ -6106,7 +6146,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6106
6146
  className="gap-2"
6107
6147
  >
6108
6148
  <IconClipboardText className="size-4" />
6109
- Copy feedback
6149
+ {t("plansPage.reader.copyFeedback")}
6110
6150
  </DropdownMenuItem>
6111
6151
  )}
6112
6152
  </DropdownMenuGroup>
@@ -6122,7 +6162,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6122
6162
  className="gap-2 text-destructive focus:text-destructive"
6123
6163
  >
6124
6164
  <IconTrash className="size-4" />
6125
- Delete...
6165
+ {t("plansPage.overview.delete")}
6126
6166
  </DropdownMenuItem>
6127
6167
  </>
6128
6168
  )}
@@ -6136,21 +6176,27 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6136
6176
  size="icon"
6137
6177
  className="pointer-events-auto size-8"
6138
6178
  onClick={togglePlansAgent}
6139
- aria-label="Toggle agent sidebar"
6179
+ aria-label={t("plansPage.reader.toggleAgentSidebar")}
6140
6180
  >
6141
6181
  <IconLayoutSidebarRight className="size-4" />
6142
6182
  </Button>
6143
6183
  </TooltipTrigger>
6144
- <TooltipContent>Toggle side chat</TooltipContent>
6184
+ <TooltipContent>
6185
+ {t("plansPage.reader.toggleSideChat")}
6186
+ </TooltipContent>
6145
6187
  </Tooltip>
6146
6188
  </div>
6147
6189
  {reviewMode !== "none" && !recapScreenshotMode && (
6148
6190
  <div className="pointer-events-none absolute left-1/2 top-3 z-10 -translate-x-1/2 rounded-full border border-border/70 bg-background/82 px-3 py-2 text-xs text-muted-foreground shadow-2xl backdrop-blur-xl">
6149
6191
  {reviewMode === "comment"
6150
- ? `Click the ${isRecap ? "recap" : "plan"} or select text to comment`
6192
+ ? t("plansPage.reader.clickToComment", {
6193
+ noun: isRecap
6194
+ ? t("plansPage.nouns.recap")
6195
+ : t("plansPage.nouns.plan"),
6196
+ })
6151
6197
  : reviewMode === "text"
6152
- ? "Click the canvas to place a note"
6153
- : "Drag on the canvas to draw a callout"}
6198
+ ? t("plansPage.reader.clickCanvasNote")
6199
+ : t("plansPage.reader.dragCanvasCallout")}
6154
6200
  </div>
6155
6201
  )}
6156
6202
  {bundle.plan.content ? (
@@ -6216,7 +6262,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6216
6262
  message: buildQuestionFormRevisionMessage(summary),
6217
6263
  });
6218
6264
  persistQuestionFormAnswers(summary, bundle.plan.id);
6219
- toast.success("Sent answers to the agent");
6265
+ toast.success(t("plansPage.reader.sentAnswers"));
6220
6266
  }}
6221
6267
  />
6222
6268
  </div>
@@ -6235,7 +6281,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6235
6281
  onClick={beginNativeSelectionComment}
6236
6282
  >
6237
6283
  <IconMessageCircle className="size-4 text-primary" />
6238
- Comment
6284
+ {t("plansPage.comments.comment")}
6239
6285
  </Button>
6240
6286
  </div>
6241
6287
  )}
@@ -6428,13 +6474,17 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6428
6474
  className="space-y-4"
6429
6475
  >
6430
6476
  <DialogHeader>
6431
- <DialogTitle>Save local plan to repo</DialogTitle>
6477
+ <DialogTitle>
6478
+ {t("plansPage.reader.saveLocalPlanToRepo")}
6479
+ </DialogTitle>
6432
6480
  <DialogDescription>
6433
- Choose a repo-relative folder for these MDX files.
6481
+ {t("plansPage.reader.chooseRepoFolder")}
6434
6482
  </DialogDescription>
6435
6483
  </DialogHeader>
6436
6484
  <div className="space-y-2">
6437
- <Label htmlFor="local-plan-repo-path">Repo folder</Label>
6485
+ <Label htmlFor="local-plan-repo-path">
6486
+ {t("plansPage.reader.repoFolder")}
6487
+ </Label>
6438
6488
  <Input
6439
6489
  id="local-plan-repo-path"
6440
6490
  value={promoteLocalPlanTargetPath}
@@ -6456,7 +6506,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6456
6506
  setPromoteLocalPlanOverwrite(checked === true)
6457
6507
  }
6458
6508
  />
6459
- Replace existing folder
6509
+ {t("plansPage.reader.replaceExistingFolder")}
6460
6510
  </label>
6461
6511
  <DialogFooter>
6462
6512
  <Button
@@ -6465,7 +6515,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6465
6515
  onClick={() => setPromoteLocalPlanOpen(false)}
6466
6516
  disabled={promoteLocalPlan.isPending}
6467
6517
  >
6468
- Cancel
6518
+ {t("plansPage.common.cancel")}
6469
6519
  </Button>
6470
6520
  <Button
6471
6521
  type="submit"
@@ -6529,23 +6579,26 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
6529
6579
  // makes clear that anyone-with-link can view, but commenting on a public
6530
6580
  // plan/recap still needs an agent-native account (comments are attributed +
6531
6581
  // scoped). `noun` is "plan" or "recap" so recaps read as recaps everywhere.
6532
- const buildShareVisibilityCopy = (noun: string) => ({
6582
+ const buildShareVisibilityCopy = (
6583
+ t: ReturnType<typeof useT>,
6584
+ noun: string,
6585
+ ) => ({
6533
6586
  private: {
6534
- label: "Private",
6535
- description: `Only invited people can open this ${noun}`,
6587
+ label: t("plansPage.share.visibility.private.label"),
6588
+ description: t("plansPage.share.visibility.private.description", { noun }),
6536
6589
  },
6537
6590
  org: {
6538
- label: "Organization",
6539
- description: "Anyone in your organization with the link can view",
6591
+ label: t("plansPage.share.visibility.org.label"),
6592
+ description: t("plansPage.share.visibility.org.description"),
6540
6593
  },
6541
6594
  public: {
6542
- label: "Public",
6543
- description: "Anyone with the link can view",
6595
+ label: t("plansPage.share.visibility.public.label"),
6596
+ description: t("plansPage.share.visibility.public.description"),
6544
6597
  },
6545
6598
  });
6546
6599
 
6547
- const buildShareAccessNote = (noun: string) =>
6548
- `Anyone with edit access can change the ${noun}. Viewing a public ${noun} needs no account, but commenting on it requires an agent-native account.`;
6600
+ const buildShareAccessNote = (t: ReturnType<typeof useT>, noun: string) =>
6601
+ t("plansPage.share.accessNote", { noun });
6549
6602
 
6550
6603
  function PlanReportControl({
6551
6604
  planId,
@@ -6558,6 +6611,7 @@ function PlanReportControl({
6558
6611
  isRecap?: boolean;
6559
6612
  onOpenChange?: (open: boolean) => void;
6560
6613
  }) {
6614
+ const t = useT();
6561
6615
  const noun = isRecap ? "recap" : "plan";
6562
6616
  const reportPlan = useReportVisualPlan();
6563
6617
  const [open, setOpen] = useState(false);
@@ -6612,19 +6666,21 @@ function PlanReportControl({
6612
6666
  size="icon"
6613
6667
  className="pointer-events-auto size-8"
6614
6668
  onClick={() => setDialogOpen(true)}
6615
- aria-label={`Report ${noun}`}
6669
+ aria-label={t("plansPage.report.reportAria", { noun })}
6616
6670
  >
6617
6671
  <IconFlag className="size-4" />
6618
6672
  </Button>
6619
6673
  </TooltipTrigger>
6620
- <TooltipContent>Report {noun}</TooltipContent>
6674
+ <TooltipContent>
6675
+ {t("plansPage.report.report", { noun })}
6676
+ </TooltipContent>
6621
6677
  </Tooltip>
6622
6678
  <DialogContent className="sm:max-w-[460px]">
6623
6679
  <form onSubmit={submitReport} className="space-y-4">
6624
6680
  <DialogHeader>
6625
- <DialogTitle>Report {noun}</DialogTitle>
6681
+ <DialogTitle>{t("plansPage.report.report", { noun })}</DialogTitle>
6626
6682
  <DialogDescription>
6627
- Tell us why this public {noun} should be reviewed.
6683
+ {t("plansPage.report.description", { noun })}
6628
6684
  </DialogDescription>
6629
6685
  </DialogHeader>
6630
6686
 
@@ -6633,7 +6689,9 @@ function PlanReportControl({
6633
6689
  </div>
6634
6690
 
6635
6691
  <div className="space-y-2">
6636
- <Label htmlFor="plan-report-reason">Reason</Label>
6692
+ <Label htmlFor="plan-report-reason">
6693
+ {t("plansPage.report.reason")}
6694
+ </Label>
6637
6695
  <Select
6638
6696
  value={reason}
6639
6697
  onValueChange={(value) => setReason(value as PlanReportReason)}
@@ -6644,7 +6702,7 @@ function PlanReportControl({
6644
6702
  <SelectContent>
6645
6703
  {REPORT_REASON_OPTIONS.map((option) => (
6646
6704
  <SelectItem key={option.value} value={option.value}>
6647
- {option.label}
6705
+ {t(`plansPage.report.reasons.${option.value}`)}
6648
6706
  </SelectItem>
6649
6707
  ))}
6650
6708
  </SelectContent>
@@ -6653,7 +6711,9 @@ function PlanReportControl({
6653
6711
 
6654
6712
  <div className="space-y-2">
6655
6713
  <div className="flex items-center justify-between gap-3">
6656
- <Label htmlFor="plan-report-details">Details</Label>
6714
+ <Label htmlFor="plan-report-details">
6715
+ {t("plansPage.report.details")}
6716
+ </Label>
6657
6717
  <span className="text-xs text-muted-foreground">
6658
6718
  {details.length}/1000
6659
6719
  </span>
@@ -6663,7 +6723,7 @@ function PlanReportControl({
6663
6723
  value={details}
6664
6724
  onChange={(event) => setDetails(event.target.value)}
6665
6725
  maxLength={1000}
6666
- placeholder="Add a short note for moderators"
6726
+ placeholder={t("plansPage.report.detailsPlaceholder")}
6667
6727
  className="min-h-28 resize-none"
6668
6728
  />
6669
6729
  </div>
@@ -6675,18 +6735,18 @@ function PlanReportControl({
6675
6735
  onClick={() => setDialogOpen(false)}
6676
6736
  disabled={reportPlan.isPending}
6677
6737
  >
6678
- Cancel
6738
+ {t("plansPage.common.cancel")}
6679
6739
  </Button>
6680
6740
  <Button type="submit" disabled={reportPlan.isPending}>
6681
6741
  {reportPlan.isPending ? (
6682
6742
  <>
6683
6743
  <IconLoader2 className="size-4 animate-spin" />
6684
- Sending
6744
+ {t("plansPage.reader.sending")}
6685
6745
  </>
6686
6746
  ) : (
6687
6747
  <>
6688
6748
  <IconFlag className="size-4" />
6689
- Submit report
6749
+ {t("plansPage.report.submit")}
6690
6750
  </>
6691
6751
  )}
6692
6752
  </Button>
@@ -6722,6 +6782,7 @@ function PlanShareControl({
6722
6782
  hostedPlanUrl?: string | null;
6723
6783
  onOpenChange?: (open: boolean) => void;
6724
6784
  }) {
6785
+ const t = useT();
6725
6786
  const noun = isRecap ? "recap" : "plan";
6726
6787
  const Noun = isRecap ? "Recap" : "Plan";
6727
6788
  const { session, isLoading: sessionLoading } = useSession();
@@ -6781,12 +6842,15 @@ function PlanShareControl({
6781
6842
  window.location.href = target;
6782
6843
  }, []);
6783
6844
 
6784
- const copyPublishedUrl = useCallback((url: string) => {
6785
- void navigator.clipboard.writeText(url).then(
6786
- () => toast.success("Shareable link copied"),
6787
- () => toast.error("Could not copy link"),
6788
- );
6789
- }, []);
6845
+ const copyPublishedUrl = useCallback(
6846
+ (url: string) => {
6847
+ void navigator.clipboard.writeText(url).then(
6848
+ () => toast.success(t("plansPage.share.linkCopied")),
6849
+ () => toast.error(t("plansPage.share.copyFailed")),
6850
+ );
6851
+ },
6852
+ [t],
6853
+ );
6790
6854
 
6791
6855
  const handlePublish = useCallback(() => {
6792
6856
  publishPlan.mutate(
@@ -6798,7 +6862,9 @@ function PlanShareControl({
6798
6862
  authUrl: result.authUrl,
6799
6863
  connectCommand: result.connectCommand,
6800
6864
  });
6801
- toast.message(`Create a free account to publish this ${noun}`);
6865
+ toast.message(
6866
+ t("plansPage.share.createAccountToPublish", { noun }),
6867
+ );
6802
6868
  return;
6803
6869
  }
6804
6870
  setPublishedPlan({
@@ -6830,13 +6896,13 @@ function PlanShareControl({
6830
6896
  resourceId={managedShareResourceId}
6831
6897
  resourceTitle={planTitle}
6832
6898
  shareUrl={managedShareUrl}
6833
- shareUrlLabel={`${Noun} link`}
6834
- shareUrlDescription="Private by default. Invite people, share with your org, or set Public for anyone-with-link review."
6899
+ shareUrlLabel={t("plansPage.share.linkLabel", { noun: Noun })}
6900
+ shareUrlDescription={t("plansPage.share.description")}
6835
6901
  shareUrlPlacement="top"
6836
- peopleAccessLabel={`People with ${noun} access`}
6837
- generalAccessLabel={`General ${noun} access`}
6838
- accessNote={buildShareAccessNote(noun)}
6839
- visibilityCopy={buildShareVisibilityCopy(noun)}
6902
+ peopleAccessLabel={t("plansPage.share.peopleAccess", { noun })}
6903
+ generalAccessLabel={t("plansPage.share.generalAccess", { noun })}
6904
+ accessNote={buildShareAccessNote(t, noun)}
6905
+ visibilityCopy={buildShareVisibilityCopy(t, noun)}
6840
6906
  trigger="icon"
6841
6907
  triggerClassName="pointer-events-auto size-8"
6842
6908
  onOpenChange={onOpenChange}
@@ -6862,13 +6928,13 @@ function PlanShareControl({
6862
6928
  variant="ghost"
6863
6929
  size="icon"
6864
6930
  className="pointer-events-auto size-8"
6865
- aria-label={`Share ${noun}`}
6931
+ aria-label={t("plansPage.share.shareAria", { noun })}
6866
6932
  >
6867
6933
  <IconShare3 className="size-4" />
6868
6934
  </Button>
6869
6935
  </PopoverTrigger>
6870
6936
  </TooltipTrigger>
6871
- <TooltipContent>Share {noun}</TooltipContent>
6937
+ <TooltipContent>{t("plansPage.share.share", { noun })}</TooltipContent>
6872
6938
  </Tooltip>
6873
6939
  <PopoverContent
6874
6940
  align="end"
@@ -6877,19 +6943,18 @@ function PlanShareControl({
6877
6943
  >
6878
6944
  <div className="mb-1 flex items-center gap-2 text-sm font-semibold">
6879
6945
  <IconWorld className="size-4 text-muted-foreground" />
6880
- Share this {noun}
6946
+ {t("plansPage.share.shareThis", { noun })}
6881
6947
  </div>
6882
6948
  <p className="mb-3 text-xs leading-5 text-muted-foreground">
6883
6949
  {effectivePublishedUrl
6884
- ? `This local ${noun} has a hosted copy for sharing. Open the hosted ${noun} to manage access.`
6885
- : `Create a free account to publish this ${noun} to a shareable link. You can keep editing locally with your coding agent until you do.`}
6950
+ ? t("plansPage.share.hostedCopy", { noun })
6951
+ : t("plansPage.share.publishDescription", { noun })}
6886
6952
  </p>
6887
6953
 
6888
6954
  {authPrompt ? (
6889
6955
  <div className="space-y-3">
6890
6956
  <div className="rounded-md border border-border bg-muted/35 p-3 text-xs leading-5 text-muted-foreground">
6891
- Finish creating your account, then come back and we will generate
6892
- the link.
6957
+ {t("plansPage.share.finishAccount")}
6893
6958
  </div>
6894
6959
  {authPrompt.connectCommand ? (
6895
6960
  <code className="block overflow-x-auto rounded-md border border-border bg-muted/40 px-2.5 py-1.5 font-mono text-[11px] text-foreground">
@@ -6907,10 +6972,10 @@ function PlanShareControl({
6907
6972
  {publishPlan.isPending ? (
6908
6973
  <>
6909
6974
  <IconLoader2 className="size-3.5 animate-spin" />
6910
- Checking
6975
+ {t("plansPage.share.checking")}
6911
6976
  </>
6912
6977
  ) : (
6913
- "I'm signed in — retry"
6978
+ t("plansPage.share.signedInRetry")
6914
6979
  )}
6915
6980
  </Button>
6916
6981
  <Button
@@ -6918,7 +6983,7 @@ function PlanShareControl({
6918
6983
  size="sm"
6919
6984
  onClick={() => openAuthFlow(authPrompt.authUrl)}
6920
6985
  >
6921
- Create account
6986
+ {t("plansPage.loadError.createAccount")}
6922
6987
  </Button>
6923
6988
  </div>
6924
6989
  </div>
@@ -6938,7 +7003,7 @@ function PlanShareControl({
6938
7003
  onClick={() => copyPublishedUrl(effectivePublishedUrl)}
6939
7004
  >
6940
7005
  <IconCopy className="size-3.5" />
6941
- Copy
7006
+ {t("plansPage.loggedOut.copy")}
6942
7007
  </Button>
6943
7008
  <Button
6944
7009
  type="button"
@@ -6950,12 +7015,12 @@ function PlanShareControl({
6950
7015
  {publishPlan.isPending ? (
6951
7016
  <>
6952
7017
  <IconLoader2 className="size-3.5 animate-spin" />
6953
- Updating
7018
+ {t("plansPage.share.updating")}
6954
7019
  </>
6955
7020
  ) : (
6956
7021
  <>
6957
7022
  <IconRefresh className="size-3.5" />
6958
- Update link
7023
+ {t("plansPage.share.updateLink")}
6959
7024
  </>
6960
7025
  )}
6961
7026
  </Button>
@@ -6966,7 +7031,7 @@ function PlanShareControl({
6966
7031
  rel="noreferrer"
6967
7032
  >
6968
7033
  <IconExternalLink className="size-3.5" />
6969
- Open hosted plan
7034
+ {t("plansPage.share.openHostedPlan")}
6970
7035
  </a>
6971
7036
  </Button>
6972
7037
  </div>
@@ -6981,12 +7046,12 @@ function PlanShareControl({
6981
7046
  {publishPlan.isPending ? (
6982
7047
  <>
6983
7048
  <IconLoader2 className="size-4 animate-spin" />
6984
- Creating link
7049
+ {t("plansPage.share.creatingLink")}
6985
7050
  </>
6986
7051
  ) : (
6987
7052
  <>
6988
7053
  <IconLink className="size-4" />
6989
- Create shareable link
7054
+ {t("plansPage.share.createShareableLink")}
6990
7055
  </>
6991
7056
  )}
6992
7057
  </Button>
@@ -6997,17 +7062,19 @@ function PlanShareControl({
6997
7062
  }
6998
7063
 
6999
7064
  function PlanSkeleton({ isRecap = false }: { isRecap?: boolean }) {
7065
+ const t = useT();
7066
+ const loadingLabel = isRecap
7067
+ ? t("plansPage.skeleton.loadingRecap")
7068
+ : t("plansPage.skeleton.loadingPlan");
7000
7069
  // Recaps are document-only review surfaces that almost never use the top
7001
7070
  // canvas, so skip the canvas placeholder for them while keeping it for plans.
7002
7071
  return (
7003
7072
  <div
7004
7073
  className="plan-content-surface h-full min-h-0 overflow-auto bg-plan-document text-plan-text"
7005
7074
  role="status"
7006
- aria-label={isRecap ? "Loading recap" : "Loading plan"}
7075
+ aria-label={loadingLabel}
7007
7076
  >
7008
- <span className="sr-only">
7009
- {isRecap ? "Loading recap" : "Loading plan"}
7010
- </span>
7077
+ <span className="sr-only">{loadingLabel}</span>
7011
7078
  {!isRecap && <PlanCanvasSkeleton />}
7012
7079
  <PlanDocumentSkeleton />
7013
7080
  </div>
@@ -7211,6 +7278,7 @@ function ReviewMarkupToolbar({
7211
7278
  mode: CanvasMarkupMode;
7212
7279
  onModeChange: (mode: CanvasMarkupMode) => void;
7213
7280
  }) {
7281
+ const t = useT();
7214
7282
  const value = mode === "comment" ? "comment" : "";
7215
7283
  const setValue = (next: string) => {
7216
7284
  onModeChange(next === "comment" ? "comment" : "none");
@@ -7223,20 +7291,26 @@ function ReviewMarkupToolbar({
7223
7291
  variant="default"
7224
7292
  size="sm"
7225
7293
  className="pointer-events-auto gap-0.5 rounded-md border border-border/60 bg-background/55 p-0.5"
7226
- aria-label="Review markup tools"
7294
+ aria-label={t("plansPage.reader.reviewMarkupTools")}
7227
7295
  >
7228
7296
  <Tooltip>
7229
7297
  <TooltipTrigger asChild>
7230
7298
  <ToggleGroupItem
7231
7299
  value="comment"
7232
7300
  className="size-7 px-0"
7233
- aria-label={mode === "comment" ? "Stop commenting" : "Comment"}
7301
+ aria-label={
7302
+ mode === "comment"
7303
+ ? t("plansPage.reader.stopCommenting")
7304
+ : t("plansPage.comments.comment")
7305
+ }
7234
7306
  >
7235
7307
  <IconMessageCircle className="size-4" />
7236
7308
  </ToggleGroupItem>
7237
7309
  </TooltipTrigger>
7238
7310
  <TooltipContent>
7239
- {mode === "comment" ? "Stop commenting" : "Pin a comment"}
7311
+ {mode === "comment"
7312
+ ? t("plansPage.reader.stopCommenting")
7313
+ : t("plansPage.reader.pinComment")}
7240
7314
  </TooltipContent>
7241
7315
  </Tooltip>
7242
7316
  </ToggleGroup>
@@ -7252,10 +7326,11 @@ function LocalPlanLoadError({
7252
7326
  slug: string;
7253
7327
  onRetry: () => void;
7254
7328
  }) {
7329
+ const t = useT();
7255
7330
  const message =
7256
7331
  error instanceof Error && error.message
7257
7332
  ? error.message.replace(/^Action [\w-]+ failed:\s*/, "")
7258
- : `The local plan folder "${slug}" could not be read.`;
7333
+ : t("plansPage.localPlanLoadError.message", { slug });
7259
7334
 
7260
7335
  return (
7261
7336
  <div className="flex min-h-0 flex-1 items-center justify-center px-6 py-12">
@@ -7266,7 +7341,7 @@ function LocalPlanLoadError({
7266
7341
  </div>
7267
7342
  <div>
7268
7343
  <h1 className="text-lg font-semibold tracking-tight">
7269
- Local plan not found
7344
+ {t("plansPage.localPlanLoadError.title")}
7270
7345
  </h1>
7271
7346
  <p className="mt-1 text-sm text-muted-foreground">{message}</p>
7272
7347
  </div>
@@ -7274,12 +7349,12 @@ function LocalPlanLoadError({
7274
7349
  <div className="mt-5 flex flex-wrap gap-2">
7275
7350
  <Button type="button" variant="outline" onClick={onRetry}>
7276
7351
  <IconRefresh className="me-2 size-4" />
7277
- Retry
7352
+ {t("plansPage.loadError.retry")}
7278
7353
  </Button>
7279
7354
  <Button asChild type="button" variant="ghost">
7280
7355
  <Link to="/plans">
7281
7356
  <IconArrowLeft className="me-2 size-4 rtl:-scale-x-100" />
7282
- Plans
7357
+ {t("plansPage.overview.title")}
7283
7358
  </Link>
7284
7359
  </Button>
7285
7360
  </div>
@@ -7310,6 +7385,7 @@ function PlanLoadError({
7310
7385
  /** The signed-in identity for THIS origin, or null when anonymous. */
7311
7386
  viewerEmail?: string | null;
7312
7387
  }) {
7388
+ const t = useT();
7313
7389
  const [emailOpen, setEmailOpen] = useState(false);
7314
7390
  const [emailMode, setEmailMode] = useState<"sign-in" | "create">("sign-in");
7315
7391
  const [email, setEmail] = useState("");
@@ -7322,7 +7398,7 @@ function PlanLoadError({
7322
7398
  const message =
7323
7399
  error instanceof Error && error.message
7324
7400
  ? error.message.replace(/^Action [\w-]+ failed:\s*/, "")
7325
- : "This plan could not be loaded from the current session.";
7401
+ : t("plansPage.loadError.genericMessage");
7326
7402
  const status =
7327
7403
  error && typeof error === "object" && "status" in error
7328
7404
  ? (error as { status?: number }).status
@@ -7340,11 +7416,11 @@ function PlanLoadError({
7340
7416
  const orgName = accessStatus?.orgName?.trim() || null;
7341
7417
  const orgAccessBody =
7342
7418
  orgName && accessStatus?.visibility === "org"
7343
- ? `This plan belongs to ${orgName}. You need to be a member of ${orgName} to view it.`
7419
+ ? t("plansPage.loadError.orgBody", { orgName })
7344
7420
  : null;
7345
7421
  const orgAccessTitle =
7346
7422
  orgName && accessStatus?.visibility === "org"
7347
- ? `Join ${orgName} to view this plan`
7423
+ ? t("plansPage.loadError.orgTitle", { orgName })
7348
7424
  : null;
7349
7425
 
7350
7426
  const returnPath = () =>
@@ -7380,7 +7456,10 @@ function PlanLoadError({
7380
7456
  );
7381
7457
  if (!registerRes.ok) {
7382
7458
  throw new Error(
7383
- await readAuthError(registerRes, "Could not create account."),
7459
+ await readAuthError(
7460
+ registerRes,
7461
+ t("plansPage.loadError.createAccountFailed"),
7462
+ ),
7384
7463
  );
7385
7464
  }
7386
7465
  }
@@ -7394,7 +7473,10 @@ function PlanLoadError({
7394
7473
  );
7395
7474
  if (!loginRes.ok) {
7396
7475
  throw new Error(
7397
- await readAuthError(loginRes, "Could not sign in with email."),
7476
+ await readAuthError(
7477
+ loginRes,
7478
+ t("plansPage.loadError.emailSignInFailed"),
7479
+ ),
7398
7480
  );
7399
7481
  }
7400
7482
  window.location.assign(returnPath());
@@ -7402,11 +7484,9 @@ function PlanLoadError({
7402
7484
  const next =
7403
7485
  authError instanceof Error
7404
7486
  ? authError.message
7405
- : "Could not sign in with email.";
7487
+ : t("plansPage.loadError.emailSignInFailed");
7406
7488
  if (/not verified|verification/i.test(next)) {
7407
- setEmailAuthNotice(
7408
- "Check your email to verify the account, then reopen this link.",
7409
- );
7489
+ setEmailAuthNotice(t("plansPage.loadError.verifyEmail"));
7410
7490
  } else {
7411
7491
  setEmailAuthError(next);
7412
7492
  }
@@ -7425,22 +7505,22 @@ function PlanLoadError({
7425
7505
  };
7426
7506
 
7427
7507
  const title = planMissing
7428
- ? "Plan not found"
7508
+ ? t("plansPage.loadError.notFoundTitle")
7429
7509
  : showAccessHelp
7430
7510
  ? signedIn
7431
- ? (orgAccessTitle ?? "Request access to this plan")
7432
- : "Sign in to view this plan"
7433
- : "Plan did not load";
7511
+ ? (orgAccessTitle ?? t("plansPage.loadError.requestAccessTitle"))
7512
+ : t("plansPage.loadError.signInTitle")
7513
+ : t("plansPage.loadError.didNotLoadTitle");
7434
7514
  const body = planMissing
7435
- ? "This plan does not exist, or it belongs to another organization and you need access."
7515
+ ? t("plansPage.loadError.notFoundBody")
7436
7516
  : showAccessHelp
7437
7517
  ? orgAccessBody
7438
7518
  ? orgAccessBody
7439
7519
  : signedIn
7440
7520
  ? planExists
7441
- ? "This plan exists, but this account does not have access to view it."
7442
- : "This plan may belong to another organization, or this account may not have access."
7443
- : "This plan is private. Sign in with an account that has access."
7521
+ ? t("plansPage.loadError.noAccessBody")
7522
+ : t("plansPage.loadError.maybeOtherOrgBody")
7523
+ : t("plansPage.loadError.privateBody")
7444
7524
  : message;
7445
7525
 
7446
7526
  return (
@@ -7461,7 +7541,7 @@ function PlanLoadError({
7461
7541
  <div className="mt-3 flex items-center gap-2 rounded-md border border-border bg-muted/35 px-3 py-2 text-sm">
7462
7542
  <IconAt className="size-4 shrink-0 text-muted-foreground" />
7463
7543
  <span className="min-w-0 truncate text-muted-foreground">
7464
- Signed in as{" "}
7544
+ {t("plansPage.loadError.signedInAs")}{" "}
7465
7545
  <span className="font-medium text-foreground">
7466
7546
  {signedInEmail}
7467
7547
  </span>
@@ -7470,14 +7550,12 @@ function PlanLoadError({
7470
7550
  ) : null}
7471
7551
  {accessRequestSent ? (
7472
7552
  <div className="mt-3 rounded-md border border-emerald-500/25 bg-emerald-500/10 px-3 py-2 text-sm text-emerald-700 dark:text-emerald-300">
7473
- Access request sent. You will be able to open this link once an
7474
- owner grants access.
7553
+ {t("plansPage.loadError.accessRequestSent")}
7475
7554
  </div>
7476
7555
  ) : null}
7477
7556
  {!showAccessHelp && !planMissing ? (
7478
7557
  <p className="mt-2 text-xs leading-5 text-muted-foreground">
7479
- Retry the load, or sign in with another account if this is a
7480
- private plan link.
7558
+ {t("plansPage.loadError.retryHelp")}
7481
7559
  </p>
7482
7560
  ) : null}
7483
7561
  </div>
@@ -7507,7 +7585,7 @@ function PlanLoadError({
7507
7585
  ) : (
7508
7586
  <GoogleLogoIcon className="size-[18px]" />
7509
7587
  )}
7510
- Continue with Google
7588
+ {t("plansPage.loadError.continueWithGoogle")}
7511
7589
  </Button>
7512
7590
  )}
7513
7591
  {signedIn ? (
@@ -7519,7 +7597,7 @@ function PlanLoadError({
7519
7597
  disabled={googlePending}
7520
7598
  >
7521
7599
  <IconLogin2 className="size-4" />
7522
- Switch account
7600
+ {t("plansPage.loadError.switchAccount")}
7523
7601
  </Button>
7524
7602
  </div>
7525
7603
  ) : null}
@@ -7532,7 +7610,7 @@ function PlanLoadError({
7532
7610
  >
7533
7611
  <span className="inline-flex items-center gap-2">
7534
7612
  <IconMail className="size-4" />
7535
- Sign in with email
7613
+ {t("plansPage.loadError.signInWithEmail")}
7536
7614
  </span>
7537
7615
  <IconChevronDown
7538
7616
  className={cn(
@@ -7548,7 +7626,9 @@ function PlanLoadError({
7548
7626
  onSubmit={submitEmailAuth}
7549
7627
  >
7550
7628
  <div className="space-y-1.5">
7551
- <Label htmlFor="plan-access-email">Email</Label>
7629
+ <Label htmlFor="plan-access-email">
7630
+ {t("plansPage.loadError.email")}
7631
+ </Label>
7552
7632
  <Input
7553
7633
  id="plan-access-email"
7554
7634
  type="email"
@@ -7559,7 +7639,9 @@ function PlanLoadError({
7559
7639
  />
7560
7640
  </div>
7561
7641
  <div className="space-y-1.5">
7562
- <Label htmlFor="plan-access-password">Password</Label>
7642
+ <Label htmlFor="plan-access-password">
7643
+ {t("plansPage.loadError.password")}
7644
+ </Label>
7563
7645
  <Input
7564
7646
  id="plan-access-password"
7565
7647
  type="password"
@@ -7592,8 +7674,8 @@ function PlanLoadError({
7592
7674
  <IconLock className="size-4" />
7593
7675
  )}
7594
7676
  {emailMode === "create"
7595
- ? "Create account"
7596
- : "Sign in"}
7677
+ ? t("plansPage.loadError.createAccount")
7678
+ : t("plansPage.loadError.signIn")}
7597
7679
  </Button>
7598
7680
  <Button
7599
7681
  type="button"
@@ -7607,8 +7689,8 @@ function PlanLoadError({
7607
7689
  }}
7608
7690
  >
7609
7691
  {emailMode === "create"
7610
- ? "I have an account"
7611
- : "Create account"}
7692
+ ? t("plansPage.loadError.haveAccount")
7693
+ : t("plansPage.loadError.createAccount")}
7612
7694
  </Button>
7613
7695
  </div>
7614
7696
  </form>
@@ -7619,7 +7701,7 @@ function PlanLoadError({
7619
7701
  <div className="flex flex-wrap gap-2">
7620
7702
  <Button type="button" variant="outline" onClick={onSignIn}>
7621
7703
  <IconExternalLink className="size-4" />
7622
- Sign in
7704
+ {t("plansPage.loadError.signIn")}
7623
7705
  </Button>
7624
7706
  </div>
7625
7707
  )}
@@ -7634,7 +7716,7 @@ function PlanLoadError({
7634
7716
  className="mt-3 gap-1.5 text-muted-foreground hover:text-foreground"
7635
7717
  >
7636
7718
  <IconRefresh className="size-3.5" />
7637
- Retry
7719
+ {t("plansPage.loadError.retry")}
7638
7720
  </Button>
7639
7721
  </div>
7640
7722
  );
@@ -7653,6 +7735,7 @@ function SignedInPlanAccessActions({
7653
7735
  requestAccessPending?: boolean;
7654
7736
  accessRequestSent?: boolean;
7655
7737
  }) {
7738
+ const t = useT();
7656
7739
  const { data: org } = useOrg();
7657
7740
  const acceptInvitation = useAcceptInvitation();
7658
7741
  const joinByDomain = useJoinByDomain();
@@ -7668,7 +7751,9 @@ function SignedInPlanAccessActions({
7668
7751
 
7669
7752
  const onSuccess = () => {
7670
7753
  toast.success(
7671
- `Joined ${orgAccessPrompt.organizationName}. Opening plan…`,
7754
+ t("plansPage.loadError.joinedOrg", {
7755
+ orgName: orgAccessPrompt.organizationName,
7756
+ }),
7672
7757
  );
7673
7758
  onAccessResolved();
7674
7759
  };
@@ -7688,18 +7773,33 @@ function SignedInPlanAccessActions({
7688
7773
  const label = orgAccessPrompt
7689
7774
  ? orgAccessPending
7690
7775
  ? orgAccessPrompt.kind === "invitation"
7691
- ? "Accepting invite"
7692
- : "Joining organization"
7693
- : orgAccessPrompt.buttonLabel
7776
+ ? t("plansPage.loadError.acceptingInvite")
7777
+ : t("plansPage.loadError.joiningOrg")
7778
+ : orgAccessPrompt.kind === "invitation"
7779
+ ? t("plansPage.loadError.acceptInvite")
7780
+ : t("plansPage.loadError.joinOrg", {
7781
+ orgName: orgAccessPrompt.organizationName,
7782
+ })
7694
7783
  : accessRequestSent
7695
- ? "Request sent"
7696
- : "Request access";
7784
+ ? t("plansPage.loadError.requestSent")
7785
+ : t("plansPage.loadError.requestAccess");
7697
7786
 
7698
7787
  return (
7699
7788
  <>
7700
7789
  {orgAccessPrompt ? (
7701
7790
  <div className="rounded-md border border-border bg-muted/35 px-3 py-2 text-sm leading-5 text-muted-foreground">
7702
- {orgAccessPrompt.message}
7791
+ {orgAccessPrompt.kind === "invitation"
7792
+ ? t("plansPage.loadError.inviteMessage", {
7793
+ orgName: orgAccessPrompt.organizationName,
7794
+ })
7795
+ : orgAccessPrompt.domain
7796
+ ? t("plansPage.loadError.domainMessage", {
7797
+ domain: orgAccessPrompt.domain,
7798
+ orgName: orgAccessPrompt.organizationName,
7799
+ })
7800
+ : t("plansPage.loadError.joinMessage", {
7801
+ orgName: orgAccessPrompt.organizationName,
7802
+ })}
7703
7803
  </div>
7704
7804
  ) : null}
7705
7805
  <Button type="button" onClick={handleOrgAccess} disabled={disabled}>
@@ -7726,25 +7826,16 @@ const PLAN_SKILL_INSTALL_COMMAND =
7726
7826
 
7727
7827
  type PlanSkillDemo = {
7728
7828
  command: string;
7729
- label: string;
7730
- description: string;
7731
- videoAriaLabel: string;
7732
7829
  videoUrl?: string;
7733
7830
  };
7734
7831
 
7735
7832
  const PLAN_SKILL_DEMOS: PlanSkillDemo[] = [
7736
7833
  {
7737
7834
  command: "/visual-plan",
7738
- label: "Visual Plan",
7739
- description: "Review the implementation shape before code changes land.",
7740
- videoAriaLabel: "Visual Plan skill demo video",
7741
7835
  videoUrl: import.meta.env.VITE_VISUAL_PLAN_SKILL_DEMO_VIDEO_URL,
7742
7836
  },
7743
7837
  {
7744
7838
  command: "/visual-recap",
7745
- label: "Visual Recap",
7746
- description: "Turn a PR or diff into a shareable review recap.",
7747
- videoAriaLabel: "Visual Recap skill demo video",
7748
7839
  videoUrl: import.meta.env.VITE_VISUAL_RECAP_SKILL_DEMO_VIDEO_URL,
7749
7840
  },
7750
7841
  ];
@@ -7756,6 +7847,7 @@ function EmptyPlan({
7756
7847
  onCreate: () => void;
7757
7848
  canCreate: boolean;
7758
7849
  }) {
7850
+ const t = useT();
7759
7851
  if (!canCreate) {
7760
7852
  return <LoggedOutEmptyPlan />;
7761
7853
  }
@@ -7767,22 +7859,21 @@ function EmptyPlan({
7767
7859
  <IconClipboardText className="size-5 text-muted-foreground" />
7768
7860
  </div>
7769
7861
  <h2 className="mt-4 text-xl font-semibold tracking-tight">
7770
- Start with a visual plan
7862
+ {t("plansPage.empty.title")}
7771
7863
  </h2>
7772
7864
  <p className="mt-2 text-sm leading-6 text-muted-foreground">
7773
- Create a polished plan with editable document blocks, diagrams,
7774
- wireframes, and comments before implementation starts.
7865
+ {t("plansPage.empty.description")}
7775
7866
  </p>
7776
7867
  <Button className="mt-5" onClick={onCreate}>
7777
7868
  <IconPlus className="size-4" />
7778
- New Plan
7869
+ {t("plansPage.empty.newPlan")}
7779
7870
  </Button>
7780
7871
  <p className="mt-3 text-xs text-muted-foreground/70">
7781
- Or install the skill and use{" "}
7872
+ {t("plansPage.empty.installPrefix")}{" "}
7782
7873
  <code className="rounded bg-muted/60 px-1 py-0.5 font-mono text-[11px]">
7783
7874
  /visual-plan
7784
7875
  </code>{" "}
7785
- from your coding agent:
7876
+ {t("plansPage.empty.installSuffix")}
7786
7877
  <br />
7787
7878
  <code className="mt-1 inline-block rounded bg-muted/60 px-1 py-0.5 font-mono text-[11px]">
7788
7879
  {PLAN_SKILL_INSTALL_COMMAND}
@@ -7794,6 +7885,7 @@ function EmptyPlan({
7794
7885
  }
7795
7886
 
7796
7887
  function PlanSkillDemoVideo({ demo }: { demo: PlanSkillDemo }) {
7888
+ const t = useT();
7797
7889
  const [isLoaded, setIsLoaded] = useState(false);
7798
7890
  if (!demo.videoUrl) return null;
7799
7891
 
@@ -7811,9 +7903,11 @@ function PlanSkillDemoVideo({ demo }: { demo: PlanSkillDemo }) {
7811
7903
  <article className="flex min-w-0 flex-col overflow-hidden rounded-lg border border-border bg-card text-left">
7812
7904
  <div className="flex items-start justify-between gap-3 p-3">
7813
7905
  <div className="min-w-0">
7814
- <p className="text-sm font-medium text-foreground">{demo.label}</p>
7906
+ <p className="text-sm font-medium text-foreground">
7907
+ {t(`plansPage.skillDemos.${demo.command.slice(1)}.label`)}
7908
+ </p>
7815
7909
  <p className="mt-1 min-h-10 text-xs leading-5 text-muted-foreground">
7816
- {demo.description}
7910
+ {t(`plansPage.skillDemos.${demo.command.slice(1)}.description`)}
7817
7911
  </p>
7818
7912
  </div>
7819
7913
  <code className="shrink-0 rounded bg-muted/70 px-1.5 py-1 font-mono text-[11px] text-muted-foreground">
@@ -7823,7 +7917,9 @@ function PlanSkillDemoVideo({ demo }: { demo: PlanSkillDemo }) {
7823
7917
  <div className="relative aspect-[1189/1080] overflow-hidden bg-muted">
7824
7918
  <video
7825
7919
  src={demo.videoUrl}
7826
- aria-label={demo.videoAriaLabel}
7920
+ aria-label={t(
7921
+ `plansPage.skillDemos.${demo.command.slice(1)}.videoAriaLabel`,
7922
+ )}
7827
7923
  autoPlay
7828
7924
  muted
7829
7925
  loop
@@ -7858,6 +7954,7 @@ function PlanSkillDemoVideo({ demo }: { demo: PlanSkillDemo }) {
7858
7954
  }
7859
7955
 
7860
7956
  function LoggedOutEmptyPlan() {
7957
+ const t = useT();
7861
7958
  const [installCommandCopied, setInstallCommandCopied] = useState(false);
7862
7959
  const copyResetTimeoutRef = useRef<number | null>(null);
7863
7960
 
@@ -7873,7 +7970,7 @@ function LoggedOutEmptyPlan() {
7873
7970
  try {
7874
7971
  await navigator.clipboard.writeText(PLAN_SKILL_INSTALL_COMMAND);
7875
7972
  setInstallCommandCopied(true);
7876
- toast.success("Install command copied");
7973
+ toast.success(t("plansPage.loggedOut.installCopied"));
7877
7974
  if (copyResetTimeoutRef.current) {
7878
7975
  window.clearTimeout(copyResetTimeoutRef.current);
7879
7976
  }
@@ -7881,7 +7978,7 @@ function LoggedOutEmptyPlan() {
7881
7978
  setInstallCommandCopied(false);
7882
7979
  }, 2200);
7883
7980
  } catch {
7884
- toast.error("Could not copy install command");
7981
+ toast.error(t("plansPage.loggedOut.installCopyFailed"));
7885
7982
  }
7886
7983
  }, []);
7887
7984
 
@@ -7889,11 +7986,10 @@ function LoggedOutEmptyPlan() {
7889
7986
  <div className="flex min-h-full items-center justify-center overflow-auto p-4 sm:p-8">
7890
7987
  <div className="flex w-full max-w-4xl flex-col items-center gap-3 py-8 text-center">
7891
7988
  <h2 className="text-2xl font-semibold tracking-tight">
7892
- Start with /visual-plan
7989
+ {t("plansPage.loggedOut.title")}
7893
7990
  </h2>
7894
7991
  <p className="max-w-md text-sm leading-6 text-muted-foreground">
7895
- Install the Plan skills in your coding agent, then use the slash
7896
- command to create your first review plan.
7992
+ {t("plansPage.loggedOut.description")}
7897
7993
  </p>
7898
7994
  <div className="mt-1 flex w-full max-w-xl items-center gap-2 rounded-md bg-muted/40 p-1.5 text-left">
7899
7995
  <code className="min-w-0 flex-1 overflow-x-auto px-2 py-1 font-mono text-xs leading-5 text-foreground">
@@ -7907,8 +8003,8 @@ function LoggedOutEmptyPlan() {
7907
8003
  className="h-8 min-w-20 shrink-0 gap-1.5 px-2 text-xs text-muted-foreground hover:text-foreground"
7908
8004
  aria-label={
7909
8005
  installCommandCopied
7910
- ? "Install command copied"
7911
- : "Copy install command"
8006
+ ? t("plansPage.loggedOut.installCopied")
8007
+ : t("plansPage.loggedOut.copyInstallCommand")
7912
8008
  }
7913
8009
  >
7914
8010
  {installCommandCopied ? (
@@ -7916,7 +8012,9 @@ function LoggedOutEmptyPlan() {
7916
8012
  ) : (
7917
8013
  <IconCopy className="size-3.5" />
7918
8014
  )}
7919
- {installCommandCopied ? "Copied" : "Copy"}
8015
+ {installCommandCopied
8016
+ ? t("plansPage.loggedOut.copied")
8017
+ : t("plansPage.loggedOut.copy")}
7920
8018
  </Button>
7921
8019
  </div>
7922
8020
  <div className="grid w-full gap-3 pt-2 sm:grid-cols-2">
@@ -7932,7 +8030,7 @@ function LoggedOutEmptyPlan() {
7932
8030
  >
7933
8031
  <a href={PLAN_DOCS_URL} target="_blank" rel="noreferrer">
7934
8032
  <IconExternalLink className="size-4" />
7935
- View the docs
8033
+ {t("plansPage.loggedOut.viewDocs")}
7936
8034
  </a>
7937
8035
  </Button>
7938
8036
  </div>
@@ -7963,6 +8061,7 @@ function PlansOverview({
7963
8061
  onRestore: (plan: DeletePlanTarget) => void;
7964
8062
  onSignIn?: () => void;
7965
8063
  }) {
8064
+ const t = useT();
7966
8065
  const [filter, setFilter] = useState<OverviewFilter>("all");
7967
8066
  const [search, setSearch] = useState("");
7968
8067
  const [author, setAuthor] = useState<string>("all");
@@ -8036,15 +8135,19 @@ function PlansOverview({
8036
8135
  <div className="flex items-center justify-between gap-3">
8037
8136
  <div className="min-w-0">
8038
8137
  <h1 className="truncate text-xl font-semibold tracking-tight">
8039
- Plans
8138
+ {t("plansPage.overview.title")}
8040
8139
  </h1>
8041
8140
  <p className="text-sm text-muted-foreground">
8042
- {totalVisible} document{totalVisible === 1 ? "" : "s"}
8141
+ {t("plansPage.overview.documentCount", {
8142
+ count: totalVisible,
8143
+ })}
8043
8144
  </p>
8044
8145
  </div>
8045
8146
  <Button type="button" onClick={onCreate}>
8046
8147
  <IconPlus className="size-4" />
8047
- {canCreate ? "New Plan" : "Sign in to create"}
8148
+ {canCreate
8149
+ ? t("plansPage.overview.newPlan")
8150
+ : t("plansPage.overview.signInToCreate")}
8048
8151
  </Button>
8049
8152
  </div>
8050
8153
 
@@ -8054,12 +8157,20 @@ function PlansOverview({
8054
8157
  onValueChange={(v) => setFilter(v as OverviewFilter)}
8055
8158
  >
8056
8159
  <TabsList>
8057
- <TabsTrigger value="all">All</TabsTrigger>
8058
- <TabsTrigger value="plans">Plans</TabsTrigger>
8059
- <TabsTrigger value="recaps">Recaps</TabsTrigger>
8060
- <TabsTrigger value="archived">Archived</TabsTrigger>
8160
+ <TabsTrigger value="all">
8161
+ {t("plansPage.overview.tabs.all")}
8162
+ </TabsTrigger>
8163
+ <TabsTrigger value="plans">
8164
+ {t("plansPage.overview.tabs.plans")}
8165
+ </TabsTrigger>
8166
+ <TabsTrigger value="recaps">
8167
+ {t("plansPage.overview.tabs.recaps")}
8168
+ </TabsTrigger>
8169
+ <TabsTrigger value="archived">
8170
+ {t("plansPage.overview.tabs.archived")}
8171
+ </TabsTrigger>
8061
8172
  <TabsTrigger value="deleted">
8062
- Deleted
8173
+ {t("plansPage.overview.tabs.deleted")}
8063
8174
  {deletedPlans.length > 0 && (
8064
8175
  <span className="ml-1 text-[11px] text-muted-foreground">
8065
8176
  {deletedPlans.length}
@@ -8072,11 +8183,19 @@ function PlansOverview({
8072
8183
  {authorEmails.length > 1 && (
8073
8184
  <Select value={author} onValueChange={setAuthor}>
8074
8185
  <SelectTrigger className="h-9 w-[170px] text-sm">
8075
- <SelectValue placeholder="Created by" />
8186
+ <SelectValue
8187
+ placeholder={t("plansPage.overview.createdBy")}
8188
+ />
8076
8189
  </SelectTrigger>
8077
8190
  <SelectContent>
8078
- <SelectItem value="all">All authors</SelectItem>
8079
- {hasMine && <SelectItem value="me">Me</SelectItem>}
8191
+ <SelectItem value="all">
8192
+ {t("plansPage.overview.allAuthors")}
8193
+ </SelectItem>
8194
+ {hasMine && (
8195
+ <SelectItem value="me">
8196
+ {t("plansPage.overview.me")}
8197
+ </SelectItem>
8198
+ )}
8080
8199
  {authorEmails
8081
8200
  .filter(
8082
8201
  (email) =>
@@ -8098,7 +8217,7 @@ function PlansOverview({
8098
8217
  <IconSearch className="pointer-events-none absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" />
8099
8218
  <Input
8100
8219
  type="search"
8101
- placeholder="Search plans…"
8220
+ placeholder={t("plansPage.overview.searchPlaceholder")}
8102
8221
  value={search}
8103
8222
  onChange={(e) => setSearch(e.target.value)}
8104
8223
  className="h-9 pl-8 text-sm"
@@ -8109,12 +8228,12 @@ function PlansOverview({
8109
8228
  {visiblePlans.length === 0 ? (
8110
8229
  <div className="py-12 text-center text-sm text-muted-foreground">
8111
8230
  {search.trim()
8112
- ? "No plans match."
8231
+ ? t("plansPage.overview.empty.noMatch")
8113
8232
  : filter === "archived"
8114
- ? "No archived plans."
8233
+ ? t("plansPage.overview.empty.noArchived")
8115
8234
  : filter === "deleted"
8116
- ? "No deleted plans."
8117
- : "No plans here yet."}
8235
+ ? t("plansPage.overview.empty.noDeleted")
8236
+ : t("plansPage.overview.empty.noPlans")}
8118
8237
  </div>
8119
8238
  ) : (
8120
8239
  <div className="grid gap-3 md:grid-cols-2">
@@ -8133,7 +8252,7 @@ function PlansOverview({
8133
8252
  variant="outline"
8134
8253
  className="shrink-0 text-[10px]"
8135
8254
  >
8136
- Recap
8255
+ {t("plansPage.overview.recapBadge")}
8137
8256
  </Badge>
8138
8257
  )}
8139
8258
  {isDeleted && (
@@ -8141,7 +8260,7 @@ function PlansOverview({
8141
8260
  variant="outline"
8142
8261
  className="shrink-0 border-destructive/30 text-[10px] text-destructive"
8143
8262
  >
8144
- Deleted
8263
+ {t("plansPage.overview.deletedBadge")}
8145
8264
  </Badge>
8146
8265
  )}
8147
8266
  </div>
@@ -8157,7 +8276,11 @@ function PlansOverview({
8157
8276
  </div>
8158
8277
  <div className="mt-4 flex items-center gap-2 text-xs text-muted-foreground">
8159
8278
  {isDeleted ? (
8160
- <span>Deleted {shortDate(plan.deletedAt ?? "")}</span>
8279
+ <span>
8280
+ {t("plansPage.overview.deletedAt", {
8281
+ date: shortDate(plan.deletedAt ?? ""),
8282
+ })}
8283
+ </span>
8161
8284
  ) : ENABLE_PLAN_STATUS_FEATURE ? (
8162
8285
  <>
8163
8286
  <span>{statusLabel(plan.status)}</span>
@@ -8227,7 +8350,8 @@ function PlansOverview({
8227
8350
  <button
8228
8351
  type="button"
8229
8352
  className="flex size-7 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
8230
- aria-label="Plan actions"
8353
+ data-plan-actions-trigger
8354
+ aria-label={t("plansPage.overview.planActions")}
8231
8355
  >
8232
8356
  <IconDots className="size-4" />
8233
8357
  </button>
@@ -8243,7 +8367,7 @@ function PlansOverview({
8243
8367
  disabled={!plan.canDelete}
8244
8368
  >
8245
8369
  <IconRestore className="size-4" />
8246
- Restore
8370
+ {t("plansPage.overview.restore")}
8247
8371
  </DropdownMenuItem>
8248
8372
  <DropdownMenuItem
8249
8373
  onClick={(e) => {
@@ -8254,7 +8378,7 @@ function PlansOverview({
8254
8378
  className="text-destructive focus:text-destructive"
8255
8379
  >
8256
8380
  <IconTrash className="size-4" />
8257
- Delete permanently
8381
+ {t("plansPage.overview.deletePermanently")}
8258
8382
  </DropdownMenuItem>
8259
8383
  </>
8260
8384
  ) : (
@@ -8267,7 +8391,7 @@ function PlansOverview({
8267
8391
  }}
8268
8392
  >
8269
8393
  <IconArchiveOff className="size-4" />
8270
- Unarchive
8394
+ {t("plansPage.overview.unarchive")}
8271
8395
  </DropdownMenuItem>
8272
8396
  ) : (
8273
8397
  <DropdownMenuItem
@@ -8277,7 +8401,7 @@ function PlansOverview({
8277
8401
  }}
8278
8402
  >
8279
8403
  <IconArchive className="size-4" />
8280
- Archive
8404
+ {t("plansPage.overview.archive")}
8281
8405
  </DropdownMenuItem>
8282
8406
  )}
8283
8407
  {plan.canDelete && (
@@ -8291,7 +8415,7 @@ function PlansOverview({
8291
8415
  className="text-destructive focus:text-destructive"
8292
8416
  >
8293
8417
  <IconTrash className="size-4" />
8294
- Delete...
8418
+ {t("plansPage.overview.delete")}
8295
8419
  </DropdownMenuItem>
8296
8420
  </>
8297
8421
  )}
@@ -8350,11 +8474,18 @@ function PlansOverviewSkeleton() {
8350
8474
  );
8351
8475
  }
8352
8476
 
8353
- function planVersionSurfaceLabel(version: PlanVersionSummary) {
8354
- if (version.hasPrototype) return "Prototype";
8355
- if (version.hasCanvas) return "Canvas";
8356
- if (version.blockCount > 0) return `${version.blockCount} blocks`;
8357
- return `${version.sectionCount} sections`;
8477
+ function planVersionSurfaceLabel(
8478
+ version: PlanVersionSummary,
8479
+ t: ReturnType<typeof useT>,
8480
+ ) {
8481
+ if (version.hasPrototype) return t("plansPage.history.surface.prototype");
8482
+ if (version.hasCanvas) return t("plansPage.history.surface.canvas");
8483
+ if (version.blockCount > 0) {
8484
+ return t("plansPage.history.surface.blocks", { count: version.blockCount });
8485
+ }
8486
+ return t("plansPage.history.surface.sections", {
8487
+ count: version.sectionCount,
8488
+ });
8358
8489
  }
8359
8490
 
8360
8491
  function PlanHistorySheet({
@@ -8368,6 +8499,7 @@ function PlanHistorySheet({
8368
8499
  onOpenChange: (open: boolean) => void;
8369
8500
  canRestore: boolean;
8370
8501
  }) {
8502
+ const t = useT();
8371
8503
  const [selectedVersionId, setSelectedVersionId] = useState<string | null>(
8372
8504
  null,
8373
8505
  );
@@ -8413,14 +8545,14 @@ function PlanHistorySheet({
8413
8545
  if (!versionId) return;
8414
8546
  try {
8415
8547
  await restoreVersion.mutateAsync({ planId, versionId });
8416
- toast.success("Plan version restored.");
8548
+ toast.success(t("plansPage.history.restoreSuccess"));
8417
8549
  setRestoreCandidateId(null);
8418
8550
  close(false);
8419
8551
  } catch (error) {
8420
8552
  toast.error(
8421
8553
  error instanceof Error
8422
8554
  ? error.message.replace(/^Action [\w-]+ failed:\s*/, "")
8423
- : "Failed to restore plan version.",
8555
+ : t("plansPage.history.restoreFailed"),
8424
8556
  );
8425
8557
  }
8426
8558
  };
@@ -8440,17 +8572,17 @@ function PlanHistorySheet({
8440
8572
  className="inline-flex min-w-0 items-center gap-1.5 text-muted-foreground transition-colors hover:text-foreground"
8441
8573
  >
8442
8574
  <IconArrowLeft className="size-4" />
8443
- <span>Back to history</span>
8575
+ <span>{t("plansPage.history.back")}</span>
8444
8576
  </button>
8445
8577
  ) : (
8446
8578
  <>
8447
8579
  <IconHistory className="size-4 text-primary" />
8448
- <span>Plan history</span>
8580
+ <span>{t("plansPage.history.title")}</span>
8449
8581
  </>
8450
8582
  )}
8451
8583
  </SheetTitle>
8452
8584
  <SheetDescription className="sr-only">
8453
- Browse saved plan versions and restore a previous snapshot.
8585
+ {t("plansPage.history.description")}
8454
8586
  </SheetDescription>
8455
8587
  </SheetHeader>
8456
8588
  <Separator className="mt-3" />
@@ -8466,12 +8598,13 @@ function PlanHistorySheet({
8466
8598
  ) : (
8467
8599
  <>
8468
8600
  <p className="truncate text-sm font-medium">
8469
- {selectedVersion?.title || "Untitled plan"}
8601
+ {selectedVersion?.title ||
8602
+ t("plansPage.history.untitled")}
8470
8603
  </p>
8471
8604
  <p className="mt-0.5 text-[11px] text-muted-foreground">
8472
8605
  {selectedVersion
8473
- ? `${shortDate(selectedVersion.createdAt)} · ${planVersionSurfaceLabel(selectedVersion)}`
8474
- : "Snapshot unavailable"}
8606
+ ? `${shortDate(selectedVersion.createdAt)} · ${planVersionSurfaceLabel(selectedVersion, t)}`
8607
+ : t("plansPage.history.snapshotUnavailable")}
8475
8608
  </p>
8476
8609
  </>
8477
8610
  )}
@@ -8495,7 +8628,7 @@ function PlanHistorySheet({
8495
8628
  />
8496
8629
  ) : selectedVersion?.html ? (
8497
8630
  <iframe
8498
- title="Plan version preview"
8631
+ title={t("plansPage.history.previewTitle")}
8499
8632
  srcDoc={selectedVersion.html}
8500
8633
  // Stored plan HTML is agent-authored and may carry
8501
8634
  // prompt-injected markup. Match the main document iframe
@@ -8508,7 +8641,7 @@ function PlanHistorySheet({
8508
8641
  />
8509
8642
  ) : (
8510
8643
  <div className="px-6 py-14 text-center text-sm text-muted-foreground">
8511
- This snapshot has no previewable content.
8644
+ {t("plansPage.history.noPreview")}
8512
8645
  </div>
8513
8646
  )}
8514
8647
  </ScrollArea>
@@ -8528,10 +8661,10 @@ function PlanHistorySheet({
8528
8661
  ) : (
8529
8662
  <IconRestore className="size-4" />
8530
8663
  )}
8531
- Restore this version
8664
+ {t("plansPage.history.restoreThisVersion")}
8532
8665
  </Button>
8533
8666
  <p className="mt-2 text-center text-[11px] text-muted-foreground">
8534
- Your current version is saved to history first.
8667
+ {t("plansPage.history.savedFirst")}
8535
8668
  </p>
8536
8669
  </div>
8537
8670
  ) : null}
@@ -8597,10 +8730,11 @@ function PlanHistorySheet({
8597
8730
  <div className="min-w-0 flex-1">
8598
8731
  <div className="flex min-w-0 items-center gap-2 pr-7">
8599
8732
  <p className="truncate text-sm font-medium">
8600
- {version.title || "Untitled plan"}
8733
+ {version.title ||
8734
+ t("plansPage.history.untitled")}
8601
8735
  </p>
8602
8736
  <span className="shrink-0 text-[10px] text-muted-foreground">
8603
- {planVersionSurfaceLabel(version)}
8737
+ {planVersionSurfaceLabel(version, t)}
8604
8738
  </span>
8605
8739
  </div>
8606
8740
  <p className="mt-0.5 text-[11px] text-muted-foreground">
@@ -8626,7 +8760,9 @@ function PlanHistorySheet({
8626
8760
  <button
8627
8761
  type="button"
8628
8762
  className="flex size-7 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
8629
- aria-label="Version actions"
8763
+ aria-label={t(
8764
+ "plansPage.history.versionActions",
8765
+ )}
8630
8766
  >
8631
8767
  <IconDots className="size-4" />
8632
8768
  </button>
@@ -8639,7 +8775,7 @@ function PlanHistorySheet({
8639
8775
  }}
8640
8776
  >
8641
8777
  <IconRestore className="size-4" />
8642
- Restore this version
8778
+ {t("plansPage.history.restoreThisVersion")}
8643
8779
  </DropdownMenuItem>
8644
8780
  </DropdownMenuContent>
8645
8781
  </DropdownMenu>
@@ -8652,9 +8788,11 @@ function PlanHistorySheet({
8652
8788
  ) : (
8653
8789
  <div className="px-6 py-14 text-center">
8654
8790
  <IconHistory className="mx-auto mb-3 size-6 text-muted-foreground/60" />
8655
- <p className="text-sm font-medium">No saved versions yet</p>
8791
+ <p className="text-sm font-medium">
8792
+ {t("plansPage.history.noVersions")}
8793
+ </p>
8656
8794
  <p className="mt-1 text-xs leading-5 text-muted-foreground">
8657
- Versions are saved automatically before future plan edits.
8795
+ {t("plansPage.history.noVersionsDescription")}
8658
8796
  </p>
8659
8797
  </div>
8660
8798
  )}
@@ -8670,19 +8808,20 @@ function PlanHistorySheet({
8670
8808
  >
8671
8809
  <AlertDialogContent>
8672
8810
  <AlertDialogHeader>
8673
- <AlertDialogTitle>Restore this version?</AlertDialogTitle>
8811
+ <AlertDialogTitle>
8812
+ {t("plansPage.history.restoreConfirmTitle")}
8813
+ </AlertDialogTitle>
8674
8814
  <AlertDialogDescription>
8675
- This replaces the current plan with the snapshot
8676
- {restoreCandidate
8677
- ? ` from ${shortDate(restoreCandidate.createdAt)}`
8678
- : ""}
8679
- . Your current version is saved to history first, so you can undo
8680
- this.
8815
+ {t("plansPage.history.restoreConfirmDescription", {
8816
+ date: restoreCandidate
8817
+ ? shortDate(restoreCandidate.createdAt)
8818
+ : "",
8819
+ })}
8681
8820
  </AlertDialogDescription>
8682
8821
  </AlertDialogHeader>
8683
8822
  <AlertDialogFooter>
8684
8823
  <AlertDialogCancel disabled={restoreVersion.isPending}>
8685
- Cancel
8824
+ {t("plansPage.common.cancel")}
8686
8825
  </AlertDialogCancel>
8687
8826
  <AlertDialogAction
8688
8827
  onClick={(event) => {
@@ -8691,7 +8830,9 @@ function PlanHistorySheet({
8691
8830
  }}
8692
8831
  disabled={restoreVersion.isPending}
8693
8832
  >
8694
- {restoreVersion.isPending ? "Restoring…" : "Restore"}
8833
+ {restoreVersion.isPending
8834
+ ? t("plansPage.history.restoring")
8835
+ : t("plansPage.history.restore")}
8695
8836
  </AlertDialogAction>
8696
8837
  </AlertDialogFooter>
8697
8838
  </AlertDialogContent>
@@ -8702,19 +8843,13 @@ function PlanHistorySheet({
8702
8843
 
8703
8844
  const CREATE_PLAN_PROMPTS = [
8704
8845
  {
8705
- label: "Checkout flow",
8706
- prompt:
8707
- "Plan a checkout review flow with desktop and mobile wireframes, key empty/loading/error states, comment prompts, and implementation notes.",
8846
+ id: "checkout",
8708
8847
  },
8709
8848
  {
8710
- label: "Settings redesign",
8711
- prompt:
8712
- "Create a UI flow plan for a settings redesign, including navigation states, risky interactions, review annotations, and code handoff notes.",
8849
+ id: "settings",
8713
8850
  },
8714
8851
  {
8715
- label: "Imported plan",
8716
- prompt:
8717
- "# Implementation plan\n\nPaste the existing Codex or Claude Code plan here and turn it into a visual review document.",
8852
+ id: "imported",
8718
8853
  },
8719
8854
  ] as const;
8720
8855
 
@@ -8746,8 +8881,6 @@ function isProbablyImportedPlan(prompt: string) {
8746
8881
 
8747
8882
  function assessPlanPrompt(prompt: string): {
8748
8883
  kind: AutoPlanKind;
8749
- label: string;
8750
- reason: string;
8751
8884
  } {
8752
8885
  let score = 0;
8753
8886
  let ambiguitySignals = 0;
@@ -8799,34 +8932,38 @@ function assessPlanPrompt(prompt: string): {
8799
8932
  if (uiDirection) {
8800
8933
  return {
8801
8934
  kind: "ui",
8802
- label: "UI flow",
8803
- reason:
8804
- "Auto detected UI states or flows; the agent will make a wireframe-first plan.",
8805
8935
  };
8806
8936
  }
8807
8937
 
8808
8938
  return {
8809
8939
  kind: "visual",
8810
- label: "General visual",
8811
- reason:
8812
- "Auto will ask the agent for a rich technical plan with diagrams and implementation detail.",
8813
8940
  };
8814
8941
  }
8815
8942
 
8816
- function sourceOptionLabel(source: PlanSource) {
8817
- return (
8818
- SOURCE_OPTIONS.find((option) => option.value === source)?.label ?? source
8819
- );
8943
+ function sourceOptionDisplayLabel(
8944
+ source: PlanSource,
8945
+ t: ReturnType<typeof useT>,
8946
+ ) {
8947
+ return t(`plansPage.create.sourceOptions.${source}`);
8948
+ }
8949
+
8950
+ function planKindDisplayLabel(
8951
+ kind: CreatePlanKind,
8952
+ t: ReturnType<typeof useT>,
8953
+ ) {
8954
+ return t(`plansPage.create.kindOptions.${kind}.label`);
8820
8955
  }
8821
8956
 
8822
8957
  function buildCreatePlanAgentMessage({
8823
8958
  prompt,
8824
8959
  source,
8825
8960
  planKind,
8961
+ t,
8826
8962
  }: {
8827
8963
  prompt: string;
8828
8964
  source: PlanSource;
8829
8965
  planKind: CreatePlanKind;
8966
+ t: ReturnType<typeof useT>;
8830
8967
  }) {
8831
8968
  const imported = isProbablyImportedPlan(prompt);
8832
8969
  const resolvedPlanKind =
@@ -8843,7 +8980,7 @@ function buildCreatePlanAgentMessage({
8843
8980
  "Create an Agent-Native Plan from this request.",
8844
8981
  "",
8845
8982
  routing,
8846
- `Source/provenance: ${sourceOptionLabel(source)}.`,
8983
+ `Source/provenance: ${sourceOptionDisplayLabel(source, t)}.`,
8847
8984
  "",
8848
8985
  "Use the Plan actions after you have enough substance. Generate the wireframes, diagrams, implementation map, review prompts, and concrete file/symbol notes yourself. Do not use placeholder file names, generic scaffold text, or browser-generated fallback sections as the final plan content.",
8849
8986
  "After creating the plan, open the plan link for review.",
@@ -8864,6 +9001,7 @@ function CreatePlanDialog({
8864
9001
  canCreate: boolean;
8865
9002
  onRequireSignIn: () => void;
8866
9003
  }) {
9004
+ const t = useT();
8867
9005
  const [source, setSource] = useState<PlanSource>("codex");
8868
9006
  const [planKind, setPlanKind] = useState<CreatePlanKind>("auto");
8869
9007
  const [advancedOpen, setAdvancedOpen] = useState(false);
@@ -8892,33 +9030,30 @@ function CreatePlanDialog({
8892
9030
  return;
8893
9031
  }
8894
9032
  if (agentMissing) {
8895
- toast.message(
8896
- "Connect the agent to run — add an API key or use Builder.",
8897
- );
9033
+ toast.message(t("plansPage.create.agentMissing"));
8898
9034
  return;
8899
9035
  }
8900
9036
  const prompt = value.trim();
8901
9037
  if (!prompt) {
8902
- toast.message("Describe the plan first.");
9038
+ toast.message(t("plansPage.create.describeFirst"));
8903
9039
  return;
8904
9040
  }
8905
9041
  sendToAgentChat({
8906
9042
  type: "content",
8907
9043
  submit: true,
8908
- message: buildCreatePlanAgentMessage({ prompt, source, planKind }),
9044
+ message: buildCreatePlanAgentMessage({ prompt, source, planKind, t }),
8909
9045
  });
8910
9046
  onOpenChange(false);
8911
- toast.success("Sent to the Plan agent");
9047
+ toast.success(t("plansPage.create.sent"));
8912
9048
  };
8913
9049
 
8914
9050
  return (
8915
9051
  <Dialog open={open} onOpenChange={onOpenChange}>
8916
9052
  <DialogContent className="sm:max-w-[680px]">
8917
9053
  <DialogHeader>
8918
- <DialogTitle>Ask agent to create plan</DialogTitle>
9054
+ <DialogTitle>{t("plansPage.create.title")}</DialogTitle>
8919
9055
  <DialogDescription>
8920
- Describe the plan you want, or paste an existing Codex/Claude plan.
8921
- The Plan agent will generate the wireframes and review structure.
9056
+ {t("plansPage.create.description")}
8922
9057
  </DialogDescription>
8923
9058
  </DialogHeader>
8924
9059
  <div className="grid gap-3">
@@ -8938,7 +9073,7 @@ function CreatePlanDialog({
8938
9073
  disabled={composerLocked}
8939
9074
  attachmentsEnabled={false}
8940
9075
  showModelSelector={false}
8941
- placeholder="Ask the agent for a UI flow, implementation map, review notes..."
9076
+ placeholder={t("plansPage.create.placeholder")}
8942
9077
  draftScope="plans:create-plan"
8943
9078
  initialText={promptSeed}
8944
9079
  initialTextKey={promptSeedKey}
@@ -8949,19 +9084,22 @@ function CreatePlanDialog({
8949
9084
  <div className="flex flex-wrap gap-2">
8950
9085
  {CREATE_PLAN_PROMPTS.map((preset) => (
8951
9086
  <Button
8952
- key={preset.label}
9087
+ key={preset.id}
8953
9088
  type="button"
8954
9089
  variant="outline"
8955
9090
  size="sm"
8956
9091
  className="h-8 rounded-full border-border/80 px-3 text-xs font-medium text-muted-foreground hover:text-foreground"
8957
9092
  disabled={composerLocked}
8958
9093
  onClick={() => {
8959
- setPromptSeed(preset.prompt);
9094
+ const presetPrompt = t(
9095
+ `plansPage.create.presetPrompts.${preset.id}`,
9096
+ );
9097
+ setPromptSeed(presetPrompt);
8960
9098
  setPromptSeedKey((key) => key + 1);
8961
- setPromptText(preset.prompt);
9099
+ setPromptText(presetPrompt);
8962
9100
  }}
8963
9101
  >
8964
- {preset.label}
9102
+ {t(`plansPage.create.presets.${preset.id}`)}
8965
9103
  </Button>
8966
9104
  ))}
8967
9105
  </div>
@@ -8971,19 +9109,26 @@ function CreatePlanDialog({
8971
9109
  type="button"
8972
9110
  className="flex w-full items-center justify-between gap-3 rounded-lg px-1 py-1.5 text-left text-xs text-muted-foreground transition-colors hover:text-foreground"
8973
9111
  >
8974
- <span className="font-medium">Advanced</span>
9112
+ <span className="font-medium">
9113
+ {t("plansPage.create.advanced")}
9114
+ </span>
8975
9115
  <span className="flex min-w-0 items-center gap-2">
8976
9116
  <span className="truncate">
8977
- {sourceOptionLabel(source)} ·{" "}
9117
+ {sourceOptionDisplayLabel(source, t)} ·{" "}
8978
9118
  {planKind === "auto"
8979
9119
  ? promptAssessment
8980
- ? `Auto: ${promptAssessment.label}`
8981
- : "Auto"
9120
+ ? t("plansPage.create.autoWithLabel", {
9121
+ label: planKindDisplayLabel(
9122
+ promptAssessment.kind,
9123
+ t,
9124
+ ),
9125
+ })
9126
+ : planKindDisplayLabel("auto", t)
8982
9127
  : planKind === "ui"
8983
- ? "UI flow"
9128
+ ? planKindDisplayLabel("ui", t)
8984
9129
  : planKind === "questions"
8985
- ? "Visual questions"
8986
- : "General visual"}
9130
+ ? planKindDisplayLabel("questions", t)
9131
+ : planKindDisplayLabel("visual", t)}
8987
9132
  </span>
8988
9133
  <IconChevronDown
8989
9134
  className={cn(
@@ -8998,30 +9143,30 @@ function CreatePlanDialog({
8998
9143
  <div className="grid gap-3 rounded-lg border border-border/70 bg-muted/20 p-3 sm:grid-cols-2">
8999
9144
  <div className="grid gap-1.5">
9000
9145
  <span className="text-xs font-medium text-foreground">
9001
- Source
9146
+ {t("plansPage.create.source")}
9002
9147
  </span>
9003
9148
  <Select
9004
9149
  value={source}
9005
9150
  onValueChange={(value) => setSource(value as PlanSource)}
9006
9151
  >
9007
- <SelectTrigger aria-label="Plan source">
9152
+ <SelectTrigger aria-label={t("plansPage.create.source")}>
9008
9153
  <SelectValue />
9009
9154
  </SelectTrigger>
9010
9155
  <SelectContent>
9011
9156
  {SOURCE_OPTIONS.map((option) => (
9012
9157
  <SelectItem key={option.value} value={option.value}>
9013
- {option.label}
9158
+ {sourceOptionDisplayLabel(option.value, t)}
9014
9159
  </SelectItem>
9015
9160
  ))}
9016
9161
  </SelectContent>
9017
9162
  </Select>
9018
9163
  <p className="text-xs leading-5 text-muted-foreground">
9019
- Provenance only. It helps explain where the plan started.
9164
+ {t("plansPage.create.sourceHelp")}
9020
9165
  </p>
9021
9166
  </div>
9022
9167
  <div className="grid gap-1.5">
9023
9168
  <span className="text-xs font-medium text-foreground">
9024
- Agent planning style
9169
+ {t("plansPage.create.planningStyle")}
9025
9170
  </span>
9026
9171
  <Select
9027
9172
  value={planKind}
@@ -9037,28 +9182,30 @@ function CreatePlanDialog({
9037
9182
  )
9038
9183
  }
9039
9184
  >
9040
- <SelectTrigger aria-label="Fresh prompt style">
9185
+ <SelectTrigger
9186
+ aria-label={t("plansPage.create.planningStyle")}
9187
+ >
9041
9188
  <SelectValue />
9042
9189
  </SelectTrigger>
9043
9190
  <SelectContent>
9044
9191
  <SelectItem value="auto">
9045
- Auto - choose the right planning path
9192
+ {t("plansPage.create.kindOptions.auto.description")}
9046
9193
  </SelectItem>
9047
9194
  <SelectItem value="ui">
9048
- UI flow - wireframes and states
9195
+ {t("plansPage.create.kindOptions.ui.description")}
9049
9196
  </SelectItem>
9050
9197
  <SelectItem value="questions">
9051
- Visual questions - explicit intake
9198
+ {t(
9199
+ "plansPage.create.kindOptions.questions.description",
9200
+ )}
9052
9201
  </SelectItem>
9053
9202
  <SelectItem value="visual">
9054
- General visual - diagrams and notes
9203
+ {t("plansPage.create.kindOptions.visual.description")}
9055
9204
  </SelectItem>
9056
9205
  </SelectContent>
9057
9206
  </Select>
9058
9207
  <p className="text-xs leading-5 text-muted-foreground">
9059
- Pasted plans are detected and sent to the agent with import
9060
- context. Auto keeps the normal plan flow; choose Visual
9061
- questions when you want intake first.
9208
+ {t("plansPage.create.planningHelp")}
9062
9209
  </p>
9063
9210
  </div>
9064
9211
  </div>
@@ -9066,13 +9213,12 @@ function CreatePlanDialog({
9066
9213
  </Collapsible>
9067
9214
  {promptAssessment && planKind === "auto" ? (
9068
9215
  <p className="px-1 text-xs text-muted-foreground">
9069
- {promptAssessment.reason}
9216
+ {t(`plansPage.create.assessment.${promptAssessment.kind}`)}
9070
9217
  </p>
9071
9218
  ) : null}
9072
9219
  {promptText.trim() && isProbablyImportedPlan(promptText) ? (
9073
9220
  <p className="px-1 text-xs text-muted-foreground">
9074
- Looks like an existing plan. The agent will preserve it and add
9075
- visual review structure.
9221
+ {t("plansPage.create.importDetected")}
9076
9222
  </p>
9077
9223
  ) : null}
9078
9224
  </div>
@@ -9208,6 +9354,7 @@ function CommentMentionEditor({
9208
9354
  onChange: (draft: Pick<CommentDraft, "message" | "mentions">) => void;
9209
9355
  onSubmitShortcut?: () => void;
9210
9356
  }) {
9357
+ const t = useT();
9211
9358
  const editorRef = useRef<HTMLDivElement>(null);
9212
9359
  const activeQueryRef = useRef<ReturnType<typeof mentionQueryAtCaret>>(null);
9213
9360
  const onChangeRef = useRef(onChange);
@@ -9336,16 +9483,16 @@ function CommentMentionEditor({
9336
9483
  {suggestionsOpen && (
9337
9484
  <div
9338
9485
  role="listbox"
9339
- aria-label="Mention organization member"
9486
+ aria-label={t("plansPage.comments.mentionMember")}
9340
9487
  className="absolute bottom-full left-0 z-50 mb-2 w-[min(320px,calc(100vw-48px))] overflow-hidden rounded-xl border border-border/80 bg-background/98 p-1 shadow-2xl backdrop-blur-xl"
9341
9488
  >
9342
9489
  {isLoading && members.length === 0 ? (
9343
9490
  <div className="px-3 py-2 text-xs text-muted-foreground">
9344
- Searching people...
9491
+ {t("plansPage.comments.searchingPeople")}
9345
9492
  </div>
9346
9493
  ) : members.length === 0 ? (
9347
9494
  <div className="px-3 py-2 text-xs text-muted-foreground">
9348
- No matching organization members.
9495
+ {t("plansPage.comments.noMatchingMembers")}
9349
9496
  </div>
9350
9497
  ) : (
9351
9498
  members.map((member, index) => {
@@ -9392,6 +9539,7 @@ function ResolutionTargetToggle({
9392
9539
  value: PlanCommentResolutionTarget;
9393
9540
  onChange: (value: PlanCommentResolutionTarget) => void;
9394
9541
  }) {
9542
+ const t = useT();
9395
9543
  return (
9396
9544
  <ToggleGroup
9397
9545
  type="single"
@@ -9402,15 +9550,15 @@ function ResolutionTargetToggle({
9402
9550
  variant="default"
9403
9551
  size="sm"
9404
9552
  className="w-fit gap-0.5 rounded-md border border-border/70 bg-muted/35 p-0.5"
9405
- aria-label="Expected resolver"
9553
+ aria-label={t("plansPage.comments.expectedResolver")}
9406
9554
  >
9407
9555
  <ToggleGroupItem value="agent" className="h-7 gap-1.5 px-2 text-xs">
9408
9556
  <IconSend className="size-3.5" />
9409
- Agent
9557
+ {t("plansPage.comments.agent")}
9410
9558
  </ToggleGroupItem>
9411
9559
  <ToggleGroupItem value="human" className="h-7 gap-1.5 px-2 text-xs">
9412
9560
  <IconMessageCircle className="size-3.5" />
9413
- Human
9561
+ {t("plansPage.comments.human")}
9414
9562
  </ToggleGroupItem>
9415
9563
  </ToggleGroup>
9416
9564
  );
@@ -9429,6 +9577,7 @@ function InlineCommentPopover({
9429
9577
  onSubmit: (draft: CommentDraft) => Promise<void>;
9430
9578
  lockToAgent?: boolean;
9431
9579
  }) {
9580
+ const t = useT();
9432
9581
  const initialMessageRef = useRef(initialDraft.message);
9433
9582
  const [draft, setDraft] = useState<CommentDraft>(initialDraft);
9434
9583
  const [resolverTouched, setResolverTouched] = useState(false);
@@ -9475,7 +9624,7 @@ function InlineCommentPopover({
9475
9624
  {lockToAgent ? (
9476
9625
  <span className="flex items-center gap-1.5 px-1 text-xs font-medium text-muted-foreground">
9477
9626
  <IconSend className="size-3.5" />
9478
- To agent
9627
+ {t("plansPage.comments.toAgent")}
9479
9628
  </span>
9480
9629
  ) : (
9481
9630
  <ResolutionTargetToggle
@@ -9493,7 +9642,7 @@ function InlineCommentPopover({
9493
9642
  variant="ghost"
9494
9643
  className="size-8 shrink-0 text-muted-foreground/70 hover:bg-muted hover:text-foreground"
9495
9644
  onClick={onCancel}
9496
- aria-label="Cancel comment"
9645
+ aria-label={t("plansPage.comments.cancelComment")}
9497
9646
  >
9498
9647
  <IconX className="size-3.5" />
9499
9648
  </Button>
@@ -9502,7 +9651,7 @@ function InlineCommentPopover({
9502
9651
  <div className="flex items-start gap-2">
9503
9652
  <CommentMentionEditor
9504
9653
  initialMessage={initialMessageRef.current}
9505
- placeholder="Add a comment..."
9654
+ placeholder={t("plansPage.comments.addPlaceholder")}
9506
9655
  autoFocus
9507
9656
  onSubmitShortcut={submit}
9508
9657
  onChange={(value) =>
@@ -9524,12 +9673,14 @@ function InlineCommentPopover({
9524
9673
  onClick={submit}
9525
9674
  disabled={!canSubmit}
9526
9675
  >
9527
- {isSubmitting ? "Saving" : "Save"}
9676
+ {isSubmitting
9677
+ ? t("plansPage.comments.saving")
9678
+ : t("plansPage.common.save")}
9528
9679
  </Button>
9529
9680
  </div>
9530
9681
  {submitError && (
9531
9682
  <p className="mt-2 px-1 text-xs text-destructive">
9532
- Couldn't save. Try again.
9683
+ {t("plansPage.comments.saveFailed")}
9533
9684
  </p>
9534
9685
  )}
9535
9686
  </div>
@@ -9545,6 +9696,7 @@ function GuestCommentCta({
9545
9696
  onSignIn: () => void;
9546
9697
  onCancel: () => void;
9547
9698
  }) {
9699
+ const t = useT();
9548
9700
  return (
9549
9701
  <div
9550
9702
  data-plan-interactive
@@ -9552,23 +9704,25 @@ function GuestCommentCta({
9552
9704
  style={{ left: position.left, top: position.top, width: position.width }}
9553
9705
  >
9554
9706
  <div className="mb-3 flex items-center justify-between gap-2">
9555
- <p className="text-sm font-semibold">Sign in to comment</p>
9707
+ <p className="text-sm font-semibold">
9708
+ {t("plansPage.comments.signInTitle")}
9709
+ </p>
9556
9710
  <Button
9557
9711
  type="button"
9558
9712
  size="icon"
9559
9713
  variant="ghost"
9560
9714
  className="size-8 shrink-0 text-muted-foreground/70 hover:bg-muted hover:text-foreground"
9561
9715
  onClick={onCancel}
9562
- aria-label="Cancel"
9716
+ aria-label={t("plansPage.common.cancel")}
9563
9717
  >
9564
9718
  <IconX className="size-3.5" />
9565
9719
  </Button>
9566
9720
  </div>
9567
9721
  <p className="mb-4 text-sm text-muted-foreground">
9568
- Create a free account to leave comments on this plan.
9722
+ {t("plansPage.comments.signInDescription")}
9569
9723
  </p>
9570
9724
  <Button type="button" size="sm" className="w-full" onClick={onSignIn}>
9571
- Sign in
9725
+ {t("plansPage.loadError.signIn")}
9572
9726
  </Button>
9573
9727
  </div>
9574
9728
  );
@@ -9635,7 +9789,7 @@ function CommentDeleteButton({
9635
9789
  function ReplyComposer({
9636
9790
  author,
9637
9791
  isPending,
9638
- placeholder = "Reply",
9792
+ placeholder,
9639
9793
  onSubmit,
9640
9794
  }: {
9641
9795
  author: CommentAuthorPresentation;
@@ -9643,6 +9797,7 @@ function ReplyComposer({
9643
9797
  placeholder?: string;
9644
9798
  onSubmit: (message: string) => Promise<void>;
9645
9799
  }) {
9800
+ const t = useT();
9646
9801
  const [draft, setDraft] = useState<
9647
9802
  Pick<CommentDraft, "message" | "mentions">
9648
9803
  >({
@@ -9676,7 +9831,9 @@ function ReplyComposer({
9676
9831
  <CommentAvatar author={author} size="md" className="mb-1" />
9677
9832
  <div className="flex min-w-0 flex-1 items-end gap-2 rounded-xl border border-border/80 bg-muted/40 px-3 py-2 focus-within:border-primary/60 focus-within:bg-background">
9678
9833
  <CommentMentionEditor
9679
- placeholder={placeholder}
9834
+ placeholder={
9835
+ placeholder ?? t("plansPage.comments.replyPlaceholder")
9836
+ }
9680
9837
  resetKey={`reply-${resetKey}`}
9681
9838
  className="min-h-10 border-0 bg-transparent px-0 py-2 shadow-none focus-visible:ring-0"
9682
9839
  onChange={setDraft}
@@ -9688,7 +9845,7 @@ function ReplyComposer({
9688
9845
  className="mb-0.5 size-8 shrink-0 rounded-full"
9689
9846
  onClick={() => void submit()}
9690
9847
  disabled={!canSubmit}
9691
- aria-label="Send reply"
9848
+ aria-label={t("plansPage.comments.sendReply")}
9692
9849
  >
9693
9850
  {isSubmitting ? (
9694
9851
  <IconLoader2 className="size-4 animate-spin" />
@@ -9700,7 +9857,7 @@ function ReplyComposer({
9700
9857
  </div>
9701
9858
  {submitError && (
9702
9859
  <p className="ml-11 text-xs text-destructive">
9703
- Couldn't send. Try again.
9860
+ {t("plansPage.comments.sendFailed")}
9704
9861
  </p>
9705
9862
  )}
9706
9863
  </div>
@@ -9738,6 +9895,7 @@ function AnnotationPopover({
9738
9895
  onDeleteComment: (commentId: string) => void;
9739
9896
  onClose?: () => void;
9740
9897
  }) {
9898
+ const t = useT();
9741
9899
  const popoverRef = useRef<HTMLDivElement>(null);
9742
9900
  const [editing, setEditing] = useState(false);
9743
9901
  const [messageDraft, setMessageDraft] = useState<
@@ -9766,6 +9924,7 @@ function AnnotationPopover({
9766
9924
  const annotationComments = [rootComment, ...replies];
9767
9925
  const rootDeleteLabel = deleteCommentLabel(
9768
9926
  commentDescendantCount(annotationComments, rootComment.id),
9927
+ t,
9769
9928
  );
9770
9929
  const canSave =
9771
9930
  canEditRootComment && messageDraft.message.trim().length > 0 && !isPending;
@@ -9824,7 +9983,9 @@ function AnnotationPopover({
9824
9983
  <div className="flex h-12 shrink-0 items-center justify-between gap-3 border-b border-border/70 px-4">
9825
9984
  <div className="flex min-w-0 items-center gap-2">
9826
9985
  <IconMessageCircle className="size-4 text-muted-foreground" />
9827
- <h2 className="truncate text-sm font-semibold">Comment</h2>
9986
+ <h2 className="truncate text-sm font-semibold">
9987
+ {t("plansPage.comments.comment")}
9988
+ </h2>
9828
9989
  {annotation.commentCount > 1 && (
9829
9990
  <Badge variant="secondary" className="h-5 rounded-md px-1.5">
9830
9991
  {annotation.commentCount}
@@ -9834,7 +9995,9 @@ function AnnotationPopover({
9834
9995
  variant="outline"
9835
9996
  className="h-5 rounded-md px-1.5 text-[11px]"
9836
9997
  >
9837
- {resolver === "human" ? "Human review" : "Agent action"}
9998
+ {resolver === "human"
9999
+ ? t("plansPage.comments.humanReview")
10000
+ : t("plansPage.comments.agentAction")}
9838
10001
  </Badge>
9839
10002
  </div>
9840
10003
  <div className="flex shrink-0 items-center gap-1">
@@ -9846,7 +10009,7 @@ function AnnotationPopover({
9846
10009
  size="icon"
9847
10010
  variant="ghost"
9848
10011
  className="size-8 shrink-0"
9849
- aria-label="Comment options"
10012
+ aria-label={t("plansPage.comments.options")}
9850
10013
  >
9851
10014
  <IconDotsVertical className="size-4" />
9852
10015
  </Button>
@@ -9864,7 +10027,9 @@ function AnnotationPopover({
9864
10027
  }
9865
10028
  >
9866
10029
  <IconCircleCheck className="size-4" />
9867
- {isResolved ? "Reopen thread" : "Mark as resolved"}
10030
+ {isResolved
10031
+ ? t("plansPage.comments.reopenThread")
10032
+ : t("plansPage.comments.markResolved")}
9868
10033
  </DropdownMenuItem>
9869
10034
  )}
9870
10035
  {canEditRootComment && (
@@ -9873,7 +10038,7 @@ function AnnotationPopover({
9873
10038
  onClick={() => setEditing(true)}
9874
10039
  >
9875
10040
  <IconPencil className="size-4" />
9876
- Edit first comment
10041
+ {t("plansPage.comments.editFirstComment")}
9877
10042
  </DropdownMenuItem>
9878
10043
  )}
9879
10044
  {canDelete && (
@@ -9902,13 +10067,19 @@ function AnnotationPopover({
9902
10067
  onClick={() =>
9903
10068
  onStatusChange(isResolved ? "open" : "resolved")
9904
10069
  }
9905
- aria-label={isResolved ? "Reopen thread" : "Mark as resolved"}
10070
+ aria-label={
10071
+ isResolved
10072
+ ? t("plansPage.comments.reopenThread")
10073
+ : t("plansPage.comments.markResolved")
10074
+ }
9906
10075
  >
9907
10076
  <IconCircleCheck className="size-4" />
9908
10077
  </Button>
9909
10078
  </TooltipTrigger>
9910
10079
  <TooltipContent>
9911
- {isResolved ? "Reopen thread" : "Mark as resolved"}
10080
+ {isResolved
10081
+ ? t("plansPage.comments.reopenThread")
10082
+ : t("plansPage.comments.markResolved")}
9912
10083
  </TooltipContent>
9913
10084
  </Tooltip>
9914
10085
  )}
@@ -9919,7 +10090,7 @@ function AnnotationPopover({
9919
10090
  variant="ghost"
9920
10091
  className="size-8 shrink-0"
9921
10092
  onClick={onClose}
9922
- aria-label="Close comment"
10093
+ aria-label={t("plansPage.comments.closeComment")}
9923
10094
  >
9924
10095
  <IconX className="size-4" />
9925
10096
  </Button>
@@ -9933,7 +10104,7 @@ function AnnotationPopover({
9933
10104
  <CommentMentionEditor
9934
10105
  initialMessage={annotation.message}
9935
10106
  resetKey={`edit-${annotation.id}-${editing ? "on" : "off"}`}
9936
- placeholder="Edit comment..."
10107
+ placeholder={t("plansPage.comments.editPlaceholder")}
9937
10108
  autoFocus
9938
10109
  className="min-h-24"
9939
10110
  onChange={setMessageDraft}
@@ -9952,7 +10123,7 @@ function AnnotationPopover({
9952
10123
  });
9953
10124
  }}
9954
10125
  >
9955
- Cancel
10126
+ {t("plansPage.common.cancel")}
9956
10127
  </Button>
9957
10128
  <Button
9958
10129
  type="button"
@@ -9960,7 +10131,7 @@ function AnnotationPopover({
9960
10131
  onClick={save}
9961
10132
  disabled={!canSave}
9962
10133
  >
9963
- Save
10134
+ {t("plansPage.common.save")}
9964
10135
  </Button>
9965
10136
  </div>
9966
10137
  </div>
@@ -9970,6 +10141,7 @@ function AnnotationPopover({
9970
10141
  {replies.map((reply) => {
9971
10142
  const replyDeleteLabel = deleteCommentLabel(
9972
10143
  commentDescendantCount(annotationComments, reply.id),
10144
+ t,
9973
10145
  );
9974
10146
  return (
9975
10147
  <CommentThreadMessage
@@ -10033,6 +10205,7 @@ function AnnotationsPanel({
10033
10205
  onDeleteComment: (thread: CommentThread, commentId: string) => void;
10034
10206
  onClose: () => void;
10035
10207
  }) {
10208
+ const t = useT();
10036
10209
  const panelRef = useRef<HTMLElement>(null);
10037
10210
  const [filterTab, setFilterTab] = useState<"open" | "resolved">("open");
10038
10211
 
@@ -10062,7 +10235,7 @@ function AnnotationsPanel({
10062
10235
  onClose();
10063
10236
  // Return focus to the toolbar dots-menu trigger if reachable.
10064
10237
  const trigger = document.querySelector<HTMLElement>(
10065
- '[aria-label="Plan actions"]',
10238
+ "[data-plan-actions-trigger]",
10066
10239
  );
10067
10240
  trigger?.focus();
10068
10241
  };
@@ -10089,7 +10262,9 @@ function AnnotationsPanel({
10089
10262
  <div className="flex h-12 shrink-0 items-center justify-between gap-3 border-b border-border/70 px-4">
10090
10263
  <div className="flex min-w-0 items-center gap-2">
10091
10264
  <IconMessageCircle className="size-4 text-muted-foreground" />
10092
- <h2 className="truncate text-sm font-semibold">Comments</h2>
10265
+ <h2 className="truncate text-sm font-semibold">
10266
+ {t("plansPage.comments.comments")}
10267
+ </h2>
10093
10268
  </div>
10094
10269
  <Button
10095
10270
  type="button"
@@ -10097,7 +10272,7 @@ function AnnotationsPanel({
10097
10272
  variant="ghost"
10098
10273
  className="size-8"
10099
10274
  onClick={onClose}
10100
- aria-label="Close comments"
10275
+ aria-label={t("plansPage.comments.closeComments")}
10101
10276
  >
10102
10277
  <IconX className="size-4" />
10103
10278
  </Button>
@@ -10112,7 +10287,7 @@ function AnnotationsPanel({
10112
10287
  >
10113
10288
  <TabsList className="h-7 gap-0.5 rounded-lg p-0.5">
10114
10289
  <TabsTrigger value="open" className="h-6 gap-1.5 px-2 text-xs">
10115
- Open
10290
+ {t("plansPage.comments.open")}
10116
10291
  {openThreads.length > 0 && (
10117
10292
  <span className="rounded-md bg-muted px-1 text-[10px] font-medium text-muted-foreground">
10118
10293
  {openThreads.length}
@@ -10123,7 +10298,7 @@ function AnnotationsPanel({
10123
10298
  value="resolved"
10124
10299
  className="h-6 gap-1.5 px-2 text-xs"
10125
10300
  >
10126
- Resolved
10301
+ {t("plansPage.comments.resolved")}
10127
10302
  {resolvedThreads.length > 0 && (
10128
10303
  <span className="rounded-md bg-muted px-1 text-[10px] font-medium text-muted-foreground">
10129
10304
  {resolvedThreads.length}
@@ -10139,8 +10314,8 @@ function AnnotationsPanel({
10139
10314
  {visibleThreads.length === 0 ? (
10140
10315
  <p className="rounded-lg border border-dashed border-border p-4 text-sm leading-6 text-muted-foreground">
10141
10316
  {showResolvedComments && filterTab === "resolved"
10142
- ? "No resolved comments."
10143
- : "No open comments. Click Comment, then click to place one."}
10317
+ ? t("plansPage.comments.noResolved")
10318
+ : t("plansPage.comments.noOpen")}
10144
10319
  </p>
10145
10320
  ) : (
10146
10321
  visibleThreads.map((thread) => {
@@ -10148,6 +10323,7 @@ function AnnotationsPanel({
10148
10323
  const canDelete = canDeleteThread(thread);
10149
10324
  const rootDeleteLabel = deleteCommentLabel(
10150
10325
  commentDescendantCount(thread.comments, thread.root.id),
10326
+ t,
10151
10327
  );
10152
10328
  return (
10153
10329
  <article
@@ -10165,8 +10341,8 @@ function AnnotationsPanel({
10165
10341
  {normalizePlanCommentResolutionTarget(
10166
10342
  thread.anchor.resolutionTarget,
10167
10343
  ) === "human"
10168
- ? "Human review"
10169
- : "Agent action"}
10344
+ ? t("plansPage.comments.humanReview")
10345
+ : t("plansPage.comments.agentAction")}
10170
10346
  </span>
10171
10347
  {" · "}
10172
10348
  {formatAnchorForAgent(thread.anchor)}
@@ -10189,8 +10365,8 @@ function AnnotationsPanel({
10189
10365
  }
10190
10366
  aria-label={
10191
10367
  isResolved
10192
- ? "Reopen thread"
10193
- : "Mark as resolved"
10368
+ ? t("plansPage.comments.reopenThread")
10369
+ : t("plansPage.comments.markResolved")
10194
10370
  }
10195
10371
  >
10196
10372
  <IconCircleCheck className="size-4" />
@@ -10198,8 +10374,8 @@ function AnnotationsPanel({
10198
10374
  </TooltipTrigger>
10199
10375
  <TooltipContent>
10200
10376
  {isResolved
10201
- ? "Reopen thread"
10202
- : "Mark as resolved"}
10377
+ ? t("plansPage.comments.reopenThread")
10378
+ : t("plansPage.comments.markResolved")}
10203
10379
  </TooltipContent>
10204
10380
  </Tooltip>
10205
10381
  {canDelete && (
@@ -10248,6 +10424,7 @@ function AnnotationsPanel({
10248
10424
  );
10249
10425
  const commentDeleteLabel = deleteCommentLabel(
10250
10426
  commentDescendantCount(thread.comments, comment.id),
10427
+ t,
10251
10428
  );
10252
10429
  return (
10253
10430
  <CommentThreadMessage
@@ -10295,29 +10472,36 @@ function DeleteCommentDialog({
10295
10472
  onOpenChange: (open: boolean) => void;
10296
10473
  onConfirm: () => void;
10297
10474
  }) {
10475
+ const t = useT();
10298
10476
  return (
10299
10477
  <AlertDialog open={open} onOpenChange={onOpenChange}>
10300
10478
  <AlertDialogContent>
10301
10479
  <AlertDialogHeader>
10302
10480
  <AlertDialogTitle>
10303
- {replyCount > 0 ? "Delete thread?" : "Delete comment?"}
10481
+ {replyCount > 0
10482
+ ? t("plansPage.comments.deleteThreadTitle")
10483
+ : t("plansPage.comments.deleteCommentTitle")}
10304
10484
  </AlertDialogTitle>
10305
10485
  <AlertDialogDescription>
10306
10486
  {replyCount > 0
10307
- ? `This will remove the comment and ${replyCount} ${
10308
- replyCount === 1 ? "reply" : "replies"
10309
- } from the plan.`
10310
- : "This will remove the comment from the plan."}
10487
+ ? t("plansPage.comments.deleteThreadDescription", {
10488
+ count: replyCount,
10489
+ })
10490
+ : t("plansPage.comments.deleteCommentDescription")}
10311
10491
  </AlertDialogDescription>
10312
10492
  </AlertDialogHeader>
10313
10493
  <AlertDialogFooter>
10314
- <AlertDialogCancel disabled={isDeleting}>Cancel</AlertDialogCancel>
10494
+ <AlertDialogCancel disabled={isDeleting}>
10495
+ {t("plansPage.common.cancel")}
10496
+ </AlertDialogCancel>
10315
10497
  <AlertDialogAction
10316
10498
  disabled={isDeleting}
10317
10499
  onClick={onConfirm}
10318
10500
  className="bg-destructive text-destructive-foreground hover:bg-destructive/90"
10319
10501
  >
10320
- {isDeleting ? "Deleting..." : "Delete"}
10502
+ {isDeleting
10503
+ ? t("plansPage.common.deleting")
10504
+ : t("plansPage.common.delete")}
10321
10505
  </AlertDialogAction>
10322
10506
  </AlertDialogFooter>
10323
10507
  </AlertDialogContent>
@@ -10340,6 +10524,7 @@ function DeletePlanDialog({
10340
10524
  onOpenChange: (open: boolean) => void;
10341
10525
  onConfirm: (mode: "soft" | "hard", confirmation?: string) => void;
10342
10526
  }) {
10527
+ const t = useT();
10343
10528
  const [mode, setMode] = useState<"soft" | "hard">("soft");
10344
10529
  const [confirmation, setConfirmation] = useState("");
10345
10530
  const plan = request?.plan ?? null;
@@ -10347,6 +10532,10 @@ function DeletePlanDialog({
10347
10532
  const effectiveMode = hardOnly ? "hard" : mode;
10348
10533
  const phrase = plan ? hardDeletePlanPhrase(plan.id) : "";
10349
10534
  const noun = plan?.kind === "recap" ? "recap" : "plan";
10535
+ const nounLabel =
10536
+ plan?.kind === "recap"
10537
+ ? t("plansPage.nouns.recap")
10538
+ : t("plansPage.nouns.plan");
10350
10539
  const canSubmit =
10351
10540
  Boolean(plan) &&
10352
10541
  !isPending &&
@@ -10364,12 +10553,13 @@ function DeletePlanDialog({
10364
10553
  <DialogHeader>
10365
10554
  <DialogTitle>
10366
10555
  {effectiveMode === "hard"
10367
- ? `Permanently delete this ${noun}?`
10368
- : `Delete this ${noun}?`}
10556
+ ? t("plansPage.deletePlan.hardTitle", { noun: nounLabel })
10557
+ : t("plansPage.deletePlan.softTitle", { noun: nounLabel })}
10369
10558
  </DialogTitle>
10370
10559
  <DialogDescription>
10371
- {plan?.title ?? "This hosted plan"} will no longer be available from
10372
- normal plan views.
10560
+ {t("plansPage.deletePlan.description", {
10561
+ title: plan?.title ?? t("plansPage.deletePlan.fallbackTitle"),
10562
+ })}
10373
10563
  </DialogDescription>
10374
10564
  </DialogHeader>
10375
10565
 
@@ -10388,9 +10578,11 @@ function DeletePlanDialog({
10388
10578
  : "border-border hover:bg-accent/40",
10389
10579
  )}
10390
10580
  >
10391
- <span className="font-medium">Move to Deleted</span>
10581
+ <span className="font-medium">
10582
+ {t("plansPage.deletePlan.moveToDeleted")}
10583
+ </span>
10392
10584
  <span className="mt-1 block text-xs leading-5 text-muted-foreground">
10393
- Hide it now, stop public access, and keep restore available.
10585
+ {t("plansPage.deletePlan.softOptionDescription")}
10394
10586
  </span>
10395
10587
  </button>
10396
10588
  <button
@@ -10404,10 +10596,10 @@ function DeletePlanDialog({
10404
10596
  )}
10405
10597
  >
10406
10598
  <span className="font-medium text-destructive">
10407
- Delete permanently
10599
+ {t("plansPage.deletePlan.deletePermanently")}
10408
10600
  </span>
10409
10601
  <span className="mt-1 block text-xs leading-5 text-muted-foreground">
10410
- Remove hosted rows and references. This cannot be undone.
10602
+ {t("plansPage.deletePlan.hardOptionDescription")}
10411
10603
  </span>
10412
10604
  </button>
10413
10605
  </div>
@@ -10415,9 +10607,7 @@ function DeletePlanDialog({
10415
10607
 
10416
10608
  {effectiveMode === "soft" ? (
10417
10609
  <div className="rounded-lg border border-border bg-muted/30 p-3 text-sm leading-6 text-muted-foreground">
10418
- Soft delete moves the {noun} to the Deleted tab. Direct links,
10419
- public sharing, comments, and agent reads stop working until you
10420
- restore it.
10610
+ {t("plansPage.deletePlan.softDescription", { noun: nounLabel })}
10421
10611
  </div>
10422
10612
  ) : (
10423
10613
  <div className="space-y-3">
@@ -10426,23 +10616,23 @@ function DeletePlanDialog({
10426
10616
  <IconAlertTriangle className="mt-0.5 size-4 shrink-0 text-destructive" />
10427
10617
  <div className="space-y-1 text-sm">
10428
10618
  <p className="font-medium text-destructive">
10429
- Permanent deletion cannot be undone.
10619
+ {t("plansPage.deletePlan.permanentWarning")}
10430
10620
  </p>
10431
10621
  <p className="leading-6 text-muted-foreground">
10432
- This removes the hosted {noun}, comments, shares, activity,
10433
- versions, reports, and Plan SQL asset records. Local files
10434
- and external upload-provider lifecycle rules are separate.
10622
+ {t("plansPage.deletePlan.permanentDescription", {
10623
+ noun: nounLabel,
10624
+ })}
10435
10625
  </p>
10436
10626
  </div>
10437
10627
  </div>
10438
10628
  </div>
10439
10629
  <div className="space-y-2">
10440
10630
  <Label htmlFor="hard-delete-plan-confirmation">
10441
- Type{" "}
10631
+ {t("plansPage.deletePlan.typePrefix")}{" "}
10442
10632
  <code className="rounded bg-muted px-1.5 py-0.5 font-mono text-xs">
10443
10633
  {phrase}
10444
10634
  </code>{" "}
10445
- to confirm
10635
+ {t("plansPage.deletePlan.typeSuffix")}
10446
10636
  </Label>
10447
10637
  <Input
10448
10638
  id="hard-delete-plan-confirmation"
@@ -10462,7 +10652,7 @@ function DeletePlanDialog({
10462
10652
  onClick={() => onOpenChange(false)}
10463
10653
  disabled={isPending}
10464
10654
  >
10465
- Cancel
10655
+ {t("plansPage.common.cancel")}
10466
10656
  </Button>
10467
10657
  <Button
10468
10658
  type="button"
@@ -10476,10 +10666,10 @@ function DeletePlanDialog({
10476
10666
  }
10477
10667
  >
10478
10668
  {isPending
10479
- ? "Deleting..."
10669
+ ? t("plansPage.common.deleting")
10480
10670
  : effectiveMode === "hard"
10481
- ? "Delete permanently"
10482
- : "Move to Deleted"}
10671
+ ? t("plansPage.deletePlan.deletePermanently")
10672
+ : t("plansPage.deletePlan.moveToDeleted")}
10483
10673
  </Button>
10484
10674
  </DialogFooter>
10485
10675
  </DialogContent>
@@ -10520,6 +10710,9 @@ function injectAnnotationRuntime(
10520
10710
  annotateMode: boolean,
10521
10711
  theme: "dark" | "light",
10522
10712
  preferredEditor: PreferredEditor,
10713
+ labels: {
10714
+ closeCodePreview: string;
10715
+ },
10523
10716
  avatarUrls: Record<string, string | null> = {},
10524
10717
  currentUser?: CurrentCommentAuthor | null,
10525
10718
  ) {
@@ -10574,6 +10767,7 @@ function injectAnnotationRuntime(
10574
10767
  );
10575
10768
  },
10576
10769
  );
10770
+ const closeCodePreviewLabel = escapeRuntimeJsString(labels.closeCodePreview);
10577
10771
  const runtime = `<style>
10578
10772
  :root[data-agent-native-theme="light"] {
10579
10773
  color-scheme: light;
@@ -10885,13 +11079,13 @@ function injectAnnotationRuntime(
10885
11079
  return editorIconHtml(normalized) + '<span class="editor-picker-sr">Preferred editor: ' + editorLabel(normalized) + '</span><span class="editor-picker-caret" aria-hidden="true"></span>';
10886
11080
  }
10887
11081
  function editorSelectOptionsHtml() {
10888
- return editorOptions.map(({ value, label }) => '<option value="' + value + '">' + label + '</option>').join("");
11082
+ return editorOptions.map(({ value, label }) => '<option value="' + value + '">' + label + '</option>').join(""); // i18n-ignore generated editor picker markup with stable app labels
10889
11083
  }
10890
11084
  function editorMenuHtml(activeEditor) {
10891
11085
  const active = normalizeEditor(activeEditor);
10892
11086
  return editorOptions.map(({ value, label }) => {
10893
11087
  const selected = value === active;
10894
- return '<button type="button" class="editor-picker-option' + (selected ? " is-active" : "") + '" data-agent-native-editor-option="' + value + '" role="menuitemradio" aria-checked="' + (selected ? "true" : "false") + '">' + editorIconHtml(value) + '<span>' + label + '</span></button>';
11088
+ return '<button type="button" class="editor-picker-option' + (selected ? " is-active" : "") + '" data-agent-native-editor-option="' + value + '" role="menuitemradio" aria-checked="' + (selected ? "true" : "false") + '">' + editorIconHtml(value) + '<span>' + label + '</span></button>'; // i18n-ignore generated editor picker markup with stable app labels
10895
11089
  }).join("");
10896
11090
  }
10897
11091
  function closeEditorMenus(exceptPicker) {
@@ -10944,13 +11138,13 @@ function injectAnnotationRuntime(
10944
11138
  const lineSuffix = location.line ? ":" + location.line + ":" + location.column : "";
10945
11139
  if (normalized === "finder") return "file://" + encodeURI(location.path);
10946
11140
  if (normalized === "xcode") {
10947
- return "xcode://open?url=" + encodeURIComponent("file://" + location.path) + (location.line ? "&line=" + encodeURIComponent(location.line) : "");
11141
+ return "xcode://open?url=" + encodeURIComponent("file://" + location.path) + (location.line ? "&line=" + encodeURIComponent(location.line) : ""); // i18n-ignore stable editor URL scheme
10948
11142
  }
10949
11143
  if (normalized === "terminal") {
10950
- return "terminal://open?path=" + encodeURIComponent(directoryForPath(location.path));
11144
+ return "terminal://open?path=" + encodeURIComponent(directoryForPath(location.path)); // i18n-ignore stable editor URL scheme
10951
11145
  }
10952
11146
  if (normalized === "ghostty") {
10953
- return "ghostty://open?path=" + encodeURIComponent(directoryForPath(location.path));
11147
+ return "ghostty://open?path=" + encodeURIComponent(directoryForPath(location.path)); // i18n-ignore stable editor URL scheme
10954
11148
  }
10955
11149
  return normalized + "://file" + encodeURI(location.path) + lineSuffix;
10956
11150
  }
@@ -11613,7 +11807,7 @@ function injectAnnotationRuntime(
11613
11807
  hideCodePopover();
11614
11808
  const popover = document.createElement("div");
11615
11809
  popover.className = "an-plan-code-popover";
11616
- popover.innerHTML = '<div class="an-plan-code-popover-header"><span class="an-plan-code-popover-title"></span><div class="an-plan-code-popover-actions"></div><button type="button" class="an-plan-code-popover-close" aria-label="Close code preview">×</button></div><div class="an-plan-code-popover-body"></div>';
11810
+ popover.innerHTML = '<div class="an-plan-code-popover-header"><span class="an-plan-code-popover-title"></span><div class="an-plan-code-popover-actions"></div><button type="button" class="an-plan-code-popover-close" aria-label="${closeCodePreviewLabel}">×</button></div><div class="an-plan-code-popover-body"></div>';
11617
11811
  const content = template.content.cloneNode(true);
11618
11812
  const codePreview = content.querySelector?.(".code-preview");
11619
11813
  const oldTitle = content.querySelector?.(".code-preview-title");
@@ -11858,7 +12052,22 @@ function injectAnnotationRuntime(
11858
12052
  return `${html}${runtime}`;
11859
12053
  }
11860
12054
 
11861
- function buildClientPlanHtml(bundle: PlanBundle) {
12055
+ function escapeRuntimeJsString(value: string) {
12056
+ return value
12057
+ .replace(/\\/g, "\\\\")
12058
+ .replace(/'/g, "\\'")
12059
+ .replace(/&/g, "&amp;")
12060
+ .replace(/</g, "\\u003c")
12061
+ .replace(/>/g, "\\u003e")
12062
+ .replace(/"/g, "&quot;");
12063
+ }
12064
+
12065
+ function buildClientPlanHtml(
12066
+ bundle: PlanBundle,
12067
+ labels: {
12068
+ workingPlan: string;
12069
+ },
12070
+ ) {
11862
12071
  const escape = (value: unknown) =>
11863
12072
  String(value ?? "")
11864
12073
  .replace(/&/g, "&amp;")
@@ -11876,7 +12085,7 @@ function buildClientPlanHtml(bundle: PlanBundle) {
11876
12085
  bundle.plan.title,
11877
12086
  )}</title><style>
11878
12087
  :root{color-scheme:dark;--bg:#0a0a0b;--paper:#111113;--line:#28282c;--text:#f2f2f3;--muted:#a4a4aa;--accent:#00B5FF}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;line-height:1.55}main{width:min(1080px,calc(100vw - 48px));margin:0 auto;padding:96px 0 96px}h1{max-width:760px;margin:0;font-size:clamp(36px,5vw,58px);line-height:1.03;letter-spacing:-.04em}.lede{max-width:760px;margin:20px 0 0;color:#d7d7da;font-size:clamp(18px,2vw,23px);line-height:1.45}.meta{display:grid;gap:7px;margin:24px 0 0;padding-left:20px;color:var(--muted);font-size:13px}.meta li::marker{color:var(--accent)}.section{margin-top:70px;padding-top:46px;border-top:1px solid var(--line)}.type{margin:0 0 12px;color:var(--accent);font-size:12px;font-weight:700;letter-spacing:.14em;text-transform:uppercase}.section h2{margin:0;font-size:clamp(26px,4vw,42px);letter-spacing:-.035em}.section p{max-width:760px;color:#d7d7da;font-size:17px}.visual{margin:24px 0;display:grid;grid-template-columns:repeat(3,1fr);gap:10px}.visual i{display:block;height:120px;border:1px solid rgba(0,181,255,.25);border-radius:14px;background:rgba(0,181,255,.12)}@media(max-width:760px){.visual{grid-template-columns:1fr}main{width:min(100vw - 24px,980px);padding-top:72px}}
11879
- </style></head><body><main><p class="type">Working plan</p><h1>${escape(
12088
+ </style></head><body><main><p class="type">${escape(labels.workingPlan)}</p><h1>${escape(
11880
12089
  bundle.plan.title,
11881
12090
  )}</h1><p class="lede">${escape(
11882
12091
  bundle.plan.brief,