@agent-native/core 0.79.11 → 0.79.15

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 (289) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +25 -0
  3. package/corpus/core/docs/content/locales/zh-TW/a2a-protocol.md +68 -68
  4. package/corpus/core/docs/content/locales/zh-TW/actions.md +82 -82
  5. package/corpus/core/docs/content/locales/zh-TW/agent-mentions.md +22 -22
  6. package/corpus/core/docs/content/locales/zh-TW/agent-surfaces.md +82 -82
  7. package/corpus/core/docs/content/locales/zh-TW/agent-teams.md +29 -29
  8. package/corpus/core/docs/content/locales/zh-TW/agent-web-surfaces.md +11 -11
  9. package/corpus/core/docs/content/locales/zh-TW/audit-log.md +16 -16
  10. package/corpus/core/docs/content/locales/zh-TW/authentication.md +32 -32
  11. package/corpus/core/docs/content/locales/zh-TW/automations.md +32 -32
  12. package/corpus/core/docs/content/locales/zh-TW/blueprint-installer.md +19 -19
  13. package/corpus/core/docs/content/locales/zh-TW/cli-adapters.md +17 -17
  14. package/corpus/core/docs/content/locales/zh-TW/client.md +62 -62
  15. package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.md +32 -32
  16. package/corpus/core/docs/content/locales/zh-TW/code-agents-ui.md +91 -91
  17. package/corpus/core/docs/content/locales/zh-TW/components.md +51 -51
  18. package/corpus/core/docs/content/locales/zh-TW/context-awareness.md +66 -66
  19. package/corpus/core/docs/content/locales/zh-TW/creating-templates.md +39 -39
  20. package/corpus/core/docs/content/locales/zh-TW/cross-app-sso.md +29 -29
  21. package/corpus/core/docs/content/locales/zh-TW/database.md +21 -21
  22. package/corpus/core/docs/content/locales/zh-TW/deployment.md +37 -37
  23. package/corpus/core/docs/content/locales/zh-TW/dispatch.md +43 -43
  24. package/corpus/core/docs/content/locales/zh-TW/drop-in-agent.md +34 -34
  25. package/corpus/core/docs/content/locales/zh-TW/durable-resume.md +18 -18
  26. package/corpus/core/docs/content/locales/zh-TW/embedding-sdk.md +73 -73
  27. package/corpus/core/docs/content/locales/zh-TW/evals.md +16 -16
  28. package/corpus/core/docs/content/locales/zh-TW/extensions.md +81 -81
  29. package/corpus/core/docs/content/locales/zh-TW/external-agents.md +146 -146
  30. package/corpus/core/docs/content/locales/zh-TW/faq.md +43 -43
  31. package/corpus/core/docs/content/locales/zh-TW/file-uploads.md +11 -11
  32. package/corpus/core/docs/content/locales/zh-TW/frames.md +33 -33
  33. package/corpus/core/docs/content/locales/zh-TW/getting-started.md +28 -28
  34. package/corpus/core/docs/content/locales/zh-TW/harness-agents.md +78 -78
  35. package/corpus/core/docs/content/locales/zh-TW/human-approval.md +27 -27
  36. package/corpus/core/docs/content/locales/zh-TW/internationalization.md +19 -19
  37. package/corpus/core/docs/content/locales/zh-TW/key-concepts.md +68 -68
  38. package/corpus/core/docs/content/locales/zh-TW/local-file-mode.md +50 -50
  39. package/corpus/core/docs/content/locales/zh-TW/mcp-apps.md +38 -38
  40. package/corpus/core/docs/content/locales/zh-TW/mcp-clients.md +67 -67
  41. package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.md +50 -50
  42. package/corpus/core/docs/content/locales/zh-TW/messaging.md +99 -99
  43. package/corpus/core/docs/content/locales/zh-TW/migration-workbench.md +6 -6
  44. package/corpus/core/docs/content/locales/zh-TW/multi-app-workspace.md +39 -39
  45. package/corpus/core/docs/content/locales/zh-TW/multi-tenancy.md +7 -7
  46. package/corpus/core/docs/content/locales/zh-TW/native-chat-ui.md +38 -38
  47. package/corpus/core/docs/content/locales/zh-TW/notifications.md +23 -23
  48. package/corpus/core/docs/content/locales/zh-TW/observability.md +49 -49
  49. package/corpus/core/docs/content/locales/zh-TW/observational-memory.md +23 -23
  50. package/corpus/core/docs/content/locales/zh-TW/onboarding.md +40 -40
  51. package/corpus/core/docs/content/locales/zh-TW/plan-plugin.md +37 -37
  52. package/corpus/core/docs/content/locales/zh-TW/pr-visual-recap.md +72 -72
  53. package/corpus/core/docs/content/locales/zh-TW/processors.md +17 -17
  54. package/corpus/core/docs/content/locales/zh-TW/progress.md +15 -15
  55. package/corpus/core/docs/content/locales/zh-TW/pure-agent-apps.md +10 -10
  56. package/corpus/core/docs/content/locales/zh-TW/real-time-collaboration.md +103 -103
  57. package/corpus/core/docs/content/locales/zh-TW/recurring-jobs.md +19 -19
  58. package/corpus/core/docs/content/locales/zh-TW/routing.md +9 -9
  59. package/corpus/core/docs/content/locales/zh-TW/sandbox-adapters.md +48 -48
  60. package/corpus/core/docs/content/locales/zh-TW/security.md +49 -49
  61. package/corpus/core/docs/content/locales/zh-TW/server.md +47 -47
  62. package/corpus/core/docs/content/locales/zh-TW/sharing.md +22 -22
  63. package/corpus/core/docs/content/locales/zh-TW/skills-guide.md +46 -46
  64. package/corpus/core/docs/content/locales/zh-TW/template-analytics.md +40 -40
  65. package/corpus/core/docs/content/locales/zh-TW/template-assets.md +69 -69
  66. package/corpus/core/docs/content/locales/zh-TW/template-brain.md +81 -81
  67. package/corpus/core/docs/content/locales/zh-TW/template-calendar.md +40 -40
  68. package/corpus/core/docs/content/locales/zh-TW/template-chat.md +27 -27
  69. package/corpus/core/docs/content/locales/zh-TW/template-clips.md +85 -85
  70. package/corpus/core/docs/content/locales/zh-TW/template-content.md +65 -66
  71. package/corpus/core/docs/content/locales/zh-TW/template-design.md +29 -29
  72. package/corpus/core/docs/content/locales/zh-TW/template-dispatch.md +51 -51
  73. package/corpus/core/docs/content/locales/zh-TW/template-forms.md +25 -25
  74. package/corpus/core/docs/content/locales/zh-TW/template-mail.md +71 -71
  75. package/corpus/core/docs/content/locales/zh-TW/template-plan.md +92 -92
  76. package/corpus/core/docs/content/locales/zh-TW/template-slides.md +52 -52
  77. package/corpus/core/docs/content/locales/zh-TW/template-videos.md +30 -30
  78. package/corpus/core/docs/content/locales/zh-TW/tracking.md +29 -29
  79. package/corpus/core/docs/content/locales/zh-TW/using-your-agent.md +18 -18
  80. package/corpus/core/docs/content/locales/zh-TW/voice-input.md +19 -19
  81. package/corpus/core/docs/content/locales/zh-TW/what-is-agent-native.md +61 -61
  82. package/corpus/core/docs/content/locales/zh-TW/workspace-connections.md +41 -41
  83. package/corpus/core/docs/content/locales/zh-TW/workspace-management.md +27 -27
  84. package/corpus/core/docs/content/locales/zh-TW/workspace.md +58 -58
  85. package/corpus/core/docs/content/locales/zh-TW/writing-agent-instructions.md +41 -41
  86. package/corpus/core/docs/content/template-clips.md +48 -2
  87. package/corpus/core/package.json +2 -1
  88. package/corpus/core/src/client/AgentPanel.tsx +27 -3
  89. package/corpus/core/src/deploy/build.ts +738 -57
  90. package/corpus/core/src/deploy/route-discovery.ts +1 -1
  91. package/corpus/core/src/server/edge.ts +50 -0
  92. package/corpus/core/src/styles/agent-native.css +93 -0
  93. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +44 -44
  94. package/corpus/core/src/vite/client.ts +1 -0
  95. package/corpus/templates/analytics/app/components/layout/Layout.tsx +5 -3
  96. package/corpus/templates/analytics/app/i18n/zh-TW.ts +69 -70
  97. package/corpus/templates/analytics/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  98. package/corpus/templates/assets/app/components/layout/Layout.tsx +3 -3
  99. package/corpus/templates/assets/app/i18n/zh-TW.ts +82 -82
  100. package/corpus/templates/assets/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  101. package/corpus/templates/brain/app/components/layout/Layout.tsx +6 -4
  102. package/corpus/templates/brain/app/i18n/zh-TW.ts +90 -90
  103. package/corpus/templates/brain/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  104. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +1 -1
  105. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +1 -1
  106. package/corpus/templates/calendar/app/i18n/zh-TW.ts +57 -57
  107. package/corpus/templates/calendar/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  108. package/corpus/templates/calendar/server/lib/booking-og-fonts.ts +20 -6
  109. package/corpus/templates/calendar/server/lib/booking-og-image.ts +17 -9
  110. package/corpus/templates/chat/app/components/layout/Layout.tsx +5 -3
  111. package/corpus/templates/chat/app/i18n/zh-TW.ts +3 -3
  112. package/corpus/templates/chat/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  113. package/corpus/templates/clips/AGENTS.md +6 -0
  114. package/corpus/templates/clips/actions/delete-recording-permanent.ts +7 -1
  115. package/corpus/templates/clips/actions/get-recording-player-data.ts +44 -2
  116. package/corpus/templates/clips/actions/navigate.ts +2 -0
  117. package/corpus/templates/clips/actions/save-bug-report-context.ts +173 -0
  118. package/corpus/templates/clips/actions/view-screen.ts +58 -7
  119. package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +9 -3
  120. package/corpus/templates/clips/app/hooks/use-navigation-state.ts +17 -0
  121. package/corpus/templates/clips/app/i18n/ar-SA.ts +31 -0
  122. package/corpus/templates/clips/app/i18n/de-DE.ts +32 -0
  123. package/corpus/templates/clips/app/i18n/en-US.ts +32 -0
  124. package/corpus/templates/clips/app/i18n/es-ES.ts +32 -0
  125. package/corpus/templates/clips/app/i18n/fr-FR.ts +32 -0
  126. package/corpus/templates/clips/app/i18n/hi-IN.ts +32 -0
  127. package/corpus/templates/clips/app/i18n/ja-JP.ts +31 -0
  128. package/corpus/templates/clips/app/i18n/ko-KR.ts +32 -0
  129. package/corpus/templates/clips/app/i18n/pt-BR.ts +32 -0
  130. package/corpus/templates/clips/app/i18n/zh-CN.ts +30 -0
  131. package/corpus/templates/clips/app/i18n/zh-TW.ts +461 -451
  132. package/corpus/templates/clips/app/routes/bug-report.done.tsx +126 -0
  133. package/corpus/templates/clips/app/routes/bug-report.tsx +222 -0
  134. package/corpus/templates/clips/app/routes/record.tsx +104 -12
  135. package/corpus/templates/clips/changelog/2026-06-26-brief-network-blips-no-longer-block-recording-or-wrongly-pro.md +6 -0
  136. package/corpus/templates/clips/changelog/2026-06-26-bug-report-recordings-can-keep-redacted-host-app-context-wit.md +6 -0
  137. package/corpus/templates/clips/changelog/2026-06-26-bug-report-widgets-can-launch-clips-recordings-from-embedded.md +6 -0
  138. package/corpus/templates/clips/changelog/2026-06-26-desktop-recording-keeps-connected-users-out-of-the-storage-s.md +6 -0
  139. package/corpus/templates/clips/changelog/2026-06-26-if-a-recording-can-t-be-uploaded-the-chrome-extension-now-sa.md +6 -0
  140. package/corpus/templates/clips/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  141. package/corpus/templates/clips/chrome-extension/public/manifest.json +9 -2
  142. package/corpus/templates/clips/chrome-extension/src/background.ts +43 -0
  143. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +111 -6
  144. package/corpus/templates/clips/chrome-extension/src/popup.ts +18 -7
  145. package/corpus/templates/clips/desktop/src/app.tsx +53 -19
  146. package/corpus/templates/clips/server/db/schema.ts +26 -0
  147. package/corpus/templates/clips/server/lib/public-agent-context.ts +51 -0
  148. package/corpus/templates/clips/server/plugins/auth.ts +1 -0
  149. package/corpus/templates/clips/server/plugins/db.ts +28 -0
  150. package/corpus/templates/clips/server/routes/api/agent-context.json.get.ts +4 -1
  151. package/corpus/templates/clips/shared/bug-report.ts +161 -0
  152. package/corpus/templates/content/app/components/layout/Layout.tsx +10 -8
  153. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +1 -1
  154. package/corpus/templates/content/app/i18n/zh-TW.ts +67 -66
  155. package/corpus/templates/content/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  156. package/corpus/templates/design/app/components/layout/Layout.tsx +3 -3
  157. package/corpus/templates/design/app/i18n/zh-TW.ts +44 -44
  158. package/corpus/templates/design/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  159. package/corpus/templates/dispatch/app/i18n/zh-TW.ts +5 -4
  160. package/corpus/templates/dispatch/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  161. package/corpus/templates/forms/app/components/layout/Layout.tsx +4 -2
  162. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +1 -1
  163. package/corpus/templates/forms/app/i18n/zh-TW.ts +48 -48
  164. package/corpus/templates/forms/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  165. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +3 -3
  166. package/corpus/templates/macros/app/i18n/zh-TW.ts +5 -5
  167. package/corpus/templates/macros/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  168. package/corpus/templates/mail/app/i18n/zh-TW.ts +83 -83
  169. package/corpus/templates/mail/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  170. package/corpus/templates/plan/app/components/layout/Layout.tsx +5 -3
  171. package/corpus/templates/plan/app/i18n/zh-TW.ts +69 -69
  172. package/corpus/templates/plan/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  173. package/corpus/templates/slides/app/components/layout/Layout.tsx +3 -3
  174. package/corpus/templates/slides/app/i18n/zh-TW.ts +64 -64
  175. package/corpus/templates/slides/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  176. package/corpus/templates/videos/app/components/layout/Layout.tsx +2 -2
  177. package/corpus/templates/videos/app/i18n/zh-TW.ts +54 -54
  178. package/corpus/templates/videos/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  179. package/dist/client/AgentPanel.d.ts.map +1 -1
  180. package/dist/client/AgentPanel.js +14 -4
  181. package/dist/client/AgentPanel.js.map +1 -1
  182. package/dist/collab/routes.d.ts +1 -1
  183. package/dist/deploy/build.d.ts +29 -2
  184. package/dist/deploy/build.d.ts.map +1 -1
  185. package/dist/deploy/build.js +587 -51
  186. package/dist/deploy/build.js.map +1 -1
  187. package/dist/deploy/route-discovery.d.ts +1 -1
  188. package/dist/deploy/route-discovery.js +1 -1
  189. package/dist/deploy/route-discovery.js.map +1 -1
  190. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  191. package/dist/notifications/routes.d.ts +2 -2
  192. package/dist/observability/routes.d.ts +7 -7
  193. package/dist/resources/handlers.d.ts +2 -2
  194. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  195. package/dist/server/edge.d.ts +11 -0
  196. package/dist/server/edge.d.ts.map +1 -0
  197. package/dist/server/edge.js +11 -0
  198. package/dist/server/edge.js.map +1 -0
  199. package/dist/styles/agent-native.css +93 -0
  200. package/dist/templates/default/app/i18n/zh-TW.ts +44 -44
  201. package/dist/vite/client.d.ts.map +1 -1
  202. package/dist/vite/client.js +1 -0
  203. package/dist/vite/client.js.map +1 -1
  204. package/docs/content/locales/zh-TW/a2a-protocol.md +68 -68
  205. package/docs/content/locales/zh-TW/actions.md +82 -82
  206. package/docs/content/locales/zh-TW/agent-mentions.md +22 -22
  207. package/docs/content/locales/zh-TW/agent-surfaces.md +82 -82
  208. package/docs/content/locales/zh-TW/agent-teams.md +29 -29
  209. package/docs/content/locales/zh-TW/agent-web-surfaces.md +11 -11
  210. package/docs/content/locales/zh-TW/audit-log.md +16 -16
  211. package/docs/content/locales/zh-TW/authentication.md +32 -32
  212. package/docs/content/locales/zh-TW/automations.md +32 -32
  213. package/docs/content/locales/zh-TW/blueprint-installer.md +19 -19
  214. package/docs/content/locales/zh-TW/cli-adapters.md +17 -17
  215. package/docs/content/locales/zh-TW/client.md +62 -62
  216. package/docs/content/locales/zh-TW/cloneable-saas.md +32 -32
  217. package/docs/content/locales/zh-TW/code-agents-ui.md +91 -91
  218. package/docs/content/locales/zh-TW/components.md +51 -51
  219. package/docs/content/locales/zh-TW/context-awareness.md +66 -66
  220. package/docs/content/locales/zh-TW/creating-templates.md +39 -39
  221. package/docs/content/locales/zh-TW/cross-app-sso.md +29 -29
  222. package/docs/content/locales/zh-TW/database.md +21 -21
  223. package/docs/content/locales/zh-TW/deployment.md +37 -37
  224. package/docs/content/locales/zh-TW/dispatch.md +43 -43
  225. package/docs/content/locales/zh-TW/drop-in-agent.md +34 -34
  226. package/docs/content/locales/zh-TW/durable-resume.md +18 -18
  227. package/docs/content/locales/zh-TW/embedding-sdk.md +73 -73
  228. package/docs/content/locales/zh-TW/evals.md +16 -16
  229. package/docs/content/locales/zh-TW/extensions.md +81 -81
  230. package/docs/content/locales/zh-TW/external-agents.md +146 -146
  231. package/docs/content/locales/zh-TW/faq.md +43 -43
  232. package/docs/content/locales/zh-TW/file-uploads.md +11 -11
  233. package/docs/content/locales/zh-TW/frames.md +33 -33
  234. package/docs/content/locales/zh-TW/getting-started.md +28 -28
  235. package/docs/content/locales/zh-TW/harness-agents.md +78 -78
  236. package/docs/content/locales/zh-TW/human-approval.md +27 -27
  237. package/docs/content/locales/zh-TW/internationalization.md +19 -19
  238. package/docs/content/locales/zh-TW/key-concepts.md +68 -68
  239. package/docs/content/locales/zh-TW/local-file-mode.md +50 -50
  240. package/docs/content/locales/zh-TW/mcp-apps.md +38 -38
  241. package/docs/content/locales/zh-TW/mcp-clients.md +67 -67
  242. package/docs/content/locales/zh-TW/mcp-protocol.md +50 -50
  243. package/docs/content/locales/zh-TW/messaging.md +99 -99
  244. package/docs/content/locales/zh-TW/migration-workbench.md +6 -6
  245. package/docs/content/locales/zh-TW/multi-app-workspace.md +39 -39
  246. package/docs/content/locales/zh-TW/multi-tenancy.md +7 -7
  247. package/docs/content/locales/zh-TW/native-chat-ui.md +38 -38
  248. package/docs/content/locales/zh-TW/notifications.md +23 -23
  249. package/docs/content/locales/zh-TW/observability.md +49 -49
  250. package/docs/content/locales/zh-TW/observational-memory.md +23 -23
  251. package/docs/content/locales/zh-TW/onboarding.md +40 -40
  252. package/docs/content/locales/zh-TW/plan-plugin.md +37 -37
  253. package/docs/content/locales/zh-TW/pr-visual-recap.md +72 -72
  254. package/docs/content/locales/zh-TW/processors.md +17 -17
  255. package/docs/content/locales/zh-TW/progress.md +15 -15
  256. package/docs/content/locales/zh-TW/pure-agent-apps.md +10 -10
  257. package/docs/content/locales/zh-TW/real-time-collaboration.md +103 -103
  258. package/docs/content/locales/zh-TW/recurring-jobs.md +19 -19
  259. package/docs/content/locales/zh-TW/routing.md +9 -9
  260. package/docs/content/locales/zh-TW/sandbox-adapters.md +48 -48
  261. package/docs/content/locales/zh-TW/security.md +49 -49
  262. package/docs/content/locales/zh-TW/server.md +47 -47
  263. package/docs/content/locales/zh-TW/sharing.md +22 -22
  264. package/docs/content/locales/zh-TW/skills-guide.md +46 -46
  265. package/docs/content/locales/zh-TW/template-analytics.md +40 -40
  266. package/docs/content/locales/zh-TW/template-assets.md +69 -69
  267. package/docs/content/locales/zh-TW/template-brain.md +81 -81
  268. package/docs/content/locales/zh-TW/template-calendar.md +40 -40
  269. package/docs/content/locales/zh-TW/template-chat.md +27 -27
  270. package/docs/content/locales/zh-TW/template-clips.md +85 -85
  271. package/docs/content/locales/zh-TW/template-content.md +65 -66
  272. package/docs/content/locales/zh-TW/template-design.md +29 -29
  273. package/docs/content/locales/zh-TW/template-dispatch.md +51 -51
  274. package/docs/content/locales/zh-TW/template-forms.md +25 -25
  275. package/docs/content/locales/zh-TW/template-mail.md +71 -71
  276. package/docs/content/locales/zh-TW/template-plan.md +92 -92
  277. package/docs/content/locales/zh-TW/template-slides.md +52 -52
  278. package/docs/content/locales/zh-TW/template-videos.md +30 -30
  279. package/docs/content/locales/zh-TW/tracking.md +29 -29
  280. package/docs/content/locales/zh-TW/using-your-agent.md +18 -18
  281. package/docs/content/locales/zh-TW/voice-input.md +19 -19
  282. package/docs/content/locales/zh-TW/what-is-agent-native.md +61 -61
  283. package/docs/content/locales/zh-TW/workspace-connections.md +41 -41
  284. package/docs/content/locales/zh-TW/workspace-management.md +27 -27
  285. package/docs/content/locales/zh-TW/workspace.md +58 -58
  286. package/docs/content/locales/zh-TW/writing-agent-instructions.md +41 -41
  287. package/docs/content/template-clips.md +48 -2
  288. package/package.json +2 -1
  289. package/src/templates/default/app/i18n/zh-TW.ts +44 -44
@@ -63,7 +63,7 @@ const messages = {
63
63
  testingConnection: "正在測試連線...",
64
64
  providers: {
65
65
  turso: {
66
- description: "邊缘 SQLite",
66
+ description: "邊緣 SQLite",
67
67
  steps: {
68
68
  step1: "安裝 CLI:curl -sSfL https://get.tur.so/install.sh | bash",
69
69
  step2: "註冊/登入:turso auth login(開啟瀏覽器)",
@@ -76,17 +76,17 @@ const messages = {
76
76
  description: "無伺服器 Postgres",
77
77
  steps: {
78
78
  step1: "前往 console.neon.tech 並註冊或登入",
79
- step2: '點擊 "New Project" → 選取名稱和區域 → 點擊 Create',
79
+ step2: '點選 "New Project" → 選取名稱和區域 → 點選 Create',
80
80
  step3: "在專案儀表板中找到 Connection Details 面板",
81
81
  step4: '選取 "Connection string" 標籤 → 複製 postgres://... URL',
82
82
  step5: "在下方貼上完整連線字串(包含密碼)",
83
83
  },
84
84
  },
85
85
  supabase: {
86
- description: "開來源 Firebase 替代方案",
86
+ description: "開放原始碼 Firebase 替代方案",
87
87
  steps: {
88
88
  step1: "前往 supabase.com/dashboard 並註冊或登入",
89
- step2: '點擊 "New Project" → 設定名稱和資料庫密碼 → 點擊 Create',
89
+ step2: '點選 "New Project" → 設定名稱和資料庫密碼 → 點選 Create',
90
90
  step3: "等待專案完成預配(約 30 秒)",
91
91
  step4: "前往 Project Settings → Database → Connection string",
92
92
  step5:
@@ -94,10 +94,10 @@ const messages = {
94
94
  },
95
95
  },
96
96
  d1: {
97
- description: "Cloudflare 邊缘 SQLite",
97
+ description: "Cloudflare 邊緣 SQLite",
98
98
  steps: {
99
99
  step1: "前往 dash.cloudflare.com → Workers & Pages → D1 SQL Database",
100
- step2: '點擊 "Create" → 為資料庫命名 → 點擊 Create',
100
+ step2: '點選 "Create" → 為資料庫命名 → 點選 Create',
101
101
  step3: "從資料庫概覽頁面複製 Database ID",
102
102
  step4: "認證權杖:前往 My Profile → API Tokens → Create Token",
103
103
  step5: '選取 "Edit Cloudflare Workers" 範本 → Create Token → 複製',
@@ -111,30 +111,30 @@ const messages = {
111
111
  attendeeCount_one: "{{count}} 人",
112
112
  attendeeCount_other: "{{count}} 人",
113
113
  connectApollo: "連線 Apollo",
114
- description: "新增 Apollo API key,用公司、職位和聯系資料丰富參會者資料。",
115
- howToGetKey: "如何獲取金鑰",
114
+ description: "新增 Apollo API key,用公司、職位和聯絡資料豐富參會者資料。",
115
+ howToGetKey: "如何取得金鑰",
116
116
  openSettings: "開啟 Apollo 設定 →",
117
117
  researchMeeting: "研究會議",
118
118
  steps: {
119
119
  login: "登入 Apollo.io",
120
120
  api: "前往 Settings → Integrations → API",
121
- connect: '點擊 "Connect" 生成金鑰',
121
+ connect: '點選 "Connect" 生成金鑰',
122
122
  },
123
123
  },
124
124
  attendees: {
125
125
  addAnotherGuest: "新增另一位來賓",
126
- contacts: "聯系人",
127
- contactsReconnect: "需要重新連線聯系人或目錄存取權限。",
126
+ contacts: "聯絡人",
127
+ contactsReconnect: "需要重新連線聯絡人或目錄存取權限。",
128
128
  directory: "目錄",
129
129
  inviteEmail: "邀請 {{email}}",
130
- otherContacts: "其他聯系人",
130
+ otherContacts: "其他聯絡人",
131
131
  removeAttendee: "移除 {{email}}",
132
132
  searchingPeople: "正在搜尋人員",
133
133
  },
134
134
  findTime: {
135
135
  busy: "忙碌",
136
136
  noMatchingSlots: "沒有匹配時段",
137
- refreshing: "正在刷新",
137
+ refreshing: "正在重新整理",
138
138
  suggestedTimes: "建議時間",
139
139
  takeoverDescription: "檢視共用可用性並選取會議時間。",
140
140
  you: "你",
@@ -163,13 +163,13 @@ const messages = {
163
163
  integrations: {
164
164
  addIntegration: "新增整合",
165
165
  addIntegrations: "新增整合",
166
- apolloDescription: "聯系人丰富和公司資料",
166
+ apolloDescription: "聯絡人豐富和公司資料",
167
167
  apolloKeyPlaceholder: "貼上 Apollo API key...",
168
168
  connectedCount: "整合({{connected}}/{{total}})",
169
- gongDescription: "最近通話和對話智能",
169
+ gongDescription: "最近通話和對話智慧",
170
170
  gongKeyPlaceholder: "Gong API key 或 access_key:secret...",
171
171
  go: "開始",
172
- hubSpotDescription: "CRM 聯系人、交易和工單",
172
+ hubSpotDescription: "CRM 聯絡人、交易和工單",
173
173
  hubSpotKeyPlaceholder: "貼上 HubSpot private app token...",
174
174
  newIntegration: "新整合",
175
175
  newIntegrationPlaceholder: "例如 Salesforce、Intercom...",
@@ -177,12 +177,12 @@ const messages = {
177
177
  pylonDescription: "支援問題和帳號資料",
178
178
  pylonKeyPlaceholder: "貼上 Pylon API token...",
179
179
  title: "整合",
180
- toGetApiKey: "獲取 API key:",
180
+ toGetApiKey: "取得 API key:",
181
181
  updateKey: "更新金鑰",
182
182
  steps: {
183
183
  apolloLogin: "登入 Apollo.io",
184
184
  apolloApi: "前往 Settings → Integrations → API",
185
- apolloConnect: '點擊 "Connect" 生成金鑰',
185
+ apolloConnect: '點選 "Connect" 生成金鑰',
186
186
  hubSpotPrivateApps:
187
187
  "Go to HubSpot > Settings > Integrations > Private Apps",
188
188
  hubSpotCreateApp: "建立帶 CRM 範圍的 private app",
@@ -276,7 +276,7 @@ const messages = {
276
276
  guest_other: "{{count}} 位來賓",
277
277
  cancel: "取消",
278
278
  dontNotify: "不通知",
279
- sendCancellation: "發送取消通知",
279
+ sendCancellation: "傳送取消通知",
280
280
  removeEvent: "移除事件",
281
281
  deleteEvent: "刪除事件",
282
282
  removeAction: "移除",
@@ -292,15 +292,15 @@ const messages = {
292
292
  previousPeriod: "上期",
293
293
  goToday: "轉到今天",
294
294
  showTeammateCalendars: "顯示隊友行事曆",
295
- monthView: "月視圖",
296
- weekView: "週視圖",
295
+ monthView: "月檢視",
296
+ weekView: "週檢視",
297
297
  dayView: "日景",
298
298
  createNewEvent: "建立新事件",
299
299
  deleteSelectedEvent: "刪除選定的事件",
300
300
  closeDialog: "關閉對話框/取消",
301
301
  openCommandPalette: "開啟指令面板",
302
302
  showKeyboardShortcuts: "顯示鍵盤快速鍵",
303
- disabledWhileTyping: "在文本欄位中輸入時,快速鍵被停用。",
303
+ disabledWhileTyping: "在文字欄位中輸入時,快速鍵被停用。",
304
304
  },
305
305
  manageBooking: {
306
306
  title: "管理預訂",
@@ -322,7 +322,7 @@ const messages = {
322
322
  cancelTitle: "取消此預訂嗎?",
323
323
  cancelDescriptionPrefix: "這將取消您的",
324
324
  cancelDescriptionDateConnector: "在",
325
- cancelDescriptionSuffix: "。此操作無法撤消。",
325
+ cancelDescriptionSuffix: "。此操作無法復原。",
326
326
  keepBooking: "繼續預訂",
327
327
  cancelling: "正在取消...",
328
328
  yesCancel: "是,取消",
@@ -340,23 +340,23 @@ const messages = {
340
340
  attachmentUploaded: "附件已上傳",
341
341
  attachmentUploadLimit: "上傳附件最大可達 25 MB。",
342
342
  uploadFailed: "無法上傳附件。",
343
- uploadMissingUrl: "上傳未返回附件 URL。",
343
+ uploadMissingUrl: "上傳未傳回附件 URL。",
344
344
  attachmentFallbackTitle: "依戀",
345
345
  fileUploadsNotConfigured: "未設定檔案上傳。改為貼上 Drive 或 HTTPS URL。",
346
346
  fileUploadsNeedProvider:
347
- "檔案上傳需要設定上傳提供程序。現在貼上 Drive 或 HTTPS URL。",
347
+ "檔案上傳需要設定上傳提供者。現在貼上 Drive 或 HTTPS URL。",
348
348
  uploadFile: "上傳檔案",
349
349
  uploading: "上傳中",
350
350
  maxAttachments: "Google Calendar 每個事件最多支援 {{count}} 個附件。",
351
351
  uploadProviderPermissionError:
352
- "目前上傳提供者憑證無法進行檔案上傳。檢查Settings中的Builder.io權限,或貼上Drive/HTTPS URL。",
352
+ "目前上傳提供者憑證無法進行檔案上傳。檢查Settings 中的 Builder.io 權限,或貼上DriveHTTPS URL。",
353
353
  setEventColorTo: "將事件顏色設定為 {{color}}",
354
354
  },
355
355
  googleConnect: {
356
356
  addAccount: "新增帳戶",
357
357
  addAccountWithPlus: "+ 新增帳戶",
358
- connectGoogleCalendar: "連線Google Calendar",
359
- connectGoogle: "連線Google",
358
+ connectGoogleCalendar: "連線 Google Calendar",
359
+ connectGoogle: "連線 Google",
360
360
  signInWithGoogle: "使用 Google 登入",
361
361
  syncEventsDescription: "同步您的活動並管理您的日程安排。",
362
362
  readyToConnect: "準備連線 — 使用您的 Google 帳戶登入",
@@ -364,25 +364,25 @@ const messages = {
364
364
  hideSetup: "隱藏設定",
365
365
  followSteps: "請按照以下步驟連線您的 Google 帳戶。大約需要3分鐘。",
366
366
  googleMayShowWarning: "Google 可能會顯示警告",
367
- googleNotVerifiedTitle: "“Google尚未驗證此應用程式”",
367
+ googleNotVerifiedTitle: "“Google 尚未驗證此應用程式”",
368
368
  googleWarningBeforeAdvanced:
369
- "您將看到此螢幕,因為行事曆是通過您自己的 Google Cloud 專案而不是經過 Google 審核的公開應用程式連線的。可以安全地繼續:點選",
369
+ "您將看到此螢幕,因為行事曆是透過您自己的 Google Cloud 專案而不是經過 Google 審核的公開應用程式連線的。可以安全地繼續:點選",
370
370
  googleWarningAdvanced: "Advanced",
371
371
  googleWarningBetweenActions: ", 然後",
372
372
  googleWarningUnsafe: "“Go to … (unsafe)”",
373
373
  googleWarningAfterUnsafe: "完成連線。",
374
374
  accountConnectedElsewhere: "該帳戶已連線到另一個登入帳戶",
375
375
  googleConnectionFailed: "Google 連線失敗",
376
- thatGoogleAccount: "那個Google帳戶",
376
+ thatGoogleAccount: "那個 Google 帳戶",
377
377
  signOutThenSignIn: "登出,然後使用 {{account}} 登入。",
378
378
  signOut: "登出",
379
379
  dismiss: "解雇",
380
- dismissNotice: "關閉Google登入通知",
380
+ dismissNotice: "關閉 Google 登入通知",
381
381
  copy: "複製",
382
382
  copied: "已複製",
383
383
  uploadJson: "上傳JSON",
384
384
  credentialsConfiguredSignIn:
385
- "憑證已設定。點擊上面的“連線Google Calendar”即可登入。",
385
+ "憑證已設定。點選上面的“連線 Google Calendar”即可登入。",
386
386
  missingClientCredentials: "在JSON中找不到client_id和client_secret",
387
387
  failedSaveCredentials: "無法儲存憑證",
388
388
  failedSave: "儲存失敗",
@@ -396,7 +396,7 @@ const messages = {
396
396
  saveCredentials: "儲存憑證",
397
397
  steps: {
398
398
  enableApi: {
399
- title: "啟用Google Calendar API",
399
+ title: "啟用 Google Calendar API",
400
400
  description:
401
401
  "開啟 Google Cloud Console 並點選 Calendar API 上的“啟用”。",
402
402
  linkText: "啟用Calendar API",
@@ -410,7 +410,7 @@ const messages = {
410
410
  credentials: {
411
411
  title: "建立 OAuth 憑證",
412
412
  description:
413
- "1) 點擊“+Create Credentials”→“OAuth client ID”\n2)選取“Web application”\n3) 新增此重新導向 URI:",
413
+ "1) 點選“+Create Credentials”→“OAuth client ID”\n2)選取“Web application”\n3) 新增此重新導向 URI:",
414
414
  linkText: "建立憑證",
415
415
  },
416
416
  upload: {
@@ -463,7 +463,7 @@ const messages = {
463
463
  collapsePreview: "折疊預覽",
464
464
  confirmBooking: "確認預訂",
465
465
  confirmation: "確認",
466
- confirmationSent: "你已完成!確認郵件已發送到你的郵箱。",
466
+ confirmationSent: "你已完成!確認郵件已傳送到你的信箱。",
467
467
  confirmed: "已確認",
468
468
  confirmedCount: "已確認({{count}})",
469
469
  confirming: "確認中",
@@ -475,14 +475,14 @@ const messages = {
475
475
  createLink: "建立連結",
476
476
  custom: "定制",
477
477
  customLink: "自訂連結",
478
- customLinkDescription: "貼上任何會議URL",
478
+ customLinkDescription: "貼上任何會議 URL",
479
479
  date: "日期",
480
480
  dateAndTime: "日期和時間",
481
481
  dateSelection: "日期選取",
482
482
  defaultDescription: "選取適合你的時間。",
483
483
  deleteBookingLink: "刪除預訂連結",
484
484
  deleteDescriptionPrefix: "這將永久刪除",
485
- deleteDescriptionSuffix: "及其公開預訂頁面。這無法撤消。",
485
+ deleteDescriptionSuffix: "及其公開預訂頁面。這無法復原。",
486
486
  description: "使用公開連結建立會議型別並設定您的可用性。",
487
487
  detailCount_one: "{{count}} 條詳情",
488
488
  detailCount_other: "{{count}} 條詳情",
@@ -518,7 +518,7 @@ const messages = {
518
518
  meetingLink: "會議連結",
519
519
  meetingTypeUnavailable: "此會議型別可能已被移除或不再可用。",
520
520
  meetingTypes: "會議型別",
521
- meetingUrl: "會議URL",
521
+ meetingUrl: "會議 URL",
522
522
  minuteMeeting: "{{count}}分鐘會議",
523
523
  minutes: "分鐘",
524
524
  minutesLong: "{{count}}分鐘",
@@ -537,7 +537,7 @@ const messages = {
537
537
  noConferencing: "沒有會議",
538
538
  noConferencingDescription: "親自、電話或稍後新增詳細資訊",
539
539
  no: "否",
540
- notesOptional: "注釋(可選)",
540
+ notesOptional: "註解(可選)",
541
541
  notes: "備註",
542
542
  notesPlaceholder: "任何您想分享的內容",
543
543
  oneOnOne: "一對一",
@@ -622,7 +622,7 @@ const messages = {
622
622
  display: "顯示",
623
623
  endTimeAfterStart: "結束時間必須晚於開始時間",
624
624
  eventDeleted: "事件已刪除",
625
- eventMoved: "事件已行動",
625
+ eventMoved: "事件已移動",
626
626
  eventRemoved: "事件已移除",
627
627
  eventUpdated: "事件已更新",
628
628
  failedDeleteEvent: "刪除事件失敗",
@@ -660,11 +660,11 @@ const messages = {
660
660
  allEvents: "所有活動",
661
661
  applyChangesTo: "將更改應用到",
662
662
  applyTo: "適用於",
663
- askAi: "詢問人工智能",
663
+ askAi: "詢問人工智慧",
664
664
  atStart: "開始時",
665
665
  attachments: "附件",
666
666
  attendees: "出席者",
667
- attendeesPlaceholder: "搜尋聯系人或輸入電子郵件",
667
+ attendeesPlaceholder: "搜尋聯絡人或輸入電子郵件",
668
668
  added: "已新增",
669
669
  awaiting: "等待中",
670
670
  busy: "忙",
@@ -680,7 +680,7 @@ const messages = {
680
680
  conferencingLinkOnSave: "儲存活動時會新增會議連結。",
681
681
  connectZoomBeforeCreate: "在建立此事件之前連線 Zoom。",
682
682
  create: "建立",
683
- createAndSend: "建立並發送",
683
+ createAndSend: "建立並傳送",
684
684
  createEvent: "建立活動",
685
685
  createFailed: "建立事件失敗",
686
686
  creating: "創造……",
@@ -692,7 +692,7 @@ const messages = {
692
692
  default: "預設",
693
693
  delete: "刪除",
694
694
  description: "描述",
695
- directorySearchLimited: "目錄搜尋受限。輸入完整郵箱並按 Enter 新增。",
695
+ directorySearchLimited: "目錄搜尋受限。輸入完整信箱並按 Enter 新增。",
696
696
  discard: "丟棄",
697
697
  doesNotRepeat: "不重複",
698
698
  draftEvent: "選秀活動",
@@ -716,10 +716,10 @@ const messages = {
716
716
  googleCalendar: "Google Calendar",
717
717
  googleMeet: "Google Meet",
718
718
  googleMeetAdded: "新增了 Google Meet",
719
- googleMeetAddFailed: "新增Google Meet失敗",
720
- home: "首頁面",
719
+ googleMeetAddFailed: "新增 Google Meet失敗",
720
+ home: "首頁",
721
721
  invite: "邀請",
722
- invitedNotice: "{{count}} 受邀 — Google 在您建立時會向他們發送電子郵件",
722
+ invitedNotice: "{{count}} 受邀 — Google 在您建立時會向他們傳送電子郵件",
723
723
  joinMeet: "加入聚會",
724
724
  joinMeeting: "加入會議",
725
725
  joinTeams: "加入團隊",
@@ -755,7 +755,7 @@ const messages = {
755
755
  private: "私人",
756
756
  press: "按",
757
757
  public: "公開",
758
- recurringResponseScope: "重複回複範圍",
758
+ recurringResponseScope: "重複回覆範圍",
759
759
  repeats: "重複",
760
760
  reviewInvite: "審核邀請",
761
761
  responseAwaitingCount: "{{count}} 等待中",
@@ -769,16 +769,16 @@ const messages = {
769
769
  rsvpTentative: "可能",
770
770
  rsvpYes: "是",
771
771
  save: "儲存",
772
- saveRecurringResponseStatus: "儲存重複事件的回複狀態",
773
- saveResponse: "儲存回複",
774
- saveResponseStatus: "儲存回複狀態",
772
+ saveRecurringResponseStatus: "儲存重複事件的回覆狀態",
773
+ saveResponse: "儲存回覆",
774
+ saveResponseStatus: "儲存回覆狀態",
775
775
  savedAsVideoLink: "已儲存為本次活動的影片連結",
776
- searchPeoplePlaceholder: "按姓名搜尋或輸入郵箱...",
776
+ searchPeoplePlaceholder: "按姓名搜尋或輸入信箱...",
777
777
  seeAllParticipants: "檢視全部 {{count}} 位參與者",
778
778
  selectedEvent: "所選事件",
779
- sendCancellationDescription: "向來賓發送取消通知,可附加備註。",
780
- sendUpdate: "發送更新",
781
- sendUpdateDescription: "向來賓發送更新通知,可附加備註。",
779
+ sendCancellationDescription: "向來賓傳送取消通知,可附加備註。",
780
+ sendUpdate: "傳送更新",
781
+ sendUpdateDescription: "向來賓傳送更新通知,可附加備註。",
782
782
  showAs: "顯示為",
783
783
  showLess: "收起",
784
784
  showMore: "顯示更多",
@@ -804,7 +804,7 @@ const messages = {
804
804
  video: "影片",
805
805
  viewTeammateCalendar: "檢視隊友的行事曆",
806
806
  viewingOwnerCalendar: "檢視 {{owner}} 的行事曆",
807
- yourResponse: "你的回複:{{status}}",
807
+ yourResponse: "你的回覆:{{status}}",
808
808
  visibility: "能見度",
809
809
  weekly: "每週",
810
810
  workingFrom: "工作自",
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-06-27
4
+ ---
5
+
6
+ Traditional Chinese copy now uses Taiwan terminology and clearer technical wording.
@@ -15,20 +15,34 @@ export interface BookingOgAssetStorage {
15
15
  getItemRaw?(id: string): Promise<unknown>;
16
16
  }
17
17
 
18
+ function resolveSourceFontPath(relativePath: string): string {
19
+ try {
20
+ const metaUrl = import.meta.url;
21
+ if (!metaUrl.startsWith("file:")) return "";
22
+ return fileURLToPath(new URL(relativePath, metaUrl));
23
+ } catch {
24
+ return "";
25
+ }
26
+ }
27
+
18
28
  export const BOOKING_OG_FONT_ASSETS: BookingOgFontAsset[] = [
19
29
  {
20
30
  asset: "server/fonts/LiberationSans-Regular.ttf",
21
31
  filename: "LiberationSans-Regular.ttf",
22
- sourcePath: fileURLToPath(
23
- new URL("../../assets/fonts/LiberationSans-Regular.ttf", import.meta.url),
24
- ),
32
+ get sourcePath() {
33
+ return resolveSourceFontPath(
34
+ "../../assets/fonts/LiberationSans-Regular.ttf",
35
+ );
36
+ },
25
37
  },
26
38
  {
27
39
  asset: "server/fonts/LiberationSans-Bold.ttf",
28
40
  filename: "LiberationSans-Bold.ttf",
29
- sourcePath: fileURLToPath(
30
- new URL("../../assets/fonts/LiberationSans-Bold.ttf", import.meta.url),
31
- ),
41
+ get sourcePath() {
42
+ return resolveSourceFontPath(
43
+ "../../assets/fonts/LiberationSans-Bold.ttf",
44
+ );
45
+ },
32
46
  },
33
47
  ];
34
48
 
@@ -24,14 +24,10 @@ const BORDER = "#1f1f1f";
24
24
  const FG = "#ededed";
25
25
  const MUTED = "#a0a0a0";
26
26
  const FONT_FAMILY = "Liberation Sans, Arial, system-ui, sans-serif";
27
- const FONT_FILES = [
28
- fileURLToPath(
29
- new URL("../../assets/fonts/LiberationSans-Regular.ttf", import.meta.url),
30
- ),
31
- fileURLToPath(
32
- new URL("../../assets/fonts/LiberationSans-Bold.ttf", import.meta.url),
33
- ),
34
- ].filter((fontFile) => existsSync(fontFile));
27
+ const FONT_SOURCE_PATHS = [
28
+ "../../assets/fonts/LiberationSans-Regular.ttf",
29
+ "../../assets/fonts/LiberationSans-Bold.ttf",
30
+ ] as const;
35
31
  const AVATAR_CX = 996;
36
32
  const AVATAR_CY = 170;
37
33
  const AVATAR_SIZE = 172;
@@ -298,11 +294,23 @@ interface BookingOgRenderOptions {
298
294
  fontFiles?: string[];
299
295
  }
300
296
 
297
+ function resolveSourceFontFiles(): string[] {
298
+ try {
299
+ const metaUrl = import.meta.url;
300
+ if (!metaUrl.startsWith("file:")) return [];
301
+ return FONT_SOURCE_PATHS.map((sourcePath) =>
302
+ fileURLToPath(new URL(sourcePath, metaUrl)),
303
+ ).filter((fontFile) => existsSync(fontFile));
304
+ } catch {
305
+ return [];
306
+ }
307
+ }
308
+
301
309
  function bookingOgResvgOptions(
302
310
  options: BookingOgRenderOptions = {},
303
311
  ): ResvgRenderOptions {
304
312
  const fontFiles = (
305
- options.fontFiles?.length ? options.fontFiles : FONT_FILES
313
+ options.fontFiles?.length ? options.fontFiles : resolveSourceFontFiles()
306
314
  ).filter((fontFile) => existsSync(fontFile));
307
315
  const hasBundledFonts = fontFiles.length > 0;
308
316
  return {
@@ -137,8 +137,8 @@ export function Layout({ children }: LayoutProps) {
137
137
 
138
138
  return (
139
139
  <HeaderActionsProvider>
140
- <div className="flex h-screen w-full overflow-hidden bg-background text-foreground">
141
- <div className="hidden md:block">
140
+ <div className="agent-layout-shell flex h-screen w-full overflow-hidden bg-background text-foreground">
141
+ <div className="agent-layout-left-drawer hidden md:block">
142
142
  <Sidebar
143
143
  collapsed={sidebarCollapsed}
144
144
  onCollapsedChange={setSidebarCollapsed}
@@ -156,7 +156,9 @@ export function Layout({ children }: LayoutProps) {
156
156
  </SheetContent>
157
157
  </Sheet>
158
158
  {isChatRoute ? (
159
- contentFrame
159
+ <div className="agent-layout-main-surface flex min-w-0 flex-1 overflow-hidden">
160
+ {contentFrame}
161
+ </div>
160
162
  ) : (
161
163
  <AgentSidebar
162
164
  position="right"
@@ -29,9 +29,9 @@ const messages = {
29
29
  newChat: "新建聊天",
30
30
  optionsFor: "選項:",
31
31
  pinChat: "置頂聊天",
32
- renameChat: "重命名聊天",
33
- renameFailed: "重命名失敗",
34
- renameThread: "重命名對話",
32
+ renameChat: "重新命名聊天",
33
+ renameFailed: "重新命名失敗",
34
+ renameThread: "重新命名對話",
35
35
  suggestionActions: "顯示可用操作",
36
36
  suggestionCapabilities: "這個應用能做什麼?",
37
37
  suggestionCustomize: "幫我自訂此應用",
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-06-27
4
+ ---
5
+
6
+ Traditional Chinese copy now uses Taiwan terminology and clearer technical wording.
@@ -73,6 +73,12 @@ Detailed media, meeting, dictation, editing, and sharing rules live in
73
73
  sanitized URL with query values redacted, status, duration), plus
74
74
  `consoleIssues` and `failedNetworkRequests` highlights. All bounded; page
75
75
  URL, headers, bodies, and cookies stay omitted.
76
+ - Embedded bug reports use `/bug-report` as an iframe-friendly launcher and
77
+ `/record?intent=bug-report` for the actual top-level capture flow. The
78
+ launcher stores redacted host metadata through `save-bug-report-context`; the
79
+ recording remains the canonical resource and defaults to workspace visibility.
80
+ Do not present this as anonymous customer intake until a signed intake/upload
81
+ token flow exists, because the current upload endpoints are owner-scoped.
76
82
  - The Chrome extension lives in `chrome-extension/`. It launches `/record` with
77
83
  `clipsExtensionId` and `clipsCaptureSessionId`, then the recorder sends
78
84
  `CLIPS_CAPTURE_START/STOP/CANCEL` back to the extension. The extension uses
@@ -22,7 +22,7 @@ import {
22
22
 
23
23
  export default defineAction({
24
24
  description:
25
- "Permanently delete a recording and every related row (comments, reactions, viewers, events, transcript, tags, CTAs, shares). This cannot be undone.",
25
+ "Permanently delete a recording and every related row (comments, reactions, viewers, events, transcript, tags, CTAs, shares, diagnostics, bug reports). This cannot be undone.",
26
26
  schema: z.object({
27
27
  id: z.string().describe("Recording ID"),
28
28
  }),
@@ -57,6 +57,12 @@ export default defineAction({
57
57
  await db
58
58
  .delete(schema.recordingTranscripts)
59
59
  .where(eq(schema.recordingTranscripts.recordingId, args.id));
60
+ await db
61
+ .delete(schema.recordingBrowserDiagnostics)
62
+ .where(eq(schema.recordingBrowserDiagnostics.recordingId, args.id));
63
+ await db
64
+ .delete(schema.recordingBugReports)
65
+ .where(eq(schema.recordingBugReports.recordingId, args.id));
60
66
  await db
61
67
  .delete(schema.recordingTags)
62
68
  .where(eq(schema.recordingTags.recordingId, args.id));
@@ -33,6 +33,39 @@ import {
33
33
  parseTranscriptSegments,
34
34
  } from "../shared/transcript-segments.js";
35
35
 
36
+ function safeJsonObject(raw: string | null | undefined) {
37
+ if (!raw) return {};
38
+ try {
39
+ const parsed = JSON.parse(raw);
40
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed)
41
+ ? parsed
42
+ : {};
43
+ } catch {
44
+ return {};
45
+ }
46
+ }
47
+
48
+ function mapBugReport(row: typeof schema.recordingBugReports._.inferSelect) {
49
+ return {
50
+ recordingId: row.recordingId,
51
+ projectId: row.projectId,
52
+ title: row.title,
53
+ description: row.description,
54
+ severity: row.severity,
55
+ sourceUrl: row.sourceUrl,
56
+ pageTitle: row.pageTitle,
57
+ appVersion: row.appVersion,
58
+ environment: row.environment,
59
+ reporterEmail: row.reporterEmail,
60
+ reporterName: row.reporterName,
61
+ reporterId: row.reporterId,
62
+ metadata: safeJsonObject(row.metadataJson),
63
+ submittedAt: row.submittedAt,
64
+ createdAt: row.createdAt,
65
+ updatedAt: row.updatedAt,
66
+ };
67
+ }
68
+
36
69
  function recordingDeepLink(recordingId: string): string {
37
70
  return buildDeepLink({
38
71
  app: "clips",
@@ -112,10 +145,15 @@ export default defineAction({
112
145
  const browserDiagnostics = parseBrowserDiagnosticsRow(
113
146
  browserDiagnosticsRow,
114
147
  );
115
- const canInspectBrowserDiagnostics =
148
+ const canInspectSensitiveContext =
116
149
  access.role === "owner" ||
117
150
  access.role === "admin" ||
118
151
  access.role === "editor";
152
+ const [bugReportRow] = await db
153
+ .select()
154
+ .from(schema.recordingBugReports)
155
+ .where(eq(schema.recordingBugReports.recordingId, args.recordingId))
156
+ .limit(1);
119
157
 
120
158
  // Reverse-lookup: if a meeting captured this recording, surface it so the
121
159
  // player can show a "From meeting: <title>" badge linking back to the
@@ -289,10 +327,14 @@ export default defineAction({
289
327
  placement: c.placement,
290
328
  })),
291
329
  browserDiagnostics: browserDiagnostics
292
- ? canInspectBrowserDiagnostics
330
+ ? canInspectSensitiveContext
293
331
  ? browserDiagnostics
294
332
  : { summary: browserDiagnostics.summary }
295
333
  : null,
334
+ bugReport:
335
+ bugReportRow && canInspectSensitiveContext
336
+ ? mapBugReport(bugReportRow)
337
+ : null,
296
338
  meeting,
297
339
  };
298
340
  },
@@ -25,6 +25,8 @@ const Views = [
25
25
  "archive",
26
26
  "trash",
27
27
  "record",
28
+ "bug-report",
29
+ "bug-report-done",
28
30
  "recording",
29
31
  "meetings",
30
32
  "meeting",