thursday-agent 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +3 -2
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.json +8 -1
- package/.next/routes-manifest.json +18 -6
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +13 -13
- package/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +12 -12
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/artifact/route.js +10 -6
- package/.next/server/app/api/artifact/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/files/route.js +6 -5
- package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/route.js +8 -8
- package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/route.js +8 -8
- package/.next/server/app/api/bot/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/thread/[id]/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/bot/thread/[id]/route.js +15 -0
- package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/bot/thread/[id]/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/bot/thread/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/bot/thread/route.js +15 -0
- package/.next/server/app/api/bot/thread/route.js.nft.json +1 -0
- package/.next/server/app/api/bot/thread/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/config/route.js +7 -7
- package/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/server/app/api/events/route.js +3 -3
- package/.next/server/app/api/events/route.js.nft.json +1 -1
- package/.next/server/app/api/file/[...path]/route.js +5 -5
- package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/catalog/route.js +8 -8
- package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/credits/route.js +8 -8
- package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/route.js +8 -8
- package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/subscription/route.js +8 -8
- package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/[name]/route.js +6 -6
- package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/oauth/callback/route.js +4 -4
- package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/route.js +6 -6
- package/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/tools/route.js +6 -6
- package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/edit/route.js +13 -13
- package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/route.js +7 -6
- package/.next/server/app/api/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[source]/[name]/route.js +6 -6
- package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route.js +6 -6
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/call/route.js +10 -11
- package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/skills/route.js +10 -11
- package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/tool-call/route.js +15 -15
- package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/missing/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/workspace/missing/route/build-manifest.json +12 -0
- package/.next/server/app/api/workspace/missing/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/workspace/missing/route.js +12 -0
- package/.next/server/app/api/workspace/missing/route.js.map +5 -0
- package/.next/server/app/api/workspace/missing/route.js.nft.json +1 -0
- package/.next/server/app/api/workspace/missing/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/workspace/route.js +5 -4
- package/.next/server/app/api/workspace/route.js.nft.json +1 -1
- package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +1 -1
- package/.next/server/app/artifact/[...path]/page.js +4 -3
- package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
- package/.next/server/app/page/server-reference-manifest.json +67 -45
- package/.next/server/app/page.js +10 -9
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +3 -2
- package/.next/server/chunks/[root-of-the-server]__02846fb._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__049f521._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__05luceg._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__06--3q3._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__07bnah_._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__08eae20._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__0_ue8oe._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0c9fgca._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__0g-ueei._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__0h_x6q6._.js +5 -0
- package/.next/server/chunks/{[root-of-the-server]__0pa2n68._.js → [root-of-the-server]__0kxrvxf._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__0q0vvt2._.js → [root-of-the-server]__0ov3iir._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__0qwtlmx._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__0sm5xvm._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0ye3da2._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0zp35ul._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__144u9d_._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__18-2tsq._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1e-ci13._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1e2365e._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__1fix932._.js +8 -0
- package/.next/server/chunks/{[root-of-the-server]__0ce8nf8._.js → [root-of-the-server]__1g3t7vn._.js} +3 -3
- package/.next/server/chunks/[root-of-the-server]__1kp-83u._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1kv8p3e._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1orn-5b._.js +2 -3
- package/.next/server/chunks/_02szwk8._.js +5 -0
- package/.next/server/chunks/_05h2cii._.js +1 -1
- package/.next/server/chunks/_06c9kie._.js +216 -0
- package/.next/server/chunks/{_1x6kd1r._.js → _07y2gj-._.js} +1 -1
- package/.next/server/chunks/_0a43a-0._.js +3 -0
- package/.next/server/chunks/_0bujjey._.js +5 -0
- package/.next/server/chunks/_0c9j6rb._.js +1 -1
- package/.next/server/chunks/_0dkd549._.js +3 -0
- package/.next/server/chunks/_0ej1kvv._.js +3 -0
- package/.next/server/chunks/_0f6ts7z._.js +3 -0
- package/.next/server/chunks/_0gm9hyv._.js +55 -0
- package/.next/server/chunks/_0i55en5._.js +25 -0
- package/.next/server/chunks/_0k50n27._.js +18 -0
- package/.next/server/chunks/_0khihjk._.js +3 -3
- package/.next/server/chunks/_0n74zsf._.js +5 -5
- package/.next/server/chunks/_0nvm9ef._.js +3 -0
- package/.next/server/chunks/_0p56fn0._.js +3 -0
- package/.next/server/chunks/_0recufk._.js +1 -1
- package/.next/server/chunks/_0xbkz10._.js +3 -0
- package/.next/server/chunks/_10tkr26._.js +3 -0
- package/.next/server/chunks/{_0ioz3nd._.js → _11u2kp7._.js} +1 -1
- package/.next/server/chunks/_11ujpya._.js +3 -0
- package/.next/server/chunks/_127nx_p._.js +5 -0
- package/.next/server/chunks/_17l5ygt._.js +1 -1
- package/.next/server/chunks/_19uauj6._.js +3 -0
- package/.next/server/chunks/_1_5mnq4._.js +5 -5
- package/.next/server/chunks/_1abl6t9._.js +55 -0
- package/.next/server/chunks/_1d0j961._.js +3 -3
- package/.next/server/chunks/_1dbixxz._.js +3 -0
- package/.next/server/chunks/_1dc_d1q._.js +98 -0
- package/.next/server/chunks/_1drgfx4._.js +5 -5
- package/.next/server/chunks/_1e48czp._.js +3 -3
- package/.next/server/chunks/_1f31u5x._.js +5 -0
- package/.next/server/chunks/_1kg70wc._.js +3 -3
- package/.next/server/chunks/_1klbcft._.js +5 -0
- package/.next/server/chunks/_1krd9rf._.js +4 -1
- package/.next/server/chunks/_1kwmzab._.js +3 -0
- package/.next/server/chunks/{_1pf4qe-._.js → _1oxj9fa._.js} +1 -1
- package/.next/server/chunks/{_1f46eie._.js → _1pcmdbb._.js} +1 -1
- package/.next/server/chunks/_1qgix-j._.js +3 -0
- package/.next/server/chunks/{lib_logger_ts_1exwjut._.js → _1rpchta._.js} +5 -5
- package/.next/server/chunks/_1vsej-s._.js +5 -0
- package/.next/server/chunks/_1yx0p_s._.js +5 -0
- package/.next/server/chunks/{_0rnf-6n._.js → _20fsr_z._.js} +6 -6
- package/.next/server/chunks/_2128hkj._.js +5 -0
- package/.next/server/chunks/_next-internal_server_app_api_bot_thread_[id]_route_actions_1fstjn2.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_bot_thread_route_actions_003ccso.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_workspace_missing_route_actions_1fidi6p.js +3 -0
- package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
- package/.next/server/chunks/features_0-cnt0l._.js +4 -0
- package/.next/server/chunks/features_0hdaci0._.js +4 -0
- package/.next/server/chunks/features_1e39j7-._.js +8 -0
- package/.next/server/chunks/features_bot_bot_query_ts_12mgkl2._.js +1 -1
- package/.next/server/chunks/features_memory_1uqvksn._.js +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0r28-sm._.js → node_modules_consola_dist_chunks_prompt_mjs_0a7-pbw._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0v_7drq._.js → node_modules_consola_dist_chunks_prompt_mjs_0gzvgfv._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0i7cvml._.js → node_modules_consola_dist_chunks_prompt_mjs_107pxfn._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0icqaqw._.js → node_modules_consola_dist_chunks_prompt_mjs_15hbel8._.js} +1 -1
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_18i-23e._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1bewgf3._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1kipdeo._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1nlww1m._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1q77nfx._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xqdzx_._.js +3 -0
- package/.next/server/chunks/{node_modules_zod_v4_1801ax7._.js → node_modules_zod_v4_0lkux5-._.js} +2 -2
- package/.next/server/chunks/{node_modules_zod_v4_1cha_bw._.js → node_modules_zod_v4_1jmr9cq._.js} +2 -2
- package/.next/server/chunks/{node_modules_zod_v4_0ubdflj._.js → node_modules_zod_v4_1yrxmek._.js} +2 -2
- package/.next/server/chunks/node_modules_zod_v4_classic_errors_0tp0y-q.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__09q9med._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0bxsfyn._.js +101 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0lyi8i2._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__16jc196._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__172cq4x._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__18dthbp._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__18e68w8._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1fll8dc._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1mzi-ju._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1nygfik._.js +5 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1sdphb0._.js +8 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1waa3rc._.js +100 -0
- package/.next/server/chunks/ssr/_00rehl_._.js +3 -0
- package/.next/server/chunks/ssr/{_1lz_cq2._.js → _02oc_h5._.js} +76 -89
- package/.next/server/chunks/ssr/_03_928f._.js +3 -0
- package/.next/server/chunks/ssr/_05yghx6._.js +3 -0
- package/.next/server/chunks/ssr/_08c4z-9._.js +3 -0
- package/.next/server/chunks/ssr/_0_qfdlw._.js +4 -0
- package/.next/server/chunks/ssr/_0c9e5w6._.js +9 -0
- package/.next/server/chunks/ssr/{_0s99bgb._.js → _0dh2e1j._.js} +9 -3
- package/.next/server/chunks/ssr/_0dr-ddg._.js +3 -0
- package/.next/server/chunks/ssr/_0eaog6_._.js +3 -0
- package/.next/server/chunks/ssr/_0evkpto._.js +3 -0
- package/.next/server/chunks/ssr/_0g_rlog._.js +3 -0
- package/.next/server/chunks/ssr/_0geg212._.js +3 -0
- package/.next/server/chunks/ssr/{_1gd8q8l._.js → _0hxt2ul._.js} +2 -2
- package/.next/server/chunks/ssr/_0i_6q1w._.js +2 -2
- package/.next/server/chunks/ssr/_0lu1n_x._.js +1 -1
- package/.next/server/chunks/ssr/{_15j2_8f._.js → _0wzaht-._.js} +2 -2
- package/.next/server/chunks/ssr/_0z-g0uy._.js +3 -0
- package/.next/server/chunks/ssr/_123ttsf._.js +3 -0
- package/.next/server/chunks/ssr/_123y-ah._.js +3 -0
- package/.next/server/chunks/ssr/_12w42gi._.js +3 -0
- package/.next/server/chunks/ssr/_161kqav._.js +3 -0
- package/.next/server/chunks/ssr/{_0ap2fzn._.js → _16c6_xm._.js} +2 -2
- package/.next/server/chunks/ssr/_18opah7._.js +3 -0
- package/.next/server/chunks/ssr/_18xqmny._.js +3 -0
- package/.next/server/chunks/ssr/_1_krfph._.js +3 -0
- package/.next/server/chunks/ssr/{_1-_etts._.js → _1anqots._.js} +2 -2
- package/.next/server/chunks/ssr/_1ey7qn-._.js +70 -0
- package/.next/server/chunks/ssr/_1g9vs7q._.js +3 -0
- package/.next/server/chunks/ssr/_1jmz33w._.js +3 -0
- package/.next/server/chunks/ssr/{_0n3toaw._.js → _1k0spz7._.js} +2 -2
- package/.next/server/chunks/ssr/_1rgtxhr._.js +5 -0
- package/.next/server/chunks/ssr/_1slp25y._.js +3 -0
- package/.next/server/chunks/ssr/{_1fojd41._.js → _1x9pskj._.js} +3 -3
- package/.next/server/chunks/ssr/_1y6b5mr._.js +101 -0
- package/.next/server/chunks/ssr/_1ztk7p6._.js +7 -0
- package/.next/server/chunks/ssr/components_ui_tabs_tsx_0ej40b4._.js +3 -0
- package/.next/server/chunks/ssr/features_bot_thread_query_ts_023eklt._.js +4 -0
- package/.next/server/chunks/ssr/features_config_components_config-setting_tsx_0xfwqdg._.js +1 -1
- package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
- package/.next/server/chunks/ssr/{_1-teee5._.js → lib_logger_ts_0-olsze._.js} +2 -7
- package/.next/server/chunks/ssr/{node_modules_0cxaxk9._.js → node_modules_00_51_v._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_04jf_m8._.js → node_modules_022sipm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0g7fzk3._.js → node_modules_0332gw4._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1cx_ql6._.js → node_modules_04vxchl._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1vh5ntv._.js → node_modules_0746rzi._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0yugy6m._.js → node_modules_0d5uzof._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_09q35v_._.js → node_modules_0exkwcm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_08dhkiq._.js → node_modules_0fr-ml8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_14q6g4n._.js → node_modules_0mxvg8h._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0arus10._.js → node_modules_0qapgjr._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1eg7m6c._.js → node_modules_0qbfyjh._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1cz2hle._.js → node_modules_0t-9nup._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_17bwo43._.js → node_modules_0tusx4d._.js} +3 -3
- package/.next/server/chunks/ssr/{node_modules_1efrqxi._.js → node_modules_0vsxbzp._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0_-_a--._.js → node_modules_0vv0-fg._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1gdh31p._.js → node_modules_0wsvp00._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1hpopmo._.js → node_modules_1-urho9._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1_pc9kq._.js → node_modules_16pi_dd._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_00etblx._.js → node_modules_1d53yiq._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1aaxuef._.js → node_modules_1g1eihe._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_198nmll._.js → node_modules_1gpednh._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0pvd7q-._.js → node_modules_1gu1pph._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0b__sgl._.js → node_modules_1he1w8_._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1qpjvy5._.js → node_modules_1lnjapm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0940ns5._.js → node_modules_1lynj9m._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0x3-ply._.js → node_modules_1seuurl._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_14om4ar._.js → node_modules_1u6w1pb._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0had7xd._.js → node_modules_1xn6saw._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1b748ic._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_067_exa._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1z4hm5e._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0nrrdaq._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@vercel_oidc_dist_06mk8id._.js → node_modules_@vercel_oidc_dist_21a5haa._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_trash_mjs_0px2gzr._.js +3 -0
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +68 -46
- package/.next/static/chunks/0dr16v67vj4n7.js +2 -0
- package/.next/static/chunks/0g4b348l0pve7.js +1 -0
- package/.next/static/chunks/0joan-69kbspd.js +1 -0
- package/.next/static/chunks/0vlgzqo9ka90v.js +1 -0
- package/.next/static/chunks/0zrupxgci5gqc.js +1 -0
- package/.next/static/chunks/10k2xvap03z20.css +1 -0
- package/.next/static/chunks/18mkhstgiqcbt.js +1 -0
- package/.next/static/chunks/{15m575979un5f.js → 1i-u2wzub_to1.js} +2 -2
- package/.next/static/chunks/1kp5nfp06nj9h.js +5 -0
- package/.next/static/chunks/1ohslk4568tm3.js +1 -0
- package/.next/static/chunks/1sbmwswc9k2-1.js +1 -0
- package/.next/static/chunks/1t9qms5pwwa3n.js +1 -0
- package/.next/static/chunks/1vj_5bnbxx84e.js +1 -0
- package/.next/static/chunks/1vqezbhjm3goq.js +1 -0
- package/.next/static/chunks/{3akmqm77muj4-.js → 1wlo979mx-y3w.js} +1 -1
- package/.next/static/chunks/26ql4y-43xwhp.js +1 -0
- package/.next/static/chunks/{0fl3gwe4-l6tz.js → 2_pnccjp6j1ca.js} +1 -1
- package/.next/static/chunks/2a51-ywz9b2a3.js +1 -0
- package/.next/static/chunks/2fvdgxih7x7hr.js +1 -0
- package/.next/static/chunks/2jlz8zp4jax_m.js +18 -0
- package/.next/static/chunks/2nvepds1fu2ux.js +1 -0
- package/.next/static/chunks/3addj3i4-izma.js +1 -0
- package/.next/static/chunks/3bfwpww3m3x4u.js +1 -0
- package/.next/static/chunks/3gfh7nxwusbt0.js +1 -0
- package/.next/static/chunks/3gwa44cvz4qoi.js +1 -0
- package/.next/static/chunks/{38gweqdo4jpfj.js → 3izg0a3k87q1-.js} +5 -5
- package/.next/static/chunks/3zk6q3-3f9swq.js +99 -0
- package/.next/static/chunks/3zkg5iup3v4a2.js +12 -0
- package/.next/static/chunks/405m0bqtoihev.js +1 -0
- package/.next/static/chunks/42wcg3wfg_m_p.js +1 -0
- package/README.md +27 -216
- package/app/api/events/app-event.ts +6 -4
- package/app/api/query-key.ts +25 -16
- package/bin/database.mjs +37 -0
- package/bin/thursday.mjs +44 -28
- package/components/ui/custom-icon.tsx +0 -60
- package/components/ui/radio-group.tsx +37 -0
- package/components/ui/shiny-text.tsx +33 -6
- package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/migration.sql +80 -24
- package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/snapshot.json +689 -110
- package/database/migrations/20260916160713_thread_cancelled/migration.sql +2 -0
- package/database/migrations/{20260911030320_opposite_jack_power → 20260916160713_thread_cancelled}/snapshot.json +706 -84
- package/docs/how-it-works.md +39 -36
- package/docs/images/keeps-going.png +0 -0
- package/docs/images/two-minds.png +0 -0
- package/docs/live-calls.md +231 -0
- package/docs/thread-rooms.md +71 -0
- package/features/ai/chatgpt.ts +1 -2
- package/features/ai/live.schema.ts +128 -0
- package/features/ai/load-tools.ts +148 -77
- package/features/ai/model.schema.ts +2 -120
- package/features/ai/model.ts +52 -88
- package/features/ai/prompts/bot.prompt.ts +91 -214
- package/features/ai/prompts/live.prompt.ts +265 -0
- package/features/ai/prompts/prompt-helper.ts +91 -32
- package/features/ai/prompts/thursday.prompt.ts +125 -172
- package/features/ai/tools/bot.tool.ts +38 -145
- package/features/ai/tools/call.tool.ts +1 -1
- package/features/ai/tools/connected.ts +5 -3
- package/features/ai/tools/mcp.tool.ts +7 -4
- package/features/ai/tools/memory.tool.ts +35 -31
- package/features/ai/tools/skills.tool.ts +36 -14
- package/features/ai/tools/studio.tool.ts +26 -21
- package/features/ai/tools/tool-name.ts +2 -5
- package/features/ai/tools/workspace.tool.ts +33 -10
- package/features/artifact/artifact.action.ts +2 -2
- package/features/artifact/artifact.query.ts +112 -61
- package/features/artifact/artifact.schema.ts +8 -6
- package/features/artifact/components/artifact-setting.tsx +83 -33
- package/features/bot/bot.action.ts +43 -36
- package/features/bot/bot.memory.ts +137 -20
- package/features/bot/bot.query.ts +28 -11
- package/features/bot/bot.run.ts +299 -636
- package/features/bot/bot.runner.ts +468 -844
- package/features/bot/bot.schema.ts +93 -82
- package/features/bot/bot.seed.ts +141 -64
- package/features/bot/components/bot-mark.tsx +324 -232
- package/features/bot/components/bot-room.tsx +1613 -697
- package/features/bot/components/bot-roster.tsx +8 -13
- package/features/bot/components/bot-setting.tsx +58 -42
- package/features/bot/components/bot-tool.tsx +55 -87
- package/features/bot/components/mark-palette.tsx +35 -32
- package/features/bot/components/path-chips.tsx +33 -3
- package/features/bot/components/thread-badge.tsx +34 -0
- package/features/bot/components/thread-reply.tsx +639 -0
- package/features/bot/components/thread-setting.tsx +674 -0
- package/features/bot/mark.const.ts +79 -31
- package/features/bot/room.query.ts +889 -0
- package/features/bot/room.schema.ts +64 -0
- package/features/bot/seed-bots.ts +2 -1
- package/features/bot/thread.query.ts +971 -0
- package/features/bot/thread.store.ts +587 -0
- package/features/config/components/voice-key.tsx +113 -88
- package/features/config/config.const.ts +5 -9
- package/features/connectors/mcp.schema.ts +0 -2
- package/features/intro/components/intro.tsx +169 -139
- package/features/memory/components/memory-setting.tsx +2 -7
- package/features/memory/memory.schema.ts +14 -23
- package/features/settings/components/setting-ui.tsx +0 -44
- package/features/settings/components/settings.tsx +12 -12
- package/features/settings/settings.alert.ts +3 -3
- package/features/settings/settings.store.ts +1 -1
- package/features/skills/skills.schema.ts +0 -2
- package/features/thursday/components/ascii-field.tsx +24 -44
- package/features/thursday/components/ascii-orb.tsx +359 -358
- package/features/thursday/components/call-log.tsx +46 -44
- package/features/thursday/components/face.tsx +35 -10
- package/features/thursday/components/tab-state.tsx +3 -3
- package/features/thursday/components/thursday-mark.tsx +1 -0
- package/features/thursday/components/thursday-setting.tsx +631 -332
- package/features/thursday/components/thursday.tsx +106 -41
- package/features/thursday/components/voice-picker.tsx +255 -0
- package/features/thursday/thursday.action.ts +94 -68
- package/features/thursday/thursday.query.ts +49 -30
- package/features/thursday/thursday.schema.ts +27 -30
- package/features/thursday/thursday.store.ts +11 -7
- package/features/thursday/tool-call.ts +3 -3
- package/features/thursday/tool-line.ts +5 -3
- package/features/thursday/use-thursday.ts +725 -450
- package/features/workspace/workspace.query.ts +17 -0
- package/features/workspace/workspace.ts +103 -50
- package/lib/live/live.schema.ts +47 -0
- package/lib/live/live.server.ts +155 -0
- package/lib/live/live.session.ts +574 -0
- package/lib/{realtime/realtime.tap.ts → live/live.tap.ts} +41 -12
- package/lib/live/live.transport.ts +152 -0
- package/lib/protocol/use-server-pages.ts +9 -5
- package/lib/utils.ts +21 -20
- package/package.json +2 -2
- package/public/voices/alloy.ogg +0 -0
- package/public/voices/ash.ogg +0 -0
- package/public/voices/ballad.ogg +0 -0
- package/public/voices/beacon.ogg +0 -0
- package/public/voices/bossa.ogg +0 -0
- package/public/voices/cedar.ogg +0 -0
- package/public/voices/cinder.ogg +0 -0
- package/public/voices/coral.ogg +0 -0
- package/public/voices/delta.ogg +0 -0
- package/public/voices/echo.ogg +0 -0
- package/public/voices/gleam.ogg +0 -0
- package/public/voices/marin.ogg +0 -0
- package/public/voices/meridian.ogg +0 -0
- package/public/voices/quartz.ogg +0 -0
- package/public/voices/ripple.ogg +0 -0
- package/public/voices/sage.ogg +0 -0
- package/public/voices/shimmer.ogg +0 -0
- package/public/voices/stone.ogg +0 -0
- package/public/voices/tempo.ogg +0 -0
- package/public/voices/verse.ogg +0 -0
- package/public/voices/vesper.ogg +0 -0
- package/public/voices/willow.ogg +0 -0
- package/scripts/artifact-paths.test.mts +25 -0
- package/scripts/bot-context.test.mts +1408 -0
- package/scripts/live-history.test.mts +115 -0
- package/scripts/live-session.test.mts +948 -0
- package/server.js +1 -1
- package/skills/browser/SKILL.md +17 -6
- package/skills/computer/SKILL.md +1 -1
- package/skills/find-skills/SKILL.md +3 -8
- package/skills/interactive-page/SKILL.md +12 -7
- package/skills/interactive-page/references/diagram.md +89 -0
- package/skills/interactive-page/scripts/archify/LICENSE +22 -0
- package/skills/interactive-page/scripts/archify/README.md +25 -0
- package/skills/interactive-page/scripts/archify/assets/JetBrainsMono-OFL.txt +93 -0
- package/skills/interactive-page/scripts/archify/assets/template.html +14934 -0
- package/skills/interactive-page/scripts/archify/bin/archify.mjs +2126 -0
- package/skills/interactive-page/scripts/archify/bin/open-artifact.mjs +86 -0
- package/skills/interactive-page/scripts/archify/bin/preview.mjs +653 -0
- package/skills/interactive-page/scripts/archify/bin/visual-check.mjs +829 -0
- package/skills/interactive-page/scripts/archify/delta/architecture-delta.mjs +1223 -0
- package/skills/interactive-page/scripts/archify/examples/agent-run.lifecycle.json +60 -0
- package/skills/interactive-page/scripts/archify/examples/agent-tool-call.workflow.json +94 -0
- package/skills/interactive-page/scripts/archify/examples/async-job-roundtrip.sequence.json +61 -0
- package/skills/interactive-page/scripts/archify/examples/cache-miss-request.sequence.json +82 -0
- package/skills/interactive-page/scripts/archify/examples/checkout-platform.base.architecture.json +31 -0
- package/skills/interactive-page/scripts/archify/examples/checkout-platform.head.architecture.json +31 -0
- package/skills/interactive-page/scripts/archify/examples/deployment-release.lifecycle.json +49 -0
- package/skills/interactive-page/scripts/archify/examples/event-stream.dataflow.json +57 -0
- package/skills/interactive-page/scripts/archify/examples/incident-response.workflow.json +64 -0
- package/skills/interactive-page/scripts/archify/examples/product-analytics.dataflow.json +76 -0
- package/skills/interactive-page/scripts/archify/examples/production-deployment.architecture.json +71 -0
- package/skills/interactive-page/scripts/archify/examples/release-delivery.workflow.json +62 -0
- package/skills/interactive-page/scripts/archify/examples/web-app.architecture.json +46 -0
- package/skills/interactive-page/scripts/archify/migrations/workflow-v2.mjs +279 -0
- package/skills/interactive-page/scripts/archify/recipes/scenarios.mjs +284 -0
- package/skills/interactive-page/scripts/archify/references/authoring-contract.md +243 -0
- package/skills/interactive-page/scripts/archify/references/delivery-contract.md +120 -0
- package/skills/interactive-page/scripts/archify/references/viewer-runtime.md +45 -0
- package/skills/interactive-page/scripts/archify/renderers/architecture/grid.mjs +62 -0
- package/skills/interactive-page/scripts/archify/renderers/architecture/render-architecture.mjs +1078 -0
- package/skills/interactive-page/scripts/archify/renderers/dataflow/README.md +104 -0
- package/skills/interactive-page/scripts/archify/renderers/dataflow/render-dataflow.mjs +483 -0
- package/skills/interactive-page/scripts/archify/renderers/lifecycle/README.md +115 -0
- package/skills/interactive-page/scripts/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
- package/skills/interactive-page/scripts/archify/renderers/sequence/README.md +114 -0
- package/skills/interactive-page/scripts/archify/renderers/sequence/render-sequence.mjs +464 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/brand-marks.mjs +563 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/cli.mjs +218 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/desktop-readability.mjs +26 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/diagnostics.mjs +127 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/engineering-profiles.mjs +157 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/generated-brand-marks.mjs +3 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/generated-validators.mjs +13 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/geometry.mjs +1423 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/i18n.mjs +595 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/layout-report.mjs +40 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/legend.mjs +217 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/output-path.mjs +340 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/repository-evidence.mjs +238 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/repository-location.mjs +58 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/text-fit.mjs +49 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/utils.mjs +232 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/validator.mjs +86 -0
- package/skills/interactive-page/scripts/archify/renderers/workflow/README.md +223 -0
- package/skills/interactive-page/scripts/archify/renderers/workflow/render-workflow.mjs +35 -0
- package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
- package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
- package/skills/interactive-page/scripts/archify/schemas/README.md +211 -0
- package/skills/interactive-page/scripts/archify/schemas/architecture.schema.json +178 -0
- package/skills/interactive-page/scripts/archify/schemas/common.schema.json +115 -0
- package/skills/interactive-page/scripts/archify/schemas/dataflow.schema.json +243 -0
- package/skills/interactive-page/scripts/archify/schemas/lifecycle.schema.json +266 -0
- package/skills/interactive-page/scripts/archify/schemas/sequence.schema.json +223 -0
- package/skills/interactive-page/scripts/archify/schemas/workflow.schema.json +428 -0
- package/skills/interactive-page/scripts/archify/scripts/check-render-output.mjs +916 -0
- package/skills/interactive-page/scripts/archify/scripts/render-examples.mjs +26 -0
- package/skills/interactive-page/scripts/bundle-artifact.sh +9 -8
- package/skills/skill-creator/SKILL.md +4 -5
- package/.next/server/app/api/bot/task/[id]/route/app-paths-manifest.json +0 -3
- package/.next/server/app/api/bot/task/[id]/route.js +0 -16
- package/.next/server/app/api/bot/task/[id]/route.js.nft.json +0 -1
- package/.next/server/app/api/bot/task/[id]/route_client-reference-manifest.js +0 -3
- package/.next/server/app/api/bot/task/route/app-paths-manifest.json +0 -3
- package/.next/server/app/api/bot/task/route.js +0 -16
- package/.next/server/app/api/bot/task/route.js.nft.json +0 -1
- package/.next/server/app/api/bot/task/route_client-reference-manifest.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__01dkp4a._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__02va5wz._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__02xjoto._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__04q--0f._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__0bl-e63._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0ffbg85._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0jq4ohy._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__0ls6_8y._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__0ncs9uu._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1-ga0kh._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__11n256_._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__12cabg9._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1339jnv._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__18_teo8._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__1anc1p9._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1ccon1w._.js +0 -10
- package/.next/server/chunks/[root-of-the-server]__1fizn31._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1llj3-b._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1p8m3f4._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1wa1k7r._.js +0 -8
- package/.next/server/chunks/_0-73of8._.js +0 -55
- package/.next/server/chunks/_0-fjql4._.js +0 -26
- package/.next/server/chunks/_00xh_q0._.js +0 -25
- package/.next/server/chunks/_03a0897._.js +0 -3
- package/.next/server/chunks/_051qh8u._.js +0 -3
- package/.next/server/chunks/_05sovvj._.js +0 -3
- package/.next/server/chunks/_0fzqt2y._.js +0 -134
- package/.next/server/chunks/_0mecv0f._.js +0 -26
- package/.next/server/chunks/_0mh8j4m._.js +0 -3
- package/.next/server/chunks/_0obojvv._.js +0 -3
- package/.next/server/chunks/_0sb7tlz._.js +0 -3
- package/.next/server/chunks/_0sbynis._.js +0 -3
- package/.next/server/chunks/_0u10wmw._.js +0 -55
- package/.next/server/chunks/_0u4aiy2._.js +0 -3
- package/.next/server/chunks/_0wp4le3._.js +0 -3
- package/.next/server/chunks/_0y5fg-x._.js +0 -3
- package/.next/server/chunks/_1230wbx._.js +0 -10
- package/.next/server/chunks/_12nheja._.js +0 -3
- package/.next/server/chunks/_13510xh._.js +0 -3
- package/.next/server/chunks/_15hq89o._.js +0 -3
- package/.next/server/chunks/_18-1wcc._.js +0 -55
- package/.next/server/chunks/_1_9mjx-._.js +0 -3
- package/.next/server/chunks/_1c78vw5._.js +0 -229
- package/.next/server/chunks/_1h5_8sk._.js +0 -3
- package/.next/server/chunks/_1hdnxb7._.js +0 -3
- package/.next/server/chunks/_1j8k_j5._.js +0 -3
- package/.next/server/chunks/_1nula3v._.js +0 -3
- package/.next/server/chunks/_1php4eq._.js +0 -3
- package/.next/server/chunks/_1yuv4vp._.js +0 -3
- package/.next/server/chunks/_1zjrdag._.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_bot_task_[id]_route_actions_1_k_8u3.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_bot_task_route_actions_0xln6ra.js +0 -3
- package/.next/server/chunks/features_0rpfxbk._.js +0 -3
- package/.next/server/chunks/features_1qf3cei._.js +0 -3
- package/.next/server/chunks/features_bot_0zt92oh._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xoq2rl._.js +0 -3
- package/.next/server/chunks/ssr/[externals]__0dizgek._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__092knlj._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0mz33a7._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0s9dq5u._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0s9l2sv._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0vnmv-s._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0xsog8n._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +0 -61
- package/.next/server/chunks/ssr/[root-of-the-server]__1gtlw6v._.js +0 -43
- package/.next/server/chunks/ssr/[root-of-the-server]__1ox7hbk._.js +0 -4
- package/.next/server/chunks/ssr/[root-of-the-server]__202p40z._.js +0 -3
- package/.next/server/chunks/ssr/_001_ms1._.js +0 -28
- package/.next/server/chunks/ssr/_01n3o0m._.js +0 -3
- package/.next/server/chunks/ssr/_0fz4mf_._.js +0 -3
- package/.next/server/chunks/ssr/_0gb4gmf._.js +0 -3
- package/.next/server/chunks/ssr/_0h42fze._.js +0 -3
- package/.next/server/chunks/ssr/_0h7zdni._.js +0 -3
- package/.next/server/chunks/ssr/_0ilna52._.js +0 -42
- package/.next/server/chunks/ssr/_0q0zan6._.js +0 -70
- package/.next/server/chunks/ssr/_0zcjrbg._.js +0 -3
- package/.next/server/chunks/ssr/_0zhoc3r._.js +0 -3
- package/.next/server/chunks/ssr/_13fke0x._.js +0 -3
- package/.next/server/chunks/ssr/_18cymkq._.js +0 -3
- package/.next/server/chunks/ssr/_1b2mjwr._.js +0 -3
- package/.next/server/chunks/ssr/_1f-dg-6._.js +0 -3
- package/.next/server/chunks/ssr/_1h0rw11._.js +0 -3
- package/.next/server/chunks/ssr/_1jhd09t._.js +0 -3
- package/.next/server/chunks/ssr/_1nnsk7z._.js +0 -3
- package/.next/server/chunks/ssr/_1ov37if._.js +0 -3
- package/.next/server/chunks/ssr/_1sji22n._.js +0 -3
- package/.next/server/chunks/ssr/_1vi_uo7._.js +0 -3
- package/.next/server/chunks/ssr/_1vyd1ji._.js +0 -3
- package/.next/server/chunks/ssr/_1xx4zlb._.js +0 -3
- package/.next/server/chunks/ssr/components_ui_1y1l7yj._.js +0 -3
- package/.next/server/chunks/ssr/features_bot_1s_-2vj._.js +0 -3
- package/.next/server/chunks/ssr/lib_realtime_12wg_dd._.js +0 -27
- package/.next/server/chunks/ssr/lib_realtime_15h_v1v._.js +0 -27
- package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0npjf8-._.js +0 -3
- package/.next/static/chunks/00rd4-v8r7axp.js +0 -1
- package/.next/static/chunks/08qe4as2q428z.js +0 -3
- package/.next/static/chunks/0gnqdjn2lvdad.js +0 -2
- package/.next/static/chunks/0hwap1-p0m5sa.js +0 -1
- package/.next/static/chunks/0r5qcctujhxli.js +0 -1
- package/.next/static/chunks/0w52rrrmuj9r9.js +0 -1
- package/.next/static/chunks/0wcprt5ot5she.js +0 -1
- package/.next/static/chunks/10teww7wt-f6h.js +0 -1
- package/.next/static/chunks/17p6tk6k88dq6.js +0 -1
- package/.next/static/chunks/18a96rkhi4_yd.js +0 -1
- package/.next/static/chunks/1dkjg87pxk0n9.js +0 -28
- package/.next/static/chunks/1jd09sxcjddu1.js +0 -1
- package/.next/static/chunks/1w73ece_6bheu.js +0 -18
- package/.next/static/chunks/214ya3n5gxeih.js +0 -1
- package/.next/static/chunks/22_zkas21rpna.js +0 -1
- package/.next/static/chunks/2fh4-3z_q8b_w.js +0 -1
- package/.next/static/chunks/2h0sd2vumhb15.js +0 -1
- package/.next/static/chunks/2t4vhi3m8ahya.js +0 -1
- package/.next/static/chunks/2tigdtz3dpcy8.js +0 -1
- package/.next/static/chunks/2u7xt6mxg44lf.js +0 -1
- package/.next/static/chunks/3786h5vayt80-.js +0 -28
- package/.next/static/chunks/39j0fvpybzabl.js +0 -40
- package/.next/static/chunks/3cq5g494yuke8.css +0 -1
- package/.next/static/chunks/3hibbjnt85-k6.js +0 -1
- package/.next/static/chunks/3woj-xd7ki5_i.js +0 -1
- package/.next/static/chunks/3xk7yqgomx7yq.js +0 -1
- package/.next/static/chunks/3zmcsnuo25zvq.js +0 -1
- package/database/migrations/20260911030320_opposite_jack_power/migration.sql +0 -1
- package/docs/images/task-thread.png +0 -0
- package/features/bot/components/task-badge.tsx +0 -42
- package/features/bot/components/task-reply.tsx +0 -328
- package/features/bot/components/task-setting.tsx +0 -524
- package/features/bot/task.query.ts +0 -976
- package/features/bot/task.store.ts +0 -489
- package/lib/realtime/client-secret.ts +0 -86
- package/lib/realtime/open-session.ts +0 -31
- package/lib/realtime/openai.ts +0 -35
- package/lib/realtime/realtime.audio.ts +0 -196
- package/lib/realtime/realtime.driver.ts +0 -489
- package/lib/realtime/realtime.protocol.ts +0 -393
- package/lib/realtime/realtime.schema.ts +0 -37
- package/lib/realtime/realtime.session.ts +0 -106
- package/lib/realtime/realtime.transport.ts +0 -384
- package/lib/realtime/xai.ts +0 -39
- /package/.next/server/app/api/bot/{task → thread}/[id]/route/build-manifest.json +0 -0
- /package/.next/server/app/api/bot/{task → thread}/[id]/route/server-reference-manifest.json +0 -0
- /package/.next/server/app/api/bot/{task → thread}/[id]/route.js.map +0 -0
- /package/.next/server/app/api/bot/{task → thread}/route/build-manifest.json +0 -0
- /package/.next/server/app/api/bot/{task → thread}/route/server-reference-manifest.json +0 -0
- /package/.next/server/app/api/bot/{task → thread}/route.js.map +0 -0
- /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → 0qzGoKn2wTERVZtblX1tp}/_buildManifest.js +0 -0
- /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → 0qzGoKn2wTERVZtblX1tp}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → 0qzGoKn2wTERVZtblX1tp}/_ssgManifest.js +0 -0
|
@@ -1,21 +1,14 @@
|
|
|
1
|
-
import { stat } from "node:fs/promises";
|
|
2
|
-
import { tool } from "ai";
|
|
3
1
|
import * as z from "zod";
|
|
2
|
+
import { THREAD_STATUS_LIMIT } from "@/config";
|
|
4
3
|
import { TOOL_NAMES } from "@/features/ai/tools/tool-name";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Specs for the tools that move work between the voice session and bots. Only what the model
|
|
10
|
-
* sees lives here; execution belongs to whoever runs the tool (load-tools, bot.run), and the
|
|
11
|
-
* screen draws a call off its spec (task.query). `answer` has its own execute because what it
|
|
12
|
-
* checks is a file on disk.
|
|
13
|
-
*/
|
|
4
|
+
import { THREAD_CONTINUE } from "@/features/bot/bot.schema";
|
|
5
|
+
import { RoomMessageSchema } from "@/features/bot/room.schema";
|
|
14
6
|
|
|
7
|
+
/** Tools for starting a thread, sending messages, and following work from the call. */
|
|
15
8
|
export const delegateSpec = {
|
|
16
9
|
name: TOOL_NAMES.delegate,
|
|
17
10
|
description:
|
|
18
|
-
"Hand a job to a bot. Returns
|
|
11
|
+
"Hand a job to a bot. Returns a receipt at once; the job runs in the background and its updates reach the conversation on their own.",
|
|
19
12
|
parameters: z.object({
|
|
20
13
|
bot: z.string().describe("A name from the bot list."),
|
|
21
14
|
request: z
|
|
@@ -32,166 +25,66 @@ export const delegateSpec = {
|
|
|
32
25
|
}),
|
|
33
26
|
};
|
|
34
27
|
|
|
35
|
-
|
|
36
|
-
* `context` carries what the asking bot found, since its thread is not handed over (bot.run).
|
|
37
|
-
* `request` is a brief, not a line: the borrowed bot sees nothing else.
|
|
38
|
-
*/
|
|
39
|
-
export const askBotSpec = {
|
|
40
|
-
name: TOOL_NAMES.ask_bot,
|
|
28
|
+
export const sendMessageSpec = {
|
|
41
29
|
description:
|
|
42
|
-
"
|
|
43
|
-
parameters:
|
|
44
|
-
|
|
45
|
-
|
|
30
|
+
"Send a message to a participant or Thursday and receive a delivery receipt immediately. Mark a question for Thursday to request user input; ordinary messages to Thursday are notifications and need no answer.",
|
|
31
|
+
parameters: RoomMessageSchema.extend({
|
|
32
|
+
kind: RoomMessageSchema.shape.kind.describe(
|
|
33
|
+
"Use question only when Thursday must obtain an answer from the user: it ends your turn, and you continue when the answer arrives. Use message for bot collaboration, progress updates and reports.",
|
|
34
|
+
),
|
|
35
|
+
options: RoomMessageSchema.shape.options.describe(
|
|
36
|
+
"With a question, offer concise answer choices when useful. Omit for an open-ended question; the user can always type their own answer.",
|
|
37
|
+
),
|
|
38
|
+
to: z
|
|
46
39
|
.string()
|
|
47
|
-
.
|
|
48
|
-
|
|
49
|
-
),
|
|
50
|
-
|
|
40
|
+
.trim()
|
|
41
|
+
.min(1)
|
|
42
|
+
.describe("Choose a bot from the roster, or Thursday to reach the user."),
|
|
43
|
+
text: z
|
|
51
44
|
.string()
|
|
45
|
+
.trim()
|
|
46
|
+
.min(1)
|
|
52
47
|
.describe(
|
|
53
|
-
"
|
|
48
|
+
"Write the message and include the context the recipient needs.",
|
|
54
49
|
),
|
|
55
|
-
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* The borrowed bot's one way up. The borrowing bot answers in one model call over its own
|
|
60
|
-
* context, without tools (bot.run answerBack); nothing stops. No options, since nobody reads
|
|
61
|
-
* these aloud; the count is structural (bot.run MAX_ASK_BACK).
|
|
62
|
-
*/
|
|
63
|
-
export const askBackSpec = {
|
|
64
|
-
name: TOOL_NAMES.ask_back,
|
|
65
|
-
description:
|
|
66
|
-
"Ask the bot that handed you this part. They answer from what they have — the original request, the call it came from, what they found before asking you.",
|
|
67
|
-
parameters: z.object({
|
|
68
|
-
question: z
|
|
50
|
+
replyTo: z
|
|
69
51
|
.string()
|
|
52
|
+
.nullish()
|
|
70
53
|
.describe(
|
|
71
|
-
"
|
|
54
|
+
"Use an incoming message ID to send an explicit reply; omit to start a new exchange. Your ordinary final text already replies to your current correspondent.",
|
|
72
55
|
),
|
|
73
56
|
}),
|
|
74
57
|
};
|
|
75
58
|
|
|
76
|
-
/**
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
* may ask. Options are the one structure that works both on screen and read aloud; there is
|
|
81
|
-
* no input type.
|
|
82
|
-
*/
|
|
83
|
-
export const askThursdaySpec = {
|
|
84
|
-
name: TOOL_NAMES.ask_thursday,
|
|
85
|
-
description:
|
|
86
|
-
"Ask Thursday, who handed you this job. The job stops until an answer comes back.",
|
|
59
|
+
/** The voice session's handle on a job already handed over. Run by the server, like `delegate` (load-tools). */
|
|
60
|
+
export const threadSpec = {
|
|
61
|
+
name: TOOL_NAMES.thread,
|
|
62
|
+
description: `List up to ${THREAD_STATUS_LIMIT} jobs, prioritizing running and waiting work before recent endings; inspect one job, answer it, cancel it, open it on the user's screen, or mark it seen — the same as the user opening it, which takes it off the work waiting on them.`,
|
|
87
63
|
parameters: z.object({
|
|
88
|
-
|
|
64
|
+
action: z.enum(["status", "answer", "cancel", "open", "seen"]),
|
|
65
|
+
recipient: z
|
|
89
66
|
.string()
|
|
90
|
-
.describe(
|
|
91
|
-
"One whole question — what you need and why. One or two sentences, in the user's language: she may read it to them out loud, options and all.",
|
|
92
|
-
),
|
|
93
|
-
// A string is accepted as well as an array: a provider may serialize the array as one
|
|
94
|
-
// joined string, and a schema rejection only loops. The reader takes arrays only (task.query optionsOf)
|
|
95
|
-
options: z
|
|
96
|
-
.union([z.string().array(), z.string()])
|
|
97
67
|
.nullish()
|
|
98
68
|
.describe(
|
|
99
|
-
|
|
69
|
+
"With answer, name the participant to receive it. Words to a participant waiting on its question answer that question; omit to reach the only open question, or the coordinator when none is open.",
|
|
100
70
|
),
|
|
101
|
-
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* The one way a run ends on its own terms; the loop is stopped by it (`hasToolCall`, bot.run).
|
|
106
|
-
* Whether the job is over is the runtime's to say, never an argument: an answer ends it, and a
|
|
107
|
-
* run the app stopped first (bot.run `stopped`) waits to be continued.
|
|
108
|
-
*/
|
|
109
|
-
export const answerSpec = {
|
|
110
|
-
name: TOOL_NAMES.answer,
|
|
111
|
-
description:
|
|
112
|
-
"Answer the job you were given. Calling this ends the job — nothing after it runs.",
|
|
113
|
-
parameters: z.object({
|
|
114
|
-
result: z
|
|
71
|
+
replyTo: z
|
|
115
72
|
.string()
|
|
73
|
+
.nullish()
|
|
116
74
|
.describe(
|
|
117
|
-
"
|
|
75
|
+
"With answer, use the message ID of the question being answered when several questions are open.",
|
|
118
76
|
),
|
|
119
|
-
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
/** The voice session's handle on a job already handed over. Run by the server, like `delegate` (load-tools). */
|
|
123
|
-
export const taskSpec = {
|
|
124
|
-
name: TOOL_NAMES.task,
|
|
125
|
-
description:
|
|
126
|
-
"Check a job you handed over, answer what it is asking, or cancel it.",
|
|
127
|
-
parameters: z.object({
|
|
128
|
-
action: z.enum(["status", "answer", "cancel"]),
|
|
129
|
-
task: z
|
|
77
|
+
thread: z
|
|
130
78
|
.string()
|
|
131
79
|
.nullish()
|
|
132
80
|
.describe(
|
|
133
|
-
|
|
81
|
+
`Identify the job by label or ID. With status, omit or use null to list up to ${THREAD_STATUS_LIMIT} jobs, prioritizing open work and filling remaining places with recent endings; name one to read its full result and pending questions. With open, omit to show the job that moved last. With answer, omit only to answer the one question waiting.`,
|
|
134
82
|
),
|
|
135
83
|
answer: z
|
|
136
84
|
.string()
|
|
137
85
|
.nullish()
|
|
138
86
|
.describe(
|
|
139
|
-
|
|
87
|
+
`With \`answer\`: what to tell the bot — the answer to its question, a course correction for a job still running, or what to do next on one that finished. \`${THREAD_CONTINUE}\` carries on a job that stopped before finishing, from where it was.`,
|
|
140
88
|
),
|
|
141
89
|
}),
|
|
142
90
|
};
|
|
143
|
-
|
|
144
|
-
/** Deliberately no `execute` — the loop halts here. See askThursdaySpec. */
|
|
145
|
-
export const askThursdayTool = tool({
|
|
146
|
-
description: askThursdaySpec.description,
|
|
147
|
-
inputSchema: askThursdaySpec.parameters,
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* `answer` does have an execute, and it only acknowledges. The loop is stopped
|
|
152
|
-
* by `hasToolCall` after the step, not by the absence of an execute — that way
|
|
153
|
-
* the call and its result are both written to the thread, and a resumed run
|
|
154
|
-
* reads a finished exchange rather than a call left hanging.
|
|
155
|
-
*/
|
|
156
|
-
export const answerTool = tool({
|
|
157
|
-
description: answerSpec.description,
|
|
158
|
-
inputSchema: answerSpec.parameters,
|
|
159
|
-
execute: async ({ result }) => {
|
|
160
|
-
const missing = await missingFiles(result);
|
|
161
|
-
if (missing.length) {
|
|
162
|
-
return `${NOT_ANSWERED} these files do not exist — ${missing.join(", ")}. Write them first, or take the paths out of the answer.`;
|
|
163
|
-
}
|
|
164
|
-
return "Answered. The job is closed; nothing further runs.";
|
|
165
|
-
},
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* An answer naming a workspace file that does not exist is refused: the path becomes a link
|
|
170
|
-
* and opens by itself (bot.runner artifactIn). Paths outside the workspace are not checked.
|
|
171
|
-
*/
|
|
172
|
-
const NOT_ANSWERED = "Not answered:";
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
* `answer` was called `report` before it was renamed. A stored thread keeps the name the
|
|
176
|
-
* call was made under, and the room draws that call as the job's prose — so the three
|
|
177
|
-
* places that read messages back match either name. Nothing writes the old one.
|
|
178
|
-
*/
|
|
179
|
-
export const isAnswerCall = (toolName: string): boolean =>
|
|
180
|
-
toolName === TOOL_NAMES.answer || toolName === "report";
|
|
181
|
-
|
|
182
|
-
export const answerAccepted = (output: unknown): boolean =>
|
|
183
|
-
typeof output !== "string" || !output.startsWith(NOT_ANSWERED);
|
|
184
|
-
|
|
185
|
-
async function missingFiles(result: string): Promise<string[]> {
|
|
186
|
-
const missing: string[] = [];
|
|
187
|
-
for (const rel of pathsIn(result)) {
|
|
188
|
-
const full = await insideWorkspace(rel);
|
|
189
|
-
if (!full) continue;
|
|
190
|
-
const exists = await stat(full).then(
|
|
191
|
-
(info) => info.isFile(),
|
|
192
|
-
() => false,
|
|
193
|
-
);
|
|
194
|
-
if (!exists) missing.push(rel);
|
|
195
|
-
}
|
|
196
|
-
return missing;
|
|
197
|
-
}
|
|
@@ -11,7 +11,7 @@ export const endCallSpec = {
|
|
|
11
11
|
name: TOOL_NAMES.end_call,
|
|
12
12
|
description: `End the call.
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
The line stays open until this runs, and drops once the goodbye being said is over.`,
|
|
15
15
|
parameters: z.object({}),
|
|
16
16
|
};
|
|
17
17
|
|
|
@@ -88,7 +88,8 @@ export async function callConnectedTool(
|
|
|
88
88
|
server: string,
|
|
89
89
|
name: string,
|
|
90
90
|
args: Record<string, unknown> | undefined,
|
|
91
|
-
|
|
91
|
+
/** `artifacts`: the calling bot's folder, where the studio saves what it makes (workspace.ts botArtifacts). */
|
|
92
|
+
{ artifacts, abortSignal }: { artifacts: string; abortSignal?: AbortSignal },
|
|
92
93
|
): Promise<McpCallOutcome> {
|
|
93
94
|
const deadline = AbortSignal.timeout(CONNECTED_TOOL_TIMEOUT_MS);
|
|
94
95
|
const signal = abortSignal
|
|
@@ -97,7 +98,7 @@ export async function callConnectedTool(
|
|
|
97
98
|
try {
|
|
98
99
|
const text =
|
|
99
100
|
server === STUDIO_SERVER
|
|
100
|
-
? await callStudioTool(sandbox, name, args, signal)
|
|
101
|
+
? await callStudioTool(sandbox, name, args, artifacts, signal)
|
|
101
102
|
: await callMcpTool(server, name, args, signal);
|
|
102
103
|
if (typeof text !== "string") return text;
|
|
103
104
|
return {
|
|
@@ -126,6 +127,7 @@ async function callStudioTool(
|
|
|
126
127
|
sandbox: Sandbox,
|
|
127
128
|
name: string,
|
|
128
129
|
args: Record<string, unknown> | undefined,
|
|
130
|
+
artifacts: string,
|
|
129
131
|
abortSignal?: AbortSignal,
|
|
130
132
|
): Promise<string> {
|
|
131
133
|
const tool = (await loadStudio()).find((one) => one.name === name);
|
|
@@ -135,7 +137,7 @@ async function callStudioTool(
|
|
|
135
137
|
`"${name}" is not in the ${STUDIO_SERVER} right now — the key that runs it is gone.`,
|
|
136
138
|
);
|
|
137
139
|
}
|
|
138
|
-
return tool.execute(args ?? {}, { sandbox, abortSignal });
|
|
140
|
+
return tool.execute(args ?? {}, { sandbox, artifacts, abortSignal });
|
|
139
141
|
}
|
|
140
142
|
|
|
141
143
|
/** Definitions come from what the last connect stored (mcp.query); a session is opened only for a tool that runs (mcp.manager). */
|
|
@@ -2,6 +2,7 @@ import { jsonSchema, type ToolSet, tool } from "ai";
|
|
|
2
2
|
import * as z from "zod";
|
|
3
3
|
import { TOOL_NAMES } from "@/features/ai/tools/tool-name";
|
|
4
4
|
import { findPinnedTools } from "@/features/connectors/mcp.query";
|
|
5
|
+
import { botArtifacts } from "@/features/workspace/workspace";
|
|
5
6
|
import type { Sandbox } from "@/lib/sandbox";
|
|
6
7
|
import {
|
|
7
8
|
callConnectedTool,
|
|
@@ -89,6 +90,7 @@ export async function createMcpTools(
|
|
|
89
90
|
findPinnedTools(botName),
|
|
90
91
|
]);
|
|
91
92
|
const tools: ToolSet = {};
|
|
93
|
+
const artifacts = botArtifacts(botName);
|
|
92
94
|
|
|
93
95
|
for (const entry of pinned) {
|
|
94
96
|
const key = toolNameFor(entry.server, entry.name);
|
|
@@ -110,13 +112,14 @@ export async function createMcpTools(
|
|
|
110
112
|
entry.server,
|
|
111
113
|
entry.name,
|
|
112
114
|
(args ?? undefined) as Record<string, unknown> | undefined,
|
|
113
|
-
abortSignal,
|
|
115
|
+
{ artifacts, abortSignal },
|
|
114
116
|
),
|
|
115
117
|
});
|
|
116
118
|
}
|
|
117
119
|
|
|
118
120
|
// The search pair only when something is left to find; otherwise `tool_search` could only refuse
|
|
119
|
-
if (all.length > pinned.length)
|
|
121
|
+
if (all.length > pinned.length)
|
|
122
|
+
Object.assign(tools, searchPair(sandbox, artifacts));
|
|
120
123
|
return tools;
|
|
121
124
|
}
|
|
122
125
|
|
|
@@ -132,7 +135,7 @@ async function whatExists(server: string): Promise<string> {
|
|
|
132
135
|
: "Nothing is connected.";
|
|
133
136
|
}
|
|
134
137
|
|
|
135
|
-
const searchPair = (sandbox: Sandbox): ToolSet => ({
|
|
138
|
+
const searchPair = (sandbox: Sandbox, artifacts: string): ToolSet => ({
|
|
136
139
|
[TOOL_NAMES.tool_search]: tool({
|
|
137
140
|
description: mcpToolSpec[TOOL_NAMES.tool_search].description,
|
|
138
141
|
inputSchema: mcpToolSpec[TOOL_NAMES.tool_search].parameters,
|
|
@@ -179,7 +182,7 @@ const searchPair = (sandbox: Sandbox): ToolSet => ({
|
|
|
179
182
|
server.trim(),
|
|
180
183
|
name.trim(),
|
|
181
184
|
args ?? undefined,
|
|
182
|
-
abortSignal,
|
|
185
|
+
{ artifacts, abortSignal },
|
|
183
186
|
);
|
|
184
187
|
},
|
|
185
188
|
}),
|
|
@@ -15,16 +15,21 @@ import {
|
|
|
15
15
|
writeNotes,
|
|
16
16
|
} from "@/features/memory/memory.query";
|
|
17
17
|
import {
|
|
18
|
-
APP_NAMED_NOTES,
|
|
19
18
|
appNoteLine,
|
|
20
|
-
|
|
19
|
+
isAlwaysListed,
|
|
21
20
|
isMemoryPath,
|
|
22
|
-
|
|
21
|
+
MEMORY_ALWAYS_LISTED,
|
|
22
|
+
MEMORY_PATHS,
|
|
23
23
|
type MemoryNoteView,
|
|
24
24
|
type MemorySource,
|
|
25
25
|
} from "@/features/memory/memory.schema";
|
|
26
26
|
import { readCallConversation } from "@/features/thursday/thursday.query";
|
|
27
27
|
|
|
28
|
+
/** `profile, preferences, people/<name>, …` — the shapes a new note's path may take. */
|
|
29
|
+
const PATH_SHAPES = MEMORY_PATHS.map((entry) =>
|
|
30
|
+
entry.path.endsWith("/") ? `${entry.path}<name>` : entry.path,
|
|
31
|
+
).join(", ");
|
|
32
|
+
|
|
28
33
|
const GONE =
|
|
29
34
|
"Deleted for good. The listing in your instructions is from when this session opened and still shows it that way until the next one.";
|
|
30
35
|
|
|
@@ -107,7 +112,7 @@ export const createMemoryTools = (
|
|
|
107
112
|
path: z
|
|
108
113
|
.string()
|
|
109
114
|
.describe(
|
|
110
|
-
"Exactly as the listing writes it, or a new path following the same convention.",
|
|
115
|
+
"The group this note is found by — the person, project or topic its facts are about. Exactly as the listing writes it, or a new path following the same convention. A fact goes under the one note it is about; other notes name it rather than repeat it.",
|
|
111
116
|
),
|
|
112
117
|
facts: z
|
|
113
118
|
.object({
|
|
@@ -121,7 +126,7 @@ export const createMemoryTools = (
|
|
|
121
126
|
.int()
|
|
122
127
|
.nullish()
|
|
123
128
|
.describe(
|
|
124
|
-
|
|
129
|
+
`The id of the fact this replaces — from this note as handed back here or by \`${TOOL_NAMES.memory_recall}\`. Null if this is new. A fact that stopped being true is replaced rather than deleted, and so is a note saying the same thing twice: replacing keeps what changed on the record, deleting does not.`,
|
|
125
130
|
),
|
|
126
131
|
alwaysLoad: z
|
|
127
132
|
.boolean()
|
|
@@ -139,28 +144,27 @@ export const createMemoryTools = (
|
|
|
139
144
|
.string()
|
|
140
145
|
.nullish()
|
|
141
146
|
.describe(
|
|
142
|
-
`One line saying what this note
|
|
147
|
+
`One line saying what this note holds, so the listing alone tells which facts are inside. Give it for a new note, and again with new facts: rewritten from the current line and the new facts together, so it covers the whole note rather than only what was added. Null leaves it; ${MEMORY_ALWAYS_LISTED.join(", ")} keep their own line.`,
|
|
143
148
|
),
|
|
144
149
|
aliases: z
|
|
145
150
|
.string()
|
|
146
151
|
.array()
|
|
147
152
|
.nullish()
|
|
148
153
|
.describe(
|
|
149
|
-
'What the user calls this note out loud, in the language they say it — the words they would use to ask for it, not the facts inside. A note at people/
|
|
154
|
+
'What the user calls this note out loud, in the language they say it — the words they would use to ask for it, not the facts inside. A note at people/partner might be "my partner" and their first name. Replaces the set it has, so send the whole set. Null leaves it.',
|
|
150
155
|
),
|
|
151
156
|
}),
|
|
152
157
|
execute: async (input) => {
|
|
153
|
-
// Resolve the name the way recall does (memory.query resolveNotePath), so a note opened by alias is written to itself
|
|
158
|
+
// Resolve the name the way recall does (memory.query resolveNotePath), so a note opened by alias is written to itself
|
|
154
159
|
const said = input.path.trim();
|
|
155
160
|
const known = await resolveNotePath(said);
|
|
156
161
|
const aliases = input.aliases ?? null;
|
|
157
|
-
// The listing line of the
|
|
158
|
-
//
|
|
159
|
-
//
|
|
160
|
-
//
|
|
161
|
-
// (thursday.prompt) asks the model to set it.
|
|
162
|
+
// The listing line of the always-listed notes is the app's (memory.schema
|
|
163
|
+
// MEMORY_ALWAYS_LISTED); the model's description is ignored there and
|
|
164
|
+
// its own line written instead. `alwaysLoad` is not forced on them: its
|
|
165
|
+
// own schema says what it is for (what to call them, their language).
|
|
162
166
|
const target = known ?? said;
|
|
163
|
-
const description =
|
|
167
|
+
const description = isAlwaysListed(target)
|
|
164
168
|
? appNoteLine(target)
|
|
165
169
|
: input.description?.trim() || null;
|
|
166
170
|
const facts = input.facts ?? [];
|
|
@@ -169,31 +173,26 @@ export const createMemoryTools = (
|
|
|
169
173
|
note: "Nothing to write: send facts, a line, names, or any of them.",
|
|
170
174
|
};
|
|
171
175
|
}
|
|
176
|
+
// Refused rather than filed elsewhere: a note is found by its path, line and names, and a catch-all keeps none of them
|
|
177
|
+
if (!known && !isMemoryPath(said)) {
|
|
178
|
+
return {
|
|
179
|
+
note: `Nothing was saved: "${said}" is not a path this listing can carry. Write it again under one of ${PATH_SHAPES}.`,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
172
182
|
// Naming amends, never creates: a note without facts is not listed (memory.query listNoteIndex)
|
|
173
183
|
if (!known && !facts.length) {
|
|
174
184
|
return {
|
|
175
185
|
note: `Nothing on the listing called ${said}. A note comes into being with a fact — send at least one.`,
|
|
176
186
|
};
|
|
177
187
|
}
|
|
178
|
-
// A new path outside the convention goes to inbox, which keeps its own line and takes no aliases
|
|
179
|
-
const toInbox = !known && !isMemoryPath(said);
|
|
180
|
-
const filed = toInbox
|
|
181
|
-
? {
|
|
182
|
-
path: MEMORY_INBOX,
|
|
183
|
-
description: appNoteLine(MEMORY_INBOX),
|
|
184
|
-
facts,
|
|
185
|
-
}
|
|
186
|
-
: { path: target, description, aliases, facts };
|
|
187
188
|
|
|
188
|
-
const write = await writeNotes(
|
|
189
|
+
const write = await writeNotes(
|
|
190
|
+
[{ path: target, description, aliases, facts }],
|
|
191
|
+
source,
|
|
192
|
+
callId,
|
|
193
|
+
);
|
|
189
194
|
|
|
190
195
|
// The write already succeeded; what follows are requests, not failures.
|
|
191
|
-
// Only a path that landed in inbox is said: one reached by a name the
|
|
192
|
-
// listing carries is where it was asked for, however it was spelled.
|
|
193
|
-
const elsewhere = toInbox
|
|
194
|
-
? ` Filed under ${filed.path}: "${said}" is not a path this listing can carry. If that is not where it belongs, write it again under one that is.`
|
|
195
|
-
: "";
|
|
196
|
-
|
|
197
196
|
const unnamed = write.unnamed.length
|
|
198
197
|
? ` ${write.unnamed[0]} is new and has no line yet — the listing shows its first fact instead. Call again with \`description\` (one line about what it is) and \`aliases\` (the names they say for it).`
|
|
199
198
|
: "";
|
|
@@ -206,9 +205,14 @@ export const createMemoryTools = (
|
|
|
206
205
|
)} saved as an ordinary fact. Say which carried line you would drop for it and let them choose.`
|
|
207
206
|
: "";
|
|
208
207
|
const written = withCount(write.notes[0]);
|
|
208
|
+
// New facts under a line that was not resent: the listing is what a later call opens a note by
|
|
209
|
+
const stale =
|
|
210
|
+
known && facts.length && !description
|
|
211
|
+
? ` Its line still reads "${written.description}"; if that no longer says what the note holds, send \`description\`.`
|
|
212
|
+
: "";
|
|
209
213
|
return {
|
|
210
214
|
...written,
|
|
211
|
-
note: `${WROTE}${
|
|
215
|
+
note: `${WROTE}${unnamed}${notLoaded}${stale}${overSize(written.factCount)}`,
|
|
212
216
|
};
|
|
213
217
|
},
|
|
214
218
|
}),
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { tool } from "ai";
|
|
2
2
|
import z from "zod";
|
|
3
3
|
import { TOOL_NAMES } from "@/features/ai/tools/tool-name";
|
|
4
|
-
import
|
|
4
|
+
import {
|
|
5
|
+
loadSkills,
|
|
6
|
+
type SkillMetadata,
|
|
7
|
+
} from "@/features/skills/skills.discover";
|
|
5
8
|
import { splitFrontmatter } from "@/features/skills/skills.query";
|
|
6
9
|
import type { Sandbox } from "@/lib/sandbox";
|
|
7
10
|
|
|
8
11
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* The tool set is built per run, so the `loaded` set lives in this closure.
|
|
12
|
+
* Reuse instructions only while their full text remains in this bot's context.
|
|
13
|
+
* A resume can carry them; compaction can remove them.
|
|
12
14
|
*/
|
|
13
15
|
export const createSkillTools = ({
|
|
14
16
|
skills,
|
|
@@ -17,7 +19,6 @@ export const createSkillTools = ({
|
|
|
17
19
|
skills: SkillMetadata[];
|
|
18
20
|
sandbox: Sandbox;
|
|
19
21
|
}) => {
|
|
20
|
-
const loaded = new Set<string>();
|
|
21
22
|
return {
|
|
22
23
|
[TOOL_NAMES.load_skill]: tool({
|
|
23
24
|
description:
|
|
@@ -26,25 +27,47 @@ export const createSkillTools = ({
|
|
|
26
27
|
name: z
|
|
27
28
|
.string()
|
|
28
29
|
.describe(
|
|
29
|
-
"Exact name from the Skills list
|
|
30
|
+
"Exact name from the Skills list, or of a skill installed during this job. Do not guess names.",
|
|
30
31
|
),
|
|
31
32
|
}),
|
|
32
|
-
execute: async ({ name }) => {
|
|
33
|
-
const
|
|
34
|
-
(s) => s.name.toLowerCase() === name.toLowerCase()
|
|
35
|
-
|
|
33
|
+
execute: async ({ name }, { messages }) => {
|
|
34
|
+
const named = (list: SkillMetadata[]) =>
|
|
35
|
+
list.find((s) => s.name.toLowerCase() === name.toLowerCase());
|
|
36
|
+
// The list is read when the run starts; a skill installed since is only on disk
|
|
37
|
+
const listed = named(skills) ? skills : await loadSkills(sandbox);
|
|
38
|
+
const skill = named(listed);
|
|
36
39
|
if (!skill) {
|
|
37
40
|
return {
|
|
38
41
|
error: `No skill named '${name}'.`,
|
|
39
|
-
available:
|
|
42
|
+
available: listed.map((s) => s.name),
|
|
40
43
|
};
|
|
41
44
|
}
|
|
42
45
|
|
|
43
46
|
const skillFile = `${skill.path}/SKILL.md`;
|
|
44
|
-
|
|
47
|
+
const carried = messages.some(
|
|
48
|
+
(message) =>
|
|
49
|
+
Array.isArray(message.content) &&
|
|
50
|
+
message.content.some((part) => {
|
|
51
|
+
if (
|
|
52
|
+
part.type !== "tool-result" ||
|
|
53
|
+
part.toolName !== TOOL_NAMES.load_skill ||
|
|
54
|
+
part.output.type !== "json"
|
|
55
|
+
)
|
|
56
|
+
return false;
|
|
57
|
+
const value = part.output.value as {
|
|
58
|
+
skillDirectory?: string;
|
|
59
|
+
content?: string;
|
|
60
|
+
} | null;
|
|
61
|
+
return (
|
|
62
|
+
value?.skillDirectory === skill.path &&
|
|
63
|
+
typeof value.content === "string"
|
|
64
|
+
);
|
|
65
|
+
}),
|
|
66
|
+
);
|
|
67
|
+
if (carried) {
|
|
45
68
|
return {
|
|
46
69
|
skillDirectory: skill.path,
|
|
47
|
-
note: `
|
|
70
|
+
note: `Use the full '${skill.name}' instructions already in your conversation. To check for changes on disk, read ${skillFile} with the shell.`,
|
|
48
71
|
};
|
|
49
72
|
}
|
|
50
73
|
|
|
@@ -55,7 +78,6 @@ export const createSkillTools = ({
|
|
|
55
78
|
path: skill.path,
|
|
56
79
|
limit: 50,
|
|
57
80
|
});
|
|
58
|
-
loaded.add(skill.path);
|
|
59
81
|
|
|
60
82
|
return {
|
|
61
83
|
skillDirectory: skill.path,
|