thursday-agent 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +3 -2
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.json +8 -1
- package/.next/routes-manifest.json +18 -6
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +13 -13
- package/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +12 -12
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/artifact/route.js +10 -6
- package/.next/server/app/api/artifact/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/files/route.js +5 -4
- package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/route.js +8 -8
- package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/route.js +8 -8
- package/.next/server/app/api/bot/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/thread/[id]/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/bot/thread/[id]/route.js +15 -0
- package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/bot/thread/[id]/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/bot/thread/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/bot/thread/route.js +15 -0
- package/.next/server/app/api/bot/thread/route.js.nft.json +1 -0
- package/.next/server/app/api/bot/thread/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/config/route.js +7 -7
- package/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/server/app/api/events/route.js +3 -3
- package/.next/server/app/api/events/route.js.nft.json +1 -1
- package/.next/server/app/api/file/[...path]/route.js +4 -4
- package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/catalog/route.js +8 -8
- package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/credits/route.js +8 -8
- package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/route.js +8 -8
- package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/subscription/route.js +8 -8
- package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/[name]/route.js +6 -6
- package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/oauth/callback/route.js +4 -4
- package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/route.js +6 -6
- package/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/tools/route.js +6 -6
- package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/edit/route.js +15 -15
- package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/route.js +7 -6
- package/.next/server/app/api/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[source]/[name]/route.js +6 -6
- package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route.js +6 -6
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/call/route.js +10 -11
- package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/skills/route.js +9 -10
- package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/tool-call/route.js +15 -15
- package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/missing/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/workspace/missing/route/build-manifest.json +12 -0
- package/.next/server/app/api/workspace/missing/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/workspace/missing/route.js +12 -0
- package/.next/server/app/api/workspace/missing/route.js.map +5 -0
- package/.next/server/app/api/workspace/missing/route.js.nft.json +1 -0
- package/.next/server/app/api/workspace/missing/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/workspace/route.js +5 -5
- package/.next/server/app/api/workspace/route.js.nft.json +1 -1
- package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +1 -1
- package/.next/server/app/artifact/[...path]/page.js +4 -3
- package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
- package/.next/server/app/page/server-reference-manifest.json +67 -45
- package/.next/server/app/page.js +11 -9
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +3 -2
- package/.next/server/chunks/[root-of-the-server]__0-06t3f._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__02846fb._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__05luceg._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__06--3q3._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__06l05n_._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__07bnah_._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__08eae20._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__0_ue8oe._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0btqrct._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0c9fgca._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__0h_x6q6._.js +5 -0
- package/.next/server/chunks/{[root-of-the-server]__0pa2n68._.js → [root-of-the-server]__0kxrvxf._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__0q0vvt2._.js → [root-of-the-server]__0ov3iir._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__0qwtlmx._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__0sm5xvm._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0zp35ul._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__144u9d_._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__18-2tsq._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1e-ci13._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1e2365e._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__1fix932._.js +8 -0
- package/.next/server/chunks/{[root-of-the-server]__0ce8nf8._.js → [root-of-the-server]__1g3t7vn._.js} +3 -3
- package/.next/server/chunks/[root-of-the-server]__1kp-83u._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1kv8p3e._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1orn-5b._.js +2 -3
- package/.next/server/chunks/_02szwk8._.js +5 -0
- package/.next/server/chunks/_05h2cii._.js +1 -1
- package/.next/server/chunks/_06c9kie._.js +216 -0
- package/.next/server/chunks/{_1x6kd1r._.js → _07y2gj-._.js} +1 -1
- package/.next/server/chunks/_0a43a-0._.js +3 -0
- package/.next/server/chunks/_0bujjey._.js +5 -0
- package/.next/server/chunks/_0c9j6rb._.js +1 -1
- package/.next/server/chunks/_0dkd549._.js +3 -0
- package/.next/server/chunks/_0ej1kvv._.js +3 -0
- package/.next/server/chunks/_0f6ts7z._.js +3 -0
- package/.next/server/chunks/_0gm9hyv._.js +55 -0
- package/.next/server/chunks/_0i55en5._.js +25 -0
- package/.next/server/chunks/_0k50n27._.js +18 -0
- package/.next/server/chunks/_0khihjk._.js +3 -3
- package/.next/server/chunks/_0n74zsf._.js +5 -5
- package/.next/server/chunks/_0nvm9ef._.js +3 -0
- package/.next/server/chunks/_0p56fn0._.js +3 -0
- package/.next/server/chunks/_0recufk._.js +1 -1
- package/.next/server/chunks/_0xbkz10._.js +3 -0
- package/.next/server/chunks/_10tkr26._.js +3 -0
- package/.next/server/chunks/{_0ioz3nd._.js → _11u2kp7._.js} +1 -1
- package/.next/server/chunks/_11ujpya._.js +3 -0
- package/.next/server/chunks/_127nx_p._.js +5 -0
- package/.next/server/chunks/_17l5ygt._.js +1 -1
- package/.next/server/chunks/_19uauj6._.js +3 -0
- package/.next/server/chunks/_1_5mnq4._.js +5 -5
- package/.next/server/chunks/_1abl6t9._.js +55 -0
- package/.next/server/chunks/_1d0j961._.js +3 -3
- package/.next/server/chunks/_1dbixxz._.js +3 -0
- package/.next/server/chunks/_1dc_d1q._.js +98 -0
- package/.next/server/chunks/_1drgfx4._.js +5 -5
- package/.next/server/chunks/_1e48czp._.js +3 -3
- package/.next/server/chunks/_1f31u5x._.js +5 -0
- package/.next/server/chunks/_1gnjfli._.js +3 -0
- package/.next/server/chunks/_1kg70wc._.js +3 -3
- package/.next/server/chunks/_1klbcft._.js +5 -0
- package/.next/server/chunks/_1krd9rf._.js +4 -1
- package/.next/server/chunks/_1kwmzab._.js +3 -0
- package/.next/server/chunks/{_1pf4qe-._.js → _1oxj9fa._.js} +1 -1
- package/.next/server/chunks/{_1f46eie._.js → _1pcmdbb._.js} +1 -1
- package/.next/server/chunks/_1qgix-j._.js +3 -0
- package/.next/server/chunks/{lib_logger_ts_1exwjut._.js → _1rpchta._.js} +5 -5
- package/.next/server/chunks/_1vsej-s._.js +5 -0
- package/.next/server/chunks/_1yx0p_s._.js +5 -0
- package/.next/server/chunks/{_0rnf-6n._.js → _20fsr_z._.js} +6 -6
- package/.next/server/chunks/_2128hkj._.js +5 -0
- package/.next/server/chunks/_next-internal_server_app_api_bot_thread_[id]_route_actions_1fstjn2.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_bot_thread_route_actions_003ccso.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_workspace_missing_route_actions_1fidi6p.js +3 -0
- package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
- package/.next/server/chunks/features_0-cnt0l._.js +4 -0
- package/.next/server/chunks/features_0hdaci0._.js +4 -0
- package/.next/server/chunks/features_1e39j7-._.js +8 -0
- package/.next/server/chunks/features_bot_bot_query_ts_12mgkl2._.js +1 -1
- package/.next/server/chunks/features_memory_1uqvksn._.js +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0v_7drq._.js → node_modules_consola_dist_chunks_prompt_mjs_0a7-pbw._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_17k8irj._.js → node_modules_consola_dist_chunks_prompt_mjs_0gzvgfv._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0i7cvml._.js → node_modules_consola_dist_chunks_prompt_mjs_107pxfn._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0icqaqw._.js → node_modules_consola_dist_chunks_prompt_mjs_15hbel8._.js} +1 -1
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_18i-23e._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1bewgf3._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1nlww1m._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1q77nfx._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xqdzx_._.js +3 -0
- package/.next/server/chunks/{node_modules_zod_v4_1801ax7._.js → node_modules_zod_v4_0lkux5-._.js} +2 -2
- package/.next/server/chunks/{node_modules_zod_v4_1cha_bw._.js → node_modules_zod_v4_1jmr9cq._.js} +2 -2
- package/.next/server/chunks/{node_modules_zod_v4_0ubdflj._.js → node_modules_zod_v4_1yrxmek._.js} +2 -2
- package/.next/server/chunks/node_modules_zod_v4_classic_errors_0tp0y-q.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0-e011f._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__09q9med._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0lyi8i2._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0pd8yr7._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__16jc196._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__18dthbp._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__18e68w8._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1mzi-ju._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1nygfik._.js +5 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1sdphb0._.js +8 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1vdmfbe._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1waa3rc._.js +85 -0
- package/.next/server/chunks/ssr/_0-2qsxo._.js +3 -0
- package/.next/server/chunks/ssr/_00rehl_._.js +3 -0
- package/.next/server/chunks/ssr/{_1lz_cq2._.js → _02oc_h5._.js} +76 -97
- package/.next/server/chunks/ssr/_05yghx6._.js +3 -0
- package/.next/server/chunks/ssr/_07nbwap._.js +3 -0
- package/.next/server/chunks/ssr/_08c4z-9._.js +3 -0
- package/.next/server/chunks/ssr/_0_qfdlw._.js +4 -0
- package/.next/server/chunks/ssr/{_0m2lsd1._.js → _0b6_jv-._.js} +2 -2
- package/.next/server/chunks/ssr/_0evkpto._.js +3 -0
- package/.next/server/chunks/ssr/_0geg212._.js +3 -0
- package/.next/server/chunks/ssr/{_1jdgjv9._.js → _0hxt2ul._.js} +2 -2
- package/.next/server/chunks/ssr/_0i_6q1w._.js +2 -2
- package/.next/server/chunks/ssr/_0lu1n_x._.js +1 -1
- package/.next/server/chunks/ssr/_0no7i1o._.js +3 -0
- package/.next/server/chunks/ssr/_0tzg--b._.js +3 -0
- package/.next/server/chunks/ssr/{_15j2_8f._.js → _0wzaht-._.js} +2 -2
- package/.next/server/chunks/ssr/_0z-g0uy._.js +3 -0
- package/.next/server/chunks/ssr/_114ylv7._.js +7 -0
- package/.next/server/chunks/ssr/_123y-ah._.js +3 -0
- package/.next/server/chunks/ssr/_12c-iwh._.js +3 -0
- package/.next/server/chunks/ssr/_12w42gi._.js +3 -0
- package/.next/server/chunks/ssr/_161kqav._.js +3 -0
- package/.next/server/chunks/ssr/_167hchk._.js +3 -0
- package/.next/server/chunks/ssr/{_0ap2fzn._.js → _16c6_xm._.js} +2 -2
- package/.next/server/chunks/ssr/_18opah7._.js +3 -0
- package/.next/server/chunks/ssr/_1_krfph._.js +3 -0
- package/.next/server/chunks/ssr/{_0rzucul._.js → _1_x5spz._.js} +3 -3
- package/.next/server/chunks/ssr/_1a61fc9._.js +3 -0
- package/.next/server/chunks/ssr/_1ey7qn-._.js +70 -0
- package/.next/server/chunks/ssr/_1g9vs7q._.js +3 -0
- package/.next/server/chunks/ssr/_1jmz33w._.js +3 -0
- package/.next/server/chunks/ssr/_1rgtxhr._.js +5 -0
- package/.next/server/chunks/ssr/_1slp25y._.js +3 -0
- package/.next/server/chunks/ssr/_1w_t7h7._.js +101 -0
- package/.next/server/chunks/ssr/{_0s99bgb._.js → _1wyfaq_._.js} +9 -3
- package/.next/server/chunks/ssr/_200gt-m._.js +102 -0
- package/.next/server/chunks/ssr/components_ui_tabs_tsx_0ej40b4._.js +3 -0
- package/.next/server/chunks/ssr/features_bot_thread_query_ts_023eklt._.js +4 -0
- package/.next/server/chunks/ssr/features_config_components_config-setting_tsx_0xfwqdg._.js +1 -1
- package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
- package/.next/server/chunks/ssr/features_workspace_00jz2hu._.js +8 -0
- package/.next/server/chunks/ssr/{_1-teee5._.js → lib_logger_ts_0-olsze._.js} +2 -7
- package/.next/server/chunks/ssr/{node_modules_05-n6dz._.js → node_modules_02ai7br._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1chvq5f._.js → node_modules_02deexj._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0m383r2._.js → node_modules_07za262._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_07dsgkx._.js → node_modules_0_s9get._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1a0kmjl._.js → node_modules_0n3c7h0._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0zeg3x_._.js → node_modules_0od6jwr._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1y79i83._.js → node_modules_0rdt7pk._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_17bwo43._.js → node_modules_0tusx4d._.js} +3 -3
- package/.next/server/chunks/ssr/{node_modules_04sksn9._.js → node_modules_0w1z7kz._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1uyk91w._.js → node_modules_0wdupfz._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0ifp389._.js → node_modules_1720w0a._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0u9da1h._.js → node_modules_18lsg7d._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1k6n600._.js → node_modules_1b94fxf._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_20c28js._.js → node_modules_1ecdo1s._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0fkeku3._.js → node_modules_1fa9ag7._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1j8j4pt._.js → node_modules_1fv-_si._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0-dr_o7._.js → node_modules_1hf461g._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1lz0oxc._.js → node_modules_1m71ta-._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1t77e4n._.js → node_modules_1n93n-g._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_16mkxuo._.js → node_modules_1n9lqu9._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1k7z2j6._.js → node_modules_1npnsvd._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_056qgf-._.js → node_modules_1rn2r0n._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0x3-ply._.js → node_modules_1seuurl._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0bvopy2._.js → node_modules_1vq-mfk._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0iur59s._.js → node_modules_1vzyw1t._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1k8j8n0._.js → node_modules_1w359w4._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1x0ztf4._.js → node_modules_1yajbl6._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1-y7nni._.js → node_modules_20eqhy8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0bkwd0u._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_019sbis._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0p9a9su._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0s6piq3._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@vercel_oidc_dist_1o553h-._.js → node_modules_@vercel_oidc_dist_05itbb1._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_trash_mjs_0px2gzr._.js +3 -0
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +68 -46
- package/.next/static/chunks/07vqbk_9t4em4.js +2 -0
- package/.next/static/chunks/08krja1zx7nqg.js +1 -0
- package/.next/static/chunks/0g4b348l0pve7.js +1 -0
- package/.next/static/chunks/0qcuwdk132jjt.js +1 -0
- package/.next/static/chunks/0vlgzqo9ka90v.js +1 -0
- package/.next/static/chunks/{11r2yp_yh9_qn.js → 0z69gvysmave7.js} +1 -1
- package/.next/static/chunks/0zrupxgci5gqc.js +1 -0
- package/.next/static/chunks/12fvz1w5ows75.js +1 -0
- package/.next/static/chunks/14t03ned286iu.js +1 -0
- package/.next/static/chunks/156xxbkrz5lzu.js +18 -0
- package/.next/static/chunks/1fz14reod4lft.js +1 -0
- package/.next/static/chunks/1g23dbabl-vkr.js +1 -0
- package/.next/static/chunks/1ohslk4568tm3.js +1 -0
- package/.next/static/chunks/1qy_rc3oxfxok.js +1 -0
- package/.next/static/chunks/1sbmwswc9k2-1.js +1 -0
- package/.next/static/chunks/1vqezbhjm3goq.js +1 -0
- package/.next/static/chunks/1zea7qdl-7365.js +1 -0
- package/.next/static/chunks/1zvqumkg7kmo0.css +1 -0
- package/.next/static/chunks/26hpqt3y6bogl.js +12 -0
- package/.next/static/chunks/2_j5mqm6d-z18.js +99 -0
- package/.next/static/chunks/2dt6tu7a22svs.js +1 -0
- package/.next/static/chunks/2h5ls3d86kya6.js +1 -0
- package/.next/static/chunks/2wc6y1ht6dfuy.js +1 -0
- package/.next/static/chunks/{435atsnhs7ksu.js → 2xr0zpll7thyi.js} +2 -2
- package/.next/static/chunks/31jztc-yq30m7.js +1 -0
- package/.next/static/chunks/391af0i8eljzk.js +1 -0
- package/.next/static/chunks/3bfwpww3m3x4u.js +1 -0
- package/.next/static/chunks/{38gweqdo4jpfj.js → 3izg0a3k87q1-.js} +5 -5
- package/.next/static/chunks/3p2s2cjokx1aa.js +5 -0
- package/.next/static/chunks/{408ueu4hfvcg7.js → 41s3fml5oivsa.js} +1 -1
- package/README.md +45 -193
- package/app/api/events/app-event.ts +6 -4
- package/app/api/query-key.ts +25 -16
- package/bin/database.mjs +37 -0
- package/bin/thursday.mjs +44 -28
- package/components/ui/custom-icon.tsx +0 -60
- package/components/ui/radio-group.tsx +37 -0
- package/components/ui/shiny-text.tsx +33 -6
- package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/migration.sql +80 -24
- package/database/migrations/{20260910173049_numerous_spirit → 20260916145701_clever_multiple_man}/snapshot.json +689 -110
- package/database/migrations/20260916160713_thread_cancelled/migration.sql +2 -0
- package/database/migrations/{20260911030320_opposite_jack_power → 20260916160713_thread_cancelled}/snapshot.json +706 -84
- package/docs/how-it-works.md +40 -35
- package/docs/images/keeps-going.png +0 -0
- package/docs/images/two-minds.png +0 -0
- package/docs/live-calls.md +236 -0
- package/docs/thread-rooms.md +71 -0
- package/features/ai/chatgpt.ts +1 -2
- package/features/ai/live.schema.ts +128 -0
- package/features/ai/load-tools.ts +152 -79
- package/features/ai/model.schema.ts +2 -120
- package/features/ai/model.ts +52 -88
- package/features/ai/prompts/bot.prompt.ts +91 -214
- package/features/ai/prompts/live.prompt.ts +169 -0
- package/features/ai/prompts/prompt-helper.ts +92 -32
- package/features/ai/prompts/thursday.prompt.ts +164 -190
- package/features/ai/tools/bot.tool.ts +38 -145
- package/features/ai/tools/call.tool.ts +33 -5
- package/features/ai/tools/connected.ts +5 -3
- package/features/ai/tools/mcp.tool.ts +7 -4
- package/features/ai/tools/memory.tool.ts +35 -31
- package/features/ai/tools/skills.tool.ts +11 -6
- package/features/ai/tools/studio.tool.ts +26 -21
- package/features/ai/tools/tool-name.ts +3 -5
- package/features/ai/tools/workspace.tool.ts +33 -10
- package/features/artifact/artifact.action.ts +2 -2
- package/features/artifact/artifact.query.ts +112 -61
- package/features/artifact/artifact.schema.ts +8 -6
- package/features/artifact/components/artifact-setting.tsx +83 -33
- package/features/bot/bot.action.ts +43 -36
- package/features/bot/bot.memory.ts +137 -20
- package/features/bot/bot.query.ts +28 -11
- package/features/bot/bot.run.ts +296 -744
- package/features/bot/bot.runner.ts +463 -864
- package/features/bot/bot.schema.ts +93 -82
- package/features/bot/bot.seed.ts +141 -64
- package/features/bot/components/bot-mark.tsx +324 -232
- package/features/bot/components/bot-room.tsx +1613 -697
- package/features/bot/components/bot-roster.tsx +8 -13
- package/features/bot/components/bot-setting.tsx +58 -42
- package/features/bot/components/bot-tool.tsx +55 -87
- package/features/bot/components/mark-palette.tsx +35 -32
- package/features/bot/components/path-chips.tsx +33 -3
- package/features/bot/components/thread-badge.tsx +34 -0
- package/features/bot/components/thread-reply.tsx +639 -0
- package/features/bot/components/thread-setting.tsx +674 -0
- package/features/bot/mark.const.ts +79 -31
- package/features/bot/room.query.ts +889 -0
- package/features/bot/room.schema.ts +64 -0
- package/features/bot/seed-bots.ts +2 -1
- package/features/bot/thread.query.ts +971 -0
- package/features/bot/thread.store.ts +587 -0
- package/features/config/components/voice-key.tsx +113 -88
- package/features/config/config.const.ts +5 -9
- package/features/connectors/mcp.schema.ts +0 -2
- package/features/intro/components/intro.tsx +169 -139
- package/features/memory/components/memory-setting.tsx +2 -7
- package/features/memory/memory.schema.ts +14 -23
- package/features/settings/components/setting-ui.tsx +0 -44
- package/features/settings/components/settings.tsx +12 -12
- package/features/settings/settings.alert.ts +3 -3
- package/features/settings/settings.store.ts +1 -1
- package/features/skills/skills.schema.ts +0 -2
- package/features/thursday/ascii.const.ts +74 -0
- package/features/thursday/components/ascii-field.tsx +24 -44
- package/features/thursday/components/ascii-orb.tsx +525 -381
- package/features/thursday/components/call-log.tsx +46 -44
- package/features/thursday/components/face.tsx +40 -10
- package/features/thursday/components/side-captions.tsx +273 -0
- package/features/thursday/components/tab-state.tsx +14 -6
- package/features/thursday/components/thursday-mark.tsx +1 -0
- package/features/thursday/components/thursday-setting.tsx +633 -333
- package/features/thursday/components/thursday.tsx +315 -274
- package/features/thursday/components/voice-picker.tsx +255 -0
- package/features/thursday/face.store.ts +5 -0
- package/features/thursday/thursday.action.ts +96 -72
- package/features/thursday/thursday.query.ts +49 -30
- package/features/thursday/thursday.schema.ts +37 -35
- package/features/thursday/thursday.store.ts +14 -7
- package/features/thursday/tool-call.ts +3 -3
- package/features/thursday/tool-line.ts +5 -3
- package/features/thursday/use-thursday.ts +801 -457
- package/features/workspace/file-kind.ts +9 -0
- package/features/workspace/workspace.query.ts +17 -0
- package/features/workspace/workspace.ts +82 -36
- package/hooks/use-hotkey.ts +3 -2
- package/lib/live/live.schema.ts +26 -0
- package/lib/live/live.server.ts +153 -0
- package/lib/live/live.session.ts +574 -0
- package/lib/{realtime/realtime.tap.ts → live/live.tap.ts} +41 -12
- package/lib/live/live.transport.ts +152 -0
- package/lib/protocol/use-server-pages.ts +9 -5
- package/lib/utils.ts +21 -20
- package/package.json +2 -2
- package/public/voices/alloy.ogg +0 -0
- package/public/voices/ash.ogg +0 -0
- package/public/voices/ballad.ogg +0 -0
- package/public/voices/beacon.ogg +0 -0
- package/public/voices/bossa.ogg +0 -0
- package/public/voices/cedar.ogg +0 -0
- package/public/voices/cinder.ogg +0 -0
- package/public/voices/coral.ogg +0 -0
- package/public/voices/delta.ogg +0 -0
- package/public/voices/echo.ogg +0 -0
- package/public/voices/gleam.ogg +0 -0
- package/public/voices/marin.ogg +0 -0
- package/public/voices/meridian.ogg +0 -0
- package/public/voices/quartz.ogg +0 -0
- package/public/voices/ripple.ogg +0 -0
- package/public/voices/sage.ogg +0 -0
- package/public/voices/shimmer.ogg +0 -0
- package/public/voices/stone.ogg +0 -0
- package/public/voices/tempo.ogg +0 -0
- package/public/voices/verse.ogg +0 -0
- package/public/voices/vesper.ogg +0 -0
- package/public/voices/willow.ogg +0 -0
- package/scripts/artifact-paths.test.mts +38 -0
- package/scripts/bot-context.test.mts +1408 -0
- package/scripts/live-history.test.mts +115 -0
- package/scripts/live-session.test.mts +938 -0
- package/server.js +1 -1
- package/skills/browser/SKILL.md +11 -1
- package/skills/computer/SKILL.md +1 -1
- package/skills/find-skills/SKILL.md +3 -8
- package/skills/interactive-page/SKILL.md +12 -7
- package/skills/interactive-page/references/diagram.md +89 -0
- package/skills/interactive-page/scripts/archify/LICENSE +22 -0
- package/skills/interactive-page/scripts/archify/README.md +25 -0
- package/skills/interactive-page/scripts/archify/assets/JetBrainsMono-OFL.txt +93 -0
- package/skills/interactive-page/scripts/archify/assets/template.html +14934 -0
- package/skills/interactive-page/scripts/archify/bin/archify.mjs +2126 -0
- package/skills/interactive-page/scripts/archify/bin/open-artifact.mjs +86 -0
- package/skills/interactive-page/scripts/archify/bin/preview.mjs +653 -0
- package/skills/interactive-page/scripts/archify/bin/visual-check.mjs +829 -0
- package/skills/interactive-page/scripts/archify/delta/architecture-delta.mjs +1223 -0
- package/skills/interactive-page/scripts/archify/examples/agent-run.lifecycle.json +60 -0
- package/skills/interactive-page/scripts/archify/examples/agent-tool-call.workflow.json +94 -0
- package/skills/interactive-page/scripts/archify/examples/async-job-roundtrip.sequence.json +61 -0
- package/skills/interactive-page/scripts/archify/examples/cache-miss-request.sequence.json +82 -0
- package/skills/interactive-page/scripts/archify/examples/checkout-platform.base.architecture.json +31 -0
- package/skills/interactive-page/scripts/archify/examples/checkout-platform.head.architecture.json +31 -0
- package/skills/interactive-page/scripts/archify/examples/deployment-release.lifecycle.json +49 -0
- package/skills/interactive-page/scripts/archify/examples/event-stream.dataflow.json +57 -0
- package/skills/interactive-page/scripts/archify/examples/incident-response.workflow.json +64 -0
- package/skills/interactive-page/scripts/archify/examples/product-analytics.dataflow.json +76 -0
- package/skills/interactive-page/scripts/archify/examples/production-deployment.architecture.json +71 -0
- package/skills/interactive-page/scripts/archify/examples/release-delivery.workflow.json +62 -0
- package/skills/interactive-page/scripts/archify/examples/web-app.architecture.json +46 -0
- package/skills/interactive-page/scripts/archify/migrations/workflow-v2.mjs +279 -0
- package/skills/interactive-page/scripts/archify/recipes/scenarios.mjs +284 -0
- package/skills/interactive-page/scripts/archify/references/authoring-contract.md +243 -0
- package/skills/interactive-page/scripts/archify/references/delivery-contract.md +120 -0
- package/skills/interactive-page/scripts/archify/references/viewer-runtime.md +45 -0
- package/skills/interactive-page/scripts/archify/renderers/architecture/grid.mjs +62 -0
- package/skills/interactive-page/scripts/archify/renderers/architecture/render-architecture.mjs +1078 -0
- package/skills/interactive-page/scripts/archify/renderers/dataflow/README.md +104 -0
- package/skills/interactive-page/scripts/archify/renderers/dataflow/render-dataflow.mjs +483 -0
- package/skills/interactive-page/scripts/archify/renderers/lifecycle/README.md +115 -0
- package/skills/interactive-page/scripts/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
- package/skills/interactive-page/scripts/archify/renderers/sequence/README.md +114 -0
- package/skills/interactive-page/scripts/archify/renderers/sequence/render-sequence.mjs +464 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/brand-marks.mjs +563 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/cli.mjs +218 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/desktop-readability.mjs +26 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/diagnostics.mjs +127 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/engineering-profiles.mjs +157 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/generated-brand-marks.mjs +3 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/generated-validators.mjs +13 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/geometry.mjs +1423 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/i18n.mjs +595 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/layout-report.mjs +40 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/legend.mjs +217 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/output-path.mjs +340 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/repository-evidence.mjs +238 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/repository-location.mjs +58 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/text-fit.mjs +49 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/utils.mjs +232 -0
- package/skills/interactive-page/scripts/archify/renderers/shared/validator.mjs +86 -0
- package/skills/interactive-page/scripts/archify/renderers/workflow/README.md +223 -0
- package/skills/interactive-page/scripts/archify/renderers/workflow/render-workflow.mjs +35 -0
- package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
- package/skills/interactive-page/scripts/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
- package/skills/interactive-page/scripts/archify/schemas/README.md +211 -0
- package/skills/interactive-page/scripts/archify/schemas/architecture.schema.json +178 -0
- package/skills/interactive-page/scripts/archify/schemas/common.schema.json +115 -0
- package/skills/interactive-page/scripts/archify/schemas/dataflow.schema.json +243 -0
- package/skills/interactive-page/scripts/archify/schemas/lifecycle.schema.json +266 -0
- package/skills/interactive-page/scripts/archify/schemas/sequence.schema.json +223 -0
- package/skills/interactive-page/scripts/archify/schemas/workflow.schema.json +428 -0
- package/skills/interactive-page/scripts/archify/scripts/check-render-output.mjs +916 -0
- package/skills/interactive-page/scripts/archify/scripts/render-examples.mjs +26 -0
- package/skills/interactive-page/scripts/bundle-artifact.sh +9 -8
- package/skills/skill-creator/SKILL.md +4 -5
- package/.next/server/app/api/bot/task/[id]/route/app-paths-manifest.json +0 -3
- package/.next/server/app/api/bot/task/[id]/route.js +0 -16
- package/.next/server/app/api/bot/task/[id]/route.js.nft.json +0 -1
- package/.next/server/app/api/bot/task/[id]/route_client-reference-manifest.js +0 -3
- package/.next/server/app/api/bot/task/route/app-paths-manifest.json +0 -3
- package/.next/server/app/api/bot/task/route.js +0 -16
- package/.next/server/app/api/bot/task/route.js.nft.json +0 -1
- package/.next/server/app/api/bot/task/route_client-reference-manifest.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__026u77e._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__02va5wz._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__050zri4._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0bg9710._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0ffbg85._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0in-d5s._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0ncs9uu._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0pa9k-f._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__0qi_m0e._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__0tq0m_k._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0xep6j_._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1-ga0kh._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__11n256_._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__144l7qt._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__1anc1p9._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1fizn31._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1jg8t86._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__1lldzy9._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1llj3-b._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1p8m3f4._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1peqvsi._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1w8gm5h._.js +0 -10
- package/.next/server/chunks/[root-of-the-server]__1xt39nn._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__1zb8mfo._.js +0 -8
- package/.next/server/chunks/_0-73of8._.js +0 -55
- package/.next/server/chunks/_0-fjql4._.js +0 -31
- package/.next/server/chunks/_00xh_q0._.js +0 -25
- package/.next/server/chunks/_051qh8u._.js +0 -3
- package/.next/server/chunks/_05sovvj._.js +0 -3
- package/.next/server/chunks/_091bi8d._.js +0 -3
- package/.next/server/chunks/_0fzqt2y._.js +0 -142
- package/.next/server/chunks/_0lr92vd._.js +0 -3
- package/.next/server/chunks/_0mecv0f._.js +0 -31
- package/.next/server/chunks/_0mh8j4m._.js +0 -3
- package/.next/server/chunks/_0sb7tlz._.js +0 -3
- package/.next/server/chunks/_0si7xzn._.js +0 -3
- package/.next/server/chunks/_0u10wmw._.js +0 -55
- package/.next/server/chunks/_0wp4le3._.js +0 -3
- package/.next/server/chunks/_0y5fg-x._.js +0 -3
- package/.next/server/chunks/_1230wbx._.js +0 -10
- package/.next/server/chunks/_12nheja._.js +0 -3
- package/.next/server/chunks/_13510xh._.js +0 -3
- package/.next/server/chunks/_15hq89o._.js +0 -3
- package/.next/server/chunks/_18-1wcc._.js +0 -55
- package/.next/server/chunks/_18d7-5p._.js +0 -3
- package/.next/server/chunks/_1c78vw5._.js +0 -237
- package/.next/server/chunks/_1h5_8sk._.js +0 -3
- package/.next/server/chunks/_1hdnxb7._.js +0 -3
- package/.next/server/chunks/_1j8k_j5._.js +0 -3
- package/.next/server/chunks/_1nula3v._.js +0 -3
- package/.next/server/chunks/_1php4eq._.js +0 -3
- package/.next/server/chunks/_1yuv4vp._.js +0 -3
- package/.next/server/chunks/_1zkfbaa._.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_bot_task_[id]_route_actions_1_k_8u3.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_bot_task_route_actions_0xln6ra.js +0 -3
- package/.next/server/chunks/features_0rpfxbk._.js +0 -3
- package/.next/server/chunks/features_1qf3cei._.js +0 -8
- package/.next/server/chunks/features_bot_0zt92oh._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1jidylq._.js +0 -3
- package/.next/server/chunks/ssr/[externals]__0dizgek._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0-nob52._.js +0 -4
- package/.next/server/chunks/ssr/[root-of-the-server]__092knlj._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0mz33a7._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0s4wb56._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0s9dq5u._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0sd3izg._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0vnmv-s._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__1-13tcn._.js +0 -43
- package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +0 -61
- package/.next/server/chunks/ssr/[root-of-the-server]__1zidpfl._.js +0 -3
- package/.next/server/chunks/ssr/_001_ms1._.js +0 -33
- package/.next/server/chunks/ssr/_01n3o0m._.js +0 -3
- package/.next/server/chunks/ssr/_04z2c7b._.js +0 -3
- package/.next/server/chunks/ssr/_06tssji._.js +0 -3
- package/.next/server/chunks/ssr/_0fk4c7d._.js +0 -3
- package/.next/server/chunks/ssr/_0h42fze._.js +0 -3
- package/.next/server/chunks/ssr/_0h7zdni._.js +0 -3
- package/.next/server/chunks/ssr/_0mggveb._.js +0 -3
- package/.next/server/chunks/ssr/_0nbpc_8._.js +0 -3
- package/.next/server/chunks/ssr/_0q0zan6._.js +0 -70
- package/.next/server/chunks/ssr/_0zcjrbg._.js +0 -3
- package/.next/server/chunks/ssr/_0zhoc3r._.js +0 -3
- package/.next/server/chunks/ssr/_11j92tu._.js +0 -3
- package/.next/server/chunks/ssr/_13fke0x._.js +0 -3
- package/.next/server/chunks/ssr/_18cymkq._.js +0 -3
- package/.next/server/chunks/ssr/_1ebxla1._.js +0 -3
- package/.next/server/chunks/ssr/_1nj4niv._.js +0 -42
- package/.next/server/chunks/ssr/_1ov37if._.js +0 -3
- package/.next/server/chunks/ssr/_1ovmc9s._.js +0 -3
- package/.next/server/chunks/ssr/_1sji22n._.js +0 -3
- package/.next/server/chunks/ssr/_1vi_uo7._.js +0 -3
- package/.next/server/chunks/ssr/_1vyd1ji._.js +0 -3
- package/.next/server/chunks/ssr/_1xx4zlb._.js +0 -3
- package/.next/server/chunks/ssr/components_ui_1y1l7yj._.js +0 -3
- package/.next/server/chunks/ssr/features_bot_1s_-2vj._.js +0 -3
- package/.next/server/chunks/ssr/lib_realtime_12wg_dd._.js +0 -27
- package/.next/server/chunks/ssr/lib_realtime_15h_v1v._.js +0 -27
- package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0npjf8-._.js +0 -3
- package/.next/static/chunks/0n3jle9kbqfr2.js +0 -40
- package/.next/static/chunks/0r5qcctujhxli.js +0 -1
- package/.next/static/chunks/10teww7wt-f6h.js +0 -1
- package/.next/static/chunks/126fj4pga_72k.js +0 -1
- package/.next/static/chunks/159udiexf6dom.js +0 -2
- package/.next/static/chunks/18a96rkhi4_yd.js +0 -1
- package/.next/static/chunks/18gi7o2ibrgh8.js +0 -3
- package/.next/static/chunks/1dkjg87pxk0n9.js +0 -28
- package/.next/static/chunks/1q9z1tohil7xn.js +0 -1
- package/.next/static/chunks/1sjgfets224re.js +0 -1
- package/.next/static/chunks/1wszsr83t01gh.js +0 -1
- package/.next/static/chunks/22_zkas21rpna.js +0 -1
- package/.next/static/chunks/2fh4-3z_q8b_w.js +0 -1
- package/.next/static/chunks/2h0sd2vumhb15.js +0 -1
- package/.next/static/chunks/2szintyibu0s5.js +0 -1
- package/.next/static/chunks/2t4vhi3m8ahya.js +0 -1
- package/.next/static/chunks/2tigdtz3dpcy8.js +0 -1
- package/.next/static/chunks/3-b6b7entqazs.js +0 -1
- package/.next/static/chunks/3786h5vayt80-.js +0 -28
- package/.next/static/chunks/3cq5g494yuke8.css +0 -1
- package/.next/static/chunks/3dmbhsv2u_8kj.js +0 -1
- package/.next/static/chunks/3hibbjnt85-k6.js +0 -1
- package/.next/static/chunks/3i0a5px-oufgc.js +0 -1
- package/.next/static/chunks/3wexk9qo8zuj3.js +0 -18
- package/.next/static/chunks/3xk7yqgomx7yq.js +0 -1
- package/.next/static/chunks/3xre8bu_pk1p_.js +0 -1
- package/.next/static/chunks/3zv6t3i77xhr_.js +0 -1
- package/database/migrations/20260911030320_opposite_jack_power/migration.sql +0 -1
- package/docs/images/task-thread.png +0 -0
- package/features/bot/components/task-badge.tsx +0 -42
- package/features/bot/components/task-reply.tsx +0 -328
- package/features/bot/components/task-setting.tsx +0 -524
- package/features/bot/task.query.ts +0 -1079
- package/features/bot/task.store.ts +0 -487
- package/lib/realtime/client-secret.ts +0 -86
- package/lib/realtime/open-session.ts +0 -31
- package/lib/realtime/openai.ts +0 -35
- package/lib/realtime/realtime.audio.ts +0 -196
- package/lib/realtime/realtime.driver.ts +0 -489
- package/lib/realtime/realtime.protocol.ts +0 -393
- package/lib/realtime/realtime.schema.ts +0 -37
- package/lib/realtime/realtime.session.ts +0 -106
- package/lib/realtime/realtime.transport.ts +0 -384
- package/lib/realtime/xai.ts +0 -39
- /package/.next/server/app/api/bot/{task → thread}/[id]/route/build-manifest.json +0 -0
- /package/.next/server/app/api/bot/{task → thread}/[id]/route/server-reference-manifest.json +0 -0
- /package/.next/server/app/api/bot/{task → thread}/[id]/route.js.map +0 -0
- /package/.next/server/app/api/bot/{task → thread}/route/build-manifest.json +0 -0
- /package/.next/server/app/api/bot/{task → thread}/route/server-reference-manifest.json +0 -0
- /package/.next/server/app/api/bot/{task → thread}/route.js.map +0 -0
- /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → yyRVBc0xxYQsh3GpbQX9b}/_buildManifest.js +0 -0
- /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → yyRVBc0xxYQsh3GpbQX9b}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{G6-gNoyGDEcgAsq-L4PE1 → yyRVBc0xxYQsh3GpbQX9b}/_ssgManifest.js +0 -0
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
import type { ModelMessage } from "ai";
|
|
2
2
|
import { format } from "date-fns";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
BOT_MEMORY_LIMITS,
|
|
5
|
+
PATHS,
|
|
6
|
+
PROMPT_LINE,
|
|
7
|
+
WORKSPACE_KEEP,
|
|
8
|
+
} from "@/config";
|
|
4
9
|
import { TOOL_NAMES } from "@/features/ai/tools/tool-name";
|
|
5
10
|
import { botMemoryFolder, listBotMemory } from "@/features/bot/bot.memory";
|
|
6
11
|
import { listJobBots, readBotMemoryOn } from "@/features/bot/bot.query";
|
|
7
|
-
import type {
|
|
12
|
+
import type {
|
|
13
|
+
BotMemory,
|
|
14
|
+
JobBot,
|
|
15
|
+
ThreadSpeaker,
|
|
16
|
+
} from "@/features/bot/bot.schema";
|
|
8
17
|
import { findPinnedTools } from "@/features/connectors/mcp.query";
|
|
9
18
|
import type { McpToolRef } from "@/features/connectors/mcp.schema";
|
|
10
19
|
import { listNoteIndex } from "@/features/memory/memory.query";
|
|
@@ -23,7 +32,6 @@ import { logger } from "@/lib/logger";
|
|
|
23
32
|
import { clip } from "@/lib/utils";
|
|
24
33
|
import { listConnectedToolNames } from "../tools/connected";
|
|
25
34
|
import {
|
|
26
|
-
type LoadedPrompt,
|
|
27
35
|
logPromptSize,
|
|
28
36
|
mcpToolLines,
|
|
29
37
|
noteLines,
|
|
@@ -31,27 +39,19 @@ import {
|
|
|
31
39
|
skillLines,
|
|
32
40
|
} from "./prompt-helper";
|
|
33
41
|
|
|
34
|
-
/**
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
* Two seats share this prompt: the bot holding the job, and one borrowed for a part of it
|
|
39
|
-
* (`ask_bot`). Only identity, roster, asking and answering differ between them.
|
|
40
|
-
*
|
|
41
|
-
* @param self This run's bot name; used only to drop itself from the roster.
|
|
42
|
-
* @param persona Owner's instruction for this bot from settings.
|
|
43
|
-
* @param seat The borrowed seat — who handed it this part, every bot above it on the job, whether it may borrow in turn; null for the bot holding the job.
|
|
44
|
-
*/
|
|
42
|
+
/** Where this turn sits: who coordinates the thread, who is asking, and the exchange it answers. */
|
|
43
|
+
type Seat = { owner: string; caller: string; messageId: string | null };
|
|
44
|
+
|
|
45
|
+
/** Assemble this participant's instructions and current return route on every turn. */
|
|
45
46
|
export async function loadBotPrompt(
|
|
46
47
|
self: string,
|
|
47
48
|
persona?: string | null,
|
|
48
|
-
seat?:
|
|
49
|
-
/**
|
|
50
|
-
folders?: { scratch: string | null; own: string },
|
|
51
|
-
): Promise<
|
|
49
|
+
seat?: Seat | null,
|
|
50
|
+
/** This run's folders: the job's, the bot's own, and where its finished work goes (bot.run). */
|
|
51
|
+
folders?: { scratch: string | null; own: string; artifacts: string },
|
|
52
|
+
): Promise<{ text: string }> {
|
|
52
53
|
const sandbox = await openWorkspace();
|
|
53
54
|
const name = self.trim();
|
|
54
|
-
const askedBy = seat?.askedBy ?? null;
|
|
55
55
|
const [skills, index, mcpTools, pinned, allBots, kept, memoryOn, machine] =
|
|
56
56
|
await Promise.all([
|
|
57
57
|
loadSkills(sandbox),
|
|
@@ -68,17 +68,10 @@ export async function loadBotPrompt(
|
|
|
68
68
|
readMachineTools(sandbox),
|
|
69
69
|
]);
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
// it; the last seat the depth allows has no roster at all (config BOT_RUN.depth)
|
|
73
|
-
const peers =
|
|
74
|
-
seat && !seat.canBorrow
|
|
75
|
-
? []
|
|
76
|
-
: allBots.filter(
|
|
77
|
-
(bot) => bot.name !== name && !seat?.above.includes(bot.name),
|
|
78
|
-
);
|
|
71
|
+
const peers = allBots.filter((bot) => bot.name !== name);
|
|
79
72
|
|
|
80
73
|
const text = [
|
|
81
|
-
|
|
74
|
+
identity(name, seat),
|
|
82
75
|
memory(index),
|
|
83
76
|
connectedTools(mcpTools, pinned),
|
|
84
77
|
methods(skills),
|
|
@@ -86,8 +79,7 @@ export async function loadBotPrompt(
|
|
|
86
79
|
// After Environment: its folder is named against the Cwd said there
|
|
87
80
|
memoryOn ? ownMemory(botMemoryFolder(name), kept) : "",
|
|
88
81
|
roster(peers),
|
|
89
|
-
|
|
90
|
-
askedBy ? handingUp(askedBy) : ANSWERING,
|
|
82
|
+
collaboration(name, seat),
|
|
91
83
|
// Last, so it is the closest thing to the work and outranks the rest
|
|
92
84
|
ownerInstruction(persona),
|
|
93
85
|
]
|
|
@@ -97,56 +89,35 @@ export async function loadBotPrompt(
|
|
|
97
89
|
logPromptSize("bot", text);
|
|
98
90
|
logger.debug(`bot prompt\n${text}`);
|
|
99
91
|
|
|
100
|
-
return {
|
|
101
|
-
text,
|
|
102
|
-
peers: peers.map((bot) => bot.name),
|
|
103
|
-
opening: null,
|
|
104
|
-
};
|
|
92
|
+
return { text };
|
|
105
93
|
}
|
|
106
94
|
|
|
107
95
|
/**
|
|
108
|
-
*
|
|
109
|
-
*
|
|
96
|
+
* Who is who, how the job gets done, and that guesses are not results. The people come
|
|
97
|
+
* first so the rest — whose memory, who reads the answer — has someone to refer to. How
|
|
98
|
+
* this job reached it is the first message's to say (buildThreadOpening).
|
|
110
99
|
*/
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
// Named, because the owner's prompt may not name it and its own instructions are addressed to it
|
|
121
|
-
`You are ${name}, one of the bots that work for the user. ${nowLine()}
|
|
122
|
-
|
|
123
|
-
${PEOPLE}
|
|
124
|
-
- **You** — you do the work. Your answer goes to Thursday, not to the user, and she tells them what they need from it.`,
|
|
125
|
-
MACHINE,
|
|
126
|
-
NO_GUESSING,
|
|
127
|
-
].join("\n\n");
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/** The borrowed seat: between it and Thursday is the bot that borrowed it. */
|
|
131
|
-
function borrowedIdentity(name: string, askedBy: string): string {
|
|
132
|
-
return [
|
|
133
|
-
`You are ${name}, one of the bots that work for the user. ${nowLine()}
|
|
134
|
-
|
|
135
|
-
${PEOPLE}
|
|
136
|
-
- **${askedBy}** — a bot on this job, who handed you one part of it. They cannot see your thread.
|
|
137
|
-
- **You** — you do that part. What you hand back goes into ${askedBy}'s work as it is, never to Thursday or the user.`,
|
|
138
|
-
MACHINE,
|
|
139
|
-
NO_GUESSING,
|
|
140
|
-
].join("\n\n");
|
|
141
|
-
}
|
|
100
|
+
function identity(name: string, seat?: Seat | null): string {
|
|
101
|
+
const owner = seat?.owner ?? name;
|
|
102
|
+
const coordinator =
|
|
103
|
+
owner === name
|
|
104
|
+
? "**You** coordinate this thread: its result goes from you to Thursday."
|
|
105
|
+
: `**${owner}** coordinates this thread and brings its result to Thursday.`;
|
|
106
|
+
const current = seat
|
|
107
|
+
? `\n\nCurrent conversation: ${seat.caller} → ${name}. Your final text goes back to ${seat.caller}. Message ID: ${seat.messageId ?? "initial request"}.`
|
|
108
|
+
: "";
|
|
142
109
|
|
|
143
|
-
|
|
110
|
+
return `You are ${name}, one of the bots in this thread. ${nowLine()}
|
|
144
111
|
|
|
145
|
-
**
|
|
112
|
+
- **The user** — the one person all of this is for. They talk with Thursday by voice and follow this thread on their screen.
|
|
113
|
+
- **Thursday** — their personal assistant. She talks with them, hands bots the work that takes time, and tells them what comes back.
|
|
114
|
+
- ${coordinator}
|
|
115
|
+
- **Everyone on it** keeps their own work and conversation; the others see only the messages sent to them.${current}
|
|
146
116
|
|
|
147
|
-
**
|
|
117
|
+
**The job is done, not described.** You are on the user's own computer, with a shell, files and the web, and how you get there is yours: when one way fails, try another; where no tool exists, write one — \`node\` is always here. Before deciding something cannot be done, look at what you have — your tools, the other bots, this machine. Bring back the thing itself — their account, their file, the real result — not a smaller, safer stand-in, and not a note on why not.
|
|
148
118
|
|
|
149
|
-
|
|
119
|
+
**Never present a guess as a result.** Thursday says what you return out loud, as fact: say which part is unverified and why.`;
|
|
120
|
+
}
|
|
150
121
|
|
|
151
122
|
/**
|
|
152
123
|
* What the owner wrote about this bot in settings. Carries the sentence that
|
|
@@ -170,7 +141,7 @@ ${persona.trim()}`
|
|
|
170
141
|
function memory(index: MemoryIndexEntry[]): string {
|
|
171
142
|
return `## Thursday's memory of the user
|
|
172
143
|
|
|
173
|
-
What Thursday keeps from talking with them.
|
|
144
|
+
What Thursday keeps from talking with them. When the job needs something about them, open the note with \`${TOOL_NAMES.memory_recall}\`; a fact marked \`said\` came from a call, and \`${TOOL_NAMES.memory_conversation}\` opens that call. What you learn about them goes in your answer — Thursday decides what to keep.
|
|
174
145
|
|
|
175
146
|
path — what is under it (facts) "what the user calls it"
|
|
176
147
|
|
|
@@ -181,7 +152,8 @@ ${noteLines(index)}`;
|
|
|
181
152
|
* The bot's own memory (features/bot/bot.memory), listed by each file's first line and the day
|
|
182
153
|
* it last changed, both read off the disk, so what a file holds costs one line until a job opens
|
|
183
154
|
* it. Always drawn, so a first job knows it has one. Nothing says what usually goes in first: a
|
|
184
|
-
* line like that is what a first job writes, whether or not the job taught it anything.
|
|
155
|
+
* line like that is what a first job writes, whether or not the job taught it anything. The
|
|
156
|
+
* limits are said as a size only; a write past them is undone by the tools (bot.memory).
|
|
185
157
|
*/
|
|
186
158
|
function ownMemory(folder: string, kept: BotMemory): string {
|
|
187
159
|
const listing = kept.entries.length
|
|
@@ -199,7 +171,7 @@ function ownMemory(folder: string, kept: BotMemory): string {
|
|
|
199
171
|
|
|
200
172
|
return `## Your memory
|
|
201
173
|
|
|
202
|
-
What you
|
|
174
|
+
What you learned on your own earlier jobs, in \`${folder}/\`: one topic per file, its first line saying what it holds, read by no other bot, up to ${BOT_MEMORY_LIMITS.files} files of ${BOT_MEMORY_LIMITS.chars.toLocaleString("en-US")} characters each. It is how you get better at this work. When a job teaches you something a later one would otherwise find out again — how a site signs in, the way through its screens, a command that turned out right — or the user asks you to remember how to work, keep it with the date it was true, and fix or delete what proved wrong. No passwords, keys or codes.
|
|
203
175
|
|
|
204
176
|
${listing}${rest}`;
|
|
205
177
|
}
|
|
@@ -216,7 +188,7 @@ function connectedTools(tools: McpToolRef[], pinned: McpToolRef[]): string {
|
|
|
216
188
|
if (unheld.length === 0) return "";
|
|
217
189
|
|
|
218
190
|
const pinnedNote = held.size
|
|
219
|
-
?
|
|
191
|
+
? " The ones you already hold are in your tools instead."
|
|
220
192
|
: "";
|
|
221
193
|
|
|
222
194
|
return `## Connected tools
|
|
@@ -226,13 +198,13 @@ ${mcpToolLines(unheld)}
|
|
|
226
198
|
Names only: \`${TOOL_NAMES.tool_search}\` returns what each one takes, \`${TOOL_NAMES.tool_call}\` runs one.${pinnedNote}`;
|
|
227
199
|
}
|
|
228
200
|
|
|
229
|
-
/** Full skill descriptions (the
|
|
201
|
+
/** Full skill descriptions: the description is what makes a skill the right one to open (the call shows only the first sentence). */
|
|
230
202
|
function methods(skills: SkillMetadata[]): string {
|
|
231
203
|
if (skills.length === 0) return "";
|
|
232
204
|
|
|
233
205
|
return `## Skills
|
|
234
206
|
|
|
235
|
-
Written-down
|
|
207
|
+
Written-down ways of doing things. Open one with \`${TOOL_NAMES.load_skill}\` before a job it covers, unless its instructions are already in your conversation.
|
|
236
208
|
|
|
237
209
|
${skillLines(skills)}`;
|
|
238
210
|
}
|
|
@@ -243,31 +215,32 @@ ${skillLines(skills)}`;
|
|
|
243
215
|
* out: a bot that has to check first spends a step on it, and one that guesses
|
|
244
216
|
* writes for a runtime that is not here. Naming what is absent does as much
|
|
245
217
|
* work as naming what is present — it is the half a model otherwise assumes.
|
|
246
|
-
*
|
|
218
|
+
* Said as what is here, not a limit: a bare listing reads as the only runtimes allowed.
|
|
219
|
+
* The folders are the app's rules; `write_file` refuses anything else
|
|
247
220
|
* (workspace.ts writeRefusal).
|
|
248
221
|
*/
|
|
249
222
|
const environment = (
|
|
250
223
|
cwd: string,
|
|
251
224
|
machine: MachineTools,
|
|
252
|
-
folders?: { scratch: string | null; own: string },
|
|
225
|
+
folders?: { scratch: string | null; own: string; artifacts: string },
|
|
253
226
|
) => `## Environment
|
|
254
227
|
|
|
255
228
|
Current Cwd: ${cwd}
|
|
256
229
|
Platform: ${process.platform}
|
|
257
230
|
${machineLines(machine)}
|
|
258
231
|
|
|
259
|
-
Read off this machine as the job opened
|
|
232
|
+
Read off this machine as the job opened: what is already here, not the limit of what you can use.
|
|
260
233
|
|
|
261
|
-
Your workspace
|
|
234
|
+
Your workspace, where \`${TOOL_NAMES.bash}\` runs. Everything you write goes in one of these folders, kept apart because what is in them lives for different lengths of time:
|
|
262
235
|
|
|
263
|
-
- \`${PATHS.artifacts}/\` — finished work the user opens, one entry per result. Theirs, and it stays.
|
|
264
|
-
- \`${PATHS.projects}/\` — code you build, one folder each
|
|
265
|
-
- \`${folders?.scratch ?? PATHS.scratch}/\` — this job's working material,
|
|
266
|
-
- \`${folders?.own ?? PATHS.bots}/\` — yours
|
|
236
|
+
- \`${folders?.artifacts ?? PATHS.artifacts}/\` — finished work the user opens, one entry per result. Theirs, and it stays.
|
|
237
|
+
- \`${PATHS.projects}/\` — code you build, one folder each; it outlives this job, and its dependencies install inside it, never at the workspace root.
|
|
238
|
+
- \`${folders?.scratch ?? PATHS.scratch}/\` — this job's working material, shared by every bot on it; cleared ${Math.round(WORKSPACE_KEEP.forMs / 86_400_000)} days after the job ends.
|
|
239
|
+
- \`${folders?.own ?? PATHS.bots}/\` — yours across every job you run here: what you keep for next time.
|
|
267
240
|
|
|
268
|
-
Never the directory above —
|
|
241
|
+
Inside the workspace, set up whatever the job needs yourself; installing anything machine-wide waits for the user's yes. Never the directory above the workspace — it is the app's, not the user's; outside the workspace, only where the user pointed you.`;
|
|
269
242
|
|
|
270
|
-
/**
|
|
243
|
+
/** The other bots, used the other way from the call's roster: which part of a held job is someone else's. */
|
|
271
244
|
function roster(peers: JobBot[]): string {
|
|
272
245
|
if (peers.length === 0) return "";
|
|
273
246
|
|
|
@@ -275,157 +248,63 @@ function roster(peers: JobBot[]): string {
|
|
|
275
248
|
|
|
276
249
|
${peers.map((bot) => `- **${bot.name}** — ${bot.description}`).join("\n")}
|
|
277
250
|
|
|
278
|
-
These lines were written for the user
|
|
279
|
-
|
|
280
|
-
A part of your job another bot is for goes to \`${TOOL_NAMES.ask_bot}\`, because their tools and their practice are the reason they exist. What you build is made of what they bring back, so send for it before you build. A part you could finish in a couple of commands is yours; one that would take a run of its own is theirs. What you were handed stays yours and you answer for it. They get the job, the call it came from and what you write them — not this thread.`;
|
|
251
|
+
These lines were written for the user: where one says "you", it means them. When part of the job is another bot's strength, bring it in with \`${TOOL_NAMES.send_message}\` rather than rebuilding it yourself.`;
|
|
281
252
|
}
|
|
282
253
|
|
|
283
|
-
/** The only place a run can stop. */
|
|
284
|
-
const ASKING = `## Asking
|
|
285
|
-
|
|
286
|
-
What you cannot get for yourself — a decision between real options, a detail only the conversation has, a go-ahead before deleting or sending — goes to \`${TOOL_NAMES.ask_thursday}\`, once, with everything in it. Ask before you start, not after an hour; never ask what one command would tell you.
|
|
287
|
-
|
|
288
|
-
A job that arrives without its shape — several ways to do it, no telling what it is for, a scale nobody named — is planned before it is built: put the plan up in two or three lines with what you need decided. A job asked for as one thing is built, not proposed.
|
|
289
|
-
|
|
290
|
-
Only what is theirs alone stops the job: a password, a one-time code, a passkey, a permission on their machine. Set it up one action away, ask, and carry on when the answer comes back.`;
|
|
291
|
-
|
|
292
|
-
const askingBack = (askedBy: string) => `## Asking
|
|
293
|
-
|
|
294
|
-
What you cannot get for yourself goes to \`${TOOL_NAMES.ask_back}\`: ${askedBy} handed you this part and answers from what they have. They cannot take a question to the user, so for what is the user's alone take the safer reading and say so in what you hand back. Ask before you start, once, whole.`;
|
|
295
|
-
|
|
296
254
|
/**
|
|
297
|
-
*
|
|
298
|
-
*
|
|
299
|
-
*
|
|
300
|
-
* heard writes for a length rather than for a question, and the padding it adds to
|
|
301
|
-
* reach that length is steps, not words.
|
|
302
|
-
* The step cap is stated nowhere a bot reads: told the number, runs work to it. It is
|
|
303
|
-
* enforced where it cannot be argued with (bot.run `stepCountIs`, and `lastStep`).
|
|
304
|
-
* Images in `.md` need absolute routes because a document opens from two places and relative paths resolve differently.
|
|
255
|
+
* How participants reach each other. Nobody reads anyone else's transcript, so the one thing that
|
|
256
|
+
* decides whether collaboration works is what a single message carries. What the coordinator's
|
|
257
|
+
* result opens by itself is the runner's rule (file-kind opensOnFinish), said in the same terms.
|
|
305
258
|
*/
|
|
306
|
-
|
|
259
|
+
function collaboration(name: string, seat?: Seat | null): string {
|
|
260
|
+
const owner = (seat?.owner ?? name) === name;
|
|
261
|
+
const ending = owner
|
|
262
|
+
? `Bring what you received together into one result for Thursday: what was done, where it is, what you decided that the request did not say, and what is still open, at the detail the user asked for. When the job ends, the first Markdown or HTML file under \`${PATHS.artifacts}/\` it names opens on the user's screen by itself; any other file opens only when they click it in the thread, so when one matters, say they can open it there.`
|
|
263
|
+
: `Your final text goes back to ${seat?.caller ?? "whoever asked"}: give them everything they need to carry on.`;
|
|
307
264
|
|
|
308
|
-
|
|
265
|
+
return `## Working together
|
|
309
266
|
|
|
310
|
-
|
|
267
|
+
Nobody sees your work but you, and you see only what others send you, so whatever crosses between you has to stand on its own. A request says what is wanted, what is already known or done, and where the files are; an answer gives exact values, file paths and what is still unverified. Tell whoever is waiting when something they depend on changes. End your turn when you have nothing more to do now: replies arrive as new messages and wake you.
|
|
311
268
|
|
|
312
|
-
|
|
269
|
+
Ask Thursday with kind \`question\` only for a decision, permission or something only the user knows: clearly, with the context to answer, and short options when they help. Use kind \`message\` for news that needs no answer, and your final text for the result.
|
|
313
270
|
|
|
314
|
-
|
|
271
|
+
${ending}
|
|
315
272
|
|
|
316
|
-
|
|
317
|
-
|
|
273
|
+
Write in the user's language, and name the paths of finished work. The app opens Markdown with its tables and mermaid blocks drawn, CSV as a table, HTML and PDF as pages, and images, audio and video; in Markdown, reference images by absolute route (\`/api/file/${PATHS.artifacts}/…\`).`;
|
|
274
|
+
}
|
|
318
275
|
|
|
319
|
-
/** A user message's content; every seat's first message is two text parts (
|
|
276
|
+
/** A user message's content; every seat's first message is two text parts (buildThreadOpening). */
|
|
320
277
|
export type OpeningContent = Extract<ModelMessage, { role: "user" }>["content"];
|
|
321
278
|
|
|
322
279
|
/**
|
|
323
|
-
*
|
|
324
|
-
*
|
|
325
|
-
* compaction
|
|
326
|
-
*
|
|
327
|
-
* call verbatim, because the request is one sentence the realtime model produced
|
|
328
|
-
* and a detail the user said may only be in the call. The chain is what a
|
|
329
|
-
* borrowed bot inherits (buildHandoff), so its headings name people and never say "you".
|
|
280
|
+
* Who handed the job over, and the job — nothing from the call it came from. The request
|
|
281
|
+
* carries what the bot needs (delegate's schema says so), and the opening outlives every
|
|
282
|
+
* compaction: a call pasted here would still be read long after, by a user talking to the
|
|
283
|
+
* bot on screen.
|
|
330
284
|
*/
|
|
331
|
-
export function
|
|
285
|
+
export function buildThreadOpening(input: {
|
|
332
286
|
bot: string;
|
|
333
287
|
request: string;
|
|
334
|
-
conversation: { role: "user" | "assistant"; text: string }[];
|
|
335
288
|
/** Who handed the job over: Thursday during a call, or the user on screen. */
|
|
336
|
-
from:
|
|
289
|
+
from: ThreadSpeaker;
|
|
337
290
|
}): OpeningContent {
|
|
338
|
-
const turns = input.conversation.filter((turn) => turn.text.trim());
|
|
339
291
|
const by = input.from === "user" ? "The user" : "Thursday";
|
|
340
|
-
const job = `## ${by} → ${input.bot}: the job\n\n${input.request.trim()}`;
|
|
341
|
-
const call = turns.length
|
|
342
|
-
? `## The call the job came from — its last ${turns.length} turns, verbatim
|
|
343
|
-
|
|
344
|
-
A detail missing from the job may be here — a name, a number, which of two. Where the two disagree the job wins, unless they asked out loud for something to be done and the job only asks about it: then the doing is the job.
|
|
345
|
-
|
|
346
|
-
${turns
|
|
347
|
-
.map(
|
|
348
|
-
(turn) =>
|
|
349
|
-
`${turn.role === "user" ? "user" : "thursday"}: ${clip(turn.text, PROMPT_LINE.callTurn)}`,
|
|
350
|
-
)
|
|
351
|
-
.join("\n")}`
|
|
352
|
-
: "";
|
|
353
|
-
return [
|
|
354
|
-
{ type: "text", text: whoIsWho([input.bot], input.from) },
|
|
355
|
-
{ type: "text", text: [job, call].filter(Boolean).join("\n\n") },
|
|
356
|
-
];
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
/**
|
|
360
|
-
* The first message of a borrowed bot, built by the bot that borrows it (bot.run
|
|
361
|
-
* `ask_bot`) and never stored: the chain it inherits, copied as it is, then what
|
|
362
|
-
* the borrowing bot has done and the part it hands over. `bots` runs from the
|
|
363
|
-
* bot holding the job down to this one, so each hand-off adds one name and two
|
|
364
|
-
* sections and every seat reads the same shape.
|
|
365
|
-
*/
|
|
366
|
-
export function buildHandoff(input: {
|
|
367
|
-
chain: string;
|
|
368
|
-
bots: string[];
|
|
369
|
-
did: string | null;
|
|
370
|
-
part: string;
|
|
371
|
-
}): OpeningContent {
|
|
372
|
-
const to = input.bots.at(-1) ?? "";
|
|
373
|
-
const from = input.bots.at(-2) ?? "";
|
|
374
|
-
const did = input.did?.trim()
|
|
375
|
-
? `## ${from} → ${to}: what ${from} has done, and why this part is ${to}'s\n\n${input.did.trim()}`
|
|
376
|
-
: "";
|
|
377
|
-
const part = `## ${from} → ${to}: the part\n\n${input.part.trim()}`;
|
|
378
292
|
return [
|
|
379
|
-
{ type: "text", text: whoIsWho(input.bots) },
|
|
380
293
|
{
|
|
381
294
|
type: "text",
|
|
382
|
-
text:
|
|
295
|
+
text: `You are ${input.bot}. ${by} hands you this thread${input.from === "user" ? " on screen" : " during a call"}.`,
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
type: "text",
|
|
299
|
+
text: `## ${by} → ${input.bot}: the job\n\n${input.request.trim()}`,
|
|
383
300
|
},
|
|
384
301
|
];
|
|
385
302
|
}
|
|
386
303
|
|
|
387
304
|
/**
|
|
388
|
-
*
|
|
389
|
-
*
|
|
390
|
-
* whole chain there was.
|
|
391
|
-
*/
|
|
392
|
-
export function chainOf(first: ModelMessage | undefined): string {
|
|
393
|
-
if (first?.role !== "user") return "";
|
|
394
|
-
if (typeof first.content === "string") return first.content;
|
|
395
|
-
const texts = first.content.flatMap((part) =>
|
|
396
|
-
part.type === "text" ? [part.text] : [],
|
|
397
|
-
);
|
|
398
|
-
return texts.at(-1) ?? "";
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
/**
|
|
402
|
-
* The bots on this job, and how it reached the one reading it — the last of
|
|
403
|
-
* `bots`. The user and Thursday are in every seat's prompt (identity); `from` is
|
|
404
|
-
* read only when the reader holds the job.
|
|
305
|
+
* One line per kind, absences included. Only a bot gets these: the call runs one command as a
|
|
306
|
+
* glance. How to install a missing browser is the browser skill's to say, not the prompt's.
|
|
405
307
|
*/
|
|
406
|
-
function whoIsWho(bots: string[], from?: TaskSpeaker): string {
|
|
407
|
-
const you = bots.length - 1;
|
|
408
|
-
const lines = bots.map((bot, index) => {
|
|
409
|
-
if (index === 0) {
|
|
410
|
-
return index === you
|
|
411
|
-
? `- **${bot} (you)** — ${
|
|
412
|
-
from === "user"
|
|
413
|
-
? "the user handed you this job on their screen, not during a call"
|
|
414
|
-
: "Thursday handed you this job during a call"
|
|
415
|
-
}.`
|
|
416
|
-
: `- **${bot}** — holds this job and answers for it.`;
|
|
417
|
-
}
|
|
418
|
-
const by = bots[index - 1];
|
|
419
|
-
return index === you
|
|
420
|
-
? `- **${bot} (you)** — ${by} handed you one part of it: the last section below. You answer to ${by}; nobody else hears from you.`
|
|
421
|
-
: `- **${bot}** — ${by} handed them one part of it.`;
|
|
422
|
-
});
|
|
423
|
-
return `## Who is on this job
|
|
424
|
-
|
|
425
|
-
${lines.join("\n")}`;
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
/** One line per kind, absences included. Only a bot gets these: the call runs one command as a glance. */
|
|
429
308
|
function machineLines(machine: MachineTools): string {
|
|
430
309
|
const line = (label: string, of: MachineTools["runtimes"]) =>
|
|
431
310
|
`${label}: ${of.found.length ? of.found.join(", ") : "none"}.${
|
|
@@ -441,9 +320,7 @@ function machineLines(machine: MachineTools): string {
|
|
|
441
320
|
`${line("Package managers", machine.managers)}${fenced}`,
|
|
442
321
|
machine.browser === null
|
|
443
322
|
? ""
|
|
444
|
-
: machine.browser
|
|
445
|
-
? "Browser: installed."
|
|
446
|
-
: "Browser: not installed — `playwright-cli install-browser chromium` puts one there.",
|
|
323
|
+
: `Browser: ${machine.browser ? "installed" : "not installed"}.`,
|
|
447
324
|
]
|
|
448
325
|
.filter(Boolean)
|
|
449
326
|
.join("\n");
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import {
|
|
2
|
+
listAlwaysLoaded,
|
|
3
|
+
listNoteIndex,
|
|
4
|
+
readNotes,
|
|
5
|
+
} from "@/features/memory/memory.query";
|
|
6
|
+
import {
|
|
7
|
+
MEMORY_ALWAYS_LISTED,
|
|
8
|
+
type MemoryAlwaysLoaded,
|
|
9
|
+
type MemoryIndexEntry,
|
|
10
|
+
type MemoryNoteView,
|
|
11
|
+
} from "@/features/memory/memory.schema";
|
|
12
|
+
import {
|
|
13
|
+
callEnding,
|
|
14
|
+
carriedLines,
|
|
15
|
+
expandedFacts,
|
|
16
|
+
logPromptSize,
|
|
17
|
+
noteLines,
|
|
18
|
+
thursdayIdentity,
|
|
19
|
+
tidying,
|
|
20
|
+
} from "./prompt-helper";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Everything the Live voice hears: who Thursday is and how a call ends (the words the backend
|
|
24
|
+
* opens with too), the guide's starter backchannel and interruption policies, a two-line
|
|
25
|
+
* delegation policy, and what she knows about the user. What the backend can do, how work is
|
|
26
|
+
* handed over, earlier calls and tidying memory are the backend's (thursday.prompt): the voice
|
|
27
|
+
* hands everything but conversation over and answers from what comes back. Assembled on every
|
|
28
|
+
* call, never cached.
|
|
29
|
+
*/
|
|
30
|
+
export async function loadLivePrompt(options: {
|
|
31
|
+
/** Settings › Thursday › Voice instructions; added to, never replacing, what is below. */
|
|
32
|
+
voicePrompt?: string | null;
|
|
33
|
+
locale?: string | null;
|
|
34
|
+
/** The page placed this call because background work waits on the user (call-back). */
|
|
35
|
+
calledBack?: boolean;
|
|
36
|
+
}): Promise<{ text: string; opening: string }> {
|
|
37
|
+
const [carried, open, index] = await Promise.all([
|
|
38
|
+
listAlwaysLoaded(),
|
|
39
|
+
// Written out in the prompt, which is not the user asking for them: no read counted
|
|
40
|
+
readNotes(MEMORY_ALWAYS_LISTED, { touch: false }),
|
|
41
|
+
listNoteIndex(),
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
const first = !open.notes.find((note) => note.path === "profile")?.facts
|
|
45
|
+
.length;
|
|
46
|
+
// Only the first-call greeting reads it: before they have said anything, the
|
|
47
|
+
// browser's locale is the one sign of their language
|
|
48
|
+
const language = options.locale
|
|
49
|
+
? `the language of \`${options.locale}\`, their browser's setting`
|
|
50
|
+
: "the language they use";
|
|
51
|
+
|
|
52
|
+
const text = [
|
|
53
|
+
thursdayIdentity(),
|
|
54
|
+
always(),
|
|
55
|
+
known(open.notes, carried, index),
|
|
56
|
+
first ? firstCall() : "",
|
|
57
|
+
additional(options.voicePrompt),
|
|
58
|
+
]
|
|
59
|
+
.filter(Boolean)
|
|
60
|
+
.join("\n\n");
|
|
61
|
+
logPromptSize("live", text);
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
text,
|
|
65
|
+
// A prompt line alone does not make Live speak first; only an opening does.
|
|
66
|
+
// A call-back's opening holds no bot text: the update itself follows as commentary
|
|
67
|
+
opening: options.calledBack
|
|
68
|
+
? "You placed this call because background work has something for the user; it comes in next. Speak first: greet them in one line and say that is why you called."
|
|
69
|
+
: first
|
|
70
|
+
? `Open the call now, in ${language}: say who you are and what you are here to do for them, in a line or two, then ask what to call them. Then stop and listen.`
|
|
71
|
+
: "The call has just started. Speak first: greet the user naturally, in one line.",
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* The rules for every turn, together right under the identity, where the model weighs most.
|
|
77
|
+
* One heading marks them; `IMPORTANT` stays on the ending rule alone, the one that failed
|
|
78
|
+
* without it (09-17), so stamping it on all four would thin it out.
|
|
79
|
+
*/
|
|
80
|
+
const always = () => `## Always
|
|
81
|
+
|
|
82
|
+
${callEnding()}
|
|
83
|
+
|
|
84
|
+
${speaking()}
|
|
85
|
+
|
|
86
|
+
${delegation()}`;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The guide's starter lines on listening and interruptions, labels kept as it says. The
|
|
90
|
+
* backchannel line is the one it invites changing: a long turn heard in silence reads as
|
|
91
|
+
* nobody listening.
|
|
92
|
+
*/
|
|
93
|
+
function speaking(): string {
|
|
94
|
+
return `Backchannel policy: Use moderate backchannels. When the user speaks at length, acknowledge now and then with a short listening sound so they know you are following, without competing with the main response.
|
|
95
|
+
|
|
96
|
+
Interruption policy: Stop speaking when the user interrupts. Listen to what they say.`;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Under the guide's label, and no longer than this: Live decides for itself whether to hand a
|
|
101
|
+
* turn over, and with no rule it answered from its own knowledge or only said it would act.
|
|
102
|
+
* What the backend can do and how is the backend's to know. What they say about themselves is
|
|
103
|
+
* named on its own: nothing is kept that is not handed over, and it is rarely a request. The
|
|
104
|
+
* voice sees only profile and preferences whole, so "already written" is a rough filter; the
|
|
105
|
+
* backend merges the rest (thursday.prompt memory).
|
|
106
|
+
*/
|
|
107
|
+
function delegation(): string {
|
|
108
|
+
return `Delegation policy:
|
|
109
|
+
Delegate to the backend everything the user asks for, tells you or asks about, except greetings, small talk and a brief clarification.
|
|
110
|
+
Whatever they tell you about themselves, the people in their life, their plans or how they want things done goes to the backend as they say it, however small — unless it is already written below.
|
|
111
|
+
Answer from what the backend returns, and do not guess the result while waiting.`;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Profile and preferences written out by the same rule as the backend's (expandedFacts), carried
|
|
116
|
+
* facts from other notes, then every other note as a listing line: what Thursday knows is the
|
|
117
|
+
* same on both sides. Ids and the contents of listed notes stay the backend's.
|
|
118
|
+
*/
|
|
119
|
+
function known(
|
|
120
|
+
open: MemoryNoteView[],
|
|
121
|
+
carried: MemoryAlwaysLoaded[],
|
|
122
|
+
index: MemoryIndexEntry[],
|
|
123
|
+
): string {
|
|
124
|
+
const carriedIds = new Set(carried.map((fact) => fact.id));
|
|
125
|
+
const written = new Set(open.map((note) => note.path));
|
|
126
|
+
const notes = open
|
|
127
|
+
.filter((note) => note.facts.length)
|
|
128
|
+
.map((note) => {
|
|
129
|
+
const { shown, hidden } = expandedFacts(note.facts, carriedIds);
|
|
130
|
+
const lines = shown.map((fact) => `- ${fact.text}`);
|
|
131
|
+
if (hidden) lines.push(`- … ${hidden} more in this note`);
|
|
132
|
+
return `${note.path}:\n${lines.join("\n")}`;
|
|
133
|
+
});
|
|
134
|
+
const elsewhere = carried.filter((fact) => !written.has(fact.path));
|
|
135
|
+
const others = index.filter((note) => !written.has(note.path));
|
|
136
|
+
if (!notes.length && !elsewhere.length && !others.length) return "";
|
|
137
|
+
|
|
138
|
+
const parts = [
|
|
139
|
+
...notes,
|
|
140
|
+
elsewhere.length
|
|
141
|
+
? `Carried into every call:\n${carriedLines(elsewhere, { ids: false })}`
|
|
142
|
+
: "",
|
|
143
|
+
// Ages ride on the listing only when there is too much to hold: they are what to drop by
|
|
144
|
+
others.length
|
|
145
|
+
? `Everything else you have kept — path — what it is about (facts) "what they call it":\n\n${noteLines(others, tidying(index).crowded)}\n\nWhat is in these notes, the backend recalls.`
|
|
146
|
+
: "",
|
|
147
|
+
].filter(Boolean);
|
|
148
|
+
|
|
149
|
+
return `## What you know about them
|
|
150
|
+
|
|
151
|
+
${parts.join("\n\n")}
|
|
152
|
+
|
|
153
|
+
Preferences are how they want things done and said: follow them. A topic not listed is one you know nothing about yet.`;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function firstCall(): string {
|
|
157
|
+
return `## First call
|
|
158
|
+
|
|
159
|
+
Nothing is known about this user yet. Across the call, one thing at a time and never as a list of questions, find out what to call them, their name, what they do, how old they are, where they live, and whatever else they offer. If they came with something they want done, that comes first.`;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const additional = (voicePrompt?: string | null) =>
|
|
163
|
+
voicePrompt?.trim()
|
|
164
|
+
? `## Additional instructions
|
|
165
|
+
|
|
166
|
+
Written by the user. Follow them together with everything above; for tone, language and wording they take precedence.
|
|
167
|
+
|
|
168
|
+
${voicePrompt.trim()}`
|
|
169
|
+
: "";
|