thursday-agent 0.2.0 → 0.4.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 +5 -2
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +5 -5
- package/.next/routes-manifest.json +24 -6
- package/.next/server/app/_global-error/page.js +2 -2
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +2 -2
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js +2 -2
- 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 +14 -14
- package/.next/server/app/_not-found.segments/_full.segment.rsc +14 -14
- 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 +3 -3
- package/.next/server/app/api/artifact/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/files/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/bot/memory/files/route.js +10 -0
- package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -0
- package/.next/server/app/api/bot/memory/files/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/bot/memory/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/bot/memory/route.js +14 -0
- package/.next/server/app/api/bot/{notes → memory}/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/memory/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/bot/route.js +6 -6
- package/.next/server/app/api/bot/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/task/[id]/route.js +8 -8
- package/.next/server/app/api/bot/task/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/task/route.js +8 -8
- package/.next/server/app/api/bot/task/route.js.nft.json +1 -1
- package/.next/server/app/api/config/route.js +5 -5
- package/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/server/app/api/events/route.js +4 -5
- package/.next/server/app/api/events/route.js.nft.json +1 -1
- package/.next/server/app/api/file/[...path]/route.js +3 -3
- package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/catalog/route.js +9 -8
- package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/credits/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/llm-model/credits/route/build-manifest.json +12 -0
- package/.next/server/app/api/llm-model/credits/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/llm-model/credits/route.js +16 -0
- package/.next/server/app/api/llm-model/credits/route.js.map +5 -0
- package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -0
- package/.next/server/app/api/llm-model/credits/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/llm-model/route.js +10 -8
- package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
- package/.next/server/app/api/llm-model/subscription/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/llm-model/subscription/route/build-manifest.json +12 -0
- package/.next/server/app/api/llm-model/subscription/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/llm-model/subscription/route.js +15 -0
- package/.next/server/app/api/llm-model/subscription/route.js.map +5 -0
- package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -0
- package/.next/server/app/api/llm-model/subscription/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/mcp/[name]/route.js +4 -4
- package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/oauth/callback/route.js +5 -5
- package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/route.js +4 -4
- package/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/tools/route.js +4 -4
- package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/memory/edit/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/memory/edit/route/build-manifest.json +12 -0
- package/.next/server/app/api/memory/edit/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/memory/edit/route.js +24 -0
- package/.next/server/app/api/memory/edit/route.js.map +5 -0
- package/.next/server/app/api/memory/edit/route.js.nft.json +1 -0
- package/.next/server/app/api/memory/{tidy → edit}/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/memory/route.js +6 -7
- package/.next/server/app/api/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[source]/[name]/route.js +3 -3
- package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route.js +3 -3
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/call/route.js +9 -7
- package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/skills/route.js +9 -7
- package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/thursday/tool-call/route.js +17 -15
- package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/route.js +4 -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 +5 -6
- 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 +3 -4
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
- package/.next/server/app/favicon.ico.body +0 -0
- package/.next/server/app/page/server-reference-manifest.json +57 -90
- package/.next/server/app/page.js +10 -10
- 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 +5 -2
- package/.next/server/chunks/[externals]__0dzuk6_._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__01dkp4a._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__02va5wz._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__02xjoto._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__04q--0f._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__0bl-e63._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0ce8nf8._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__0ffbg85._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0j7z0r3._.js +12 -0
- package/.next/server/chunks/[root-of-the-server]__0jq4ohy._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__0ls6_8y._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__0ncs9uu._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0pa2n68._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0q0vvt2._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1-ga0kh._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__11n256_._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__12cabg9._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1339jnv._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__15bjnu5._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__18_teo8._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +5 -0
- package/.next/server/chunks/[root-of-the-server]__1anc1p9._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1ccon1w._.js +5 -5
- package/.next/server/chunks/[root-of-the-server]__1fizn31._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1llj3-b._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1orn-5b._.js +12 -0
- package/.next/server/chunks/[root-of-the-server]__1p8m3f4._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1wa1k7r._.js +8 -0
- package/.next/server/chunks/_0-73of8._.js +5 -5
- package/.next/server/chunks/_0-fjql4._.js +26 -0
- package/.next/server/chunks/_00xh_q0._.js +25 -0
- package/.next/server/chunks/_051qh8u._.js +3 -0
- package/.next/server/chunks/{node_modules_next_04q-o58._.js → _05dla15._.js} +2 -2
- package/.next/server/chunks/_05h2cii._.js +1 -1
- package/.next/server/chunks/_0c9j6rb._.js +49 -0
- package/.next/server/chunks/_0fzqt2y._.js +134 -0
- package/.next/server/chunks/{_0vnutv9._.js → _0ioz3nd._.js} +1 -1
- package/.next/server/chunks/_0iwfby5._.js +3 -0
- package/.next/server/chunks/_0mecv0f._.js +26 -0
- package/.next/server/chunks/_0mh8j4m._.js +3 -0
- package/.next/server/chunks/_0n74zsf._.js +4 -4
- package/.next/server/chunks/_0obojvv._.js +3 -0
- package/.next/server/chunks/_0recufk._.js +49 -0
- package/.next/server/chunks/_0rnf-6n._.js +4 -4
- package/.next/server/chunks/_0sb7tlz._.js +3 -0
- package/.next/server/chunks/_0u10wmw._.js +5 -5
- package/.next/server/chunks/_0u4aiy2._.js +3 -0
- package/.next/server/chunks/_0wp4le3._.js +1 -1
- package/.next/server/chunks/_0y5fg-x._.js +1 -1
- package/.next/server/chunks/_1230wbx._.js +10 -0
- package/.next/server/chunks/_12nheja._.js +3 -0
- package/.next/server/chunks/_13510xh._.js +3 -0
- package/.next/server/chunks/_15hq89o._.js +1 -1
- package/.next/server/chunks/_17l5ygt._.js +49 -0
- package/.next/server/chunks/_18-1wcc._.js +5 -5
- package/.next/server/chunks/_1_5mnq4._.js +4 -4
- package/.next/server/chunks/_1_9mjx-._.js +3 -0
- package/.next/server/chunks/{_0pppbb5._.js → _1c78vw5._.js} +166 -37
- package/.next/server/chunks/_1d0j961._.js +6 -0
- package/.next/server/chunks/_1d5zmy8._.js +1 -1
- package/.next/server/chunks/_1drgfx4._.js +4 -4
- package/.next/server/chunks/_1f46eie._.js +3 -0
- package/.next/server/chunks/_1h5_8sk._.js +3 -0
- package/.next/server/chunks/_1hdnxb7._.js +3 -0
- package/.next/server/chunks/_1j8k_j5._.js +3 -0
- package/.next/server/chunks/_1krd9rf._.js +3 -0
- package/.next/server/chunks/_1nc0eui._.js +11 -0
- package/.next/server/chunks/_1nula3v._.js +3 -0
- package/.next/server/chunks/_1pf4qe-._.js +3 -0
- package/.next/server/chunks/_1php4eq._.js +1 -1
- package/.next/server/chunks/_1qxheoa._.js +3 -0
- package/.next/server/chunks/_1x6kd1r._.js +3 -0
- package/.next/server/chunks/_1yuv4vp._.js +1 -1
- package/.next/server/chunks/_1zjrdag._.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_bot_memory_files_route_actions_1_xd_8f.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_bot_memory_route_actions_1a8xfr7.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_llm-model_credits_route_actions_0v424pb.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_llm-model_subscription_route_actions_0-udcm5.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_memory_edit_route_actions_02sfnmr.js +3 -0
- package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
- package/.next/server/chunks/features_0rpfxbk._.js +3 -0
- package/.next/server/chunks/features_1qf3cei._.js +3 -0
- package/.next/server/chunks/features_bot_0zt92oh._.js +3 -0
- package/.next/server/chunks/features_bot_bot_query_ts_12mgkl2._.js +3 -0
- package/.next/server/chunks/features_memory_1uqvksn._.js +6 -0
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0a1rd09._.js → node_modules_consola_dist_chunks_prompt_mjs_0i7cvml._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_06067w6._.js → node_modules_consola_dist_chunks_prompt_mjs_0icqaqw._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_096ais_._.js → node_modules_consola_dist_chunks_prompt_mjs_0r28-sm._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_02s3hjt._.js → node_modules_consola_dist_chunks_prompt_mjs_0v_7drq._.js} +1 -1
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xoq2rl._.js +3 -0
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0tvkfgh._.js → node_modules_consola_dist_chunks_prompt_mjs_1y49572._.js} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__092knlj._.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]__0hg5gib._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0i8ie7f._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__0jsmmb-._.js → [root-of-the-server]__0mz33a7._.js} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0s9dq5u._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__0m1b5ky._.js → [root-of-the-server]__0s9l2sv._.js} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0tbkdlx._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0vnmv-s._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__0f6s48x._.js → [root-of-the-server]__0xpcv9w._.js} +3 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0xsog8n._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0xtssj3._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +61 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__15_uhip._.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]__1gtlw6v._.js +43 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1mzi-ju._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1ox7hbk._.js +4 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__1qfqvmg._.js → [root-of-the-server]__202p40z._.js} +2 -2
- package/.next/server/chunks/ssr/{_1mznrxk._.js → _001_ms1._.js} +3 -3
- package/.next/server/chunks/ssr/_01n3o0m._.js +3 -0
- package/.next/server/chunks/ssr/_0ap2fzn._.js +3 -0
- package/.next/server/chunks/ssr/_0fz4mf_._.js +3 -0
- package/.next/server/chunks/ssr/_0gb4gmf._.js +3 -0
- package/.next/server/chunks/ssr/_0h42fze._.js +3 -0
- package/.next/server/chunks/ssr/_0h7zdni._.js +1 -1
- package/.next/server/chunks/ssr/_0i_6q1w._.js +41 -0
- package/.next/server/chunks/ssr/_0ilna52._.js +42 -0
- package/.next/server/chunks/ssr/_0n3toaw._.js +3 -0
- package/.next/server/chunks/ssr/{_13punpm._.js → _0q0zan6._.js} +2 -2
- package/.next/server/chunks/ssr/{_077-g6s._.js → _0s99bgb._.js} +3 -3
- package/.next/server/chunks/ssr/_0zcjrbg._.js +3 -0
- package/.next/server/chunks/ssr/_0zhoc3r._.js +3 -0
- package/.next/server/chunks/ssr/{_1lip4th._.js → _1-_etts._.js} +2 -2
- package/.next/server/chunks/ssr/_1-teee5._.js +3 -3
- package/.next/server/chunks/ssr/_13fke0x._.js +3 -0
- package/.next/server/chunks/ssr/_15j2_8f._.js +3 -0
- package/.next/server/chunks/ssr/_1b2mjwr._.js +3 -0
- package/.next/server/chunks/ssr/{_09ja_w1._.js → _1f-dg-6._.js} +2 -2
- package/.next/server/chunks/ssr/_1fojd41._.js +4 -0
- package/.next/server/chunks/ssr/_1gd8q8l._.js +3 -0
- package/.next/server/chunks/ssr/{_1m3bsfr._.js → _1h0rw11._.js} +2 -2
- package/.next/server/chunks/ssr/_1jhd09t._.js +3 -0
- package/.next/server/chunks/ssr/{_040sk32._.js → _1lz_cq2._.js} +84 -88
- package/.next/server/chunks/ssr/_1nnsk7z._.js +3 -0
- package/.next/server/chunks/ssr/_1sji22n._.js +3 -0
- package/.next/server/chunks/ssr/{_0x_nu5e._.js → _1vi_uo7._.js} +2 -2
- package/.next/server/chunks/ssr/_1vyd1ji._.js +1 -1
- package/.next/server/chunks/ssr/features_bot_1s_-2vj._.js +3 -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/{node_modules_0kxz4gt._.js → node_modules_00etblx._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_18_dk7_._.js → node_modules_04jf_m8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0_n241r._.js → node_modules_08dhkiq._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0n1kj4p._.js → node_modules_0940ns5._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_17lrt3y._.js → node_modules_09q35v_._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1toafc-._.js → node_modules_0_-_a--._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0lrjk5t._.js → node_modules_0arus10._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_04n7mjs._.js → node_modules_0b__sgl._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0iz1rzd._.js → node_modules_0cxaxk9._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0ndvxub._.js → node_modules_0g7fzk3._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0kl7-tn._.js → node_modules_0had7xd._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_19dp7ko._.js → node_modules_0pvd7q-._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules_0x3-ply._.js +3 -0
- package/.next/server/chunks/ssr/{node_modules_1dwguw_._.js → node_modules_0yugy6m._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_004qlr4._.js → node_modules_14om4ar._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1q0p85z._.js → node_modules_14q6g4n._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules_17bwo43._.js +55 -0
- package/.next/server/chunks/ssr/{node_modules_1hd-5tv._.js → node_modules_198nmll._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0m93zeg._.js → node_modules_1_pc9kq._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1n5ygqe._.js → node_modules_1aaxuef._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_01qnv-a._.js → node_modules_1cx_ql6._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1zu988w._.js → node_modules_1cz2hle._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1xyd7ov._.js → node_modules_1efrqxi._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_13r44jq._.js → node_modules_1eg7m6c._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_08d8bke._.js → node_modules_1gdh31p._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1hn8z1f._.js → node_modules_1hpopmo._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_20yebtj._.js → node_modules_1qpjvy5._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_09xhur7._.js → node_modules_1vh5ntv._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0m9a4y0._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1b748ic._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_13w_wy9._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1z4hm5e._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules_@vercel_oidc_dist_06mk8id._.js +3 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_0w6mzq5._.js → node_modules_next_dist_0drixxt._.js} +4 -4
- package/.next/server/chunks/ssr/node_modules_next_dist_1n3w9lb._.js +2 -2
- package/.next/server/instrumentation.js +1 -1
- 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 +58 -91
- package/.next/static/chunks/00rd4-v8r7axp.js +1 -0
- package/.next/static/chunks/08qe4as2q428z.js +3 -0
- package/.next/static/chunks/{31ttnjt6g35a0.js → 0ev4hyghq0mbb.js} +1 -1
- package/.next/static/chunks/0fl3gwe4-l6tz.js +1 -0
- package/.next/static/chunks/0gnqdjn2lvdad.js +2 -0
- package/.next/static/chunks/0hwap1-p0m5sa.js +1 -0
- package/.next/static/chunks/0r5qcctujhxli.js +1 -0
- package/.next/static/chunks/0w52rrrmuj9r9.js +1 -0
- package/.next/static/chunks/{07kl352c-lvcz.js → 0wcprt5ot5she.js} +1 -1
- package/.next/static/chunks/10teww7wt-f6h.js +1 -0
- package/.next/static/chunks/15m575979un5f.js +38 -0
- package/.next/static/chunks/17p6tk6k88dq6.js +1 -0
- package/.next/static/chunks/{3_h9txt3tq8t8.js → 1dkjg87pxk0n9.js} +1 -1
- package/.next/static/chunks/1jd09sxcjddu1.js +1 -0
- package/.next/static/chunks/1kq8h8wi_e0bc.js +53 -0
- package/.next/static/chunks/{18vhba44l1fc9.js → 1w73ece_6bheu.js} +1 -1
- package/.next/static/chunks/{3ard_noqapnw1.js → 214ya3n5gxeih.js} +1 -1
- package/.next/static/chunks/22_zkas21rpna.js +1 -0
- package/.next/static/chunks/2h0sd2vumhb15.js +1 -0
- package/.next/static/chunks/2t4vhi3m8ahya.js +1 -0
- package/.next/static/chunks/2tigdtz3dpcy8.js +1 -0
- package/.next/static/chunks/2u7xt6mxg44lf.js +1 -0
- package/.next/static/chunks/39j0fvpybzabl.js +40 -0
- package/.next/static/chunks/3akmqm77muj4-.js +1 -0
- package/.next/static/chunks/3cq5g494yuke8.css +1 -0
- package/.next/static/chunks/3woj-xd7ki5_i.js +1 -0
- package/.next/static/chunks/3xk7yqgomx7yq.js +1 -0
- package/.next/static/chunks/3zmcsnuo25zvq.js +1 -0
- package/.next/static/media/favicon.37o1pjldwi2uc.ico +0 -0
- package/README.md +47 -22
- package/app/api/bot/memory/files/route.ts +14 -0
- package/app/api/bot/memory/route.ts +5 -0
- package/app/api/events/app-event.ts +3 -7
- package/app/api/llm-model/credits/route.ts +11 -0
- package/app/api/llm-model/route.ts +6 -1
- package/app/api/llm-model/subscription/route.ts +11 -0
- package/app/api/memory/edit/route.ts +7 -0
- package/app/api/memory/route.ts +21 -0
- package/app/api/query-key.ts +19 -4
- package/bin/port.mjs +65 -0
- package/bin/thursday.mjs +5 -33
- package/components/ui/shiny-text.tsx +48 -134
- package/database/migrations/{20260909060813_optimal_sabretooth → 20260910173049_numerous_spirit}/migration.sql +24 -34
- package/database/migrations/{20260909060813_optimal_sabretooth → 20260910173049_numerous_spirit}/snapshot.json +71 -145
- package/database/migrations/20260911030320_opposite_jack_power/migration.sql +1 -0
- package/database/migrations/{20260909063821_bitter_tenebrous → 20260911030320_opposite_jack_power}/snapshot.json +57 -184
- package/docs/how-it-works.md +11 -7
- package/docs/images/face-dark.png +0 -0
- package/docs/images/face-light.png +0 -0
- package/docs/images/keeps-going.png +0 -0
- package/features/ai/chatgpt.ts +639 -0
- package/features/ai/components/chatgpt-sign-in.tsx +66 -0
- package/features/ai/components/model-picker.tsx +17 -1
- package/features/ai/components/provider-icon.tsx +1 -0
- package/features/ai/load-tools.ts +78 -56
- package/features/ai/model.schema.ts +232 -34
- package/features/ai/model.ts +169 -24
- package/features/ai/prompts/bot.prompt.ts +207 -114
- package/features/ai/prompts/memory-edit.prompt.ts +33 -0
- package/features/ai/prompts/prompt-helper.ts +45 -26
- package/features/ai/prompts/thursday.prompt.ts +57 -27
- package/features/ai/tools/bot.tool.ts +35 -52
- package/features/ai/tools/connected.ts +17 -4
- package/features/ai/tools/memory.tool.ts +181 -117
- package/features/ai/tools/search.tool.ts +136 -47
- package/features/ai/tools/tool-name.ts +2 -6
- package/features/ai/tools/workspace.tool.ts +5 -1
- package/features/bot/bot.action.ts +14 -19
- package/features/bot/bot.memory.ts +89 -0
- package/features/bot/bot.query.ts +37 -57
- package/features/bot/bot.run.ts +512 -242
- package/features/bot/bot.runner.ts +434 -120
- package/features/bot/bot.schema.ts +104 -19
- package/features/bot/bot.seed.ts +89 -16
- package/features/bot/components/bot-mark.tsx +122 -20
- package/features/bot/components/bot-room.tsx +214 -132
- package/features/bot/components/bot-setting.tsx +790 -402
- package/features/bot/components/bot-tool.tsx +2 -7
- package/features/bot/components/mark-palette.tsx +54 -0
- package/features/bot/components/path-chips.tsx +1 -1
- package/features/bot/components/task-badge.tsx +26 -6
- package/features/bot/components/task-reply.tsx +22 -33
- package/features/bot/components/task-setting.tsx +20 -17
- package/features/bot/task.query.ts +240 -34
- package/features/bot/task.store.ts +76 -13
- package/features/config/components/config-setting.tsx +265 -34
- package/features/config/components/models-badge.tsx +42 -0
- package/features/config/config.action.ts +12 -0
- package/features/config/config.const.ts +38 -2
- package/features/connectors/mcp.manager.ts +10 -2
- package/features/intro/components/intro.tsx +47 -46
- package/features/memory/components/memory-edit.tsx +340 -0
- package/features/memory/components/memory-setting.tsx +75 -77
- package/features/memory/memory.action.ts +3 -43
- package/features/memory/memory.edit.ts +87 -0
- package/features/memory/memory.query.ts +24 -42
- package/features/memory/memory.schema.ts +29 -106
- package/features/settings/components/settings.tsx +2 -0
- package/features/settings/settings.alert.ts +3 -1
- package/features/thursday/components/ascii-orb.tsx +106 -90
- package/features/thursday/components/boot.tsx +7 -0
- package/features/thursday/components/call-log.tsx +219 -92
- package/features/thursday/components/face.tsx +6 -4
- package/features/thursday/components/tab-state.tsx +97 -0
- package/features/thursday/components/thursday-mark.tsx +4 -1
- package/features/thursday/components/thursday-setting.tsx +17 -47
- package/features/thursday/components/thursday.tsx +208 -98
- package/features/thursday/thursday.action.ts +12 -17
- package/features/thursday/thursday.query.ts +61 -70
- package/features/thursday/thursday.schema.ts +20 -7
- package/features/thursday/tool-line.ts +85 -12
- package/features/thursday/use-thursday.ts +87 -60
- package/features/workspace/components/file-view.tsx +4 -2
- package/features/workspace/workspace.ts +110 -26
- package/lib/limits.ts +1 -1
- package/lib/oauth-page.ts +27 -0
- package/lib/realtime/openai.ts +2 -2
- package/lib/realtime/realtime.protocol.ts +1 -1
- package/lib/realtime/realtime.tap.ts +122 -0
- package/lib/sandbox.ts +59 -36
- package/package.json +1 -1
- package/skills/browser/SKILL.md +55 -34
- package/.next/server/app/api/bot/notes/route/app-paths-manifest.json +0 -3
- package/.next/server/app/api/bot/notes/route.js +0 -14
- package/.next/server/app/api/bot/notes/route_client-reference-manifest.js +0 -3
- package/.next/server/app/api/memory/tidy/route/app-paths-manifest.json +0 -3
- package/.next/server/app/api/memory/tidy/route.js +0 -22
- package/.next/server/app/api/memory/tidy/route.js.nft.json +0 -1
- package/.next/server/chunks/0d-b_next_dist_server_app-render_after-task-async-storage_external_0-exn7p.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0-npkh_._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__005var5._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__019dx9f._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__02_2sm-._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__04_8spk._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__05luceg._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__06t77t4._.js +0 -11
- package/.next/server/chunks/[root-of-the-server]__0bed6hu._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__0cro2dz._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__0dupqt7._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__0emr6go._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0le4d-p._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0m8ywyo._.js +0 -10
- package/.next/server/chunks/[root-of-the-server]__0nfuugi._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__0p32jfz._.js +0 -12
- package/.next/server/chunks/[root-of-the-server]__0phdgco._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__0wvgrsl._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__10qshki._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__11j52t0._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__1692zrv._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__16thabu._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__173nhwf._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__1_aoyr9._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1bn73ih._.js +0 -10
- package/.next/server/chunks/[root-of-the-server]__1bqhuh9._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__1cqizfq._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__1e-ci13._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1fboj2j._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1lr7j9t._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__1oli73c._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1txedx6._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__1untqv8._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__1zgpz1w._.js +0 -3
- package/.next/server/chunks/_00_584r._.js +0 -293
- package/.next/server/chunks/_012yhfm._.js +0 -39
- package/.next/server/chunks/_06mxlgn._.js +0 -3
- package/.next/server/chunks/_07rtlxv._.js +0 -3
- package/.next/server/chunks/_0a351g7._.js +0 -6
- package/.next/server/chunks/_0kjjmag._.js +0 -3
- package/.next/server/chunks/_0nn99o2._.js +0 -3
- package/.next/server/chunks/_0zuzmt_._.js +0 -39
- package/.next/server/chunks/_106co2o._.js +0 -3
- package/.next/server/chunks/_12bbv5i._.js +0 -100
- package/.next/server/chunks/_15q1pig._.js +0 -3
- package/.next/server/chunks/_19wg5yn._.js +0 -138
- package/.next/server/chunks/_1bt95p9._.js +0 -55
- package/.next/server/chunks/_1cbk7ms._.js +0 -26
- package/.next/server/chunks/_1drv2et._.js +0 -40
- package/.next/server/chunks/_1ic3bew._.js +0 -5
- package/.next/server/chunks/_1mxn_lb._.js +0 -3
- package/.next/server/chunks/_1rysr-r._.js +0 -10
- package/.next/server/chunks/_1u3rwbr._.js +0 -3
- package/.next/server/chunks/_1x7p319._.js +0 -6
- package/.next/server/chunks/_next-internal_server_app_api_bot_notes_route_actions_0qcsyu7.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_memory_tidy_route_actions_0_cfuom.js +0 -3
- package/.next/server/chunks/features_bot_task_query_ts_11xuzl3._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0gzvgfv._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0vorg6w._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1tpvamf._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1vmaq9f._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1y9-wcr._.js +0 -3
- package/.next/server/chunks/ssr/[externals]_node_crypto_1kn79-7._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0iuoa-r._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0un-erv._.js +0 -4
- package/.next/server/chunks/ssr/[root-of-the-server]__1-mnhyd._.js +0 -92
- package/.next/server/chunks/ssr/[root-of-the-server]__1bww500._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__1vcdast._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__1xwnu-h._.js +0 -3
- package/.next/server/chunks/ssr/_0-mc7ro._.js +0 -3
- package/.next/server/chunks/ssr/_01p5r6-._.js +0 -3
- package/.next/server/chunks/ssr/_03webdr._.js +0 -3
- package/.next/server/chunks/ssr/_09-0k3z._.js +0 -3
- package/.next/server/chunks/ssr/_0f_b_9s._.js +0 -3
- package/.next/server/chunks/ssr/_0fafgvl._.js +0 -3
- package/.next/server/chunks/ssr/_0sf1isi._.js +0 -3
- package/.next/server/chunks/ssr/_0su6_08._.js +0 -3
- package/.next/server/chunks/ssr/_0ti51xc._.js +0 -3
- package/.next/server/chunks/ssr/_0w5bgak._.js +0 -3
- package/.next/server/chunks/ssr/_0y84qo6._.js +0 -3
- package/.next/server/chunks/ssr/_1ciyoo3._.js +0 -3
- package/.next/server/chunks/ssr/_1e-dgz0._.js +0 -4
- package/.next/server/chunks/ssr/_1fq7zgb._.js +0 -3
- package/.next/server/chunks/ssr/_1g6l4uj._.js +0 -3
- package/.next/server/chunks/ssr/_1ruzehw._.js +0 -3
- package/.next/server/chunks/ssr/features_bot_components_bot-setting_tsx_01ajft6._.js +0 -4
- package/.next/server/chunks/ssr/features_config_components_14jqgy4._.js +0 -3
- package/.next/server/chunks/ssr/features_memory_components_memory-setting_tsx_0oa43sw._.js +0 -4
- package/.next/server/chunks/ssr/node_modules_zod_v4_classic_external_15fmmz3.js +0 -55
- package/.next/static/chunks/05b6nx_o3_f_n.js +0 -1
- package/.next/static/chunks/0dmns-gi0raa4.js +0 -1
- package/.next/static/chunks/0f9sq-7q_yxyl.js +0 -1
- package/.next/static/chunks/0oc4_xoia77dg.css +0 -1
- package/.next/static/chunks/0pheo8m3a-rzi.js +0 -1
- package/.next/static/chunks/19i8h2t-5evjx.js +0 -1
- package/.next/static/chunks/1c5fcj473025q.js +0 -1
- package/.next/static/chunks/1pi_hbmjw-f-z.js +0 -1
- package/.next/static/chunks/1twt6k09vg4np.js +0 -1
- package/.next/static/chunks/1ytnip8wdng93.js +0 -1
- package/.next/static/chunks/28gotuisldmom.js +0 -1
- package/.next/static/chunks/2998p0y7k1c8z.js +0 -3
- package/.next/static/chunks/29gyb3nubj51j.js +0 -53
- package/.next/static/chunks/2l233xfycjpd8.js +0 -1
- package/.next/static/chunks/2p5n7pa3c40t-.js +0 -2
- package/.next/static/chunks/2ru1q132af7h7.js +0 -1
- package/.next/static/chunks/2t8wqycwg3y04.js +0 -2
- package/.next/static/chunks/2uxum7qbyeyxd.js +0 -1
- package/.next/static/chunks/32z_ypgtchw48.js +0 -1
- package/.next/static/chunks/33pyjb3xd1iez.js +0 -1
- package/.next/static/chunks/3omud5xunrk1f.js +0 -1
- package/.next/static/chunks/42dnrkbph9e-1.js +0 -1
- package/.next/static/media/favicon.2vob68tjqpejf.ico +0 -0
- package/database/migrations/20260909063821_bitter_tenebrous/migration.sql +0 -1
- package/features/ai/prompts/memory-tidy.prompt.ts +0 -129
- package/features/ai/tools/tidy.tool.ts +0 -22
- package/features/bot/bot.notes.ts +0 -120
- package/features/memory/components/memory-tidy.tsx +0 -395
- package/features/memory/components/memory-view.tsx +0 -84
- package/features/memory/memory.tidy.ts +0 -332
- package/features/memory/tidy.query.ts +0 -135
- package/features/thursday/use-call-title.ts +0 -31
- /package/.next/server/app/api/bot/{notes → memory/files}/route/build-manifest.json +0 -0
- /package/.next/server/app/api/bot/{notes → memory/files}/route/server-reference-manifest.json +0 -0
- /package/.next/server/app/api/bot/{notes → memory/files}/route.js.map +0 -0
- /package/.next/server/app/api/{memory/tidy → bot/memory}/route/build-manifest.json +0 -0
- /package/.next/server/app/api/{memory/tidy → bot/memory}/route/server-reference-manifest.json +0 -0
- /package/.next/server/app/api/{memory/tidy → bot/memory}/route.js.map +0 -0
- /package/.next/static/{YR4NWcDDuzwLbTTU7U7Vr → kaTO0UHqF1bMnWgCDik2f}/_buildManifest.js +0 -0
- /package/.next/static/{YR4NWcDDuzwLbTTU7U7Vr → kaTO0UHqF1bMnWgCDik2f}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{YR4NWcDDuzwLbTTU7U7Vr → kaTO0UHqF1bMnWgCDik2f}/_ssgManifest.js +0 -0
|
@@ -12,16 +12,16 @@ import { Combobox } from "@/components/ui/combobox";
|
|
|
12
12
|
import { Input } from "@/components/ui/input";
|
|
13
13
|
import { notify } from "@/components/ui/notify";
|
|
14
14
|
import { Segmented } from "@/components/ui/segmented";
|
|
15
|
-
import { Swatch } from "@/components/ui/swatch";
|
|
16
15
|
import { Textarea } from "@/components/ui/textarea";
|
|
16
|
+
import { ASCII_FACE } from "@/config";
|
|
17
17
|
import { ProviderIcon } from "@/features/ai/components/provider-icon";
|
|
18
18
|
import {
|
|
19
19
|
type AiProvider,
|
|
20
20
|
SPEACH_MODEL_PROVIDER_LIST,
|
|
21
21
|
type SpeachModelRef,
|
|
22
22
|
} from "@/features/ai/model.schema";
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
23
|
+
import { MarkPalette } from "@/features/bot/components/mark-palette";
|
|
24
|
+
import { MARK_SHAPES } from "@/features/bot/mark.const";
|
|
25
25
|
import {
|
|
26
26
|
SettingChoiceRows,
|
|
27
27
|
SettingError,
|
|
@@ -149,13 +149,10 @@ export function ThursdaySetting() {
|
|
|
149
149
|
onChange={(hotkey) => patch({ hotkey })}
|
|
150
150
|
/>
|
|
151
151
|
|
|
152
|
-
{/*
|
|
153
|
-
|
|
154
|
-
browser (memory.tidy) */}
|
|
152
|
+
{/* Server-side, unlike everything above it: the tool set is built where a
|
|
153
|
+
call opens (ai/load-tools) */}
|
|
155
154
|
<SkillsSetting />
|
|
156
155
|
|
|
157
|
-
<TidySetting />
|
|
158
|
-
|
|
159
156
|
<Instructions
|
|
160
157
|
value={thursday.systemPrompt ?? ""}
|
|
161
158
|
onSave={(systemPrompt) => patch({ systemPrompt })}
|
|
@@ -220,7 +217,7 @@ function ResetHistory() {
|
|
|
220
217
|
okMessage: ({ calls, tasks, notes }) =>
|
|
221
218
|
`Wiped ${calls} calls, ${tasks} jobs, ${notes} notes`,
|
|
222
219
|
onOk: () => {
|
|
223
|
-
// Prefix match, so
|
|
220
|
+
// Prefix match, so every loaded history page goes too.
|
|
224
221
|
revalidate(queryKey.memory);
|
|
225
222
|
revalidate(queryKey.tasks);
|
|
226
223
|
revalidate(queryKey.callHistory(null));
|
|
@@ -303,41 +300,14 @@ function FacePicker({
|
|
|
303
300
|
</p>
|
|
304
301
|
</div>
|
|
305
302
|
|
|
306
|
-
{/* Only the mark takes a color; the orb follows the theme (OrbFace ignores it).
|
|
307
|
-
Rows break where the palette breaks (MARK_PALETTE_ROWS); the theme dot stands apart. */}
|
|
303
|
+
{/* Only the mark takes a color; the orb follows the theme (OrbFace ignores it). */}
|
|
308
304
|
{value.kind === "mark" && (
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
picked={!value.color}
|
|
316
|
-
onPick={() => patch({ color: undefined })}
|
|
317
|
-
/>
|
|
318
|
-
<span className="w-2" />
|
|
319
|
-
{MARK_PALETTE_ROWS[0].map((color) => (
|
|
320
|
-
<Swatch
|
|
321
|
-
key={color}
|
|
322
|
-
color={color}
|
|
323
|
-
picked={value.color === color}
|
|
324
|
-
onPick={() => patch({ color })}
|
|
325
|
-
/>
|
|
326
|
-
))}
|
|
327
|
-
</div>
|
|
328
|
-
{/* indent by the theme dot and its gap so the dark row lines up under the first light color */}
|
|
329
|
-
<div className="flex flex-wrap items-center gap-2 pl-9">
|
|
330
|
-
{MARK_PALETTE_ROWS[1].map((color) => (
|
|
331
|
-
<Swatch
|
|
332
|
-
key={color}
|
|
333
|
-
color={color}
|
|
334
|
-
picked={value.color === color}
|
|
335
|
-
onPick={() => patch({ color })}
|
|
336
|
-
/>
|
|
337
|
-
))}
|
|
338
|
-
</div>
|
|
339
|
-
</div>
|
|
340
|
-
</div>
|
|
305
|
+
<MarkPalette
|
|
306
|
+
color={value.color}
|
|
307
|
+
themePicked={!value.color}
|
|
308
|
+
onTheme={() => patch({ color: undefined })}
|
|
309
|
+
onPick={(color) => patch({ color })}
|
|
310
|
+
/>
|
|
341
311
|
)}
|
|
342
312
|
|
|
343
313
|
{value.kind === "mark" && (
|
|
@@ -386,8 +356,8 @@ function FacePicker({
|
|
|
386
356
|
|
|
387
357
|
<Row label="Size">
|
|
388
358
|
<Slider
|
|
389
|
-
min={
|
|
390
|
-
max={
|
|
359
|
+
min={ASCII_FACE.fontSize.min}
|
|
360
|
+
max={ASCII_FACE.fontSize.max}
|
|
391
361
|
step={1}
|
|
392
362
|
value={value.fontSize}
|
|
393
363
|
format={(n) => `${n}px`}
|
|
@@ -397,8 +367,8 @@ function FacePicker({
|
|
|
397
367
|
|
|
398
368
|
<Row label="Density">
|
|
399
369
|
<Slider
|
|
400
|
-
min={
|
|
401
|
-
max={
|
|
370
|
+
min={ASCII_FACE.density.min}
|
|
371
|
+
max={ASCII_FACE.density.max}
|
|
402
372
|
step={0.1}
|
|
403
373
|
value={value.density}
|
|
404
374
|
format={(n) => `${n.toFixed(1)}x`}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
ChevronDown,
|
|
5
5
|
ChevronUp,
|
|
6
6
|
Flag,
|
|
7
|
-
|
|
7
|
+
type LucideIcon,
|
|
8
8
|
Mic,
|
|
9
9
|
MicOff,
|
|
10
10
|
Settings2,
|
|
@@ -13,7 +13,7 @@ import { type ReactNode, useEffect, useRef, useState } from "react";
|
|
|
13
13
|
import { queryKey } from "@/app/api/query-key";
|
|
14
14
|
import { Button } from "@/components/ui/button";
|
|
15
15
|
import { ButtonGroup } from "@/components/ui/button-group";
|
|
16
|
-
import ShinyText from "@/components/ui/shiny-text";
|
|
16
|
+
import { ShinyText } from "@/components/ui/shiny-text";
|
|
17
17
|
import TextType from "@/components/ui/text-type";
|
|
18
18
|
import {
|
|
19
19
|
Tooltip,
|
|
@@ -22,15 +22,13 @@ import {
|
|
|
22
22
|
TooltipTrigger,
|
|
23
23
|
} from "@/components/ui/tooltip";
|
|
24
24
|
import { SPEACH_MODEL_PROVIDER_LIST } from "@/features/ai/model.schema";
|
|
25
|
-
import { DEFAULT_BOT } from "@/features/bot/bot.schema";
|
|
25
|
+
import { type Bot, DEFAULT_BOT } from "@/features/bot/bot.schema";
|
|
26
26
|
import { BotMark } from "@/features/bot/components/bot-mark";
|
|
27
27
|
import { BotRoom } from "@/features/bot/components/bot-room";
|
|
28
28
|
import { toolIcon } from "@/features/bot/components/bot-tool";
|
|
29
29
|
import { installSeedBots } from "@/features/bot/seed-bots";
|
|
30
30
|
import { VoiceKeys } from "@/features/config/components/voice-key";
|
|
31
31
|
import { type ConfigStatus, isConfigSet } from "@/features/config/config.const";
|
|
32
|
-
import { MemoryTidyNotice } from "@/features/memory/components/memory-tidy";
|
|
33
|
-
import { MemoryView } from "@/features/memory/components/memory-view";
|
|
34
32
|
import { SECTIONS, Settings } from "@/features/settings/components/settings";
|
|
35
33
|
import {
|
|
36
34
|
type SectionAlert,
|
|
@@ -47,13 +45,13 @@ import {
|
|
|
47
45
|
type ThursdayFace,
|
|
48
46
|
} from "@/features/thursday/thursday.schema";
|
|
49
47
|
import { useThursdayStore } from "@/features/thursday/thursday.store";
|
|
50
|
-
import { useCallTitle } from "@/features/thursday/use-call-title";
|
|
51
48
|
import { type ToolRun, useThursday } from "@/features/thursday/use-thursday";
|
|
52
49
|
import { ArtifactView } from "@/features/workspace/components/artifact-view";
|
|
53
50
|
import { useHotkeyLabel } from "@/hooks/use-hotkey";
|
|
54
51
|
import { useServerRoute } from "@/lib/protocol/use-server-route";
|
|
55
52
|
import { cn } from "@/lib/utils";
|
|
56
53
|
import { Face } from "./face";
|
|
54
|
+
import { TabState } from "./tab-state";
|
|
57
55
|
|
|
58
56
|
/**
|
|
59
57
|
* The call screen. The face is the only control; text stays beside it and is
|
|
@@ -115,6 +113,7 @@ export function CallScreen({
|
|
|
115
113
|
const hers =
|
|
116
114
|
messages.findLast((turn) => turn.role === "assistant")?.text ?? "";
|
|
117
115
|
const sided = captionView === "sides" && status !== "idle";
|
|
116
|
+
const turns = useTurnPager(messages);
|
|
118
117
|
return (
|
|
119
118
|
<div className="relative flex h-full flex-col">
|
|
120
119
|
<div className="absolute top-5 right-5 z-10">
|
|
@@ -122,7 +121,14 @@ export function CallScreen({
|
|
|
122
121
|
</div>
|
|
123
122
|
|
|
124
123
|
{/* Top padding in vh, like the face itself, so the face+text column sits below center */}
|
|
125
|
-
|
|
124
|
+
{/* The wheel winds the turns back. It is on this column rather than on the
|
|
125
|
+
screen: the corner holds the settings dialog and the room its own list,
|
|
126
|
+
and a portal's wheel bubbles up the tree it was written in, not the one
|
|
127
|
+
it is drawn in. */}
|
|
128
|
+
<div
|
|
129
|
+
onWheel={sided ? turns.onWheel : undefined}
|
|
130
|
+
className="flex min-h-0 flex-1 flex-col items-center justify-center gap-5 pt-[7vh]"
|
|
131
|
+
>
|
|
126
132
|
{/* The face is the control. It reacts to the agent's own voice. */}
|
|
127
133
|
<div className="relative w-[min(28rem,72vw,52vh)]">
|
|
128
134
|
<button
|
|
@@ -151,7 +157,7 @@ export function CallScreen({
|
|
|
151
157
|
/>
|
|
152
158
|
</button>
|
|
153
159
|
|
|
154
|
-
{sided && <SideCaptions
|
|
160
|
+
{sided && <SideCaptions shown={turns.shown} give={turns.give} />}
|
|
155
161
|
</div>
|
|
156
162
|
|
|
157
163
|
{/* The column is wider than the text (40rem); the side margins hold the caption chevrons (Flow) */}
|
|
@@ -207,10 +213,6 @@ export function CallScreen({
|
|
|
207
213
|
</div>
|
|
208
214
|
</div>
|
|
209
215
|
|
|
210
|
-
{/* Memory the model opens for reading (memory_show) */}
|
|
211
|
-
<MemoryView />
|
|
212
|
-
{/* A tidy pass ending is off-screen; it toasts (memory-tidy) */}
|
|
213
|
-
<MemoryTidyNotice />
|
|
214
216
|
{/* Documents a finished task produced; opens itself on the artifact event */}
|
|
215
217
|
<ArtifactView />
|
|
216
218
|
|
|
@@ -513,8 +515,23 @@ function Step({
|
|
|
513
515
|
);
|
|
514
516
|
}
|
|
515
517
|
|
|
516
|
-
/**
|
|
517
|
-
|
|
518
|
+
/**
|
|
519
|
+
* Bars the mic meter draws: each over its own slice of the bands, with a gain
|
|
520
|
+
* that answers what a voice does to them. Speech stacks its energy in the
|
|
521
|
+
* fundamental and thins out with every band above it, so one gain for all five
|
|
522
|
+
* draws a tall bar on the left and four stubs — the gain rises to meet the
|
|
523
|
+
* drop, and the whole row moves instead of its first quarter.
|
|
524
|
+
*/
|
|
525
|
+
const MIC_BARS = [
|
|
526
|
+
{ id: "a", from: 0, to: 1, gain: 0.8 },
|
|
527
|
+
{ id: "b", from: 1, to: 3, gain: 1 },
|
|
528
|
+
{ id: "c", from: 3, to: 5, gain: 1.15 },
|
|
529
|
+
{ id: "d", from: 5, to: 6, gain: 1.35 },
|
|
530
|
+
{ id: "e", from: 6, to: 8, gain: 1.55 },
|
|
531
|
+
];
|
|
532
|
+
|
|
533
|
+
/** Bar height in px, silent and at full. */
|
|
534
|
+
const MIC_BAR = { rest: 2, full: 14 };
|
|
518
535
|
|
|
519
536
|
/**
|
|
520
537
|
* The user's own level, read once per animation frame like the face reads
|
|
@@ -530,15 +547,28 @@ function MicMeter({
|
|
|
530
547
|
getMicSpectrum?: () => ArrayLike<number>;
|
|
531
548
|
}) {
|
|
532
549
|
const bars = useRef<Record<string, HTMLSpanElement | null>>({});
|
|
550
|
+
// Height per bar, kept between frames so a bar can fall slower than it rises.
|
|
551
|
+
const held = useRef(MIC_BARS.map(() => 0));
|
|
533
552
|
|
|
534
553
|
useEffect(() => {
|
|
535
554
|
if (!live || !getMicSpectrum) return;
|
|
536
555
|
let frame = requestAnimationFrame(function draw() {
|
|
537
556
|
const bands = getMicSpectrum();
|
|
538
|
-
MIC_BARS.forEach((
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
557
|
+
MIC_BARS.forEach((bar, at) => {
|
|
558
|
+
let peak = 0;
|
|
559
|
+
for (let k = bar.from; k < bar.to; k++) {
|
|
560
|
+
peak = Math.max(peak, bands[k] ?? 0);
|
|
561
|
+
}
|
|
562
|
+
// The curve is the loudness the ear hears, not the energy the mic reads:
|
|
563
|
+
// without it everything under half volume draws as the same short bar.
|
|
564
|
+
const want = Math.min(1, (peak * bar.gain) ** 0.8);
|
|
565
|
+
const was = held.current[at];
|
|
566
|
+
// Up in a frame or two to catch a syllable, down slowly enough to see.
|
|
567
|
+
const now = was + (want - was) * (want > was ? 0.6 : 0.16);
|
|
568
|
+
held.current[at] = now;
|
|
569
|
+
const node = bars.current[bar.id];
|
|
570
|
+
if (node) {
|
|
571
|
+
node.style.height = `${MIC_BAR.rest + now * (MIC_BAR.full - MIC_BAR.rest)}px`;
|
|
542
572
|
}
|
|
543
573
|
});
|
|
544
574
|
frame = requestAnimationFrame(draw);
|
|
@@ -551,13 +581,13 @@ function MicMeter({
|
|
|
551
581
|
aria-hidden
|
|
552
582
|
className="flex h-3.5 w-[18px] shrink-0 items-center gap-0.5"
|
|
553
583
|
>
|
|
554
|
-
{MIC_BARS.map((
|
|
584
|
+
{MIC_BARS.map((bar) => (
|
|
555
585
|
<span
|
|
556
|
-
key={id}
|
|
586
|
+
key={bar.id}
|
|
557
587
|
ref={(node) => {
|
|
558
|
-
bars.current[id] = node;
|
|
588
|
+
bars.current[bar.id] = node;
|
|
559
589
|
}}
|
|
560
|
-
style={{ height:
|
|
590
|
+
style={{ height: MIC_BAR.rest }}
|
|
561
591
|
className="w-0.5 rounded-full bg-muted-foreground/70"
|
|
562
592
|
/>
|
|
563
593
|
))}
|
|
@@ -580,7 +610,7 @@ function Ear({
|
|
|
580
610
|
getMicSpectrum?: () => ArrayLike<number>;
|
|
581
611
|
}) {
|
|
582
612
|
return (
|
|
583
|
-
<span className="flex items-center gap-
|
|
613
|
+
<span className="flex items-center gap-1.5 text-[13px] leading-5 text-muted-foreground">
|
|
584
614
|
<MicMeter live={live} getMicSpectrum={getMicSpectrum} />
|
|
585
615
|
Listening
|
|
586
616
|
</span>
|
|
@@ -592,57 +622,107 @@ function Ear({
|
|
|
592
622
|
* motion (loader in the icon slot, shine on the text), not color; the loader
|
|
593
623
|
* resolving into the tool's own glyph is what "finished" looks like.
|
|
594
624
|
*
|
|
595
|
-
*
|
|
596
|
-
* container, so an outline under one of the two read as the
|
|
597
|
-
* shape rather than changing state.
|
|
625
|
+
* The line itself wears no pill. This slot cross-fades with the listening chip,
|
|
626
|
+
* which has no container either, so an outline under one of the two read as the
|
|
627
|
+
* line changing shape rather than changing state.
|
|
598
628
|
*/
|
|
599
629
|
function Activity({ tool, micOff }: { tool: ToolRun; micOff: boolean }) {
|
|
600
|
-
// a relay from a bot is a flag, like the
|
|
630
|
+
// a relay from a bot is a flag, like the answer tool — unless it names the bot
|
|
601
631
|
const relay = tool.kind === "relay";
|
|
602
632
|
const Icon = relay ? Flag : toolIcon(tool.name);
|
|
633
|
+
// The sentence when there is one; otherwise the tool's own name is the line,
|
|
634
|
+
// rather than a tag repeating one.
|
|
635
|
+
const text = tool.line ?? tool.name;
|
|
636
|
+
const look = tool.line
|
|
637
|
+
? "min-w-0 truncate text-[13px] leading-5 break-keep"
|
|
638
|
+
: "min-w-0 truncate font-mono text-xs leading-5";
|
|
639
|
+
// Only for the colour and silhouette the user picked; the name alone already
|
|
640
|
+
// draws a face, so a roster that has not arrived yet costs nothing.
|
|
641
|
+
const bots = useServerRoute<Bot[]>(queryKey.bot).data;
|
|
642
|
+
const bot = tool.bot
|
|
643
|
+
? (bots?.find((one) => one.name === tool.bot) ?? null)
|
|
644
|
+
: null;
|
|
603
645
|
return (
|
|
604
|
-
<span className="flex max-w-full items-center gap-
|
|
605
|
-
{/*
|
|
606
|
-
|
|
607
|
-
<span className="relative
|
|
608
|
-
{tool
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
page the two glyphs otherwise share strokes and read as a smudge. */}
|
|
617
|
-
{micOff && (
|
|
618
|
-
<MicOff className="absolute -right-1.5 -bottom-1.5 size-4 rounded-full bg-background p-[3.5px] text-muted-foreground" />
|
|
646
|
+
<span className="flex max-w-full items-center gap-1.5">
|
|
647
|
+
{/* 18px slot, the width the listening meter beside it has, so the two
|
|
648
|
+
faces of this slot start on the same edge */}
|
|
649
|
+
<span className="relative grid size-[18px] shrink-0 place-items-center">
|
|
650
|
+
<Mark tool={tool} bot={bot} icon={Icon} />
|
|
651
|
+
{/* Running is the glyph being filled in, over its own dimmed self: the
|
|
652
|
+
spinner that used to stand here took the glyph off the screen for as
|
|
653
|
+
long as it ran, which is exactly when it says the most. */}
|
|
654
|
+
{!tool.done && (
|
|
655
|
+
<span className="absolute inset-0 grid animate-ink place-items-center">
|
|
656
|
+
<Mark tool={tool} bot={bot} icon={Icon} running />
|
|
657
|
+
</span>
|
|
619
658
|
)}
|
|
620
659
|
</span>
|
|
621
|
-
{/* The
|
|
622
|
-
line,
|
|
623
|
-
{tool.
|
|
624
|
-
|
|
625
|
-
<span className="min-w-0 truncate text-[13px] leading-5 break-keep text-muted-foreground">
|
|
626
|
-
{tool.line}
|
|
627
|
-
</span>
|
|
628
|
-
) : (
|
|
629
|
-
<ShinyText
|
|
630
|
-
text={tool.line}
|
|
631
|
-
speed={2.4}
|
|
632
|
-
color="var(--muted-foreground)"
|
|
633
|
-
shineColor="var(--foreground)"
|
|
634
|
-
className="min-w-0 truncate text-[13px] leading-5 break-keep"
|
|
635
|
-
/>
|
|
636
|
-
)
|
|
660
|
+
{/* The sweep is what says this is still running, so it is on whatever the
|
|
661
|
+
line turns out to be — the sentence, or the bare tool name. */}
|
|
662
|
+
{tool.done ? (
|
|
663
|
+
<span className={cn(look, "text-muted-foreground")}>{text}</span>
|
|
637
664
|
) : (
|
|
638
|
-
<
|
|
639
|
-
|
|
665
|
+
<ShinyText text={text} speed={2.4} className={look} />
|
|
666
|
+
)}
|
|
667
|
+
{/* The mic is closed because this is running, so it travels with the line.
|
|
668
|
+
A chip, where the line has none: on the bare page a second glyph beside
|
|
669
|
+
the tool's own shares strokes with it and reads as a smudge, and the
|
|
670
|
+
plate is what says this is a state rather than more of the sentence. */}
|
|
671
|
+
{micOff && (
|
|
672
|
+
<span className="flex shrink-0 items-center gap-1 rounded-full bg-muted/60 py-0.5 pr-2 pl-1.5 font-mono text-[11px] leading-4 text-muted-foreground">
|
|
673
|
+
<MicOff className="size-3 shrink-0" />
|
|
674
|
+
mic off
|
|
640
675
|
</span>
|
|
641
676
|
)}
|
|
642
677
|
</span>
|
|
643
678
|
);
|
|
644
679
|
}
|
|
645
680
|
|
|
681
|
+
/**
|
|
682
|
+
* What the row draws in its glyph slot: the bot's own face when the line names
|
|
683
|
+
* one, the tool's glyph otherwise. Who work went to, and who brought an answer
|
|
684
|
+
* back, is a face everywhere else in the app — the roster, the pill, the room.
|
|
685
|
+
*
|
|
686
|
+
* `running` is the copy the ink wipes in, so it is the one at full strength.
|
|
687
|
+
*/
|
|
688
|
+
function Mark({
|
|
689
|
+
tool,
|
|
690
|
+
bot,
|
|
691
|
+
icon: Icon,
|
|
692
|
+
running,
|
|
693
|
+
}: {
|
|
694
|
+
tool: ToolRun;
|
|
695
|
+
/** The row the name resolved to, when the roster has one; its look, not its identity. */
|
|
696
|
+
bot: Bot | null;
|
|
697
|
+
icon: LucideIcon;
|
|
698
|
+
running?: boolean;
|
|
699
|
+
}) {
|
|
700
|
+
if (tool.bot) {
|
|
701
|
+
return (
|
|
702
|
+
<span className={cn("flex", !running && !tool.done && "opacity-40")}>
|
|
703
|
+
<BotMark
|
|
704
|
+
size={16}
|
|
705
|
+
seed={tool.bot}
|
|
706
|
+
vary={tool.bot}
|
|
707
|
+
color={bot?.icon?.color}
|
|
708
|
+
shape={bot?.icon?.shape}
|
|
709
|
+
outline={bot?.icon?.outline}
|
|
710
|
+
notify={false}
|
|
711
|
+
/>
|
|
712
|
+
</span>
|
|
713
|
+
);
|
|
714
|
+
}
|
|
715
|
+
return (
|
|
716
|
+
<Icon
|
|
717
|
+
className={cn(
|
|
718
|
+
"size-3.5",
|
|
719
|
+
running ? "text-foreground" : "text-muted-foreground",
|
|
720
|
+
!running && !tool.done && "opacity-40",
|
|
721
|
+
)}
|
|
722
|
+
/>
|
|
723
|
+
);
|
|
724
|
+
}
|
|
725
|
+
|
|
646
726
|
/**
|
|
647
727
|
* The activity slot: 28px, one fact at a time, two faces. Both stay mounted and
|
|
648
728
|
* cross-fade, so the line leaves wearing its last words instead of blinking
|
|
@@ -729,7 +809,13 @@ function Hint({
|
|
|
729
809
|
let key: string;
|
|
730
810
|
if (busy) {
|
|
731
811
|
key = status;
|
|
732
|
-
|
|
812
|
+
// still moving, so it shines like every other line that is
|
|
813
|
+
body = (
|
|
814
|
+
<ShinyText
|
|
815
|
+
text={status === "connecting" ? "Connecting…" : "Ending…"}
|
|
816
|
+
className="text-muted-foreground/70"
|
|
817
|
+
/>
|
|
818
|
+
);
|
|
733
819
|
} else if (live && idleLeft !== null) {
|
|
734
820
|
key = "quiet";
|
|
735
821
|
body = `Quiet — ending in ${idleLeft}s. Say anything to stay.`;
|
|
@@ -865,18 +951,24 @@ function Elapsed({ since }: { since: number | null }) {
|
|
|
865
951
|
const VISIBLE = 3;
|
|
866
952
|
|
|
867
953
|
/**
|
|
868
|
-
* Wheel delta per turn. Deliberately heavy
|
|
869
|
-
*
|
|
954
|
+
* Wheel delta per turn. Deliberately heavy — a turn is a paragraph, and a
|
|
955
|
+
* trackpad flick that pages three of them reads as losing the conversation
|
|
956
|
+
* rather than moving through it. The give is what says it is not stuck.
|
|
870
957
|
*/
|
|
871
|
-
const STEP =
|
|
958
|
+
const STEP = 360;
|
|
959
|
+
|
|
960
|
+
/** How far the plates lean while the wheel is short of a turn, px. */
|
|
961
|
+
const GIVE = 10;
|
|
962
|
+
|
|
963
|
+
/** How long the wheel keeps what it has gathered. Past this the lean springs back and the count starts over, so half a turn never waits around to be completed by the next flick. */
|
|
964
|
+
const SETTLE_MS = 220;
|
|
872
965
|
|
|
873
966
|
/**
|
|
874
|
-
*
|
|
875
|
-
*
|
|
876
|
-
*
|
|
877
|
-
* their plate recedes.
|
|
967
|
+
* Where the wheel has wound the turns back to. Lives on the screen rather than
|
|
968
|
+
* in the plates: the three plates are small and sit off to the sides, so a
|
|
969
|
+
* wheel over the face — where the cursor is — used to reach nothing at all.
|
|
878
970
|
*/
|
|
879
|
-
function
|
|
971
|
+
function useTurnPager(messages: CallMessage[]) {
|
|
880
972
|
const [back, setBack] = useState(0);
|
|
881
973
|
const [give, setGive] = useState(0);
|
|
882
974
|
const drag = useRef(0);
|
|
@@ -890,13 +982,9 @@ function SideCaptions({ messages }: { messages: CallMessage[] }) {
|
|
|
890
982
|
const grew = messages.length - seen.current;
|
|
891
983
|
seen.current = messages.length;
|
|
892
984
|
if (grew > 0) {
|
|
893
|
-
setBack((was) =>
|
|
894
|
-
was > 0
|
|
895
|
-
? Math.min(was + grew, Math.max(0, messages.length - VISIBLE))
|
|
896
|
-
: 0,
|
|
897
|
-
);
|
|
985
|
+
setBack((was) => (was > 0 ? Math.min(was + grew, furthest) : 0));
|
|
898
986
|
}
|
|
899
|
-
}, [messages.length]);
|
|
987
|
+
}, [messages.length, furthest]);
|
|
900
988
|
|
|
901
989
|
useEffect(
|
|
902
990
|
() => () => {
|
|
@@ -905,7 +993,9 @@ function SideCaptions({ messages }: { messages: CallMessage[] }) {
|
|
|
905
993
|
[],
|
|
906
994
|
);
|
|
907
995
|
|
|
908
|
-
const
|
|
996
|
+
const onWheel = (event: React.WheelEvent) => {
|
|
997
|
+
// nothing behind the three on screen: no travel, and no lean pretending there is
|
|
998
|
+
if (furthest === 0) return;
|
|
909
999
|
drag.current += event.deltaY;
|
|
910
1000
|
const steps = Math.trunc(drag.current / STEP);
|
|
911
1001
|
if (steps !== 0) {
|
|
@@ -919,12 +1009,31 @@ function SideCaptions({ messages }: { messages: CallMessage[] }) {
|
|
|
919
1009
|
settle.current = setTimeout(() => {
|
|
920
1010
|
drag.current = 0;
|
|
921
1011
|
setGive(0);
|
|
922
|
-
},
|
|
1012
|
+
}, SETTLE_MS);
|
|
923
1013
|
};
|
|
924
1014
|
|
|
925
1015
|
const end = messages.length - back;
|
|
926
|
-
|
|
1016
|
+
return {
|
|
1017
|
+
shown: messages.slice(Math.max(0, end - VISIBLE), end),
|
|
1018
|
+
give,
|
|
1019
|
+
onWheel,
|
|
1020
|
+
};
|
|
1021
|
+
}
|
|
927
1022
|
|
|
1023
|
+
/**
|
|
1024
|
+
* Recent turns beside the face: yours on the right, hers on the left, each on
|
|
1025
|
+
* a fill with no edge. Anchored outside the face box (`right-full` /
|
|
1026
|
+
* `left-full`) so they never cover it. Older turns sit higher, smaller, and
|
|
1027
|
+
* their plate recedes.
|
|
1028
|
+
*/
|
|
1029
|
+
function SideCaptions({
|
|
1030
|
+
shown,
|
|
1031
|
+
give,
|
|
1032
|
+
}: {
|
|
1033
|
+
shown: CallMessage[];
|
|
1034
|
+
/** How far into the next turn the wheel is, -1..1; the plates lean by it. */
|
|
1035
|
+
give: number;
|
|
1036
|
+
}) {
|
|
928
1037
|
return (
|
|
929
1038
|
<>
|
|
930
1039
|
{shown.map((message, index) => {
|
|
@@ -941,10 +1050,9 @@ function SideCaptions({ messages }: { messages: CallMessage[] }) {
|
|
|
941
1050
|
return (
|
|
942
1051
|
<div
|
|
943
1052
|
key={message.id}
|
|
944
|
-
onWheel={wind}
|
|
945
1053
|
style={{
|
|
946
1054
|
top: `${top}%`,
|
|
947
|
-
transform: `translateY(calc(-50% + ${-give *
|
|
1055
|
+
transform: `translateY(calc(-50% + ${-give * GIVE}px))`,
|
|
948
1056
|
}}
|
|
949
1057
|
className={cn(
|
|
950
1058
|
// fixed-width slot, natural-width plate: short lines stay short and hug the face
|
|
@@ -1003,8 +1111,6 @@ export function Thursday() {
|
|
|
1003
1111
|
// a preference, not a fact about the model (thursday.store)
|
|
1004
1112
|
const face = useThursdayFace();
|
|
1005
1113
|
const captionView = useThursdayStore((state) => state.captionView);
|
|
1006
|
-
// the tab title shows the call state off-screen
|
|
1007
|
-
useCallTitle(status !== "idle");
|
|
1008
1114
|
|
|
1009
1115
|
/**
|
|
1010
1116
|
* Same question as the server's `isCallable`, asked here because the answer
|
|
@@ -1016,21 +1122,25 @@ export function Thursday() {
|
|
|
1016
1122
|
);
|
|
1017
1123
|
|
|
1018
1124
|
return (
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1125
|
+
<>
|
|
1126
|
+
{/* the tab shows the call and what is owed while the app is off-screen */}
|
|
1127
|
+
<TabState live={status !== "idle"} />
|
|
1128
|
+
<CallScreen
|
|
1129
|
+
status={status}
|
|
1130
|
+
messages={messages}
|
|
1131
|
+
tool={tool}
|
|
1132
|
+
onTap={call}
|
|
1133
|
+
wakePhrase={wakePhrase}
|
|
1134
|
+
hotkeyLabel={hotkeyLabel}
|
|
1135
|
+
idleLeft={idleLeft}
|
|
1136
|
+
since={since}
|
|
1137
|
+
micOff={micOff}
|
|
1138
|
+
getSpectrum={getSpectrum}
|
|
1139
|
+
getMicSpectrum={getMicSpectrum}
|
|
1140
|
+
face={face}
|
|
1141
|
+
captionView={captionView}
|
|
1142
|
+
callable={callable}
|
|
1143
|
+
/>
|
|
1144
|
+
</>
|
|
1035
1145
|
);
|
|
1036
1146
|
}
|