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.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +3 -2
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.json +8 -1
- package/.next/routes-manifest.json +18 -6
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +13 -13
- package/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +12 -12
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/artifact/route.js +10 -6
- package/.next/server/app/api/artifact/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/files/route.js +6 -5
- package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/route.js +8 -8
- package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/route.js +8 -8
- package/.next/server/app/api/bot/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/thread/[id]/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/bot/thread/[id]/route.js +15 -0
- package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/bot/thread/[id]/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/bot/thread/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/bot/thread/route.js +15 -0
- package/.next/server/app/api/bot/thread/route.js.nft.json +1 -0
- package/.next/server/app/api/bot/thread/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/config/route.js +7 -7
- package/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/server/app/api/events/route.js +3 -3
- package/.next/server/app/api/events/route.js.nft.json +1 -1
- package/.next/server/app/api/file/[...path]/route.js +5 -5
- package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/catalog/route.js +8 -8
- package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/credits/route.js +8 -8
- package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/route.js +8 -8
- package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/subscription/route.js +8 -8
- package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/[name]/route.js +6 -6
- package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/oauth/callback/route.js +4 -4
- package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/route.js +6 -6
- package/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/tools/route.js +6 -6
- package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/edit/route.js +13 -13
- package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/route.js +7 -6
- package/.next/server/app/api/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[source]/[name]/route.js +6 -6
- package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route.js +6 -6
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/call/route.js +10 -11
- package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/skills/route.js +10 -11
- package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/tool-call/route.js +15 -15
- package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/missing/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/workspace/missing/route/build-manifest.json +12 -0
- package/.next/server/app/api/workspace/missing/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/workspace/missing/route.js +12 -0
- package/.next/server/app/api/workspace/missing/route.js.map +5 -0
- package/.next/server/app/api/workspace/missing/route.js.nft.json +1 -0
- package/.next/server/app/api/workspace/missing/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/workspace/route.js +5 -4
- package/.next/server/app/api/workspace/route.js.nft.json +1 -1
- package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +1 -1
- package/.next/server/app/artifact/[...path]/page.js +4 -3
- package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
- package/.next/server/app/page/server-reference-manifest.json +67 -45
- package/.next/server/app/page.js +10 -9
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +3 -2
- package/.next/server/chunks/[root-of-the-server]__02846fb._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__049f521._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__05luceg._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__06--3q3._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__07bnah_._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__08eae20._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__0_ue8oe._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0c9fgca._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__0g-ueei._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__0h_x6q6._.js +5 -0
- package/.next/server/chunks/{[root-of-the-server]__0pa2n68._.js → [root-of-the-server]__0kxrvxf._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__0q0vvt2._.js → [root-of-the-server]__0ov3iir._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__0qwtlmx._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__0sm5xvm._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0ye3da2._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0zp35ul._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__144u9d_._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__18-2tsq._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1e-ci13._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1e2365e._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__1fix932._.js +8 -0
- package/.next/server/chunks/{[root-of-the-server]__0ce8nf8._.js → [root-of-the-server]__1g3t7vn._.js} +3 -3
- package/.next/server/chunks/[root-of-the-server]__1kp-83u._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1kv8p3e._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1orn-5b._.js +2 -3
- package/.next/server/chunks/_02szwk8._.js +5 -0
- package/.next/server/chunks/_05h2cii._.js +1 -1
- package/.next/server/chunks/_06c9kie._.js +216 -0
- package/.next/server/chunks/{_1x6kd1r._.js → _07y2gj-._.js} +1 -1
- package/.next/server/chunks/_0a43a-0._.js +3 -0
- package/.next/server/chunks/_0bujjey._.js +5 -0
- package/.next/server/chunks/_0c9j6rb._.js +1 -1
- package/.next/server/chunks/_0dkd549._.js +3 -0
- package/.next/server/chunks/_0ej1kvv._.js +3 -0
- package/.next/server/chunks/_0f6ts7z._.js +3 -0
- package/.next/server/chunks/_0gm9hyv._.js +55 -0
- package/.next/server/chunks/_0i55en5._.js +25 -0
- package/.next/server/chunks/_0k50n27._.js +18 -0
- package/.next/server/chunks/_0khihjk._.js +3 -3
- package/.next/server/chunks/_0n74zsf._.js +5 -5
- package/.next/server/chunks/_0nvm9ef._.js +3 -0
- package/.next/server/chunks/_0p56fn0._.js +3 -0
- package/.next/server/chunks/_0recufk._.js +1 -1
- package/.next/server/chunks/_0xbkz10._.js +3 -0
- package/.next/server/chunks/_10tkr26._.js +3 -0
- package/.next/server/chunks/{_0ioz3nd._.js → _11u2kp7._.js} +1 -1
- package/.next/server/chunks/_11ujpya._.js +3 -0
- package/.next/server/chunks/_127nx_p._.js +5 -0
- package/.next/server/chunks/_17l5ygt._.js +1 -1
- package/.next/server/chunks/_19uauj6._.js +3 -0
- package/.next/server/chunks/_1_5mnq4._.js +5 -5
- package/.next/server/chunks/_1abl6t9._.js +55 -0
- package/.next/server/chunks/_1d0j961._.js +3 -3
- package/.next/server/chunks/_1dbixxz._.js +3 -0
- package/.next/server/chunks/_1dc_d1q._.js +98 -0
- package/.next/server/chunks/_1drgfx4._.js +5 -5
- package/.next/server/chunks/_1e48czp._.js +3 -3
- package/.next/server/chunks/_1f31u5x._.js +5 -0
- package/.next/server/chunks/_1kg70wc._.js +3 -3
- package/.next/server/chunks/_1klbcft._.js +5 -0
- package/.next/server/chunks/_1krd9rf._.js +4 -1
- package/.next/server/chunks/_1kwmzab._.js +3 -0
- package/.next/server/chunks/{_1pf4qe-._.js → _1oxj9fa._.js} +1 -1
- package/.next/server/chunks/{_1f46eie._.js → _1pcmdbb._.js} +1 -1
- package/.next/server/chunks/_1qgix-j._.js +3 -0
- package/.next/server/chunks/{lib_logger_ts_1exwjut._.js → _1rpchta._.js} +5 -5
- package/.next/server/chunks/_1vsej-s._.js +5 -0
- package/.next/server/chunks/_1yx0p_s._.js +5 -0
- package/.next/server/chunks/{_0rnf-6n._.js → _20fsr_z._.js} +6 -6
- package/.next/server/chunks/_2128hkj._.js +5 -0
- package/.next/server/chunks/_next-internal_server_app_api_bot_thread_[id]_route_actions_1fstjn2.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_bot_thread_route_actions_003ccso.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_workspace_missing_route_actions_1fidi6p.js +3 -0
- package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
- package/.next/server/chunks/features_0-cnt0l._.js +4 -0
- package/.next/server/chunks/features_0hdaci0._.js +4 -0
- package/.next/server/chunks/features_1e39j7-._.js +8 -0
- package/.next/server/chunks/features_bot_bot_query_ts_12mgkl2._.js +1 -1
- package/.next/server/chunks/features_memory_1uqvksn._.js +1 -1
- 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
- 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
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0i7cvml._.js → node_modules_consola_dist_chunks_prompt_mjs_107pxfn._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0icqaqw._.js → node_modules_consola_dist_chunks_prompt_mjs_15hbel8._.js} +1 -1
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_18i-23e._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1bewgf3._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1kipdeo._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1nlww1m._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1q77nfx._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xqdzx_._.js +3 -0
- package/.next/server/chunks/{node_modules_zod_v4_1801ax7._.js → node_modules_zod_v4_0lkux5-._.js} +2 -2
- package/.next/server/chunks/{node_modules_zod_v4_1cha_bw._.js → node_modules_zod_v4_1jmr9cq._.js} +2 -2
- package/.next/server/chunks/{node_modules_zod_v4_0ubdflj._.js → node_modules_zod_v4_1yrxmek._.js} +2 -2
- package/.next/server/chunks/node_modules_zod_v4_classic_errors_0tp0y-q.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__09q9med._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0bxsfyn._.js +101 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0lyi8i2._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__16jc196._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__172cq4x._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__18dthbp._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__18e68w8._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1fll8dc._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1mzi-ju._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1nygfik._.js +5 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1sdphb0._.js +8 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1waa3rc._.js +100 -0
- package/.next/server/chunks/ssr/_00rehl_._.js +3 -0
- package/.next/server/chunks/ssr/{_1lz_cq2._.js → _02oc_h5._.js} +76 -89
- package/.next/server/chunks/ssr/_03_928f._.js +3 -0
- package/.next/server/chunks/ssr/_05yghx6._.js +3 -0
- package/.next/server/chunks/ssr/_08c4z-9._.js +3 -0
- package/.next/server/chunks/ssr/_0_qfdlw._.js +4 -0
- package/.next/server/chunks/ssr/_0c9e5w6._.js +9 -0
- package/.next/server/chunks/ssr/{_0s99bgb._.js → _0dh2e1j._.js} +9 -3
- package/.next/server/chunks/ssr/_0dr-ddg._.js +3 -0
- package/.next/server/chunks/ssr/_0eaog6_._.js +3 -0
- package/.next/server/chunks/ssr/_0evkpto._.js +3 -0
- package/.next/server/chunks/ssr/_0g_rlog._.js +3 -0
- package/.next/server/chunks/ssr/_0geg212._.js +3 -0
- package/.next/server/chunks/ssr/{_1gd8q8l._.js → _0hxt2ul._.js} +2 -2
- package/.next/server/chunks/ssr/_0i_6q1w._.js +2 -2
- package/.next/server/chunks/ssr/_0lu1n_x._.js +1 -1
- package/.next/server/chunks/ssr/{_15j2_8f._.js → _0wzaht-._.js} +2 -2
- package/.next/server/chunks/ssr/_0z-g0uy._.js +3 -0
- package/.next/server/chunks/ssr/_123ttsf._.js +3 -0
- package/.next/server/chunks/ssr/_123y-ah._.js +3 -0
- package/.next/server/chunks/ssr/_12w42gi._.js +3 -0
- package/.next/server/chunks/ssr/_161kqav._.js +3 -0
- package/.next/server/chunks/ssr/{_0ap2fzn._.js → _16c6_xm._.js} +2 -2
- package/.next/server/chunks/ssr/_18opah7._.js +3 -0
- package/.next/server/chunks/ssr/_18xqmny._.js +3 -0
- package/.next/server/chunks/ssr/_1_krfph._.js +3 -0
- package/.next/server/chunks/ssr/{_1-_etts._.js → _1anqots._.js} +2 -2
- package/.next/server/chunks/ssr/_1ey7qn-._.js +70 -0
- package/.next/server/chunks/ssr/_1g9vs7q._.js +3 -0
- package/.next/server/chunks/ssr/_1jmz33w._.js +3 -0
- package/.next/server/chunks/ssr/{_0n3toaw._.js → _1k0spz7._.js} +2 -2
- package/.next/server/chunks/ssr/_1rgtxhr._.js +5 -0
- package/.next/server/chunks/ssr/_1slp25y._.js +3 -0
- package/.next/server/chunks/ssr/{_1fojd41._.js → _1x9pskj._.js} +3 -3
- package/.next/server/chunks/ssr/_1y6b5mr._.js +101 -0
- package/.next/server/chunks/ssr/_1ztk7p6._.js +7 -0
- package/.next/server/chunks/ssr/components_ui_tabs_tsx_0ej40b4._.js +3 -0
- package/.next/server/chunks/ssr/features_bot_thread_query_ts_023eklt._.js +4 -0
- package/.next/server/chunks/ssr/features_config_components_config-setting_tsx_0xfwqdg._.js +1 -1
- package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
- package/.next/server/chunks/ssr/{_1-teee5._.js → lib_logger_ts_0-olsze._.js} +2 -7
- package/.next/server/chunks/ssr/{node_modules_0cxaxk9._.js → node_modules_00_51_v._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_04jf_m8._.js → node_modules_022sipm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0g7fzk3._.js → node_modules_0332gw4._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1cx_ql6._.js → node_modules_04vxchl._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1vh5ntv._.js → node_modules_0746rzi._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0yugy6m._.js → node_modules_0d5uzof._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_09q35v_._.js → node_modules_0exkwcm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_08dhkiq._.js → node_modules_0fr-ml8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_14q6g4n._.js → node_modules_0mxvg8h._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0arus10._.js → node_modules_0qapgjr._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1eg7m6c._.js → node_modules_0qbfyjh._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1cz2hle._.js → node_modules_0t-9nup._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_17bwo43._.js → node_modules_0tusx4d._.js} +3 -3
- package/.next/server/chunks/ssr/{node_modules_1efrqxi._.js → node_modules_0vsxbzp._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0_-_a--._.js → node_modules_0vv0-fg._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1gdh31p._.js → node_modules_0wsvp00._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1hpopmo._.js → node_modules_1-urho9._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1_pc9kq._.js → node_modules_16pi_dd._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_00etblx._.js → node_modules_1d53yiq._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1aaxuef._.js → node_modules_1g1eihe._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_198nmll._.js → node_modules_1gpednh._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0pvd7q-._.js → node_modules_1gu1pph._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0b__sgl._.js → node_modules_1he1w8_._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1qpjvy5._.js → node_modules_1lnjapm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0940ns5._.js → node_modules_1lynj9m._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0x3-ply._.js → node_modules_1seuurl._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_14om4ar._.js → node_modules_1u6w1pb._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0had7xd._.js → node_modules_1xn6saw._.js} +1 -1
- 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
- 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
- package/.next/server/chunks/ssr/{node_modules_@vercel_oidc_dist_06mk8id._.js → node_modules_@vercel_oidc_dist_21a5haa._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_trash_mjs_0px2gzr._.js +3 -0
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +68 -46
- package/.next/static/chunks/0dr16v67vj4n7.js +2 -0
- package/.next/static/chunks/0g4b348l0pve7.js +1 -0
- package/.next/static/chunks/0joan-69kbspd.js +1 -0
- package/.next/static/chunks/0vlgzqo9ka90v.js +1 -0
- package/.next/static/chunks/0zrupxgci5gqc.js +1 -0
- package/.next/static/chunks/10k2xvap03z20.css +1 -0
- package/.next/static/chunks/18mkhstgiqcbt.js +1 -0
- package/.next/static/chunks/{15m575979un5f.js → 1i-u2wzub_to1.js} +2 -2
- package/.next/static/chunks/1kp5nfp06nj9h.js +5 -0
- package/.next/static/chunks/1ohslk4568tm3.js +1 -0
- package/.next/static/chunks/1sbmwswc9k2-1.js +1 -0
- package/.next/static/chunks/1t9qms5pwwa3n.js +1 -0
- package/.next/static/chunks/1vj_5bnbxx84e.js +1 -0
- package/.next/static/chunks/1vqezbhjm3goq.js +1 -0
- package/.next/static/chunks/{3akmqm77muj4-.js → 1wlo979mx-y3w.js} +1 -1
- package/.next/static/chunks/26ql4y-43xwhp.js +1 -0
- package/.next/static/chunks/{0fl3gwe4-l6tz.js → 2_pnccjp6j1ca.js} +1 -1
- package/.next/static/chunks/2a51-ywz9b2a3.js +1 -0
- package/.next/static/chunks/2fvdgxih7x7hr.js +1 -0
- package/.next/static/chunks/2jlz8zp4jax_m.js +18 -0
- package/.next/static/chunks/2nvepds1fu2ux.js +1 -0
- package/.next/static/chunks/3addj3i4-izma.js +1 -0
- package/.next/static/chunks/3bfwpww3m3x4u.js +1 -0
- package/.next/static/chunks/3gfh7nxwusbt0.js +1 -0
- package/.next/static/chunks/3gwa44cvz4qoi.js +1 -0
- package/.next/static/chunks/{38gweqdo4jpfj.js → 3izg0a3k87q1-.js} +5 -5
- package/.next/static/chunks/3zk6q3-3f9swq.js +99 -0
- package/.next/static/chunks/3zkg5iup3v4a2.js +12 -0
- package/.next/static/chunks/405m0bqtoihev.js +1 -0
- package/.next/static/chunks/42wcg3wfg_m_p.js +1 -0
- package/README.md +27 -216
- package/app/api/events/app-event.ts +6 -4
- package/app/api/query-key.ts +25 -16
- package/bin/database.mjs +37 -0
- package/bin/thursday.mjs +44 -28
- package/components/ui/custom-icon.tsx +0 -60
- package/components/ui/radio-group.tsx +37 -0
- package/components/ui/shiny-text.tsx +33 -6
- package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/migration.sql +80 -24
- package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/snapshot.json +689 -110
- package/database/migrations/20260916160713_thread_cancelled/migration.sql +2 -0
- package/database/migrations/{20260911030320_opposite_jack_power → 20260916160713_thread_cancelled}/snapshot.json +706 -84
- package/docs/how-it-works.md +39 -36
- package/docs/images/keeps-going.png +0 -0
- package/docs/images/two-minds.png +0 -0
- package/docs/live-calls.md +231 -0
- package/docs/thread-rooms.md +71 -0
- package/features/ai/chatgpt.ts +1 -2
- package/features/ai/live.schema.ts +128 -0
- package/features/ai/load-tools.ts +148 -77
- package/features/ai/model.schema.ts +2 -120
- package/features/ai/model.ts +52 -88
- package/features/ai/prompts/bot.prompt.ts +91 -214
- package/features/ai/prompts/live.prompt.ts +265 -0
- package/features/ai/prompts/prompt-helper.ts +91 -32
- package/features/ai/prompts/thursday.prompt.ts +125 -172
- package/features/ai/tools/bot.tool.ts +38 -145
- package/features/ai/tools/call.tool.ts +1 -1
- package/features/ai/tools/connected.ts +5 -3
- package/features/ai/tools/mcp.tool.ts +7 -4
- package/features/ai/tools/memory.tool.ts +35 -31
- package/features/ai/tools/skills.tool.ts +36 -14
- package/features/ai/tools/studio.tool.ts +26 -21
- package/features/ai/tools/tool-name.ts +2 -5
- package/features/ai/tools/workspace.tool.ts +33 -10
- package/features/artifact/artifact.action.ts +2 -2
- package/features/artifact/artifact.query.ts +112 -61
- package/features/artifact/artifact.schema.ts +8 -6
- package/features/artifact/components/artifact-setting.tsx +83 -33
- package/features/bot/bot.action.ts +43 -36
- package/features/bot/bot.memory.ts +137 -20
- package/features/bot/bot.query.ts +28 -11
- package/features/bot/bot.run.ts +299 -636
- package/features/bot/bot.runner.ts +468 -844
- package/features/bot/bot.schema.ts +93 -82
- package/features/bot/bot.seed.ts +141 -64
- package/features/bot/components/bot-mark.tsx +324 -232
- package/features/bot/components/bot-room.tsx +1613 -697
- package/features/bot/components/bot-roster.tsx +8 -13
- package/features/bot/components/bot-setting.tsx +58 -42
- package/features/bot/components/bot-tool.tsx +55 -87
- package/features/bot/components/mark-palette.tsx +35 -32
- package/features/bot/components/path-chips.tsx +33 -3
- package/features/bot/components/thread-badge.tsx +34 -0
- package/features/bot/components/thread-reply.tsx +639 -0
- package/features/bot/components/thread-setting.tsx +674 -0
- package/features/bot/mark.const.ts +79 -31
- package/features/bot/room.query.ts +889 -0
- package/features/bot/room.schema.ts +64 -0
- package/features/bot/seed-bots.ts +2 -1
- package/features/bot/thread.query.ts +971 -0
- package/features/bot/thread.store.ts +587 -0
- package/features/config/components/voice-key.tsx +113 -88
- package/features/config/config.const.ts +5 -9
- package/features/connectors/mcp.schema.ts +0 -2
- package/features/intro/components/intro.tsx +169 -139
- package/features/memory/components/memory-setting.tsx +2 -7
- package/features/memory/memory.schema.ts +14 -23
- package/features/settings/components/setting-ui.tsx +0 -44
- package/features/settings/components/settings.tsx +12 -12
- package/features/settings/settings.alert.ts +3 -3
- package/features/settings/settings.store.ts +1 -1
- package/features/skills/skills.schema.ts +0 -2
- package/features/thursday/components/ascii-field.tsx +24 -44
- package/features/thursday/components/ascii-orb.tsx +359 -358
- package/features/thursday/components/call-log.tsx +46 -44
- package/features/thursday/components/face.tsx +35 -10
- package/features/thursday/components/tab-state.tsx +3 -3
- package/features/thursday/components/thursday-mark.tsx +1 -0
- package/features/thursday/components/thursday-setting.tsx +631 -332
- package/features/thursday/components/thursday.tsx +106 -41
- package/features/thursday/components/voice-picker.tsx +255 -0
- package/features/thursday/thursday.action.ts +94 -68
- package/features/thursday/thursday.query.ts +49 -30
- package/features/thursday/thursday.schema.ts +27 -30
- package/features/thursday/thursday.store.ts +11 -7
- package/features/thursday/tool-call.ts +3 -3
- package/features/thursday/tool-line.ts +5 -3
- package/features/thursday/use-thursday.ts +725 -450
- package/features/workspace/workspace.query.ts +17 -0
- package/features/workspace/workspace.ts +103 -50
- package/lib/live/live.schema.ts +47 -0
- package/lib/live/live.server.ts +155 -0
- package/lib/live/live.session.ts +574 -0
- package/lib/{realtime/realtime.tap.ts → live/live.tap.ts} +41 -12
- package/lib/live/live.transport.ts +152 -0
- package/lib/protocol/use-server-pages.ts +9 -5
- package/lib/utils.ts +21 -20
- package/package.json +2 -2
- package/public/voices/alloy.ogg +0 -0
- package/public/voices/ash.ogg +0 -0
- package/public/voices/ballad.ogg +0 -0
- package/public/voices/beacon.ogg +0 -0
- package/public/voices/bossa.ogg +0 -0
- package/public/voices/cedar.ogg +0 -0
- package/public/voices/cinder.ogg +0 -0
- package/public/voices/coral.ogg +0 -0
- package/public/voices/delta.ogg +0 -0
- package/public/voices/echo.ogg +0 -0
- package/public/voices/gleam.ogg +0 -0
- package/public/voices/marin.ogg +0 -0
- package/public/voices/meridian.ogg +0 -0
- package/public/voices/quartz.ogg +0 -0
- package/public/voices/ripple.ogg +0 -0
- package/public/voices/sage.ogg +0 -0
- package/public/voices/shimmer.ogg +0 -0
- package/public/voices/stone.ogg +0 -0
- package/public/voices/tempo.ogg +0 -0
- package/public/voices/verse.ogg +0 -0
- package/public/voices/vesper.ogg +0 -0
- package/public/voices/willow.ogg +0 -0
- package/scripts/artifact-paths.test.mts +25 -0
- package/scripts/bot-context.test.mts +1408 -0
- package/scripts/live-history.test.mts +115 -0
- package/scripts/live-session.test.mts +948 -0
- package/server.js +1 -1
- package/skills/browser/SKILL.md +17 -6
- package/skills/computer/SKILL.md +1 -1
- package/skills/find-skills/SKILL.md +3 -8
- package/skills/interactive-page/SKILL.md +12 -7
- package/skills/interactive-page/references/diagram.md +89 -0
- package/skills/interactive-page/scripts/archify/LICENSE +22 -0
- package/skills/interactive-page/scripts/archify/README.md +25 -0
- package/skills/interactive-page/scripts/archify/assets/JetBrainsMono-OFL.txt +93 -0
- package/skills/interactive-page/scripts/archify/assets/template.html +14934 -0
- package/skills/interactive-page/scripts/archify/bin/archify.mjs +2126 -0
- package/skills/interactive-page/scripts/archify/bin/open-artifact.mjs +86 -0
- package/skills/interactive-page/scripts/archify/bin/preview.mjs +653 -0
- package/skills/interactive-page/scripts/archify/bin/visual-check.mjs +829 -0
- package/skills/interactive-page/scripts/archify/delta/architecture-delta.mjs +1223 -0
- package/skills/interactive-page/scripts/archify/examples/agent-run.lifecycle.json +60 -0
- package/skills/interactive-page/scripts/archify/examples/agent-tool-call.workflow.json +94 -0
- package/skills/interactive-page/scripts/archify/examples/async-job-roundtrip.sequence.json +61 -0
- package/skills/interactive-page/scripts/archify/examples/cache-miss-request.sequence.json +82 -0
- package/skills/interactive-page/scripts/archify/examples/checkout-platform.base.architecture.json +31 -0
- package/skills/interactive-page/scripts/archify/examples/checkout-platform.head.architecture.json +31 -0
- package/skills/interactive-page/scripts/archify/examples/deployment-release.lifecycle.json +49 -0
- package/skills/interactive-page/scripts/archify/examples/event-stream.dataflow.json +57 -0
- package/skills/interactive-page/scripts/archify/examples/incident-response.workflow.json +64 -0
- package/skills/interactive-page/scripts/archify/examples/product-analytics.dataflow.json +76 -0
- package/skills/interactive-page/scripts/archify/examples/production-deployment.architecture.json +71 -0
- package/skills/interactive-page/scripts/archify/examples/release-delivery.workflow.json +62 -0
- package/skills/interactive-page/scripts/archify/examples/web-app.architecture.json +46 -0
- package/skills/interactive-page/scripts/archify/migrations/workflow-v2.mjs +279 -0
- package/skills/interactive-page/scripts/archify/recipes/scenarios.mjs +284 -0
- package/skills/interactive-page/scripts/archify/references/authoring-contract.md +243 -0
- package/skills/interactive-page/scripts/archify/references/delivery-contract.md +120 -0
- package/skills/interactive-page/scripts/archify/references/viewer-runtime.md +45 -0
- package/skills/interactive-page/scripts/archify/renderers/architecture/grid.mjs +62 -0
- package/skills/interactive-page/scripts/archify/renderers/architecture/render-architecture.mjs +1078 -0
- package/skills/interactive-page/scripts/archify/renderers/dataflow/README.md +104 -0
- package/skills/interactive-page/scripts/archify/renderers/dataflow/render-dataflow.mjs +483 -0
- package/skills/interactive-page/scripts/archify/renderers/lifecycle/README.md +115 -0
- package/skills/interactive-page/scripts/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
- package/skills/interactive-page/scripts/archify/renderers/sequence/README.md +114 -0
- package/skills/interactive-page/scripts/archify/renderers/sequence/render-sequence.mjs +464 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/brand-marks.mjs +563 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/cli.mjs +218 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/desktop-readability.mjs +26 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/diagnostics.mjs +127 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/engineering-profiles.mjs +157 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/generated-brand-marks.mjs +3 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/generated-validators.mjs +13 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/geometry.mjs +1423 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/i18n.mjs +595 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/layout-report.mjs +40 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/legend.mjs +217 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/output-path.mjs +340 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/repository-evidence.mjs +238 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/repository-location.mjs +58 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/text-fit.mjs +49 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/utils.mjs +232 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/validator.mjs +86 -0
- package/skills/interactive-page/scripts/archify/renderers/workflow/README.md +223 -0
- package/skills/interactive-page/scripts/archify/renderers/workflow/render-workflow.mjs +35 -0
- package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
- package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
- package/skills/interactive-page/scripts/archify/schemas/README.md +211 -0
- package/skills/interactive-page/scripts/archify/schemas/architecture.schema.json +178 -0
- package/skills/interactive-page/scripts/archify/schemas/common.schema.json +115 -0
- package/skills/interactive-page/scripts/archify/schemas/dataflow.schema.json +243 -0
- package/skills/interactive-page/scripts/archify/schemas/lifecycle.schema.json +266 -0
- package/skills/interactive-page/scripts/archify/schemas/sequence.schema.json +223 -0
- package/skills/interactive-page/scripts/archify/schemas/workflow.schema.json +428 -0
- package/skills/interactive-page/scripts/archify/scripts/check-render-output.mjs +916 -0
- package/skills/interactive-page/scripts/archify/scripts/render-examples.mjs +26 -0
- package/skills/interactive-page/scripts/bundle-artifact.sh +9 -8
- package/skills/skill-creator/SKILL.md +4 -5
- package/.next/server/app/api/bot/task/[id]/route/app-paths-manifest.json +0 -3
- package/.next/server/app/api/bot/task/[id]/route.js +0 -16
- package/.next/server/app/api/bot/task/[id]/route.js.nft.json +0 -1
- package/.next/server/app/api/bot/task/[id]/route_client-reference-manifest.js +0 -3
- package/.next/server/app/api/bot/task/route/app-paths-manifest.json +0 -3
- package/.next/server/app/api/bot/task/route.js +0 -16
- package/.next/server/app/api/bot/task/route.js.nft.json +0 -1
- package/.next/server/app/api/bot/task/route_client-reference-manifest.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__01dkp4a._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__02va5wz._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__02xjoto._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__04q--0f._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__0bl-e63._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0ffbg85._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0jq4ohy._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__0ls6_8y._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__0ncs9uu._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1-ga0kh._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__11n256_._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__12cabg9._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1339jnv._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__18_teo8._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__1anc1p9._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1ccon1w._.js +0 -10
- package/.next/server/chunks/[root-of-the-server]__1fizn31._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1llj3-b._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1p8m3f4._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1wa1k7r._.js +0 -8
- package/.next/server/chunks/_0-73of8._.js +0 -55
- package/.next/server/chunks/_0-fjql4._.js +0 -26
- package/.next/server/chunks/_00xh_q0._.js +0 -25
- package/.next/server/chunks/_03a0897._.js +0 -3
- package/.next/server/chunks/_051qh8u._.js +0 -3
- package/.next/server/chunks/_05sovvj._.js +0 -3
- package/.next/server/chunks/_0fzqt2y._.js +0 -134
- package/.next/server/chunks/_0mecv0f._.js +0 -26
- package/.next/server/chunks/_0mh8j4m._.js +0 -3
- package/.next/server/chunks/_0obojvv._.js +0 -3
- package/.next/server/chunks/_0sb7tlz._.js +0 -3
- package/.next/server/chunks/_0sbynis._.js +0 -3
- package/.next/server/chunks/_0u10wmw._.js +0 -55
- package/.next/server/chunks/_0u4aiy2._.js +0 -3
- package/.next/server/chunks/_0wp4le3._.js +0 -3
- package/.next/server/chunks/_0y5fg-x._.js +0 -3
- package/.next/server/chunks/_1230wbx._.js +0 -10
- package/.next/server/chunks/_12nheja._.js +0 -3
- package/.next/server/chunks/_13510xh._.js +0 -3
- package/.next/server/chunks/_15hq89o._.js +0 -3
- package/.next/server/chunks/_18-1wcc._.js +0 -55
- package/.next/server/chunks/_1_9mjx-._.js +0 -3
- package/.next/server/chunks/_1c78vw5._.js +0 -229
- package/.next/server/chunks/_1h5_8sk._.js +0 -3
- package/.next/server/chunks/_1hdnxb7._.js +0 -3
- package/.next/server/chunks/_1j8k_j5._.js +0 -3
- package/.next/server/chunks/_1nula3v._.js +0 -3
- package/.next/server/chunks/_1php4eq._.js +0 -3
- package/.next/server/chunks/_1yuv4vp._.js +0 -3
- package/.next/server/chunks/_1zjrdag._.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_bot_task_[id]_route_actions_1_k_8u3.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_bot_task_route_actions_0xln6ra.js +0 -3
- package/.next/server/chunks/features_0rpfxbk._.js +0 -3
- package/.next/server/chunks/features_1qf3cei._.js +0 -3
- package/.next/server/chunks/features_bot_0zt92oh._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xoq2rl._.js +0 -3
- package/.next/server/chunks/ssr/[externals]__0dizgek._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__092knlj._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0mz33a7._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0s9dq5u._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0s9l2sv._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0vnmv-s._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0xsog8n._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +0 -61
- package/.next/server/chunks/ssr/[root-of-the-server]__1gtlw6v._.js +0 -43
- package/.next/server/chunks/ssr/[root-of-the-server]__1ox7hbk._.js +0 -4
- package/.next/server/chunks/ssr/[root-of-the-server]__202p40z._.js +0 -3
- package/.next/server/chunks/ssr/_001_ms1._.js +0 -28
- package/.next/server/chunks/ssr/_01n3o0m._.js +0 -3
- package/.next/server/chunks/ssr/_0fz4mf_._.js +0 -3
- package/.next/server/chunks/ssr/_0gb4gmf._.js +0 -3
- package/.next/server/chunks/ssr/_0h42fze._.js +0 -3
- package/.next/server/chunks/ssr/_0h7zdni._.js +0 -3
- package/.next/server/chunks/ssr/_0ilna52._.js +0 -42
- package/.next/server/chunks/ssr/_0q0zan6._.js +0 -70
- package/.next/server/chunks/ssr/_0zcjrbg._.js +0 -3
- package/.next/server/chunks/ssr/_0zhoc3r._.js +0 -3
- package/.next/server/chunks/ssr/_13fke0x._.js +0 -3
- package/.next/server/chunks/ssr/_18cymkq._.js +0 -3
- package/.next/server/chunks/ssr/_1b2mjwr._.js +0 -3
- package/.next/server/chunks/ssr/_1f-dg-6._.js +0 -3
- package/.next/server/chunks/ssr/_1h0rw11._.js +0 -3
- package/.next/server/chunks/ssr/_1jhd09t._.js +0 -3
- package/.next/server/chunks/ssr/_1nnsk7z._.js +0 -3
- package/.next/server/chunks/ssr/_1ov37if._.js +0 -3
- package/.next/server/chunks/ssr/_1sji22n._.js +0 -3
- package/.next/server/chunks/ssr/_1vi_uo7._.js +0 -3
- package/.next/server/chunks/ssr/_1vyd1ji._.js +0 -3
- package/.next/server/chunks/ssr/_1xx4zlb._.js +0 -3
- package/.next/server/chunks/ssr/components_ui_1y1l7yj._.js +0 -3
- package/.next/server/chunks/ssr/features_bot_1s_-2vj._.js +0 -3
- package/.next/server/chunks/ssr/lib_realtime_12wg_dd._.js +0 -27
- package/.next/server/chunks/ssr/lib_realtime_15h_v1v._.js +0 -27
- package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0npjf8-._.js +0 -3
- package/.next/static/chunks/00rd4-v8r7axp.js +0 -1
- package/.next/static/chunks/08qe4as2q428z.js +0 -3
- package/.next/static/chunks/0gnqdjn2lvdad.js +0 -2
- package/.next/static/chunks/0hwap1-p0m5sa.js +0 -1
- package/.next/static/chunks/0r5qcctujhxli.js +0 -1
- package/.next/static/chunks/0w52rrrmuj9r9.js +0 -1
- package/.next/static/chunks/0wcprt5ot5she.js +0 -1
- package/.next/static/chunks/10teww7wt-f6h.js +0 -1
- package/.next/static/chunks/17p6tk6k88dq6.js +0 -1
- package/.next/static/chunks/18a96rkhi4_yd.js +0 -1
- package/.next/static/chunks/1dkjg87pxk0n9.js +0 -28
- package/.next/static/chunks/1jd09sxcjddu1.js +0 -1
- package/.next/static/chunks/1w73ece_6bheu.js +0 -18
- package/.next/static/chunks/214ya3n5gxeih.js +0 -1
- package/.next/static/chunks/22_zkas21rpna.js +0 -1
- package/.next/static/chunks/2fh4-3z_q8b_w.js +0 -1
- package/.next/static/chunks/2h0sd2vumhb15.js +0 -1
- package/.next/static/chunks/2t4vhi3m8ahya.js +0 -1
- package/.next/static/chunks/2tigdtz3dpcy8.js +0 -1
- package/.next/static/chunks/2u7xt6mxg44lf.js +0 -1
- package/.next/static/chunks/3786h5vayt80-.js +0 -28
- package/.next/static/chunks/39j0fvpybzabl.js +0 -40
- package/.next/static/chunks/3cq5g494yuke8.css +0 -1
- package/.next/static/chunks/3hibbjnt85-k6.js +0 -1
- package/.next/static/chunks/3woj-xd7ki5_i.js +0 -1
- package/.next/static/chunks/3xk7yqgomx7yq.js +0 -1
- package/.next/static/chunks/3zmcsnuo25zvq.js +0 -1
- package/database/migrations/20260911030320_opposite_jack_power/migration.sql +0 -1
- package/docs/images/task-thread.png +0 -0
- package/features/bot/components/task-badge.tsx +0 -42
- package/features/bot/components/task-reply.tsx +0 -328
- package/features/bot/components/task-setting.tsx +0 -524
- package/features/bot/task.query.ts +0 -976
- package/features/bot/task.store.ts +0 -489
- package/lib/realtime/client-secret.ts +0 -86
- package/lib/realtime/open-session.ts +0 -31
- package/lib/realtime/openai.ts +0 -35
- package/lib/realtime/realtime.audio.ts +0 -196
- package/lib/realtime/realtime.driver.ts +0 -489
- package/lib/realtime/realtime.protocol.ts +0 -393
- package/lib/realtime/realtime.schema.ts +0 -37
- package/lib/realtime/realtime.session.ts +0 -106
- package/lib/realtime/realtime.transport.ts +0 -384
- package/lib/realtime/xai.ts +0 -39
- /package/.next/server/app/api/bot/{task → thread}/[id]/route/build-manifest.json +0 -0
- /package/.next/server/app/api/bot/{task → thread}/[id]/route/server-reference-manifest.json +0 -0
- /package/.next/server/app/api/bot/{task → thread}/[id]/route.js.map +0 -0
- /package/.next/server/app/api/bot/{task → thread}/route/build-manifest.json +0 -0
- /package/.next/server/app/api/bot/{task → thread}/route/server-reference-manifest.json +0 -0
- /package/.next/server/app/api/bot/{task → thread}/route.js.map +0 -0
- /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → 0qzGoKn2wTERVZtblX1tp}/_buildManifest.js +0 -0
- /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → 0qzGoKn2wTERVZtblX1tp}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → 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,3 +1,5 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
1
3
|
import {
|
|
2
4
|
mkdir,
|
|
3
5
|
readdir,
|
|
@@ -61,14 +63,27 @@ const under = (root: string, path: string) =>
|
|
|
61
63
|
/**
|
|
62
64
|
* Why a file may not be written where the model asked, as one line it can act
|
|
63
65
|
* on, or null when it may. Refused: the workspace root (files belong in one
|
|
64
|
-
* of the
|
|
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.
|
|
65
69
|
*/
|
|
66
|
-
export function writeRefusal(full: string): string | null {
|
|
70
|
+
export function writeRefusal(full: string, bot?: string): string | null {
|
|
67
71
|
if (under(WORKSPACE, full)) {
|
|
68
72
|
const rel = relative(WORKSPACE, full);
|
|
69
|
-
const [top] = rel.split(sep);
|
|
70
|
-
if (top
|
|
71
|
-
|
|
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;
|
|
72
87
|
}
|
|
73
88
|
if (under(APP_ROOT, full)) {
|
|
74
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.`;
|
|
@@ -97,19 +112,17 @@ export async function insideWorkspace(rel: string): Promise<string | null> {
|
|
|
97
112
|
}
|
|
98
113
|
|
|
99
114
|
/**
|
|
100
|
-
* Where one job keeps what it is still working on.
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* makes its working material safe to clear later — and it is the right unit
|
|
104
|
-
* 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
|
|
105
118
|
* one bot runs many jobs.
|
|
106
119
|
*
|
|
107
120
|
* Named for the label so the folder is readable on the Workspace screen, with
|
|
108
121
|
* the head of the id after it so two jobs called the same thing stay apart.
|
|
109
|
-
* Finished work never lands here: that is
|
|
110
|
-
*
|
|
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.
|
|
111
124
|
*/
|
|
112
|
-
export function jobScratch(
|
|
125
|
+
export function jobScratch(threadId: string, label: string): string {
|
|
113
126
|
const slug =
|
|
114
127
|
label
|
|
115
128
|
.trim()
|
|
@@ -117,25 +130,48 @@ export function jobScratch(taskId: string, label: string): string {
|
|
|
117
130
|
.replace(/[^\p{L}\p{N}]+/gu, "-")
|
|
118
131
|
.replace(/^-+|-+$/g, "")
|
|
119
132
|
.slice(0, 40) || "job";
|
|
120
|
-
return `${PATHS.scratch}/${slug}-${
|
|
133
|
+
return `${PATHS.scratch}/${slug}-${threadId.slice(0, 6)}`;
|
|
121
134
|
}
|
|
122
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
|
+
|
|
123
144
|
/** Where one bot keeps what it wants on its next job (config PATHS.bots). */
|
|
124
145
|
export const botFolder = (bot: string): string =>
|
|
125
|
-
`${PATHS.bots}/${bot
|
|
146
|
+
`${PATHS.bots}/${botFolderName(bot)}`;
|
|
126
147
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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 };
|
|
131
167
|
}
|
|
132
168
|
|
|
133
169
|
/** Creates it, so a job never has to and never writes to the shared root by mistake. */
|
|
134
170
|
export async function openJobScratch(
|
|
135
|
-
|
|
171
|
+
threadId: string,
|
|
136
172
|
label: string,
|
|
137
173
|
): Promise<string> {
|
|
138
|
-
const path = jobScratch(
|
|
174
|
+
const path = jobScratch(threadId, label);
|
|
139
175
|
await mkdir(join(WORKSPACE, path), { recursive: true });
|
|
140
176
|
return path;
|
|
141
177
|
}
|
|
@@ -146,16 +182,28 @@ export async function openJobScratch(
|
|
|
146
182
|
* runner can close exactly this session when the job ends.
|
|
147
183
|
*/
|
|
148
184
|
export const jobShellEnv = (
|
|
149
|
-
|
|
185
|
+
threadId: string | null | undefined,
|
|
150
186
|
): Record<string, string> =>
|
|
151
|
-
|
|
187
|
+
threadId
|
|
152
188
|
? {
|
|
153
|
-
PLAYWRIGHT_CLI_SESSION: `
|
|
189
|
+
PLAYWRIGHT_CLI_SESSION: `thread-${threadId}`,
|
|
154
190
|
// Read by playwright-cli; the window it opens is on the user's screen
|
|
155
191
|
PLAYWRIGHT_MCP_VIEWPORT_SIZE: BROWSER_VIEWPORT,
|
|
156
192
|
}
|
|
157
193
|
: {};
|
|
158
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
|
+
|
|
203
|
+
/** A participant's browser belongs to the job and its canonical bot name, across every caller. */
|
|
204
|
+
export const botBrowserSession = (threadId: string, bot: string) =>
|
|
205
|
+
`${threadId}-bot-${createHash("sha256").update(bot.trim().toLowerCase()).digest("hex").slice(0, 20)}`;
|
|
206
|
+
|
|
159
207
|
/** Set by `ensureBrowser`, read by `readMachineTools`; null until it has finished. */
|
|
160
208
|
let browserReady: boolean | null = null;
|
|
161
209
|
|
|
@@ -235,50 +283,55 @@ export async function pruneJobFiles(): Promise<void> {
|
|
|
235
283
|
type ListedBrowser = { name: string; headed?: boolean; attached?: boolean };
|
|
236
284
|
|
|
237
285
|
/**
|
|
238
|
-
*
|
|
286
|
+
* An expired job's workspace closes browsers nobody can see. Headless is the bot's
|
|
239
287
|
* working copy; `--headed` is the bot putting a window on their screen on
|
|
240
288
|
* purpose — an order at checkout, a map with a pin, a sign-in — and that one is
|
|
241
289
|
* theirs to close (`skills/browser`). A session attached to their own Chrome is
|
|
242
290
|
* never touched. Anything unreadable — no playwright, a failed or folded `list`
|
|
243
291
|
* — leaves the browser as it is.
|
|
244
292
|
*/
|
|
245
|
-
export async function closeHiddenBrowser(
|
|
293
|
+
export async function closeHiddenBrowser(threadId: string): Promise<void> {
|
|
294
|
+
await closeBrowsers(threadId, false);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/** Cancel and delete close every participant's window, but never an attached personal browser. */
|
|
298
|
+
export async function closeJobShell(threadId: string): Promise<void> {
|
|
299
|
+
await closeBrowsers(threadId, true);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
async function closeBrowsers(
|
|
303
|
+
threadId: string,
|
|
304
|
+
visible: boolean,
|
|
305
|
+
): Promise<void> {
|
|
246
306
|
const sandbox = await openWorkspace();
|
|
247
|
-
const env = jobShellEnv(
|
|
307
|
+
const env = jobShellEnv(threadId);
|
|
248
308
|
const listed = await sandbox
|
|
249
309
|
.exec("playwright-cli list --json", { env, timeoutMs: 15_000 })
|
|
250
310
|
.catch(() => null);
|
|
251
|
-
let
|
|
311
|
+
let sessions: ListedBrowser[] = [];
|
|
252
312
|
try {
|
|
253
313
|
const { browsers } = JSON.parse(listed?.stdout ?? "") as {
|
|
254
314
|
browsers?: ListedBrowser[];
|
|
255
315
|
};
|
|
256
|
-
|
|
316
|
+
sessions =
|
|
317
|
+
browsers?.filter(
|
|
318
|
+
(b) =>
|
|
319
|
+
b.name === env.PLAYWRIGHT_CLI_SESSION ||
|
|
320
|
+
b.name.startsWith(`${env.PLAYWRIGHT_CLI_SESSION}-`),
|
|
321
|
+
) ?? [];
|
|
257
322
|
} catch {}
|
|
258
|
-
|
|
323
|
+
for (const session of sessions) {
|
|
324
|
+
if (session.attached || (!visible && session.headed !== false)) continue;
|
|
259
325
|
await sandbox
|
|
260
|
-
.exec("playwright-cli close", {
|
|
326
|
+
.exec("playwright-cli close", {
|
|
327
|
+
env: { ...env, PLAYWRIGHT_CLI_SESSION: session.name },
|
|
328
|
+
timeoutMs: 15_000,
|
|
329
|
+
})
|
|
261
330
|
.catch(() => {});
|
|
262
331
|
}
|
|
263
332
|
await pruneJobFiles();
|
|
264
333
|
}
|
|
265
334
|
|
|
266
|
-
/**
|
|
267
|
-
* Closes the job's browser whatever it shows. Only for a job the user cancelled
|
|
268
|
-
* or deleted: its row is gone, so a window left open would belong to nothing on
|
|
269
|
-
* the screen.
|
|
270
|
-
*/
|
|
271
|
-
export async function closeJobShell(taskId: string): Promise<void> {
|
|
272
|
-
const sandbox = await openWorkspace();
|
|
273
|
-
await sandbox
|
|
274
|
-
.exec("playwright-cli close", {
|
|
275
|
-
env: jobShellEnv(taskId),
|
|
276
|
-
timeoutMs: 15_000,
|
|
277
|
-
})
|
|
278
|
-
.catch(() => {});
|
|
279
|
-
await pruneJobFiles();
|
|
280
|
-
}
|
|
281
|
-
|
|
282
335
|
const pruneOutputFiles = () => pruneOldFiles(PATHS.output);
|
|
283
336
|
|
|
284
337
|
const pruneBrowserFiles = () => pruneOldFiles(BROWSER_DIR);
|
|
@@ -389,15 +442,15 @@ export async function filesOnDisk(
|
|
|
389
442
|
}
|
|
390
443
|
|
|
391
444
|
/**
|
|
392
|
-
* Removes a job's working folder. Its lifetime is the
|
|
445
|
+
* Removes a job's working folder. Its lifetime is the thread's: when the row goes,
|
|
393
446
|
* so does what it was working with (features/bot/bot.runner). Never touches
|
|
394
447
|
* `artifacts` or `projects` — those are the user's and outlive every job.
|
|
395
448
|
*/
|
|
396
449
|
export async function removeJobScratch(
|
|
397
|
-
|
|
450
|
+
threadId: string,
|
|
398
451
|
label: string,
|
|
399
452
|
): Promise<void> {
|
|
400
|
-
await rm(join(WORKSPACE, jobScratch(
|
|
453
|
+
await rm(join(WORKSPACE, jobScratch(threadId, label)), {
|
|
401
454
|
recursive: true,
|
|
402
455
|
force: true,
|
|
403
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
|
+
}
|