thursday-agent 0.5.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 (662) 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 +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_0v_7drq._.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_17k8irj._.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 -97
  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/{_1jdgjv9._.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/_1anqots._.js +3 -0
  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/_1k0spz7._.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/{_0rzucul._.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_1y79i83._.js → node_modules_00_51_v._.js} +1 -1
  238. package/.next/server/chunks/ssr/{node_modules_0m383r2._.js → node_modules_022sipm._.js} +1 -1
  239. package/.next/server/chunks/ssr/{node_modules_05-n6dz._.js → node_modules_0332gw4._.js} +1 -1
  240. package/.next/server/chunks/ssr/{node_modules_0zeg3x_._.js → node_modules_04vxchl._.js} +1 -1
  241. package/.next/server/chunks/ssr/{node_modules_07dsgkx._.js → node_modules_0746rzi._.js} +1 -1
  242. package/.next/server/chunks/ssr/{node_modules_0fkeku3._.js → node_modules_0d5uzof._.js} +1 -1
  243. package/.next/server/chunks/ssr/{node_modules_1k6n600._.js → node_modules_0exkwcm._.js} +1 -1
  244. package/.next/server/chunks/ssr/{node_modules_16mkxuo._.js → node_modules_0fr-ml8._.js} +1 -1
  245. package/.next/server/chunks/ssr/{node_modules_0iur59s._.js → node_modules_0mxvg8h._.js} +1 -1
  246. package/.next/server/chunks/ssr/{node_modules_1j8j4pt._.js → node_modules_0qapgjr._.js} +1 -1
  247. package/.next/server/chunks/ssr/{node_modules_20c28js._.js → node_modules_0qbfyjh._.js} +1 -1
  248. package/.next/server/chunks/ssr/{node_modules_1k7z2j6._.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_1chvq5f._.js → node_modules_0vsxbzp._.js} +1 -1
  251. package/.next/server/chunks/ssr/{node_modules_04sksn9._.js → node_modules_0vv0-fg._.js} +1 -1
  252. package/.next/server/chunks/ssr/{node_modules_1k8j8n0._.js → node_modules_0wsvp00._.js} +1 -1
  253. package/.next/server/chunks/ssr/{node_modules_1lz0oxc._.js → node_modules_1-urho9._.js} +1 -1
  254. package/.next/server/chunks/ssr/{node_modules_1-y7nni._.js → node_modules_16pi_dd._.js} +1 -1
  255. package/.next/server/chunks/ssr/{node_modules_1uyk91w._.js → node_modules_1d53yiq._.js} +1 -1
  256. package/.next/server/chunks/ssr/{node_modules_0bvopy2._.js → node_modules_1g1eihe._.js} +1 -1
  257. package/.next/server/chunks/ssr/{node_modules_1a0kmjl._.js → node_modules_1gpednh._.js} +1 -1
  258. package/.next/server/chunks/ssr/{node_modules_0u9da1h._.js → node_modules_1gu1pph._.js} +1 -1
  259. package/.next/server/chunks/ssr/{node_modules_056qgf-._.js → node_modules_1he1w8_._.js} +1 -1
  260. package/.next/server/chunks/ssr/{node_modules_0-dr_o7._.js → node_modules_1lnjapm._.js} +1 -1
  261. package/.next/server/chunks/ssr/{node_modules_1t77e4n._.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_0ifp389._.js → node_modules_1u6w1pb._.js} +1 -1
  264. package/.next/server/chunks/ssr/{node_modules_1x0ztf4._.js → node_modules_1xn6saw._.js} +1 -1
  265. 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_067_exa._.js} +1 -1
  266. 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_0nrrdaq._.js} +1 -1
  267. package/.next/server/chunks/ssr/{node_modules_@vercel_oidc_dist_1o553h-._.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/{435atsnhs7ksu.js → 1i-u2wzub_to1.js} +7 -7
  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/{408ueu4hfvcg7.js → 1wlo979mx-y3w.js} +1 -1
  289. package/.next/static/chunks/26ql4y-43xwhp.js +1 -0
  290. package/.next/static/chunks/{11r2yp_yh9_qn.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 +11 -6
  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 +296 -744
  347. package/features/bot/bot.runner.ts +461 -862
  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 +82 -36
  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 +11 -1
  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]__026u77e._.js +0 -5
  511. package/.next/server/chunks/[root-of-the-server]__02va5wz._.js +0 -3
  512. package/.next/server/chunks/[root-of-the-server]__050zri4._.js +0 -3
  513. package/.next/server/chunks/[root-of-the-server]__0bg9710._.js +0 -3
  514. package/.next/server/chunks/[root-of-the-server]__0ffbg85._.js +0 -3
  515. package/.next/server/chunks/[root-of-the-server]__0in-d5s._.js +0 -3
  516. package/.next/server/chunks/[root-of-the-server]__0ncs9uu._.js +0 -3
  517. package/.next/server/chunks/[root-of-the-server]__0pa9k-f._.js +0 -8
  518. package/.next/server/chunks/[root-of-the-server]__0qi_m0e._.js +0 -8
  519. package/.next/server/chunks/[root-of-the-server]__0tq0m_k._.js +0 -3
  520. package/.next/server/chunks/[root-of-the-server]__0xep6j_._.js +0 -3
  521. package/.next/server/chunks/[root-of-the-server]__1-ga0kh._.js +0 -5
  522. package/.next/server/chunks/[root-of-the-server]__11n256_._.js +0 -5
  523. package/.next/server/chunks/[root-of-the-server]__144l7qt._.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]__1fizn31._.js +0 -3
  527. package/.next/server/chunks/[root-of-the-server]__1jg8t86._.js +0 -8
  528. package/.next/server/chunks/[root-of-the-server]__1lldzy9._.js +0 -3
  529. package/.next/server/chunks/[root-of-the-server]__1llj3-b._.js +0 -3
  530. package/.next/server/chunks/[root-of-the-server]__1p8m3f4._.js +0 -3
  531. package/.next/server/chunks/[root-of-the-server]__1peqvsi._.js +0 -3
  532. package/.next/server/chunks/[root-of-the-server]__1w8gm5h._.js +0 -10
  533. package/.next/server/chunks/[root-of-the-server]__1xt39nn._.js +0 -8
  534. package/.next/server/chunks/[root-of-the-server]__1zb8mfo._.js +0 -8
  535. package/.next/server/chunks/_0-73of8._.js +0 -55
  536. package/.next/server/chunks/_0-fjql4._.js +0 -31
  537. package/.next/server/chunks/_00xh_q0._.js +0 -25
  538. package/.next/server/chunks/_051qh8u._.js +0 -3
  539. package/.next/server/chunks/_05sovvj._.js +0 -3
  540. package/.next/server/chunks/_091bi8d._.js +0 -3
  541. package/.next/server/chunks/_0fzqt2y._.js +0 -142
  542. package/.next/server/chunks/_0lr92vd._.js +0 -3
  543. package/.next/server/chunks/_0mecv0f._.js +0 -31
  544. package/.next/server/chunks/_0mh8j4m._.js +0 -3
  545. package/.next/server/chunks/_0sb7tlz._.js +0 -3
  546. package/.next/server/chunks/_0si7xzn._.js +0 -3
  547. package/.next/server/chunks/_0u10wmw._.js +0 -55
  548. package/.next/server/chunks/_0wp4le3._.js +0 -3
  549. package/.next/server/chunks/_0y5fg-x._.js +0 -3
  550. package/.next/server/chunks/_1230wbx._.js +0 -10
  551. package/.next/server/chunks/_12nheja._.js +0 -3
  552. package/.next/server/chunks/_13510xh._.js +0 -3
  553. package/.next/server/chunks/_15hq89o._.js +0 -3
  554. package/.next/server/chunks/_18-1wcc._.js +0 -55
  555. package/.next/server/chunks/_18d7-5p._.js +0 -3
  556. package/.next/server/chunks/_1c78vw5._.js +0 -237
  557. package/.next/server/chunks/_1h5_8sk._.js +0 -3
  558. package/.next/server/chunks/_1hdnxb7._.js +0 -3
  559. package/.next/server/chunks/_1j8k_j5._.js +0 -3
  560. package/.next/server/chunks/_1nula3v._.js +0 -3
  561. package/.next/server/chunks/_1php4eq._.js +0 -3
  562. package/.next/server/chunks/_1yuv4vp._.js +0 -3
  563. package/.next/server/chunks/_1zkfbaa._.js +0 -3
  564. package/.next/server/chunks/_next-internal_server_app_api_bot_task_[id]_route_actions_1_k_8u3.js +0 -3
  565. package/.next/server/chunks/_next-internal_server_app_api_bot_task_route_actions_0xln6ra.js +0 -3
  566. package/.next/server/chunks/features_0rpfxbk._.js +0 -3
  567. package/.next/server/chunks/features_1qf3cei._.js +0 -8
  568. package/.next/server/chunks/features_bot_0zt92oh._.js +0 -3
  569. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1jidylq._.js +0 -3
  570. package/.next/server/chunks/ssr/[externals]__0dizgek._.js +0 -3
  571. package/.next/server/chunks/ssr/[root-of-the-server]__0-nob52._.js +0 -4
  572. package/.next/server/chunks/ssr/[root-of-the-server]__092knlj._.js +0 -3
  573. package/.next/server/chunks/ssr/[root-of-the-server]__0mz33a7._.js +0 -3
  574. package/.next/server/chunks/ssr/[root-of-the-server]__0s4wb56._.js +0 -3
  575. package/.next/server/chunks/ssr/[root-of-the-server]__0s9dq5u._.js +0 -3
  576. package/.next/server/chunks/ssr/[root-of-the-server]__0sd3izg._.js +0 -3
  577. package/.next/server/chunks/ssr/[root-of-the-server]__0vnmv-s._.js +0 -3
  578. package/.next/server/chunks/ssr/[root-of-the-server]__1-13tcn._.js +0 -43
  579. package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +0 -61
  580. package/.next/server/chunks/ssr/[root-of-the-server]__1zidpfl._.js +0 -3
  581. package/.next/server/chunks/ssr/_001_ms1._.js +0 -33
  582. package/.next/server/chunks/ssr/_01n3o0m._.js +0 -3
  583. package/.next/server/chunks/ssr/_04z2c7b._.js +0 -3
  584. package/.next/server/chunks/ssr/_06tssji._.js +0 -3
  585. package/.next/server/chunks/ssr/_0fk4c7d._.js +0 -3
  586. package/.next/server/chunks/ssr/_0h42fze._.js +0 -3
  587. package/.next/server/chunks/ssr/_0h7zdni._.js +0 -3
  588. package/.next/server/chunks/ssr/_0m2lsd1._.js +0 -3
  589. package/.next/server/chunks/ssr/_0mggveb._.js +0 -3
  590. package/.next/server/chunks/ssr/_0nbpc_8._.js +0 -3
  591. package/.next/server/chunks/ssr/_0q0zan6._.js +0 -70
  592. package/.next/server/chunks/ssr/_0zcjrbg._.js +0 -3
  593. package/.next/server/chunks/ssr/_0zhoc3r._.js +0 -3
  594. package/.next/server/chunks/ssr/_11j92tu._.js +0 -3
  595. package/.next/server/chunks/ssr/_13fke0x._.js +0 -3
  596. package/.next/server/chunks/ssr/_18cymkq._.js +0 -3
  597. package/.next/server/chunks/ssr/_1ebxla1._.js +0 -3
  598. package/.next/server/chunks/ssr/_1nj4niv._.js +0 -42
  599. package/.next/server/chunks/ssr/_1ov37if._.js +0 -3
  600. package/.next/server/chunks/ssr/_1ovmc9s._.js +0 -3
  601. package/.next/server/chunks/ssr/_1sji22n._.js +0 -3
  602. package/.next/server/chunks/ssr/_1vi_uo7._.js +0 -3
  603. package/.next/server/chunks/ssr/_1vyd1ji._.js +0 -3
  604. package/.next/server/chunks/ssr/_1xx4zlb._.js +0 -3
  605. package/.next/server/chunks/ssr/components_ui_1y1l7yj._.js +0 -3
  606. package/.next/server/chunks/ssr/features_bot_1s_-2vj._.js +0 -3
  607. package/.next/server/chunks/ssr/lib_realtime_12wg_dd._.js +0 -27
  608. package/.next/server/chunks/ssr/lib_realtime_15h_v1v._.js +0 -27
  609. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0npjf8-._.js +0 -3
  610. package/.next/static/chunks/0n3jle9kbqfr2.js +0 -40
  611. package/.next/static/chunks/0r5qcctujhxli.js +0 -1
  612. package/.next/static/chunks/10teww7wt-f6h.js +0 -1
  613. package/.next/static/chunks/126fj4pga_72k.js +0 -1
  614. package/.next/static/chunks/159udiexf6dom.js +0 -2
  615. package/.next/static/chunks/18a96rkhi4_yd.js +0 -1
  616. package/.next/static/chunks/18gi7o2ibrgh8.js +0 -3
  617. package/.next/static/chunks/1dkjg87pxk0n9.js +0 -28
  618. package/.next/static/chunks/1q9z1tohil7xn.js +0 -1
  619. package/.next/static/chunks/1sjgfets224re.js +0 -1
  620. package/.next/static/chunks/1wszsr83t01gh.js +0 -1
  621. package/.next/static/chunks/22_zkas21rpna.js +0 -1
  622. package/.next/static/chunks/2fh4-3z_q8b_w.js +0 -1
  623. package/.next/static/chunks/2h0sd2vumhb15.js +0 -1
  624. package/.next/static/chunks/2szintyibu0s5.js +0 -1
  625. package/.next/static/chunks/2t4vhi3m8ahya.js +0 -1
  626. package/.next/static/chunks/2tigdtz3dpcy8.js +0 -1
  627. package/.next/static/chunks/3-b6b7entqazs.js +0 -1
  628. package/.next/static/chunks/3786h5vayt80-.js +0 -28
  629. package/.next/static/chunks/3cq5g494yuke8.css +0 -1
  630. package/.next/static/chunks/3dmbhsv2u_8kj.js +0 -1
  631. package/.next/static/chunks/3hibbjnt85-k6.js +0 -1
  632. package/.next/static/chunks/3i0a5px-oufgc.js +0 -1
  633. package/.next/static/chunks/3wexk9qo8zuj3.js +0 -18
  634. package/.next/static/chunks/3xk7yqgomx7yq.js +0 -1
  635. package/.next/static/chunks/3xre8bu_pk1p_.js +0 -1
  636. package/.next/static/chunks/3zv6t3i77xhr_.js +0 -1
  637. package/database/migrations/20260911030320_opposite_jack_power/migration.sql +0 -1
  638. package/docs/images/task-thread.png +0 -0
  639. package/features/bot/components/task-badge.tsx +0 -42
  640. package/features/bot/components/task-reply.tsx +0 -328
  641. package/features/bot/components/task-setting.tsx +0 -524
  642. package/features/bot/task.query.ts +0 -1079
  643. package/features/bot/task.store.ts +0 -487
  644. package/lib/realtime/client-secret.ts +0 -86
  645. package/lib/realtime/open-session.ts +0 -31
  646. package/lib/realtime/openai.ts +0 -35
  647. package/lib/realtime/realtime.audio.ts +0 -196
  648. package/lib/realtime/realtime.driver.ts +0 -489
  649. package/lib/realtime/realtime.protocol.ts +0 -393
  650. package/lib/realtime/realtime.schema.ts +0 -37
  651. package/lib/realtime/realtime.session.ts +0 -106
  652. package/lib/realtime/realtime.transport.ts +0 -384
  653. package/lib/realtime/xai.ts +0 -39
  654. /package/.next/server/app/api/bot/{task → thread}/[id]/route/build-manifest.json +0 -0
  655. /package/.next/server/app/api/bot/{task → thread}/[id]/route/server-reference-manifest.json +0 -0
  656. /package/.next/server/app/api/bot/{task → thread}/[id]/route.js.map +0 -0
  657. /package/.next/server/app/api/bot/{task → thread}/route/build-manifest.json +0 -0
  658. /package/.next/server/app/api/bot/{task → thread}/route/server-reference-manifest.json +0 -0
  659. /package/.next/server/app/api/bot/{task → thread}/route.js.map +0 -0
  660. /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → 0qzGoKn2wTERVZtblX1tp}/_buildManifest.js +0 -0
  661. /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → 0qzGoKn2wTERVZtblX1tp}/_clientMiddlewareManifest.js +0 -0
  662. /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → 0qzGoKn2wTERVZtblX1tp}/_ssgManifest.js +0 -0
@@ -3,6 +3,7 @@ import { type ToolSet, tool } from "ai";
3
3
  import z from "zod";
4
4
  import { EXEC_TIMEOUT_MS } from "@/config";
5
5
  import { TOOL_NAMES } from "@/features/ai/tools/tool-name";
6
+ import { holdBotMemory, keepBotMemory } from "@/features/bot/bot.memory";
6
7
  import { writeRefusal } from "@/features/workspace/workspace";
7
8
  import type { Sandbox } from "@/lib/sandbox";
8
9
 
@@ -20,6 +21,12 @@ export const createWorkspaceTools = (
20
21
  guide?: boolean;
21
22
  /** How long one command may run; unset is the sandbox's own limit (config EXEC_TIMEOUT_MS). */
22
23
  timeoutMs?: number;
24
+ /**
25
+ * The bot this shell is for: neither tool takes its own memory past its
26
+ * limits (bot.memory keepBotMemory), and `write_file` starts nothing new at
27
+ * the top of `artifacts/` but its folder (workspace.ts writeRefusal).
28
+ */
29
+ bot?: string;
23
30
  },
24
31
  ): ToolSet => {
25
32
  /** Fold absolute sandbox paths against cwd; they still resolve when handed back. */
@@ -31,6 +38,17 @@ export const createWorkspaceTools = (
31
38
  // The tool set is built per run, so one guide per run lives in this closure.
32
39
  let owed = options.guide === true;
33
40
 
41
+ /** Runs a step that can write, then puts back what it took past the bot's memory limits and says so. */
42
+ const guarded = async <T>(
43
+ step: () => Promise<T>,
44
+ ): Promise<{ result: T; memory: string | null }> => {
45
+ const bot = options.bot;
46
+ if (!bot) return { result: await step(), memory: null };
47
+ const held = await holdBotMemory(bot);
48
+ const result = await step();
49
+ return { result, memory: await keepBotMemory(bot, held) };
50
+ };
51
+
34
52
  const bash = tool({
35
53
  description: "Run a bash command.",
36
54
  inputSchema: z.object({
@@ -44,14 +62,17 @@ export const createWorkspaceTools = (
44
62
  }),
45
63
  // The only tool here long-running enough to be cancelled.
46
64
  execute: async ({ command }, { abortSignal }) => {
47
- const result = await sandbox.exec(command, {
48
- signal: abortSignal,
49
- env: options.env,
50
- timeoutMs: options.timeoutMs,
51
- });
52
- if (!owed) return result;
65
+ const { result, memory } = await guarded(() =>
66
+ sandbox.exec(command, {
67
+ signal: abortSignal,
68
+ env: options.env,
69
+ timeoutMs: options.timeoutMs,
70
+ }),
71
+ );
72
+ const answer = memory ? { ...result, memory } : result;
73
+ if (!owed) return answer;
53
74
  owed = false;
54
- return { ...result, guide: SHELL_GUIDE };
75
+ return { ...answer, guide: SHELL_GUIDE };
55
76
  },
56
77
  });
57
78
 
@@ -76,10 +97,12 @@ export const createWorkspaceTools = (
76
97
  }),
77
98
  execute: async ({ path, content }) => {
78
99
  const full = sandbox.resolve(path);
79
- const refusal = writeRefusal(full);
100
+ const refusal = writeRefusal(full, options.bot);
80
101
  if (refusal) return refusal;
81
- await sandbox.writeFile(path, content);
82
- return `Wrote ${short(full)} (${content.split("\n").length} lines)`;
102
+ const { memory } = await guarded(() => sandbox.writeFile(path, content));
103
+ return (
104
+ memory ?? `Wrote ${short(full)} (${content.split("\n").length} lines)`
105
+ );
83
106
  },
84
107
  });
85
108
 
@@ -4,9 +4,9 @@ import { deleteArtifact } from "@/features/artifact/artifact.query";
4
4
  import { serverAction } from "@/lib/protocol/server-action";
5
5
  import { publicError } from "@/lib/public-error";
6
6
 
7
- /** Deletes one file a bot handed over. Reveal and open are workspace.action's. */
7
+ /** Deletes one thing a bot handed over: a file, or a set whole. Reveal and open are workspace.action's. */
8
8
  export const deleteArtifactAction = serverAction(async (path: string) => {
9
9
  const target = path.trim();
10
- if (!target) publicError("Which file?");
10
+ if (!target) publicError("Which artifact?");
11
11
  await deleteArtifact(target);
12
12
  });
@@ -1,8 +1,14 @@
1
+ import type { Dirent } from "node:fs";
1
2
  import { readdir, rm, stat } from "node:fs/promises";
2
- import { join, sep } from "node:path";
3
+ import { basename, join, relative, sep } from "node:path";
3
4
  import { ARTIFACT_VIEW, PATHS } from "@/config";
5
+ import { listBotNames } from "@/features/bot/bot.query";
4
6
  import { isListedFolder, viewKindOf } from "@/features/workspace/file-kind";
5
- import { ARTIFACTS, insideWorkspace } from "@/features/workspace/workspace";
7
+ import {
8
+ ARTIFACTS,
9
+ botFolderName,
10
+ insideWorkspace,
11
+ } from "@/features/workspace/workspace";
6
12
  import { publicError } from "@/lib/public-error";
7
13
  import type {
8
14
  Artifact,
@@ -12,18 +18,17 @@ import type {
12
18
  } from "./artifact.schema";
13
19
 
14
20
  /**
15
- * Finished work, the way the bots already file it: one entry at the top of
16
- * `artifacts/` is one artifact. A skill writes `artifacts/<name>.html`, a job
17
- * that makes a set writes `artifacts/<name>/` — so the folder is the index and
18
- * nothing has to be recorded anywhere.
21
+ * Finished work, the way the bots file it: each bot writes into its own folder,
22
+ * `artifacts/<bot>/`, and one entry there — a file, or a folder of several — is
23
+ * one artifact. What sits loose at the top of `artifacts/` (a bot's slip, or an
24
+ * install from before bots had folders) is listed too, belonging to nobody. So
25
+ * the folders are the index and nothing has to be recorded anywhere.
19
26
  *
20
- * Nothing here descends past the row it draws. The menu reads one folder; a set
21
- * reads its own when it is opened. There is no walk and no total, for the same
22
- * reason as Workspace: a folder's size is every file under it.
27
+ * Nothing here descends past the row it draws. The menu reads the top and each
28
+ * bot's folder; a set reads its own when it is opened. There is no walk and no
29
+ * total, for the same reason as Workspace: a folder's size is every file under it.
23
30
  */
24
31
 
25
- const relative = (name: string) => `${PATHS.artifacts}/${name}`;
26
-
27
32
  /**
28
33
  * The absolute path, fenced to `artifacts/`. The fence is on the resolved path,
29
34
  * never on the string that was asked for: `insideWorkspace` normalizes `..`
@@ -50,62 +55,97 @@ async function fileAt(
50
55
  }
51
56
 
52
57
  /**
53
- * The menu: what sits at the top of `artifacts/`, newest first. A folder costs
54
- * one `stat` for its date and one `readdir` for its count — never a descent,
55
- * so a set of thirty and a set of thirty thousand cost the same.
58
+ * One row: a file, or a folder as a set. A folder costs one `stat` for its date
59
+ * and one `readdir` for its count — never a descent, so a set of thirty and a
60
+ * set of thirty thousand cost the same.
61
+ */
62
+ async function entryAt(
63
+ dir: string,
64
+ base: string,
65
+ entry: Dirent,
66
+ bot: string | null,
67
+ ): Promise<Artifact | null> {
68
+ const path = `${base}/${entry.name}`;
69
+
70
+ if (entry.isDirectory()) {
71
+ if (!isListedFolder(entry.name)) return null;
72
+ const full = join(dir, entry.name);
73
+ const [info, inside] = await Promise.all([
74
+ stat(full).catch(() => null),
75
+ readdir(full, { withFileTypes: true }).catch(() => []),
76
+ ]);
77
+ // Counted the way the sheet draws them, or the row promises more than it opens
78
+ const count = inside.filter(
79
+ (child) => child.isFile() && viewKindOf(child.name) !== "none",
80
+ ).length;
81
+ if (!info || count === 0) return null;
82
+ return {
83
+ name: entry.name,
84
+ path,
85
+ bot,
86
+ at: info.mtime,
87
+ kind: "set",
88
+ bytes: 0,
89
+ count,
90
+ view: "none",
91
+ };
92
+ }
93
+
94
+ if (!entry.isFile()) return null;
95
+ const file = await fileAt(dir, path, entry.name);
96
+ return (
97
+ file && {
98
+ name: file.name,
99
+ path: file.path,
100
+ bot,
101
+ at: file.at,
102
+ kind: "file",
103
+ bytes: file.bytes,
104
+ count: 1,
105
+ view: file.view,
106
+ }
107
+ );
108
+ }
109
+
110
+ /** Which bot a top-level folder belongs to, matched the way the folder was named (workspace.ts botFolderName). */
111
+ async function botsByFolder(): Promise<Map<string, string>> {
112
+ const names = await listBotNames();
113
+ return new Map(
114
+ names.map((name) => [botFolderName(name).toLowerCase(), name]),
115
+ );
116
+ }
117
+
118
+ /**
119
+ * The menu: every bot's entries and the loose ones, newest first. A bot's
120
+ * folder is not a row of its own; its entries are, each carrying the bot.
56
121
  */
57
122
  export async function readShelf(
58
123
  limit = ARTIFACT_VIEW.rows,
59
124
  ): Promise<ArtifactShelf> {
60
- const listing = await readdir(ARTIFACTS, { withFileTypes: true }).catch(
61
- () => [],
62
- );
125
+ const [listing, bots] = await Promise.all([
126
+ readdir(ARTIFACTS, { withFileTypes: true }).catch(() => []),
127
+ botsByFolder(),
128
+ ]);
63
129
 
64
130
  const rows = await Promise.all(
65
- listing.map(async (entry): Promise<Artifact | null> => {
66
- const path = relative(entry.name);
67
-
68
- if (entry.isDirectory()) {
69
- if (!isListedFolder(entry.name)) return null;
70
- const full = join(ARTIFACTS, entry.name);
71
- const [info, inside] = await Promise.all([
72
- stat(full).catch(() => null),
73
- readdir(full, { withFileTypes: true }).catch(() => []),
74
- ]);
75
- // Counted the way the sheet draws them, or the row promises more than it opens
76
- const count = inside.filter(
77
- (child) => child.isFile() && viewKindOf(child.name) !== "none",
78
- ).length;
79
- if (!info || count === 0) return null;
80
- return {
81
- name: entry.name,
82
- path,
83
- at: info.mtime,
84
- kind: "set",
85
- bytes: 0,
86
- count,
87
- view: "none",
88
- };
89
- }
90
-
91
- if (!entry.isFile()) return null;
92
- const file = await fileAt(ARTIFACTS, path, entry.name);
93
- return (
94
- file && {
95
- name: file.name,
96
- path: file.path,
97
- at: file.at,
98
- kind: "file",
99
- bytes: file.bytes,
100
- count: 1,
101
- view: file.view,
102
- }
131
+ listing.map(async (entry) => {
132
+ const bot = entry.isDirectory()
133
+ ? bots.get(entry.name.toLowerCase())
134
+ : undefined;
135
+ if (!bot) return [await entryAt(ARTIFACTS, PATHS.artifacts, entry, null)];
136
+
137
+ const dir = join(ARTIFACTS, entry.name);
138
+ const base = `${PATHS.artifacts}/${entry.name}`;
139
+ const inside = await readdir(dir, { withFileTypes: true }).catch(
140
+ () => [],
103
141
  );
142
+ return Promise.all(inside.map((child) => entryAt(dir, base, child, bot)));
104
143
  }),
105
144
  );
106
145
 
107
146
  // Newest first: the thing a bot just handed over is the thing being looked for.
108
147
  const entries = rows
148
+ .flat()
109
149
  .filter((row) => row !== null)
110
150
  .sort((a, b) => new Date(b.at).getTime() - new Date(a.at).getTime());
111
151
 
@@ -118,10 +158,9 @@ export async function readShelf(
118
158
 
119
159
  /** One set, opened: its files, newest first. Read only when the row is picked. */
120
160
  export async function readSet(
121
- name: string,
161
+ path: string,
122
162
  limit = ARTIFACT_VIEW.setFiles,
123
163
  ): Promise<ArtifactSet> {
124
- const path = relative(name);
125
164
  const full = await insideArtifacts(path);
126
165
 
127
166
  const listing = await readdir(full, { withFileTypes: true }).catch(
@@ -141,17 +180,29 @@ export async function readSet(
141
180
 
142
181
  return {
143
182
  path,
144
- name,
183
+ name: basename(path),
145
184
  files: files.slice(0, limit),
146
185
  total: files.length,
147
186
  };
148
187
  }
149
188
 
150
- /** Deletes one artifact file. A whole set goes one file at a time, or through Workspace. */
189
+ /**
190
+ * Deletes one artifact: a file, or a set with everything in it. A bot's whole
191
+ * folder is not an artifact, so it is refused; its entries go one at a time.
192
+ */
151
193
  export async function deleteArtifact(path: string): Promise<void> {
152
194
  const full = await insideArtifacts(path);
153
195
  const info = await stat(full).catch(() => null);
154
- if (!info) publicError("File not found");
155
- if (!info.isFile()) publicError("That is a folder, not a file");
196
+ if (!info) publicError("Not found");
197
+ if (info.isDirectory()) {
198
+ const inside = relative(ARTIFACTS, full);
199
+ if (
200
+ !inside.includes(sep) &&
201
+ (await botsByFolder()).has(inside.toLowerCase())
202
+ )
203
+ publicError("That is a bot's whole folder, not one artifact");
204
+ await rm(full, { recursive: true });
205
+ return;
206
+ }
156
207
  await rm(full);
157
208
  }
@@ -2,11 +2,11 @@ import type { FileViewKind } from "@/features/workspace/file-kind";
2
2
  import type { DateLike } from "@/lib/date-like";
3
3
 
4
4
  /**
5
- * What the Artifacts section reads. One row per entry at the top of
6
- * `artifacts/`, which is the shape the bots already write in: a skill drops
7
- * `artifacts/<name>.html`, a job that makes a set drops `artifacts/<name>/`.
8
- * So the folder is the index — nothing records what an artifact is, because
9
- * being there already says it.
5
+ * What the Artifacts section reads. One row per entry in a bot's folder,
6
+ * `artifacts/<bot>/`, or loose at the top of `artifacts/`: a skill drops
7
+ * `<name>.html`, a job that makes a set drops `<name>/`. So the folders are the
8
+ * index — nothing records what an artifact is or who made it, because where it
9
+ * is already says it.
10
10
  */
11
11
 
12
12
  /** One file inside a set, or the artifact itself when it is a lone file. */
@@ -25,6 +25,8 @@ export type Artifact = {
25
25
  /** The file's own name, or the folder's. */
26
26
  name: string;
27
27
  path: string;
28
+ /** The bot whose folder holds it; null when it sits loose at the top of `artifacts/`. */
29
+ bot: string | null;
28
30
  /** Last written; the menu sorts and bands by this. */
29
31
  at: DateLike;
30
32
  /** A folder is a set — one row however many files are in it. */
@@ -40,7 +42,7 @@ export type Artifact = {
40
42
  /** The menu, and what the rail says. */
41
43
  export type ArtifactShelf = {
42
44
  entries: Artifact[];
43
- /** Everything at the top of `artifacts/`, before the page limit. */
45
+ /** Every row, before the page limit. */
44
46
  total: number;
45
47
  /** Files across every row, so the rail counts what the rows hide. */
46
48
  files: number;
@@ -15,7 +15,7 @@ import {
15
15
  Trash2,
16
16
  Video,
17
17
  } from "lucide-react";
18
- import { useState } from "react";
18
+ import { Fragment, useState } from "react";
19
19
  import { queryKey } from "@/app/api/query-key";
20
20
  import { Button } from "@/components/ui/button";
21
21
  import { notify } from "@/components/ui/notify";
@@ -28,6 +28,8 @@ import type {
28
28
  ArtifactSet,
29
29
  ArtifactShelf,
30
30
  } from "@/features/artifact/artifact.schema";
31
+ import type { Bot } from "@/features/bot/bot.schema";
32
+ import { BotMark } from "@/features/bot/components/bot-mark";
31
33
  import {
32
34
  SettingError,
33
35
  SettingFilter,
@@ -44,14 +46,14 @@ import { revalidate, useServerRoute } from "@/lib/protocol/use-server-route";
44
46
  import { cn, formatBytes } from "@/lib/utils";
45
47
 
46
48
  /*
47
- * What the bots finished, listed the way they already file it: one entry at the
48
- * top of `artifacts/` is one artifact. A skill writes `artifacts/<name>.html`,
49
- * a job that makes a set writes `artifacts/<name>/`.
49
+ * What the bots finished, listed the way they file it: each bot writes into
50
+ * `artifacts/<bot>/`, and one entry there is one artifact. A skill writes
51
+ * `<name>.html`, a job that makes a set writes `<name>/`.
50
52
  *
51
53
  * So this is not Workspace pointed at one folder. There is no tree here: the
52
- * menu is flat and newest-first, and a folder does not open into another
53
- * listing — it opens as a sheet of what it holds, which is the thing a set of
54
- * pictures is for. Browsing a tree is Workspace's job.
54
+ * menu is newest-first under each bot's face, and a folder does not open into
55
+ * another listing — it opens as a sheet of what it holds, which is the thing a
56
+ * set of pictures is for. Browsing a tree is Workspace's job.
55
57
  */
56
58
 
57
59
  /** Every kind `viewKindOf` returns, plus the set. One icon table, as in Workspace. */
@@ -80,6 +82,7 @@ export function ArtifactSetting() {
80
82
  { keepPreviousData: true },
81
83
  );
82
84
 
85
+ const { data: bots } = useServerRoute<Bot[]>(queryKey.bot);
83
86
  const [reveal] = useServerAction(openFileAction);
84
87
 
85
88
  if (isLoading) return <SettingPanesSkeleton />;
@@ -89,7 +92,11 @@ export function ArtifactSetting() {
89
92
  const total = data?.total ?? 0;
90
93
  const needle = filter.trim().toLowerCase();
91
94
  const shown = needle
92
- ? entries.filter((entry) => entry.name.toLowerCase().includes(needle))
95
+ ? entries.filter(
96
+ (entry) =>
97
+ entry.name.toLowerCase().includes(needle) ||
98
+ entry.bot?.toLowerCase().includes(needle),
99
+ )
93
100
  : entries;
94
101
 
95
102
  // A fresh row when the open one is still listed, so a rewrite shows through
@@ -130,13 +137,29 @@ export function ArtifactSetting() {
130
137
  {needle ? "Nothing matches" : "Nothing here yet"}
131
138
  </p>
132
139
  ) : (
133
- shown.map((entry) => (
134
- <MenuRow
135
- key={entry.path}
136
- entry={entry}
137
- active={entry.path === picked?.path}
138
- onPick={() => setReading({ row: entry, file: null })}
139
- />
140
+ groupByBot(shown).map(({ bot, rows }) => (
141
+ <Fragment key={bot ?? ""}>
142
+ <span className="flex items-center gap-1.5 px-3 pt-3 pb-1 font-mono text-[10px] text-muted-foreground/60">
143
+ {bot && (
144
+ <BotMark
145
+ size={12}
146
+ seed={bot}
147
+ {...markOf(bot, bots)}
148
+ notify={false}
149
+ className="shrink-0"
150
+ />
151
+ )}
152
+ <span className="truncate">{bot ?? "Unsorted"}</span>
153
+ </span>
154
+ {rows.map((entry) => (
155
+ <MenuRow
156
+ key={entry.path}
157
+ entry={entry}
158
+ active={entry.path === picked?.path}
159
+ onPick={() => setReading({ row: entry, file: null })}
160
+ />
161
+ ))}
162
+ </Fragment>
140
163
  ))
141
164
  )}
142
165
 
@@ -170,6 +193,33 @@ export function ArtifactSetting() {
170
193
  );
171
194
  }
172
195
 
196
+ /**
197
+ * Rows under the bot that made them, in the order the rows came: newest first,
198
+ * so the bot that handed something over last is on top. Loose rows are one group.
199
+ */
200
+ function groupByBot(
201
+ entries: Artifact[],
202
+ ): { bot: string | null; rows: Artifact[] }[] {
203
+ const groups = new Map<string | null, Artifact[]>();
204
+ for (const entry of entries) {
205
+ const rows = groups.get(entry.bot) ?? [];
206
+ rows.push(entry);
207
+ groups.set(entry.bot, rows);
208
+ }
209
+ return [...groups].map(([bot, rows]) => ({ bot, rows }));
210
+ }
211
+
212
+ /** Icon from the bot list; the row only carries the name. A bot that is gone draws its seed alone. */
213
+ function markOf(name: string, bots?: Bot[]) {
214
+ const icon = bots?.find((bot) => bot.name === name)?.icon;
215
+ return {
216
+ color: icon?.color,
217
+ shape: icon?.shape,
218
+ outline: icon?.outline,
219
+ paint: icon?.paint,
220
+ };
221
+ }
222
+
173
223
  /** `4 artifacts · 34 files`, and what is not on screen. Counts rows, so it is free. */
174
224
  function countLine(shown: Artifact[], total: number, files: number): string {
175
225
  if (total === 0) return "empty";
@@ -247,7 +297,9 @@ function Reader({
247
297
  const confirmRemove = async (path: string) => {
248
298
  const confirmed = await notify.confirm({
249
299
  title: `Delete ${path.split("/").pop()}?`,
250
- description: "It is deleted from disk for good.",
300
+ description: open
301
+ ? "It is deleted from disk for good."
302
+ : "The folder and everything in it are deleted from disk for good.",
251
303
  okText: "Delete",
252
304
  destructive: true,
253
305
  });
@@ -295,25 +347,23 @@ function Reader({
295
347
  >
296
348
  <FolderOpen />
297
349
  </Button>
298
- {open && (
299
- <Button
300
- size="icon-sm"
301
- variant="ghost"
302
- aria-label="Delete"
303
- loading={removing}
304
- className="text-muted-foreground"
305
- onClick={() => confirmRemove(open.path)}
306
- >
307
- <Trash2 />
308
- </Button>
309
- )}
350
+ <Button
351
+ size="icon-sm"
352
+ variant="ghost"
353
+ aria-label="Delete"
354
+ loading={removing}
355
+ className="text-muted-foreground"
356
+ onClick={() => confirmRemove(open?.path ?? row.path)}
357
+ >
358
+ <Trash2 />
359
+ </Button>
310
360
  </div>
311
361
 
312
362
  <div className="min-h-0 flex-1 overflow-auto">
313
363
  {open ? (
314
364
  <FilePreview path={open.path} bytes={open.bytes} />
315
365
  ) : (
316
- <SetSheet name={row.name} onOpen={onOpen} />
366
+ <SetSheet path={row.path} onOpen={onOpen} />
317
367
  )}
318
368
  </div>
319
369
  </>
@@ -325,14 +375,14 @@ function Reader({
325
375
  * a set nobody opens costs one `readdir` for its count and nothing more.
326
376
  */
327
377
  function SetSheet({
328
- name,
378
+ path,
329
379
  onOpen,
330
380
  }: {
331
- name: string;
381
+ path: string;
332
382
  onOpen: (file: ArtifactFile) => void;
333
383
  }) {
334
384
  const { data, isLoading, error } = useServerRoute<ArtifactSet>(
335
- queryKey.artifactSet(name, ARTIFACT_VIEW.setFiles),
385
+ queryKey.artifactSet(path, ARTIFACT_VIEW.setFiles),
336
386
  );
337
387
 
338
388
  if (isLoading) {
@@ -418,7 +468,7 @@ function Nothing({
418
468
  <p className="max-w-lg text-sm leading-relaxed text-muted-foreground">
419
469
  {empty
420
470
  ? "Nothing finished yet. When a bot ends a job with something to hand over — a page, a report, a set of pictures — it lands here."
421
- : "Pick something on the left. A folder a bot filled is one row, and opens as a sheet."}
471
+ : "Pick something on the left. Each bot's work is under its face; a folder it filled is one row, and opens as a sheet."}
422
472
  </p>
423
473
  <Button variant="outline" onClick={onReveal}>
424
474
  <FolderOpen />