thursday-agent 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (541) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +5 -2
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +5 -5
  5. package/.next/routes-manifest.json +24 -6
  6. package/.next/server/app/_global-error/page.js +2 -2
  7. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/_global-error.html +1 -1
  10. package/.next/server/app/_global-error.rsc +2 -2
  11. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found/page.js +2 -2
  15. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  16. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  17. package/.next/server/app/_not-found.html +1 -1
  18. package/.next/server/app/_not-found.rsc +14 -14
  19. package/.next/server/app/_not-found.segments/_full.segment.rsc +14 -14
  20. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +12 -12
  21. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  22. package/.next/server/app/api/artifact/route.js +3 -3
  23. package/.next/server/app/api/artifact/route.js.nft.json +1 -1
  24. package/.next/server/app/api/bot/memory/files/route/app-paths-manifest.json +3 -0
  25. package/.next/server/app/api/bot/memory/files/route.js +10 -0
  26. package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -0
  27. package/.next/server/app/api/bot/memory/files/route_client-reference-manifest.js +3 -0
  28. package/.next/server/app/api/bot/memory/route/app-paths-manifest.json +3 -0
  29. package/.next/server/app/api/bot/memory/route.js +14 -0
  30. package/.next/server/app/api/bot/{notes → memory}/route.js.nft.json +1 -1
  31. package/.next/server/app/api/bot/memory/route_client-reference-manifest.js +3 -0
  32. package/.next/server/app/api/bot/route.js +6 -6
  33. package/.next/server/app/api/bot/route.js.nft.json +1 -1
  34. package/.next/server/app/api/bot/task/[id]/route.js +8 -8
  35. package/.next/server/app/api/bot/task/[id]/route.js.nft.json +1 -1
  36. package/.next/server/app/api/bot/task/route.js +8 -8
  37. package/.next/server/app/api/bot/task/route.js.nft.json +1 -1
  38. package/.next/server/app/api/config/route.js +5 -5
  39. package/.next/server/app/api/config/route.js.nft.json +1 -1
  40. package/.next/server/app/api/events/route.js +4 -5
  41. package/.next/server/app/api/events/route.js.nft.json +1 -1
  42. package/.next/server/app/api/file/[...path]/route.js +3 -3
  43. package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
  44. package/.next/server/app/api/llm-model/catalog/route.js +9 -8
  45. package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
  46. package/.next/server/app/api/llm-model/credits/route/app-paths-manifest.json +3 -0
  47. package/.next/server/app/api/llm-model/credits/route/build-manifest.json +12 -0
  48. package/.next/server/app/api/llm-model/credits/route/server-reference-manifest.json +4 -0
  49. package/.next/server/app/api/llm-model/credits/route.js +16 -0
  50. package/.next/server/app/api/llm-model/credits/route.js.map +5 -0
  51. package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -0
  52. package/.next/server/app/api/llm-model/credits/route_client-reference-manifest.js +3 -0
  53. package/.next/server/app/api/llm-model/route.js +10 -8
  54. package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
  55. package/.next/server/app/api/llm-model/subscription/route/app-paths-manifest.json +3 -0
  56. package/.next/server/app/api/llm-model/subscription/route/build-manifest.json +12 -0
  57. package/.next/server/app/api/llm-model/subscription/route/server-reference-manifest.json +4 -0
  58. package/.next/server/app/api/llm-model/subscription/route.js +15 -0
  59. package/.next/server/app/api/llm-model/subscription/route.js.map +5 -0
  60. package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -0
  61. package/.next/server/app/api/llm-model/subscription/route_client-reference-manifest.js +3 -0
  62. package/.next/server/app/api/mcp/[name]/route.js +4 -4
  63. package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/mcp/oauth/callback/route.js +5 -5
  65. package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
  66. package/.next/server/app/api/mcp/route.js +4 -4
  67. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  68. package/.next/server/app/api/mcp/tools/route.js +4 -4
  69. package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
  70. package/.next/server/app/api/memory/edit/route/app-paths-manifest.json +3 -0
  71. package/.next/server/app/api/memory/edit/route/build-manifest.json +12 -0
  72. package/.next/server/app/api/memory/edit/route/server-reference-manifest.json +4 -0
  73. package/.next/server/app/api/memory/edit/route.js +24 -0
  74. package/.next/server/app/api/memory/edit/route.js.map +5 -0
  75. package/.next/server/app/api/memory/edit/route.js.nft.json +1 -0
  76. package/.next/server/app/api/memory/{tidy → edit}/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/memory/route.js +6 -7
  78. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  79. package/.next/server/app/api/skills/[source]/[name]/route.js +3 -3
  80. package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
  81. package/.next/server/app/api/skills/route.js +3 -3
  82. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  83. package/.next/server/app/api/thursday/call/route.js +9 -7
  84. package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
  85. package/.next/server/app/api/thursday/skills/route.js +9 -7
  86. package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
  87. package/.next/server/app/api/thursday/tool-call/route.js +17 -15
  88. package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
  89. package/.next/server/app/api/workspace/route.js +4 -5
  90. package/.next/server/app/api/workspace/route.js.nft.json +1 -1
  91. package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +1 -1
  92. package/.next/server/app/artifact/[...path]/page.js +5 -6
  93. package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
  94. package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
  95. package/.next/server/app/favicon.ico/route.js +3 -4
  96. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  97. package/.next/server/app/favicon.ico.body +0 -0
  98. package/.next/server/app/page/server-reference-manifest.json +57 -90
  99. package/.next/server/app/page.js +10 -10
  100. package/.next/server/app/page.js.nft.json +1 -1
  101. package/.next/server/app/page_client-reference-manifest.js +1 -1
  102. package/.next/server/app-paths-manifest.json +5 -2
  103. package/.next/server/chunks/[externals]__0dzuk6_._.js +3 -0
  104. package/.next/server/chunks/[root-of-the-server]__01dkp4a._.js +3 -0
  105. package/.next/server/chunks/[root-of-the-server]__02va5wz._.js +1 -1
  106. package/.next/server/chunks/[root-of-the-server]__02xjoto._.js +3 -0
  107. package/.next/server/chunks/[root-of-the-server]__04q--0f._.js +8 -0
  108. package/.next/server/chunks/[root-of-the-server]__0bl-e63._.js +3 -0
  109. package/.next/server/chunks/[root-of-the-server]__0ce8nf8._.js +5 -0
  110. package/.next/server/chunks/[root-of-the-server]__0ffbg85._.js +3 -0
  111. package/.next/server/chunks/[root-of-the-server]__0j7z0r3._.js +12 -0
  112. package/.next/server/chunks/[root-of-the-server]__0jq4ohy._.js +8 -0
  113. package/.next/server/chunks/[root-of-the-server]__0ls6_8y._.js +8 -0
  114. package/.next/server/chunks/[root-of-the-server]__0ncs9uu._.js +3 -0
  115. package/.next/server/chunks/[root-of-the-server]__0pa2n68._.js +3 -0
  116. package/.next/server/chunks/[root-of-the-server]__0q0vvt2._.js +5 -0
  117. package/.next/server/chunks/[root-of-the-server]__1-ga0kh._.js +5 -0
  118. package/.next/server/chunks/[root-of-the-server]__11n256_._.js +5 -0
  119. package/.next/server/chunks/[root-of-the-server]__12cabg9._.js +3 -0
  120. package/.next/server/chunks/[root-of-the-server]__1339jnv._.js +8 -0
  121. package/.next/server/chunks/[root-of-the-server]__15bjnu5._.js +5 -0
  122. package/.next/server/chunks/[root-of-the-server]__18_teo8._.js +8 -0
  123. package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +5 -0
  124. package/.next/server/chunks/[root-of-the-server]__1anc1p9._.js +3 -0
  125. package/.next/server/chunks/[root-of-the-server]__1ccon1w._.js +5 -5
  126. package/.next/server/chunks/[root-of-the-server]__1fizn31._.js +3 -0
  127. package/.next/server/chunks/[root-of-the-server]__1llj3-b._.js +3 -0
  128. package/.next/server/chunks/[root-of-the-server]__1orn-5b._.js +12 -0
  129. package/.next/server/chunks/[root-of-the-server]__1p8m3f4._.js +3 -0
  130. package/.next/server/chunks/[root-of-the-server]__1wa1k7r._.js +8 -0
  131. package/.next/server/chunks/_0-73of8._.js +5 -5
  132. package/.next/server/chunks/_0-fjql4._.js +26 -0
  133. package/.next/server/chunks/_00xh_q0._.js +25 -0
  134. package/.next/server/chunks/_051qh8u._.js +3 -0
  135. package/.next/server/chunks/{node_modules_next_04q-o58._.js → _05dla15._.js} +2 -2
  136. package/.next/server/chunks/_05h2cii._.js +1 -1
  137. package/.next/server/chunks/_0c9j6rb._.js +49 -0
  138. package/.next/server/chunks/_0fzqt2y._.js +134 -0
  139. package/.next/server/chunks/{_0vnutv9._.js → _0ioz3nd._.js} +1 -1
  140. package/.next/server/chunks/_0iwfby5._.js +3 -0
  141. package/.next/server/chunks/_0mecv0f._.js +26 -0
  142. package/.next/server/chunks/_0mh8j4m._.js +3 -0
  143. package/.next/server/chunks/_0n74zsf._.js +4 -4
  144. package/.next/server/chunks/_0obojvv._.js +3 -0
  145. package/.next/server/chunks/_0recufk._.js +49 -0
  146. package/.next/server/chunks/_0rnf-6n._.js +4 -4
  147. package/.next/server/chunks/_0sb7tlz._.js +3 -0
  148. package/.next/server/chunks/_0u10wmw._.js +5 -5
  149. package/.next/server/chunks/_0u4aiy2._.js +3 -0
  150. package/.next/server/chunks/_0wp4le3._.js +1 -1
  151. package/.next/server/chunks/_0y5fg-x._.js +1 -1
  152. package/.next/server/chunks/_1230wbx._.js +10 -0
  153. package/.next/server/chunks/_12nheja._.js +3 -0
  154. package/.next/server/chunks/_13510xh._.js +3 -0
  155. package/.next/server/chunks/_15hq89o._.js +1 -1
  156. package/.next/server/chunks/_17l5ygt._.js +49 -0
  157. package/.next/server/chunks/_18-1wcc._.js +5 -5
  158. package/.next/server/chunks/_1_5mnq4._.js +4 -4
  159. package/.next/server/chunks/_1_9mjx-._.js +3 -0
  160. package/.next/server/chunks/{_0pppbb5._.js → _1c78vw5._.js} +166 -37
  161. package/.next/server/chunks/_1d0j961._.js +6 -0
  162. package/.next/server/chunks/_1d5zmy8._.js +1 -1
  163. package/.next/server/chunks/_1drgfx4._.js +4 -4
  164. package/.next/server/chunks/_1f46eie._.js +3 -0
  165. package/.next/server/chunks/_1h5_8sk._.js +3 -0
  166. package/.next/server/chunks/_1hdnxb7._.js +3 -0
  167. package/.next/server/chunks/_1j8k_j5._.js +3 -0
  168. package/.next/server/chunks/_1krd9rf._.js +3 -0
  169. package/.next/server/chunks/_1nc0eui._.js +11 -0
  170. package/.next/server/chunks/_1nula3v._.js +3 -0
  171. package/.next/server/chunks/_1pf4qe-._.js +3 -0
  172. package/.next/server/chunks/_1php4eq._.js +1 -1
  173. package/.next/server/chunks/_1qxheoa._.js +3 -0
  174. package/.next/server/chunks/_1x6kd1r._.js +3 -0
  175. package/.next/server/chunks/_1yuv4vp._.js +1 -1
  176. package/.next/server/chunks/_1zjrdag._.js +3 -0
  177. package/.next/server/chunks/_next-internal_server_app_api_bot_memory_files_route_actions_1_xd_8f.js +3 -0
  178. package/.next/server/chunks/_next-internal_server_app_api_bot_memory_route_actions_1a8xfr7.js +3 -0
  179. package/.next/server/chunks/_next-internal_server_app_api_llm-model_credits_route_actions_0v424pb.js +3 -0
  180. package/.next/server/chunks/_next-internal_server_app_api_llm-model_subscription_route_actions_0-udcm5.js +3 -0
  181. package/.next/server/chunks/_next-internal_server_app_api_memory_edit_route_actions_02sfnmr.js +3 -0
  182. package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
  183. package/.next/server/chunks/features_0rpfxbk._.js +3 -0
  184. package/.next/server/chunks/features_1qf3cei._.js +3 -0
  185. package/.next/server/chunks/features_bot_0zt92oh._.js +3 -0
  186. package/.next/server/chunks/features_bot_bot_query_ts_12mgkl2._.js +3 -0
  187. package/.next/server/chunks/features_memory_1uqvksn._.js +6 -0
  188. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0a1rd09._.js → node_modules_consola_dist_chunks_prompt_mjs_0i7cvml._.js} +1 -1
  189. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_06067w6._.js → node_modules_consola_dist_chunks_prompt_mjs_0icqaqw._.js} +1 -1
  190. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_096ais_._.js → node_modules_consola_dist_chunks_prompt_mjs_0r28-sm._.js} +1 -1
  191. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_02s3hjt._.js → node_modules_consola_dist_chunks_prompt_mjs_0v_7drq._.js} +1 -1
  192. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1xoq2rl._.js +3 -0
  193. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0tvkfgh._.js → node_modules_consola_dist_chunks_prompt_mjs_1y49572._.js} +1 -1
  194. package/.next/server/chunks/ssr/[root-of-the-server]__092knlj._.js +3 -0
  195. package/.next/server/chunks/ssr/[root-of-the-server]__09q9med._.js +1 -1
  196. package/.next/server/chunks/ssr/[root-of-the-server]__0hg5gib._.js +1 -1
  197. package/.next/server/chunks/ssr/[root-of-the-server]__0i8ie7f._.js +3 -0
  198. package/.next/server/chunks/ssr/{[root-of-the-server]__0jsmmb-._.js → [root-of-the-server]__0mz33a7._.js} +1 -1
  199. package/.next/server/chunks/ssr/[root-of-the-server]__0s9dq5u._.js +3 -0
  200. package/.next/server/chunks/ssr/{[root-of-the-server]__0m1b5ky._.js → [root-of-the-server]__0s9l2sv._.js} +1 -1
  201. package/.next/server/chunks/ssr/[root-of-the-server]__0tbkdlx._.js +3 -0
  202. package/.next/server/chunks/ssr/[root-of-the-server]__0vnmv-s._.js +3 -0
  203. package/.next/server/chunks/ssr/{[root-of-the-server]__0f6s48x._.js → [root-of-the-server]__0xpcv9w._.js} +3 -3
  204. package/.next/server/chunks/ssr/[root-of-the-server]__0xsog8n._.js +3 -0
  205. package/.next/server/chunks/ssr/[root-of-the-server]__0xtssj3._.js +1 -1
  206. package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +61 -0
  207. package/.next/server/chunks/ssr/[root-of-the-server]__15_uhip._.js +3 -0
  208. package/.next/server/chunks/ssr/[root-of-the-server]__16jc196._.js +1 -1
  209. package/.next/server/chunks/ssr/[root-of-the-server]__1gtlw6v._.js +43 -0
  210. package/.next/server/chunks/ssr/[root-of-the-server]__1mzi-ju._.js +1 -1
  211. package/.next/server/chunks/ssr/[root-of-the-server]__1ox7hbk._.js +4 -0
  212. package/.next/server/chunks/ssr/{[root-of-the-server]__1qfqvmg._.js → [root-of-the-server]__202p40z._.js} +2 -2
  213. package/.next/server/chunks/ssr/{_1mznrxk._.js → _001_ms1._.js} +3 -3
  214. package/.next/server/chunks/ssr/_01n3o0m._.js +3 -0
  215. package/.next/server/chunks/ssr/_0ap2fzn._.js +3 -0
  216. package/.next/server/chunks/ssr/_0fz4mf_._.js +3 -0
  217. package/.next/server/chunks/ssr/_0gb4gmf._.js +3 -0
  218. package/.next/server/chunks/ssr/_0h42fze._.js +3 -0
  219. package/.next/server/chunks/ssr/_0h7zdni._.js +1 -1
  220. package/.next/server/chunks/ssr/_0i_6q1w._.js +41 -0
  221. package/.next/server/chunks/ssr/_0ilna52._.js +42 -0
  222. package/.next/server/chunks/ssr/_0n3toaw._.js +3 -0
  223. package/.next/server/chunks/ssr/{_13punpm._.js → _0q0zan6._.js} +2 -2
  224. package/.next/server/chunks/ssr/{_077-g6s._.js → _0s99bgb._.js} +3 -3
  225. package/.next/server/chunks/ssr/_0zcjrbg._.js +3 -0
  226. package/.next/server/chunks/ssr/_0zhoc3r._.js +3 -0
  227. package/.next/server/chunks/ssr/{_1lip4th._.js → _1-_etts._.js} +2 -2
  228. package/.next/server/chunks/ssr/_1-teee5._.js +3 -3
  229. package/.next/server/chunks/ssr/_13fke0x._.js +3 -0
  230. package/.next/server/chunks/ssr/_15j2_8f._.js +3 -0
  231. package/.next/server/chunks/ssr/_1b2mjwr._.js +3 -0
  232. package/.next/server/chunks/ssr/{_09ja_w1._.js → _1f-dg-6._.js} +2 -2
  233. package/.next/server/chunks/ssr/_1fojd41._.js +4 -0
  234. package/.next/server/chunks/ssr/_1gd8q8l._.js +3 -0
  235. package/.next/server/chunks/ssr/{_1m3bsfr._.js → _1h0rw11._.js} +2 -2
  236. package/.next/server/chunks/ssr/_1jhd09t._.js +3 -0
  237. package/.next/server/chunks/ssr/{_040sk32._.js → _1lz_cq2._.js} +84 -88
  238. package/.next/server/chunks/ssr/_1nnsk7z._.js +3 -0
  239. package/.next/server/chunks/ssr/_1sji22n._.js +3 -0
  240. package/.next/server/chunks/ssr/{_0x_nu5e._.js → _1vi_uo7._.js} +2 -2
  241. package/.next/server/chunks/ssr/_1vyd1ji._.js +1 -1
  242. package/.next/server/chunks/ssr/features_bot_1s_-2vj._.js +3 -0
  243. package/.next/server/chunks/ssr/features_config_components_config-setting_tsx_0xfwqdg._.js +1 -1
  244. package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
  245. package/.next/server/chunks/ssr/{node_modules_0kxz4gt._.js → node_modules_00etblx._.js} +1 -1
  246. package/.next/server/chunks/ssr/{node_modules_18_dk7_._.js → node_modules_04jf_m8._.js} +1 -1
  247. package/.next/server/chunks/ssr/{node_modules_0_n241r._.js → node_modules_08dhkiq._.js} +1 -1
  248. package/.next/server/chunks/ssr/{node_modules_0n1kj4p._.js → node_modules_0940ns5._.js} +1 -1
  249. package/.next/server/chunks/ssr/{node_modules_17lrt3y._.js → node_modules_09q35v_._.js} +1 -1
  250. package/.next/server/chunks/ssr/{node_modules_1toafc-._.js → node_modules_0_-_a--._.js} +1 -1
  251. package/.next/server/chunks/ssr/{node_modules_0lrjk5t._.js → node_modules_0arus10._.js} +1 -1
  252. package/.next/server/chunks/ssr/{node_modules_04n7mjs._.js → node_modules_0b__sgl._.js} +1 -1
  253. package/.next/server/chunks/ssr/{node_modules_0iz1rzd._.js → node_modules_0cxaxk9._.js} +1 -1
  254. package/.next/server/chunks/ssr/{node_modules_0ndvxub._.js → node_modules_0g7fzk3._.js} +1 -1
  255. package/.next/server/chunks/ssr/{node_modules_0kl7-tn._.js → node_modules_0had7xd._.js} +1 -1
  256. package/.next/server/chunks/ssr/{node_modules_19dp7ko._.js → node_modules_0pvd7q-._.js} +1 -1
  257. package/.next/server/chunks/ssr/node_modules_0x3-ply._.js +3 -0
  258. package/.next/server/chunks/ssr/{node_modules_1dwguw_._.js → node_modules_0yugy6m._.js} +1 -1
  259. package/.next/server/chunks/ssr/{node_modules_004qlr4._.js → node_modules_14om4ar._.js} +1 -1
  260. package/.next/server/chunks/ssr/{node_modules_1q0p85z._.js → node_modules_14q6g4n._.js} +1 -1
  261. package/.next/server/chunks/ssr/node_modules_17bwo43._.js +55 -0
  262. package/.next/server/chunks/ssr/{node_modules_1hd-5tv._.js → node_modules_198nmll._.js} +1 -1
  263. package/.next/server/chunks/ssr/{node_modules_0m93zeg._.js → node_modules_1_pc9kq._.js} +1 -1
  264. package/.next/server/chunks/ssr/{node_modules_1n5ygqe._.js → node_modules_1aaxuef._.js} +1 -1
  265. package/.next/server/chunks/ssr/{node_modules_01qnv-a._.js → node_modules_1cx_ql6._.js} +1 -1
  266. package/.next/server/chunks/ssr/{node_modules_1zu988w._.js → node_modules_1cz2hle._.js} +1 -1
  267. package/.next/server/chunks/ssr/{node_modules_1xyd7ov._.js → node_modules_1efrqxi._.js} +1 -1
  268. package/.next/server/chunks/ssr/{node_modules_13r44jq._.js → node_modules_1eg7m6c._.js} +1 -1
  269. package/.next/server/chunks/ssr/{node_modules_08d8bke._.js → node_modules_1gdh31p._.js} +1 -1
  270. package/.next/server/chunks/ssr/{node_modules_1hn8z1f._.js → node_modules_1hpopmo._.js} +1 -1
  271. package/.next/server/chunks/ssr/{node_modules_20yebtj._.js → node_modules_1qpjvy5._.js} +1 -1
  272. package/.next/server/chunks/ssr/{node_modules_09xhur7._.js → node_modules_1vh5ntv._.js} +1 -1
  273. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0m9a4y0._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1b748ic._.js} +1 -1
  274. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_13w_wy9._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1z4hm5e._.js} +1 -1
  275. package/.next/server/chunks/ssr/node_modules_@vercel_oidc_dist_06mk8id._.js +3 -0
  276. package/.next/server/chunks/ssr/{node_modules_next_dist_0w6mzq5._.js → node_modules_next_dist_0drixxt._.js} +4 -4
  277. package/.next/server/chunks/ssr/node_modules_next_dist_1n3w9lb._.js +2 -2
  278. package/.next/server/instrumentation.js +1 -1
  279. package/.next/server/middleware-build-manifest.js +3 -3
  280. package/.next/server/pages/404.html +1 -1
  281. package/.next/server/pages/500.html +1 -1
  282. package/.next/server/server-reference-manifest.js +1 -1
  283. package/.next/server/server-reference-manifest.json +58 -91
  284. package/.next/static/chunks/00rd4-v8r7axp.js +1 -0
  285. package/.next/static/chunks/08qe4as2q428z.js +3 -0
  286. package/.next/static/chunks/{31ttnjt6g35a0.js → 0ev4hyghq0mbb.js} +1 -1
  287. package/.next/static/chunks/0fl3gwe4-l6tz.js +1 -0
  288. package/.next/static/chunks/0gnqdjn2lvdad.js +2 -0
  289. package/.next/static/chunks/0hwap1-p0m5sa.js +1 -0
  290. package/.next/static/chunks/0r5qcctujhxli.js +1 -0
  291. package/.next/static/chunks/0w52rrrmuj9r9.js +1 -0
  292. package/.next/static/chunks/{07kl352c-lvcz.js → 0wcprt5ot5she.js} +1 -1
  293. package/.next/static/chunks/10teww7wt-f6h.js +1 -0
  294. package/.next/static/chunks/15m575979un5f.js +38 -0
  295. package/.next/static/chunks/17p6tk6k88dq6.js +1 -0
  296. package/.next/static/chunks/{3_h9txt3tq8t8.js → 1dkjg87pxk0n9.js} +1 -1
  297. package/.next/static/chunks/1jd09sxcjddu1.js +1 -0
  298. package/.next/static/chunks/1kq8h8wi_e0bc.js +53 -0
  299. package/.next/static/chunks/{18vhba44l1fc9.js → 1w73ece_6bheu.js} +1 -1
  300. package/.next/static/chunks/{3ard_noqapnw1.js → 214ya3n5gxeih.js} +1 -1
  301. package/.next/static/chunks/22_zkas21rpna.js +1 -0
  302. package/.next/static/chunks/2h0sd2vumhb15.js +1 -0
  303. package/.next/static/chunks/2t4vhi3m8ahya.js +1 -0
  304. package/.next/static/chunks/2tigdtz3dpcy8.js +1 -0
  305. package/.next/static/chunks/2u7xt6mxg44lf.js +1 -0
  306. package/.next/static/chunks/39j0fvpybzabl.js +40 -0
  307. package/.next/static/chunks/3akmqm77muj4-.js +1 -0
  308. package/.next/static/chunks/3cq5g494yuke8.css +1 -0
  309. package/.next/static/chunks/3woj-xd7ki5_i.js +1 -0
  310. package/.next/static/chunks/3xk7yqgomx7yq.js +1 -0
  311. package/.next/static/chunks/3zmcsnuo25zvq.js +1 -0
  312. package/.next/static/media/favicon.37o1pjldwi2uc.ico +0 -0
  313. package/README.md +47 -22
  314. package/app/api/bot/memory/files/route.ts +14 -0
  315. package/app/api/bot/memory/route.ts +5 -0
  316. package/app/api/events/app-event.ts +3 -7
  317. package/app/api/llm-model/credits/route.ts +11 -0
  318. package/app/api/llm-model/route.ts +6 -1
  319. package/app/api/llm-model/subscription/route.ts +11 -0
  320. package/app/api/memory/edit/route.ts +7 -0
  321. package/app/api/memory/route.ts +21 -0
  322. package/app/api/query-key.ts +19 -4
  323. package/bin/port.mjs +65 -0
  324. package/bin/thursday.mjs +5 -33
  325. package/components/ui/shiny-text.tsx +48 -134
  326. package/database/migrations/{20260909060813_optimal_sabretooth → 20260910173049_numerous_spirit}/migration.sql +24 -34
  327. package/database/migrations/{20260909060813_optimal_sabretooth → 20260910173049_numerous_spirit}/snapshot.json +71 -145
  328. package/database/migrations/20260911030320_opposite_jack_power/migration.sql +1 -0
  329. package/database/migrations/{20260909063821_bitter_tenebrous → 20260911030320_opposite_jack_power}/snapshot.json +57 -184
  330. package/docs/how-it-works.md +11 -7
  331. package/docs/images/face-dark.png +0 -0
  332. package/docs/images/face-light.png +0 -0
  333. package/docs/images/keeps-going.png +0 -0
  334. package/features/ai/chatgpt.ts +639 -0
  335. package/features/ai/components/chatgpt-sign-in.tsx +66 -0
  336. package/features/ai/components/model-picker.tsx +17 -1
  337. package/features/ai/components/provider-icon.tsx +1 -0
  338. package/features/ai/load-tools.ts +78 -56
  339. package/features/ai/model.schema.ts +232 -34
  340. package/features/ai/model.ts +169 -24
  341. package/features/ai/prompts/bot.prompt.ts +207 -114
  342. package/features/ai/prompts/memory-edit.prompt.ts +33 -0
  343. package/features/ai/prompts/prompt-helper.ts +45 -26
  344. package/features/ai/prompts/thursday.prompt.ts +57 -27
  345. package/features/ai/tools/bot.tool.ts +35 -52
  346. package/features/ai/tools/connected.ts +17 -4
  347. package/features/ai/tools/memory.tool.ts +181 -117
  348. package/features/ai/tools/search.tool.ts +136 -47
  349. package/features/ai/tools/tool-name.ts +2 -6
  350. package/features/ai/tools/workspace.tool.ts +5 -1
  351. package/features/bot/bot.action.ts +14 -19
  352. package/features/bot/bot.memory.ts +89 -0
  353. package/features/bot/bot.query.ts +37 -57
  354. package/features/bot/bot.run.ts +512 -242
  355. package/features/bot/bot.runner.ts +434 -120
  356. package/features/bot/bot.schema.ts +104 -19
  357. package/features/bot/bot.seed.ts +89 -16
  358. package/features/bot/components/bot-mark.tsx +122 -20
  359. package/features/bot/components/bot-room.tsx +214 -132
  360. package/features/bot/components/bot-setting.tsx +790 -402
  361. package/features/bot/components/bot-tool.tsx +2 -7
  362. package/features/bot/components/mark-palette.tsx +54 -0
  363. package/features/bot/components/path-chips.tsx +1 -1
  364. package/features/bot/components/task-badge.tsx +26 -6
  365. package/features/bot/components/task-reply.tsx +22 -33
  366. package/features/bot/components/task-setting.tsx +20 -17
  367. package/features/bot/task.query.ts +240 -34
  368. package/features/bot/task.store.ts +76 -13
  369. package/features/config/components/config-setting.tsx +265 -34
  370. package/features/config/components/models-badge.tsx +42 -0
  371. package/features/config/config.action.ts +12 -0
  372. package/features/config/config.const.ts +38 -2
  373. package/features/connectors/mcp.manager.ts +10 -2
  374. package/features/intro/components/intro.tsx +47 -46
  375. package/features/memory/components/memory-edit.tsx +340 -0
  376. package/features/memory/components/memory-setting.tsx +75 -77
  377. package/features/memory/memory.action.ts +3 -43
  378. package/features/memory/memory.edit.ts +87 -0
  379. package/features/memory/memory.query.ts +24 -42
  380. package/features/memory/memory.schema.ts +29 -106
  381. package/features/settings/components/settings.tsx +2 -0
  382. package/features/settings/settings.alert.ts +3 -1
  383. package/features/thursday/components/ascii-orb.tsx +106 -90
  384. package/features/thursday/components/boot.tsx +7 -0
  385. package/features/thursday/components/call-log.tsx +219 -92
  386. package/features/thursday/components/face.tsx +6 -4
  387. package/features/thursday/components/tab-state.tsx +97 -0
  388. package/features/thursday/components/thursday-mark.tsx +4 -1
  389. package/features/thursday/components/thursday-setting.tsx +17 -47
  390. package/features/thursday/components/thursday.tsx +208 -98
  391. package/features/thursday/thursday.action.ts +12 -17
  392. package/features/thursday/thursday.query.ts +61 -70
  393. package/features/thursday/thursday.schema.ts +20 -7
  394. package/features/thursday/tool-line.ts +85 -12
  395. package/features/thursday/use-thursday.ts +87 -60
  396. package/features/workspace/components/file-view.tsx +4 -2
  397. package/features/workspace/workspace.ts +110 -26
  398. package/lib/limits.ts +1 -1
  399. package/lib/oauth-page.ts +27 -0
  400. package/lib/realtime/openai.ts +2 -2
  401. package/lib/realtime/realtime.protocol.ts +1 -1
  402. package/lib/realtime/realtime.tap.ts +122 -0
  403. package/lib/sandbox.ts +59 -36
  404. package/package.json +1 -1
  405. package/skills/browser/SKILL.md +55 -34
  406. package/.next/server/app/api/bot/notes/route/app-paths-manifest.json +0 -3
  407. package/.next/server/app/api/bot/notes/route.js +0 -14
  408. package/.next/server/app/api/bot/notes/route_client-reference-manifest.js +0 -3
  409. package/.next/server/app/api/memory/tidy/route/app-paths-manifest.json +0 -3
  410. package/.next/server/app/api/memory/tidy/route.js +0 -22
  411. package/.next/server/app/api/memory/tidy/route.js.nft.json +0 -1
  412. package/.next/server/chunks/0d-b_next_dist_server_app-render_after-task-async-storage_external_0-exn7p.js +0 -3
  413. package/.next/server/chunks/[root-of-the-server]__0-npkh_._.js +0 -3
  414. package/.next/server/chunks/[root-of-the-server]__005var5._.js +0 -3
  415. package/.next/server/chunks/[root-of-the-server]__019dx9f._.js +0 -5
  416. package/.next/server/chunks/[root-of-the-server]__02_2sm-._.js +0 -5
  417. package/.next/server/chunks/[root-of-the-server]__04_8spk._.js +0 -3
  418. package/.next/server/chunks/[root-of-the-server]__05luceg._.js +0 -3
  419. package/.next/server/chunks/[root-of-the-server]__06t77t4._.js +0 -11
  420. package/.next/server/chunks/[root-of-the-server]__0bed6hu._.js +0 -8
  421. package/.next/server/chunks/[root-of-the-server]__0cro2dz._.js +0 -5
  422. package/.next/server/chunks/[root-of-the-server]__0dupqt7._.js +0 -5
  423. package/.next/server/chunks/[root-of-the-server]__0emr6go._.js +0 -3
  424. package/.next/server/chunks/[root-of-the-server]__0le4d-p._.js +0 -3
  425. package/.next/server/chunks/[root-of-the-server]__0m8ywyo._.js +0 -10
  426. package/.next/server/chunks/[root-of-the-server]__0nfuugi._.js +0 -5
  427. package/.next/server/chunks/[root-of-the-server]__0p32jfz._.js +0 -12
  428. package/.next/server/chunks/[root-of-the-server]__0phdgco._.js +0 -8
  429. package/.next/server/chunks/[root-of-the-server]__0wvgrsl._.js +0 -3
  430. package/.next/server/chunks/[root-of-the-server]__10qshki._.js +0 -3
  431. package/.next/server/chunks/[root-of-the-server]__11j52t0._.js +0 -5
  432. package/.next/server/chunks/[root-of-the-server]__1692zrv._.js +0 -3
  433. package/.next/server/chunks/[root-of-the-server]__16thabu._.js +0 -3
  434. package/.next/server/chunks/[root-of-the-server]__173nhwf._.js +0 -8
  435. package/.next/server/chunks/[root-of-the-server]__1_aoyr9._.js +0 -3
  436. package/.next/server/chunks/[root-of-the-server]__1bn73ih._.js +0 -10
  437. package/.next/server/chunks/[root-of-the-server]__1bqhuh9._.js +0 -8
  438. package/.next/server/chunks/[root-of-the-server]__1cqizfq._.js +0 -5
  439. package/.next/server/chunks/[root-of-the-server]__1e-ci13._.js +0 -3
  440. package/.next/server/chunks/[root-of-the-server]__1fboj2j._.js +0 -3
  441. package/.next/server/chunks/[root-of-the-server]__1lr7j9t._.js +0 -5
  442. package/.next/server/chunks/[root-of-the-server]__1oli73c._.js +0 -3
  443. package/.next/server/chunks/[root-of-the-server]__1txedx6._.js +0 -8
  444. package/.next/server/chunks/[root-of-the-server]__1untqv8._.js +0 -5
  445. package/.next/server/chunks/[root-of-the-server]__1zgpz1w._.js +0 -3
  446. package/.next/server/chunks/_00_584r._.js +0 -293
  447. package/.next/server/chunks/_012yhfm._.js +0 -39
  448. package/.next/server/chunks/_06mxlgn._.js +0 -3
  449. package/.next/server/chunks/_07rtlxv._.js +0 -3
  450. package/.next/server/chunks/_0a351g7._.js +0 -6
  451. package/.next/server/chunks/_0kjjmag._.js +0 -3
  452. package/.next/server/chunks/_0nn99o2._.js +0 -3
  453. package/.next/server/chunks/_0zuzmt_._.js +0 -39
  454. package/.next/server/chunks/_106co2o._.js +0 -3
  455. package/.next/server/chunks/_12bbv5i._.js +0 -100
  456. package/.next/server/chunks/_15q1pig._.js +0 -3
  457. package/.next/server/chunks/_19wg5yn._.js +0 -138
  458. package/.next/server/chunks/_1bt95p9._.js +0 -55
  459. package/.next/server/chunks/_1cbk7ms._.js +0 -26
  460. package/.next/server/chunks/_1drv2et._.js +0 -40
  461. package/.next/server/chunks/_1ic3bew._.js +0 -5
  462. package/.next/server/chunks/_1mxn_lb._.js +0 -3
  463. package/.next/server/chunks/_1rysr-r._.js +0 -10
  464. package/.next/server/chunks/_1u3rwbr._.js +0 -3
  465. package/.next/server/chunks/_1x7p319._.js +0 -6
  466. package/.next/server/chunks/_next-internal_server_app_api_bot_notes_route_actions_0qcsyu7.js +0 -3
  467. package/.next/server/chunks/_next-internal_server_app_api_memory_tidy_route_actions_0_cfuom.js +0 -3
  468. package/.next/server/chunks/features_bot_task_query_ts_11xuzl3._.js +0 -3
  469. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0gzvgfv._.js +0 -3
  470. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0vorg6w._.js +0 -3
  471. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1tpvamf._.js +0 -3
  472. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1vmaq9f._.js +0 -3
  473. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1y9-wcr._.js +0 -3
  474. package/.next/server/chunks/ssr/[externals]_node_crypto_1kn79-7._.js +0 -3
  475. package/.next/server/chunks/ssr/[root-of-the-server]__0iuoa-r._.js +0 -3
  476. package/.next/server/chunks/ssr/[root-of-the-server]__0un-erv._.js +0 -4
  477. package/.next/server/chunks/ssr/[root-of-the-server]__1-mnhyd._.js +0 -92
  478. package/.next/server/chunks/ssr/[root-of-the-server]__1bww500._.js +0 -3
  479. package/.next/server/chunks/ssr/[root-of-the-server]__1vcdast._.js +0 -3
  480. package/.next/server/chunks/ssr/[root-of-the-server]__1xwnu-h._.js +0 -3
  481. package/.next/server/chunks/ssr/_0-mc7ro._.js +0 -3
  482. package/.next/server/chunks/ssr/_01p5r6-._.js +0 -3
  483. package/.next/server/chunks/ssr/_03webdr._.js +0 -3
  484. package/.next/server/chunks/ssr/_09-0k3z._.js +0 -3
  485. package/.next/server/chunks/ssr/_0f_b_9s._.js +0 -3
  486. package/.next/server/chunks/ssr/_0fafgvl._.js +0 -3
  487. package/.next/server/chunks/ssr/_0sf1isi._.js +0 -3
  488. package/.next/server/chunks/ssr/_0su6_08._.js +0 -3
  489. package/.next/server/chunks/ssr/_0ti51xc._.js +0 -3
  490. package/.next/server/chunks/ssr/_0w5bgak._.js +0 -3
  491. package/.next/server/chunks/ssr/_0y84qo6._.js +0 -3
  492. package/.next/server/chunks/ssr/_1ciyoo3._.js +0 -3
  493. package/.next/server/chunks/ssr/_1e-dgz0._.js +0 -4
  494. package/.next/server/chunks/ssr/_1fq7zgb._.js +0 -3
  495. package/.next/server/chunks/ssr/_1g6l4uj._.js +0 -3
  496. package/.next/server/chunks/ssr/_1ruzehw._.js +0 -3
  497. package/.next/server/chunks/ssr/features_bot_components_bot-setting_tsx_01ajft6._.js +0 -4
  498. package/.next/server/chunks/ssr/features_config_components_14jqgy4._.js +0 -3
  499. package/.next/server/chunks/ssr/features_memory_components_memory-setting_tsx_0oa43sw._.js +0 -4
  500. package/.next/server/chunks/ssr/node_modules_zod_v4_classic_external_15fmmz3.js +0 -55
  501. package/.next/static/chunks/05b6nx_o3_f_n.js +0 -1
  502. package/.next/static/chunks/0dmns-gi0raa4.js +0 -1
  503. package/.next/static/chunks/0f9sq-7q_yxyl.js +0 -1
  504. package/.next/static/chunks/0oc4_xoia77dg.css +0 -1
  505. package/.next/static/chunks/0pheo8m3a-rzi.js +0 -1
  506. package/.next/static/chunks/19i8h2t-5evjx.js +0 -1
  507. package/.next/static/chunks/1c5fcj473025q.js +0 -1
  508. package/.next/static/chunks/1pi_hbmjw-f-z.js +0 -1
  509. package/.next/static/chunks/1twt6k09vg4np.js +0 -1
  510. package/.next/static/chunks/1ytnip8wdng93.js +0 -1
  511. package/.next/static/chunks/28gotuisldmom.js +0 -1
  512. package/.next/static/chunks/2998p0y7k1c8z.js +0 -3
  513. package/.next/static/chunks/29gyb3nubj51j.js +0 -53
  514. package/.next/static/chunks/2l233xfycjpd8.js +0 -1
  515. package/.next/static/chunks/2p5n7pa3c40t-.js +0 -2
  516. package/.next/static/chunks/2ru1q132af7h7.js +0 -1
  517. package/.next/static/chunks/2t8wqycwg3y04.js +0 -2
  518. package/.next/static/chunks/2uxum7qbyeyxd.js +0 -1
  519. package/.next/static/chunks/32z_ypgtchw48.js +0 -1
  520. package/.next/static/chunks/33pyjb3xd1iez.js +0 -1
  521. package/.next/static/chunks/3omud5xunrk1f.js +0 -1
  522. package/.next/static/chunks/42dnrkbph9e-1.js +0 -1
  523. package/.next/static/media/favicon.2vob68tjqpejf.ico +0 -0
  524. package/database/migrations/20260909063821_bitter_tenebrous/migration.sql +0 -1
  525. package/features/ai/prompts/memory-tidy.prompt.ts +0 -129
  526. package/features/ai/tools/tidy.tool.ts +0 -22
  527. package/features/bot/bot.notes.ts +0 -120
  528. package/features/memory/components/memory-tidy.tsx +0 -395
  529. package/features/memory/components/memory-view.tsx +0 -84
  530. package/features/memory/memory.tidy.ts +0 -332
  531. package/features/memory/tidy.query.ts +0 -135
  532. package/features/thursday/use-call-title.ts +0 -31
  533. /package/.next/server/app/api/bot/{notes → memory/files}/route/build-manifest.json +0 -0
  534. /package/.next/server/app/api/bot/{notes → memory/files}/route/server-reference-manifest.json +0 -0
  535. /package/.next/server/app/api/bot/{notes → memory/files}/route.js.map +0 -0
  536. /package/.next/server/app/api/{memory/tidy → bot/memory}/route/build-manifest.json +0 -0
  537. /package/.next/server/app/api/{memory/tidy → bot/memory}/route/server-reference-manifest.json +0 -0
  538. /package/.next/server/app/api/{memory/tidy → bot/memory}/route.js.map +0 -0
  539. /package/.next/static/{YR4NWcDDuzwLbTTU7U7Vr → kaTO0UHqF1bMnWgCDik2f}/_buildManifest.js +0 -0
  540. /package/.next/static/{YR4NWcDDuzwLbTTU7U7Vr → kaTO0UHqF1bMnWgCDik2f}/_clientMiddlewareManifest.js +0 -0
  541. /package/.next/static/{YR4NWcDDuzwLbTTU7U7Vr → kaTO0UHqF1bMnWgCDik2f}/_ssgManifest.js +0 -0
@@ -5,13 +5,17 @@ import { useRouter } from "next/navigation";
5
5
  import { type Ref, useEffect, useRef, useState } from "react";
6
6
  import { Button } from "@/components/ui/button";
7
7
  import { notify } from "@/components/ui/notify";
8
- import ShinyText from "@/components/ui/shiny-text";
8
+ import { ShinyText } from "@/components/ui/shiny-text";
9
9
  import TextType from "@/components/ui/text-type";
10
10
  import { APP_NAME } from "@/config";
11
11
  import { ModelPicker } from "@/features/ai/components/model-picker";
12
12
  import { type TextModelProviderId } from "@/features/ai/model.schema";
13
13
  import { DEFAULT_BOT } from "@/features/bot/bot.schema";
14
- import { BOT_SEEDS, type BotSeed } from "@/features/bot/bot.seed";
14
+ import {
15
+ BOT_SEEDS,
16
+ type BotSeed,
17
+ RECOMMENDED_SEEDS,
18
+ } from "@/features/bot/bot.seed";
15
19
  import { BotMark } from "@/features/bot/components/bot-mark";
16
20
  import { installSeedBots } from "@/features/bot/seed-bots";
17
21
  import {
@@ -60,9 +64,9 @@ export function Intro({
60
64
  const [keyed, setKeyed] = useState(ready);
61
65
  const [picks, setPicks] = useState<Record<string, Pick>>(() =>
62
66
  Object.fromEntries(
63
- BOT_SEEDS.map((seed) => [
67
+ RECOMMENDED_SEEDS.map((seed) => [
64
68
  seed.name,
65
- { on: Boolean(seed.recommended), provider: null, model: "" },
69
+ { on: true, provider: null, model: "" },
66
70
  ]),
67
71
  ),
68
72
  );
@@ -108,7 +112,7 @@ export function Intro({
108
112
  setGone(true);
109
113
  if (!keyed) return;
110
114
  installSeedBots(
111
- BOT_SEEDS.filter((seed) => picks[seed.name]?.on).map((seed) => ({
115
+ RECOMMENDED_SEEDS.filter((seed) => picks[seed.name]?.on).map((seed) => ({
112
116
  name: seed.name,
113
117
  // A half pick is not a model; the action falls back to the default
114
118
  provider: picks[seed.name]?.provider ?? null,
@@ -192,7 +196,7 @@ export function Intro({
192
196
 
193
197
  /** Step one: the three lines the call screen actually draws, no chat bubbles. */
194
198
  function FirstLook({ ink }: { ink: Ink }) {
195
- const crew = BOT_SEEDS.slice(0, 3);
199
+ const crew = RECOMMENDED_SEEDS;
196
200
 
197
201
  return (
198
202
  <div className="flex w-full flex-col items-center">
@@ -268,6 +272,9 @@ function KeyStep({
268
272
  );
269
273
  }
270
274
 
275
+ /** The first sentence of the app spells its number; past this the numeral is fine. */
276
+ const COUNT_WORD: Record<number, string> = { 1: "One", 2: "Two", 3: "Three" };
277
+
271
278
  /** This intro's colour for a seed (bot.seed rollSeedColors). */
272
279
  type Ink = (seed: BotSeed) => string | undefined;
273
280
 
@@ -288,17 +295,18 @@ function BotStep({
288
295
  ink: Ink;
289
296
  onPatch: (name: string, next: Partial<Pick>) => void;
290
297
  }) {
291
- const on = BOT_SEEDS.filter((seed) => picks[seed.name]?.on);
298
+ const on = RECOMMENDED_SEEDS.filter((seed) => picks[seed.name]?.on);
299
+ const rest = BOT_SEEDS.length - RECOMMENDED_SEEDS.length;
292
300
 
293
301
  return (
294
302
  <div className="flex w-full max-w-2xl flex-col items-center">
295
303
  <h1 className="text-center text-[30px] font-medium tracking-tight text-balance break-keep">
296
- {BOT_SEEDS.length === 1
304
+ {RECOMMENDED_SEEDS.length === 1
297
305
  ? "One bot comes with her."
298
- : `${BOT_SEEDS.length === 2 ? "Two" : BOT_SEEDS.length} bots come with her.`}
306
+ : `${COUNT_WORD[RECOMMENDED_SEEDS.length] ?? RECOMMENDED_SEEDS.length} bots come with her.`}
299
307
  </h1>
300
308
  <p className="mt-3 max-w-lg text-center text-[15px] leading-relaxed text-pretty text-muted-foreground break-keep">
301
- {BOT_SEEDS.length === 1
309
+ {RECOMMENDED_SEEDS.length === 1
302
310
  ? "It takes the work that would leave the call silent, and reports back."
303
311
  : "They take the work that would leave the call silent, and report back."}
304
312
  </p>
@@ -325,8 +333,6 @@ function BotStep({
325
333
  <ShinyText
326
334
  text="handed-over work shows up here"
327
335
  speed={2.2}
328
- color="var(--muted-foreground)"
329
- shineColor="var(--foreground)"
330
336
  className="font-mono text-[10.5px] leading-4"
331
337
  />
332
338
  </>
@@ -337,36 +343,45 @@ function BotStep({
337
343
  )}
338
344
  </span>
339
345
 
340
- {/* Two columns, the first seed across both: three seeds are two rows, not
341
- three, and the step stops scrolling on a short screen */}
342
- <div className="mt-4 grid w-full max-w-3xl grid-cols-2 items-start gap-2">
343
- {BOT_SEEDS.map((seed, index) => (
346
+ {/* One column: the rows are a hint tall now, and two columns made the same
347
+ three bots read as a grid of choices rather than the crew */}
348
+ <div className="mt-4 flex w-full max-w-lg flex-col gap-2">
349
+ {RECOMMENDED_SEEDS.map((seed) => (
344
350
  <SeedRow
345
351
  key={seed.name}
346
352
  seed={seed}
347
353
  pick={picks[seed.name]}
348
354
  ink={ink(seed)}
349
- className={index === 0 ? "col-span-2" : ""}
350
355
  onPatch={(next) => onPatch(seed.name, next)}
351
356
  />
352
357
  ))}
353
358
  </div>
359
+
360
+ {/* Says the rest exist without asking anything about them: which subject
361
+ bot someone wants is not answerable before they have used the app */}
362
+ {rest > 0 && (
363
+ <p className="mt-3.5 text-[13px] text-muted-foreground">
364
+ More wait in Settings › Bots.
365
+ </p>
366
+ )}
354
367
  </div>
355
368
  );
356
369
  }
357
370
 
358
- /** One seed bot row, on by default. The model is not prefilled; empty means the app default. */
371
+ /**
372
+ * One seed bot row, on by default, in the same shape the Bots section draws
373
+ * (bot-setting SeedPackage): face, name, and one line of hint that never wraps.
374
+ * The model is not prefilled; empty means the app default.
375
+ */
359
376
  function SeedRow({
360
377
  seed,
361
378
  pick,
362
379
  ink,
363
- className,
364
380
  onPatch,
365
381
  }: {
366
382
  seed: BotSeed;
367
383
  pick?: Pick;
368
384
  ink?: string;
369
- className?: string;
370
385
  onPatch: (next: Partial<Pick>) => void;
371
386
  }) {
372
387
  const on = Boolean(pick?.on);
@@ -374,21 +389,18 @@ function SeedRow({
374
389
  return (
375
390
  <div
376
391
  className={cn(
377
- // min-w-0: a grid track sizes to its content otherwise, and the example
378
- // line stops truncating and runs out of the card
379
- "min-w-0 rounded-2xl ring-1 transition-colors",
392
+ "min-w-0 rounded-xl ring-1 transition-colors",
380
393
  on ? "ring-foreground" : "ring-border/60",
381
- className,
382
394
  )}
383
395
  >
384
396
  <button
385
397
  type="button"
386
398
  onClick={() => onPatch({ on: !on })}
387
399
  aria-pressed={on}
388
- className="flex w-full items-center gap-3.5 rounded-2xl px-4 py-3 text-left outline-none focus-visible:ring-3 focus-visible:ring-ring/50"
400
+ className="flex w-full items-center gap-3 rounded-xl px-3.5 py-2.5 text-left outline-none focus-visible:ring-3 focus-visible:ring-ring/50"
389
401
  >
390
402
  <BotMark
391
- size={34}
403
+ size={28}
392
404
  seed={seed.name}
393
405
  vary={seed.name}
394
406
  color={ink}
@@ -399,40 +411,29 @@ function SeedRow({
399
411
  className={cn("shrink-0 transition-opacity", !on && "opacity-35")}
400
412
  />
401
413
 
402
- <span className="min-w-0 flex-1 space-y-0.5">
403
- <span className="block text-[15.5px] font-medium">{seed.name}</span>
404
- <span className="block text-[13px] leading-normal text-pretty text-muted-foreground break-keep">
405
- {seed.description}
414
+ <span className="min-w-0 flex-1 space-y-px">
415
+ <span className="block text-[14px] leading-[18px] font-medium">
416
+ {seed.name}
417
+ </span>
418
+ <span className="block truncate text-[12px] leading-[17px] text-muted-foreground">
419
+ {seed.hint}
406
420
  </span>
407
- {on ? (
408
- <ShinyText
409
- text={`“${seed.example}”`}
410
- speed={2.2}
411
- color="var(--muted-foreground)"
412
- shineColor="var(--foreground)"
413
- className="truncate font-mono text-[11px] leading-4"
414
- />
415
- ) : (
416
- <span className="block truncate font-mono text-[11px] leading-4 text-muted-foreground/50">
417
- off
418
- </span>
419
- )}
420
421
  </span>
421
422
 
422
423
  <span
423
424
  className={cn(
424
- "grid size-6 shrink-0 place-items-center rounded-full transition-colors",
425
+ "grid size-5 shrink-0 place-items-center rounded-full transition-colors",
425
426
  on
426
427
  ? "bg-foreground text-background"
427
428
  : "ring-1 ring-border/60 ring-inset",
428
429
  )}
429
430
  >
430
- {on && <Check className="size-3.5" />}
431
+ {on && <Check className="size-3" />}
431
432
  </span>
432
433
  </button>
433
434
 
434
435
  {on && (
435
- <div className="px-4 pb-3.5">
436
+ <div className="px-3.5 pb-3">
436
437
  <ModelPicker
437
438
  provider={pick?.provider ?? null}
438
439
  model={pick?.model ?? ""}
@@ -0,0 +1,340 @@
1
+ "use client";
2
+
3
+ import { useChat } from "@ai-sdk/react";
4
+ import { DefaultChatTransport, getToolName, isToolUIPart } from "ai";
5
+ import {
6
+ ArrowUp,
7
+ BookOpen,
8
+ Check,
9
+ ChevronDown,
10
+ Loader2,
11
+ Minus,
12
+ Pencil,
13
+ Plus,
14
+ X,
15
+ } from "lucide-react";
16
+ import { type FormEvent, useEffect, useRef, useState } from "react";
17
+ import { queryKey } from "@/app/api/query-key";
18
+ import { Button } from "@/components/ui/button";
19
+ import { ShinyText } from "@/components/ui/shiny-text";
20
+ import { ModelPicker } from "@/features/ai/components/model-picker";
21
+ import { ProviderIcon } from "@/features/ai/components/provider-icon";
22
+ import type { TextModelProviderId } from "@/features/ai/model.schema";
23
+ import { TOOL_NAMES } from "@/features/ai/tools/tool-name";
24
+ import type { MemoryNote } from "@/features/memory/memory.schema";
25
+ import { cn } from "@/lib/utils";
26
+
27
+ type KnownFact = { text: string; path: string };
28
+
29
+ /** How long a finished edit's lines stay up before they clear. */
30
+ const LINGER_MS = 4000;
31
+
32
+ /** One transport for every edit: the model rides on each request, not on the hook. */
33
+ const transport = new DefaultChatTransport({ api: queryKey.memoryEdit });
34
+
35
+ /**
36
+ * Editing memory in a line, floating over the panes above the rail. One send is
37
+ * one streamed run (memory.edit): the model writes with memory's own tools as it
38
+ * goes and each call is drawn as it arrives. Nothing about the exchange is kept —
39
+ * the next send starts clean — and the model is picked here, never saved.
40
+ */
41
+ export function MemoryEdit({ notes }: { notes: MemoryNote[] }) {
42
+ const [draft, setDraft] = useState("");
43
+ const [model, setModel] = useState<{
44
+ provider: TextModelProviderId | null;
45
+ model: string;
46
+ }>({ provider: null, model: "" });
47
+ const [picking, setPicking] = useState(false);
48
+ const {
49
+ messages,
50
+ sendMessage,
51
+ setMessages,
52
+ status,
53
+ stop,
54
+ error,
55
+ clearError,
56
+ } = useChat({ transport });
57
+
58
+ // A run nobody is looking at has nobody to show its lines to
59
+ const stopRef = useRef(stop);
60
+ stopRef.current = stop;
61
+ useEffect(
62
+ () => () => {
63
+ void stopRef.current();
64
+ },
65
+ [],
66
+ );
67
+
68
+ // Facts seen on screen, kept after they go so a finished change still reads as what it replaced
69
+ const seen = useRef(new Map<number, KnownFact>());
70
+ for (const note of notes) {
71
+ for (const fact of note.facts) {
72
+ seen.current.set(fact.id, { text: fact.text, path: note.path });
73
+ }
74
+ }
75
+
76
+ const running = status === "submitted" || status === "streaming";
77
+ const ready = Boolean(model.provider && model.model.trim());
78
+ const reply = [...messages]
79
+ .reverse()
80
+ .find((message) => message.role === "assistant");
81
+ const parts = reply?.parts ?? [];
82
+ const calls = parts.filter(isToolUIPart);
83
+ const words = parts
84
+ .flatMap((part) => (part.type === "text" ? [part.text] : []))
85
+ .join(" ")
86
+ .trim();
87
+ const failed =
88
+ Boolean(error) || calls.some((call) => call.state === "output-error");
89
+ const written = calls.filter(
90
+ (call) =>
91
+ call.state === "output-available" &&
92
+ getToolName(call) !== TOOL_NAMES.memory_recall,
93
+ ).length;
94
+
95
+ useEffect(() => {
96
+ if (status !== "ready" || failed || messages.length === 0) return;
97
+ const clear = setTimeout(() => setMessages([]), LINGER_MS);
98
+ return () => clearTimeout(clear);
99
+ }, [status, failed, messages.length, setMessages]);
100
+
101
+ const submit = (event: FormEvent) => {
102
+ event.preventDefault();
103
+ const said = draft.trim();
104
+ if (!said || !ready || running) return;
105
+ setDraft("");
106
+ setPicking(false);
107
+ clearError();
108
+ // One send is one run: nothing from the last one rides along
109
+ setMessages([]);
110
+ void sendMessage({ text: said }, { body: { model } });
111
+ };
112
+
113
+ const line = running ? (
114
+ <ShinyText text="Working on memory" className="text-xs" />
115
+ ) : error ? (
116
+ <span className="text-xs text-destructive">{error.message}</span>
117
+ ) : reply ? (
118
+ <span className="text-xs text-muted-foreground">
119
+ {words ||
120
+ (written === 0
121
+ ? "Nothing to change"
122
+ : written === 1
123
+ ? "1 change saved"
124
+ : `${written} changes saved`)}
125
+ </span>
126
+ ) : null;
127
+
128
+ return (
129
+ <div className="pointer-events-none absolute inset-x-0 bottom-18 z-10 flex justify-center px-8">
130
+ <div className="pointer-events-auto flex w-full max-w-120 flex-col items-center gap-2">
131
+ {picking && (
132
+ <div className="w-full rounded-xl bg-popover p-2 shadow-lg ring-1 ring-foreground/10">
133
+ <ModelPicker
134
+ provider={model.provider}
135
+ model={model.model}
136
+ unset="Provider"
137
+ onChange={setModel}
138
+ />
139
+ </div>
140
+ )}
141
+
142
+ {calls.length > 0 && (
143
+ <ul className="w-full divide-y divide-border/60 overflow-hidden rounded-xl bg-popover shadow-lg ring-1 ring-foreground/10">
144
+ {calls.map((call) => (
145
+ <ChangeRow
146
+ key={call.toolCallId}
147
+ name={getToolName(call)}
148
+ input={call.input}
149
+ state={call.state}
150
+ errorText={
151
+ call.state === "output-error" ? call.errorText : undefined
152
+ }
153
+ known={seen.current}
154
+ />
155
+ ))}
156
+ </ul>
157
+ )}
158
+
159
+ {line && <p className="max-w-full truncate px-1">{line}</p>}
160
+
161
+ <form
162
+ onSubmit={submit}
163
+ className="flex h-10 w-full items-center gap-1.5 rounded-xl bg-popover pr-1.5 pl-3.5 shadow-lg ring-1 ring-foreground/10"
164
+ >
165
+ <input
166
+ value={draft}
167
+ onChange={(event) => setDraft(event.target.value)}
168
+ disabled={running}
169
+ aria-label="Edit memory"
170
+ placeholder="Tell memory what changed"
171
+ className="min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground disabled:opacity-60"
172
+ />
173
+ <Button
174
+ type="button"
175
+ size="xs"
176
+ variant="ghost"
177
+ onClick={() => setPicking(!picking)}
178
+ className={cn("max-w-44", !ready && "text-muted-foreground")}
179
+ >
180
+ {ready && model.provider ? (
181
+ <>
182
+ <ProviderIcon provider={model.provider} className="size-3" />
183
+ <span className="truncate">{model.model}</span>
184
+ </>
185
+ ) : (
186
+ "Model"
187
+ )}
188
+ <ChevronDown className="text-muted-foreground" />
189
+ </Button>
190
+ <Button
191
+ type="submit"
192
+ size="icon-sm"
193
+ loading={running}
194
+ disabled={!draft.trim() || !ready || running}
195
+ aria-label="Send"
196
+ >
197
+ {!running && <ArrowUp />}
198
+ </Button>
199
+ </form>
200
+ </div>
201
+ </div>
202
+ );
203
+ }
204
+
205
+ type Change = {
206
+ kind: "Remember" | "Replace" | "Forget" | "Rename" | "Opened";
207
+ path: string;
208
+ lines: { before?: string; after?: string }[];
209
+ carried: boolean;
210
+ };
211
+
212
+ /** What a call does, read off its arguments — still arriving while it streams — and the facts the screen has shown. */
213
+ function describe(
214
+ name: string,
215
+ input: unknown,
216
+ known: Map<number, KnownFact>,
217
+ ): Change {
218
+ const args = (input ?? {}) as {
219
+ path?: string;
220
+ factIds?: (number | null | undefined)[] | null;
221
+ description?: string | null;
222
+ aliases?: (string | undefined)[] | null;
223
+ facts?:
224
+ | ({
225
+ text?: string;
226
+ replaces?: number | null;
227
+ alwaysLoad?: boolean | null;
228
+ } | null)[]
229
+ | null;
230
+ };
231
+
232
+ if (name === TOOL_NAMES.memory_recall) {
233
+ return { kind: "Opened", path: args.path ?? "", lines: [], carried: false };
234
+ }
235
+
236
+ if (name === TOOL_NAMES.memory_forget) {
237
+ const ids = (args.factIds ?? []).filter((id) => id != null);
238
+ const facts = ids.map((id) => known.get(id));
239
+ return {
240
+ kind: "Forget",
241
+ path: facts.find((fact) => fact)?.path ?? "",
242
+ lines: ids.map((id, index) => ({
243
+ before: facts[index]?.text ?? `Fact #${id}`,
244
+ })),
245
+ carried: false,
246
+ };
247
+ }
248
+
249
+ const facts = (args.facts ?? []).filter((fact) => fact != null);
250
+ const lines: Change["lines"] = facts.map((fact) =>
251
+ fact.replaces != null
252
+ ? {
253
+ before: known.get(fact.replaces)?.text ?? `Fact #${fact.replaces}`,
254
+ after: fact.text,
255
+ }
256
+ : { after: fact.text },
257
+ );
258
+ if (args.description) lines.push({ after: `“${args.description}”` });
259
+ const aliases = (args.aliases ?? []).filter(Boolean);
260
+ if (aliases.length) {
261
+ lines.push({
262
+ after: `Called ${aliases.map((alias) => `“${alias}”`).join(", ")}`,
263
+ });
264
+ }
265
+ return {
266
+ kind: facts.some((fact) => fact.replaces != null)
267
+ ? "Replace"
268
+ : facts.length
269
+ ? "Remember"
270
+ : "Rename",
271
+ path: args.path ?? "",
272
+ lines,
273
+ carried: facts.some((fact) => fact.alwaysLoad),
274
+ };
275
+ }
276
+
277
+ const GLYPHS = {
278
+ Remember: Plus,
279
+ Replace: Pencil,
280
+ Forget: Minus,
281
+ Rename: Pencil,
282
+ Opened: BookOpen,
283
+ } as const;
284
+
285
+ function ChangeRow({
286
+ name,
287
+ input,
288
+ state,
289
+ errorText,
290
+ known,
291
+ }: {
292
+ name: string;
293
+ input: unknown;
294
+ state: string;
295
+ errorText?: string;
296
+ known: Map<number, KnownFact>;
297
+ }) {
298
+ const change = describe(name, input, known);
299
+ const Glyph = GLYPHS[change.kind];
300
+ const broke = state === "output-error";
301
+ const done = state === "output-available";
302
+ return (
303
+ <li className="flex animate-in items-start gap-2.5 px-3 py-2.5 duration-200 fade-in slide-in-from-bottom-1">
304
+ <Glyph className="mt-1 size-3.5 shrink-0 text-muted-foreground" />
305
+ <div className="min-w-0 flex-1 space-y-0.5">
306
+ {change.lines.map((line, at) => (
307
+ <div key={`${change.kind}-${at}`}>
308
+ {line.before && (
309
+ <p className="text-[13px] leading-5 text-muted-foreground/60 line-through">
310
+ {line.before}
311
+ </p>
312
+ )}
313
+ {line.after && (
314
+ <p className="text-sm leading-5 text-foreground/90">
315
+ {line.after}
316
+ </p>
317
+ )}
318
+ </div>
319
+ ))}
320
+ <p className="pt-0.5 font-mono text-[11px] text-muted-foreground">
321
+ {change.kind}
322
+ {change.path && ` · ${change.path}`}
323
+ {change.carried && " · carried into every call"}
324
+ </p>
325
+ {broke && errorText && (
326
+ <p className="text-xs text-destructive">{errorText}</p>
327
+ )}
328
+ </div>
329
+ <span className="mt-0.5 flex size-5 shrink-0 items-center justify-center text-muted-foreground">
330
+ {broke ? (
331
+ <X className="size-3.5 text-destructive" />
332
+ ) : done ? (
333
+ <Check className="size-3.5" />
334
+ ) : (
335
+ <Loader2 className="size-3.5 animate-spin" />
336
+ )}
337
+ </span>
338
+ </li>
339
+ );
340
+ }