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
|
@@ -8,7 +8,6 @@ import {
|
|
|
8
8
|
} from "ai";
|
|
9
9
|
import { format } from "date-fns";
|
|
10
10
|
import z from "zod";
|
|
11
|
-
import { PATHS } from "@/config";
|
|
12
11
|
import {
|
|
13
12
|
buildImageModel,
|
|
14
13
|
buildSpeechModel,
|
|
@@ -25,9 +24,20 @@ import { errorToString } from "@/lib/utils";
|
|
|
25
24
|
* Media tools (image, speech, transcription, video), exposed behind `tool_search`/`tool_call`
|
|
26
25
|
* under one server name (config STUDIO_SERVER) like an MCP server's tools. They are code rather
|
|
27
26
|
* than skills or shell commands because each needs a key, and keys never reach a bot's shell.
|
|
28
|
-
* Bytes go to a file
|
|
27
|
+
* Bytes go to a file in the calling bot's artifacts folder; only the path travels, since tool results are replayed on every resume.
|
|
29
28
|
*/
|
|
30
29
|
|
|
30
|
+
/**
|
|
31
|
+
* What a run hands a studio tool: the shell's sandbox, and `artifacts`, the
|
|
32
|
+
* calling bot's folder, which is where what it makes is finished work the user
|
|
33
|
+
* opens (workspace.ts botArtifacts).
|
|
34
|
+
*/
|
|
35
|
+
type StudioContext = {
|
|
36
|
+
sandbox: Sandbox;
|
|
37
|
+
artifacts: string;
|
|
38
|
+
abortSignal?: AbortSignal;
|
|
39
|
+
};
|
|
40
|
+
|
|
31
41
|
/** One studio tool as `tool_search` describes it and `tool_call` runs it. The zod schema becomes JSON Schema for the model (connected.ts). */
|
|
32
42
|
export type StudioTool = {
|
|
33
43
|
name: string;
|
|
@@ -35,7 +45,7 @@ export type StudioTool = {
|
|
|
35
45
|
inputSchema: z.ZodObject<z.ZodRawShape>;
|
|
36
46
|
execute: (
|
|
37
47
|
args: Record<string, unknown>,
|
|
38
|
-
ctx:
|
|
48
|
+
ctx: StudioContext,
|
|
39
49
|
) => Promise<string>;
|
|
40
50
|
};
|
|
41
51
|
|
|
@@ -46,7 +56,7 @@ function define<Shape extends z.ZodRawShape>(spec: {
|
|
|
46
56
|
inputSchema: z.ZodObject<Shape>;
|
|
47
57
|
execute: (
|
|
48
58
|
args: z.infer<z.ZodObject<Shape>>,
|
|
49
|
-
ctx:
|
|
59
|
+
ctx: StudioContext,
|
|
50
60
|
) => Promise<string>;
|
|
51
61
|
}): StudioTool {
|
|
52
62
|
return {
|
|
@@ -59,14 +69,6 @@ function define<Shape extends z.ZodRawShape>(spec: {
|
|
|
59
69
|
};
|
|
60
70
|
}
|
|
61
71
|
|
|
62
|
-
/** Under artifacts: what is made here is finished work the user opens. */
|
|
63
|
-
const DIR = {
|
|
64
|
-
images: `${PATHS.artifacts}/images`,
|
|
65
|
-
audio: `${PATHS.artifacts}/audio`,
|
|
66
|
-
transcripts: `${PATHS.artifacts}/transcripts`,
|
|
67
|
-
videos: `${PATHS.artifacts}/videos`,
|
|
68
|
-
};
|
|
69
|
-
|
|
70
72
|
/** A filename someone can recognise a week later, out of what was asked for. */
|
|
71
73
|
function fileName(stem: string, ext: string): string {
|
|
72
74
|
const slug = stem
|
|
@@ -92,7 +94,7 @@ async function save(
|
|
|
92
94
|
|
|
93
95
|
/** The path first, on its own line: whoever draws this row reads line one as the file to open. */
|
|
94
96
|
const saved = (path: string) =>
|
|
95
|
-
`${path}\nSaved. Give the user this path — the file opens from the
|
|
97
|
+
`${path}\nSaved. Give the user this path — the file opens from the thread row. Do not describe it back to them; they can open it.`;
|
|
96
98
|
|
|
97
99
|
/** `video/mp4` → `mp4`, with a fallback for a provider that says nothing. */
|
|
98
100
|
const extOf = (mediaType: string | undefined, fallback: string) =>
|
|
@@ -121,7 +123,10 @@ const imageTool = async (): Promise<StudioTool | null> => {
|
|
|
121
123
|
.nullish()
|
|
122
124
|
.describe("Aspect ratio. Null for square."),
|
|
123
125
|
}),
|
|
124
|
-
execute: async (
|
|
126
|
+
execute: async (
|
|
127
|
+
{ prompt, aspectRatio },
|
|
128
|
+
{ sandbox, artifacts, abortSignal },
|
|
129
|
+
) => {
|
|
125
130
|
const { image } = await generateImage({
|
|
126
131
|
model,
|
|
127
132
|
prompt,
|
|
@@ -130,7 +135,7 @@ const imageTool = async (): Promise<StudioTool | null> => {
|
|
|
130
135
|
});
|
|
131
136
|
const path = await save(
|
|
132
137
|
sandbox,
|
|
133
|
-
|
|
138
|
+
artifacts,
|
|
134
139
|
fileName(prompt, extOf(image.mediaType, "png")),
|
|
135
140
|
image.uint8Array,
|
|
136
141
|
);
|
|
@@ -172,7 +177,7 @@ const speechTool = async (): Promise<StudioTool | null> => {
|
|
|
172
177
|
}),
|
|
173
178
|
execute: async (
|
|
174
179
|
{ text, voice, instructions },
|
|
175
|
-
{ sandbox, abortSignal },
|
|
180
|
+
{ sandbox, artifacts, abortSignal },
|
|
176
181
|
) => {
|
|
177
182
|
const { audio } = await generateSpeech({
|
|
178
183
|
model,
|
|
@@ -184,7 +189,7 @@ const speechTool = async (): Promise<StudioTool | null> => {
|
|
|
184
189
|
});
|
|
185
190
|
const path = await save(
|
|
186
191
|
sandbox,
|
|
187
|
-
|
|
192
|
+
artifacts,
|
|
188
193
|
fileName(text.slice(0, 60), audio.format || "mp3"),
|
|
189
194
|
audio.uint8Array,
|
|
190
195
|
);
|
|
@@ -216,7 +221,7 @@ const transcribeTool = async (): Promise<StudioTool | null> => {
|
|
|
216
221
|
"The audio file: a path relative to the workspace, or an absolute one anywhere on this machine.",
|
|
217
222
|
),
|
|
218
223
|
}),
|
|
219
|
-
execute: async ({ path }, { sandbox, abortSignal }) => {
|
|
224
|
+
execute: async ({ path }, { sandbox, artifacts, abortSignal }) => {
|
|
220
225
|
const audio = await readFile(sandbox.resolve(path));
|
|
221
226
|
const result = await transcribe({ model, audio, abortSignal });
|
|
222
227
|
|
|
@@ -231,7 +236,7 @@ const transcribeTool = async (): Promise<StudioTool | null> => {
|
|
|
231
236
|
const stem = basename(path, extname(path));
|
|
232
237
|
const out = await save(
|
|
233
238
|
sandbox,
|
|
234
|
-
|
|
239
|
+
artifacts,
|
|
235
240
|
fileName(stem, "md"),
|
|
236
241
|
Buffer.from(`# ${stem}\n\n${result.text.trim()}${timeline}\n`),
|
|
237
242
|
);
|
|
@@ -273,7 +278,7 @@ const videoTool = async (): Promise<StudioTool | null> => {
|
|
|
273
278
|
}),
|
|
274
279
|
execute: async (
|
|
275
280
|
{ prompt, aspectRatio, seconds },
|
|
276
|
-
{ sandbox, abortSignal },
|
|
281
|
+
{ sandbox, artifacts, abortSignal },
|
|
277
282
|
) => {
|
|
278
283
|
const { video } = await generateVideo({
|
|
279
284
|
model,
|
|
@@ -284,7 +289,7 @@ const videoTool = async (): Promise<StudioTool | null> => {
|
|
|
284
289
|
});
|
|
285
290
|
const path = await save(
|
|
286
291
|
sandbox,
|
|
287
|
-
|
|
292
|
+
artifacts,
|
|
288
293
|
fileName(prompt, extOf(video.mediaType, "mp4")),
|
|
289
294
|
video.uint8Array,
|
|
290
295
|
);
|
|
@@ -20,11 +20,8 @@ export const TOOL_NAMES = {
|
|
|
20
20
|
web_search: "web_search",
|
|
21
21
|
|
|
22
22
|
delegate: "delegate",
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
ask_thursday: "ask_thursday",
|
|
26
|
-
ask_back: "ask_back",
|
|
27
|
-
answer: "answer",
|
|
23
|
+
thread: "thread",
|
|
24
|
+
send_message: "send_message",
|
|
28
25
|
|
|
29
26
|
end_call: "end_call",
|
|
30
27
|
} as const;
|
|
@@ -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;
|