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
|
@@ -3,12 +3,7 @@ import { formatDistanceToNowStrict } from "date-fns";
|
|
|
3
3
|
import { CALL_EXEC_TIMEOUT_MS, IS_DEV } from "@/config";
|
|
4
4
|
import type { TextModel } from "@/features/ai/model";
|
|
5
5
|
import { clockNow } from "@/features/ai/prompts/prompt-helper";
|
|
6
|
-
import {
|
|
7
|
-
answerTool,
|
|
8
|
-
askThursdayTool,
|
|
9
|
-
delegateSpec,
|
|
10
|
-
taskSpec,
|
|
11
|
-
} from "@/features/ai/tools/bot.tool";
|
|
6
|
+
import { delegateSpec, threadSpec } from "@/features/ai/tools/bot.tool";
|
|
12
7
|
import { CALL_TOOLS } from "@/features/ai/tools/call.tool";
|
|
13
8
|
import { createMcpTools } from "@/features/ai/tools/mcp.tool";
|
|
14
9
|
import { createMemoryTools } from "@/features/ai/tools/memory.tool";
|
|
@@ -16,12 +11,17 @@ import { createSearchTool } from "@/features/ai/tools/search.tool";
|
|
|
16
11
|
import { createSkillTools } from "@/features/ai/tools/skills.tool";
|
|
17
12
|
import { TOOL_NAMES } from "@/features/ai/tools/tool-name";
|
|
18
13
|
import { createWorkspaceTools } from "@/features/ai/tools/workspace.tool";
|
|
19
|
-
import {
|
|
14
|
+
import { threadActivity } from "@/features/bot/bot.schema";
|
|
20
15
|
import { loadSkills } from "@/features/skills/skills.discover";
|
|
21
16
|
import { readCallSkillsOn } from "@/features/thursday/thursday.query";
|
|
22
|
-
import {
|
|
17
|
+
import {
|
|
18
|
+
botShellEnv,
|
|
19
|
+
jobShellEnv,
|
|
20
|
+
openWorkspace,
|
|
21
|
+
} from "@/features/workspace/workspace";
|
|
23
22
|
import { toDate } from "@/lib/date-like";
|
|
24
23
|
import { logger } from "@/lib/logger";
|
|
24
|
+
import { isPublicError } from "@/lib/public-error";
|
|
25
25
|
import { estimateTokens } from "@/lib/tokens";
|
|
26
26
|
import { clip } from "@/lib/utils";
|
|
27
27
|
|
|
@@ -41,14 +41,14 @@ export type ToolTarget = "thursday" | "bot" | "memory-edit";
|
|
|
41
41
|
export type ToolRun =
|
|
42
42
|
| {
|
|
43
43
|
target: "thursday";
|
|
44
|
-
/** The current call; written on the
|
|
44
|
+
/** The current call; written on the thread row `delegate` opens. */
|
|
45
45
|
callId?: string | null;
|
|
46
46
|
}
|
|
47
47
|
| {
|
|
48
48
|
target: "bot";
|
|
49
49
|
/** This run's bot name, the key of the bot table. */
|
|
50
50
|
bot: string;
|
|
51
|
-
/** The browser session this run's shell drives (workspace.ts jobShellEnv):
|
|
51
|
+
/** The browser session this run's shell drives (workspace.ts jobShellEnv): this participant's own in the job. */
|
|
52
52
|
session?: string | null;
|
|
53
53
|
/** The model this run already resolved (bot.run resolveModel); its own native search is what `web_search` uses when no Exa key is set (tools/search.tool). */
|
|
54
54
|
model?: TextModel | null;
|
|
@@ -58,10 +58,10 @@ export type ToolRun =
|
|
|
58
58
|
|
|
59
59
|
/**
|
|
60
60
|
* Starting work and following it. bot.runner is imported dynamically to break a cycle
|
|
61
|
-
* (runner -> bot.run -> this file). `delegate` records which call opened the job
|
|
62
|
-
*
|
|
61
|
+
* (runner -> bot.run -> this file). `delegate` records which call opened the job, so a
|
|
62
|
+
* later call's prompt finds the job under the line that opened it (Earlier calls).
|
|
63
63
|
*/
|
|
64
|
-
function
|
|
64
|
+
function createThreadTools(callId: string | null | undefined): ToolSet {
|
|
65
65
|
return {
|
|
66
66
|
[TOOL_NAMES.delegate]: tool({
|
|
67
67
|
description: delegateSpec.description,
|
|
@@ -81,8 +81,8 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
// The row carries the bot's own spelling, not the transcript's
|
|
84
|
-
const {
|
|
85
|
-
const id = await
|
|
84
|
+
const { startThread } = await import("@/features/bot/bot.runner");
|
|
85
|
+
const id = await startThread({
|
|
86
86
|
bot: found.name,
|
|
87
87
|
request,
|
|
88
88
|
label,
|
|
@@ -90,20 +90,20 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
|
|
|
90
90
|
from: "thursday",
|
|
91
91
|
});
|
|
92
92
|
return {
|
|
93
|
-
|
|
93
|
+
threadId: id,
|
|
94
94
|
// The label is the handle: without it in front of her, a follow-up
|
|
95
95
|
// becomes a second job instead of a word to the one running
|
|
96
|
-
note: `${found.name} has "${label}".
|
|
96
|
+
note: `${found.name} has "${label}". Its updates reach the conversation on their own. Anything further about this work — an answer, a correction, the next step once it finishes — is \`${TOOL_NAMES.thread}\` with "${label}".`,
|
|
97
97
|
};
|
|
98
98
|
},
|
|
99
99
|
}),
|
|
100
100
|
|
|
101
|
-
[TOOL_NAMES.
|
|
102
|
-
description:
|
|
103
|
-
inputSchema:
|
|
104
|
-
execute: async ({ action,
|
|
105
|
-
const {
|
|
106
|
-
"@/features/bot/
|
|
101
|
+
[TOOL_NAMES.thread]: tool({
|
|
102
|
+
description: threadSpec.description,
|
|
103
|
+
inputSchema: threadSpec.parameters,
|
|
104
|
+
execute: async ({ action, thread, answer, recipient, replyTo }) => {
|
|
105
|
+
const { listThreadOverview, resolveThread } = await import(
|
|
106
|
+
"@/features/bot/thread.query"
|
|
107
107
|
);
|
|
108
108
|
if (action === "status") {
|
|
109
109
|
// `status` only reads, and text left in `answer` reaches nobody — it
|
|
@@ -118,15 +118,21 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
|
|
|
118
118
|
// opened and a call can run for hours; `since` is measured against this.
|
|
119
119
|
const now = { now: clockNow() };
|
|
120
120
|
// A named job comes back whole; the list clips outcomes, and the model pads a clipped answer
|
|
121
|
-
if (
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
121
|
+
if (thread) {
|
|
122
|
+
const one = await resolveThread(thread);
|
|
123
|
+
if (!one) return await noSuchJob(thread);
|
|
124
|
+
const { findThreadView } = await import(
|
|
125
|
+
"@/features/bot/thread.query"
|
|
126
|
+
);
|
|
127
|
+
const room = (await findThreadView(one.id))?.room;
|
|
125
128
|
return {
|
|
126
129
|
...now,
|
|
127
130
|
...dropped,
|
|
128
131
|
label: one.label,
|
|
132
|
+
id: one.id,
|
|
129
133
|
bot: one.bot,
|
|
134
|
+
participants: room?.participants ?? [],
|
|
135
|
+
questions: room?.questions ?? [],
|
|
130
136
|
status: one.status,
|
|
131
137
|
since: formatDistanceToNowStrict(toDate(one.updatedAt), {
|
|
132
138
|
addSuffix: true,
|
|
@@ -137,62 +143,122 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
|
|
|
137
143
|
: {}),
|
|
138
144
|
};
|
|
139
145
|
}
|
|
140
|
-
const
|
|
141
|
-
// No
|
|
146
|
+
const threads = await listThreadOverview();
|
|
147
|
+
// No messages — only as much as is worth reading out: what it is
|
|
142
148
|
// asking, the one line of what it is doing, or how it ended
|
|
143
149
|
return {
|
|
144
150
|
...now,
|
|
145
151
|
...dropped,
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
152
|
+
threads: threads.map((thread) => ({
|
|
153
|
+
id: thread.id,
|
|
154
|
+
label: thread.label,
|
|
155
|
+
bot: thread.bot,
|
|
156
|
+
status: thread.status,
|
|
157
|
+
participants: thread.room.participants,
|
|
158
|
+
questions: thread.room.questions.map((question) => ({
|
|
159
|
+
...question,
|
|
160
|
+
text: clip(question.text, 200),
|
|
161
|
+
})),
|
|
162
|
+
since: formatDistanceToNowStrict(toDate(thread.updatedAt), {
|
|
151
163
|
addSuffix: true,
|
|
152
164
|
}),
|
|
153
|
-
...(
|
|
154
|
-
? { asking:
|
|
165
|
+
...(thread.ask
|
|
166
|
+
? { asking: thread.ask.question, options: thread.ask.options }
|
|
155
167
|
: {}),
|
|
156
|
-
...(
|
|
157
|
-
? { now:
|
|
168
|
+
...(thread.status === "running"
|
|
169
|
+
? { now: threadActivity(thread.lines) }
|
|
158
170
|
: {}),
|
|
159
|
-
...(
|
|
160
|
-
? { outcome: clip(
|
|
171
|
+
...(thread.outcome && thread.status !== "waiting"
|
|
172
|
+
? { outcome: clip(thread.outcome, 200) }
|
|
161
173
|
: {}),
|
|
162
174
|
})),
|
|
163
175
|
};
|
|
164
176
|
}
|
|
165
|
-
// A name is how a job is taken,
|
|
166
|
-
//
|
|
167
|
-
//
|
|
168
|
-
// needs the name: it cannot be taken back.
|
|
169
|
-
const {
|
|
170
|
-
|
|
171
|
-
|
|
177
|
+
// A name is how a job is taken. Unnamed, `open` shows the job that just
|
|
178
|
+
// moved, and `answer` reaches the one open question; words with no question
|
|
179
|
+
// waiting belong to a job the user names, never to whichever moved last.
|
|
180
|
+
// Cancel always needs the name: it cannot be taken back.
|
|
181
|
+
const { listInboxThreads, markSeen } = await import(
|
|
182
|
+
"@/features/bot/thread.query"
|
|
183
|
+
);
|
|
184
|
+
const unnamed = !thread && (action === "answer" || action === "open");
|
|
185
|
+
const inbox = unnamed ? await listInboxThreads() : [];
|
|
186
|
+
const asking =
|
|
187
|
+
action === "answer"
|
|
188
|
+
? inbox.filter((row) => row.room.questions.length)
|
|
189
|
+
: [];
|
|
190
|
+
if (asking.length > 1)
|
|
191
|
+
return `Questions are waiting in more than one job: ${asking
|
|
192
|
+
.map(
|
|
193
|
+
(row) =>
|
|
194
|
+
`"${row.label}" (${row.room.questions.map((question) => question.bot).join(", ")})`,
|
|
195
|
+
)
|
|
196
|
+
.join(", ")}. Name the job.`;
|
|
197
|
+
const one = thread
|
|
198
|
+
? await resolveThread(thread)
|
|
172
199
|
: action === "answer"
|
|
173
|
-
? (
|
|
174
|
-
:
|
|
200
|
+
? (asking[0] ?? null)
|
|
201
|
+
: unnamed
|
|
202
|
+
? (inbox[0] ?? null)
|
|
203
|
+
: null;
|
|
175
204
|
if (!one) {
|
|
176
|
-
if (
|
|
177
|
-
|
|
205
|
+
if (thread) return await noSuchJob(thread);
|
|
206
|
+
if (action === "answer")
|
|
207
|
+
return `No question is waiting. Name the job this is for; \`${TOOL_NAMES.thread}\` \`status\` lists them.`;
|
|
208
|
+
return unnamed
|
|
178
209
|
? "No job has moved yet — say which one, or check `status` first."
|
|
179
210
|
: "Say which job — by its label. Call `status` with no job named to see them.";
|
|
180
211
|
}
|
|
181
212
|
|
|
182
|
-
|
|
213
|
+
if (action === "open") {
|
|
214
|
+
// The room on the call screen draws the inbox; an older job is only in the history
|
|
215
|
+
const room = unnamed ? inbox : await listInboxThreads();
|
|
216
|
+
if (!room.some((row) => row.id === one.id))
|
|
217
|
+
return `"${one.label}" is older than the call screen keeps; it is under Settings › Threads.`;
|
|
218
|
+
const { appEvents } = await import(
|
|
219
|
+
"@/app/api/events/app-event.server"
|
|
220
|
+
);
|
|
221
|
+
appEvents.emit({ type: "showThread", threadId: one.id });
|
|
222
|
+
return { label: one.label, open: true };
|
|
223
|
+
}
|
|
224
|
+
if (action === "seen") {
|
|
225
|
+
// The same as opening it on screen: it leaves the work waiting on the user
|
|
226
|
+
await markSeen([one.id]);
|
|
227
|
+
return { label: one.label, seen: true };
|
|
228
|
+
}
|
|
229
|
+
const { answerThread, cancelThread } = await import(
|
|
183
230
|
"@/features/bot/bot.runner"
|
|
184
231
|
);
|
|
185
232
|
if (action === "cancel") {
|
|
186
|
-
await
|
|
233
|
+
await cancelThread(one.id);
|
|
187
234
|
return { label: one.label, status: "cancelled" };
|
|
188
235
|
}
|
|
189
236
|
if (!answer?.trim()) return "Say what to pass on.";
|
|
190
|
-
|
|
237
|
+
let told: Awaited<ReturnType<typeof answerThread>>;
|
|
238
|
+
try {
|
|
239
|
+
told = await answerThread(
|
|
240
|
+
one.id,
|
|
241
|
+
answer.trim(),
|
|
242
|
+
"thursday",
|
|
243
|
+
recipient ?? undefined,
|
|
244
|
+
replyTo ?? undefined,
|
|
245
|
+
);
|
|
246
|
+
} catch (cause) {
|
|
247
|
+
// Which question, or that it is gone, is the model's to fix: one line it can act on
|
|
248
|
+
if (isPublicError(cause)) return cause.message;
|
|
249
|
+
throw cause;
|
|
250
|
+
}
|
|
251
|
+
if (told?.answered)
|
|
252
|
+
return {
|
|
253
|
+
label: one.label,
|
|
254
|
+
answered: told.answered,
|
|
255
|
+
note: `${told.answered.bot} has the answer to its question and goes on from it.`,
|
|
256
|
+
};
|
|
191
257
|
return {
|
|
192
258
|
// Named even when the model named it: with no job given this is the
|
|
193
259
|
// one that moved last, and saying which makes a wrong one obvious
|
|
194
260
|
label: one.label,
|
|
195
|
-
bot: one.bot,
|
|
261
|
+
bot: told?.to ?? one.bot,
|
|
196
262
|
status: "running",
|
|
197
263
|
note:
|
|
198
264
|
one.status === "running"
|
|
@@ -206,11 +272,11 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
|
|
|
206
272
|
|
|
207
273
|
/** An unresolved reference answers with the recent jobs; a bare "no such job" is read as an error and relayed as one. */
|
|
208
274
|
async function noSuchJob(ref: string): Promise<string> {
|
|
209
|
-
const {
|
|
210
|
-
const recent = await
|
|
275
|
+
const { listThreadOverview } = await import("@/features/bot/thread.query");
|
|
276
|
+
const recent = await listThreadOverview();
|
|
211
277
|
if (!recent.length) return "No jobs have been handed over yet.";
|
|
212
278
|
const names = recent
|
|
213
|
-
.map((
|
|
279
|
+
.map((thread) => `"${thread.label}" (${thread.bot}, ${thread.status})`)
|
|
214
280
|
.join(", ");
|
|
215
281
|
return `There is no job called "${ref}". The latest are: ${names}. Call again with one of those names.`;
|
|
216
282
|
}
|
|
@@ -261,11 +327,16 @@ async function buildTools(run: ToolRun): Promise<ToolSet> {
|
|
|
261
327
|
};
|
|
262
328
|
}
|
|
263
329
|
|
|
264
|
-
// The call's hand
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
330
|
+
// The call's hand; a fact it writes is tied to the call it was said in. A bot
|
|
331
|
+
// is handed only the reads from it (below).
|
|
332
|
+
const { [TOOL_NAMES.memory_conversation]: conversation, ...memory } =
|
|
333
|
+
createMemoryTools(
|
|
334
|
+
"call",
|
|
335
|
+
run.target === "thursday" ? (run.callId ?? null) : null,
|
|
336
|
+
);
|
|
337
|
+
const readBack: ToolSet = {
|
|
338
|
+
[TOOL_NAMES.memory_conversation]: conversation,
|
|
339
|
+
};
|
|
269
340
|
|
|
270
341
|
const sandbox = await openWorkspace();
|
|
271
342
|
|
|
@@ -279,46 +350,46 @@ async function buildTools(run: ToolRun): Promise<ToolSet> {
|
|
|
279
350
|
|
|
280
351
|
return {
|
|
281
352
|
...memory,
|
|
353
|
+
...readBack,
|
|
282
354
|
...skills,
|
|
283
|
-
// The shell alone, for no longer than
|
|
284
|
-
//
|
|
285
|
-
// a job, not a glance (workspace.tool)
|
|
355
|
+
// The shell alone, for no longer than her answer can wait on it (config
|
|
356
|
+
// CALL_EXEC_TIMEOUT_MS). A whole file is a job, not a glance (workspace.tool)
|
|
286
357
|
...createWorkspaceTools(sandbox, {
|
|
287
358
|
write: false,
|
|
288
359
|
timeoutMs: CALL_EXEC_TIMEOUT_MS,
|
|
289
360
|
}),
|
|
290
361
|
// Handing work over, following it, and hanging up belong to the voice session only
|
|
291
|
-
...
|
|
362
|
+
...createThreadTools(run.callId),
|
|
292
363
|
...CALL_TOOLS,
|
|
293
364
|
};
|
|
294
365
|
}
|
|
295
366
|
|
|
296
367
|
// A bot works inside a job it did not open: it can pull another bot in but cannot start a job.
|
|
297
|
-
//
|
|
298
|
-
// for `ask_back` in a borrowed bot. `answer` ends every run.
|
|
368
|
+
// The runner attaches messaging with the active continuation (bot.run).
|
|
299
369
|
const skills = await loadSkills(sandbox);
|
|
300
370
|
return {
|
|
301
371
|
// A bot only reads memory: every write is the call's, and there is no screen to show a note on
|
|
302
372
|
[TOOL_NAMES.memory_recall]: memory[TOOL_NAMES.memory_recall],
|
|
303
|
-
|
|
373
|
+
...readBack,
|
|
304
374
|
// Exa when its key is set, else this bot's own model when it can search;
|
|
305
375
|
// absent when neither, and the browser is the way in (search.tool)
|
|
306
376
|
...(await createSearchTool(run.model, sandbox)),
|
|
307
|
-
// The browser rides in the shell: its session is this
|
|
308
|
-
//
|
|
309
|
-
//
|
|
377
|
+
// The browser rides in the shell: its session is this participant's in this job,
|
|
378
|
+
// set by the server rather than typed by the model (workspace.ts jobShellEnv),
|
|
379
|
+
// and so is the bot's artifacts folder
|
|
310
380
|
...createWorkspaceTools(sandbox, {
|
|
311
381
|
write: true,
|
|
312
|
-
env: jobShellEnv(run.session),
|
|
382
|
+
env: { ...jobShellEnv(run.session), ...botShellEnv(run.bot) },
|
|
313
383
|
// What the shell is like and what this machine has, on the first command
|
|
314
|
-
// of the run only (workspace.tool
|
|
384
|
+
// of the run only (workspace.tool SHELL_GUIDE). The call gets no guide:
|
|
315
385
|
// one command is a glance, not a job to plan around
|
|
316
386
|
guide: true,
|
|
387
|
+
// Its own memory stays within its limits whichever of the two writes it
|
|
388
|
+
// (bot.memory), and its finished work stays in its own folder
|
|
389
|
+
bot: run.bot,
|
|
317
390
|
}),
|
|
318
391
|
// Pinned tools come with schemas; the rest sit behind `tool_search`, absent when nothing is left to find (mcp.tool)
|
|
319
392
|
...(await createMcpTools(run.bot, sandbox)),
|
|
320
393
|
...createSkillTools({ sandbox, skills }),
|
|
321
|
-
[TOOL_NAMES.ask_thursday]: askThursdayTool,
|
|
322
|
-
[TOOL_NAMES.answer]: answerTool,
|
|
323
394
|
};
|
|
324
395
|
}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { BOT_RUN } from "@/config";
|
|
3
|
-
import {
|
|
4
|
-
REALTIME_PROVIDERS,
|
|
5
|
-
type SpeachModelProviderId,
|
|
6
|
-
} from "@/lib/realtime/realtime.schema";
|
|
7
3
|
|
|
8
4
|
/** Providers and model catalogs. Nothing is stored here; a model is named by whatever runs on it. */
|
|
9
5
|
|
|
@@ -25,20 +21,6 @@ export const textModelRefSchema = z.object({
|
|
|
25
21
|
export type TextModelProviderId = z.infer<typeof textModelProviderSchema>;
|
|
26
22
|
export type TextModelRef = z.infer<typeof textModelRefSchema>;
|
|
27
23
|
|
|
28
|
-
/** Who runs the call. The ids are the realtime drivers that exist (lib/realtime/realtime.schema). */
|
|
29
|
-
export const speachModelProviderSchema = z.enum(REALTIME_PROVIDERS);
|
|
30
|
-
|
|
31
|
-
export const speachModelRefSchema = z.object({
|
|
32
|
-
provider: speachModelProviderSchema,
|
|
33
|
-
/** Null means whatever that provider's default voice is. */
|
|
34
|
-
voice: z.string().trim().min(1).max(64).nullish(),
|
|
35
|
-
/** Null means that provider's first model (SPEACH_MODEL_PROVIDERS). Free text so a new model needs no edit here. */
|
|
36
|
-
model: z.string().trim().min(1).max(80).nullish(),
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
export type { SpeachModelProviderId };
|
|
40
|
-
export type SpeachModelRef = z.infer<typeof speachModelRefSchema>;
|
|
41
|
-
|
|
42
24
|
/** Size of a suggested model, not quality. A label rather than a price because prices move. */
|
|
43
25
|
export const MODEL_TIERS = ["small", "mid", "large"] as const;
|
|
44
26
|
export type ModelTier = (typeof MODEL_TIERS)[number];
|
|
@@ -262,11 +244,6 @@ export const MEDIA_MODEL_PROVIDERS: Record<
|
|
|
262
244
|
label: "Grok Imagine 2.0",
|
|
263
245
|
tier: "small",
|
|
264
246
|
},
|
|
265
|
-
{
|
|
266
|
-
id: "google/gemini-3.1-flash-image",
|
|
267
|
-
label: "Gemini 3.1 Flash Image",
|
|
268
|
-
tier: "mid",
|
|
269
|
-
},
|
|
270
247
|
{ id: "bfl/flux-2-pro", label: "FLUX 2 Pro", tier: "mid" },
|
|
271
248
|
{
|
|
272
249
|
id: "bytedance/seedream-5.0-pro",
|
|
@@ -274,11 +251,6 @@ export const MEDIA_MODEL_PROVIDERS: Record<
|
|
|
274
251
|
tier: "mid",
|
|
275
252
|
},
|
|
276
253
|
{ id: "recraft/recraft-v4.1", label: "Recraft V4.1", tier: "mid" },
|
|
277
|
-
{
|
|
278
|
-
id: "google/gemini-3-pro-image",
|
|
279
|
-
label: "Gemini 3 Pro Image",
|
|
280
|
-
tier: "large",
|
|
281
|
-
},
|
|
282
254
|
{
|
|
283
255
|
id: "openai/gpt-image-2.5-sunburst",
|
|
284
256
|
label: "GPT Image 2.5 Sunburst",
|
|
@@ -370,10 +342,6 @@ export const canMakeKind = (provider: string, kind: MediaKind): boolean =>
|
|
|
370
342
|
(MEDIA_MODEL_PROVIDERS[provider as MediaModelProviderId]?.models[kind]
|
|
371
343
|
?.length ?? 0) > 0;
|
|
372
344
|
|
|
373
|
-
/** How a pick is stored and shown: "openai/gpt-image-2". Split on the first slash only; gateway ids carry a slash of their own. */
|
|
374
|
-
export const formatMediaModel = (ref: MediaModelRef) =>
|
|
375
|
-
`${ref.provider}/${ref.model}`;
|
|
376
|
-
|
|
377
345
|
/** `provider/model` for a text model, as the default-model config stores it. */
|
|
378
346
|
export function parseTextModel(value: string | undefined): TextModelRef | null {
|
|
379
347
|
const [provider, ...rest] = (value ?? "").trim().split("/");
|
|
@@ -384,6 +352,7 @@ export function parseTextModel(value: string | undefined): TextModelRef | null {
|
|
|
384
352
|
return parsed.success ? parsed.data : null;
|
|
385
353
|
}
|
|
386
354
|
|
|
355
|
+
/** How a media pick is stored: "openai/gpt-image-2". Split on the first slash only; gateway ids carry a slash of their own. */
|
|
387
356
|
export function parseMediaModel(
|
|
388
357
|
value: string | undefined,
|
|
389
358
|
): MediaModelRef | null {
|
|
@@ -595,93 +564,6 @@ const modelOfTier = (
|
|
|
595
564
|
export const defaultModelOf = (provider: { suggestModels: SuggestModel[] }) =>
|
|
596
565
|
modelOfTier(provider, "mid");
|
|
597
566
|
|
|
598
|
-
/**
|
|
599
|
-
* The speech-to-speech backends. `models` and `voices` are suggestion lists, not validation
|
|
600
|
-
* lists (the api takes more, e.g. a cloned voice id); the first model is the default. Written
|
|
601
|
-
* out rather than fetched, best first.
|
|
602
|
-
*/
|
|
603
|
-
export const SPEACH_MODEL_PROVIDERS: Record<
|
|
604
|
-
SpeachModelProviderId,
|
|
605
|
-
{
|
|
606
|
-
label: string;
|
|
607
|
-
apiKeyName: string;
|
|
608
|
-
/** What a key of theirs starts with (`detectSpeachProvider`); longest match wins. */
|
|
609
|
-
keyPrefix: string[];
|
|
610
|
-
/** Newest first — the head of this list is the default. */
|
|
611
|
-
models: { id: string; label: string }[];
|
|
612
|
-
voices: string[];
|
|
613
|
-
defaultVoice: string;
|
|
614
|
-
}
|
|
615
|
-
> = {
|
|
616
|
-
openai: {
|
|
617
|
-
apiKeyName: TEXT_MODEL_PROVIDERS.openai.apiKeyName,
|
|
618
|
-
label: TEXT_MODEL_PROVIDERS.openai.label,
|
|
619
|
-
keyPrefix: ["sk-"],
|
|
620
|
-
models: [
|
|
621
|
-
{ id: "gpt-realtime-2.1", label: "Realtime 2.1" },
|
|
622
|
-
{ id: "gpt-realtime-2.1-mini", label: "Realtime 2.1 mini" },
|
|
623
|
-
{ id: "gpt-realtime-2", label: "Realtime 2" },
|
|
624
|
-
],
|
|
625
|
-
// The spec's VoiceIdsShared enum; `marin` and `cedar` lead as the realtime docs' best-quality voices
|
|
626
|
-
voices: [
|
|
627
|
-
"marin",
|
|
628
|
-
"cedar",
|
|
629
|
-
"alloy",
|
|
630
|
-
"ash",
|
|
631
|
-
"ballad",
|
|
632
|
-
"coral",
|
|
633
|
-
"echo",
|
|
634
|
-
"sage",
|
|
635
|
-
"shimmer",
|
|
636
|
-
"verse",
|
|
637
|
-
],
|
|
638
|
-
defaultVoice: "marin",
|
|
639
|
-
},
|
|
640
|
-
xai: {
|
|
641
|
-
apiKeyName: TEXT_MODEL_PROVIDERS.xai.apiKeyName,
|
|
642
|
-
label: TEXT_MODEL_PROVIDERS.xai.label,
|
|
643
|
-
keyPrefix: ["xai-"],
|
|
644
|
-
models: [
|
|
645
|
-
{ id: "grok-voice-think-fast-2.0", label: "Voice Think Fast 2.0" },
|
|
646
|
-
// Tracks whatever xAI ships next; second because a name that moves under a running call is not a default
|
|
647
|
-
{ id: "grok-voice-latest", label: "Voice latest" },
|
|
648
|
-
],
|
|
649
|
-
// `eve` is xAI's own default. All built-in ids; a cloned voice from POST /v1/custom-voices goes in the same field
|
|
650
|
-
voices: ["eve", "ara", "leo", "rex", "sal"],
|
|
651
|
-
defaultVoice: "eve",
|
|
652
|
-
},
|
|
653
|
-
};
|
|
654
|
-
|
|
655
|
-
/**
|
|
656
|
-
* Which voice provider a pasted key belongs to; null when unknown. `sk-ant-` is excluded
|
|
657
|
-
* because Anthropic keys share OpenAI's prefix and Anthropic cannot take a call.
|
|
658
|
-
*/
|
|
659
|
-
export function detectSpeachProvider(
|
|
660
|
-
key: string,
|
|
661
|
-
): SpeachModelProviderId | null {
|
|
662
|
-
const trimmed = key.trim();
|
|
663
|
-
if (!trimmed || trimmed.startsWith("sk-ant-")) return null;
|
|
664
|
-
|
|
665
|
-
let found: SpeachModelProviderId | null = null;
|
|
666
|
-
let longest = 0;
|
|
667
|
-
for (const id of Object.keys(
|
|
668
|
-
SPEACH_MODEL_PROVIDERS,
|
|
669
|
-
) as SpeachModelProviderId[]) {
|
|
670
|
-
for (const prefix of SPEACH_MODEL_PROVIDERS[id].keyPrefix) {
|
|
671
|
-
if (trimmed.startsWith(prefix) && prefix.length > longest) {
|
|
672
|
-
found = id;
|
|
673
|
-
longest = prefix.length;
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
return found;
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
/** The record above in a stable order — the voice picker walks it. */
|
|
681
|
-
export const SPEACH_MODEL_PROVIDER_LIST = (
|
|
682
|
-
Object.keys(SPEACH_MODEL_PROVIDERS) as SpeachModelProviderId[]
|
|
683
|
-
).map((id) => ({ id, ...SPEACH_MODEL_PROVIDERS[id] }));
|
|
684
|
-
|
|
685
567
|
/** The record above in a stable order — routes and pickers walk it. */
|
|
686
568
|
export const TEXT_MODEL_PROVIDER_LIST = (
|
|
687
569
|
Object.keys(TEXT_MODEL_PROVIDERS) as TextModelProviderId[]
|
|
@@ -747,7 +629,7 @@ export type GatewayModel = {
|
|
|
747
629
|
label: string;
|
|
748
630
|
/** Who runs it, the gateway's own word. Four of them are providers this app draws (provider-icon). */
|
|
749
631
|
owner: string;
|
|
750
|
-
/**
|
|
632
|
+
/** The gateway's own word, as `readGatewayCatalog` received it; null when it did not say. */
|
|
751
633
|
type?: string | null;
|
|
752
634
|
/** The gateway's own words for what a model can do; only `tool-use` is read. */
|
|
753
635
|
tags: string[];
|