thursday-agent 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (657) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +3 -2
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/required-server-files.json +8 -1
  6. package/.next/routes-manifest.json +18 -6
  7. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/server/app/_global-error.html +1 -1
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  14. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/server/app/_not-found.html +1 -1
  16. package/.next/server/app/_not-found.rsc +13 -13
  17. package/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +12 -12
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  20. package/.next/server/app/api/artifact/route.js +10 -6
  21. package/.next/server/app/api/artifact/route.js.nft.json +1 -1
  22. package/.next/server/app/api/bot/memory/files/route.js +6 -5
  23. package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
  24. package/.next/server/app/api/bot/memory/route.js +8 -8
  25. package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
  26. package/.next/server/app/api/bot/route.js +8 -8
  27. package/.next/server/app/api/bot/route.js.nft.json +1 -1
  28. package/.next/server/app/api/bot/thread/[id]/route/app-paths-manifest.json +3 -0
  29. package/.next/server/app/api/bot/thread/[id]/route.js +15 -0
  30. package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -0
  31. package/.next/server/app/api/bot/thread/[id]/route_client-reference-manifest.js +3 -0
  32. package/.next/server/app/api/bot/thread/route/app-paths-manifest.json +3 -0
  33. package/.next/server/app/api/bot/thread/route.js +15 -0
  34. package/.next/server/app/api/bot/thread/route.js.nft.json +1 -0
  35. package/.next/server/app/api/bot/thread/route_client-reference-manifest.js +3 -0
  36. package/.next/server/app/api/config/route.js +7 -7
  37. package/.next/server/app/api/config/route.js.nft.json +1 -1
  38. package/.next/server/app/api/events/route.js +3 -3
  39. package/.next/server/app/api/events/route.js.nft.json +1 -1
  40. package/.next/server/app/api/file/[...path]/route.js +5 -5
  41. package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
  42. package/.next/server/app/api/llm-model/catalog/route.js +8 -8
  43. package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
  44. package/.next/server/app/api/llm-model/credits/route.js +8 -8
  45. package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -1
  46. package/.next/server/app/api/llm-model/route.js +8 -8
  47. package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
  48. package/.next/server/app/api/llm-model/subscription/route.js +8 -8
  49. package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -1
  50. package/.next/server/app/api/mcp/[name]/route.js +6 -6
  51. package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
  52. package/.next/server/app/api/mcp/oauth/callback/route.js +4 -4
  53. package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
  54. package/.next/server/app/api/mcp/route.js +6 -6
  55. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  56. package/.next/server/app/api/mcp/tools/route.js +6 -6
  57. package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
  58. package/.next/server/app/api/memory/edit/route.js +13 -13
  59. package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
  60. package/.next/server/app/api/memory/route.js +7 -6
  61. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  62. package/.next/server/app/api/skills/[source]/[name]/route.js +6 -6
  63. package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/skills/route.js +6 -6
  65. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  66. package/.next/server/app/api/thursday/call/route.js +10 -11
  67. package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
  68. package/.next/server/app/api/thursday/skills/route.js +10 -11
  69. package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
  70. package/.next/server/app/api/thursday/tool-call/route.js +15 -15
  71. package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
  72. package/.next/server/app/api/workspace/missing/route/app-paths-manifest.json +3 -0
  73. package/.next/server/app/api/workspace/missing/route/build-manifest.json +12 -0
  74. package/.next/server/app/api/workspace/missing/route/server-reference-manifest.json +4 -0
  75. package/.next/server/app/api/workspace/missing/route.js +12 -0
  76. package/.next/server/app/api/workspace/missing/route.js.map +5 -0
  77. package/.next/server/app/api/workspace/missing/route.js.nft.json +1 -0
  78. package/.next/server/app/api/workspace/missing/route_client-reference-manifest.js +3 -0
  79. package/.next/server/app/api/workspace/route.js +5 -4
  80. package/.next/server/app/api/workspace/route.js.nft.json +1 -1
  81. package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +1 -1
  82. package/.next/server/app/artifact/[...path]/page.js +4 -3
  83. package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
  84. package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
  85. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  86. package/.next/server/app/page/server-reference-manifest.json +67 -45
  87. package/.next/server/app/page.js +10 -9
  88. package/.next/server/app/page.js.nft.json +1 -1
  89. package/.next/server/app/page_client-reference-manifest.js +1 -1
  90. package/.next/server/app-paths-manifest.json +3 -2
  91. package/.next/server/chunks/[root-of-the-server]__02846fb._.js +8 -0
  92. package/.next/server/chunks/[root-of-the-server]__049f521._.js +3 -0
  93. package/.next/server/chunks/[root-of-the-server]__05luceg._.js +3 -0
  94. package/.next/server/chunks/[root-of-the-server]__06--3q3._.js +8 -0
  95. package/.next/server/chunks/[root-of-the-server]__07bnah_._.js +3 -0
  96. package/.next/server/chunks/[root-of-the-server]__08eae20._.js +8 -0
  97. package/.next/server/chunks/[root-of-the-server]__0_ue8oe._.js +3 -0
  98. package/.next/server/chunks/[root-of-the-server]__0c9fgca._.js +5 -0
  99. package/.next/server/chunks/[root-of-the-server]__0g-ueei._.js +8 -0
  100. package/.next/server/chunks/[root-of-the-server]__0h_x6q6._.js +5 -0
  101. package/.next/server/chunks/{[root-of-the-server]__0pa2n68._.js → [root-of-the-server]__0kxrvxf._.js} +2 -2
  102. package/.next/server/chunks/{[root-of-the-server]__0q0vvt2._.js → [root-of-the-server]__0ov3iir._.js} +2 -2
  103. package/.next/server/chunks/[root-of-the-server]__0qwtlmx._.js +8 -0
  104. package/.next/server/chunks/[root-of-the-server]__0sm5xvm._.js +3 -0
  105. package/.next/server/chunks/[root-of-the-server]__0ye3da2._.js +3 -0
  106. package/.next/server/chunks/[root-of-the-server]__0zp35ul._.js +5 -0
  107. package/.next/server/chunks/[root-of-the-server]__144u9d_._.js +3 -0
  108. package/.next/server/chunks/[root-of-the-server]__18-2tsq._.js +5 -0
  109. package/.next/server/chunks/[root-of-the-server]__1e-ci13._.js +3 -0
  110. package/.next/server/chunks/[root-of-the-server]__1e2365e._.js +8 -0
  111. package/.next/server/chunks/[root-of-the-server]__1fix932._.js +8 -0
  112. package/.next/server/chunks/{[root-of-the-server]__0ce8nf8._.js → [root-of-the-server]__1g3t7vn._.js} +3 -3
  113. package/.next/server/chunks/[root-of-the-server]__1kp-83u._.js +5 -0
  114. package/.next/server/chunks/[root-of-the-server]__1kv8p3e._.js +5 -0
  115. package/.next/server/chunks/[root-of-the-server]__1orn-5b._.js +2 -3
  116. package/.next/server/chunks/_02szwk8._.js +5 -0
  117. package/.next/server/chunks/_05h2cii._.js +1 -1
  118. package/.next/server/chunks/_06c9kie._.js +216 -0
  119. package/.next/server/chunks/{_1x6kd1r._.js → _07y2gj-._.js} +1 -1
  120. package/.next/server/chunks/_0a43a-0._.js +3 -0
  121. package/.next/server/chunks/_0bujjey._.js +5 -0
  122. package/.next/server/chunks/_0c9j6rb._.js +1 -1
  123. package/.next/server/chunks/_0dkd549._.js +3 -0
  124. package/.next/server/chunks/_0ej1kvv._.js +3 -0
  125. package/.next/server/chunks/_0f6ts7z._.js +3 -0
  126. package/.next/server/chunks/_0gm9hyv._.js +55 -0
  127. package/.next/server/chunks/_0i55en5._.js +25 -0
  128. package/.next/server/chunks/_0k50n27._.js +18 -0
  129. package/.next/server/chunks/_0khihjk._.js +3 -3
  130. package/.next/server/chunks/_0n74zsf._.js +5 -5
  131. package/.next/server/chunks/_0nvm9ef._.js +3 -0
  132. package/.next/server/chunks/_0p56fn0._.js +3 -0
  133. package/.next/server/chunks/_0recufk._.js +1 -1
  134. package/.next/server/chunks/_0xbkz10._.js +3 -0
  135. package/.next/server/chunks/_10tkr26._.js +3 -0
  136. package/.next/server/chunks/{_0ioz3nd._.js → _11u2kp7._.js} +1 -1
  137. package/.next/server/chunks/_11ujpya._.js +3 -0
  138. package/.next/server/chunks/_127nx_p._.js +5 -0
  139. package/.next/server/chunks/_17l5ygt._.js +1 -1
  140. package/.next/server/chunks/_19uauj6._.js +3 -0
  141. package/.next/server/chunks/_1_5mnq4._.js +5 -5
  142. package/.next/server/chunks/_1abl6t9._.js +55 -0
  143. package/.next/server/chunks/_1d0j961._.js +3 -3
  144. package/.next/server/chunks/_1dbixxz._.js +3 -0
  145. package/.next/server/chunks/_1dc_d1q._.js +98 -0
  146. package/.next/server/chunks/_1drgfx4._.js +5 -5
  147. package/.next/server/chunks/_1e48czp._.js +3 -3
  148. package/.next/server/chunks/_1f31u5x._.js +5 -0
  149. package/.next/server/chunks/_1kg70wc._.js +3 -3
  150. package/.next/server/chunks/_1klbcft._.js +5 -0
  151. package/.next/server/chunks/_1krd9rf._.js +4 -1
  152. package/.next/server/chunks/_1kwmzab._.js +3 -0
  153. package/.next/server/chunks/{_1pf4qe-._.js → _1oxj9fa._.js} +1 -1
  154. package/.next/server/chunks/{_1f46eie._.js → _1pcmdbb._.js} +1 -1
  155. package/.next/server/chunks/_1qgix-j._.js +3 -0
  156. package/.next/server/chunks/{lib_logger_ts_1exwjut._.js → _1rpchta._.js} +5 -5
  157. package/.next/server/chunks/_1vsej-s._.js +5 -0
  158. package/.next/server/chunks/_1yx0p_s._.js +5 -0
  159. package/.next/server/chunks/{_0rnf-6n._.js → _20fsr_z._.js} +6 -6
  160. package/.next/server/chunks/_2128hkj._.js +5 -0
  161. package/.next/server/chunks/_next-internal_server_app_api_bot_thread_[id]_route_actions_1fstjn2.js +3 -0
  162. package/.next/server/chunks/_next-internal_server_app_api_bot_thread_route_actions_003ccso.js +3 -0
  163. package/.next/server/chunks/_next-internal_server_app_api_workspace_missing_route_actions_1fidi6p.js +3 -0
  164. package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
  165. package/.next/server/chunks/features_0-cnt0l._.js +4 -0
  166. package/.next/server/chunks/features_0hdaci0._.js +4 -0
  167. package/.next/server/chunks/features_1e39j7-._.js +8 -0
  168. package/.next/server/chunks/features_bot_bot_query_ts_12mgkl2._.js +1 -1
  169. package/.next/server/chunks/features_memory_1uqvksn._.js +1 -1
  170. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0r28-sm._.js → node_modules_consola_dist_chunks_prompt_mjs_0a7-pbw._.js} +1 -1
  171. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0v_7drq._.js → node_modules_consola_dist_chunks_prompt_mjs_0gzvgfv._.js} +1 -1
  172. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0i7cvml._.js → node_modules_consola_dist_chunks_prompt_mjs_107pxfn._.js} +1 -1
  173. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0icqaqw._.js → node_modules_consola_dist_chunks_prompt_mjs_15hbel8._.js} +1 -1
  174. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_18i-23e._.js +3 -0
  175. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1bewgf3._.js +3 -0
  176. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1kipdeo._.js +3 -0
  177. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1nlww1m._.js +3 -0
  178. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1q77nfx._.js +3 -0
  179. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xqdzx_._.js +3 -0
  180. package/.next/server/chunks/{node_modules_zod_v4_1801ax7._.js → node_modules_zod_v4_0lkux5-._.js} +2 -2
  181. package/.next/server/chunks/{node_modules_zod_v4_1cha_bw._.js → node_modules_zod_v4_1jmr9cq._.js} +2 -2
  182. package/.next/server/chunks/{node_modules_zod_v4_0ubdflj._.js → node_modules_zod_v4_1yrxmek._.js} +2 -2
  183. package/.next/server/chunks/node_modules_zod_v4_classic_errors_0tp0y-q.js +3 -0
  184. package/.next/server/chunks/ssr/[root-of-the-server]__09q9med._.js +1 -1
  185. package/.next/server/chunks/ssr/[root-of-the-server]__0bxsfyn._.js +101 -0
  186. package/.next/server/chunks/ssr/[root-of-the-server]__0lyi8i2._.js +1 -1
  187. package/.next/server/chunks/ssr/[root-of-the-server]__16jc196._.js +1 -1
  188. package/.next/server/chunks/ssr/[root-of-the-server]__172cq4x._.js +3 -0
  189. package/.next/server/chunks/ssr/[root-of-the-server]__18dthbp._.js +3 -0
  190. package/.next/server/chunks/ssr/[root-of-the-server]__18e68w8._.js +3 -0
  191. package/.next/server/chunks/ssr/[root-of-the-server]__1fll8dc._.js +3 -0
  192. package/.next/server/chunks/ssr/[root-of-the-server]__1mzi-ju._.js +1 -1
  193. package/.next/server/chunks/ssr/[root-of-the-server]__1nygfik._.js +5 -0
  194. package/.next/server/chunks/ssr/[root-of-the-server]__1sdphb0._.js +8 -0
  195. package/.next/server/chunks/ssr/[root-of-the-server]__1waa3rc._.js +100 -0
  196. package/.next/server/chunks/ssr/_00rehl_._.js +3 -0
  197. package/.next/server/chunks/ssr/{_1lz_cq2._.js → _02oc_h5._.js} +76 -89
  198. package/.next/server/chunks/ssr/_03_928f._.js +3 -0
  199. package/.next/server/chunks/ssr/_05yghx6._.js +3 -0
  200. package/.next/server/chunks/ssr/_08c4z-9._.js +3 -0
  201. package/.next/server/chunks/ssr/_0_qfdlw._.js +4 -0
  202. package/.next/server/chunks/ssr/_0c9e5w6._.js +9 -0
  203. package/.next/server/chunks/ssr/{_0s99bgb._.js → _0dh2e1j._.js} +9 -3
  204. package/.next/server/chunks/ssr/_0dr-ddg._.js +3 -0
  205. package/.next/server/chunks/ssr/_0eaog6_._.js +3 -0
  206. package/.next/server/chunks/ssr/_0evkpto._.js +3 -0
  207. package/.next/server/chunks/ssr/_0g_rlog._.js +3 -0
  208. package/.next/server/chunks/ssr/_0geg212._.js +3 -0
  209. package/.next/server/chunks/ssr/{_1gd8q8l._.js → _0hxt2ul._.js} +2 -2
  210. package/.next/server/chunks/ssr/_0i_6q1w._.js +2 -2
  211. package/.next/server/chunks/ssr/_0lu1n_x._.js +1 -1
  212. package/.next/server/chunks/ssr/{_15j2_8f._.js → _0wzaht-._.js} +2 -2
  213. package/.next/server/chunks/ssr/_0z-g0uy._.js +3 -0
  214. package/.next/server/chunks/ssr/_123ttsf._.js +3 -0
  215. package/.next/server/chunks/ssr/_123y-ah._.js +3 -0
  216. package/.next/server/chunks/ssr/_12w42gi._.js +3 -0
  217. package/.next/server/chunks/ssr/_161kqav._.js +3 -0
  218. package/.next/server/chunks/ssr/{_0ap2fzn._.js → _16c6_xm._.js} +2 -2
  219. package/.next/server/chunks/ssr/_18opah7._.js +3 -0
  220. package/.next/server/chunks/ssr/_18xqmny._.js +3 -0
  221. package/.next/server/chunks/ssr/_1_krfph._.js +3 -0
  222. package/.next/server/chunks/ssr/{_1-_etts._.js → _1anqots._.js} +2 -2
  223. package/.next/server/chunks/ssr/_1ey7qn-._.js +70 -0
  224. package/.next/server/chunks/ssr/_1g9vs7q._.js +3 -0
  225. package/.next/server/chunks/ssr/_1jmz33w._.js +3 -0
  226. package/.next/server/chunks/ssr/{_0n3toaw._.js → _1k0spz7._.js} +2 -2
  227. package/.next/server/chunks/ssr/_1rgtxhr._.js +5 -0
  228. package/.next/server/chunks/ssr/_1slp25y._.js +3 -0
  229. package/.next/server/chunks/ssr/{_1fojd41._.js → _1x9pskj._.js} +3 -3
  230. package/.next/server/chunks/ssr/_1y6b5mr._.js +101 -0
  231. package/.next/server/chunks/ssr/_1ztk7p6._.js +7 -0
  232. package/.next/server/chunks/ssr/components_ui_tabs_tsx_0ej40b4._.js +3 -0
  233. package/.next/server/chunks/ssr/features_bot_thread_query_ts_023eklt._.js +4 -0
  234. package/.next/server/chunks/ssr/features_config_components_config-setting_tsx_0xfwqdg._.js +1 -1
  235. package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
  236. package/.next/server/chunks/ssr/{_1-teee5._.js → lib_logger_ts_0-olsze._.js} +2 -7
  237. package/.next/server/chunks/ssr/{node_modules_0cxaxk9._.js → node_modules_00_51_v._.js} +1 -1
  238. package/.next/server/chunks/ssr/{node_modules_04jf_m8._.js → node_modules_022sipm._.js} +1 -1
  239. package/.next/server/chunks/ssr/{node_modules_0g7fzk3._.js → node_modules_0332gw4._.js} +1 -1
  240. package/.next/server/chunks/ssr/{node_modules_1cx_ql6._.js → node_modules_04vxchl._.js} +1 -1
  241. package/.next/server/chunks/ssr/{node_modules_1vh5ntv._.js → node_modules_0746rzi._.js} +1 -1
  242. package/.next/server/chunks/ssr/{node_modules_0yugy6m._.js → node_modules_0d5uzof._.js} +1 -1
  243. package/.next/server/chunks/ssr/{node_modules_09q35v_._.js → node_modules_0exkwcm._.js} +1 -1
  244. package/.next/server/chunks/ssr/{node_modules_08dhkiq._.js → node_modules_0fr-ml8._.js} +1 -1
  245. package/.next/server/chunks/ssr/{node_modules_14q6g4n._.js → node_modules_0mxvg8h._.js} +1 -1
  246. package/.next/server/chunks/ssr/{node_modules_0arus10._.js → node_modules_0qapgjr._.js} +1 -1
  247. package/.next/server/chunks/ssr/{node_modules_1eg7m6c._.js → node_modules_0qbfyjh._.js} +1 -1
  248. package/.next/server/chunks/ssr/{node_modules_1cz2hle._.js → node_modules_0t-9nup._.js} +1 -1
  249. package/.next/server/chunks/ssr/{node_modules_17bwo43._.js → node_modules_0tusx4d._.js} +3 -3
  250. package/.next/server/chunks/ssr/{node_modules_1efrqxi._.js → node_modules_0vsxbzp._.js} +1 -1
  251. package/.next/server/chunks/ssr/{node_modules_0_-_a--._.js → node_modules_0vv0-fg._.js} +1 -1
  252. package/.next/server/chunks/ssr/{node_modules_1gdh31p._.js → node_modules_0wsvp00._.js} +1 -1
  253. package/.next/server/chunks/ssr/{node_modules_1hpopmo._.js → node_modules_1-urho9._.js} +1 -1
  254. package/.next/server/chunks/ssr/{node_modules_1_pc9kq._.js → node_modules_16pi_dd._.js} +1 -1
  255. package/.next/server/chunks/ssr/{node_modules_00etblx._.js → node_modules_1d53yiq._.js} +1 -1
  256. package/.next/server/chunks/ssr/{node_modules_1aaxuef._.js → node_modules_1g1eihe._.js} +1 -1
  257. package/.next/server/chunks/ssr/{node_modules_198nmll._.js → node_modules_1gpednh._.js} +1 -1
  258. package/.next/server/chunks/ssr/{node_modules_0pvd7q-._.js → node_modules_1gu1pph._.js} +1 -1
  259. package/.next/server/chunks/ssr/{node_modules_0b__sgl._.js → node_modules_1he1w8_._.js} +1 -1
  260. package/.next/server/chunks/ssr/{node_modules_1qpjvy5._.js → node_modules_1lnjapm._.js} +1 -1
  261. package/.next/server/chunks/ssr/{node_modules_0940ns5._.js → node_modules_1lynj9m._.js} +1 -1
  262. package/.next/server/chunks/ssr/{node_modules_0x3-ply._.js → node_modules_1seuurl._.js} +2 -2
  263. package/.next/server/chunks/ssr/{node_modules_14om4ar._.js → node_modules_1u6w1pb._.js} +1 -1
  264. package/.next/server/chunks/ssr/{node_modules_0had7xd._.js → node_modules_1xn6saw._.js} +1 -1
  265. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1b748ic._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_067_exa._.js} +1 -1
  266. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1z4hm5e._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0nrrdaq._.js} +1 -1
  267. package/.next/server/chunks/ssr/{node_modules_@vercel_oidc_dist_06mk8id._.js → node_modules_@vercel_oidc_dist_21a5haa._.js} +1 -1
  268. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_trash_mjs_0px2gzr._.js +3 -0
  269. package/.next/server/middleware-build-manifest.js +3 -3
  270. package/.next/server/pages/404.html +1 -1
  271. package/.next/server/pages/500.html +1 -1
  272. package/.next/server/server-reference-manifest.js +1 -1
  273. package/.next/server/server-reference-manifest.json +68 -46
  274. package/.next/static/chunks/0dr16v67vj4n7.js +2 -0
  275. package/.next/static/chunks/0g4b348l0pve7.js +1 -0
  276. package/.next/static/chunks/0joan-69kbspd.js +1 -0
  277. package/.next/static/chunks/0vlgzqo9ka90v.js +1 -0
  278. package/.next/static/chunks/0zrupxgci5gqc.js +1 -0
  279. package/.next/static/chunks/10k2xvap03z20.css +1 -0
  280. package/.next/static/chunks/18mkhstgiqcbt.js +1 -0
  281. package/.next/static/chunks/{15m575979un5f.js → 1i-u2wzub_to1.js} +2 -2
  282. package/.next/static/chunks/1kp5nfp06nj9h.js +5 -0
  283. package/.next/static/chunks/1ohslk4568tm3.js +1 -0
  284. package/.next/static/chunks/1sbmwswc9k2-1.js +1 -0
  285. package/.next/static/chunks/1t9qms5pwwa3n.js +1 -0
  286. package/.next/static/chunks/1vj_5bnbxx84e.js +1 -0
  287. package/.next/static/chunks/1vqezbhjm3goq.js +1 -0
  288. package/.next/static/chunks/{3akmqm77muj4-.js → 1wlo979mx-y3w.js} +1 -1
  289. package/.next/static/chunks/26ql4y-43xwhp.js +1 -0
  290. package/.next/static/chunks/{0fl3gwe4-l6tz.js → 2_pnccjp6j1ca.js} +1 -1
  291. package/.next/static/chunks/2a51-ywz9b2a3.js +1 -0
  292. package/.next/static/chunks/2fvdgxih7x7hr.js +1 -0
  293. package/.next/static/chunks/2jlz8zp4jax_m.js +18 -0
  294. package/.next/static/chunks/2nvepds1fu2ux.js +1 -0
  295. package/.next/static/chunks/3addj3i4-izma.js +1 -0
  296. package/.next/static/chunks/3bfwpww3m3x4u.js +1 -0
  297. package/.next/static/chunks/3gfh7nxwusbt0.js +1 -0
  298. package/.next/static/chunks/3gwa44cvz4qoi.js +1 -0
  299. package/.next/static/chunks/{38gweqdo4jpfj.js → 3izg0a3k87q1-.js} +5 -5
  300. package/.next/static/chunks/3zk6q3-3f9swq.js +99 -0
  301. package/.next/static/chunks/3zkg5iup3v4a2.js +12 -0
  302. package/.next/static/chunks/405m0bqtoihev.js +1 -0
  303. package/.next/static/chunks/42wcg3wfg_m_p.js +1 -0
  304. package/README.md +27 -216
  305. package/app/api/events/app-event.ts +6 -4
  306. package/app/api/query-key.ts +25 -16
  307. package/bin/database.mjs +37 -0
  308. package/bin/thursday.mjs +44 -28
  309. package/components/ui/custom-icon.tsx +0 -60
  310. package/components/ui/radio-group.tsx +37 -0
  311. package/components/ui/shiny-text.tsx +33 -6
  312. package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/migration.sql +80 -24
  313. package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/snapshot.json +689 -110
  314. package/database/migrations/20260916160713_thread_cancelled/migration.sql +2 -0
  315. package/database/migrations/{20260911030320_opposite_jack_power → 20260916160713_thread_cancelled}/snapshot.json +706 -84
  316. package/docs/how-it-works.md +39 -36
  317. package/docs/images/keeps-going.png +0 -0
  318. package/docs/images/two-minds.png +0 -0
  319. package/docs/live-calls.md +231 -0
  320. package/docs/thread-rooms.md +71 -0
  321. package/features/ai/chatgpt.ts +1 -2
  322. package/features/ai/live.schema.ts +128 -0
  323. package/features/ai/load-tools.ts +148 -77
  324. package/features/ai/model.schema.ts +2 -120
  325. package/features/ai/model.ts +52 -88
  326. package/features/ai/prompts/bot.prompt.ts +91 -214
  327. package/features/ai/prompts/live.prompt.ts +265 -0
  328. package/features/ai/prompts/prompt-helper.ts +91 -32
  329. package/features/ai/prompts/thursday.prompt.ts +125 -172
  330. package/features/ai/tools/bot.tool.ts +38 -145
  331. package/features/ai/tools/call.tool.ts +1 -1
  332. package/features/ai/tools/connected.ts +5 -3
  333. package/features/ai/tools/mcp.tool.ts +7 -4
  334. package/features/ai/tools/memory.tool.ts +35 -31
  335. package/features/ai/tools/skills.tool.ts +36 -14
  336. package/features/ai/tools/studio.tool.ts +26 -21
  337. package/features/ai/tools/tool-name.ts +2 -5
  338. package/features/ai/tools/workspace.tool.ts +33 -10
  339. package/features/artifact/artifact.action.ts +2 -2
  340. package/features/artifact/artifact.query.ts +112 -61
  341. package/features/artifact/artifact.schema.ts +8 -6
  342. package/features/artifact/components/artifact-setting.tsx +83 -33
  343. package/features/bot/bot.action.ts +43 -36
  344. package/features/bot/bot.memory.ts +137 -20
  345. package/features/bot/bot.query.ts +28 -11
  346. package/features/bot/bot.run.ts +299 -636
  347. package/features/bot/bot.runner.ts +468 -844
  348. package/features/bot/bot.schema.ts +93 -82
  349. package/features/bot/bot.seed.ts +141 -64
  350. package/features/bot/components/bot-mark.tsx +324 -232
  351. package/features/bot/components/bot-room.tsx +1613 -697
  352. package/features/bot/components/bot-roster.tsx +8 -13
  353. package/features/bot/components/bot-setting.tsx +58 -42
  354. package/features/bot/components/bot-tool.tsx +55 -87
  355. package/features/bot/components/mark-palette.tsx +35 -32
  356. package/features/bot/components/path-chips.tsx +33 -3
  357. package/features/bot/components/thread-badge.tsx +34 -0
  358. package/features/bot/components/thread-reply.tsx +639 -0
  359. package/features/bot/components/thread-setting.tsx +674 -0
  360. package/features/bot/mark.const.ts +79 -31
  361. package/features/bot/room.query.ts +889 -0
  362. package/features/bot/room.schema.ts +64 -0
  363. package/features/bot/seed-bots.ts +2 -1
  364. package/features/bot/thread.query.ts +971 -0
  365. package/features/bot/thread.store.ts +587 -0
  366. package/features/config/components/voice-key.tsx +113 -88
  367. package/features/config/config.const.ts +5 -9
  368. package/features/connectors/mcp.schema.ts +0 -2
  369. package/features/intro/components/intro.tsx +169 -139
  370. package/features/memory/components/memory-setting.tsx +2 -7
  371. package/features/memory/memory.schema.ts +14 -23
  372. package/features/settings/components/setting-ui.tsx +0 -44
  373. package/features/settings/components/settings.tsx +12 -12
  374. package/features/settings/settings.alert.ts +3 -3
  375. package/features/settings/settings.store.ts +1 -1
  376. package/features/skills/skills.schema.ts +0 -2
  377. package/features/thursday/components/ascii-field.tsx +24 -44
  378. package/features/thursday/components/ascii-orb.tsx +359 -358
  379. package/features/thursday/components/call-log.tsx +46 -44
  380. package/features/thursday/components/face.tsx +35 -10
  381. package/features/thursday/components/tab-state.tsx +3 -3
  382. package/features/thursday/components/thursday-mark.tsx +1 -0
  383. package/features/thursday/components/thursday-setting.tsx +631 -332
  384. package/features/thursday/components/thursday.tsx +106 -41
  385. package/features/thursday/components/voice-picker.tsx +255 -0
  386. package/features/thursday/thursday.action.ts +94 -68
  387. package/features/thursday/thursday.query.ts +49 -30
  388. package/features/thursday/thursday.schema.ts +27 -30
  389. package/features/thursday/thursday.store.ts +11 -7
  390. package/features/thursday/tool-call.ts +3 -3
  391. package/features/thursday/tool-line.ts +5 -3
  392. package/features/thursday/use-thursday.ts +725 -450
  393. package/features/workspace/workspace.query.ts +17 -0
  394. package/features/workspace/workspace.ts +103 -50
  395. package/lib/live/live.schema.ts +47 -0
  396. package/lib/live/live.server.ts +155 -0
  397. package/lib/live/live.session.ts +574 -0
  398. package/lib/{realtime/realtime.tap.ts → live/live.tap.ts} +41 -12
  399. package/lib/live/live.transport.ts +152 -0
  400. package/lib/protocol/use-server-pages.ts +9 -5
  401. package/lib/utils.ts +21 -20
  402. package/package.json +2 -2
  403. package/public/voices/alloy.ogg +0 -0
  404. package/public/voices/ash.ogg +0 -0
  405. package/public/voices/ballad.ogg +0 -0
  406. package/public/voices/beacon.ogg +0 -0
  407. package/public/voices/bossa.ogg +0 -0
  408. package/public/voices/cedar.ogg +0 -0
  409. package/public/voices/cinder.ogg +0 -0
  410. package/public/voices/coral.ogg +0 -0
  411. package/public/voices/delta.ogg +0 -0
  412. package/public/voices/echo.ogg +0 -0
  413. package/public/voices/gleam.ogg +0 -0
  414. package/public/voices/marin.ogg +0 -0
  415. package/public/voices/meridian.ogg +0 -0
  416. package/public/voices/quartz.ogg +0 -0
  417. package/public/voices/ripple.ogg +0 -0
  418. package/public/voices/sage.ogg +0 -0
  419. package/public/voices/shimmer.ogg +0 -0
  420. package/public/voices/stone.ogg +0 -0
  421. package/public/voices/tempo.ogg +0 -0
  422. package/public/voices/verse.ogg +0 -0
  423. package/public/voices/vesper.ogg +0 -0
  424. package/public/voices/willow.ogg +0 -0
  425. package/scripts/artifact-paths.test.mts +25 -0
  426. package/scripts/bot-context.test.mts +1408 -0
  427. package/scripts/live-history.test.mts +115 -0
  428. package/scripts/live-session.test.mts +948 -0
  429. package/server.js +1 -1
  430. package/skills/browser/SKILL.md +17 -6
  431. package/skills/computer/SKILL.md +1 -1
  432. package/skills/find-skills/SKILL.md +3 -8
  433. package/skills/interactive-page/SKILL.md +12 -7
  434. package/skills/interactive-page/references/diagram.md +89 -0
  435. package/skills/interactive-page/scripts/archify/LICENSE +22 -0
  436. package/skills/interactive-page/scripts/archify/README.md +25 -0
  437. package/skills/interactive-page/scripts/archify/assets/JetBrainsMono-OFL.txt +93 -0
  438. package/skills/interactive-page/scripts/archify/assets/template.html +14934 -0
  439. package/skills/interactive-page/scripts/archify/bin/archify.mjs +2126 -0
  440. package/skills/interactive-page/scripts/archify/bin/open-artifact.mjs +86 -0
  441. package/skills/interactive-page/scripts/archify/bin/preview.mjs +653 -0
  442. package/skills/interactive-page/scripts/archify/bin/visual-check.mjs +829 -0
  443. package/skills/interactive-page/scripts/archify/delta/architecture-delta.mjs +1223 -0
  444. package/skills/interactive-page/scripts/archify/examples/agent-run.lifecycle.json +60 -0
  445. package/skills/interactive-page/scripts/archify/examples/agent-tool-call.workflow.json +94 -0
  446. package/skills/interactive-page/scripts/archify/examples/async-job-roundtrip.sequence.json +61 -0
  447. package/skills/interactive-page/scripts/archify/examples/cache-miss-request.sequence.json +82 -0
  448. package/skills/interactive-page/scripts/archify/examples/checkout-platform.base.architecture.json +31 -0
  449. package/skills/interactive-page/scripts/archify/examples/checkout-platform.head.architecture.json +31 -0
  450. package/skills/interactive-page/scripts/archify/examples/deployment-release.lifecycle.json +49 -0
  451. package/skills/interactive-page/scripts/archify/examples/event-stream.dataflow.json +57 -0
  452. package/skills/interactive-page/scripts/archify/examples/incident-response.workflow.json +64 -0
  453. package/skills/interactive-page/scripts/archify/examples/product-analytics.dataflow.json +76 -0
  454. package/skills/interactive-page/scripts/archify/examples/production-deployment.architecture.json +71 -0
  455. package/skills/interactive-page/scripts/archify/examples/release-delivery.workflow.json +62 -0
  456. package/skills/interactive-page/scripts/archify/examples/web-app.architecture.json +46 -0
  457. package/skills/interactive-page/scripts/archify/migrations/workflow-v2.mjs +279 -0
  458. package/skills/interactive-page/scripts/archify/recipes/scenarios.mjs +284 -0
  459. package/skills/interactive-page/scripts/archify/references/authoring-contract.md +243 -0
  460. package/skills/interactive-page/scripts/archify/references/delivery-contract.md +120 -0
  461. package/skills/interactive-page/scripts/archify/references/viewer-runtime.md +45 -0
  462. package/skills/interactive-page/scripts/archify/renderers/architecture/grid.mjs +62 -0
  463. package/skills/interactive-page/scripts/archify/renderers/architecture/render-architecture.mjs +1078 -0
  464. package/skills/interactive-page/scripts/archify/renderers/dataflow/README.md +104 -0
  465. package/skills/interactive-page/scripts/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  466. package/skills/interactive-page/scripts/archify/renderers/lifecycle/README.md +115 -0
  467. package/skills/interactive-page/scripts/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  468. package/skills/interactive-page/scripts/archify/renderers/sequence/README.md +114 -0
  469. package/skills/interactive-page/scripts/archify/renderers/sequence/render-sequence.mjs +464 -0
  470. package/skills/interactive-page/scripts/archify/renderers/shared/brand-marks.mjs +563 -0
  471. package/skills/interactive-page/scripts/archify/renderers/shared/cli.mjs +218 -0
  472. package/skills/interactive-page/scripts/archify/renderers/shared/desktop-readability.mjs +26 -0
  473. package/skills/interactive-page/scripts/archify/renderers/shared/diagnostics.mjs +127 -0
  474. package/skills/interactive-page/scripts/archify/renderers/shared/engineering-profiles.mjs +157 -0
  475. package/skills/interactive-page/scripts/archify/renderers/shared/generated-brand-marks.mjs +3 -0
  476. package/skills/interactive-page/scripts/archify/renderers/shared/generated-validators.mjs +13 -0
  477. package/skills/interactive-page/scripts/archify/renderers/shared/geometry.mjs +1423 -0
  478. package/skills/interactive-page/scripts/archify/renderers/shared/i18n.mjs +595 -0
  479. package/skills/interactive-page/scripts/archify/renderers/shared/layout-report.mjs +40 -0
  480. package/skills/interactive-page/scripts/archify/renderers/shared/legend.mjs +217 -0
  481. package/skills/interactive-page/scripts/archify/renderers/shared/output-path.mjs +340 -0
  482. package/skills/interactive-page/scripts/archify/renderers/shared/repository-evidence.mjs +238 -0
  483. package/skills/interactive-page/scripts/archify/renderers/shared/repository-location.mjs +58 -0
  484. package/skills/interactive-page/scripts/archify/renderers/shared/text-fit.mjs +49 -0
  485. package/skills/interactive-page/scripts/archify/renderers/shared/utils.mjs +232 -0
  486. package/skills/interactive-page/scripts/archify/renderers/shared/validator.mjs +86 -0
  487. package/skills/interactive-page/scripts/archify/renderers/workflow/README.md +223 -0
  488. package/skills/interactive-page/scripts/archify/renderers/workflow/render-workflow.mjs +35 -0
  489. package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  490. package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  491. package/skills/interactive-page/scripts/archify/schemas/README.md +211 -0
  492. package/skills/interactive-page/scripts/archify/schemas/architecture.schema.json +178 -0
  493. package/skills/interactive-page/scripts/archify/schemas/common.schema.json +115 -0
  494. package/skills/interactive-page/scripts/archify/schemas/dataflow.schema.json +243 -0
  495. package/skills/interactive-page/scripts/archify/schemas/lifecycle.schema.json +266 -0
  496. package/skills/interactive-page/scripts/archify/schemas/sequence.schema.json +223 -0
  497. package/skills/interactive-page/scripts/archify/schemas/workflow.schema.json +428 -0
  498. package/skills/interactive-page/scripts/archify/scripts/check-render-output.mjs +916 -0
  499. package/skills/interactive-page/scripts/archify/scripts/render-examples.mjs +26 -0
  500. package/skills/interactive-page/scripts/bundle-artifact.sh +9 -8
  501. package/skills/skill-creator/SKILL.md +4 -5
  502. package/.next/server/app/api/bot/task/[id]/route/app-paths-manifest.json +0 -3
  503. package/.next/server/app/api/bot/task/[id]/route.js +0 -16
  504. package/.next/server/app/api/bot/task/[id]/route.js.nft.json +0 -1
  505. package/.next/server/app/api/bot/task/[id]/route_client-reference-manifest.js +0 -3
  506. package/.next/server/app/api/bot/task/route/app-paths-manifest.json +0 -3
  507. package/.next/server/app/api/bot/task/route.js +0 -16
  508. package/.next/server/app/api/bot/task/route.js.nft.json +0 -1
  509. package/.next/server/app/api/bot/task/route_client-reference-manifest.js +0 -3
  510. package/.next/server/chunks/[root-of-the-server]__01dkp4a._.js +0 -3
  511. package/.next/server/chunks/[root-of-the-server]__02va5wz._.js +0 -3
  512. package/.next/server/chunks/[root-of-the-server]__02xjoto._.js +0 -3
  513. package/.next/server/chunks/[root-of-the-server]__04q--0f._.js +0 -8
  514. package/.next/server/chunks/[root-of-the-server]__0bl-e63._.js +0 -3
  515. package/.next/server/chunks/[root-of-the-server]__0ffbg85._.js +0 -3
  516. package/.next/server/chunks/[root-of-the-server]__0jq4ohy._.js +0 -8
  517. package/.next/server/chunks/[root-of-the-server]__0ls6_8y._.js +0 -8
  518. package/.next/server/chunks/[root-of-the-server]__0ncs9uu._.js +0 -3
  519. package/.next/server/chunks/[root-of-the-server]__1-ga0kh._.js +0 -5
  520. package/.next/server/chunks/[root-of-the-server]__11n256_._.js +0 -5
  521. package/.next/server/chunks/[root-of-the-server]__12cabg9._.js +0 -3
  522. package/.next/server/chunks/[root-of-the-server]__1339jnv._.js +0 -8
  523. package/.next/server/chunks/[root-of-the-server]__18_teo8._.js +0 -8
  524. package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +0 -5
  525. package/.next/server/chunks/[root-of-the-server]__1anc1p9._.js +0 -3
  526. package/.next/server/chunks/[root-of-the-server]__1ccon1w._.js +0 -10
  527. package/.next/server/chunks/[root-of-the-server]__1fizn31._.js +0 -3
  528. package/.next/server/chunks/[root-of-the-server]__1llj3-b._.js +0 -3
  529. package/.next/server/chunks/[root-of-the-server]__1p8m3f4._.js +0 -3
  530. package/.next/server/chunks/[root-of-the-server]__1wa1k7r._.js +0 -8
  531. package/.next/server/chunks/_0-73of8._.js +0 -55
  532. package/.next/server/chunks/_0-fjql4._.js +0 -26
  533. package/.next/server/chunks/_00xh_q0._.js +0 -25
  534. package/.next/server/chunks/_03a0897._.js +0 -3
  535. package/.next/server/chunks/_051qh8u._.js +0 -3
  536. package/.next/server/chunks/_05sovvj._.js +0 -3
  537. package/.next/server/chunks/_0fzqt2y._.js +0 -134
  538. package/.next/server/chunks/_0mecv0f._.js +0 -26
  539. package/.next/server/chunks/_0mh8j4m._.js +0 -3
  540. package/.next/server/chunks/_0obojvv._.js +0 -3
  541. package/.next/server/chunks/_0sb7tlz._.js +0 -3
  542. package/.next/server/chunks/_0sbynis._.js +0 -3
  543. package/.next/server/chunks/_0u10wmw._.js +0 -55
  544. package/.next/server/chunks/_0u4aiy2._.js +0 -3
  545. package/.next/server/chunks/_0wp4le3._.js +0 -3
  546. package/.next/server/chunks/_0y5fg-x._.js +0 -3
  547. package/.next/server/chunks/_1230wbx._.js +0 -10
  548. package/.next/server/chunks/_12nheja._.js +0 -3
  549. package/.next/server/chunks/_13510xh._.js +0 -3
  550. package/.next/server/chunks/_15hq89o._.js +0 -3
  551. package/.next/server/chunks/_18-1wcc._.js +0 -55
  552. package/.next/server/chunks/_1_9mjx-._.js +0 -3
  553. package/.next/server/chunks/_1c78vw5._.js +0 -229
  554. package/.next/server/chunks/_1h5_8sk._.js +0 -3
  555. package/.next/server/chunks/_1hdnxb7._.js +0 -3
  556. package/.next/server/chunks/_1j8k_j5._.js +0 -3
  557. package/.next/server/chunks/_1nula3v._.js +0 -3
  558. package/.next/server/chunks/_1php4eq._.js +0 -3
  559. package/.next/server/chunks/_1yuv4vp._.js +0 -3
  560. package/.next/server/chunks/_1zjrdag._.js +0 -3
  561. package/.next/server/chunks/_next-internal_server_app_api_bot_task_[id]_route_actions_1_k_8u3.js +0 -3
  562. package/.next/server/chunks/_next-internal_server_app_api_bot_task_route_actions_0xln6ra.js +0 -3
  563. package/.next/server/chunks/features_0rpfxbk._.js +0 -3
  564. package/.next/server/chunks/features_1qf3cei._.js +0 -3
  565. package/.next/server/chunks/features_bot_0zt92oh._.js +0 -3
  566. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xoq2rl._.js +0 -3
  567. package/.next/server/chunks/ssr/[externals]__0dizgek._.js +0 -3
  568. package/.next/server/chunks/ssr/[root-of-the-server]__092knlj._.js +0 -3
  569. package/.next/server/chunks/ssr/[root-of-the-server]__0mz33a7._.js +0 -3
  570. package/.next/server/chunks/ssr/[root-of-the-server]__0s9dq5u._.js +0 -3
  571. package/.next/server/chunks/ssr/[root-of-the-server]__0s9l2sv._.js +0 -3
  572. package/.next/server/chunks/ssr/[root-of-the-server]__0vnmv-s._.js +0 -3
  573. package/.next/server/chunks/ssr/[root-of-the-server]__0xsog8n._.js +0 -3
  574. package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +0 -61
  575. package/.next/server/chunks/ssr/[root-of-the-server]__1gtlw6v._.js +0 -43
  576. package/.next/server/chunks/ssr/[root-of-the-server]__1ox7hbk._.js +0 -4
  577. package/.next/server/chunks/ssr/[root-of-the-server]__202p40z._.js +0 -3
  578. package/.next/server/chunks/ssr/_001_ms1._.js +0 -28
  579. package/.next/server/chunks/ssr/_01n3o0m._.js +0 -3
  580. package/.next/server/chunks/ssr/_0fz4mf_._.js +0 -3
  581. package/.next/server/chunks/ssr/_0gb4gmf._.js +0 -3
  582. package/.next/server/chunks/ssr/_0h42fze._.js +0 -3
  583. package/.next/server/chunks/ssr/_0h7zdni._.js +0 -3
  584. package/.next/server/chunks/ssr/_0ilna52._.js +0 -42
  585. package/.next/server/chunks/ssr/_0q0zan6._.js +0 -70
  586. package/.next/server/chunks/ssr/_0zcjrbg._.js +0 -3
  587. package/.next/server/chunks/ssr/_0zhoc3r._.js +0 -3
  588. package/.next/server/chunks/ssr/_13fke0x._.js +0 -3
  589. package/.next/server/chunks/ssr/_18cymkq._.js +0 -3
  590. package/.next/server/chunks/ssr/_1b2mjwr._.js +0 -3
  591. package/.next/server/chunks/ssr/_1f-dg-6._.js +0 -3
  592. package/.next/server/chunks/ssr/_1h0rw11._.js +0 -3
  593. package/.next/server/chunks/ssr/_1jhd09t._.js +0 -3
  594. package/.next/server/chunks/ssr/_1nnsk7z._.js +0 -3
  595. package/.next/server/chunks/ssr/_1ov37if._.js +0 -3
  596. package/.next/server/chunks/ssr/_1sji22n._.js +0 -3
  597. package/.next/server/chunks/ssr/_1vi_uo7._.js +0 -3
  598. package/.next/server/chunks/ssr/_1vyd1ji._.js +0 -3
  599. package/.next/server/chunks/ssr/_1xx4zlb._.js +0 -3
  600. package/.next/server/chunks/ssr/components_ui_1y1l7yj._.js +0 -3
  601. package/.next/server/chunks/ssr/features_bot_1s_-2vj._.js +0 -3
  602. package/.next/server/chunks/ssr/lib_realtime_12wg_dd._.js +0 -27
  603. package/.next/server/chunks/ssr/lib_realtime_15h_v1v._.js +0 -27
  604. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0npjf8-._.js +0 -3
  605. package/.next/static/chunks/00rd4-v8r7axp.js +0 -1
  606. package/.next/static/chunks/08qe4as2q428z.js +0 -3
  607. package/.next/static/chunks/0gnqdjn2lvdad.js +0 -2
  608. package/.next/static/chunks/0hwap1-p0m5sa.js +0 -1
  609. package/.next/static/chunks/0r5qcctujhxli.js +0 -1
  610. package/.next/static/chunks/0w52rrrmuj9r9.js +0 -1
  611. package/.next/static/chunks/0wcprt5ot5she.js +0 -1
  612. package/.next/static/chunks/10teww7wt-f6h.js +0 -1
  613. package/.next/static/chunks/17p6tk6k88dq6.js +0 -1
  614. package/.next/static/chunks/18a96rkhi4_yd.js +0 -1
  615. package/.next/static/chunks/1dkjg87pxk0n9.js +0 -28
  616. package/.next/static/chunks/1jd09sxcjddu1.js +0 -1
  617. package/.next/static/chunks/1w73ece_6bheu.js +0 -18
  618. package/.next/static/chunks/214ya3n5gxeih.js +0 -1
  619. package/.next/static/chunks/22_zkas21rpna.js +0 -1
  620. package/.next/static/chunks/2fh4-3z_q8b_w.js +0 -1
  621. package/.next/static/chunks/2h0sd2vumhb15.js +0 -1
  622. package/.next/static/chunks/2t4vhi3m8ahya.js +0 -1
  623. package/.next/static/chunks/2tigdtz3dpcy8.js +0 -1
  624. package/.next/static/chunks/2u7xt6mxg44lf.js +0 -1
  625. package/.next/static/chunks/3786h5vayt80-.js +0 -28
  626. package/.next/static/chunks/39j0fvpybzabl.js +0 -40
  627. package/.next/static/chunks/3cq5g494yuke8.css +0 -1
  628. package/.next/static/chunks/3hibbjnt85-k6.js +0 -1
  629. package/.next/static/chunks/3woj-xd7ki5_i.js +0 -1
  630. package/.next/static/chunks/3xk7yqgomx7yq.js +0 -1
  631. package/.next/static/chunks/3zmcsnuo25zvq.js +0 -1
  632. package/database/migrations/20260911030320_opposite_jack_power/migration.sql +0 -1
  633. package/docs/images/task-thread.png +0 -0
  634. package/features/bot/components/task-badge.tsx +0 -42
  635. package/features/bot/components/task-reply.tsx +0 -328
  636. package/features/bot/components/task-setting.tsx +0 -524
  637. package/features/bot/task.query.ts +0 -976
  638. package/features/bot/task.store.ts +0 -489
  639. package/lib/realtime/client-secret.ts +0 -86
  640. package/lib/realtime/open-session.ts +0 -31
  641. package/lib/realtime/openai.ts +0 -35
  642. package/lib/realtime/realtime.audio.ts +0 -196
  643. package/lib/realtime/realtime.driver.ts +0 -489
  644. package/lib/realtime/realtime.protocol.ts +0 -393
  645. package/lib/realtime/realtime.schema.ts +0 -37
  646. package/lib/realtime/realtime.session.ts +0 -106
  647. package/lib/realtime/realtime.transport.ts +0 -384
  648. package/lib/realtime/xai.ts +0 -39
  649. /package/.next/server/app/api/bot/{task → thread}/[id]/route/build-manifest.json +0 -0
  650. /package/.next/server/app/api/bot/{task → thread}/[id]/route/server-reference-manifest.json +0 -0
  651. /package/.next/server/app/api/bot/{task → thread}/[id]/route.js.map +0 -0
  652. /package/.next/server/app/api/bot/{task → thread}/route/build-manifest.json +0 -0
  653. /package/.next/server/app/api/bot/{task → thread}/route/server-reference-manifest.json +0 -0
  654. /package/.next/server/app/api/bot/{task → thread}/route.js.map +0 -0
  655. /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → 0qzGoKn2wTERVZtblX1tp}/_buildManifest.js +0 -0
  656. /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → 0qzGoKn2wTERVZtblX1tp}/_clientMiddlewareManifest.js +0 -0
  657. /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → 0qzGoKn2wTERVZtblX1tp}/_ssgManifest.js +0 -0
@@ -3,12 +3,7 @@ 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";
6
+ import { delegateSpec, threadSpec } from "@/features/ai/tools/bot.tool";
12
7
  import { CALL_TOOLS } 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";
@@ -16,12 +11,17 @@ 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,14 @@ 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
46
  }
47
47
  | {
48
48
  target: "bot";
49
49
  /** This run's bot name, the key of the bot table. */
50
50
  bot: string;
51
- /** The browser session this run's shell drives (workspace.ts jobShellEnv): the job's, or a borrowed bot's own. */
51
+ /** The browser session this run's shell drives (workspace.ts jobShellEnv): this participant's own in the job. */
52
52
  session?: string | null;
53
53
  /** 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
54
  model?: TextModel | null;
@@ -58,10 +58,10 @@ export type ToolRun =
58
58
 
59
59
  /**
60
60
  * 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).
61
+ * (runner -> bot.run -> this file). `delegate` records which call opened the job, so a
62
+ * later call's prompt finds the job under the line that opened it (Earlier calls).
63
63
  */
64
- function createTaskTools(callId: string | null | undefined): ToolSet {
64
+ function createThreadTools(callId: string | null | undefined): ToolSet {
65
65
  return {
66
66
  [TOOL_NAMES.delegate]: tool({
67
67
  description: delegateSpec.description,
@@ -81,8 +81,8 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
81
81
  }
82
82
 
83
83
  // 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({
84
+ const { startThread } = await import("@/features/bot/bot.runner");
85
+ const id = await startThread({
86
86
  bot: found.name,
87
87
  request,
88
88
  label,
@@ -90,20 +90,20 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
90
90
  from: "thursday",
91
91
  });
92
92
  return {
93
- taskId: id,
93
+ threadId: id,
94
94
  // The label is the handle: without it in front of her, a follow-up
95
95
  // 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}".`,
96
+ 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
97
  };
98
98
  },
99
99
  }),
100
100
 
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"
101
+ [TOOL_NAMES.thread]: tool({
102
+ description: threadSpec.description,
103
+ inputSchema: threadSpec.parameters,
104
+ execute: async ({ action, thread, answer, recipient, replyTo }) => {
105
+ const { listThreadOverview, resolveThread } = await import(
106
+ "@/features/bot/thread.query"
107
107
  );
108
108
  if (action === "status") {
109
109
  // `status` only reads, and text left in `answer` reaches nobody — it
@@ -118,15 +118,21 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
118
118
  // opened and a call can run for hours; `since` is measured against this.
119
119
  const now = { now: clockNow() };
120
120
  // 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);
121
+ if (thread) {
122
+ const one = await resolveThread(thread);
123
+ if (!one) return await noSuchJob(thread);
124
+ const { findThreadView } = await import(
125
+ "@/features/bot/thread.query"
126
+ );
127
+ const room = (await findThreadView(one.id))?.room;
125
128
  return {
126
129
  ...now,
127
130
  ...dropped,
128
131
  label: one.label,
132
+ id: one.id,
129
133
  bot: one.bot,
134
+ participants: room?.participants ?? [],
135
+ questions: room?.questions ?? [],
130
136
  status: one.status,
131
137
  since: formatDistanceToNowStrict(toDate(one.updatedAt), {
132
138
  addSuffix: true,
@@ -137,62 +143,122 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
137
143
  : {}),
138
144
  };
139
145
  }
140
- const tasks = await listTaskHistory({ limit: 8 });
141
- // No threads — only as much as is worth reading out: what it is
146
+ const threads = await listThreadOverview();
147
+ // No messages — only as much as is worth reading out: what it is
142
148
  // asking, the one line of what it is doing, or how it ended
143
149
  return {
144
150
  ...now,
145
151
  ...dropped,
146
- tasks: tasks.map((task) => ({
147
- label: task.label,
148
- bot: task.bot,
149
- status: task.status,
150
- since: formatDistanceToNowStrict(toDate(task.updatedAt), {
152
+ threads: threads.map((thread) => ({
153
+ id: thread.id,
154
+ label: thread.label,
155
+ bot: thread.bot,
156
+ status: thread.status,
157
+ participants: thread.room.participants,
158
+ questions: thread.room.questions.map((question) => ({
159
+ ...question,
160
+ text: clip(question.text, 200),
161
+ })),
162
+ since: formatDistanceToNowStrict(toDate(thread.updatedAt), {
151
163
  addSuffix: true,
152
164
  }),
153
- ...(task.ask
154
- ? { asking: task.ask.question, options: task.ask.options }
165
+ ...(thread.ask
166
+ ? { asking: thread.ask.question, options: thread.ask.options }
155
167
  : {}),
156
- ...(task.status === "running"
157
- ? { now: taskActivity(task.lines) }
168
+ ...(thread.status === "running"
169
+ ? { now: threadActivity(thread.lines) }
158
170
  : {}),
159
- ...(task.outcome && task.status !== "waiting"
160
- ? { outcome: clip(task.outcome, 200) }
171
+ ...(thread.outcome && thread.status !== "waiting"
172
+ ? { outcome: clip(thread.outcome, 200) }
161
173
  : {}),
162
174
  })),
163
175
  };
164
176
  }
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)
177
+ // A name is how a job is taken. Unnamed, `open` shows the job that just
178
+ // moved, and `answer` reaches the one open question; words with no question
179
+ // waiting belong to a job the user names, never to whichever moved last.
180
+ // Cancel always needs the name: it cannot be taken back.
181
+ const { listInboxThreads, markSeen } = await import(
182
+ "@/features/bot/thread.query"
183
+ );
184
+ const unnamed = !thread && (action === "answer" || action === "open");
185
+ const inbox = unnamed ? await listInboxThreads() : [];
186
+ const asking =
187
+ action === "answer"
188
+ ? inbox.filter((row) => row.room.questions.length)
189
+ : [];
190
+ if (asking.length > 1)
191
+ return `Questions are waiting in more than one job: ${asking
192
+ .map(
193
+ (row) =>
194
+ `"${row.label}" (${row.room.questions.map((question) => question.bot).join(", ")})`,
195
+ )
196
+ .join(", ")}. Name the job.`;
197
+ const one = thread
198
+ ? await resolveThread(thread)
172
199
  : action === "answer"
173
- ? ((await listInboxTasks())[0] ?? null)
174
- : null;
200
+ ? (asking[0] ?? null)
201
+ : unnamed
202
+ ? (inbox[0] ?? null)
203
+ : null;
175
204
  if (!one) {
176
- if (task) return await noSuchJob(task);
177
- return action === "answer"
205
+ if (thread) return await noSuchJob(thread);
206
+ if (action === "answer")
207
+ return `No question is waiting. Name the job this is for; \`${TOOL_NAMES.thread}\` \`status\` lists them.`;
208
+ return unnamed
178
209
  ? "No job has moved yet — say which one, or check `status` first."
179
210
  : "Say which job — by its label. Call `status` with no job named to see them.";
180
211
  }
181
212
 
182
- const { answerTask, cancelTask } = await import(
213
+ if (action === "open") {
214
+ // The room on the call screen draws the inbox; an older job is only in the history
215
+ const room = unnamed ? inbox : await listInboxThreads();
216
+ if (!room.some((row) => row.id === one.id))
217
+ return `"${one.label}" is older than the call screen keeps; it is under Settings › Threads.`;
218
+ const { appEvents } = await import(
219
+ "@/app/api/events/app-event.server"
220
+ );
221
+ appEvents.emit({ type: "showThread", threadId: one.id });
222
+ return { label: one.label, open: true };
223
+ }
224
+ if (action === "seen") {
225
+ // The same as opening it on screen: it leaves the work waiting on the user
226
+ await markSeen([one.id]);
227
+ return { label: one.label, seen: true };
228
+ }
229
+ const { answerThread, cancelThread } = await import(
183
230
  "@/features/bot/bot.runner"
184
231
  );
185
232
  if (action === "cancel") {
186
- await cancelTask(one.id);
233
+ await cancelThread(one.id);
187
234
  return { label: one.label, status: "cancelled" };
188
235
  }
189
236
  if (!answer?.trim()) return "Say what to pass on.";
190
- await answerTask(one.id, answer.trim(), "thursday");
237
+ let told: Awaited<ReturnType<typeof answerThread>>;
238
+ try {
239
+ told = await answerThread(
240
+ one.id,
241
+ answer.trim(),
242
+ "thursday",
243
+ recipient ?? undefined,
244
+ replyTo ?? undefined,
245
+ );
246
+ } catch (cause) {
247
+ // Which question, or that it is gone, is the model's to fix: one line it can act on
248
+ if (isPublicError(cause)) return cause.message;
249
+ throw cause;
250
+ }
251
+ if (told?.answered)
252
+ return {
253
+ label: one.label,
254
+ answered: told.answered,
255
+ note: `${told.answered.bot} has the answer to its question and goes on from it.`,
256
+ };
191
257
  return {
192
258
  // Named even when the model named it: with no job given this is the
193
259
  // one that moved last, and saying which makes a wrong one obvious
194
260
  label: one.label,
195
- bot: one.bot,
261
+ bot: told?.to ?? one.bot,
196
262
  status: "running",
197
263
  note:
198
264
  one.status === "running"
@@ -206,11 +272,11 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
206
272
 
207
273
  /** An unresolved reference answers with the recent jobs; a bare "no such job" is read as an error and relayed as one. */
208
274
  async function noSuchJob(ref: string): Promise<string> {
209
- const { listTaskHistory } = await import("@/features/bot/task.query");
210
- const recent = await listTaskHistory({ limit: 5 });
275
+ const { listThreadOverview } = await import("@/features/bot/thread.query");
276
+ const recent = await listThreadOverview();
211
277
  if (!recent.length) return "No jobs have been handed over yet.";
212
278
  const names = recent
213
- .map((task) => `"${task.label}" (${task.bot}, ${task.status})`)
279
+ .map((thread) => `"${thread.label}" (${thread.bot}, ${thread.status})`)
214
280
  .join(", ");
215
281
  return `There is no job called "${ref}". The latest are: ${names}. Call again with one of those names.`;
216
282
  }
@@ -261,11 +327,16 @@ async function buildTools(run: ToolRun): Promise<ToolSet> {
261
327
  };
262
328
  }
263
329
 
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
- );
330
+ // The call's hand; a fact it writes is tied to the call it was said in. A bot
331
+ // is handed only the reads from it (below).
332
+ const { [TOOL_NAMES.memory_conversation]: conversation, ...memory } =
333
+ createMemoryTools(
334
+ "call",
335
+ run.target === "thursday" ? (run.callId ?? null) : null,
336
+ );
337
+ const readBack: ToolSet = {
338
+ [TOOL_NAMES.memory_conversation]: conversation,
339
+ };
269
340
 
270
341
  const sandbox = await openWorkspace();
271
342
 
@@ -279,46 +350,46 @@ async function buildTools(run: ToolRun): Promise<ToolSet> {
279
350
 
280
351
  return {
281
352
  ...memory,
353
+ ...readBack,
282
354
  ...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)
355
+ // The shell alone, for no longer than her answer can wait on it (config
356
+ // CALL_EXEC_TIMEOUT_MS). A whole file is a job, not a glance (workspace.tool)
286
357
  ...createWorkspaceTools(sandbox, {
287
358
  write: false,
288
359
  timeoutMs: CALL_EXEC_TIMEOUT_MS,
289
360
  }),
290
361
  // Handing work over, following it, and hanging up belong to the voice session only
291
- ...createTaskTools(run.callId),
362
+ ...createThreadTools(run.callId),
292
363
  ...CALL_TOOLS,
293
364
  };
294
365
  }
295
366
 
296
367
  // 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.
368
+ // The runner attaches messaging with the active continuation (bot.run).
299
369
  const skills = await loadSkills(sandbox);
300
370
  return {
301
371
  // A bot only reads memory: every write is the call's, and there is no screen to show a note on
302
372
  [TOOL_NAMES.memory_recall]: memory[TOOL_NAMES.memory_recall],
303
- [TOOL_NAMES.memory_conversation]: memory[TOOL_NAMES.memory_conversation],
373
+ ...readBack,
304
374
  // Exa when its key is set, else this bot's own model when it can search;
305
375
  // absent when neither, and the browser is the way in (search.tool)
306
376
  ...(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)
377
+ // The browser rides in the shell: its session is this participant's in this job,
378
+ // set by the server rather than typed by the model (workspace.ts jobShellEnv),
379
+ // and so is the bot's artifacts folder
310
380
  ...createWorkspaceTools(sandbox, {
311
381
  write: true,
312
- env: jobShellEnv(run.session),
382
+ env: { ...jobShellEnv(run.session), ...botShellEnv(run.bot) },
313
383
  // 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:
384
+ // of the run only (workspace.tool SHELL_GUIDE). The call gets no guide:
315
385
  // one command is a glance, not a job to plan around
316
386
  guide: true,
387
+ // Its own memory stays within its limits whichever of the two writes it
388
+ // (bot.memory), and its finished work stays in its own folder
389
+ bot: run.bot,
317
390
  }),
318
391
  // Pinned tools come with schemas; the rest sit behind `tool_search`, absent when nothing is left to find (mcp.tool)
319
392
  ...(await createMcpTools(run.bot, sandbox)),
320
393
  ...createSkillTools({ sandbox, skills }),
321
- [TOOL_NAMES.ask_thursday]: askThursdayTool,
322
- [TOOL_NAMES.answer]: answerTool,
323
394
  };
324
395
  }
@@ -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[];