thursday-agent 0.5.0 → 0.7.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 +5 -4
- 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 +4 -4
- 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 +15 -15
- 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 +9 -10
- 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 -5
- 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 +11 -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]__0-06t3f._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__02846fb._.js +8 -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]__06l05n_._.js +3 -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]__0btqrct._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0c9fgca._.js +5 -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]__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/_1gnjfli._.js +3 -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_0v_7drq._.js → node_modules_consola_dist_chunks_prompt_mjs_0a7-pbw._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_17k8irj._.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_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]__0-e011f._.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]__0lyi8i2._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0pd8yr7._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__16jc196._.js +1 -1
- 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]__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]__1vdmfbe._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1waa3rc._.js +85 -0
- package/.next/server/chunks/ssr/_0-2qsxo._.js +3 -0
- package/.next/server/chunks/ssr/_00rehl_._.js +3 -0
- package/.next/server/chunks/ssr/{_1lz_cq2._.js → _02oc_h5._.js} +76 -97
- package/.next/server/chunks/ssr/_05yghx6._.js +3 -0
- package/.next/server/chunks/ssr/_07nbwap._.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/{_0m2lsd1._.js → _0b6_jv-._.js} +2 -2
- package/.next/server/chunks/ssr/_0evkpto._.js +3 -0
- package/.next/server/chunks/ssr/_0geg212._.js +3 -0
- package/.next/server/chunks/ssr/{_1jdgjv9._.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/_0no7i1o._.js +3 -0
- package/.next/server/chunks/ssr/_0tzg--b._.js +3 -0
- 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/_114ylv7._.js +7 -0
- package/.next/server/chunks/ssr/_123y-ah._.js +3 -0
- package/.next/server/chunks/ssr/_12c-iwh._.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/_167hchk._.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/_1_krfph._.js +3 -0
- package/.next/server/chunks/ssr/{_0rzucul._.js → _1_x5spz._.js} +3 -3
- package/.next/server/chunks/ssr/_1a61fc9._.js +3 -0
- 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/_1rgtxhr._.js +5 -0
- package/.next/server/chunks/ssr/_1slp25y._.js +3 -0
- package/.next/server/chunks/ssr/_1w_t7h7._.js +101 -0
- package/.next/server/chunks/ssr/{_0s99bgb._.js → _1wyfaq_._.js} +9 -3
- package/.next/server/chunks/ssr/_200gt-m._.js +102 -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/features_workspace_00jz2hu._.js +8 -0
- package/.next/server/chunks/ssr/{_1-teee5._.js → lib_logger_ts_0-olsze._.js} +2 -7
- package/.next/server/chunks/ssr/{node_modules_05-n6dz._.js → node_modules_02ai7br._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1chvq5f._.js → node_modules_02deexj._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0m383r2._.js → node_modules_07za262._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_07dsgkx._.js → node_modules_0_s9get._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1a0kmjl._.js → node_modules_0n3c7h0._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0zeg3x_._.js → node_modules_0od6jwr._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1y79i83._.js → node_modules_0rdt7pk._.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_04sksn9._.js → node_modules_0w1z7kz._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1uyk91w._.js → node_modules_0wdupfz._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0ifp389._.js → node_modules_1720w0a._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0u9da1h._.js → node_modules_18lsg7d._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1k6n600._.js → node_modules_1b94fxf._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_20c28js._.js → node_modules_1ecdo1s._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0fkeku3._.js → node_modules_1fa9ag7._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1j8j4pt._.js → node_modules_1fv-_si._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0-dr_o7._.js → node_modules_1hf461g._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1lz0oxc._.js → node_modules_1m71ta-._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1t77e4n._.js → node_modules_1n93n-g._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_16mkxuo._.js → node_modules_1n9lqu9._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1k7z2j6._.js → node_modules_1npnsvd._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_056qgf-._.js → node_modules_1rn2r0n._.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_0bvopy2._.js → node_modules_1vq-mfk._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0iur59s._.js → node_modules_1vzyw1t._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1k8j8n0._.js → node_modules_1w359w4._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1x0ztf4._.js → node_modules_1yajbl6._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1-y7nni._.js → node_modules_20eqhy8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0bkwd0u._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_019sbis._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0p9a9su._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0s6piq3._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@vercel_oidc_dist_1o553h-._.js → node_modules_@vercel_oidc_dist_05itbb1._.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/07vqbk_9t4em4.js +2 -0
- package/.next/static/chunks/08krja1zx7nqg.js +1 -0
- package/.next/static/chunks/0g4b348l0pve7.js +1 -0
- package/.next/static/chunks/0qcuwdk132jjt.js +1 -0
- package/.next/static/chunks/0vlgzqo9ka90v.js +1 -0
- package/.next/static/chunks/{11r2yp_yh9_qn.js → 0z69gvysmave7.js} +1 -1
- package/.next/static/chunks/0zrupxgci5gqc.js +1 -0
- package/.next/static/chunks/12fvz1w5ows75.js +1 -0
- package/.next/static/chunks/14t03ned286iu.js +1 -0
- package/.next/static/chunks/156xxbkrz5lzu.js +18 -0
- package/.next/static/chunks/1fz14reod4lft.js +1 -0
- package/.next/static/chunks/1g23dbabl-vkr.js +1 -0
- package/.next/static/chunks/1ohslk4568tm3.js +1 -0
- package/.next/static/chunks/1qy_rc3oxfxok.js +1 -0
- package/.next/static/chunks/1sbmwswc9k2-1.js +1 -0
- package/.next/static/chunks/1vqezbhjm3goq.js +1 -0
- package/.next/static/chunks/1zea7qdl-7365.js +1 -0
- package/.next/static/chunks/1zvqumkg7kmo0.css +1 -0
- package/.next/static/chunks/26hpqt3y6bogl.js +12 -0
- package/.next/static/chunks/2_j5mqm6d-z18.js +99 -0
- package/.next/static/chunks/2dt6tu7a22svs.js +1 -0
- package/.next/static/chunks/2h5ls3d86kya6.js +1 -0
- package/.next/static/chunks/2wc6y1ht6dfuy.js +1 -0
- package/.next/static/chunks/{435atsnhs7ksu.js → 2xr0zpll7thyi.js} +2 -2
- package/.next/static/chunks/31jztc-yq30m7.js +1 -0
- package/.next/static/chunks/391af0i8eljzk.js +1 -0
- package/.next/static/chunks/3bfwpww3m3x4u.js +1 -0
- package/.next/static/chunks/{38gweqdo4jpfj.js → 3izg0a3k87q1-.js} +5 -5
- package/.next/static/chunks/3p2s2cjokx1aa.js +5 -0
- package/.next/static/chunks/{408ueu4hfvcg7.js → 41s3fml5oivsa.js} +1 -1
- package/README.md +45 -193
- 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 +40 -35
- package/docs/images/keeps-going.png +0 -0
- package/docs/images/two-minds.png +0 -0
- package/docs/live-calls.md +236 -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 +152 -79
- 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 +169 -0
- package/features/ai/prompts/prompt-helper.ts +92 -32
- package/features/ai/prompts/thursday.prompt.ts +164 -190
- package/features/ai/tools/bot.tool.ts +38 -145
- package/features/ai/tools/call.tool.ts +33 -5
- 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 +11 -6
- package/features/ai/tools/studio.tool.ts +26 -21
- package/features/ai/tools/tool-name.ts +3 -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 +296 -744
- package/features/bot/bot.runner.ts +463 -864
- 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/ascii.const.ts +74 -0
- package/features/thursday/components/ascii-field.tsx +24 -44
- package/features/thursday/components/ascii-orb.tsx +525 -381
- package/features/thursday/components/call-log.tsx +46 -44
- package/features/thursday/components/face.tsx +40 -10
- package/features/thursday/components/side-captions.tsx +273 -0
- package/features/thursday/components/tab-state.tsx +14 -6
- package/features/thursday/components/thursday-mark.tsx +1 -0
- package/features/thursday/components/thursday-setting.tsx +633 -333
- package/features/thursday/components/thursday.tsx +315 -274
- package/features/thursday/components/voice-picker.tsx +255 -0
- package/features/thursday/face.store.ts +5 -0
- package/features/thursday/thursday.action.ts +96 -72
- package/features/thursday/thursday.query.ts +49 -30
- package/features/thursday/thursday.schema.ts +37 -35
- package/features/thursday/thursday.store.ts +14 -7
- package/features/thursday/tool-call.ts +3 -3
- package/features/thursday/tool-line.ts +5 -3
- package/features/thursday/use-thursday.ts +801 -457
- package/features/workspace/file-kind.ts +9 -0
- package/features/workspace/workspace.query.ts +17 -0
- package/features/workspace/workspace.ts +82 -36
- package/hooks/use-hotkey.ts +3 -2
- package/lib/live/live.schema.ts +26 -0
- package/lib/live/live.server.ts +153 -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 +38 -0
- package/scripts/bot-context.test.mts +1408 -0
- package/scripts/live-history.test.mts +115 -0
- package/scripts/live-session.test.mts +938 -0
- package/server.js +1 -1
- package/skills/browser/SKILL.md +11 -1
- 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]__026u77e._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__02va5wz._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__050zri4._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0bg9710._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0ffbg85._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0in-d5s._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0ncs9uu._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0pa9k-f._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__0qi_m0e._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__0tq0m_k._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0xep6j_._.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]__144l7qt._.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]__1fizn31._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1jg8t86._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__1lldzy9._.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]__1peqvsi._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1w8gm5h._.js +0 -10
- package/.next/server/chunks/[root-of-the-server]__1xt39nn._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__1zb8mfo._.js +0 -8
- package/.next/server/chunks/_0-73of8._.js +0 -55
- package/.next/server/chunks/_0-fjql4._.js +0 -31
- package/.next/server/chunks/_00xh_q0._.js +0 -25
- package/.next/server/chunks/_051qh8u._.js +0 -3
- package/.next/server/chunks/_05sovvj._.js +0 -3
- package/.next/server/chunks/_091bi8d._.js +0 -3
- package/.next/server/chunks/_0fzqt2y._.js +0 -142
- package/.next/server/chunks/_0lr92vd._.js +0 -3
- package/.next/server/chunks/_0mecv0f._.js +0 -31
- package/.next/server/chunks/_0mh8j4m._.js +0 -3
- package/.next/server/chunks/_0sb7tlz._.js +0 -3
- package/.next/server/chunks/_0si7xzn._.js +0 -3
- package/.next/server/chunks/_0u10wmw._.js +0 -55
- 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/_18d7-5p._.js +0 -3
- package/.next/server/chunks/_1c78vw5._.js +0 -237
- 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/_1zkfbaa._.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 -8
- package/.next/server/chunks/features_bot_0zt92oh._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1jidylq._.js +0 -3
- package/.next/server/chunks/ssr/[externals]__0dizgek._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0-nob52._.js +0 -4
- 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]__0s4wb56._.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]__0sd3izg._.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]__1-13tcn._.js +0 -43
- package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +0 -61
- package/.next/server/chunks/ssr/[root-of-the-server]__1zidpfl._.js +0 -3
- package/.next/server/chunks/ssr/_001_ms1._.js +0 -33
- package/.next/server/chunks/ssr/_01n3o0m._.js +0 -3
- package/.next/server/chunks/ssr/_04z2c7b._.js +0 -3
- package/.next/server/chunks/ssr/_06tssji._.js +0 -3
- package/.next/server/chunks/ssr/_0fk4c7d._.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/_0mggveb._.js +0 -3
- package/.next/server/chunks/ssr/_0nbpc_8._.js +0 -3
- 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/_11j92tu._.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/_1ebxla1._.js +0 -3
- package/.next/server/chunks/ssr/_1nj4niv._.js +0 -42
- package/.next/server/chunks/ssr/_1ov37if._.js +0 -3
- package/.next/server/chunks/ssr/_1ovmc9s._.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/0n3jle9kbqfr2.js +0 -40
- package/.next/static/chunks/0r5qcctujhxli.js +0 -1
- package/.next/static/chunks/10teww7wt-f6h.js +0 -1
- package/.next/static/chunks/126fj4pga_72k.js +0 -1
- package/.next/static/chunks/159udiexf6dom.js +0 -2
- package/.next/static/chunks/18a96rkhi4_yd.js +0 -1
- package/.next/static/chunks/18gi7o2ibrgh8.js +0 -3
- package/.next/static/chunks/1dkjg87pxk0n9.js +0 -28
- package/.next/static/chunks/1q9z1tohil7xn.js +0 -1
- package/.next/static/chunks/1sjgfets224re.js +0 -1
- package/.next/static/chunks/1wszsr83t01gh.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/2szintyibu0s5.js +0 -1
- package/.next/static/chunks/2t4vhi3m8ahya.js +0 -1
- package/.next/static/chunks/2tigdtz3dpcy8.js +0 -1
- package/.next/static/chunks/3-b6b7entqazs.js +0 -1
- package/.next/static/chunks/3786h5vayt80-.js +0 -28
- package/.next/static/chunks/3cq5g494yuke8.css +0 -1
- package/.next/static/chunks/3dmbhsv2u_8kj.js +0 -1
- package/.next/static/chunks/3hibbjnt85-k6.js +0 -1
- package/.next/static/chunks/3i0a5px-oufgc.js +0 -1
- package/.next/static/chunks/3wexk9qo8zuj3.js +0 -18
- package/.next/static/chunks/3xk7yqgomx7yq.js +0 -1
- package/.next/static/chunks/3xre8bu_pk1p_.js +0 -1
- package/.next/static/chunks/3zv6t3i77xhr_.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 -1079
- package/features/bot/task.store.ts +0 -487
- 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/{G6-gNoyGDEcgAsq-L4PE1 → yyRVBc0xxYQsh3GpbQX9b}/_buildManifest.js +0 -0
- /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → yyRVBc0xxYQsh3GpbQX9b}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → yyRVBc0xxYQsh3GpbQX9b}/_ssgManifest.js +0 -0
|
@@ -3,25 +3,25 @@ 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
|
-
|
|
8
|
-
askThursdayTool,
|
|
9
|
-
delegateSpec,
|
|
10
|
-
taskSpec,
|
|
11
|
-
} from "@/features/ai/tools/bot.tool";
|
|
12
|
-
import { CALL_TOOLS } from "@/features/ai/tools/call.tool";
|
|
6
|
+
import { delegateSpec, threadSpec } from "@/features/ai/tools/bot.tool";
|
|
7
|
+
import { callTools } 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";
|
|
15
10
|
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,16 @@ 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
|
+
/** The face can show a word (the ascii orb): the call is given `emote`. */
|
|
47
|
+
faceWords?: boolean;
|
|
46
48
|
}
|
|
47
49
|
| {
|
|
48
50
|
target: "bot";
|
|
49
51
|
/** This run's bot name, the key of the bot table. */
|
|
50
52
|
bot: string;
|
|
51
|
-
/** The browser session this run's shell drives (workspace.ts jobShellEnv):
|
|
53
|
+
/** The browser session this run's shell drives (workspace.ts jobShellEnv): this participant's own in the job. */
|
|
52
54
|
session?: string | null;
|
|
53
55
|
/** 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
56
|
model?: TextModel | null;
|
|
@@ -58,10 +60,10 @@ export type ToolRun =
|
|
|
58
60
|
|
|
59
61
|
/**
|
|
60
62
|
* 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
|
-
*
|
|
63
|
+
* (runner -> bot.run -> this file). `delegate` records which call opened the job, so a
|
|
64
|
+
* later call's prompt finds the job under the line that opened it (Earlier calls).
|
|
63
65
|
*/
|
|
64
|
-
function
|
|
66
|
+
function createThreadTools(callId: string | null | undefined): ToolSet {
|
|
65
67
|
return {
|
|
66
68
|
[TOOL_NAMES.delegate]: tool({
|
|
67
69
|
description: delegateSpec.description,
|
|
@@ -81,8 +83,8 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
|
|
|
81
83
|
}
|
|
82
84
|
|
|
83
85
|
// The row carries the bot's own spelling, not the transcript's
|
|
84
|
-
const {
|
|
85
|
-
const id = await
|
|
86
|
+
const { startThread } = await import("@/features/bot/bot.runner");
|
|
87
|
+
const id = await startThread({
|
|
86
88
|
bot: found.name,
|
|
87
89
|
request,
|
|
88
90
|
label,
|
|
@@ -90,20 +92,20 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
|
|
|
90
92
|
from: "thursday",
|
|
91
93
|
});
|
|
92
94
|
return {
|
|
93
|
-
|
|
95
|
+
threadId: id,
|
|
94
96
|
// The label is the handle: without it in front of her, a follow-up
|
|
95
97
|
// becomes a second job instead of a word to the one running
|
|
96
|
-
note: `${found.name} has "${label}".
|
|
98
|
+
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
99
|
};
|
|
98
100
|
},
|
|
99
101
|
}),
|
|
100
102
|
|
|
101
|
-
[TOOL_NAMES.
|
|
102
|
-
description:
|
|
103
|
-
inputSchema:
|
|
104
|
-
execute: async ({ action,
|
|
105
|
-
const {
|
|
106
|
-
"@/features/bot/
|
|
103
|
+
[TOOL_NAMES.thread]: tool({
|
|
104
|
+
description: threadSpec.description,
|
|
105
|
+
inputSchema: threadSpec.parameters,
|
|
106
|
+
execute: async ({ action, thread, answer, recipient, replyTo }) => {
|
|
107
|
+
const { listThreadOverview, resolveThread } = await import(
|
|
108
|
+
"@/features/bot/thread.query"
|
|
107
109
|
);
|
|
108
110
|
if (action === "status") {
|
|
109
111
|
// `status` only reads, and text left in `answer` reaches nobody — it
|
|
@@ -118,15 +120,21 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
|
|
|
118
120
|
// opened and a call can run for hours; `since` is measured against this.
|
|
119
121
|
const now = { now: clockNow() };
|
|
120
122
|
// A named job comes back whole; the list clips outcomes, and the model pads a clipped answer
|
|
121
|
-
if (
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
123
|
+
if (thread) {
|
|
124
|
+
const one = await resolveThread(thread);
|
|
125
|
+
if (!one) return await noSuchJob(thread);
|
|
126
|
+
const { findThreadView } = await import(
|
|
127
|
+
"@/features/bot/thread.query"
|
|
128
|
+
);
|
|
129
|
+
const room = (await findThreadView(one.id))?.room;
|
|
125
130
|
return {
|
|
126
131
|
...now,
|
|
127
132
|
...dropped,
|
|
128
133
|
label: one.label,
|
|
134
|
+
id: one.id,
|
|
129
135
|
bot: one.bot,
|
|
136
|
+
participants: room?.participants ?? [],
|
|
137
|
+
questions: room?.questions ?? [],
|
|
130
138
|
status: one.status,
|
|
131
139
|
since: formatDistanceToNowStrict(toDate(one.updatedAt), {
|
|
132
140
|
addSuffix: true,
|
|
@@ -137,62 +145,122 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
|
|
|
137
145
|
: {}),
|
|
138
146
|
};
|
|
139
147
|
}
|
|
140
|
-
const
|
|
141
|
-
// No
|
|
148
|
+
const threads = await listThreadOverview();
|
|
149
|
+
// No messages — only as much as is worth reading out: what it is
|
|
142
150
|
// asking, the one line of what it is doing, or how it ended
|
|
143
151
|
return {
|
|
144
152
|
...now,
|
|
145
153
|
...dropped,
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
154
|
+
threads: threads.map((thread) => ({
|
|
155
|
+
id: thread.id,
|
|
156
|
+
label: thread.label,
|
|
157
|
+
bot: thread.bot,
|
|
158
|
+
status: thread.status,
|
|
159
|
+
participants: thread.room.participants,
|
|
160
|
+
questions: thread.room.questions.map((question) => ({
|
|
161
|
+
...question,
|
|
162
|
+
text: clip(question.text, 200),
|
|
163
|
+
})),
|
|
164
|
+
since: formatDistanceToNowStrict(toDate(thread.updatedAt), {
|
|
151
165
|
addSuffix: true,
|
|
152
166
|
}),
|
|
153
|
-
...(
|
|
154
|
-
? { asking:
|
|
167
|
+
...(thread.ask
|
|
168
|
+
? { asking: thread.ask.question, options: thread.ask.options }
|
|
155
169
|
: {}),
|
|
156
|
-
...(
|
|
157
|
-
? { now:
|
|
170
|
+
...(thread.status === "running"
|
|
171
|
+
? { now: threadActivity(thread.lines) }
|
|
158
172
|
: {}),
|
|
159
|
-
...(
|
|
160
|
-
? { outcome: clip(
|
|
173
|
+
...(thread.outcome && thread.status !== "waiting"
|
|
174
|
+
? { outcome: clip(thread.outcome, 200) }
|
|
161
175
|
: {}),
|
|
162
176
|
})),
|
|
163
177
|
};
|
|
164
178
|
}
|
|
165
|
-
// A name is how a job is taken,
|
|
166
|
-
//
|
|
167
|
-
//
|
|
168
|
-
// needs the name: it cannot be taken back.
|
|
169
|
-
const {
|
|
170
|
-
|
|
171
|
-
|
|
179
|
+
// A name is how a job is taken. Unnamed, `open` shows the job that just
|
|
180
|
+
// moved, and `answer` reaches the one open question; words with no question
|
|
181
|
+
// waiting belong to a job the user names, never to whichever moved last.
|
|
182
|
+
// Cancel always needs the name: it cannot be taken back.
|
|
183
|
+
const { listInboxThreads, markSeen } = await import(
|
|
184
|
+
"@/features/bot/thread.query"
|
|
185
|
+
);
|
|
186
|
+
const unnamed = !thread && (action === "answer" || action === "open");
|
|
187
|
+
const inbox = unnamed ? await listInboxThreads() : [];
|
|
188
|
+
const asking =
|
|
189
|
+
action === "answer"
|
|
190
|
+
? inbox.filter((row) => row.room.questions.length)
|
|
191
|
+
: [];
|
|
192
|
+
if (asking.length > 1)
|
|
193
|
+
return `Questions are waiting in more than one job: ${asking
|
|
194
|
+
.map(
|
|
195
|
+
(row) =>
|
|
196
|
+
`"${row.label}" (${row.room.questions.map((question) => question.bot).join(", ")})`,
|
|
197
|
+
)
|
|
198
|
+
.join(", ")}. Name the job.`;
|
|
199
|
+
const one = thread
|
|
200
|
+
? await resolveThread(thread)
|
|
172
201
|
: action === "answer"
|
|
173
|
-
? (
|
|
174
|
-
:
|
|
202
|
+
? (asking[0] ?? null)
|
|
203
|
+
: unnamed
|
|
204
|
+
? (inbox[0] ?? null)
|
|
205
|
+
: null;
|
|
175
206
|
if (!one) {
|
|
176
|
-
if (
|
|
177
|
-
|
|
207
|
+
if (thread) return await noSuchJob(thread);
|
|
208
|
+
if (action === "answer")
|
|
209
|
+
return `No question is waiting. Name the job this is for; \`${TOOL_NAMES.thread}\` \`status\` lists them.`;
|
|
210
|
+
return unnamed
|
|
178
211
|
? "No job has moved yet — say which one, or check `status` first."
|
|
179
212
|
: "Say which job — by its label. Call `status` with no job named to see them.";
|
|
180
213
|
}
|
|
181
214
|
|
|
182
|
-
|
|
215
|
+
if (action === "open") {
|
|
216
|
+
// The room on the call screen draws the inbox; an older job is only in the history
|
|
217
|
+
const room = unnamed ? inbox : await listInboxThreads();
|
|
218
|
+
if (!room.some((row) => row.id === one.id))
|
|
219
|
+
return `"${one.label}" is older than the call screen keeps; it is under Settings › Threads.`;
|
|
220
|
+
const { appEvents } = await import(
|
|
221
|
+
"@/app/api/events/app-event.server"
|
|
222
|
+
);
|
|
223
|
+
appEvents.emit({ type: "showThread", threadId: one.id });
|
|
224
|
+
return { label: one.label, open: true };
|
|
225
|
+
}
|
|
226
|
+
if (action === "seen") {
|
|
227
|
+
// The same as opening it on screen: it leaves the work waiting on the user
|
|
228
|
+
await markSeen([one.id]);
|
|
229
|
+
return { label: one.label, seen: true };
|
|
230
|
+
}
|
|
231
|
+
const { answerThread, cancelThread } = await import(
|
|
183
232
|
"@/features/bot/bot.runner"
|
|
184
233
|
);
|
|
185
234
|
if (action === "cancel") {
|
|
186
|
-
await
|
|
235
|
+
await cancelThread(one.id);
|
|
187
236
|
return { label: one.label, status: "cancelled" };
|
|
188
237
|
}
|
|
189
238
|
if (!answer?.trim()) return "Say what to pass on.";
|
|
190
|
-
|
|
239
|
+
let told: Awaited<ReturnType<typeof answerThread>>;
|
|
240
|
+
try {
|
|
241
|
+
told = await answerThread(
|
|
242
|
+
one.id,
|
|
243
|
+
answer.trim(),
|
|
244
|
+
"thursday",
|
|
245
|
+
recipient ?? undefined,
|
|
246
|
+
replyTo ?? undefined,
|
|
247
|
+
);
|
|
248
|
+
} catch (cause) {
|
|
249
|
+
// Which question, or that it is gone, is the model's to fix: one line it can act on
|
|
250
|
+
if (isPublicError(cause)) return cause.message;
|
|
251
|
+
throw cause;
|
|
252
|
+
}
|
|
253
|
+
if (told?.answered)
|
|
254
|
+
return {
|
|
255
|
+
label: one.label,
|
|
256
|
+
answered: told.answered,
|
|
257
|
+
note: `${told.answered.bot} has the answer to its question and goes on from it.`,
|
|
258
|
+
};
|
|
191
259
|
return {
|
|
192
260
|
// Named even when the model named it: with no job given this is the
|
|
193
261
|
// one that moved last, and saying which makes a wrong one obvious
|
|
194
262
|
label: one.label,
|
|
195
|
-
bot: one.bot,
|
|
263
|
+
bot: told?.to ?? one.bot,
|
|
196
264
|
status: "running",
|
|
197
265
|
note:
|
|
198
266
|
one.status === "running"
|
|
@@ -206,11 +274,11 @@ function createTaskTools(callId: string | null | undefined): ToolSet {
|
|
|
206
274
|
|
|
207
275
|
/** An unresolved reference answers with the recent jobs; a bare "no such job" is read as an error and relayed as one. */
|
|
208
276
|
async function noSuchJob(ref: string): Promise<string> {
|
|
209
|
-
const {
|
|
210
|
-
const recent = await
|
|
277
|
+
const { listThreadOverview } = await import("@/features/bot/thread.query");
|
|
278
|
+
const recent = await listThreadOverview();
|
|
211
279
|
if (!recent.length) return "No jobs have been handed over yet.";
|
|
212
280
|
const names = recent
|
|
213
|
-
.map((
|
|
281
|
+
.map((thread) => `"${thread.label}" (${thread.bot}, ${thread.status})`)
|
|
214
282
|
.join(", ");
|
|
215
283
|
return `There is no job called "${ref}". The latest are: ${names}. Call again with one of those names.`;
|
|
216
284
|
}
|
|
@@ -261,11 +329,16 @@ async function buildTools(run: ToolRun): Promise<ToolSet> {
|
|
|
261
329
|
};
|
|
262
330
|
}
|
|
263
331
|
|
|
264
|
-
// The call's hand
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
332
|
+
// The call's hand; a fact it writes is tied to the call it was said in. A bot
|
|
333
|
+
// is handed only the reads from it (below).
|
|
334
|
+
const { [TOOL_NAMES.memory_conversation]: conversation, ...memory } =
|
|
335
|
+
createMemoryTools(
|
|
336
|
+
"call",
|
|
337
|
+
run.target === "thursday" ? (run.callId ?? null) : null,
|
|
338
|
+
);
|
|
339
|
+
const readBack: ToolSet = {
|
|
340
|
+
[TOOL_NAMES.memory_conversation]: conversation,
|
|
341
|
+
};
|
|
269
342
|
|
|
270
343
|
const sandbox = await openWorkspace();
|
|
271
344
|
|
|
@@ -279,46 +352,46 @@ async function buildTools(run: ToolRun): Promise<ToolSet> {
|
|
|
279
352
|
|
|
280
353
|
return {
|
|
281
354
|
...memory,
|
|
355
|
+
...readBack,
|
|
282
356
|
...skills,
|
|
283
|
-
// The shell alone, for no longer than
|
|
284
|
-
//
|
|
285
|
-
// a job, not a glance (workspace.tool)
|
|
357
|
+
// The shell alone, for no longer than her answer can wait on it (config
|
|
358
|
+
// CALL_EXEC_TIMEOUT_MS). A whole file is a job, not a glance (workspace.tool)
|
|
286
359
|
...createWorkspaceTools(sandbox, {
|
|
287
360
|
write: false,
|
|
288
361
|
timeoutMs: CALL_EXEC_TIMEOUT_MS,
|
|
289
362
|
}),
|
|
290
363
|
// Handing work over, following it, and hanging up belong to the voice session only
|
|
291
|
-
...
|
|
292
|
-
...
|
|
364
|
+
...createThreadTools(run.callId),
|
|
365
|
+
...callTools(run.faceWords ?? false),
|
|
293
366
|
};
|
|
294
367
|
}
|
|
295
368
|
|
|
296
369
|
// 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.
|
|
370
|
+
// The runner attaches messaging with the active continuation (bot.run).
|
|
299
371
|
const skills = await loadSkills(sandbox);
|
|
300
372
|
return {
|
|
301
373
|
// A bot only reads memory: every write is the call's, and there is no screen to show a note on
|
|
302
374
|
[TOOL_NAMES.memory_recall]: memory[TOOL_NAMES.memory_recall],
|
|
303
|
-
|
|
375
|
+
...readBack,
|
|
304
376
|
// Exa when its key is set, else this bot's own model when it can search;
|
|
305
377
|
// absent when neither, and the browser is the way in (search.tool)
|
|
306
378
|
...(await createSearchTool(run.model, sandbox)),
|
|
307
|
-
// The browser rides in the shell: its session is this
|
|
308
|
-
//
|
|
309
|
-
//
|
|
379
|
+
// The browser rides in the shell: its session is this participant's in this job,
|
|
380
|
+
// set by the server rather than typed by the model (workspace.ts jobShellEnv),
|
|
381
|
+
// and so is the bot's artifacts folder
|
|
310
382
|
...createWorkspaceTools(sandbox, {
|
|
311
383
|
write: true,
|
|
312
|
-
env: jobShellEnv(run.session),
|
|
384
|
+
env: { ...jobShellEnv(run.session), ...botShellEnv(run.bot) },
|
|
313
385
|
// What the shell is like and what this machine has, on the first command
|
|
314
|
-
// of the run only (workspace.tool
|
|
386
|
+
// of the run only (workspace.tool SHELL_GUIDE). The call gets no guide:
|
|
315
387
|
// one command is a glance, not a job to plan around
|
|
316
388
|
guide: true,
|
|
389
|
+
// Its own memory stays within its limits whichever of the two writes it
|
|
390
|
+
// (bot.memory), and its finished work stays in its own folder
|
|
391
|
+
bot: run.bot,
|
|
317
392
|
}),
|
|
318
393
|
// Pinned tools come with schemas; the rest sit behind `tool_search`, absent when nothing is left to find (mcp.tool)
|
|
319
394
|
...(await createMcpTools(run.bot, sandbox)),
|
|
320
395
|
...createSkillTools({ sandbox, skills }),
|
|
321
|
-
[TOOL_NAMES.ask_thursday]: askThursdayTool,
|
|
322
|
-
[TOOL_NAMES.answer]: answerTool,
|
|
323
396
|
};
|
|
324
397
|
}
|
|
@@ -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[];
|