@agent-native/toolkit 0.201.1 → 0.202.0-nightly-20261006033736

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 (229) hide show
  1. package/agent-native.eject.json +39 -12
  2. package/dist/app/agentkit/react/components.d.ts.map +1 -1
  3. package/dist/app/agentkit/react/components.js +292 -23
  4. package/dist/app/agentkit/react/components.js.map +1 -1
  5. package/dist/app/agentkit/react/context.d.ts +5 -0
  6. package/dist/app/agentkit/react/context.d.ts.map +1 -1
  7. package/dist/app/agentkit/react/context.js +5 -0
  8. package/dist/app/agentkit/react/context.js.map +1 -1
  9. package/dist/app/agentkit/react/styles.css +78 -3
  10. package/dist/app/auth/AuthPage.d.ts.map +1 -1
  11. package/dist/app/auth/AuthPage.js +7 -14
  12. package/dist/app/auth/AuthPage.js.map +1 -1
  13. package/dist/app/auth/server.d.ts +6 -0
  14. package/dist/app/auth/server.d.ts.map +1 -0
  15. package/dist/app/auth/server.js +19 -0
  16. package/dist/app/auth/server.js.map +1 -0
  17. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  18. package/dist/app/chat/AgentKitAssistantChat.js +164 -83
  19. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  20. package/dist/app/chat/AgentSidebar.d.ts +2 -1
  21. package/dist/app/chat/AgentSidebar.d.ts.map +1 -1
  22. package/dist/app/chat/AgentSidebar.js +2 -2
  23. package/dist/app/chat/AgentSidebar.js.map +1 -1
  24. package/dist/app/chat/agentkit-chat/guided-questions.d.ts.map +1 -1
  25. package/dist/app/chat/agentkit-chat/guided-questions.js +13 -3
  26. package/dist/app/chat/agentkit-chat/guided-questions.js.map +1 -1
  27. package/dist/app/chat/chat/surface-types.d.ts +2 -0
  28. package/dist/app/chat/chat/surface-types.d.ts.map +1 -1
  29. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  30. package/dist/app/i18n/catalogs/ar-SA.js +41 -0
  31. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  32. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  33. package/dist/app/i18n/catalogs/de-DE.js +41 -0
  34. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  35. package/dist/app/i18n/catalogs/en-US.d.ts +41 -0
  36. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  37. package/dist/app/i18n/catalogs/en-US.js +41 -0
  38. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  39. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  40. package/dist/app/i18n/catalogs/es-ES.js +41 -0
  41. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  42. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  43. package/dist/app/i18n/catalogs/fr-FR.js +41 -0
  44. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  45. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  46. package/dist/app/i18n/catalogs/hi-IN.js +41 -0
  47. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  48. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  49. package/dist/app/i18n/catalogs/ja-JP.js +41 -0
  50. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  51. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  52. package/dist/app/i18n/catalogs/ko-KR.js +41 -0
  53. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  54. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  55. package/dist/app/i18n/catalogs/pt-BR.js +41 -0
  56. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  57. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  58. package/dist/app/i18n/catalogs/zh-CN.js +41 -0
  59. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  60. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  61. package/dist/app/i18n/catalogs/zh-TW.js +41 -0
  62. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  63. package/dist/app/shared/StarfieldBackground.d.ts +1 -6
  64. package/dist/app/shared/StarfieldBackground.d.ts.map +1 -1
  65. package/dist/app/shared/StarfieldBackground.js +1 -368
  66. package/dist/app/shared/StarfieldBackground.js.map +1 -1
  67. package/dist/app/shared/WaveBackground.d.ts +5 -0
  68. package/dist/app/shared/WaveBackground.d.ts.map +1 -0
  69. package/dist/app/shared/WaveBackground.js +34 -0
  70. package/dist/app/shared/WaveBackground.js.map +1 -0
  71. package/dist/app/shared/WebGlWaveBackground.d.ts +9 -0
  72. package/dist/app/shared/WebGlWaveBackground.d.ts.map +1 -0
  73. package/dist/app/shared/WebGlWaveBackground.js +433 -0
  74. package/dist/app/shared/WebGlWaveBackground.js.map +1 -0
  75. package/dist/app/shared/index.d.ts +1 -0
  76. package/dist/app/shared/index.d.ts.map +1 -1
  77. package/dist/app/shared/index.js +1 -0
  78. package/dist/app/shared/index.js.map +1 -1
  79. package/dist/app/shared/ocean/bloom-blur.wgsl +43 -0
  80. package/dist/app/shared/ocean/bloom-blur.wgsl.js +1 -0
  81. package/dist/app/shared/ocean/bloom-bright.wgsl +21 -0
  82. package/dist/app/shared/ocean/bloom-bright.wgsl.js +1 -0
  83. package/dist/app/shared/ocean/bloom-composite.wgsl +40 -0
  84. package/dist/app/shared/ocean/bloom-composite.wgsl.js +1 -0
  85. package/dist/app/shared/ocean/brand-colors.d.ts +9 -0
  86. package/dist/app/shared/ocean/brand-colors.d.ts.map +1 -0
  87. package/dist/app/shared/ocean/brand-colors.js +45 -0
  88. package/dist/app/shared/ocean/brand-colors.js.map +1 -0
  89. package/dist/app/shared/ocean/camera.d.ts +5 -0
  90. package/dist/app/shared/ocean/camera.d.ts.map +1 -0
  91. package/dist/app/shared/ocean/camera.js +24 -0
  92. package/dist/app/shared/ocean/camera.js.map +1 -0
  93. package/dist/app/shared/ocean/hero-ocean-background.d.ts +8 -0
  94. package/dist/app/shared/ocean/hero-ocean-background.d.ts.map +1 -0
  95. package/dist/app/shared/ocean/hero-ocean-background.js +186 -0
  96. package/dist/app/shared/ocean/hero-ocean-background.js.map +1 -0
  97. package/dist/app/shared/ocean/ifft-stage.wgsl +36 -0
  98. package/dist/app/shared/ocean/ifft-stage.wgsl.js +1 -0
  99. package/dist/app/shared/ocean/initial-spectrum.wgsl +36 -0
  100. package/dist/app/shared/ocean/initial-spectrum.wgsl.js +1 -0
  101. package/dist/app/shared/ocean/noise.wgsl +24 -0
  102. package/dist/app/shared/ocean/noise.wgsl.js +1 -0
  103. package/dist/app/shared/ocean/normal-foam.wgsl +32 -0
  104. package/dist/app/shared/ocean/normal-foam.wgsl.js +1 -0
  105. package/dist/app/shared/ocean/ocean-colors.d.ts +6 -0
  106. package/dist/app/shared/ocean/ocean-colors.d.ts.map +1 -0
  107. package/dist/app/shared/ocean/ocean-colors.js +6 -0
  108. package/dist/app/shared/ocean/ocean-colors.js.map +1 -0
  109. package/dist/app/shared/ocean/ocean-common.wgsl +15 -0
  110. package/dist/app/shared/ocean/ocean-common.wgsl.js +1 -0
  111. package/dist/app/shared/ocean/ocean-graph.d.ts +12 -0
  112. package/dist/app/shared/ocean/ocean-graph.d.ts.map +1 -0
  113. package/dist/app/shared/ocean/ocean-graph.js +16 -0
  114. package/dist/app/shared/ocean/ocean-graph.js.map +1 -0
  115. package/dist/app/shared/ocean/particles.wgsl +139 -0
  116. package/dist/app/shared/ocean/particles.wgsl.js +1 -0
  117. package/dist/app/shared/ocean/present.wgsl +40 -0
  118. package/dist/app/shared/ocean/present.wgsl.js +1 -0
  119. package/dist/app/shared/ocean/renderer.d.ts +66 -0
  120. package/dist/app/shared/ocean/renderer.d.ts.map +1 -0
  121. package/dist/app/shared/ocean/renderer.js +535 -0
  122. package/dist/app/shared/ocean/renderer.js.map +1 -0
  123. package/dist/app/shared/ocean/spectrum.wgsl +35 -0
  124. package/dist/app/shared/ocean/spectrum.wgsl.js +1 -0
  125. package/dist/app/shared/ocean/tuning.d.ts +48 -0
  126. package/dist/app/shared/ocean/tuning.d.ts.map +1 -0
  127. package/dist/app/shared/ocean/tuning.js +74 -0
  128. package/dist/app/shared/ocean/tuning.js.map +1 -0
  129. package/dist/app/shared/ocean/webgpu-support.d.ts +3 -0
  130. package/dist/app/shared/ocean/webgpu-support.d.ts.map +1 -0
  131. package/dist/app/shared/ocean/webgpu-support.js +13 -0
  132. package/dist/app/shared/ocean/webgpu-support.js.map +1 -0
  133. package/dist/app/sharing/AccessRequestApprovalPage.d.ts +23 -0
  134. package/dist/app/sharing/AccessRequestApprovalPage.d.ts.map +1 -0
  135. package/dist/app/sharing/AccessRequestApprovalPage.js +95 -0
  136. package/dist/app/sharing/AccessRequestApprovalPage.js.map +1 -0
  137. package/dist/app/sharing/AccessRequestsSection.d.ts +5 -0
  138. package/dist/app/sharing/AccessRequestsSection.d.ts.map +1 -0
  139. package/dist/app/sharing/AccessRequestsSection.js +47 -0
  140. package/dist/app/sharing/AccessRequestsSection.js.map +1 -0
  141. package/dist/app/sharing/ResourceAccessScreen.d.ts +53 -0
  142. package/dist/app/sharing/ResourceAccessScreen.d.ts.map +1 -0
  143. package/dist/app/sharing/ResourceAccessScreen.js +132 -0
  144. package/dist/app/sharing/ResourceAccessScreen.js.map +1 -0
  145. package/dist/app/sharing/ShareButton.d.ts.map +1 -1
  146. package/dist/app/sharing/ShareButton.js +4 -2
  147. package/dist/app/sharing/ShareButton.js.map +1 -1
  148. package/dist/app/sharing/ShareDialog.d.ts.map +1 -1
  149. package/dist/app/sharing/ShareDialog.js +7 -5
  150. package/dist/app/sharing/ShareDialog.js.map +1 -1
  151. package/dist/app/sharing/index.d.ts +2 -0
  152. package/dist/app/sharing/index.d.ts.map +1 -1
  153. package/dist/app/sharing/index.js +2 -0
  154. package/dist/app/sharing/index.js.map +1 -1
  155. package/dist/app/styles/agent-native.css +21 -1
  156. package/dist/app/styles/tokens/agent-kit.css +3 -1
  157. package/dist/composer/AgentSuggestionBar.d.ts +1 -1
  158. package/dist/composer/AgentSuggestionBar.d.ts.map +1 -1
  159. package/dist/composer/AgentSuggestionBar.js +75 -6
  160. package/dist/composer/AgentSuggestionBar.js.map +1 -1
  161. package/package.json +14 -4
  162. package/src/app/agentkit/react/components.tsx +492 -60
  163. package/src/app/agentkit/react/context.tsx +10 -0
  164. package/src/app/agentkit/react/lifecycle.spec.tsx +487 -1
  165. package/src/app/agentkit/react/styles.css +78 -3
  166. package/src/app/auth/AuthPage.spec.tsx +11 -7
  167. package/src/app/auth/AuthPage.tsx +16 -35
  168. package/src/app/auth/server.spec.ts +68 -0
  169. package/src/app/auth/server.ts +29 -0
  170. package/src/app/chat/AgentKitAssistantChat.spec.tsx +287 -290
  171. package/src/app/chat/AgentKitAssistantChat.tsx +219 -116
  172. package/src/app/chat/AgentSidebar.tsx +3 -0
  173. package/src/app/chat/agentkit-chat/guided-questions.flow.spec.tsx +85 -0
  174. package/src/app/chat/agentkit-chat/guided-questions.tsx +12 -5
  175. package/src/app/chat/chat/surface-types.ts +2 -0
  176. package/src/app/i18n/catalogs/ar-SA.ts +44 -0
  177. package/src/app/i18n/catalogs/de-DE.ts +55 -0
  178. package/src/app/i18n/catalogs/en-US.ts +46 -0
  179. package/src/app/i18n/catalogs/es-ES.ts +53 -0
  180. package/src/app/i18n/catalogs/fr-FR.ts +53 -0
  181. package/src/app/i18n/catalogs/hi-IN.ts +47 -0
  182. package/src/app/i18n/catalogs/ja-JP.ts +54 -0
  183. package/src/app/i18n/catalogs/ko-KR.ts +50 -0
  184. package/src/app/i18n/catalogs/pt-BR.ts +52 -0
  185. package/src/app/i18n/catalogs/zh-CN.ts +42 -0
  186. package/src/app/i18n/catalogs/zh-TW.ts +43 -0
  187. package/src/app/shared/StarfieldBackground.tsx +4 -423
  188. package/src/app/shared/WaveBackground.spec.tsx +104 -0
  189. package/src/app/shared/WaveBackground.tsx +60 -0
  190. package/src/app/shared/WebGlWaveBackground.spec.tsx +106 -0
  191. package/src/app/shared/WebGlWaveBackground.tsx +499 -0
  192. package/src/app/shared/index.ts +1 -0
  193. package/src/app/shared/ocean/bloom-blur.wgsl +43 -0
  194. package/src/app/shared/ocean/bloom-bright.wgsl +21 -0
  195. package/src/app/shared/ocean/bloom-composite.wgsl +40 -0
  196. package/src/app/shared/ocean/brand-colors.ts +49 -0
  197. package/src/app/shared/ocean/camera.ts +28 -0
  198. package/src/app/shared/ocean/hero-ocean-background.spec.tsx +369 -0
  199. package/src/app/shared/ocean/hero-ocean-background.tsx +238 -0
  200. package/src/app/shared/ocean/ifft-stage.wgsl +36 -0
  201. package/src/app/shared/ocean/initial-spectrum.wgsl +36 -0
  202. package/src/app/shared/ocean/noise.wgsl +24 -0
  203. package/src/app/shared/ocean/normal-foam.wgsl +32 -0
  204. package/src/app/shared/ocean/ocean-colors.ts +11 -0
  205. package/src/app/shared/ocean/ocean-common.wgsl +15 -0
  206. package/src/app/shared/ocean/ocean-graph.ts +29 -0
  207. package/src/app/shared/ocean/particles.wgsl +139 -0
  208. package/src/app/shared/ocean/present.wgsl +40 -0
  209. package/src/app/shared/ocean/renderer.spec.ts +100 -0
  210. package/src/app/shared/ocean/renderer.ts +693 -0
  211. package/src/app/shared/ocean/spectrum.wgsl +35 -0
  212. package/src/app/shared/ocean/tuning.ts +131 -0
  213. package/src/app/shared/ocean/webgpu-support.ts +12 -0
  214. package/src/app/sharing/AccessRequestApprovalPage.spec.tsx +276 -0
  215. package/src/app/sharing/AccessRequestApprovalPage.tsx +307 -0
  216. package/src/app/sharing/AccessRequestsSection.tsx +163 -0
  217. package/src/app/sharing/ResourceAccessScreen.spec.tsx +235 -0
  218. package/src/app/sharing/ResourceAccessScreen.tsx +331 -0
  219. package/src/app/sharing/ShareButton.spec.tsx +171 -5
  220. package/src/app/sharing/ShareButton.tsx +15 -2
  221. package/src/app/sharing/ShareDialog.spec.tsx +71 -2
  222. package/src/app/sharing/ShareDialog.tsx +24 -2
  223. package/src/app/sharing/index.ts +2 -0
  224. package/src/app/styles/agent-native.css +21 -1
  225. package/src/app/styles/agent-native.spec.ts +16 -3
  226. package/src/app/styles/tokens/agent-kit.css +3 -1
  227. package/src/composer/AgentSuggestionBar.overflow.spec.tsx +277 -0
  228. package/src/composer/AgentSuggestionBar.tsx +113 -8
  229. package/src/wgsl-env.d.ts +6 -0
@@ -1134,6 +1134,45 @@ const messages: ToolkitAgentChatTranslation = {
1134
1134
  "setup.keyProvider": "API 密钥提供商",
1135
1135
  "setup.keySaveFailed": "无法保存密钥。",
1136
1136
  "setup.storedSecurely": "仅为此应用安全存储。",
1137
+ "accessGate.deniedTitle": "你没有访问权限",
1138
+ "accessGate.deniedDescription": "请让所有者与你共享。",
1139
+ "accessGate.missingTitle": "此内容不存在",
1140
+ "accessGate.missingDescription": "链接可能有误,或内容已被删除。",
1141
+ "accessGate.trashedTitle": "此内容在回收站中",
1142
+ "accessGate.trashedDescription": "恢复后即可再次打开。",
1143
+ "accessGate.signedOutTitle": "登录以继续",
1144
+ "accessGate.signedOutDescription": "请使用有访问权限的账号登录。",
1145
+ "accessGate.signIn": "登录",
1146
+ "accessGate.signedInAs": "当前登录账号:{{email}}",
1147
+ "accessGate.switchAccount": "切换账号",
1148
+ "accessGate.requestDescription": "申请访问权限,所有者将收到通知。",
1149
+ "accessGate.requestSent": "申请已发送,已通知所有者。",
1150
+ "accessGate.requestAccess": "申请访问权限",
1151
+ "accessGate.requestNoteLabel": "备注(可选)",
1152
+ "accessGate.requestNotePlaceholder": "给所有者添加备注",
1153
+ "accessGate.sendRequest": "发送申请",
1154
+ "accessGate.cancel": "取消",
1155
+ "accessGate.requestRateLimited": "当前请求过多,请稍后再试。",
1156
+ "accessGate.requestFailed": "无法发送你的申请,请重试。",
1157
+ "accessGate.signedOutRequestDescription": "登录后即可申请访问权限。",
1158
+ "accessRequest.title": "{{name}} 正在申请访问权限",
1159
+ "accessRequest.approvedTitle": "已允许访问",
1160
+ "accessRequest.declinedTitle": "申请已拒绝",
1161
+ "accessRequest.allow": "允许",
1162
+ "accessRequest.decline": "拒绝",
1163
+ "accessRequest.unavailableTitle": "你无法审核此申请",
1164
+ "accessRequest.unavailableDescription":
1165
+ "申请可能已被撤回,或此账号无权管理访问权限。",
1166
+ "accessRequest.loadFailed": "无法加载此申请。",
1167
+ "accessRequest.retry": "重试",
1168
+ "accessRequest.decisionFailed": "无法保存你的决定,请重试。",
1169
+ "accessRequest.stale": "其他人已处理此申请,或申请已发生变化。",
1170
+ "share.accessRequests": "访问申请",
1171
+ "share.accessRequestsLoadFailed": "无法加载访问申请。",
1172
+ "share.accessRequestsNewest": "显示最新的 {{count}} 条申请。",
1173
+ "accessRequest.emailFailed": "{{name}} 已获得访问权限,但无法向其发送邮件。",
1174
+ "share.allowRequestFrom": "允许 {{name}}",
1175
+ "share.declineRequestFrom": "拒绝 {{name}}",
1137
1176
  "share.add": "添加",
1138
1177
  "share.addPeopleEmail": "通过电子邮件添加人员",
1139
1178
  "share.addPeopleOrganization": "从您的组织添加人员",
@@ -1218,6 +1257,9 @@ const messages: ToolkitAgentChatTranslation = {
1218
1257
  "tool.failedWithoutDetails": "没有可用的错误详情。",
1219
1258
  "tool.input": "输入",
1220
1259
  "tool.inputWithLabel": "输入 - {{label}}",
1260
+ "tool.identifierHidden": "[标识符已隐藏]",
1261
+ "tool.contentOmitted": "[内容已省略]",
1262
+ "tool.circularReference": "[循环引用]",
1221
1263
  "tool.interrupted":
1222
1264
  "在完成报告前被中断——操作可能已经完成,也可能尚未完成。重试前请先检查。",
1223
1265
  "tool.longRunning": "仍在处理。大型更新可能需要一两分钟。",
@@ -1138,6 +1138,46 @@ const messages: ToolkitAgentChatTranslation = {
1138
1138
  "setup.keyProvider": "API 金鑰供應商",
1139
1139
  "setup.keySaveFailed": "無法儲存金鑰。",
1140
1140
  "setup.storedSecurely": "僅為這個應用程式安全儲存。",
1141
+ "accessGate.deniedTitle": "你沒有存取權",
1142
+ "accessGate.deniedDescription": "請擁有者與你共用。",
1143
+ "accessGate.missingTitle": "此內容不存在",
1144
+ "accessGate.missingDescription": "連結可能有誤,或內容已被刪除。",
1145
+ "accessGate.trashedTitle": "此內容在垃圾桶中",
1146
+ "accessGate.trashedDescription": "還原後即可再次開啟。",
1147
+ "accessGate.signedOutTitle": "登入以繼續",
1148
+ "accessGate.signedOutDescription": "請使用具有存取權的帳號登入。",
1149
+ "accessGate.signIn": "登入",
1150
+ "accessGate.signedInAs": "目前登入帳號:{{email}}",
1151
+ "accessGate.switchAccount": "切換帳號",
1152
+ "accessGate.requestDescription": "申請存取權後,擁有者會收到通知。",
1153
+ "accessGate.requestSent": "申請已傳送,已通知擁有者。",
1154
+ "accessGate.requestAccess": "申請存取權",
1155
+ "accessGate.requestNoteLabel": "備註(選填)",
1156
+ "accessGate.requestNotePlaceholder": "為擁有者新增備註",
1157
+ "accessGate.sendRequest": "傳送申請",
1158
+ "accessGate.cancel": "取消",
1159
+ "accessGate.requestRateLimited": "目前要求過多,請稍後再試。",
1160
+ "accessGate.requestFailed": "無法傳送你的申請,請再試一次。",
1161
+ "accessGate.signedOutRequestDescription": "登入後即可申請存取權。",
1162
+ "accessRequest.title": "{{name}} 正在申請存取權",
1163
+ "accessRequest.approvedTitle": "已允許存取",
1164
+ "accessRequest.declinedTitle": "申請已拒絕",
1165
+ "accessRequest.allow": "允許",
1166
+ "accessRequest.decline": "拒絕",
1167
+ "accessRequest.unavailableTitle": "你無法審核此申請",
1168
+ "accessRequest.unavailableDescription":
1169
+ "申請可能已被撤回,或此帳號無權管理存取權。",
1170
+ "accessRequest.loadFailed": "無法載入此申請。",
1171
+ "accessRequest.retry": "重試",
1172
+ "accessRequest.decisionFailed": "無法儲存你的決定,請再試一次。",
1173
+ "accessRequest.stale": "其他人已處理此申請,或申請已有變更。",
1174
+ "share.accessRequests": "存取申請",
1175
+ "share.accessRequestsLoadFailed": "無法載入存取申請。",
1176
+ "share.accessRequestsNewest": "顯示最新的 {{count}} 筆申請。",
1177
+ "accessRequest.emailFailed":
1178
+ "{{name}} 已取得存取權,但無法寄送電子郵件給對方。",
1179
+ "share.allowRequestFrom": "允許 {{name}}",
1180
+ "share.declineRequestFrom": "拒絕 {{name}}",
1141
1181
  "share.add": "加入",
1142
1182
  "share.addPeopleEmail": "透過電子郵件加入人員",
1143
1183
  "share.addPeopleOrganization": "從您的組織加入人員",
@@ -1222,6 +1262,9 @@ const messages: ToolkitAgentChatTranslation = {
1222
1262
  "tool.failedWithoutDetails": "沒有可用的錯誤詳細資料。",
1223
1263
  "tool.input": "輸入",
1224
1264
  "tool.inputWithLabel": "輸入 - {{label}}",
1265
+ "tool.identifierHidden": "[識別碼已隱藏]",
1266
+ "tool.contentOmitted": "[內容已省略]",
1267
+ "tool.circularReference": "[循環參照]",
1225
1268
  "tool.interrupted":
1226
1269
  "在完成回報前遭到中斷——操作可能已完成,也可能尚未完成。重試前請先檢查。",
1227
1270
  "tool.longRunning": "仍在處理。大型更新可能需要一兩分鐘。",
@@ -1,423 +1,4 @@
1
- import { useEffect, useRef } from "react";
2
-
3
- const vertexShader = `
4
- attribute vec2 position;
5
- void main() {
6
- gl_Position = vec4(position, 0.0, 1.0);
7
- }
8
- `;
9
-
10
- const fragmentShader = `
11
- precision highp float;
12
-
13
- uniform float iTime;
14
- uniform vec2 iResolution;
15
- uniform vec3 uPointer;
16
- uniform vec3 uFgColor;
17
- uniform vec3 uBgColor;
18
- uniform float uBrightness;
19
- uniform float uTransparent;
20
-
21
- #define S(a, b, t) smoothstep(a, b, t)
22
-
23
- const float WAVE_COUNT = 5.;
24
- const float WAVE_SCALE = 5.5;
25
- const float FLOW_ANGLE = 119.;
26
- const float WARP = 0.35;
27
- const float SPEED = 0.65;
28
- const float FOCUS_FOLLOW = 0.65;
29
- const vec2 FOCUS = vec2(0., -0.05);
30
- const float SPREAD = 1.2;
31
- const float DOT_DENSITY = 131.;
32
- const float DOT_SCALE = 1.35;
33
- const float GLOW = 1.;
34
- const float SEED = 56.;
35
- const float VIGNETTE = 1.7;
36
- const float TONE_GAMMA = 2.6;
37
- const float FADE_IN_SECONDS = 0.7;
38
-
39
- float N21(vec2 p) {
40
- p += SEED;
41
- vec3 a = fract(vec3(p.xyx) * vec3(213.897, 653.453, 253.098));
42
- a += dot(a, a.yzx + 79.76);
43
- return fract((a.x + a.y) * a.z);
44
- }
45
-
46
- float valueNoise(vec2 p) {
47
- vec2 cell = floor(p);
48
- vec2 f = fract(p);
49
- float a = N21(cell);
50
- float b = N21(cell + vec2(1., 0.));
51
- float c = N21(cell + vec2(0., 1.));
52
- float d = N21(cell + vec2(1., 1.));
53
- vec2 u = f * f * (3. - 2. * f);
54
- return mix(a, b, u.x) + (c - a) * u.y * (1. - u.x) + (d - b) * u.x * u.y;
55
- }
56
-
57
- float waveField(vec2 p, float t) {
58
- float angle = radians(FLOW_ANGLE);
59
- vec2 dir = vec2(cos(angle), sin(angle));
60
- vec2 perp = vec2(-dir.y, dir.x);
61
- vec2 warpUv = p * 1.1 + vec2(t * 0.14, t * 0.1);
62
- float n1 = valueNoise(warpUv);
63
- float n2 = valueNoise(warpUv + 5.2);
64
- vec2 warped = p + (vec2(n1, n2) - 0.5) * WARP;
65
- float along = dot(warped, dir);
66
- float across = dot(warped, perp);
67
- float field = 0.;
68
- float weight = 0.;
69
- for (float i = 0.; i < WAVE_COUNT; i += 1.) {
70
- float amp = 1. / (1. + i * 0.8);
71
- float freq = WAVE_SCALE * (1. + i * 0.55);
72
- float drift = t * (1. + i * 0.23) + i * 2.399963;
73
- float cross = sin(across * freq * 0.45 - drift * 0.7);
74
- field += amp * sin(along * freq + drift + cross * 1.3);
75
- weight += amp;
76
- }
77
- return clamp(field / max(weight, 0.001) * 0.5 + 0.5, 0., 1.);
78
- }
79
-
80
- void mainImage(out vec4 fragColor, in vec2 fragCoord) {
81
- vec2 uv = (fragCoord - iResolution.xy * .5) / iResolution.y;
82
- vec2 pointerUv = (uPointer.xy - iResolution.xy * .5) / iResolution.y;
83
- float t = iTime * SPEED;
84
- float cellSize = 1. / DOT_DENSITY;
85
- vec2 cell = floor(uv / cellSize);
86
- vec2 cellCenter = (cell + 0.5) * cellSize;
87
- vec2 cellUv = (uv - cellCenter) / cellSize;
88
- float tone = waveField(cellCenter, t);
89
- vec2 focus = FOCUS + (pointerUv - FOCUS) * FOCUS_FOLLOW * uPointer.z;
90
- float distFromFocus = length(cellCenter - focus) / SPREAD;
91
- tone *= exp(-1.6 * distFromFocus * distFromFocus);
92
- tone = pow(clamp(tone, 0., 1.), TONE_GAMMA);
93
- float radius = sqrt(tone) * 0.5 * DOT_SCALE;
94
- float px = (1. / iResolution.y) / cellSize;
95
- float edge = max(px * 1.2, 0.004);
96
- float dist = length(cellUv);
97
- float dotMask = step(0.0001, tone) * (1. - S(radius - edge, radius + edge, dist));
98
- float glowTerm = (1. - S(radius, radius + GLOW * 0.9, dist)) * GLOW * tone;
99
- float value = clamp(dotMask + glowTerm * 0.6, 0., 1.);
100
- value *= clamp(1. - dot(uv, uv) * VIGNETTE, 0., 1.);
101
- value *= S(0., FADE_IN_SECONDS, iTime);
102
- vec3 lit = mix(uBgColor, uFgColor, value);
103
- lit += (uFgColor - uBgColor) * value * tone * (uBrightness - 1.);
104
- if (uTransparent > 0.5) {
105
- float alpha = clamp(value, 0., 1.);
106
- vec3 waveColor = uBgColor + (uFgColor - uBgColor) * (1. + tone * (uBrightness - 1.));
107
- fragColor = vec4(clamp(waveColor, 0., 1.) * alpha, alpha);
108
- } else {
109
- fragColor = vec4(clamp(lit, 0., 1.), 1.);
110
- }
111
- }
112
-
113
- void main() {
114
- mainImage(gl_FragColor, gl_FragCoord.xy);
115
- }
116
- `;
117
-
118
- let shaderEpoch = 0;
119
-
120
- export interface StarfieldBackgroundProps {
121
- className?: string;
122
- frameRate?: number;
123
- transparent?: boolean;
124
- }
125
-
126
- export function StarfieldBackground({
127
- className = "",
128
- frameRate = 30,
129
- transparent = false,
130
- }: StarfieldBackgroundProps) {
131
- const containerRef = useRef<HTMLDivElement>(null);
132
- const canvasRef = useRef<HTMLCanvasElement>(null);
133
- const rafRef = useRef<number>(0);
134
-
135
- useEffect(() => {
136
- const canvasRaw = canvasRef.current;
137
- const containerRaw = containerRef.current;
138
- if (!canvasRaw || !containerRaw) return;
139
- const canvas: HTMLCanvasElement = canvasRaw;
140
- const container: HTMLElement = containerRaw;
141
-
142
- const glRaw = canvas.getContext("webgl", {
143
- alpha: transparent,
144
- antialias: false,
145
- preserveDrawingBuffer: false,
146
- });
147
- if (!glRaw) return;
148
- const gl: WebGLRenderingContext = glRaw;
149
-
150
- function compileShader(type: number, src: string) {
151
- const shader = gl.createShader(type);
152
- if (!shader) return null;
153
- gl.shaderSource(shader, src);
154
- gl.compileShader(shader);
155
- if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
156
- console.error(gl.getShaderInfoLog(shader));
157
- gl.deleteShader(shader);
158
- return null;
159
- }
160
- return shader;
161
- }
162
-
163
- const vs = compileShader(gl.VERTEX_SHADER, vertexShader);
164
- const fs = compileShader(gl.FRAGMENT_SHADER, fragmentShader);
165
- if (!vs || !fs) return;
166
-
167
- const program = gl.createProgram();
168
- if (!program) return;
169
- gl.attachShader(program, vs);
170
- gl.attachShader(program, fs);
171
- gl.linkProgram(program);
172
- if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
173
- console.error(gl.getProgramInfoLog(program));
174
- gl.deleteProgram(program);
175
- gl.deleteShader(vs);
176
- gl.deleteShader(fs);
177
- return;
178
- }
179
- gl.useProgram(program);
180
-
181
- const buf = gl.createBuffer();
182
- if (!buf) {
183
- gl.deleteProgram(program);
184
- gl.deleteShader(vs);
185
- gl.deleteShader(fs);
186
- return;
187
- }
188
- gl.bindBuffer(gl.ARRAY_BUFFER, buf);
189
- gl.bufferData(
190
- gl.ARRAY_BUFFER,
191
- new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]),
192
- gl.STATIC_DRAW,
193
- );
194
- const pos = gl.getAttribLocation(program, "position");
195
- gl.enableVertexAttribArray(pos);
196
- gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 0, 0);
197
-
198
- const uTime = gl.getUniformLocation(program, "iTime");
199
- const uRes = gl.getUniformLocation(program, "iResolution");
200
- const uPointer = gl.getUniformLocation(program, "uPointer");
201
- const uFgColor = gl.getUniformLocation(program, "uFgColor");
202
- const uBgColor = gl.getUniformLocation(program, "uBgColor");
203
- const uBrightness = gl.getUniformLocation(program, "uBrightness");
204
- const uTransparent = gl.getUniformLocation(program, "uTransparent");
205
- const reducedMotionQuery =
206
- typeof window.matchMedia === "function"
207
- ? window.matchMedia("(prefers-reduced-motion: reduce)")
208
- : null;
209
- let reducedMotion = reducedMotionQuery?.matches ?? false;
210
-
211
- let dpr = 1;
212
- let hasPointer = false;
213
- let pointerX = 0;
214
- let pointerY = 0;
215
- let pointerStrength = 0;
216
- let targetX = 0;
217
- let targetY = 0;
218
- let targetStrength = 0;
219
-
220
- function readDarkMode() {
221
- const root = document.documentElement;
222
- if (root.classList.contains("dark")) return true;
223
- if (root.classList.contains("light")) return false;
224
- const dataTheme = root.getAttribute("data-theme");
225
- if (dataTheme === "dark") return true;
226
- if (dataTheme === "light") return false;
227
- return (
228
- window.matchMedia?.("(prefers-color-scheme: dark)").matches ?? false
229
- );
230
- }
231
-
232
- function readTheme() {
233
- const dark = readDarkMode();
234
- return dark
235
- ? {
236
- bg: [10 / 255, 10 / 255, 10 / 255] as [number, number, number],
237
- fg: [174 / 255, 173 / 255, 172 / 255] as [number, number, number],
238
- brightness: 3,
239
- }
240
- : {
241
- bg: [250 / 255, 249 / 255, 245 / 255] as [number, number, number],
242
- fg: [0, 103 / 255, 127 / 255] as [number, number, number],
243
- brightness: 1.15,
244
- };
245
- }
246
-
247
- let theme = readTheme();
248
-
249
- function easePointer(allowPointer: boolean) {
250
- if (!allowPointer) {
251
- pointerStrength = 0;
252
- return;
253
- }
254
- pointerX += (targetX - pointerX) * 0.12;
255
- pointerY += (targetY - pointerY) * 0.12;
256
- pointerStrength += (targetStrength - pointerStrength) * 0.08;
257
- if (pointerStrength < 0.001 && targetStrength === 0) {
258
- pointerStrength = 0;
259
- }
260
- }
261
-
262
- function draw(timeSeconds: number, allowPointer = !reducedMotion) {
263
- easePointer(allowPointer);
264
- gl.uniform1f(uTime, timeSeconds);
265
- gl.uniform2f(uRes, canvas.width, canvas.height);
266
- gl.uniform3f(uPointer, pointerX, pointerY, pointerStrength);
267
- gl.uniform3f(uFgColor, theme.fg[0], theme.fg[1], theme.fg[2]);
268
- gl.uniform3f(uBgColor, theme.bg[0], theme.bg[1], theme.bg[2]);
269
- gl.uniform1f(uBrightness, theme.brightness);
270
- gl.uniform1f(uTransparent, transparent ? 1 : 0);
271
- gl.drawArrays(gl.TRIANGLES, 0, 6);
272
- }
273
-
274
- function resize() {
275
- const w = container.clientWidth;
276
- const h = container.clientHeight;
277
- dpr = Math.min(window.devicePixelRatio, 1.5);
278
- canvas.width = w * dpr;
279
- canvas.height = h * dpr;
280
- canvas.style.width = w + "px";
281
- canvas.style.height = h + "px";
282
- gl.viewport(0, 0, canvas.width, canvas.height);
283
- if (!hasPointer) {
284
- pointerX = targetX = canvas.width * 0.5;
285
- pointerY = targetY = canvas.height * 0.5;
286
- }
287
- }
288
-
289
- function handlePointerMove(event: PointerEvent | MouseEvent) {
290
- const rect = container.getBoundingClientRect();
291
- if (rect.width <= 0 || rect.height <= 0) return;
292
-
293
- const x = event.clientX - rect.left;
294
- const y = event.clientY - rect.top;
295
- const inside = x >= 0 && x <= rect.width && y >= 0 && y <= rect.height;
296
-
297
- hasPointer = true;
298
- targetX = x * dpr;
299
- targetY = (rect.height - y) * dpr;
300
- targetStrength = inside ? 1 : 0;
301
- }
302
-
303
- function fadePointer() {
304
- targetStrength = 0;
305
- }
306
-
307
- resize();
308
- window.addEventListener("resize", resize);
309
- window.addEventListener("pointermove", handlePointerMove, {
310
- passive: true,
311
- });
312
- window.addEventListener("mousemove", handlePointerMove, {
313
- passive: true,
314
- });
315
- document.addEventListener("pointerleave", fadePointer, {
316
- passive: true,
317
- });
318
- window.addEventListener("blur", fadePointer);
319
-
320
- const observer = new MutationObserver(() => {
321
- theme = readTheme();
322
- if (reducedMotion) draw(20, false);
323
- });
324
- observer.observe(document.documentElement, {
325
- attributes: true,
326
- attributeFilter: ["class", "data-theme"],
327
- });
328
-
329
- if (!shaderEpoch) shaderEpoch = performance.now();
330
- const startTime = shaderEpoch;
331
- let lastFrame = 0;
332
- const frameBudget = 1000 / Math.max(1, frameRate);
333
- const reducedMotionStaticTime = 20;
334
-
335
- function render(now: number) {
336
- if (reducedMotion) {
337
- rafRef.current = 0;
338
- return;
339
- }
340
- rafRef.current = requestAnimationFrame(render);
341
-
342
- if (now - lastFrame < frameBudget) return;
343
- lastFrame = now;
344
-
345
- const rect = container.getBoundingClientRect();
346
- if (rect.bottom < 0 || rect.top > window.innerHeight) return;
347
-
348
- draw((now - startTime) * 0.001);
349
- }
350
-
351
- function startAnimation() {
352
- if (!rafRef.current) {
353
- rafRef.current = requestAnimationFrame(render);
354
- }
355
- }
356
-
357
- function stopAnimation() {
358
- if (rafRef.current) {
359
- cancelAnimationFrame(rafRef.current);
360
- rafRef.current = 0;
361
- }
362
- }
363
-
364
- function handleReducedMotionChange() {
365
- reducedMotion = reducedMotionQuery?.matches ?? false;
366
- if (reducedMotion) {
367
- stopAnimation();
368
- lastFrame = 0;
369
- draw(reducedMotionStaticTime, false);
370
- } else {
371
- startAnimation();
372
- }
373
- }
374
-
375
- draw(
376
- reducedMotion
377
- ? reducedMotionStaticTime
378
- : (performance.now() - startTime) * 0.001,
379
- !reducedMotion,
380
- );
381
- if (reducedMotionQuery) {
382
- reducedMotionQuery.addEventListener("change", handleReducedMotionChange);
383
- }
384
- if (!reducedMotion) startAnimation();
385
-
386
- return () => {
387
- stopAnimation();
388
- if (reducedMotionQuery) {
389
- reducedMotionQuery.removeEventListener(
390
- "change",
391
- handleReducedMotionChange,
392
- );
393
- }
394
- observer.disconnect();
395
- window.removeEventListener("resize", resize);
396
- window.removeEventListener("pointermove", handlePointerMove);
397
- window.removeEventListener("mousemove", handlePointerMove);
398
- document.removeEventListener("pointerleave", fadePointer);
399
- window.removeEventListener("blur", fadePointer);
400
- gl.deleteProgram(program);
401
- gl.deleteShader(vs);
402
- gl.deleteShader(fs);
403
- gl.deleteBuffer(buf);
404
- gl.getExtension("WEBGL_lose_context")?.loseContext();
405
- };
406
- }, [frameRate, transparent]);
407
-
408
- return (
409
- <div
410
- ref={containerRef}
411
- aria-hidden="true"
412
- className={className}
413
- style={{ width: "100%", height: "100%", pointerEvents: "none" }}
414
- data-agent-native-starfield
415
- data-agent-native-starfield-transparent={transparent ? "true" : undefined}
416
- >
417
- <canvas
418
- ref={canvasRef}
419
- style={{ display: "block", width: "100%", height: "100%" }}
420
- />
421
- </div>
422
- );
423
- }
1
+ export {
2
+ WebGlWaveBackground as StarfieldBackground,
3
+ type WebGlWaveBackgroundProps as StarfieldBackgroundProps,
4
+ } from "./WebGlWaveBackground.js";
@@ -0,0 +1,104 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { readFileSync } from "node:fs";
4
+ import { resolve } from "node:path";
5
+
6
+ import { act, cleanup, render, screen, waitFor } from "@testing-library/react";
7
+ import { afterEach, describe, expect, it, vi } from "vitest";
8
+
9
+ import { WaveBackground } from "./WaveBackground.js";
10
+
11
+ const { oceanMount, oceanReady, probeWebgpuSupport, webGlMount } = vi.hoisted(
12
+ () => ({
13
+ oceanMount: vi.fn(),
14
+ oceanReady: { current: undefined as (() => void) | undefined },
15
+ probeWebgpuSupport: vi.fn(),
16
+ webGlMount: vi.fn(),
17
+ }),
18
+ );
19
+
20
+ vi.mock("./WebGlWaveBackground.js", () => ({
21
+ WebGlWaveBackground: () => {
22
+ webGlMount();
23
+ return <div data-agent-native-wave="true" data-testid="webgl-wave" />;
24
+ },
25
+ }));
26
+
27
+ vi.mock("./ocean/hero-ocean-background.js", () => ({
28
+ HeroOceanBackground: ({ onReady }: { onReady: () => void }) => {
29
+ oceanMount();
30
+ oceanReady.current = onReady;
31
+ return <div data-agent-native-wave="true" data-testid="ocean-wave" />;
32
+ },
33
+ }));
34
+
35
+ vi.mock("./ocean/webgpu-support.js", () => ({ probeWebgpuSupport }));
36
+
37
+ const repoRoot = resolve(process.cwd(), "../..");
38
+
39
+ afterEach(() => {
40
+ cleanup();
41
+ vi.unstubAllGlobals();
42
+ vi.clearAllMocks();
43
+ oceanReady.current = undefined;
44
+ });
45
+
46
+ describe("WaveBackground", () => {
47
+ it("keeps signup, homepage, and Calendar booking on the shared renderer", () => {
48
+ const consumers = [
49
+ resolve(repoRoot, "packages/toolkit/src/app/auth/AuthPage.tsx"),
50
+ resolve(
51
+ repoRoot,
52
+ "packages/docs/app/components/website-redesign/hero-background.tsx",
53
+ ),
54
+ resolve(repoRoot, "templates/calendar/app/pages/BookingPage.tsx"),
55
+ ];
56
+
57
+ for (const path of consumers) {
58
+ const source = readFileSync(path, "utf8");
59
+ expect(source, path).toContain("WaveBackground");
60
+ expect(source, path).not.toMatch(
61
+ /StarfieldBackground|HeroOceanBackground|HeroShaderBackground/,
62
+ );
63
+ }
64
+ });
65
+
66
+ it("keeps the WebGL wave visible while checking WebGPU support", () => {
67
+ probeWebgpuSupport.mockReturnValue(new Promise(() => {}));
68
+
69
+ render(<WaveBackground className="fixed inset-0" />);
70
+
71
+ expect(screen.getByTestId("webgl-wave")).toBeDefined();
72
+ expect(webGlMount).toHaveBeenCalledOnce();
73
+ expect(oceanMount).not.toHaveBeenCalled();
74
+ });
75
+
76
+ it("keeps the WebGL wave until the Calendar ocean draws its first frame", async () => {
77
+ probeWebgpuSupport.mockResolvedValue("supported");
78
+
79
+ render(<WaveBackground />);
80
+
81
+ expect(screen.getByTestId("webgl-wave")).toBeDefined();
82
+ await waitFor(() => expect(screen.getByTestId("ocean-wave")).toBeDefined());
83
+ expect(screen.getByTestId("webgl-wave")).toBeDefined();
84
+ expect(oceanMount).toHaveBeenCalledOnce();
85
+
86
+ act(() => oceanReady.current?.());
87
+
88
+ await waitFor(() => expect(screen.queryByTestId("webgl-wave")).toBeNull());
89
+ });
90
+
91
+ it.each(["unsupported", "probe-failed"] as const)(
92
+ "keeps the WebGL wave when WebGPU is %s",
93
+ async (support) => {
94
+ probeWebgpuSupport.mockResolvedValue(support);
95
+
96
+ render(<WaveBackground />);
97
+
98
+ await waitFor(() =>
99
+ expect(screen.getByTestId("webgl-wave")).toBeDefined(),
100
+ );
101
+ expect(oceanMount).not.toHaveBeenCalled();
102
+ },
103
+ );
104
+ });