thursday-agent 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +3 -2
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/required-server-files.json +8 -1
  6. package/.next/routes-manifest.json +18 -6
  7. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/server/app/_global-error.html +1 -1
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  14. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/server/app/_not-found.html +1 -1
  16. package/.next/server/app/_not-found.rsc +13 -13
  17. package/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +12 -12
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  20. package/.next/server/app/api/artifact/route.js +10 -6
  21. package/.next/server/app/api/artifact/route.js.nft.json +1 -1
  22. package/.next/server/app/api/bot/memory/files/route.js +5 -4
  23. package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
  24. package/.next/server/app/api/bot/memory/route.js +8 -8
  25. package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
  26. package/.next/server/app/api/bot/route.js +8 -8
  27. package/.next/server/app/api/bot/route.js.nft.json +1 -1
  28. package/.next/server/app/api/bot/thread/[id]/route/app-paths-manifest.json +3 -0
  29. package/.next/server/app/api/bot/thread/[id]/route.js +15 -0
  30. package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -0
  31. package/.next/server/app/api/bot/thread/[id]/route_client-reference-manifest.js +3 -0
  32. package/.next/server/app/api/bot/thread/route/app-paths-manifest.json +3 -0
  33. package/.next/server/app/api/bot/thread/route.js +15 -0
  34. package/.next/server/app/api/bot/thread/route.js.nft.json +1 -0
  35. package/.next/server/app/api/bot/thread/route_client-reference-manifest.js +3 -0
  36. package/.next/server/app/api/config/route.js +7 -7
  37. package/.next/server/app/api/config/route.js.nft.json +1 -1
  38. package/.next/server/app/api/events/route.js +3 -3
  39. package/.next/server/app/api/events/route.js.nft.json +1 -1
  40. package/.next/server/app/api/file/[...path]/route.js +4 -4
  41. package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
  42. package/.next/server/app/api/llm-model/catalog/route.js +8 -8
  43. package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
  44. package/.next/server/app/api/llm-model/credits/route.js +8 -8
  45. package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -1
  46. package/.next/server/app/api/llm-model/route.js +8 -8
  47. package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
  48. package/.next/server/app/api/llm-model/subscription/route.js +8 -8
  49. package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -1
  50. package/.next/server/app/api/mcp/[name]/route.js +6 -6
  51. package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
  52. package/.next/server/app/api/mcp/oauth/callback/route.js +4 -4
  53. package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
  54. package/.next/server/app/api/mcp/route.js +6 -6
  55. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  56. package/.next/server/app/api/mcp/tools/route.js +6 -6
  57. package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
  58. package/.next/server/app/api/memory/edit/route.js +15 -15
  59. package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
  60. package/.next/server/app/api/memory/route.js +7 -6
  61. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  62. package/.next/server/app/api/skills/[source]/[name]/route.js +6 -6
  63. package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/skills/route.js +6 -6
  65. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  66. package/.next/server/app/api/thursday/call/route.js +10 -11
  67. package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
  68. package/.next/server/app/api/thursday/skills/route.js +9 -10
  69. package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
  70. package/.next/server/app/api/thursday/tool-call/route.js +15 -15
  71. package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
  72. package/.next/server/app/api/workspace/missing/route/app-paths-manifest.json +3 -0
  73. package/.next/server/app/api/workspace/missing/route/build-manifest.json +12 -0
  74. package/.next/server/app/api/workspace/missing/route/server-reference-manifest.json +4 -0
  75. package/.next/server/app/api/workspace/missing/route.js +12 -0
  76. package/.next/server/app/api/workspace/missing/route.js.map +5 -0
  77. package/.next/server/app/api/workspace/missing/route.js.nft.json +1 -0
  78. package/.next/server/app/api/workspace/missing/route_client-reference-manifest.js +3 -0
  79. package/.next/server/app/api/workspace/route.js +5 -5
  80. package/.next/server/app/api/workspace/route.js.nft.json +1 -1
  81. package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +1 -1
  82. package/.next/server/app/artifact/[...path]/page.js +4 -3
  83. package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
  84. package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
  85. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  86. package/.next/server/app/page/server-reference-manifest.json +67 -45
  87. package/.next/server/app/page.js +10 -9
  88. package/.next/server/app/page.js.nft.json +1 -1
  89. package/.next/server/app/page_client-reference-manifest.js +1 -1
  90. package/.next/server/app-paths-manifest.json +3 -2
  91. package/.next/server/chunks/[root-of-the-server]__02846fb._.js +8 -0
  92. package/.next/server/chunks/[root-of-the-server]__049f521._.js +3 -0
  93. package/.next/server/chunks/[root-of-the-server]__05luceg._.js +3 -0
  94. package/.next/server/chunks/[root-of-the-server]__06--3q3._.js +8 -0
  95. package/.next/server/chunks/[root-of-the-server]__07bnah_._.js +3 -0
  96. package/.next/server/chunks/[root-of-the-server]__08eae20._.js +8 -0
  97. package/.next/server/chunks/[root-of-the-server]__0_ue8oe._.js +3 -0
  98. package/.next/server/chunks/[root-of-the-server]__0c9fgca._.js +5 -0
  99. package/.next/server/chunks/[root-of-the-server]__0g-ueei._.js +8 -0
  100. package/.next/server/chunks/[root-of-the-server]__0h_x6q6._.js +5 -0
  101. package/.next/server/chunks/{[root-of-the-server]__0pa2n68._.js → [root-of-the-server]__0kxrvxf._.js} +2 -2
  102. package/.next/server/chunks/{[root-of-the-server]__0q0vvt2._.js → [root-of-the-server]__0ov3iir._.js} +2 -2
  103. package/.next/server/chunks/[root-of-the-server]__0qwtlmx._.js +8 -0
  104. package/.next/server/chunks/[root-of-the-server]__0sm5xvm._.js +3 -0
  105. package/.next/server/chunks/[root-of-the-server]__0ye3da2._.js +3 -0
  106. package/.next/server/chunks/[root-of-the-server]__0zp35ul._.js +5 -0
  107. package/.next/server/chunks/[root-of-the-server]__144u9d_._.js +3 -0
  108. package/.next/server/chunks/[root-of-the-server]__18-2tsq._.js +5 -0
  109. package/.next/server/chunks/[root-of-the-server]__1e-ci13._.js +3 -0
  110. package/.next/server/chunks/[root-of-the-server]__1e2365e._.js +8 -0
  111. package/.next/server/chunks/[root-of-the-server]__1fix932._.js +8 -0
  112. package/.next/server/chunks/{[root-of-the-server]__0ce8nf8._.js → [root-of-the-server]__1g3t7vn._.js} +3 -3
  113. package/.next/server/chunks/[root-of-the-server]__1kp-83u._.js +5 -0
  114. package/.next/server/chunks/[root-of-the-server]__1kv8p3e._.js +5 -0
  115. package/.next/server/chunks/[root-of-the-server]__1orn-5b._.js +2 -3
  116. package/.next/server/chunks/_02szwk8._.js +5 -0
  117. package/.next/server/chunks/_05h2cii._.js +1 -1
  118. package/.next/server/chunks/_06c9kie._.js +216 -0
  119. package/.next/server/chunks/{_1x6kd1r._.js → _07y2gj-._.js} +1 -1
  120. package/.next/server/chunks/_0a43a-0._.js +3 -0
  121. package/.next/server/chunks/_0bujjey._.js +5 -0
  122. package/.next/server/chunks/_0c9j6rb._.js +1 -1
  123. package/.next/server/chunks/_0dkd549._.js +3 -0
  124. package/.next/server/chunks/_0ej1kvv._.js +3 -0
  125. package/.next/server/chunks/_0f6ts7z._.js +3 -0
  126. package/.next/server/chunks/_0gm9hyv._.js +55 -0
  127. package/.next/server/chunks/_0i55en5._.js +25 -0
  128. package/.next/server/chunks/_0k50n27._.js +18 -0
  129. package/.next/server/chunks/_0khihjk._.js +3 -3
  130. package/.next/server/chunks/_0n74zsf._.js +5 -5
  131. package/.next/server/chunks/_0nvm9ef._.js +3 -0
  132. package/.next/server/chunks/_0p56fn0._.js +3 -0
  133. package/.next/server/chunks/_0recufk._.js +1 -1
  134. package/.next/server/chunks/_0xbkz10._.js +3 -0
  135. package/.next/server/chunks/_10tkr26._.js +3 -0
  136. package/.next/server/chunks/{_0ioz3nd._.js → _11u2kp7._.js} +1 -1
  137. package/.next/server/chunks/_11ujpya._.js +3 -0
  138. package/.next/server/chunks/_127nx_p._.js +5 -0
  139. package/.next/server/chunks/_17l5ygt._.js +1 -1
  140. package/.next/server/chunks/_19uauj6._.js +3 -0
  141. package/.next/server/chunks/_1_5mnq4._.js +5 -5
  142. package/.next/server/chunks/_1abl6t9._.js +55 -0
  143. package/.next/server/chunks/_1d0j961._.js +3 -3
  144. package/.next/server/chunks/_1dbixxz._.js +3 -0
  145. package/.next/server/chunks/_1dc_d1q._.js +98 -0
  146. package/.next/server/chunks/_1drgfx4._.js +5 -5
  147. package/.next/server/chunks/_1e48czp._.js +3 -3
  148. package/.next/server/chunks/_1f31u5x._.js +5 -0
  149. package/.next/server/chunks/_1kg70wc._.js +3 -3
  150. package/.next/server/chunks/_1klbcft._.js +5 -0
  151. package/.next/server/chunks/_1krd9rf._.js +4 -1
  152. package/.next/server/chunks/_1kwmzab._.js +3 -0
  153. package/.next/server/chunks/{_1pf4qe-._.js → _1oxj9fa._.js} +1 -1
  154. package/.next/server/chunks/{_1f46eie._.js → _1pcmdbb._.js} +1 -1
  155. package/.next/server/chunks/_1qgix-j._.js +3 -0
  156. package/.next/server/chunks/{lib_logger_ts_1exwjut._.js → _1rpchta._.js} +5 -5
  157. package/.next/server/chunks/_1vsej-s._.js +5 -0
  158. package/.next/server/chunks/_1yx0p_s._.js +5 -0
  159. package/.next/server/chunks/{_0rnf-6n._.js → _20fsr_z._.js} +6 -6
  160. package/.next/server/chunks/_2128hkj._.js +5 -0
  161. package/.next/server/chunks/_next-internal_server_app_api_bot_thread_[id]_route_actions_1fstjn2.js +3 -0
  162. package/.next/server/chunks/_next-internal_server_app_api_bot_thread_route_actions_003ccso.js +3 -0
  163. package/.next/server/chunks/_next-internal_server_app_api_workspace_missing_route_actions_1fidi6p.js +3 -0
  164. package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
  165. package/.next/server/chunks/features_0-cnt0l._.js +4 -0
  166. package/.next/server/chunks/features_0hdaci0._.js +4 -0
  167. package/.next/server/chunks/features_1e39j7-._.js +8 -0
  168. package/.next/server/chunks/features_bot_bot_query_ts_12mgkl2._.js +1 -1
  169. package/.next/server/chunks/features_memory_1uqvksn._.js +1 -1
  170. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0v_7drq._.js → node_modules_consola_dist_chunks_prompt_mjs_0a7-pbw._.js} +1 -1
  171. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_17k8irj._.js → node_modules_consola_dist_chunks_prompt_mjs_0gzvgfv._.js} +1 -1
  172. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0i7cvml._.js → node_modules_consola_dist_chunks_prompt_mjs_107pxfn._.js} +1 -1
  173. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0icqaqw._.js → node_modules_consola_dist_chunks_prompt_mjs_15hbel8._.js} +1 -1
  174. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_18i-23e._.js +3 -0
  175. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1bewgf3._.js +3 -0
  176. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1kipdeo._.js +3 -0
  177. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1nlww1m._.js +3 -0
  178. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1q77nfx._.js +3 -0
  179. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xqdzx_._.js +3 -0
  180. package/.next/server/chunks/{node_modules_zod_v4_1801ax7._.js → node_modules_zod_v4_0lkux5-._.js} +2 -2
  181. package/.next/server/chunks/{node_modules_zod_v4_1cha_bw._.js → node_modules_zod_v4_1jmr9cq._.js} +2 -2
  182. package/.next/server/chunks/{node_modules_zod_v4_0ubdflj._.js → node_modules_zod_v4_1yrxmek._.js} +2 -2
  183. package/.next/server/chunks/node_modules_zod_v4_classic_errors_0tp0y-q.js +3 -0
  184. package/.next/server/chunks/ssr/[root-of-the-server]__09q9med._.js +1 -1
  185. package/.next/server/chunks/ssr/[root-of-the-server]__0bxsfyn._.js +101 -0
  186. package/.next/server/chunks/ssr/[root-of-the-server]__0lyi8i2._.js +1 -1
  187. package/.next/server/chunks/ssr/[root-of-the-server]__16jc196._.js +1 -1
  188. package/.next/server/chunks/ssr/[root-of-the-server]__172cq4x._.js +3 -0
  189. package/.next/server/chunks/ssr/[root-of-the-server]__18dthbp._.js +3 -0
  190. package/.next/server/chunks/ssr/[root-of-the-server]__18e68w8._.js +3 -0
  191. package/.next/server/chunks/ssr/[root-of-the-server]__1fll8dc._.js +3 -0
  192. package/.next/server/chunks/ssr/[root-of-the-server]__1mzi-ju._.js +1 -1
  193. package/.next/server/chunks/ssr/[root-of-the-server]__1nygfik._.js +5 -0
  194. package/.next/server/chunks/ssr/[root-of-the-server]__1sdphb0._.js +8 -0
  195. package/.next/server/chunks/ssr/[root-of-the-server]__1waa3rc._.js +100 -0
  196. package/.next/server/chunks/ssr/_00rehl_._.js +3 -0
  197. package/.next/server/chunks/ssr/{_1lz_cq2._.js → _02oc_h5._.js} +76 -97
  198. package/.next/server/chunks/ssr/_03_928f._.js +3 -0
  199. package/.next/server/chunks/ssr/_05yghx6._.js +3 -0
  200. package/.next/server/chunks/ssr/_08c4z-9._.js +3 -0
  201. package/.next/server/chunks/ssr/_0_qfdlw._.js +4 -0
  202. package/.next/server/chunks/ssr/_0c9e5w6._.js +9 -0
  203. package/.next/server/chunks/ssr/{_0s99bgb._.js → _0dh2e1j._.js} +9 -3
  204. package/.next/server/chunks/ssr/_0dr-ddg._.js +3 -0
  205. package/.next/server/chunks/ssr/_0eaog6_._.js +3 -0
  206. package/.next/server/chunks/ssr/_0evkpto._.js +3 -0
  207. package/.next/server/chunks/ssr/_0g_rlog._.js +3 -0
  208. package/.next/server/chunks/ssr/_0geg212._.js +3 -0
  209. package/.next/server/chunks/ssr/{_1jdgjv9._.js → _0hxt2ul._.js} +2 -2
  210. package/.next/server/chunks/ssr/_0i_6q1w._.js +2 -2
  211. package/.next/server/chunks/ssr/_0lu1n_x._.js +1 -1
  212. package/.next/server/chunks/ssr/{_15j2_8f._.js → _0wzaht-._.js} +2 -2
  213. package/.next/server/chunks/ssr/_0z-g0uy._.js +3 -0
  214. package/.next/server/chunks/ssr/_123ttsf._.js +3 -0
  215. package/.next/server/chunks/ssr/_123y-ah._.js +3 -0
  216. package/.next/server/chunks/ssr/_12w42gi._.js +3 -0
  217. package/.next/server/chunks/ssr/_161kqav._.js +3 -0
  218. package/.next/server/chunks/ssr/{_0ap2fzn._.js → _16c6_xm._.js} +2 -2
  219. package/.next/server/chunks/ssr/_18opah7._.js +3 -0
  220. package/.next/server/chunks/ssr/_18xqmny._.js +3 -0
  221. package/.next/server/chunks/ssr/_1_krfph._.js +3 -0
  222. package/.next/server/chunks/ssr/_1anqots._.js +3 -0
  223. package/.next/server/chunks/ssr/_1ey7qn-._.js +70 -0
  224. package/.next/server/chunks/ssr/_1g9vs7q._.js +3 -0
  225. package/.next/server/chunks/ssr/_1jmz33w._.js +3 -0
  226. package/.next/server/chunks/ssr/_1k0spz7._.js +3 -0
  227. package/.next/server/chunks/ssr/_1rgtxhr._.js +5 -0
  228. package/.next/server/chunks/ssr/_1slp25y._.js +3 -0
  229. package/.next/server/chunks/ssr/{_0rzucul._.js → _1x9pskj._.js} +3 -3
  230. package/.next/server/chunks/ssr/_1y6b5mr._.js +101 -0
  231. package/.next/server/chunks/ssr/_1ztk7p6._.js +7 -0
  232. package/.next/server/chunks/ssr/components_ui_tabs_tsx_0ej40b4._.js +3 -0
  233. package/.next/server/chunks/ssr/features_bot_thread_query_ts_023eklt._.js +4 -0
  234. package/.next/server/chunks/ssr/features_config_components_config-setting_tsx_0xfwqdg._.js +1 -1
  235. package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
  236. package/.next/server/chunks/ssr/{_1-teee5._.js → lib_logger_ts_0-olsze._.js} +2 -7
  237. package/.next/server/chunks/ssr/{node_modules_1y79i83._.js → node_modules_00_51_v._.js} +1 -1
  238. package/.next/server/chunks/ssr/{node_modules_0m383r2._.js → node_modules_022sipm._.js} +1 -1
  239. package/.next/server/chunks/ssr/{node_modules_05-n6dz._.js → node_modules_0332gw4._.js} +1 -1
  240. package/.next/server/chunks/ssr/{node_modules_0zeg3x_._.js → node_modules_04vxchl._.js} +1 -1
  241. package/.next/server/chunks/ssr/{node_modules_07dsgkx._.js → node_modules_0746rzi._.js} +1 -1
  242. package/.next/server/chunks/ssr/{node_modules_0fkeku3._.js → node_modules_0d5uzof._.js} +1 -1
  243. package/.next/server/chunks/ssr/{node_modules_1k6n600._.js → node_modules_0exkwcm._.js} +1 -1
  244. package/.next/server/chunks/ssr/{node_modules_16mkxuo._.js → node_modules_0fr-ml8._.js} +1 -1
  245. package/.next/server/chunks/ssr/{node_modules_0iur59s._.js → node_modules_0mxvg8h._.js} +1 -1
  246. package/.next/server/chunks/ssr/{node_modules_1j8j4pt._.js → node_modules_0qapgjr._.js} +1 -1
  247. package/.next/server/chunks/ssr/{node_modules_20c28js._.js → node_modules_0qbfyjh._.js} +1 -1
  248. package/.next/server/chunks/ssr/{node_modules_1k7z2j6._.js → node_modules_0t-9nup._.js} +1 -1
  249. package/.next/server/chunks/ssr/{node_modules_17bwo43._.js → node_modules_0tusx4d._.js} +3 -3
  250. package/.next/server/chunks/ssr/{node_modules_1chvq5f._.js → node_modules_0vsxbzp._.js} +1 -1
  251. package/.next/server/chunks/ssr/{node_modules_04sksn9._.js → node_modules_0vv0-fg._.js} +1 -1
  252. package/.next/server/chunks/ssr/{node_modules_1k8j8n0._.js → node_modules_0wsvp00._.js} +1 -1
  253. package/.next/server/chunks/ssr/{node_modules_1lz0oxc._.js → node_modules_1-urho9._.js} +1 -1
  254. package/.next/server/chunks/ssr/{node_modules_1-y7nni._.js → node_modules_16pi_dd._.js} +1 -1
  255. package/.next/server/chunks/ssr/{node_modules_1uyk91w._.js → node_modules_1d53yiq._.js} +1 -1
  256. package/.next/server/chunks/ssr/{node_modules_0bvopy2._.js → node_modules_1g1eihe._.js} +1 -1
  257. package/.next/server/chunks/ssr/{node_modules_1a0kmjl._.js → node_modules_1gpednh._.js} +1 -1
  258. package/.next/server/chunks/ssr/{node_modules_0u9da1h._.js → node_modules_1gu1pph._.js} +1 -1
  259. package/.next/server/chunks/ssr/{node_modules_056qgf-._.js → node_modules_1he1w8_._.js} +1 -1
  260. package/.next/server/chunks/ssr/{node_modules_0-dr_o7._.js → node_modules_1lnjapm._.js} +1 -1
  261. package/.next/server/chunks/ssr/{node_modules_1t77e4n._.js → node_modules_1lynj9m._.js} +1 -1
  262. package/.next/server/chunks/ssr/{node_modules_0x3-ply._.js → node_modules_1seuurl._.js} +2 -2
  263. package/.next/server/chunks/ssr/{node_modules_0ifp389._.js → node_modules_1u6w1pb._.js} +1 -1
  264. package/.next/server/chunks/ssr/{node_modules_1x0ztf4._.js → node_modules_1xn6saw._.js} +1 -1
  265. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0bkwd0u._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_067_exa._.js} +1 -1
  266. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0p9a9su._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0nrrdaq._.js} +1 -1
  267. package/.next/server/chunks/ssr/{node_modules_@vercel_oidc_dist_1o553h-._.js → node_modules_@vercel_oidc_dist_21a5haa._.js} +1 -1
  268. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_trash_mjs_0px2gzr._.js +3 -0
  269. package/.next/server/middleware-build-manifest.js +3 -3
  270. package/.next/server/pages/404.html +1 -1
  271. package/.next/server/pages/500.html +1 -1
  272. package/.next/server/server-reference-manifest.js +1 -1
  273. package/.next/server/server-reference-manifest.json +68 -46
  274. package/.next/static/chunks/0dr16v67vj4n7.js +2 -0
  275. package/.next/static/chunks/0g4b348l0pve7.js +1 -0
  276. package/.next/static/chunks/0joan-69kbspd.js +1 -0
  277. package/.next/static/chunks/0vlgzqo9ka90v.js +1 -0
  278. package/.next/static/chunks/0zrupxgci5gqc.js +1 -0
  279. package/.next/static/chunks/10k2xvap03z20.css +1 -0
  280. package/.next/static/chunks/18mkhstgiqcbt.js +1 -0
  281. package/.next/static/chunks/{435atsnhs7ksu.js → 1i-u2wzub_to1.js} +7 -7
  282. package/.next/static/chunks/1kp5nfp06nj9h.js +5 -0
  283. package/.next/static/chunks/1ohslk4568tm3.js +1 -0
  284. package/.next/static/chunks/1sbmwswc9k2-1.js +1 -0
  285. package/.next/static/chunks/1t9qms5pwwa3n.js +1 -0
  286. package/.next/static/chunks/1vj_5bnbxx84e.js +1 -0
  287. package/.next/static/chunks/1vqezbhjm3goq.js +1 -0
  288. package/.next/static/chunks/{408ueu4hfvcg7.js → 1wlo979mx-y3w.js} +1 -1
  289. package/.next/static/chunks/26ql4y-43xwhp.js +1 -0
  290. package/.next/static/chunks/{11r2yp_yh9_qn.js → 2_pnccjp6j1ca.js} +1 -1
  291. package/.next/static/chunks/2a51-ywz9b2a3.js +1 -0
  292. package/.next/static/chunks/2fvdgxih7x7hr.js +1 -0
  293. package/.next/static/chunks/2jlz8zp4jax_m.js +18 -0
  294. package/.next/static/chunks/2nvepds1fu2ux.js +1 -0
  295. package/.next/static/chunks/3addj3i4-izma.js +1 -0
  296. package/.next/static/chunks/3bfwpww3m3x4u.js +1 -0
  297. package/.next/static/chunks/3gfh7nxwusbt0.js +1 -0
  298. package/.next/static/chunks/3gwa44cvz4qoi.js +1 -0
  299. package/.next/static/chunks/{38gweqdo4jpfj.js → 3izg0a3k87q1-.js} +5 -5
  300. package/.next/static/chunks/3zk6q3-3f9swq.js +99 -0
  301. package/.next/static/chunks/3zkg5iup3v4a2.js +12 -0
  302. package/.next/static/chunks/405m0bqtoihev.js +1 -0
  303. package/.next/static/chunks/42wcg3wfg_m_p.js +1 -0
  304. package/README.md +27 -216
  305. package/app/api/events/app-event.ts +6 -4
  306. package/app/api/query-key.ts +25 -16
  307. package/bin/database.mjs +37 -0
  308. package/bin/thursday.mjs +44 -28
  309. package/components/ui/custom-icon.tsx +0 -60
  310. package/components/ui/radio-group.tsx +37 -0
  311. package/components/ui/shiny-text.tsx +33 -6
  312. package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/migration.sql +80 -24
  313. package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/snapshot.json +689 -110
  314. package/database/migrations/20260916160713_thread_cancelled/migration.sql +2 -0
  315. package/database/migrations/{20260911030320_opposite_jack_power → 20260916160713_thread_cancelled}/snapshot.json +706 -84
  316. package/docs/how-it-works.md +39 -36
  317. package/docs/images/keeps-going.png +0 -0
  318. package/docs/images/two-minds.png +0 -0
  319. package/docs/live-calls.md +231 -0
  320. package/docs/thread-rooms.md +71 -0
  321. package/features/ai/chatgpt.ts +1 -2
  322. package/features/ai/live.schema.ts +128 -0
  323. package/features/ai/load-tools.ts +148 -77
  324. package/features/ai/model.schema.ts +2 -120
  325. package/features/ai/model.ts +52 -88
  326. package/features/ai/prompts/bot.prompt.ts +91 -214
  327. package/features/ai/prompts/live.prompt.ts +265 -0
  328. package/features/ai/prompts/prompt-helper.ts +91 -32
  329. package/features/ai/prompts/thursday.prompt.ts +125 -172
  330. package/features/ai/tools/bot.tool.ts +38 -145
  331. package/features/ai/tools/call.tool.ts +1 -1
  332. package/features/ai/tools/connected.ts +5 -3
  333. package/features/ai/tools/mcp.tool.ts +7 -4
  334. package/features/ai/tools/memory.tool.ts +35 -31
  335. package/features/ai/tools/skills.tool.ts +11 -6
  336. package/features/ai/tools/studio.tool.ts +26 -21
  337. package/features/ai/tools/tool-name.ts +2 -5
  338. package/features/ai/tools/workspace.tool.ts +33 -10
  339. package/features/artifact/artifact.action.ts +2 -2
  340. package/features/artifact/artifact.query.ts +112 -61
  341. package/features/artifact/artifact.schema.ts +8 -6
  342. package/features/artifact/components/artifact-setting.tsx +83 -33
  343. package/features/bot/bot.action.ts +43 -36
  344. package/features/bot/bot.memory.ts +137 -20
  345. package/features/bot/bot.query.ts +28 -11
  346. package/features/bot/bot.run.ts +296 -744
  347. package/features/bot/bot.runner.ts +461 -862
  348. package/features/bot/bot.schema.ts +93 -82
  349. package/features/bot/bot.seed.ts +141 -64
  350. package/features/bot/components/bot-mark.tsx +324 -232
  351. package/features/bot/components/bot-room.tsx +1613 -697
  352. package/features/bot/components/bot-roster.tsx +8 -13
  353. package/features/bot/components/bot-setting.tsx +58 -42
  354. package/features/bot/components/bot-tool.tsx +55 -87
  355. package/features/bot/components/mark-palette.tsx +35 -32
  356. package/features/bot/components/path-chips.tsx +33 -3
  357. package/features/bot/components/thread-badge.tsx +34 -0
  358. package/features/bot/components/thread-reply.tsx +639 -0
  359. package/features/bot/components/thread-setting.tsx +674 -0
  360. package/features/bot/mark.const.ts +79 -31
  361. package/features/bot/room.query.ts +889 -0
  362. package/features/bot/room.schema.ts +64 -0
  363. package/features/bot/seed-bots.ts +2 -1
  364. package/features/bot/thread.query.ts +971 -0
  365. package/features/bot/thread.store.ts +587 -0
  366. package/features/config/components/voice-key.tsx +113 -88
  367. package/features/config/config.const.ts +5 -9
  368. package/features/connectors/mcp.schema.ts +0 -2
  369. package/features/intro/components/intro.tsx +169 -139
  370. package/features/memory/components/memory-setting.tsx +2 -7
  371. package/features/memory/memory.schema.ts +14 -23
  372. package/features/settings/components/setting-ui.tsx +0 -44
  373. package/features/settings/components/settings.tsx +12 -12
  374. package/features/settings/settings.alert.ts +3 -3
  375. package/features/settings/settings.store.ts +1 -1
  376. package/features/skills/skills.schema.ts +0 -2
  377. package/features/thursday/components/ascii-field.tsx +24 -44
  378. package/features/thursday/components/ascii-orb.tsx +359 -358
  379. package/features/thursday/components/call-log.tsx +46 -44
  380. package/features/thursday/components/face.tsx +35 -10
  381. package/features/thursday/components/tab-state.tsx +3 -3
  382. package/features/thursday/components/thursday-mark.tsx +1 -0
  383. package/features/thursday/components/thursday-setting.tsx +631 -332
  384. package/features/thursday/components/thursday.tsx +106 -41
  385. package/features/thursday/components/voice-picker.tsx +255 -0
  386. package/features/thursday/thursday.action.ts +94 -68
  387. package/features/thursday/thursday.query.ts +49 -30
  388. package/features/thursday/thursday.schema.ts +27 -30
  389. package/features/thursday/thursday.store.ts +11 -7
  390. package/features/thursday/tool-call.ts +3 -3
  391. package/features/thursday/tool-line.ts +5 -3
  392. package/features/thursday/use-thursday.ts +725 -450
  393. package/features/workspace/workspace.query.ts +17 -0
  394. package/features/workspace/workspace.ts +82 -36
  395. package/lib/live/live.schema.ts +47 -0
  396. package/lib/live/live.server.ts +155 -0
  397. package/lib/live/live.session.ts +574 -0
  398. package/lib/{realtime/realtime.tap.ts → live/live.tap.ts} +41 -12
  399. package/lib/live/live.transport.ts +152 -0
  400. package/lib/protocol/use-server-pages.ts +9 -5
  401. package/lib/utils.ts +21 -20
  402. package/package.json +2 -2
  403. package/public/voices/alloy.ogg +0 -0
  404. package/public/voices/ash.ogg +0 -0
  405. package/public/voices/ballad.ogg +0 -0
  406. package/public/voices/beacon.ogg +0 -0
  407. package/public/voices/bossa.ogg +0 -0
  408. package/public/voices/cedar.ogg +0 -0
  409. package/public/voices/cinder.ogg +0 -0
  410. package/public/voices/coral.ogg +0 -0
  411. package/public/voices/delta.ogg +0 -0
  412. package/public/voices/echo.ogg +0 -0
  413. package/public/voices/gleam.ogg +0 -0
  414. package/public/voices/marin.ogg +0 -0
  415. package/public/voices/meridian.ogg +0 -0
  416. package/public/voices/quartz.ogg +0 -0
  417. package/public/voices/ripple.ogg +0 -0
  418. package/public/voices/sage.ogg +0 -0
  419. package/public/voices/shimmer.ogg +0 -0
  420. package/public/voices/stone.ogg +0 -0
  421. package/public/voices/tempo.ogg +0 -0
  422. package/public/voices/verse.ogg +0 -0
  423. package/public/voices/vesper.ogg +0 -0
  424. package/public/voices/willow.ogg +0 -0
  425. package/scripts/artifact-paths.test.mts +25 -0
  426. package/scripts/bot-context.test.mts +1408 -0
  427. package/scripts/live-history.test.mts +115 -0
  428. package/scripts/live-session.test.mts +948 -0
  429. package/server.js +1 -1
  430. package/skills/browser/SKILL.md +11 -1
  431. package/skills/computer/SKILL.md +1 -1
  432. package/skills/find-skills/SKILL.md +3 -8
  433. package/skills/interactive-page/SKILL.md +12 -7
  434. package/skills/interactive-page/references/diagram.md +89 -0
  435. package/skills/interactive-page/scripts/archify/LICENSE +22 -0
  436. package/skills/interactive-page/scripts/archify/README.md +25 -0
  437. package/skills/interactive-page/scripts/archify/assets/JetBrainsMono-OFL.txt +93 -0
  438. package/skills/interactive-page/scripts/archify/assets/template.html +14934 -0
  439. package/skills/interactive-page/scripts/archify/bin/archify.mjs +2126 -0
  440. package/skills/interactive-page/scripts/archify/bin/open-artifact.mjs +86 -0
  441. package/skills/interactive-page/scripts/archify/bin/preview.mjs +653 -0
  442. package/skills/interactive-page/scripts/archify/bin/visual-check.mjs +829 -0
  443. package/skills/interactive-page/scripts/archify/delta/architecture-delta.mjs +1223 -0
  444. package/skills/interactive-page/scripts/archify/examples/agent-run.lifecycle.json +60 -0
  445. package/skills/interactive-page/scripts/archify/examples/agent-tool-call.workflow.json +94 -0
  446. package/skills/interactive-page/scripts/archify/examples/async-job-roundtrip.sequence.json +61 -0
  447. package/skills/interactive-page/scripts/archify/examples/cache-miss-request.sequence.json +82 -0
  448. package/skills/interactive-page/scripts/archify/examples/checkout-platform.base.architecture.json +31 -0
  449. package/skills/interactive-page/scripts/archify/examples/checkout-platform.head.architecture.json +31 -0
  450. package/skills/interactive-page/scripts/archify/examples/deployment-release.lifecycle.json +49 -0
  451. package/skills/interactive-page/scripts/archify/examples/event-stream.dataflow.json +57 -0
  452. package/skills/interactive-page/scripts/archify/examples/incident-response.workflow.json +64 -0
  453. package/skills/interactive-page/scripts/archify/examples/product-analytics.dataflow.json +76 -0
  454. package/skills/interactive-page/scripts/archify/examples/production-deployment.architecture.json +71 -0
  455. package/skills/interactive-page/scripts/archify/examples/release-delivery.workflow.json +62 -0
  456. package/skills/interactive-page/scripts/archify/examples/web-app.architecture.json +46 -0
  457. package/skills/interactive-page/scripts/archify/migrations/workflow-v2.mjs +279 -0
  458. package/skills/interactive-page/scripts/archify/recipes/scenarios.mjs +284 -0
  459. package/skills/interactive-page/scripts/archify/references/authoring-contract.md +243 -0
  460. package/skills/interactive-page/scripts/archify/references/delivery-contract.md +120 -0
  461. package/skills/interactive-page/scripts/archify/references/viewer-runtime.md +45 -0
  462. package/skills/interactive-page/scripts/archify/renderers/architecture/grid.mjs +62 -0
  463. package/skills/interactive-page/scripts/archify/renderers/architecture/render-architecture.mjs +1078 -0
  464. package/skills/interactive-page/scripts/archify/renderers/dataflow/README.md +104 -0
  465. package/skills/interactive-page/scripts/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  466. package/skills/interactive-page/scripts/archify/renderers/lifecycle/README.md +115 -0
  467. package/skills/interactive-page/scripts/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  468. package/skills/interactive-page/scripts/archify/renderers/sequence/README.md +114 -0
  469. package/skills/interactive-page/scripts/archify/renderers/sequence/render-sequence.mjs +464 -0
  470. package/skills/interactive-page/scripts/archify/renderers/shared/brand-marks.mjs +563 -0
  471. package/skills/interactive-page/scripts/archify/renderers/shared/cli.mjs +218 -0
  472. package/skills/interactive-page/scripts/archify/renderers/shared/desktop-readability.mjs +26 -0
  473. package/skills/interactive-page/scripts/archify/renderers/shared/diagnostics.mjs +127 -0
  474. package/skills/interactive-page/scripts/archify/renderers/shared/engineering-profiles.mjs +157 -0
  475. package/skills/interactive-page/scripts/archify/renderers/shared/generated-brand-marks.mjs +3 -0
  476. package/skills/interactive-page/scripts/archify/renderers/shared/generated-validators.mjs +13 -0
  477. package/skills/interactive-page/scripts/archify/renderers/shared/geometry.mjs +1423 -0
  478. package/skills/interactive-page/scripts/archify/renderers/shared/i18n.mjs +595 -0
  479. package/skills/interactive-page/scripts/archify/renderers/shared/layout-report.mjs +40 -0
  480. package/skills/interactive-page/scripts/archify/renderers/shared/legend.mjs +217 -0
  481. package/skills/interactive-page/scripts/archify/renderers/shared/output-path.mjs +340 -0
  482. package/skills/interactive-page/scripts/archify/renderers/shared/repository-evidence.mjs +238 -0
  483. package/skills/interactive-page/scripts/archify/renderers/shared/repository-location.mjs +58 -0
  484. package/skills/interactive-page/scripts/archify/renderers/shared/text-fit.mjs +49 -0
  485. package/skills/interactive-page/scripts/archify/renderers/shared/utils.mjs +232 -0
  486. package/skills/interactive-page/scripts/archify/renderers/shared/validator.mjs +86 -0
  487. package/skills/interactive-page/scripts/archify/renderers/workflow/README.md +223 -0
  488. package/skills/interactive-page/scripts/archify/renderers/workflow/render-workflow.mjs +35 -0
  489. package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  490. package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  491. package/skills/interactive-page/scripts/archify/schemas/README.md +211 -0
  492. package/skills/interactive-page/scripts/archify/schemas/architecture.schema.json +178 -0
  493. package/skills/interactive-page/scripts/archify/schemas/common.schema.json +115 -0
  494. package/skills/interactive-page/scripts/archify/schemas/dataflow.schema.json +243 -0
  495. package/skills/interactive-page/scripts/archify/schemas/lifecycle.schema.json +266 -0
  496. package/skills/interactive-page/scripts/archify/schemas/sequence.schema.json +223 -0
  497. package/skills/interactive-page/scripts/archify/schemas/workflow.schema.json +428 -0
  498. package/skills/interactive-page/scripts/archify/scripts/check-render-output.mjs +916 -0
  499. package/skills/interactive-page/scripts/archify/scripts/render-examples.mjs +26 -0
  500. package/skills/interactive-page/scripts/bundle-artifact.sh +9 -8
  501. package/skills/skill-creator/SKILL.md +4 -5
  502. package/.next/server/app/api/bot/task/[id]/route/app-paths-manifest.json +0 -3
  503. package/.next/server/app/api/bot/task/[id]/route.js +0 -16
  504. package/.next/server/app/api/bot/task/[id]/route.js.nft.json +0 -1
  505. package/.next/server/app/api/bot/task/[id]/route_client-reference-manifest.js +0 -3
  506. package/.next/server/app/api/bot/task/route/app-paths-manifest.json +0 -3
  507. package/.next/server/app/api/bot/task/route.js +0 -16
  508. package/.next/server/app/api/bot/task/route.js.nft.json +0 -1
  509. package/.next/server/app/api/bot/task/route_client-reference-manifest.js +0 -3
  510. package/.next/server/chunks/[root-of-the-server]__026u77e._.js +0 -5
  511. package/.next/server/chunks/[root-of-the-server]__02va5wz._.js +0 -3
  512. package/.next/server/chunks/[root-of-the-server]__050zri4._.js +0 -3
  513. package/.next/server/chunks/[root-of-the-server]__0bg9710._.js +0 -3
  514. package/.next/server/chunks/[root-of-the-server]__0ffbg85._.js +0 -3
  515. package/.next/server/chunks/[root-of-the-server]__0in-d5s._.js +0 -3
  516. package/.next/server/chunks/[root-of-the-server]__0ncs9uu._.js +0 -3
  517. package/.next/server/chunks/[root-of-the-server]__0pa9k-f._.js +0 -8
  518. package/.next/server/chunks/[root-of-the-server]__0qi_m0e._.js +0 -8
  519. package/.next/server/chunks/[root-of-the-server]__0tq0m_k._.js +0 -3
  520. package/.next/server/chunks/[root-of-the-server]__0xep6j_._.js +0 -3
  521. package/.next/server/chunks/[root-of-the-server]__1-ga0kh._.js +0 -5
  522. package/.next/server/chunks/[root-of-the-server]__11n256_._.js +0 -5
  523. package/.next/server/chunks/[root-of-the-server]__144l7qt._.js +0 -8
  524. package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +0 -5
  525. package/.next/server/chunks/[root-of-the-server]__1anc1p9._.js +0 -3
  526. package/.next/server/chunks/[root-of-the-server]__1fizn31._.js +0 -3
  527. package/.next/server/chunks/[root-of-the-server]__1jg8t86._.js +0 -8
  528. package/.next/server/chunks/[root-of-the-server]__1lldzy9._.js +0 -3
  529. package/.next/server/chunks/[root-of-the-server]__1llj3-b._.js +0 -3
  530. package/.next/server/chunks/[root-of-the-server]__1p8m3f4._.js +0 -3
  531. package/.next/server/chunks/[root-of-the-server]__1peqvsi._.js +0 -3
  532. package/.next/server/chunks/[root-of-the-server]__1w8gm5h._.js +0 -10
  533. package/.next/server/chunks/[root-of-the-server]__1xt39nn._.js +0 -8
  534. package/.next/server/chunks/[root-of-the-server]__1zb8mfo._.js +0 -8
  535. package/.next/server/chunks/_0-73of8._.js +0 -55
  536. package/.next/server/chunks/_0-fjql4._.js +0 -31
  537. package/.next/server/chunks/_00xh_q0._.js +0 -25
  538. package/.next/server/chunks/_051qh8u._.js +0 -3
  539. package/.next/server/chunks/_05sovvj._.js +0 -3
  540. package/.next/server/chunks/_091bi8d._.js +0 -3
  541. package/.next/server/chunks/_0fzqt2y._.js +0 -142
  542. package/.next/server/chunks/_0lr92vd._.js +0 -3
  543. package/.next/server/chunks/_0mecv0f._.js +0 -31
  544. package/.next/server/chunks/_0mh8j4m._.js +0 -3
  545. package/.next/server/chunks/_0sb7tlz._.js +0 -3
  546. package/.next/server/chunks/_0si7xzn._.js +0 -3
  547. package/.next/server/chunks/_0u10wmw._.js +0 -55
  548. package/.next/server/chunks/_0wp4le3._.js +0 -3
  549. package/.next/server/chunks/_0y5fg-x._.js +0 -3
  550. package/.next/server/chunks/_1230wbx._.js +0 -10
  551. package/.next/server/chunks/_12nheja._.js +0 -3
  552. package/.next/server/chunks/_13510xh._.js +0 -3
  553. package/.next/server/chunks/_15hq89o._.js +0 -3
  554. package/.next/server/chunks/_18-1wcc._.js +0 -55
  555. package/.next/server/chunks/_18d7-5p._.js +0 -3
  556. package/.next/server/chunks/_1c78vw5._.js +0 -237
  557. package/.next/server/chunks/_1h5_8sk._.js +0 -3
  558. package/.next/server/chunks/_1hdnxb7._.js +0 -3
  559. package/.next/server/chunks/_1j8k_j5._.js +0 -3
  560. package/.next/server/chunks/_1nula3v._.js +0 -3
  561. package/.next/server/chunks/_1php4eq._.js +0 -3
  562. package/.next/server/chunks/_1yuv4vp._.js +0 -3
  563. package/.next/server/chunks/_1zkfbaa._.js +0 -3
  564. package/.next/server/chunks/_next-internal_server_app_api_bot_task_[id]_route_actions_1_k_8u3.js +0 -3
  565. package/.next/server/chunks/_next-internal_server_app_api_bot_task_route_actions_0xln6ra.js +0 -3
  566. package/.next/server/chunks/features_0rpfxbk._.js +0 -3
  567. package/.next/server/chunks/features_1qf3cei._.js +0 -8
  568. package/.next/server/chunks/features_bot_0zt92oh._.js +0 -3
  569. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1jidylq._.js +0 -3
  570. package/.next/server/chunks/ssr/[externals]__0dizgek._.js +0 -3
  571. package/.next/server/chunks/ssr/[root-of-the-server]__0-nob52._.js +0 -4
  572. package/.next/server/chunks/ssr/[root-of-the-server]__092knlj._.js +0 -3
  573. package/.next/server/chunks/ssr/[root-of-the-server]__0mz33a7._.js +0 -3
  574. package/.next/server/chunks/ssr/[root-of-the-server]__0s4wb56._.js +0 -3
  575. package/.next/server/chunks/ssr/[root-of-the-server]__0s9dq5u._.js +0 -3
  576. package/.next/server/chunks/ssr/[root-of-the-server]__0sd3izg._.js +0 -3
  577. package/.next/server/chunks/ssr/[root-of-the-server]__0vnmv-s._.js +0 -3
  578. package/.next/server/chunks/ssr/[root-of-the-server]__1-13tcn._.js +0 -43
  579. package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +0 -61
  580. package/.next/server/chunks/ssr/[root-of-the-server]__1zidpfl._.js +0 -3
  581. package/.next/server/chunks/ssr/_001_ms1._.js +0 -33
  582. package/.next/server/chunks/ssr/_01n3o0m._.js +0 -3
  583. package/.next/server/chunks/ssr/_04z2c7b._.js +0 -3
  584. package/.next/server/chunks/ssr/_06tssji._.js +0 -3
  585. package/.next/server/chunks/ssr/_0fk4c7d._.js +0 -3
  586. package/.next/server/chunks/ssr/_0h42fze._.js +0 -3
  587. package/.next/server/chunks/ssr/_0h7zdni._.js +0 -3
  588. package/.next/server/chunks/ssr/_0m2lsd1._.js +0 -3
  589. package/.next/server/chunks/ssr/_0mggveb._.js +0 -3
  590. package/.next/server/chunks/ssr/_0nbpc_8._.js +0 -3
  591. package/.next/server/chunks/ssr/_0q0zan6._.js +0 -70
  592. package/.next/server/chunks/ssr/_0zcjrbg._.js +0 -3
  593. package/.next/server/chunks/ssr/_0zhoc3r._.js +0 -3
  594. package/.next/server/chunks/ssr/_11j92tu._.js +0 -3
  595. package/.next/server/chunks/ssr/_13fke0x._.js +0 -3
  596. package/.next/server/chunks/ssr/_18cymkq._.js +0 -3
  597. package/.next/server/chunks/ssr/_1ebxla1._.js +0 -3
  598. package/.next/server/chunks/ssr/_1nj4niv._.js +0 -42
  599. package/.next/server/chunks/ssr/_1ov37if._.js +0 -3
  600. package/.next/server/chunks/ssr/_1ovmc9s._.js +0 -3
  601. package/.next/server/chunks/ssr/_1sji22n._.js +0 -3
  602. package/.next/server/chunks/ssr/_1vi_uo7._.js +0 -3
  603. package/.next/server/chunks/ssr/_1vyd1ji._.js +0 -3
  604. package/.next/server/chunks/ssr/_1xx4zlb._.js +0 -3
  605. package/.next/server/chunks/ssr/components_ui_1y1l7yj._.js +0 -3
  606. package/.next/server/chunks/ssr/features_bot_1s_-2vj._.js +0 -3
  607. package/.next/server/chunks/ssr/lib_realtime_12wg_dd._.js +0 -27
  608. package/.next/server/chunks/ssr/lib_realtime_15h_v1v._.js +0 -27
  609. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0npjf8-._.js +0 -3
  610. package/.next/static/chunks/0n3jle9kbqfr2.js +0 -40
  611. package/.next/static/chunks/0r5qcctujhxli.js +0 -1
  612. package/.next/static/chunks/10teww7wt-f6h.js +0 -1
  613. package/.next/static/chunks/126fj4pga_72k.js +0 -1
  614. package/.next/static/chunks/159udiexf6dom.js +0 -2
  615. package/.next/static/chunks/18a96rkhi4_yd.js +0 -1
  616. package/.next/static/chunks/18gi7o2ibrgh8.js +0 -3
  617. package/.next/static/chunks/1dkjg87pxk0n9.js +0 -28
  618. package/.next/static/chunks/1q9z1tohil7xn.js +0 -1
  619. package/.next/static/chunks/1sjgfets224re.js +0 -1
  620. package/.next/static/chunks/1wszsr83t01gh.js +0 -1
  621. package/.next/static/chunks/22_zkas21rpna.js +0 -1
  622. package/.next/static/chunks/2fh4-3z_q8b_w.js +0 -1
  623. package/.next/static/chunks/2h0sd2vumhb15.js +0 -1
  624. package/.next/static/chunks/2szintyibu0s5.js +0 -1
  625. package/.next/static/chunks/2t4vhi3m8ahya.js +0 -1
  626. package/.next/static/chunks/2tigdtz3dpcy8.js +0 -1
  627. package/.next/static/chunks/3-b6b7entqazs.js +0 -1
  628. package/.next/static/chunks/3786h5vayt80-.js +0 -28
  629. package/.next/static/chunks/3cq5g494yuke8.css +0 -1
  630. package/.next/static/chunks/3dmbhsv2u_8kj.js +0 -1
  631. package/.next/static/chunks/3hibbjnt85-k6.js +0 -1
  632. package/.next/static/chunks/3i0a5px-oufgc.js +0 -1
  633. package/.next/static/chunks/3wexk9qo8zuj3.js +0 -18
  634. package/.next/static/chunks/3xk7yqgomx7yq.js +0 -1
  635. package/.next/static/chunks/3xre8bu_pk1p_.js +0 -1
  636. package/.next/static/chunks/3zv6t3i77xhr_.js +0 -1
  637. package/database/migrations/20260911030320_opposite_jack_power/migration.sql +0 -1
  638. package/docs/images/task-thread.png +0 -0
  639. package/features/bot/components/task-badge.tsx +0 -42
  640. package/features/bot/components/task-reply.tsx +0 -328
  641. package/features/bot/components/task-setting.tsx +0 -524
  642. package/features/bot/task.query.ts +0 -1079
  643. package/features/bot/task.store.ts +0 -487
  644. package/lib/realtime/client-secret.ts +0 -86
  645. package/lib/realtime/open-session.ts +0 -31
  646. package/lib/realtime/openai.ts +0 -35
  647. package/lib/realtime/realtime.audio.ts +0 -196
  648. package/lib/realtime/realtime.driver.ts +0 -489
  649. package/lib/realtime/realtime.protocol.ts +0 -393
  650. package/lib/realtime/realtime.schema.ts +0 -37
  651. package/lib/realtime/realtime.session.ts +0 -106
  652. package/lib/realtime/realtime.transport.ts +0 -384
  653. package/lib/realtime/xai.ts +0 -39
  654. /package/.next/server/app/api/bot/{task → thread}/[id]/route/build-manifest.json +0 -0
  655. /package/.next/server/app/api/bot/{task → thread}/[id]/route/server-reference-manifest.json +0 -0
  656. /package/.next/server/app/api/bot/{task → thread}/[id]/route.js.map +0 -0
  657. /package/.next/server/app/api/bot/{task → thread}/route/build-manifest.json +0 -0
  658. /package/.next/server/app/api/bot/{task → thread}/route/server-reference-manifest.json +0 -0
  659. /package/.next/server/app/api/bot/{task → thread}/route.js.map +0 -0
  660. /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → 0qzGoKn2wTERVZtblX1tp}/_buildManifest.js +0 -0
  661. /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → 0qzGoKn2wTERVZtblX1tp}/_clientMiddlewareManifest.js +0 -0
  662. /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → 0qzGoKn2wTERVZtblX1tp}/_ssgManifest.js +0 -0
@@ -69,6 +69,23 @@ export async function readWorkspaceFolder(
69
69
  };
70
70
  }
71
71
 
72
+ /**
73
+ * Which of these workspace-relative paths name no file: a message can mention a
74
+ * file that was never written or has since gone. A path that leaves the workspace
75
+ * is not judged and never listed.
76
+ */
77
+ export async function findMissingFiles(paths: string[]): Promise<string[]> {
78
+ const missing = await Promise.all(
79
+ paths.map(async (path) => {
80
+ const full = await insideWorkspace(path);
81
+ if (!full) return null;
82
+ const info = await stat(full).catch(() => null);
83
+ return info?.isFile() ? null : path;
84
+ }),
85
+ );
86
+ return missing.filter((path) => path !== null);
87
+ }
88
+
72
89
  /** Deletes one file. Folders are refused: a whole tree goes through `emptyScratch`. */
73
90
  export async function deleteWorkspaceFile(rel: string): Promise<void> {
74
91
  const full = await insideWorkspace(rel);
@@ -1,4 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { existsSync } from "node:fs";
2
3
  import {
3
4
  mkdir,
4
5
  readdir,
@@ -62,14 +63,27 @@ const under = (root: string, path: string) =>
62
63
  /**
63
64
  * Why a file may not be written where the model asked, as one line it can act
64
65
  * on, or null when it may. Refused: the workspace root (files belong in one
65
- * of the three folders) and anything inside the app running the bot.
66
+ * of the folders), a new entry at the top of `artifacts/` other than the
67
+ * bot's own folder, and anything inside the app running the bot. What already
68
+ * sits in `artifacts/` — another bot's folder, an older result — stays editable.
66
69
  */
67
- export function writeRefusal(full: string): string | null {
70
+ export function writeRefusal(full: string, bot?: string): string | null {
68
71
  if (under(WORKSPACE, full)) {
69
72
  const rel = relative(WORKSPACE, full);
70
- const [top] = rel.split(sep);
71
- if (top && WRITABLE.has(top)) return null;
72
- return `Not written: ${rel || "the workspace root"} is outside the workspace's folders. Finished work goes under ${PATHS.artifacts}/, code under ${PATHS.projects}/, your own kit under ${PATHS.bots}/, and this job's working material under ${PATHS.scratch}/.`;
73
+ const [top, entry] = rel.split(sep);
74
+ if (!top || !WRITABLE.has(top)) {
75
+ return `Not written: ${rel || "the workspace root"} is outside the workspace's folders. Finished work goes under ${bot ? botArtifacts(bot) : PATHS.artifacts}/, code under ${PATHS.projects}/, your own kit under ${PATHS.bots}/, and this job's working material under ${PATHS.scratch}/.`;
76
+ }
77
+ if (
78
+ bot &&
79
+ top === PATHS.artifacts &&
80
+ entry &&
81
+ entry.toLowerCase() !== botFolderName(bot).toLowerCase() &&
82
+ !existsSync(join(ARTIFACTS, entry))
83
+ ) {
84
+ return `Not written: ${rel} would sit loose at the top of ${PATHS.artifacts}/. Your finished work goes in ${botArtifacts(bot)}/.`;
85
+ }
86
+ return null;
73
87
  }
74
88
  if (under(APP_ROOT, full)) {
75
89
  return `Not written: ${full} is inside the app that is running you, not the user's files. Work in ${WORKSPACE}; outside it, write only where the user pointed you.`;
@@ -98,19 +112,17 @@ export async function insideWorkspace(rel: string): Promise<string | null> {
98
112
  }
99
113
 
100
114
  /**
101
- * Where one job keeps what it is still working on. `scratch/` used to be shared
102
- * by every job at once, so nobody could tell whose a file was or when it stopped
103
- * mattering, and it only grew. A job has a beginning and an end, which is what
104
- * makes its working material safe to clear later — and it is the right unit
105
- * rather than the bot, because several bots work inside one job (`ask_bot`) and
115
+ * Where one job keeps what it is still working on. A job has a beginning and an
116
+ * end, which is what makes its working material safe to clear later — and it is
117
+ * the right unit rather than the bot, because several bots work inside one job and
106
118
  * one bot runs many jobs.
107
119
  *
108
120
  * Named for the label so the folder is readable on the Workspace screen, with
109
121
  * the head of the id after it so two jobs called the same thing stay apart.
110
- * Finished work never lands here: that is `artifacts/`, which stays flat and
111
- * unattributed, and code is `projects/`, which outlives the job that started it.
122
+ * Finished work never lands here: that is the bot's own folder in `artifacts/`,
123
+ * and code is `projects/`, which outlives the job that started it.
112
124
  */
113
- export function jobScratch(taskId: string, label: string): string {
125
+ export function jobScratch(threadId: string, label: string): string {
114
126
  const slug =
115
127
  label
116
128
  .trim()
@@ -118,25 +130,48 @@ export function jobScratch(taskId: string, label: string): string {
118
130
  .replace(/[^\p{L}\p{N}]+/gu, "-")
119
131
  .replace(/^-+|-+$/g, "")
120
132
  .slice(0, 40) || "job";
121
- return `${PATHS.scratch}/${slug}-${taskId.slice(0, 6)}`;
133
+ return `${PATHS.scratch}/${slug}-${threadId.slice(0, 6)}`;
122
134
  }
123
135
 
136
+ /**
137
+ * A bot's name as one path segment, the same under `bots/` and `artifacts/`.
138
+ * Two names that give the same segment would share both folders, so creating
139
+ * a bot refuses one (bot.query createBot); compared lowercased, as macOS does.
140
+ */
141
+ export const botFolderName = (bot: string): string =>
142
+ bot.replace(/[^\p{L}\p{N}_-]+/gu, "-");
143
+
124
144
  /** Where one bot keeps what it wants on its next job (config PATHS.bots). */
125
145
  export const botFolder = (bot: string): string =>
126
- `${PATHS.bots}/${bot.replace(/[^\p{L}\p{N}_-]+/gu, "-")}`;
146
+ `${PATHS.bots}/${botFolderName(bot)}`;
127
147
 
128
- export async function openBotFolder(bot: string): Promise<string> {
129
- const path = botFolder(bot);
130
- await mkdir(join(WORKSPACE, path), { recursive: true });
131
- return path;
148
+ /**
149
+ * Where one bot's finished work goes. The Artifacts section draws each as that
150
+ * bot's group (features/artifact), so a result is filed by who made it.
151
+ */
152
+ export const botArtifacts = (bot: string): string =>
153
+ `${PATHS.artifacts}/${botFolderName(bot)}`;
154
+
155
+ /** Both of a bot's folders, created so its first write never has to. */
156
+ export async function openBotFolders(
157
+ bot: string,
158
+ ): Promise<{ own: string; artifacts: string }> {
159
+ const own = botFolder(bot);
160
+ const artifacts = botArtifacts(bot);
161
+ await Promise.all(
162
+ [own, artifacts].map((path) =>
163
+ mkdir(join(WORKSPACE, path), { recursive: true }),
164
+ ),
165
+ );
166
+ return { own, artifacts };
132
167
  }
133
168
 
134
169
  /** Creates it, so a job never has to and never writes to the shared root by mistake. */
135
170
  export async function openJobScratch(
136
- taskId: string,
171
+ threadId: string,
137
172
  label: string,
138
173
  ): Promise<string> {
139
- const path = jobScratch(taskId, label);
174
+ const path = jobScratch(threadId, label);
140
175
  await mkdir(join(WORKSPACE, path), { recursive: true });
141
176
  return path;
142
177
  }
@@ -147,19 +182,27 @@ export async function openJobScratch(
147
182
  * runner can close exactly this session when the job ends.
148
183
  */
149
184
  export const jobShellEnv = (
150
- taskId: string | null | undefined,
185
+ threadId: string | null | undefined,
151
186
  ): Record<string, string> =>
152
- taskId
187
+ threadId
153
188
  ? {
154
- PLAYWRIGHT_CLI_SESSION: `task-${taskId}`,
189
+ PLAYWRIGHT_CLI_SESSION: `thread-${threadId}`,
155
190
  // Read by playwright-cli; the window it opens is on the user's screen
156
191
  PLAYWRIGHT_MCP_VIEWPORT_SIZE: BROWSER_VIEWPORT,
157
192
  }
158
193
  : {};
159
194
 
195
+ /**
196
+ * A bot's artifacts folder in its shell, for a script that delivers a file
197
+ * rather than a model typing the path (skills/interactive-page bundle-artifact.sh).
198
+ */
199
+ export const botShellEnv = (bot: string): Record<string, string> => ({
200
+ THURSDAY_ARTIFACTS: botArtifacts(bot),
201
+ });
202
+
160
203
  /** A participant's browser belongs to the job and its canonical bot name, across every caller. */
161
- export const botBrowserSession = (taskId: string, bot: string) =>
162
- `${taskId}-bot-${createHash("sha256").update(bot.toLowerCase()).digest("hex").slice(0, 20)}`;
204
+ export const botBrowserSession = (threadId: string, bot: string) =>
205
+ `${threadId}-bot-${createHash("sha256").update(bot.trim().toLowerCase()).digest("hex").slice(0, 20)}`;
163
206
 
164
207
  /** Set by `ensureBrowser`, read by `readMachineTools`; null until it has finished. */
165
208
  let browserReady: boolean | null = null;
@@ -240,25 +283,28 @@ export async function pruneJobFiles(): Promise<void> {
240
283
  type ListedBrowser = { name: string; headed?: boolean; attached?: boolean };
241
284
 
242
285
  /**
243
- * A job that ended closes the browser nobody can see. Headless is the bot's
286
+ * An expired job's workspace closes browsers nobody can see. Headless is the bot's
244
287
  * working copy; `--headed` is the bot putting a window on their screen on
245
288
  * purpose — an order at checkout, a map with a pin, a sign-in — and that one is
246
289
  * theirs to close (`skills/browser`). A session attached to their own Chrome is
247
290
  * never touched. Anything unreadable — no playwright, a failed or folded `list`
248
291
  * — leaves the browser as it is.
249
292
  */
250
- export async function closeHiddenBrowser(taskId: string): Promise<void> {
251
- await closeBrowsers(taskId, false);
293
+ export async function closeHiddenBrowser(threadId: string): Promise<void> {
294
+ await closeBrowsers(threadId, false);
252
295
  }
253
296
 
254
297
  /** Cancel and delete close every participant's window, but never an attached personal browser. */
255
- export async function closeJobShell(taskId: string): Promise<void> {
256
- await closeBrowsers(taskId, true);
298
+ export async function closeJobShell(threadId: string): Promise<void> {
299
+ await closeBrowsers(threadId, true);
257
300
  }
258
301
 
259
- async function closeBrowsers(taskId: string, visible: boolean): Promise<void> {
302
+ async function closeBrowsers(
303
+ threadId: string,
304
+ visible: boolean,
305
+ ): Promise<void> {
260
306
  const sandbox = await openWorkspace();
261
- const env = jobShellEnv(taskId);
307
+ const env = jobShellEnv(threadId);
262
308
  const listed = await sandbox
263
309
  .exec("playwright-cli list --json", { env, timeoutMs: 15_000 })
264
310
  .catch(() => null);
@@ -396,15 +442,15 @@ export async function filesOnDisk(
396
442
  }
397
443
 
398
444
  /**
399
- * Removes a job's working folder. Its lifetime is the task's: when the row goes,
445
+ * Removes a job's working folder. Its lifetime is the thread's: when the row goes,
400
446
  * so does what it was working with (features/bot/bot.runner). Never touches
401
447
  * `artifacts` or `projects` — those are the user's and outlive every job.
402
448
  */
403
449
  export async function removeJobScratch(
404
- taskId: string,
450
+ threadId: string,
405
451
  label: string,
406
452
  ): Promise<void> {
407
- await rm(join(WORKSPACE, jobScratch(taskId, label)), {
453
+ await rm(join(WORKSPACE, jobScratch(threadId, label)), {
408
454
  recursive: true,
409
455
  force: true,
410
456
  }).catch(() => {});
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+
3
+ export const LIVE_MODEL = "gpt-live-1";
4
+ export const LIVE_BACKEND_MODEL = "gpt-5.6-luna";
5
+
6
+ /** Provider maxima for the startup `input`: how many messages, and their combined tokens. */
7
+ export const LIVE_INPUT = { messages: 128, tokens: 8_192 };
8
+
9
+ /** Flat function declaration accepted by Responses delegation. */
10
+ export type ToolManifest = {
11
+ name: string;
12
+ description: string;
13
+ parameters: ObjectSchema;
14
+ };
15
+
16
+ /** Original text and intervals survive display grouping and late delivery. */
17
+ export const LiveFragmentSchema = z.object({
18
+ start: z.number().nonnegative(),
19
+ end: z.number().nonnegative(),
20
+ text: z.string(),
21
+ });
22
+ export type LiveFragment = z.infer<typeof LiveFragmentSchema>;
23
+
24
+ /** Earlier conversation seeded at startup. Live has no system role here; a trusted note is a developer message. */
25
+ export type LiveInput =
26
+ | {
27
+ type: "message";
28
+ role: "developer";
29
+ content: [{ type: "input_text"; text: string }];
30
+ }
31
+ | {
32
+ type: "message";
33
+ role: "user";
34
+ content: [{ type: "input_text"; text: string }];
35
+ }
36
+ | {
37
+ type: "message";
38
+ role: "assistant";
39
+ content: [{ type: "output_text"; text: string }];
40
+ };
41
+
42
+ /** What `session.closed` confirmed: the provider's reason and the active seconds billed. */
43
+ export const LiveCloseSchema = z.object({
44
+ reason: z.string().max(128),
45
+ seconds: z.number().nonnegative().nullable(),
46
+ });
47
+ export type LiveClose = z.infer<typeof LiveCloseSchema>;
@@ -0,0 +1,155 @@
1
+ import { z } from "zod";
2
+ import { LIVE_CALL } from "@/config";
3
+ import { logger } from "@/lib/logger";
4
+ import { publicError } from "@/lib/public-error";
5
+ import { LIVE_MODEL, type LiveInput, type ToolManifest } from "./live.schema";
6
+
7
+ const LiveConnectionSchema = z.object({
8
+ session: z.object({ id: z.string().min(1) }),
9
+ transport: z.object({ type: z.literal("webrtc"), sdp: z.string().min(1) }),
10
+ });
11
+
12
+ /** The backend's `reasoning` settings as Responses takes them. */
13
+ export type BackendReasoning = { effort?: string; summary?: "auto" };
14
+
15
+ /** What each model took, by model and chosen effort; only settled answers are kept. */
16
+ const reasoningTaken = new Map<string, BackendReasoning | null>();
17
+
18
+ /**
19
+ * The reasoning settings to hand the backend: the chosen effort, and a summary kept with
20
+ * the call (call_thought), none of either for `none`. Live opens the call with any of
21
+ * them and fails the first delegated response when the model refuses one, so the model
22
+ * is asked before the call: the token-count endpoint checks `reasoning` without running
23
+ * it. A setting refused by name is dropped and the rest asked again, and what was taken
24
+ * is remembered. Any other answer keeps what was chosen: a key or model problem is Live's
25
+ * to report when the call opens. A dropped setting is not shown; the call runs on the
26
+ * model's own.
27
+ */
28
+ export async function acceptedReasoning(options: {
29
+ apiKey: string;
30
+ model: string;
31
+ effort: string | null;
32
+ }): Promise<BackendReasoning | null> {
33
+ const { apiKey, model, effort } = options;
34
+ const pair = `${model} ${effort ?? "auto"}`;
35
+ const known = reasoningTaken.get(pair);
36
+ if (known !== undefined) return known;
37
+
38
+ const wanted: BackendReasoning =
39
+ effort === "none"
40
+ ? { effort }
41
+ : { ...(effort ? { effort } : {}), summary: "auto" };
42
+ for (;;) {
43
+ const response = await fetch(
44
+ "https://api.openai.com/v1/responses/input_tokens",
45
+ {
46
+ method: "POST",
47
+ headers: {
48
+ Authorization: `Bearer ${apiKey}`,
49
+ "Content-Type": "application/json",
50
+ },
51
+ signal: AbortSignal.timeout(LIVE_CALL.reasoningCheckMs),
52
+ body: JSON.stringify({ model, input: ".", reasoning: wanted }),
53
+ },
54
+ ).catch(() => null);
55
+ if (!response) return wanted;
56
+ const taken = Object.keys(wanted).length ? wanted : null;
57
+ if (response.ok) {
58
+ reasoningTaken.set(pair, taken);
59
+ return taken;
60
+ }
61
+ const payload = (await response.json().catch(() => null)) as {
62
+ error?: { param?: string | null };
63
+ } | null;
64
+ const refused = payload?.error?.param?.replace(/^reasoning\./, "");
65
+ if (refused !== "effort" && refused !== "summary") return wanted;
66
+ if (!(refused in wanted)) return wanted;
67
+ logger.warn(`${model} takes no reasoning ${refused}; calls omit it`);
68
+ delete wanted[refused];
69
+ if (!Object.keys(wanted).length) {
70
+ reasoningTaken.set(pair, null);
71
+ return null;
72
+ }
73
+ }
74
+ }
75
+
76
+ /** Exchanges an offer on the trusted server. The account key never reaches the browser. */
77
+ export async function createLiveCall(options: {
78
+ apiKey: string;
79
+ sdp: string;
80
+ voice: string;
81
+ instructions: string;
82
+ input: LiveInput[];
83
+ backend: {
84
+ model: string;
85
+ instructions: string;
86
+ tools: ToolManifest[];
87
+ /** What `acceptedReasoning` found the model takes; omitted when null. */
88
+ reasoning: BackendReasoning | null;
89
+ webSearch: boolean;
90
+ };
91
+ }) {
92
+ const response = await fetch("https://api.openai.com/v1/live/sessions", {
93
+ method: "POST",
94
+ headers: {
95
+ Authorization: `Bearer ${options.apiKey}`,
96
+ "Content-Type": "application/json",
97
+ },
98
+ signal: AbortSignal.timeout(LIVE_CALL.startupMs),
99
+ body: JSON.stringify({
100
+ session: {
101
+ model: LIVE_MODEL,
102
+ instructions: options.instructions,
103
+ input: options.input,
104
+ audio: { output: { voice: options.voice } },
105
+ store: false,
106
+ delegation: {
107
+ type: "responses",
108
+ responses: {
109
+ model: options.backend.model,
110
+ instructions: options.backend.instructions,
111
+ // `strict` is left out, not false: each tool whose schema allows it is
112
+ // decoded to its schema, and the rest fall back to best effort. `true`
113
+ // is refused while any schema has optional fields.
114
+ tools: [
115
+ ...options.backend.tools.map((tool) => ({
116
+ type: "function",
117
+ ...tool,
118
+ })),
119
+ ...(options.backend.webSearch ? [{ type: "web_search" }] : []),
120
+ ],
121
+ tool_choice: "auto",
122
+ parallel_tool_calls: true,
123
+ max_output_tokens: LIVE_CALL.backendOutputTokens,
124
+ ...(options.backend.reasoning
125
+ ? { reasoning: options.backend.reasoning }
126
+ : {}),
127
+ },
128
+ },
129
+ },
130
+ transport: { type: "webrtc", sdp: options.sdp },
131
+ }),
132
+ }).catch((cause: unknown) => {
133
+ logger.warn("OpenAI Live unreachable", cause);
134
+ publicError("Could not reach OpenAI Live.");
135
+ });
136
+ const body = await response.text();
137
+ let payload: unknown;
138
+ try {
139
+ payload = JSON.parse(body);
140
+ } catch {
141
+ payload = null;
142
+ }
143
+ if (!response.ok) {
144
+ const error = payload as { error?: { message?: string } } | null;
145
+ publicError(
146
+ error?.error?.message ||
147
+ body ||
148
+ `OpenAI Live refused the call (${response.status}).`,
149
+ );
150
+ }
151
+ const parsed = LiveConnectionSchema.safeParse(payload);
152
+ if (!parsed.success)
153
+ publicError("OpenAI Live returned an invalid session connection.");
154
+ return parsed.data;
155
+ }