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
@@ -131,3 +131,125 @@ export function createAudioTap(): RealtimeAudio & {
131
131
  },
132
132
  };
133
133
  }
134
+
135
+ /** What a face moves with on one frame (createVoiceFollower). */
136
+ export type VoiceFrame = {
137
+ /** How far into its own range the voice is now, 0..1; 0 in silence. */
138
+ level: number;
139
+ /** `level` over about half a second: the phrase rather than the syllable. */
140
+ phrase: number;
141
+ /** Strength of a syllable that started on this frame; 0 when none did. */
142
+ onset: number;
143
+ /** Each band inside its own range, low to high; one the voice never reaches stays 0. */
144
+ bands: number[];
145
+ };
146
+
147
+ /** Seconds, except where a line says otherwise. */
148
+ const FOLLOW = {
149
+ /** A band's ceiling jumps to a new peak and sinks back over `ceilRelease`. */
150
+ ceilAttack: 0.03,
151
+ ceilRelease: 2.5,
152
+ /** Its floor drops to the quiet between syllables and creeps back up over `floorRise`. */
153
+ floorFall: 0.12,
154
+ floorRise: 3,
155
+ /** A band whose range is narrower than this (0..1) carries no shape. */
156
+ minSpan: 0.12,
157
+ /** Mean band level (0..1) across which silence turns into voice. */
158
+ quietBelow: 0.03,
159
+ voicedAbove: 0.12,
160
+ fast: 0.05,
161
+ mid: 0.22,
162
+ phrase: 0.45,
163
+ /** A syllable: the fast level rises this far over the mid one, past `onsetMin`, at most once per `onsetGap`. */
164
+ onsetRise: 0.1,
165
+ onsetMin: 0.3,
166
+ onsetGap: 0.12,
167
+ };
168
+
169
+ /**
170
+ * Reads the voice's bands the way a face needs them. A voice is loud and narrow:
171
+ * its bands sit near the top and lean the same way for a whole sentence, so a
172
+ * face driven by them directly stays swollen and still. Here each band is
173
+ * followed inside its own recent range — the quiet between syllables is its
174
+ * floor, the syllables its ceiling — so the face moves with the words whatever
175
+ * the voice or its volume. One per face; it keeps state between frames.
176
+ */
177
+ export function createVoiceFollower() {
178
+ const ceil = new Array<number>(SPECTRUM_BANDS).fill(0);
179
+ const floor = new Array<number>(SPECTRUM_BANDS).fill(0);
180
+ const frame: VoiceFrame = {
181
+ level: 0,
182
+ phrase: 0,
183
+ onset: 0,
184
+ bands: new Array<number>(SPECTRUM_BANDS).fill(0),
185
+ };
186
+ let fast = 0;
187
+ let mid = 0;
188
+ let sinceOnset = Number.POSITIVE_INFINITY;
189
+
190
+ const toward = (from: number, to: number, seconds: number, dt: number) =>
191
+ from + (to - from) * Math.min(1, dt / seconds);
192
+
193
+ return {
194
+ /** Call once per frame with the seconds since the last call. The frame returned is reused. */
195
+ read(input: ArrayLike<number>, dt: number): VoiceFrame {
196
+ let total = 0;
197
+ let within = 0;
198
+ let ranged = 0;
199
+ for (let k = 0; k < SPECTRUM_BANDS; k++) {
200
+ const x = input[k] ?? 0;
201
+ total += x;
202
+ ceil[k] = toward(
203
+ ceil[k],
204
+ x,
205
+ x > ceil[k] ? FOLLOW.ceilAttack : FOLLOW.ceilRelease,
206
+ dt,
207
+ );
208
+ floor[k] = toward(
209
+ floor[k],
210
+ x,
211
+ x < floor[k] ? FOLLOW.floorFall : FOLLOW.floorRise,
212
+ dt,
213
+ );
214
+ const span = ceil[k] - floor[k];
215
+ const at =
216
+ span > FOLLOW.minSpan
217
+ ? Math.min(1, Math.max(0, (x - floor[k]) / span))
218
+ : 0;
219
+ frame.bands[k] = at;
220
+ if (span > FOLLOW.minSpan) {
221
+ within += at;
222
+ ranged++;
223
+ }
224
+ }
225
+
226
+ const mean = total / SPECTRUM_BANDS;
227
+ const edge = Math.min(
228
+ 1,
229
+ Math.max(
230
+ 0,
231
+ (mean - FOLLOW.quietBelow) / (FOLLOW.voicedAbove - FOLLOW.quietBelow),
232
+ ),
233
+ );
234
+ const voiced = edge * edge * (3 - 2 * edge);
235
+ for (let k = 0; k < SPECTRUM_BANDS; k++) frame.bands[k] *= voiced;
236
+
237
+ frame.level = (ranged ? within / ranged : 0) * voiced;
238
+ fast = toward(fast, frame.level, FOLLOW.fast, dt);
239
+ mid = toward(mid, frame.level, FOLLOW.mid, dt);
240
+ frame.phrase = toward(frame.phrase, frame.level, FOLLOW.phrase, dt);
241
+
242
+ sinceOnset += dt;
243
+ frame.onset = 0;
244
+ if (
245
+ fast > mid + FOLLOW.onsetRise &&
246
+ fast > FOLLOW.onsetMin &&
247
+ sinceOnset > FOLLOW.onsetGap
248
+ ) {
249
+ sinceOnset = 0;
250
+ frame.onset = Math.min(1, fast);
251
+ }
252
+ return frame;
253
+ },
254
+ };
255
+ }
package/lib/sandbox.ts CHANGED
@@ -1,17 +1,10 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
3
3
  import { join, resolve as pathResolve, relative, sep } from "node:path";
4
+ import { EXEC_KILL_GRACE_MS, EXEC_TIMEOUT_MS } from "@/config";
4
5
 
5
6
  export type ExecResult = { stdout: string; stderr: string; exitCode: number };
6
7
 
7
- /**
8
- * How long one command may run before its process group is killed. Nobody is
9
- * watching the shell, so a command waiting on a prompt would otherwise hang
10
- * the job; anything that legitimately runs longer belongs in the background.
11
- * Named because the shell guide states it to the model (ai/tools/workspace.tool).
12
- */
13
- export const EXEC_TIMEOUT_MS = 180_000;
14
-
15
8
  export interface Sandbox {
16
9
  /** Absolute. Relative paths resolve from here */
17
10
  readonly cwd: string;
@@ -61,6 +54,25 @@ const IGNORE = new Set([
61
54
  "coverage",
62
55
  ]);
63
56
 
57
+ /**
58
+ * Every file under `dir`, skipping dot entries and the folders a build or a
59
+ * package manager fills (IGNORE). A folder that cannot be read yields nothing.
60
+ */
61
+ export async function* walkFiles(dir: string): AsyncGenerator<string> {
62
+ let entries;
63
+ try {
64
+ entries = await readdir(dir, { withFileTypes: true });
65
+ } catch {
66
+ return;
67
+ }
68
+ for (const e of entries) {
69
+ if (IGNORE.has(e.name) || e.name.startsWith(".")) continue;
70
+ const full = join(dir, e.name);
71
+ if (e.isDirectory()) yield* walkFiles(full);
72
+ else if (e.isFile()) yield full;
73
+ }
74
+ }
75
+
64
76
  /**
65
77
  * Environment for every shell the agent runs: nobody watches it, so no pager
66
78
  * may stall it, and secrets do not travel to children. playwright-cli runs
@@ -108,21 +120,6 @@ export const createSandBox = ({
108
120
  const res = (p: string) =>
109
121
  p.startsWith("/") || /^[A-Za-z]:/.test(p) ? p : pathResolve(cwd, p);
110
122
 
111
- async function* walk(dir: string): AsyncGenerator<string> {
112
- let entries;
113
- try {
114
- entries = await readdir(dir, { withFileTypes: true });
115
- } catch {
116
- return;
117
- }
118
- for (const e of entries) {
119
- if (IGNORE.has(e.name) || e.name.startsWith(".")) continue;
120
- const full = join(dir, e.name);
121
- if (e.isDirectory()) yield* walk(full);
122
- else if (e.isFile()) yield full;
123
- }
124
- }
125
-
126
123
  // A very simple glob → regex. Only **/, * and ? are supported
127
124
  const globToRe = (g: string) =>
128
125
  new RegExp(
@@ -155,7 +152,7 @@ export const createSandBox = ({
155
152
  const root = res(path);
156
153
  const re = globToRe(pattern);
157
154
  const out: string[] = [];
158
- for await (const f of walk(root)) {
155
+ for await (const f of walkFiles(root)) {
159
156
  const rel = relative(root, f).split(sep).join("/");
160
157
  if (re.test(rel) || re.test(f)) out.push(f);
161
158
  if (out.length >= limit) break;
@@ -180,28 +177,26 @@ export const createSandBox = ({
180
177
  child.stdout?.on("data", (d) => (stdout += d));
181
178
  child.stderr?.on("data", (d) => (stderr += d));
182
179
 
183
- const stop = (why: string) => {
184
- stderr += `\n[${why}]`;
180
+ const group = (name: NodeJS.Signals) => {
185
181
  try {
186
182
  // A negative pid means the group: the shell and everything under it
187
- if (child.pid) process.kill(-child.pid, "SIGTERM");
183
+ if (child.pid) process.kill(-child.pid, name);
188
184
  } catch {
189
185
  // Already gone, or no process groups on this platform
190
- child.kill("SIGTERM");
186
+ child.kill(name);
191
187
  }
192
188
  };
193
189
 
194
- const timer = setTimeout(
195
- () => stop(`Timed out after ${timeoutMs}ms`),
196
- timeoutMs,
197
- );
198
-
199
- const onAbort = () => stop("Aborted");
200
- if (signal?.aborted) onAbort();
201
- else signal?.addEventListener("abort", onAbort, { once: true });
190
+ let settled = false;
191
+ let killing: ReturnType<typeof setTimeout> | undefined;
192
+ let letGo: ReturnType<typeof setTimeout> | undefined;
202
193
 
203
194
  const done = async (result: ExecResult) => {
195
+ if (settled) return;
196
+ settled = true;
204
197
  clearTimeout(timer);
198
+ clearTimeout(killing);
199
+ clearTimeout(letGo);
205
200
  signal?.removeEventListener("abort", onAbort);
206
201
  resolve({
207
202
  ...result,
@@ -210,6 +205,34 @@ export const createSandBox = ({
210
205
  });
211
206
  };
212
207
 
208
+ const stop = (why: string) => {
209
+ if (killing || settled) return;
210
+ stderr += `\n[${why}]`;
211
+ group("SIGTERM");
212
+ // A command that ignores SIGTERM would hold its step, and everything
213
+ // waiting on the job, for good (config EXEC_KILL_GRACE_MS)
214
+ killing = setTimeout(() => {
215
+ stderr += "\n[Killed: it did not exit on SIGTERM]";
216
+ group("SIGKILL");
217
+ // Output held open by a process that left the group never closes;
218
+ // what arrived by now is the result
219
+ letGo = setTimeout(() => {
220
+ child.stdout?.destroy();
221
+ child.stderr?.destroy();
222
+ void done({ stdout, stderr, exitCode: -1 });
223
+ }, 1_000);
224
+ }, EXEC_KILL_GRACE_MS);
225
+ };
226
+
227
+ const timer = setTimeout(
228
+ () => stop(`Timed out after ${timeoutMs}ms`),
229
+ timeoutMs,
230
+ );
231
+
232
+ const onAbort = () => stop("Aborted");
233
+ if (signal?.aborted) onAbort();
234
+ else signal?.addEventListener("abort", onAbort, { once: true });
235
+
213
236
  child.on("close", (code) =>
214
237
  done({ stdout, stderr, exitCode: code ?? -1 }),
215
238
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thursday-agent",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "A voice agent that runs on your own machine — talk to her, she hands the slow work to bots with a shell, a browser and skills.",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: browser
3
- description: "Any browser and anything on the web — a page, a click, a form, a sign-in, a tab. Open a page and read it, fill a form, sign in, download, screenshot, print a page or an HTML file to PDF. This opens a real window on their screen, and it is how a browser is reached even when one is already running on their Mac (`attach`) — a browser is never driven by clicking it through the machine. A page that wants a sign-in is still this skill's job: the user signs in themselves, in the window this opens."
3
+ description: "Any browser and anything on the web — a page, a click, a form, a sign-in, a tab. Open a page and read it, fill a form, sign in, download, screenshot, print a page or an HTML file to PDF. It can put a real window on their screen to show them the thing itself — an order at checkout, a map, a page — and it is how a browser is reached even when one is already running on their Mac (`attach`) — a browser is never driven by clicking it through the machine. A page that wants a sign-in is still this skill's job: a kept session, the browser they are already in, or the window this opens in front of them."
4
4
  allowed-tools: Bash(playwright-cli:*) Bash(npx:*) Bash(npm:*)
5
5
  ---
6
6
 
@@ -15,8 +15,8 @@ Everything the app has to say about the browser is here; the prompts do not
15
15
  repeat it.
16
16
 
17
17
  **Every browser goes through here.** A job that names a browser, a site, a URL,
18
- a sign-in or a tab is this one's. The window `playwright-cli` opens is a real
19
- one on their screen — they can watch it and type into it. Never drive Chrome by
18
+ a sign-in or a tab is this one's. With `--headed` the window `playwright-cli`
19
+ opens is a real one on their screen — they can watch it and type into it. Never drive Chrome by
20
20
  clicking it through the machine (`osascript`, `peekaboo`, System Events): that
21
21
  window cannot be snapshotted or acted on by ref. For the browser they already
22
22
  have open — a tab they left, a profile they are signed into — attach instead:
@@ -24,13 +24,27 @@ have open — a tab they left, a profile they are signed into — attach instead
24
24
 
25
25
  **Your browser is this job's own.** Its session is already in your shell
26
26
  (`PLAYWRIGHT_CLI_SESSION`): never pass `-s=`, never `close-all` or `kill-all` —
27
- other jobs are running theirs. The server closes yours when the job ends.
28
-
29
- **Headless unless they should see it.** Add `--headed` when the window is the
30
- point a sign-in, something they asked to watch and say so in your
31
- `description`. A site that will want a session before it shows you anything a
32
- shop, a console, a dashboard, an account page starts `--headed --persistent`
33
- rather than finding out headless and starting over.
27
+ other jobs are running theirs.
28
+
29
+ **Headless is yours; headed is theirs.** A browser opens headless: nobody sees
30
+ it, and the app closes it when the job ends. `--headed` puts a real window on
31
+ their screen, and that window outlives the job the app never closes it, they
32
+ do. So you can show them the thing itself instead of describing it: the order
33
+ sitting at checkout for them to confirm, the map with the pin dropped, the page
34
+ they asked to watch, a sign-in for them to finish. Open it `--headed`, leave it
35
+ open, and say in your answer that it is on their screen. A window you opened
36
+ headed only to get past a wall and are done with, `close` yourself. Only a job
37
+ they cancel or delete takes its windows with it.
38
+
39
+ **A payment is theirs to press.** Take a purchase, a top-up or a subscription
40
+ as far as the last screen before money moves, open it `--headed`, and answer
41
+ with what it buys, for how much, and that the pay button is on their screen.
42
+ That is the job done, not stopped — never press it yourself, whatever the
43
+ request said.
44
+
45
+ A site that will want a session before it shows you anything — a shop, a
46
+ console, a dashboard, an account page — starts `--headed --persistent` rather
47
+ than finding out headless and starting over.
34
48
 
35
49
  **Blocked, not broken.** A 403, an "access denied" page, a wall about automated
36
50
  traffic is refusing the headless browser, not the job. `close`, then
@@ -39,29 +53,36 @@ most of it, and is worth trying before you conclude anything about the site.
39
53
  Still refused after that, the wall is real: say so in your report, with the url
40
54
  and whatever you did bring back.
41
55
 
42
- **A sign-in is not a wall.** The user is at this screen and signs in
43
- themselves, in a window you put in front of them. Never type a password, a
44
- one-time code, or answer a passkey prompt — not with `fill`, `type` or `eval`.
45
- An email or username they gave you is not a secret: fill it, press next, stop
46
- at the password. When you do not have it, look before you ask — `memory_recall`
47
- the note for that site or account carries the address they use; only when it is
48
- nowhere does the sign-in go back to them. When a page wants the secret half:
49
-
50
- ```bash
51
- playwright-cli close
52
- playwright-cli open <the login url> --headed --persistent
53
- ```
54
-
55
- Open the login page itself, not the front door. Then `ask_thursday` in one
56
- linewhat to sign into, that the window is open — with options
57
- `Signed in` / `Not now`, and stop. The window stays open while the job waits.
58
- When the answer comes back, continue from a fresh `snapshot`. A captcha is the
59
- same move. Never `show` it blocks waiting for annotations nobody will send.
60
-
61
- **Keep a sign-in for the next job.** After one succeeds:
62
- `state-save .auth/<site>.json`. Before a site that will want one, `ls .auth/`
63
- and `state-load .auth/<site>.json` if its file is there. These files never go
64
- in a report.
56
+ **A sign-in is a fork, not a wall.** Four ways through, and which one fits is
57
+ yours to read off the job:
58
+
59
+ - **A session you already kept.** `ls <your folder>/.auth/`, then `state-load`
60
+ that file and `goto` the site cookies without a reload leave the signed-out
61
+ page that was already drawn, which reads as an expired session when it is not.
62
+ Cheapest when it works, so look before anything else.
63
+ - **The browser they are already in.** `attach --cdp=chrome` carries their own
64
+ profile and whatever it is signed into.
65
+ - **They sign in themselves.** `open <the login url> --headed --persistent` —
66
+ the login page, not the front door then `ask_thursday` in one line saying
67
+ what to sign into and that the window is open, options `Signed in` / `Not
68
+ now`, and stop. The window stays open while the job waits; continue from a
69
+ fresh `snapshot` when the answer comes. A captcha is the same move. Not
70
+ `show`it blocks waiting for annotations nobody will send.
71
+ - **You have the credentials.** Ask before you use them: `ask_thursday` in one
72
+ line naming the account, options `Sign in with it` / `I'll do it`, and on the
73
+ second take the fork above. An answer to your own sign-in question is the
74
+ exception — credentials given there are already the yes, so type them.
75
+
76
+ The line is where the secret comes from, not what kind it is: never guess,
77
+ invent, or go looking for one somewhere they did not point you at. An email or
78
+ username they gave you is not a secret — fill it and press next. `memory_recall`
79
+ the note for that site when you are missing the address they use.
80
+
81
+ **Keep a sign-in for the next job.** `mkdir -p <your folder>/.auth` and
82
+ `state-save` into it after one succeeds — your own folder, the one your
83
+ instructions name, because a session is yours across jobs and the workspace root
84
+ is nobody's. Say that you kept it: it signs every later job in as them, which is
85
+ theirs to want or not. These files never go in a report.
65
86
 
66
87
  **Reading a page.** Every command writes a snapshot file and prints its path.
67
88
  `find "Create Key"` returns only the matching nodes with a few lines around
@@ -87,7 +108,7 @@ A click that seems to do nothing may have opened a tab: `tab-list`,
87
108
  `goto http://127.0.0.1:48800/<file>.html`; `pdf --filename=out.pdf` prints
88
109
  it. Kill the server when done.
89
110
 
90
- Snapshots land in `.playwright-cli/` and are cleared after an hour. A file you
111
+ Snapshots land in `.playwright-cli/` and are cleared after a few days. A file you
91
112
  name — `--filename=`, a `pdf`, a download — goes under `scratch/`, or
92
113
  `artifacts/` when it is the result.
93
114
 
@@ -1,3 +0,0 @@
1
- {
2
- "/api/bot/notes/route": "app/api/bot/notes/route.js"
3
- }
@@ -1,14 +0,0 @@
1
- var R=require("../../../../chunks/[turbopack]_runtime.js")("server/app/api/bot/notes/route.js")
2
- R.c("server/chunks/node_modules_consola_dist_chunks_prompt_mjs_02s3hjt._.js")
3
- R.c("server/chunks/_106co2o._.js")
4
- R.c("server/chunks/_1php4eq._.js")
5
- R.c("server/chunks/[root-of-the-server]__005var5._.js")
6
- R.c("server/chunks/[root-of-the-server]__0-npkh_._.js")
7
- R.c("server/chunks/[root-of-the-server]__02_2sm-._.js")
8
- R.c("server/chunks/lib_logger_ts_1exwjut._.js")
9
- R.c("server/chunks/_1_5mnq4._.js")
10
- R.c("server/chunks/node_modules_next_dist_0r-70fd._.js")
11
- R.c("server/chunks/node_modules_zod_v4_1cha_bw._.js")
12
- R.c("server/chunks/_next-internal_server_app_api_bot_notes_route_actions_0qcsyu7.js")
13
- R.m(956206)
14
- module.exports=R.m(956206).exports
@@ -1,3 +0,0 @@
1
- globalThis.__RSC_MANIFEST = globalThis.__RSC_MANIFEST || {};
2
- globalThis.__RSC_MANIFEST["/api/bot/notes/route"] = {"moduleLoading":{"prefix":""},"clientModules":{},"ssrModuleMapping":{},"edgeSSRModuleMapping":{},"rscModuleMapping":{},"edgeRscModuleMapping":{},"entryCSSFiles":{},"entryJSFiles":{}};
3
-
@@ -1,3 +0,0 @@
1
- {
2
- "/api/memory/tidy/route": "app/api/memory/tidy/route.js"
3
- }
@@ -1,22 +0,0 @@
1
- var R=require("../../../../chunks/[turbopack]_runtime.js")("server/app/api/memory/tidy/route.js")
2
- R.c("server/chunks/[root-of-the-server]__0emr6go._.js")
3
- R.c("server/chunks/[root-of-the-server]__0bed6hu._.js")
4
- R.c("server/chunks/_0a351g7._.js")
5
- R.c("server/chunks/[root-of-the-server]__0-npkh_._.js")
6
- R.c("server/chunks/_1d5zmy8._.js")
7
- R.c("server/chunks/_1php4eq._.js")
8
- R.c("server/chunks/[root-of-the-server]__005var5._.js")
9
- R.c("server/chunks/node_modules_next_dist_0r-70fd._.js")
10
- R.c("server/chunks/[root-of-the-server]__1untqv8._.js")
11
- R.c("server/chunks/_1_5mnq4._.js")
12
- R.c("server/chunks/_0zuzmt_._.js")
13
- R.c("server/chunks/lib_logger_ts_1exwjut._.js")
14
- R.c("server/chunks/node_modules_zod_v4_0ubdflj._.js")
15
- R.c("server/chunks/[root-of-the-server]__02_2sm-._.js")
16
- R.c("server/chunks/_07rtlxv._.js")
17
- R.c("server/chunks/_1drv2et._.js")
18
- R.c("server/chunks/node_modules_@ai-sdk_1o5ydf6._.js")
19
- R.c("server/chunks/_1v9r2ke._.js")
20
- R.c("server/chunks/_next-internal_server_app_api_memory_tidy_route_actions_0_cfuom.js")
21
- R.m(245204)
22
- module.exports=R.m(245204).exports