thursday-agent 0.1.2 → 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 -1
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +5 -5
- package/.next/routes-manifest.json +27 -3
- 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.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/build-manifest.json +12 -0
- package/.next/server/app/api/bot/memory/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/bot/memory/route.js +14 -0
- package/.next/server/app/api/bot/memory/route.js.map +5 -0
- package/.next/server/app/api/bot/memory/route.js.nft.json +1 -0
- package/.next/server/app/api/bot/memory/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/bot/route.js +7 -7
- package/.next/server/app/api/bot/route.js.nft.json +1 -1
- package/.next/server/app/api/bot/task/[id]/route.js +9 -9
- 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 +6 -6
- 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 +10 -9
- 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 +5 -5
- package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/oauth/callback/route.js +6 -6
- package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/route.js +5 -5
- package/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/tools/route.js +5 -5
- 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 +7 -8
- 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 +16 -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 +66 -77
- package/.next/server/app/page.js +11 -11
- 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 -1
- 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 +3 -0
- 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 +10 -0
- 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/{_1hzrsvg._.js → _0-73of8._.js} +6 -6
- package/.next/server/chunks/{_1cbk7ms._.js → _0-fjql4._.js} +10 -10
- package/.next/server/chunks/_00xh_q0._.js +27 -0
- package/.next/server/chunks/{_0y8is-s._.js → _03a0897._.js} +1 -1
- package/.next/server/chunks/{_0pppbb5._.js → _03kp0jp._.js} +166 -35
- 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 +74 -44
- package/.next/server/chunks/{_0kl37zl._.js → _0ioz3nd._.js} +1 -1
- package/.next/server/chunks/_0iwfby5._.js +3 -0
- package/.next/server/chunks/{_0hin38_._.js → _0khihjk._.js} +5 -5
- package/.next/server/chunks/_0mecv0f._.js +26 -0
- package/.next/server/chunks/_0mh8j4m._.js +3 -0
- package/.next/server/chunks/{_1icgbi8._.js → _0n74zsf._.js} +2 -2
- package/.next/server/chunks/_0obojvv._.js +3 -0
- package/.next/server/chunks/_0recufk._.js +49 -0
- package/.next/server/chunks/{_1t8fv7b._.js → _0rnf-6n._.js} +2 -2
- package/.next/server/chunks/_0sb7tlz._.js +3 -0
- package/.next/server/chunks/{_0jgm3b8._.js → _0u10wmw._.js} +6 -6
- package/.next/server/chunks/{_12nr4xc._.js → _0u4aiy2._.js} +2 -2
- 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/{_0ks6_sg._.js → _18-1wcc._.js} +6 -6
- package/.next/server/chunks/_1_5mnq4._.js +18 -0
- package/.next/server/chunks/{_0tzfesa._.js → _1_9mjx-._.js} +1 -1
- package/.next/server/chunks/_1d0j961._.js +6 -0
- package/.next/server/chunks/_1d5zmy8._.js +1 -1
- package/.next/server/chunks/_1drgfx4._.js +18 -0
- package/.next/server/chunks/{_1skgy7b._.js → _1e48czp._.js} +5 -5
- 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/{_10qam6o._.js → _1kg70wc._.js} +5 -5
- 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 +1 -1
- package/.next/server/chunks/features_memory_1uqvksn._.js +6 -0
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0tf290y._.js → node_modules_consola_dist_chunks_prompt_mjs_0i7cvml._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0228f43._.js → node_modules_consola_dist_chunks_prompt_mjs_0icqaqw._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0ir-vo2._.js → node_modules_consola_dist_chunks_prompt_mjs_0j61-ma._.js} +1 -1
- package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0otw8ef._.js → node_modules_consola_dist_chunks_prompt_mjs_0r28-sm._.js} +1 -1
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0v_7drq._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_11zjo-1._.js +3 -0
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1pycqsq._.js +3 -0
- 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_1y49572._.js +3 -0
- package/.next/server/chunks/ssr/[externals]__0dizgek._.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]__0_69wqr._.js +3 -0
- 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]__1cyjywu._.js +3 -0
- 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/_0lu1n_x._.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/{_0gd4vaa._.js → _0u2jv_x._.js} +94 -58
- 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/{_0q_2f2x._.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/{_0lc_7c8._.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/{_19_o9d-._.js → _1vi_uo7._.js} +2 -2
- package/.next/server/chunks/ssr/_1vyd1ji._.js +3 -0
- package/.next/server/chunks/ssr/_1xvgn77._.js +3 -0
- 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/lib_realtime_12wg_dd._.js +27 -0
- package/.next/server/chunks/ssr/lib_realtime_15h_v1v._.js +27 -0
- package/.next/server/chunks/ssr/{node_modules_1d-is1o._.js → node_modules_063xwpp._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1ub40gk._.js → node_modules_0bvraul._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1nhw9qg._.js → node_modules_0eu1va6._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0xwx4u-._.js → node_modules_0h50b8n._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_043-236._.js → node_modules_0h5hnr1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1t0y5jt._.js → node_modules_0h7u60n._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1k29j1j._.js → node_modules_0lm7_vm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_16i4o_3._.js → node_modules_0mwym0g._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1y8_3vg._.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_108wd2o._.js → node_modules_0y_cded._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1jatz7w._.js → node_modules_0z5tsu8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0ls96je._.js → node_modules_0zp9r92._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_06kvvuo._.js → node_modules_1-hc6uv._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1_588_4._.js → node_modules_113tz0l._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0ipn1ho._.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_0_j7-g4._.js → node_modules_1_n3ztw._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_20ynonm._.js → node_modules_1bc7gu8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1hn_sd5._.js → node_modules_1bgb6-f._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0bue6gy._.js → node_modules_1h4a4pp._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0fbw5-u._.js → node_modules_1i7u1ia._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1ee8gav._.js → node_modules_1juq3hs._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0_fvxnt._.js → node_modules_1l0qtdu._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_13f2md6._.js → node_modules_1t9cyee._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0y2-av4._.js → node_modules_1uuj9x1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_00d6675._.js → node_modules_1vqb6po._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1v0077l._.js → node_modules_1xx28h1._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_092s8nx._.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_1nvexgu._.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_consola_dist_chunks_prompt_mjs_05cwqv2._.js +47 -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 +67 -78
- 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/1dkjg87pxk0n9.js +28 -0
- package/.next/static/chunks/1ekc7ul556kbl.js +1 -0
- package/.next/static/chunks/{1khakdu_iuedc.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/{2ihkf6l2jowo9.js → 280t0_e99i276.js} +3 -3
- 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/3786h5vayt80-.js +28 -0
- package/.next/static/chunks/{3aquirz5h71da.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.client.ts +24 -0
- package/app/api/events/app-event.server.ts +45 -0
- package/app/api/events/app-event.ts +42 -0
- package/app/api/llm-model/catalog/route.ts +12 -0
- package/app/api/llm-model/credits/route.ts +11 -0
- package/app/api/llm-model/route.ts +26 -0
- 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 +159 -0
- package/app/api/thursday/tool-call/route.ts +67 -0
- package/bin/thursday.mjs +3 -0
- package/components/ui/button-group.tsx +45 -0
- package/components/ui/custom-icon.tsx +259 -0
- package/components/ui/dropdown-menu.tsx +271 -0
- package/components/ui/folded-text.tsx +68 -0
- package/components/ui/input-group.tsx +157 -0
- package/components/ui/json-view.tsx +240 -0
- package/components/ui/shiny-text.tsx +55 -0
- package/components/ui/text-type.tsx +213 -0
- package/components/ui/theme-sync.tsx +9 -0
- package/database/migrations/{20260908030742_rainy_marvel_zombies → 20260910173049_numerous_spirit}/migration.sql +30 -33
- package/database/migrations/{20260908030742_rainy_marvel_zombies → 20260910173049_numerous_spirit}/snapshot.json +124 -145
- package/database/migrations/20260911030320_opposite_jack_power/migration.sql +1 -0
- package/database/migrations/20260911030320_opposite_jack_power/snapshot.json +1158 -0
- package/docs/how-it-works.md +59 -0
- package/docs/images/keeps-going.png +0 -0
- package/docs/images/task-thread.png +0 -0
- package/docs/images/two-minds.png +0 -0
- 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 +105 -39
- package/features/ai/model.schema.ts +232 -34
- package/features/ai/model.ts +169 -24
- package/features/ai/prompts/bot.prompt.ts +245 -59
- package/features/ai/prompts/memory-edit.prompt.ts +33 -0
- package/features/ai/prompts/prompt-helper.ts +75 -30
- package/features/ai/prompts/thursday.prompt.ts +42 -17
- package/features/ai/tools/bot.tool.ts +32 -30
- package/features/ai/tools/connected.ts +17 -4
- package/features/ai/tools/mcp.tool.ts +5 -5
- package/features/ai/tools/memory.tool.ts +142 -74
- package/features/ai/tools/search.tool.ts +136 -47
- package/features/ai/tools/studio.tool.ts +5 -5
- package/features/ai/tools/tool-name.ts +2 -3
- package/features/ai/tools/workspace.tool.ts +33 -4
- package/features/bot/bot.action.ts +24 -7
- package/features/bot/bot.memory.ts +89 -0
- package/features/bot/bot.query.ts +41 -6
- package/features/bot/bot.run.ts +516 -210
- package/features/bot/bot.runner.ts +463 -93
- package/features/bot/bot.schema.ts +84 -7
- package/features/bot/bot.seed.ts +89 -16
- package/features/bot/components/bot-mark.tsx +122 -20
- package/features/bot/components/bot-room.tsx +519 -391
- package/features/bot/components/bot-setting.tsx +832 -341
- 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 +233 -33
- 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 +86 -79
- package/features/memory/memory.action.ts +3 -43
- package/features/memory/memory.edit.ts +87 -0
- package/features/memory/memory.query.ts +33 -44
- package/features/memory/memory.schema.ts +50 -97
- package/features/settings/components/settings.tsx +2 -0
- package/features/settings/settings.alert.ts +3 -1
- package/features/skills/components/skills-setting.tsx +9 -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 +230 -13
- package/hooks/use-draft.ts +37 -0
- package/hooks/use-hotkey.ts +105 -0
- package/hooks/use-object-state.ts +51 -0
- package/hooks/use-on-visible.ts +72 -0
- package/hooks/use-theme.ts +106 -0
- package/hooks/use-wake-word.ts +262 -0
- package/lib/limits.ts +1 -1
- package/lib/oauth-page.ts +27 -0
- package/lib/realtime/openai.ts +2 -2
- package/lib/realtime/realtime.driver.ts +34 -1
- package/lib/realtime/realtime.protocol.ts +7 -1
- package/lib/realtime/realtime.tap.ts +122 -0
- package/lib/sandbox.ts +60 -29
- package/lib/tokens.ts +19 -0
- package/package.json +1 -1
- package/skills/browser/SKILL.md +55 -34
- package/.next/server/app/api/memory/tidy/route/app-paths-manifest.json +0 -3
- package/.next/server/app/api/memory/tidy/route.js +0 -23
- package/.next/server/app/api/memory/tidy/route.js.nft.json +0 -1
- 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]__02kt8yn._.js +0 -10
- 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]__0dupqt7._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__0h59di-._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__0j_n5l3._.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]__0phdgco._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__0qjqtwo._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__0t_dqaj._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0wvgrsl._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0yk6s3w._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__0z3gelv._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__10qshki._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__113fqg5._.js +0 -12
- package/.next/server/chunks/[root-of-the-server]__11w_7_3._.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_0q_9w._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1_aoyr9._.js +0 -3
- 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]__1dow0bz._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1e-ci13._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1gmn1cs._.js +0 -10
- package/.next/server/chunks/[root-of-the-server]__1lr7j9t._.js +0 -5
- package/.next/server/chunks/[root-of-the-server]__1mzp_el._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1txedx6._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__1u_qvc7._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1zgpz1w._.js +0 -3
- 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/_0zmestz._.js +0 -55
- package/.next/server/chunks/_0zuzmt_._.js +0 -39
- package/.next/server/chunks/_12bbv5i._.js +0 -96
- package/.next/server/chunks/_15q1pig._.js +0 -3
- package/.next/server/chunks/_1drv2et._.js +0 -36
- package/.next/server/chunks/_1ic3bew._.js +0 -5
- package/.next/server/chunks/_1mxn_lb._.js +0 -3
- package/.next/server/chunks/_1uj4_io._.js +0 -10
- package/.next/server/chunks/_1x7p319._.js +0 -6
- package/.next/server/chunks/_1yldgo4._.js +0 -55
- package/.next/server/chunks/_2050gwn._.js +0 -255
- package/.next/server/chunks/_next-internal_server_app_api_memory_tidy_route_actions_0_cfuom.js +0 -3
- package/.next/server/chunks/features_0scmr4i._.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_0vorg6w._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0ykklj0._.js +0 -3
- package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1ryg3wh._.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_1vwbnq_._.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]__01id-v3._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0b-0i32._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0dfwvr4._.js +0 -4
- package/.next/server/chunks/ssr/[root-of-the-server]__0iuoa-r._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__1-mnhyd._.js +0 -90
- package/.next/server/chunks/ssr/[root-of-the-server]__185grso._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__1minz8_._.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/_09-0k3z._.js +0 -3
- package/.next/server/chunks/ssr/_0ay6b01._.js +0 -3
- package/.next/server/chunks/ssr/_0cvjbuz._.js +0 -3
- package/.next/server/chunks/ssr/_0fafgvl._.js +0 -3
- package/.next/server/chunks/ssr/_0j4v8of._.js +0 -3
- package/.next/server/chunks/ssr/_0l81bzy._.js +0 -3
- package/.next/server/chunks/ssr/_0nso8tp._.js +0 -3
- package/.next/server/chunks/ssr/_0sf1isi._.js +0 -3
- package/.next/server/chunks/ssr/_0ti51xc._.js +0 -3
- package/.next/server/chunks/ssr/_0y84qo6._.js +0 -3
- package/.next/server/chunks/ssr/_10uvw3l._.js +0 -3
- package/.next/server/chunks/ssr/_1dcxzqe._.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/_1jbv7m1._.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/lib_realtime_0aetuyp._.js +0 -24
- package/.next/server/chunks/ssr/lib_realtime_18k_aj-._.js +0 -24
- package/.next/server/chunks/ssr/node_modules_zod_v4_classic_errors_05xv7vp.js +0 -3
- package/.next/server/chunks/ssr/node_modules_zod_v4_classic_external_15fmmz3.js +0 -55
- package/.next/static/chunks/0f9sq-7q_yxyl.js +0 -1
- package/.next/static/chunks/0tydnn2kybibk.js +0 -1
- package/.next/static/chunks/0yysv1gzin17t.js +0 -1
- package/.next/static/chunks/1fr5m75pwtyic.js +0 -1
- package/.next/static/chunks/1gy3bbv7usnjo.js +0 -1
- package/.next/static/chunks/1keib_gt066gc.js +0 -1
- package/.next/static/chunks/1ytnip8wdng93.js +0 -1
- package/.next/static/chunks/21rk8w7bda-su.js +0 -1
- package/.next/static/chunks/247d-r95j8xs0.js +0 -1
- package/.next/static/chunks/28g42tw8tsvhd.js +0 -1
- package/.next/static/chunks/29gyb3nubj51j.js +0 -53
- package/.next/static/chunks/2cwjgkt_hoyhj.js +0 -22
- package/.next/static/chunks/2fq_86jvq9ymq.js +0 -2
- package/.next/static/chunks/2rbf1fpd8n80-.js +0 -22
- package/.next/static/chunks/2ukj8k69y89um.js +0 -1
- package/.next/static/chunks/2uxum7qbyeyxd.js +0 -1
- package/.next/static/chunks/2wngeetfnzxkp.js +0 -2
- package/.next/static/chunks/388-t2v72jh39.css +0 -1
- package/.next/static/chunks/3fqvc0cg-atq_.js +0 -1
- package/.next/static/chunks/3p4egvfjxpatb.js +0 -1
- package/.next/static/chunks/3qe1w1ei-huhl.js +0 -1
- package/.next/static/chunks/3xxa2j56-f3nm.js +0 -3
- package/.next/static/chunks/3y40riycdip-i.js +0 -1
- package/.next/static/chunks/45a6zbtkelph9.js +0 -1
- package/.next/static/media/favicon.2vob68tjqpejf.ico +0 -0
- package/features/ai/prompts/memory-tidy.prompt.ts +0 -123
- package/features/ai/tools/tidy.tool.ts +0 -22
- 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/{memory/tidy → bot/memory/files}/route/build-manifest.json +0 -0
- /package/.next/server/app/api/{memory/tidy → bot/memory/files}/route/server-reference-manifest.json +0 -0
- /package/.next/server/app/api/{memory/tidy → bot/memory/files}/route.js.map +0 -0
- /package/.next/static/{X34BUd9bfdH27ripuwwBm → x1cCqY0kWpR_VcYx_lWO5}/_buildManifest.js +0 -0
- /package/.next/static/{X34BUd9bfdH27ripuwwBm → x1cCqY0kWpR_VcYx_lWO5}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{X34BUd9bfdH27ripuwwBm → x1cCqY0kWpR_VcYx_lWO5}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { BROWSER_GONE_MS } from "@/config";
|
|
2
|
+
import { createEventBus, type EventBus } from "@/lib/protocol/events";
|
|
3
|
+
import {
|
|
4
|
+
createEventStream,
|
|
5
|
+
type EventStream,
|
|
6
|
+
} from "@/lib/protocol/events.server";
|
|
7
|
+
import { createPresence, type Presence } from "@/lib/protocol/presence";
|
|
8
|
+
import { type AppEvent, isSignal } from "./app-event";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Server-side bus and the stream that carries it to the browser. Pinned on
|
|
12
|
+
* globalThis because next dev reloads this module while open streams still
|
|
13
|
+
* subscribe to the first bus.
|
|
14
|
+
*/
|
|
15
|
+
type Pinned = {
|
|
16
|
+
__appEvents?: EventBus<AppEvent>;
|
|
17
|
+
__appEventStream?: EventStream<AppEvent>;
|
|
18
|
+
__presence?: Presence;
|
|
19
|
+
__bootId?: string;
|
|
20
|
+
};
|
|
21
|
+
const pinned = globalThis as Pinned;
|
|
22
|
+
|
|
23
|
+
export const appEvents: EventBus<AppEvent> = (pinned.__appEvents ??=
|
|
24
|
+
createEventBus<AppEvent>());
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Whether a browser is on the stream. The app stops what it is doing when the
|
|
28
|
+
* last one has been gone for BROWSER_GONE_MS; who stops what is wired at boot
|
|
29
|
+
* (instrumentation), not here.
|
|
30
|
+
*/
|
|
31
|
+
export const presence: Presence = (pinned.__presence ??=
|
|
32
|
+
createPresence(BROWSER_GONE_MS));
|
|
33
|
+
|
|
34
|
+
/** Signals coalesce over 150ms; data events pass through. */
|
|
35
|
+
export const appEventStream: EventStream<AppEvent> =
|
|
36
|
+
(pinned.__appEventStream ??= createEventStream(appEvents, {
|
|
37
|
+
coalesce: {
|
|
38
|
+
ms: 150,
|
|
39
|
+
keyOf: (event) => (isSignal(event) ? event.type : null),
|
|
40
|
+
},
|
|
41
|
+
onWatchers: presence.track,
|
|
42
|
+
}));
|
|
43
|
+
|
|
44
|
+
/** Identifies this server process; changes on restart. */
|
|
45
|
+
export const BOOT_ID: string = (pinned.__bootId ??= crypto.randomUUID());
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every event the server sends the browser. Two kinds: a signal carries no data
|
|
3
|
+
* and the receiver revalidates the matching GET; a data event is the value
|
|
4
|
+
* itself. A new signal must also be added to `SIGNALS` below.
|
|
5
|
+
*/
|
|
6
|
+
export type AppEvent =
|
|
7
|
+
/** Sent on connect. A changed `boot` means the server restarted; re-read everything. */
|
|
8
|
+
| { type: "hello"; boot: string }
|
|
9
|
+
/** Signal: a task changed (every write in bot.query). */
|
|
10
|
+
| { type: "tasks" }
|
|
11
|
+
/** Signal: a note or fact changed. */
|
|
12
|
+
| { type: "memory" }
|
|
13
|
+
/** Signal: a server was registered, removed, synced, or finished OAuth. */
|
|
14
|
+
| { type: "mcp" }
|
|
15
|
+
/** Signal: a sign-in was written away from the settings screen (ai/chatgpt's sign-in answer). */
|
|
16
|
+
| { type: "config" }
|
|
17
|
+
/** Data: show this note on screen, or hide it when null (memory.tool). */
|
|
18
|
+
| { type: "memory-view"; path: string | null }
|
|
19
|
+
/** Data: a finished job produced a document; `path` is workspace-relative. */
|
|
20
|
+
| { type: "artifact"; taskId: string; label: string; path: string };
|
|
21
|
+
|
|
22
|
+
/** Union members carrying nothing but `type`. */
|
|
23
|
+
type Signal<E = AppEvent> = E extends AppEvent
|
|
24
|
+
? keyof E extends "type"
|
|
25
|
+
? E["type"]
|
|
26
|
+
: never
|
|
27
|
+
: never;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Signals are coalesced before sending (app-event.server). The `Record` type
|
|
31
|
+
* makes a signal missing here a compile error.
|
|
32
|
+
*/
|
|
33
|
+
export const SIGNALS: Record<Signal, true> = {
|
|
34
|
+
tasks: true,
|
|
35
|
+
memory: true,
|
|
36
|
+
mcp: true,
|
|
37
|
+
config: true,
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export const isSignal = (
|
|
41
|
+
event: AppEvent,
|
|
42
|
+
): event is Extract<AppEvent, { type: Signal }> => event.type in SIGNALS;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { readGatewayCatalog } from "@/features/ai/model";
|
|
2
|
+
import type { GatewayModel } from "@/features/ai/model.schema";
|
|
3
|
+
import { serverRoute } from "@/lib/protocol/server-route";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Everything the gateway carries, every modality in one listing. It answers
|
|
7
|
+
* unauthenticated, so the shelf reads before a key is set; only running a model
|
|
8
|
+
* needs one. The answer is built in ai/model, where `callableRows` reads the same list.
|
|
9
|
+
*/
|
|
10
|
+
export const GET = serverRoute(
|
|
11
|
+
async (): Promise<GatewayModel[]> => readGatewayCatalog(),
|
|
12
|
+
);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { readGatewayCredits } from "@/features/ai/model";
|
|
2
|
+
import type { GatewayCredits } from "@/features/ai/model.schema";
|
|
3
|
+
import { serverRoute } from "@/lib/protocol/server-route";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* What is left on the gateway key, null when none is set. Read by the gateway's
|
|
7
|
+
* row in Settings › Keys and its key dialog; the answer is built in ai/model.
|
|
8
|
+
*/
|
|
9
|
+
export const GET = serverRoute(
|
|
10
|
+
async (): Promise<GatewayCredits | null> => readGatewayCredits(),
|
|
11
|
+
);
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { readChatGptPlan } from "@/features/ai/chatgpt";
|
|
2
|
+
import {
|
|
3
|
+
type AiProvider,
|
|
4
|
+
TEXT_MODEL_PROVIDER_LIST,
|
|
5
|
+
} from "@/features/ai/model.schema";
|
|
6
|
+
import { readConfig } from "@/features/config/config.query";
|
|
7
|
+
import { serverRoute } from "@/lib/protocol/server-route";
|
|
8
|
+
|
|
9
|
+
/** Callable providers, whether each one's key is set, and the plan a sign-in is on. */
|
|
10
|
+
export const GET = serverRoute(async () =>
|
|
11
|
+
Promise.all(
|
|
12
|
+
TEXT_MODEL_PROVIDER_LIST.map(
|
|
13
|
+
async (item): Promise<AiProvider> => ({
|
|
14
|
+
id: item.id,
|
|
15
|
+
label: item.label,
|
|
16
|
+
apiKeyName: item.apiKeyName,
|
|
17
|
+
suggestModels: item.suggestModels,
|
|
18
|
+
hasKey: Boolean(await readConfig(item.apiKeyName)),
|
|
19
|
+
...(item.signIn && {
|
|
20
|
+
signIn: true as const,
|
|
21
|
+
plan: await readChatGptPlan(),
|
|
22
|
+
}),
|
|
23
|
+
}),
|
|
24
|
+
),
|
|
25
|
+
),
|
|
26
|
+
);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { readChatGptUsage } from "@/features/ai/chatgpt";
|
|
2
|
+
import type { SubscriptionUsage } from "@/features/ai/model.schema";
|
|
3
|
+
import { serverRoute } from "@/lib/protocol/server-route";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* How much of the GPT Subscription plan is used, null when nobody is signed in. Read by its
|
|
7
|
+
* row in Settings › Keys and its sign-in dialog; the answer is built in ai/chatgpt.
|
|
8
|
+
*/
|
|
9
|
+
export const GET = serverRoute(
|
|
10
|
+
async (): Promise<SubscriptionUsage | null> => readChatGptUsage(),
|
|
11
|
+
);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { streamMemoryEdit } from "@/features/memory/memory.edit";
|
|
2
|
+
import { serverRoute } from "@/lib/protocol/server-route";
|
|
3
|
+
|
|
4
|
+
/** An edit from the memory screen, streamed as it runs (memory.edit). */
|
|
5
|
+
export const POST = serverRoute(async (request) =>
|
|
6
|
+
streamMemoryEdit(await request.json(), request.signal),
|
|
7
|
+
);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { findAllNotes, findNoteByPath } from "@/features/memory/memory.query";
|
|
2
|
+
import { serverRoute } from "@/lib/protocol/server-route";
|
|
3
|
+
import { publicError } from "@/lib/public-error";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Read only; writes go through memory.action. One MemoryNote[] page, `?offset=`
|
|
7
|
+
* for the next. `?path=` returns one note: paths contain `/`, so not a segment.
|
|
8
|
+
*/
|
|
9
|
+
export const GET = serverRoute(async (request) => {
|
|
10
|
+
const params = new URL(request.url).searchParams;
|
|
11
|
+
|
|
12
|
+
const path = params.get("path");
|
|
13
|
+
if (path) {
|
|
14
|
+
const note = await findNoteByPath(path);
|
|
15
|
+
if (!note) publicError("Note not found");
|
|
16
|
+
return note;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const offset = Number(params.get("offset") ?? 0);
|
|
20
|
+
return findAllNotes({ offset: Number.isFinite(offset) ? offset : 0 });
|
|
21
|
+
});
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every endpoint the browser reads. Keys double as SWR cache keys; `revalidate`
|
|
3
|
+
* matches by url prefix, so invalidating `queryKey.memory` also refreshes
|
|
4
|
+
* `queryKey.notePath(path)`. Writes go through server actions, not here.
|
|
5
|
+
*/
|
|
6
|
+
/** Encodes per segment, keeping the path's `/`. */
|
|
7
|
+
const encodePath = (path: string) =>
|
|
8
|
+
path.split("/").map(encodeURIComponent).join("/");
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Inverse of encodePath for catch-all segments. No decoding: Next already
|
|
12
|
+
* decodes segments, and decoding again throws on names containing `%`.
|
|
13
|
+
*/
|
|
14
|
+
export const decodePath = (segments: string[]) => segments.join("/");
|
|
15
|
+
|
|
16
|
+
export const queryKey = {
|
|
17
|
+
/** MemoryNote[] first page: pinned first, then by warmth */
|
|
18
|
+
memory: "/api/memory",
|
|
19
|
+
/** Next page; `offset` is the count received so far */
|
|
20
|
+
memoryPage: (offset: number) => ({
|
|
21
|
+
url: "/api/memory",
|
|
22
|
+
query: { offset: offset || null },
|
|
23
|
+
}),
|
|
24
|
+
/** One note with all facts, by path. Paths contain `/`, so it is a query, not a
|
|
25
|
+
* segment: pass the hook null instead of building this key when closed. */
|
|
26
|
+
notePath: (path: string) => ({ url: "/api/memory", query: { path } }),
|
|
27
|
+
|
|
28
|
+
/** MCPServerSummary[] with tool counts, no tools */
|
|
29
|
+
mcp: "/api/mcp",
|
|
30
|
+
/** MCPServer, one server with its tools */
|
|
31
|
+
mcpServer: (name: string | null) => ({
|
|
32
|
+
url: "/api/mcp",
|
|
33
|
+
pathVariable: [name],
|
|
34
|
+
}),
|
|
35
|
+
|
|
36
|
+
/** Every MCP tool across servers, flat */
|
|
37
|
+
mcpTools: "/api/mcp/tools",
|
|
38
|
+
|
|
39
|
+
/** SkillSummary[], custom first */
|
|
40
|
+
skills: "/api/skills",
|
|
41
|
+
/**
|
|
42
|
+
* SkillNode: a folder listing or a file's text inside a skill.
|
|
43
|
+
* `path` is relative to the skill folder; "" is the skill itself.
|
|
44
|
+
*/
|
|
45
|
+
skillNode: (source: string | null, dir: string | null, path: string) => ({
|
|
46
|
+
url: "/api/skills",
|
|
47
|
+
pathVariable: [source, dir],
|
|
48
|
+
query: { path },
|
|
49
|
+
}),
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Bot[]. `tasks` and `taskHistory` sit under this prefix, so editing a bot
|
|
53
|
+
* also revalidates the inbox and loaded history pages.
|
|
54
|
+
*/
|
|
55
|
+
bot: "/api/bot",
|
|
56
|
+
|
|
57
|
+
/** boolean: whether bots keep their own memory (Settings > Bots) */
|
|
58
|
+
botMemory: "/api/bot/memory",
|
|
59
|
+
/** BotMemory: one bot's own memory files, newest first (Settings > Bots) */
|
|
60
|
+
botMemoryFiles: (bot: string) => ({
|
|
61
|
+
url: "/api/bot/memory/files",
|
|
62
|
+
query: { bot },
|
|
63
|
+
}),
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Inbox: Task[] newest first with threads, everything running or asking plus
|
|
67
|
+
* the most recent finished few. Read by use-thursday only; the `tasks` signal
|
|
68
|
+
* triggers revalidation, with a 30s poll as fallback.
|
|
69
|
+
*/
|
|
70
|
+
tasks: "/api/bot/task",
|
|
71
|
+
/**
|
|
72
|
+
* History page: Task[] newest first. `before` is the last page's final
|
|
73
|
+
* updatedAt (ISO), null for the first page.
|
|
74
|
+
*/
|
|
75
|
+
taskHistory: (before: string | null) => ({
|
|
76
|
+
url: "/api/bot/task",
|
|
77
|
+
query: { history: 1, before },
|
|
78
|
+
}),
|
|
79
|
+
/** ResultPart[]: the full result of one tool call; lists carry only a few lines. */
|
|
80
|
+
toolResult: (taskId: string | null, callId: string | null) => ({
|
|
81
|
+
url: "/api/bot/task",
|
|
82
|
+
pathVariable: [taskId],
|
|
83
|
+
query: { call: callId },
|
|
84
|
+
}),
|
|
85
|
+
/**
|
|
86
|
+
* WorkspaceFolder: one folder's rows, and nothing below them. The bare key
|
|
87
|
+
* is the root, so invalidating it refreshes every folder.
|
|
88
|
+
*/
|
|
89
|
+
workspace: "/api/workspace",
|
|
90
|
+
workspaceFolder: (path: string, rows: number) => ({
|
|
91
|
+
url: "/api/workspace",
|
|
92
|
+
query: { path: path || null, rows },
|
|
93
|
+
}),
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* ArtifactShelf: the top of `artifacts/`, one row per artifact.
|
|
97
|
+
* `artifactSet` opens one of those rows. The bare key is the menu, so
|
|
98
|
+
* invalidating it refreshes an open set too.
|
|
99
|
+
*/
|
|
100
|
+
artifacts: "/api/artifact",
|
|
101
|
+
artifactShelf: (rows: number) => ({
|
|
102
|
+
url: "/api/artifact",
|
|
103
|
+
query: { rows },
|
|
104
|
+
}),
|
|
105
|
+
artifactSet: (name: string, rows: number) => ({
|
|
106
|
+
url: "/api/artifact",
|
|
107
|
+
query: { set: name, rows },
|
|
108
|
+
}),
|
|
109
|
+
|
|
110
|
+
/** Raw workspace file, no Result envelope; for iframe, img and fetch, not SWR. */
|
|
111
|
+
file: (path: string) => `/api/file/${encodePath(path)}`,
|
|
112
|
+
/** File viewer page (new tab): md rendered, html and pdf framed */
|
|
113
|
+
fileView: (path: string) => `/artifact/${encodePath(path)}`,
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Server-sent events, not a read; only app-event.client's `AppEventSource`
|
|
117
|
+
* opens it. The payloads are the AppEvent union in app/api/events/app-event.ts.
|
|
118
|
+
*/
|
|
119
|
+
events: "/api/events",
|
|
120
|
+
|
|
121
|
+
/** ConfigStatus[]: which declared config keys are set; values stay on the server */
|
|
122
|
+
config: "/api/config",
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* CallRecord[] page, newest call first, turns in speaking order; pages count
|
|
126
|
+
* calls (CALL_HISTORY_PAGE). `before` is the oldest call's `startedAt` (ISO)
|
|
127
|
+
* on the previous page, null for the first. Calls with no turns are omitted.
|
|
128
|
+
*/
|
|
129
|
+
callHistory: (before: string | null) => ({
|
|
130
|
+
url: "/api/thursday/call",
|
|
131
|
+
query: { before },
|
|
132
|
+
}),
|
|
133
|
+
|
|
134
|
+
/** boolean: whether the call may read a skill itself (Settings › Thursday) */
|
|
135
|
+
callSkills: "/api/thursday/skills",
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* POST, not a read; the one endpoint here SWR never touches. Body is
|
|
139
|
+
* {toolCallId, callId, name, input}; one JSON Result per call, abortable.
|
|
140
|
+
*/
|
|
141
|
+
toolCall: "/api/thursday/tool-call",
|
|
142
|
+
/** POST, an edit from the memory screen, streamed as it runs (memory.edit). */
|
|
143
|
+
memoryEdit: "/api/memory/edit",
|
|
144
|
+
|
|
145
|
+
/** Providers this app can call and whether each key is set */
|
|
146
|
+
llmModel: "/api/llm-model",
|
|
147
|
+
/** Models reachable with the AI Gateway key; gateway only */
|
|
148
|
+
modelCatalog: "/api/llm-model/catalog",
|
|
149
|
+
/**
|
|
150
|
+
* GatewayCredits | null: what is left on the gateway key, null without one.
|
|
151
|
+
* Under `llmModel`, so the key dialog's revalidate re-reads it after a save.
|
|
152
|
+
*/
|
|
153
|
+
gatewayCredits: "/api/llm-model/credits",
|
|
154
|
+
/**
|
|
155
|
+
* SubscriptionUsage | null: how much of the GPT Subscription plan is used, null when
|
|
156
|
+
* signed out. Under `llmModel`, so signing in or out re-reads it.
|
|
157
|
+
*/
|
|
158
|
+
subscriptionUsage: "/api/llm-model/subscription",
|
|
159
|
+
} as const;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { asSchema } from "ai";
|
|
2
|
+
import z from "zod";
|
|
3
|
+
import { loadTools } from "@/features/ai/load-tools";
|
|
4
|
+
import { modelErrorToString } from "@/features/ai/model";
|
|
5
|
+
import { serverRoute } from "@/lib/protocol/server-route";
|
|
6
|
+
import { publicError } from "@/lib/public-error";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Executes a tool call from the voice session. The page forwards what the model
|
|
10
|
+
* asked for; bots never come through here (they call `execute` directly).
|
|
11
|
+
* A route rather than a server action because actions run serially per client
|
|
12
|
+
* and one turn may call two tools at once. One POST, one JSON, no streaming;
|
|
13
|
+
* hanging up aborts the fetch and the signal reaches the tool.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const ToolCallSchema = z.object({
|
|
17
|
+
toolCallId: z.string().min(1),
|
|
18
|
+
/** The call this came from; `delegate` attaches the job to it. */
|
|
19
|
+
callId: z.string().nullish(),
|
|
20
|
+
name: z.string().min(1),
|
|
21
|
+
input: z.unknown().optional(),
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const isAsyncIterable = (value: unknown): value is AsyncIterable<unknown> =>
|
|
25
|
+
typeof value === "object" && value !== null && Symbol.asyncIterator in value;
|
|
26
|
+
|
|
27
|
+
/** For streaming tools the last chunk is the answer. */
|
|
28
|
+
async function drain(output: unknown): Promise<unknown> {
|
|
29
|
+
if (!isAsyncIterable(output)) return output;
|
|
30
|
+
let latest: unknown;
|
|
31
|
+
for await (const part of output) latest = part;
|
|
32
|
+
return latest;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const POST = serverRoute(async (request) => {
|
|
36
|
+
const { toolCallId, callId, name, input } = ToolCallSchema.parse(
|
|
37
|
+
await request.json(),
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
// The set the voice runtime may run, not whatever the body names.
|
|
41
|
+
const tools = await loadTools({ target: "thursday", callId });
|
|
42
|
+
const tool = tools[name];
|
|
43
|
+
if (!tool) publicError(`There is no tool called "${name}".`);
|
|
44
|
+
|
|
45
|
+
// end_call has no execute by design: the page owns the call and intercepts it.
|
|
46
|
+
if (!tool.execute) publicError(`"${name}" is handled by the page, not here.`);
|
|
47
|
+
|
|
48
|
+
const parsed = await asSchema(tool.inputSchema).validate?.(input ?? {});
|
|
49
|
+
if (parsed && !parsed.success) {
|
|
50
|
+
publicError(
|
|
51
|
+
`"${name}" got arguments that do not fit: ${parsed.error.message}`,
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
try {
|
|
56
|
+
const output = await tool.execute(parsed?.value ?? input ?? {}, {
|
|
57
|
+
toolCallId,
|
|
58
|
+
messages: [],
|
|
59
|
+
context: undefined,
|
|
60
|
+
abortSignal: request.signal,
|
|
61
|
+
});
|
|
62
|
+
return { output: await drain(output) };
|
|
63
|
+
} catch (cause) {
|
|
64
|
+
// A tool failure is a line the model reads and recovers from, not a masked server error.
|
|
65
|
+
publicError(`"${name}" failed: ${modelErrorToString(cause)}`);
|
|
66
|
+
}
|
|
67
|
+
});
|
package/bin/thursday.mjs
CHANGED
|
@@ -138,6 +138,9 @@ const child = spawn(process.execPath, [join(APP, "server.js")], {
|
|
|
138
138
|
// This machine only. A voice agent with a shell is not a thing to expose.
|
|
139
139
|
HOSTNAME: process.env.HOSTNAME || "127.0.0.1",
|
|
140
140
|
NODE_ENV: "production",
|
|
141
|
+
// The server parks running jobs on a stop before it exits (instrumentation);
|
|
142
|
+
// without this, Next exits on the signal first
|
|
143
|
+
NEXT_MANUAL_SIG_HANDLE: "true",
|
|
141
144
|
},
|
|
142
145
|
});
|
|
143
146
|
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { cva, type VariantProps } from "class-variance-authority";
|
|
4
|
+
import type { ComponentProps } from "react";
|
|
5
|
+
import { cn } from "@/lib/utils";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Joins plain `<Button>`s into one control (outer corners only, shared 1px
|
|
9
|
+
* seams). Nested groups get a gap between them. For a selected value use
|
|
10
|
+
* `Segmented`.
|
|
11
|
+
*/
|
|
12
|
+
const buttonGroupVariants = cva(
|
|
13
|
+
"flex w-fit items-stretch has-[>[data-slot=button-group]]:gap-1.5 [&>*]:relative [&>*]:focus-visible:z-10",
|
|
14
|
+
{
|
|
15
|
+
variants: {
|
|
16
|
+
orientation: {
|
|
17
|
+
horizontal:
|
|
18
|
+
"[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none",
|
|
19
|
+
vertical:
|
|
20
|
+
"flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none",
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
defaultVariants: {
|
|
24
|
+
orientation: "horizontal",
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
function ButtonGroup({
|
|
30
|
+
className,
|
|
31
|
+
orientation = "horizontal",
|
|
32
|
+
...props
|
|
33
|
+
}: ComponentProps<"div"> & VariantProps<typeof buttonGroupVariants>) {
|
|
34
|
+
return (
|
|
35
|
+
<div
|
|
36
|
+
data-slot="button-group"
|
|
37
|
+
data-orientation={orientation}
|
|
38
|
+
role="group"
|
|
39
|
+
className={cn(buttonGroupVariants({ orientation }), className)}
|
|
40
|
+
{...props}
|
|
41
|
+
/>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export { ButtonGroup, buttonGroupVariants };
|