thursday-agent 0.4.0 → 0.6.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 (657) 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 +6 -5
  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 +5 -5
  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 +13 -13
  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 +10 -11
  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 -4
  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 +10 -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]__02846fb._.js +8 -0
  92. package/.next/server/chunks/[root-of-the-server]__049f521._.js +3 -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]__07bnah_._.js +3 -0
  96. package/.next/server/chunks/[root-of-the-server]__08eae20._.js +8 -0
  97. package/.next/server/chunks/[root-of-the-server]__0_ue8oe._.js +3 -0
  98. package/.next/server/chunks/[root-of-the-server]__0c9fgca._.js +5 -0
  99. package/.next/server/chunks/[root-of-the-server]__0g-ueei._.js +8 -0
  100. package/.next/server/chunks/[root-of-the-server]__0h_x6q6._.js +5 -0
  101. package/.next/server/chunks/{[root-of-the-server]__0pa2n68._.js → [root-of-the-server]__0kxrvxf._.js} +2 -2
  102. package/.next/server/chunks/{[root-of-the-server]__0q0vvt2._.js → [root-of-the-server]__0ov3iir._.js} +2 -2
  103. package/.next/server/chunks/[root-of-the-server]__0qwtlmx._.js +8 -0
  104. package/.next/server/chunks/[root-of-the-server]__0sm5xvm._.js +3 -0
  105. package/.next/server/chunks/[root-of-the-server]__0ye3da2._.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/_1kg70wc._.js +3 -3
  150. package/.next/server/chunks/_1klbcft._.js +5 -0
  151. package/.next/server/chunks/_1krd9rf._.js +4 -1
  152. package/.next/server/chunks/_1kwmzab._.js +3 -0
  153. package/.next/server/chunks/{_1pf4qe-._.js → _1oxj9fa._.js} +1 -1
  154. package/.next/server/chunks/{_1f46eie._.js → _1pcmdbb._.js} +1 -1
  155. package/.next/server/chunks/_1qgix-j._.js +3 -0
  156. package/.next/server/chunks/{lib_logger_ts_1exwjut._.js → _1rpchta._.js} +5 -5
  157. package/.next/server/chunks/_1vsej-s._.js +5 -0
  158. package/.next/server/chunks/_1yx0p_s._.js +5 -0
  159. package/.next/server/chunks/{_0rnf-6n._.js → _20fsr_z._.js} +6 -6
  160. package/.next/server/chunks/_2128hkj._.js +5 -0
  161. package/.next/server/chunks/_next-internal_server_app_api_bot_thread_[id]_route_actions_1fstjn2.js +3 -0
  162. package/.next/server/chunks/_next-internal_server_app_api_bot_thread_route_actions_003ccso.js +3 -0
  163. package/.next/server/chunks/_next-internal_server_app_api_workspace_missing_route_actions_1fidi6p.js +3 -0
  164. package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
  165. package/.next/server/chunks/features_0-cnt0l._.js +4 -0
  166. package/.next/server/chunks/features_0hdaci0._.js +4 -0
  167. package/.next/server/chunks/features_1e39j7-._.js +8 -0
  168. package/.next/server/chunks/features_bot_bot_query_ts_12mgkl2._.js +1 -1
  169. package/.next/server/chunks/features_memory_1uqvksn._.js +1 -1
  170. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0r28-sm._.js → node_modules_consola_dist_chunks_prompt_mjs_0a7-pbw._.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_0gzvgfv._.js} +1 -1
  172. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0i7cvml._.js → node_modules_consola_dist_chunks_prompt_mjs_107pxfn._.js} +1 -1
  173. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0icqaqw._.js → node_modules_consola_dist_chunks_prompt_mjs_15hbel8._.js} +1 -1
  174. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_18i-23e._.js +3 -0
  175. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1bewgf3._.js +3 -0
  176. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1kipdeo._.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]__09q9med._.js +1 -1
  185. package/.next/server/chunks/ssr/[root-of-the-server]__0bxsfyn._.js +101 -0
  186. package/.next/server/chunks/ssr/[root-of-the-server]__0lyi8i2._.js +1 -1
  187. package/.next/server/chunks/ssr/[root-of-the-server]__16jc196._.js +1 -1
  188. package/.next/server/chunks/ssr/[root-of-the-server]__172cq4x._.js +3 -0
  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]__1fll8dc._.js +3 -0
  192. package/.next/server/chunks/ssr/[root-of-the-server]__1mzi-ju._.js +1 -1
  193. package/.next/server/chunks/ssr/[root-of-the-server]__1nygfik._.js +5 -0
  194. package/.next/server/chunks/ssr/[root-of-the-server]__1sdphb0._.js +8 -0
  195. package/.next/server/chunks/ssr/[root-of-the-server]__1waa3rc._.js +100 -0
  196. package/.next/server/chunks/ssr/_00rehl_._.js +3 -0
  197. package/.next/server/chunks/ssr/{_1lz_cq2._.js → _02oc_h5._.js} +76 -89
  198. package/.next/server/chunks/ssr/_03_928f._.js +3 -0
  199. package/.next/server/chunks/ssr/_05yghx6._.js +3 -0
  200. package/.next/server/chunks/ssr/_08c4z-9._.js +3 -0
  201. package/.next/server/chunks/ssr/_0_qfdlw._.js +4 -0
  202. package/.next/server/chunks/ssr/_0c9e5w6._.js +9 -0
  203. package/.next/server/chunks/ssr/{_0s99bgb._.js → _0dh2e1j._.js} +9 -3
  204. package/.next/server/chunks/ssr/_0dr-ddg._.js +3 -0
  205. package/.next/server/chunks/ssr/_0eaog6_._.js +3 -0
  206. package/.next/server/chunks/ssr/_0evkpto._.js +3 -0
  207. package/.next/server/chunks/ssr/_0g_rlog._.js +3 -0
  208. package/.next/server/chunks/ssr/_0geg212._.js +3 -0
  209. package/.next/server/chunks/ssr/{_1gd8q8l._.js → _0hxt2ul._.js} +2 -2
  210. package/.next/server/chunks/ssr/_0i_6q1w._.js +2 -2
  211. package/.next/server/chunks/ssr/_0lu1n_x._.js +1 -1
  212. package/.next/server/chunks/ssr/{_15j2_8f._.js → _0wzaht-._.js} +2 -2
  213. package/.next/server/chunks/ssr/_0z-g0uy._.js +3 -0
  214. package/.next/server/chunks/ssr/_123ttsf._.js +3 -0
  215. package/.next/server/chunks/ssr/_123y-ah._.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/{_0ap2fzn._.js → _16c6_xm._.js} +2 -2
  219. package/.next/server/chunks/ssr/_18opah7._.js +3 -0
  220. package/.next/server/chunks/ssr/_18xqmny._.js +3 -0
  221. package/.next/server/chunks/ssr/_1_krfph._.js +3 -0
  222. package/.next/server/chunks/ssr/{_1-_etts._.js → _1anqots._.js} +2 -2
  223. package/.next/server/chunks/ssr/_1ey7qn-._.js +70 -0
  224. package/.next/server/chunks/ssr/_1g9vs7q._.js +3 -0
  225. package/.next/server/chunks/ssr/_1jmz33w._.js +3 -0
  226. package/.next/server/chunks/ssr/{_0n3toaw._.js → _1k0spz7._.js} +2 -2
  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/{_1fojd41._.js → _1x9pskj._.js} +3 -3
  230. package/.next/server/chunks/ssr/_1y6b5mr._.js +101 -0
  231. package/.next/server/chunks/ssr/_1ztk7p6._.js +7 -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/{_1-teee5._.js → lib_logger_ts_0-olsze._.js} +2 -7
  237. package/.next/server/chunks/ssr/{node_modules_0cxaxk9._.js → node_modules_00_51_v._.js} +1 -1
  238. package/.next/server/chunks/ssr/{node_modules_04jf_m8._.js → node_modules_022sipm._.js} +1 -1
  239. package/.next/server/chunks/ssr/{node_modules_0g7fzk3._.js → node_modules_0332gw4._.js} +1 -1
  240. package/.next/server/chunks/ssr/{node_modules_1cx_ql6._.js → node_modules_04vxchl._.js} +1 -1
  241. package/.next/server/chunks/ssr/{node_modules_1vh5ntv._.js → node_modules_0746rzi._.js} +1 -1
  242. package/.next/server/chunks/ssr/{node_modules_0yugy6m._.js → node_modules_0d5uzof._.js} +1 -1
  243. package/.next/server/chunks/ssr/{node_modules_09q35v_._.js → node_modules_0exkwcm._.js} +1 -1
  244. package/.next/server/chunks/ssr/{node_modules_08dhkiq._.js → node_modules_0fr-ml8._.js} +1 -1
  245. package/.next/server/chunks/ssr/{node_modules_14q6g4n._.js → node_modules_0mxvg8h._.js} +1 -1
  246. package/.next/server/chunks/ssr/{node_modules_0arus10._.js → node_modules_0qapgjr._.js} +1 -1
  247. package/.next/server/chunks/ssr/{node_modules_1eg7m6c._.js → node_modules_0qbfyjh._.js} +1 -1
  248. package/.next/server/chunks/ssr/{node_modules_1cz2hle._.js → node_modules_0t-9nup._.js} +1 -1
  249. package/.next/server/chunks/ssr/{node_modules_17bwo43._.js → node_modules_0tusx4d._.js} +3 -3
  250. package/.next/server/chunks/ssr/{node_modules_1efrqxi._.js → node_modules_0vsxbzp._.js} +1 -1
  251. package/.next/server/chunks/ssr/{node_modules_0_-_a--._.js → node_modules_0vv0-fg._.js} +1 -1
  252. package/.next/server/chunks/ssr/{node_modules_1gdh31p._.js → node_modules_0wsvp00._.js} +1 -1
  253. package/.next/server/chunks/ssr/{node_modules_1hpopmo._.js → node_modules_1-urho9._.js} +1 -1
  254. package/.next/server/chunks/ssr/{node_modules_1_pc9kq._.js → node_modules_16pi_dd._.js} +1 -1
  255. package/.next/server/chunks/ssr/{node_modules_00etblx._.js → node_modules_1d53yiq._.js} +1 -1
  256. package/.next/server/chunks/ssr/{node_modules_1aaxuef._.js → node_modules_1g1eihe._.js} +1 -1
  257. package/.next/server/chunks/ssr/{node_modules_198nmll._.js → node_modules_1gpednh._.js} +1 -1
  258. package/.next/server/chunks/ssr/{node_modules_0pvd7q-._.js → node_modules_1gu1pph._.js} +1 -1
  259. package/.next/server/chunks/ssr/{node_modules_0b__sgl._.js → node_modules_1he1w8_._.js} +1 -1
  260. package/.next/server/chunks/ssr/{node_modules_1qpjvy5._.js → node_modules_1lnjapm._.js} +1 -1
  261. package/.next/server/chunks/ssr/{node_modules_0940ns5._.js → node_modules_1lynj9m._.js} +1 -1
  262. package/.next/server/chunks/ssr/{node_modules_0x3-ply._.js → node_modules_1seuurl._.js} +2 -2
  263. package/.next/server/chunks/ssr/{node_modules_14om4ar._.js → node_modules_1u6w1pb._.js} +1 -1
  264. package/.next/server/chunks/ssr/{node_modules_0had7xd._.js → node_modules_1xn6saw._.js} +1 -1
  265. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1b748ic._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_067_exa._.js} +1 -1
  266. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1z4hm5e._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0nrrdaq._.js} +1 -1
  267. package/.next/server/chunks/ssr/{node_modules_@vercel_oidc_dist_06mk8id._.js → node_modules_@vercel_oidc_dist_21a5haa._.js} +1 -1
  268. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_trash_mjs_0px2gzr._.js +3 -0
  269. package/.next/server/middleware-build-manifest.js +3 -3
  270. package/.next/server/pages/404.html +1 -1
  271. package/.next/server/pages/500.html +1 -1
  272. package/.next/server/server-reference-manifest.js +1 -1
  273. package/.next/server/server-reference-manifest.json +68 -46
  274. package/.next/static/chunks/0dr16v67vj4n7.js +2 -0
  275. package/.next/static/chunks/0g4b348l0pve7.js +1 -0
  276. package/.next/static/chunks/0joan-69kbspd.js +1 -0
  277. package/.next/static/chunks/0vlgzqo9ka90v.js +1 -0
  278. package/.next/static/chunks/0zrupxgci5gqc.js +1 -0
  279. package/.next/static/chunks/10k2xvap03z20.css +1 -0
  280. package/.next/static/chunks/18mkhstgiqcbt.js +1 -0
  281. package/.next/static/chunks/{15m575979un5f.js → 1i-u2wzub_to1.js} +2 -2
  282. package/.next/static/chunks/1kp5nfp06nj9h.js +5 -0
  283. package/.next/static/chunks/1ohslk4568tm3.js +1 -0
  284. package/.next/static/chunks/1sbmwswc9k2-1.js +1 -0
  285. package/.next/static/chunks/1t9qms5pwwa3n.js +1 -0
  286. package/.next/static/chunks/1vj_5bnbxx84e.js +1 -0
  287. package/.next/static/chunks/1vqezbhjm3goq.js +1 -0
  288. package/.next/static/chunks/{3akmqm77muj4-.js → 1wlo979mx-y3w.js} +1 -1
  289. package/.next/static/chunks/26ql4y-43xwhp.js +1 -0
  290. package/.next/static/chunks/{0fl3gwe4-l6tz.js → 2_pnccjp6j1ca.js} +1 -1
  291. package/.next/static/chunks/2a51-ywz9b2a3.js +1 -0
  292. package/.next/static/chunks/2fvdgxih7x7hr.js +1 -0
  293. package/.next/static/chunks/2jlz8zp4jax_m.js +18 -0
  294. package/.next/static/chunks/2nvepds1fu2ux.js +1 -0
  295. package/.next/static/chunks/3addj3i4-izma.js +1 -0
  296. package/.next/static/chunks/3bfwpww3m3x4u.js +1 -0
  297. package/.next/static/chunks/3gfh7nxwusbt0.js +1 -0
  298. package/.next/static/chunks/3gwa44cvz4qoi.js +1 -0
  299. package/.next/static/chunks/{38gweqdo4jpfj.js → 3izg0a3k87q1-.js} +5 -5
  300. package/.next/static/chunks/3zk6q3-3f9swq.js +99 -0
  301. package/.next/static/chunks/3zkg5iup3v4a2.js +12 -0
  302. package/.next/static/chunks/405m0bqtoihev.js +1 -0
  303. package/.next/static/chunks/42wcg3wfg_m_p.js +1 -0
  304. package/README.md +27 -216
  305. package/app/api/events/app-event.ts +6 -4
  306. package/app/api/query-key.ts +25 -16
  307. package/bin/database.mjs +37 -0
  308. package/bin/thursday.mjs +44 -28
  309. package/components/ui/custom-icon.tsx +0 -60
  310. package/components/ui/radio-group.tsx +37 -0
  311. package/components/ui/shiny-text.tsx +33 -6
  312. package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/migration.sql +80 -24
  313. package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/snapshot.json +689 -110
  314. package/database/migrations/20260916160713_thread_cancelled/migration.sql +2 -0
  315. package/database/migrations/{20260911030320_opposite_jack_power → 20260916160713_thread_cancelled}/snapshot.json +706 -84
  316. package/docs/how-it-works.md +39 -36
  317. package/docs/images/keeps-going.png +0 -0
  318. package/docs/images/two-minds.png +0 -0
  319. package/docs/live-calls.md +231 -0
  320. package/docs/thread-rooms.md +71 -0
  321. package/features/ai/chatgpt.ts +1 -2
  322. package/features/ai/live.schema.ts +128 -0
  323. package/features/ai/load-tools.ts +148 -77
  324. package/features/ai/model.schema.ts +2 -120
  325. package/features/ai/model.ts +52 -88
  326. package/features/ai/prompts/bot.prompt.ts +91 -214
  327. package/features/ai/prompts/live.prompt.ts +265 -0
  328. package/features/ai/prompts/prompt-helper.ts +91 -32
  329. package/features/ai/prompts/thursday.prompt.ts +125 -172
  330. package/features/ai/tools/bot.tool.ts +38 -145
  331. package/features/ai/tools/call.tool.ts +1 -1
  332. package/features/ai/tools/connected.ts +5 -3
  333. package/features/ai/tools/mcp.tool.ts +7 -4
  334. package/features/ai/tools/memory.tool.ts +35 -31
  335. package/features/ai/tools/skills.tool.ts +36 -14
  336. package/features/ai/tools/studio.tool.ts +26 -21
  337. package/features/ai/tools/tool-name.ts +2 -5
  338. package/features/ai/tools/workspace.tool.ts +33 -10
  339. package/features/artifact/artifact.action.ts +2 -2
  340. package/features/artifact/artifact.query.ts +112 -61
  341. package/features/artifact/artifact.schema.ts +8 -6
  342. package/features/artifact/components/artifact-setting.tsx +83 -33
  343. package/features/bot/bot.action.ts +43 -36
  344. package/features/bot/bot.memory.ts +137 -20
  345. package/features/bot/bot.query.ts +28 -11
  346. package/features/bot/bot.run.ts +299 -636
  347. package/features/bot/bot.runner.ts +468 -844
  348. package/features/bot/bot.schema.ts +93 -82
  349. package/features/bot/bot.seed.ts +141 -64
  350. package/features/bot/components/bot-mark.tsx +324 -232
  351. package/features/bot/components/bot-room.tsx +1613 -697
  352. package/features/bot/components/bot-roster.tsx +8 -13
  353. package/features/bot/components/bot-setting.tsx +58 -42
  354. package/features/bot/components/bot-tool.tsx +55 -87
  355. package/features/bot/components/mark-palette.tsx +35 -32
  356. package/features/bot/components/path-chips.tsx +33 -3
  357. package/features/bot/components/thread-badge.tsx +34 -0
  358. package/features/bot/components/thread-reply.tsx +639 -0
  359. package/features/bot/components/thread-setting.tsx +674 -0
  360. package/features/bot/mark.const.ts +79 -31
  361. package/features/bot/room.query.ts +889 -0
  362. package/features/bot/room.schema.ts +64 -0
  363. package/features/bot/seed-bots.ts +2 -1
  364. package/features/bot/thread.query.ts +971 -0
  365. package/features/bot/thread.store.ts +587 -0
  366. package/features/config/components/voice-key.tsx +113 -88
  367. package/features/config/config.const.ts +5 -9
  368. package/features/connectors/mcp.schema.ts +0 -2
  369. package/features/intro/components/intro.tsx +169 -139
  370. package/features/memory/components/memory-setting.tsx +2 -7
  371. package/features/memory/memory.schema.ts +14 -23
  372. package/features/settings/components/setting-ui.tsx +0 -44
  373. package/features/settings/components/settings.tsx +12 -12
  374. package/features/settings/settings.alert.ts +3 -3
  375. package/features/settings/settings.store.ts +1 -1
  376. package/features/skills/skills.schema.ts +0 -2
  377. package/features/thursday/components/ascii-field.tsx +24 -44
  378. package/features/thursday/components/ascii-orb.tsx +359 -358
  379. package/features/thursday/components/call-log.tsx +46 -44
  380. package/features/thursday/components/face.tsx +35 -10
  381. package/features/thursday/components/tab-state.tsx +3 -3
  382. package/features/thursday/components/thursday-mark.tsx +1 -0
  383. package/features/thursday/components/thursday-setting.tsx +631 -332
  384. package/features/thursday/components/thursday.tsx +106 -41
  385. package/features/thursday/components/voice-picker.tsx +255 -0
  386. package/features/thursday/thursday.action.ts +94 -68
  387. package/features/thursday/thursday.query.ts +49 -30
  388. package/features/thursday/thursday.schema.ts +27 -30
  389. package/features/thursday/thursday.store.ts +11 -7
  390. package/features/thursday/tool-call.ts +3 -3
  391. package/features/thursday/tool-line.ts +5 -3
  392. package/features/thursday/use-thursday.ts +725 -450
  393. package/features/workspace/workspace.query.ts +17 -0
  394. package/features/workspace/workspace.ts +103 -50
  395. package/lib/live/live.schema.ts +47 -0
  396. package/lib/live/live.server.ts +155 -0
  397. package/lib/live/live.session.ts +574 -0
  398. package/lib/{realtime/realtime.tap.ts → live/live.tap.ts} +41 -12
  399. package/lib/live/live.transport.ts +152 -0
  400. package/lib/protocol/use-server-pages.ts +9 -5
  401. package/lib/utils.ts +21 -20
  402. package/package.json +2 -2
  403. package/public/voices/alloy.ogg +0 -0
  404. package/public/voices/ash.ogg +0 -0
  405. package/public/voices/ballad.ogg +0 -0
  406. package/public/voices/beacon.ogg +0 -0
  407. package/public/voices/bossa.ogg +0 -0
  408. package/public/voices/cedar.ogg +0 -0
  409. package/public/voices/cinder.ogg +0 -0
  410. package/public/voices/coral.ogg +0 -0
  411. package/public/voices/delta.ogg +0 -0
  412. package/public/voices/echo.ogg +0 -0
  413. package/public/voices/gleam.ogg +0 -0
  414. package/public/voices/marin.ogg +0 -0
  415. package/public/voices/meridian.ogg +0 -0
  416. package/public/voices/quartz.ogg +0 -0
  417. package/public/voices/ripple.ogg +0 -0
  418. package/public/voices/sage.ogg +0 -0
  419. package/public/voices/shimmer.ogg +0 -0
  420. package/public/voices/stone.ogg +0 -0
  421. package/public/voices/tempo.ogg +0 -0
  422. package/public/voices/verse.ogg +0 -0
  423. package/public/voices/vesper.ogg +0 -0
  424. package/public/voices/willow.ogg +0 -0
  425. package/scripts/artifact-paths.test.mts +25 -0
  426. package/scripts/bot-context.test.mts +1408 -0
  427. package/scripts/live-history.test.mts +115 -0
  428. package/scripts/live-session.test.mts +948 -0
  429. package/server.js +1 -1
  430. package/skills/browser/SKILL.md +17 -6
  431. package/skills/computer/SKILL.md +1 -1
  432. package/skills/find-skills/SKILL.md +3 -8
  433. package/skills/interactive-page/SKILL.md +12 -7
  434. package/skills/interactive-page/references/diagram.md +89 -0
  435. package/skills/interactive-page/scripts/archify/LICENSE +22 -0
  436. package/skills/interactive-page/scripts/archify/README.md +25 -0
  437. package/skills/interactive-page/scripts/archify/assets/JetBrainsMono-OFL.txt +93 -0
  438. package/skills/interactive-page/scripts/archify/assets/template.html +14934 -0
  439. package/skills/interactive-page/scripts/archify/bin/archify.mjs +2126 -0
  440. package/skills/interactive-page/scripts/archify/bin/open-artifact.mjs +86 -0
  441. package/skills/interactive-page/scripts/archify/bin/preview.mjs +653 -0
  442. package/skills/interactive-page/scripts/archify/bin/visual-check.mjs +829 -0
  443. package/skills/interactive-page/scripts/archify/delta/architecture-delta.mjs +1223 -0
  444. package/skills/interactive-page/scripts/archify/examples/agent-run.lifecycle.json +60 -0
  445. package/skills/interactive-page/scripts/archify/examples/agent-tool-call.workflow.json +94 -0
  446. package/skills/interactive-page/scripts/archify/examples/async-job-roundtrip.sequence.json +61 -0
  447. package/skills/interactive-page/scripts/archify/examples/cache-miss-request.sequence.json +82 -0
  448. package/skills/interactive-page/scripts/archify/examples/checkout-platform.base.architecture.json +31 -0
  449. package/skills/interactive-page/scripts/archify/examples/checkout-platform.head.architecture.json +31 -0
  450. package/skills/interactive-page/scripts/archify/examples/deployment-release.lifecycle.json +49 -0
  451. package/skills/interactive-page/scripts/archify/examples/event-stream.dataflow.json +57 -0
  452. package/skills/interactive-page/scripts/archify/examples/incident-response.workflow.json +64 -0
  453. package/skills/interactive-page/scripts/archify/examples/product-analytics.dataflow.json +76 -0
  454. package/skills/interactive-page/scripts/archify/examples/production-deployment.architecture.json +71 -0
  455. package/skills/interactive-page/scripts/archify/examples/release-delivery.workflow.json +62 -0
  456. package/skills/interactive-page/scripts/archify/examples/web-app.architecture.json +46 -0
  457. package/skills/interactive-page/scripts/archify/migrations/workflow-v2.mjs +279 -0
  458. package/skills/interactive-page/scripts/archify/recipes/scenarios.mjs +284 -0
  459. package/skills/interactive-page/scripts/archify/references/authoring-contract.md +243 -0
  460. package/skills/interactive-page/scripts/archify/references/delivery-contract.md +120 -0
  461. package/skills/interactive-page/scripts/archify/references/viewer-runtime.md +45 -0
  462. package/skills/interactive-page/scripts/archify/renderers/architecture/grid.mjs +62 -0
  463. package/skills/interactive-page/scripts/archify/renderers/architecture/render-architecture.mjs +1078 -0
  464. package/skills/interactive-page/scripts/archify/renderers/dataflow/README.md +104 -0
  465. package/skills/interactive-page/scripts/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  466. package/skills/interactive-page/scripts/archify/renderers/lifecycle/README.md +115 -0
  467. package/skills/interactive-page/scripts/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  468. package/skills/interactive-page/scripts/archify/renderers/sequence/README.md +114 -0
  469. package/skills/interactive-page/scripts/archify/renderers/sequence/render-sequence.mjs +464 -0
  470. package/skills/interactive-page/scripts/archify/renderers/shared/brand-marks.mjs +563 -0
  471. package/skills/interactive-page/scripts/archify/renderers/shared/cli.mjs +218 -0
  472. package/skills/interactive-page/scripts/archify/renderers/shared/desktop-readability.mjs +26 -0
  473. package/skills/interactive-page/scripts/archify/renderers/shared/diagnostics.mjs +127 -0
  474. package/skills/interactive-page/scripts/archify/renderers/shared/engineering-profiles.mjs +157 -0
  475. package/skills/interactive-page/scripts/archify/renderers/shared/generated-brand-marks.mjs +3 -0
  476. package/skills/interactive-page/scripts/archify/renderers/shared/generated-validators.mjs +13 -0
  477. package/skills/interactive-page/scripts/archify/renderers/shared/geometry.mjs +1423 -0
  478. package/skills/interactive-page/scripts/archify/renderers/shared/i18n.mjs +595 -0
  479. package/skills/interactive-page/scripts/archify/renderers/shared/layout-report.mjs +40 -0
  480. package/skills/interactive-page/scripts/archify/renderers/shared/legend.mjs +217 -0
  481. package/skills/interactive-page/scripts/archify/renderers/shared/output-path.mjs +340 -0
  482. package/skills/interactive-page/scripts/archify/renderers/shared/repository-evidence.mjs +238 -0
  483. package/skills/interactive-page/scripts/archify/renderers/shared/repository-location.mjs +58 -0
  484. package/skills/interactive-page/scripts/archify/renderers/shared/text-fit.mjs +49 -0
  485. package/skills/interactive-page/scripts/archify/renderers/shared/utils.mjs +232 -0
  486. package/skills/interactive-page/scripts/archify/renderers/shared/validator.mjs +86 -0
  487. package/skills/interactive-page/scripts/archify/renderers/workflow/README.md +223 -0
  488. package/skills/interactive-page/scripts/archify/renderers/workflow/render-workflow.mjs +35 -0
  489. package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  490. package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  491. package/skills/interactive-page/scripts/archify/schemas/README.md +211 -0
  492. package/skills/interactive-page/scripts/archify/schemas/architecture.schema.json +178 -0
  493. package/skills/interactive-page/scripts/archify/schemas/common.schema.json +115 -0
  494. package/skills/interactive-page/scripts/archify/schemas/dataflow.schema.json +243 -0
  495. package/skills/interactive-page/scripts/archify/schemas/lifecycle.schema.json +266 -0
  496. package/skills/interactive-page/scripts/archify/schemas/sequence.schema.json +223 -0
  497. package/skills/interactive-page/scripts/archify/schemas/workflow.schema.json +428 -0
  498. package/skills/interactive-page/scripts/archify/scripts/check-render-output.mjs +916 -0
  499. package/skills/interactive-page/scripts/archify/scripts/render-examples.mjs +26 -0
  500. package/skills/interactive-page/scripts/bundle-artifact.sh +9 -8
  501. package/skills/skill-creator/SKILL.md +4 -5
  502. package/.next/server/app/api/bot/task/[id]/route/app-paths-manifest.json +0 -3
  503. package/.next/server/app/api/bot/task/[id]/route.js +0 -16
  504. package/.next/server/app/api/bot/task/[id]/route.js.nft.json +0 -1
  505. package/.next/server/app/api/bot/task/[id]/route_client-reference-manifest.js +0 -3
  506. package/.next/server/app/api/bot/task/route/app-paths-manifest.json +0 -3
  507. package/.next/server/app/api/bot/task/route.js +0 -16
  508. package/.next/server/app/api/bot/task/route.js.nft.json +0 -1
  509. package/.next/server/app/api/bot/task/route_client-reference-manifest.js +0 -3
  510. package/.next/server/chunks/[root-of-the-server]__01dkp4a._.js +0 -3
  511. package/.next/server/chunks/[root-of-the-server]__02va5wz._.js +0 -3
  512. package/.next/server/chunks/[root-of-the-server]__02xjoto._.js +0 -3
  513. package/.next/server/chunks/[root-of-the-server]__04q--0f._.js +0 -8
  514. package/.next/server/chunks/[root-of-the-server]__0bl-e63._.js +0 -3
  515. package/.next/server/chunks/[root-of-the-server]__0ffbg85._.js +0 -3
  516. package/.next/server/chunks/[root-of-the-server]__0jq4ohy._.js +0 -8
  517. package/.next/server/chunks/[root-of-the-server]__0ls6_8y._.js +0 -8
  518. package/.next/server/chunks/[root-of-the-server]__0ncs9uu._.js +0 -3
  519. package/.next/server/chunks/[root-of-the-server]__1-ga0kh._.js +0 -5
  520. package/.next/server/chunks/[root-of-the-server]__11n256_._.js +0 -5
  521. package/.next/server/chunks/[root-of-the-server]__12cabg9._.js +0 -3
  522. package/.next/server/chunks/[root-of-the-server]__1339jnv._.js +0 -8
  523. package/.next/server/chunks/[root-of-the-server]__18_teo8._.js +0 -8
  524. package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +0 -5
  525. package/.next/server/chunks/[root-of-the-server]__1anc1p9._.js +0 -3
  526. package/.next/server/chunks/[root-of-the-server]__1ccon1w._.js +0 -10
  527. package/.next/server/chunks/[root-of-the-server]__1fizn31._.js +0 -3
  528. package/.next/server/chunks/[root-of-the-server]__1llj3-b._.js +0 -3
  529. package/.next/server/chunks/[root-of-the-server]__1p8m3f4._.js +0 -3
  530. package/.next/server/chunks/[root-of-the-server]__1wa1k7r._.js +0 -8
  531. package/.next/server/chunks/_0-73of8._.js +0 -55
  532. package/.next/server/chunks/_0-fjql4._.js +0 -26
  533. package/.next/server/chunks/_00xh_q0._.js +0 -25
  534. package/.next/server/chunks/_03a0897._.js +0 -3
  535. package/.next/server/chunks/_051qh8u._.js +0 -3
  536. package/.next/server/chunks/_05sovvj._.js +0 -3
  537. package/.next/server/chunks/_0fzqt2y._.js +0 -134
  538. package/.next/server/chunks/_0mecv0f._.js +0 -26
  539. package/.next/server/chunks/_0mh8j4m._.js +0 -3
  540. package/.next/server/chunks/_0obojvv._.js +0 -3
  541. package/.next/server/chunks/_0sb7tlz._.js +0 -3
  542. package/.next/server/chunks/_0sbynis._.js +0 -3
  543. package/.next/server/chunks/_0u10wmw._.js +0 -55
  544. package/.next/server/chunks/_0u4aiy2._.js +0 -3
  545. package/.next/server/chunks/_0wp4le3._.js +0 -3
  546. package/.next/server/chunks/_0y5fg-x._.js +0 -3
  547. package/.next/server/chunks/_1230wbx._.js +0 -10
  548. package/.next/server/chunks/_12nheja._.js +0 -3
  549. package/.next/server/chunks/_13510xh._.js +0 -3
  550. package/.next/server/chunks/_15hq89o._.js +0 -3
  551. package/.next/server/chunks/_18-1wcc._.js +0 -55
  552. package/.next/server/chunks/_1_9mjx-._.js +0 -3
  553. package/.next/server/chunks/_1c78vw5._.js +0 -229
  554. package/.next/server/chunks/_1h5_8sk._.js +0 -3
  555. package/.next/server/chunks/_1hdnxb7._.js +0 -3
  556. package/.next/server/chunks/_1j8k_j5._.js +0 -3
  557. package/.next/server/chunks/_1nula3v._.js +0 -3
  558. package/.next/server/chunks/_1php4eq._.js +0 -3
  559. package/.next/server/chunks/_1yuv4vp._.js +0 -3
  560. package/.next/server/chunks/_1zjrdag._.js +0 -3
  561. package/.next/server/chunks/_next-internal_server_app_api_bot_task_[id]_route_actions_1_k_8u3.js +0 -3
  562. package/.next/server/chunks/_next-internal_server_app_api_bot_task_route_actions_0xln6ra.js +0 -3
  563. package/.next/server/chunks/features_0rpfxbk._.js +0 -3
  564. package/.next/server/chunks/features_1qf3cei._.js +0 -3
  565. package/.next/server/chunks/features_bot_0zt92oh._.js +0 -3
  566. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xoq2rl._.js +0 -3
  567. package/.next/server/chunks/ssr/[externals]__0dizgek._.js +0 -3
  568. package/.next/server/chunks/ssr/[root-of-the-server]__092knlj._.js +0 -3
  569. package/.next/server/chunks/ssr/[root-of-the-server]__0mz33a7._.js +0 -3
  570. package/.next/server/chunks/ssr/[root-of-the-server]__0s9dq5u._.js +0 -3
  571. package/.next/server/chunks/ssr/[root-of-the-server]__0s9l2sv._.js +0 -3
  572. package/.next/server/chunks/ssr/[root-of-the-server]__0vnmv-s._.js +0 -3
  573. package/.next/server/chunks/ssr/[root-of-the-server]__0xsog8n._.js +0 -3
  574. package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +0 -61
  575. package/.next/server/chunks/ssr/[root-of-the-server]__1gtlw6v._.js +0 -43
  576. package/.next/server/chunks/ssr/[root-of-the-server]__1ox7hbk._.js +0 -4
  577. package/.next/server/chunks/ssr/[root-of-the-server]__202p40z._.js +0 -3
  578. package/.next/server/chunks/ssr/_001_ms1._.js +0 -28
  579. package/.next/server/chunks/ssr/_01n3o0m._.js +0 -3
  580. package/.next/server/chunks/ssr/_0fz4mf_._.js +0 -3
  581. package/.next/server/chunks/ssr/_0gb4gmf._.js +0 -3
  582. package/.next/server/chunks/ssr/_0h42fze._.js +0 -3
  583. package/.next/server/chunks/ssr/_0h7zdni._.js +0 -3
  584. package/.next/server/chunks/ssr/_0ilna52._.js +0 -42
  585. package/.next/server/chunks/ssr/_0q0zan6._.js +0 -70
  586. package/.next/server/chunks/ssr/_0zcjrbg._.js +0 -3
  587. package/.next/server/chunks/ssr/_0zhoc3r._.js +0 -3
  588. package/.next/server/chunks/ssr/_13fke0x._.js +0 -3
  589. package/.next/server/chunks/ssr/_18cymkq._.js +0 -3
  590. package/.next/server/chunks/ssr/_1b2mjwr._.js +0 -3
  591. package/.next/server/chunks/ssr/_1f-dg-6._.js +0 -3
  592. package/.next/server/chunks/ssr/_1h0rw11._.js +0 -3
  593. package/.next/server/chunks/ssr/_1jhd09t._.js +0 -3
  594. package/.next/server/chunks/ssr/_1nnsk7z._.js +0 -3
  595. package/.next/server/chunks/ssr/_1ov37if._.js +0 -3
  596. package/.next/server/chunks/ssr/_1sji22n._.js +0 -3
  597. package/.next/server/chunks/ssr/_1vi_uo7._.js +0 -3
  598. package/.next/server/chunks/ssr/_1vyd1ji._.js +0 -3
  599. package/.next/server/chunks/ssr/_1xx4zlb._.js +0 -3
  600. package/.next/server/chunks/ssr/components_ui_1y1l7yj._.js +0 -3
  601. package/.next/server/chunks/ssr/features_bot_1s_-2vj._.js +0 -3
  602. package/.next/server/chunks/ssr/lib_realtime_12wg_dd._.js +0 -27
  603. package/.next/server/chunks/ssr/lib_realtime_15h_v1v._.js +0 -27
  604. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0npjf8-._.js +0 -3
  605. package/.next/static/chunks/00rd4-v8r7axp.js +0 -1
  606. package/.next/static/chunks/08qe4as2q428z.js +0 -3
  607. package/.next/static/chunks/0gnqdjn2lvdad.js +0 -2
  608. package/.next/static/chunks/0hwap1-p0m5sa.js +0 -1
  609. package/.next/static/chunks/0r5qcctujhxli.js +0 -1
  610. package/.next/static/chunks/0w52rrrmuj9r9.js +0 -1
  611. package/.next/static/chunks/0wcprt5ot5she.js +0 -1
  612. package/.next/static/chunks/10teww7wt-f6h.js +0 -1
  613. package/.next/static/chunks/17p6tk6k88dq6.js +0 -1
  614. package/.next/static/chunks/18a96rkhi4_yd.js +0 -1
  615. package/.next/static/chunks/1dkjg87pxk0n9.js +0 -28
  616. package/.next/static/chunks/1jd09sxcjddu1.js +0 -1
  617. package/.next/static/chunks/1w73ece_6bheu.js +0 -18
  618. package/.next/static/chunks/214ya3n5gxeih.js +0 -1
  619. package/.next/static/chunks/22_zkas21rpna.js +0 -1
  620. package/.next/static/chunks/2fh4-3z_q8b_w.js +0 -1
  621. package/.next/static/chunks/2h0sd2vumhb15.js +0 -1
  622. package/.next/static/chunks/2t4vhi3m8ahya.js +0 -1
  623. package/.next/static/chunks/2tigdtz3dpcy8.js +0 -1
  624. package/.next/static/chunks/2u7xt6mxg44lf.js +0 -1
  625. package/.next/static/chunks/3786h5vayt80-.js +0 -28
  626. package/.next/static/chunks/39j0fvpybzabl.js +0 -40
  627. package/.next/static/chunks/3cq5g494yuke8.css +0 -1
  628. package/.next/static/chunks/3hibbjnt85-k6.js +0 -1
  629. package/.next/static/chunks/3woj-xd7ki5_i.js +0 -1
  630. package/.next/static/chunks/3xk7yqgomx7yq.js +0 -1
  631. package/.next/static/chunks/3zmcsnuo25zvq.js +0 -1
  632. package/database/migrations/20260911030320_opposite_jack_power/migration.sql +0 -1
  633. package/docs/images/task-thread.png +0 -0
  634. package/features/bot/components/task-badge.tsx +0 -42
  635. package/features/bot/components/task-reply.tsx +0 -328
  636. package/features/bot/components/task-setting.tsx +0 -524
  637. package/features/bot/task.query.ts +0 -976
  638. package/features/bot/task.store.ts +0 -489
  639. package/lib/realtime/client-secret.ts +0 -86
  640. package/lib/realtime/open-session.ts +0 -31
  641. package/lib/realtime/openai.ts +0 -35
  642. package/lib/realtime/realtime.audio.ts +0 -196
  643. package/lib/realtime/realtime.driver.ts +0 -489
  644. package/lib/realtime/realtime.protocol.ts +0 -393
  645. package/lib/realtime/realtime.schema.ts +0 -37
  646. package/lib/realtime/realtime.session.ts +0 -106
  647. package/lib/realtime/realtime.transport.ts +0 -384
  648. package/lib/realtime/xai.ts +0 -39
  649. /package/.next/server/app/api/bot/{task → thread}/[id]/route/build-manifest.json +0 -0
  650. /package/.next/server/app/api/bot/{task → thread}/[id]/route/server-reference-manifest.json +0 -0
  651. /package/.next/server/app/api/bot/{task → thread}/[id]/route.js.map +0 -0
  652. /package/.next/server/app/api/bot/{task → thread}/route/build-manifest.json +0 -0
  653. /package/.next/server/app/api/bot/{task → thread}/route/server-reference-manifest.json +0 -0
  654. /package/.next/server/app/api/bot/{task → thread}/route.js.map +0 -0
  655. /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → 0qzGoKn2wTERVZtblX1tp}/_buildManifest.js +0 -0
  656. /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → 0qzGoKn2wTERVZtblX1tp}/_clientMiddlewareManifest.js +0 -0
  657. /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → 0qzGoKn2wTERVZtblX1tp}/_ssgManifest.js +0 -0
@@ -1,16 +1,22 @@
1
1
  "use client";
2
2
 
3
- import { Check, ChevronRight } from "lucide-react";
3
+ import { Check, ChevronDown, ChevronRight } from "lucide-react";
4
4
  import { useRouter } from "next/navigation";
5
5
  import { type Ref, useEffect, useRef, useState } from "react";
6
6
  import { Button } from "@/components/ui/button";
7
7
  import { notify } from "@/components/ui/notify";
8
+ import {
9
+ Popover,
10
+ PopoverContent,
11
+ PopoverTrigger,
12
+ } from "@/components/ui/popover";
8
13
  import { ShinyText } from "@/components/ui/shiny-text";
9
14
  import TextType from "@/components/ui/text-type";
10
15
  import { APP_NAME } from "@/config";
11
16
  import { ModelPicker } from "@/features/ai/components/model-picker";
12
17
  import { type TextModelProviderId } from "@/features/ai/model.schema";
13
- import { DEFAULT_BOT } from "@/features/bot/bot.schema";
18
+ import { TOOL_NAMES } from "@/features/ai/tools/tool-name";
19
+ import { type BotIcon, DEFAULT_BOT } from "@/features/bot/bot.schema";
14
20
  import {
15
21
  BOT_SEEDS,
16
22
  type BotSeed,
@@ -46,15 +52,14 @@ export function Intro({
46
52
  ready,
47
53
  /** Opened deliberately via `?intro`. */
48
54
  forced,
49
- /** One colour per BOT_SEEDS entry (bot.seed rollSeedColors), rolled on the server so hydration keeps the same faces. */
50
- colors,
55
+ /** One face per BOT_SEEDS entry (bot.seed rollSeedIcons), rolled on the server so hydration keeps the same faces. */
56
+ icons,
51
57
  }: {
52
58
  ready: boolean;
53
59
  forced: boolean;
54
- colors: string[];
60
+ icons: BotIcon[];
55
61
  }) {
56
- const ink = (seed: BotSeed) =>
57
- colors[BOT_SEEDS.indexOf(seed)] ?? seed.icon?.color;
62
+ const face = (seed: BotSeed) => icons[BOT_SEEDS.indexOf(seed)];
58
63
 
59
64
  const router = useRouter();
60
65
  const [at, setAt] = useState(0);
@@ -62,14 +67,14 @@ export function Intro({
62
67
  /** After the fade; then the element is removed entirely. */
63
68
  const [lifted, setLifted] = useState(false);
64
69
  const [keyed, setKeyed] = useState(ready);
65
- const [picks, setPicks] = useState<Record<string, Pick>>(() =>
70
+ const [picked, setPicked] = useState<Record<string, boolean>>(() =>
66
71
  Object.fromEntries(
67
- RECOMMENDED_SEEDS.map((seed) => [
68
- seed.name,
69
- { on: true, provider: null, model: "" },
70
- ]),
72
+ BOT_SEEDS.map((seed) => [seed.name, Boolean(seed.recommended)]),
71
73
  ),
72
74
  );
75
+ // One model for every pick: a picker per bot is what made the step scroll.
76
+ // Each bot's own is on its page in Settings › Bots
77
+ const [runsOn, setRunsOn] = useState<RunsOn>({ provider: null, model: "" });
73
78
  const keys = useRef<VoiceKeysHandle>(null);
74
79
  const [saving, setSaving] = useState(false);
75
80
 
@@ -112,20 +117,20 @@ export function Intro({
112
117
  setGone(true);
113
118
  if (!keyed) return;
114
119
  installSeedBots(
115
- RECOMMENDED_SEEDS.filter((seed) => picks[seed.name]?.on).map((seed) => ({
120
+ BOT_SEEDS.filter((seed) => picked[seed.name]).map((seed) => ({
116
121
  name: seed.name,
117
122
  // A half pick is not a model; the action falls back to the default
118
- provider: picks[seed.name]?.provider ?? null,
119
- model: picks[seed.name]?.model || null,
120
- color: ink(seed),
123
+ provider: runsOn.provider,
124
+ model: runsOn.model || null,
125
+ icon: face(seed),
121
126
  })),
122
127
  );
123
128
  router.replace("/");
124
129
  router.refresh();
125
130
  };
126
131
 
127
- const patch = (name: string, next: Partial<Pick>) =>
128
- setPicks((all) => ({ ...all, [name]: { ...all[name], ...next } }));
132
+ const toggle = (name: string) =>
133
+ setPicked((all) => ({ ...all, [name]: !all[name] }));
129
134
 
130
135
  return (
131
136
  <div
@@ -143,9 +148,17 @@ export function Intro({
143
148
  />
144
149
 
145
150
  <div className="absolute inset-x-12 top-22 bottom-44 flex flex-col items-center justify-center overflow-y-auto">
146
- {at === 0 && <FirstLook ink={ink} />}
151
+ {at === 0 && <FirstLook face={face} />}
147
152
  {at === 1 && <KeyStep ref={keys} onSaved={() => setKeyed(true)} />}
148
- {at === 2 && <BotStep picks={picks} ink={ink} onPatch={patch} />}
153
+ {at === 2 && (
154
+ <BotStep
155
+ picked={picked}
156
+ runsOn={runsOn}
157
+ face={face}
158
+ onToggle={toggle}
159
+ onRunsOn={setRunsOn}
160
+ />
161
+ )}
149
162
  </div>
150
163
 
151
164
  <div className="absolute inset-x-0 bottom-13 flex flex-col items-center gap-5.5">
@@ -195,7 +208,7 @@ export function Intro({
195
208
  }
196
209
 
197
210
  /** Step one: the three lines the call screen actually draws, no chat bubbles. */
198
- function FirstLook({ ink }: { ink: Ink }) {
211
+ function FirstLook({ face }: { face: Face }) {
199
212
  const crew = RECOMMENDED_SEEDS;
200
213
 
201
214
  return (
@@ -210,10 +223,7 @@ function FirstLook({ ink }: { ink: Ink }) {
210
223
  key={seed.name}
211
224
  size={22}
212
225
  seed={seed.name}
213
- vary={seed.name}
214
- color={ink(seed)}
215
- shape={seed.icon?.shape}
216
- outline={seed.icon?.outline}
226
+ {...face(seed)}
217
227
  state="thinking"
218
228
  notify={false}
219
229
  className={cn("shrink-0", index > 0 && "-ml-1.5")}
@@ -224,7 +234,7 @@ function FirstLook({ ink }: { ink: Ink }) {
224
234
  {crew.length === 1 ? "A bot is on it" : "Bots are on it"}
225
235
  </span>
226
236
  <span className="font-mono text-[10.5px] text-muted-foreground/70">
227
- ask_bot
237
+ {TOOL_NAMES.delegate}
228
238
  </span>
229
239
  </span>
230
240
 
@@ -272,59 +282,68 @@ function KeyStep({
272
282
  );
273
283
  }
274
284
 
275
- /** The first sentence of the app spells its number; past this the numeral is fine. */
276
- const COUNT_WORD: Record<number, string> = { 1: "One", 2: "Two", 3: "Three" };
285
+ /** The heading spells how many come along, up to every seed there is. */
286
+ const COUNT_WORD: Record<number, string> = {
287
+ 0: "No",
288
+ 1: "One",
289
+ 2: "Two",
290
+ 3: "Three",
291
+ 4: "Four",
292
+ 5: "Five",
293
+ 6: "Six",
294
+ 7: "Seven",
295
+ 8: "Eight",
296
+ };
277
297
 
278
- /** This intro's colour for a seed (bot.seed rollSeedColors). */
279
- type Ink = (seed: BotSeed) => string | undefined;
298
+ /** This intro's face for a seed (bot.seed rollSeedIcons). */
299
+ type Face = (seed: BotSeed) => BotIcon | undefined;
280
300
 
281
- /** What the intro knows about one bot. An empty model is the default and means "app default" at run time. */
282
- type Pick = {
283
- on: boolean;
284
- provider: TextModelProviderId | null;
285
- model: string;
286
- };
301
+ /** The one model every picked bot starts on. An empty model means "app default" at run time. */
302
+ type RunsOn = { provider: TextModelProviderId | null; model: string };
287
303
 
288
- /** Step three: which seed bots to install. */
304
+ /** Step three: which seed bots to install, and what they run on. */
289
305
  function BotStep({
290
- picks,
291
- ink,
292
- onPatch,
306
+ picked,
307
+ runsOn,
308
+ face,
309
+ onToggle,
310
+ onRunsOn,
293
311
  }: {
294
- picks: Record<string, Pick>;
295
- ink: Ink;
296
- onPatch: (name: string, next: Partial<Pick>) => void;
312
+ picked: Record<string, boolean>;
313
+ runsOn: RunsOn;
314
+ face: Face;
315
+ onToggle: (name: string) => void;
316
+ onRunsOn: (next: RunsOn) => void;
297
317
  }) {
298
- const on = RECOMMENDED_SEEDS.filter((seed) => picks[seed.name]?.on);
299
- const rest = BOT_SEEDS.length - RECOMMENDED_SEEDS.length;
318
+ const on = BOT_SEEDS.filter((seed) => picked[seed.name]);
319
+ const names = on.map((seed) => seed.name).join(", ");
320
+ const more = BOT_SEEDS.length - on.length;
300
321
 
301
322
  return (
302
323
  <div className="flex w-full max-w-2xl flex-col items-center">
303
324
  <h1 className="text-center text-[30px] font-medium tracking-tight text-balance break-keep">
304
- {RECOMMENDED_SEEDS.length === 1
325
+ {on.length === 1
305
326
  ? "One bot comes with her."
306
- : `${COUNT_WORD[RECOMMENDED_SEEDS.length] ?? RECOMMENDED_SEEDS.length} bots come with her.`}
327
+ : `${COUNT_WORD[on.length] ?? on.length} bots come with her.`}
307
328
  </h1>
308
329
  <p className="mt-3 max-w-lg text-center text-[15px] leading-relaxed text-pretty text-muted-foreground break-keep">
309
- {RECOMMENDED_SEEDS.length === 1
330
+ {on.length === 1
310
331
  ? "It takes the work that would leave the call silent, and reports back."
311
332
  : "They take the work that would leave the call silent, and report back."}
312
333
  </p>
313
334
 
314
- {/* The pill these faces will stand in (bot-room Folded) */}
335
+ {/* The pill the bots will stand in (bot-room Folded), with the whole crew in
336
+ it: who comes along is the line below */}
315
337
  <span className="mt-5 flex h-9 items-center gap-2 rounded-full bg-muted/50 py-1.5 pr-3.5 pl-1.5 ring-1 ring-border/60">
316
338
  {on.length > 0 ? (
317
339
  <>
318
340
  <span className="flex">
319
- {on.map((seed, index) => (
341
+ {BOT_SEEDS.map((seed, index) => (
320
342
  <BotMark
321
343
  key={seed.name}
322
344
  size={22}
323
345
  seed={seed.name}
324
- vary={seed.name}
325
- color={ink(seed)}
326
- shape={seed.icon?.shape}
327
- outline={seed.icon?.outline}
346
+ {...face(seed)}
328
347
  notify={false}
329
348
  className={cn("shrink-0", index > 0 && "-ml-1.5")}
330
349
  />
@@ -343,104 +362,115 @@ function BotStep({
343
362
  )}
344
363
  </span>
345
364
 
346
- {/* One column: the rows are a hint tall now, and two columns made the same
347
- three bots read as a grid of choices rather than the crew */}
348
- <div className="mt-4 flex w-full max-w-lg flex-col gap-2">
349
- {RECOMMENDED_SEEDS.map((seed) => (
350
- <SeedRow
351
- key={seed.name}
352
- seed={seed}
353
- pick={picks[seed.name]}
354
- ink={ink(seed)}
355
- onPatch={(next) => onPatch(seed.name, next)}
356
- />
357
- ))}
358
- </div>
359
-
360
- {/* Says the rest exist without asking anything about them: which subject
361
- bot someone wants is not answerable before they have used the app */}
362
- {rest > 0 && (
363
- <p className="mt-3.5 text-[13px] text-muted-foreground">
364
- More wait in Settings › Bots.
365
- </p>
366
- )}
365
+ {/* Every seed, behind one line: listed in place with a model row each, they
366
+ scrolled the step (canvas "Intro Bot Picker" C) */}
367
+ <Popover>
368
+ <PopoverTrigger
369
+ render={
370
+ <button
371
+ type="button"
372
+ className="group/seeds mt-4 flex h-12 w-full max-w-lg items-center gap-2 rounded-lg border border-border bg-background pr-3 pl-3.5 text-left outline-none transition-colors hover:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 data-popup-open:bg-muted"
373
+ />
374
+ }
375
+ >
376
+ <span className="min-w-0 flex-1 truncate text-[14px] leading-5">
377
+ <span className="font-medium">
378
+ {names || "Pick who comes along"}
379
+ </span>
380
+ {names && more > 0 && (
381
+ <span className="text-muted-foreground">
382
+ {" "}
383
+ · {more} more to pick
384
+ </span>
385
+ )}
386
+ </span>
387
+ <ChevronDown className="size-4 shrink-0 text-muted-foreground transition-transform group-data-popup-open/seeds:rotate-180" />
388
+ </PopoverTrigger>
389
+ <PopoverContent
390
+ align="start"
391
+ sideOffset={6}
392
+ className="w-(--anchor-width) gap-0 p-1"
393
+ >
394
+ <p className="px-1.5 py-1 text-xs font-medium text-muted-foreground">
395
+ Bots
396
+ </p>
397
+ {BOT_SEEDS.map((seed) => (
398
+ <SeedOption
399
+ key={seed.name}
400
+ seed={seed}
401
+ on={Boolean(picked[seed.name])}
402
+ icon={face(seed)}
403
+ onToggle={() => onToggle(seed.name)}
404
+ />
405
+ ))}
406
+ <div className="-mx-1 my-1 h-px bg-border" />
407
+ <div className="flex items-center gap-2 px-1.5 pt-1 pb-0.5">
408
+ <span className="shrink-0 pr-0.5 text-[13px] text-muted-foreground">
409
+ Runs on
410
+ </span>
411
+ <div className="min-w-0 flex-1">
412
+ <ModelPicker
413
+ provider={runsOn.provider}
414
+ model={runsOn.model}
415
+ onChange={onRunsOn}
416
+ />
417
+ </div>
418
+ </div>
419
+ </PopoverContent>
420
+ </Popover>
367
421
  </div>
368
422
  );
369
423
  }
370
424
 
371
425
  /**
372
- * One seed bot row, on by default, in the same shape the Bots section draws
373
- * (bot-setting SeedPackage): face, name, and one line of hint that never wraps.
374
- * The model is not prefilled; empty means the app default.
426
+ * One seed in the list: face, name and its hint on one line, and whether it
427
+ * comes along. The hint is the bot form's one line (bot.seed), so it truncates
428
+ * rather than wraps.
375
429
  */
376
- function SeedRow({
430
+ function SeedOption({
377
431
  seed,
378
- pick,
379
- ink,
380
- onPatch,
432
+ on,
433
+ icon,
434
+ onToggle,
381
435
  }: {
382
436
  seed: BotSeed;
383
- pick?: Pick;
384
- ink?: string;
385
- onPatch: (next: Partial<Pick>) => void;
437
+ on: boolean;
438
+ icon?: BotIcon;
439
+ onToggle: () => void;
386
440
  }) {
387
- const on = Boolean(pick?.on);
388
-
389
441
  return (
390
- <div
391
- className={cn(
392
- "min-w-0 rounded-xl ring-1 transition-colors",
393
- on ? "ring-foreground" : "ring-border/60",
394
- )}
442
+ <button
443
+ type="button"
444
+ onClick={onToggle}
445
+ aria-pressed={on}
446
+ className="flex w-full items-center gap-2.5 rounded-md p-1.5 text-left outline-none hover:bg-muted focus-visible:bg-muted"
395
447
  >
396
- <button
397
- type="button"
398
- onClick={() => onPatch({ on: !on })}
399
- aria-pressed={on}
400
- className="flex w-full items-center gap-3 rounded-xl px-3.5 py-2.5 text-left outline-none focus-visible:ring-3 focus-visible:ring-ring/50"
401
- >
402
- <BotMark
403
- size={28}
404
- seed={seed.name}
405
- vary={seed.name}
406
- color={ink}
407
- shape={seed.icon?.shape}
408
- outline={seed.icon?.outline}
409
- state={on ? "thinking" : "idle"}
410
- notify={false}
411
- className={cn("shrink-0 transition-opacity", !on && "opacity-35")}
412
- />
413
-
414
- <span className="min-w-0 flex-1 space-y-px">
415
- <span className="block text-[14px] leading-[18px] font-medium">
416
- {seed.name}
417
- </span>
418
- <span className="block truncate text-[12px] leading-[17px] text-muted-foreground">
419
- {seed.hint}
420
- </span>
448
+ <BotMark
449
+ size={20}
450
+ seed={seed.name}
451
+ {...icon}
452
+ state={on ? "thinking" : "idle"}
453
+ notify={false}
454
+ className={cn("shrink-0 transition-opacity", !on && "opacity-35")}
455
+ />
456
+ <span className="flex min-w-0 flex-1 items-baseline gap-2">
457
+ <span className="shrink-0 text-[14px] leading-5 font-medium">
458
+ {seed.name}
421
459
  </span>
422
-
423
- <span
424
- className={cn(
425
- "grid size-5 shrink-0 place-items-center rounded-full transition-colors",
426
- on
427
- ? "bg-foreground text-background"
428
- : "ring-1 ring-border/60 ring-inset",
429
- )}
430
- >
431
- {on && <Check className="size-3" />}
460
+ <span className="truncate text-[12px] leading-5 text-muted-foreground">
461
+ {seed.hint}
432
462
  </span>
433
- </button>
434
-
435
- {on && (
436
- <div className="px-3.5 pb-3">
437
- <ModelPicker
438
- provider={pick?.provider ?? null}
439
- model={pick?.model ?? ""}
440
- onChange={(next) => onPatch(next)}
441
- />
442
- </div>
443
- )}
444
- </div>
463
+ </span>
464
+ <span
465
+ className={cn(
466
+ "grid size-4 shrink-0 place-items-center rounded-full transition-colors",
467
+ on
468
+ ? "bg-foreground text-background"
469
+ : "ring-1 ring-border ring-inset",
470
+ )}
471
+ >
472
+ {on && <Check className="size-2.5" />}
473
+ </span>
474
+ </button>
445
475
  );
446
476
  }
@@ -48,7 +48,7 @@ const SECTIONS: { key: MemorySection; label: string }[] = [
48
48
  { key: "people", label: "People" },
49
49
  { key: "projects", label: "Projects" },
50
50
  { key: "topics", label: "Topics" },
51
- { key: "inbox", label: "Inbox" },
51
+ { key: "other", label: "Other" },
52
52
  ];
53
53
 
54
54
  export function MemorySetting() {
@@ -94,11 +94,6 @@ export function MemorySetting() {
94
94
  <Fragment key={key}>
95
95
  <span className="px-3 pt-3 pb-1 font-mono text-[10px] text-muted-foreground/60">
96
96
  {label}
97
- {key === "inbox" && (
98
- <span className="pl-1.5 text-muted-foreground/50">
99
- waiting to be filed
100
- </span>
101
- )}
102
97
  </span>
103
98
  {rows.map((note) => (
104
99
  <NoteLink
@@ -457,7 +452,7 @@ const NOTE_KINDS = [
457
452
  },
458
453
  ] as const;
459
454
 
460
- /** Kind + name becomes the path; profile and inbox stay agent-managed. */
455
+ /** Kind + name becomes the path; profile and preferences stay agent-managed. */
461
456
  export function openMemoryCreate() {
462
457
  return notify.component({
463
458
  className: "sm:max-w-lg",
@@ -52,7 +52,6 @@ export const MemoryNoteSchema = z.object({
52
52
  facts: MemoryFactSchema.array(),
53
53
  });
54
54
 
55
- export type MemoryFact = z.infer<typeof MemoryFactSchema>;
56
55
  export type MemoryNote = z.infer<typeof MemoryNoteSchema>;
57
56
 
58
57
  /**
@@ -71,16 +70,12 @@ export const MEMORY_PATHS = [
71
70
  of: "Something with an end — a trip, a purchase, a deadline, a thing being built",
72
71
  },
73
72
  { path: "topics/", of: "Something ongoing that keeps coming back" },
74
- { path: "inbox", of: "Nowhere obvious yet" },
75
73
  ] as const;
76
74
 
77
- /** Where anything outside the convention lands. */
78
- export const MEMORY_INBOX = "inbox";
79
-
80
75
  /** Notes without a section. */
81
76
  export const MEMORY_ROOT_NOTES = MEMORY_PATHS.filter(
82
77
  (entry) => !entry.path.endsWith("/"),
83
- ).map((entry) => entry.path) as ("profile" | "preferences" | "inbox")[];
78
+ ).map((entry) => entry.path) as ("profile" | "preferences")[];
84
79
 
85
80
  /** Notes about a named thing live under one of these. */
86
81
  export const MEMORY_SECTIONS = MEMORY_PATHS.filter((entry) =>
@@ -97,31 +92,27 @@ const MEMORY_PATH_RE = new RegExp(
97
92
 
98
93
  export const isMemoryPath = (path: string) => MEMORY_PATH_RE.test(path);
99
94
 
100
- /** Notes that stay listed with zero facts; their description is app-owned. */
95
+ /**
96
+ * Notes that stay listed with zero facts. Their listing line is the app's, not
97
+ * a model's: memory.query ensureRootNotes resets it at boot and a model's
98
+ * `description` for one is ignored (ai/tools/memory.tool), so the line cannot
99
+ * drift with whoever wrote last.
100
+ */
101
101
  export const MEMORY_ALWAYS_LISTED: string[] = ["profile", "preferences"];
102
102
 
103
103
  export const isAlwaysListed = (path: string) =>
104
104
  MEMORY_ALWAYS_LISTED.includes(path);
105
105
 
106
- /**
107
- * Notes whose listing line the app writes rather than a model: the two root
108
- * notes it keeps (memory.query ensureRootNotes) and the inbox, which is where
109
- * a fact lands when its path is not one this listing can carry. A model's
110
- * `description` for one of these is ignored, so the line cannot drift with
111
- * whoever wrote last (ai/tools/memory.tool).
112
- */
113
- export const APP_NAMED_NOTES = [...MEMORY_ALWAYS_LISTED, MEMORY_INBOX];
114
-
115
- export const isAppNamed = (path: string) => APP_NAMED_NOTES.includes(path);
116
-
117
106
  /** The line the app writes for one of those. */
118
107
  export const appNoteLine = (path: string) =>
119
108
  MEMORY_PATHS.find((entry) => entry.path === path)?.of ?? null;
120
109
 
121
- export type MemorySection =
122
- | "you"
123
- | (typeof MEMORY_SECTIONS)[number]
124
- | typeof MEMORY_INBOX;
110
+ /**
111
+ * `other` holds a path outside the convention. A model cannot create one
112
+ * (memory_remember refuses it), so only rows older than that rule land there,
113
+ * kept on screen to open and delete.
114
+ */
115
+ export type MemorySection = "you" | (typeof MEMORY_SECTIONS)[number] | "other";
125
116
 
126
117
  /** How the screen groups notes; derived from MEMORY_PATHS. */
127
118
  export function sectionOf(path: string): MemorySection {
@@ -129,7 +120,7 @@ export function sectionOf(path: string): MemorySection {
129
120
  const head = path.slice(0, path.indexOf("/"));
130
121
  return (MEMORY_SECTIONS as readonly string[]).includes(head)
131
122
  ? (head as (typeof MEMORY_SECTIONS)[number])
132
- : MEMORY_INBOX;
123
+ : "other";
133
124
  }
134
125
 
135
126
  // Model-facing shapes: narrower than the UI's on purpose.
@@ -4,7 +4,6 @@ import { Check, Plus, Search } from "lucide-react";
4
4
  import { Fragment, type ReactNode } from "react";
5
5
  import { Input } from "@/components/ui/input";
6
6
  import { Skeleton } from "@/components/ui/skeleton";
7
- import { Switch } from "@/components/ui/switch";
8
7
  import { cn, WAITING_INK } from "@/lib/utils";
9
8
 
10
9
  /** Shared layout for settings screens: a list, dialogs for everything else. */
@@ -413,49 +412,6 @@ export function SettingNote({
413
412
  );
414
413
  }
415
414
 
416
- /**
417
- * A setting that runs by itself: one switch, and what it reveals while it is
418
- * on. Tinted rather than bordered — what it holds is state, not a set to pick
419
- * from. Its description is a sentence that wraps, so it gets its own leading;
420
- * a row's second line, which is one line of state, stays tight.
421
- */
422
- export function SettingToggle({
423
- label,
424
- description,
425
- checked,
426
- disabled,
427
- onChange,
428
- children,
429
- }: {
430
- label: string;
431
- description: ReactNode;
432
- checked: boolean;
433
- /** Holds the switch while its state is still arriving. */
434
- disabled?: boolean;
435
- onChange: (on: boolean) => void;
436
- /** Drawn under the switch while it is on. */
437
- children?: ReactNode;
438
- }) {
439
- return (
440
- <div className="space-y-3 rounded-xl bg-muted/30 p-4">
441
- <label className="flex items-center gap-4">
442
- <span className="min-w-0 flex-1 space-y-1">
443
- <span className="block text-sm font-medium">{label}</span>
444
- <span className="block text-xs leading-relaxed text-muted-foreground">
445
- {description}
446
- </span>
447
- </span>
448
- <Switch
449
- checked={checked}
450
- disabled={disabled}
451
- onCheckedChange={onChange}
452
- />
453
- </label>
454
- {checked && children}
455
- </div>
456
- );
457
- }
458
-
459
415
  /** Pick one row. Disabled options stay listed with the reason in the hint slot. */
460
416
  export function SettingChoiceRows<T extends string>({
461
417
  options,
@@ -27,7 +27,7 @@ import { Segmented } from "@/components/ui/segmented";
27
27
  import { ArtifactMark } from "@/features/artifact/components/artifact-mark";
28
28
  import { BotBadge } from "@/features/bot/components/bot-badge";
29
29
  import { BotsMark } from "@/features/bot/components/bot-mark";
30
- import { TaskBadge } from "@/features/bot/components/task-badge";
30
+ import { ThreadBadge } from "@/features/bot/components/thread-badge";
31
31
  import { ConfigBadge } from "@/features/config/components/config-badge";
32
32
  import { ModelsBadge } from "@/features/config/components/models-badge";
33
33
  import { McpBadge } from "@/features/connectors/components/mcp-badge";
@@ -70,9 +70,9 @@ const BotSetting = lazySection(
70
70
  })),
71
71
  SettingPanesSkeleton,
72
72
  );
73
- const TaskSetting = lazySection(() =>
74
- import("@/features/bot/components/task-setting").then((m) => ({
75
- default: m.TaskSetting,
73
+ const ThreadSetting = lazySection(() =>
74
+ import("@/features/bot/components/thread-setting").then((m) => ({
75
+ default: m.ThreadSetting,
76
76
  })),
77
77
  );
78
78
  const ConfigSetting = lazySection(() =>
@@ -134,7 +134,7 @@ export const SECTIONS: readonly {
134
134
  id: "thursday",
135
135
  label: "Thursday",
136
136
  group: "call",
137
- hint: "Her face, voice and prompt",
137
+ hint: "Her face, models, and how a call starts",
138
138
  icon: ThursdayAsciiMark,
139
139
  Component: ThursdaySetting,
140
140
  },
@@ -156,13 +156,13 @@ export const SECTIONS: readonly {
156
156
  Badge: BotBadge,
157
157
  },
158
158
  {
159
- id: "tasks",
160
- label: "Tasks",
159
+ id: "threads",
160
+ label: "Threads",
161
161
  group: "work",
162
162
  hint: "Jobs the bots were handed, and what came of them",
163
163
  icon: ListChecks,
164
- Component: TaskSetting,
165
- Badge: TaskBadge,
164
+ Component: ThreadSetting,
165
+ Badge: ThreadBadge,
166
166
  },
167
167
  {
168
168
  id: "artifact",
@@ -297,11 +297,11 @@ export function Settings({ children }: { children?: ReactElement }) {
297
297
  return (
298
298
  <Dialog open={open} onOpenChange={(next) => (next ? show() : hide())}>
299
299
  {children && <DialogTrigger render={children} />}
300
- <DialogContent className="h-[min(52rem,calc(100vh-3rem))] gap-0 overflow-hidden p-0 sm:max-w-[min(80rem,calc(100vw-3rem))]">
300
+ {/* block, not grid: a popup portaled in here (the thread sheet and anything it opens) would take a row */}
301
+ <DialogContent className="block h-[min(52rem,calc(100vh-3rem))] overflow-hidden p-0 sm:max-w-[min(80rem,calc(100vw-3rem))]">
301
302
  <DialogTitle className="sr-only">Settings</DialogTitle>
302
303
 
303
- {/* min-w-0: DialogContent is a grid, and a nowrap line would push it past max-w */}
304
- <div className="flex h-full min-h-0 min-w-0">
304
+ <div className="flex h-full min-h-0">
305
305
  <nav
306
306
  aria-label="Settings sections"
307
307
  onKeyDown={(event) => {