thursday-agent 0.5.0 → 0.7.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 (667) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +3 -2
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/required-server-files.json +8 -1
  6. package/.next/routes-manifest.json +18 -6
  7. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/server/app/_global-error.html +1 -1
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  14. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/server/app/_not-found.html +1 -1
  16. package/.next/server/app/_not-found.rsc +13 -13
  17. package/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +12 -12
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  20. package/.next/server/app/api/artifact/route.js +10 -6
  21. package/.next/server/app/api/artifact/route.js.nft.json +1 -1
  22. package/.next/server/app/api/bot/memory/files/route.js +5 -4
  23. package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
  24. package/.next/server/app/api/bot/memory/route.js +8 -8
  25. package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
  26. package/.next/server/app/api/bot/route.js +8 -8
  27. package/.next/server/app/api/bot/route.js.nft.json +1 -1
  28. package/.next/server/app/api/bot/thread/[id]/route/app-paths-manifest.json +3 -0
  29. package/.next/server/app/api/bot/thread/[id]/route.js +15 -0
  30. package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -0
  31. package/.next/server/app/api/bot/thread/[id]/route_client-reference-manifest.js +3 -0
  32. package/.next/server/app/api/bot/thread/route/app-paths-manifest.json +3 -0
  33. package/.next/server/app/api/bot/thread/route.js +15 -0
  34. package/.next/server/app/api/bot/thread/route.js.nft.json +1 -0
  35. package/.next/server/app/api/bot/thread/route_client-reference-manifest.js +3 -0
  36. package/.next/server/app/api/config/route.js +7 -7
  37. package/.next/server/app/api/config/route.js.nft.json +1 -1
  38. package/.next/server/app/api/events/route.js +3 -3
  39. package/.next/server/app/api/events/route.js.nft.json +1 -1
  40. package/.next/server/app/api/file/[...path]/route.js +4 -4
  41. package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
  42. package/.next/server/app/api/llm-model/catalog/route.js +8 -8
  43. package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
  44. package/.next/server/app/api/llm-model/credits/route.js +8 -8
  45. package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -1
  46. package/.next/server/app/api/llm-model/route.js +8 -8
  47. package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
  48. package/.next/server/app/api/llm-model/subscription/route.js +8 -8
  49. package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -1
  50. package/.next/server/app/api/mcp/[name]/route.js +6 -6
  51. package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
  52. package/.next/server/app/api/mcp/oauth/callback/route.js +4 -4
  53. package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
  54. package/.next/server/app/api/mcp/route.js +6 -6
  55. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  56. package/.next/server/app/api/mcp/tools/route.js +6 -6
  57. package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
  58. package/.next/server/app/api/memory/edit/route.js +15 -15
  59. package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
  60. package/.next/server/app/api/memory/route.js +7 -6
  61. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  62. package/.next/server/app/api/skills/[source]/[name]/route.js +6 -6
  63. package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/skills/route.js +6 -6
  65. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  66. package/.next/server/app/api/thursday/call/route.js +10 -11
  67. package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
  68. package/.next/server/app/api/thursday/skills/route.js +9 -10
  69. package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
  70. package/.next/server/app/api/thursday/tool-call/route.js +15 -15
  71. package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
  72. package/.next/server/app/api/workspace/missing/route/app-paths-manifest.json +3 -0
  73. package/.next/server/app/api/workspace/missing/route/build-manifest.json +12 -0
  74. package/.next/server/app/api/workspace/missing/route/server-reference-manifest.json +4 -0
  75. package/.next/server/app/api/workspace/missing/route.js +12 -0
  76. package/.next/server/app/api/workspace/missing/route.js.map +5 -0
  77. package/.next/server/app/api/workspace/missing/route.js.nft.json +1 -0
  78. package/.next/server/app/api/workspace/missing/route_client-reference-manifest.js +3 -0
  79. package/.next/server/app/api/workspace/route.js +5 -5
  80. package/.next/server/app/api/workspace/route.js.nft.json +1 -1
  81. package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +1 -1
  82. package/.next/server/app/artifact/[...path]/page.js +4 -3
  83. package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
  84. package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
  85. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  86. package/.next/server/app/page/server-reference-manifest.json +67 -45
  87. package/.next/server/app/page.js +11 -9
  88. package/.next/server/app/page.js.nft.json +1 -1
  89. package/.next/server/app/page_client-reference-manifest.js +1 -1
  90. package/.next/server/app-paths-manifest.json +3 -2
  91. package/.next/server/chunks/[root-of-the-server]__0-06t3f._.js +8 -0
  92. package/.next/server/chunks/[root-of-the-server]__02846fb._.js +8 -0
  93. package/.next/server/chunks/[root-of-the-server]__05luceg._.js +3 -0
  94. package/.next/server/chunks/[root-of-the-server]__06--3q3._.js +8 -0
  95. package/.next/server/chunks/[root-of-the-server]__06l05n_._.js +3 -0
  96. package/.next/server/chunks/[root-of-the-server]__07bnah_._.js +3 -0
  97. package/.next/server/chunks/[root-of-the-server]__08eae20._.js +8 -0
  98. package/.next/server/chunks/[root-of-the-server]__0_ue8oe._.js +3 -0
  99. package/.next/server/chunks/[root-of-the-server]__0btqrct._.js +3 -0
  100. package/.next/server/chunks/[root-of-the-server]__0c9fgca._.js +5 -0
  101. package/.next/server/chunks/[root-of-the-server]__0h_x6q6._.js +5 -0
  102. package/.next/server/chunks/{[root-of-the-server]__0pa2n68._.js → [root-of-the-server]__0kxrvxf._.js} +2 -2
  103. package/.next/server/chunks/{[root-of-the-server]__0q0vvt2._.js → [root-of-the-server]__0ov3iir._.js} +2 -2
  104. package/.next/server/chunks/[root-of-the-server]__0qwtlmx._.js +8 -0
  105. package/.next/server/chunks/[root-of-the-server]__0sm5xvm._.js +3 -0
  106. package/.next/server/chunks/[root-of-the-server]__0zp35ul._.js +5 -0
  107. package/.next/server/chunks/[root-of-the-server]__144u9d_._.js +3 -0
  108. package/.next/server/chunks/[root-of-the-server]__18-2tsq._.js +5 -0
  109. package/.next/server/chunks/[root-of-the-server]__1e-ci13._.js +3 -0
  110. package/.next/server/chunks/[root-of-the-server]__1e2365e._.js +8 -0
  111. package/.next/server/chunks/[root-of-the-server]__1fix932._.js +8 -0
  112. package/.next/server/chunks/{[root-of-the-server]__0ce8nf8._.js → [root-of-the-server]__1g3t7vn._.js} +3 -3
  113. package/.next/server/chunks/[root-of-the-server]__1kp-83u._.js +5 -0
  114. package/.next/server/chunks/[root-of-the-server]__1kv8p3e._.js +5 -0
  115. package/.next/server/chunks/[root-of-the-server]__1orn-5b._.js +2 -3
  116. package/.next/server/chunks/_02szwk8._.js +5 -0
  117. package/.next/server/chunks/_05h2cii._.js +1 -1
  118. package/.next/server/chunks/_06c9kie._.js +216 -0
  119. package/.next/server/chunks/{_1x6kd1r._.js → _07y2gj-._.js} +1 -1
  120. package/.next/server/chunks/_0a43a-0._.js +3 -0
  121. package/.next/server/chunks/_0bujjey._.js +5 -0
  122. package/.next/server/chunks/_0c9j6rb._.js +1 -1
  123. package/.next/server/chunks/_0dkd549._.js +3 -0
  124. package/.next/server/chunks/_0ej1kvv._.js +3 -0
  125. package/.next/server/chunks/_0f6ts7z._.js +3 -0
  126. package/.next/server/chunks/_0gm9hyv._.js +55 -0
  127. package/.next/server/chunks/_0i55en5._.js +25 -0
  128. package/.next/server/chunks/_0k50n27._.js +18 -0
  129. package/.next/server/chunks/_0khihjk._.js +3 -3
  130. package/.next/server/chunks/_0n74zsf._.js +5 -5
  131. package/.next/server/chunks/_0nvm9ef._.js +3 -0
  132. package/.next/server/chunks/_0p56fn0._.js +3 -0
  133. package/.next/server/chunks/_0recufk._.js +1 -1
  134. package/.next/server/chunks/_0xbkz10._.js +3 -0
  135. package/.next/server/chunks/_10tkr26._.js +3 -0
  136. package/.next/server/chunks/{_0ioz3nd._.js → _11u2kp7._.js} +1 -1
  137. package/.next/server/chunks/_11ujpya._.js +3 -0
  138. package/.next/server/chunks/_127nx_p._.js +5 -0
  139. package/.next/server/chunks/_17l5ygt._.js +1 -1
  140. package/.next/server/chunks/_19uauj6._.js +3 -0
  141. package/.next/server/chunks/_1_5mnq4._.js +5 -5
  142. package/.next/server/chunks/_1abl6t9._.js +55 -0
  143. package/.next/server/chunks/_1d0j961._.js +3 -3
  144. package/.next/server/chunks/_1dbixxz._.js +3 -0
  145. package/.next/server/chunks/_1dc_d1q._.js +98 -0
  146. package/.next/server/chunks/_1drgfx4._.js +5 -5
  147. package/.next/server/chunks/_1e48czp._.js +3 -3
  148. package/.next/server/chunks/_1f31u5x._.js +5 -0
  149. package/.next/server/chunks/_1gnjfli._.js +3 -0
  150. package/.next/server/chunks/_1kg70wc._.js +3 -3
  151. package/.next/server/chunks/_1klbcft._.js +5 -0
  152. package/.next/server/chunks/_1krd9rf._.js +4 -1
  153. package/.next/server/chunks/_1kwmzab._.js +3 -0
  154. package/.next/server/chunks/{_1pf4qe-._.js → _1oxj9fa._.js} +1 -1
  155. package/.next/server/chunks/{_1f46eie._.js → _1pcmdbb._.js} +1 -1
  156. package/.next/server/chunks/_1qgix-j._.js +3 -0
  157. package/.next/server/chunks/{lib_logger_ts_1exwjut._.js → _1rpchta._.js} +5 -5
  158. package/.next/server/chunks/_1vsej-s._.js +5 -0
  159. package/.next/server/chunks/_1yx0p_s._.js +5 -0
  160. package/.next/server/chunks/{_0rnf-6n._.js → _20fsr_z._.js} +6 -6
  161. package/.next/server/chunks/_2128hkj._.js +5 -0
  162. package/.next/server/chunks/_next-internal_server_app_api_bot_thread_[id]_route_actions_1fstjn2.js +3 -0
  163. package/.next/server/chunks/_next-internal_server_app_api_bot_thread_route_actions_003ccso.js +3 -0
  164. package/.next/server/chunks/_next-internal_server_app_api_workspace_missing_route_actions_1fidi6p.js +3 -0
  165. package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
  166. package/.next/server/chunks/features_0-cnt0l._.js +4 -0
  167. package/.next/server/chunks/features_0hdaci0._.js +4 -0
  168. package/.next/server/chunks/features_1e39j7-._.js +8 -0
  169. package/.next/server/chunks/features_bot_bot_query_ts_12mgkl2._.js +1 -1
  170. package/.next/server/chunks/features_memory_1uqvksn._.js +1 -1
  171. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0v_7drq._.js → node_modules_consola_dist_chunks_prompt_mjs_0a7-pbw._.js} +1 -1
  172. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_17k8irj._.js → node_modules_consola_dist_chunks_prompt_mjs_0gzvgfv._.js} +1 -1
  173. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0i7cvml._.js → node_modules_consola_dist_chunks_prompt_mjs_107pxfn._.js} +1 -1
  174. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0icqaqw._.js → node_modules_consola_dist_chunks_prompt_mjs_15hbel8._.js} +1 -1
  175. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_18i-23e._.js +3 -0
  176. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1bewgf3._.js +3 -0
  177. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1nlww1m._.js +3 -0
  178. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1q77nfx._.js +3 -0
  179. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xqdzx_._.js +3 -0
  180. package/.next/server/chunks/{node_modules_zod_v4_1801ax7._.js → node_modules_zod_v4_0lkux5-._.js} +2 -2
  181. package/.next/server/chunks/{node_modules_zod_v4_1cha_bw._.js → node_modules_zod_v4_1jmr9cq._.js} +2 -2
  182. package/.next/server/chunks/{node_modules_zod_v4_0ubdflj._.js → node_modules_zod_v4_1yrxmek._.js} +2 -2
  183. package/.next/server/chunks/node_modules_zod_v4_classic_errors_0tp0y-q.js +3 -0
  184. package/.next/server/chunks/ssr/[root-of-the-server]__0-e011f._.js +3 -0
  185. package/.next/server/chunks/ssr/[root-of-the-server]__09q9med._.js +1 -1
  186. package/.next/server/chunks/ssr/[root-of-the-server]__0lyi8i2._.js +1 -1
  187. package/.next/server/chunks/ssr/[root-of-the-server]__0pd8yr7._.js +3 -0
  188. package/.next/server/chunks/ssr/[root-of-the-server]__16jc196._.js +1 -1
  189. package/.next/server/chunks/ssr/[root-of-the-server]__18dthbp._.js +3 -0
  190. package/.next/server/chunks/ssr/[root-of-the-server]__18e68w8._.js +3 -0
  191. package/.next/server/chunks/ssr/[root-of-the-server]__1mzi-ju._.js +1 -1
  192. package/.next/server/chunks/ssr/[root-of-the-server]__1nygfik._.js +5 -0
  193. package/.next/server/chunks/ssr/[root-of-the-server]__1sdphb0._.js +8 -0
  194. package/.next/server/chunks/ssr/[root-of-the-server]__1vdmfbe._.js +3 -0
  195. package/.next/server/chunks/ssr/[root-of-the-server]__1waa3rc._.js +85 -0
  196. package/.next/server/chunks/ssr/_0-2qsxo._.js +3 -0
  197. package/.next/server/chunks/ssr/_00rehl_._.js +3 -0
  198. package/.next/server/chunks/ssr/{_1lz_cq2._.js → _02oc_h5._.js} +76 -97
  199. package/.next/server/chunks/ssr/_05yghx6._.js +3 -0
  200. package/.next/server/chunks/ssr/_07nbwap._.js +3 -0
  201. package/.next/server/chunks/ssr/_08c4z-9._.js +3 -0
  202. package/.next/server/chunks/ssr/_0_qfdlw._.js +4 -0
  203. package/.next/server/chunks/ssr/{_0m2lsd1._.js → _0b6_jv-._.js} +2 -2
  204. package/.next/server/chunks/ssr/_0evkpto._.js +3 -0
  205. package/.next/server/chunks/ssr/_0geg212._.js +3 -0
  206. package/.next/server/chunks/ssr/{_1jdgjv9._.js → _0hxt2ul._.js} +2 -2
  207. package/.next/server/chunks/ssr/_0i_6q1w._.js +2 -2
  208. package/.next/server/chunks/ssr/_0lu1n_x._.js +1 -1
  209. package/.next/server/chunks/ssr/_0no7i1o._.js +3 -0
  210. package/.next/server/chunks/ssr/_0tzg--b._.js +3 -0
  211. package/.next/server/chunks/ssr/{_15j2_8f._.js → _0wzaht-._.js} +2 -2
  212. package/.next/server/chunks/ssr/_0z-g0uy._.js +3 -0
  213. package/.next/server/chunks/ssr/_114ylv7._.js +7 -0
  214. package/.next/server/chunks/ssr/_123y-ah._.js +3 -0
  215. package/.next/server/chunks/ssr/_12c-iwh._.js +3 -0
  216. package/.next/server/chunks/ssr/_12w42gi._.js +3 -0
  217. package/.next/server/chunks/ssr/_161kqav._.js +3 -0
  218. package/.next/server/chunks/ssr/_167hchk._.js +3 -0
  219. package/.next/server/chunks/ssr/{_0ap2fzn._.js → _16c6_xm._.js} +2 -2
  220. package/.next/server/chunks/ssr/_18opah7._.js +3 -0
  221. package/.next/server/chunks/ssr/_1_krfph._.js +3 -0
  222. package/.next/server/chunks/ssr/{_0rzucul._.js → _1_x5spz._.js} +3 -3
  223. package/.next/server/chunks/ssr/_1a61fc9._.js +3 -0
  224. package/.next/server/chunks/ssr/_1ey7qn-._.js +70 -0
  225. package/.next/server/chunks/ssr/_1g9vs7q._.js +3 -0
  226. package/.next/server/chunks/ssr/_1jmz33w._.js +3 -0
  227. package/.next/server/chunks/ssr/_1rgtxhr._.js +5 -0
  228. package/.next/server/chunks/ssr/_1slp25y._.js +3 -0
  229. package/.next/server/chunks/ssr/_1w_t7h7._.js +101 -0
  230. package/.next/server/chunks/ssr/{_0s99bgb._.js → _1wyfaq_._.js} +9 -3
  231. package/.next/server/chunks/ssr/_200gt-m._.js +102 -0
  232. package/.next/server/chunks/ssr/components_ui_tabs_tsx_0ej40b4._.js +3 -0
  233. package/.next/server/chunks/ssr/features_bot_thread_query_ts_023eklt._.js +4 -0
  234. package/.next/server/chunks/ssr/features_config_components_config-setting_tsx_0xfwqdg._.js +1 -1
  235. package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
  236. package/.next/server/chunks/ssr/features_workspace_00jz2hu._.js +8 -0
  237. package/.next/server/chunks/ssr/{_1-teee5._.js → lib_logger_ts_0-olsze._.js} +2 -7
  238. package/.next/server/chunks/ssr/{node_modules_05-n6dz._.js → node_modules_02ai7br._.js} +1 -1
  239. package/.next/server/chunks/ssr/{node_modules_1chvq5f._.js → node_modules_02deexj._.js} +1 -1
  240. package/.next/server/chunks/ssr/{node_modules_0m383r2._.js → node_modules_07za262._.js} +1 -1
  241. package/.next/server/chunks/ssr/{node_modules_07dsgkx._.js → node_modules_0_s9get._.js} +1 -1
  242. package/.next/server/chunks/ssr/{node_modules_1a0kmjl._.js → node_modules_0n3c7h0._.js} +1 -1
  243. package/.next/server/chunks/ssr/{node_modules_0zeg3x_._.js → node_modules_0od6jwr._.js} +1 -1
  244. package/.next/server/chunks/ssr/{node_modules_1y79i83._.js → node_modules_0rdt7pk._.js} +1 -1
  245. package/.next/server/chunks/ssr/{node_modules_17bwo43._.js → node_modules_0tusx4d._.js} +3 -3
  246. package/.next/server/chunks/ssr/{node_modules_04sksn9._.js → node_modules_0w1z7kz._.js} +1 -1
  247. package/.next/server/chunks/ssr/{node_modules_1uyk91w._.js → node_modules_0wdupfz._.js} +1 -1
  248. package/.next/server/chunks/ssr/{node_modules_0ifp389._.js → node_modules_1720w0a._.js} +1 -1
  249. package/.next/server/chunks/ssr/{node_modules_0u9da1h._.js → node_modules_18lsg7d._.js} +1 -1
  250. package/.next/server/chunks/ssr/{node_modules_1k6n600._.js → node_modules_1b94fxf._.js} +1 -1
  251. package/.next/server/chunks/ssr/{node_modules_20c28js._.js → node_modules_1ecdo1s._.js} +1 -1
  252. package/.next/server/chunks/ssr/{node_modules_0fkeku3._.js → node_modules_1fa9ag7._.js} +1 -1
  253. package/.next/server/chunks/ssr/{node_modules_1j8j4pt._.js → node_modules_1fv-_si._.js} +1 -1
  254. package/.next/server/chunks/ssr/{node_modules_0-dr_o7._.js → node_modules_1hf461g._.js} +1 -1
  255. package/.next/server/chunks/ssr/{node_modules_1lz0oxc._.js → node_modules_1m71ta-._.js} +1 -1
  256. package/.next/server/chunks/ssr/{node_modules_1t77e4n._.js → node_modules_1n93n-g._.js} +1 -1
  257. package/.next/server/chunks/ssr/{node_modules_16mkxuo._.js → node_modules_1n9lqu9._.js} +1 -1
  258. package/.next/server/chunks/ssr/{node_modules_1k7z2j6._.js → node_modules_1npnsvd._.js} +1 -1
  259. package/.next/server/chunks/ssr/{node_modules_056qgf-._.js → node_modules_1rn2r0n._.js} +1 -1
  260. package/.next/server/chunks/ssr/{node_modules_0x3-ply._.js → node_modules_1seuurl._.js} +2 -2
  261. package/.next/server/chunks/ssr/{node_modules_0bvopy2._.js → node_modules_1vq-mfk._.js} +1 -1
  262. package/.next/server/chunks/ssr/{node_modules_0iur59s._.js → node_modules_1vzyw1t._.js} +1 -1
  263. package/.next/server/chunks/ssr/{node_modules_1k8j8n0._.js → node_modules_1w359w4._.js} +1 -1
  264. package/.next/server/chunks/ssr/{node_modules_1x0ztf4._.js → node_modules_1yajbl6._.js} +1 -1
  265. package/.next/server/chunks/ssr/{node_modules_1-y7nni._.js → node_modules_20eqhy8._.js} +1 -1
  266. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0bkwd0u._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_019sbis._.js} +1 -1
  267. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0p9a9su._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0s6piq3._.js} +1 -1
  268. package/.next/server/chunks/ssr/{node_modules_@vercel_oidc_dist_1o553h-._.js → node_modules_@vercel_oidc_dist_05itbb1._.js} +1 -1
  269. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_trash_mjs_0px2gzr._.js +3 -0
  270. package/.next/server/middleware-build-manifest.js +3 -3
  271. package/.next/server/pages/404.html +1 -1
  272. package/.next/server/pages/500.html +1 -1
  273. package/.next/server/server-reference-manifest.js +1 -1
  274. package/.next/server/server-reference-manifest.json +68 -46
  275. package/.next/static/chunks/07vqbk_9t4em4.js +2 -0
  276. package/.next/static/chunks/08krja1zx7nqg.js +1 -0
  277. package/.next/static/chunks/0g4b348l0pve7.js +1 -0
  278. package/.next/static/chunks/0qcuwdk132jjt.js +1 -0
  279. package/.next/static/chunks/0vlgzqo9ka90v.js +1 -0
  280. package/.next/static/chunks/{11r2yp_yh9_qn.js → 0z69gvysmave7.js} +1 -1
  281. package/.next/static/chunks/0zrupxgci5gqc.js +1 -0
  282. package/.next/static/chunks/12fvz1w5ows75.js +1 -0
  283. package/.next/static/chunks/14t03ned286iu.js +1 -0
  284. package/.next/static/chunks/156xxbkrz5lzu.js +18 -0
  285. package/.next/static/chunks/1fz14reod4lft.js +1 -0
  286. package/.next/static/chunks/1g23dbabl-vkr.js +1 -0
  287. package/.next/static/chunks/1ohslk4568tm3.js +1 -0
  288. package/.next/static/chunks/1qy_rc3oxfxok.js +1 -0
  289. package/.next/static/chunks/1sbmwswc9k2-1.js +1 -0
  290. package/.next/static/chunks/1vqezbhjm3goq.js +1 -0
  291. package/.next/static/chunks/1zea7qdl-7365.js +1 -0
  292. package/.next/static/chunks/1zvqumkg7kmo0.css +1 -0
  293. package/.next/static/chunks/26hpqt3y6bogl.js +12 -0
  294. package/.next/static/chunks/2_j5mqm6d-z18.js +99 -0
  295. package/.next/static/chunks/2dt6tu7a22svs.js +1 -0
  296. package/.next/static/chunks/2h5ls3d86kya6.js +1 -0
  297. package/.next/static/chunks/2wc6y1ht6dfuy.js +1 -0
  298. package/.next/static/chunks/{435atsnhs7ksu.js → 2xr0zpll7thyi.js} +2 -2
  299. package/.next/static/chunks/31jztc-yq30m7.js +1 -0
  300. package/.next/static/chunks/391af0i8eljzk.js +1 -0
  301. package/.next/static/chunks/3bfwpww3m3x4u.js +1 -0
  302. package/.next/static/chunks/{38gweqdo4jpfj.js → 3izg0a3k87q1-.js} +5 -5
  303. package/.next/static/chunks/3p2s2cjokx1aa.js +5 -0
  304. package/.next/static/chunks/{408ueu4hfvcg7.js → 41s3fml5oivsa.js} +1 -1
  305. package/README.md +45 -193
  306. package/app/api/events/app-event.ts +6 -4
  307. package/app/api/query-key.ts +25 -16
  308. package/bin/database.mjs +37 -0
  309. package/bin/thursday.mjs +44 -28
  310. package/components/ui/custom-icon.tsx +0 -60
  311. package/components/ui/radio-group.tsx +37 -0
  312. package/components/ui/shiny-text.tsx +33 -6
  313. package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/migration.sql +80 -24
  314. package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/snapshot.json +689 -110
  315. package/database/migrations/20260916160713_thread_cancelled/migration.sql +2 -0
  316. package/database/migrations/{20260911030320_opposite_jack_power → 20260916160713_thread_cancelled}/snapshot.json +706 -84
  317. package/docs/how-it-works.md +40 -35
  318. package/docs/images/keeps-going.png +0 -0
  319. package/docs/images/two-minds.png +0 -0
  320. package/docs/live-calls.md +236 -0
  321. package/docs/thread-rooms.md +71 -0
  322. package/features/ai/chatgpt.ts +1 -2
  323. package/features/ai/live.schema.ts +128 -0
  324. package/features/ai/load-tools.ts +152 -79
  325. package/features/ai/model.schema.ts +2 -120
  326. package/features/ai/model.ts +52 -88
  327. package/features/ai/prompts/bot.prompt.ts +91 -214
  328. package/features/ai/prompts/live.prompt.ts +169 -0
  329. package/features/ai/prompts/prompt-helper.ts +92 -32
  330. package/features/ai/prompts/thursday.prompt.ts +164 -190
  331. package/features/ai/tools/bot.tool.ts +38 -145
  332. package/features/ai/tools/call.tool.ts +33 -5
  333. package/features/ai/tools/connected.ts +5 -3
  334. package/features/ai/tools/mcp.tool.ts +7 -4
  335. package/features/ai/tools/memory.tool.ts +35 -31
  336. package/features/ai/tools/skills.tool.ts +11 -6
  337. package/features/ai/tools/studio.tool.ts +26 -21
  338. package/features/ai/tools/tool-name.ts +3 -5
  339. package/features/ai/tools/workspace.tool.ts +33 -10
  340. package/features/artifact/artifact.action.ts +2 -2
  341. package/features/artifact/artifact.query.ts +112 -61
  342. package/features/artifact/artifact.schema.ts +8 -6
  343. package/features/artifact/components/artifact-setting.tsx +83 -33
  344. package/features/bot/bot.action.ts +43 -36
  345. package/features/bot/bot.memory.ts +137 -20
  346. package/features/bot/bot.query.ts +28 -11
  347. package/features/bot/bot.run.ts +296 -744
  348. package/features/bot/bot.runner.ts +463 -864
  349. package/features/bot/bot.schema.ts +93 -82
  350. package/features/bot/bot.seed.ts +141 -64
  351. package/features/bot/components/bot-mark.tsx +324 -232
  352. package/features/bot/components/bot-room.tsx +1613 -697
  353. package/features/bot/components/bot-roster.tsx +8 -13
  354. package/features/bot/components/bot-setting.tsx +58 -42
  355. package/features/bot/components/bot-tool.tsx +55 -87
  356. package/features/bot/components/mark-palette.tsx +35 -32
  357. package/features/bot/components/path-chips.tsx +33 -3
  358. package/features/bot/components/thread-badge.tsx +34 -0
  359. package/features/bot/components/thread-reply.tsx +639 -0
  360. package/features/bot/components/thread-setting.tsx +674 -0
  361. package/features/bot/mark.const.ts +79 -31
  362. package/features/bot/room.query.ts +889 -0
  363. package/features/bot/room.schema.ts +64 -0
  364. package/features/bot/seed-bots.ts +2 -1
  365. package/features/bot/thread.query.ts +971 -0
  366. package/features/bot/thread.store.ts +587 -0
  367. package/features/config/components/voice-key.tsx +113 -88
  368. package/features/config/config.const.ts +5 -9
  369. package/features/connectors/mcp.schema.ts +0 -2
  370. package/features/intro/components/intro.tsx +169 -139
  371. package/features/memory/components/memory-setting.tsx +2 -7
  372. package/features/memory/memory.schema.ts +14 -23
  373. package/features/settings/components/setting-ui.tsx +0 -44
  374. package/features/settings/components/settings.tsx +12 -12
  375. package/features/settings/settings.alert.ts +3 -3
  376. package/features/settings/settings.store.ts +1 -1
  377. package/features/skills/skills.schema.ts +0 -2
  378. package/features/thursday/ascii.const.ts +74 -0
  379. package/features/thursday/components/ascii-field.tsx +24 -44
  380. package/features/thursday/components/ascii-orb.tsx +525 -381
  381. package/features/thursday/components/call-log.tsx +46 -44
  382. package/features/thursday/components/face.tsx +40 -10
  383. package/features/thursday/components/side-captions.tsx +273 -0
  384. package/features/thursday/components/tab-state.tsx +14 -6
  385. package/features/thursday/components/thursday-mark.tsx +1 -0
  386. package/features/thursday/components/thursday-setting.tsx +633 -333
  387. package/features/thursday/components/thursday.tsx +315 -274
  388. package/features/thursday/components/voice-picker.tsx +255 -0
  389. package/features/thursday/face.store.ts +5 -0
  390. package/features/thursday/thursday.action.ts +96 -72
  391. package/features/thursday/thursday.query.ts +49 -30
  392. package/features/thursday/thursday.schema.ts +37 -35
  393. package/features/thursday/thursday.store.ts +14 -7
  394. package/features/thursday/tool-call.ts +3 -3
  395. package/features/thursday/tool-line.ts +5 -3
  396. package/features/thursday/use-thursday.ts +801 -457
  397. package/features/workspace/file-kind.ts +9 -0
  398. package/features/workspace/workspace.query.ts +17 -0
  399. package/features/workspace/workspace.ts +82 -36
  400. package/hooks/use-hotkey.ts +3 -2
  401. package/lib/live/live.schema.ts +26 -0
  402. package/lib/live/live.server.ts +153 -0
  403. package/lib/live/live.session.ts +574 -0
  404. package/lib/{realtime/realtime.tap.ts → live/live.tap.ts} +41 -12
  405. package/lib/live/live.transport.ts +152 -0
  406. package/lib/protocol/use-server-pages.ts +9 -5
  407. package/lib/utils.ts +21 -20
  408. package/package.json +2 -2
  409. package/public/voices/alloy.ogg +0 -0
  410. package/public/voices/ash.ogg +0 -0
  411. package/public/voices/ballad.ogg +0 -0
  412. package/public/voices/beacon.ogg +0 -0
  413. package/public/voices/bossa.ogg +0 -0
  414. package/public/voices/cedar.ogg +0 -0
  415. package/public/voices/cinder.ogg +0 -0
  416. package/public/voices/coral.ogg +0 -0
  417. package/public/voices/delta.ogg +0 -0
  418. package/public/voices/echo.ogg +0 -0
  419. package/public/voices/gleam.ogg +0 -0
  420. package/public/voices/marin.ogg +0 -0
  421. package/public/voices/meridian.ogg +0 -0
  422. package/public/voices/quartz.ogg +0 -0
  423. package/public/voices/ripple.ogg +0 -0
  424. package/public/voices/sage.ogg +0 -0
  425. package/public/voices/shimmer.ogg +0 -0
  426. package/public/voices/stone.ogg +0 -0
  427. package/public/voices/tempo.ogg +0 -0
  428. package/public/voices/verse.ogg +0 -0
  429. package/public/voices/vesper.ogg +0 -0
  430. package/public/voices/willow.ogg +0 -0
  431. package/scripts/artifact-paths.test.mts +38 -0
  432. package/scripts/bot-context.test.mts +1408 -0
  433. package/scripts/live-history.test.mts +115 -0
  434. package/scripts/live-session.test.mts +938 -0
  435. package/server.js +1 -1
  436. package/skills/browser/SKILL.md +11 -1
  437. package/skills/computer/SKILL.md +1 -1
  438. package/skills/find-skills/SKILL.md +3 -8
  439. package/skills/interactive-page/SKILL.md +12 -7
  440. package/skills/interactive-page/references/diagram.md +89 -0
  441. package/skills/interactive-page/scripts/archify/LICENSE +22 -0
  442. package/skills/interactive-page/scripts/archify/README.md +25 -0
  443. package/skills/interactive-page/scripts/archify/assets/JetBrainsMono-OFL.txt +93 -0
  444. package/skills/interactive-page/scripts/archify/assets/template.html +14934 -0
  445. package/skills/interactive-page/scripts/archify/bin/archify.mjs +2126 -0
  446. package/skills/interactive-page/scripts/archify/bin/open-artifact.mjs +86 -0
  447. package/skills/interactive-page/scripts/archify/bin/preview.mjs +653 -0
  448. package/skills/interactive-page/scripts/archify/bin/visual-check.mjs +829 -0
  449. package/skills/interactive-page/scripts/archify/delta/architecture-delta.mjs +1223 -0
  450. package/skills/interactive-page/scripts/archify/examples/agent-run.lifecycle.json +60 -0
  451. package/skills/interactive-page/scripts/archify/examples/agent-tool-call.workflow.json +94 -0
  452. package/skills/interactive-page/scripts/archify/examples/async-job-roundtrip.sequence.json +61 -0
  453. package/skills/interactive-page/scripts/archify/examples/cache-miss-request.sequence.json +82 -0
  454. package/skills/interactive-page/scripts/archify/examples/checkout-platform.base.architecture.json +31 -0
  455. package/skills/interactive-page/scripts/archify/examples/checkout-platform.head.architecture.json +31 -0
  456. package/skills/interactive-page/scripts/archify/examples/deployment-release.lifecycle.json +49 -0
  457. package/skills/interactive-page/scripts/archify/examples/event-stream.dataflow.json +57 -0
  458. package/skills/interactive-page/scripts/archify/examples/incident-response.workflow.json +64 -0
  459. package/skills/interactive-page/scripts/archify/examples/product-analytics.dataflow.json +76 -0
  460. package/skills/interactive-page/scripts/archify/examples/production-deployment.architecture.json +71 -0
  461. package/skills/interactive-page/scripts/archify/examples/release-delivery.workflow.json +62 -0
  462. package/skills/interactive-page/scripts/archify/examples/web-app.architecture.json +46 -0
  463. package/skills/interactive-page/scripts/archify/migrations/workflow-v2.mjs +279 -0
  464. package/skills/interactive-page/scripts/archify/recipes/scenarios.mjs +284 -0
  465. package/skills/interactive-page/scripts/archify/references/authoring-contract.md +243 -0
  466. package/skills/interactive-page/scripts/archify/references/delivery-contract.md +120 -0
  467. package/skills/interactive-page/scripts/archify/references/viewer-runtime.md +45 -0
  468. package/skills/interactive-page/scripts/archify/renderers/architecture/grid.mjs +62 -0
  469. package/skills/interactive-page/scripts/archify/renderers/architecture/render-architecture.mjs +1078 -0
  470. package/skills/interactive-page/scripts/archify/renderers/dataflow/README.md +104 -0
  471. package/skills/interactive-page/scripts/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  472. package/skills/interactive-page/scripts/archify/renderers/lifecycle/README.md +115 -0
  473. package/skills/interactive-page/scripts/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  474. package/skills/interactive-page/scripts/archify/renderers/sequence/README.md +114 -0
  475. package/skills/interactive-page/scripts/archify/renderers/sequence/render-sequence.mjs +464 -0
  476. package/skills/interactive-page/scripts/archify/renderers/shared/brand-marks.mjs +563 -0
  477. package/skills/interactive-page/scripts/archify/renderers/shared/cli.mjs +218 -0
  478. package/skills/interactive-page/scripts/archify/renderers/shared/desktop-readability.mjs +26 -0
  479. package/skills/interactive-page/scripts/archify/renderers/shared/diagnostics.mjs +127 -0
  480. package/skills/interactive-page/scripts/archify/renderers/shared/engineering-profiles.mjs +157 -0
  481. package/skills/interactive-page/scripts/archify/renderers/shared/generated-brand-marks.mjs +3 -0
  482. package/skills/interactive-page/scripts/archify/renderers/shared/generated-validators.mjs +13 -0
  483. package/skills/interactive-page/scripts/archify/renderers/shared/geometry.mjs +1423 -0
  484. package/skills/interactive-page/scripts/archify/renderers/shared/i18n.mjs +595 -0
  485. package/skills/interactive-page/scripts/archify/renderers/shared/layout-report.mjs +40 -0
  486. package/skills/interactive-page/scripts/archify/renderers/shared/legend.mjs +217 -0
  487. package/skills/interactive-page/scripts/archify/renderers/shared/output-path.mjs +340 -0
  488. package/skills/interactive-page/scripts/archify/renderers/shared/repository-evidence.mjs +238 -0
  489. package/skills/interactive-page/scripts/archify/renderers/shared/repository-location.mjs +58 -0
  490. package/skills/interactive-page/scripts/archify/renderers/shared/text-fit.mjs +49 -0
  491. package/skills/interactive-page/scripts/archify/renderers/shared/utils.mjs +232 -0
  492. package/skills/interactive-page/scripts/archify/renderers/shared/validator.mjs +86 -0
  493. package/skills/interactive-page/scripts/archify/renderers/workflow/README.md +223 -0
  494. package/skills/interactive-page/scripts/archify/renderers/workflow/render-workflow.mjs +35 -0
  495. package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  496. package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  497. package/skills/interactive-page/scripts/archify/schemas/README.md +211 -0
  498. package/skills/interactive-page/scripts/archify/schemas/architecture.schema.json +178 -0
  499. package/skills/interactive-page/scripts/archify/schemas/common.schema.json +115 -0
  500. package/skills/interactive-page/scripts/archify/schemas/dataflow.schema.json +243 -0
  501. package/skills/interactive-page/scripts/archify/schemas/lifecycle.schema.json +266 -0
  502. package/skills/interactive-page/scripts/archify/schemas/sequence.schema.json +223 -0
  503. package/skills/interactive-page/scripts/archify/schemas/workflow.schema.json +428 -0
  504. package/skills/interactive-page/scripts/archify/scripts/check-render-output.mjs +916 -0
  505. package/skills/interactive-page/scripts/archify/scripts/render-examples.mjs +26 -0
  506. package/skills/interactive-page/scripts/bundle-artifact.sh +9 -8
  507. package/skills/skill-creator/SKILL.md +4 -5
  508. package/.next/server/app/api/bot/task/[id]/route/app-paths-manifest.json +0 -3
  509. package/.next/server/app/api/bot/task/[id]/route.js +0 -16
  510. package/.next/server/app/api/bot/task/[id]/route.js.nft.json +0 -1
  511. package/.next/server/app/api/bot/task/[id]/route_client-reference-manifest.js +0 -3
  512. package/.next/server/app/api/bot/task/route/app-paths-manifest.json +0 -3
  513. package/.next/server/app/api/bot/task/route.js +0 -16
  514. package/.next/server/app/api/bot/task/route.js.nft.json +0 -1
  515. package/.next/server/app/api/bot/task/route_client-reference-manifest.js +0 -3
  516. package/.next/server/chunks/[root-of-the-server]__026u77e._.js +0 -5
  517. package/.next/server/chunks/[root-of-the-server]__02va5wz._.js +0 -3
  518. package/.next/server/chunks/[root-of-the-server]__050zri4._.js +0 -3
  519. package/.next/server/chunks/[root-of-the-server]__0bg9710._.js +0 -3
  520. package/.next/server/chunks/[root-of-the-server]__0ffbg85._.js +0 -3
  521. package/.next/server/chunks/[root-of-the-server]__0in-d5s._.js +0 -3
  522. package/.next/server/chunks/[root-of-the-server]__0ncs9uu._.js +0 -3
  523. package/.next/server/chunks/[root-of-the-server]__0pa9k-f._.js +0 -8
  524. package/.next/server/chunks/[root-of-the-server]__0qi_m0e._.js +0 -8
  525. package/.next/server/chunks/[root-of-the-server]__0tq0m_k._.js +0 -3
  526. package/.next/server/chunks/[root-of-the-server]__0xep6j_._.js +0 -3
  527. package/.next/server/chunks/[root-of-the-server]__1-ga0kh._.js +0 -5
  528. package/.next/server/chunks/[root-of-the-server]__11n256_._.js +0 -5
  529. package/.next/server/chunks/[root-of-the-server]__144l7qt._.js +0 -8
  530. package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +0 -5
  531. package/.next/server/chunks/[root-of-the-server]__1anc1p9._.js +0 -3
  532. package/.next/server/chunks/[root-of-the-server]__1fizn31._.js +0 -3
  533. package/.next/server/chunks/[root-of-the-server]__1jg8t86._.js +0 -8
  534. package/.next/server/chunks/[root-of-the-server]__1lldzy9._.js +0 -3
  535. package/.next/server/chunks/[root-of-the-server]__1llj3-b._.js +0 -3
  536. package/.next/server/chunks/[root-of-the-server]__1p8m3f4._.js +0 -3
  537. package/.next/server/chunks/[root-of-the-server]__1peqvsi._.js +0 -3
  538. package/.next/server/chunks/[root-of-the-server]__1w8gm5h._.js +0 -10
  539. package/.next/server/chunks/[root-of-the-server]__1xt39nn._.js +0 -8
  540. package/.next/server/chunks/[root-of-the-server]__1zb8mfo._.js +0 -8
  541. package/.next/server/chunks/_0-73of8._.js +0 -55
  542. package/.next/server/chunks/_0-fjql4._.js +0 -31
  543. package/.next/server/chunks/_00xh_q0._.js +0 -25
  544. package/.next/server/chunks/_051qh8u._.js +0 -3
  545. package/.next/server/chunks/_05sovvj._.js +0 -3
  546. package/.next/server/chunks/_091bi8d._.js +0 -3
  547. package/.next/server/chunks/_0fzqt2y._.js +0 -142
  548. package/.next/server/chunks/_0lr92vd._.js +0 -3
  549. package/.next/server/chunks/_0mecv0f._.js +0 -31
  550. package/.next/server/chunks/_0mh8j4m._.js +0 -3
  551. package/.next/server/chunks/_0sb7tlz._.js +0 -3
  552. package/.next/server/chunks/_0si7xzn._.js +0 -3
  553. package/.next/server/chunks/_0u10wmw._.js +0 -55
  554. package/.next/server/chunks/_0wp4le3._.js +0 -3
  555. package/.next/server/chunks/_0y5fg-x._.js +0 -3
  556. package/.next/server/chunks/_1230wbx._.js +0 -10
  557. package/.next/server/chunks/_12nheja._.js +0 -3
  558. package/.next/server/chunks/_13510xh._.js +0 -3
  559. package/.next/server/chunks/_15hq89o._.js +0 -3
  560. package/.next/server/chunks/_18-1wcc._.js +0 -55
  561. package/.next/server/chunks/_18d7-5p._.js +0 -3
  562. package/.next/server/chunks/_1c78vw5._.js +0 -237
  563. package/.next/server/chunks/_1h5_8sk._.js +0 -3
  564. package/.next/server/chunks/_1hdnxb7._.js +0 -3
  565. package/.next/server/chunks/_1j8k_j5._.js +0 -3
  566. package/.next/server/chunks/_1nula3v._.js +0 -3
  567. package/.next/server/chunks/_1php4eq._.js +0 -3
  568. package/.next/server/chunks/_1yuv4vp._.js +0 -3
  569. package/.next/server/chunks/_1zkfbaa._.js +0 -3
  570. package/.next/server/chunks/_next-internal_server_app_api_bot_task_[id]_route_actions_1_k_8u3.js +0 -3
  571. package/.next/server/chunks/_next-internal_server_app_api_bot_task_route_actions_0xln6ra.js +0 -3
  572. package/.next/server/chunks/features_0rpfxbk._.js +0 -3
  573. package/.next/server/chunks/features_1qf3cei._.js +0 -8
  574. package/.next/server/chunks/features_bot_0zt92oh._.js +0 -3
  575. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1jidylq._.js +0 -3
  576. package/.next/server/chunks/ssr/[externals]__0dizgek._.js +0 -3
  577. package/.next/server/chunks/ssr/[root-of-the-server]__0-nob52._.js +0 -4
  578. package/.next/server/chunks/ssr/[root-of-the-server]__092knlj._.js +0 -3
  579. package/.next/server/chunks/ssr/[root-of-the-server]__0mz33a7._.js +0 -3
  580. package/.next/server/chunks/ssr/[root-of-the-server]__0s4wb56._.js +0 -3
  581. package/.next/server/chunks/ssr/[root-of-the-server]__0s9dq5u._.js +0 -3
  582. package/.next/server/chunks/ssr/[root-of-the-server]__0sd3izg._.js +0 -3
  583. package/.next/server/chunks/ssr/[root-of-the-server]__0vnmv-s._.js +0 -3
  584. package/.next/server/chunks/ssr/[root-of-the-server]__1-13tcn._.js +0 -43
  585. package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +0 -61
  586. package/.next/server/chunks/ssr/[root-of-the-server]__1zidpfl._.js +0 -3
  587. package/.next/server/chunks/ssr/_001_ms1._.js +0 -33
  588. package/.next/server/chunks/ssr/_01n3o0m._.js +0 -3
  589. package/.next/server/chunks/ssr/_04z2c7b._.js +0 -3
  590. package/.next/server/chunks/ssr/_06tssji._.js +0 -3
  591. package/.next/server/chunks/ssr/_0fk4c7d._.js +0 -3
  592. package/.next/server/chunks/ssr/_0h42fze._.js +0 -3
  593. package/.next/server/chunks/ssr/_0h7zdni._.js +0 -3
  594. package/.next/server/chunks/ssr/_0mggveb._.js +0 -3
  595. package/.next/server/chunks/ssr/_0nbpc_8._.js +0 -3
  596. package/.next/server/chunks/ssr/_0q0zan6._.js +0 -70
  597. package/.next/server/chunks/ssr/_0zcjrbg._.js +0 -3
  598. package/.next/server/chunks/ssr/_0zhoc3r._.js +0 -3
  599. package/.next/server/chunks/ssr/_11j92tu._.js +0 -3
  600. package/.next/server/chunks/ssr/_13fke0x._.js +0 -3
  601. package/.next/server/chunks/ssr/_18cymkq._.js +0 -3
  602. package/.next/server/chunks/ssr/_1ebxla1._.js +0 -3
  603. package/.next/server/chunks/ssr/_1nj4niv._.js +0 -42
  604. package/.next/server/chunks/ssr/_1ov37if._.js +0 -3
  605. package/.next/server/chunks/ssr/_1ovmc9s._.js +0 -3
  606. package/.next/server/chunks/ssr/_1sji22n._.js +0 -3
  607. package/.next/server/chunks/ssr/_1vi_uo7._.js +0 -3
  608. package/.next/server/chunks/ssr/_1vyd1ji._.js +0 -3
  609. package/.next/server/chunks/ssr/_1xx4zlb._.js +0 -3
  610. package/.next/server/chunks/ssr/components_ui_1y1l7yj._.js +0 -3
  611. package/.next/server/chunks/ssr/features_bot_1s_-2vj._.js +0 -3
  612. package/.next/server/chunks/ssr/lib_realtime_12wg_dd._.js +0 -27
  613. package/.next/server/chunks/ssr/lib_realtime_15h_v1v._.js +0 -27
  614. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0npjf8-._.js +0 -3
  615. package/.next/static/chunks/0n3jle9kbqfr2.js +0 -40
  616. package/.next/static/chunks/0r5qcctujhxli.js +0 -1
  617. package/.next/static/chunks/10teww7wt-f6h.js +0 -1
  618. package/.next/static/chunks/126fj4pga_72k.js +0 -1
  619. package/.next/static/chunks/159udiexf6dom.js +0 -2
  620. package/.next/static/chunks/18a96rkhi4_yd.js +0 -1
  621. package/.next/static/chunks/18gi7o2ibrgh8.js +0 -3
  622. package/.next/static/chunks/1dkjg87pxk0n9.js +0 -28
  623. package/.next/static/chunks/1q9z1tohil7xn.js +0 -1
  624. package/.next/static/chunks/1sjgfets224re.js +0 -1
  625. package/.next/static/chunks/1wszsr83t01gh.js +0 -1
  626. package/.next/static/chunks/22_zkas21rpna.js +0 -1
  627. package/.next/static/chunks/2fh4-3z_q8b_w.js +0 -1
  628. package/.next/static/chunks/2h0sd2vumhb15.js +0 -1
  629. package/.next/static/chunks/2szintyibu0s5.js +0 -1
  630. package/.next/static/chunks/2t4vhi3m8ahya.js +0 -1
  631. package/.next/static/chunks/2tigdtz3dpcy8.js +0 -1
  632. package/.next/static/chunks/3-b6b7entqazs.js +0 -1
  633. package/.next/static/chunks/3786h5vayt80-.js +0 -28
  634. package/.next/static/chunks/3cq5g494yuke8.css +0 -1
  635. package/.next/static/chunks/3dmbhsv2u_8kj.js +0 -1
  636. package/.next/static/chunks/3hibbjnt85-k6.js +0 -1
  637. package/.next/static/chunks/3i0a5px-oufgc.js +0 -1
  638. package/.next/static/chunks/3wexk9qo8zuj3.js +0 -18
  639. package/.next/static/chunks/3xk7yqgomx7yq.js +0 -1
  640. package/.next/static/chunks/3xre8bu_pk1p_.js +0 -1
  641. package/.next/static/chunks/3zv6t3i77xhr_.js +0 -1
  642. package/database/migrations/20260911030320_opposite_jack_power/migration.sql +0 -1
  643. package/docs/images/task-thread.png +0 -0
  644. package/features/bot/components/task-badge.tsx +0 -42
  645. package/features/bot/components/task-reply.tsx +0 -328
  646. package/features/bot/components/task-setting.tsx +0 -524
  647. package/features/bot/task.query.ts +0 -1079
  648. package/features/bot/task.store.ts +0 -487
  649. package/lib/realtime/client-secret.ts +0 -86
  650. package/lib/realtime/open-session.ts +0 -31
  651. package/lib/realtime/openai.ts +0 -35
  652. package/lib/realtime/realtime.audio.ts +0 -196
  653. package/lib/realtime/realtime.driver.ts +0 -489
  654. package/lib/realtime/realtime.protocol.ts +0 -393
  655. package/lib/realtime/realtime.schema.ts +0 -37
  656. package/lib/realtime/realtime.session.ts +0 -106
  657. package/lib/realtime/realtime.transport.ts +0 -384
  658. package/lib/realtime/xai.ts +0 -39
  659. /package/.next/server/app/api/bot/{task → thread}/[id]/route/build-manifest.json +0 -0
  660. /package/.next/server/app/api/bot/{task → thread}/[id]/route/server-reference-manifest.json +0 -0
  661. /package/.next/server/app/api/bot/{task → thread}/[id]/route.js.map +0 -0
  662. /package/.next/server/app/api/bot/{task → thread}/route/build-manifest.json +0 -0
  663. /package/.next/server/app/api/bot/{task → thread}/route/server-reference-manifest.json +0 -0
  664. /package/.next/server/app/api/bot/{task → thread}/route.js.map +0 -0
  665. /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → yyRVBc0xxYQsh3GpbQX9b}/_buildManifest.js +0 -0
  666. /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → yyRVBc0xxYQsh3GpbQX9b}/_clientMiddlewareManifest.js +0 -0
  667. /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → yyRVBc0xxYQsh3GpbQX9b}/_ssgManifest.js +0 -0
@@ -1,22 +1,16 @@
1
1
  "use client";
2
2
 
3
- import type { BotRef } from "../task.store";
3
+ import type { BotRef } from "../thread.store";
4
4
  import { BotMark } from "./bot-mark";
5
5
 
6
6
  /** Faces drawn before the count carries the rest. */
7
7
  const SHOWN = 3;
8
8
 
9
9
  /**
10
- * Who was in this room. A task that never left its own bot draws nothing: the
10
+ * Who was in this room. A thread that never left its own bot draws nothing: the
11
11
  * row already shows that bot's face, and a stack of one says less than none.
12
12
  */
13
- export function BotRoster({
14
- bots,
15
- taskId,
16
- }: {
17
- bots: BotRef[];
18
- taskId: string;
19
- }) {
13
+ export function BotRoster({ bots }: { bots: BotRef[] }) {
20
14
  if (bots.length < 2) return null;
21
15
 
22
16
  return (
@@ -24,19 +18,20 @@ export function BotRoster({
24
18
  className="flex shrink-0 items-center gap-1.5"
25
19
  title={bots.map((bot) => bot.name).join(", ")}
26
20
  >
27
- <span className="flex items-center">
21
+ <span className="flex items-center gap-0.5">
28
22
  {bots.slice(0, SHOWN).map((bot) => (
29
- // A 3px shingle: enough to read as a group, not enough to hide a face.
23
+ // Side by side, not shingled: parting overlapped faces takes a ring, and
24
+ // a ring around a shape that is not a circle covers its neighbour.
30
25
  <BotMark
31
26
  key={bot.name}
32
27
  size={18}
33
28
  seed={bot.name}
34
- vary={taskId}
35
29
  color={bot.icon?.color}
36
30
  shape={bot.icon?.shape}
37
31
  outline={bot.icon?.outline}
32
+ paint={bot.icon?.paint}
38
33
  notify={false}
39
- className="-ml-[3px] rounded-[7px] ring-2 ring-background first:ml-0"
34
+ className="shrink-0"
40
35
  />
41
36
  ))}
42
37
  </span>
@@ -57,12 +57,12 @@ import {
57
57
  type BotMemoryFile,
58
58
  MAX_PINNED_TOOLS,
59
59
  randomBotIcon,
60
- type Task,
60
+ type Thread,
61
61
  } from "@/features/bot/bot.schema";
62
62
  import {
63
63
  BOT_SEEDS,
64
64
  type BotSeed,
65
- rollSeedColors,
65
+ rollSeedIcons,
66
66
  } from "@/features/bot/bot.seed";
67
67
  import { BotMark } from "@/features/bot/components/bot-mark";
68
68
  import { MarkPalette } from "@/features/bot/components/mark-palette";
@@ -105,19 +105,21 @@ import { MARK_SHAPES, MARK_SYSTEM } from "../mark.const";
105
105
  export function BotSetting() {
106
106
  const { data, isLoading, error } = useServerRoute<Bot[]>(queryKey.bot);
107
107
  const bots = data ?? [];
108
- // First page of history, not the inbox: the inbox keeps only a few finished tasks.
109
- const { data: history } = useServerRoute<Task[]>(queryKey.taskHistory(null));
108
+ // First page of history, not the inbox: the inbox keeps only a few finished threads.
109
+ const { data: history } = useServerRoute<Thread[]>(
110
+ queryKey.threadHistory(null),
111
+ );
110
112
  const jobs = history ?? [];
111
113
  /** Picked roster entry: a bot name, NEW, or null for the first bot. */
112
114
  const [picked, setPicked] = useState<string | null>(null);
113
115
 
114
116
  /**
115
117
  * One roll for this screen, in BOT_SEEDS order. The faces on the invite, in the
116
- * picker and on the bot that gets created are then the same colour, because
117
- * `createSeedBotsAction` takes it (bot.seed rollSeedColors rolls per install so
118
+ * picker and on the bot that gets created are then the same, because
119
+ * `createSeedBotsAction` takes it (bot.seed rollSeedIcons rolls per install so
118
120
  * no two rosters look alike; a seed itself carries none).
119
121
  */
120
- const [inks] = useState(rollSeedColors);
122
+ const [faces] = useState(rollSeedIcons);
121
123
 
122
124
  if (isLoading) return <SettingPanesSkeleton />;
123
125
  if (error) return <SettingError message={error.message} />;
@@ -155,7 +157,7 @@ export function BotSetting() {
155
157
  {bots.length > 0 && missing.length > 0 && (
156
158
  <SeedInvite
157
159
  missing={missing}
158
- inks={inks}
160
+ faces={faces}
159
161
  have={have}
160
162
  onDone={(name) => setPicked(name)}
161
163
  />
@@ -204,7 +206,7 @@ export function BotSetting() {
204
206
  // hold, so it fills it rather than sitting in a dialog nobody opened
205
207
  <SeedPackage
206
208
  have={have}
207
- inks={inks}
209
+ faces={faces}
208
210
  onDone={(name) => setPicked(name)}
209
211
  />
210
212
  ) : (
@@ -239,7 +241,7 @@ function RosterRow({
239
241
  }: {
240
242
  bot: Bot;
241
243
  /** Latest job if it is on the first history page; `bot.lastJobAt` covers the rest. */
242
- job: Task | null;
244
+ job: Thread | null;
243
245
  active: boolean;
244
246
  onPick: () => void;
245
247
  }) {
@@ -258,6 +260,7 @@ function RosterRow({
258
260
  {...markProps(bot.name, bot.icon)}
259
261
  state={job?.status === "running" ? "thinking" : "idle"}
260
262
  notify={job?.status === "waiting"}
263
+ crossed={job?.status === "cancelled"}
261
264
  className={cn("shrink-0", bot.disabled && "opacity-45")}
262
265
  />
263
266
  <span
@@ -296,7 +299,7 @@ function RosterRow({
296
299
  * was is the words' job, not the colour's.
297
300
  */
298
301
  function liveLine(
299
- job: Task | null,
302
+ job: Thread | null,
300
303
  lastJobAt: Bot["lastJobAt"],
301
304
  disabled: boolean,
302
305
  ): {
@@ -354,7 +357,7 @@ function unmetLine(
354
357
  */
355
358
  function useSeedPicks(
356
359
  have: Set<string>,
357
- inks: string[],
360
+ faces: BotIcon[],
358
361
  onDone: (name: string | null) => void,
359
362
  ) {
360
363
  const [off, setOff] = useState<Set<string>>(new Set());
@@ -390,7 +393,7 @@ function useSeedPicks(
390
393
  add(
391
394
  wanted.map((seed) => ({
392
395
  name: seed.name,
393
- color: inks[BOT_SEEDS.indexOf(seed)],
396
+ icon: faces[BOT_SEEDS.indexOf(seed)],
394
397
  })),
395
398
  ),
396
399
  };
@@ -399,11 +402,11 @@ function useSeedPicks(
399
402
  /** The rows themselves. Both wrappers draw these and supply their own chrome. */
400
403
  function SeedRows({
401
404
  have,
402
- inks,
405
+ faces,
403
406
  picks,
404
407
  }: {
405
408
  have: Set<string>;
406
- inks: string[];
409
+ faces: BotIcon[];
407
410
  picks: ReturnType<typeof useSeedPicks>;
408
411
  }) {
409
412
  return (
@@ -433,8 +436,7 @@ function SeedRows({
433
436
  >
434
437
  <BotMark
435
438
  size={28}
436
- {...markProps(seed.name, seed.icon)}
437
- color={inks[at]}
439
+ {...markProps(seed.name, faces[at])}
438
440
  className={cn(
439
441
  "shrink-0 transition-opacity",
440
442
  !on && "opacity-35",
@@ -517,15 +519,15 @@ function SeedActions({
517
519
  */
518
520
  function SeedPackage({
519
521
  have,
520
- inks,
522
+ faces,
521
523
  onDone,
522
524
  }: {
523
525
  /** Names already on the roster. */
524
526
  have: Set<string>;
525
- inks: string[];
527
+ faces: BotIcon[];
526
528
  onDone: (name: string | null) => void;
527
529
  }) {
528
- const picks = useSeedPicks(have, inks, onDone);
530
+ const picks = useSeedPicks(have, faces, onDone);
529
531
 
530
532
  return (
531
533
  <div className="flex min-h-full flex-col">
@@ -545,7 +547,7 @@ function SeedPackage({
545
547
  </div>
546
548
 
547
549
  <div className="px-8 pt-4">
548
- <SeedRows have={have} inks={inks} picks={picks} />
550
+ <SeedRows have={have} faces={faces} picks={picks} />
549
551
  </div>
550
552
 
551
553
  <div className="mt-auto flex items-center gap-3 border-t border-border/60 px-8 py-4">
@@ -563,14 +565,14 @@ function SeedPackage({
563
565
  /** The same offer in a dialog, which brings its own padding and its own footer. */
564
566
  function SeedDialog({
565
567
  have,
566
- inks,
568
+ faces,
567
569
  onDone,
568
570
  }: {
569
571
  have: Set<string>;
570
- inks: string[];
572
+ faces: BotIcon[];
571
573
  onDone: (name: string | null) => void;
572
574
  }) {
573
- const picks = useSeedPicks(have, inks, onDone);
575
+ const picks = useSeedPicks(have, faces, onDone);
574
576
 
575
577
  return (
576
578
  <SettingDialogContent
@@ -578,7 +580,7 @@ function SeedDialog({
578
580
  description="Each one is a starting point — rename it, re-prompt it, give it a model of its own. What a bot needs before it can work stands on its row."
579
581
  footer={<SeedActions picks={picks} onCancel={() => onDone(null)} />}
580
582
  >
581
- <SeedRows have={have} inks={inks} picks={picks} />
583
+ <SeedRows have={have} faces={faces} picks={picks} />
582
584
  </SettingDialogContent>
583
585
  );
584
586
  }
@@ -591,12 +593,12 @@ function SeedDialog({
591
593
  */
592
594
  function SeedInvite({
593
595
  missing,
594
- inks,
596
+ faces,
595
597
  have,
596
598
  onDone,
597
599
  }: {
598
600
  missing: BotSeed[];
599
- inks: string[];
601
+ faces: BotIcon[];
600
602
  have: Set<string>;
601
603
  onDone: (name: string | null) => void;
602
604
  }) {
@@ -611,7 +613,7 @@ function SeedInvite({
611
613
  renderer: ({ close }) => (
612
614
  <SeedDialog
613
615
  have={have}
614
- inks={inks}
616
+ faces={faces}
615
617
  onDone={(name) => {
616
618
  close();
617
619
  onDone(name);
@@ -634,8 +636,7 @@ function SeedInvite({
634
636
  >
635
637
  <BotMark
636
638
  size={20}
637
- {...markProps(seed.name, seed.icon)}
638
- color={inks[BOT_SEEDS.indexOf(seed)]}
639
+ {...markProps(seed.name, faces[BOT_SEEDS.indexOf(seed)])}
639
640
  notify={false}
640
641
  />
641
642
  </span>
@@ -654,6 +655,7 @@ function markProps(name: string, icon?: BotIcon | null) {
654
655
  color: icon?.color,
655
656
  shape: icon?.shape,
656
657
  outline: icon?.outline,
658
+ paint: icon?.paint,
657
659
  };
658
660
  }
659
661
 
@@ -670,7 +672,7 @@ function BotPage({
670
672
  }: {
671
673
  bot?: Bot;
672
674
  /** Recent jobs for this bot (RECENT); empty for a new bot. */
673
- jobs: Task[];
675
+ jobs: Thread[];
674
676
  /** Created or deleted; where the roster should look next. */
675
677
  onDone: (name: string | null) => void;
676
678
  /** New bot only: folds the form. */
@@ -1201,8 +1203,8 @@ function Row({ label, children }: { label: string; children: ReactNode }) {
1201
1203
  );
1202
1204
  }
1203
1205
 
1204
- /** This bot's recent jobs; the full list is in Settings > Tasks. */
1205
- function Recent({ jobs }: { jobs: Task[] }) {
1206
+ /** This bot's recent jobs; the full list is in Settings > Threads. */
1207
+ function Recent({ jobs }: { jobs: Thread[] }) {
1206
1208
  return (
1207
1209
  <div className="pt-1">
1208
1210
  <div className="flex h-6 items-center">
@@ -1210,7 +1212,7 @@ function Recent({ jobs }: { jobs: Task[] }) {
1210
1212
  <span className="flex-1" />
1211
1213
  <button
1212
1214
  type="button"
1213
- onClick={() => openSettings("tasks")}
1215
+ onClick={() => openSettings("threads")}
1214
1216
  className="flex items-center gap-1 rounded-md px-1.5 py-1 font-mono text-[11px] text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-3 focus-visible:ring-ring/50"
1215
1217
  >
1216
1218
  <History className="size-3" />
@@ -1253,14 +1255,14 @@ function Recent({ jobs }: { jobs: Task[] }) {
1253
1255
  );
1254
1256
  }
1255
1257
 
1256
- function jobState(job: Task): { text: string; tone: string } {
1258
+ function jobState(job: Thread): { text: string; tone: string } {
1257
1259
  switch (job.status) {
1258
1260
  case "waiting":
1259
1261
  return { text: "waiting on you", tone: WAITING_INK };
1260
1262
  case "running":
1261
1263
  return { text: "working", tone: "text-muted-foreground" };
1262
- case "failed":
1263
- return { text: "failed", tone: "text-destructive" };
1264
+ case "cancelled":
1265
+ return { text: "stopped", tone: "text-muted-foreground" };
1264
1266
  default:
1265
1267
  return { text: "done", tone: "text-muted-foreground" };
1266
1268
  }
@@ -1285,13 +1287,27 @@ function MarkPicker({
1285
1287
  <BotMark size={112} {...markProps(name, icon)} className="shrink-0" />
1286
1288
 
1287
1289
  {/* MARK_SYSTEM is an explicit "follow the theme ink", distinct from no
1288
- colour; picking the colour already on it goes back to none. */}
1290
+ colour; picking the colour already on it goes back to none. A paint
1291
+ covers the colour without clearing it; picking a colour takes it off. */}
1289
1292
  <MarkPalette
1290
- color={icon.color}
1291
- themePicked={icon.color === MARK_SYSTEM}
1292
- onTheme={() => onChange({ ...icon, color: MARK_SYSTEM })}
1293
+ color={icon.paint ? undefined : icon.color}
1294
+ themePicked={!icon.paint && icon.color === MARK_SYSTEM}
1295
+ onTheme={() =>
1296
+ onChange({ ...icon, paint: undefined, color: MARK_SYSTEM })
1297
+ }
1293
1298
  onPick={(color) =>
1294
- onChange({ ...icon, color: icon.color === color ? undefined : color })
1299
+ onChange({
1300
+ ...icon,
1301
+ paint: undefined,
1302
+ color: !icon.paint && icon.color === color ? undefined : color,
1303
+ })
1304
+ }
1305
+ paint={icon.paint}
1306
+ onPaint={(paint) =>
1307
+ onChange({
1308
+ ...icon,
1309
+ paint: icon.paint === paint ? undefined : paint,
1310
+ })
1295
1311
  }
1296
1312
  />
1297
1313
 
@@ -5,13 +5,11 @@ import {
5
5
  ChevronDown,
6
6
  ExternalLink,
7
7
  FilePen,
8
- Flag,
9
- Globe,
10
- Image as ImageIcon,
11
8
  ListChecks,
12
9
  Loader2,
13
10
  type LucideIcon,
14
11
  MessageSquare,
12
+ PhoneOff,
15
13
  Search,
16
14
  Send,
17
15
  Terminal,
@@ -21,6 +19,7 @@ import { type ComponentType, type ReactNode, useState } from "react";
21
19
  import { queryKey } from "@/app/api/query-key";
22
20
  import { ShinyText } from "@/components/ui/shiny-text";
23
21
  import { Skeleton } from "@/components/ui/skeleton";
22
+ import { TOOL_NAMES } from "@/features/ai/tools/tool-name";
24
23
  import type { ResultPart } from "@/features/bot/bot.schema";
25
24
  import { McpMark } from "@/features/connectors/components/mcp-mark";
26
25
  import { MemoryMark } from "@/features/memory/components/memory-mark";
@@ -28,51 +27,47 @@ import { SkillsMark } from "@/features/skills/components/skills-mark";
28
27
  import { FileLink } from "@/features/workspace/components/file-view";
29
28
  import { useServerRoute } from "@/lib/protocol/use-server-route";
30
29
  import { cn } from "@/lib/utils";
31
- import type { ToolUse } from "../task.store";
30
+ import type { ToolUse } from "../thread.store";
32
31
 
33
32
  /*
34
33
  * Tool calls rendered per tool: TOOL_VIEWS by name, GenericTool for the rest. Results
35
- * arrive with only a few lines (bot.query RESULT_LINES); "Everything" fetches the rest on demand.
34
+ * arrive as a glance (thread.query RESULT_LINES, each line clipped); "Everything"
35
+ * fetches the whole output, and only once it is opened.
36
36
  */
37
37
 
38
38
  type ToolProps = {
39
39
  tool: ToolUse;
40
40
  /** Half of the key for fetching the full result. */
41
- taskId?: string;
41
+ threadId?: string;
42
42
  /** Start folded to the title line. A running tool is always expanded regardless. */
43
43
  collapsed?: boolean;
44
44
  };
45
45
 
46
- export const TOOL_VIEWS: Record<string, ComponentType<ToolProps>> = {
47
- web_search: WebSearchTool,
48
- bash: ShellTool,
49
- fetch: (props) => <MonoTool icon={Globe} {...props} />,
50
- write_file: (props) => <FileTool icon={FilePen} {...props} />,
51
- generate_image: DrawnTool,
46
+ const TOOL_VIEWS: Partial<Record<string, ComponentType<ToolProps>>> = {
47
+ [TOOL_NAMES.web_search]: WebSearchTool,
48
+ [TOOL_NAMES.bash]: ShellTool,
49
+ [TOOL_NAMES.write_file]: (props) => <FileTool icon={FilePen} {...props} />,
52
50
  };
53
51
 
54
52
  /**
55
53
  * Icon per tool, for views with room for one glyph. A tool that belongs to a
56
54
  * domain draws that domain's own mark, so the pill and the nav never disagree.
57
55
  */
58
- const TOOL_ICONS: Record<string, LucideIcon> = {
59
- web_search: Search,
60
- bash: Terminal,
61
- fetch: Globe,
62
- write_file: FilePen,
63
- generate_image: ImageIcon,
64
- memory_recall: MemoryMark,
65
- memory_remember: MemoryMark,
66
- memory_forget: MemoryMark,
67
- load_skill: SkillsMark,
68
- tool_search: McpMark,
69
- tool_call: McpMark,
70
- delegate: Send,
71
- task: ListChecks,
72
- ask_bot: MessageSquare,
73
- ask_back: MessageSquare,
74
- ask_thursday: MessageSquare,
75
- answer: Flag,
56
+ const TOOL_ICONS: Partial<Record<string, LucideIcon>> = {
57
+ [TOOL_NAMES.web_search]: Search,
58
+ [TOOL_NAMES.bash]: Terminal,
59
+ [TOOL_NAMES.write_file]: FilePen,
60
+ [TOOL_NAMES.memory_recall]: MemoryMark,
61
+ [TOOL_NAMES.memory_remember]: MemoryMark,
62
+ [TOOL_NAMES.memory_forget]: MemoryMark,
63
+ [TOOL_NAMES.memory_conversation]: MemoryMark,
64
+ [TOOL_NAMES.load_skill]: SkillsMark,
65
+ [TOOL_NAMES.tool_search]: McpMark,
66
+ [TOOL_NAMES.tool_call]: McpMark,
67
+ [TOOL_NAMES.delegate]: Send,
68
+ [TOOL_NAMES.thread]: ListChecks,
69
+ [TOOL_NAMES.send_message]: MessageSquare,
70
+ [TOOL_NAMES.end_call]: PhoneOff,
76
71
  };
77
72
 
78
73
  export const toolIcon = (name: string): LucideIcon =>
@@ -83,10 +78,10 @@ export function BotTool(props: ToolProps) {
83
78
  return <View {...props} />;
84
79
  }
85
80
 
86
- function WebSearchTool({ tool, taskId, collapsed }: ToolProps) {
81
+ function WebSearchTool({ tool, threadId, collapsed }: ToolProps) {
87
82
  const hits = texts(tool.results);
88
83
  return (
89
- <Frame tool={tool} taskId={taskId} icon={Search} collapsed={collapsed}>
84
+ <Frame tool={tool} threadId={threadId} icon={Search} collapsed={collapsed}>
90
85
  <p className="px-3 pt-1 pb-1.5 text-[13px] leading-snug break-keep">
91
86
  “{tool.input}”
92
87
  </p>
@@ -107,10 +102,15 @@ function WebSearchTool({ tool, taskId, collapsed }: ToolProps) {
107
102
  );
108
103
  }
109
104
 
110
- function ShellTool({ tool, taskId, collapsed }: ToolProps) {
105
+ function ShellTool({ tool, threadId, collapsed }: ToolProps) {
111
106
  const out = texts(tool.results);
112
107
  return (
113
- <Frame tool={tool} taskId={taskId} icon={Terminal} collapsed={collapsed}>
108
+ <Frame
109
+ tool={tool}
110
+ threadId={threadId}
111
+ icon={Terminal}
112
+ collapsed={collapsed}
113
+ >
114
114
  <pre className="mx-3 overflow-x-auto rounded-lg bg-foreground/5 px-2.5 py-1.5 font-mono text-[11px] leading-relaxed scrollbar-none dark:bg-black/25">
115
115
  <span className="text-muted-foreground/60">$ </span>
116
116
  {tool.input}
@@ -122,39 +122,22 @@ function ShellTool({ tool, taskId, collapsed }: ToolProps) {
122
122
  );
123
123
  }
124
124
 
125
- /** A path or url and what was read from it. */
126
- function MonoTool({
127
- icon,
128
- tool,
129
- taskId,
130
- collapsed,
131
- }: ToolProps & { icon: LucideIcon }) {
132
- return (
133
- <Frame tool={tool} taskId={taskId} icon={icon} collapsed={collapsed}>
134
- <p className="truncate px-3 pt-1 pb-1.5 font-mono text-[11px]">
135
- {tool.input}
136
- </p>
137
- <Lines lines={texts(tool.results)} mono />
138
- </Frame>
139
- );
140
- }
141
-
142
125
  const OPEN_BUTTON =
143
126
  "flex shrink-0 items-center gap-1 rounded-md px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground outline-none transition-colors hover:bg-background hover:text-foreground focus-visible:ring-3 focus-visible:ring-ring/50 disabled:opacity-50";
144
127
 
145
128
  /**
146
129
  * A file the bot read or wrote, with an Open link. Opens `tool.path`: `input` is folded
147
- * to one line, and a truncated path is a 404 (task.query LINE_MAX).
130
+ * to one line, and a truncated path is a 404 (thread.query LINE_MAX).
148
131
  */
149
132
  function FileTool({
150
133
  icon,
151
134
  tool,
152
- taskId,
135
+ threadId,
153
136
  collapsed,
154
137
  }: ToolProps & { icon: LucideIcon }) {
155
138
  const path = tool.path ?? tool.input;
156
139
  return (
157
- <Frame tool={tool} taskId={taskId} icon={icon} collapsed={collapsed}>
140
+ <Frame tool={tool} threadId={threadId} icon={icon} collapsed={collapsed}>
158
141
  <div className="flex items-center gap-2 px-3 pt-1 pb-1.5">
159
142
  <span className="min-w-0 flex-1 truncate font-mono text-[11px]">
160
143
  {tool.input}
@@ -169,35 +152,12 @@ function FileTool({
169
152
  );
170
153
  }
171
154
 
172
- /** A generated image. The path is the first result line, not the input: the name is made while generating. */
173
- function DrawnTool({ tool, taskId, collapsed }: ToolProps) {
174
- const [path] = texts(tool.results);
175
- return (
176
- <Frame tool={tool} taskId={taskId} icon={ImageIcon} collapsed={collapsed}>
177
- <p className="px-3 pt-1 text-[12px] leading-snug break-keep">
178
- {tool.input}
179
- </p>
180
- {path && (
181
- <div className="flex items-center gap-2 px-3 pt-1 pb-1.5">
182
- <span className="min-w-0 flex-1 truncate font-mono text-[11px] text-muted-foreground">
183
- {path}
184
- </span>
185
- <FileLink path={path} label={`Open ${path}`} className={OPEN_BUTTON}>
186
- <ExternalLink className="size-3" />
187
- Open
188
- </FileLink>
189
- </div>
190
- )}
191
- </Frame>
192
- );
193
- }
194
-
195
155
  /** Anything without a view of its own, MCP tools included. */
196
- function GenericTool({ tool, taskId, collapsed }: ToolProps) {
156
+ function GenericTool({ tool, threadId, collapsed }: ToolProps) {
197
157
  return (
198
158
  <Frame
199
159
  tool={tool}
200
- taskId={taskId}
160
+ threadId={threadId}
201
161
  icon={toolIcon(tool.name)}
202
162
  collapsed={collapsed}
203
163
  >
@@ -211,12 +171,12 @@ function GenericTool({ tool, taskId, collapsed }: ToolProps) {
211
171
 
212
172
  /**
213
173
  * The shell every tool view sits in: a one-line step (icon, label, call, tool name,
214
- * state) with the body below it. A running tool is always expanded; a truncated
215
- * result gets "Everything" at the bottom.
174
+ * state) with the body below it. A running tool is always expanded; a finished one
175
+ * that returned anything gets "Everything" at the bottom.
216
176
  */
217
177
  function Frame({
218
178
  tool,
219
- taskId,
179
+ threadId,
220
180
  icon: Icon,
221
181
  collapsed = false,
222
182
  children,
@@ -224,7 +184,9 @@ function Frame({
224
184
  const running = tool.results === undefined;
225
185
  const [open, setOpen] = useState(!collapsed);
226
186
  const shown = open || running;
227
- const more = tool.more && taskId && tool.callId;
187
+ // The glance is text only and clipped, so any output can be opened whole
188
+ const whole =
189
+ threadId && tool.callId && ((tool.results?.length ?? 0) > 0 || tool.more);
228
190
 
229
191
  return (
230
192
  <div
@@ -294,8 +256,8 @@ function Frame({
294
256
  {shown && (
295
257
  <div className="pb-1.5 pl-[1.625rem]">
296
258
  {children}
297
- {more && (
298
- <Everything taskId={taskId} callId={tool.callId as string} />
259
+ {whole && (
260
+ <Everything threadId={threadId} callId={tool.callId as string} />
299
261
  )}
300
262
  </div>
301
263
  )}
@@ -304,10 +266,16 @@ function Frame({
304
266
  }
305
267
 
306
268
  /** The rest of a truncated result, fetched only when opened. */
307
- function Everything({ taskId, callId }: { taskId: string; callId: string }) {
269
+ function Everything({
270
+ threadId,
271
+ callId,
272
+ }: {
273
+ threadId: string;
274
+ callId: string;
275
+ }) {
308
276
  const [open, setOpen] = useState(false);
309
277
  const { data, isLoading } = useServerRoute<ResultPart[]>(
310
- open ? queryKey.toolResult(taskId, callId) : null,
278
+ open ? queryKey.toolResult(threadId, callId) : null,
311
279
  );
312
280
 
313
281
  return (