thursday-agent 0.2.0 → 0.3.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 +11 -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 +27 -0
- package/.next/server/chunks/{_0pppbb5._.js → _03kp0jp._.js} +163 -36
- 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 +130 -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/_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]__09q9med._.js +1 -1
- package/.next/server/chunks/ssr/{[root-of-the-server]__1qfqvmg._.js → [root-of-the-server]__0_69wqr._.js} +2 -2
- 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]__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]__0xtssj3._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0zkv7z_._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +57 -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]__0m1b5ky._.js → [root-of-the-server]__1cyjywu._.js} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1eh7hid._.js +3 -0
- 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]__1pduf5n._.js +3 -0
- package/.next/server/chunks/ssr/{_1mznrxk._.js → _001_ms1._.js} +3 -3
- package/.next/server/chunks/ssr/_01_6m32._.js +3 -0
- package/.next/server/chunks/ssr/_01n3o0m._.js +3 -0
- package/.next/server/chunks/ssr/_07uchnc._.js +3 -0
- package/.next/server/chunks/ssr/_0ap2fzn._.js +3 -0
- package/.next/server/chunks/ssr/_0c-ql2m._.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/_0kbkmar._.js +3 -0
- package/.next/server/chunks/ssr/{_077-g6s._.js → _0mb8zc8._.js} +3 -3
- package/.next/server/chunks/ssr/_0mo2w06._.js +3 -0
- package/.next/server/chunks/ssr/{_13punpm._.js → _0q0zan6._.js} +2 -2
- package/.next/server/chunks/ssr/{_040sk32._.js → _0u2jv_x._.js} +76 -82
- package/.next/server/chunks/ssr/_0y0tiht._.js +4 -0
- package/.next/server/chunks/ssr/_0zhoc3r._.js +3 -0
- package/.next/server/chunks/ssr/_1-teee5._.js +3 -3
- package/.next/server/chunks/ssr/_13fke0x._.js +3 -0
- package/.next/server/chunks/ssr/{_1lip4th._.js → _13z3f85._.js} +2 -2
- package/.next/server/chunks/ssr/_14_lw10._.js +3 -0
- package/.next/server/chunks/ssr/_15j2_8f._.js +3 -0
- package/.next/server/chunks/ssr/{_09ja_w1._.js → _1eoqg_g._.js} +2 -2
- package/.next/server/chunks/ssr/_1sji22n._.js +3 -0
- package/.next/server/chunks/ssr/_1spzm8z._.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/{_1m3bsfr._.js → _1xvgn77._.js} +2 -2
- package/.next/server/chunks/ssr/_20kd_n0._.js +42 -0
- 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/lib_date-like_ts_02is0pw._.js +3 -0
- package/.next/server/chunks/ssr/{node_modules_18_dk7_._.js → node_modules_063xwpp._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_01qnv-a._.js → node_modules_0bvraul._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0n1kj4p._.js → node_modules_0eu1va6._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0kl7-tn._.js → node_modules_0h50b8n._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0_n241r._.js → node_modules_0h5hnr1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0lrjk5t._.js → node_modules_0h7u60n._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0ndvxub._.js → node_modules_0lm7_vm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_13r44jq._.js → node_modules_0mwym0g._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_17lrt3y._.js → node_modules_0rjg6t1._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules_0x3-ply._.js +3 -0
- package/.next/server/chunks/ssr/{node_modules_004qlr4._.js → node_modules_0y_cded._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0kxz4gt._.js → node_modules_0z5tsu8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0iz1rzd._.js → node_modules_0zp9r92._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_19dp7ko._.js → node_modules_1-hc6uv._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1q0p85z._.js → node_modules_113tz0l._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1toafc-._.js → node_modules_124bue5._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules_17bwo43._.js +55 -0
- package/.next/server/chunks/ssr/{node_modules_08d8bke._.js → node_modules_1_n3ztw._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1dwguw_._.js → node_modules_1bc7gu8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_20yebtj._.js → node_modules_1bgb6-f._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1n5ygqe._.js → node_modules_1h4a4pp._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_04n7mjs._.js → node_modules_1i7u1ia._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1hn8z1f._.js → node_modules_1juq3hs._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1xyd7ov._.js → node_modules_1l0qtdu._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0m93zeg._.js → node_modules_1t9cyee._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_09xhur7._.js → node_modules_1uuj9x1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1hd-5tv._.js → node_modules_1vqb6po._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1zu988w._.js → node_modules_1xx28h1._.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_0d3skpl._.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_0i44kk5._.js} +1 -1
- package/.next/server/chunks/ssr/node_modules_@vercel_oidc_dist_0qe30a_._.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/{31ttnjt6g35a0.js → 0ev4hyghq0mbb.js} +1 -1
- package/.next/static/chunks/0r5qcctujhxli.js +1 -0
- package/.next/static/chunks/0tmgrnlje14-s.js +3 -0
- package/.next/static/chunks/0x79tx04dxbpp.js +1 -0
- package/.next/static/chunks/0xzgvc0fkdb6t.js +1 -0
- package/.next/static/chunks/10teww7wt-f6h.js +1 -0
- package/.next/static/chunks/14hgtsjg-kael.css +1 -0
- package/.next/static/chunks/17donp69y4do7.js +40 -0
- package/.next/static/chunks/{3_h9txt3tq8t8.js → 1dkjg87pxk0n9.js} +1 -1
- package/.next/static/chunks/1ekc7ul556kbl.js +1 -0
- package/.next/static/chunks/{3ard_noqapnw1.js → 1grhjo7a5a0_-.js} +1 -1
- package/.next/static/chunks/1kq8h8wi_e0bc.js +53 -0
- package/.next/static/chunks/1okqiww3pnwka.js +1 -0
- package/.next/static/chunks/26-pr2c9ro222.js +1 -0
- package/.next/static/chunks/{18vhba44l1fc9.js → 280t0_e99i276.js} +1 -1
- package/.next/static/chunks/28cizcdaabd4h.js +1 -0
- package/.next/static/chunks/2a0k6jlq0_v1u.js +2 -0
- package/.next/static/chunks/2fzs9fm8yarvq.js +1 -0
- package/.next/static/chunks/2h0sd2vumhb15.js +1 -0
- package/.next/static/chunks/2hw2f6zmt7fmt.js +1 -0
- package/.next/static/chunks/2t4vhi3m8ahya.js +1 -0
- package/.next/static/chunks/2tigdtz3dpcy8.js +1 -0
- package/.next/static/chunks/3111pj5wnjgos.js +1 -0
- package/.next/static/chunks/{07kl352c-lvcz.js → 3agpgkwaa321p.js} +1 -1
- package/.next/static/chunks/3cfi_q6d_wtci.js +1 -0
- package/.next/static/chunks/3ok9_x74rip3v.js +1 -0
- package/.next/static/chunks/3xk7yqgomx7yq.js +1 -0
- package/.next/static/chunks/3xpbkl66ssib5.js +38 -0
- package/.next/static/media/favicon.37o1pjldwi2uc.ico +0 -0
- package/README.md +6 -4
- 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 -5
- 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/thursday.mjs +3 -0
- 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/features/ai/chatgpt.ts +617 -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 +58 -42
- package/features/ai/model.schema.ts +232 -34
- package/features/ai/model.ts +169 -24
- package/features/ai/prompts/bot.prompt.ts +156 -65
- 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 +40 -17
- package/features/ai/tools/bot.tool.ts +35 -52
- package/features/ai/tools/connected.ts +17 -4
- package/features/ai/tools/memory.tool.ts +133 -72
- package/features/ai/tools/search.tool.ts +136 -47
- package/features/ai/tools/tool-name.ts +2 -5
- package/features/ai/tools/workspace.tool.ts +2 -1
- package/features/bot/bot.action.ts +8 -18
- package/features/bot/bot.memory.ts +89 -0
- package/features/bot/bot.query.ts +37 -57
- package/features/bot/bot.run.ts +507 -241
- package/features/bot/bot.runner.ts +410 -114
- package/features/bot/bot.schema.ts +79 -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 +159 -130
- package/features/bot/components/bot-setting.tsx +790 -402
- package/features/bot/components/bot-tool.tsx +2 -6
- 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 +215 -28
- package/features/bot/task.store.ts +53 -9
- 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 +338 -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 -95
- 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 -11
- package/features/thursday/use-thursday.ts +86 -59
- 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/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 → x1cCqY0kWpR_VcYx_lWO5}/_buildManifest.js +0 -0
- /package/.next/static/{YR4NWcDDuzwLbTTU7U7Vr → x1cCqY0kWpR_VcYx_lWO5}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{YR4NWcDDuzwLbTTU7U7Vr → x1cCqY0kWpR_VcYx_lWO5}/_ssgManifest.js +0 -0
|
@@ -5,7 +5,10 @@ import { useLayoutEffect, useMemo, useRef } from "react";
|
|
|
5
5
|
import { queryKey } from "@/app/api/query-key";
|
|
6
6
|
import { Button } from "@/components/ui/button";
|
|
7
7
|
import { notify } from "@/components/ui/notify";
|
|
8
|
+
import { ShinyText } from "@/components/ui/shiny-text";
|
|
8
9
|
import { Skeleton } from "@/components/ui/skeleton";
|
|
10
|
+
import { CALL_HISTORY_PAGE } from "@/config";
|
|
11
|
+
import type { TaskStatus } from "@/features/bot/bot.schema";
|
|
9
12
|
import { toolIcon } from "@/features/bot/components/bot-tool";
|
|
10
13
|
import {
|
|
11
14
|
SettingDialogContent,
|
|
@@ -17,14 +20,10 @@ import {
|
|
|
17
20
|
import { toDate, whenOf } from "@/lib/date-like";
|
|
18
21
|
import { useServerAction } from "@/lib/protocol/use-server-action";
|
|
19
22
|
import { useServerPages } from "@/lib/protocol/use-server-pages";
|
|
20
|
-
import { cn } from "@/lib/utils";
|
|
21
|
-
import { deleteCallAction } from "../thursday.action";
|
|
22
|
-
import {
|
|
23
|
-
|
|
24
|
-
type CallRecord,
|
|
25
|
-
type CallTurn,
|
|
26
|
-
} from "../thursday.schema";
|
|
27
|
-
import { toolLine } from "../tool-line";
|
|
23
|
+
import { cn, plainText, WAITING_INK } from "@/lib/utils";
|
|
24
|
+
import { deleteCallAction, deleteEndedCallsAction } from "../thursday.action";
|
|
25
|
+
import { type CallRecord, type CallTurn } from "../thursday.schema";
|
|
26
|
+
import { delegatedLabel, toolLine } from "../tool-line";
|
|
28
27
|
import { ThursdayMark } from "./thursday-mark";
|
|
29
28
|
|
|
30
29
|
/** The Settings › Thursday row that opens the call history dialog. */
|
|
@@ -65,6 +64,22 @@ export function CallHistoryRow() {
|
|
|
65
64
|
);
|
|
66
65
|
}
|
|
67
66
|
|
|
67
|
+
type CallJob = CallRecord["jobs"][number];
|
|
68
|
+
|
|
69
|
+
/** How a job reads under the line that opened it. Only waiting and failed carry colour. */
|
|
70
|
+
const JOB_WORD: Record<TaskStatus, string> = {
|
|
71
|
+
running: "working",
|
|
72
|
+
waiting: "waiting on you",
|
|
73
|
+
done: "done",
|
|
74
|
+
failed: "failed",
|
|
75
|
+
};
|
|
76
|
+
const JOB_LOOK: Record<TaskStatus, string> = {
|
|
77
|
+
running: "text-muted-foreground",
|
|
78
|
+
waiting: WAITING_INK,
|
|
79
|
+
done: "text-muted-foreground",
|
|
80
|
+
failed: "text-destructive",
|
|
81
|
+
};
|
|
82
|
+
|
|
68
83
|
/** The box the log fills, kept while it loads so the dialog does not resize. */
|
|
69
84
|
const LOG_BOX = "h-[min(34rem,58vh)] min-h-64 px-1";
|
|
70
85
|
|
|
@@ -98,6 +113,23 @@ function CallLog() {
|
|
|
98
113
|
|
|
99
114
|
const calls = useMemo(() => [...items].reverse(), [items]);
|
|
100
115
|
|
|
116
|
+
const [dropAll, droppingAll] = useServerAction(deleteEndedCallsAction, {
|
|
117
|
+
okMessage: (count) =>
|
|
118
|
+
count === 1 ? "1 call deleted" : `${count} calls deleted`,
|
|
119
|
+
onOk: refresh,
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const confirmDropAll = async () => {
|
|
123
|
+
const confirmed = await notify.confirm({
|
|
124
|
+
title: "Delete every call?",
|
|
125
|
+
description:
|
|
126
|
+
"Every turn of every call goes — and she stops reading any of it back into the next call. A call still on the line stays.",
|
|
127
|
+
okText: "Delete all",
|
|
128
|
+
destructive: true,
|
|
129
|
+
});
|
|
130
|
+
if (confirmed) dropAll();
|
|
131
|
+
};
|
|
132
|
+
|
|
101
133
|
const scroller = useRef<HTMLDivElement>(null);
|
|
102
134
|
/** Has the first page been dropped at its bottom yet. */
|
|
103
135
|
const opened = useRef(false);
|
|
@@ -133,25 +165,43 @@ function CallLog() {
|
|
|
133
165
|
yours, in the order it was said.
|
|
134
166
|
</p>
|
|
135
167
|
) : (
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
168
|
+
<>
|
|
169
|
+
<div
|
|
170
|
+
ref={scroller}
|
|
171
|
+
onScroll={(event) => {
|
|
172
|
+
const box = event.currentTarget;
|
|
173
|
+
held.current = box.scrollHeight - box.scrollTop;
|
|
174
|
+
}}
|
|
175
|
+
className={cn(LOG_BOX, "overflow-y-auto overscroll-contain pb-6")}
|
|
176
|
+
>
|
|
177
|
+
<SettingMore
|
|
178
|
+
hasMore={hasMore}
|
|
179
|
+
loading={isLoadingMore}
|
|
180
|
+
sentinelRef={sentinelRef}
|
|
181
|
+
count={1}
|
|
182
|
+
ghost={<CallGhost />}
|
|
183
|
+
/>
|
|
184
|
+
{calls.map((call, index) => (
|
|
185
|
+
<Thread
|
|
186
|
+
key={call.id}
|
|
187
|
+
call={call}
|
|
188
|
+
first={index === 0}
|
|
189
|
+
onDropped={refresh}
|
|
190
|
+
/>
|
|
191
|
+
))}
|
|
192
|
+
</div>
|
|
193
|
+
<div className="flex justify-end">
|
|
194
|
+
<Button
|
|
195
|
+
variant="ghost"
|
|
196
|
+
loading={droppingAll}
|
|
197
|
+
onClick={confirmDropAll}
|
|
198
|
+
className="text-muted-foreground hover:text-destructive"
|
|
199
|
+
>
|
|
200
|
+
<Trash2 />
|
|
201
|
+
Delete all
|
|
202
|
+
</Button>
|
|
203
|
+
</div>
|
|
204
|
+
</>
|
|
155
205
|
)}
|
|
156
206
|
</>
|
|
157
207
|
);
|
|
@@ -160,27 +210,35 @@ function CallLog() {
|
|
|
160
210
|
/** Placeholder for an older call while its page loads; sits above the oldest call. */
|
|
161
211
|
function CallGhost() {
|
|
162
212
|
return (
|
|
163
|
-
<div className="
|
|
164
|
-
<div className="flex items-center gap-
|
|
165
|
-
<
|
|
166
|
-
<Skeleton className="h-
|
|
167
|
-
<span className="h-px flex-1 bg-border/60" />
|
|
168
|
-
<span className="size-7 shrink-0" />
|
|
213
|
+
<div className="pb-3">
|
|
214
|
+
<div className="flex h-7 items-center gap-2.5">
|
|
215
|
+
<Skeleton className="h-3 w-24" />
|
|
216
|
+
<Skeleton className="h-3 w-10" />
|
|
169
217
|
</div>
|
|
218
|
+
<div className="mt-2 mb-[18px] h-px bg-border/60" />
|
|
170
219
|
<div className="flex justify-end">
|
|
171
|
-
<Skeleton className="h-9 w-3/5 rounded-2xl rounded-br-
|
|
220
|
+
<Skeleton className="h-9 w-3/5 rounded-2xl rounded-br-sm" />
|
|
221
|
+
</div>
|
|
222
|
+
<div className="mt-3 flex items-start gap-2">
|
|
223
|
+
<Skeleton className="mt-0.5 size-[18px] shrink-0 rounded-full" />
|
|
224
|
+
<Skeleton className="mt-1 h-3.5 w-2/3" />
|
|
172
225
|
</div>
|
|
173
|
-
<Skeleton className="h-5 w-2/3" />
|
|
174
226
|
</div>
|
|
175
227
|
);
|
|
176
228
|
}
|
|
177
229
|
|
|
178
|
-
/**
|
|
230
|
+
/** Whose run a turn is in. Her words and her tools are one run: both are her acting. */
|
|
231
|
+
const sideOf = (turn: CallTurn) => (turn.role === "user" ? "user" : "her");
|
|
232
|
+
|
|
233
|
+
/** One call: a datestamp over a hairline, then its turns. */
|
|
179
234
|
function Thread({
|
|
180
235
|
call,
|
|
236
|
+
first,
|
|
181
237
|
onDropped,
|
|
182
238
|
}: {
|
|
183
239
|
call: CallRecord;
|
|
240
|
+
/** The topmost call loaded; nothing above it to be set apart from. */
|
|
241
|
+
first: boolean;
|
|
184
242
|
/** Re-reads every page after a delete. */
|
|
185
243
|
onDropped: () => void;
|
|
186
244
|
}) {
|
|
@@ -208,21 +266,23 @@ function Thread({
|
|
|
208
266
|
|
|
209
267
|
return (
|
|
210
268
|
<>
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
269
|
+
<div
|
|
270
|
+
className={cn(
|
|
271
|
+
"group flex items-center gap-2.5",
|
|
272
|
+
first ? "mt-1" : "mt-11",
|
|
273
|
+
)}
|
|
274
|
+
>
|
|
214
275
|
<span
|
|
215
276
|
title={`${call.provider} · ${call.model}`}
|
|
216
|
-
className="
|
|
277
|
+
className="font-mono text-[10px] tracking-[0.14em] uppercase"
|
|
217
278
|
>
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
</span>
|
|
279
|
+
{whenOf(started)}
|
|
280
|
+
</span>
|
|
281
|
+
<span className="font-mono text-[10px] text-muted-foreground">
|
|
282
|
+
{ran}
|
|
223
283
|
</span>
|
|
224
|
-
|
|
225
|
-
<span className="flex size-7 shrink-0 items-center justify-center">
|
|
284
|
+
{/* The slot is held so the row keeps its height while the button is hidden. */}
|
|
285
|
+
<span className="ml-auto flex size-7 shrink-0 items-center justify-center">
|
|
226
286
|
{call.endedAt && (
|
|
227
287
|
<Button
|
|
228
288
|
size="icon-sm"
|
|
@@ -237,6 +297,7 @@ function Thread({
|
|
|
237
297
|
)}
|
|
238
298
|
</span>
|
|
239
299
|
</div>
|
|
300
|
+
<div className="mt-2 mb-[18px] h-px bg-border/60" />
|
|
240
301
|
|
|
241
302
|
{fold(call.turns).map(({ turn, repeats }, index, folded) => {
|
|
242
303
|
const before = folded[index - 1]?.turn;
|
|
@@ -245,9 +306,10 @@ function Thread({
|
|
|
245
306
|
<Turn
|
|
246
307
|
key={turn.id}
|
|
247
308
|
turn={turn}
|
|
309
|
+
job={jobOf(call, turn)}
|
|
248
310
|
repeats={repeats}
|
|
249
|
-
opensRun={before
|
|
250
|
-
closesRun={after
|
|
311
|
+
opensRun={!before || sideOf(before) !== sideOf(turn)}
|
|
312
|
+
closesRun={!after || sideOf(after) !== sideOf(turn)}
|
|
251
313
|
/>
|
|
252
314
|
);
|
|
253
315
|
})}
|
|
@@ -255,6 +317,12 @@ function Thread({
|
|
|
255
317
|
);
|
|
256
318
|
}
|
|
257
319
|
|
|
320
|
+
/** The job a `delegate` turn opened, found by label the way her prompt finds it. */
|
|
321
|
+
function jobOf(call: CallRecord, turn: CallTurn): CallJob | undefined {
|
|
322
|
+
const label = delegatedLabel(turn.tool, turn.text);
|
|
323
|
+
return label ? call.jobs.find((job) => job.label === label) : undefined;
|
|
324
|
+
}
|
|
325
|
+
|
|
258
326
|
/** Collapses consecutive identical tool turns (same name and arguments) into one with a count. */
|
|
259
327
|
function fold(turns: CallRecord["turns"]) {
|
|
260
328
|
const out: { turn: CallRecord["turns"][number]; repeats: number }[] = [];
|
|
@@ -288,75 +356,134 @@ function spanOf(from: Date, to: Date): string {
|
|
|
288
356
|
return `${Math.floor(minutes / 60)}h ${String(minutes % 60).padStart(2, "0")}m`;
|
|
289
357
|
}
|
|
290
358
|
|
|
291
|
-
/**
|
|
359
|
+
/**
|
|
360
|
+
* One spoken turn. Plain text, never markdown: asterisks were said aloud.
|
|
361
|
+
* Only the user speaks in bubbles; her words sit bare in her column, so her
|
|
362
|
+
* text and her tool lines start on one edge.
|
|
363
|
+
*/
|
|
292
364
|
function Turn({
|
|
293
365
|
turn,
|
|
366
|
+
job,
|
|
294
367
|
opensRun,
|
|
295
368
|
closesRun,
|
|
296
369
|
repeats = 1,
|
|
297
370
|
}: {
|
|
298
371
|
turn: CallTurn;
|
|
372
|
+
/** What became of the job a `delegate` turn opened (ToolTurn only). */
|
|
373
|
+
job?: CallJob;
|
|
299
374
|
opensRun: boolean;
|
|
300
375
|
closesRun: boolean;
|
|
301
376
|
/** Consecutive repeats of the same tool turn (ToolTurn only). */
|
|
302
377
|
repeats?: number;
|
|
303
378
|
}) {
|
|
304
|
-
if (turn.role === "tool")
|
|
379
|
+
if (turn.role === "tool")
|
|
380
|
+
return (
|
|
381
|
+
<ToolTurn turn={turn} job={job} repeats={repeats} opensRun={opensRun} />
|
|
382
|
+
);
|
|
305
383
|
|
|
306
|
-
|
|
384
|
+
if (turn.role === "user")
|
|
385
|
+
return (
|
|
386
|
+
<div className={cn("flex justify-end", opensRun ? "mt-3" : "mt-1")}>
|
|
387
|
+
<p
|
|
388
|
+
className={cn(
|
|
389
|
+
"max-w-[min(34rem,78%)] rounded-2xl bg-muted px-3.5 py-2 text-[13.5px] leading-relaxed break-keep whitespace-pre-wrap",
|
|
390
|
+
closesRun && "rounded-br-sm",
|
|
391
|
+
)}
|
|
392
|
+
>
|
|
393
|
+
{turn.text}
|
|
394
|
+
</p>
|
|
395
|
+
</div>
|
|
396
|
+
);
|
|
307
397
|
|
|
308
398
|
return (
|
|
309
|
-
<div
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
mine ? "justify-end" : "justify-start",
|
|
314
|
-
)}
|
|
315
|
-
>
|
|
316
|
-
{!mine && (
|
|
317
|
-
// The slot is held even without the mark so a run stays in one column.
|
|
318
|
-
<span className="mb-0.5 grid size-[18px] shrink-0 place-items-center">
|
|
319
|
-
{closesRun && <ThursdayMark size={18} />}
|
|
320
|
-
</span>
|
|
321
|
-
)}
|
|
322
|
-
|
|
323
|
-
<p
|
|
324
|
-
className={cn(
|
|
325
|
-
"max-w-[min(34rem,78%)] px-3.5 py-2 text-[13.5px] leading-relaxed break-keep whitespace-pre-wrap",
|
|
326
|
-
mine
|
|
327
|
-
? "rounded-2xl bg-muted"
|
|
328
|
-
: "rounded-2xl bg-card ring-1 ring-border/70",
|
|
329
|
-
closesRun && (mine ? "rounded-br-sm" : "rounded-bl-sm"),
|
|
330
|
-
)}
|
|
331
|
-
>
|
|
399
|
+
<div className={cn("flex items-start gap-2", opensRun ? "mt-3" : "mt-1")}>
|
|
400
|
+
{/* mt-0.5 centres the 18px face on the first 22px line */}
|
|
401
|
+
<FaceSlot face={opensRun} className="mt-0.5" />
|
|
402
|
+
<p className="max-w-[min(34rem,78%)] text-[13.5px] leading-relaxed break-keep whitespace-pre-wrap">
|
|
332
403
|
{turn.text}
|
|
333
404
|
</p>
|
|
334
405
|
</div>
|
|
335
406
|
);
|
|
336
407
|
}
|
|
337
408
|
|
|
338
|
-
/**
|
|
339
|
-
|
|
409
|
+
/**
|
|
410
|
+
* Her column. Her face marks where her run opens — the first thing she does
|
|
411
|
+
* after the user speaks, a sentence or a tool — and the slot is held empty for
|
|
412
|
+
* the rest of the run so it stays on one edge.
|
|
413
|
+
*/
|
|
414
|
+
function FaceSlot({ face, className }: { face: boolean; className?: string }) {
|
|
415
|
+
return (
|
|
416
|
+
<span
|
|
417
|
+
className={cn("grid size-[18px] shrink-0 place-items-center", className)}
|
|
418
|
+
>
|
|
419
|
+
{face && <ThursdayMark size={18} />}
|
|
420
|
+
</span>
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/** A tool turn: her column, then the glyph, the readable sentence and the tool name. */
|
|
425
|
+
function ToolTurn({
|
|
426
|
+
turn,
|
|
427
|
+
job,
|
|
428
|
+
repeats,
|
|
429
|
+
opensRun,
|
|
430
|
+
}: {
|
|
431
|
+
turn: CallTurn;
|
|
432
|
+
job?: CallJob;
|
|
433
|
+
repeats: number;
|
|
434
|
+
opensRun: boolean;
|
|
435
|
+
}) {
|
|
340
436
|
const name = turn.tool ?? "";
|
|
341
437
|
const Icon = toolIcon(name);
|
|
342
438
|
const said = toolLine(name, turn.text);
|
|
343
439
|
|
|
344
440
|
return (
|
|
345
|
-
|
|
346
|
-
<
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
{
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
<span className="shrink-0 font-mono text-[10px] text-muted-foreground/
|
|
356
|
-
|
|
441
|
+
<>
|
|
442
|
+
<div
|
|
443
|
+
className={cn("flex items-center gap-2", opensRun ? "mt-3" : "mt-1.5")}
|
|
444
|
+
>
|
|
445
|
+
<FaceSlot face={opensRun} />
|
|
446
|
+
<span className="flex min-w-0 items-center gap-1.5 text-muted-foreground">
|
|
447
|
+
<Icon className="size-3 shrink-0" />
|
|
448
|
+
{said && (
|
|
449
|
+
<span className="truncate text-[11px] break-keep">{said}</span>
|
|
450
|
+
)}
|
|
451
|
+
<span className="shrink-0 font-mono text-[10px] text-muted-foreground/60">
|
|
452
|
+
{name}
|
|
357
453
|
</span>
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
454
|
+
{repeats > 1 && (
|
|
455
|
+
<span className="shrink-0 font-mono text-[10px] text-muted-foreground/70">
|
|
456
|
+
×{repeats}
|
|
457
|
+
</span>
|
|
458
|
+
)}
|
|
459
|
+
</span>
|
|
460
|
+
</div>
|
|
461
|
+
{/* Under the line that opened it, in her column (18px face + 8px gap): what
|
|
462
|
+
became of the job, as it stands now. */}
|
|
463
|
+
{job && (
|
|
464
|
+
<p className="mt-0.5 ml-[26px] flex min-w-0 items-baseline gap-1.5 text-[11px]">
|
|
465
|
+
{job.status === "running" ? (
|
|
466
|
+
<ShinyText
|
|
467
|
+
text={JOB_WORD.running}
|
|
468
|
+
className="shrink-0 font-mono text-[10px]"
|
|
469
|
+
/>
|
|
470
|
+
) : (
|
|
471
|
+
<span
|
|
472
|
+
className={cn(
|
|
473
|
+
"shrink-0 font-mono text-[10px]",
|
|
474
|
+
JOB_LOOK[job.status],
|
|
475
|
+
)}
|
|
476
|
+
>
|
|
477
|
+
{JOB_WORD[job.status]}
|
|
478
|
+
</span>
|
|
479
|
+
)}
|
|
480
|
+
{job.outcome && job.status !== "running" && (
|
|
481
|
+
<span className="truncate text-muted-foreground">
|
|
482
|
+
{plainText(job.outcome)}
|
|
483
|
+
</span>
|
|
484
|
+
)}
|
|
485
|
+
</p>
|
|
486
|
+
)}
|
|
487
|
+
</>
|
|
361
488
|
);
|
|
362
489
|
}
|
|
@@ -52,12 +52,14 @@ const MARK_STATE: Record<CallStatus, MarkState> = {
|
|
|
52
52
|
*/
|
|
53
53
|
const MARK_VOICE: Partial<MarkOptions> = {
|
|
54
54
|
/**
|
|
55
|
-
*
|
|
56
|
-
* at face size reads as a wobbling object rather than speech
|
|
55
|
+
* The outline carries the voice. `pulse` and `stretch` move the whole mark,
|
|
56
|
+
* which at face size reads as a wobbling object rather than speech; `punch`
|
|
57
|
+
* with no pulse only squashes it a touch on each syllable.
|
|
57
58
|
*/
|
|
58
|
-
ripple:
|
|
59
|
+
ripple: 18,
|
|
60
|
+
bandEase: 0.03,
|
|
59
61
|
pulse: 0,
|
|
60
|
-
punch: 0,
|
|
62
|
+
punch: 0.05,
|
|
61
63
|
stretch: 0,
|
|
62
64
|
};
|
|
63
65
|
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useEffect } from "react";
|
|
4
|
+
import { APP_NAME } from "@/config";
|
|
5
|
+
import { markAtRest } from "@/features/bot/components/bot-mark";
|
|
6
|
+
import { useTaskReport } from "@/features/bot/components/task-badge";
|
|
7
|
+
import {
|
|
8
|
+
type SectionAlert,
|
|
9
|
+
useSectionAlerts,
|
|
10
|
+
worstAlert,
|
|
11
|
+
} from "@/features/settings/settings.alert";
|
|
12
|
+
import { THURSDAY_SEED } from "./thursday-mark";
|
|
13
|
+
|
|
14
|
+
// A live call's title is a waveform. The frame is not React state: the interval
|
|
15
|
+
// writes document.title directly. Hidden tabs throttle timers to 1s, but audible
|
|
16
|
+
// pages escape the stronger throttle.
|
|
17
|
+
const SPIN = ["▁▄▇▄", "▂▆▆▂", "▄▇▄▁", "▆▆▂▂", "▇▄▁▄", "▆▂▂▆", "▄▁▄▇", "▂▂▆▆"];
|
|
18
|
+
|
|
19
|
+
/** Frame interval in ms. */
|
|
20
|
+
const SPIN_MS = 100;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The dot, in the icon's view-box units: bottom right, where a face wears it,
|
|
24
|
+
* with a ring cut out of the mark so the two stay apart at 16px.
|
|
25
|
+
*/
|
|
26
|
+
const DOT = { cx: 200, cy: 200, r: 46, ring: 20 };
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The icon sits on the browser's own light or dark bar, not on the app's theme,
|
|
30
|
+
* so its colours follow the SVG's media query. The hex values of the corner
|
|
31
|
+
* dot's tokens: amber-600 / amber-400 and destructive.
|
|
32
|
+
*/
|
|
33
|
+
const ICON_STYLE =
|
|
34
|
+
".ink{fill:#0a0a0a}.amber{fill:#e17100}.red{fill:#e7000b}" +
|
|
35
|
+
"@media (prefers-color-scheme:dark){.ink{fill:#fafafa}.amber{fill:#ffb900}.red{fill:#ff6467}}";
|
|
36
|
+
|
|
37
|
+
/** Thursday's mark at rest, wearing the dot for `alert` when there is one. */
|
|
38
|
+
export function tabIconSvg(alert: SectionAlert): string {
|
|
39
|
+
const { head, eyes } = markAtRest(THURSDAY_SEED);
|
|
40
|
+
const cut = alert
|
|
41
|
+
? `<circle cx="${DOT.cx}" cy="${DOT.cy}" r="${DOT.r + DOT.ring}"/>`
|
|
42
|
+
: "";
|
|
43
|
+
const dot = alert
|
|
44
|
+
? `<circle class="${alert}" cx="${DOT.cx}" cy="${DOT.cy}" r="${DOT.r}"/>`
|
|
45
|
+
: "";
|
|
46
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="-6 -6 252 252"><style>${ICON_STYLE}</style><mask id="m" maskUnits="userSpaceOnUse"><path d="${head}" fill="#fff"/><path d="${eyes[0]}"/><path d="${eyes[1]}"/>${cut}</mask><path class="ink" d="${head}" mask="url(#m)"/>${dot}</svg>`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The tab, for when the app is not the window in front. The title leads with
|
|
51
|
+
* what is owed — the Tasks badge's count — and a live call keeps its waveform at
|
|
52
|
+
* the end, so neither takes the other's place. The icon wears the settings
|
|
53
|
+
* corner's dot: amber waits on the user, red is broken, and a section with
|
|
54
|
+
* nothing to count still gets the dot.
|
|
55
|
+
*
|
|
56
|
+
* Draws nothing. A component rather than a hook in the call screen, so a report
|
|
57
|
+
* changing re-renders only this.
|
|
58
|
+
*/
|
|
59
|
+
export function TabState({ live }: { live: boolean }) {
|
|
60
|
+
const { owed } = useTaskReport();
|
|
61
|
+
const alerts = useSectionAlerts();
|
|
62
|
+
const alert = worstAlert(Object.values(alerts).map((each) => each ?? null));
|
|
63
|
+
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
const head = owed > 0 ? `(${owed}) ${APP_NAME}` : APP_NAME;
|
|
66
|
+
if (!live) {
|
|
67
|
+
document.title = head;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
let at = 0;
|
|
71
|
+
document.title = `${head} ${SPIN[at]}`;
|
|
72
|
+
const tick = setInterval(() => {
|
|
73
|
+
at = (at + 1) % SPIN.length;
|
|
74
|
+
document.title = `${head} ${SPIN[at]}`;
|
|
75
|
+
}, SPIN_MS);
|
|
76
|
+
return () => clearInterval(tick);
|
|
77
|
+
}, [live, owed]);
|
|
78
|
+
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
// A link of its own after the layout's, changed in place: browsers redraw
|
|
81
|
+
// the tab when an icon link's href changes, and React does not manage it.
|
|
82
|
+
let link = document.head.querySelector<HTMLLinkElement>(
|
|
83
|
+
"link[data-tab-icon]",
|
|
84
|
+
);
|
|
85
|
+
if (!link) {
|
|
86
|
+
link = document.createElement("link");
|
|
87
|
+
link.rel = "icon";
|
|
88
|
+
link.type = "image/svg+xml";
|
|
89
|
+
link.setAttribute("sizes", "any");
|
|
90
|
+
link.dataset.tabIcon = "";
|
|
91
|
+
document.head.append(link);
|
|
92
|
+
}
|
|
93
|
+
link.href = `data:image/svg+xml,${encodeURIComponent(tabIconSvg(alert))}`;
|
|
94
|
+
}, [alert]);
|
|
95
|
+
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
import { BotMark } from "@/features/bot/components/bot-mark";
|
|
4
4
|
import { useThursdayFace } from "@/features/thursday/face.store";
|
|
5
5
|
|
|
6
|
+
/** The seed her mark is drawn from, wherever it is drawn (the tab's icon too). */
|
|
7
|
+
export const THURSDAY_SEED = "thursday";
|
|
8
|
+
|
|
6
9
|
/** Thursday's mark at any size. Always the mark, never the orb, whatever face is set. */
|
|
7
10
|
export function ThursdayMark({
|
|
8
11
|
size = 16,
|
|
@@ -16,7 +19,7 @@ export function ThursdayMark({
|
|
|
16
19
|
return (
|
|
17
20
|
<BotMark
|
|
18
21
|
size={size}
|
|
19
|
-
seed=
|
|
22
|
+
seed={THURSDAY_SEED}
|
|
20
23
|
color={face.color}
|
|
21
24
|
shape={face.shape}
|
|
22
25
|
outline={face.outline}
|