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
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { Check, ChevronRight } from "lucide-react";
|
|
3
|
+
import { Check, ChevronDown, ChevronRight } from "lucide-react";
|
|
4
4
|
import { useRouter } from "next/navigation";
|
|
5
5
|
import { type Ref, useEffect, useRef, useState } from "react";
|
|
6
6
|
import { Button } from "@/components/ui/button";
|
|
7
7
|
import { notify } from "@/components/ui/notify";
|
|
8
|
+
import {
|
|
9
|
+
Popover,
|
|
10
|
+
PopoverContent,
|
|
11
|
+
PopoverTrigger,
|
|
12
|
+
} from "@/components/ui/popover";
|
|
8
13
|
import { ShinyText } from "@/components/ui/shiny-text";
|
|
9
14
|
import TextType from "@/components/ui/text-type";
|
|
10
15
|
import { APP_NAME } from "@/config";
|
|
11
16
|
import { ModelPicker } from "@/features/ai/components/model-picker";
|
|
12
17
|
import { type TextModelProviderId } from "@/features/ai/model.schema";
|
|
13
|
-
import {
|
|
18
|
+
import { TOOL_NAMES } from "@/features/ai/tools/tool-name";
|
|
19
|
+
import { type BotIcon, DEFAULT_BOT } from "@/features/bot/bot.schema";
|
|
14
20
|
import {
|
|
15
21
|
BOT_SEEDS,
|
|
16
22
|
type BotSeed,
|
|
@@ -46,15 +52,14 @@ export function Intro({
|
|
|
46
52
|
ready,
|
|
47
53
|
/** Opened deliberately via `?intro`. */
|
|
48
54
|
forced,
|
|
49
|
-
/** One
|
|
50
|
-
|
|
55
|
+
/** One face per BOT_SEEDS entry (bot.seed rollSeedIcons), rolled on the server so hydration keeps the same faces. */
|
|
56
|
+
icons,
|
|
51
57
|
}: {
|
|
52
58
|
ready: boolean;
|
|
53
59
|
forced: boolean;
|
|
54
|
-
|
|
60
|
+
icons: BotIcon[];
|
|
55
61
|
}) {
|
|
56
|
-
const
|
|
57
|
-
colors[BOT_SEEDS.indexOf(seed)] ?? seed.icon?.color;
|
|
62
|
+
const face = (seed: BotSeed) => icons[BOT_SEEDS.indexOf(seed)];
|
|
58
63
|
|
|
59
64
|
const router = useRouter();
|
|
60
65
|
const [at, setAt] = useState(0);
|
|
@@ -62,14 +67,14 @@ export function Intro({
|
|
|
62
67
|
/** After the fade; then the element is removed entirely. */
|
|
63
68
|
const [lifted, setLifted] = useState(false);
|
|
64
69
|
const [keyed, setKeyed] = useState(ready);
|
|
65
|
-
const [
|
|
70
|
+
const [picked, setPicked] = useState<Record<string, boolean>>(() =>
|
|
66
71
|
Object.fromEntries(
|
|
67
|
-
|
|
68
|
-
seed.name,
|
|
69
|
-
{ on: true, provider: null, model: "" },
|
|
70
|
-
]),
|
|
72
|
+
BOT_SEEDS.map((seed) => [seed.name, Boolean(seed.recommended)]),
|
|
71
73
|
),
|
|
72
74
|
);
|
|
75
|
+
// One model for every pick: a picker per bot is what made the step scroll.
|
|
76
|
+
// Each bot's own is on its page in Settings › Bots
|
|
77
|
+
const [runsOn, setRunsOn] = useState<RunsOn>({ provider: null, model: "" });
|
|
73
78
|
const keys = useRef<VoiceKeysHandle>(null);
|
|
74
79
|
const [saving, setSaving] = useState(false);
|
|
75
80
|
|
|
@@ -112,20 +117,20 @@ export function Intro({
|
|
|
112
117
|
setGone(true);
|
|
113
118
|
if (!keyed) return;
|
|
114
119
|
installSeedBots(
|
|
115
|
-
|
|
120
|
+
BOT_SEEDS.filter((seed) => picked[seed.name]).map((seed) => ({
|
|
116
121
|
name: seed.name,
|
|
117
122
|
// A half pick is not a model; the action falls back to the default
|
|
118
|
-
provider:
|
|
119
|
-
model:
|
|
120
|
-
|
|
123
|
+
provider: runsOn.provider,
|
|
124
|
+
model: runsOn.model || null,
|
|
125
|
+
icon: face(seed),
|
|
121
126
|
})),
|
|
122
127
|
);
|
|
123
128
|
router.replace("/");
|
|
124
129
|
router.refresh();
|
|
125
130
|
};
|
|
126
131
|
|
|
127
|
-
const
|
|
128
|
-
|
|
132
|
+
const toggle = (name: string) =>
|
|
133
|
+
setPicked((all) => ({ ...all, [name]: !all[name] }));
|
|
129
134
|
|
|
130
135
|
return (
|
|
131
136
|
<div
|
|
@@ -143,9 +148,17 @@ export function Intro({
|
|
|
143
148
|
/>
|
|
144
149
|
|
|
145
150
|
<div className="absolute inset-x-12 top-22 bottom-44 flex flex-col items-center justify-center overflow-y-auto">
|
|
146
|
-
{at === 0 && <FirstLook
|
|
151
|
+
{at === 0 && <FirstLook face={face} />}
|
|
147
152
|
{at === 1 && <KeyStep ref={keys} onSaved={() => setKeyed(true)} />}
|
|
148
|
-
{at === 2 &&
|
|
153
|
+
{at === 2 && (
|
|
154
|
+
<BotStep
|
|
155
|
+
picked={picked}
|
|
156
|
+
runsOn={runsOn}
|
|
157
|
+
face={face}
|
|
158
|
+
onToggle={toggle}
|
|
159
|
+
onRunsOn={setRunsOn}
|
|
160
|
+
/>
|
|
161
|
+
)}
|
|
149
162
|
</div>
|
|
150
163
|
|
|
151
164
|
<div className="absolute inset-x-0 bottom-13 flex flex-col items-center gap-5.5">
|
|
@@ -195,7 +208,7 @@ export function Intro({
|
|
|
195
208
|
}
|
|
196
209
|
|
|
197
210
|
/** Step one: the three lines the call screen actually draws, no chat bubbles. */
|
|
198
|
-
function FirstLook({
|
|
211
|
+
function FirstLook({ face }: { face: Face }) {
|
|
199
212
|
const crew = RECOMMENDED_SEEDS;
|
|
200
213
|
|
|
201
214
|
return (
|
|
@@ -210,10 +223,7 @@ function FirstLook({ ink }: { ink: Ink }) {
|
|
|
210
223
|
key={seed.name}
|
|
211
224
|
size={22}
|
|
212
225
|
seed={seed.name}
|
|
213
|
-
|
|
214
|
-
color={ink(seed)}
|
|
215
|
-
shape={seed.icon?.shape}
|
|
216
|
-
outline={seed.icon?.outline}
|
|
226
|
+
{...face(seed)}
|
|
217
227
|
state="thinking"
|
|
218
228
|
notify={false}
|
|
219
229
|
className={cn("shrink-0", index > 0 && "-ml-1.5")}
|
|
@@ -224,7 +234,7 @@ function FirstLook({ ink }: { ink: Ink }) {
|
|
|
224
234
|
{crew.length === 1 ? "A bot is on it" : "Bots are on it"}
|
|
225
235
|
</span>
|
|
226
236
|
<span className="font-mono text-[10.5px] text-muted-foreground/70">
|
|
227
|
-
|
|
237
|
+
{TOOL_NAMES.delegate}
|
|
228
238
|
</span>
|
|
229
239
|
</span>
|
|
230
240
|
|
|
@@ -272,59 +282,68 @@ function KeyStep({
|
|
|
272
282
|
);
|
|
273
283
|
}
|
|
274
284
|
|
|
275
|
-
/** The
|
|
276
|
-
const COUNT_WORD: Record<number, string> = {
|
|
285
|
+
/** The heading spells how many come along, up to every seed there is. */
|
|
286
|
+
const COUNT_WORD: Record<number, string> = {
|
|
287
|
+
0: "No",
|
|
288
|
+
1: "One",
|
|
289
|
+
2: "Two",
|
|
290
|
+
3: "Three",
|
|
291
|
+
4: "Four",
|
|
292
|
+
5: "Five",
|
|
293
|
+
6: "Six",
|
|
294
|
+
7: "Seven",
|
|
295
|
+
8: "Eight",
|
|
296
|
+
};
|
|
277
297
|
|
|
278
|
-
/** This intro's
|
|
279
|
-
type
|
|
298
|
+
/** This intro's face for a seed (bot.seed rollSeedIcons). */
|
|
299
|
+
type Face = (seed: BotSeed) => BotIcon | undefined;
|
|
280
300
|
|
|
281
|
-
/**
|
|
282
|
-
type
|
|
283
|
-
on: boolean;
|
|
284
|
-
provider: TextModelProviderId | null;
|
|
285
|
-
model: string;
|
|
286
|
-
};
|
|
301
|
+
/** The one model every picked bot starts on. An empty model means "app default" at run time. */
|
|
302
|
+
type RunsOn = { provider: TextModelProviderId | null; model: string };
|
|
287
303
|
|
|
288
|
-
/** Step three: which seed bots to install. */
|
|
304
|
+
/** Step three: which seed bots to install, and what they run on. */
|
|
289
305
|
function BotStep({
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
306
|
+
picked,
|
|
307
|
+
runsOn,
|
|
308
|
+
face,
|
|
309
|
+
onToggle,
|
|
310
|
+
onRunsOn,
|
|
293
311
|
}: {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
312
|
+
picked: Record<string, boolean>;
|
|
313
|
+
runsOn: RunsOn;
|
|
314
|
+
face: Face;
|
|
315
|
+
onToggle: (name: string) => void;
|
|
316
|
+
onRunsOn: (next: RunsOn) => void;
|
|
297
317
|
}) {
|
|
298
|
-
const on =
|
|
299
|
-
const
|
|
318
|
+
const on = BOT_SEEDS.filter((seed) => picked[seed.name]);
|
|
319
|
+
const names = on.map((seed) => seed.name).join(", ");
|
|
320
|
+
const more = BOT_SEEDS.length - on.length;
|
|
300
321
|
|
|
301
322
|
return (
|
|
302
323
|
<div className="flex w-full max-w-2xl flex-col items-center">
|
|
303
324
|
<h1 className="text-center text-[30px] font-medium tracking-tight text-balance break-keep">
|
|
304
|
-
{
|
|
325
|
+
{on.length === 1
|
|
305
326
|
? "One bot comes with her."
|
|
306
|
-
: `${COUNT_WORD[
|
|
327
|
+
: `${COUNT_WORD[on.length] ?? on.length} bots come with her.`}
|
|
307
328
|
</h1>
|
|
308
329
|
<p className="mt-3 max-w-lg text-center text-[15px] leading-relaxed text-pretty text-muted-foreground break-keep">
|
|
309
|
-
{
|
|
330
|
+
{on.length === 1
|
|
310
331
|
? "It takes the work that would leave the call silent, and reports back."
|
|
311
332
|
: "They take the work that would leave the call silent, and report back."}
|
|
312
333
|
</p>
|
|
313
334
|
|
|
314
|
-
{/* The pill
|
|
335
|
+
{/* The pill the bots will stand in (bot-room Folded), with the whole crew in
|
|
336
|
+
it: who comes along is the line below */}
|
|
315
337
|
<span className="mt-5 flex h-9 items-center gap-2 rounded-full bg-muted/50 py-1.5 pr-3.5 pl-1.5 ring-1 ring-border/60">
|
|
316
338
|
{on.length > 0 ? (
|
|
317
339
|
<>
|
|
318
340
|
<span className="flex">
|
|
319
|
-
{
|
|
341
|
+
{BOT_SEEDS.map((seed, index) => (
|
|
320
342
|
<BotMark
|
|
321
343
|
key={seed.name}
|
|
322
344
|
size={22}
|
|
323
345
|
seed={seed.name}
|
|
324
|
-
|
|
325
|
-
color={ink(seed)}
|
|
326
|
-
shape={seed.icon?.shape}
|
|
327
|
-
outline={seed.icon?.outline}
|
|
346
|
+
{...face(seed)}
|
|
328
347
|
notify={false}
|
|
329
348
|
className={cn("shrink-0", index > 0 && "-ml-1.5")}
|
|
330
349
|
/>
|
|
@@ -343,104 +362,115 @@ function BotStep({
|
|
|
343
362
|
)}
|
|
344
363
|
</span>
|
|
345
364
|
|
|
346
|
-
{/*
|
|
347
|
-
|
|
348
|
-
<
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
365
|
+
{/* Every seed, behind one line: listed in place with a model row each, they
|
|
366
|
+
scrolled the step (canvas "Intro Bot Picker" C) */}
|
|
367
|
+
<Popover>
|
|
368
|
+
<PopoverTrigger
|
|
369
|
+
render={
|
|
370
|
+
<button
|
|
371
|
+
type="button"
|
|
372
|
+
className="group/seeds mt-4 flex h-12 w-full max-w-lg items-center gap-2 rounded-lg border border-border bg-background pr-3 pl-3.5 text-left outline-none transition-colors hover:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 data-popup-open:bg-muted"
|
|
373
|
+
/>
|
|
374
|
+
}
|
|
375
|
+
>
|
|
376
|
+
<span className="min-w-0 flex-1 truncate text-[14px] leading-5">
|
|
377
|
+
<span className="font-medium">
|
|
378
|
+
{names || "Pick who comes along"}
|
|
379
|
+
</span>
|
|
380
|
+
{names && more > 0 && (
|
|
381
|
+
<span className="text-muted-foreground">
|
|
382
|
+
{" "}
|
|
383
|
+
· {more} more to pick
|
|
384
|
+
</span>
|
|
385
|
+
)}
|
|
386
|
+
</span>
|
|
387
|
+
<ChevronDown className="size-4 shrink-0 text-muted-foreground transition-transform group-data-popup-open/seeds:rotate-180" />
|
|
388
|
+
</PopoverTrigger>
|
|
389
|
+
<PopoverContent
|
|
390
|
+
align="start"
|
|
391
|
+
sideOffset={6}
|
|
392
|
+
className="w-(--anchor-width) gap-0 p-1"
|
|
393
|
+
>
|
|
394
|
+
<p className="px-1.5 py-1 text-xs font-medium text-muted-foreground">
|
|
395
|
+
Bots
|
|
396
|
+
</p>
|
|
397
|
+
{BOT_SEEDS.map((seed) => (
|
|
398
|
+
<SeedOption
|
|
399
|
+
key={seed.name}
|
|
400
|
+
seed={seed}
|
|
401
|
+
on={Boolean(picked[seed.name])}
|
|
402
|
+
icon={face(seed)}
|
|
403
|
+
onToggle={() => onToggle(seed.name)}
|
|
404
|
+
/>
|
|
405
|
+
))}
|
|
406
|
+
<div className="-mx-1 my-1 h-px bg-border" />
|
|
407
|
+
<div className="flex items-center gap-2 px-1.5 pt-1 pb-0.5">
|
|
408
|
+
<span className="shrink-0 pr-0.5 text-[13px] text-muted-foreground">
|
|
409
|
+
Runs on
|
|
410
|
+
</span>
|
|
411
|
+
<div className="min-w-0 flex-1">
|
|
412
|
+
<ModelPicker
|
|
413
|
+
provider={runsOn.provider}
|
|
414
|
+
model={runsOn.model}
|
|
415
|
+
onChange={onRunsOn}
|
|
416
|
+
/>
|
|
417
|
+
</div>
|
|
418
|
+
</div>
|
|
419
|
+
</PopoverContent>
|
|
420
|
+
</Popover>
|
|
367
421
|
</div>
|
|
368
422
|
);
|
|
369
423
|
}
|
|
370
424
|
|
|
371
425
|
/**
|
|
372
|
-
* One seed
|
|
373
|
-
*
|
|
374
|
-
*
|
|
426
|
+
* One seed in the list: face, name and its hint on one line, and whether it
|
|
427
|
+
* comes along. The hint is the bot form's one line (bot.seed), so it truncates
|
|
428
|
+
* rather than wraps.
|
|
375
429
|
*/
|
|
376
|
-
function
|
|
430
|
+
function SeedOption({
|
|
377
431
|
seed,
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
432
|
+
on,
|
|
433
|
+
icon,
|
|
434
|
+
onToggle,
|
|
381
435
|
}: {
|
|
382
436
|
seed: BotSeed;
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
437
|
+
on: boolean;
|
|
438
|
+
icon?: BotIcon;
|
|
439
|
+
onToggle: () => void;
|
|
386
440
|
}) {
|
|
387
|
-
const on = Boolean(pick?.on);
|
|
388
|
-
|
|
389
441
|
return (
|
|
390
|
-
<
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
442
|
+
<button
|
|
443
|
+
type="button"
|
|
444
|
+
onClick={onToggle}
|
|
445
|
+
aria-pressed={on}
|
|
446
|
+
className="flex w-full items-center gap-2.5 rounded-md p-1.5 text-left outline-none hover:bg-muted focus-visible:bg-muted"
|
|
395
447
|
>
|
|
396
|
-
<
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
shape={seed.icon?.shape}
|
|
408
|
-
outline={seed.icon?.outline}
|
|
409
|
-
state={on ? "thinking" : "idle"}
|
|
410
|
-
notify={false}
|
|
411
|
-
className={cn("shrink-0 transition-opacity", !on && "opacity-35")}
|
|
412
|
-
/>
|
|
413
|
-
|
|
414
|
-
<span className="min-w-0 flex-1 space-y-px">
|
|
415
|
-
<span className="block text-[14px] leading-[18px] font-medium">
|
|
416
|
-
{seed.name}
|
|
417
|
-
</span>
|
|
418
|
-
<span className="block truncate text-[12px] leading-[17px] text-muted-foreground">
|
|
419
|
-
{seed.hint}
|
|
420
|
-
</span>
|
|
448
|
+
<BotMark
|
|
449
|
+
size={20}
|
|
450
|
+
seed={seed.name}
|
|
451
|
+
{...icon}
|
|
452
|
+
state={on ? "thinking" : "idle"}
|
|
453
|
+
notify={false}
|
|
454
|
+
className={cn("shrink-0 transition-opacity", !on && "opacity-35")}
|
|
455
|
+
/>
|
|
456
|
+
<span className="flex min-w-0 flex-1 items-baseline gap-2">
|
|
457
|
+
<span className="shrink-0 text-[14px] leading-5 font-medium">
|
|
458
|
+
{seed.name}
|
|
421
459
|
</span>
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
className={cn(
|
|
425
|
-
"grid size-5 shrink-0 place-items-center rounded-full transition-colors",
|
|
426
|
-
on
|
|
427
|
-
? "bg-foreground text-background"
|
|
428
|
-
: "ring-1 ring-border/60 ring-inset",
|
|
429
|
-
)}
|
|
430
|
-
>
|
|
431
|
-
{on && <Check className="size-3" />}
|
|
460
|
+
<span className="truncate text-[12px] leading-5 text-muted-foreground">
|
|
461
|
+
{seed.hint}
|
|
432
462
|
</span>
|
|
433
|
-
</
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
</
|
|
463
|
+
</span>
|
|
464
|
+
<span
|
|
465
|
+
className={cn(
|
|
466
|
+
"grid size-4 shrink-0 place-items-center rounded-full transition-colors",
|
|
467
|
+
on
|
|
468
|
+
? "bg-foreground text-background"
|
|
469
|
+
: "ring-1 ring-border ring-inset",
|
|
470
|
+
)}
|
|
471
|
+
>
|
|
472
|
+
{on && <Check className="size-2.5" />}
|
|
473
|
+
</span>
|
|
474
|
+
</button>
|
|
445
475
|
);
|
|
446
476
|
}
|
|
@@ -48,7 +48,7 @@ const SECTIONS: { key: MemorySection; label: string }[] = [
|
|
|
48
48
|
{ key: "people", label: "People" },
|
|
49
49
|
{ key: "projects", label: "Projects" },
|
|
50
50
|
{ key: "topics", label: "Topics" },
|
|
51
|
-
{ key: "
|
|
51
|
+
{ key: "other", label: "Other" },
|
|
52
52
|
];
|
|
53
53
|
|
|
54
54
|
export function MemorySetting() {
|
|
@@ -94,11 +94,6 @@ export function MemorySetting() {
|
|
|
94
94
|
<Fragment key={key}>
|
|
95
95
|
<span className="px-3 pt-3 pb-1 font-mono text-[10px] text-muted-foreground/60">
|
|
96
96
|
{label}
|
|
97
|
-
{key === "inbox" && (
|
|
98
|
-
<span className="pl-1.5 text-muted-foreground/50">
|
|
99
|
-
waiting to be filed
|
|
100
|
-
</span>
|
|
101
|
-
)}
|
|
102
97
|
</span>
|
|
103
98
|
{rows.map((note) => (
|
|
104
99
|
<NoteLink
|
|
@@ -457,7 +452,7 @@ const NOTE_KINDS = [
|
|
|
457
452
|
},
|
|
458
453
|
] as const;
|
|
459
454
|
|
|
460
|
-
/** Kind + name becomes the path; profile and
|
|
455
|
+
/** Kind + name becomes the path; profile and preferences stay agent-managed. */
|
|
461
456
|
export function openMemoryCreate() {
|
|
462
457
|
return notify.component({
|
|
463
458
|
className: "sm:max-w-lg",
|
|
@@ -52,7 +52,6 @@ export const MemoryNoteSchema = z.object({
|
|
|
52
52
|
facts: MemoryFactSchema.array(),
|
|
53
53
|
});
|
|
54
54
|
|
|
55
|
-
export type MemoryFact = z.infer<typeof MemoryFactSchema>;
|
|
56
55
|
export type MemoryNote = z.infer<typeof MemoryNoteSchema>;
|
|
57
56
|
|
|
58
57
|
/**
|
|
@@ -71,16 +70,12 @@ export const MEMORY_PATHS = [
|
|
|
71
70
|
of: "Something with an end — a trip, a purchase, a deadline, a thing being built",
|
|
72
71
|
},
|
|
73
72
|
{ path: "topics/", of: "Something ongoing that keeps coming back" },
|
|
74
|
-
{ path: "inbox", of: "Nowhere obvious yet" },
|
|
75
73
|
] as const;
|
|
76
74
|
|
|
77
|
-
/** Where anything outside the convention lands. */
|
|
78
|
-
export const MEMORY_INBOX = "inbox";
|
|
79
|
-
|
|
80
75
|
/** Notes without a section. */
|
|
81
76
|
export const MEMORY_ROOT_NOTES = MEMORY_PATHS.filter(
|
|
82
77
|
(entry) => !entry.path.endsWith("/"),
|
|
83
|
-
).map((entry) => entry.path) as ("profile" | "preferences"
|
|
78
|
+
).map((entry) => entry.path) as ("profile" | "preferences")[];
|
|
84
79
|
|
|
85
80
|
/** Notes about a named thing live under one of these. */
|
|
86
81
|
export const MEMORY_SECTIONS = MEMORY_PATHS.filter((entry) =>
|
|
@@ -97,31 +92,27 @@ const MEMORY_PATH_RE = new RegExp(
|
|
|
97
92
|
|
|
98
93
|
export const isMemoryPath = (path: string) => MEMORY_PATH_RE.test(path);
|
|
99
94
|
|
|
100
|
-
/**
|
|
95
|
+
/**
|
|
96
|
+
* Notes that stay listed with zero facts. Their listing line is the app's, not
|
|
97
|
+
* a model's: memory.query ensureRootNotes resets it at boot and a model's
|
|
98
|
+
* `description` for one is ignored (ai/tools/memory.tool), so the line cannot
|
|
99
|
+
* drift with whoever wrote last.
|
|
100
|
+
*/
|
|
101
101
|
export const MEMORY_ALWAYS_LISTED: string[] = ["profile", "preferences"];
|
|
102
102
|
|
|
103
103
|
export const isAlwaysListed = (path: string) =>
|
|
104
104
|
MEMORY_ALWAYS_LISTED.includes(path);
|
|
105
105
|
|
|
106
|
-
/**
|
|
107
|
-
* Notes whose listing line the app writes rather than a model: the two root
|
|
108
|
-
* notes it keeps (memory.query ensureRootNotes) and the inbox, which is where
|
|
109
|
-
* a fact lands when its path is not one this listing can carry. A model's
|
|
110
|
-
* `description` for one of these is ignored, so the line cannot drift with
|
|
111
|
-
* whoever wrote last (ai/tools/memory.tool).
|
|
112
|
-
*/
|
|
113
|
-
export const APP_NAMED_NOTES = [...MEMORY_ALWAYS_LISTED, MEMORY_INBOX];
|
|
114
|
-
|
|
115
|
-
export const isAppNamed = (path: string) => APP_NAMED_NOTES.includes(path);
|
|
116
|
-
|
|
117
106
|
/** The line the app writes for one of those. */
|
|
118
107
|
export const appNoteLine = (path: string) =>
|
|
119
108
|
MEMORY_PATHS.find((entry) => entry.path === path)?.of ?? null;
|
|
120
109
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
110
|
+
/**
|
|
111
|
+
* `other` holds a path outside the convention. A model cannot create one
|
|
112
|
+
* (memory_remember refuses it), so only rows older than that rule land there,
|
|
113
|
+
* kept on screen to open and delete.
|
|
114
|
+
*/
|
|
115
|
+
export type MemorySection = "you" | (typeof MEMORY_SECTIONS)[number] | "other";
|
|
125
116
|
|
|
126
117
|
/** How the screen groups notes; derived from MEMORY_PATHS. */
|
|
127
118
|
export function sectionOf(path: string): MemorySection {
|
|
@@ -129,7 +120,7 @@ export function sectionOf(path: string): MemorySection {
|
|
|
129
120
|
const head = path.slice(0, path.indexOf("/"));
|
|
130
121
|
return (MEMORY_SECTIONS as readonly string[]).includes(head)
|
|
131
122
|
? (head as (typeof MEMORY_SECTIONS)[number])
|
|
132
|
-
:
|
|
123
|
+
: "other";
|
|
133
124
|
}
|
|
134
125
|
|
|
135
126
|
// Model-facing shapes: narrower than the UI's on purpose.
|
|
@@ -4,7 +4,6 @@ import { Check, Plus, Search } from "lucide-react";
|
|
|
4
4
|
import { Fragment, type ReactNode } from "react";
|
|
5
5
|
import { Input } from "@/components/ui/input";
|
|
6
6
|
import { Skeleton } from "@/components/ui/skeleton";
|
|
7
|
-
import { Switch } from "@/components/ui/switch";
|
|
8
7
|
import { cn, WAITING_INK } from "@/lib/utils";
|
|
9
8
|
|
|
10
9
|
/** Shared layout for settings screens: a list, dialogs for everything else. */
|
|
@@ -413,49 +412,6 @@ export function SettingNote({
|
|
|
413
412
|
);
|
|
414
413
|
}
|
|
415
414
|
|
|
416
|
-
/**
|
|
417
|
-
* A setting that runs by itself: one switch, and what it reveals while it is
|
|
418
|
-
* on. Tinted rather than bordered — what it holds is state, not a set to pick
|
|
419
|
-
* from. Its description is a sentence that wraps, so it gets its own leading;
|
|
420
|
-
* a row's second line, which is one line of state, stays tight.
|
|
421
|
-
*/
|
|
422
|
-
export function SettingToggle({
|
|
423
|
-
label,
|
|
424
|
-
description,
|
|
425
|
-
checked,
|
|
426
|
-
disabled,
|
|
427
|
-
onChange,
|
|
428
|
-
children,
|
|
429
|
-
}: {
|
|
430
|
-
label: string;
|
|
431
|
-
description: ReactNode;
|
|
432
|
-
checked: boolean;
|
|
433
|
-
/** Holds the switch while its state is still arriving. */
|
|
434
|
-
disabled?: boolean;
|
|
435
|
-
onChange: (on: boolean) => void;
|
|
436
|
-
/** Drawn under the switch while it is on. */
|
|
437
|
-
children?: ReactNode;
|
|
438
|
-
}) {
|
|
439
|
-
return (
|
|
440
|
-
<div className="space-y-3 rounded-xl bg-muted/30 p-4">
|
|
441
|
-
<label className="flex items-center gap-4">
|
|
442
|
-
<span className="min-w-0 flex-1 space-y-1">
|
|
443
|
-
<span className="block text-sm font-medium">{label}</span>
|
|
444
|
-
<span className="block text-xs leading-relaxed text-muted-foreground">
|
|
445
|
-
{description}
|
|
446
|
-
</span>
|
|
447
|
-
</span>
|
|
448
|
-
<Switch
|
|
449
|
-
checked={checked}
|
|
450
|
-
disabled={disabled}
|
|
451
|
-
onCheckedChange={onChange}
|
|
452
|
-
/>
|
|
453
|
-
</label>
|
|
454
|
-
{checked && children}
|
|
455
|
-
</div>
|
|
456
|
-
);
|
|
457
|
-
}
|
|
458
|
-
|
|
459
415
|
/** Pick one row. Disabled options stay listed with the reason in the hint slot. */
|
|
460
416
|
export function SettingChoiceRows<T extends string>({
|
|
461
417
|
options,
|
|
@@ -27,7 +27,7 @@ import { Segmented } from "@/components/ui/segmented";
|
|
|
27
27
|
import { ArtifactMark } from "@/features/artifact/components/artifact-mark";
|
|
28
28
|
import { BotBadge } from "@/features/bot/components/bot-badge";
|
|
29
29
|
import { BotsMark } from "@/features/bot/components/bot-mark";
|
|
30
|
-
import {
|
|
30
|
+
import { ThreadBadge } from "@/features/bot/components/thread-badge";
|
|
31
31
|
import { ConfigBadge } from "@/features/config/components/config-badge";
|
|
32
32
|
import { ModelsBadge } from "@/features/config/components/models-badge";
|
|
33
33
|
import { McpBadge } from "@/features/connectors/components/mcp-badge";
|
|
@@ -70,9 +70,9 @@ const BotSetting = lazySection(
|
|
|
70
70
|
})),
|
|
71
71
|
SettingPanesSkeleton,
|
|
72
72
|
);
|
|
73
|
-
const
|
|
74
|
-
import("@/features/bot/components/
|
|
75
|
-
default: m.
|
|
73
|
+
const ThreadSetting = lazySection(() =>
|
|
74
|
+
import("@/features/bot/components/thread-setting").then((m) => ({
|
|
75
|
+
default: m.ThreadSetting,
|
|
76
76
|
})),
|
|
77
77
|
);
|
|
78
78
|
const ConfigSetting = lazySection(() =>
|
|
@@ -134,7 +134,7 @@ export const SECTIONS: readonly {
|
|
|
134
134
|
id: "thursday",
|
|
135
135
|
label: "Thursday",
|
|
136
136
|
group: "call",
|
|
137
|
-
hint: "Her face,
|
|
137
|
+
hint: "Her face, models, and how a call starts",
|
|
138
138
|
icon: ThursdayAsciiMark,
|
|
139
139
|
Component: ThursdaySetting,
|
|
140
140
|
},
|
|
@@ -156,13 +156,13 @@ export const SECTIONS: readonly {
|
|
|
156
156
|
Badge: BotBadge,
|
|
157
157
|
},
|
|
158
158
|
{
|
|
159
|
-
id: "
|
|
160
|
-
label: "
|
|
159
|
+
id: "threads",
|
|
160
|
+
label: "Threads",
|
|
161
161
|
group: "work",
|
|
162
162
|
hint: "Jobs the bots were handed, and what came of them",
|
|
163
163
|
icon: ListChecks,
|
|
164
|
-
Component:
|
|
165
|
-
Badge:
|
|
164
|
+
Component: ThreadSetting,
|
|
165
|
+
Badge: ThreadBadge,
|
|
166
166
|
},
|
|
167
167
|
{
|
|
168
168
|
id: "artifact",
|
|
@@ -297,11 +297,11 @@ export function Settings({ children }: { children?: ReactElement }) {
|
|
|
297
297
|
return (
|
|
298
298
|
<Dialog open={open} onOpenChange={(next) => (next ? show() : hide())}>
|
|
299
299
|
{children && <DialogTrigger render={children} />}
|
|
300
|
-
|
|
300
|
+
{/* block, not grid: a popup portaled in here (the thread sheet and anything it opens) would take a row */}
|
|
301
|
+
<DialogContent className="block h-[min(52rem,calc(100vh-3rem))] overflow-hidden p-0 sm:max-w-[min(80rem,calc(100vw-3rem))]">
|
|
301
302
|
<DialogTitle className="sr-only">Settings</DialogTitle>
|
|
302
303
|
|
|
303
|
-
|
|
304
|
-
<div className="flex h-full min-h-0 min-w-0">
|
|
304
|
+
<div className="flex h-full min-h-0">
|
|
305
305
|
<nav
|
|
306
306
|
aria-label="Settings sections"
|
|
307
307
|
onKeyDown={(event) => {
|