voice-mode 4.3.1__py3-none-any.whl → 4.4.0__py3-none-any.whl

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 (70) hide show
  1. voice_mode/__version__.py +1 -1
  2. voice_mode/cli.py +3 -2
  3. voice_mode/cli_commands/claude.py +6 -199
  4. voice_mode/cli_commands/hook.py +13 -16
  5. voice_mode/frontend/.next/BUILD_ID +1 -1
  6. voice_mode/frontend/.next/app-build-manifest.json +5 -5
  7. voice_mode/frontend/.next/build-manifest.json +3 -3
  8. voice_mode/frontend/.next/next-minimal-server.js.nft.json +1 -1
  9. voice_mode/frontend/.next/next-server.js.nft.json +1 -1
  10. voice_mode/frontend/.next/prerender-manifest.json +1 -1
  11. voice_mode/frontend/.next/required-server-files.json +1 -1
  12. voice_mode/frontend/.next/server/app/_not-found/page.js +1 -1
  13. voice_mode/frontend/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. voice_mode/frontend/.next/server/app/_not-found.html +1 -1
  15. voice_mode/frontend/.next/server/app/_not-found.rsc +1 -1
  16. voice_mode/frontend/.next/server/app/api/connection-details/route.js +2 -2
  17. voice_mode/frontend/.next/server/app/favicon.ico/route.js +2 -2
  18. voice_mode/frontend/.next/server/app/index.html +1 -1
  19. voice_mode/frontend/.next/server/app/index.rsc +2 -2
  20. voice_mode/frontend/.next/server/app/page.js +3 -3
  21. voice_mode/frontend/.next/server/app/page_client-reference-manifest.js +1 -1
  22. voice_mode/frontend/.next/server/chunks/994.js +1 -1
  23. voice_mode/frontend/.next/server/middleware-build-manifest.js +1 -1
  24. voice_mode/frontend/.next/server/next-font-manifest.js +1 -1
  25. voice_mode/frontend/.next/server/next-font-manifest.json +1 -1
  26. voice_mode/frontend/.next/server/pages/404.html +1 -1
  27. voice_mode/frontend/.next/server/pages/500.html +1 -1
  28. voice_mode/frontend/.next/server/server-reference-manifest.json +1 -1
  29. voice_mode/frontend/.next/standalone/.next/BUILD_ID +1 -1
  30. voice_mode/frontend/.next/standalone/.next/app-build-manifest.json +5 -5
  31. voice_mode/frontend/.next/standalone/.next/build-manifest.json +3 -3
  32. voice_mode/frontend/.next/standalone/.next/prerender-manifest.json +1 -1
  33. voice_mode/frontend/.next/standalone/.next/required-server-files.json +1 -1
  34. voice_mode/frontend/.next/standalone/.next/server/app/_not-found/page.js +1 -1
  35. voice_mode/frontend/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  36. voice_mode/frontend/.next/standalone/.next/server/app/_not-found.html +1 -1
  37. voice_mode/frontend/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  38. voice_mode/frontend/.next/standalone/.next/server/app/api/connection-details/route.js +2 -2
  39. voice_mode/frontend/.next/standalone/.next/server/app/favicon.ico/route.js +2 -2
  40. voice_mode/frontend/.next/standalone/.next/server/app/index.html +1 -1
  41. voice_mode/frontend/.next/standalone/.next/server/app/index.rsc +2 -2
  42. voice_mode/frontend/.next/standalone/.next/server/app/page.js +3 -3
  43. voice_mode/frontend/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  44. voice_mode/frontend/.next/standalone/.next/server/chunks/994.js +1 -1
  45. voice_mode/frontend/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  46. voice_mode/frontend/.next/standalone/.next/server/next-font-manifest.js +1 -1
  47. voice_mode/frontend/.next/standalone/.next/server/next-font-manifest.json +1 -1
  48. voice_mode/frontend/.next/standalone/.next/server/pages/404.html +1 -1
  49. voice_mode/frontend/.next/standalone/.next/server/pages/500.html +1 -1
  50. voice_mode/frontend/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  51. voice_mode/frontend/.next/standalone/server.js +1 -1
  52. voice_mode/frontend/.next/static/chunks/app/{layout-b52135f331b36caf.js → layout-917e8410913fe899.js} +1 -1
  53. voice_mode/frontend/.next/static/chunks/app/{page-43b7b45e01f0aa87.js → page-ae0d14863ed895ea.js} +1 -1
  54. voice_mode/frontend/.next/static/chunks/{main-app-80dc9078926fc708.js → main-app-836e76fc70b52220.js} +1 -1
  55. voice_mode/frontend/.next/trace +43 -43
  56. voice_mode/frontend/.next/types/app/api/connection-details/route.ts +1 -1
  57. voice_mode/frontend/.next/types/app/layout.ts +1 -1
  58. voice_mode/frontend/.next/types/app/page.ts +1 -1
  59. voice_mode/frontend/package-lock.json +9 -9
  60. voice_mode/statistics_tracking.py +42 -0
  61. voice_mode/tools/__init__.py +41 -15
  62. voice_mode/tools/converse.py +1 -1
  63. voice_mode/tools/statistics.py +0 -33
  64. {voice_mode-4.3.1.dist-info → voice_mode-4.4.0.dist-info}/METADATA +33 -40
  65. {voice_mode-4.3.1.dist-info → voice_mode-4.4.0.dist-info}/RECORD +69 -69
  66. voice_mode/tools/claude_thinking.py +0 -285
  67. /voice_mode/frontend/.next/static/{uZHYPdRYOObTZ3MQHekp0 → WhZriRkBKVNPSmCnOFRav}/_buildManifest.js +0 -0
  68. /voice_mode/frontend/.next/static/{uZHYPdRYOObTZ3MQHekp0 → WhZriRkBKVNPSmCnOFRav}/_ssgManifest.js +0 -0
  69. {voice_mode-4.3.1.dist-info → voice_mode-4.4.0.dist-info}/WHEEL +0 -0
  70. {voice_mode-4.3.1.dist-info → voice_mode-4.4.0.dist-info}/entry_points.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  voice_mode/__init__.py,sha256=PDCwE2rrm8yyYxEiQQJkznQ_4xYp3DWIxGSB84K_mnI,346
2
2
  voice_mode/__main__.py,sha256=td-njie1XgkR-NrQjOEUse4TSJBC8DAmYywHum3V6WQ,138
3
- voice_mode/__version__.py,sha256=hlaFtPsGqaParB96sJK1cVHe2q_XB-TK47v_CmE5tq0,100
4
- voice_mode/cli.py,sha256=iFvRBLmzzHe22vZGJkwABzaNU7d5TQjE4gt2z7tDcSc,74590
3
+ voice_mode/__version__.py,sha256=tV8n3x_DPfYZxj7h0DvKLePay0Aaj6xaN3Vuf2opCRQ,100
4
+ voice_mode/cli.py,sha256=SlG44DUOFZs4bvZrj7wjHebYf093jUx3hQOIZpp5-U4,74628
5
5
  voice_mode/config.py,sha256=GZzhp6D_20tVx5Utxny9R2CX2PHFdsJxPJBQBZtT0Os,36397
6
6
  voice_mode/conversation_logger.py,sha256=Nar92xabhaVmMKdZdLmgoYckK9fGAVVYWdass3-EI1I,9363
7
7
  voice_mode/core.py,sha256=WACixDHS23UMhmBJKN2zgDqeWtpAdXHOSduDc3fmOio,28452
@@ -12,12 +12,13 @@ voice_mode/server.py,sha256=IhdTtraP51UlmN_yKDAk_ZBBxtkDOEdBV6B4olu7uVA,3044
12
12
  voice_mode/shared.py,sha256=dr6rki6lKPtn6lhkZSXbIJl-rhK9dKXAw6eYpHFhUOU,3468
13
13
  voice_mode/simple_failover.py,sha256=1LvbxZNXJOX2Ai6vGJ_Rwaa5_1A0TsL5hXHb_PvZoT0,6070
14
14
  voice_mode/statistics.py,sha256=ckssYzOJMMgCfmmGNlCRhX4o9y0LWN9Gt42WlEUI3DE,15785
15
+ voice_mode/statistics_tracking.py,sha256=4F5dW0zSOFvWrw86Zl0hHdOCW9mVLlyGh01Mf8Ex_Fk,1568
15
16
  voice_mode/streaming.py,sha256=AP0dPt8jAGnM_i3qhtPe4334EBQryWxOJ6NPt48tHvE,21744
16
17
  voice_mode/version.py,sha256=rgv7tThj3fBO006bhff3iz_TlfE5uQS4Gws-9xf8YIc,2452
17
18
  voice_mode/cli_commands/__init__.py,sha256=qaIkE-dtA0_s400BfX7h6IIoFQlNrXwGLbuHRhGUjWA,32
18
- voice_mode/cli_commands/claude.py,sha256=Y2RekhRmo2EPbOFlo-Nt1iS-TZkISQWVGy6ekPnp1IE,7897
19
+ voice_mode/cli_commands/claude.py,sha256=IjyvTg3639f74926gLAgIxqBBHq0aWcKex_l-zApdxE,287
19
20
  voice_mode/cli_commands/exchanges.py,sha256=R8k_MtiZmDG7ST974MoDTkUKgvGgLNESzTjg2dvZRoY,16828
20
- voice_mode/cli_commands/hook.py,sha256=_VMeMtWCF-gOISw1guqiCSsVJtlSVDH8V2HMDEvw-10,7490
21
+ voice_mode/cli_commands/hook.py,sha256=72azdD0_kHlqfDRgo8udqsHYZzAftsvXgFf4LFEMBc0,7374
21
22
  voice_mode/cli_commands/pronounce_commands.py,sha256=uznL2OYGc-asQGSLciHo--o-nyuQV-ZS8ZMoBjmD6o0,7941
22
23
  voice_mode/cli_commands/transcribe.py,sha256=z5R8_66hRhNR-9vBWTj5gkPgbf6xV7dCxE0fpASUSJ8,4200
23
24
  voice_mode/data/default_pronunciation.yaml,sha256=LD3TRi2R4A9h8CG5sg9tqF-fLgpMdy7je4A2irLWXY0,6048
@@ -32,64 +33,64 @@ voice_mode/exchanges/stats.py,sha256=UVnJnVuqmd64T_iqBLVLPjTIDoyZwRg-MZUFJMHHWxg
32
33
  voice_mode/frontend/README.md,sha256=uosvWgNiWL_sP9liv-wnDNdPmJ3oFiLstXygxyzcN7A,2131
33
34
  voice_mode/frontend/next-env.d.ts,sha256=ndnWQs24fU1bMXMhfgxFQps-R6b1z1-w6tbGROxf7QE,228
34
35
  voice_mode/frontend/next.config.mjs,sha256=5kqiwwjpFblS_IHlnDJh7ELk_3rldB6pcSXIbrkytpQ,767
35
- voice_mode/frontend/package-lock.json,sha256=Fi_sQCUvxVUHdckSUWsMgXg-a67tCAM5dD_CHKhbXDE,143483
36
+ voice_mode/frontend/package-lock.json,sha256=vqrs3_WQ7rdirFXkdJcnTNtsVLiJOxDMTAoibKAPgL4,143483
36
37
  voice_mode/frontend/package.json,sha256=BUOh3UiaHq1D0Bww-jy2EjhOi-47rjOipeUqXONJndo,1150
37
38
  voice_mode/frontend/pnpm-lock.yaml,sha256=DSl1H3fb4tNVrHjsc5HbflJJIr95erkADNeUoFY21x4,127796
38
39
  voice_mode/frontend/postcss.config.mjs,sha256=76ZcZeF9UdWFcO3OnXArBgT99qm422Wvrtjwda-IZ8c,157
39
40
  voice_mode/frontend/tailwind.config.ts,sha256=w0mWCjy3kwryNcqgub24YLbmd2V9EvOmWSYHmsFdpkY,264
40
41
  voice_mode/frontend/tsconfig.json,sha256=VCAvHW01ulHD2uoyv2fo2iRWjsDLDDQfoLXtLOsXTy0,574
41
- voice_mode/frontend/.next/BUILD_ID,sha256=X8mM7A2zGJIziuQCTboK0AfIHeu3FjDDXqdn7cHdyPk,21
42
- voice_mode/frontend/.next/app-build-manifest.json,sha256=TbicmWux7jTCd0CvX1BjxduI37r41Ptv3z9ioyT4cOg,1010
42
+ voice_mode/frontend/.next/BUILD_ID,sha256=apzCf11yUFhlif5VrDHXPXuiuBQdW27iRG_xCUZhbiQ,21
43
+ voice_mode/frontend/.next/app-build-manifest.json,sha256=1seKzELnFrkVNpwMOed_LeW0jMK3fUWORQlcJLn9p_A,1010
43
44
  voice_mode/frontend/.next/app-path-routes-manifest.json,sha256=-WXlpEHFoCBUDPfxzUJleLsfZiEUU-rU0hRMZ8AVIJI,140
44
- voice_mode/frontend/.next/build-manifest.json,sha256=oYhHV2oq0s7bauA3EcRMGtVDVZVCH0JhHllYbOC-op4,968
45
+ voice_mode/frontend/.next/build-manifest.json,sha256=tr7-7wcNQk5xdKJoi-EyOts8x8N3oH1Fvaml7LDIVH4,968
45
46
  voice_mode/frontend/.next/export-marker.json,sha256=ALjrM5QMj5hmGX14xIc2wIFDfLaFKlK3n1wQpwjMagI,94
46
47
  voice_mode/frontend/.next/images-manifest.json,sha256=Z1eB8ppSn86wfAon69Z5DSKbg7IoIvyGB8uCu88xGjs,511
47
- voice_mode/frontend/.next/next-minimal-server.js.nft.json,sha256=scQyKcK_MstJdHIpdt5rZOBtLLH4N6vF4y3YAXjx5O4,7314
48
- voice_mode/frontend/.next/next-server.js.nft.json,sha256=IWJYelH2PDZUe-yD6krT6rdmJ4455xGqi5NKLRybimQ,109011
48
+ voice_mode/frontend/.next/next-minimal-server.js.nft.json,sha256=Ed0BK__L6SAZeFDdbpzYFw20jzqNf6xvqs4jD8XFJoM,7314
49
+ voice_mode/frontend/.next/next-server.js.nft.json,sha256=JJq52AeIl7BAtYXCVyVdrkX1um47lwWMK3MamD8yEIE,109011
49
50
  voice_mode/frontend/.next/package.json,sha256=CRoE-mfHkHuY4Qb8_4uWThMSl1T85y0k8wJbl8SIf6M,20
50
- voice_mode/frontend/.next/prerender-manifest.json,sha256=FjKA8DpKBKRyH-bMWdUTbW_m0hIBAsgbZfW8FX9j7io,959
51
+ voice_mode/frontend/.next/prerender-manifest.json,sha256=5HcdBF1n4qO6-7OqlAODVQDuxZTsLn759ElrT6Zu-2g,959
51
52
  voice_mode/frontend/.next/react-loadable-manifest.json,sha256=RBNvo1WzZ4oRRq0W9-hknpT7T8If536DEMBg9hyq_4o,2
52
- voice_mode/frontend/.next/required-server-files.json,sha256=2gTll7ptAM4go8kDbVaj_4wpnslw0c7z1qV9AgmaLSk,4748
53
+ voice_mode/frontend/.next/required-server-files.json,sha256=DvMxkZnUCyygtYvwAR8zL-RQN1MjkWNJyldD5HwsdFw,4748
53
54
  voice_mode/frontend/.next/routes-manifest.json,sha256=DqV6K_WLiS6wKvdr8TpF7-uBhH7xbrg7xeznwWaeO70,831
54
- voice_mode/frontend/.next/trace,sha256=YkM1t56bpGFDGJz6VvrrJxPmYfttL72UqC1StYvKDXo,898370
55
+ voice_mode/frontend/.next/trace,sha256=P0quSCovZcvUH2TNFum6cIwsLrdyYxzxPvTuf8pffkI,898490
55
56
  voice_mode/frontend/.next/server/app-paths-manifest.json,sha256=Xyxtr52aubW5XDHj7Ms66qiSJfwCkBVeL3ekU8uh2os,202
56
57
  voice_mode/frontend/.next/server/font-manifest.json,sha256=T1PNoYwrqgwDVLtfmj7L5e0Sq02OEbqHPC8RFhICuUU,2
57
58
  voice_mode/frontend/.next/server/functions-config-manifest.json,sha256=CUXUfXux-dC5WRXm4vr6xa3f-RKEsEV1aG-hO3KK0CE,56
58
59
  voice_mode/frontend/.next/server/interception-route-rewrite-manifest.js,sha256=_FEz5ArPCeZRewc93XtcDCGNCZOISJAiEPLME_COHIE,48
59
- voice_mode/frontend/.next/server/middleware-build-manifest.js,sha256=FHEzt7xsFLvGqBbSTYTf-m93jGOgs0U6kpkDWw9_Jss,888
60
+ voice_mode/frontend/.next/server/middleware-build-manifest.js,sha256=l0g9lKYzWVBq8L9yL3nR16nqf2I5BwaZsI1J1q7aXKY,888
60
61
  voice_mode/frontend/.next/server/middleware-manifest.json,sha256=CoUgvH4Hb3rnF8LWJxOZDIPoo9dGJvMno4RLwFBOIQw,83
61
62
  voice_mode/frontend/.next/server/middleware-react-loadable-manifest.js,sha256=rS557JHipUQIQNo9i9IiwnmztMR-ialoMnpm9ssS64I,36
62
- voice_mode/frontend/.next/server/next-font-manifest.js,sha256=48R-8_QE-NBHoAz9InqM4V52FveyFXrhmU9VmGm62Q4,228
63
- voice_mode/frontend/.next/server/next-font-manifest.json,sha256=xIrCi3FgEDgWRXCg8JuPlcuHiQ593w5HojugXpE7XHw,199
63
+ voice_mode/frontend/.next/server/next-font-manifest.js,sha256=-pTFIuyIkT-x3N7B9FDvuHkgKaI4hzLO8SpOdEvjOaQ,228
64
+ voice_mode/frontend/.next/server/next-font-manifest.json,sha256=HVn8OwAedhReEuMho8GMmDoHHGdlyna6wm2sOOdl3N4,199
64
65
  voice_mode/frontend/.next/server/pages-manifest.json,sha256=CtIVJgXR_t73dArygJmC6GsgbxLMM1N2fAUgg0-bUc8,111
65
66
  voice_mode/frontend/.next/server/server-reference-manifest.js,sha256=zgEAbADh9jvL_kGz9-3SYNlptB0KMjtwXETh753xPYw,123
66
- voice_mode/frontend/.next/server/server-reference-manifest.json,sha256=3S8y_-eald-J3m7vHsR-h6505VyYLqn0dEESacMDILA,84
67
+ voice_mode/frontend/.next/server/server-reference-manifest.json,sha256=hUtxwUWKvW2GoTCOHesW6sHu423LZ5Qt688x2Qq7Awk,84
67
68
  voice_mode/frontend/.next/server/webpack-runtime.js,sha256=mmuyol21D9il2KNetWeEUG5OBu3z05WsphIyIbwvads,1469
68
- voice_mode/frontend/.next/server/app/_not-found.html,sha256=2pDWaxvhex_WxD09-fDo2jnnNKXPv-kV-babSbDpfxo,6752
69
+ voice_mode/frontend/.next/server/app/_not-found.html,sha256=0NG6oWKMo5AqetKNj7efEvuIrqJr_FLK_P20OIagKbA,6752
69
70
  voice_mode/frontend/.next/server/app/_not-found.meta,sha256=8-vSzkZIhJgJ7_uOmMyzHNf5QN3Exhbk-5ObKal4lrc,142
70
- voice_mode/frontend/.next/server/app/_not-found.rsc,sha256=kuPjH4c5f77TE3wFHNLYWbXHGKvUmZkTYe8-OCMcFmc,3621
71
+ voice_mode/frontend/.next/server/app/_not-found.rsc,sha256=_pkHshYQql_14zagy3_1PqU4HoHVL1bgIkymijMqb4c,3621
71
72
  voice_mode/frontend/.next/server/app/favicon.ico.body,sha256=Cc2QdQ-OI3iME7dIf86sbqXHW3D8LPUprF_KB2KZogI,15406
72
73
  voice_mode/frontend/.next/server/app/favicon.ico.meta,sha256=iac7LJDMkBlPpPPzKMbIDSh2bqoxNKhYx_5nQjo5Tds,211
73
- voice_mode/frontend/.next/server/app/index.html,sha256=SwAtfhXUKOX_76RfM5TBad0BDut0_ZEXbWOGNXM9_8o,5396
74
+ voice_mode/frontend/.next/server/app/index.html,sha256=jUE4CEWKttBf-A7ME8M9jx8OC4G4NL5E1GjjeqV2BCc,5396
74
75
  voice_mode/frontend/.next/server/app/index.meta,sha256=BDswoSxeaM0dEV3Vl3-2HNVKE5mS5NQhBYZcQQt5mnQ,80
75
- voice_mode/frontend/.next/server/app/index.rsc,sha256=3bb6p6dDhy2xjuW6LtBjRJ-hc2hT6tn3WWKGrw_TcKA,2438
76
- voice_mode/frontend/.next/server/app/page.js,sha256=Hp9JTC2uchhs8UnIXH4Gvu9fbm5-oHDcNERBClgyIHk,611916
76
+ voice_mode/frontend/.next/server/app/index.rsc,sha256=XWJKHea8MGkTii80AwtSfgnUiVIlcO7KKtHbyATGsSc,2438
77
+ voice_mode/frontend/.next/server/app/page.js,sha256=OBrbBm9UkpUOpwsV0pdTVhuNNBLI992do4TOO0Cadpw,611918
77
78
  voice_mode/frontend/.next/server/app/page.js.nft.json,sha256=6plKkaMV7NDsYDUQsMAnayayODq1vS_l6nRXRrm9Trg,1168
78
- voice_mode/frontend/.next/server/app/page_client-reference-manifest.js,sha256=VvH-_StmoLGhe8Jmsi9kz7yfLJcBt5J6R3dmOgtGxyY,4174
79
- voice_mode/frontend/.next/server/app/_not-found/page.js,sha256=S6Go3tvpDHllmLa6n5bqaFUfSlpCvsSeSVhM0DkPTnI,3386
79
+ voice_mode/frontend/.next/server/app/page_client-reference-manifest.js,sha256=iw6WAH8F9RODwXqKv1eNr5FaMyRe0HUCXe2lgfR24OI,4174
80
+ voice_mode/frontend/.next/server/app/_not-found/page.js,sha256=Zn1nvzF96FTG_uIWzqULBvrU05kQZt0YzF-SkRc2CUw,3386
80
81
  voice_mode/frontend/.next/server/app/_not-found/page.js.nft.json,sha256=7Z_Wav7koMsnepi3GignvrVRYuDbzwvKqqg84LuoSis,1195
81
- voice_mode/frontend/.next/server/app/_not-found/page_client-reference-manifest.js,sha256=nrXXJMUl-MMZgH2B_mHJi6KMoRcBQ3P54frTykAZOR8,4277
82
- voice_mode/frontend/.next/server/app/api/connection-details/route.js,sha256=TkNeEqpmhwkvo2rFKf6CqD_8Q64rUgjhvJsfWVLOYeI,121019
82
+ voice_mode/frontend/.next/server/app/_not-found/page_client-reference-manifest.js,sha256=UkXIfBWo94vmIB1IoZ_T0B1VylPSZquJj5UI6HK4_lI,4277
83
+ voice_mode/frontend/.next/server/app/api/connection-details/route.js,sha256=poKHj544J_PuennfZGFjLpceLIatkmmIXwKuMFQMhSo,121019
83
84
  voice_mode/frontend/.next/server/app/api/connection-details/route.js.nft.json,sha256=qjdiqEpb5s6iSOQsC1MI3A0_sVjbF9Eh1t1mR_VcS9o,1327
84
- voice_mode/frontend/.next/server/app/favicon.ico/route.js,sha256=gTi_QAzv8VbEOfw4T4E1Txcf-zJn2GuWoOqsG78frBY,66227
85
+ voice_mode/frontend/.next/server/app/favicon.ico/route.js,sha256=j1ENvniMzEBKfZwzv6v1aH2xCRcQVc_DVwl3KSHRZLM,66225
85
86
  voice_mode/frontend/.next/server/app/favicon.ico/route.js.nft.json,sha256=xn4G0NuxuIbLuaN_3PVtjN4lYs5MWduPcvqhdZwRNkQ,1248
86
87
  voice_mode/frontend/.next/server/chunks/463.js,sha256=9Fg9G6vSgz6lLnnirTbzQKyy5MQAf59a16SvYM0xDFc,6201
87
88
  voice_mode/frontend/.next/server/chunks/682.js,sha256=dxTmuBsZ77qjHYtQvwM0HeoE4FnESxOOpTnhW3ABg18,33636
88
89
  voice_mode/frontend/.next/server/chunks/948.js,sha256=2QNDLi5TnS9qLpgKRmsx_sJzO2vtdQJIRn124o6fjeI,57650
89
- voice_mode/frontend/.next/server/chunks/994.js,sha256=O0BwQHvTudqV92K_-1YPG-tt-zAe5AUtjUf2rq_NfpM,95353
90
+ voice_mode/frontend/.next/server/chunks/994.js,sha256=LKxli1Q12bHvRK5T2aroAuCcTNS44XSW09a0-d-llfc,95353
90
91
  voice_mode/frontend/.next/server/chunks/font-manifest.json,sha256=T1PNoYwrqgwDVLtfmj7L5e0Sq02OEbqHPC8RFhICuUU,2
91
- voice_mode/frontend/.next/server/pages/404.html,sha256=2pDWaxvhex_WxD09-fDo2jnnNKXPv-kV-babSbDpfxo,6752
92
- voice_mode/frontend/.next/server/pages/500.html,sha256=rzLoSCUz1ihMN-tJSPJ5bUHGSDnoqJdPUnOxasaYyJ4,1995
92
+ voice_mode/frontend/.next/server/pages/404.html,sha256=0NG6oWKMo5AqetKNj7efEvuIrqJr_FLK_P20OIagKbA,6752
93
+ voice_mode/frontend/.next/server/pages/500.html,sha256=hDwMgJlm36BruqH1LnwKP6QOP_VV-9vwMsW-BHqR3RY,1995
93
94
  voice_mode/frontend/.next/server/pages/_app.js,sha256=xv0yBH2BTySxH6d7_oFG8KbedK3Jhvvg9SQ7pSaSPrE,3291
94
95
  voice_mode/frontend/.next/server/pages/_app.js.nft.json,sha256=4DM09IfF6_ws-h14UVrroVq0Ri8tNeDEwwZ2c244nKM,517
95
96
  voice_mode/frontend/.next/server/pages/_document.js,sha256=q-VJKG6tPCpEYWhP0UobYWG_naYdKPuqkRpb4HGMV_Y,378
@@ -97,68 +98,70 @@ voice_mode/frontend/.next/server/pages/_document.js.nft.json,sha256=7WnWXoJIsRyt
97
98
  voice_mode/frontend/.next/server/pages/_error.js,sha256=1se20NEwePcXdV17_wUw4YhoMwVAenxiXI74aXSRqzU,8619
98
99
  voice_mode/frontend/.next/server/pages/_error.js.nft.json,sha256=uK8O79iTeItVu_-Dz90fkTMA1GYxQEpTWU8TndjkfVQ,1855
99
100
  voice_mode/frontend/.next/standalone/package.json,sha256=BUOh3UiaHq1D0Bww-jy2EjhOi-47rjOipeUqXONJndo,1150
100
- voice_mode/frontend/.next/standalone/server.js,sha256=73mmdWf8FDxRobQsxrHhbv-TZwlS0zdPHJSHb0kbw30,4741
101
- voice_mode/frontend/.next/standalone/.next/BUILD_ID,sha256=X8mM7A2zGJIziuQCTboK0AfIHeu3FjDDXqdn7cHdyPk,21
102
- voice_mode/frontend/.next/standalone/.next/app-build-manifest.json,sha256=TbicmWux7jTCd0CvX1BjxduI37r41Ptv3z9ioyT4cOg,1010
101
+ voice_mode/frontend/.next/standalone/server.js,sha256=kFYg7QthM3UXXJDVm20WpK_7gKLbtNinu_9eduCcn5g,4741
102
+ voice_mode/frontend/.next/standalone/.next/BUILD_ID,sha256=apzCf11yUFhlif5VrDHXPXuiuBQdW27iRG_xCUZhbiQ,21
103
+ voice_mode/frontend/.next/standalone/.next/app-build-manifest.json,sha256=1seKzELnFrkVNpwMOed_LeW0jMK3fUWORQlcJLn9p_A,1010
103
104
  voice_mode/frontend/.next/standalone/.next/app-path-routes-manifest.json,sha256=-WXlpEHFoCBUDPfxzUJleLsfZiEUU-rU0hRMZ8AVIJI,140
104
- voice_mode/frontend/.next/standalone/.next/build-manifest.json,sha256=oYhHV2oq0s7bauA3EcRMGtVDVZVCH0JhHllYbOC-op4,968
105
+ voice_mode/frontend/.next/standalone/.next/build-manifest.json,sha256=tr7-7wcNQk5xdKJoi-EyOts8x8N3oH1Fvaml7LDIVH4,968
105
106
  voice_mode/frontend/.next/standalone/.next/package.json,sha256=CRoE-mfHkHuY4Qb8_4uWThMSl1T85y0k8wJbl8SIf6M,20
106
- voice_mode/frontend/.next/standalone/.next/prerender-manifest.json,sha256=FjKA8DpKBKRyH-bMWdUTbW_m0hIBAsgbZfW8FX9j7io,959
107
+ voice_mode/frontend/.next/standalone/.next/prerender-manifest.json,sha256=5HcdBF1n4qO6-7OqlAODVQDuxZTsLn759ElrT6Zu-2g,959
107
108
  voice_mode/frontend/.next/standalone/.next/react-loadable-manifest.json,sha256=RBNvo1WzZ4oRRq0W9-hknpT7T8If536DEMBg9hyq_4o,2
108
- voice_mode/frontend/.next/standalone/.next/required-server-files.json,sha256=2gTll7ptAM4go8kDbVaj_4wpnslw0c7z1qV9AgmaLSk,4748
109
+ voice_mode/frontend/.next/standalone/.next/required-server-files.json,sha256=DvMxkZnUCyygtYvwAR8zL-RQN1MjkWNJyldD5HwsdFw,4748
109
110
  voice_mode/frontend/.next/standalone/.next/routes-manifest.json,sha256=DqV6K_WLiS6wKvdr8TpF7-uBhH7xbrg7xeznwWaeO70,831
110
111
  voice_mode/frontend/.next/standalone/.next/server/app-paths-manifest.json,sha256=Xyxtr52aubW5XDHj7Ms66qiSJfwCkBVeL3ekU8uh2os,202
111
112
  voice_mode/frontend/.next/standalone/.next/server/font-manifest.json,sha256=T1PNoYwrqgwDVLtfmj7L5e0Sq02OEbqHPC8RFhICuUU,2
112
- voice_mode/frontend/.next/standalone/.next/server/middleware-build-manifest.js,sha256=FHEzt7xsFLvGqBbSTYTf-m93jGOgs0U6kpkDWw9_Jss,888
113
+ voice_mode/frontend/.next/standalone/.next/server/middleware-build-manifest.js,sha256=l0g9lKYzWVBq8L9yL3nR16nqf2I5BwaZsI1J1q7aXKY,888
113
114
  voice_mode/frontend/.next/standalone/.next/server/middleware-manifest.json,sha256=CoUgvH4Hb3rnF8LWJxOZDIPoo9dGJvMno4RLwFBOIQw,83
114
115
  voice_mode/frontend/.next/standalone/.next/server/middleware-react-loadable-manifest.js,sha256=rS557JHipUQIQNo9i9IiwnmztMR-ialoMnpm9ssS64I,36
115
- voice_mode/frontend/.next/standalone/.next/server/next-font-manifest.js,sha256=48R-8_QE-NBHoAz9InqM4V52FveyFXrhmU9VmGm62Q4,228
116
- voice_mode/frontend/.next/standalone/.next/server/next-font-manifest.json,sha256=xIrCi3FgEDgWRXCg8JuPlcuHiQ593w5HojugXpE7XHw,199
116
+ voice_mode/frontend/.next/standalone/.next/server/next-font-manifest.js,sha256=-pTFIuyIkT-x3N7B9FDvuHkgKaI4hzLO8SpOdEvjOaQ,228
117
+ voice_mode/frontend/.next/standalone/.next/server/next-font-manifest.json,sha256=HVn8OwAedhReEuMho8GMmDoHHGdlyna6wm2sOOdl3N4,199
117
118
  voice_mode/frontend/.next/standalone/.next/server/pages-manifest.json,sha256=CtIVJgXR_t73dArygJmC6GsgbxLMM1N2fAUgg0-bUc8,111
118
119
  voice_mode/frontend/.next/standalone/.next/server/server-reference-manifest.js,sha256=zgEAbADh9jvL_kGz9-3SYNlptB0KMjtwXETh753xPYw,123
119
- voice_mode/frontend/.next/standalone/.next/server/server-reference-manifest.json,sha256=3S8y_-eald-J3m7vHsR-h6505VyYLqn0dEESacMDILA,84
120
+ voice_mode/frontend/.next/standalone/.next/server/server-reference-manifest.json,sha256=hUtxwUWKvW2GoTCOHesW6sHu423LZ5Qt688x2Qq7Awk,84
120
121
  voice_mode/frontend/.next/standalone/.next/server/webpack-runtime.js,sha256=mmuyol21D9il2KNetWeEUG5OBu3z05WsphIyIbwvads,1469
121
- voice_mode/frontend/.next/standalone/.next/server/app/_not-found.html,sha256=2pDWaxvhex_WxD09-fDo2jnnNKXPv-kV-babSbDpfxo,6752
122
+ voice_mode/frontend/.next/standalone/.next/server/app/_not-found.html,sha256=0NG6oWKMo5AqetKNj7efEvuIrqJr_FLK_P20OIagKbA,6752
122
123
  voice_mode/frontend/.next/standalone/.next/server/app/_not-found.meta,sha256=8-vSzkZIhJgJ7_uOmMyzHNf5QN3Exhbk-5ObKal4lrc,142
123
- voice_mode/frontend/.next/standalone/.next/server/app/_not-found.rsc,sha256=kuPjH4c5f77TE3wFHNLYWbXHGKvUmZkTYe8-OCMcFmc,3621
124
+ voice_mode/frontend/.next/standalone/.next/server/app/_not-found.rsc,sha256=_pkHshYQql_14zagy3_1PqU4HoHVL1bgIkymijMqb4c,3621
124
125
  voice_mode/frontend/.next/standalone/.next/server/app/favicon.ico.body,sha256=Cc2QdQ-OI3iME7dIf86sbqXHW3D8LPUprF_KB2KZogI,15406
125
126
  voice_mode/frontend/.next/standalone/.next/server/app/favicon.ico.meta,sha256=iac7LJDMkBlPpPPzKMbIDSh2bqoxNKhYx_5nQjo5Tds,211
126
- voice_mode/frontend/.next/standalone/.next/server/app/index.html,sha256=SwAtfhXUKOX_76RfM5TBad0BDut0_ZEXbWOGNXM9_8o,5396
127
+ voice_mode/frontend/.next/standalone/.next/server/app/index.html,sha256=jUE4CEWKttBf-A7ME8M9jx8OC4G4NL5E1GjjeqV2BCc,5396
127
128
  voice_mode/frontend/.next/standalone/.next/server/app/index.meta,sha256=BDswoSxeaM0dEV3Vl3-2HNVKE5mS5NQhBYZcQQt5mnQ,80
128
- voice_mode/frontend/.next/standalone/.next/server/app/index.rsc,sha256=3bb6p6dDhy2xjuW6LtBjRJ-hc2hT6tn3WWKGrw_TcKA,2438
129
- voice_mode/frontend/.next/standalone/.next/server/app/page.js,sha256=Hp9JTC2uchhs8UnIXH4Gvu9fbm5-oHDcNERBClgyIHk,611916
129
+ voice_mode/frontend/.next/standalone/.next/server/app/index.rsc,sha256=XWJKHea8MGkTii80AwtSfgnUiVIlcO7KKtHbyATGsSc,2438
130
+ voice_mode/frontend/.next/standalone/.next/server/app/page.js,sha256=OBrbBm9UkpUOpwsV0pdTVhuNNBLI992do4TOO0Cadpw,611918
130
131
  voice_mode/frontend/.next/standalone/.next/server/app/page.js.nft.json,sha256=6plKkaMV7NDsYDUQsMAnayayODq1vS_l6nRXRrm9Trg,1168
131
- voice_mode/frontend/.next/standalone/.next/server/app/page_client-reference-manifest.js,sha256=VvH-_StmoLGhe8Jmsi9kz7yfLJcBt5J6R3dmOgtGxyY,4174
132
- voice_mode/frontend/.next/standalone/.next/server/app/_not-found/page.js,sha256=S6Go3tvpDHllmLa6n5bqaFUfSlpCvsSeSVhM0DkPTnI,3386
132
+ voice_mode/frontend/.next/standalone/.next/server/app/page_client-reference-manifest.js,sha256=iw6WAH8F9RODwXqKv1eNr5FaMyRe0HUCXe2lgfR24OI,4174
133
+ voice_mode/frontend/.next/standalone/.next/server/app/_not-found/page.js,sha256=Zn1nvzF96FTG_uIWzqULBvrU05kQZt0YzF-SkRc2CUw,3386
133
134
  voice_mode/frontend/.next/standalone/.next/server/app/_not-found/page.js.nft.json,sha256=7Z_Wav7koMsnepi3GignvrVRYuDbzwvKqqg84LuoSis,1195
134
- voice_mode/frontend/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js,sha256=nrXXJMUl-MMZgH2B_mHJi6KMoRcBQ3P54frTykAZOR8,4277
135
- voice_mode/frontend/.next/standalone/.next/server/app/api/connection-details/route.js,sha256=TkNeEqpmhwkvo2rFKf6CqD_8Q64rUgjhvJsfWVLOYeI,121019
135
+ voice_mode/frontend/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js,sha256=UkXIfBWo94vmIB1IoZ_T0B1VylPSZquJj5UI6HK4_lI,4277
136
+ voice_mode/frontend/.next/standalone/.next/server/app/api/connection-details/route.js,sha256=poKHj544J_PuennfZGFjLpceLIatkmmIXwKuMFQMhSo,121019
136
137
  voice_mode/frontend/.next/standalone/.next/server/app/api/connection-details/route.js.nft.json,sha256=qjdiqEpb5s6iSOQsC1MI3A0_sVjbF9Eh1t1mR_VcS9o,1327
137
- voice_mode/frontend/.next/standalone/.next/server/app/favicon.ico/route.js,sha256=gTi_QAzv8VbEOfw4T4E1Txcf-zJn2GuWoOqsG78frBY,66227
138
+ voice_mode/frontend/.next/standalone/.next/server/app/favicon.ico/route.js,sha256=j1ENvniMzEBKfZwzv6v1aH2xCRcQVc_DVwl3KSHRZLM,66225
138
139
  voice_mode/frontend/.next/standalone/.next/server/app/favicon.ico/route.js.nft.json,sha256=xn4G0NuxuIbLuaN_3PVtjN4lYs5MWduPcvqhdZwRNkQ,1248
139
140
  voice_mode/frontend/.next/standalone/.next/server/chunks/463.js,sha256=9Fg9G6vSgz6lLnnirTbzQKyy5MQAf59a16SvYM0xDFc,6201
140
141
  voice_mode/frontend/.next/standalone/.next/server/chunks/682.js,sha256=dxTmuBsZ77qjHYtQvwM0HeoE4FnESxOOpTnhW3ABg18,33636
141
142
  voice_mode/frontend/.next/standalone/.next/server/chunks/948.js,sha256=2QNDLi5TnS9qLpgKRmsx_sJzO2vtdQJIRn124o6fjeI,57650
142
- voice_mode/frontend/.next/standalone/.next/server/chunks/994.js,sha256=O0BwQHvTudqV92K_-1YPG-tt-zAe5AUtjUf2rq_NfpM,95353
143
- voice_mode/frontend/.next/standalone/.next/server/pages/404.html,sha256=2pDWaxvhex_WxD09-fDo2jnnNKXPv-kV-babSbDpfxo,6752
144
- voice_mode/frontend/.next/standalone/.next/server/pages/500.html,sha256=rzLoSCUz1ihMN-tJSPJ5bUHGSDnoqJdPUnOxasaYyJ4,1995
143
+ voice_mode/frontend/.next/standalone/.next/server/chunks/994.js,sha256=LKxli1Q12bHvRK5T2aroAuCcTNS44XSW09a0-d-llfc,95353
144
+ voice_mode/frontend/.next/standalone/.next/server/pages/404.html,sha256=0NG6oWKMo5AqetKNj7efEvuIrqJr_FLK_P20OIagKbA,6752
145
+ voice_mode/frontend/.next/standalone/.next/server/pages/500.html,sha256=hDwMgJlm36BruqH1LnwKP6QOP_VV-9vwMsW-BHqR3RY,1995
145
146
  voice_mode/frontend/.next/standalone/.next/server/pages/_app.js,sha256=xv0yBH2BTySxH6d7_oFG8KbedK3Jhvvg9SQ7pSaSPrE,3291
146
147
  voice_mode/frontend/.next/standalone/.next/server/pages/_app.js.nft.json,sha256=4DM09IfF6_ws-h14UVrroVq0Ri8tNeDEwwZ2c244nKM,517
147
148
  voice_mode/frontend/.next/standalone/.next/server/pages/_document.js,sha256=q-VJKG6tPCpEYWhP0UobYWG_naYdKPuqkRpb4HGMV_Y,378
148
149
  voice_mode/frontend/.next/standalone/.next/server/pages/_document.js.nft.json,sha256=7WnWXoJIsRytU5c-NAEx-tGGNI1TP2CMldwr8xtDQYk,1932
149
150
  voice_mode/frontend/.next/standalone/.next/server/pages/_error.js,sha256=1se20NEwePcXdV17_wUw4YhoMwVAenxiXI74aXSRqzU,8619
150
151
  voice_mode/frontend/.next/standalone/.next/server/pages/_error.js.nft.json,sha256=uK8O79iTeItVu_-Dz90fkTMA1GYxQEpTWU8TndjkfVQ,1855
152
+ voice_mode/frontend/.next/static/WhZriRkBKVNPSmCnOFRav/_buildManifest.js,sha256=UGi5XJhF4u-NRxMqU360JM2afxCS1essSVUEqY6sl5c,224
153
+ voice_mode/frontend/.next/static/WhZriRkBKVNPSmCnOFRav/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
151
154
  voice_mode/frontend/.next/static/chunks/117-40bc79a2b97edb21.js,sha256=sKMdOWIlJELukIK1QNRwH8hweTr_NgWzvc-bHWrZ9zM,123528
152
155
  voice_mode/frontend/.next/static/chunks/144d3bae-2d5f122b82426d88.js,sha256=tGa8lG7iuv-oxVEA7BdFJPmskDLIVXYnDOBb6j4_zp8,383332
153
156
  voice_mode/frontend/.next/static/chunks/471-bd4b96a33883dfa2.js,sha256=qT-fK-XMK3eAlXh2APHuRcKfG9EriUu-tXTEcNYWUp0,194375
154
157
  voice_mode/frontend/.next/static/chunks/fd9d1056-af324d327b243cf1.js,sha256=uL3flIHYWdZI4eBQ-DIus97-PdP5vRP0xE3W8uz1q4A,172834
155
158
  voice_mode/frontend/.next/static/chunks/framework-f66176bb897dc684.js,sha256=QlDVPwvHVuzi3daQoAit0df9yIdSjGcfTf6NkW13h7c,139978
156
159
  voice_mode/frontend/.next/static/chunks/main-3163eca598b76a9f.js,sha256=IwuNOgi-ik3KFA_tnaPvAfRY5q6hTp4DRK1lkjkWdwQ,116431
157
- voice_mode/frontend/.next/static/chunks/main-app-80dc9078926fc708.js,sha256=D-PVryGilnEPI0aL1gEDJpRTw4Q_0iiHuL5pdUpWdeE,461
160
+ voice_mode/frontend/.next/static/chunks/main-app-836e76fc70b52220.js,sha256=ifBeWGbYl3ueevSC-Hq_-TqqTQ_Rz5EapOytl9DyVEc,461
158
161
  voice_mode/frontend/.next/static/chunks/polyfills-42372ed130431b0a.js,sha256=CXPB1kyIrcjjyVBBDLWLKI9yEY1ZZbeASUON648vloM,112594
159
162
  voice_mode/frontend/.next/static/chunks/webpack-0ea9b80f19935b70.js,sha256=1Us0m_ZxEgMEb2DAN4ePlpq9Fv7QqUxcuV2CqICEB5w,3605
160
- voice_mode/frontend/.next/static/chunks/app/layout-b52135f331b36caf.js,sha256=VpdPaL0__vCEqXGkSK041xVI5xFm9BBD8eRCLUC_L-U,507
161
- voice_mode/frontend/.next/static/chunks/app/page-43b7b45e01f0aa87.js,sha256=S2CEIEq-jiw4GlZ-w4_1ZCyhZ0jH-uQlM26bWrH2mDA,7666
163
+ voice_mode/frontend/.next/static/chunks/app/layout-917e8410913fe899.js,sha256=o8hIVf6jqkiO2tZft4kHmfw11ZEuFOk4mVGn0LG41zo,507
164
+ voice_mode/frontend/.next/static/chunks/app/page-ae0d14863ed895ea.js,sha256=DY2O5F9kK-HXkh0fyWNxtA4BsdNWFFBPX82EUyWkuOY,7666
162
165
  voice_mode/frontend/.next/static/chunks/app/_not-found/page-5011050e402ab9c8.js,sha256=u5LYOU4LZ2HFeEcz6xZqSflSnU4WDt-TnQNu3CdcEWk,1745
163
166
  voice_mode/frontend/.next/static/chunks/pages/_app-72b849fbd24ac258.js,sha256=QN-PY1h1HDIO4K4ZYwFl6rtEeaxWCynYauVLK_oWmzE,280
164
167
  voice_mode/frontend/.next/static/chunks/pages/_error-7ba65e1336b92748.js,sha256=oxr2dz6MkKWnm3jN3fWb2RPhCHB4-JgrzVMS_wTNr_E,247
@@ -166,12 +169,10 @@ voice_mode/frontend/.next/static/css/a2f49a47752b5010.css,sha256=7geCVBj6YoIVhB9
166
169
  voice_mode/frontend/.next/static/media/01099be941da1820-s.woff2,sha256=ZaNN8qxUZFV4kxOD_j6TGAYAHwR01MPDQloeIbMgCeg,10436
167
170
  voice_mode/frontend/.next/static/media/39883d31a7792467-s.p.woff2,sha256=i_qVPOm6vZ-H4B0Mk_d5yUQR_YKsz4XRc-8J2R_QWKs,14620
168
171
  voice_mode/frontend/.next/static/media/6368404d2e8d66fe-s.woff2,sha256=2GFQ1JjbLJOSmwrIsgCHPVMSJpcx2QX2i13kJbg8IFE,4464
169
- voice_mode/frontend/.next/static/uZHYPdRYOObTZ3MQHekp0/_buildManifest.js,sha256=UGi5XJhF4u-NRxMqU360JM2afxCS1essSVUEqY6sl5c,224
170
- voice_mode/frontend/.next/static/uZHYPdRYOObTZ3MQHekp0/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
171
172
  voice_mode/frontend/.next/types/package.json,sha256=49WkothVGqUsWgHSoO-y4GotlxG09cXx0g3m4hgH4s0,18
172
- voice_mode/frontend/.next/types/app/layout.ts,sha256=-DqjhdONU-KBvfFtB0EnhC4uHYjCfiARRqXKVAE07x8,3510
173
- voice_mode/frontend/.next/types/app/page.ts,sha256=pLhf59_rVTnYjUyP_AOuthuGdW03odztYBV1MMO-pf8,3498
174
- voice_mode/frontend/.next/types/app/api/connection-details/route.ts,sha256=HRJLEZyUmVga-xtDblZSNgEiPXo9_IJyn62QW92ima8,8530
173
+ voice_mode/frontend/.next/types/app/layout.ts,sha256=4V_reYkFT229SOfNXS2anS2cf_zQhuipHxYEewuMUKY,3510
174
+ voice_mode/frontend/.next/types/app/page.ts,sha256=afRkU7-bWq2HNfMKiS_pA8zSgXrSIliu549K33L38-M,3498
175
+ voice_mode/frontend/.next/types/app/api/connection-details/route.ts,sha256=1i8YogQ5xogsd9mlNKMmy7BlUya6_4fUjNSSjC4FoY8,8530
175
176
  voice_mode/frontend/app/favicon.ico,sha256=Cc2QdQ-OI3iME7dIf86sbqXHW3D8LPUprF_KB2KZogI,15406
176
177
  voice_mode/frontend/app/globals.css,sha256=yMCx8ta7sGyt40nzBTlRR644nlAGGYt73zj7e9YLgl4,362
177
178
  voice_mode/frontend/app/layout.tsx,sha256=Q0LYcf_Z8GT8zDhlWgk7XEZArp2ZS2HpB1tmv3epp68,537
@@ -207,17 +208,16 @@ voice_mode/templates/systemd/voicemode-frontend.service,sha256=sWIu_9e24Zo3OKP3X
207
208
  voice_mode/templates/systemd/voicemode-kokoro.service,sha256=5JGv_Xf9u2MvmbGLBQtNy07i3T0-KsJHPF06FkN40ms,927
208
209
  voice_mode/templates/systemd/voicemode-livekit.service,sha256=hVjT4Vd0SOABXGYbp9iF9R6SWtXXLfRXt7i1xbud6Lg,692
209
210
  voice_mode/templates/systemd/voicemode-whisper.service,sha256=aa5gIHI9xKF0M_DY6SO95QHRFhkV2JOzmFVo2U8RhN4,844
210
- voice_mode/tools/__init__.py,sha256=Hd8-dNoB58apt6PqMCfGHYDAeQWbarFrMRfxseJi8Jo,1069
211
- voice_mode/tools/claude_thinking.py,sha256=MKKhk1gxCKmAEKyCmO0iccB491VHJI_LueyUpLAD5Rw,11028
211
+ voice_mode/tools/__init__.py,sha256=7ii1uJf_AU0iG1PokCqChs8wuj4t9j90Si17aUhVd7I,2182
212
212
  voice_mode/tools/configuration_management.py,sha256=jR6WYsrkeWRohI8_9kk48YQ6GNwdiMAuTXx3vln_m4w,12748
213
- voice_mode/tools/converse.py,sha256=7wKF0rcU_gO6b4YcyvlfQFPx6ALqVIV5OREhclpRLDE,104926
213
+ voice_mode/tools/converse.py,sha256=O6KnpOwIVubm6YXhm6758dnHk496OGMHIjKiFXu1ahY,104929
214
214
  voice_mode/tools/dependencies.py,sha256=V72gS_bD0pCmW_be2Hxs_cEnIoNPFKlK7rE9cLMTDGE,6670
215
215
  voice_mode/tools/devices.py,sha256=v0KV-Rix2lKZMFfVcobHiJB_6NnPAJsuZI5LXYHlgl0,10446
216
216
  voice_mode/tools/diagnostics.py,sha256=pWl9wwaBMJubBKhWOVbNIGeYet84ECVshtPok-v2pl8,2059
217
217
  voice_mode/tools/pronounce.py,sha256=neyJXqQxclI8wUAnLOGBCfMXHzvS31NBuaEnt6GLovA,8915
218
218
  voice_mode/tools/providers.py,sha256=KuO5lFmSHjYUoK3hjIqx3l7XeNOLPMAeXQnTtH00Iow,7768
219
219
  voice_mode/tools/service.py,sha256=ll7BsUdSaXSGjtElZf7vSmOspe92ZIyIB-UaYbLrdf4,46454
220
- voice_mode/tools/statistics.py,sha256=XMljbNCBqatPgyh6rq1LZ3ICNEmji2c82P7pyCZfr8Q,9326
220
+ voice_mode/tools/statistics.py,sha256=5vIbC6-BMxwSjP8BclKjJv-LGm50ncB8Ex9XXmZgRfo,8003
221
221
  voice_mode/tools/voice_registry.py,sha256=iw3O4C8lsdon9fr1ZMchc0Uq7MmSmTOYReY9NfQlEhU,2354
222
222
  voice_mode/tools/services/list_versions.py,sha256=r_FzHG_2dVxEzDXfxVfPInchGq1h9_4yvJ9ySkinsJk,2573
223
223
  voice_mode/tools/services/version_info.py,sha256=K5CzUlaIpHJKDnudfCeIydOwIhaDTOM59e8FQ1Yyj4A,11344
@@ -260,7 +260,7 @@ voice_mode/utils/services/kokoro_helpers.py,sha256=57NsS1i4ptk5Gg3zm5g68QhtV3aU3
260
260
  voice_mode/utils/services/livekit_helpers.py,sha256=OFw0GxVIJAZE2m9dGCDZVegWD-LnMO6iSjcOUDgAA9U,3627
261
261
  voice_mode/utils/services/whisper_helpers.py,sha256=1Oy9TR5g5-l6j07KaWlAoijkCUDGaTWIz__BXvV0TWw,19632
262
262
  voice_mode/utils/services/whisper_version.py,sha256=68e0Oa-tG73IJlla-e3P0sh_qzBF4ToYBe4KKZ2FvEY,4861
263
- voice_mode-4.3.1.dist-info/METADATA,sha256=v4Ba0ooQdyWpeCUCehzrcAmQ08dTWh1Sz2f3K8p2lww,25459
264
- voice_mode-4.3.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
265
- voice_mode-4.3.1.dist-info/entry_points.txt,sha256=hS5faHc0R5Fde3Z_uvz8u6YkRIYtvh17X8tVN90Rbro,95
266
- voice_mode-4.3.1.dist-info/RECORD,,
263
+ voice_mode-4.4.0.dist-info/METADATA,sha256=jvl63NjWEB_JV3Rrt7ymb7DeTcXfohKQSADAsJB_Rpg,24278
264
+ voice_mode-4.4.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
265
+ voice_mode-4.4.0.dist-info/entry_points.txt,sha256=hS5faHc0R5Fde3Z_uvz8u6YkRIYtvh17X8tVN90Rbro,95
266
+ voice_mode-4.4.0.dist-info/RECORD,,
@@ -1,285 +0,0 @@
1
- """Claude Code message extraction tools for Think Out Loud mode and conversation analysis."""
2
-
3
- import json
4
- import logging
5
- import os
6
- from pathlib import Path
7
- from typing import Optional, List, Dict, Any
8
- from datetime import datetime
9
-
10
- from voice_mode.server import mcp
11
- from voice_mode.config import THINK_OUT_LOUD_ENABLED
12
-
13
- logger = logging.getLogger("voice-mode")
14
-
15
-
16
- def find_claude_log_file(working_dir: Optional[str] = None) -> Optional[Path]:
17
- """Find the current Claude Code conversation log file.
18
-
19
- Args:
20
- working_dir: The working directory (defaults to CWD)
21
-
22
- Returns:
23
- Path to the most recent JSONL log file, or None if not found
24
- """
25
- if working_dir is None:
26
- working_dir = os.getcwd()
27
-
28
- logger.debug(f"Looking for Claude logs in working_dir: {working_dir}")
29
-
30
- # Transform path: /Users/admin/Code/github.com/project → -Users-admin-Code-github-com-project
31
- # Note: Both slashes and dots are replaced with hyphens
32
- project_dir = working_dir.replace('/', '-').replace('.', '-')
33
- logger.debug(f"Transformed project dir: {project_dir}")
34
-
35
- # Build path to Claude logs
36
- claude_base = Path.home() / '.claude' / 'projects'
37
- log_dir = claude_base / project_dir
38
- logger.debug(f"Claude log directory: {log_dir}")
39
-
40
- if not log_dir.exists():
41
- logger.warning(f"Claude log directory does not exist: {log_dir}")
42
- return None
43
-
44
- # Find most recent .jsonl file
45
- log_files = sorted(
46
- log_dir.glob('*.jsonl'),
47
- key=lambda p: p.stat().st_mtime,
48
- reverse=True
49
- )
50
-
51
- if log_files:
52
- logger.info(f"Found {len(log_files)} Claude log files, using most recent: {log_files[0].name}")
53
- return log_files[0]
54
- else:
55
- logger.warning(f"No .jsonl files found in {log_dir}")
56
- return None
57
-
58
-
59
- def extract_messages_from_log(log_file: Path, last_n: int = 2, message_types: Optional[List[str]] = None) -> List[Dict[str, Any]]:
60
- """Extract messages from Claude Code JSONL log.
61
-
62
- Args:
63
- log_file: Path to the JSONL log file
64
- last_n: Number of most recent messages to return (default: 2)
65
- message_types: Optional list of message types to filter ('user', 'assistant', 'system')
66
- If None, returns all message types
67
-
68
- Returns:
69
- List of messages with metadata
70
- """
71
- logger.debug(f"Extracting {last_n} messages from {log_file}, types={message_types}")
72
- messages = []
73
-
74
- try:
75
- with open(log_file, 'r') as f:
76
- lines = f.readlines()
77
-
78
- logger.debug(f"Read {len(lines)} lines from log file")
79
-
80
- # Process lines in reverse to get most recent first
81
- for i, line in enumerate(reversed(lines)):
82
- if not line.strip():
83
- continue
84
-
85
- try:
86
- entry = json.loads(line)
87
- entry_type = entry.get('type')
88
-
89
- # Filter by message type if specified
90
- if message_types and entry_type not in message_types:
91
- continue
92
-
93
- # Extract user or assistant messages
94
- if entry_type in ['user', 'assistant']:
95
- logger.debug(f"Found {entry_type} message at line {len(lines) - i}")
96
- message = entry.get('message', {})
97
-
98
- # Build message info
99
- message_info = {
100
- 'type': entry_type,
101
- 'role': message.get('role'),
102
- 'content': message.get('content', []),
103
- 'timestamp': entry.get('timestamp'),
104
- 'uuid': entry.get('uuid'),
105
- 'model': message.get('model') if entry_type == 'assistant' else None
106
- }
107
-
108
- # Add usage info for assistant messages
109
- if entry_type == 'assistant' and 'usage' in message:
110
- message_info['usage'] = message['usage']
111
-
112
- messages.append(message_info)
113
-
114
- if len(messages) >= last_n:
115
- logger.info(f"Extracted {len(messages)} messages successfully")
116
- return messages
117
-
118
- except json.JSONDecodeError as e:
119
- logger.debug(f"Skipping invalid JSON at line {len(lines) - i}: {e}")
120
- continue
121
-
122
- except Exception as e:
123
- logger.error(f"Error reading log file {log_file}: {e}")
124
-
125
- logger.info(f"Extracted {len(messages)} messages (requested {last_n})")
126
- return messages
127
-
128
-
129
- def extract_thinking_from_messages(messages: List[Dict[str, Any]]) -> List[str]:
130
- """Extract thinking content from a list of messages.
131
-
132
- Args:
133
- messages: List of message dictionaries
134
-
135
- Returns:
136
- List of thinking text strings
137
- """
138
- thinking_texts = []
139
-
140
- for message in messages:
141
- if message.get('type') == 'assistant':
142
- content = message.get('content', [])
143
- for item in content:
144
- if isinstance(item, dict) and item.get('type') == 'thinking':
145
- text = item.get('text', '').strip()
146
- if text:
147
- thinking_texts.append(text)
148
-
149
- return thinking_texts
150
-
151
-
152
- @mcp.tool
153
- def get_claude_messages(
154
- last_n: int = 2,
155
- working_dir: Optional[str] = None,
156
- message_types: Optional[List[str]] = None,
157
- format: str = "full"
158
- ) -> str:
159
- """Extract messages from Claude Code conversation logs.
160
-
161
- This tool reads Claude Code's conversation logs to extract recent messages
162
- for Think Out Loud mode and conversation analysis.
163
-
164
- Args:
165
- last_n: Number of most recent messages to return (default: 2)
166
- working_dir: Working directory to find logs for (defaults to CWD)
167
- message_types: Optional list to filter by type ('user', 'assistant').
168
- If None, returns all types.
169
- format: Output format - 'full' (complete message), 'text' (just text content),
170
- 'thinking' (just thinking content)
171
-
172
- Returns:
173
- The extracted messages in the requested format
174
- """
175
- logger.debug(f"get_claude_messages called: last_n={last_n}, working_dir={working_dir}, types={message_types}, format={format}")
176
-
177
- # Check if Think Out Loud mode is enabled
178
- if not THINK_OUT_LOUD_ENABLED:
179
- logger.warning("Think Out Loud mode is not enabled")
180
- return "Think Out Loud mode is not enabled. Set VOICEMODE_THINK_OUT_LOUD=true to enable."
181
-
182
- # Find the log file
183
- log_file = find_claude_log_file(working_dir)
184
- if not log_file:
185
- return f"Could not find Claude Code logs for directory: {working_dir or os.getcwd()}"
186
-
187
- # Extract messages
188
- messages = extract_messages_from_log(log_file, last_n, message_types)
189
-
190
- if not messages:
191
- return f"No messages found in recent Claude Code logs."
192
-
193
- # Format output based on requested format
194
- if format == "thinking":
195
- # Extract only thinking content
196
- thinking_texts = extract_thinking_from_messages(messages)
197
- if not thinking_texts:
198
- return "No thinking content found in recent messages."
199
- if len(thinking_texts) == 1:
200
- return thinking_texts[0]
201
- return "\n\n=== Next Thinking ===\n\n".join(thinking_texts)
202
-
203
- elif format == "text":
204
- # Extract just the text content
205
- result = []
206
- for msg in messages:
207
- content_text = []
208
- for item in msg.get('content', []):
209
- if isinstance(item, dict):
210
- if item.get('type') == 'text':
211
- content_text.append(item.get('text', ''))
212
- elif item.get('type') == 'thinking':
213
- content_text.append(f"[Thinking: {item.get('text', '')}]")
214
- if content_text:
215
- result.append(f"{msg['type'].title()}: {' '.join(content_text)}")
216
- return "\n\n".join(result)
217
-
218
- else: # format == "full"
219
- # Return complete message structure
220
- result = []
221
- for i, msg in enumerate(messages, 1):
222
- result.append(f"=== Message {i} ===")
223
- result.append(f"Type: {msg['type']}")
224
- result.append(f"Timestamp: {msg.get('timestamp', 'Unknown')}")
225
- if msg.get('model'):
226
- result.append(f"Model: {msg['model']}")
227
-
228
- # Format content
229
- content = msg.get('content', [])
230
- if content:
231
- result.append("Content:")
232
- for item in content:
233
- if isinstance(item, dict):
234
- item_type = item.get('type', 'unknown')
235
- if item_type == 'text':
236
- result.append(f" [Text]: {item.get('text', '')}")
237
- elif item_type == 'thinking':
238
- result.append(f" [Thinking]: {item.get('text', '')}")
239
- elif item_type == 'tool_use':
240
- result.append(f" [Tool Use]: {item.get('name', '')}")
241
- elif item_type == 'tool_result':
242
- result.append(f" [Tool Result]: {item.get('content', '')[:100]}...")
243
- result.append("")
244
-
245
- return "\n".join(result).strip()
246
-
247
-
248
- @mcp.tool
249
- def check_claude_context() -> str:
250
- """Check if running in Claude Code context.
251
-
252
- Returns information about the Claude Code environment including:
253
- - Whether Claude Code logs are accessible
254
- - Current working directory
255
- - Log file location if found
256
- """
257
- working_dir = os.getcwd()
258
- log_file = find_claude_log_file(working_dir)
259
-
260
- result = []
261
- result.append(f"Working Directory: {working_dir}")
262
- result.append(f"Claude Logs Found: {'Yes' if log_file else 'No'}")
263
-
264
- if log_file:
265
- result.append(f"Log File: {log_file}")
266
- result.append(f"Log Size: {log_file.stat().st_size:,} bytes")
267
-
268
- # Check for recent activity
269
- mtime = datetime.fromtimestamp(log_file.stat().st_mtime)
270
- now = datetime.now()
271
- age = now - mtime
272
-
273
- if age.total_seconds() < 60:
274
- result.append(f"Last Updated: {int(age.total_seconds())} seconds ago")
275
- elif age.total_seconds() < 3600:
276
- result.append(f"Last Updated: {int(age.total_seconds() / 60)} minutes ago")
277
- else:
278
- result.append(f"Last Updated: {int(age.total_seconds() / 3600)} hours ago")
279
- else:
280
- project_dir = working_dir.replace('/', '-')
281
- expected_path = Path.home() / '.claude' / 'projects' / project_dir
282
- result.append(f"Expected Log Location: {expected_path}")
283
- result.append("Note: Logs are only created when using Claude Code (claude.ai/code)")
284
-
285
- return "\n".join(result)