diff --git a/.changeset/slow-lamps-exist.md b/.changeset/slow-lamps-exist.md new file mode 100644 index 000000000..8d86b4d3a --- /dev/null +++ b/.changeset/slow-lamps-exist.md @@ -0,0 +1,5 @@ +--- +"@read-frog/extension": patch +--- + +fix(page-translation): only prime webpage context for AI-aware title translation diff --git a/package.json b/package.json index 3ebf66736..36f3e14ea 100644 --- a/package.json +++ b/package.json @@ -30,27 +30,27 @@ "prepare": "husky" }, "dependencies": { - "@ai-sdk/alibaba": "^1.0.13", - "@ai-sdk/amazon-bedrock": "^4.0.87", - "@ai-sdk/anthropic": "^3.0.64", - "@ai-sdk/cerebras": "^2.0.41", - "@ai-sdk/cohere": "^3.0.27", - "@ai-sdk/deepinfra": "^2.0.41", - "@ai-sdk/deepseek": "^2.0.26", - "@ai-sdk/fireworks": "^2.0.42", - "@ai-sdk/google": "^3.0.55", - "@ai-sdk/groq": "^3.0.32", - "@ai-sdk/huggingface": "^1.0.39", - "@ai-sdk/mistral": "^3.0.27", - "@ai-sdk/moonshotai": "^2.0.12", - "@ai-sdk/openai": "^3.0.49", - "@ai-sdk/openai-compatible": "^2.0.37", - "@ai-sdk/perplexity": "^3.0.26", - "@ai-sdk/react": "^3.0.145", - "@ai-sdk/replicate": "^2.0.26", - "@ai-sdk/togetherai": "^2.0.41", - "@ai-sdk/vercel": "^2.0.39", - "@ai-sdk/xai": "^3.0.75", + "@ai-sdk/alibaba": "^1.0.17", + "@ai-sdk/amazon-bedrock": "^4.0.92", + "@ai-sdk/anthropic": "^3.0.68", + "@ai-sdk/cerebras": "^2.0.45", + "@ai-sdk/cohere": "^3.0.30", + "@ai-sdk/deepinfra": "^2.0.45", + "@ai-sdk/deepseek": "^2.0.29", + "@ai-sdk/fireworks": "^2.0.46", + "@ai-sdk/google": "^3.0.60", + "@ai-sdk/groq": "^3.0.35", + "@ai-sdk/huggingface": "^1.0.43", + "@ai-sdk/mistral": "^3.0.30", + "@ai-sdk/moonshotai": "^2.0.16", + "@ai-sdk/openai": "^3.0.52", + "@ai-sdk/openai-compatible": "^2.0.41", + "@ai-sdk/perplexity": "^3.0.29", + "@ai-sdk/react": "^3.0.156", + "@ai-sdk/replicate": "^2.0.29", + "@ai-sdk/togetherai": "^2.0.45", + "@ai-sdk/vercel": "^2.0.43", + "@ai-sdk/xai": "^3.0.82", "@base-ui/react": "^1.3.0", "@codemirror/lang-css": "^6.3.1", "@codemirror/lang-json": "^6.0.2", @@ -82,7 +82,7 @@ "@uiw/react-codemirror": "^4.25.9", "@webext-core/messaging": "^2.3.0", "@wxt-dev/i18n": "^0.2.5", - "ai": "^6.0.143", + "ai": "^6.0.154", "better-auth": "^1.5.6", "case-anything": "^3.1.2", "class-variance-authority": "^0.7.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a946fd541..12893a4f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,68 +9,68 @@ importers: .: dependencies: '@ai-sdk/alibaba': - specifier: ^1.0.13 - version: 1.0.13(zod@4.3.6) + specifier: ^1.0.17 + version: 1.0.17(zod@4.3.6) '@ai-sdk/amazon-bedrock': - specifier: ^4.0.87 - version: 4.0.87(zod@4.3.6) + specifier: ^4.0.92 + version: 4.0.92(zod@4.3.6) '@ai-sdk/anthropic': - specifier: ^3.0.64 - version: 3.0.64(zod@4.3.6) + specifier: ^3.0.68 + version: 3.0.68(zod@4.3.6) '@ai-sdk/cerebras': - specifier: ^2.0.41 - version: 2.0.41(zod@4.3.6) + specifier: ^2.0.45 + version: 2.0.45(zod@4.3.6) '@ai-sdk/cohere': - specifier: ^3.0.27 - version: 3.0.27(zod@4.3.6) + specifier: ^3.0.30 + version: 3.0.30(zod@4.3.6) '@ai-sdk/deepinfra': - specifier: ^2.0.41 - version: 2.0.41(zod@4.3.6) + specifier: ^2.0.45 + version: 2.0.45(zod@4.3.6) '@ai-sdk/deepseek': - specifier: ^2.0.26 - version: 2.0.26(zod@4.3.6) + specifier: ^2.0.29 + version: 2.0.29(zod@4.3.6) '@ai-sdk/fireworks': - specifier: ^2.0.42 - version: 2.0.42(zod@4.3.6) + specifier: ^2.0.46 + version: 2.0.46(zod@4.3.6) '@ai-sdk/google': - specifier: ^3.0.55 - version: 3.0.55(zod@4.3.6) + specifier: ^3.0.60 + version: 3.0.60(zod@4.3.6) '@ai-sdk/groq': - specifier: ^3.0.32 - version: 3.0.32(zod@4.3.6) + specifier: ^3.0.35 + version: 3.0.35(zod@4.3.6) '@ai-sdk/huggingface': - specifier: ^1.0.39 - version: 1.0.39(zod@4.3.6) + specifier: ^1.0.43 + version: 1.0.43(zod@4.3.6) '@ai-sdk/mistral': - specifier: ^3.0.27 - version: 3.0.27(zod@4.3.6) + specifier: ^3.0.30 + version: 3.0.30(zod@4.3.6) '@ai-sdk/moonshotai': - specifier: ^2.0.12 - version: 2.0.12(zod@4.3.6) + specifier: ^2.0.16 + version: 2.0.16(zod@4.3.6) '@ai-sdk/openai': - specifier: ^3.0.49 - version: 3.0.49(zod@4.3.6) + specifier: ^3.0.52 + version: 3.0.52(zod@4.3.6) '@ai-sdk/openai-compatible': - specifier: ^2.0.37 - version: 2.0.37(zod@4.3.6) + specifier: ^2.0.41 + version: 2.0.41(zod@4.3.6) '@ai-sdk/perplexity': - specifier: ^3.0.26 - version: 3.0.26(zod@4.3.6) + specifier: ^3.0.29 + version: 3.0.29(zod@4.3.6) '@ai-sdk/react': - specifier: ^3.0.145 - version: 3.0.145(react@19.2.4)(zod@4.3.6) + specifier: ^3.0.156 + version: 3.0.156(react@19.2.4)(zod@4.3.6) '@ai-sdk/replicate': - specifier: ^2.0.26 - version: 2.0.26(zod@4.3.6) + specifier: ^2.0.29 + version: 2.0.29(zod@4.3.6) '@ai-sdk/togetherai': - specifier: ^2.0.41 - version: 2.0.41(zod@4.3.6) + specifier: ^2.0.45 + version: 2.0.45(zod@4.3.6) '@ai-sdk/vercel': - specifier: ^2.0.39 - version: 2.0.39(zod@4.3.6) + specifier: ^2.0.43 + version: 2.0.43(zod@4.3.6) '@ai-sdk/xai': - specifier: ^3.0.75 - version: 3.0.75(zod@4.3.6) + specifier: ^3.0.82 + version: 3.0.82(zod@4.3.6) '@base-ui/react': specifier: ^1.3.0 version: 1.3.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -118,7 +118,7 @@ importers: version: 0.6.0 '@openrouter/ai-sdk-provider': specifier: ^2.3.3 - version: 2.3.3(ai@6.0.143(zod@4.3.6))(zod@4.3.6) + version: 2.3.3(ai@6.0.154(zod@4.3.6))(zod@4.3.6) '@orpc/client': specifier: ^1.13.13 version: 1.13.13(@opentelemetry/api@1.9.1) @@ -165,8 +165,8 @@ importers: specifier: ^0.2.5 version: 0.2.5(wxt@0.20.20(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(eslint@10.1.0(jiti@2.6.1))(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.53.2)(yaml@2.8.3)) ai: - specifier: ^6.0.143 - version: 6.0.143(zod@4.3.6) + specifier: ^6.0.154 + version: 6.0.154(zod@4.3.6) better-auth: specifier: ^1.5.6 version: 1.5.6(@opentelemetry/api@1.9.1)(mongodb@7.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(jsdom@29.0.1(@noble/hashes@2.0.1))(msw@2.12.14(@types/node@25.5.0)(typescript@6.0.2))(vite@8.0.5(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.2)(jiti@2.6.1)(yaml@2.8.3))) @@ -214,7 +214,7 @@ importers: version: 0.11.1 ollama-ai-provider-v2: specifier: ^3.5.0 - version: 3.5.0(ai@6.0.143(zod@4.3.6))(zod@4.3.6) + version: 3.5.0(ai@6.0.154(zod@4.3.6))(zod@4.3.6) posthog-js: specifier: ^1.364.6 version: 1.364.6 @@ -393,14 +393,14 @@ packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@ai-sdk/alibaba@1.0.13': - resolution: {integrity: sha512-L6TxDthd8fa0msQCAFIvV8TX7aBF8SJCSYSivo8mVf7Zl2axsFr8Ad1dfyXmCyoK64UJbsqOzLXgJqkHUQWMsA==} + '@ai-sdk/alibaba@1.0.17': + resolution: {integrity: sha512-ZbE+U5bWz2JBc5DERLowx5+TKbjGBE93LqKZAWvuEn7HOSQMraxFMZuc0ST335QZJAyfBOzh7m1mPQ+y7EaaoA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/amazon-bedrock@4.0.87': - resolution: {integrity: sha512-Deo3zkkTTk4rzxTAL2UQOKB1RT9X/H1k/1S0Zt4IXqxzz+PGcMsO57IwcQmUOreYy9ZwN6AVmdzTYnMlQ1wk1w==} + '@ai-sdk/amazon-bedrock@4.0.92': + resolution: {integrity: sha512-v3Itukx0HHWorcWb9Xh2E7kQKrYSf7uln7EtXwfBsywZtpkWepxbd+3RtK2FsY588Q831fohq7QO5vY7UvNckA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -411,92 +411,92 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@3.0.64': - resolution: {integrity: sha512-rwLi/Rsuj2pYniQXIrvClHvXDzgM4UQHHnvHTWEF14efnlKclG/1ghpNC+adsRujAbCTr6gRsSbDE2vEqriV7g==} + '@ai-sdk/anthropic@3.0.68': + resolution: {integrity: sha512-BAd+fmgYoJMmGw0/uV+jRlXX60PyGxelA6Clp4cK/NI0dsyv9jOOwzQmKNaz2nwb+Jz7HqI7I70KK4XtU5EcXQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/cerebras@2.0.41': - resolution: {integrity: sha512-kDMEpjaRdRXIUi1EH8WHwLRahyDTYv9SAJnP6VCCeq8X+tVqZbMLCqqxSG5dRknrI65ucjvzQt+FiDKTAa7AHg==} + '@ai-sdk/cerebras@2.0.45': + resolution: {integrity: sha512-GGDGTS9d073lamFVa3VGCPaGubWqIB6WlfKPv23PBd+/yQmBVC0f0vdZfyJs2xPpzdirSQWeE6PsXplMmkcLeA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/cohere@3.0.27': - resolution: {integrity: sha512-OqcCq2PiFY1dbK/0Ck45KuvE8jfdxRuuAE9Y5w46dAk6U+9vPOeg1CDcmR+ncqmrYrhRl3nmyDttyDahyjCzAw==} + '@ai-sdk/cohere@3.0.30': + resolution: {integrity: sha512-j3fe/6lUUkHPD/51OgMXN9UD7p1QSQEAlroIinmb3MhJ1s+O0MnqdRa30IM7dRHafNp0FQ9X4YpobY85iMknUQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/deepinfra@2.0.41': - resolution: {integrity: sha512-y6RoOP7DGWmDSiSxrUSt5p18sbz+Ixe5lMVPmdE7x+Tr5rlrzvftyHhjWHfqlAtoYERZTGFbP6tPW1OfQcrb4A==} + '@ai-sdk/deepinfra@2.0.45': + resolution: {integrity: sha512-CJeAoIBDwz+nxEgH1ivWaBGMqmDZuz/sgpuhNHFyrY/dYooXb0/vdkWV1SyQtEpHhJu5BUql+7A6gRh/2CL+FQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/deepseek@2.0.26': - resolution: {integrity: sha512-62bi03K+Uc6fBiS3sIrkHnJI+gOKENO95ldSIv5NkX+yjG449dU5gxhyoZR/eILZ83vwYHcQP+kX5UnhbWT87g==} + '@ai-sdk/deepseek@2.0.29': + resolution: {integrity: sha512-cn4+xV0menm/4JKEDElnVGiUilHvi6AD4ZK/sY7DXP/Wb7Yb3Vr86NyYM6mGBE/Shk3mWHoHbzggVnF5x0uMEA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/fireworks@2.0.42': - resolution: {integrity: sha512-AF8UxWqLRxpgAmlKs++v9WdjfnaPs5P+Vce2HUpDimX4eoA/t28fC6fihyFyh7AC5zb8IcxmhR9xQ7DVtmUT+A==} + '@ai-sdk/fireworks@2.0.46': + resolution: {integrity: sha512-XRKR0zgRyegdmtK5CDUEjlyRp0Fo+XVCdoG+301U1SGtgRIAYG3ObVtgzVJBVpJdHFSLHuYeLTnNiQoUxD7+FQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@3.0.85': - resolution: {integrity: sha512-oPvs3bYnxndBY/O0gFSFuc5aA/QKCJbk/CaJaRnKgA/ZPH17jeVvEtiUBE6/N8hWhK7XgX53NFI7F3CGmDfm1g==} + '@ai-sdk/gateway@3.0.94': + resolution: {integrity: sha512-uDDwLZhCkvC89crVS3S90D5L7AcVN8WriGuYVNYgVAaVcvy3Mthy3R9ICfzG75BObhz6pm2FWnhxDfNRK+t69Q==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/google@3.0.55': - resolution: {integrity: sha512-lIID7kDdeqzSR/eg+LrEFJGoe/mIwuW4eBdjS84Bi0cIY4cmGwSsvwYILSdiad0197Ha+DUbCxOUuSOnORUx7g==} + '@ai-sdk/google@3.0.60': + resolution: {integrity: sha512-ye/hG0LeO24VmjLbfgkFZV8V8k/l4nVBODutpJQkFPyUiGOCbFtFUTgxSeC7+njrk5+HhgyHrzJay4zmhwMH+w==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/groq@3.0.32': - resolution: {integrity: sha512-cKa+viBUgkY0GVWDAMYYOaRS+r9PNJvstfLujqi8YQSlpknQsE+J9TeG8b8bjkAnMnCpUd8s/ZEJHMuKzp+rYQ==} + '@ai-sdk/groq@3.0.35': + resolution: {integrity: sha512-LXoPwSKaqXst9LyLN2J7gK8n7RldQLbP2zsnBYxXcOsXKrtceksqtbsmGXujvab2TM9FisquAw/ZG2hTbD5vnQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/huggingface@1.0.39': - resolution: {integrity: sha512-QRhQfR2OEjPD7tHYAuOVVBoS6nYM/zayEF9/dP2Ow0UqsuZPCT7QcZ/cG9bBUnE0x5ol28a3h1hQIzfIUs+k3A==} + '@ai-sdk/huggingface@1.0.43': + resolution: {integrity: sha512-bEHZNmQNabbs7zYjRa7e0Hz1RFiVwm/hjfZ2YFwTFsxC0WmPSSvjyG5SqRM8DApbSC2EtGP5K/zO2IKEXZrYyQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4 - '@ai-sdk/mistral@3.0.27': - resolution: {integrity: sha512-ZXe7nZQgliDdjz5ufH5RKpHWxbN72AzmzzKGbF/z+0K9GN5tUCnftrQRvTRFHA5jAzTapcm2BEevmGLVbMkW+A==} + '@ai-sdk/mistral@3.0.30': + resolution: {integrity: sha512-+j4IXRSk9E661cFSafmIr+XHOzwjFagawwzMOlSqwL6U4Sq4PCFLDF+oHbX5NUqNjUL7FD1zi/9lBIfa41pUvw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/moonshotai@2.0.12': - resolution: {integrity: sha512-dW5wxbqMCaNrUb52GD7xuPcW4+Xnz+Eq7u3nn9vNdfhpclAqOcgzJ5Arn+HmY3SGcvNft6srOzsNBdVETyF6cg==} + '@ai-sdk/moonshotai@2.0.16': + resolution: {integrity: sha512-UR9btjE+hOlbBftkwTVb2crokPJrT7a4wcApgLpCp0tOp4P1ADM3ZteBN8PbnTIOez/a1m/TK/MuluYGqkgb2Q==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai-compatible@2.0.37': - resolution: {integrity: sha512-+POSFVcgiu47BK64dhsI6OpcDC0/VAE2ZSaXdXGNNhpC/ava++uSRJYks0k2bpfY0wwCTgpAWZsXn/dG2Yppiw==} + '@ai-sdk/openai-compatible@2.0.41': + resolution: {integrity: sha512-kNAGINk71AlOXx10Dq/PXw4t/9XjdK8uxfpVElRwtSFMdeSiLVt58p9TPx4/FJD+hxZuVhvxYj9r42osxWq79g==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@3.0.49': - resolution: {integrity: sha512-U2f0pCyNn/jQH3wjgxr8o9VvCkuDFTtXbIhbFFtgXqCzMbed6rBnvzQcAMEK0/Pa44byL9zfcvCOFOflvkRA8w==} + '@ai-sdk/openai@3.0.52': + resolution: {integrity: sha512-4Rr8NCGmfWTz6DCUvixn9UmyZcMatiHn0zWoMzI3JCUe9R1P/vsPOpCBALKoSzVYOjyJnhtnVIbfUKujcS39uw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/perplexity@3.0.26': - resolution: {integrity: sha512-dXzrVsLR5f6tr+U04jq4AXoRroGFBTvODnLgss0SWbzNjGGQg3XqtQ9j7rCLo6o8qbYGuAHvqUrIpUCuiscuFg==} + '@ai-sdk/perplexity@3.0.29': + resolution: {integrity: sha512-9UfV7ywpnxNLPI/hdheFPHXDdLG9vLqNoPSdRTPV+nPAX117zMtBmqD5KSvmXTjeF7IXpObUZ9bWzwMR/ewL1g==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -507,8 +507,8 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@4.0.21': - resolution: {integrity: sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw==} + '@ai-sdk/provider-utils@4.0.23': + resolution: {integrity: sha512-z8GlDaCmRSDlqkMF2f4/RFgWxdarvIbyuk+m6WXT1LYgsnGiXRJGTD2Z1+SDl3LqtFuRtGX1aghYvQLoHL/9pg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -537,32 +537,32 @@ packages: resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==} engines: {node: '>=18'} - '@ai-sdk/react@3.0.145': - resolution: {integrity: sha512-7EoGTTregQt+wDKC4cmWNnsm5DvfJfWA9+9wigFMGASxujverJICVHDpvCsWK7KBHn7WeohFrk7LziOuuhwCEQ==} + '@ai-sdk/react@3.0.156': + resolution: {integrity: sha512-/6rmGxOJlCNS6wJBUNsO49aeSK740fS2wVcA3Xn8IOBRFFz3hWm6auQTMoA0nHKu4hnH6ivA6hog6Ul+1Bv4Rg==} engines: {node: '>=18'} peerDependencies: react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1 - '@ai-sdk/replicate@2.0.26': - resolution: {integrity: sha512-T1xea0kGbpB2IBsE7tX9oTIjAWeKEQ893EXePQpQ10J+EXg3OdZNkzpmDtImS5Aivoy+gwl5QcqZci7Xd0vS2Q==} + '@ai-sdk/replicate@2.0.29': + resolution: {integrity: sha512-bRfowVPqwRZWwBfTiPbYNyoxl3sWBcbCWsQmCPJIbgpq0bVxW1lLLKTPt6VuJzgFGdCEZb3oragfu8xsyPt1XQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/togetherai@2.0.41': - resolution: {integrity: sha512-k3p9e3k0/gpDDyTtvafsK4HYR4D/aUQW/kzCwWo1+CzdBU84i4L14gWISC/mv6tgSicMXHcEUd521fPufQwNlg==} + '@ai-sdk/togetherai@2.0.45': + resolution: {integrity: sha512-+20Gruk4fF6FZxjMX7QT8PtFNNadBvBz2xgNDEf+O8uMpyi2FP11DOE9W2AShio/lh82Gjd8b7wxSC+RfxXnPg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/vercel@2.0.39': - resolution: {integrity: sha512-8eu3ljJpkCTP4ppcyYB+NcBrkcBoSOFthCSgk5VnjaxnDaOJFaxnPwfddM7wx3RwMk2CiK1O61Px/LlqNc7QkQ==} + '@ai-sdk/vercel@2.0.43': + resolution: {integrity: sha512-p6mP/BkoVY/moeHAZcP+87ajhxzWObCn/YBvY5IShs7hSpt02L2L586WfwtktViyaNRpSkqaz32G+bYEaQ/zyw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/xai@3.0.75': - resolution: {integrity: sha512-V8UKK4fNpI9cnrtsZBvUp9O9J6Y9fTKBRoSLyEaNGPirACewixmLDbXsSgAeownPVWiWpK34bFysd+XouI5Ywg==} + '@ai-sdk/xai@3.0.82': + resolution: {integrity: sha512-A0VFMufnVf4wODcT3SPQUUzvYXiIO1VhFuXj9r6z/vP4rlo+QRDPw3WSTchcz93ROQWSfBE3I6Szqz342OHi5w==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -666,8 +666,8 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/types@3.973.6': - resolution: {integrity: sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==} + '@aws-sdk/types@3.973.7': + resolution: {integrity: sha512-reXRwoJ6CfChoqAsBszUYajAF8Z2LRE+CRcKocvFSMpIiLOtYU3aJ9trmn6VVPAzbbY5LXF+FfmUslbXk1SYFg==} engines: {node: '>=20.0.0'} '@babel/code-frame@7.27.1': @@ -2607,8 +2607,8 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@smithy/eventstream-codec@4.2.12': - resolution: {integrity: sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA==} + '@smithy/eventstream-codec@4.2.13': + resolution: {integrity: sha512-vYahwBAtRaAcFbOmE9aLr12z7RiHYDSLcnogSdxfm7kKfsNa3wH+NU5r7vTeB5rKvLsWyPjVX8iH94brP7umiQ==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': @@ -2619,8 +2619,8 @@ packages: resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==} engines: {node: '>=18.0.0'} - '@smithy/types@4.13.1': - resolution: {integrity: sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==} + '@smithy/types@4.14.0': + resolution: {integrity: sha512-OWgntFLW88kx2qvf/c/67Vno1yuXm/f9M7QFAtVkkO29IJXGBIg0ycEaBTH0kvCtwmvZxRujrgP5a86RvsXJAQ==} engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': @@ -3231,8 +3231,8 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ai@6.0.143: - resolution: {integrity: sha512-wVDb7StQ1EPQ9GDAOmi1AsuAXQRSii+zZT2sFK+MCisH4vV7XNEAdzXL+sKsUAFhhq+EtVFWWlB4mCk4hcoIMw==} + ai@6.0.154: + resolution: {integrity: sha512-HfKJKCTJsDZxqrIUDSVnBQ7DpQlx5WI4ExqtLd7Bl70epLmvkpc/HYMzU1hP9W+g9VEAcvZo4fbMqc3v5D+9gQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -6285,6 +6285,10 @@ packages: resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.9: + resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} + engines: {node: ^10 || ^12 || >=14} + posthog-js@1.364.6: resolution: {integrity: sha512-igc1nGc7J3njFZyQBMMGbFgjz6zx/0wxumHNW/MizJgslLFvSmoH8nfNIi1JM6bX1QhuUa7KCTaTtzZADzG9lA==} @@ -7623,19 +7627,19 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@ai-sdk/alibaba@1.0.13(zod@4.3.6)': + '@ai-sdk/alibaba@1.0.17(zod@4.3.6)': dependencies: - '@ai-sdk/openai-compatible': 2.0.37(zod@4.3.6) + '@ai-sdk/openai-compatible': 2.0.41(zod@4.3.6) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/amazon-bedrock@4.0.87(zod@4.3.6)': + '@ai-sdk/amazon-bedrock@4.0.92(zod@4.3.6)': dependencies: - '@ai-sdk/anthropic': 3.0.64(zod@4.3.6) + '@ai-sdk/anthropic': 3.0.68(zod@4.3.6) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) - '@smithy/eventstream-codec': 4.2.12 + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) + '@smithy/eventstream-codec': 4.2.13 '@smithy/util-utf8': 4.2.2 aws4fetch: 1.0.20 zod: 4.3.6 @@ -7646,100 +7650,100 @@ snapshots: '@ai-sdk/provider-utils': 4.0.3(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/anthropic@3.0.64(zod@4.3.6)': + '@ai-sdk/anthropic@3.0.68(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/cerebras@2.0.41(zod@4.3.6)': + '@ai-sdk/cerebras@2.0.45(zod@4.3.6)': dependencies: - '@ai-sdk/openai-compatible': 2.0.37(zod@4.3.6) + '@ai-sdk/openai-compatible': 2.0.41(zod@4.3.6) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/cohere@3.0.27(zod@4.3.6)': + '@ai-sdk/cohere@3.0.30(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/deepinfra@2.0.41(zod@4.3.6)': + '@ai-sdk/deepinfra@2.0.45(zod@4.3.6)': dependencies: - '@ai-sdk/openai-compatible': 2.0.37(zod@4.3.6) + '@ai-sdk/openai-compatible': 2.0.41(zod@4.3.6) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/deepseek@2.0.26(zod@4.3.6)': + '@ai-sdk/deepseek@2.0.29(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/fireworks@2.0.42(zod@4.3.6)': + '@ai-sdk/fireworks@2.0.46(zod@4.3.6)': dependencies: - '@ai-sdk/openai-compatible': 2.0.37(zod@4.3.6) + '@ai-sdk/openai-compatible': 2.0.41(zod@4.3.6) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/gateway@3.0.85(zod@4.3.6)': + '@ai-sdk/gateway@3.0.94(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) '@vercel/oidc': 3.1.0 zod: 4.3.6 - '@ai-sdk/google@3.0.55(zod@4.3.6)': + '@ai-sdk/google@3.0.60(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/groq@3.0.32(zod@4.3.6)': + '@ai-sdk/groq@3.0.35(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/huggingface@1.0.39(zod@4.3.6)': + '@ai-sdk/huggingface@1.0.43(zod@4.3.6)': dependencies: - '@ai-sdk/openai-compatible': 2.0.37(zod@4.3.6) + '@ai-sdk/openai-compatible': 2.0.41(zod@4.3.6) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/mistral@3.0.27(zod@4.3.6)': + '@ai-sdk/mistral@3.0.30(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/moonshotai@2.0.12(zod@4.3.6)': + '@ai-sdk/moonshotai@2.0.16(zod@4.3.6)': dependencies: - '@ai-sdk/openai-compatible': 2.0.37(zod@4.3.6) + '@ai-sdk/openai-compatible': 2.0.41(zod@4.3.6) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/openai-compatible@2.0.37(zod@4.3.6)': + '@ai-sdk/openai-compatible@2.0.41(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/openai@3.0.49(zod@4.3.6)': + '@ai-sdk/openai@3.0.52(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/perplexity@3.0.26(zod@4.3.6)': + '@ai-sdk/perplexity@3.0.29(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 '@ai-sdk/provider-utils@4.0.19(zod@4.3.6)': @@ -7749,7 +7753,7 @@ snapshots: eventsource-parser: 3.0.6 zod: 4.3.6 - '@ai-sdk/provider-utils@4.0.21(zod@4.3.6)': + '@ai-sdk/provider-utils@4.0.23(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 '@standard-schema/spec': 1.1.0 @@ -7782,41 +7786,41 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/react@3.0.145(react@19.2.4)(zod@4.3.6)': + '@ai-sdk/react@3.0.156(react@19.2.4)(zod@4.3.6)': dependencies: - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) - ai: 6.0.143(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) + ai: 6.0.154(zod@4.3.6) react: 19.2.4 swr: 2.4.1(react@19.2.4) throttleit: 2.1.0 transitivePeerDependencies: - zod - '@ai-sdk/replicate@2.0.26(zod@4.3.6)': + '@ai-sdk/replicate@2.0.29(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/togetherai@2.0.41(zod@4.3.6)': + '@ai-sdk/togetherai@2.0.45(zod@4.3.6)': dependencies: - '@ai-sdk/openai-compatible': 2.0.37(zod@4.3.6) + '@ai-sdk/openai-compatible': 2.0.41(zod@4.3.6) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/vercel@2.0.39(zod@4.3.6)': + '@ai-sdk/vercel@2.0.43(zod@4.3.6)': dependencies: - '@ai-sdk/openai-compatible': 2.0.37(zod@4.3.6) + '@ai-sdk/openai-compatible': 2.0.41(zod@4.3.6) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/xai@3.0.75(zod@4.3.6)': + '@ai-sdk/xai@3.0.82(zod@4.3.6)': dependencies: - '@ai-sdk/openai-compatible': 2.0.37(zod@4.3.6) + '@ai-sdk/openai-compatible': 2.0.41(zod@4.3.6) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 '@aklinker1/rollup-plugin-visualizer@5.12.0(rollup@4.53.2)': @@ -7911,18 +7915,18 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.6 + '@aws-sdk/types': 3.973.7 tslib: 2.8.1 '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.973.6 + '@aws-sdk/types': 3.973.7 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/types@3.973.6': + '@aws-sdk/types@3.973.7': dependencies: - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.0 tslib: 2.8.1 '@babel/code-frame@7.27.1': @@ -9288,9 +9292,9 @@ snapshots: '@open-draft/until@2.1.0': {} - '@openrouter/ai-sdk-provider@2.3.3(ai@6.0.143(zod@4.3.6))(zod@4.3.6)': + '@openrouter/ai-sdk-provider@2.3.3(ai@6.0.154(zod@4.3.6))(zod@4.3.6)': dependencies: - ai: 6.0.143(zod@4.3.6) + ai: 6.0.154(zod@4.3.6) zod: 4.3.6 '@opentelemetry/api-logs@0.208.0': @@ -9883,10 +9887,10 @@ snapshots: '@sindresorhus/merge-streams@4.0.0': {} - '@smithy/eventstream-codec@4.2.12': + '@smithy/eventstream-codec@4.2.13': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.0 '@smithy/util-hex-encoding': 4.2.2 tslib: 2.8.1 @@ -9898,7 +9902,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/types@4.13.1': + '@smithy/types@4.14.0': dependencies: tslib: 2.8.1 @@ -10485,7 +10489,7 @@ snapshots: '@vue/shared': 3.5.24 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.8 + postcss: 8.5.9 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.24': @@ -10577,11 +10581,11 @@ snapshots: agent-base@7.1.4: {} - ai@6.0.143(zod@4.3.6): + ai@6.0.154(zod@4.3.6): dependencies: - '@ai-sdk/gateway': 3.0.85(zod@4.3.6) + '@ai-sdk/gateway': 3.0.94(zod@4.3.6) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) '@opentelemetry/api': 1.9.0 zod: 4.3.6 @@ -13475,11 +13479,11 @@ snapshots: ohash@2.0.11: {} - ollama-ai-provider-v2@3.5.0(ai@6.0.143(zod@4.3.6))(zod@4.3.6): + ollama-ai-provider-v2@3.5.0(ai@6.0.154(zod@4.3.6))(zod@4.3.6): dependencies: '@ai-sdk/provider': 3.0.8 '@ai-sdk/provider-utils': 4.0.19(zod@4.3.6) - ai: 6.0.143(zod@4.3.6) + ai: 6.0.154(zod@4.3.6) zod: 4.3.6 on-exit-leak-free@2.1.2: {} @@ -13758,6 +13762,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.9: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + posthog-js@1.364.6: dependencies: '@opentelemetry/api': 1.9.1 diff --git a/src/entrypoints/host.content/translation-control/__tests__/page-translation-title.test.ts b/src/entrypoints/host.content/translation-control/__tests__/page-translation-title.test.ts index ff7e46839..96658148a 100644 --- a/src/entrypoints/host.content/translation-control/__tests__/page-translation-title.test.ts +++ b/src/entrypoints/host.content/translation-control/__tests__/page-translation-title.test.ts @@ -124,6 +124,38 @@ describe("pageTranslationManager title handling", () => { mockSendMessage.mockResolvedValue(undefined) }) + it("does not prime webpage context on start for non-llm translation", async () => { + mockTranslateTextForPageTitle.mockResolvedValue("Translated Title") + + const manager = new PageTranslationManager() + await manager.start() + await flushDomUpdates() + + expect(mockGetOrCreateWebPageContext).not.toHaveBeenCalled() + + manager.stop() + }) + + it("primes webpage context on start for AI-aware llm translation", async () => { + mockGetLocalConfig.mockResolvedValue({ + ...DEFAULT_CONFIG, + translate: { + ...DEFAULT_CONFIG.translate, + providerId: "openai-default", + enableAIContentAware: true, + }, + }) + mockTranslateTextForPageTitle.mockResolvedValue("Translated Title") + + const manager = new PageTranslationManager() + await manager.start() + await flushDomUpdates() + + expect(mockGetOrCreateWebPageContext).toHaveBeenCalledTimes(1) + + manager.stop() + }) + it("translates the tab title on start and restores the latest source title on stop", async () => { mockTranslateTextForPageTitle .mockResolvedValueOnce("Translated Title") diff --git a/src/entrypoints/host.content/translation-control/page-translation.ts b/src/entrypoints/host.content/translation-control/page-translation.ts index 1fa10f1d8..92ef461e8 100644 --- a/src/entrypoints/host.content/translation-control/page-translation.ts +++ b/src/entrypoints/host.content/translation-control/page-translation.ts @@ -1,9 +1,11 @@ import type { FeatureUsageContext } from "@/types/analytics" import { ANALYTICS_FEATURE, ANALYTICS_SURFACE } from "@/types/analytics" +import { isLLMProviderConfig } from "@/types/config/provider" import { createFeatureUsageContext, trackFeatureUsed } from "@/utils/analytics" import { getDetectedCodeFromStorage } from "@/utils/config/languages" import { getLocalConfig } from "@/utils/config/storage" import { CONTENT_WRAPPER_CLASS } from "@/utils/constants/dom-labels" +import { resolveProviderConfig } from "@/utils/constants/feature-providers" import { getRandomUUID } from "@/utils/crypto-polyfill" import { hasNoWalkAncestor, isDontWalkIntoButTranslateAsChildElement, isHTMLElement } from "@/utils/host/dom/filter" import { deepQueryTopLevelSelector } from "@/utils/host/dom/find" @@ -117,12 +119,16 @@ export class PageTranslationManager implements IPageTranslationManager { } try { + const providerConfig = resolveProviderConfig(config, "translate") + await sendMessage("setAndNotifyPageTranslationStateChangedByManager", { enabled: true, }) this.isPageTranslating = true - await this.primeDocumentTitleContext() + await this.primeDocumentTitleContext( + config.translate.enableAIContentAware && isLLMProviderConfig(providerConfig), + ) this.startDocumentTitleTracking() // Listen to existing elements when they enter the viewpoint @@ -261,8 +267,8 @@ export class PageTranslationManager implements IPageTranslationManager { return window === window.top } - private async primeDocumentTitleContext(): Promise { - if (!this.shouldManageDocumentTitle()) { + private async primeDocumentTitleContext(shouldPrimeWebPageContext: boolean): Promise { + if (!this.shouldManageDocumentTitle() || !shouldPrimeWebPageContext) { return } diff --git a/src/utils/host/__tests__/translate-text.test.tsx b/src/utils/host/__tests__/translate-text.test.tsx index 93cfc35d3..bc2dda58e 100644 --- a/src/utils/host/__tests__/translate-text.test.tsx +++ b/src/utils/host/__tests__/translate-text.test.tsx @@ -113,10 +113,43 @@ describe("translate-text", () => { expect(mockSendMessage).toHaveBeenCalledWith("enqueueTranslateRequest", expect.objectContaining({ text: "Source Title To Translate", webTitle: "Source Title To Translate", + webContent: undefined, })) + expect(mockGetOrCreateWebPageContext).not.toHaveBeenCalled() expect(mockGetOrGenerateWebPageSummary).not.toHaveBeenCalled() }) + it("should include webpage content for AI-aware title translation", async () => { + const llmConfig = { + ...DEFAULT_CONFIG, + translate: { + ...DEFAULT_CONFIG.translate, + providerId: "openai-default", + enableAIContentAware: true, + }, + } + + mockGetConfigFromStorage.mockResolvedValue(llmConfig) + mockSendMessage.mockImplementation(async (type: string) => { + if (type === "enqueueTranslateRequest") { + return "translated page title" + } + return undefined + }) + + const result = await translateTextForPageTitle("Source Title To Translate") + + expect(result).toBe("translated page title") + expect(mockGetOrCreateWebPageContext).toHaveBeenCalledTimes(1) + expect(mockGetOrGenerateWebPageSummary).not.toHaveBeenCalled() + expect(mockSendMessage).toHaveBeenCalledWith("enqueueTranslateRequest", expect.objectContaining({ + text: "Source Title To Translate", + webTitle: "Source Title To Translate", + webContent: "Body content", + webSummary: undefined, + })) + }) + it("should forward document.title to regular page translations", async () => { const llmConfig = { ...DEFAULT_CONFIG, diff --git a/src/utils/host/translate/translate-variants.ts b/src/utils/host/translate/translate-variants.ts index a68a3300d..58ea3b8e4 100644 --- a/src/utils/host/translate/translate-variants.ts +++ b/src/utils/host/translate/translate-variants.ts @@ -118,7 +118,9 @@ export async function translateTextForPage(text: string): Promise { export async function translateTextForPageTitle(text: string): Promise { const config = await getConfigOrThrow() const providerConfig = resolveProviderConfig(config, "translate") - const webPageContext = await getWebPagePromptContext(providerConfig, config.translate.enableAIContentAware, false) + const webPageContext = config.translate.enableAIContentAware + ? await getWebPagePromptContext(providerConfig, true, false) + : undefined return translateTextUsingPageConfig(config, text, { extraHashTags: ["pageTitleTranslation"],