@agentprojectcontext/apx 1.50.0 → 1.51.0
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.
- package/package.json +1 -1
- package/src/core/agent/prompt-builder.js +15 -4
- package/src/core/voice/emotions.js +106 -0
- package/src/core/voice/engines/index.js +39 -9
- package/src/core/voice/engines/openai.js +55 -19
- package/src/core/voice/tts.js +9 -2
- package/src/host/daemon/api/conversations.js +14 -1
- package/src/host/daemon/api/voice.js +1 -0
- package/src/interfaces/web/dist/assets/index-C1tm8nvc.js +651 -0
- package/src/interfaces/web/dist/assets/index-C1tm8nvc.js.map +1 -0
- package/src/interfaces/web/dist/assets/{index-C53eJujd.css → index-L1pXYFUg.css} +1 -1
- package/src/interfaces/web/dist/index.html +2 -2
- package/src/interfaces/web/package-lock.json +77 -77
- package/src/interfaces/web/src/components/UiSelect.tsx +2 -1
- package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +101 -147
- package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +137 -6
- package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +17 -24
- package/src/interfaces/web/src/hooks/useChat.ts +1 -1
- package/src/interfaces/web/src/i18n/en.ts +34 -2
- package/src/interfaces/web/src/i18n/es.ts +34 -2
- package/src/interfaces/web/src/lib/api/voice.ts +36 -3
- package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +29 -37
- package/src/interfaces/web/dist/assets/index--24yvYc5.js +0 -656
- package/src/interfaces/web/dist/assets/index--24yvYc5.js.map +0 -1
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
<link rel="apple-touch-icon" href="/favicon/dark/apple-touch-icon.png" media="(prefers-color-scheme: dark)" />
|
|
19
19
|
<link rel="manifest" href="/favicon/white/site.webmanifest" media="(prefers-color-scheme: light)" />
|
|
20
20
|
<link rel="manifest" href="/favicon/dark/site.webmanifest" media="(prefers-color-scheme: dark)" />
|
|
21
|
-
<script type="module" crossorigin src="/assets/index
|
|
22
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
21
|
+
<script type="module" crossorigin src="/assets/index-C1tm8nvc.js"></script>
|
|
22
|
+
<link rel="stylesheet" crossorigin href="/assets/index-L1pXYFUg.css">
|
|
23
23
|
</head>
|
|
24
24
|
<body class="bg-background text-foreground antialiased">
|
|
25
25
|
<div id="root"></div>
|
|
@@ -1670,9 +1670,9 @@
|
|
|
1670
1670
|
"license": "MIT"
|
|
1671
1671
|
},
|
|
1672
1672
|
"node_modules/@tailwindcss/node": {
|
|
1673
|
-
"version": "4.3.
|
|
1674
|
-
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.
|
|
1675
|
-
"integrity": "sha512-
|
|
1673
|
+
"version": "4.3.2",
|
|
1674
|
+
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz",
|
|
1675
|
+
"integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==",
|
|
1676
1676
|
"license": "MIT",
|
|
1677
1677
|
"dependencies": {
|
|
1678
1678
|
"@jridgewell/remapping": "^2.3.5",
|
|
@@ -1681,36 +1681,36 @@
|
|
|
1681
1681
|
"lightningcss": "1.32.0",
|
|
1682
1682
|
"magic-string": "^0.30.21",
|
|
1683
1683
|
"source-map-js": "^1.2.1",
|
|
1684
|
-
"tailwindcss": "4.3.
|
|
1684
|
+
"tailwindcss": "4.3.2"
|
|
1685
1685
|
}
|
|
1686
1686
|
},
|
|
1687
1687
|
"node_modules/@tailwindcss/oxide": {
|
|
1688
|
-
"version": "4.3.
|
|
1689
|
-
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.
|
|
1690
|
-
"integrity": "sha512-
|
|
1688
|
+
"version": "4.3.2",
|
|
1689
|
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz",
|
|
1690
|
+
"integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==",
|
|
1691
1691
|
"license": "MIT",
|
|
1692
1692
|
"engines": {
|
|
1693
1693
|
"node": ">= 20"
|
|
1694
1694
|
},
|
|
1695
1695
|
"optionalDependencies": {
|
|
1696
|
-
"@tailwindcss/oxide-android-arm64": "4.3.
|
|
1697
|
-
"@tailwindcss/oxide-darwin-arm64": "4.3.
|
|
1698
|
-
"@tailwindcss/oxide-darwin-x64": "4.3.
|
|
1699
|
-
"@tailwindcss/oxide-freebsd-x64": "4.3.
|
|
1700
|
-
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.
|
|
1701
|
-
"@tailwindcss/oxide-linux-arm64-gnu": "4.3.
|
|
1702
|
-
"@tailwindcss/oxide-linux-arm64-musl": "4.3.
|
|
1703
|
-
"@tailwindcss/oxide-linux-x64-gnu": "4.3.
|
|
1704
|
-
"@tailwindcss/oxide-linux-x64-musl": "4.3.
|
|
1705
|
-
"@tailwindcss/oxide-wasm32-wasi": "4.3.
|
|
1706
|
-
"@tailwindcss/oxide-win32-arm64-msvc": "4.3.
|
|
1707
|
-
"@tailwindcss/oxide-win32-x64-msvc": "4.3.
|
|
1696
|
+
"@tailwindcss/oxide-android-arm64": "4.3.2",
|
|
1697
|
+
"@tailwindcss/oxide-darwin-arm64": "4.3.2",
|
|
1698
|
+
"@tailwindcss/oxide-darwin-x64": "4.3.2",
|
|
1699
|
+
"@tailwindcss/oxide-freebsd-x64": "4.3.2",
|
|
1700
|
+
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2",
|
|
1701
|
+
"@tailwindcss/oxide-linux-arm64-gnu": "4.3.2",
|
|
1702
|
+
"@tailwindcss/oxide-linux-arm64-musl": "4.3.2",
|
|
1703
|
+
"@tailwindcss/oxide-linux-x64-gnu": "4.3.2",
|
|
1704
|
+
"@tailwindcss/oxide-linux-x64-musl": "4.3.2",
|
|
1705
|
+
"@tailwindcss/oxide-wasm32-wasi": "4.3.2",
|
|
1706
|
+
"@tailwindcss/oxide-win32-arm64-msvc": "4.3.2",
|
|
1707
|
+
"@tailwindcss/oxide-win32-x64-msvc": "4.3.2"
|
|
1708
1708
|
}
|
|
1709
1709
|
},
|
|
1710
1710
|
"node_modules/@tailwindcss/oxide-android-arm64": {
|
|
1711
|
-
"version": "4.3.
|
|
1712
|
-
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.
|
|
1713
|
-
"integrity": "sha512-
|
|
1711
|
+
"version": "4.3.2",
|
|
1712
|
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz",
|
|
1713
|
+
"integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==",
|
|
1714
1714
|
"cpu": [
|
|
1715
1715
|
"arm64"
|
|
1716
1716
|
],
|
|
@@ -1724,9 +1724,9 @@
|
|
|
1724
1724
|
}
|
|
1725
1725
|
},
|
|
1726
1726
|
"node_modules/@tailwindcss/oxide-darwin-arm64": {
|
|
1727
|
-
"version": "4.3.
|
|
1728
|
-
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.
|
|
1729
|
-
"integrity": "sha512-
|
|
1727
|
+
"version": "4.3.2",
|
|
1728
|
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz",
|
|
1729
|
+
"integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==",
|
|
1730
1730
|
"cpu": [
|
|
1731
1731
|
"arm64"
|
|
1732
1732
|
],
|
|
@@ -1740,9 +1740,9 @@
|
|
|
1740
1740
|
}
|
|
1741
1741
|
},
|
|
1742
1742
|
"node_modules/@tailwindcss/oxide-darwin-x64": {
|
|
1743
|
-
"version": "4.3.
|
|
1744
|
-
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.
|
|
1745
|
-
"integrity": "sha512-
|
|
1743
|
+
"version": "4.3.2",
|
|
1744
|
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz",
|
|
1745
|
+
"integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==",
|
|
1746
1746
|
"cpu": [
|
|
1747
1747
|
"x64"
|
|
1748
1748
|
],
|
|
@@ -1756,9 +1756,9 @@
|
|
|
1756
1756
|
}
|
|
1757
1757
|
},
|
|
1758
1758
|
"node_modules/@tailwindcss/oxide-freebsd-x64": {
|
|
1759
|
-
"version": "4.3.
|
|
1760
|
-
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.
|
|
1761
|
-
"integrity": "sha512-
|
|
1759
|
+
"version": "4.3.2",
|
|
1760
|
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz",
|
|
1761
|
+
"integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==",
|
|
1762
1762
|
"cpu": [
|
|
1763
1763
|
"x64"
|
|
1764
1764
|
],
|
|
@@ -1772,9 +1772,9 @@
|
|
|
1772
1772
|
}
|
|
1773
1773
|
},
|
|
1774
1774
|
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
|
|
1775
|
-
"version": "4.3.
|
|
1776
|
-
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.
|
|
1777
|
-
"integrity": "sha512
|
|
1775
|
+
"version": "4.3.2",
|
|
1776
|
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz",
|
|
1777
|
+
"integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==",
|
|
1778
1778
|
"cpu": [
|
|
1779
1779
|
"arm"
|
|
1780
1780
|
],
|
|
@@ -1788,9 +1788,9 @@
|
|
|
1788
1788
|
}
|
|
1789
1789
|
},
|
|
1790
1790
|
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
|
|
1791
|
-
"version": "4.3.
|
|
1792
|
-
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.
|
|
1793
|
-
"integrity": "sha512-
|
|
1791
|
+
"version": "4.3.2",
|
|
1792
|
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz",
|
|
1793
|
+
"integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==",
|
|
1794
1794
|
"cpu": [
|
|
1795
1795
|
"arm64"
|
|
1796
1796
|
],
|
|
@@ -1807,9 +1807,9 @@
|
|
|
1807
1807
|
}
|
|
1808
1808
|
},
|
|
1809
1809
|
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
|
|
1810
|
-
"version": "4.3.
|
|
1811
|
-
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.
|
|
1812
|
-
"integrity": "sha512-
|
|
1810
|
+
"version": "4.3.2",
|
|
1811
|
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz",
|
|
1812
|
+
"integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==",
|
|
1813
1813
|
"cpu": [
|
|
1814
1814
|
"arm64"
|
|
1815
1815
|
],
|
|
@@ -1826,9 +1826,9 @@
|
|
|
1826
1826
|
}
|
|
1827
1827
|
},
|
|
1828
1828
|
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
|
|
1829
|
-
"version": "4.3.
|
|
1830
|
-
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.
|
|
1831
|
-
"integrity": "sha512-
|
|
1829
|
+
"version": "4.3.2",
|
|
1830
|
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz",
|
|
1831
|
+
"integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==",
|
|
1832
1832
|
"cpu": [
|
|
1833
1833
|
"x64"
|
|
1834
1834
|
],
|
|
@@ -1845,9 +1845,9 @@
|
|
|
1845
1845
|
}
|
|
1846
1846
|
},
|
|
1847
1847
|
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
|
|
1848
|
-
"version": "4.3.
|
|
1849
|
-
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.
|
|
1850
|
-
"integrity": "sha512-
|
|
1848
|
+
"version": "4.3.2",
|
|
1849
|
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz",
|
|
1850
|
+
"integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==",
|
|
1851
1851
|
"cpu": [
|
|
1852
1852
|
"x64"
|
|
1853
1853
|
],
|
|
@@ -1864,9 +1864,9 @@
|
|
|
1864
1864
|
}
|
|
1865
1865
|
},
|
|
1866
1866
|
"node_modules/@tailwindcss/oxide-wasm32-wasi": {
|
|
1867
|
-
"version": "4.3.
|
|
1868
|
-
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.
|
|
1869
|
-
"integrity": "sha512-
|
|
1867
|
+
"version": "4.3.2",
|
|
1868
|
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz",
|
|
1869
|
+
"integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==",
|
|
1870
1870
|
"bundleDependencies": [
|
|
1871
1871
|
"@napi-rs/wasm-runtime",
|
|
1872
1872
|
"@emnapi/core",
|
|
@@ -1881,9 +1881,9 @@
|
|
|
1881
1881
|
"license": "MIT",
|
|
1882
1882
|
"optional": true,
|
|
1883
1883
|
"dependencies": {
|
|
1884
|
-
"@emnapi/core": "^1.
|
|
1885
|
-
"@emnapi/runtime": "^1.
|
|
1886
|
-
"@emnapi/wasi-threads": "^1.2.
|
|
1884
|
+
"@emnapi/core": "^1.11.1",
|
|
1885
|
+
"@emnapi/runtime": "^1.11.1",
|
|
1886
|
+
"@emnapi/wasi-threads": "^1.2.2",
|
|
1887
1887
|
"@napi-rs/wasm-runtime": "^1.1.4",
|
|
1888
1888
|
"@tybys/wasm-util": "^0.10.2",
|
|
1889
1889
|
"tslib": "^2.8.1"
|
|
@@ -1893,9 +1893,9 @@
|
|
|
1893
1893
|
}
|
|
1894
1894
|
},
|
|
1895
1895
|
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
|
|
1896
|
-
"version": "4.3.
|
|
1897
|
-
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.
|
|
1898
|
-
"integrity": "sha512-
|
|
1896
|
+
"version": "4.3.2",
|
|
1897
|
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz",
|
|
1898
|
+
"integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==",
|
|
1899
1899
|
"cpu": [
|
|
1900
1900
|
"arm64"
|
|
1901
1901
|
],
|
|
@@ -1909,9 +1909,9 @@
|
|
|
1909
1909
|
}
|
|
1910
1910
|
},
|
|
1911
1911
|
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
|
|
1912
|
-
"version": "4.3.
|
|
1913
|
-
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.
|
|
1914
|
-
"integrity": "sha512-
|
|
1912
|
+
"version": "4.3.2",
|
|
1913
|
+
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz",
|
|
1914
|
+
"integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==",
|
|
1915
1915
|
"cpu": [
|
|
1916
1916
|
"x64"
|
|
1917
1917
|
],
|
|
@@ -1925,14 +1925,14 @@
|
|
|
1925
1925
|
}
|
|
1926
1926
|
},
|
|
1927
1927
|
"node_modules/@tailwindcss/vite": {
|
|
1928
|
-
"version": "4.3.
|
|
1929
|
-
"resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.
|
|
1930
|
-
"integrity": "sha512-
|
|
1928
|
+
"version": "4.3.2",
|
|
1929
|
+
"resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz",
|
|
1930
|
+
"integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==",
|
|
1931
1931
|
"license": "MIT",
|
|
1932
1932
|
"dependencies": {
|
|
1933
|
-
"@tailwindcss/node": "4.3.
|
|
1934
|
-
"@tailwindcss/oxide": "4.3.
|
|
1935
|
-
"tailwindcss": "4.3.
|
|
1933
|
+
"@tailwindcss/node": "4.3.2",
|
|
1934
|
+
"@tailwindcss/oxide": "4.3.2",
|
|
1935
|
+
"tailwindcss": "4.3.2"
|
|
1936
1936
|
},
|
|
1937
1937
|
"peerDependencies": {
|
|
1938
1938
|
"vite": "^5.2.0 || ^6 || ^7 || ^8"
|
|
@@ -2598,9 +2598,9 @@
|
|
|
2598
2598
|
"license": "MIT"
|
|
2599
2599
|
},
|
|
2600
2600
|
"node_modules/electron-to-chromium": {
|
|
2601
|
-
"version": "1.5.
|
|
2602
|
-
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.
|
|
2603
|
-
"integrity": "sha512-
|
|
2601
|
+
"version": "1.5.381",
|
|
2602
|
+
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.381.tgz",
|
|
2603
|
+
"integrity": "sha512-n9Wa6yB+vDsGuA8AKbl/0z7HbvWqt5jxIdvr1IUicd0ryPrk7/xzwqLv8D9AbbvZ6avVNtXYLTfmgFHkwkyelg==",
|
|
2604
2604
|
"dev": true,
|
|
2605
2605
|
"license": "ISC"
|
|
2606
2606
|
},
|
|
@@ -3516,9 +3516,9 @@
|
|
|
3516
3516
|
}
|
|
3517
3517
|
},
|
|
3518
3518
|
"node_modules/react-router": {
|
|
3519
|
-
"version": "7.18.
|
|
3520
|
-
"resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.
|
|
3521
|
-
"integrity": "sha512-
|
|
3519
|
+
"version": "7.18.1",
|
|
3520
|
+
"resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.1.tgz",
|
|
3521
|
+
"integrity": "sha512-GDLgg3i3uM0aeJO3Fm+TCS+sDQ7gu12T6x0qdTEzcwqEfleci7JwugVNIF3U//0FWKnJT7ptG+20B2jfDqnZAg==",
|
|
3522
3522
|
"license": "MIT",
|
|
3523
3523
|
"dependencies": {
|
|
3524
3524
|
"cookie": "^1.0.1",
|
|
@@ -3538,12 +3538,12 @@
|
|
|
3538
3538
|
}
|
|
3539
3539
|
},
|
|
3540
3540
|
"node_modules/react-router-dom": {
|
|
3541
|
-
"version": "7.18.
|
|
3542
|
-
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.
|
|
3543
|
-
"integrity": "sha512-
|
|
3541
|
+
"version": "7.18.1",
|
|
3542
|
+
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.1.tgz",
|
|
3543
|
+
"integrity": "sha512-KaZh+X/6UtEp28x51AUYZDMg9NGoz2ja3dNHa+ta/tk40vCzKhQ/RypCWBMLbmDr6//E24Vv5uPsrqXFozdkAg==",
|
|
3544
3544
|
"license": "MIT",
|
|
3545
3545
|
"dependencies": {
|
|
3546
|
-
"react-router": "7.18.
|
|
3546
|
+
"react-router": "7.18.1"
|
|
3547
3547
|
},
|
|
3548
3548
|
"engines": {
|
|
3549
3549
|
"node": ">=20.0.0"
|
|
@@ -3788,9 +3788,9 @@
|
|
|
3788
3788
|
}
|
|
3789
3789
|
},
|
|
3790
3790
|
"node_modules/tailwindcss": {
|
|
3791
|
-
"version": "4.3.
|
|
3792
|
-
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.
|
|
3793
|
-
"integrity": "sha512-
|
|
3791
|
+
"version": "4.3.2",
|
|
3792
|
+
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz",
|
|
3793
|
+
"integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==",
|
|
3794
3794
|
"license": "MIT"
|
|
3795
3795
|
},
|
|
3796
3796
|
"node_modules/tapable": {
|
|
@@ -13,6 +13,7 @@ export interface UiSelectOption {
|
|
|
13
13
|
label: string;
|
|
14
14
|
icon?: ElementType;
|
|
15
15
|
description?: string;
|
|
16
|
+
disabled?: boolean;
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
// Thin, app-friendly wrapper over the base-ui Select primitive so call sites
|
|
@@ -63,7 +64,7 @@ export function UiSelect({
|
|
|
63
64
|
{options.map((o) => {
|
|
64
65
|
const Icon = o.icon;
|
|
65
66
|
return (
|
|
66
|
-
<SelectItem key={o.value} value={o.value}>
|
|
67
|
+
<SelectItem key={o.value} value={o.value} disabled={o.disabled}>
|
|
67
68
|
<span className="flex min-w-0 items-center gap-2">
|
|
68
69
|
{Icon ? <Icon className="size-4 shrink-0 text-muted-fg" /> : null}
|
|
69
70
|
{o.description ? (
|
|
@@ -1,53 +1,46 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ChevronDown, ChevronUp, Plus, Settings2, Trash2 } from "lucide-react";
|
|
2
2
|
import { Badge, Button, Switch } from "../ui";
|
|
3
3
|
import { StatusDot } from "../Section";
|
|
4
4
|
import { cn } from "../../lib/cn";
|
|
5
|
-
import {
|
|
6
|
-
TTS_PROVIDER_META,
|
|
7
|
-
type TtsEngineInfo,
|
|
8
|
-
type TtsMode,
|
|
9
|
-
} from "../../lib/api/voice";
|
|
5
|
+
import { TTS_PROVIDER_META, type TtsEngineInfo } from "../../lib/api/voice";
|
|
10
6
|
import { t } from "../../i18n";
|
|
11
7
|
|
|
12
|
-
// TTS engine
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
8
|
+
// TTS engine list — an ordered fallback chain (router). The arrows reorder the
|
|
9
|
+
// chain, the switch enables/disables an engine, and the first available engine
|
|
10
|
+
// in the order speaks. The silent "mock" fallback is hidden (it's an internal
|
|
11
|
+
// guarantee, not a user choice). Users can add any number of OpenAI-compatible
|
|
12
|
+
// custom providers (e.g. a local QVox server) via "Add provider".
|
|
17
13
|
// Availability/configured/enabled all come from the daemon (/tts/providers).
|
|
18
14
|
|
|
19
15
|
interface Props {
|
|
20
16
|
engines: TtsEngineInfo[];
|
|
21
17
|
order: string[]; // effective chain order from the daemon
|
|
22
|
-
mode: TtsMode;
|
|
23
|
-
configuredProvider: string; // single-mode default engine id ("auto" = none)
|
|
24
|
-
onSetMode: (mode: TtsMode) => void;
|
|
25
|
-
onSetDefault: (id: string) => void;
|
|
26
18
|
onToggleEnabled: (id: string, enabled: boolean) => void;
|
|
27
19
|
onReorder: (nextOrder: string[]) => void;
|
|
28
20
|
onConfigure: (id: string) => void;
|
|
21
|
+
onRemove: (id: string) => void;
|
|
22
|
+
onAddNew: () => void;
|
|
29
23
|
busy?: boolean;
|
|
30
24
|
}
|
|
31
25
|
|
|
32
26
|
export function VoiceProviderList({
|
|
33
27
|
engines,
|
|
34
28
|
order,
|
|
35
|
-
mode,
|
|
36
|
-
configuredProvider,
|
|
37
|
-
onSetMode,
|
|
38
|
-
onSetDefault,
|
|
39
29
|
onToggleEnabled,
|
|
40
30
|
onReorder,
|
|
41
31
|
onConfigure,
|
|
32
|
+
onRemove,
|
|
33
|
+
onAddNew,
|
|
42
34
|
busy,
|
|
43
35
|
}: Props) {
|
|
44
|
-
|
|
36
|
+
// Hide the internal "mock" fallback from the user-facing list.
|
|
37
|
+
const visible = engines.filter((e) => e.id !== "mock");
|
|
38
|
+
const byId = new Map(visible.map((e) => [e.id, e]));
|
|
45
39
|
// Render in the daemon's effective order, then any extras it didn't list.
|
|
46
40
|
const ids = [
|
|
47
41
|
...order.filter((id) => byId.has(id)),
|
|
48
|
-
...
|
|
42
|
+
...visible.map((e) => e.id).filter((id) => !order.includes(id)),
|
|
49
43
|
];
|
|
50
|
-
const isChain = mode === "chain";
|
|
51
44
|
|
|
52
45
|
const move = (id: string, dir: -1 | 1) => {
|
|
53
46
|
const idx = ids.indexOf(id);
|
|
@@ -59,140 +52,101 @@ export function VoiceProviderList({
|
|
|
59
52
|
};
|
|
60
53
|
|
|
61
54
|
return (
|
|
62
|
-
<div className="space-y-
|
|
63
|
-
{
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
55
|
+
<div className="space-y-2">
|
|
56
|
+
{ids.map((id, idx) => {
|
|
57
|
+
const e = byId.get(id)!;
|
|
58
|
+
const meta = TTS_PROVIDER_META[id];
|
|
59
|
+
const name = e.custom ? e.label || id : meta?.name || id;
|
|
60
|
+
const note = e.custom ? e.note || t("voice_ui.custom_note") : meta?.note || "";
|
|
61
|
+
return (
|
|
62
|
+
<div
|
|
63
|
+
key={id}
|
|
64
|
+
data-testid={`voice-provider-${id}`}
|
|
65
|
+
className={cn(
|
|
66
|
+
"flex items-center gap-3 rounded-lg border px-3 py-2.5 border-border",
|
|
67
|
+
!e.enabled && "opacity-60",
|
|
68
|
+
)}
|
|
69
|
+
>
|
|
70
|
+
<div className="flex flex-col">
|
|
71
|
+
<button
|
|
72
|
+
type="button"
|
|
73
|
+
onClick={() => move(id, -1)}
|
|
74
|
+
disabled={busy || idx === 0}
|
|
75
|
+
aria-label={t("voice_ui.move_up")}
|
|
76
|
+
data-testid={`voice-provider-${id}-up`}
|
|
77
|
+
className="text-muted-fg hover:text-fg disabled:opacity-30"
|
|
78
|
+
>
|
|
79
|
+
<ChevronUp className="size-3.5" />
|
|
80
|
+
</button>
|
|
81
|
+
<button
|
|
82
|
+
type="button"
|
|
83
|
+
onClick={() => move(id, 1)}
|
|
84
|
+
disabled={busy || idx === ids.length - 1}
|
|
85
|
+
aria-label={t("voice_ui.move_down")}
|
|
86
|
+
data-testid={`voice-provider-${id}-down`}
|
|
87
|
+
className="text-muted-fg hover:text-fg disabled:opacity-30"
|
|
88
|
+
>
|
|
89
|
+
<ChevronDown className="size-3.5" />
|
|
90
|
+
</button>
|
|
72
91
|
</div>
|
|
73
|
-
</div>
|
|
74
|
-
<div className="flex shrink-0 overflow-hidden rounded-md border border-border" role="group">
|
|
75
|
-
<button
|
|
76
|
-
type="button"
|
|
77
|
-
onClick={() => onSetMode("chain")}
|
|
78
|
-
disabled={busy}
|
|
79
|
-
data-testid="voice-mode-chain"
|
|
80
|
-
className={cn(
|
|
81
|
-
"px-3 py-1.5 text-xs font-medium transition-colors",
|
|
82
|
-
isChain ? "bg-emerald-500/15 text-emerald-300" : "text-muted-fg hover:text-fg",
|
|
83
|
-
)}
|
|
84
|
-
>
|
|
85
|
-
{t("voice_ui.mode_chain_btn")}
|
|
86
|
-
</button>
|
|
87
|
-
<button
|
|
88
|
-
type="button"
|
|
89
|
-
onClick={() => onSetMode("single")}
|
|
90
|
-
disabled={busy}
|
|
91
|
-
data-testid="voice-mode-single"
|
|
92
|
-
className={cn(
|
|
93
|
-
"border-l border-border px-3 py-1.5 text-xs font-medium transition-colors",
|
|
94
|
-
!isChain ? "bg-emerald-500/15 text-emerald-300" : "text-muted-fg hover:text-fg",
|
|
95
|
-
)}
|
|
96
|
-
>
|
|
97
|
-
{t("voice_ui.mode_single_btn")}
|
|
98
|
-
</button>
|
|
99
|
-
</div>
|
|
100
|
-
</div>
|
|
101
|
-
</div>
|
|
102
|
-
|
|
103
|
-
<div className="space-y-2">
|
|
104
|
-
{ids.map((id, idx) => {
|
|
105
|
-
const e = byId.get(id)!;
|
|
106
|
-
const meta = TTS_PROVIDER_META[id] || { name: id, note: "" };
|
|
107
|
-
const isDefault = !isChain && configuredProvider === id;
|
|
108
|
-
// mock is the guaranteed fallback — always on, can't be turned off.
|
|
109
|
-
const lockedOn = id === "mock";
|
|
110
|
-
return (
|
|
111
|
-
<div
|
|
112
|
-
key={id}
|
|
113
|
-
data-testid={`voice-provider-${id}`}
|
|
114
|
-
className={cn(
|
|
115
|
-
"flex items-center gap-3 rounded-lg border px-3 py-2.5",
|
|
116
|
-
isDefault ? "border-emerald-500/50 bg-emerald-500/10" : "border-border",
|
|
117
|
-
isChain && !lockedOn && !e.enabled && "opacity-60",
|
|
118
|
-
)}
|
|
119
|
-
>
|
|
120
|
-
{isChain && (
|
|
121
|
-
<div className="flex flex-col">
|
|
122
|
-
<button
|
|
123
|
-
type="button"
|
|
124
|
-
onClick={() => move(id, -1)}
|
|
125
|
-
disabled={busy || idx === 0}
|
|
126
|
-
aria-label={t("voice_ui.move_up")}
|
|
127
|
-
data-testid={`voice-provider-${id}-up`}
|
|
128
|
-
className="text-muted-fg hover:text-fg disabled:opacity-30"
|
|
129
|
-
>
|
|
130
|
-
<ChevronUp className="size-3.5" />
|
|
131
|
-
</button>
|
|
132
|
-
<button
|
|
133
|
-
type="button"
|
|
134
|
-
onClick={() => move(id, 1)}
|
|
135
|
-
disabled={busy || idx === ids.length - 1}
|
|
136
|
-
aria-label={t("voice_ui.move_down")}
|
|
137
|
-
data-testid={`voice-provider-${id}-down`}
|
|
138
|
-
className="text-muted-fg hover:text-fg disabled:opacity-30"
|
|
139
|
-
>
|
|
140
|
-
<ChevronDown className="size-3.5" />
|
|
141
|
-
</button>
|
|
142
|
-
</div>
|
|
143
|
-
)}
|
|
144
|
-
|
|
145
|
-
<StatusDot ok={e.available ? true : e.configured ? false : null} />
|
|
146
|
-
<div className="min-w-0 flex-1">
|
|
147
|
-
<div className="flex items-center gap-2">
|
|
148
|
-
<span className="text-sm font-medium">{meta.name}</span>
|
|
149
|
-
{meta.local && <Badge tone="info">{t("voice_ui.badge_local")}</Badge>}
|
|
150
|
-
{e.available ? (
|
|
151
|
-
<Badge tone="success">{t("voice_ui.badge_available")}</Badge>
|
|
152
|
-
) : e.configured ? (
|
|
153
|
-
<Badge tone="warning">{t("voice_ui.badge_unavailable")}</Badge>
|
|
154
|
-
) : (
|
|
155
|
-
<Badge tone="muted">{t("voice_ui.badge_not_configured")}</Badge>
|
|
156
|
-
)}
|
|
157
|
-
{isDefault && <Badge tone="success">{t("voice_ui.badge_default")}</Badge>}
|
|
158
|
-
</div>
|
|
159
|
-
<div className="truncate text-xs text-muted-fg">{meta.note}</div>
|
|
160
|
-
</div>
|
|
161
92
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
93
|
+
<StatusDot ok={e.available ? true : e.configured ? false : null} />
|
|
94
|
+
<div className="min-w-0 flex-1">
|
|
95
|
+
<div className="flex items-center gap-2">
|
|
96
|
+
<span className="text-sm font-medium">{name}</span>
|
|
97
|
+
{e.custom && <Badge tone="info">{t("voice_ui.badge_custom")}</Badge>}
|
|
98
|
+
{meta?.local && <Badge tone="info">{t("voice_ui.badge_local")}</Badge>}
|
|
99
|
+
{e.available ? (
|
|
100
|
+
<Badge tone="success">{t("voice_ui.badge_available")}</Badge>
|
|
101
|
+
) : e.configured ? (
|
|
102
|
+
<Badge tone="warning">{t("voice_ui.badge_unavailable")}</Badge>
|
|
169
103
|
) : (
|
|
170
|
-
|
|
171
|
-
<Button
|
|
172
|
-
size="sm"
|
|
173
|
-
variant="ghost"
|
|
174
|
-
onClick={() => onSetDefault(id)}
|
|
175
|
-
disabled={busy}
|
|
176
|
-
data-testid={`voice-provider-${id}-default`}
|
|
177
|
-
>
|
|
178
|
-
<Circle className="size-3.5" /> {t("voice_ui.set_as_default")}
|
|
179
|
-
</Button>
|
|
180
|
-
)
|
|
104
|
+
<Badge tone="muted">{t("voice_ui.badge_not_configured")}</Badge>
|
|
181
105
|
)}
|
|
182
|
-
|
|
106
|
+
</div>
|
|
107
|
+
<div className="truncate text-xs text-muted-fg">{note}</div>
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
<div className="flex shrink-0 items-center gap-2">
|
|
111
|
+
<Switch
|
|
112
|
+
checked={e.enabled}
|
|
113
|
+
onChange={(v) => onToggleEnabled(id, v)}
|
|
114
|
+
disabled={busy}
|
|
115
|
+
/>
|
|
116
|
+
<Button
|
|
117
|
+
size="sm"
|
|
118
|
+
variant="secondary"
|
|
119
|
+
onClick={() => onConfigure(id)}
|
|
120
|
+
data-testid={`voice-provider-${id}-config`}
|
|
121
|
+
>
|
|
122
|
+
<Settings2 className="size-3.5" /> {t("voice_ui.configure")}
|
|
123
|
+
</Button>
|
|
124
|
+
{e.custom && (
|
|
183
125
|
<Button
|
|
184
126
|
size="sm"
|
|
185
|
-
variant="
|
|
186
|
-
onClick={() =>
|
|
187
|
-
|
|
127
|
+
variant="ghost"
|
|
128
|
+
onClick={() => onRemove(id)}
|
|
129
|
+
disabled={busy}
|
|
130
|
+
aria-label={t("voice_ui.remove")}
|
|
131
|
+
data-testid={`voice-provider-${id}-remove`}
|
|
188
132
|
>
|
|
189
|
-
<
|
|
133
|
+
<Trash2 className="size-3.5" />
|
|
190
134
|
</Button>
|
|
191
|
-
|
|
135
|
+
)}
|
|
192
136
|
</div>
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
137
|
+
</div>
|
|
138
|
+
);
|
|
139
|
+
})}
|
|
140
|
+
|
|
141
|
+
<button
|
|
142
|
+
type="button"
|
|
143
|
+
onClick={onAddNew}
|
|
144
|
+
disabled={busy}
|
|
145
|
+
data-testid="voice-provider-add"
|
|
146
|
+
className="flex w-full items-center justify-center gap-2 rounded-lg border border-dashed border-border px-3 py-2.5 text-sm text-muted-fg transition-colors hover:border-emerald-500/50 hover:text-fg disabled:opacity-50"
|
|
147
|
+
>
|
|
148
|
+
<Plus className="size-4" /> {t("voice_ui.add_provider")}
|
|
149
|
+
</button>
|
|
196
150
|
</div>
|
|
197
151
|
);
|
|
198
152
|
}
|