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