thursday-agent 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (667) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +3 -2
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/required-server-files.json +8 -1
  6. package/.next/routes-manifest.json +18 -6
  7. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/server/app/_global-error.html +1 -1
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  14. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/server/app/_not-found.html +1 -1
  16. package/.next/server/app/_not-found.rsc +13 -13
  17. package/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +12 -12
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  20. package/.next/server/app/api/artifact/route.js +10 -6
  21. package/.next/server/app/api/artifact/route.js.nft.json +1 -1
  22. package/.next/server/app/api/bot/memory/files/route.js +5 -4
  23. package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
  24. package/.next/server/app/api/bot/memory/route.js +8 -8
  25. package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
  26. package/.next/server/app/api/bot/route.js +8 -8
  27. package/.next/server/app/api/bot/route.js.nft.json +1 -1
  28. package/.next/server/app/api/bot/thread/[id]/route/app-paths-manifest.json +3 -0
  29. package/.next/server/app/api/bot/thread/[id]/route.js +15 -0
  30. package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -0
  31. package/.next/server/app/api/bot/thread/[id]/route_client-reference-manifest.js +3 -0
  32. package/.next/server/app/api/bot/thread/route/app-paths-manifest.json +3 -0
  33. package/.next/server/app/api/bot/thread/route.js +15 -0
  34. package/.next/server/app/api/bot/thread/route.js.nft.json +1 -0
  35. package/.next/server/app/api/bot/thread/route_client-reference-manifest.js +3 -0
  36. package/.next/server/app/api/config/route.js +7 -7
  37. package/.next/server/app/api/config/route.js.nft.json +1 -1
  38. package/.next/server/app/api/events/route.js +3 -3
  39. package/.next/server/app/api/events/route.js.nft.json +1 -1
  40. package/.next/server/app/api/file/[...path]/route.js +4 -4
  41. package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
  42. package/.next/server/app/api/llm-model/catalog/route.js +8 -8
  43. package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
  44. package/.next/server/app/api/llm-model/credits/route.js +8 -8
  45. package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -1
  46. package/.next/server/app/api/llm-model/route.js +8 -8
  47. package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
  48. package/.next/server/app/api/llm-model/subscription/route.js +8 -8
  49. package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -1
  50. package/.next/server/app/api/mcp/[name]/route.js +6 -6
  51. package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
  52. package/.next/server/app/api/mcp/oauth/callback/route.js +4 -4
  53. package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
  54. package/.next/server/app/api/mcp/route.js +6 -6
  55. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  56. package/.next/server/app/api/mcp/tools/route.js +6 -6
  57. package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
  58. package/.next/server/app/api/memory/edit/route.js +15 -15
  59. package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
  60. package/.next/server/app/api/memory/route.js +7 -6
  61. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  62. package/.next/server/app/api/skills/[source]/[name]/route.js +6 -6
  63. package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/skills/route.js +6 -6
  65. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  66. package/.next/server/app/api/thursday/call/route.js +10 -11
  67. package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
  68. package/.next/server/app/api/thursday/skills/route.js +9 -10
  69. package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
  70. package/.next/server/app/api/thursday/tool-call/route.js +15 -15
  71. package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
  72. package/.next/server/app/api/workspace/missing/route/app-paths-manifest.json +3 -0
  73. package/.next/server/app/api/workspace/missing/route/build-manifest.json +12 -0
  74. package/.next/server/app/api/workspace/missing/route/server-reference-manifest.json +4 -0
  75. package/.next/server/app/api/workspace/missing/route.js +12 -0
  76. package/.next/server/app/api/workspace/missing/route.js.map +5 -0
  77. package/.next/server/app/api/workspace/missing/route.js.nft.json +1 -0
  78. package/.next/server/app/api/workspace/missing/route_client-reference-manifest.js +3 -0
  79. package/.next/server/app/api/workspace/route.js +5 -5
  80. package/.next/server/app/api/workspace/route.js.nft.json +1 -1
  81. package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +1 -1
  82. package/.next/server/app/artifact/[...path]/page.js +4 -3
  83. package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
  84. package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
  85. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  86. package/.next/server/app/page/server-reference-manifest.json +67 -45
  87. package/.next/server/app/page.js +11 -9
  88. package/.next/server/app/page.js.nft.json +1 -1
  89. package/.next/server/app/page_client-reference-manifest.js +1 -1
  90. package/.next/server/app-paths-manifest.json +3 -2
  91. package/.next/server/chunks/[root-of-the-server]__0-06t3f._.js +8 -0
  92. package/.next/server/chunks/[root-of-the-server]__02846fb._.js +8 -0
  93. package/.next/server/chunks/[root-of-the-server]__05luceg._.js +3 -0
  94. package/.next/server/chunks/[root-of-the-server]__06--3q3._.js +8 -0
  95. package/.next/server/chunks/[root-of-the-server]__06l05n_._.js +3 -0
  96. package/.next/server/chunks/[root-of-the-server]__07bnah_._.js +3 -0
  97. package/.next/server/chunks/[root-of-the-server]__08eae20._.js +8 -0
  98. package/.next/server/chunks/[root-of-the-server]__0_ue8oe._.js +3 -0
  99. package/.next/server/chunks/[root-of-the-server]__0btqrct._.js +3 -0
  100. package/.next/server/chunks/[root-of-the-server]__0c9fgca._.js +5 -0
  101. package/.next/server/chunks/[root-of-the-server]__0h_x6q6._.js +5 -0
  102. package/.next/server/chunks/{[root-of-the-server]__0pa2n68._.js → [root-of-the-server]__0kxrvxf._.js} +2 -2
  103. package/.next/server/chunks/{[root-of-the-server]__0q0vvt2._.js → [root-of-the-server]__0ov3iir._.js} +2 -2
  104. package/.next/server/chunks/[root-of-the-server]__0qwtlmx._.js +8 -0
  105. package/.next/server/chunks/[root-of-the-server]__0sm5xvm._.js +3 -0
  106. package/.next/server/chunks/[root-of-the-server]__0zp35ul._.js +5 -0
  107. package/.next/server/chunks/[root-of-the-server]__144u9d_._.js +3 -0
  108. package/.next/server/chunks/[root-of-the-server]__18-2tsq._.js +5 -0
  109. package/.next/server/chunks/[root-of-the-server]__1e-ci13._.js +3 -0
  110. package/.next/server/chunks/[root-of-the-server]__1e2365e._.js +8 -0
  111. package/.next/server/chunks/[root-of-the-server]__1fix932._.js +8 -0
  112. package/.next/server/chunks/{[root-of-the-server]__0ce8nf8._.js → [root-of-the-server]__1g3t7vn._.js} +3 -3
  113. package/.next/server/chunks/[root-of-the-server]__1kp-83u._.js +5 -0
  114. package/.next/server/chunks/[root-of-the-server]__1kv8p3e._.js +5 -0
  115. package/.next/server/chunks/[root-of-the-server]__1orn-5b._.js +2 -3
  116. package/.next/server/chunks/_02szwk8._.js +5 -0
  117. package/.next/server/chunks/_05h2cii._.js +1 -1
  118. package/.next/server/chunks/_06c9kie._.js +216 -0
  119. package/.next/server/chunks/{_1x6kd1r._.js → _07y2gj-._.js} +1 -1
  120. package/.next/server/chunks/_0a43a-0._.js +3 -0
  121. package/.next/server/chunks/_0bujjey._.js +5 -0
  122. package/.next/server/chunks/_0c9j6rb._.js +1 -1
  123. package/.next/server/chunks/_0dkd549._.js +3 -0
  124. package/.next/server/chunks/_0ej1kvv._.js +3 -0
  125. package/.next/server/chunks/_0f6ts7z._.js +3 -0
  126. package/.next/server/chunks/_0gm9hyv._.js +55 -0
  127. package/.next/server/chunks/_0i55en5._.js +25 -0
  128. package/.next/server/chunks/_0k50n27._.js +18 -0
  129. package/.next/server/chunks/_0khihjk._.js +3 -3
  130. package/.next/server/chunks/_0n74zsf._.js +5 -5
  131. package/.next/server/chunks/_0nvm9ef._.js +3 -0
  132. package/.next/server/chunks/_0p56fn0._.js +3 -0
  133. package/.next/server/chunks/_0recufk._.js +1 -1
  134. package/.next/server/chunks/_0xbkz10._.js +3 -0
  135. package/.next/server/chunks/_10tkr26._.js +3 -0
  136. package/.next/server/chunks/{_0ioz3nd._.js → _11u2kp7._.js} +1 -1
  137. package/.next/server/chunks/_11ujpya._.js +3 -0
  138. package/.next/server/chunks/_127nx_p._.js +5 -0
  139. package/.next/server/chunks/_17l5ygt._.js +1 -1
  140. package/.next/server/chunks/_19uauj6._.js +3 -0
  141. package/.next/server/chunks/_1_5mnq4._.js +5 -5
  142. package/.next/server/chunks/_1abl6t9._.js +55 -0
  143. package/.next/server/chunks/_1d0j961._.js +3 -3
  144. package/.next/server/chunks/_1dbixxz._.js +3 -0
  145. package/.next/server/chunks/_1dc_d1q._.js +98 -0
  146. package/.next/server/chunks/_1drgfx4._.js +5 -5
  147. package/.next/server/chunks/_1e48czp._.js +3 -3
  148. package/.next/server/chunks/_1f31u5x._.js +5 -0
  149. package/.next/server/chunks/_1gnjfli._.js +3 -0
  150. package/.next/server/chunks/_1kg70wc._.js +3 -3
  151. package/.next/server/chunks/_1klbcft._.js +5 -0
  152. package/.next/server/chunks/_1krd9rf._.js +4 -1
  153. package/.next/server/chunks/_1kwmzab._.js +3 -0
  154. package/.next/server/chunks/{_1pf4qe-._.js → _1oxj9fa._.js} +1 -1
  155. package/.next/server/chunks/{_1f46eie._.js → _1pcmdbb._.js} +1 -1
  156. package/.next/server/chunks/_1qgix-j._.js +3 -0
  157. package/.next/server/chunks/{lib_logger_ts_1exwjut._.js → _1rpchta._.js} +5 -5
  158. package/.next/server/chunks/_1vsej-s._.js +5 -0
  159. package/.next/server/chunks/_1yx0p_s._.js +5 -0
  160. package/.next/server/chunks/{_0rnf-6n._.js → _20fsr_z._.js} +6 -6
  161. package/.next/server/chunks/_2128hkj._.js +5 -0
  162. package/.next/server/chunks/_next-internal_server_app_api_bot_thread_[id]_route_actions_1fstjn2.js +3 -0
  163. package/.next/server/chunks/_next-internal_server_app_api_bot_thread_route_actions_003ccso.js +3 -0
  164. package/.next/server/chunks/_next-internal_server_app_api_workspace_missing_route_actions_1fidi6p.js +3 -0
  165. package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
  166. package/.next/server/chunks/features_0-cnt0l._.js +4 -0
  167. package/.next/server/chunks/features_0hdaci0._.js +4 -0
  168. package/.next/server/chunks/features_1e39j7-._.js +8 -0
  169. package/.next/server/chunks/features_bot_bot_query_ts_12mgkl2._.js +1 -1
  170. package/.next/server/chunks/features_memory_1uqvksn._.js +1 -1
  171. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0v_7drq._.js → node_modules_consola_dist_chunks_prompt_mjs_0a7-pbw._.js} +1 -1
  172. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_17k8irj._.js → node_modules_consola_dist_chunks_prompt_mjs_0gzvgfv._.js} +1 -1
  173. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0i7cvml._.js → node_modules_consola_dist_chunks_prompt_mjs_107pxfn._.js} +1 -1
  174. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0icqaqw._.js → node_modules_consola_dist_chunks_prompt_mjs_15hbel8._.js} +1 -1
  175. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_18i-23e._.js +3 -0
  176. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1bewgf3._.js +3 -0
  177. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1nlww1m._.js +3 -0
  178. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1q77nfx._.js +3 -0
  179. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xqdzx_._.js +3 -0
  180. package/.next/server/chunks/{node_modules_zod_v4_1801ax7._.js → node_modules_zod_v4_0lkux5-._.js} +2 -2
  181. package/.next/server/chunks/{node_modules_zod_v4_1cha_bw._.js → node_modules_zod_v4_1jmr9cq._.js} +2 -2
  182. package/.next/server/chunks/{node_modules_zod_v4_0ubdflj._.js → node_modules_zod_v4_1yrxmek._.js} +2 -2
  183. package/.next/server/chunks/node_modules_zod_v4_classic_errors_0tp0y-q.js +3 -0
  184. package/.next/server/chunks/ssr/[root-of-the-server]__0-e011f._.js +3 -0
  185. package/.next/server/chunks/ssr/[root-of-the-server]__09q9med._.js +1 -1
  186. package/.next/server/chunks/ssr/[root-of-the-server]__0lyi8i2._.js +1 -1
  187. package/.next/server/chunks/ssr/[root-of-the-server]__0pd8yr7._.js +3 -0
  188. package/.next/server/chunks/ssr/[root-of-the-server]__16jc196._.js +1 -1
  189. package/.next/server/chunks/ssr/[root-of-the-server]__18dthbp._.js +3 -0
  190. package/.next/server/chunks/ssr/[root-of-the-server]__18e68w8._.js +3 -0
  191. package/.next/server/chunks/ssr/[root-of-the-server]__1mzi-ju._.js +1 -1
  192. package/.next/server/chunks/ssr/[root-of-the-server]__1nygfik._.js +5 -0
  193. package/.next/server/chunks/ssr/[root-of-the-server]__1sdphb0._.js +8 -0
  194. package/.next/server/chunks/ssr/[root-of-the-server]__1vdmfbe._.js +3 -0
  195. package/.next/server/chunks/ssr/[root-of-the-server]__1waa3rc._.js +85 -0
  196. package/.next/server/chunks/ssr/_0-2qsxo._.js +3 -0
  197. package/.next/server/chunks/ssr/_00rehl_._.js +3 -0
  198. package/.next/server/chunks/ssr/{_1lz_cq2._.js → _02oc_h5._.js} +76 -97
  199. package/.next/server/chunks/ssr/_05yghx6._.js +3 -0
  200. package/.next/server/chunks/ssr/_07nbwap._.js +3 -0
  201. package/.next/server/chunks/ssr/_08c4z-9._.js +3 -0
  202. package/.next/server/chunks/ssr/_0_qfdlw._.js +4 -0
  203. package/.next/server/chunks/ssr/{_0m2lsd1._.js → _0b6_jv-._.js} +2 -2
  204. package/.next/server/chunks/ssr/_0evkpto._.js +3 -0
  205. package/.next/server/chunks/ssr/_0geg212._.js +3 -0
  206. package/.next/server/chunks/ssr/{_1jdgjv9._.js → _0hxt2ul._.js} +2 -2
  207. package/.next/server/chunks/ssr/_0i_6q1w._.js +2 -2
  208. package/.next/server/chunks/ssr/_0lu1n_x._.js +1 -1
  209. package/.next/server/chunks/ssr/_0no7i1o._.js +3 -0
  210. package/.next/server/chunks/ssr/_0tzg--b._.js +3 -0
  211. package/.next/server/chunks/ssr/{_15j2_8f._.js → _0wzaht-._.js} +2 -2
  212. package/.next/server/chunks/ssr/_0z-g0uy._.js +3 -0
  213. package/.next/server/chunks/ssr/_114ylv7._.js +7 -0
  214. package/.next/server/chunks/ssr/_123y-ah._.js +3 -0
  215. package/.next/server/chunks/ssr/_12c-iwh._.js +3 -0
  216. package/.next/server/chunks/ssr/_12w42gi._.js +3 -0
  217. package/.next/server/chunks/ssr/_161kqav._.js +3 -0
  218. package/.next/server/chunks/ssr/_167hchk._.js +3 -0
  219. package/.next/server/chunks/ssr/{_0ap2fzn._.js → _16c6_xm._.js} +2 -2
  220. package/.next/server/chunks/ssr/_18opah7._.js +3 -0
  221. package/.next/server/chunks/ssr/_1_krfph._.js +3 -0
  222. package/.next/server/chunks/ssr/{_0rzucul._.js → _1_x5spz._.js} +3 -3
  223. package/.next/server/chunks/ssr/_1a61fc9._.js +3 -0
  224. package/.next/server/chunks/ssr/_1ey7qn-._.js +70 -0
  225. package/.next/server/chunks/ssr/_1g9vs7q._.js +3 -0
  226. package/.next/server/chunks/ssr/_1jmz33w._.js +3 -0
  227. package/.next/server/chunks/ssr/_1rgtxhr._.js +5 -0
  228. package/.next/server/chunks/ssr/_1slp25y._.js +3 -0
  229. package/.next/server/chunks/ssr/_1w_t7h7._.js +101 -0
  230. package/.next/server/chunks/ssr/{_0s99bgb._.js → _1wyfaq_._.js} +9 -3
  231. package/.next/server/chunks/ssr/_200gt-m._.js +102 -0
  232. package/.next/server/chunks/ssr/components_ui_tabs_tsx_0ej40b4._.js +3 -0
  233. package/.next/server/chunks/ssr/features_bot_thread_query_ts_023eklt._.js +4 -0
  234. package/.next/server/chunks/ssr/features_config_components_config-setting_tsx_0xfwqdg._.js +1 -1
  235. package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
  236. package/.next/server/chunks/ssr/features_workspace_00jz2hu._.js +8 -0
  237. package/.next/server/chunks/ssr/{_1-teee5._.js → lib_logger_ts_0-olsze._.js} +2 -7
  238. package/.next/server/chunks/ssr/{node_modules_05-n6dz._.js → node_modules_02ai7br._.js} +1 -1
  239. package/.next/server/chunks/ssr/{node_modules_1chvq5f._.js → node_modules_02deexj._.js} +1 -1
  240. package/.next/server/chunks/ssr/{node_modules_0m383r2._.js → node_modules_07za262._.js} +1 -1
  241. package/.next/server/chunks/ssr/{node_modules_07dsgkx._.js → node_modules_0_s9get._.js} +1 -1
  242. package/.next/server/chunks/ssr/{node_modules_1a0kmjl._.js → node_modules_0n3c7h0._.js} +1 -1
  243. package/.next/server/chunks/ssr/{node_modules_0zeg3x_._.js → node_modules_0od6jwr._.js} +1 -1
  244. package/.next/server/chunks/ssr/{node_modules_1y79i83._.js → node_modules_0rdt7pk._.js} +1 -1
  245. package/.next/server/chunks/ssr/{node_modules_17bwo43._.js → node_modules_0tusx4d._.js} +3 -3
  246. package/.next/server/chunks/ssr/{node_modules_04sksn9._.js → node_modules_0w1z7kz._.js} +1 -1
  247. package/.next/server/chunks/ssr/{node_modules_1uyk91w._.js → node_modules_0wdupfz._.js} +1 -1
  248. package/.next/server/chunks/ssr/{node_modules_0ifp389._.js → node_modules_1720w0a._.js} +1 -1
  249. package/.next/server/chunks/ssr/{node_modules_0u9da1h._.js → node_modules_18lsg7d._.js} +1 -1
  250. package/.next/server/chunks/ssr/{node_modules_1k6n600._.js → node_modules_1b94fxf._.js} +1 -1
  251. package/.next/server/chunks/ssr/{node_modules_20c28js._.js → node_modules_1ecdo1s._.js} +1 -1
  252. package/.next/server/chunks/ssr/{node_modules_0fkeku3._.js → node_modules_1fa9ag7._.js} +1 -1
  253. package/.next/server/chunks/ssr/{node_modules_1j8j4pt._.js → node_modules_1fv-_si._.js} +1 -1
  254. package/.next/server/chunks/ssr/{node_modules_0-dr_o7._.js → node_modules_1hf461g._.js} +1 -1
  255. package/.next/server/chunks/ssr/{node_modules_1lz0oxc._.js → node_modules_1m71ta-._.js} +1 -1
  256. package/.next/server/chunks/ssr/{node_modules_1t77e4n._.js → node_modules_1n93n-g._.js} +1 -1
  257. package/.next/server/chunks/ssr/{node_modules_16mkxuo._.js → node_modules_1n9lqu9._.js} +1 -1
  258. package/.next/server/chunks/ssr/{node_modules_1k7z2j6._.js → node_modules_1npnsvd._.js} +1 -1
  259. package/.next/server/chunks/ssr/{node_modules_056qgf-._.js → node_modules_1rn2r0n._.js} +1 -1
  260. package/.next/server/chunks/ssr/{node_modules_0x3-ply._.js → node_modules_1seuurl._.js} +2 -2
  261. package/.next/server/chunks/ssr/{node_modules_0bvopy2._.js → node_modules_1vq-mfk._.js} +1 -1
  262. package/.next/server/chunks/ssr/{node_modules_0iur59s._.js → node_modules_1vzyw1t._.js} +1 -1
  263. package/.next/server/chunks/ssr/{node_modules_1k8j8n0._.js → node_modules_1w359w4._.js} +1 -1
  264. package/.next/server/chunks/ssr/{node_modules_1x0ztf4._.js → node_modules_1yajbl6._.js} +1 -1
  265. package/.next/server/chunks/ssr/{node_modules_1-y7nni._.js → node_modules_20eqhy8._.js} +1 -1
  266. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0bkwd0u._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_019sbis._.js} +1 -1
  267. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0p9a9su._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0s6piq3._.js} +1 -1
  268. package/.next/server/chunks/ssr/{node_modules_@vercel_oidc_dist_1o553h-._.js → node_modules_@vercel_oidc_dist_05itbb1._.js} +1 -1
  269. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_trash_mjs_0px2gzr._.js +3 -0
  270. package/.next/server/middleware-build-manifest.js +3 -3
  271. package/.next/server/pages/404.html +1 -1
  272. package/.next/server/pages/500.html +1 -1
  273. package/.next/server/server-reference-manifest.js +1 -1
  274. package/.next/server/server-reference-manifest.json +68 -46
  275. package/.next/static/chunks/07vqbk_9t4em4.js +2 -0
  276. package/.next/static/chunks/08krja1zx7nqg.js +1 -0
  277. package/.next/static/chunks/0g4b348l0pve7.js +1 -0
  278. package/.next/static/chunks/0qcuwdk132jjt.js +1 -0
  279. package/.next/static/chunks/0vlgzqo9ka90v.js +1 -0
  280. package/.next/static/chunks/{11r2yp_yh9_qn.js → 0z69gvysmave7.js} +1 -1
  281. package/.next/static/chunks/0zrupxgci5gqc.js +1 -0
  282. package/.next/static/chunks/12fvz1w5ows75.js +1 -0
  283. package/.next/static/chunks/14t03ned286iu.js +1 -0
  284. package/.next/static/chunks/156xxbkrz5lzu.js +18 -0
  285. package/.next/static/chunks/1fz14reod4lft.js +1 -0
  286. package/.next/static/chunks/1g23dbabl-vkr.js +1 -0
  287. package/.next/static/chunks/1ohslk4568tm3.js +1 -0
  288. package/.next/static/chunks/1qy_rc3oxfxok.js +1 -0
  289. package/.next/static/chunks/1sbmwswc9k2-1.js +1 -0
  290. package/.next/static/chunks/1vqezbhjm3goq.js +1 -0
  291. package/.next/static/chunks/1zea7qdl-7365.js +1 -0
  292. package/.next/static/chunks/1zvqumkg7kmo0.css +1 -0
  293. package/.next/static/chunks/26hpqt3y6bogl.js +12 -0
  294. package/.next/static/chunks/2_j5mqm6d-z18.js +99 -0
  295. package/.next/static/chunks/2dt6tu7a22svs.js +1 -0
  296. package/.next/static/chunks/2h5ls3d86kya6.js +1 -0
  297. package/.next/static/chunks/2wc6y1ht6dfuy.js +1 -0
  298. package/.next/static/chunks/{435atsnhs7ksu.js → 2xr0zpll7thyi.js} +2 -2
  299. package/.next/static/chunks/31jztc-yq30m7.js +1 -0
  300. package/.next/static/chunks/391af0i8eljzk.js +1 -0
  301. package/.next/static/chunks/3bfwpww3m3x4u.js +1 -0
  302. package/.next/static/chunks/{38gweqdo4jpfj.js → 3izg0a3k87q1-.js} +5 -5
  303. package/.next/static/chunks/3p2s2cjokx1aa.js +5 -0
  304. package/.next/static/chunks/{408ueu4hfvcg7.js → 41s3fml5oivsa.js} +1 -1
  305. package/README.md +45 -193
  306. package/app/api/events/app-event.ts +6 -4
  307. package/app/api/query-key.ts +25 -16
  308. package/bin/database.mjs +37 -0
  309. package/bin/thursday.mjs +44 -28
  310. package/components/ui/custom-icon.tsx +0 -60
  311. package/components/ui/radio-group.tsx +37 -0
  312. package/components/ui/shiny-text.tsx +33 -6
  313. package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/migration.sql +80 -24
  314. package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/snapshot.json +689 -110
  315. package/database/migrations/20260916160713_thread_cancelled/migration.sql +2 -0
  316. package/database/migrations/{20260911030320_opposite_jack_power → 20260916160713_thread_cancelled}/snapshot.json +706 -84
  317. package/docs/how-it-works.md +40 -35
  318. package/docs/images/keeps-going.png +0 -0
  319. package/docs/images/two-minds.png +0 -0
  320. package/docs/live-calls.md +236 -0
  321. package/docs/thread-rooms.md +71 -0
  322. package/features/ai/chatgpt.ts +1 -2
  323. package/features/ai/live.schema.ts +128 -0
  324. package/features/ai/load-tools.ts +152 -79
  325. package/features/ai/model.schema.ts +2 -120
  326. package/features/ai/model.ts +52 -88
  327. package/features/ai/prompts/bot.prompt.ts +91 -214
  328. package/features/ai/prompts/live.prompt.ts +169 -0
  329. package/features/ai/prompts/prompt-helper.ts +92 -32
  330. package/features/ai/prompts/thursday.prompt.ts +164 -190
  331. package/features/ai/tools/bot.tool.ts +38 -145
  332. package/features/ai/tools/call.tool.ts +33 -5
  333. package/features/ai/tools/connected.ts +5 -3
  334. package/features/ai/tools/mcp.tool.ts +7 -4
  335. package/features/ai/tools/memory.tool.ts +35 -31
  336. package/features/ai/tools/skills.tool.ts +11 -6
  337. package/features/ai/tools/studio.tool.ts +26 -21
  338. package/features/ai/tools/tool-name.ts +3 -5
  339. package/features/ai/tools/workspace.tool.ts +33 -10
  340. package/features/artifact/artifact.action.ts +2 -2
  341. package/features/artifact/artifact.query.ts +112 -61
  342. package/features/artifact/artifact.schema.ts +8 -6
  343. package/features/artifact/components/artifact-setting.tsx +83 -33
  344. package/features/bot/bot.action.ts +43 -36
  345. package/features/bot/bot.memory.ts +137 -20
  346. package/features/bot/bot.query.ts +28 -11
  347. package/features/bot/bot.run.ts +296 -744
  348. package/features/bot/bot.runner.ts +463 -864
  349. package/features/bot/bot.schema.ts +93 -82
  350. package/features/bot/bot.seed.ts +141 -64
  351. package/features/bot/components/bot-mark.tsx +324 -232
  352. package/features/bot/components/bot-room.tsx +1613 -697
  353. package/features/bot/components/bot-roster.tsx +8 -13
  354. package/features/bot/components/bot-setting.tsx +58 -42
  355. package/features/bot/components/bot-tool.tsx +55 -87
  356. package/features/bot/components/mark-palette.tsx +35 -32
  357. package/features/bot/components/path-chips.tsx +33 -3
  358. package/features/bot/components/thread-badge.tsx +34 -0
  359. package/features/bot/components/thread-reply.tsx +639 -0
  360. package/features/bot/components/thread-setting.tsx +674 -0
  361. package/features/bot/mark.const.ts +79 -31
  362. package/features/bot/room.query.ts +889 -0
  363. package/features/bot/room.schema.ts +64 -0
  364. package/features/bot/seed-bots.ts +2 -1
  365. package/features/bot/thread.query.ts +971 -0
  366. package/features/bot/thread.store.ts +587 -0
  367. package/features/config/components/voice-key.tsx +113 -88
  368. package/features/config/config.const.ts +5 -9
  369. package/features/connectors/mcp.schema.ts +0 -2
  370. package/features/intro/components/intro.tsx +169 -139
  371. package/features/memory/components/memory-setting.tsx +2 -7
  372. package/features/memory/memory.schema.ts +14 -23
  373. package/features/settings/components/setting-ui.tsx +0 -44
  374. package/features/settings/components/settings.tsx +12 -12
  375. package/features/settings/settings.alert.ts +3 -3
  376. package/features/settings/settings.store.ts +1 -1
  377. package/features/skills/skills.schema.ts +0 -2
  378. package/features/thursday/ascii.const.ts +74 -0
  379. package/features/thursday/components/ascii-field.tsx +24 -44
  380. package/features/thursday/components/ascii-orb.tsx +525 -381
  381. package/features/thursday/components/call-log.tsx +46 -44
  382. package/features/thursday/components/face.tsx +40 -10
  383. package/features/thursday/components/side-captions.tsx +273 -0
  384. package/features/thursday/components/tab-state.tsx +14 -6
  385. package/features/thursday/components/thursday-mark.tsx +1 -0
  386. package/features/thursday/components/thursday-setting.tsx +633 -333
  387. package/features/thursday/components/thursday.tsx +315 -274
  388. package/features/thursday/components/voice-picker.tsx +255 -0
  389. package/features/thursday/face.store.ts +5 -0
  390. package/features/thursday/thursday.action.ts +96 -72
  391. package/features/thursday/thursday.query.ts +49 -30
  392. package/features/thursday/thursday.schema.ts +37 -35
  393. package/features/thursday/thursday.store.ts +14 -7
  394. package/features/thursday/tool-call.ts +3 -3
  395. package/features/thursday/tool-line.ts +5 -3
  396. package/features/thursday/use-thursday.ts +801 -457
  397. package/features/workspace/file-kind.ts +9 -0
  398. package/features/workspace/workspace.query.ts +17 -0
  399. package/features/workspace/workspace.ts +82 -36
  400. package/hooks/use-hotkey.ts +3 -2
  401. package/lib/live/live.schema.ts +26 -0
  402. package/lib/live/live.server.ts +153 -0
  403. package/lib/live/live.session.ts +574 -0
  404. package/lib/{realtime/realtime.tap.ts → live/live.tap.ts} +41 -12
  405. package/lib/live/live.transport.ts +152 -0
  406. package/lib/protocol/use-server-pages.ts +9 -5
  407. package/lib/utils.ts +21 -20
  408. package/package.json +2 -2
  409. package/public/voices/alloy.ogg +0 -0
  410. package/public/voices/ash.ogg +0 -0
  411. package/public/voices/ballad.ogg +0 -0
  412. package/public/voices/beacon.ogg +0 -0
  413. package/public/voices/bossa.ogg +0 -0
  414. package/public/voices/cedar.ogg +0 -0
  415. package/public/voices/cinder.ogg +0 -0
  416. package/public/voices/coral.ogg +0 -0
  417. package/public/voices/delta.ogg +0 -0
  418. package/public/voices/echo.ogg +0 -0
  419. package/public/voices/gleam.ogg +0 -0
  420. package/public/voices/marin.ogg +0 -0
  421. package/public/voices/meridian.ogg +0 -0
  422. package/public/voices/quartz.ogg +0 -0
  423. package/public/voices/ripple.ogg +0 -0
  424. package/public/voices/sage.ogg +0 -0
  425. package/public/voices/shimmer.ogg +0 -0
  426. package/public/voices/stone.ogg +0 -0
  427. package/public/voices/tempo.ogg +0 -0
  428. package/public/voices/verse.ogg +0 -0
  429. package/public/voices/vesper.ogg +0 -0
  430. package/public/voices/willow.ogg +0 -0
  431. package/scripts/artifact-paths.test.mts +38 -0
  432. package/scripts/bot-context.test.mts +1408 -0
  433. package/scripts/live-history.test.mts +115 -0
  434. package/scripts/live-session.test.mts +938 -0
  435. package/server.js +1 -1
  436. package/skills/browser/SKILL.md +11 -1
  437. package/skills/computer/SKILL.md +1 -1
  438. package/skills/find-skills/SKILL.md +3 -8
  439. package/skills/interactive-page/SKILL.md +12 -7
  440. package/skills/interactive-page/references/diagram.md +89 -0
  441. package/skills/interactive-page/scripts/archify/LICENSE +22 -0
  442. package/skills/interactive-page/scripts/archify/README.md +25 -0
  443. package/skills/interactive-page/scripts/archify/assets/JetBrainsMono-OFL.txt +93 -0
  444. package/skills/interactive-page/scripts/archify/assets/template.html +14934 -0
  445. package/skills/interactive-page/scripts/archify/bin/archify.mjs +2126 -0
  446. package/skills/interactive-page/scripts/archify/bin/open-artifact.mjs +86 -0
  447. package/skills/interactive-page/scripts/archify/bin/preview.mjs +653 -0
  448. package/skills/interactive-page/scripts/archify/bin/visual-check.mjs +829 -0
  449. package/skills/interactive-page/scripts/archify/delta/architecture-delta.mjs +1223 -0
  450. package/skills/interactive-page/scripts/archify/examples/agent-run.lifecycle.json +60 -0
  451. package/skills/interactive-page/scripts/archify/examples/agent-tool-call.workflow.json +94 -0
  452. package/skills/interactive-page/scripts/archify/examples/async-job-roundtrip.sequence.json +61 -0
  453. package/skills/interactive-page/scripts/archify/examples/cache-miss-request.sequence.json +82 -0
  454. package/skills/interactive-page/scripts/archify/examples/checkout-platform.base.architecture.json +31 -0
  455. package/skills/interactive-page/scripts/archify/examples/checkout-platform.head.architecture.json +31 -0
  456. package/skills/interactive-page/scripts/archify/examples/deployment-release.lifecycle.json +49 -0
  457. package/skills/interactive-page/scripts/archify/examples/event-stream.dataflow.json +57 -0
  458. package/skills/interactive-page/scripts/archify/examples/incident-response.workflow.json +64 -0
  459. package/skills/interactive-page/scripts/archify/examples/product-analytics.dataflow.json +76 -0
  460. package/skills/interactive-page/scripts/archify/examples/production-deployment.architecture.json +71 -0
  461. package/skills/interactive-page/scripts/archify/examples/release-delivery.workflow.json +62 -0
  462. package/skills/interactive-page/scripts/archify/examples/web-app.architecture.json +46 -0
  463. package/skills/interactive-page/scripts/archify/migrations/workflow-v2.mjs +279 -0
  464. package/skills/interactive-page/scripts/archify/recipes/scenarios.mjs +284 -0
  465. package/skills/interactive-page/scripts/archify/references/authoring-contract.md +243 -0
  466. package/skills/interactive-page/scripts/archify/references/delivery-contract.md +120 -0
  467. package/skills/interactive-page/scripts/archify/references/viewer-runtime.md +45 -0
  468. package/skills/interactive-page/scripts/archify/renderers/architecture/grid.mjs +62 -0
  469. package/skills/interactive-page/scripts/archify/renderers/architecture/render-architecture.mjs +1078 -0
  470. package/skills/interactive-page/scripts/archify/renderers/dataflow/README.md +104 -0
  471. package/skills/interactive-page/scripts/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  472. package/skills/interactive-page/scripts/archify/renderers/lifecycle/README.md +115 -0
  473. package/skills/interactive-page/scripts/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  474. package/skills/interactive-page/scripts/archify/renderers/sequence/README.md +114 -0
  475. package/skills/interactive-page/scripts/archify/renderers/sequence/render-sequence.mjs +464 -0
  476. package/skills/interactive-page/scripts/archify/renderers/shared/brand-marks.mjs +563 -0
  477. package/skills/interactive-page/scripts/archify/renderers/shared/cli.mjs +218 -0
  478. package/skills/interactive-page/scripts/archify/renderers/shared/desktop-readability.mjs +26 -0
  479. package/skills/interactive-page/scripts/archify/renderers/shared/diagnostics.mjs +127 -0
  480. package/skills/interactive-page/scripts/archify/renderers/shared/engineering-profiles.mjs +157 -0
  481. package/skills/interactive-page/scripts/archify/renderers/shared/generated-brand-marks.mjs +3 -0
  482. package/skills/interactive-page/scripts/archify/renderers/shared/generated-validators.mjs +13 -0
  483. package/skills/interactive-page/scripts/archify/renderers/shared/geometry.mjs +1423 -0
  484. package/skills/interactive-page/scripts/archify/renderers/shared/i18n.mjs +595 -0
  485. package/skills/interactive-page/scripts/archify/renderers/shared/layout-report.mjs +40 -0
  486. package/skills/interactive-page/scripts/archify/renderers/shared/legend.mjs +217 -0
  487. package/skills/interactive-page/scripts/archify/renderers/shared/output-path.mjs +340 -0
  488. package/skills/interactive-page/scripts/archify/renderers/shared/repository-evidence.mjs +238 -0
  489. package/skills/interactive-page/scripts/archify/renderers/shared/repository-location.mjs +58 -0
  490. package/skills/interactive-page/scripts/archify/renderers/shared/text-fit.mjs +49 -0
  491. package/skills/interactive-page/scripts/archify/renderers/shared/utils.mjs +232 -0
  492. package/skills/interactive-page/scripts/archify/renderers/shared/validator.mjs +86 -0
  493. package/skills/interactive-page/scripts/archify/renderers/workflow/README.md +223 -0
  494. package/skills/interactive-page/scripts/archify/renderers/workflow/render-workflow.mjs +35 -0
  495. package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  496. package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  497. package/skills/interactive-page/scripts/archify/schemas/README.md +211 -0
  498. package/skills/interactive-page/scripts/archify/schemas/architecture.schema.json +178 -0
  499. package/skills/interactive-page/scripts/archify/schemas/common.schema.json +115 -0
  500. package/skills/interactive-page/scripts/archify/schemas/dataflow.schema.json +243 -0
  501. package/skills/interactive-page/scripts/archify/schemas/lifecycle.schema.json +266 -0
  502. package/skills/interactive-page/scripts/archify/schemas/sequence.schema.json +223 -0
  503. package/skills/interactive-page/scripts/archify/schemas/workflow.schema.json +428 -0
  504. package/skills/interactive-page/scripts/archify/scripts/check-render-output.mjs +916 -0
  505. package/skills/interactive-page/scripts/archify/scripts/render-examples.mjs +26 -0
  506. package/skills/interactive-page/scripts/bundle-artifact.sh +9 -8
  507. package/skills/skill-creator/SKILL.md +4 -5
  508. package/.next/server/app/api/bot/task/[id]/route/app-paths-manifest.json +0 -3
  509. package/.next/server/app/api/bot/task/[id]/route.js +0 -16
  510. package/.next/server/app/api/bot/task/[id]/route.js.nft.json +0 -1
  511. package/.next/server/app/api/bot/task/[id]/route_client-reference-manifest.js +0 -3
  512. package/.next/server/app/api/bot/task/route/app-paths-manifest.json +0 -3
  513. package/.next/server/app/api/bot/task/route.js +0 -16
  514. package/.next/server/app/api/bot/task/route.js.nft.json +0 -1
  515. package/.next/server/app/api/bot/task/route_client-reference-manifest.js +0 -3
  516. package/.next/server/chunks/[root-of-the-server]__026u77e._.js +0 -5
  517. package/.next/server/chunks/[root-of-the-server]__02va5wz._.js +0 -3
  518. package/.next/server/chunks/[root-of-the-server]__050zri4._.js +0 -3
  519. package/.next/server/chunks/[root-of-the-server]__0bg9710._.js +0 -3
  520. package/.next/server/chunks/[root-of-the-server]__0ffbg85._.js +0 -3
  521. package/.next/server/chunks/[root-of-the-server]__0in-d5s._.js +0 -3
  522. package/.next/server/chunks/[root-of-the-server]__0ncs9uu._.js +0 -3
  523. package/.next/server/chunks/[root-of-the-server]__0pa9k-f._.js +0 -8
  524. package/.next/server/chunks/[root-of-the-server]__0qi_m0e._.js +0 -8
  525. package/.next/server/chunks/[root-of-the-server]__0tq0m_k._.js +0 -3
  526. package/.next/server/chunks/[root-of-the-server]__0xep6j_._.js +0 -3
  527. package/.next/server/chunks/[root-of-the-server]__1-ga0kh._.js +0 -5
  528. package/.next/server/chunks/[root-of-the-server]__11n256_._.js +0 -5
  529. package/.next/server/chunks/[root-of-the-server]__144l7qt._.js +0 -8
  530. package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +0 -5
  531. package/.next/server/chunks/[root-of-the-server]__1anc1p9._.js +0 -3
  532. package/.next/server/chunks/[root-of-the-server]__1fizn31._.js +0 -3
  533. package/.next/server/chunks/[root-of-the-server]__1jg8t86._.js +0 -8
  534. package/.next/server/chunks/[root-of-the-server]__1lldzy9._.js +0 -3
  535. package/.next/server/chunks/[root-of-the-server]__1llj3-b._.js +0 -3
  536. package/.next/server/chunks/[root-of-the-server]__1p8m3f4._.js +0 -3
  537. package/.next/server/chunks/[root-of-the-server]__1peqvsi._.js +0 -3
  538. package/.next/server/chunks/[root-of-the-server]__1w8gm5h._.js +0 -10
  539. package/.next/server/chunks/[root-of-the-server]__1xt39nn._.js +0 -8
  540. package/.next/server/chunks/[root-of-the-server]__1zb8mfo._.js +0 -8
  541. package/.next/server/chunks/_0-73of8._.js +0 -55
  542. package/.next/server/chunks/_0-fjql4._.js +0 -31
  543. package/.next/server/chunks/_00xh_q0._.js +0 -25
  544. package/.next/server/chunks/_051qh8u._.js +0 -3
  545. package/.next/server/chunks/_05sovvj._.js +0 -3
  546. package/.next/server/chunks/_091bi8d._.js +0 -3
  547. package/.next/server/chunks/_0fzqt2y._.js +0 -142
  548. package/.next/server/chunks/_0lr92vd._.js +0 -3
  549. package/.next/server/chunks/_0mecv0f._.js +0 -31
  550. package/.next/server/chunks/_0mh8j4m._.js +0 -3
  551. package/.next/server/chunks/_0sb7tlz._.js +0 -3
  552. package/.next/server/chunks/_0si7xzn._.js +0 -3
  553. package/.next/server/chunks/_0u10wmw._.js +0 -55
  554. package/.next/server/chunks/_0wp4le3._.js +0 -3
  555. package/.next/server/chunks/_0y5fg-x._.js +0 -3
  556. package/.next/server/chunks/_1230wbx._.js +0 -10
  557. package/.next/server/chunks/_12nheja._.js +0 -3
  558. package/.next/server/chunks/_13510xh._.js +0 -3
  559. package/.next/server/chunks/_15hq89o._.js +0 -3
  560. package/.next/server/chunks/_18-1wcc._.js +0 -55
  561. package/.next/server/chunks/_18d7-5p._.js +0 -3
  562. package/.next/server/chunks/_1c78vw5._.js +0 -237
  563. package/.next/server/chunks/_1h5_8sk._.js +0 -3
  564. package/.next/server/chunks/_1hdnxb7._.js +0 -3
  565. package/.next/server/chunks/_1j8k_j5._.js +0 -3
  566. package/.next/server/chunks/_1nula3v._.js +0 -3
  567. package/.next/server/chunks/_1php4eq._.js +0 -3
  568. package/.next/server/chunks/_1yuv4vp._.js +0 -3
  569. package/.next/server/chunks/_1zkfbaa._.js +0 -3
  570. package/.next/server/chunks/_next-internal_server_app_api_bot_task_[id]_route_actions_1_k_8u3.js +0 -3
  571. package/.next/server/chunks/_next-internal_server_app_api_bot_task_route_actions_0xln6ra.js +0 -3
  572. package/.next/server/chunks/features_0rpfxbk._.js +0 -3
  573. package/.next/server/chunks/features_1qf3cei._.js +0 -8
  574. package/.next/server/chunks/features_bot_0zt92oh._.js +0 -3
  575. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1jidylq._.js +0 -3
  576. package/.next/server/chunks/ssr/[externals]__0dizgek._.js +0 -3
  577. package/.next/server/chunks/ssr/[root-of-the-server]__0-nob52._.js +0 -4
  578. package/.next/server/chunks/ssr/[root-of-the-server]__092knlj._.js +0 -3
  579. package/.next/server/chunks/ssr/[root-of-the-server]__0mz33a7._.js +0 -3
  580. package/.next/server/chunks/ssr/[root-of-the-server]__0s4wb56._.js +0 -3
  581. package/.next/server/chunks/ssr/[root-of-the-server]__0s9dq5u._.js +0 -3
  582. package/.next/server/chunks/ssr/[root-of-the-server]__0sd3izg._.js +0 -3
  583. package/.next/server/chunks/ssr/[root-of-the-server]__0vnmv-s._.js +0 -3
  584. package/.next/server/chunks/ssr/[root-of-the-server]__1-13tcn._.js +0 -43
  585. package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +0 -61
  586. package/.next/server/chunks/ssr/[root-of-the-server]__1zidpfl._.js +0 -3
  587. package/.next/server/chunks/ssr/_001_ms1._.js +0 -33
  588. package/.next/server/chunks/ssr/_01n3o0m._.js +0 -3
  589. package/.next/server/chunks/ssr/_04z2c7b._.js +0 -3
  590. package/.next/server/chunks/ssr/_06tssji._.js +0 -3
  591. package/.next/server/chunks/ssr/_0fk4c7d._.js +0 -3
  592. package/.next/server/chunks/ssr/_0h42fze._.js +0 -3
  593. package/.next/server/chunks/ssr/_0h7zdni._.js +0 -3
  594. package/.next/server/chunks/ssr/_0mggveb._.js +0 -3
  595. package/.next/server/chunks/ssr/_0nbpc_8._.js +0 -3
  596. package/.next/server/chunks/ssr/_0q0zan6._.js +0 -70
  597. package/.next/server/chunks/ssr/_0zcjrbg._.js +0 -3
  598. package/.next/server/chunks/ssr/_0zhoc3r._.js +0 -3
  599. package/.next/server/chunks/ssr/_11j92tu._.js +0 -3
  600. package/.next/server/chunks/ssr/_13fke0x._.js +0 -3
  601. package/.next/server/chunks/ssr/_18cymkq._.js +0 -3
  602. package/.next/server/chunks/ssr/_1ebxla1._.js +0 -3
  603. package/.next/server/chunks/ssr/_1nj4niv._.js +0 -42
  604. package/.next/server/chunks/ssr/_1ov37if._.js +0 -3
  605. package/.next/server/chunks/ssr/_1ovmc9s._.js +0 -3
  606. package/.next/server/chunks/ssr/_1sji22n._.js +0 -3
  607. package/.next/server/chunks/ssr/_1vi_uo7._.js +0 -3
  608. package/.next/server/chunks/ssr/_1vyd1ji._.js +0 -3
  609. package/.next/server/chunks/ssr/_1xx4zlb._.js +0 -3
  610. package/.next/server/chunks/ssr/components_ui_1y1l7yj._.js +0 -3
  611. package/.next/server/chunks/ssr/features_bot_1s_-2vj._.js +0 -3
  612. package/.next/server/chunks/ssr/lib_realtime_12wg_dd._.js +0 -27
  613. package/.next/server/chunks/ssr/lib_realtime_15h_v1v._.js +0 -27
  614. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0npjf8-._.js +0 -3
  615. package/.next/static/chunks/0n3jle9kbqfr2.js +0 -40
  616. package/.next/static/chunks/0r5qcctujhxli.js +0 -1
  617. package/.next/static/chunks/10teww7wt-f6h.js +0 -1
  618. package/.next/static/chunks/126fj4pga_72k.js +0 -1
  619. package/.next/static/chunks/159udiexf6dom.js +0 -2
  620. package/.next/static/chunks/18a96rkhi4_yd.js +0 -1
  621. package/.next/static/chunks/18gi7o2ibrgh8.js +0 -3
  622. package/.next/static/chunks/1dkjg87pxk0n9.js +0 -28
  623. package/.next/static/chunks/1q9z1tohil7xn.js +0 -1
  624. package/.next/static/chunks/1sjgfets224re.js +0 -1
  625. package/.next/static/chunks/1wszsr83t01gh.js +0 -1
  626. package/.next/static/chunks/22_zkas21rpna.js +0 -1
  627. package/.next/static/chunks/2fh4-3z_q8b_w.js +0 -1
  628. package/.next/static/chunks/2h0sd2vumhb15.js +0 -1
  629. package/.next/static/chunks/2szintyibu0s5.js +0 -1
  630. package/.next/static/chunks/2t4vhi3m8ahya.js +0 -1
  631. package/.next/static/chunks/2tigdtz3dpcy8.js +0 -1
  632. package/.next/static/chunks/3-b6b7entqazs.js +0 -1
  633. package/.next/static/chunks/3786h5vayt80-.js +0 -28
  634. package/.next/static/chunks/3cq5g494yuke8.css +0 -1
  635. package/.next/static/chunks/3dmbhsv2u_8kj.js +0 -1
  636. package/.next/static/chunks/3hibbjnt85-k6.js +0 -1
  637. package/.next/static/chunks/3i0a5px-oufgc.js +0 -1
  638. package/.next/static/chunks/3wexk9qo8zuj3.js +0 -18
  639. package/.next/static/chunks/3xk7yqgomx7yq.js +0 -1
  640. package/.next/static/chunks/3xre8bu_pk1p_.js +0 -1
  641. package/.next/static/chunks/3zv6t3i77xhr_.js +0 -1
  642. package/database/migrations/20260911030320_opposite_jack_power/migration.sql +0 -1
  643. package/docs/images/task-thread.png +0 -0
  644. package/features/bot/components/task-badge.tsx +0 -42
  645. package/features/bot/components/task-reply.tsx +0 -328
  646. package/features/bot/components/task-setting.tsx +0 -524
  647. package/features/bot/task.query.ts +0 -1079
  648. package/features/bot/task.store.ts +0 -487
  649. package/lib/realtime/client-secret.ts +0 -86
  650. package/lib/realtime/open-session.ts +0 -31
  651. package/lib/realtime/openai.ts +0 -35
  652. package/lib/realtime/realtime.audio.ts +0 -196
  653. package/lib/realtime/realtime.driver.ts +0 -489
  654. package/lib/realtime/realtime.protocol.ts +0 -393
  655. package/lib/realtime/realtime.schema.ts +0 -37
  656. package/lib/realtime/realtime.session.ts +0 -106
  657. package/lib/realtime/realtime.transport.ts +0 -384
  658. package/lib/realtime/xai.ts +0 -39
  659. /package/.next/server/app/api/bot/{task → thread}/[id]/route/build-manifest.json +0 -0
  660. /package/.next/server/app/api/bot/{task → thread}/[id]/route/server-reference-manifest.json +0 -0
  661. /package/.next/server/app/api/bot/{task → thread}/[id]/route.js.map +0 -0
  662. /package/.next/server/app/api/bot/{task → thread}/route/build-manifest.json +0 -0
  663. /package/.next/server/app/api/bot/{task → thread}/route/server-reference-manifest.json +0 -0
  664. /package/.next/server/app/api/bot/{task → thread}/route.js.map +0 -0
  665. /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → yyRVBc0xxYQsh3GpbQX9b}/_buildManifest.js +0 -0
  666. /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → yyRVBc0xxYQsh3GpbQX9b}/_clientMiddlewareManifest.js +0 -0
  667. /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → yyRVBc0xxYQsh3GpbQX9b}/_ssgManifest.js +0 -0
@@ -3,25 +3,25 @@ import { formatDistanceToNowStrict } from "date-fns";
3
3
  import { CALL_EXEC_TIMEOUT_MS, IS_DEV } from "@/config";
4
4
  import type { TextModel } from "@/features/ai/model";
5
5
  import { clockNow } from "@/features/ai/prompts/prompt-helper";
6
- import {
7
- answerTool,
8
- askThursdayTool,
9
- delegateSpec,
10
- taskSpec,
11
- } from "@/features/ai/tools/bot.tool";
12
- import { CALL_TOOLS } from "@/features/ai/tools/call.tool";
6
+ import { delegateSpec, threadSpec } from "@/features/ai/tools/bot.tool";
7
+ import { callTools } from "@/features/ai/tools/call.tool";
13
8
  import { createMcpTools } from "@/features/ai/tools/mcp.tool";
14
9
  import { createMemoryTools } from "@/features/ai/tools/memory.tool";
15
10
  import { createSearchTool } from "@/features/ai/tools/search.tool";
16
11
  import { createSkillTools } from "@/features/ai/tools/skills.tool";
17
12
  import { TOOL_NAMES } from "@/features/ai/tools/tool-name";
18
13
  import { createWorkspaceTools } from "@/features/ai/tools/workspace.tool";
19
- import { taskActivity } from "@/features/bot/bot.schema";
14
+ import { threadActivity } from "@/features/bot/bot.schema";
20
15
  import { loadSkills } from "@/features/skills/skills.discover";
21
16
  import { readCallSkillsOn } from "@/features/thursday/thursday.query";
22
- import { jobShellEnv, openWorkspace } from "@/features/workspace/workspace";
17
+ import {
18
+ botShellEnv,
19
+ jobShellEnv,
20
+ openWorkspace,
21
+ } from "@/features/workspace/workspace";
23
22
  import { toDate } from "@/lib/date-like";
24
23
  import { logger } from "@/lib/logger";
24
+ import { isPublicError } from "@/lib/public-error";
25
25
  import { estimateTokens } from "@/lib/tokens";
26
26
  import { clip } from "@/lib/utils";
27
27
 
@@ -41,14 +41,16 @@ export type ToolTarget = "thursday" | "bot" | "memory-edit";
41
41
  export type ToolRun =
42
42
  | {
43
43
  target: "thursday";
44
- /** The current call; written on the task row `delegate` opens. */
44
+ /** The current call; written on the thread row `delegate` opens. */
45
45
  callId?: string | null;
46
+ /** The face can show a word (the ascii orb): the call is given `emote`. */
47
+ faceWords?: boolean;
46
48
  }
47
49
  | {
48
50
  target: "bot";
49
51
  /** This run's bot name, the key of the bot table. */
50
52
  bot: string;
51
- /** The browser session this run's shell drives (workspace.ts jobShellEnv): the job's, or a borrowed bot's own. */
53
+ /** The browser session this run's shell drives (workspace.ts jobShellEnv): this participant's own in the job. */
52
54
  session?: string | null;
53
55
  /** The model this run already resolved (bot.run resolveModel); its own native search is what `web_search` uses when no Exa key is set (tools/search.tool). */
54
56
  model?: TextModel | null;
@@ -58,10 +60,10 @@ export type ToolRun =
58
60
 
59
61
  /**
60
62
  * Starting work and following it. bot.runner is imported dynamically to break a cycle
61
- * (runner -> bot.run -> this file). `delegate` records which call opened the job; that decides
62
- * who is told when it ends (bot.runner).
63
+ * (runner -> bot.run -> this file). `delegate` records which call opened the job, so a
64
+ * later call's prompt finds the job under the line that opened it (Earlier calls).
63
65
  */
64
- function createTaskTools(callId: string | null | undefined): ToolSet {
66
+ function createThreadTools(callId: string | null | undefined): ToolSet {
65
67
  return {
66
68
  [TOOL_NAMES.delegate]: tool({
67
69
  description: delegateSpec.description,
@@ -81,8 +83,8 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
81
83
  }
82
84
 
83
85
  // The row carries the bot's own spelling, not the transcript's
84
- const { startTask } = await import("@/features/bot/bot.runner");
85
- const id = await startTask({
86
+ const { startThread } = await import("@/features/bot/bot.runner");
87
+ const id = await startThread({
86
88
  bot: found.name,
87
89
  request,
88
90
  label,
@@ -90,20 +92,20 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
90
92
  from: "thursday",
91
93
  });
92
94
  return {
93
- taskId: id,
95
+ threadId: id,
94
96
  // The label is the handle: without it in front of her, a follow-up
95
97
  // becomes a second job instead of a word to the one running
96
- note: `${found.name} has "${label}". Say so and keep talking — the result is put in front of you later. Everything further about it — an answer, a correction, carrying it on after it answers — is \`${TOOL_NAMES.task}\` with "${label}".`,
98
+ note: `${found.name} has "${label}". Its updates reach the conversation on their own. Anything further about this work — an answer, a correction, the next step once it finishes — is \`${TOOL_NAMES.thread}\` with "${label}".`,
97
99
  };
98
100
  },
99
101
  }),
100
102
 
101
- [TOOL_NAMES.task]: tool({
102
- description: taskSpec.description,
103
- inputSchema: taskSpec.parameters,
104
- execute: async ({ action, task, answer }) => {
105
- const { listTaskHistory, resolveTask } = await import(
106
- "@/features/bot/task.query"
103
+ [TOOL_NAMES.thread]: tool({
104
+ description: threadSpec.description,
105
+ inputSchema: threadSpec.parameters,
106
+ execute: async ({ action, thread, answer, recipient, replyTo }) => {
107
+ const { listThreadOverview, resolveThread } = await import(
108
+ "@/features/bot/thread.query"
107
109
  );
108
110
  if (action === "status") {
109
111
  // `status` only reads, and text left in `answer` reaches nobody — it
@@ -118,15 +120,21 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
118
120
  // opened and a call can run for hours; `since` is measured against this.
119
121
  const now = { now: clockNow() };
120
122
  // A named job comes back whole; the list clips outcomes, and the model pads a clipped answer
121
- if (task) {
122
- const found = await resolveTask(task);
123
- const one = found;
124
- if (!one) return await noSuchJob(task);
123
+ if (thread) {
124
+ const one = await resolveThread(thread);
125
+ if (!one) return await noSuchJob(thread);
126
+ const { findThreadView } = await import(
127
+ "@/features/bot/thread.query"
128
+ );
129
+ const room = (await findThreadView(one.id))?.room;
125
130
  return {
126
131
  ...now,
127
132
  ...dropped,
128
133
  label: one.label,
134
+ id: one.id,
129
135
  bot: one.bot,
136
+ participants: room?.participants ?? [],
137
+ questions: room?.questions ?? [],
130
138
  status: one.status,
131
139
  since: formatDistanceToNowStrict(toDate(one.updatedAt), {
132
140
  addSuffix: true,
@@ -137,62 +145,122 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
137
145
  : {}),
138
146
  };
139
147
  }
140
- const tasks = await listTaskHistory({ limit: 8 });
141
- // No threads — only as much as is worth reading out: what it is
148
+ const threads = await listThreadOverview();
149
+ // No messages — only as much as is worth reading out: what it is
142
150
  // asking, the one line of what it is doing, or how it ended
143
151
  return {
144
152
  ...now,
145
153
  ...dropped,
146
- tasks: tasks.map((task) => ({
147
- label: task.label,
148
- bot: task.bot,
149
- status: task.status,
150
- since: formatDistanceToNowStrict(toDate(task.updatedAt), {
154
+ threads: threads.map((thread) => ({
155
+ id: thread.id,
156
+ label: thread.label,
157
+ bot: thread.bot,
158
+ status: thread.status,
159
+ participants: thread.room.participants,
160
+ questions: thread.room.questions.map((question) => ({
161
+ ...question,
162
+ text: clip(question.text, 200),
163
+ })),
164
+ since: formatDistanceToNowStrict(toDate(thread.updatedAt), {
151
165
  addSuffix: true,
152
166
  }),
153
- ...(task.ask
154
- ? { asking: task.ask.question, options: task.ask.options }
167
+ ...(thread.ask
168
+ ? { asking: thread.ask.question, options: thread.ask.options }
155
169
  : {}),
156
- ...(task.status === "running"
157
- ? { now: taskActivity(task.lines) }
170
+ ...(thread.status === "running"
171
+ ? { now: threadActivity(thread.lines) }
158
172
  : {}),
159
- ...(task.outcome && task.status !== "waiting"
160
- ? { outcome: clip(task.outcome, 200) }
173
+ ...(thread.outcome && thread.status !== "waiting"
174
+ ? { outcome: clip(thread.outcome, 200) }
161
175
  : {}),
162
176
  })),
163
177
  };
164
178
  }
165
- // A name is how a job is taken, but the one that just moved is what
166
- // "that one" means out loud, and making the model fetch a label it
167
- // already heard is what sends it to `delegate` instead. Cancel still
168
- // needs the name: it cannot be taken back.
169
- const { listInboxTasks } = await import("@/features/bot/task.query");
170
- const one = task
171
- ? await resolveTask(task)
179
+ // A name is how a job is taken. Unnamed, `open` shows the job that just
180
+ // moved, and `answer` reaches the one open question; words with no question
181
+ // waiting belong to a job the user names, never to whichever moved last.
182
+ // Cancel always needs the name: it cannot be taken back.
183
+ const { listInboxThreads, markSeen } = await import(
184
+ "@/features/bot/thread.query"
185
+ );
186
+ const unnamed = !thread && (action === "answer" || action === "open");
187
+ const inbox = unnamed ? await listInboxThreads() : [];
188
+ const asking =
189
+ action === "answer"
190
+ ? inbox.filter((row) => row.room.questions.length)
191
+ : [];
192
+ if (asking.length > 1)
193
+ return `Questions are waiting in more than one job: ${asking
194
+ .map(
195
+ (row) =>
196
+ `"${row.label}" (${row.room.questions.map((question) => question.bot).join(", ")})`,
197
+ )
198
+ .join(", ")}. Name the job.`;
199
+ const one = thread
200
+ ? await resolveThread(thread)
172
201
  : action === "answer"
173
- ? ((await listInboxTasks())[0] ?? null)
174
- : null;
202
+ ? (asking[0] ?? null)
203
+ : unnamed
204
+ ? (inbox[0] ?? null)
205
+ : null;
175
206
  if (!one) {
176
- if (task) return await noSuchJob(task);
177
- return action === "answer"
207
+ if (thread) return await noSuchJob(thread);
208
+ if (action === "answer")
209
+ return `No question is waiting. Name the job this is for; \`${TOOL_NAMES.thread}\` \`status\` lists them.`;
210
+ return unnamed
178
211
  ? "No job has moved yet — say which one, or check `status` first."
179
212
  : "Say which job — by its label. Call `status` with no job named to see them.";
180
213
  }
181
214
 
182
- const { answerTask, cancelTask } = await import(
215
+ if (action === "open") {
216
+ // The room on the call screen draws the inbox; an older job is only in the history
217
+ const room = unnamed ? inbox : await listInboxThreads();
218
+ if (!room.some((row) => row.id === one.id))
219
+ return `"${one.label}" is older than the call screen keeps; it is under Settings › Threads.`;
220
+ const { appEvents } = await import(
221
+ "@/app/api/events/app-event.server"
222
+ );
223
+ appEvents.emit({ type: "showThread", threadId: one.id });
224
+ return { label: one.label, open: true };
225
+ }
226
+ if (action === "seen") {
227
+ // The same as opening it on screen: it leaves the work waiting on the user
228
+ await markSeen([one.id]);
229
+ return { label: one.label, seen: true };
230
+ }
231
+ const { answerThread, cancelThread } = await import(
183
232
  "@/features/bot/bot.runner"
184
233
  );
185
234
  if (action === "cancel") {
186
- await cancelTask(one.id);
235
+ await cancelThread(one.id);
187
236
  return { label: one.label, status: "cancelled" };
188
237
  }
189
238
  if (!answer?.trim()) return "Say what to pass on.";
190
- await answerTask(one.id, answer.trim(), "thursday");
239
+ let told: Awaited<ReturnType<typeof answerThread>>;
240
+ try {
241
+ told = await answerThread(
242
+ one.id,
243
+ answer.trim(),
244
+ "thursday",
245
+ recipient ?? undefined,
246
+ replyTo ?? undefined,
247
+ );
248
+ } catch (cause) {
249
+ // Which question, or that it is gone, is the model's to fix: one line it can act on
250
+ if (isPublicError(cause)) return cause.message;
251
+ throw cause;
252
+ }
253
+ if (told?.answered)
254
+ return {
255
+ label: one.label,
256
+ answered: told.answered,
257
+ note: `${told.answered.bot} has the answer to its question and goes on from it.`,
258
+ };
191
259
  return {
192
260
  // Named even when the model named it: with no job given this is the
193
261
  // one that moved last, and saying which makes a wrong one obvious
194
262
  label: one.label,
195
- bot: one.bot,
263
+ bot: told?.to ?? one.bot,
196
264
  status: "running",
197
265
  note:
198
266
  one.status === "running"
@@ -206,11 +274,11 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
206
274
 
207
275
  /** An unresolved reference answers with the recent jobs; a bare "no such job" is read as an error and relayed as one. */
208
276
  async function noSuchJob(ref: string): Promise<string> {
209
- const { listTaskHistory } = await import("@/features/bot/task.query");
210
- const recent = await listTaskHistory({ limit: 5 });
277
+ const { listThreadOverview } = await import("@/features/bot/thread.query");
278
+ const recent = await listThreadOverview();
211
279
  if (!recent.length) return "No jobs have been handed over yet.";
212
280
  const names = recent
213
- .map((task) => `"${task.label}" (${task.bot}, ${task.status})`)
281
+ .map((thread) => `"${thread.label}" (${thread.bot}, ${thread.status})`)
214
282
  .join(", ");
215
283
  return `There is no job called "${ref}". The latest are: ${names}. Call again with one of those names.`;
216
284
  }
@@ -261,11 +329,16 @@ async function buildTools(run: ToolRun): Promise<ToolSet> {
261
329
  };
262
330
  }
263
331
 
264
- // The call's hand. A bot is handed only the reads from it (below).
265
- const memory = createMemoryTools(
266
- "call",
267
- run.target === "thursday" ? (run.callId ?? null) : null,
268
- );
332
+ // The call's hand; a fact it writes is tied to the call it was said in. A bot
333
+ // is handed only the reads from it (below).
334
+ const { [TOOL_NAMES.memory_conversation]: conversation, ...memory } =
335
+ createMemoryTools(
336
+ "call",
337
+ run.target === "thursday" ? (run.callId ?? null) : null,
338
+ );
339
+ const readBack: ToolSet = {
340
+ [TOOL_NAMES.memory_conversation]: conversation,
341
+ };
269
342
 
270
343
  const sandbox = await openWorkspace();
271
344
 
@@ -279,46 +352,46 @@ async function buildTools(run: ToolRun): Promise<ToolSet> {
279
352
 
280
353
  return {
281
354
  ...memory,
355
+ ...readBack,
282
356
  ...skills,
283
- // The shell alone, for no longer than a call can sit silent on it: the mic
284
- // is closed while a tool runs (config CALL_EXEC_TIMEOUT_MS). A whole file is
285
- // a job, not a glance (workspace.tool)
357
+ // The shell alone, for no longer than her answer can wait on it (config
358
+ // CALL_EXEC_TIMEOUT_MS). A whole file is a job, not a glance (workspace.tool)
286
359
  ...createWorkspaceTools(sandbox, {
287
360
  write: false,
288
361
  timeoutMs: CALL_EXEC_TIMEOUT_MS,
289
362
  }),
290
363
  // Handing work over, following it, and hanging up belong to the voice session only
291
- ...createTaskTools(run.callId),
292
- ...CALL_TOOLS,
364
+ ...createThreadTools(run.callId),
365
+ ...callTools(run.faceWords ?? false),
293
366
  };
294
367
  }
295
368
 
296
369
  // A bot works inside a job it did not open: it can pull another bot in but cannot start a job.
297
- // `ask_bot` and `ask_back` are attached by the runner (bot.run), which swaps `ask_thursday`
298
- // for `ask_back` in a borrowed bot. `answer` ends every run.
370
+ // The runner attaches messaging with the active continuation (bot.run).
299
371
  const skills = await loadSkills(sandbox);
300
372
  return {
301
373
  // A bot only reads memory: every write is the call's, and there is no screen to show a note on
302
374
  [TOOL_NAMES.memory_recall]: memory[TOOL_NAMES.memory_recall],
303
- [TOOL_NAMES.memory_conversation]: memory[TOOL_NAMES.memory_conversation],
375
+ ...readBack,
304
376
  // Exa when its key is set, else this bot's own model when it can search;
305
377
  // absent when neither, and the browser is the way in (search.tool)
306
378
  ...(await createSearchTool(run.model, sandbox)),
307
- // The browser rides in the shell: its session is this seat's — the job's, or
308
- // a borrowed bot's own — set by the server rather than typed by the model
309
- // (workspace.ts jobShellEnv)
379
+ // The browser rides in the shell: its session is this participant's in this job,
380
+ // set by the server rather than typed by the model (workspace.ts jobShellEnv),
381
+ // and so is the bot's artifacts folder
310
382
  ...createWorkspaceTools(sandbox, {
311
383
  write: true,
312
- env: jobShellEnv(run.session),
384
+ env: { ...jobShellEnv(run.session), ...botShellEnv(run.bot) },
313
385
  // What the shell is like and what this machine has, on the first command
314
- // of the run only (workspace.tool shellGuide). The call gets no guide:
386
+ // of the run only (workspace.tool SHELL_GUIDE). The call gets no guide:
315
387
  // one command is a glance, not a job to plan around
316
388
  guide: true,
389
+ // Its own memory stays within its limits whichever of the two writes it
390
+ // (bot.memory), and its finished work stays in its own folder
391
+ bot: run.bot,
317
392
  }),
318
393
  // Pinned tools come with schemas; the rest sit behind `tool_search`, absent when nothing is left to find (mcp.tool)
319
394
  ...(await createMcpTools(run.bot, sandbox)),
320
395
  ...createSkillTools({ sandbox, skills }),
321
- [TOOL_NAMES.ask_thursday]: askThursdayTool,
322
- [TOOL_NAMES.answer]: answerTool,
323
396
  };
324
397
  }
@@ -1,9 +1,5 @@
1
1
  import { z } from "zod";
2
2
  import { BOT_RUN } from "@/config";
3
- import {
4
- REALTIME_PROVIDERS,
5
- type SpeachModelProviderId,
6
- } from "@/lib/realtime/realtime.schema";
7
3
 
8
4
  /** Providers and model catalogs. Nothing is stored here; a model is named by whatever runs on it. */
9
5
 
@@ -25,20 +21,6 @@ export const textModelRefSchema = z.object({
25
21
  export type TextModelProviderId = z.infer<typeof textModelProviderSchema>;
26
22
  export type TextModelRef = z.infer<typeof textModelRefSchema>;
27
23
 
28
- /** Who runs the call. The ids are the realtime drivers that exist (lib/realtime/realtime.schema). */
29
- export const speachModelProviderSchema = z.enum(REALTIME_PROVIDERS);
30
-
31
- export const speachModelRefSchema = z.object({
32
- provider: speachModelProviderSchema,
33
- /** Null means whatever that provider's default voice is. */
34
- voice: z.string().trim().min(1).max(64).nullish(),
35
- /** Null means that provider's first model (SPEACH_MODEL_PROVIDERS). Free text so a new model needs no edit here. */
36
- model: z.string().trim().min(1).max(80).nullish(),
37
- });
38
-
39
- export type { SpeachModelProviderId };
40
- export type SpeachModelRef = z.infer<typeof speachModelRefSchema>;
41
-
42
24
  /** Size of a suggested model, not quality. A label rather than a price because prices move. */
43
25
  export const MODEL_TIERS = ["small", "mid", "large"] as const;
44
26
  export type ModelTier = (typeof MODEL_TIERS)[number];
@@ -262,11 +244,6 @@ export const MEDIA_MODEL_PROVIDERS: Record<
262
244
  label: "Grok Imagine 2.0",
263
245
  tier: "small",
264
246
  },
265
- {
266
- id: "google/gemini-3.1-flash-image",
267
- label: "Gemini 3.1 Flash Image",
268
- tier: "mid",
269
- },
270
247
  { id: "bfl/flux-2-pro", label: "FLUX 2 Pro", tier: "mid" },
271
248
  {
272
249
  id: "bytedance/seedream-5.0-pro",
@@ -274,11 +251,6 @@ export const MEDIA_MODEL_PROVIDERS: Record<
274
251
  tier: "mid",
275
252
  },
276
253
  { id: "recraft/recraft-v4.1", label: "Recraft V4.1", tier: "mid" },
277
- {
278
- id: "google/gemini-3-pro-image",
279
- label: "Gemini 3 Pro Image",
280
- tier: "large",
281
- },
282
254
  {
283
255
  id: "openai/gpt-image-2.5-sunburst",
284
256
  label: "GPT Image 2.5 Sunburst",
@@ -370,10 +342,6 @@ export const canMakeKind = (provider: string, kind: MediaKind): boolean =>
370
342
  (MEDIA_MODEL_PROVIDERS[provider as MediaModelProviderId]?.models[kind]
371
343
  ?.length ?? 0) > 0;
372
344
 
373
- /** How a pick is stored and shown: "openai/gpt-image-2". Split on the first slash only; gateway ids carry a slash of their own. */
374
- export const formatMediaModel = (ref: MediaModelRef) =>
375
- `${ref.provider}/${ref.model}`;
376
-
377
345
  /** `provider/model` for a text model, as the default-model config stores it. */
378
346
  export function parseTextModel(value: string | undefined): TextModelRef | null {
379
347
  const [provider, ...rest] = (value ?? "").trim().split("/");
@@ -384,6 +352,7 @@ export function parseTextModel(value: string | undefined): TextModelRef | null {
384
352
  return parsed.success ? parsed.data : null;
385
353
  }
386
354
 
355
+ /** How a media pick is stored: "openai/gpt-image-2". Split on the first slash only; gateway ids carry a slash of their own. */
387
356
  export function parseMediaModel(
388
357
  value: string | undefined,
389
358
  ): MediaModelRef | null {
@@ -595,93 +564,6 @@ const modelOfTier = (
595
564
  export const defaultModelOf = (provider: { suggestModels: SuggestModel[] }) =>
596
565
  modelOfTier(provider, "mid");
597
566
 
598
- /**
599
- * The speech-to-speech backends. `models` and `voices` are suggestion lists, not validation
600
- * lists (the api takes more, e.g. a cloned voice id); the first model is the default. Written
601
- * out rather than fetched, best first.
602
- */
603
- export const SPEACH_MODEL_PROVIDERS: Record<
604
- SpeachModelProviderId,
605
- {
606
- label: string;
607
- apiKeyName: string;
608
- /** What a key of theirs starts with (`detectSpeachProvider`); longest match wins. */
609
- keyPrefix: string[];
610
- /** Newest first — the head of this list is the default. */
611
- models: { id: string; label: string }[];
612
- voices: string[];
613
- defaultVoice: string;
614
- }
615
- > = {
616
- openai: {
617
- apiKeyName: TEXT_MODEL_PROVIDERS.openai.apiKeyName,
618
- label: TEXT_MODEL_PROVIDERS.openai.label,
619
- keyPrefix: ["sk-"],
620
- models: [
621
- { id: "gpt-realtime-2.1", label: "Realtime 2.1" },
622
- { id: "gpt-realtime-2.1-mini", label: "Realtime 2.1 mini" },
623
- { id: "gpt-realtime-2", label: "Realtime 2" },
624
- ],
625
- // The spec's VoiceIdsShared enum; `marin` and `cedar` lead as the realtime docs' best-quality voices
626
- voices: [
627
- "marin",
628
- "cedar",
629
- "alloy",
630
- "ash",
631
- "ballad",
632
- "coral",
633
- "echo",
634
- "sage",
635
- "shimmer",
636
- "verse",
637
- ],
638
- defaultVoice: "marin",
639
- },
640
- xai: {
641
- apiKeyName: TEXT_MODEL_PROVIDERS.xai.apiKeyName,
642
- label: TEXT_MODEL_PROVIDERS.xai.label,
643
- keyPrefix: ["xai-"],
644
- models: [
645
- { id: "grok-voice-think-fast-2.0", label: "Voice Think Fast 2.0" },
646
- // Tracks whatever xAI ships next; second because a name that moves under a running call is not a default
647
- { id: "grok-voice-latest", label: "Voice latest" },
648
- ],
649
- // `eve` is xAI's own default. All built-in ids; a cloned voice from POST /v1/custom-voices goes in the same field
650
- voices: ["eve", "ara", "leo", "rex", "sal"],
651
- defaultVoice: "eve",
652
- },
653
- };
654
-
655
- /**
656
- * Which voice provider a pasted key belongs to; null when unknown. `sk-ant-` is excluded
657
- * because Anthropic keys share OpenAI's prefix and Anthropic cannot take a call.
658
- */
659
- export function detectSpeachProvider(
660
- key: string,
661
- ): SpeachModelProviderId | null {
662
- const trimmed = key.trim();
663
- if (!trimmed || trimmed.startsWith("sk-ant-")) return null;
664
-
665
- let found: SpeachModelProviderId | null = null;
666
- let longest = 0;
667
- for (const id of Object.keys(
668
- SPEACH_MODEL_PROVIDERS,
669
- ) as SpeachModelProviderId[]) {
670
- for (const prefix of SPEACH_MODEL_PROVIDERS[id].keyPrefix) {
671
- if (trimmed.startsWith(prefix) && prefix.length > longest) {
672
- found = id;
673
- longest = prefix.length;
674
- }
675
- }
676
- }
677
- return found;
678
- }
679
-
680
- /** The record above in a stable order — the voice picker walks it. */
681
- export const SPEACH_MODEL_PROVIDER_LIST = (
682
- Object.keys(SPEACH_MODEL_PROVIDERS) as SpeachModelProviderId[]
683
- ).map((id) => ({ id, ...SPEACH_MODEL_PROVIDERS[id] }));
684
-
685
567
  /** The record above in a stable order — routes and pickers walk it. */
686
568
  export const TEXT_MODEL_PROVIDER_LIST = (
687
569
  Object.keys(TEXT_MODEL_PROVIDERS) as TextModelProviderId[]
@@ -747,7 +629,7 @@ export type GatewayModel = {
747
629
  label: string;
748
630
  /** Who runs it, the gateway's own word. Four of them are providers this app draws (provider-icon). */
749
631
  owner: string;
750
- /** Settled in ai/model `readGatewayCatalog`, not passed through; null when the gateway did not say. */
632
+ /** The gateway's own word, as `readGatewayCatalog` received it; null when it did not say. */
751
633
  type?: string | null;
752
634
  /** The gateway's own words for what a model can do; only `tool-use` is read. */
753
635
  tags: string[];