thursday-agent 0.2.0 → 0.3.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 (535) 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 +11 -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 +27 -0
  134. package/.next/server/chunks/{_0pppbb5._.js → _03kp0jp._.js} +163 -36
  135. package/.next/server/chunks/_051qh8u._.js +3 -0
  136. package/.next/server/chunks/{node_modules_next_04q-o58._.js → _05dla15._.js} +2 -2
  137. package/.next/server/chunks/_05h2cii._.js +1 -1
  138. package/.next/server/chunks/_0c9j6rb._.js +49 -0
  139. package/.next/server/chunks/_0fzqt2y._.js +130 -0
  140. package/.next/server/chunks/{_0vnutv9._.js → _0ioz3nd._.js} +1 -1
  141. package/.next/server/chunks/_0iwfby5._.js +3 -0
  142. package/.next/server/chunks/_0mecv0f._.js +26 -0
  143. package/.next/server/chunks/_0mh8j4m._.js +3 -0
  144. package/.next/server/chunks/_0n74zsf._.js +4 -4
  145. package/.next/server/chunks/_0obojvv._.js +3 -0
  146. package/.next/server/chunks/_0recufk._.js +49 -0
  147. package/.next/server/chunks/_0rnf-6n._.js +4 -4
  148. package/.next/server/chunks/_0sb7tlz._.js +3 -0
  149. package/.next/server/chunks/_0u10wmw._.js +5 -5
  150. package/.next/server/chunks/_0u4aiy2._.js +3 -0
  151. package/.next/server/chunks/_0wp4le3._.js +1 -1
  152. package/.next/server/chunks/_0y5fg-x._.js +1 -1
  153. package/.next/server/chunks/_1230wbx._.js +10 -0
  154. package/.next/server/chunks/_12nheja._.js +3 -0
  155. package/.next/server/chunks/_13510xh._.js +3 -0
  156. package/.next/server/chunks/_15hq89o._.js +1 -1
  157. package/.next/server/chunks/_17l5ygt._.js +49 -0
  158. package/.next/server/chunks/_18-1wcc._.js +5 -5
  159. package/.next/server/chunks/_1_5mnq4._.js +4 -4
  160. package/.next/server/chunks/_1_9mjx-._.js +3 -0
  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]__09q9med._.js +1 -1
  195. package/.next/server/chunks/ssr/{[root-of-the-server]__1qfqvmg._.js → [root-of-the-server]__0_69wqr._.js} +2 -2
  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]__0tbkdlx._.js +3 -0
  200. package/.next/server/chunks/ssr/[root-of-the-server]__0vnmv-s._.js +3 -0
  201. package/.next/server/chunks/ssr/{[root-of-the-server]__0f6s48x._.js → [root-of-the-server]__0xpcv9w._.js} +3 -3
  202. package/.next/server/chunks/ssr/[root-of-the-server]__0xtssj3._.js +1 -1
  203. package/.next/server/chunks/ssr/[root-of-the-server]__0zkv7z_._.js +3 -0
  204. package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +57 -0
  205. package/.next/server/chunks/ssr/[root-of-the-server]__15_uhip._.js +3 -0
  206. package/.next/server/chunks/ssr/[root-of-the-server]__16jc196._.js +1 -1
  207. package/.next/server/chunks/ssr/{[root-of-the-server]__0m1b5ky._.js → [root-of-the-server]__1cyjywu._.js} +1 -1
  208. package/.next/server/chunks/ssr/[root-of-the-server]__1eh7hid._.js +3 -0
  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]__1pduf5n._.js +3 -0
  213. package/.next/server/chunks/ssr/{_1mznrxk._.js → _001_ms1._.js} +3 -3
  214. package/.next/server/chunks/ssr/_01_6m32._.js +3 -0
  215. package/.next/server/chunks/ssr/_01n3o0m._.js +3 -0
  216. package/.next/server/chunks/ssr/_07uchnc._.js +3 -0
  217. package/.next/server/chunks/ssr/_0ap2fzn._.js +3 -0
  218. package/.next/server/chunks/ssr/_0c-ql2m._.js +3 -0
  219. package/.next/server/chunks/ssr/_0h42fze._.js +3 -0
  220. package/.next/server/chunks/ssr/_0h7zdni._.js +1 -1
  221. package/.next/server/chunks/ssr/_0i_6q1w._.js +41 -0
  222. package/.next/server/chunks/ssr/_0kbkmar._.js +3 -0
  223. package/.next/server/chunks/ssr/{_077-g6s._.js → _0mb8zc8._.js} +3 -3
  224. package/.next/server/chunks/ssr/_0mo2w06._.js +3 -0
  225. package/.next/server/chunks/ssr/{_13punpm._.js → _0q0zan6._.js} +2 -2
  226. package/.next/server/chunks/ssr/{_040sk32._.js → _0u2jv_x._.js} +76 -82
  227. package/.next/server/chunks/ssr/_0y0tiht._.js +4 -0
  228. package/.next/server/chunks/ssr/_0zhoc3r._.js +3 -0
  229. package/.next/server/chunks/ssr/_1-teee5._.js +3 -3
  230. package/.next/server/chunks/ssr/_13fke0x._.js +3 -0
  231. package/.next/server/chunks/ssr/{_1lip4th._.js → _13z3f85._.js} +2 -2
  232. package/.next/server/chunks/ssr/_14_lw10._.js +3 -0
  233. package/.next/server/chunks/ssr/_15j2_8f._.js +3 -0
  234. package/.next/server/chunks/ssr/{_09ja_w1._.js → _1eoqg_g._.js} +2 -2
  235. package/.next/server/chunks/ssr/_1sji22n._.js +3 -0
  236. package/.next/server/chunks/ssr/_1spzm8z._.js +3 -0
  237. package/.next/server/chunks/ssr/{_0x_nu5e._.js → _1vi_uo7._.js} +2 -2
  238. package/.next/server/chunks/ssr/_1vyd1ji._.js +1 -1
  239. package/.next/server/chunks/ssr/{_1m3bsfr._.js → _1xvgn77._.js} +2 -2
  240. package/.next/server/chunks/ssr/_20kd_n0._.js +42 -0
  241. package/.next/server/chunks/ssr/features_bot_1s_-2vj._.js +3 -0
  242. package/.next/server/chunks/ssr/features_config_components_config-setting_tsx_0xfwqdg._.js +1 -1
  243. package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
  244. package/.next/server/chunks/ssr/lib_date-like_ts_02is0pw._.js +3 -0
  245. package/.next/server/chunks/ssr/{node_modules_18_dk7_._.js → node_modules_063xwpp._.js} +1 -1
  246. package/.next/server/chunks/ssr/{node_modules_01qnv-a._.js → node_modules_0bvraul._.js} +1 -1
  247. package/.next/server/chunks/ssr/{node_modules_0n1kj4p._.js → node_modules_0eu1va6._.js} +1 -1
  248. package/.next/server/chunks/ssr/{node_modules_0kl7-tn._.js → node_modules_0h50b8n._.js} +1 -1
  249. package/.next/server/chunks/ssr/{node_modules_0_n241r._.js → node_modules_0h5hnr1._.js} +1 -1
  250. package/.next/server/chunks/ssr/{node_modules_0lrjk5t._.js → node_modules_0h7u60n._.js} +1 -1
  251. package/.next/server/chunks/ssr/{node_modules_0ndvxub._.js → node_modules_0lm7_vm._.js} +1 -1
  252. package/.next/server/chunks/ssr/{node_modules_13r44jq._.js → node_modules_0mwym0g._.js} +1 -1
  253. package/.next/server/chunks/ssr/{node_modules_17lrt3y._.js → node_modules_0rjg6t1._.js} +1 -1
  254. package/.next/server/chunks/ssr/node_modules_0x3-ply._.js +3 -0
  255. package/.next/server/chunks/ssr/{node_modules_004qlr4._.js → node_modules_0y_cded._.js} +1 -1
  256. package/.next/server/chunks/ssr/{node_modules_0kxz4gt._.js → node_modules_0z5tsu8._.js} +1 -1
  257. package/.next/server/chunks/ssr/{node_modules_0iz1rzd._.js → node_modules_0zp9r92._.js} +1 -1
  258. package/.next/server/chunks/ssr/{node_modules_19dp7ko._.js → node_modules_1-hc6uv._.js} +1 -1
  259. package/.next/server/chunks/ssr/{node_modules_1q0p85z._.js → node_modules_113tz0l._.js} +1 -1
  260. package/.next/server/chunks/ssr/{node_modules_1toafc-._.js → node_modules_124bue5._.js} +1 -1
  261. package/.next/server/chunks/ssr/node_modules_17bwo43._.js +55 -0
  262. package/.next/server/chunks/ssr/{node_modules_08d8bke._.js → node_modules_1_n3ztw._.js} +1 -1
  263. package/.next/server/chunks/ssr/{node_modules_1dwguw_._.js → node_modules_1bc7gu8._.js} +1 -1
  264. package/.next/server/chunks/ssr/{node_modules_20yebtj._.js → node_modules_1bgb6-f._.js} +1 -1
  265. package/.next/server/chunks/ssr/{node_modules_1n5ygqe._.js → node_modules_1h4a4pp._.js} +1 -1
  266. package/.next/server/chunks/ssr/{node_modules_04n7mjs._.js → node_modules_1i7u1ia._.js} +1 -1
  267. package/.next/server/chunks/ssr/{node_modules_1hn8z1f._.js → node_modules_1juq3hs._.js} +1 -1
  268. package/.next/server/chunks/ssr/{node_modules_1xyd7ov._.js → node_modules_1l0qtdu._.js} +1 -1
  269. package/.next/server/chunks/ssr/{node_modules_0m93zeg._.js → node_modules_1t9cyee._.js} +1 -1
  270. package/.next/server/chunks/ssr/{node_modules_09xhur7._.js → node_modules_1uuj9x1._.js} +1 -1
  271. package/.next/server/chunks/ssr/{node_modules_1hd-5tv._.js → node_modules_1vqb6po._.js} +1 -1
  272. package/.next/server/chunks/ssr/{node_modules_1zu988w._.js → node_modules_1xx28h1._.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_0d3skpl._.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_0i44kk5._.js} +1 -1
  275. package/.next/server/chunks/ssr/node_modules_@vercel_oidc_dist_0qe30a_._.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/{31ttnjt6g35a0.js → 0ev4hyghq0mbb.js} +1 -1
  285. package/.next/static/chunks/0r5qcctujhxli.js +1 -0
  286. package/.next/static/chunks/0tmgrnlje14-s.js +3 -0
  287. package/.next/static/chunks/0x79tx04dxbpp.js +1 -0
  288. package/.next/static/chunks/0xzgvc0fkdb6t.js +1 -0
  289. package/.next/static/chunks/10teww7wt-f6h.js +1 -0
  290. package/.next/static/chunks/14hgtsjg-kael.css +1 -0
  291. package/.next/static/chunks/17donp69y4do7.js +40 -0
  292. package/.next/static/chunks/{3_h9txt3tq8t8.js → 1dkjg87pxk0n9.js} +1 -1
  293. package/.next/static/chunks/1ekc7ul556kbl.js +1 -0
  294. package/.next/static/chunks/{3ard_noqapnw1.js → 1grhjo7a5a0_-.js} +1 -1
  295. package/.next/static/chunks/1kq8h8wi_e0bc.js +53 -0
  296. package/.next/static/chunks/1okqiww3pnwka.js +1 -0
  297. package/.next/static/chunks/26-pr2c9ro222.js +1 -0
  298. package/.next/static/chunks/{18vhba44l1fc9.js → 280t0_e99i276.js} +1 -1
  299. package/.next/static/chunks/28cizcdaabd4h.js +1 -0
  300. package/.next/static/chunks/2a0k6jlq0_v1u.js +2 -0
  301. package/.next/static/chunks/2fzs9fm8yarvq.js +1 -0
  302. package/.next/static/chunks/2h0sd2vumhb15.js +1 -0
  303. package/.next/static/chunks/2hw2f6zmt7fmt.js +1 -0
  304. package/.next/static/chunks/2t4vhi3m8ahya.js +1 -0
  305. package/.next/static/chunks/2tigdtz3dpcy8.js +1 -0
  306. package/.next/static/chunks/3111pj5wnjgos.js +1 -0
  307. package/.next/static/chunks/{07kl352c-lvcz.js → 3agpgkwaa321p.js} +1 -1
  308. package/.next/static/chunks/3cfi_q6d_wtci.js +1 -0
  309. package/.next/static/chunks/3ok9_x74rip3v.js +1 -0
  310. package/.next/static/chunks/3xk7yqgomx7yq.js +1 -0
  311. package/.next/static/chunks/3xpbkl66ssib5.js +38 -0
  312. package/.next/static/media/favicon.37o1pjldwi2uc.ico +0 -0
  313. package/README.md +6 -4
  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 -5
  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/thursday.mjs +3 -0
  324. package/components/ui/shiny-text.tsx +48 -134
  325. package/database/migrations/{20260909060813_optimal_sabretooth → 20260910173049_numerous_spirit}/migration.sql +24 -34
  326. package/database/migrations/{20260909060813_optimal_sabretooth → 20260910173049_numerous_spirit}/snapshot.json +71 -145
  327. package/database/migrations/20260911030320_opposite_jack_power/migration.sql +1 -0
  328. package/database/migrations/{20260909063821_bitter_tenebrous → 20260911030320_opposite_jack_power}/snapshot.json +57 -184
  329. package/features/ai/chatgpt.ts +617 -0
  330. package/features/ai/components/chatgpt-sign-in.tsx +66 -0
  331. package/features/ai/components/model-picker.tsx +17 -1
  332. package/features/ai/components/provider-icon.tsx +1 -0
  333. package/features/ai/load-tools.ts +58 -42
  334. package/features/ai/model.schema.ts +232 -34
  335. package/features/ai/model.ts +169 -24
  336. package/features/ai/prompts/bot.prompt.ts +156 -65
  337. package/features/ai/prompts/memory-edit.prompt.ts +33 -0
  338. package/features/ai/prompts/prompt-helper.ts +45 -26
  339. package/features/ai/prompts/thursday.prompt.ts +40 -17
  340. package/features/ai/tools/bot.tool.ts +35 -52
  341. package/features/ai/tools/connected.ts +17 -4
  342. package/features/ai/tools/memory.tool.ts +133 -72
  343. package/features/ai/tools/search.tool.ts +136 -47
  344. package/features/ai/tools/tool-name.ts +2 -5
  345. package/features/ai/tools/workspace.tool.ts +2 -1
  346. package/features/bot/bot.action.ts +8 -18
  347. package/features/bot/bot.memory.ts +89 -0
  348. package/features/bot/bot.query.ts +37 -57
  349. package/features/bot/bot.run.ts +507 -241
  350. package/features/bot/bot.runner.ts +410 -114
  351. package/features/bot/bot.schema.ts +79 -19
  352. package/features/bot/bot.seed.ts +89 -16
  353. package/features/bot/components/bot-mark.tsx +122 -20
  354. package/features/bot/components/bot-room.tsx +159 -130
  355. package/features/bot/components/bot-setting.tsx +790 -402
  356. package/features/bot/components/bot-tool.tsx +2 -6
  357. package/features/bot/components/mark-palette.tsx +54 -0
  358. package/features/bot/components/path-chips.tsx +1 -1
  359. package/features/bot/components/task-badge.tsx +26 -6
  360. package/features/bot/components/task-reply.tsx +22 -33
  361. package/features/bot/components/task-setting.tsx +20 -17
  362. package/features/bot/task.query.ts +215 -28
  363. package/features/bot/task.store.ts +53 -9
  364. package/features/config/components/config-setting.tsx +265 -34
  365. package/features/config/components/models-badge.tsx +42 -0
  366. package/features/config/config.action.ts +12 -0
  367. package/features/config/config.const.ts +38 -2
  368. package/features/connectors/mcp.manager.ts +10 -2
  369. package/features/intro/components/intro.tsx +47 -46
  370. package/features/memory/components/memory-edit.tsx +338 -0
  371. package/features/memory/components/memory-setting.tsx +75 -77
  372. package/features/memory/memory.action.ts +3 -43
  373. package/features/memory/memory.edit.ts +87 -0
  374. package/features/memory/memory.query.ts +24 -42
  375. package/features/memory/memory.schema.ts +29 -106
  376. package/features/settings/components/settings.tsx +2 -0
  377. package/features/settings/settings.alert.ts +3 -1
  378. package/features/thursday/components/ascii-orb.tsx +106 -90
  379. package/features/thursday/components/boot.tsx +7 -0
  380. package/features/thursday/components/call-log.tsx +219 -92
  381. package/features/thursday/components/face.tsx +6 -4
  382. package/features/thursday/components/tab-state.tsx +97 -0
  383. package/features/thursday/components/thursday-mark.tsx +4 -1
  384. package/features/thursday/components/thursday-setting.tsx +17 -47
  385. package/features/thursday/components/thursday.tsx +208 -95
  386. package/features/thursday/thursday.action.ts +12 -17
  387. package/features/thursday/thursday.query.ts +61 -70
  388. package/features/thursday/thursday.schema.ts +20 -7
  389. package/features/thursday/tool-line.ts +85 -11
  390. package/features/thursday/use-thursday.ts +86 -59
  391. package/features/workspace/components/file-view.tsx +4 -2
  392. package/features/workspace/workspace.ts +110 -26
  393. package/lib/limits.ts +1 -1
  394. package/lib/oauth-page.ts +27 -0
  395. package/lib/realtime/openai.ts +2 -2
  396. package/lib/realtime/realtime.protocol.ts +1 -1
  397. package/lib/realtime/realtime.tap.ts +122 -0
  398. package/lib/sandbox.ts +59 -36
  399. package/package.json +1 -1
  400. package/skills/browser/SKILL.md +55 -34
  401. package/.next/server/app/api/bot/notes/route/app-paths-manifest.json +0 -3
  402. package/.next/server/app/api/bot/notes/route.js +0 -14
  403. package/.next/server/app/api/bot/notes/route_client-reference-manifest.js +0 -3
  404. package/.next/server/app/api/memory/tidy/route/app-paths-manifest.json +0 -3
  405. package/.next/server/app/api/memory/tidy/route.js +0 -22
  406. package/.next/server/app/api/memory/tidy/route.js.nft.json +0 -1
  407. package/.next/server/chunks/0d-b_next_dist_server_app-render_after-task-async-storage_external_0-exn7p.js +0 -3
  408. package/.next/server/chunks/[root-of-the-server]__0-npkh_._.js +0 -3
  409. package/.next/server/chunks/[root-of-the-server]__005var5._.js +0 -3
  410. package/.next/server/chunks/[root-of-the-server]__019dx9f._.js +0 -5
  411. package/.next/server/chunks/[root-of-the-server]__02_2sm-._.js +0 -5
  412. package/.next/server/chunks/[root-of-the-server]__04_8spk._.js +0 -3
  413. package/.next/server/chunks/[root-of-the-server]__05luceg._.js +0 -3
  414. package/.next/server/chunks/[root-of-the-server]__06t77t4._.js +0 -11
  415. package/.next/server/chunks/[root-of-the-server]__0bed6hu._.js +0 -8
  416. package/.next/server/chunks/[root-of-the-server]__0cro2dz._.js +0 -5
  417. package/.next/server/chunks/[root-of-the-server]__0dupqt7._.js +0 -5
  418. package/.next/server/chunks/[root-of-the-server]__0emr6go._.js +0 -3
  419. package/.next/server/chunks/[root-of-the-server]__0le4d-p._.js +0 -3
  420. package/.next/server/chunks/[root-of-the-server]__0m8ywyo._.js +0 -10
  421. package/.next/server/chunks/[root-of-the-server]__0nfuugi._.js +0 -5
  422. package/.next/server/chunks/[root-of-the-server]__0p32jfz._.js +0 -12
  423. package/.next/server/chunks/[root-of-the-server]__0phdgco._.js +0 -8
  424. package/.next/server/chunks/[root-of-the-server]__0wvgrsl._.js +0 -3
  425. package/.next/server/chunks/[root-of-the-server]__10qshki._.js +0 -3
  426. package/.next/server/chunks/[root-of-the-server]__11j52t0._.js +0 -5
  427. package/.next/server/chunks/[root-of-the-server]__1692zrv._.js +0 -3
  428. package/.next/server/chunks/[root-of-the-server]__16thabu._.js +0 -3
  429. package/.next/server/chunks/[root-of-the-server]__173nhwf._.js +0 -8
  430. package/.next/server/chunks/[root-of-the-server]__1_aoyr9._.js +0 -3
  431. package/.next/server/chunks/[root-of-the-server]__1bn73ih._.js +0 -10
  432. package/.next/server/chunks/[root-of-the-server]__1bqhuh9._.js +0 -8
  433. package/.next/server/chunks/[root-of-the-server]__1cqizfq._.js +0 -5
  434. package/.next/server/chunks/[root-of-the-server]__1e-ci13._.js +0 -3
  435. package/.next/server/chunks/[root-of-the-server]__1fboj2j._.js +0 -3
  436. package/.next/server/chunks/[root-of-the-server]__1lr7j9t._.js +0 -5
  437. package/.next/server/chunks/[root-of-the-server]__1oli73c._.js +0 -3
  438. package/.next/server/chunks/[root-of-the-server]__1txedx6._.js +0 -8
  439. package/.next/server/chunks/[root-of-the-server]__1untqv8._.js +0 -5
  440. package/.next/server/chunks/[root-of-the-server]__1zgpz1w._.js +0 -3
  441. package/.next/server/chunks/_00_584r._.js +0 -293
  442. package/.next/server/chunks/_012yhfm._.js +0 -39
  443. package/.next/server/chunks/_06mxlgn._.js +0 -3
  444. package/.next/server/chunks/_07rtlxv._.js +0 -3
  445. package/.next/server/chunks/_0a351g7._.js +0 -6
  446. package/.next/server/chunks/_0kjjmag._.js +0 -3
  447. package/.next/server/chunks/_0nn99o2._.js +0 -3
  448. package/.next/server/chunks/_0zuzmt_._.js +0 -39
  449. package/.next/server/chunks/_106co2o._.js +0 -3
  450. package/.next/server/chunks/_12bbv5i._.js +0 -100
  451. package/.next/server/chunks/_15q1pig._.js +0 -3
  452. package/.next/server/chunks/_19wg5yn._.js +0 -138
  453. package/.next/server/chunks/_1bt95p9._.js +0 -55
  454. package/.next/server/chunks/_1cbk7ms._.js +0 -26
  455. package/.next/server/chunks/_1drv2et._.js +0 -40
  456. package/.next/server/chunks/_1ic3bew._.js +0 -5
  457. package/.next/server/chunks/_1mxn_lb._.js +0 -3
  458. package/.next/server/chunks/_1rysr-r._.js +0 -10
  459. package/.next/server/chunks/_1u3rwbr._.js +0 -3
  460. package/.next/server/chunks/_1x7p319._.js +0 -6
  461. package/.next/server/chunks/_next-internal_server_app_api_bot_notes_route_actions_0qcsyu7.js +0 -3
  462. package/.next/server/chunks/_next-internal_server_app_api_memory_tidy_route_actions_0_cfuom.js +0 -3
  463. package/.next/server/chunks/features_bot_task_query_ts_11xuzl3._.js +0 -3
  464. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0gzvgfv._.js +0 -3
  465. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0vorg6w._.js +0 -3
  466. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1tpvamf._.js +0 -3
  467. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1vmaq9f._.js +0 -3
  468. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1y9-wcr._.js +0 -3
  469. package/.next/server/chunks/ssr/[externals]_node_crypto_1kn79-7._.js +0 -3
  470. package/.next/server/chunks/ssr/[root-of-the-server]__0iuoa-r._.js +0 -3
  471. package/.next/server/chunks/ssr/[root-of-the-server]__0un-erv._.js +0 -4
  472. package/.next/server/chunks/ssr/[root-of-the-server]__1-mnhyd._.js +0 -92
  473. package/.next/server/chunks/ssr/[root-of-the-server]__1bww500._.js +0 -3
  474. package/.next/server/chunks/ssr/[root-of-the-server]__1vcdast._.js +0 -3
  475. package/.next/server/chunks/ssr/[root-of-the-server]__1xwnu-h._.js +0 -3
  476. package/.next/server/chunks/ssr/_0-mc7ro._.js +0 -3
  477. package/.next/server/chunks/ssr/_01p5r6-._.js +0 -3
  478. package/.next/server/chunks/ssr/_03webdr._.js +0 -3
  479. package/.next/server/chunks/ssr/_09-0k3z._.js +0 -3
  480. package/.next/server/chunks/ssr/_0f_b_9s._.js +0 -3
  481. package/.next/server/chunks/ssr/_0fafgvl._.js +0 -3
  482. package/.next/server/chunks/ssr/_0sf1isi._.js +0 -3
  483. package/.next/server/chunks/ssr/_0su6_08._.js +0 -3
  484. package/.next/server/chunks/ssr/_0ti51xc._.js +0 -3
  485. package/.next/server/chunks/ssr/_0w5bgak._.js +0 -3
  486. package/.next/server/chunks/ssr/_0y84qo6._.js +0 -3
  487. package/.next/server/chunks/ssr/_1ciyoo3._.js +0 -3
  488. package/.next/server/chunks/ssr/_1e-dgz0._.js +0 -4
  489. package/.next/server/chunks/ssr/_1fq7zgb._.js +0 -3
  490. package/.next/server/chunks/ssr/_1g6l4uj._.js +0 -3
  491. package/.next/server/chunks/ssr/_1ruzehw._.js +0 -3
  492. package/.next/server/chunks/ssr/features_bot_components_bot-setting_tsx_01ajft6._.js +0 -4
  493. package/.next/server/chunks/ssr/features_config_components_14jqgy4._.js +0 -3
  494. package/.next/server/chunks/ssr/features_memory_components_memory-setting_tsx_0oa43sw._.js +0 -4
  495. package/.next/server/chunks/ssr/node_modules_zod_v4_classic_external_15fmmz3.js +0 -55
  496. package/.next/static/chunks/05b6nx_o3_f_n.js +0 -1
  497. package/.next/static/chunks/0dmns-gi0raa4.js +0 -1
  498. package/.next/static/chunks/0f9sq-7q_yxyl.js +0 -1
  499. package/.next/static/chunks/0oc4_xoia77dg.css +0 -1
  500. package/.next/static/chunks/0pheo8m3a-rzi.js +0 -1
  501. package/.next/static/chunks/19i8h2t-5evjx.js +0 -1
  502. package/.next/static/chunks/1c5fcj473025q.js +0 -1
  503. package/.next/static/chunks/1pi_hbmjw-f-z.js +0 -1
  504. package/.next/static/chunks/1twt6k09vg4np.js +0 -1
  505. package/.next/static/chunks/1ytnip8wdng93.js +0 -1
  506. package/.next/static/chunks/28gotuisldmom.js +0 -1
  507. package/.next/static/chunks/2998p0y7k1c8z.js +0 -3
  508. package/.next/static/chunks/29gyb3nubj51j.js +0 -53
  509. package/.next/static/chunks/2l233xfycjpd8.js +0 -1
  510. package/.next/static/chunks/2p5n7pa3c40t-.js +0 -2
  511. package/.next/static/chunks/2ru1q132af7h7.js +0 -1
  512. package/.next/static/chunks/2t8wqycwg3y04.js +0 -2
  513. package/.next/static/chunks/2uxum7qbyeyxd.js +0 -1
  514. package/.next/static/chunks/32z_ypgtchw48.js +0 -1
  515. package/.next/static/chunks/33pyjb3xd1iez.js +0 -1
  516. package/.next/static/chunks/3omud5xunrk1f.js +0 -1
  517. package/.next/static/chunks/42dnrkbph9e-1.js +0 -1
  518. package/.next/static/media/favicon.2vob68tjqpejf.ico +0 -0
  519. package/database/migrations/20260909063821_bitter_tenebrous/migration.sql +0 -1
  520. package/features/ai/prompts/memory-tidy.prompt.ts +0 -129
  521. package/features/ai/tools/tidy.tool.ts +0 -22
  522. package/features/bot/bot.notes.ts +0 -120
  523. package/features/memory/components/memory-tidy.tsx +0 -395
  524. package/features/memory/memory.tidy.ts +0 -332
  525. package/features/memory/tidy.query.ts +0 -135
  526. package/features/thursday/use-call-title.ts +0 -31
  527. /package/.next/server/app/api/bot/{notes → memory/files}/route/build-manifest.json +0 -0
  528. /package/.next/server/app/api/bot/{notes → memory/files}/route/server-reference-manifest.json +0 -0
  529. /package/.next/server/app/api/bot/{notes → memory/files}/route.js.map +0 -0
  530. /package/.next/server/app/api/{memory/tidy → bot/memory}/route/build-manifest.json +0 -0
  531. /package/.next/server/app/api/{memory/tidy → bot/memory}/route/server-reference-manifest.json +0 -0
  532. /package/.next/server/app/api/{memory/tidy → bot/memory}/route.js.map +0 -0
  533. /package/.next/static/{YR4NWcDDuzwLbTTU7U7Vr → x1cCqY0kWpR_VcYx_lWO5}/_buildManifest.js +0 -0
  534. /package/.next/static/{YR4NWcDDuzwLbTTU7U7Vr → x1cCqY0kWpR_VcYx_lWO5}/_clientMiddlewareManifest.js +0 -0
  535. /package/.next/static/{YR4NWcDDuzwLbTTU7U7Vr → x1cCqY0kWpR_VcYx_lWO5}/_ssgManifest.js +0 -0
@@ -5,7 +5,10 @@ import { useLayoutEffect, useMemo, useRef } from "react";
5
5
  import { queryKey } from "@/app/api/query-key";
6
6
  import { Button } from "@/components/ui/button";
7
7
  import { notify } from "@/components/ui/notify";
8
+ import { ShinyText } from "@/components/ui/shiny-text";
8
9
  import { Skeleton } from "@/components/ui/skeleton";
10
+ import { CALL_HISTORY_PAGE } from "@/config";
11
+ import type { TaskStatus } from "@/features/bot/bot.schema";
9
12
  import { toolIcon } from "@/features/bot/components/bot-tool";
10
13
  import {
11
14
  SettingDialogContent,
@@ -17,14 +20,10 @@ import {
17
20
  import { toDate, whenOf } from "@/lib/date-like";
18
21
  import { useServerAction } from "@/lib/protocol/use-server-action";
19
22
  import { useServerPages } from "@/lib/protocol/use-server-pages";
20
- import { cn } from "@/lib/utils";
21
- import { deleteCallAction } from "../thursday.action";
22
- import {
23
- CALL_HISTORY_PAGE,
24
- type CallRecord,
25
- type CallTurn,
26
- } from "../thursday.schema";
27
- import { toolLine } from "../tool-line";
23
+ import { cn, plainText, WAITING_INK } from "@/lib/utils";
24
+ import { deleteCallAction, deleteEndedCallsAction } from "../thursday.action";
25
+ import { type CallRecord, type CallTurn } from "../thursday.schema";
26
+ import { delegatedLabel, toolLine } from "../tool-line";
28
27
  import { ThursdayMark } from "./thursday-mark";
29
28
 
30
29
  /** The Settings › Thursday row that opens the call history dialog. */
@@ -65,6 +64,22 @@ export function CallHistoryRow() {
65
64
  );
66
65
  }
67
66
 
67
+ type CallJob = CallRecord["jobs"][number];
68
+
69
+ /** How a job reads under the line that opened it. Only waiting and failed carry colour. */
70
+ const JOB_WORD: Record<TaskStatus, string> = {
71
+ running: "working",
72
+ waiting: "waiting on you",
73
+ done: "done",
74
+ failed: "failed",
75
+ };
76
+ const JOB_LOOK: Record<TaskStatus, string> = {
77
+ running: "text-muted-foreground",
78
+ waiting: WAITING_INK,
79
+ done: "text-muted-foreground",
80
+ failed: "text-destructive",
81
+ };
82
+
68
83
  /** The box the log fills, kept while it loads so the dialog does not resize. */
69
84
  const LOG_BOX = "h-[min(34rem,58vh)] min-h-64 px-1";
70
85
 
@@ -98,6 +113,23 @@ function CallLog() {
98
113
 
99
114
  const calls = useMemo(() => [...items].reverse(), [items]);
100
115
 
116
+ const [dropAll, droppingAll] = useServerAction(deleteEndedCallsAction, {
117
+ okMessage: (count) =>
118
+ count === 1 ? "1 call deleted" : `${count} calls deleted`,
119
+ onOk: refresh,
120
+ });
121
+
122
+ const confirmDropAll = async () => {
123
+ const confirmed = await notify.confirm({
124
+ title: "Delete every call?",
125
+ description:
126
+ "Every turn of every call goes — and she stops reading any of it back into the next call. A call still on the line stays.",
127
+ okText: "Delete all",
128
+ destructive: true,
129
+ });
130
+ if (confirmed) dropAll();
131
+ };
132
+
101
133
  const scroller = useRef<HTMLDivElement>(null);
102
134
  /** Has the first page been dropped at its bottom yet. */
103
135
  const opened = useRef(false);
@@ -133,25 +165,43 @@ function CallLog() {
133
165
  yours, in the order it was said.
134
166
  </p>
135
167
  ) : (
136
- <div
137
- ref={scroller}
138
- onScroll={(event) => {
139
- const box = event.currentTarget;
140
- held.current = box.scrollHeight - box.scrollTop;
141
- }}
142
- className={cn(LOG_BOX, "overflow-y-auto overscroll-contain pb-6")}
143
- >
144
- <SettingMore
145
- hasMore={hasMore}
146
- loading={isLoadingMore}
147
- sentinelRef={sentinelRef}
148
- count={1}
149
- ghost={<CallGhost />}
150
- />
151
- {calls.map((call) => (
152
- <Thread key={call.id} call={call} onDropped={refresh} />
153
- ))}
154
- </div>
168
+ <>
169
+ <div
170
+ ref={scroller}
171
+ onScroll={(event) => {
172
+ const box = event.currentTarget;
173
+ held.current = box.scrollHeight - box.scrollTop;
174
+ }}
175
+ className={cn(LOG_BOX, "overflow-y-auto overscroll-contain pb-6")}
176
+ >
177
+ <SettingMore
178
+ hasMore={hasMore}
179
+ loading={isLoadingMore}
180
+ sentinelRef={sentinelRef}
181
+ count={1}
182
+ ghost={<CallGhost />}
183
+ />
184
+ {calls.map((call, index) => (
185
+ <Thread
186
+ key={call.id}
187
+ call={call}
188
+ first={index === 0}
189
+ onDropped={refresh}
190
+ />
191
+ ))}
192
+ </div>
193
+ <div className="flex justify-end">
194
+ <Button
195
+ variant="ghost"
196
+ loading={droppingAll}
197
+ onClick={confirmDropAll}
198
+ className="text-muted-foreground hover:text-destructive"
199
+ >
200
+ <Trash2 />
201
+ Delete all
202
+ </Button>
203
+ </div>
204
+ </>
155
205
  )}
156
206
  </>
157
207
  );
@@ -160,27 +210,35 @@ function CallLog() {
160
210
  /** Placeholder for an older call while its page loads; sits above the oldest call. */
161
211
  function CallGhost() {
162
212
  return (
163
- <div className="space-y-3 pb-3">
164
- <div className="flex items-center gap-3 py-5">
165
- <span className="h-px flex-1 bg-border/60" />
166
- <Skeleton className="h-6 w-36 rounded-full" />
167
- <span className="h-px flex-1 bg-border/60" />
168
- <span className="size-7 shrink-0" />
213
+ <div className="pb-3">
214
+ <div className="flex h-7 items-center gap-2.5">
215
+ <Skeleton className="h-3 w-24" />
216
+ <Skeleton className="h-3 w-10" />
169
217
  </div>
218
+ <div className="mt-2 mb-[18px] h-px bg-border/60" />
170
219
  <div className="flex justify-end">
171
- <Skeleton className="h-9 w-3/5 rounded-2xl rounded-br-md" />
220
+ <Skeleton className="h-9 w-3/5 rounded-2xl rounded-br-sm" />
221
+ </div>
222
+ <div className="mt-3 flex items-start gap-2">
223
+ <Skeleton className="mt-0.5 size-[18px] shrink-0 rounded-full" />
224
+ <Skeleton className="mt-1 h-3.5 w-2/3" />
172
225
  </div>
173
- <Skeleton className="h-5 w-2/3" />
174
226
  </div>
175
227
  );
176
228
  }
177
229
 
178
- /** One call: a header with its time and duration, then its turns. */
230
+ /** Whose run a turn is in. Her words and her tools are one run: both are her acting. */
231
+ const sideOf = (turn: CallTurn) => (turn.role === "user" ? "user" : "her");
232
+
233
+ /** One call: a datestamp over a hairline, then its turns. */
179
234
  function Thread({
180
235
  call,
236
+ first,
181
237
  onDropped,
182
238
  }: {
183
239
  call: CallRecord;
240
+ /** The topmost call loaded; nothing above it to be set apart from. */
241
+ first: boolean;
184
242
  /** Re-reads every page after a delete. */
185
243
  onDropped: () => void;
186
244
  }) {
@@ -208,21 +266,23 @@ function Thread({
208
266
 
209
267
  return (
210
268
  <>
211
- {/* The delete button keeps its slot so the date pill does not shift on hover. */}
212
- <div className="group flex items-center gap-3 py-5">
213
- <span className="h-px flex-1 bg-border/60" />
269
+ <div
270
+ className={cn(
271
+ "group flex items-center gap-2.5",
272
+ first ? "mt-1" : "mt-11",
273
+ )}
274
+ >
214
275
  <span
215
276
  title={`${call.provider} · ${call.model}`}
216
- className="flex shrink-0 items-center gap-2 rounded-full bg-muted/60 py-1 pr-3 pl-2.5 ring-1 ring-border/50"
277
+ className="font-mono text-[10px] tracking-[0.14em] uppercase"
217
278
  >
218
- <Phone className="size-3 text-muted-foreground" />
219
- <span className="font-mono text-[11px]">{whenOf(started)}</span>
220
- <span className="font-mono text-[10px] text-muted-foreground">
221
- {ran}
222
- </span>
279
+ {whenOf(started)}
280
+ </span>
281
+ <span className="font-mono text-[10px] text-muted-foreground">
282
+ {ran}
223
283
  </span>
224
- <span className="h-px flex-1 bg-border/60" />
225
- <span className="flex size-7 shrink-0 items-center justify-center">
284
+ {/* The slot is held so the row keeps its height while the button is hidden. */}
285
+ <span className="ml-auto flex size-7 shrink-0 items-center justify-center">
226
286
  {call.endedAt && (
227
287
  <Button
228
288
  size="icon-sm"
@@ -237,6 +297,7 @@ function Thread({
237
297
  )}
238
298
  </span>
239
299
  </div>
300
+ <div className="mt-2 mb-[18px] h-px bg-border/60" />
240
301
 
241
302
  {fold(call.turns).map(({ turn, repeats }, index, folded) => {
242
303
  const before = folded[index - 1]?.turn;
@@ -245,9 +306,10 @@ function Thread({
245
306
  <Turn
246
307
  key={turn.id}
247
308
  turn={turn}
309
+ job={jobOf(call, turn)}
248
310
  repeats={repeats}
249
- opensRun={before?.role !== turn.role}
250
- closesRun={after?.role !== turn.role}
311
+ opensRun={!before || sideOf(before) !== sideOf(turn)}
312
+ closesRun={!after || sideOf(after) !== sideOf(turn)}
251
313
  />
252
314
  );
253
315
  })}
@@ -255,6 +317,12 @@ function Thread({
255
317
  );
256
318
  }
257
319
 
320
+ /** The job a `delegate` turn opened, found by label the way her prompt finds it. */
321
+ function jobOf(call: CallRecord, turn: CallTurn): CallJob | undefined {
322
+ const label = delegatedLabel(turn.tool, turn.text);
323
+ return label ? call.jobs.find((job) => job.label === label) : undefined;
324
+ }
325
+
258
326
  /** Collapses consecutive identical tool turns (same name and arguments) into one with a count. */
259
327
  function fold(turns: CallRecord["turns"]) {
260
328
  const out: { turn: CallRecord["turns"][number]; repeats: number }[] = [];
@@ -288,75 +356,134 @@ function spanOf(from: Date, to: Date): string {
288
356
  return `${Math.floor(minutes / 60)}h ${String(minutes % 60).padStart(2, "0")}m`;
289
357
  }
290
358
 
291
- /** One spoken turn. Plain text, never markdown: asterisks were said aloud. */
359
+ /**
360
+ * One spoken turn. Plain text, never markdown: asterisks were said aloud.
361
+ * Only the user speaks in bubbles; her words sit bare in her column, so her
362
+ * text and her tool lines start on one edge.
363
+ */
292
364
  function Turn({
293
365
  turn,
366
+ job,
294
367
  opensRun,
295
368
  closesRun,
296
369
  repeats = 1,
297
370
  }: {
298
371
  turn: CallTurn;
372
+ /** What became of the job a `delegate` turn opened (ToolTurn only). */
373
+ job?: CallJob;
299
374
  opensRun: boolean;
300
375
  closesRun: boolean;
301
376
  /** Consecutive repeats of the same tool turn (ToolTurn only). */
302
377
  repeats?: number;
303
378
  }) {
304
- if (turn.role === "tool") return <ToolTurn turn={turn} repeats={repeats} />;
379
+ if (turn.role === "tool")
380
+ return (
381
+ <ToolTurn turn={turn} job={job} repeats={repeats} opensRun={opensRun} />
382
+ );
305
383
 
306
- const mine = turn.role === "user";
384
+ if (turn.role === "user")
385
+ return (
386
+ <div className={cn("flex justify-end", opensRun ? "mt-3" : "mt-1")}>
387
+ <p
388
+ className={cn(
389
+ "max-w-[min(34rem,78%)] rounded-2xl bg-muted px-3.5 py-2 text-[13.5px] leading-relaxed break-keep whitespace-pre-wrap",
390
+ closesRun && "rounded-br-sm",
391
+ )}
392
+ >
393
+ {turn.text}
394
+ </p>
395
+ </div>
396
+ );
307
397
 
308
398
  return (
309
- <div
310
- className={cn(
311
- "flex items-end gap-2",
312
- opensRun ? "mt-3" : "mt-1",
313
- mine ? "justify-end" : "justify-start",
314
- )}
315
- >
316
- {!mine && (
317
- // The slot is held even without the mark so a run stays in one column.
318
- <span className="mb-0.5 grid size-[18px] shrink-0 place-items-center">
319
- {closesRun && <ThursdayMark size={18} />}
320
- </span>
321
- )}
322
-
323
- <p
324
- className={cn(
325
- "max-w-[min(34rem,78%)] px-3.5 py-2 text-[13.5px] leading-relaxed break-keep whitespace-pre-wrap",
326
- mine
327
- ? "rounded-2xl bg-muted"
328
- : "rounded-2xl bg-card ring-1 ring-border/70",
329
- closesRun && (mine ? "rounded-br-sm" : "rounded-bl-sm"),
330
- )}
331
- >
399
+ <div className={cn("flex items-start gap-2", opensRun ? "mt-3" : "mt-1")}>
400
+ {/* mt-0.5 centres the 18px face on the first 22px line */}
401
+ <FaceSlot face={opensRun} className="mt-0.5" />
402
+ <p className="max-w-[min(34rem,78%)] text-[13.5px] leading-relaxed break-keep whitespace-pre-wrap">
332
403
  {turn.text}
333
404
  </p>
334
405
  </div>
335
406
  );
336
407
  }
337
408
 
338
- /** A tool turn: centered line with the readable sentence, then the tool name. */
339
- function ToolTurn({ turn, repeats }: { turn: CallTurn; repeats: number }) {
409
+ /**
410
+ * Her column. Her face marks where her run opens — the first thing she does
411
+ * after the user speaks, a sentence or a tool — and the slot is held empty for
412
+ * the rest of the run so it stays on one edge.
413
+ */
414
+ function FaceSlot({ face, className }: { face: boolean; className?: string }) {
415
+ return (
416
+ <span
417
+ className={cn("grid size-[18px] shrink-0 place-items-center", className)}
418
+ >
419
+ {face && <ThursdayMark size={18} />}
420
+ </span>
421
+ );
422
+ }
423
+
424
+ /** A tool turn: her column, then the glyph, the readable sentence and the tool name. */
425
+ function ToolTurn({
426
+ turn,
427
+ job,
428
+ repeats,
429
+ opensRun,
430
+ }: {
431
+ turn: CallTurn;
432
+ job?: CallJob;
433
+ repeats: number;
434
+ opensRun: boolean;
435
+ }) {
340
436
  const name = turn.tool ?? "";
341
437
  const Icon = toolIcon(name);
342
438
  const said = toolLine(name, turn.text);
343
439
 
344
440
  return (
345
- <div className="mt-3 mb-1 flex justify-center">
346
- <span className="flex max-w-full items-center gap-2 rounded-full bg-muted/40 px-2.5 py-1 text-muted-foreground">
347
- <Icon className="size-3 shrink-0" />
348
- {said && (
349
- <span className="truncate text-[11px] break-keep">{said}</span>
350
- )}
351
- <span className="shrink-0 font-mono text-[10px] text-muted-foreground/60">
352
- {name}
353
- </span>
354
- {repeats > 1 && (
355
- <span className="shrink-0 font-mono text-[10px] text-muted-foreground/70">
356
- ×{repeats}
441
+ <>
442
+ <div
443
+ className={cn("flex items-center gap-2", opensRun ? "mt-3" : "mt-1.5")}
444
+ >
445
+ <FaceSlot face={opensRun} />
446
+ <span className="flex min-w-0 items-center gap-1.5 text-muted-foreground">
447
+ <Icon className="size-3 shrink-0" />
448
+ {said && (
449
+ <span className="truncate text-[11px] break-keep">{said}</span>
450
+ )}
451
+ <span className="shrink-0 font-mono text-[10px] text-muted-foreground/60">
452
+ {name}
357
453
  </span>
358
- )}
359
- </span>
360
- </div>
454
+ {repeats > 1 && (
455
+ <span className="shrink-0 font-mono text-[10px] text-muted-foreground/70">
456
+ ×{repeats}
457
+ </span>
458
+ )}
459
+ </span>
460
+ </div>
461
+ {/* Under the line that opened it, in her column (18px face + 8px gap): what
462
+ became of the job, as it stands now. */}
463
+ {job && (
464
+ <p className="mt-0.5 ml-[26px] flex min-w-0 items-baseline gap-1.5 text-[11px]">
465
+ {job.status === "running" ? (
466
+ <ShinyText
467
+ text={JOB_WORD.running}
468
+ className="shrink-0 font-mono text-[10px]"
469
+ />
470
+ ) : (
471
+ <span
472
+ className={cn(
473
+ "shrink-0 font-mono text-[10px]",
474
+ JOB_LOOK[job.status],
475
+ )}
476
+ >
477
+ {JOB_WORD[job.status]}
478
+ </span>
479
+ )}
480
+ {job.outcome && job.status !== "running" && (
481
+ <span className="truncate text-muted-foreground">
482
+ {plainText(job.outcome)}
483
+ </span>
484
+ )}
485
+ </p>
486
+ )}
487
+ </>
361
488
  );
362
489
  }
@@ -52,12 +52,14 @@ const MARK_STATE: Record<CallStatus, MarkState> = {
52
52
  */
53
53
  const MARK_VOICE: Partial<MarkOptions> = {
54
54
  /**
55
- * Only the outline moves. `pulse` and `stretch` move the whole mark, which
56
- * at face size reads as a wobbling object rather than speech.
55
+ * The outline carries the voice. `pulse` and `stretch` move the whole mark,
56
+ * which at face size reads as a wobbling object rather than speech; `punch`
57
+ * with no pulse only squashes it a touch on each syllable.
57
58
  */
58
- ripple: 14,
59
+ ripple: 18,
60
+ bandEase: 0.03,
59
61
  pulse: 0,
60
- punch: 0,
62
+ punch: 0.05,
61
63
  stretch: 0,
62
64
  };
63
65
 
@@ -0,0 +1,97 @@
1
+ "use client";
2
+
3
+ import { useEffect } from "react";
4
+ import { APP_NAME } from "@/config";
5
+ import { markAtRest } from "@/features/bot/components/bot-mark";
6
+ import { useTaskReport } from "@/features/bot/components/task-badge";
7
+ import {
8
+ type SectionAlert,
9
+ useSectionAlerts,
10
+ worstAlert,
11
+ } from "@/features/settings/settings.alert";
12
+ import { THURSDAY_SEED } from "./thursday-mark";
13
+
14
+ // A live call's title is a waveform. The frame is not React state: the interval
15
+ // writes document.title directly. Hidden tabs throttle timers to 1s, but audible
16
+ // pages escape the stronger throttle.
17
+ const SPIN = ["▁▄▇▄", "▂▆▆▂", "▄▇▄▁", "▆▆▂▂", "▇▄▁▄", "▆▂▂▆", "▄▁▄▇", "▂▂▆▆"];
18
+
19
+ /** Frame interval in ms. */
20
+ const SPIN_MS = 100;
21
+
22
+ /**
23
+ * The dot, in the icon's view-box units: bottom right, where a face wears it,
24
+ * with a ring cut out of the mark so the two stay apart at 16px.
25
+ */
26
+ const DOT = { cx: 200, cy: 200, r: 46, ring: 20 };
27
+
28
+ /**
29
+ * The icon sits on the browser's own light or dark bar, not on the app's theme,
30
+ * so its colours follow the SVG's media query. The hex values of the corner
31
+ * dot's tokens: amber-600 / amber-400 and destructive.
32
+ */
33
+ const ICON_STYLE =
34
+ ".ink{fill:#0a0a0a}.amber{fill:#e17100}.red{fill:#e7000b}" +
35
+ "@media (prefers-color-scheme:dark){.ink{fill:#fafafa}.amber{fill:#ffb900}.red{fill:#ff6467}}";
36
+
37
+ /** Thursday's mark at rest, wearing the dot for `alert` when there is one. */
38
+ export function tabIconSvg(alert: SectionAlert): string {
39
+ const { head, eyes } = markAtRest(THURSDAY_SEED);
40
+ const cut = alert
41
+ ? `<circle cx="${DOT.cx}" cy="${DOT.cy}" r="${DOT.r + DOT.ring}"/>`
42
+ : "";
43
+ const dot = alert
44
+ ? `<circle class="${alert}" cx="${DOT.cx}" cy="${DOT.cy}" r="${DOT.r}"/>`
45
+ : "";
46
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="-6 -6 252 252"><style>${ICON_STYLE}</style><mask id="m" maskUnits="userSpaceOnUse"><path d="${head}" fill="#fff"/><path d="${eyes[0]}"/><path d="${eyes[1]}"/>${cut}</mask><path class="ink" d="${head}" mask="url(#m)"/>${dot}</svg>`;
47
+ }
48
+
49
+ /**
50
+ * The tab, for when the app is not the window in front. The title leads with
51
+ * what is owed — the Tasks badge's count — and a live call keeps its waveform at
52
+ * the end, so neither takes the other's place. The icon wears the settings
53
+ * corner's dot: amber waits on the user, red is broken, and a section with
54
+ * nothing to count still gets the dot.
55
+ *
56
+ * Draws nothing. A component rather than a hook in the call screen, so a report
57
+ * changing re-renders only this.
58
+ */
59
+ export function TabState({ live }: { live: boolean }) {
60
+ const { owed } = useTaskReport();
61
+ const alerts = useSectionAlerts();
62
+ const alert = worstAlert(Object.values(alerts).map((each) => each ?? null));
63
+
64
+ useEffect(() => {
65
+ const head = owed > 0 ? `(${owed}) ${APP_NAME}` : APP_NAME;
66
+ if (!live) {
67
+ document.title = head;
68
+ return;
69
+ }
70
+ let at = 0;
71
+ document.title = `${head} ${SPIN[at]}`;
72
+ const tick = setInterval(() => {
73
+ at = (at + 1) % SPIN.length;
74
+ document.title = `${head} ${SPIN[at]}`;
75
+ }, SPIN_MS);
76
+ return () => clearInterval(tick);
77
+ }, [live, owed]);
78
+
79
+ useEffect(() => {
80
+ // A link of its own after the layout's, changed in place: browsers redraw
81
+ // the tab when an icon link's href changes, and React does not manage it.
82
+ let link = document.head.querySelector<HTMLLinkElement>(
83
+ "link[data-tab-icon]",
84
+ );
85
+ if (!link) {
86
+ link = document.createElement("link");
87
+ link.rel = "icon";
88
+ link.type = "image/svg+xml";
89
+ link.setAttribute("sizes", "any");
90
+ link.dataset.tabIcon = "";
91
+ document.head.append(link);
92
+ }
93
+ link.href = `data:image/svg+xml,${encodeURIComponent(tabIconSvg(alert))}`;
94
+ }, [alert]);
95
+
96
+ return null;
97
+ }
@@ -3,6 +3,9 @@
3
3
  import { BotMark } from "@/features/bot/components/bot-mark";
4
4
  import { useThursdayFace } from "@/features/thursday/face.store";
5
5
 
6
+ /** The seed her mark is drawn from, wherever it is drawn (the tab's icon too). */
7
+ export const THURSDAY_SEED = "thursday";
8
+
6
9
  /** Thursday's mark at any size. Always the mark, never the orb, whatever face is set. */
7
10
  export function ThursdayMark({
8
11
  size = 16,
@@ -16,7 +19,7 @@ export function ThursdayMark({
16
19
  return (
17
20
  <BotMark
18
21
  size={size}
19
- seed="thursday"
22
+ seed={THURSDAY_SEED}
20
23
  color={face.color}
21
24
  shape={face.shape}
22
25
  outline={face.outline}