thursday-agent 0.5.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 +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 +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_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_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 -97
- 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/{_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/{_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/_1anqots._.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/_1k0spz7._.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/{_0rzucul._.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_1y79i83._.js → node_modules_00_51_v._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0m383r2._.js → node_modules_022sipm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_05-n6dz._.js → node_modules_0332gw4._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0zeg3x_._.js → node_modules_04vxchl._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_07dsgkx._.js → node_modules_0746rzi._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0fkeku3._.js → node_modules_0d5uzof._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1k6n600._.js → node_modules_0exkwcm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_16mkxuo._.js → node_modules_0fr-ml8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0iur59s._.js → node_modules_0mxvg8h._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1j8j4pt._.js → node_modules_0qapgjr._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_20c28js._.js → node_modules_0qbfyjh._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1k7z2j6._.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_1chvq5f._.js → node_modules_0vsxbzp._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_04sksn9._.js → node_modules_0vv0-fg._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1k8j8n0._.js → node_modules_0wsvp00._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1lz0oxc._.js → node_modules_1-urho9._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1-y7nni._.js → node_modules_16pi_dd._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1uyk91w._.js → node_modules_1d53yiq._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0bvopy2._.js → node_modules_1g1eihe._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1a0kmjl._.js → node_modules_1gpednh._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0u9da1h._.js → node_modules_1gu1pph._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_056qgf-._.js → node_modules_1he1w8_._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0-dr_o7._.js → node_modules_1lnjapm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1t77e4n._.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_0ifp389._.js → node_modules_1u6w1pb._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1x0ztf4._.js → node_modules_1xn6saw._.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_067_exa._.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_0nrrdaq._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@vercel_oidc_dist_1o553h-._.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/{435atsnhs7ksu.js → 1i-u2wzub_to1.js} +7 -7
- 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/{408ueu4hfvcg7.js → 1wlo979mx-y3w.js} +1 -1
- package/.next/static/chunks/26ql4y-43xwhp.js +1 -0
- package/.next/static/chunks/{11r2yp_yh9_qn.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 +11 -6
- 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 +296 -744
- package/features/bot/bot.runner.ts +461 -862
- 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 +82 -36
- 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 +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/_0m2lsd1._.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 → 0qzGoKn2wTERVZtblX1tp}/_buildManifest.js +0 -0
- /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → 0qzGoKn2wTERVZtblX1tp}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → 0qzGoKn2wTERVZtblX1tp}/_ssgManifest.js +0 -0
|
@@ -3,6 +3,7 @@ import { type ToolSet, tool } from "ai";
|
|
|
3
3
|
import z from "zod";
|
|
4
4
|
import { EXEC_TIMEOUT_MS } from "@/config";
|
|
5
5
|
import { TOOL_NAMES } from "@/features/ai/tools/tool-name";
|
|
6
|
+
import { holdBotMemory, keepBotMemory } from "@/features/bot/bot.memory";
|
|
6
7
|
import { writeRefusal } from "@/features/workspace/workspace";
|
|
7
8
|
import type { Sandbox } from "@/lib/sandbox";
|
|
8
9
|
|
|
@@ -20,6 +21,12 @@ export const createWorkspaceTools = (
|
|
|
20
21
|
guide?: boolean;
|
|
21
22
|
/** How long one command may run; unset is the sandbox's own limit (config EXEC_TIMEOUT_MS). */
|
|
22
23
|
timeoutMs?: number;
|
|
24
|
+
/**
|
|
25
|
+
* The bot this shell is for: neither tool takes its own memory past its
|
|
26
|
+
* limits (bot.memory keepBotMemory), and `write_file` starts nothing new at
|
|
27
|
+
* the top of `artifacts/` but its folder (workspace.ts writeRefusal).
|
|
28
|
+
*/
|
|
29
|
+
bot?: string;
|
|
23
30
|
},
|
|
24
31
|
): ToolSet => {
|
|
25
32
|
/** Fold absolute sandbox paths against cwd; they still resolve when handed back. */
|
|
@@ -31,6 +38,17 @@ export const createWorkspaceTools = (
|
|
|
31
38
|
// The tool set is built per run, so one guide per run lives in this closure.
|
|
32
39
|
let owed = options.guide === true;
|
|
33
40
|
|
|
41
|
+
/** Runs a step that can write, then puts back what it took past the bot's memory limits and says so. */
|
|
42
|
+
const guarded = async <T>(
|
|
43
|
+
step: () => Promise<T>,
|
|
44
|
+
): Promise<{ result: T; memory: string | null }> => {
|
|
45
|
+
const bot = options.bot;
|
|
46
|
+
if (!bot) return { result: await step(), memory: null };
|
|
47
|
+
const held = await holdBotMemory(bot);
|
|
48
|
+
const result = await step();
|
|
49
|
+
return { result, memory: await keepBotMemory(bot, held) };
|
|
50
|
+
};
|
|
51
|
+
|
|
34
52
|
const bash = tool({
|
|
35
53
|
description: "Run a bash command.",
|
|
36
54
|
inputSchema: z.object({
|
|
@@ -44,14 +62,17 @@ export const createWorkspaceTools = (
|
|
|
44
62
|
}),
|
|
45
63
|
// The only tool here long-running enough to be cancelled.
|
|
46
64
|
execute: async ({ command }, { abortSignal }) => {
|
|
47
|
-
const result = await
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
65
|
+
const { result, memory } = await guarded(() =>
|
|
66
|
+
sandbox.exec(command, {
|
|
67
|
+
signal: abortSignal,
|
|
68
|
+
env: options.env,
|
|
69
|
+
timeoutMs: options.timeoutMs,
|
|
70
|
+
}),
|
|
71
|
+
);
|
|
72
|
+
const answer = memory ? { ...result, memory } : result;
|
|
73
|
+
if (!owed) return answer;
|
|
53
74
|
owed = false;
|
|
54
|
-
return { ...
|
|
75
|
+
return { ...answer, guide: SHELL_GUIDE };
|
|
55
76
|
},
|
|
56
77
|
});
|
|
57
78
|
|
|
@@ -76,10 +97,12 @@ export const createWorkspaceTools = (
|
|
|
76
97
|
}),
|
|
77
98
|
execute: async ({ path, content }) => {
|
|
78
99
|
const full = sandbox.resolve(path);
|
|
79
|
-
const refusal = writeRefusal(full);
|
|
100
|
+
const refusal = writeRefusal(full, options.bot);
|
|
80
101
|
if (refusal) return refusal;
|
|
81
|
-
await sandbox.writeFile(path, content);
|
|
82
|
-
return
|
|
102
|
+
const { memory } = await guarded(() => sandbox.writeFile(path, content));
|
|
103
|
+
return (
|
|
104
|
+
memory ?? `Wrote ${short(full)} (${content.split("\n").length} lines)`
|
|
105
|
+
);
|
|
83
106
|
},
|
|
84
107
|
});
|
|
85
108
|
|
|
@@ -4,9 +4,9 @@ import { deleteArtifact } from "@/features/artifact/artifact.query";
|
|
|
4
4
|
import { serverAction } from "@/lib/protocol/server-action";
|
|
5
5
|
import { publicError } from "@/lib/public-error";
|
|
6
6
|
|
|
7
|
-
/** Deletes one
|
|
7
|
+
/** Deletes one thing a bot handed over: a file, or a set whole. Reveal and open are workspace.action's. */
|
|
8
8
|
export const deleteArtifactAction = serverAction(async (path: string) => {
|
|
9
9
|
const target = path.trim();
|
|
10
|
-
if (!target) publicError("Which
|
|
10
|
+
if (!target) publicError("Which artifact?");
|
|
11
11
|
await deleteArtifact(target);
|
|
12
12
|
});
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
+
import type { Dirent } from "node:fs";
|
|
1
2
|
import { readdir, rm, stat } from "node:fs/promises";
|
|
2
|
-
import { join, sep } from "node:path";
|
|
3
|
+
import { basename, join, relative, sep } from "node:path";
|
|
3
4
|
import { ARTIFACT_VIEW, PATHS } from "@/config";
|
|
5
|
+
import { listBotNames } from "@/features/bot/bot.query";
|
|
4
6
|
import { isListedFolder, viewKindOf } from "@/features/workspace/file-kind";
|
|
5
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
ARTIFACTS,
|
|
9
|
+
botFolderName,
|
|
10
|
+
insideWorkspace,
|
|
11
|
+
} from "@/features/workspace/workspace";
|
|
6
12
|
import { publicError } from "@/lib/public-error";
|
|
7
13
|
import type {
|
|
8
14
|
Artifact,
|
|
@@ -12,18 +18,17 @@ import type {
|
|
|
12
18
|
} from "./artifact.schema";
|
|
13
19
|
|
|
14
20
|
/**
|
|
15
|
-
* Finished work, the way the bots
|
|
16
|
-
* `artifacts
|
|
17
|
-
*
|
|
18
|
-
*
|
|
21
|
+
* Finished work, the way the bots file it: each bot writes into its own folder,
|
|
22
|
+
* `artifacts/<bot>/`, and one entry there — a file, or a folder of several — is
|
|
23
|
+
* one artifact. What sits loose at the top of `artifacts/` (a bot's slip, or an
|
|
24
|
+
* install from before bots had folders) is listed too, belonging to nobody. So
|
|
25
|
+
* the folders are the index and nothing has to be recorded anywhere.
|
|
19
26
|
*
|
|
20
|
-
* Nothing here descends past the row it draws. The menu reads
|
|
21
|
-
* reads its own when it is opened. There is no walk and no
|
|
22
|
-
* reason as Workspace: a folder's size is every file under it.
|
|
27
|
+
* Nothing here descends past the row it draws. The menu reads the top and each
|
|
28
|
+
* bot's folder; a set reads its own when it is opened. There is no walk and no
|
|
29
|
+
* total, for the same reason as Workspace: a folder's size is every file under it.
|
|
23
30
|
*/
|
|
24
31
|
|
|
25
|
-
const relative = (name: string) => `${PATHS.artifacts}/${name}`;
|
|
26
|
-
|
|
27
32
|
/**
|
|
28
33
|
* The absolute path, fenced to `artifacts/`. The fence is on the resolved path,
|
|
29
34
|
* never on the string that was asked for: `insideWorkspace` normalizes `..`
|
|
@@ -50,62 +55,97 @@ async function fileAt(
|
|
|
50
55
|
}
|
|
51
56
|
|
|
52
57
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
58
|
+
* One row: a file, or a folder as a set. A folder costs one `stat` for its date
|
|
59
|
+
* and one `readdir` for its count — never a descent, so a set of thirty and a
|
|
60
|
+
* set of thirty thousand cost the same.
|
|
61
|
+
*/
|
|
62
|
+
async function entryAt(
|
|
63
|
+
dir: string,
|
|
64
|
+
base: string,
|
|
65
|
+
entry: Dirent,
|
|
66
|
+
bot: string | null,
|
|
67
|
+
): Promise<Artifact | null> {
|
|
68
|
+
const path = `${base}/${entry.name}`;
|
|
69
|
+
|
|
70
|
+
if (entry.isDirectory()) {
|
|
71
|
+
if (!isListedFolder(entry.name)) return null;
|
|
72
|
+
const full = join(dir, entry.name);
|
|
73
|
+
const [info, inside] = await Promise.all([
|
|
74
|
+
stat(full).catch(() => null),
|
|
75
|
+
readdir(full, { withFileTypes: true }).catch(() => []),
|
|
76
|
+
]);
|
|
77
|
+
// Counted the way the sheet draws them, or the row promises more than it opens
|
|
78
|
+
const count = inside.filter(
|
|
79
|
+
(child) => child.isFile() && viewKindOf(child.name) !== "none",
|
|
80
|
+
).length;
|
|
81
|
+
if (!info || count === 0) return null;
|
|
82
|
+
return {
|
|
83
|
+
name: entry.name,
|
|
84
|
+
path,
|
|
85
|
+
bot,
|
|
86
|
+
at: info.mtime,
|
|
87
|
+
kind: "set",
|
|
88
|
+
bytes: 0,
|
|
89
|
+
count,
|
|
90
|
+
view: "none",
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (!entry.isFile()) return null;
|
|
95
|
+
const file = await fileAt(dir, path, entry.name);
|
|
96
|
+
return (
|
|
97
|
+
file && {
|
|
98
|
+
name: file.name,
|
|
99
|
+
path: file.path,
|
|
100
|
+
bot,
|
|
101
|
+
at: file.at,
|
|
102
|
+
kind: "file",
|
|
103
|
+
bytes: file.bytes,
|
|
104
|
+
count: 1,
|
|
105
|
+
view: file.view,
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Which bot a top-level folder belongs to, matched the way the folder was named (workspace.ts botFolderName). */
|
|
111
|
+
async function botsByFolder(): Promise<Map<string, string>> {
|
|
112
|
+
const names = await listBotNames();
|
|
113
|
+
return new Map(
|
|
114
|
+
names.map((name) => [botFolderName(name).toLowerCase(), name]),
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* The menu: every bot's entries and the loose ones, newest first. A bot's
|
|
120
|
+
* folder is not a row of its own; its entries are, each carrying the bot.
|
|
56
121
|
*/
|
|
57
122
|
export async function readShelf(
|
|
58
123
|
limit = ARTIFACT_VIEW.rows,
|
|
59
124
|
): Promise<ArtifactShelf> {
|
|
60
|
-
const listing = await
|
|
61
|
-
() => [],
|
|
62
|
-
|
|
125
|
+
const [listing, bots] = await Promise.all([
|
|
126
|
+
readdir(ARTIFACTS, { withFileTypes: true }).catch(() => []),
|
|
127
|
+
botsByFolder(),
|
|
128
|
+
]);
|
|
63
129
|
|
|
64
130
|
const rows = await Promise.all(
|
|
65
|
-
listing.map(async (entry)
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
]
|
|
75
|
-
// Counted the way the sheet draws them, or the row promises more than it opens
|
|
76
|
-
const count = inside.filter(
|
|
77
|
-
(child) => child.isFile() && viewKindOf(child.name) !== "none",
|
|
78
|
-
).length;
|
|
79
|
-
if (!info || count === 0) return null;
|
|
80
|
-
return {
|
|
81
|
-
name: entry.name,
|
|
82
|
-
path,
|
|
83
|
-
at: info.mtime,
|
|
84
|
-
kind: "set",
|
|
85
|
-
bytes: 0,
|
|
86
|
-
count,
|
|
87
|
-
view: "none",
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if (!entry.isFile()) return null;
|
|
92
|
-
const file = await fileAt(ARTIFACTS, path, entry.name);
|
|
93
|
-
return (
|
|
94
|
-
file && {
|
|
95
|
-
name: file.name,
|
|
96
|
-
path: file.path,
|
|
97
|
-
at: file.at,
|
|
98
|
-
kind: "file",
|
|
99
|
-
bytes: file.bytes,
|
|
100
|
-
count: 1,
|
|
101
|
-
view: file.view,
|
|
102
|
-
}
|
|
131
|
+
listing.map(async (entry) => {
|
|
132
|
+
const bot = entry.isDirectory()
|
|
133
|
+
? bots.get(entry.name.toLowerCase())
|
|
134
|
+
: undefined;
|
|
135
|
+
if (!bot) return [await entryAt(ARTIFACTS, PATHS.artifacts, entry, null)];
|
|
136
|
+
|
|
137
|
+
const dir = join(ARTIFACTS, entry.name);
|
|
138
|
+
const base = `${PATHS.artifacts}/${entry.name}`;
|
|
139
|
+
const inside = await readdir(dir, { withFileTypes: true }).catch(
|
|
140
|
+
() => [],
|
|
103
141
|
);
|
|
142
|
+
return Promise.all(inside.map((child) => entryAt(dir, base, child, bot)));
|
|
104
143
|
}),
|
|
105
144
|
);
|
|
106
145
|
|
|
107
146
|
// Newest first: the thing a bot just handed over is the thing being looked for.
|
|
108
147
|
const entries = rows
|
|
148
|
+
.flat()
|
|
109
149
|
.filter((row) => row !== null)
|
|
110
150
|
.sort((a, b) => new Date(b.at).getTime() - new Date(a.at).getTime());
|
|
111
151
|
|
|
@@ -118,10 +158,9 @@ export async function readShelf(
|
|
|
118
158
|
|
|
119
159
|
/** One set, opened: its files, newest first. Read only when the row is picked. */
|
|
120
160
|
export async function readSet(
|
|
121
|
-
|
|
161
|
+
path: string,
|
|
122
162
|
limit = ARTIFACT_VIEW.setFiles,
|
|
123
163
|
): Promise<ArtifactSet> {
|
|
124
|
-
const path = relative(name);
|
|
125
164
|
const full = await insideArtifacts(path);
|
|
126
165
|
|
|
127
166
|
const listing = await readdir(full, { withFileTypes: true }).catch(
|
|
@@ -141,17 +180,29 @@ export async function readSet(
|
|
|
141
180
|
|
|
142
181
|
return {
|
|
143
182
|
path,
|
|
144
|
-
name,
|
|
183
|
+
name: basename(path),
|
|
145
184
|
files: files.slice(0, limit),
|
|
146
185
|
total: files.length,
|
|
147
186
|
};
|
|
148
187
|
}
|
|
149
188
|
|
|
150
|
-
/**
|
|
189
|
+
/**
|
|
190
|
+
* Deletes one artifact: a file, or a set with everything in it. A bot's whole
|
|
191
|
+
* folder is not an artifact, so it is refused; its entries go one at a time.
|
|
192
|
+
*/
|
|
151
193
|
export async function deleteArtifact(path: string): Promise<void> {
|
|
152
194
|
const full = await insideArtifacts(path);
|
|
153
195
|
const info = await stat(full).catch(() => null);
|
|
154
|
-
if (!info) publicError("
|
|
155
|
-
if (
|
|
196
|
+
if (!info) publicError("Not found");
|
|
197
|
+
if (info.isDirectory()) {
|
|
198
|
+
const inside = relative(ARTIFACTS, full);
|
|
199
|
+
if (
|
|
200
|
+
!inside.includes(sep) &&
|
|
201
|
+
(await botsByFolder()).has(inside.toLowerCase())
|
|
202
|
+
)
|
|
203
|
+
publicError("That is a bot's whole folder, not one artifact");
|
|
204
|
+
await rm(full, { recursive: true });
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
156
207
|
await rm(full);
|
|
157
208
|
}
|
|
@@ -2,11 +2,11 @@ import type { FileViewKind } from "@/features/workspace/file-kind";
|
|
|
2
2
|
import type { DateLike } from "@/lib/date-like";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* What the Artifacts section reads. One row per entry
|
|
6
|
-
* `artifacts
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
5
|
+
* What the Artifacts section reads. One row per entry in a bot's folder,
|
|
6
|
+
* `artifacts/<bot>/`, or loose at the top of `artifacts/`: a skill drops
|
|
7
|
+
* `<name>.html`, a job that makes a set drops `<name>/`. So the folders are the
|
|
8
|
+
* index — nothing records what an artifact is or who made it, because where it
|
|
9
|
+
* is already says it.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
/** One file inside a set, or the artifact itself when it is a lone file. */
|
|
@@ -25,6 +25,8 @@ export type Artifact = {
|
|
|
25
25
|
/** The file's own name, or the folder's. */
|
|
26
26
|
name: string;
|
|
27
27
|
path: string;
|
|
28
|
+
/** The bot whose folder holds it; null when it sits loose at the top of `artifacts/`. */
|
|
29
|
+
bot: string | null;
|
|
28
30
|
/** Last written; the menu sorts and bands by this. */
|
|
29
31
|
at: DateLike;
|
|
30
32
|
/** A folder is a set — one row however many files are in it. */
|
|
@@ -40,7 +42,7 @@ export type Artifact = {
|
|
|
40
42
|
/** The menu, and what the rail says. */
|
|
41
43
|
export type ArtifactShelf = {
|
|
42
44
|
entries: Artifact[];
|
|
43
|
-
/**
|
|
45
|
+
/** Every row, before the page limit. */
|
|
44
46
|
total: number;
|
|
45
47
|
/** Files across every row, so the rail counts what the rows hide. */
|
|
46
48
|
files: number;
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
Trash2,
|
|
16
16
|
Video,
|
|
17
17
|
} from "lucide-react";
|
|
18
|
-
import { useState } from "react";
|
|
18
|
+
import { Fragment, useState } from "react";
|
|
19
19
|
import { queryKey } from "@/app/api/query-key";
|
|
20
20
|
import { Button } from "@/components/ui/button";
|
|
21
21
|
import { notify } from "@/components/ui/notify";
|
|
@@ -28,6 +28,8 @@ import type {
|
|
|
28
28
|
ArtifactSet,
|
|
29
29
|
ArtifactShelf,
|
|
30
30
|
} from "@/features/artifact/artifact.schema";
|
|
31
|
+
import type { Bot } from "@/features/bot/bot.schema";
|
|
32
|
+
import { BotMark } from "@/features/bot/components/bot-mark";
|
|
31
33
|
import {
|
|
32
34
|
SettingError,
|
|
33
35
|
SettingFilter,
|
|
@@ -44,14 +46,14 @@ import { revalidate, useServerRoute } from "@/lib/protocol/use-server-route";
|
|
|
44
46
|
import { cn, formatBytes } from "@/lib/utils";
|
|
45
47
|
|
|
46
48
|
/*
|
|
47
|
-
* What the bots finished, listed the way they
|
|
48
|
-
*
|
|
49
|
-
* a job that makes a set writes
|
|
49
|
+
* What the bots finished, listed the way they file it: each bot writes into
|
|
50
|
+
* `artifacts/<bot>/`, and one entry there is one artifact. A skill writes
|
|
51
|
+
* `<name>.html`, a job that makes a set writes `<name>/`.
|
|
50
52
|
*
|
|
51
53
|
* So this is not Workspace pointed at one folder. There is no tree here: the
|
|
52
|
-
* menu is
|
|
53
|
-
* listing — it opens as a sheet of what it holds, which is the thing a
|
|
54
|
-
* pictures is for. Browsing a tree is Workspace's job.
|
|
54
|
+
* menu is newest-first under each bot's face, and a folder does not open into
|
|
55
|
+
* another listing — it opens as a sheet of what it holds, which is the thing a
|
|
56
|
+
* set of pictures is for. Browsing a tree is Workspace's job.
|
|
55
57
|
*/
|
|
56
58
|
|
|
57
59
|
/** Every kind `viewKindOf` returns, plus the set. One icon table, as in Workspace. */
|
|
@@ -80,6 +82,7 @@ export function ArtifactSetting() {
|
|
|
80
82
|
{ keepPreviousData: true },
|
|
81
83
|
);
|
|
82
84
|
|
|
85
|
+
const { data: bots } = useServerRoute<Bot[]>(queryKey.bot);
|
|
83
86
|
const [reveal] = useServerAction(openFileAction);
|
|
84
87
|
|
|
85
88
|
if (isLoading) return <SettingPanesSkeleton />;
|
|
@@ -89,7 +92,11 @@ export function ArtifactSetting() {
|
|
|
89
92
|
const total = data?.total ?? 0;
|
|
90
93
|
const needle = filter.trim().toLowerCase();
|
|
91
94
|
const shown = needle
|
|
92
|
-
? entries.filter(
|
|
95
|
+
? entries.filter(
|
|
96
|
+
(entry) =>
|
|
97
|
+
entry.name.toLowerCase().includes(needle) ||
|
|
98
|
+
entry.bot?.toLowerCase().includes(needle),
|
|
99
|
+
)
|
|
93
100
|
: entries;
|
|
94
101
|
|
|
95
102
|
// A fresh row when the open one is still listed, so a rewrite shows through
|
|
@@ -130,13 +137,29 @@ export function ArtifactSetting() {
|
|
|
130
137
|
{needle ? "Nothing matches" : "Nothing here yet"}
|
|
131
138
|
</p>
|
|
132
139
|
) : (
|
|
133
|
-
shown.map((
|
|
134
|
-
<
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
+
groupByBot(shown).map(({ bot, rows }) => (
|
|
141
|
+
<Fragment key={bot ?? ""}>
|
|
142
|
+
<span className="flex items-center gap-1.5 px-3 pt-3 pb-1 font-mono text-[10px] text-muted-foreground/60">
|
|
143
|
+
{bot && (
|
|
144
|
+
<BotMark
|
|
145
|
+
size={12}
|
|
146
|
+
seed={bot}
|
|
147
|
+
{...markOf(bot, bots)}
|
|
148
|
+
notify={false}
|
|
149
|
+
className="shrink-0"
|
|
150
|
+
/>
|
|
151
|
+
)}
|
|
152
|
+
<span className="truncate">{bot ?? "Unsorted"}</span>
|
|
153
|
+
</span>
|
|
154
|
+
{rows.map((entry) => (
|
|
155
|
+
<MenuRow
|
|
156
|
+
key={entry.path}
|
|
157
|
+
entry={entry}
|
|
158
|
+
active={entry.path === picked?.path}
|
|
159
|
+
onPick={() => setReading({ row: entry, file: null })}
|
|
160
|
+
/>
|
|
161
|
+
))}
|
|
162
|
+
</Fragment>
|
|
140
163
|
))
|
|
141
164
|
)}
|
|
142
165
|
|
|
@@ -170,6 +193,33 @@ export function ArtifactSetting() {
|
|
|
170
193
|
);
|
|
171
194
|
}
|
|
172
195
|
|
|
196
|
+
/**
|
|
197
|
+
* Rows under the bot that made them, in the order the rows came: newest first,
|
|
198
|
+
* so the bot that handed something over last is on top. Loose rows are one group.
|
|
199
|
+
*/
|
|
200
|
+
function groupByBot(
|
|
201
|
+
entries: Artifact[],
|
|
202
|
+
): { bot: string | null; rows: Artifact[] }[] {
|
|
203
|
+
const groups = new Map<string | null, Artifact[]>();
|
|
204
|
+
for (const entry of entries) {
|
|
205
|
+
const rows = groups.get(entry.bot) ?? [];
|
|
206
|
+
rows.push(entry);
|
|
207
|
+
groups.set(entry.bot, rows);
|
|
208
|
+
}
|
|
209
|
+
return [...groups].map(([bot, rows]) => ({ bot, rows }));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/** Icon from the bot list; the row only carries the name. A bot that is gone draws its seed alone. */
|
|
213
|
+
function markOf(name: string, bots?: Bot[]) {
|
|
214
|
+
const icon = bots?.find((bot) => bot.name === name)?.icon;
|
|
215
|
+
return {
|
|
216
|
+
color: icon?.color,
|
|
217
|
+
shape: icon?.shape,
|
|
218
|
+
outline: icon?.outline,
|
|
219
|
+
paint: icon?.paint,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
|
|
173
223
|
/** `4 artifacts · 34 files`, and what is not on screen. Counts rows, so it is free. */
|
|
174
224
|
function countLine(shown: Artifact[], total: number, files: number): string {
|
|
175
225
|
if (total === 0) return "empty";
|
|
@@ -247,7 +297,9 @@ function Reader({
|
|
|
247
297
|
const confirmRemove = async (path: string) => {
|
|
248
298
|
const confirmed = await notify.confirm({
|
|
249
299
|
title: `Delete ${path.split("/").pop()}?`,
|
|
250
|
-
description:
|
|
300
|
+
description: open
|
|
301
|
+
? "It is deleted from disk for good."
|
|
302
|
+
: "The folder and everything in it are deleted from disk for good.",
|
|
251
303
|
okText: "Delete",
|
|
252
304
|
destructive: true,
|
|
253
305
|
});
|
|
@@ -295,25 +347,23 @@ function Reader({
|
|
|
295
347
|
>
|
|
296
348
|
<FolderOpen />
|
|
297
349
|
</Button>
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
</Button>
|
|
309
|
-
)}
|
|
350
|
+
<Button
|
|
351
|
+
size="icon-sm"
|
|
352
|
+
variant="ghost"
|
|
353
|
+
aria-label="Delete"
|
|
354
|
+
loading={removing}
|
|
355
|
+
className="text-muted-foreground"
|
|
356
|
+
onClick={() => confirmRemove(open?.path ?? row.path)}
|
|
357
|
+
>
|
|
358
|
+
<Trash2 />
|
|
359
|
+
</Button>
|
|
310
360
|
</div>
|
|
311
361
|
|
|
312
362
|
<div className="min-h-0 flex-1 overflow-auto">
|
|
313
363
|
{open ? (
|
|
314
364
|
<FilePreview path={open.path} bytes={open.bytes} />
|
|
315
365
|
) : (
|
|
316
|
-
<SetSheet
|
|
366
|
+
<SetSheet path={row.path} onOpen={onOpen} />
|
|
317
367
|
)}
|
|
318
368
|
</div>
|
|
319
369
|
</>
|
|
@@ -325,14 +375,14 @@ function Reader({
|
|
|
325
375
|
* a set nobody opens costs one `readdir` for its count and nothing more.
|
|
326
376
|
*/
|
|
327
377
|
function SetSheet({
|
|
328
|
-
|
|
378
|
+
path,
|
|
329
379
|
onOpen,
|
|
330
380
|
}: {
|
|
331
|
-
|
|
381
|
+
path: string;
|
|
332
382
|
onOpen: (file: ArtifactFile) => void;
|
|
333
383
|
}) {
|
|
334
384
|
const { data, isLoading, error } = useServerRoute<ArtifactSet>(
|
|
335
|
-
queryKey.artifactSet(
|
|
385
|
+
queryKey.artifactSet(path, ARTIFACT_VIEW.setFiles),
|
|
336
386
|
);
|
|
337
387
|
|
|
338
388
|
if (isLoading) {
|
|
@@ -418,7 +468,7 @@ function Nothing({
|
|
|
418
468
|
<p className="max-w-lg text-sm leading-relaxed text-muted-foreground">
|
|
419
469
|
{empty
|
|
420
470
|
? "Nothing finished yet. When a bot ends a job with something to hand over — a page, a report, a set of pictures — it lands here."
|
|
421
|
-
: "Pick something on the left.
|
|
471
|
+
: "Pick something on the left. Each bot's work is under its face; a folder it filled is one row, and opens as a sheet."}
|
|
422
472
|
</p>
|
|
423
473
|
<Button variant="outline" onClick={onReveal}>
|
|
424
474
|
<FolderOpen />
|