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
@@ -2,58 +2,43 @@
2
2
 
3
3
  import { asSchema } from "ai";
4
4
  import z from "zod";
5
+ import { LIVE_PROVIDER } from "@/features/ai/live.schema";
5
6
  import { loadTools } from "@/features/ai/load-tools";
6
- import {
7
- SPEACH_MODEL_PROVIDER_LIST,
8
- SPEACH_MODEL_PROVIDERS,
9
- type SpeachModelRef,
10
- } from "@/features/ai/model.schema";
7
+ import { loadLivePrompt } from "@/features/ai/prompts/live.prompt";
11
8
  import { loadThursdayPrompt } from "@/features/ai/prompts/thursday.prompt";
12
- import { removeTask } from "@/features/bot/bot.runner";
13
- import { listAllTaskIds } from "@/features/bot/task.query";
9
+ import { removeThread } from "@/features/bot/bot.runner";
10
+ import { listAllThreadIds } from "@/features/bot/thread.query";
14
11
  import { readConfig } from "@/features/config/config.query";
15
12
  import { deleteAllNotes } from "@/features/memory/memory.query";
13
+ import {
14
+ LIVE_MODEL,
15
+ LiveCloseSchema,
16
+ type ToolManifest,
17
+ } from "@/lib/live/live.schema";
18
+ import { acceptedReasoning, createLiveCall } from "@/lib/live/live.server";
16
19
  import { serverAction } from "@/lib/protocol/server-action";
17
20
  import { publicError } from "@/lib/public-error";
18
- import { issueClientSecret } from "@/lib/realtime/client-secret";
19
- import type { ToolManifest } from "@/lib/realtime/realtime.schema";
20
21
  import {
21
22
  deleteCall,
22
23
  deleteEndedCalls,
23
24
  endCall,
24
25
  insertCall,
26
+ saveThought,
25
27
  saveTurns,
26
28
  writeCallSkillsOn,
27
29
  } from "./thursday.query";
28
30
  import {
29
31
  type CallHandshake,
32
+ CallThoughtSchema,
30
33
  CallTurnSchema,
31
- type ThursdaySettings,
32
34
  ThursdaySettingsSchema,
33
35
  } from "./thursday.schema";
34
36
 
35
37
  // Server actions run one at a time per client, so the recording actions stay
36
38
  // small: a tool call mid-sentence may be queued behind them.
37
39
 
38
- /** The picked model if its key still exists, else the first provider with a key. */
39
- async function resolveVoiceModel(
40
- picked: ThursdaySettings["model"],
41
- ): Promise<SpeachModelRef> {
42
- if (
43
- picked &&
44
- (await readConfig(SPEACH_MODEL_PROVIDERS[picked.provider].apiKeyName))
45
- ) {
46
- return picked;
47
- }
48
-
49
- // Voice and model ids are provider-specific, so neither carries over.
50
- for (const provider of SPEACH_MODEL_PROVIDER_LIST) {
51
- if (await readConfig(provider.apiKeyName)) {
52
- return { provider: provider.id, voice: null, model: null };
53
- }
54
- }
55
- publicError("No voice key — calls run on one. Add one in Config.");
56
- }
40
+ /** An offer with every ICE candidate gathered stays far below this. */
41
+ const SDP_MAX_LENGTH = 65_536;
57
42
 
58
43
  /**
59
44
  * The same tool set /api/thursday/tool-call executes. Tools without `execute`
@@ -78,47 +63,67 @@ async function loadToolManifest(): Promise<ToolManifest[]> {
78
63
  }
79
64
 
80
65
  /**
81
- * Opens a call: inserts the row and returns the credential plus what to send
82
- * once connected. Settings live in the browser (thursday.store), so they arrive
83
- * as an argument and are parsed, not trusted.
66
+ * Opens a Live call from the browser's SDP offer. Both prompts, the tool manifest
67
+ * and the account key stay here; the browser gets the SDP answer, the call row
68
+ * and what it needs to draw and save the call. `calledBack` is the page placing it
69
+ * for waiting work rather than the user, which changes what she opens with.
84
70
  */
85
71
  export const openCallAction = serverAction(
86
- async (settings: ThursdaySettings): Promise<CallHandshake> => {
72
+ async (
73
+ settings: unknown,
74
+ sdp: unknown,
75
+ calledBack?: unknown,
76
+ ): Promise<CallHandshake> => {
87
77
  const thursday = ThursdaySettingsSchema.parse(settings);
78
+ const offer = z.string().min(1).max(SDP_MAX_LENGTH).parse(sdp);
79
+ const apiKey = await readConfig(LIVE_PROVIDER.apiKeyName);
80
+ if (!apiKey) {
81
+ publicError(`No ${LIVE_PROVIDER.label} key — add one in Config.`);
82
+ }
88
83
 
89
- const ref = await resolveVoiceModel(thursday.model);
90
- const provider = SPEACH_MODEL_PROVIDERS[ref.provider];
91
- const apiKey = await readConfig(provider.apiKeyName);
92
- if (!apiKey) publicError(`No ${provider.label} key — add one in Config.`);
93
-
94
- // Assembled per call, never cached: the prompt reads what earlier calls stored.
95
- const [prompt, tools] = await Promise.all([
96
- loadThursdayPrompt(thursday.systemPrompt, thursday.locale),
84
+ // Assembled per call, never cached: both prompts read what earlier calls stored.
85
+ const [voice, backend, tools, reasoning] = await Promise.all([
86
+ loadLivePrompt({
87
+ voicePrompt: thursday.voicePrompt,
88
+ webSearch: thursday.webSearch,
89
+ locale: thursday.locale,
90
+ calledBack: z.boolean().default(false).parse(calledBack),
91
+ }),
92
+ loadThursdayPrompt(thursday.backendPrompt),
97
93
  loadToolManifest(),
94
+ acceptedReasoning({
95
+ apiKey,
96
+ model: thursday.backendModel,
97
+ effort: thursday.reasoningEffort,
98
+ }),
98
99
  ]);
99
100
 
100
- // Free-text model ids are not validated here; the provider rejects at issue time.
101
- const model = ref.model ?? provider.models[0].id;
102
- // Issue before insert: a rejected credential must not leave an open call row
103
- // nobody can close.
104
- const credential = await issueClientSecret({
105
- provider: ref.provider,
101
+ // Connect before insert: a refused key or model must not leave an open row nobody can close.
102
+ // Free-text model ids are not checked here; the provider refuses them and says why.
103
+ const connection = await createLiveCall({
106
104
  apiKey,
107
- model,
105
+ sdp: offer,
106
+ voice: thursday.voice,
107
+ instructions: voice.text,
108
+ input: voice.input,
109
+ backend: {
110
+ model: thursday.backendModel,
111
+ instructions: backend,
112
+ tools,
113
+ reasoning,
114
+ webSearch: thursday.webSearch,
115
+ },
116
+ });
117
+ const callId = await insertCall({
118
+ provider: LIVE_PROVIDER.id,
119
+ model: LIVE_MODEL,
120
+ backendModel: thursday.backendModel,
108
121
  });
109
- const callId = await insertCall({ provider: ref.provider, model });
110
122
 
111
123
  return {
112
124
  callId,
113
- provider: ref.provider,
114
- credential,
115
- session: {
116
- model,
117
- voice: ref.voice ?? provider.defaultVoice,
118
- instructions: prompt.text,
119
- tools,
120
- },
121
- opening: prompt.opening,
125
+ sdp: connection.transport.sdp,
126
+ opening: voice.opening,
122
127
  };
123
128
  },
124
129
  );
@@ -132,14 +137,35 @@ export const setCallSkillsAction = serverAction(async (on: unknown) => {
132
137
  });
133
138
 
134
139
  export const saveTurnsAction = serverAction(
135
- async (callId: string, turns: unknown) => {
136
- await saveTurns(callId, CallTurnSchema.array().min(1).parse(turns));
140
+ async (callId: unknown, turns: unknown) => {
141
+ await saveTurns(
142
+ z.string().min(1).parse(callId),
143
+ CallTurnSchema.array().min(1).parse(turns),
144
+ );
137
145
  },
138
146
  );
139
147
 
140
- export const endCallAction = serverAction(async (callId: string) => {
141
- await endCall(callId);
142
- });
148
+ export const saveThoughtAction = serverAction(
149
+ async (callId: unknown, thought: unknown) => {
150
+ await saveThought(
151
+ z.string().min(1).parse(callId),
152
+ CallThoughtSchema.parse(thought),
153
+ );
154
+ },
155
+ );
156
+
157
+ /**
158
+ * Ends the row. `close` is what `session.closed` confirmed; absent when the
159
+ * confirmation never came, which leaves the billed seconds unknown.
160
+ */
161
+ export const endCallAction = serverAction(
162
+ async (callId: unknown, close?: unknown) => {
163
+ await endCall(
164
+ z.string().min(1).parse(callId),
165
+ LiveCloseSchema.nullish().parse(close),
166
+ );
167
+ },
168
+ );
143
169
 
144
170
  /**
145
171
  * Deletes a call and its turns; the next call's prompt no longer includes it.
@@ -161,19 +187,19 @@ export const deleteEndedCallsAction = serverAction(async () =>
161
187
 
162
188
  /**
163
189
  * Wipes what the app has kept of its own use: every ended call and its turns,
164
- * every job and its thread, and every memory note. Keys, bots and connectors
190
+ * every thread and its messages, and every memory note. Keys, bots and connectors
165
191
  * stay — the set `pnpm reset` calls History.
166
192
  *
167
193
  * History is not one domain, so this reaches into three and each clears its own
168
- * rows. Live work is stopped before its row goes: `removeTask` aborts a running
194
+ * rows. Live work is stopped before its row goes: `removeThread` aborts a running
169
195
  * job and closes its shell.
170
196
  */
171
197
  export const resetHistoryAction = serverAction(async () => {
172
- const taskIds = await listAllTaskIds();
173
- for (const id of taskIds) await removeTask(id);
198
+ const threadIds = await listAllThreadIds();
199
+ for (const id of threadIds) await removeThread(id);
174
200
 
175
201
  const calls = await deleteEndedCalls();
176
202
  const notes = await deleteAllNotes();
177
203
 
178
- return { calls, tasks: taskIds.length, notes };
204
+ return { calls, threads: threadIds.length, notes };
179
205
  });
@@ -11,11 +11,17 @@ import {
11
11
  } from "drizzle-orm";
12
12
  import { CALL_HISTORY_PAGE } from "@/config";
13
13
  import { database } from "@/database/db";
14
- import { callMessageTable, callTable } from "@/database/tables";
15
- import { listCallJobs } from "@/features/bot/task.query";
14
+ import {
15
+ callMessageTable,
16
+ callTable,
17
+ callThoughtTable,
18
+ } from "@/database/tables";
19
+ import { listCallJobs } from "@/features/bot/thread.query";
16
20
  import { readConfig, writeConfig } from "@/features/config/config.query";
21
+ import type { LiveClose } from "@/lib/live/live.schema";
17
22
  import {
18
23
  type CallRecord,
24
+ type CallThought,
19
25
  type CallTurn,
20
26
  isSkillsOn,
21
27
  THURSDAY_KEYS,
@@ -35,7 +41,11 @@ export async function writeCallSkillsOn(on: boolean) {
35
41
  await writeConfig(THURSDAY_KEYS.skills, on ? "on" : "off");
36
42
  }
37
43
 
38
- export async function insertCall(input: { provider: string; model: string }) {
44
+ export async function insertCall(input: {
45
+ provider: string;
46
+ model: string;
47
+ backendModel: string;
48
+ }) {
39
49
  const [call] = await database
40
50
  .insert(callTable)
41
51
  .values({ id: crypto.randomUUID(), ...input })
@@ -43,11 +53,23 @@ export async function insertCall(input: { provider: string; model: string }) {
43
53
  return call.id;
44
54
  }
45
55
 
46
- /** Ends the call; false if it already ended, so end-of-call work runs once. */
47
- export async function endCall(id: string): Promise<boolean> {
56
+ /**
57
+ * Ends the call; false if it already ended, so end-of-call work runs once.
58
+ * `close` is what the provider confirmed on `session.closed`; without it the
59
+ * row keeps null seconds, which reads as "never confirmed", not as zero.
60
+ */
61
+ export async function endCall(
62
+ id: string,
63
+ close?: LiveClose | null,
64
+ ): Promise<boolean> {
48
65
  const ended = await database
49
66
  .update(callTable)
50
- .set({ endedAt: new Date() })
67
+ .set({
68
+ endedAt: new Date(),
69
+ ...(close
70
+ ? { endedReason: close.reason, seconds: close.seconds ?? null }
71
+ : {}),
72
+ })
51
73
  .where(and(eq(callTable.id, id), isNull(callTable.endedAt)))
52
74
  .returning({ id: callTable.id });
53
75
  return ended.length > 0;
@@ -61,14 +83,28 @@ export async function saveTurns(callId: string, turns: CallTurn[]) {
61
83
  for (const turn of turns) {
62
84
  await database
63
85
  .insert(callMessageTable)
64
- .values({ callId, ...turn })
86
+ .values({ callId, ...turn, fragments: turn.fragments ?? null })
65
87
  .onConflictDoUpdate({
66
88
  target: [callMessageTable.callId, callMessageTable.id],
67
- set: { text: turn.text, role: turn.role, tool: turn.tool ?? null },
89
+ set: {
90
+ text: turn.text,
91
+ role: turn.role,
92
+ tool: turn.tool ?? null,
93
+ // A late fragment revises the group; the originals go with it.
94
+ fragments: turn.fragments ?? null,
95
+ },
68
96
  });
69
97
  }
70
98
  }
71
99
 
100
+ /** A summary part arrives once, whole; a repeat keeps the first. */
101
+ export async function saveThought(callId: string, thought: CallThought) {
102
+ await database
103
+ .insert(callThoughtTable)
104
+ .values({ callId, ...thought })
105
+ .onConflictDoNothing();
106
+ }
107
+
72
108
  export type CallGroup = {
73
109
  callId: string;
74
110
  startedAt: Date;
@@ -120,27 +156,6 @@ export async function listRecentTurns(limit: number): Promise<CallGroup[]> {
120
156
  .map((group) => ({ ...group, turns: group.turns.reverse() }));
121
157
  }
122
158
 
123
- /** The last spoken turns of one call in order, without tool turns. */
124
- export async function listCallTurns(
125
- callId: string,
126
- limit: number,
127
- ): Promise<{ role: "user" | "assistant"; text: string }[]> {
128
- const rows = await database
129
- .select({ role: callMessageTable.role, text: callMessageTable.text })
130
- .from(callMessageTable)
131
- .where(
132
- and(
133
- eq(callMessageTable.callId, callId),
134
- inArray(callMessageTable.role, ["user", "assistant"]),
135
- ),
136
- )
137
- .orderBy(desc(callMessageTable.seq))
138
- .limit(limit);
139
- return rows
140
- .reverse()
141
- .map((row) => ({ role: row.role as "user" | "assistant", text: row.text }));
142
- }
143
-
144
159
  /**
145
160
  * One page of a call, every turn in order, tool turns included; null when the
146
161
  * call is gone. Tool turns keep their name and nothing else is read by the
@@ -202,7 +217,7 @@ export async function isAnyCallLive() {
202
217
 
203
218
  /**
204
219
  * Deletes an ended call and its turns (call_message cascades). A live call is
205
- * refused: its tab keeps writing turns against the row. Tasks keep a dangling
220
+ * refused: its tab keeps writing turns against the row. Threads keep a dangling
206
221
  * `callId`, which reads as "not on the line".
207
222
  */
208
223
  export async function deleteCall(id: string): Promise<boolean> {
@@ -238,8 +253,11 @@ export async function listCallHistory(options: {
238
253
  id: callTable.id,
239
254
  provider: callTable.provider,
240
255
  model: callTable.model,
256
+ backendModel: callTable.backendModel,
241
257
  startedAt: callTable.startedAt,
242
258
  endedAt: callTable.endedAt,
259
+ endedReason: callTable.endedReason,
260
+ seconds: callTable.seconds,
243
261
  })
244
262
  .from(callTable)
245
263
  .innerJoin(callMessageTable, eq(callMessageTable.callId, callTable.id))
@@ -260,6 +278,7 @@ export async function listCallHistory(options: {
260
278
  tool: callMessageTable.tool,
261
279
  text: callMessageTable.text,
262
280
  seq: callMessageTable.seq,
281
+ fragments: callMessageTable.fragments,
263
282
  at: callMessageTable.at,
264
283
  })
265
284
  .from(callMessageTable)
@@ -1,46 +1,28 @@
1
1
  import z from "zod";
2
2
  import { ASCII_FACE } from "@/config";
3
- import {
4
- type SpeachModelProviderId,
5
- speachModelRefSchema,
6
- } from "@/features/ai/model.schema";
7
- import { botIconSchema, type TaskStatus } from "@/features/bot/bot.schema";
3
+ import { LiveSettingsSchema } from "@/features/ai/live.schema";
4
+ import { botIconSchema, type ThreadStatus } from "@/features/bot/bot.schema";
8
5
  import { ASCII_CHARSETS, FACE_KINDS } from "@/features/thursday/face.const";
9
6
  import type { DateLike } from "@/lib/date-like";
10
- import { COMMON_VALIDATE } from "@/lib/limits";
11
- import type { RealtimeCredential } from "@/lib/realtime/realtime.schema";
12
- import type { RealtimeSessionSetup } from "@/lib/realtime/realtime.session";
7
+ import { LiveFragmentSchema } from "@/lib/live/live.schema";
13
8
 
14
9
  // Shared by server and browser: nothing here may touch the DB.
15
10
 
16
11
  /** The payload openCallAction parses. Browser-only settings live in thursday.store. */
17
- export const ThursdaySettingsSchema = z.object({
18
- systemPrompt: z.string().max(COMMON_VALIDATE.prompt.max).nullish(),
19
- /** null until picked; the server then falls back to a provider with a key. */
20
- model: speachModelRefSchema.nullish(),
12
+ export const ThursdaySettingsSchema = LiveSettingsSchema.extend({
21
13
  /** `navigator.language` (e.g. "ko-KR"). Only the first call's opening line uses it. */
22
14
  locale: z.string().max(35).nullish(),
23
15
  });
24
16
 
25
17
  export type ThursdaySettings = z.infer<typeof ThursdaySettingsSchema>;
26
18
 
27
- /**
28
- * What the browser receives to open a call. `credential` is used to connect;
29
- * `session` is sent as `session.update` after connecting (nothing is baked
30
- * into the secret).
31
- */
19
+ /** The browser receives the SDP answer, the row to save turns to, and the opening. */
32
20
  export type CallHandshake = {
33
21
  /** The row every saved turn hangs off. Exists before the connection. */
34
22
  callId: string;
35
- provider: SpeachModelProviderId;
36
- credential: RealtimeCredential;
37
- /** Sent as `session.update` once open; anything absent is the provider default. */
38
- session: RealtimeSessionSetup;
39
- /**
40
- * A system item to inject as soon as the line opens so the model speaks
41
- * first. Instructions alone do not make a realtime model open the conversation.
42
- */
43
- opening: string | null;
23
+ sdp: string;
24
+ /** Trusted instructions sent after session.started, so she speaks first. */
25
+ opening: string;
44
26
  };
45
27
 
46
28
  /**
@@ -70,7 +52,7 @@ export const FACE_DEFAULT: ThursdayFace = ThursdayFaceSchema.parse({});
70
52
  /**
71
53
  * Config keys (features/config config.query) the call's server-side settings
72
54
  * live under. Everything else about the call is the browser's (thursday.store);
73
- * these two places build the tool set, so they cannot be.
55
+ * these are read where the prompts and the tool set are built, so they cannot be.
74
56
  */
75
57
  export const THURSDAY_KEYS = {
76
58
  /** "on" hands the call `load_skill`; anything else, unset included, is off. */
@@ -155,21 +137,31 @@ export const CallTurnSchema = z.object({
155
137
  text: z.string(),
156
138
  /** Position in the conversation (call_message.seq). */
157
139
  seq: z.number().int().min(0),
140
+ /** Null on legacy rows and tool calls. Display groups can be revised. */
141
+ fragments: z.array(LiveFragmentSchema).nullish(),
158
142
  });
159
143
 
160
144
  export type CallTurn = z.infer<typeof CallTurnSchema>;
161
145
 
146
+ /** One reasoning summary part of the backend (call_thought). */
147
+ export const CallThoughtSchema = z.object({
148
+ id: z.string().min(1),
149
+ text: z.string(),
150
+ seq: z.number().int().min(0),
151
+ });
152
+
153
+ export type CallThought = z.infer<typeof CallThoughtSchema>;
154
+
162
155
  export type CallStatus =
163
156
  | "idle"
164
157
  | "connecting"
158
+ | "ending"
165
159
  | "listening"
166
160
  | "speaking"
167
161
  /** A tool is running. */
168
162
  | "working"
169
163
  /** Handing work to a background bot. */
170
164
  | "delegating";
171
- // No "ending" status: session.close() is synchronous, so it would be
172
- // overwritten by idle in the same batch and never render.
173
165
 
174
166
  /** The statuses a live call moves between. */
175
167
  export type LiveStatus = Extract<
@@ -182,15 +174,20 @@ export type CallRecord = {
182
174
  id: string;
183
175
  provider: string;
184
176
  model: string;
177
+ /** The Responses model that held the tools; null on rows written before Live. */
178
+ backendModel: string | null;
185
179
  startedAt: DateLike;
186
180
  /** null when the hang-up was never recorded. */
187
181
  endedAt: DateLike | null;
182
+ /** What the provider said on close, and the active seconds it billed. Null when unconfirmed. */
183
+ endedReason: string | null;
184
+ seconds: number | null;
188
185
  turns: (CallTurn & { at: DateLike })[];
189
186
  /** Jobs this call opened, as they stand now; the log draws each under the line that opened it. */
190
187
  jobs: {
191
188
  id: string;
192
189
  label: string;
193
- status: TaskStatus;
190
+ status: ThreadStatus;
194
191
  outcome: string | null;
195
192
  }[];
196
193
  };
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { create } from "zustand";
4
4
  import { persist } from "zustand/middleware";
5
+ import { LIVE_DEFAULTS, migrateLiveSettings } from "@/features/ai/live.schema";
5
6
  import {
6
7
  CALL_BACK_DEFAULT,
7
8
  type CallBack,
@@ -43,8 +44,7 @@ type ThursdayStore = Stored & {
43
44
  };
44
45
 
45
46
  const EMPTY: Stored = {
46
- systemPrompt: null,
47
- model: null,
47
+ ...LIVE_DEFAULTS,
48
48
  wake: WAKE_DEFAULT,
49
49
  hotkey: HOTKEY_DEFAULT,
50
50
  callBack: CALL_BACK_DEFAULT,
@@ -59,10 +59,12 @@ export const useThursdayStore = create<ThursdayStore>()(
59
59
  }),
60
60
  {
61
61
  name: "thursday.settings",
62
- // Parse on the way out so a hand-edited value cannot reach issuance.
62
+ // Parsed on the way in so a hand-edited value cannot reach a call. Live
63
+ // fields recover one by one (migrateLiveSettings), the rest by `.catch` above.
63
64
  merge: (persisted, current) => {
64
- const parsed = StoredSchema.safeParse(persisted);
65
- return { ...current, ...(parsed.success ? parsed.data : EMPTY) };
65
+ const parsed = StoredSchema.safeParse(migrateLiveSettings(persisted));
66
+ const restored = parsed.success ? parsed.data : EMPTY;
67
+ return { ...current, ...restored };
66
68
  },
67
69
  },
68
70
  ),
@@ -70,9 +72,11 @@ export const useThursdayStore = create<ThursdayStore>()(
70
72
 
71
73
  /** What openCallAction needs and nothing else. */
72
74
  export const thursdaySettings = (): ThursdaySettings => {
73
- const { systemPrompt, model } = useThursdayStore.getState();
74
75
  // Not stored: a fact of this browser, read when the call opens.
75
76
  const locale =
76
77
  typeof navigator === "undefined" ? null : (navigator.language ?? null);
77
- return { systemPrompt, model, locale };
78
+ return ThursdaySettingsSchema.parse({
79
+ ...useThursdayStore.getState(),
80
+ locale,
81
+ });
78
82
  };
@@ -1,17 +1,17 @@
1
1
  "use client";
2
2
 
3
3
  import { queryKey } from "@/app/api/query-key";
4
+ import type { LiveToolCall } from "@/lib/live/live.session";
4
5
  import { type Result, unwrapResult } from "@/lib/protocol/result";
5
- import type { RealtimeToolCall } from "@/lib/realtime/realtime.session";
6
6
  import { errorToString } from "@/lib/utils";
7
7
 
8
8
  /**
9
- * Runs a tool the realtime model called on the server and returns the string
9
+ * Runs a tool the Live backend called on the server and returns the string
10
10
  * for the model. Never throws: every failure comes back as one readable line.
11
11
  */
12
12
  export async function runRemoteTool(
13
13
  callId: string,
14
- call: RealtimeToolCall,
14
+ call: LiveToolCall,
15
15
  /** Aborted when the call ends, so a running tool stops with it (route). */
16
16
  signal?: AbortSignal,
17
17
  ): Promise<string> {
@@ -60,10 +60,12 @@ function fromArgs(name: string, args: Record<string, unknown>): string | null {
60
60
  const bot = typeof args.bot === "string" ? args.bot.trim() : "";
61
61
  return bot ? `Handing this to ${bot}` : "Handing this over";
62
62
  }
63
- if (name === TOOL_NAMES.task) {
64
- const label = typeof args.task === "string" ? args.task.trim() : "";
63
+ if (name === TOOL_NAMES.thread) {
64
+ const label = typeof args.thread === "string" ? args.thread.trim() : "";
65
65
  if (args.action === "answer") return "Passing that back";
66
66
  if (args.action === "cancel") return "Stopping that";
67
+ if (args.action === "open")
68
+ return label ? `Opening ${label}` : "Opening that";
67
69
  return label ? `Checking on ${label}` : "Checking the jobs";
68
70
  }
69
71
  return null;
@@ -103,7 +105,7 @@ export function toolLine(name: string, args?: string): string | null {
103
105
  * face instead of a glyph: who it went to is a face everywhere else in the app.
104
106
  */
105
107
  export function toolBot(name: string, args?: string): string | null {
106
- if (name !== TOOL_NAMES.delegate && name !== TOOL_NAMES.ask_bot) return null;
108
+ if (name !== TOOL_NAMES.delegate) return null;
107
109
  const bot = parseArgs(args)?.bot;
108
110
  return typeof bot === "string" && bot.trim() ? bot.trim() : null;
109
111
  }