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
|
@@ -12,6 +12,7 @@ import { Skeleton } from "@/components/ui/skeleton";
|
|
|
12
12
|
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
|
13
13
|
import { Textarea } from "@/components/ui/textarea";
|
|
14
14
|
import { PAGE_SIZE } from "@/config";
|
|
15
|
+
import { MemoryEdit } from "@/features/memory/components/memory-edit";
|
|
15
16
|
import {
|
|
16
17
|
addFactsAction,
|
|
17
18
|
createNoteAction,
|
|
@@ -25,6 +26,7 @@ import {
|
|
|
25
26
|
isFading,
|
|
26
27
|
type MemoryNote,
|
|
27
28
|
type MemorySection,
|
|
29
|
+
memorySourceLabel,
|
|
28
30
|
noteTitle,
|
|
29
31
|
sectionOf,
|
|
30
32
|
} from "@/features/memory/memory.schema";
|
|
@@ -45,7 +47,6 @@ const SECTIONS: { key: MemorySection; label: string }[] = [
|
|
|
45
47
|
{ key: "you", label: "You" },
|
|
46
48
|
{ key: "people", label: "People" },
|
|
47
49
|
{ key: "projects", label: "Projects" },
|
|
48
|
-
{ key: "plans", label: "Plans" },
|
|
49
50
|
{ key: "topics", label: "Topics" },
|
|
50
51
|
{ key: "inbox", label: "Inbox" },
|
|
51
52
|
];
|
|
@@ -70,79 +71,83 @@ export function MemorySetting() {
|
|
|
70
71
|
if (error) return <SettingError message={error.message} />;
|
|
71
72
|
|
|
72
73
|
return (
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
<
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
74
|
+
// The edit floats over the panes, above the rail (memory-edit)
|
|
75
|
+
<div className="relative h-full min-h-0">
|
|
76
|
+
<SettingPanes
|
|
77
|
+
footer={picked && <NoteReadLog note={picked} />}
|
|
78
|
+
left={
|
|
79
|
+
<div className="flex flex-col py-2">
|
|
80
|
+
<button
|
|
81
|
+
type="button"
|
|
82
|
+
onClick={openMemoryCreate}
|
|
83
|
+
className="mx-2 mb-1 flex items-center gap-2 rounded-md px-2 py-1.5 text-left text-[13px] text-muted-foreground outline-none hover:bg-muted/60 hover:text-foreground focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-inset"
|
|
84
|
+
>
|
|
85
|
+
<Plus className="size-3.5 shrink-0" />
|
|
86
|
+
New note
|
|
87
|
+
</button>
|
|
85
88
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
+
{SECTIONS.map(({ key, label }) => {
|
|
90
|
+
const rows = notes.filter((note) => sectionOf(note.path) === key);
|
|
91
|
+
if (rows.length === 0) return null;
|
|
89
92
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
</div>
|
|
125
|
-
}
|
|
126
|
-
right={
|
|
127
|
-
picked ? (
|
|
128
|
-
// Keyed so editing state does not carry over to the next note.
|
|
129
|
-
<NotePage key={picked.id} note={picked} />
|
|
130
|
-
) : (
|
|
131
|
-
<div className="space-y-4 p-8">
|
|
132
|
-
<p className="text-sm leading-relaxed text-muted-foreground">
|
|
133
|
-
During calls Thursday saves what it picks up — that a teammate
|
|
134
|
-
moved teams, that you take meetings in the morning — and reads it
|
|
135
|
-
back before answering. File the first note yourself and it starts
|
|
136
|
-
the next call already knowing something.
|
|
137
|
-
</p>
|
|
138
|
-
<Button variant="outline" onClick={openMemoryCreate}>
|
|
139
|
-
<Plus />
|
|
140
|
-
Add note
|
|
141
|
-
</Button>
|
|
93
|
+
return (
|
|
94
|
+
<Fragment key={key}>
|
|
95
|
+
<span className="px-3 pt-3 pb-1 font-mono text-[10px] text-muted-foreground/60">
|
|
96
|
+
{label}
|
|
97
|
+
{key === "inbox" && (
|
|
98
|
+
<span className="pl-1.5 text-muted-foreground/50">
|
|
99
|
+
waiting to be filed
|
|
100
|
+
</span>
|
|
101
|
+
)}
|
|
102
|
+
</span>
|
|
103
|
+
{rows.map((note) => (
|
|
104
|
+
<NoteLink
|
|
105
|
+
key={note.id}
|
|
106
|
+
note={note}
|
|
107
|
+
active={note.id === picked?.id}
|
|
108
|
+
onPick={() => setPickedId(note.id)}
|
|
109
|
+
/>
|
|
110
|
+
))}
|
|
111
|
+
</Fragment>
|
|
112
|
+
);
|
|
113
|
+
})}
|
|
114
|
+
<SettingMore
|
|
115
|
+
hasMore={hasMore}
|
|
116
|
+
loading={isLoadingMore}
|
|
117
|
+
sentinelRef={sentinelRef}
|
|
118
|
+
count={3}
|
|
119
|
+
ghost={
|
|
120
|
+
<div className="mx-2 flex items-center gap-2 px-2 py-2">
|
|
121
|
+
<Skeleton className="h-3 w-28" />
|
|
122
|
+
<span className="flex-1" />
|
|
123
|
+
<Skeleton className="h-2.5 w-2.5" />
|
|
124
|
+
</div>
|
|
125
|
+
}
|
|
126
|
+
/>
|
|
142
127
|
</div>
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
128
|
+
}
|
|
129
|
+
right={
|
|
130
|
+
picked ? (
|
|
131
|
+
// Keyed so editing state does not carry over to the next note.
|
|
132
|
+
<NotePage key={picked.id} note={picked} />
|
|
133
|
+
) : (
|
|
134
|
+
<div className="space-y-4 p-8">
|
|
135
|
+
<p className="text-sm leading-relaxed text-muted-foreground">
|
|
136
|
+
During calls Thursday saves what it picks up — that a teammate
|
|
137
|
+
moved teams, that you take meetings in the morning — and reads
|
|
138
|
+
it back before answering. File the first note yourself and it
|
|
139
|
+
starts the next call already knowing something.
|
|
140
|
+
</p>
|
|
141
|
+
<Button variant="outline" onClick={openMemoryCreate}>
|
|
142
|
+
<Plus />
|
|
143
|
+
Add note
|
|
144
|
+
</Button>
|
|
145
|
+
</div>
|
|
146
|
+
)
|
|
147
|
+
}
|
|
148
|
+
/>
|
|
149
|
+
<MemoryEdit notes={notes} />
|
|
150
|
+
</div>
|
|
146
151
|
);
|
|
147
152
|
}
|
|
148
153
|
|
|
@@ -348,8 +353,16 @@ function NotePage({ note }: { note: MemoryNote }) {
|
|
|
348
353
|
<span className="flex-1 text-sm leading-relaxed text-foreground/90">
|
|
349
354
|
{fact.text}
|
|
350
355
|
</span>
|
|
351
|
-
|
|
352
|
-
|
|
356
|
+
{/* When, and whose hand — memory is kept by four of them */}
|
|
357
|
+
<span className="shrink-0 pt-0.5 text-right text-[11px] text-muted-foreground/50">
|
|
358
|
+
<span className="block font-mono">
|
|
359
|
+
{format(fact.createdAt, "yyyy.MM.dd")}
|
|
360
|
+
</span>
|
|
361
|
+
{memorySourceLabel(fact.source) && (
|
|
362
|
+
<span className="block">
|
|
363
|
+
{memorySourceLabel(fact.source)}
|
|
364
|
+
</span>
|
|
365
|
+
)}
|
|
353
366
|
</span>
|
|
354
367
|
</li>
|
|
355
368
|
))}
|
|
@@ -436,12 +449,6 @@ const NOTE_KINDS = [
|
|
|
436
449
|
placeholder: "thursday",
|
|
437
450
|
fact: "Ships behind a feature flag until April",
|
|
438
451
|
},
|
|
439
|
-
{
|
|
440
|
-
key: "plans",
|
|
441
|
-
label: "Plan",
|
|
442
|
-
placeholder: "japan trip",
|
|
443
|
-
fact: "Aug 28–31 with Yuri — wedding rings in Ginza",
|
|
444
|
-
},
|
|
445
452
|
{
|
|
446
453
|
key: "topics",
|
|
447
454
|
label: "Topic",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use server";
|
|
2
2
|
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import {
|
|
4
|
+
import { MEMORY_LIMITS } from "@/config";
|
|
5
5
|
import {
|
|
6
6
|
addFact,
|
|
7
7
|
createNote,
|
|
@@ -11,15 +11,9 @@ import {
|
|
|
11
11
|
setFactAlwaysLoad,
|
|
12
12
|
updateNote,
|
|
13
13
|
} from "@/features/memory/memory.query";
|
|
14
|
-
import {
|
|
15
|
-
ALWAYS_LOADED_MAX,
|
|
16
|
-
isMemoryPath,
|
|
17
|
-
} from "@/features/memory/memory.schema";
|
|
18
|
-
import { markEveryCallRead } from "@/features/thursday/thursday.query";
|
|
14
|
+
import { isMemoryPath } from "@/features/memory/memory.schema";
|
|
19
15
|
import { serverAction } from "@/lib/protocol/server-action";
|
|
20
16
|
import { publicError } from "@/lib/public-error";
|
|
21
|
-
import { startTidy, stopTidy } from "./memory.tidy";
|
|
22
|
-
import { readTidyOn, writeTidyModel, writeTidyOn } from "./tidy.query";
|
|
23
17
|
|
|
24
18
|
const PathSchema = z.string().trim().refine(isMemoryPath, "Invalid note path");
|
|
25
19
|
|
|
@@ -84,43 +78,9 @@ export const setFactAlwaysLoadAction = serverAction(
|
|
|
84
78
|
const result = await setFactAlwaysLoad(noteId, factId, alwaysLoad);
|
|
85
79
|
if (result === "full") {
|
|
86
80
|
publicError(
|
|
87
|
-
`Only ${
|
|
81
|
+
`Only ${MEMORY_LIMITS.carried} facts can be carried into every call — drop one first`,
|
|
88
82
|
);
|
|
89
83
|
}
|
|
90
84
|
if (result === "missing") publicError("Fact not found");
|
|
91
85
|
},
|
|
92
86
|
);
|
|
93
|
-
|
|
94
|
-
// Reading calls back (memory.tidy): the switch, the model, and the two hands on it.
|
|
95
|
-
|
|
96
|
-
/** Switching on stamps every past call as read, so it starts from now rather than from the beginning of history. */
|
|
97
|
-
export const setMemoryTidyOnAction = serverAction(async (on: unknown) => {
|
|
98
|
-
const wanted = z.boolean().parse(on);
|
|
99
|
-
if (wanted && !(await readTidyOn())) await markEveryCallRead();
|
|
100
|
-
await writeTidyOn(wanted);
|
|
101
|
-
if (!wanted) await stopTidy("Switched off.");
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
/** `provider/model`, or empty for the app default. */
|
|
105
|
-
export const setMemoryTidyModelAction = serverAction(async (value: unknown) => {
|
|
106
|
-
const said = z.string().trim().parse(value);
|
|
107
|
-
if (!said) return writeTidyModel(null);
|
|
108
|
-
const ref = parseTextModel(said);
|
|
109
|
-
if (!ref) publicError("That is not a model this app can run.");
|
|
110
|
-
await writeTidyModel(ref);
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
/** The screen's "Read now": skips the count, not the read itself. */
|
|
114
|
-
export const runMemoryTidyAction = serverAction(async () => {
|
|
115
|
-
const outcome = await startTidy({ force: true });
|
|
116
|
-
if (outcome === "off") publicError("Reading calls back is switched off.");
|
|
117
|
-
if (outcome === "no-model") {
|
|
118
|
-
publicError("Pick a model first — this does not run on the app default.");
|
|
119
|
-
}
|
|
120
|
-
if (outcome === "running") publicError("It is already reading.");
|
|
121
|
-
if (outcome === "nothing") publicError("Every call has been read back.");
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
export const cancelMemoryTidyAction = serverAction(async () => {
|
|
125
|
-
await stopTidy("Cancelled.");
|
|
126
|
-
});
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import {
|
|
2
|
+
convertToModelMessages,
|
|
3
|
+
stepCountIs,
|
|
4
|
+
streamText,
|
|
5
|
+
validateUIMessages,
|
|
6
|
+
} from "ai";
|
|
7
|
+
import { ZodError, z } from "zod";
|
|
8
|
+
import { loadTools } from "@/features/ai/load-tools";
|
|
9
|
+
import { getTextModel, modelErrorToString } from "@/features/ai/model";
|
|
10
|
+
import { textModelRefSchema } from "@/features/ai/model.schema";
|
|
11
|
+
import { loadMemoryEditPrompt } from "@/features/ai/prompts/memory-edit.prompt";
|
|
12
|
+
import { logger } from "@/lib/logger";
|
|
13
|
+
import { isPublicError } from "@/lib/public-error";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Editing memory from its own screen: one request, one streamed run. The model
|
|
17
|
+
* gets memory's two writes, which run as it calls them, and the page draws each
|
|
18
|
+
* call as it arrives. Nothing about the exchange is kept — the page holds the
|
|
19
|
+
* messages and drops them — so what lasts is only what the tools wrote.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/** One line of intent: a run still writing after this many steps is not converging. */
|
|
23
|
+
const MAX_STEPS = 20;
|
|
24
|
+
|
|
25
|
+
const BodySchema = z.object({
|
|
26
|
+
model: textModelRefSchema,
|
|
27
|
+
messages: z.array(z.unknown()).min(1),
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
export async function streamMemoryEdit(
|
|
31
|
+
body: unknown,
|
|
32
|
+
signal: AbortSignal,
|
|
33
|
+
): Promise<Response> {
|
|
34
|
+
let run: Awaited<ReturnType<typeof prepare>>;
|
|
35
|
+
try {
|
|
36
|
+
run = await prepare(body);
|
|
37
|
+
} catch (cause) {
|
|
38
|
+
// Nothing has streamed yet, so this text is what the page shows as the error
|
|
39
|
+
const { status, message } = startError(cause);
|
|
40
|
+
return new Response(message, { status });
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const result = streamText({
|
|
44
|
+
model: run.model,
|
|
45
|
+
system: run.system,
|
|
46
|
+
messages: run.messages,
|
|
47
|
+
tools: run.tools,
|
|
48
|
+
// The first step has to write; after it the model stops once nothing is
|
|
49
|
+
// left. Required on every step would leave it no way to stop short of the cap.
|
|
50
|
+
prepareStep: ({ stepNumber }) => ({
|
|
51
|
+
toolChoice: stepNumber === 0 ? "required" : "auto",
|
|
52
|
+
}),
|
|
53
|
+
stopWhen: stepCountIs(MAX_STEPS),
|
|
54
|
+
abortSignal: signal,
|
|
55
|
+
});
|
|
56
|
+
// A provider's refusal is the user's to act on, so it is never masked
|
|
57
|
+
return result.toUIMessageStreamResponse({ onError: modelErrorToString });
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async function prepare(body: unknown) {
|
|
61
|
+
const { model: ref, messages } = BodySchema.parse(body);
|
|
62
|
+
const tools = await loadTools({ target: "memory-edit" });
|
|
63
|
+
const [model, system, ui] = await Promise.all([
|
|
64
|
+
getTextModel(ref),
|
|
65
|
+
loadMemoryEditPrompt(),
|
|
66
|
+
validateUIMessages({ messages }),
|
|
67
|
+
]);
|
|
68
|
+
return {
|
|
69
|
+
model: model.model,
|
|
70
|
+
system,
|
|
71
|
+
tools,
|
|
72
|
+
messages: await convertToModelMessages(ui),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** The route boundary's policy (protocol/to-result), for a response that is not a Result. */
|
|
77
|
+
function startError(cause: unknown): { status: number; message: string } {
|
|
78
|
+
if (isPublicError(cause)) return { status: 400, message: cause.message };
|
|
79
|
+
if (cause instanceof ZodError) {
|
|
80
|
+
return {
|
|
81
|
+
status: 400,
|
|
82
|
+
message: cause.issues[0]?.message ?? "That request does not fit",
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
logger.error(cause);
|
|
86
|
+
return { status: 500, message: "Could not start the edit" };
|
|
87
|
+
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { and, asc,
|
|
1
|
+
import { and, asc, desc, eq, inArray, sql } from "drizzle-orm";
|
|
2
2
|
import { appEvents } from "@/app/api/events/app-event.server";
|
|
3
|
-
import { PAGE_SIZE } from "@/config";
|
|
3
|
+
import { MEMORY_LIMITS, PAGE_SIZE } from "@/config";
|
|
4
4
|
import { database } from "@/database/db";
|
|
5
|
-
import { memoryFactTable, memoryNoteTable } from "@/database/tables";
|
|
5
|
+
import { callTable, memoryFactTable, memoryNoteTable } from "@/database/tables";
|
|
6
6
|
import { createKeyedLock } from "@/lib/queue";
|
|
7
7
|
import {
|
|
8
|
-
ALWAYS_LOADED_MAX,
|
|
9
8
|
isAlwaysListed,
|
|
10
9
|
MEMORY_ALWAYS_LISTED,
|
|
11
10
|
MEMORY_PATHS,
|
|
12
11
|
type MemoryAlwaysLoaded,
|
|
13
12
|
type MemoryNoteView,
|
|
14
13
|
type MemoryNoteWrite,
|
|
14
|
+
type MemorySource,
|
|
15
15
|
type MemoryWrite,
|
|
16
16
|
recallScore,
|
|
17
17
|
} from "./memory.schema";
|
|
@@ -68,9 +68,12 @@ function latestFacts(noteIds: number[]) {
|
|
|
68
68
|
noteId: memoryFactTable.noteId,
|
|
69
69
|
text: memoryFactTable.text,
|
|
70
70
|
alwaysLoad: memoryFactTable.alwaysLoad,
|
|
71
|
+
source: memoryFactTable.source,
|
|
71
72
|
createdAt: memoryFactTable.createdAt,
|
|
73
|
+
saidAt: callTable.startedAt,
|
|
72
74
|
})
|
|
73
75
|
.from(memoryFactTable)
|
|
76
|
+
.leftJoin(callTable, eq(memoryFactTable.callId, callTable.id))
|
|
74
77
|
.where(
|
|
75
78
|
and(
|
|
76
79
|
eq(memoryFactTable.isLatest, true),
|
|
@@ -129,7 +132,8 @@ export async function deleteNote(id: number) {
|
|
|
129
132
|
export async function addFact(noteId: number, text: string) {
|
|
130
133
|
const [fact] = await database
|
|
131
134
|
.insert(memoryFactTable)
|
|
132
|
-
|
|
135
|
+
// Only the screen calls this, so the hand is known here (memory.action)
|
|
136
|
+
.values({ noteId, text, source: "user" })
|
|
133
137
|
.returning();
|
|
134
138
|
await touchNote(noteId);
|
|
135
139
|
changed();
|
|
@@ -155,7 +159,7 @@ export async function reviseFact(noteId: number, factId: number, text: string) {
|
|
|
155
159
|
|
|
156
160
|
const [fact] = await tx
|
|
157
161
|
.insert(memoryFactTable)
|
|
158
|
-
.values({ noteId, text })
|
|
162
|
+
.values({ noteId, text, source: "user" })
|
|
159
163
|
.returning();
|
|
160
164
|
await tx
|
|
161
165
|
.update(memoryNoteTable)
|
|
@@ -297,14 +301,18 @@ export async function readNotes(
|
|
|
297
301
|
description: note.description,
|
|
298
302
|
facts: facts
|
|
299
303
|
.filter((fact) => fact.noteId === note.id)
|
|
300
|
-
.map((fact) => ({
|
|
304
|
+
.map((fact) => ({
|
|
305
|
+
id: fact.id,
|
|
306
|
+
text: fact.text,
|
|
307
|
+
...(fact.saidAt ? { saidAt: fact.saidAt } : {}),
|
|
308
|
+
})),
|
|
301
309
|
})),
|
|
302
310
|
missing,
|
|
303
311
|
};
|
|
304
312
|
}
|
|
305
313
|
|
|
306
314
|
/** Facts differing only in whitespace, punctuation or case count as the same fact. */
|
|
307
|
-
|
|
315
|
+
const sameFact = (text: string) =>
|
|
308
316
|
text.toLowerCase().replace(/[\s.,!?…·'"`]/g, "");
|
|
309
317
|
|
|
310
318
|
/**
|
|
@@ -313,6 +321,10 @@ export const sameFact = (text: string) =>
|
|
|
313
321
|
*/
|
|
314
322
|
export async function writeNotes(
|
|
315
323
|
input: MemoryNoteWrite[],
|
|
324
|
+
/** Which hand is writing; recorded on every fact (memory.schema MemorySource). */
|
|
325
|
+
source: MemorySource,
|
|
326
|
+
/** The call it is being said in; null for the screen and for a bot. */
|
|
327
|
+
callId: string | null = null,
|
|
316
328
|
): Promise<MemoryWrite> {
|
|
317
329
|
const unnamed: string[] = [];
|
|
318
330
|
const paths: string[] = [];
|
|
@@ -321,7 +333,7 @@ export async function writeNotes(
|
|
|
321
333
|
|
|
322
334
|
await serialize(() =>
|
|
323
335
|
database.transaction(async (tx) => {
|
|
324
|
-
// Free alwaysLoad slots (
|
|
336
|
+
// Free alwaysLoad slots (config MEMORY_LIMITS.carried), counted inside the transaction.
|
|
325
337
|
const [loaded] = await tx
|
|
326
338
|
.select({ count: sql<number>`count(*)` })
|
|
327
339
|
.from(memoryFactTable)
|
|
@@ -331,7 +343,7 @@ export async function writeNotes(
|
|
|
331
343
|
eq(memoryFactTable.isLatest, true),
|
|
332
344
|
),
|
|
333
345
|
);
|
|
334
|
-
let room =
|
|
346
|
+
let room = MEMORY_LIMITS.carried - Number(loaded?.count ?? 0);
|
|
335
347
|
|
|
336
348
|
/** Claims an alwaysLoad slot; without one the fact is stored as ordinary. */
|
|
337
349
|
const claim = (want: boolean, text: string) => {
|
|
@@ -466,6 +478,8 @@ export async function writeNotes(
|
|
|
466
478
|
.values({
|
|
467
479
|
noteId,
|
|
468
480
|
text: fact.text,
|
|
481
|
+
source,
|
|
482
|
+
callId,
|
|
469
483
|
alwaysLoad: claim(
|
|
470
484
|
fact.alwaysLoad ?? target.alwaysLoad,
|
|
471
485
|
fact.text,
|
|
@@ -494,6 +508,8 @@ export async function writeNotes(
|
|
|
494
508
|
.values({
|
|
495
509
|
noteId,
|
|
496
510
|
text: fact.text,
|
|
511
|
+
source,
|
|
512
|
+
callId,
|
|
497
513
|
alwaysLoad: claim(fact.alwaysLoad === true, fact.text),
|
|
498
514
|
})
|
|
499
515
|
.returning({
|
|
@@ -534,7 +550,7 @@ export function listAlwaysLoaded(): Promise<MemoryAlwaysLoaded[]> {
|
|
|
534
550
|
),
|
|
535
551
|
)
|
|
536
552
|
.orderBy(asc(memoryNoteTable.path), asc(memoryFactTable.id))
|
|
537
|
-
.limit(
|
|
553
|
+
.limit(MEMORY_LIMITS.carried);
|
|
538
554
|
}
|
|
539
555
|
|
|
540
556
|
/** Settings toggle for alwaysLoad; same cap as model writes, no new version. */
|
|
@@ -555,7 +571,7 @@ export async function setFactAlwaysLoad(
|
|
|
555
571
|
eq(memoryFactTable.isLatest, true),
|
|
556
572
|
),
|
|
557
573
|
);
|
|
558
|
-
if (Number(loaded?.count ?? 0) >=
|
|
574
|
+
if (Number(loaded?.count ?? 0) >= MEMORY_LIMITS.carried) return "full";
|
|
559
575
|
}
|
|
560
576
|
|
|
561
577
|
const [row] = await tx
|
|
@@ -678,41 +694,14 @@ export async function forgetFactById(
|
|
|
678
694
|
return forgotten;
|
|
679
695
|
}
|
|
680
696
|
|
|
681
|
-
/**
|
|
682
|
-
export function
|
|
683
|
-
from: Date,
|
|
684
|
-
to: Date,
|
|
685
|
-
): Promise<MemoryAlwaysLoaded[]> {
|
|
686
|
-
return database
|
|
687
|
-
.select({
|
|
688
|
-
id: memoryFactTable.id,
|
|
689
|
-
path: memoryNoteTable.path,
|
|
690
|
-
text: memoryFactTable.text,
|
|
691
|
-
})
|
|
692
|
-
.from(memoryFactTable)
|
|
693
|
-
.innerJoin(memoryNoteTable, eq(memoryFactTable.noteId, memoryNoteTable.id))
|
|
694
|
-
.where(
|
|
695
|
-
and(
|
|
696
|
-
eq(memoryFactTable.isLatest, true),
|
|
697
|
-
between(memoryFactTable.createdAt, from, to),
|
|
698
|
-
),
|
|
699
|
-
)
|
|
700
|
-
.orderBy(asc(memoryFactTable.id));
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
/** One current fact with its note path; null when gone. */
|
|
704
|
-
export async function findFactById(
|
|
697
|
+
/** Who wrote a fact and the call it was said in; null when there is no such fact. */
|
|
698
|
+
export async function findFactCall(
|
|
705
699
|
id: number,
|
|
706
|
-
): Promise<
|
|
700
|
+
): Promise<{ source: MemorySource | null; callId: string | null } | null> {
|
|
707
701
|
const [fact] = await database
|
|
708
|
-
.select({
|
|
709
|
-
id: memoryFactTable.id,
|
|
710
|
-
path: memoryNoteTable.path,
|
|
711
|
-
text: memoryFactTable.text,
|
|
712
|
-
})
|
|
702
|
+
.select({ source: memoryFactTable.source, callId: memoryFactTable.callId })
|
|
713
703
|
.from(memoryFactTable)
|
|
714
|
-
.
|
|
715
|
-
.where(and(eq(memoryFactTable.id, id), eq(memoryFactTable.isLatest, true)));
|
|
704
|
+
.where(eq(memoryFactTable.id, id));
|
|
716
705
|
return fact ?? null;
|
|
717
706
|
}
|
|
718
707
|
|