thursday-agent 0.2.0 → 0.4.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.
Files changed (541) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +5 -2
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +5 -5
  5. package/.next/routes-manifest.json +24 -6
  6. package/.next/server/app/_global-error/page.js +2 -2
  7. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/_global-error.html +1 -1
  10. package/.next/server/app/_global-error.rsc +2 -2
  11. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found/page.js +2 -2
  15. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  16. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  17. package/.next/server/app/_not-found.html +1 -1
  18. package/.next/server/app/_not-found.rsc +14 -14
  19. package/.next/server/app/_not-found.segments/_full.segment.rsc +14 -14
  20. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +12 -12
  21. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  22. package/.next/server/app/api/artifact/route.js +3 -3
  23. package/.next/server/app/api/artifact/route.js.nft.json +1 -1
  24. package/.next/server/app/api/bot/memory/files/route/app-paths-manifest.json +3 -0
  25. package/.next/server/app/api/bot/memory/files/route.js +10 -0
  26. package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -0
  27. package/.next/server/app/api/bot/memory/files/route_client-reference-manifest.js +3 -0
  28. package/.next/server/app/api/bot/memory/route/app-paths-manifest.json +3 -0
  29. package/.next/server/app/api/bot/memory/route.js +14 -0
  30. package/.next/server/app/api/bot/{notes → memory}/route.js.nft.json +1 -1
  31. package/.next/server/app/api/bot/memory/route_client-reference-manifest.js +3 -0
  32. package/.next/server/app/api/bot/route.js +6 -6
  33. package/.next/server/app/api/bot/route.js.nft.json +1 -1
  34. package/.next/server/app/api/bot/task/[id]/route.js +8 -8
  35. package/.next/server/app/api/bot/task/[id]/route.js.nft.json +1 -1
  36. package/.next/server/app/api/bot/task/route.js +8 -8
  37. package/.next/server/app/api/bot/task/route.js.nft.json +1 -1
  38. package/.next/server/app/api/config/route.js +5 -5
  39. package/.next/server/app/api/config/route.js.nft.json +1 -1
  40. package/.next/server/app/api/events/route.js +4 -5
  41. package/.next/server/app/api/events/route.js.nft.json +1 -1
  42. package/.next/server/app/api/file/[...path]/route.js +3 -3
  43. package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
  44. package/.next/server/app/api/llm-model/catalog/route.js +9 -8
  45. package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
  46. package/.next/server/app/api/llm-model/credits/route/app-paths-manifest.json +3 -0
  47. package/.next/server/app/api/llm-model/credits/route/build-manifest.json +12 -0
  48. package/.next/server/app/api/llm-model/credits/route/server-reference-manifest.json +4 -0
  49. package/.next/server/app/api/llm-model/credits/route.js +16 -0
  50. package/.next/server/app/api/llm-model/credits/route.js.map +5 -0
  51. package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -0
  52. package/.next/server/app/api/llm-model/credits/route_client-reference-manifest.js +3 -0
  53. package/.next/server/app/api/llm-model/route.js +10 -8
  54. package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
  55. package/.next/server/app/api/llm-model/subscription/route/app-paths-manifest.json +3 -0
  56. package/.next/server/app/api/llm-model/subscription/route/build-manifest.json +12 -0
  57. package/.next/server/app/api/llm-model/subscription/route/server-reference-manifest.json +4 -0
  58. package/.next/server/app/api/llm-model/subscription/route.js +15 -0
  59. package/.next/server/app/api/llm-model/subscription/route.js.map +5 -0
  60. package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -0
  61. package/.next/server/app/api/llm-model/subscription/route_client-reference-manifest.js +3 -0
  62. package/.next/server/app/api/mcp/[name]/route.js +4 -4
  63. package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/mcp/oauth/callback/route.js +5 -5
  65. package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
  66. package/.next/server/app/api/mcp/route.js +4 -4
  67. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  68. package/.next/server/app/api/mcp/tools/route.js +4 -4
  69. package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
  70. package/.next/server/app/api/memory/edit/route/app-paths-manifest.json +3 -0
  71. package/.next/server/app/api/memory/edit/route/build-manifest.json +12 -0
  72. package/.next/server/app/api/memory/edit/route/server-reference-manifest.json +4 -0
  73. package/.next/server/app/api/memory/edit/route.js +24 -0
  74. package/.next/server/app/api/memory/edit/route.js.map +5 -0
  75. package/.next/server/app/api/memory/edit/route.js.nft.json +1 -0
  76. package/.next/server/app/api/memory/{tidy → edit}/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/memory/route.js +6 -7
  78. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  79. package/.next/server/app/api/skills/[source]/[name]/route.js +3 -3
  80. package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
  81. package/.next/server/app/api/skills/route.js +3 -3
  82. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  83. package/.next/server/app/api/thursday/call/route.js +9 -7
  84. package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
  85. package/.next/server/app/api/thursday/skills/route.js +9 -7
  86. package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
  87. package/.next/server/app/api/thursday/tool-call/route.js +17 -15
  88. package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
  89. package/.next/server/app/api/workspace/route.js +4 -5
  90. package/.next/server/app/api/workspace/route.js.nft.json +1 -1
  91. package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +1 -1
  92. package/.next/server/app/artifact/[...path]/page.js +5 -6
  93. package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
  94. package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
  95. package/.next/server/app/favicon.ico/route.js +3 -4
  96. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  97. package/.next/server/app/favicon.ico.body +0 -0
  98. package/.next/server/app/page/server-reference-manifest.json +57 -90
  99. package/.next/server/app/page.js +10 -10
  100. package/.next/server/app/page.js.nft.json +1 -1
  101. package/.next/server/app/page_client-reference-manifest.js +1 -1
  102. package/.next/server/app-paths-manifest.json +5 -2
  103. package/.next/server/chunks/[externals]__0dzuk6_._.js +3 -0
  104. package/.next/server/chunks/[root-of-the-server]__01dkp4a._.js +3 -0
  105. package/.next/server/chunks/[root-of-the-server]__02va5wz._.js +1 -1
  106. package/.next/server/chunks/[root-of-the-server]__02xjoto._.js +3 -0
  107. package/.next/server/chunks/[root-of-the-server]__04q--0f._.js +8 -0
  108. package/.next/server/chunks/[root-of-the-server]__0bl-e63._.js +3 -0
  109. package/.next/server/chunks/[root-of-the-server]__0ce8nf8._.js +5 -0
  110. package/.next/server/chunks/[root-of-the-server]__0ffbg85._.js +3 -0
  111. package/.next/server/chunks/[root-of-the-server]__0j7z0r3._.js +12 -0
  112. package/.next/server/chunks/[root-of-the-server]__0jq4ohy._.js +8 -0
  113. package/.next/server/chunks/[root-of-the-server]__0ls6_8y._.js +8 -0
  114. package/.next/server/chunks/[root-of-the-server]__0ncs9uu._.js +3 -0
  115. package/.next/server/chunks/[root-of-the-server]__0pa2n68._.js +3 -0
  116. package/.next/server/chunks/[root-of-the-server]__0q0vvt2._.js +5 -0
  117. package/.next/server/chunks/[root-of-the-server]__1-ga0kh._.js +5 -0
  118. package/.next/server/chunks/[root-of-the-server]__11n256_._.js +5 -0
  119. package/.next/server/chunks/[root-of-the-server]__12cabg9._.js +3 -0
  120. package/.next/server/chunks/[root-of-the-server]__1339jnv._.js +8 -0
  121. package/.next/server/chunks/[root-of-the-server]__15bjnu5._.js +5 -0
  122. package/.next/server/chunks/[root-of-the-server]__18_teo8._.js +8 -0
  123. package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +5 -0
  124. package/.next/server/chunks/[root-of-the-server]__1anc1p9._.js +3 -0
  125. package/.next/server/chunks/[root-of-the-server]__1ccon1w._.js +5 -5
  126. package/.next/server/chunks/[root-of-the-server]__1fizn31._.js +3 -0
  127. package/.next/server/chunks/[root-of-the-server]__1llj3-b._.js +3 -0
  128. package/.next/server/chunks/[root-of-the-server]__1orn-5b._.js +12 -0
  129. package/.next/server/chunks/[root-of-the-server]__1p8m3f4._.js +3 -0
  130. package/.next/server/chunks/[root-of-the-server]__1wa1k7r._.js +8 -0
  131. package/.next/server/chunks/_0-73of8._.js +5 -5
  132. package/.next/server/chunks/_0-fjql4._.js +26 -0
  133. package/.next/server/chunks/_00xh_q0._.js +25 -0
  134. package/.next/server/chunks/_051qh8u._.js +3 -0
  135. package/.next/server/chunks/{node_modules_next_04q-o58._.js → _05dla15._.js} +2 -2
  136. package/.next/server/chunks/_05h2cii._.js +1 -1
  137. package/.next/server/chunks/_0c9j6rb._.js +49 -0
  138. package/.next/server/chunks/_0fzqt2y._.js +134 -0
  139. package/.next/server/chunks/{_0vnutv9._.js → _0ioz3nd._.js} +1 -1
  140. package/.next/server/chunks/_0iwfby5._.js +3 -0
  141. package/.next/server/chunks/_0mecv0f._.js +26 -0
  142. package/.next/server/chunks/_0mh8j4m._.js +3 -0
  143. package/.next/server/chunks/_0n74zsf._.js +4 -4
  144. package/.next/server/chunks/_0obojvv._.js +3 -0
  145. package/.next/server/chunks/_0recufk._.js +49 -0
  146. package/.next/server/chunks/_0rnf-6n._.js +4 -4
  147. package/.next/server/chunks/_0sb7tlz._.js +3 -0
  148. package/.next/server/chunks/_0u10wmw._.js +5 -5
  149. package/.next/server/chunks/_0u4aiy2._.js +3 -0
  150. package/.next/server/chunks/_0wp4le3._.js +1 -1
  151. package/.next/server/chunks/_0y5fg-x._.js +1 -1
  152. package/.next/server/chunks/_1230wbx._.js +10 -0
  153. package/.next/server/chunks/_12nheja._.js +3 -0
  154. package/.next/server/chunks/_13510xh._.js +3 -0
  155. package/.next/server/chunks/_15hq89o._.js +1 -1
  156. package/.next/server/chunks/_17l5ygt._.js +49 -0
  157. package/.next/server/chunks/_18-1wcc._.js +5 -5
  158. package/.next/server/chunks/_1_5mnq4._.js +4 -4
  159. package/.next/server/chunks/_1_9mjx-._.js +3 -0
  160. package/.next/server/chunks/{_0pppbb5._.js → _1c78vw5._.js} +166 -37
  161. package/.next/server/chunks/_1d0j961._.js +6 -0
  162. package/.next/server/chunks/_1d5zmy8._.js +1 -1
  163. package/.next/server/chunks/_1drgfx4._.js +4 -4
  164. package/.next/server/chunks/_1f46eie._.js +3 -0
  165. package/.next/server/chunks/_1h5_8sk._.js +3 -0
  166. package/.next/server/chunks/_1hdnxb7._.js +3 -0
  167. package/.next/server/chunks/_1j8k_j5._.js +3 -0
  168. package/.next/server/chunks/_1krd9rf._.js +3 -0
  169. package/.next/server/chunks/_1nc0eui._.js +11 -0
  170. package/.next/server/chunks/_1nula3v._.js +3 -0
  171. package/.next/server/chunks/_1pf4qe-._.js +3 -0
  172. package/.next/server/chunks/_1php4eq._.js +1 -1
  173. package/.next/server/chunks/_1qxheoa._.js +3 -0
  174. package/.next/server/chunks/_1x6kd1r._.js +3 -0
  175. package/.next/server/chunks/_1yuv4vp._.js +1 -1
  176. package/.next/server/chunks/_1zjrdag._.js +3 -0
  177. package/.next/server/chunks/_next-internal_server_app_api_bot_memory_files_route_actions_1_xd_8f.js +3 -0
  178. package/.next/server/chunks/_next-internal_server_app_api_bot_memory_route_actions_1a8xfr7.js +3 -0
  179. package/.next/server/chunks/_next-internal_server_app_api_llm-model_credits_route_actions_0v424pb.js +3 -0
  180. package/.next/server/chunks/_next-internal_server_app_api_llm-model_subscription_route_actions_0-udcm5.js +3 -0
  181. package/.next/server/chunks/_next-internal_server_app_api_memory_edit_route_actions_02sfnmr.js +3 -0
  182. package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
  183. package/.next/server/chunks/features_0rpfxbk._.js +3 -0
  184. package/.next/server/chunks/features_1qf3cei._.js +3 -0
  185. package/.next/server/chunks/features_bot_0zt92oh._.js +3 -0
  186. package/.next/server/chunks/features_bot_bot_query_ts_12mgkl2._.js +3 -0
  187. package/.next/server/chunks/features_memory_1uqvksn._.js +6 -0
  188. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0a1rd09._.js → node_modules_consola_dist_chunks_prompt_mjs_0i7cvml._.js} +1 -1
  189. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_06067w6._.js → node_modules_consola_dist_chunks_prompt_mjs_0icqaqw._.js} +1 -1
  190. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_096ais_._.js → node_modules_consola_dist_chunks_prompt_mjs_0r28-sm._.js} +1 -1
  191. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_02s3hjt._.js → node_modules_consola_dist_chunks_prompt_mjs_0v_7drq._.js} +1 -1
  192. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xoq2rl._.js +3 -0
  193. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0tvkfgh._.js → node_modules_consola_dist_chunks_prompt_mjs_1y49572._.js} +1 -1
  194. package/.next/server/chunks/ssr/[root-of-the-server]__092knlj._.js +3 -0
  195. package/.next/server/chunks/ssr/[root-of-the-server]__09q9med._.js +1 -1
  196. package/.next/server/chunks/ssr/[root-of-the-server]__0hg5gib._.js +1 -1
  197. package/.next/server/chunks/ssr/[root-of-the-server]__0i8ie7f._.js +3 -0
  198. package/.next/server/chunks/ssr/{[root-of-the-server]__0jsmmb-._.js → [root-of-the-server]__0mz33a7._.js} +1 -1
  199. package/.next/server/chunks/ssr/[root-of-the-server]__0s9dq5u._.js +3 -0
  200. package/.next/server/chunks/ssr/{[root-of-the-server]__0m1b5ky._.js → [root-of-the-server]__0s9l2sv._.js} +1 -1
  201. package/.next/server/chunks/ssr/[root-of-the-server]__0tbkdlx._.js +3 -0
  202. package/.next/server/chunks/ssr/[root-of-the-server]__0vnmv-s._.js +3 -0
  203. package/.next/server/chunks/ssr/{[root-of-the-server]__0f6s48x._.js → [root-of-the-server]__0xpcv9w._.js} +3 -3
  204. package/.next/server/chunks/ssr/[root-of-the-server]__0xsog8n._.js +3 -0
  205. package/.next/server/chunks/ssr/[root-of-the-server]__0xtssj3._.js +1 -1
  206. package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +61 -0
  207. package/.next/server/chunks/ssr/[root-of-the-server]__15_uhip._.js +3 -0
  208. package/.next/server/chunks/ssr/[root-of-the-server]__16jc196._.js +1 -1
  209. package/.next/server/chunks/ssr/[root-of-the-server]__1gtlw6v._.js +43 -0
  210. package/.next/server/chunks/ssr/[root-of-the-server]__1mzi-ju._.js +1 -1
  211. package/.next/server/chunks/ssr/[root-of-the-server]__1ox7hbk._.js +4 -0
  212. package/.next/server/chunks/ssr/{[root-of-the-server]__1qfqvmg._.js → [root-of-the-server]__202p40z._.js} +2 -2
  213. package/.next/server/chunks/ssr/{_1mznrxk._.js → _001_ms1._.js} +3 -3
  214. package/.next/server/chunks/ssr/_01n3o0m._.js +3 -0
  215. package/.next/server/chunks/ssr/_0ap2fzn._.js +3 -0
  216. package/.next/server/chunks/ssr/_0fz4mf_._.js +3 -0
  217. package/.next/server/chunks/ssr/_0gb4gmf._.js +3 -0
  218. package/.next/server/chunks/ssr/_0h42fze._.js +3 -0
  219. package/.next/server/chunks/ssr/_0h7zdni._.js +1 -1
  220. package/.next/server/chunks/ssr/_0i_6q1w._.js +41 -0
  221. package/.next/server/chunks/ssr/_0ilna52._.js +42 -0
  222. package/.next/server/chunks/ssr/_0n3toaw._.js +3 -0
  223. package/.next/server/chunks/ssr/{_13punpm._.js → _0q0zan6._.js} +2 -2
  224. package/.next/server/chunks/ssr/{_077-g6s._.js → _0s99bgb._.js} +3 -3
  225. package/.next/server/chunks/ssr/_0zcjrbg._.js +3 -0
  226. package/.next/server/chunks/ssr/_0zhoc3r._.js +3 -0
  227. package/.next/server/chunks/ssr/{_1lip4th._.js → _1-_etts._.js} +2 -2
  228. package/.next/server/chunks/ssr/_1-teee5._.js +3 -3
  229. package/.next/server/chunks/ssr/_13fke0x._.js +3 -0
  230. package/.next/server/chunks/ssr/_15j2_8f._.js +3 -0
  231. package/.next/server/chunks/ssr/_1b2mjwr._.js +3 -0
  232. package/.next/server/chunks/ssr/{_09ja_w1._.js → _1f-dg-6._.js} +2 -2
  233. package/.next/server/chunks/ssr/_1fojd41._.js +4 -0
  234. package/.next/server/chunks/ssr/_1gd8q8l._.js +3 -0
  235. package/.next/server/chunks/ssr/{_1m3bsfr._.js → _1h0rw11._.js} +2 -2
  236. package/.next/server/chunks/ssr/_1jhd09t._.js +3 -0
  237. package/.next/server/chunks/ssr/{_040sk32._.js → _1lz_cq2._.js} +84 -88
  238. package/.next/server/chunks/ssr/_1nnsk7z._.js +3 -0
  239. package/.next/server/chunks/ssr/_1sji22n._.js +3 -0
  240. package/.next/server/chunks/ssr/{_0x_nu5e._.js → _1vi_uo7._.js} +2 -2
  241. package/.next/server/chunks/ssr/_1vyd1ji._.js +1 -1
  242. package/.next/server/chunks/ssr/features_bot_1s_-2vj._.js +3 -0
  243. package/.next/server/chunks/ssr/features_config_components_config-setting_tsx_0xfwqdg._.js +1 -1
  244. package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
  245. package/.next/server/chunks/ssr/{node_modules_0kxz4gt._.js → node_modules_00etblx._.js} +1 -1
  246. package/.next/server/chunks/ssr/{node_modules_18_dk7_._.js → node_modules_04jf_m8._.js} +1 -1
  247. package/.next/server/chunks/ssr/{node_modules_0_n241r._.js → node_modules_08dhkiq._.js} +1 -1
  248. package/.next/server/chunks/ssr/{node_modules_0n1kj4p._.js → node_modules_0940ns5._.js} +1 -1
  249. package/.next/server/chunks/ssr/{node_modules_17lrt3y._.js → node_modules_09q35v_._.js} +1 -1
  250. package/.next/server/chunks/ssr/{node_modules_1toafc-._.js → node_modules_0_-_a--._.js} +1 -1
  251. package/.next/server/chunks/ssr/{node_modules_0lrjk5t._.js → node_modules_0arus10._.js} +1 -1
  252. package/.next/server/chunks/ssr/{node_modules_04n7mjs._.js → node_modules_0b__sgl._.js} +1 -1
  253. package/.next/server/chunks/ssr/{node_modules_0iz1rzd._.js → node_modules_0cxaxk9._.js} +1 -1
  254. package/.next/server/chunks/ssr/{node_modules_0ndvxub._.js → node_modules_0g7fzk3._.js} +1 -1
  255. package/.next/server/chunks/ssr/{node_modules_0kl7-tn._.js → node_modules_0had7xd._.js} +1 -1
  256. package/.next/server/chunks/ssr/{node_modules_19dp7ko._.js → node_modules_0pvd7q-._.js} +1 -1
  257. package/.next/server/chunks/ssr/node_modules_0x3-ply._.js +3 -0
  258. package/.next/server/chunks/ssr/{node_modules_1dwguw_._.js → node_modules_0yugy6m._.js} +1 -1
  259. package/.next/server/chunks/ssr/{node_modules_004qlr4._.js → node_modules_14om4ar._.js} +1 -1
  260. package/.next/server/chunks/ssr/{node_modules_1q0p85z._.js → node_modules_14q6g4n._.js} +1 -1
  261. package/.next/server/chunks/ssr/node_modules_17bwo43._.js +55 -0
  262. package/.next/server/chunks/ssr/{node_modules_1hd-5tv._.js → node_modules_198nmll._.js} +1 -1
  263. package/.next/server/chunks/ssr/{node_modules_0m93zeg._.js → node_modules_1_pc9kq._.js} +1 -1
  264. package/.next/server/chunks/ssr/{node_modules_1n5ygqe._.js → node_modules_1aaxuef._.js} +1 -1
  265. package/.next/server/chunks/ssr/{node_modules_01qnv-a._.js → node_modules_1cx_ql6._.js} +1 -1
  266. package/.next/server/chunks/ssr/{node_modules_1zu988w._.js → node_modules_1cz2hle._.js} +1 -1
  267. package/.next/server/chunks/ssr/{node_modules_1xyd7ov._.js → node_modules_1efrqxi._.js} +1 -1
  268. package/.next/server/chunks/ssr/{node_modules_13r44jq._.js → node_modules_1eg7m6c._.js} +1 -1
  269. package/.next/server/chunks/ssr/{node_modules_08d8bke._.js → node_modules_1gdh31p._.js} +1 -1
  270. package/.next/server/chunks/ssr/{node_modules_1hn8z1f._.js → node_modules_1hpopmo._.js} +1 -1
  271. package/.next/server/chunks/ssr/{node_modules_20yebtj._.js → node_modules_1qpjvy5._.js} +1 -1
  272. package/.next/server/chunks/ssr/{node_modules_09xhur7._.js → node_modules_1vh5ntv._.js} +1 -1
  273. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0m9a4y0._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1b748ic._.js} +1 -1
  274. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_13w_wy9._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1z4hm5e._.js} +1 -1
  275. package/.next/server/chunks/ssr/node_modules_@vercel_oidc_dist_06mk8id._.js +3 -0
  276. package/.next/server/chunks/ssr/{node_modules_next_dist_0w6mzq5._.js → node_modules_next_dist_0drixxt._.js} +4 -4
  277. package/.next/server/chunks/ssr/node_modules_next_dist_1n3w9lb._.js +2 -2
  278. package/.next/server/instrumentation.js +1 -1
  279. package/.next/server/middleware-build-manifest.js +3 -3
  280. package/.next/server/pages/404.html +1 -1
  281. package/.next/server/pages/500.html +1 -1
  282. package/.next/server/server-reference-manifest.js +1 -1
  283. package/.next/server/server-reference-manifest.json +58 -91
  284. package/.next/static/chunks/00rd4-v8r7axp.js +1 -0
  285. package/.next/static/chunks/08qe4as2q428z.js +3 -0
  286. package/.next/static/chunks/{31ttnjt6g35a0.js → 0ev4hyghq0mbb.js} +1 -1
  287. package/.next/static/chunks/0fl3gwe4-l6tz.js +1 -0
  288. package/.next/static/chunks/0gnqdjn2lvdad.js +2 -0
  289. package/.next/static/chunks/0hwap1-p0m5sa.js +1 -0
  290. package/.next/static/chunks/0r5qcctujhxli.js +1 -0
  291. package/.next/static/chunks/0w52rrrmuj9r9.js +1 -0
  292. package/.next/static/chunks/{07kl352c-lvcz.js → 0wcprt5ot5she.js} +1 -1
  293. package/.next/static/chunks/10teww7wt-f6h.js +1 -0
  294. package/.next/static/chunks/15m575979un5f.js +38 -0
  295. package/.next/static/chunks/17p6tk6k88dq6.js +1 -0
  296. package/.next/static/chunks/{3_h9txt3tq8t8.js → 1dkjg87pxk0n9.js} +1 -1
  297. package/.next/static/chunks/1jd09sxcjddu1.js +1 -0
  298. package/.next/static/chunks/1kq8h8wi_e0bc.js +53 -0
  299. package/.next/static/chunks/{18vhba44l1fc9.js → 1w73ece_6bheu.js} +1 -1
  300. package/.next/static/chunks/{3ard_noqapnw1.js → 214ya3n5gxeih.js} +1 -1
  301. package/.next/static/chunks/22_zkas21rpna.js +1 -0
  302. package/.next/static/chunks/2h0sd2vumhb15.js +1 -0
  303. package/.next/static/chunks/2t4vhi3m8ahya.js +1 -0
  304. package/.next/static/chunks/2tigdtz3dpcy8.js +1 -0
  305. package/.next/static/chunks/2u7xt6mxg44lf.js +1 -0
  306. package/.next/static/chunks/39j0fvpybzabl.js +40 -0
  307. package/.next/static/chunks/3akmqm77muj4-.js +1 -0
  308. package/.next/static/chunks/3cq5g494yuke8.css +1 -0
  309. package/.next/static/chunks/3woj-xd7ki5_i.js +1 -0
  310. package/.next/static/chunks/3xk7yqgomx7yq.js +1 -0
  311. package/.next/static/chunks/3zmcsnuo25zvq.js +1 -0
  312. package/.next/static/media/favicon.37o1pjldwi2uc.ico +0 -0
  313. package/README.md +47 -22
  314. package/app/api/bot/memory/files/route.ts +14 -0
  315. package/app/api/bot/memory/route.ts +5 -0
  316. package/app/api/events/app-event.ts +3 -7
  317. package/app/api/llm-model/credits/route.ts +11 -0
  318. package/app/api/llm-model/route.ts +6 -1
  319. package/app/api/llm-model/subscription/route.ts +11 -0
  320. package/app/api/memory/edit/route.ts +7 -0
  321. package/app/api/memory/route.ts +21 -0
  322. package/app/api/query-key.ts +19 -4
  323. package/bin/port.mjs +65 -0
  324. package/bin/thursday.mjs +5 -33
  325. package/components/ui/shiny-text.tsx +48 -134
  326. package/database/migrations/{20260909060813_optimal_sabretooth → 20260910173049_numerous_spirit}/migration.sql +24 -34
  327. package/database/migrations/{20260909060813_optimal_sabretooth → 20260910173049_numerous_spirit}/snapshot.json +71 -145
  328. package/database/migrations/20260911030320_opposite_jack_power/migration.sql +1 -0
  329. package/database/migrations/{20260909063821_bitter_tenebrous → 20260911030320_opposite_jack_power}/snapshot.json +57 -184
  330. package/docs/how-it-works.md +11 -7
  331. package/docs/images/face-dark.png +0 -0
  332. package/docs/images/face-light.png +0 -0
  333. package/docs/images/keeps-going.png +0 -0
  334. package/features/ai/chatgpt.ts +639 -0
  335. package/features/ai/components/chatgpt-sign-in.tsx +66 -0
  336. package/features/ai/components/model-picker.tsx +17 -1
  337. package/features/ai/components/provider-icon.tsx +1 -0
  338. package/features/ai/load-tools.ts +78 -56
  339. package/features/ai/model.schema.ts +232 -34
  340. package/features/ai/model.ts +169 -24
  341. package/features/ai/prompts/bot.prompt.ts +207 -114
  342. package/features/ai/prompts/memory-edit.prompt.ts +33 -0
  343. package/features/ai/prompts/prompt-helper.ts +45 -26
  344. package/features/ai/prompts/thursday.prompt.ts +57 -27
  345. package/features/ai/tools/bot.tool.ts +35 -52
  346. package/features/ai/tools/connected.ts +17 -4
  347. package/features/ai/tools/memory.tool.ts +181 -117
  348. package/features/ai/tools/search.tool.ts +136 -47
  349. package/features/ai/tools/tool-name.ts +2 -6
  350. package/features/ai/tools/workspace.tool.ts +5 -1
  351. package/features/bot/bot.action.ts +14 -19
  352. package/features/bot/bot.memory.ts +89 -0
  353. package/features/bot/bot.query.ts +37 -57
  354. package/features/bot/bot.run.ts +512 -242
  355. package/features/bot/bot.runner.ts +434 -120
  356. package/features/bot/bot.schema.ts +104 -19
  357. package/features/bot/bot.seed.ts +89 -16
  358. package/features/bot/components/bot-mark.tsx +122 -20
  359. package/features/bot/components/bot-room.tsx +214 -132
  360. package/features/bot/components/bot-setting.tsx +790 -402
  361. package/features/bot/components/bot-tool.tsx +2 -7
  362. package/features/bot/components/mark-palette.tsx +54 -0
  363. package/features/bot/components/path-chips.tsx +1 -1
  364. package/features/bot/components/task-badge.tsx +26 -6
  365. package/features/bot/components/task-reply.tsx +22 -33
  366. package/features/bot/components/task-setting.tsx +20 -17
  367. package/features/bot/task.query.ts +240 -34
  368. package/features/bot/task.store.ts +76 -13
  369. package/features/config/components/config-setting.tsx +265 -34
  370. package/features/config/components/models-badge.tsx +42 -0
  371. package/features/config/config.action.ts +12 -0
  372. package/features/config/config.const.ts +38 -2
  373. package/features/connectors/mcp.manager.ts +10 -2
  374. package/features/intro/components/intro.tsx +47 -46
  375. package/features/memory/components/memory-edit.tsx +340 -0
  376. package/features/memory/components/memory-setting.tsx +75 -77
  377. package/features/memory/memory.action.ts +3 -43
  378. package/features/memory/memory.edit.ts +87 -0
  379. package/features/memory/memory.query.ts +24 -42
  380. package/features/memory/memory.schema.ts +29 -106
  381. package/features/settings/components/settings.tsx +2 -0
  382. package/features/settings/settings.alert.ts +3 -1
  383. package/features/thursday/components/ascii-orb.tsx +106 -90
  384. package/features/thursday/components/boot.tsx +7 -0
  385. package/features/thursday/components/call-log.tsx +219 -92
  386. package/features/thursday/components/face.tsx +6 -4
  387. package/features/thursday/components/tab-state.tsx +97 -0
  388. package/features/thursday/components/thursday-mark.tsx +4 -1
  389. package/features/thursday/components/thursday-setting.tsx +17 -47
  390. package/features/thursday/components/thursday.tsx +208 -98
  391. package/features/thursday/thursday.action.ts +12 -17
  392. package/features/thursday/thursday.query.ts +61 -70
  393. package/features/thursday/thursday.schema.ts +20 -7
  394. package/features/thursday/tool-line.ts +85 -12
  395. package/features/thursday/use-thursday.ts +87 -60
  396. package/features/workspace/components/file-view.tsx +4 -2
  397. package/features/workspace/workspace.ts +110 -26
  398. package/lib/limits.ts +1 -1
  399. package/lib/oauth-page.ts +27 -0
  400. package/lib/realtime/openai.ts +2 -2
  401. package/lib/realtime/realtime.protocol.ts +1 -1
  402. package/lib/realtime/realtime.tap.ts +122 -0
  403. package/lib/sandbox.ts +59 -36
  404. package/package.json +1 -1
  405. package/skills/browser/SKILL.md +55 -34
  406. package/.next/server/app/api/bot/notes/route/app-paths-manifest.json +0 -3
  407. package/.next/server/app/api/bot/notes/route.js +0 -14
  408. package/.next/server/app/api/bot/notes/route_client-reference-manifest.js +0 -3
  409. package/.next/server/app/api/memory/tidy/route/app-paths-manifest.json +0 -3
  410. package/.next/server/app/api/memory/tidy/route.js +0 -22
  411. package/.next/server/app/api/memory/tidy/route.js.nft.json +0 -1
  412. package/.next/server/chunks/0d-b_next_dist_server_app-render_after-task-async-storage_external_0-exn7p.js +0 -3
  413. package/.next/server/chunks/[root-of-the-server]__0-npkh_._.js +0 -3
  414. package/.next/server/chunks/[root-of-the-server]__005var5._.js +0 -3
  415. package/.next/server/chunks/[root-of-the-server]__019dx9f._.js +0 -5
  416. package/.next/server/chunks/[root-of-the-server]__02_2sm-._.js +0 -5
  417. package/.next/server/chunks/[root-of-the-server]__04_8spk._.js +0 -3
  418. package/.next/server/chunks/[root-of-the-server]__05luceg._.js +0 -3
  419. package/.next/server/chunks/[root-of-the-server]__06t77t4._.js +0 -11
  420. package/.next/server/chunks/[root-of-the-server]__0bed6hu._.js +0 -8
  421. package/.next/server/chunks/[root-of-the-server]__0cro2dz._.js +0 -5
  422. package/.next/server/chunks/[root-of-the-server]__0dupqt7._.js +0 -5
  423. package/.next/server/chunks/[root-of-the-server]__0emr6go._.js +0 -3
  424. package/.next/server/chunks/[root-of-the-server]__0le4d-p._.js +0 -3
  425. package/.next/server/chunks/[root-of-the-server]__0m8ywyo._.js +0 -10
  426. package/.next/server/chunks/[root-of-the-server]__0nfuugi._.js +0 -5
  427. package/.next/server/chunks/[root-of-the-server]__0p32jfz._.js +0 -12
  428. package/.next/server/chunks/[root-of-the-server]__0phdgco._.js +0 -8
  429. package/.next/server/chunks/[root-of-the-server]__0wvgrsl._.js +0 -3
  430. package/.next/server/chunks/[root-of-the-server]__10qshki._.js +0 -3
  431. package/.next/server/chunks/[root-of-the-server]__11j52t0._.js +0 -5
  432. package/.next/server/chunks/[root-of-the-server]__1692zrv._.js +0 -3
  433. package/.next/server/chunks/[root-of-the-server]__16thabu._.js +0 -3
  434. package/.next/server/chunks/[root-of-the-server]__173nhwf._.js +0 -8
  435. package/.next/server/chunks/[root-of-the-server]__1_aoyr9._.js +0 -3
  436. package/.next/server/chunks/[root-of-the-server]__1bn73ih._.js +0 -10
  437. package/.next/server/chunks/[root-of-the-server]__1bqhuh9._.js +0 -8
  438. package/.next/server/chunks/[root-of-the-server]__1cqizfq._.js +0 -5
  439. package/.next/server/chunks/[root-of-the-server]__1e-ci13._.js +0 -3
  440. package/.next/server/chunks/[root-of-the-server]__1fboj2j._.js +0 -3
  441. package/.next/server/chunks/[root-of-the-server]__1lr7j9t._.js +0 -5
  442. package/.next/server/chunks/[root-of-the-server]__1oli73c._.js +0 -3
  443. package/.next/server/chunks/[root-of-the-server]__1txedx6._.js +0 -8
  444. package/.next/server/chunks/[root-of-the-server]__1untqv8._.js +0 -5
  445. package/.next/server/chunks/[root-of-the-server]__1zgpz1w._.js +0 -3
  446. package/.next/server/chunks/_00_584r._.js +0 -293
  447. package/.next/server/chunks/_012yhfm._.js +0 -39
  448. package/.next/server/chunks/_06mxlgn._.js +0 -3
  449. package/.next/server/chunks/_07rtlxv._.js +0 -3
  450. package/.next/server/chunks/_0a351g7._.js +0 -6
  451. package/.next/server/chunks/_0kjjmag._.js +0 -3
  452. package/.next/server/chunks/_0nn99o2._.js +0 -3
  453. package/.next/server/chunks/_0zuzmt_._.js +0 -39
  454. package/.next/server/chunks/_106co2o._.js +0 -3
  455. package/.next/server/chunks/_12bbv5i._.js +0 -100
  456. package/.next/server/chunks/_15q1pig._.js +0 -3
  457. package/.next/server/chunks/_19wg5yn._.js +0 -138
  458. package/.next/server/chunks/_1bt95p9._.js +0 -55
  459. package/.next/server/chunks/_1cbk7ms._.js +0 -26
  460. package/.next/server/chunks/_1drv2et._.js +0 -40
  461. package/.next/server/chunks/_1ic3bew._.js +0 -5
  462. package/.next/server/chunks/_1mxn_lb._.js +0 -3
  463. package/.next/server/chunks/_1rysr-r._.js +0 -10
  464. package/.next/server/chunks/_1u3rwbr._.js +0 -3
  465. package/.next/server/chunks/_1x7p319._.js +0 -6
  466. package/.next/server/chunks/_next-internal_server_app_api_bot_notes_route_actions_0qcsyu7.js +0 -3
  467. package/.next/server/chunks/_next-internal_server_app_api_memory_tidy_route_actions_0_cfuom.js +0 -3
  468. package/.next/server/chunks/features_bot_task_query_ts_11xuzl3._.js +0 -3
  469. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0gzvgfv._.js +0 -3
  470. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0vorg6w._.js +0 -3
  471. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1tpvamf._.js +0 -3
  472. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1vmaq9f._.js +0 -3
  473. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1y9-wcr._.js +0 -3
  474. package/.next/server/chunks/ssr/[externals]_node_crypto_1kn79-7._.js +0 -3
  475. package/.next/server/chunks/ssr/[root-of-the-server]__0iuoa-r._.js +0 -3
  476. package/.next/server/chunks/ssr/[root-of-the-server]__0un-erv._.js +0 -4
  477. package/.next/server/chunks/ssr/[root-of-the-server]__1-mnhyd._.js +0 -92
  478. package/.next/server/chunks/ssr/[root-of-the-server]__1bww500._.js +0 -3
  479. package/.next/server/chunks/ssr/[root-of-the-server]__1vcdast._.js +0 -3
  480. package/.next/server/chunks/ssr/[root-of-the-server]__1xwnu-h._.js +0 -3
  481. package/.next/server/chunks/ssr/_0-mc7ro._.js +0 -3
  482. package/.next/server/chunks/ssr/_01p5r6-._.js +0 -3
  483. package/.next/server/chunks/ssr/_03webdr._.js +0 -3
  484. package/.next/server/chunks/ssr/_09-0k3z._.js +0 -3
  485. package/.next/server/chunks/ssr/_0f_b_9s._.js +0 -3
  486. package/.next/server/chunks/ssr/_0fafgvl._.js +0 -3
  487. package/.next/server/chunks/ssr/_0sf1isi._.js +0 -3
  488. package/.next/server/chunks/ssr/_0su6_08._.js +0 -3
  489. package/.next/server/chunks/ssr/_0ti51xc._.js +0 -3
  490. package/.next/server/chunks/ssr/_0w5bgak._.js +0 -3
  491. package/.next/server/chunks/ssr/_0y84qo6._.js +0 -3
  492. package/.next/server/chunks/ssr/_1ciyoo3._.js +0 -3
  493. package/.next/server/chunks/ssr/_1e-dgz0._.js +0 -4
  494. package/.next/server/chunks/ssr/_1fq7zgb._.js +0 -3
  495. package/.next/server/chunks/ssr/_1g6l4uj._.js +0 -3
  496. package/.next/server/chunks/ssr/_1ruzehw._.js +0 -3
  497. package/.next/server/chunks/ssr/features_bot_components_bot-setting_tsx_01ajft6._.js +0 -4
  498. package/.next/server/chunks/ssr/features_config_components_14jqgy4._.js +0 -3
  499. package/.next/server/chunks/ssr/features_memory_components_memory-setting_tsx_0oa43sw._.js +0 -4
  500. package/.next/server/chunks/ssr/node_modules_zod_v4_classic_external_15fmmz3.js +0 -55
  501. package/.next/static/chunks/05b6nx_o3_f_n.js +0 -1
  502. package/.next/static/chunks/0dmns-gi0raa4.js +0 -1
  503. package/.next/static/chunks/0f9sq-7q_yxyl.js +0 -1
  504. package/.next/static/chunks/0oc4_xoia77dg.css +0 -1
  505. package/.next/static/chunks/0pheo8m3a-rzi.js +0 -1
  506. package/.next/static/chunks/19i8h2t-5evjx.js +0 -1
  507. package/.next/static/chunks/1c5fcj473025q.js +0 -1
  508. package/.next/static/chunks/1pi_hbmjw-f-z.js +0 -1
  509. package/.next/static/chunks/1twt6k09vg4np.js +0 -1
  510. package/.next/static/chunks/1ytnip8wdng93.js +0 -1
  511. package/.next/static/chunks/28gotuisldmom.js +0 -1
  512. package/.next/static/chunks/2998p0y7k1c8z.js +0 -3
  513. package/.next/static/chunks/29gyb3nubj51j.js +0 -53
  514. package/.next/static/chunks/2l233xfycjpd8.js +0 -1
  515. package/.next/static/chunks/2p5n7pa3c40t-.js +0 -2
  516. package/.next/static/chunks/2ru1q132af7h7.js +0 -1
  517. package/.next/static/chunks/2t8wqycwg3y04.js +0 -2
  518. package/.next/static/chunks/2uxum7qbyeyxd.js +0 -1
  519. package/.next/static/chunks/32z_ypgtchw48.js +0 -1
  520. package/.next/static/chunks/33pyjb3xd1iez.js +0 -1
  521. package/.next/static/chunks/3omud5xunrk1f.js +0 -1
  522. package/.next/static/chunks/42dnrkbph9e-1.js +0 -1
  523. package/.next/static/media/favicon.2vob68tjqpejf.ico +0 -0
  524. package/database/migrations/20260909063821_bitter_tenebrous/migration.sql +0 -1
  525. package/features/ai/prompts/memory-tidy.prompt.ts +0 -129
  526. package/features/ai/tools/tidy.tool.ts +0 -22
  527. package/features/bot/bot.notes.ts +0 -120
  528. package/features/memory/components/memory-tidy.tsx +0 -395
  529. package/features/memory/components/memory-view.tsx +0 -84
  530. package/features/memory/memory.tidy.ts +0 -332
  531. package/features/memory/tidy.query.ts +0 -135
  532. package/features/thursday/use-call-title.ts +0 -31
  533. /package/.next/server/app/api/bot/{notes → memory/files}/route/build-manifest.json +0 -0
  534. /package/.next/server/app/api/bot/{notes → memory/files}/route/server-reference-manifest.json +0 -0
  535. /package/.next/server/app/api/bot/{notes → memory/files}/route.js.map +0 -0
  536. /package/.next/server/app/api/{memory/tidy → bot/memory}/route/build-manifest.json +0 -0
  537. /package/.next/server/app/api/{memory/tidy → bot/memory}/route/server-reference-manifest.json +0 -0
  538. /package/.next/server/app/api/{memory/tidy → bot/memory}/route.js.map +0 -0
  539. /package/.next/static/{YR4NWcDDuzwLbTTU7U7Vr → kaTO0UHqF1bMnWgCDik2f}/_buildManifest.js +0 -0
  540. /package/.next/static/{YR4NWcDDuzwLbTTU7U7Vr → kaTO0UHqF1bMnWgCDik2f}/_clientMiddlewareManifest.js +0 -0
  541. /package/.next/static/{YR4NWcDDuzwLbTTU7U7Vr → kaTO0UHqF1bMnWgCDik2f}/_ssgManifest.js +0 -0
@@ -12,16 +12,16 @@ import { Combobox } from "@/components/ui/combobox";
12
12
  import { Input } from "@/components/ui/input";
13
13
  import { notify } from "@/components/ui/notify";
14
14
  import { Segmented } from "@/components/ui/segmented";
15
- import { Swatch } from "@/components/ui/swatch";
16
15
  import { Textarea } from "@/components/ui/textarea";
16
+ import { ASCII_FACE } from "@/config";
17
17
  import { ProviderIcon } from "@/features/ai/components/provider-icon";
18
18
  import {
19
19
  type AiProvider,
20
20
  SPEACH_MODEL_PROVIDER_LIST,
21
21
  type SpeachModelRef,
22
22
  } from "@/features/ai/model.schema";
23
- import { MARK_PALETTE_ROWS, MARK_SHAPES } from "@/features/bot/mark.const";
24
- import { TidySetting } from "@/features/memory/components/memory-tidy";
23
+ import { MarkPalette } from "@/features/bot/components/mark-palette";
24
+ import { MARK_SHAPES } from "@/features/bot/mark.const";
25
25
  import {
26
26
  SettingChoiceRows,
27
27
  SettingError,
@@ -149,13 +149,10 @@ export function ThursdaySetting() {
149
149
  onChange={(hotkey) => patch({ hotkey })}
150
150
  />
151
151
 
152
- {/* The last two are server-side, unlike everything above them: the tool set
153
- is built where a call opens (ai/load-tools) and the pass runs without a
154
- browser (memory.tidy) */}
152
+ {/* Server-side, unlike everything above it: the tool set is built where a
153
+ call opens (ai/load-tools) */}
155
154
  <SkillsSetting />
156
155
 
157
- <TidySetting />
158
-
159
156
  <Instructions
160
157
  value={thursday.systemPrompt ?? ""}
161
158
  onSave={(systemPrompt) => patch({ systemPrompt })}
@@ -220,7 +217,7 @@ function ResetHistory() {
220
217
  okMessage: ({ calls, tasks, notes }) =>
221
218
  `Wiped ${calls} calls, ${tasks} jobs, ${notes} notes`,
222
219
  onOk: () => {
223
- // Prefix match, so the tidy log and every loaded history page go too.
220
+ // Prefix match, so every loaded history page goes too.
224
221
  revalidate(queryKey.memory);
225
222
  revalidate(queryKey.tasks);
226
223
  revalidate(queryKey.callHistory(null));
@@ -303,41 +300,14 @@ function FacePicker({
303
300
  </p>
304
301
  </div>
305
302
 
306
- {/* Only the mark takes a color; the orb follows the theme (OrbFace ignores it).
307
- Rows break where the palette breaks (MARK_PALETTE_ROWS); the theme dot stands apart. */}
303
+ {/* Only the mark takes a color; the orb follows the theme (OrbFace ignores it). */}
308
304
  {value.kind === "mark" && (
309
- // both rows center as one block and left-align inside it
310
- <div className="flex justify-center px-2">
311
- <div className="flex flex-col gap-2.5">
312
- <div className="flex flex-wrap items-center gap-2">
313
- <Swatch
314
- color={null}
315
- picked={!value.color}
316
- onPick={() => patch({ color: undefined })}
317
- />
318
- <span className="w-2" />
319
- {MARK_PALETTE_ROWS[0].map((color) => (
320
- <Swatch
321
- key={color}
322
- color={color}
323
- picked={value.color === color}
324
- onPick={() => patch({ color })}
325
- />
326
- ))}
327
- </div>
328
- {/* indent by the theme dot and its gap so the dark row lines up under the first light color */}
329
- <div className="flex flex-wrap items-center gap-2 pl-9">
330
- {MARK_PALETTE_ROWS[1].map((color) => (
331
- <Swatch
332
- key={color}
333
- color={color}
334
- picked={value.color === color}
335
- onPick={() => patch({ color })}
336
- />
337
- ))}
338
- </div>
339
- </div>
340
- </div>
305
+ <MarkPalette
306
+ color={value.color}
307
+ themePicked={!value.color}
308
+ onTheme={() => patch({ color: undefined })}
309
+ onPick={(color) => patch({ color })}
310
+ />
341
311
  )}
342
312
 
343
313
  {value.kind === "mark" && (
@@ -386,8 +356,8 @@ function FacePicker({
386
356
 
387
357
  <Row label="Size">
388
358
  <Slider
389
- min={4}
390
- max={16}
359
+ min={ASCII_FACE.fontSize.min}
360
+ max={ASCII_FACE.fontSize.max}
391
361
  step={1}
392
362
  value={value.fontSize}
393
363
  format={(n) => `${n}px`}
@@ -397,8 +367,8 @@ function FacePicker({
397
367
 
398
368
  <Row label="Density">
399
369
  <Slider
400
- min={0.6}
401
- max={2}
370
+ min={ASCII_FACE.density.min}
371
+ max={ASCII_FACE.density.max}
402
372
  step={0.1}
403
373
  value={value.density}
404
374
  format={(n) => `${n.toFixed(1)}x`}
@@ -4,7 +4,7 @@ import {
4
4
  ChevronDown,
5
5
  ChevronUp,
6
6
  Flag,
7
- Loader2,
7
+ type LucideIcon,
8
8
  Mic,
9
9
  MicOff,
10
10
  Settings2,
@@ -13,7 +13,7 @@ import { type ReactNode, useEffect, useRef, useState } from "react";
13
13
  import { queryKey } from "@/app/api/query-key";
14
14
  import { Button } from "@/components/ui/button";
15
15
  import { ButtonGroup } from "@/components/ui/button-group";
16
- import ShinyText from "@/components/ui/shiny-text";
16
+ import { ShinyText } from "@/components/ui/shiny-text";
17
17
  import TextType from "@/components/ui/text-type";
18
18
  import {
19
19
  Tooltip,
@@ -22,15 +22,13 @@ import {
22
22
  TooltipTrigger,
23
23
  } from "@/components/ui/tooltip";
24
24
  import { SPEACH_MODEL_PROVIDER_LIST } from "@/features/ai/model.schema";
25
- import { DEFAULT_BOT } from "@/features/bot/bot.schema";
25
+ import { type Bot, DEFAULT_BOT } from "@/features/bot/bot.schema";
26
26
  import { BotMark } from "@/features/bot/components/bot-mark";
27
27
  import { BotRoom } from "@/features/bot/components/bot-room";
28
28
  import { toolIcon } from "@/features/bot/components/bot-tool";
29
29
  import { installSeedBots } from "@/features/bot/seed-bots";
30
30
  import { VoiceKeys } from "@/features/config/components/voice-key";
31
31
  import { type ConfigStatus, isConfigSet } from "@/features/config/config.const";
32
- import { MemoryTidyNotice } from "@/features/memory/components/memory-tidy";
33
- import { MemoryView } from "@/features/memory/components/memory-view";
34
32
  import { SECTIONS, Settings } from "@/features/settings/components/settings";
35
33
  import {
36
34
  type SectionAlert,
@@ -47,13 +45,13 @@ import {
47
45
  type ThursdayFace,
48
46
  } from "@/features/thursday/thursday.schema";
49
47
  import { useThursdayStore } from "@/features/thursday/thursday.store";
50
- import { useCallTitle } from "@/features/thursday/use-call-title";
51
48
  import { type ToolRun, useThursday } from "@/features/thursday/use-thursday";
52
49
  import { ArtifactView } from "@/features/workspace/components/artifact-view";
53
50
  import { useHotkeyLabel } from "@/hooks/use-hotkey";
54
51
  import { useServerRoute } from "@/lib/protocol/use-server-route";
55
52
  import { cn } from "@/lib/utils";
56
53
  import { Face } from "./face";
54
+ import { TabState } from "./tab-state";
57
55
 
58
56
  /**
59
57
  * The call screen. The face is the only control; text stays beside it and is
@@ -115,6 +113,7 @@ export function CallScreen({
115
113
  const hers =
116
114
  messages.findLast((turn) => turn.role === "assistant")?.text ?? "";
117
115
  const sided = captionView === "sides" && status !== "idle";
116
+ const turns = useTurnPager(messages);
118
117
  return (
119
118
  <div className="relative flex h-full flex-col">
120
119
  <div className="absolute top-5 right-5 z-10">
@@ -122,7 +121,14 @@ export function CallScreen({
122
121
  </div>
123
122
 
124
123
  {/* Top padding in vh, like the face itself, so the face+text column sits below center */}
125
- <div className="flex min-h-0 flex-1 flex-col items-center justify-center gap-5 pt-[7vh]">
124
+ {/* The wheel winds the turns back. It is on this column rather than on the
125
+ screen: the corner holds the settings dialog and the room its own list,
126
+ and a portal's wheel bubbles up the tree it was written in, not the one
127
+ it is drawn in. */}
128
+ <div
129
+ onWheel={sided ? turns.onWheel : undefined}
130
+ className="flex min-h-0 flex-1 flex-col items-center justify-center gap-5 pt-[7vh]"
131
+ >
126
132
  {/* The face is the control. It reacts to the agent's own voice. */}
127
133
  <div className="relative w-[min(28rem,72vw,52vh)]">
128
134
  <button
@@ -151,7 +157,7 @@ export function CallScreen({
151
157
  />
152
158
  </button>
153
159
 
154
- {sided && <SideCaptions messages={messages} />}
160
+ {sided && <SideCaptions shown={turns.shown} give={turns.give} />}
155
161
  </div>
156
162
 
157
163
  {/* The column is wider than the text (40rem); the side margins hold the caption chevrons (Flow) */}
@@ -207,10 +213,6 @@ export function CallScreen({
207
213
  </div>
208
214
  </div>
209
215
 
210
- {/* Memory the model opens for reading (memory_show) */}
211
- <MemoryView />
212
- {/* A tidy pass ending is off-screen; it toasts (memory-tidy) */}
213
- <MemoryTidyNotice />
214
216
  {/* Documents a finished task produced; opens itself on the artifact event */}
215
217
  <ArtifactView />
216
218
 
@@ -513,8 +515,23 @@ function Step({
513
515
  );
514
516
  }
515
517
 
516
- /** Bars the mic meter draws, over the bands a voice actually sits in. */
517
- const MIC_BARS = ["a", "b", "c", "d", "e"];
518
+ /**
519
+ * Bars the mic meter draws: each over its own slice of the bands, with a gain
520
+ * that answers what a voice does to them. Speech stacks its energy in the
521
+ * fundamental and thins out with every band above it, so one gain for all five
522
+ * draws a tall bar on the left and four stubs — the gain rises to meet the
523
+ * drop, and the whole row moves instead of its first quarter.
524
+ */
525
+ const MIC_BARS = [
526
+ { id: "a", from: 0, to: 1, gain: 0.8 },
527
+ { id: "b", from: 1, to: 3, gain: 1 },
528
+ { id: "c", from: 3, to: 5, gain: 1.15 },
529
+ { id: "d", from: 5, to: 6, gain: 1.35 },
530
+ { id: "e", from: 6, to: 8, gain: 1.55 },
531
+ ];
532
+
533
+ /** Bar height in px, silent and at full. */
534
+ const MIC_BAR = { rest: 2, full: 14 };
518
535
 
519
536
  /**
520
537
  * The user's own level, read once per animation frame like the face reads
@@ -530,15 +547,28 @@ function MicMeter({
530
547
  getMicSpectrum?: () => ArrayLike<number>;
531
548
  }) {
532
549
  const bars = useRef<Record<string, HTMLSpanElement | null>>({});
550
+ // Height per bar, kept between frames so a bar can fall slower than it rises.
551
+ const held = useRef(MIC_BARS.map(() => 0));
533
552
 
534
553
  useEffect(() => {
535
554
  if (!live || !getMicSpectrum) return;
536
555
  let frame = requestAnimationFrame(function draw() {
537
556
  const bands = getMicSpectrum();
538
- MIC_BARS.forEach((id, at) => {
539
- const bar = bars.current[id];
540
- if (bar) {
541
- bar.style.height = `${2 + Math.min(1, bands[at] ?? 0) * 12}px`;
557
+ MIC_BARS.forEach((bar, at) => {
558
+ let peak = 0;
559
+ for (let k = bar.from; k < bar.to; k++) {
560
+ peak = Math.max(peak, bands[k] ?? 0);
561
+ }
562
+ // The curve is the loudness the ear hears, not the energy the mic reads:
563
+ // without it everything under half volume draws as the same short bar.
564
+ const want = Math.min(1, (peak * bar.gain) ** 0.8);
565
+ const was = held.current[at];
566
+ // Up in a frame or two to catch a syllable, down slowly enough to see.
567
+ const now = was + (want - was) * (want > was ? 0.6 : 0.16);
568
+ held.current[at] = now;
569
+ const node = bars.current[bar.id];
570
+ if (node) {
571
+ node.style.height = `${MIC_BAR.rest + now * (MIC_BAR.full - MIC_BAR.rest)}px`;
542
572
  }
543
573
  });
544
574
  frame = requestAnimationFrame(draw);
@@ -551,13 +581,13 @@ function MicMeter({
551
581
  aria-hidden
552
582
  className="flex h-3.5 w-[18px] shrink-0 items-center gap-0.5"
553
583
  >
554
- {MIC_BARS.map((id) => (
584
+ {MIC_BARS.map((bar) => (
555
585
  <span
556
- key={id}
586
+ key={bar.id}
557
587
  ref={(node) => {
558
- bars.current[id] = node;
588
+ bars.current[bar.id] = node;
559
589
  }}
560
- style={{ height: 2 }}
590
+ style={{ height: MIC_BAR.rest }}
561
591
  className="w-0.5 rounded-full bg-muted-foreground/70"
562
592
  />
563
593
  ))}
@@ -580,7 +610,7 @@ function Ear({
580
610
  getMicSpectrum?: () => ArrayLike<number>;
581
611
  }) {
582
612
  return (
583
- <span className="flex items-center gap-2 text-[13px] leading-5 text-muted-foreground">
613
+ <span className="flex items-center gap-1.5 text-[13px] leading-5 text-muted-foreground">
584
614
  <MicMeter live={live} getMicSpectrum={getMicSpectrum} />
585
615
  Listening
586
616
  </span>
@@ -592,57 +622,107 @@ function Ear({
592
622
  * motion (loader in the icon slot, shine on the text), not color; the loader
593
623
  * resolving into the tool's own glyph is what "finished" looks like.
594
624
  *
595
- * No pill. This slot cross-fades with the listening chip, which has no
596
- * container, so an outline under one of the two read as the line changing
597
- * shape rather than changing state.
625
+ * The line itself wears no pill. This slot cross-fades with the listening chip,
626
+ * which has no container either, so an outline under one of the two read as the
627
+ * line changing shape rather than changing state.
598
628
  */
599
629
  function Activity({ tool, micOff }: { tool: ToolRun; micOff: boolean }) {
600
- // a relay from a bot is a flag, like the report tool
630
+ // a relay from a bot is a flag, like the answer tool — unless it names the bot
601
631
  const relay = tool.kind === "relay";
602
632
  const Icon = relay ? Flag : toolIcon(tool.name);
633
+ // The sentence when there is one; otherwise the tool's own name is the line,
634
+ // rather than a tag repeating one.
635
+ const text = tool.line ?? tool.name;
636
+ const look = tool.line
637
+ ? "min-w-0 truncate text-[13px] leading-5 break-keep"
638
+ : "min-w-0 truncate font-mono text-xs leading-5";
639
+ // Only for the colour and silhouette the user picked; the name alone already
640
+ // draws a face, so a roster that has not arrived yet costs nothing.
641
+ const bots = useServerRoute<Bot[]>(queryKey.bot).data;
642
+ const bot = tool.bot
643
+ ? (bots?.find((one) => one.name === tool.bot) ?? null)
644
+ : null;
603
645
  return (
604
- <span className="flex max-w-full items-center gap-2">
605
- {/* 20px slot for a 14px glyph: the badge below needs the corner, and the
606
- row keeps the icon width the listening meter beside it has */}
607
- <span className="relative mr-0.5 grid size-5 shrink-0 place-items-center">
608
- {tool.done ? (
609
- <Icon className="size-3.5 text-muted-foreground" />
610
- ) : (
611
- <Loader2 className="size-3.5 animate-spin text-muted-foreground" />
612
- )}
613
- {/* The mic is closed because this is running, so the mark sits on its
614
- cause. As a row of its own it read as a warning about the mic. The
615
- padded disc is the separation the pill used to give it: on the bare
616
- page the two glyphs otherwise share strokes and read as a smudge. */}
617
- {micOff && (
618
- <MicOff className="absolute -right-1.5 -bottom-1.5 size-4 rounded-full bg-background p-[3.5px] text-muted-foreground" />
646
+ <span className="flex max-w-full items-center gap-1.5">
647
+ {/* 18px slot, the width the listening meter beside it has, so the two
648
+ faces of this slot start on the same edge */}
649
+ <span className="relative grid size-[18px] shrink-0 place-items-center">
650
+ <Mark tool={tool} bot={bot} icon={Icon} />
651
+ {/* Running is the glyph being filled in, over its own dimmed self: the
652
+ spinner that used to stand here took the glyph off the screen for as
653
+ long as it ran, which is exactly when it says the most. */}
654
+ {!tool.done && (
655
+ <span className="absolute inset-0 grid animate-ink place-items-center">
656
+ <Mark tool={tool} bot={bot} icon={Icon} running />
657
+ </span>
619
658
  )}
620
659
  </span>
621
- {/* The sentence when there is one; otherwise the tool's own name is the
622
- line, rather than a tag repeating one. */}
623
- {tool.line ? (
624
- tool.done ? (
625
- <span className="min-w-0 truncate text-[13px] leading-5 break-keep text-muted-foreground">
626
- {tool.line}
627
- </span>
628
- ) : (
629
- <ShinyText
630
- text={tool.line}
631
- speed={2.4}
632
- color="var(--muted-foreground)"
633
- shineColor="var(--foreground)"
634
- className="min-w-0 truncate text-[13px] leading-5 break-keep"
635
- />
636
- )
660
+ {/* The sweep is what says this is still running, so it is on whatever the
661
+ line turns out to be — the sentence, or the bare tool name. */}
662
+ {tool.done ? (
663
+ <span className={cn(look, "text-muted-foreground")}>{text}</span>
637
664
  ) : (
638
- <span className="min-w-0 truncate font-mono text-xs leading-5 text-muted-foreground">
639
- {tool.name}
665
+ <ShinyText text={text} speed={2.4} className={look} />
666
+ )}
667
+ {/* The mic is closed because this is running, so it travels with the line.
668
+ A chip, where the line has none: on the bare page a second glyph beside
669
+ the tool's own shares strokes with it and reads as a smudge, and the
670
+ plate is what says this is a state rather than more of the sentence. */}
671
+ {micOff && (
672
+ <span className="flex shrink-0 items-center gap-1 rounded-full bg-muted/60 py-0.5 pr-2 pl-1.5 font-mono text-[11px] leading-4 text-muted-foreground">
673
+ <MicOff className="size-3 shrink-0" />
674
+ mic off
640
675
  </span>
641
676
  )}
642
677
  </span>
643
678
  );
644
679
  }
645
680
 
681
+ /**
682
+ * What the row draws in its glyph slot: the bot's own face when the line names
683
+ * one, the tool's glyph otherwise. Who work went to, and who brought an answer
684
+ * back, is a face everywhere else in the app — the roster, the pill, the room.
685
+ *
686
+ * `running` is the copy the ink wipes in, so it is the one at full strength.
687
+ */
688
+ function Mark({
689
+ tool,
690
+ bot,
691
+ icon: Icon,
692
+ running,
693
+ }: {
694
+ tool: ToolRun;
695
+ /** The row the name resolved to, when the roster has one; its look, not its identity. */
696
+ bot: Bot | null;
697
+ icon: LucideIcon;
698
+ running?: boolean;
699
+ }) {
700
+ if (tool.bot) {
701
+ return (
702
+ <span className={cn("flex", !running && !tool.done && "opacity-40")}>
703
+ <BotMark
704
+ size={16}
705
+ seed={tool.bot}
706
+ vary={tool.bot}
707
+ color={bot?.icon?.color}
708
+ shape={bot?.icon?.shape}
709
+ outline={bot?.icon?.outline}
710
+ notify={false}
711
+ />
712
+ </span>
713
+ );
714
+ }
715
+ return (
716
+ <Icon
717
+ className={cn(
718
+ "size-3.5",
719
+ running ? "text-foreground" : "text-muted-foreground",
720
+ !running && !tool.done && "opacity-40",
721
+ )}
722
+ />
723
+ );
724
+ }
725
+
646
726
  /**
647
727
  * The activity slot: 28px, one fact at a time, two faces. Both stay mounted and
648
728
  * cross-fade, so the line leaves wearing its last words instead of blinking
@@ -729,7 +809,13 @@ function Hint({
729
809
  let key: string;
730
810
  if (busy) {
731
811
  key = status;
732
- body = status === "connecting" ? "Connecting…" : "Ending…";
812
+ // still moving, so it shines like every other line that is
813
+ body = (
814
+ <ShinyText
815
+ text={status === "connecting" ? "Connecting…" : "Ending…"}
816
+ className="text-muted-foreground/70"
817
+ />
818
+ );
733
819
  } else if (live && idleLeft !== null) {
734
820
  key = "quiet";
735
821
  body = `Quiet — ending in ${idleLeft}s. Say anything to stay.`;
@@ -865,18 +951,24 @@ function Elapsed({ since }: { since: number | null }) {
865
951
  const VISIBLE = 3;
866
952
 
867
953
  /**
868
- * Wheel delta per turn. Deliberately heavy: a casual flick barely moves,
869
- * though the few pixels of give show it is not stuck.
954
+ * Wheel delta per turn. Deliberately heavy — a turn is a paragraph, and a
955
+ * trackpad flick that pages three of them reads as losing the conversation
956
+ * rather than moving through it. The give is what says it is not stuck.
870
957
  */
871
- const STEP = 200;
958
+ const STEP = 360;
959
+
960
+ /** How far the plates lean while the wheel is short of a turn, px. */
961
+ const GIVE = 10;
962
+
963
+ /** How long the wheel keeps what it has gathered. Past this the lean springs back and the count starts over, so half a turn never waits around to be completed by the next flick. */
964
+ const SETTLE_MS = 220;
872
965
 
873
966
  /**
874
- * Recent turns beside the face: yours on the right, hers on the left, each on
875
- * a fill with no edge. Anchored outside the face box (`right-full` /
876
- * `left-full`) so they never cover it. Older turns sit higher, smaller, and
877
- * their plate recedes.
967
+ * Where the wheel has wound the turns back to. Lives on the screen rather than
968
+ * in the plates: the three plates are small and sit off to the sides, so a
969
+ * wheel over the face — where the cursor is — used to reach nothing at all.
878
970
  */
879
- function SideCaptions({ messages }: { messages: CallMessage[] }) {
971
+ function useTurnPager(messages: CallMessage[]) {
880
972
  const [back, setBack] = useState(0);
881
973
  const [give, setGive] = useState(0);
882
974
  const drag = useRef(0);
@@ -890,13 +982,9 @@ function SideCaptions({ messages }: { messages: CallMessage[] }) {
890
982
  const grew = messages.length - seen.current;
891
983
  seen.current = messages.length;
892
984
  if (grew > 0) {
893
- setBack((was) =>
894
- was > 0
895
- ? Math.min(was + grew, Math.max(0, messages.length - VISIBLE))
896
- : 0,
897
- );
985
+ setBack((was) => (was > 0 ? Math.min(was + grew, furthest) : 0));
898
986
  }
899
- }, [messages.length]);
987
+ }, [messages.length, furthest]);
900
988
 
901
989
  useEffect(
902
990
  () => () => {
@@ -905,7 +993,9 @@ function SideCaptions({ messages }: { messages: CallMessage[] }) {
905
993
  [],
906
994
  );
907
995
 
908
- const wind = (event: React.WheelEvent) => {
996
+ const onWheel = (event: React.WheelEvent) => {
997
+ // nothing behind the three on screen: no travel, and no lean pretending there is
998
+ if (furthest === 0) return;
909
999
  drag.current += event.deltaY;
910
1000
  const steps = Math.trunc(drag.current / STEP);
911
1001
  if (steps !== 0) {
@@ -919,12 +1009,31 @@ function SideCaptions({ messages }: { messages: CallMessage[] }) {
919
1009
  settle.current = setTimeout(() => {
920
1010
  drag.current = 0;
921
1011
  setGive(0);
922
- }, 160);
1012
+ }, SETTLE_MS);
923
1013
  };
924
1014
 
925
1015
  const end = messages.length - back;
926
- const shown = messages.slice(Math.max(0, end - VISIBLE), end);
1016
+ return {
1017
+ shown: messages.slice(Math.max(0, end - VISIBLE), end),
1018
+ give,
1019
+ onWheel,
1020
+ };
1021
+ }
927
1022
 
1023
+ /**
1024
+ * Recent turns beside the face: yours on the right, hers on the left, each on
1025
+ * a fill with no edge. Anchored outside the face box (`right-full` /
1026
+ * `left-full`) so they never cover it. Older turns sit higher, smaller, and
1027
+ * their plate recedes.
1028
+ */
1029
+ function SideCaptions({
1030
+ shown,
1031
+ give,
1032
+ }: {
1033
+ shown: CallMessage[];
1034
+ /** How far into the next turn the wheel is, -1..1; the plates lean by it. */
1035
+ give: number;
1036
+ }) {
928
1037
  return (
929
1038
  <>
930
1039
  {shown.map((message, index) => {
@@ -941,10 +1050,9 @@ function SideCaptions({ messages }: { messages: CallMessage[] }) {
941
1050
  return (
942
1051
  <div
943
1052
  key={message.id}
944
- onWheel={wind}
945
1053
  style={{
946
1054
  top: `${top}%`,
947
- transform: `translateY(calc(-50% + ${-give * 6}px))`,
1055
+ transform: `translateY(calc(-50% + ${-give * GIVE}px))`,
948
1056
  }}
949
1057
  className={cn(
950
1058
  // fixed-width slot, natural-width plate: short lines stay short and hug the face
@@ -1003,8 +1111,6 @@ export function Thursday() {
1003
1111
  // a preference, not a fact about the model (thursday.store)
1004
1112
  const face = useThursdayFace();
1005
1113
  const captionView = useThursdayStore((state) => state.captionView);
1006
- // the tab title shows the call state off-screen
1007
- useCallTitle(status !== "idle");
1008
1114
 
1009
1115
  /**
1010
1116
  * Same question as the server's `isCallable`, asked here because the answer
@@ -1016,21 +1122,25 @@ export function Thursday() {
1016
1122
  );
1017
1123
 
1018
1124
  return (
1019
- <CallScreen
1020
- status={status}
1021
- messages={messages}
1022
- tool={tool}
1023
- onTap={call}
1024
- wakePhrase={wakePhrase}
1025
- hotkeyLabel={hotkeyLabel}
1026
- idleLeft={idleLeft}
1027
- since={since}
1028
- micOff={micOff}
1029
- getSpectrum={getSpectrum}
1030
- getMicSpectrum={getMicSpectrum}
1031
- face={face}
1032
- captionView={captionView}
1033
- callable={callable}
1034
- />
1125
+ <>
1126
+ {/* the tab shows the call and what is owed while the app is off-screen */}
1127
+ <TabState live={status !== "idle"} />
1128
+ <CallScreen
1129
+ status={status}
1130
+ messages={messages}
1131
+ tool={tool}
1132
+ onTap={call}
1133
+ wakePhrase={wakePhrase}
1134
+ hotkeyLabel={hotkeyLabel}
1135
+ idleLeft={idleLeft}
1136
+ since={since}
1137
+ micOff={micOff}
1138
+ getSpectrum={getSpectrum}
1139
+ getMicSpectrum={getMicSpectrum}
1140
+ face={face}
1141
+ captionView={captionView}
1142
+ callable={callable}
1143
+ />
1144
+ </>
1035
1145
  );
1036
1146
  }