thursday-agent 0.17.2 → 0.18.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 (362) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +1 -0
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/routes-manifest.json +6 -0
  6. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  7. package/.next/server/app/_global-error.html +1 -1
  8. package/.next/server/app/_global-error.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  13. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/_not-found.html +1 -1
  15. package/.next/server/app/_not-found.rsc +2 -2
  16. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  17. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  18. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  19. package/.next/server/app/api/artifact/route.js +7 -7
  20. package/.next/server/app/api/artifact/route.js.nft.json +1 -1
  21. package/.next/server/app/api/bot/memory/files/route.js +4 -4
  22. package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
  23. package/.next/server/app/api/bot/memory/route.js +1 -1
  24. package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
  25. package/.next/server/app/api/bot/route.js +1 -1
  26. package/.next/server/app/api/bot/route.js.nft.json +1 -1
  27. package/.next/server/app/api/bot/thread/[id]/route.js +1 -1
  28. package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -1
  29. package/.next/server/app/api/bot/thread/file/route/app-paths-manifest.json +3 -0
  30. package/.next/server/app/api/bot/thread/file/route/build-manifest.json +12 -0
  31. package/.next/server/app/api/bot/thread/file/route/server-reference-manifest.json +4 -0
  32. package/.next/server/app/api/bot/thread/file/route.js +29 -0
  33. package/.next/server/app/api/bot/thread/file/route.js.map +5 -0
  34. package/.next/server/app/api/bot/thread/file/route.js.nft.json +1 -0
  35. package/.next/server/app/api/bot/thread/file/route_client-reference-manifest.js +3 -0
  36. package/.next/server/app/api/bot/thread/route.js +1 -1
  37. package/.next/server/app/api/bot/thread/route.js.nft.json +1 -1
  38. package/.next/server/app/api/config/route.js +1 -1
  39. package/.next/server/app/api/config/route.js.nft.json +1 -1
  40. package/.next/server/app/api/events/route.js +2 -2
  41. package/.next/server/app/api/events/route.js.nft.json +1 -1
  42. package/.next/server/app/api/favicon/[host]/route.js.nft.json +1 -1
  43. package/.next/server/app/api/file/[...path]/route.js +4 -4
  44. package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
  45. package/.next/server/app/api/llm-model/automatic/route.js +1 -1
  46. package/.next/server/app/api/llm-model/automatic/route.js.nft.json +1 -1
  47. package/.next/server/app/api/llm-model/catalog/route.js +1 -1
  48. package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
  49. package/.next/server/app/api/llm-model/credits/route.js +1 -1
  50. package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -1
  51. package/.next/server/app/api/llm-model/route.js +1 -1
  52. package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
  53. package/.next/server/app/api/llm-model/subscription/route.js +1 -1
  54. package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -1
  55. package/.next/server/app/api/mcp/[name]/route.js +1 -1
  56. package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
  57. package/.next/server/app/api/mcp/oauth/callback/route.js +2 -2
  58. package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
  59. package/.next/server/app/api/mcp/route.js +1 -1
  60. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  61. package/.next/server/app/api/mcp/tools/route.js +1 -1
  62. package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
  63. package/.next/server/app/api/memory/edit/route.js +1 -1
  64. package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
  65. package/.next/server/app/api/memory/route.js +1 -1
  66. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  67. package/.next/server/app/api/reach/route.js +1 -1
  68. package/.next/server/app/api/reach/route.js.nft.json +1 -1
  69. package/.next/server/app/api/routine/route.js +1 -1
  70. package/.next/server/app/api/routine/route.js.nft.json +1 -1
  71. package/.next/server/app/api/signins/route.js +1 -1
  72. package/.next/server/app/api/signins/route.js.nft.json +1 -1
  73. package/.next/server/app/api/skills/[source]/[name]/route.js +1 -1
  74. package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
  75. package/.next/server/app/api/skills/route.js +1 -1
  76. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  77. package/.next/server/app/api/thursday/call/end/route.js +1 -1
  78. package/.next/server/app/api/thursday/call/end/route.js.nft.json +1 -1
  79. package/.next/server/app/api/thursday/call/route.js +1 -1
  80. package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
  81. package/.next/server/app/api/thursday/settings/route.js +1 -1
  82. package/.next/server/app/api/thursday/settings/route.js.nft.json +1 -1
  83. package/.next/server/app/api/thursday/text/route.js +1 -1
  84. package/.next/server/app/api/thursday/text/route.js.nft.json +1 -1
  85. package/.next/server/app/api/thursday/tool-call/route.js +1 -1
  86. package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
  87. package/.next/server/app/api/workspace/files/route.js +1 -1
  88. package/.next/server/app/api/workspace/files/route.js.nft.json +1 -1
  89. package/.next/server/app/api/workspace/route.js +1 -1
  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 +94 -6
  92. package/.next/server/app/artifact/[...path]/page.js +9 -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.nft.json +1 -1
  96. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  97. package/.next/server/app/page/server-reference-manifest.json +161 -128
  98. package/.next/server/app/page.js +9 -9
  99. package/.next/server/app/page.js.nft.json +1 -1
  100. package/.next/server/app/page_client-reference-manifest.js +1 -1
  101. package/.next/server/app-paths-manifest.json +1 -0
  102. package/.next/server/chunks/{[externals]__12stas-._.js → [externals]__178rv3v._.js} +1 -1
  103. package/.next/server/chunks/[root-of-the-server]__00qyw01._.js +1 -1
  104. package/.next/server/chunks/[root-of-the-server]__02ra64t._.js +5 -0
  105. package/.next/server/chunks/[root-of-the-server]__03xamry._.js +1 -1
  106. package/.next/server/chunks/[root-of-the-server]__04hhvpu._.js +7 -0
  107. package/.next/server/chunks/[root-of-the-server]__05dp5tr._.js +1 -1
  108. package/.next/server/chunks/[root-of-the-server]__0bqveex._.js +1 -1
  109. package/.next/server/chunks/{[root-of-the-server]__1_h4hf9._.js → [root-of-the-server]__0brmiv2._.js} +4 -4
  110. package/.next/server/chunks/[root-of-the-server]__0gvdr2h._.js +5 -0
  111. package/.next/server/chunks/[root-of-the-server]__0h656y-._.js +1 -1
  112. package/.next/server/chunks/[root-of-the-server]__0lvjz0b._.js +5 -0
  113. package/.next/server/chunks/[root-of-the-server]__0mgyt8p._.js +1 -1
  114. package/.next/server/chunks/[root-of-the-server]__0mrk2it._.js +1 -1
  115. package/.next/server/chunks/[root-of-the-server]__0my9geo._.js +3 -0
  116. package/.next/server/chunks/[root-of-the-server]__0qdoc_9._.js +5 -0
  117. package/.next/server/chunks/[root-of-the-server]__0sm5xvm._.js +1 -1
  118. package/.next/server/chunks/[root-of-the-server]__0v_kuor._.js +5 -0
  119. package/.next/server/chunks/[root-of-the-server]__1-rmal0._.js +1 -1
  120. package/.next/server/chunks/[root-of-the-server]__13hng6h._.js +1 -1
  121. package/.next/server/chunks/[root-of-the-server]__1_04mcf._.js +2 -2
  122. package/.next/server/chunks/[root-of-the-server]__1ceammd._.js +1 -1
  123. package/.next/server/chunks/[root-of-the-server]__1dth047._.js +5 -0
  124. package/.next/server/chunks/[root-of-the-server]__1etbk64._.js +3 -0
  125. package/.next/server/chunks/[root-of-the-server]__1izes4_._.js +7 -0
  126. package/.next/server/chunks/[root-of-the-server]__1ksm9m-._.js +12 -0
  127. package/.next/server/chunks/[root-of-the-server]__1m_dmf6._.js +5 -0
  128. package/.next/server/chunks/[root-of-the-server]__1mys2c3._.js +5 -0
  129. package/.next/server/chunks/[root-of-the-server]__1ndi14y._.js +1 -1
  130. package/.next/server/chunks/[root-of-the-server]__1p0njle._.js +5 -0
  131. package/.next/server/chunks/[root-of-the-server]__1p47fbb._.js +2 -2
  132. package/.next/server/chunks/[root-of-the-server]__1ygplx1._.js +1 -1
  133. package/.next/server/chunks/[root-of-the-server]__1zn039k._.js +1 -1
  134. package/.next/server/chunks/_01c32w9._.js +1 -1
  135. package/.next/server/chunks/_02bov6_._.js +1 -1
  136. package/.next/server/chunks/_06hnfi8._.js +2 -2
  137. package/.next/server/chunks/_06u9yo-._.js +1 -1
  138. package/.next/server/chunks/_07nxi75._.js +42 -41
  139. package/.next/server/chunks/_08354bn._.js +12 -11
  140. package/.next/server/chunks/{_08btiir._.js → _08_-9ay._.js} +3 -3
  141. package/.next/server/chunks/_08s4vft._.js +1 -1
  142. package/.next/server/chunks/_0bgjf07._.js +5 -0
  143. package/.next/server/chunks/_0fb6dvr._.js +1 -1
  144. package/.next/server/chunks/_0hgvg55._.js +1 -1
  145. package/.next/server/chunks/_0iw19ig._.js +1 -1
  146. package/.next/server/chunks/_0poi1t2._.js +1 -1
  147. package/.next/server/chunks/_0srlnvd._.js +6 -6
  148. package/.next/server/chunks/_0t_7gji._.js +1 -1
  149. package/.next/server/chunks/_0uzj57i._.js +1 -1
  150. package/.next/server/chunks/_0wyh244._.js +112 -0
  151. package/.next/server/chunks/_0xygcxs._.js +42 -41
  152. package/.next/server/chunks/_1-sk_q4._.js +1 -1
  153. package/.next/server/chunks/_108gsm8._.js +2 -2
  154. package/.next/server/chunks/_136j09a._.js +5 -5
  155. package/.next/server/chunks/_15negpy._.js +2 -2
  156. package/.next/server/chunks/_1d7og_q._.js +1 -1
  157. package/.next/server/chunks/_1dxq827._.js +2 -2
  158. package/.next/server/chunks/_1e54wxa._.js +1 -1
  159. package/.next/server/chunks/_1gn2r2q._.js +6 -6
  160. package/.next/server/chunks/_1i3uucm._.js +1 -1
  161. package/.next/server/chunks/_1jvy78-._.js +5 -0
  162. package/.next/server/chunks/_1q6e56i._.js +6 -6
  163. package/.next/server/chunks/_1qgix-j._.js +1 -1
  164. package/.next/server/chunks/_1wwl_7o._.js +1 -1
  165. package/.next/server/chunks/_1y8w80a._.js +5 -5
  166. package/.next/server/chunks/_1yx285_._.js +3 -0
  167. package/.next/server/chunks/_20qn224._.js +3 -0
  168. package/.next/server/chunks/_211dn2c._.js +1 -1
  169. package/.next/server/chunks/_next-internal_server_app_api_bot_thread_file_route_actions_0q3be0o.js +3 -0
  170. package/.next/server/chunks/config_ts_1g4sz5o._.js +1 -1
  171. package/.next/server/chunks/features_bot_08z387_._.js +3 -3
  172. package/.next/server/chunks/features_workspace_workspace_ts_13h82gv._.js +3 -3
  173. package/.next/server/chunks/features_workspace_workspace_ts_1iyjroj._.js +3 -3
  174. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_04oxl25._.js → node_modules_consola_dist_chunks_prompt_mjs_0yd5xa0._.js} +1 -1
  175. package/.next/server/chunks/ssr/[root-of-the-server]__04upd5v._.js +1 -1
  176. package/.next/server/chunks/ssr/[root-of-the-server]__06knwl5._.js +3 -0
  177. package/.next/server/chunks/ssr/[root-of-the-server]__07ehpky._.js +3 -0
  178. package/.next/server/chunks/ssr/[root-of-the-server]__0h6jo0s._.js +3 -0
  179. package/.next/server/chunks/ssr/[root-of-the-server]__128hnrd._.js +3 -0
  180. package/.next/server/chunks/ssr/[root-of-the-server]__1867koj._.js +1 -1
  181. package/.next/server/chunks/ssr/[root-of-the-server]__1gzje-h._.js +3 -0
  182. package/.next/server/chunks/ssr/{[root-of-the-server]__1d7usu0._.js → [root-of-the-server]__1qn0axo._.js} +2 -2
  183. package/.next/server/chunks/ssr/[root-of-the-server]__1r7tj27._.js +3 -0
  184. package/.next/server/chunks/ssr/[root-of-the-server]__1tb5vve._.js +46 -0
  185. package/.next/server/chunks/ssr/{features_bot_1knyan7._.js → _07nmtxo._.js} +2 -2
  186. package/.next/server/chunks/ssr/{_10-_awu._.js → _0f9hx5p._.js} +2 -2
  187. package/.next/server/chunks/ssr/_0fo4552._.js +10 -9
  188. package/.next/server/chunks/ssr/{_123y-ah._.js → _0is8m6y._.js} +2 -2
  189. package/.next/server/chunks/ssr/{_17a4qyk._.js → _0ixe3g3._.js} +3 -3
  190. package/.next/server/chunks/ssr/_0j9vh-8._.js +3 -0
  191. package/.next/server/chunks/ssr/_0l7rjg5._.js +1 -1
  192. package/.next/server/chunks/ssr/{lib_logger_ts_0-olsze._.js → _0mfgsk-._.js} +4 -2
  193. package/.next/server/chunks/ssr/_0mpn6q0._.js +5 -0
  194. package/.next/server/chunks/ssr/{_0e2fnvg._.js → _0osvxkt._.js} +2 -2
  195. package/.next/server/chunks/ssr/_0p6w0ef._.js +3 -0
  196. package/.next/server/chunks/ssr/_0pbav_w._.js +3 -0
  197. package/.next/server/chunks/ssr/{_1aqjk-1._.js → _0wuvkqk._.js} +2 -2
  198. package/.next/server/chunks/ssr/_0x8ophf._.js +1 -1
  199. package/.next/server/chunks/ssr/_0x9f717._.js +60 -0
  200. package/.next/server/chunks/ssr/_1-41lck._.js +1 -1
  201. package/.next/server/chunks/ssr/_10jtmhl._.js +3 -0
  202. package/.next/server/chunks/ssr/{_0xfafez._.js → _12jv_41._.js} +2 -2
  203. package/.next/server/chunks/ssr/{_163dr78._.js → _165wnr4._.js} +2 -2
  204. package/.next/server/chunks/ssr/_16_7zeo._.js +3 -0
  205. package/.next/server/chunks/ssr/{_14oirtb._.js → _1_ogjze._.js} +2 -2
  206. package/.next/server/chunks/ssr/_1bfrntd._.js +6 -0
  207. package/.next/server/chunks/ssr/_1i2swyr._.js +3 -0
  208. package/.next/server/chunks/ssr/{_10_ph1t._.js → _1jd8rjm._.js} +2 -2
  209. package/.next/server/chunks/ssr/_1mdjoak._.js +162 -0
  210. package/.next/server/chunks/ssr/_1neoj22._.js +1 -1
  211. package/.next/server/chunks/ssr/{_1dfv66y._.js → _1oafxdu._.js} +2 -2
  212. package/.next/server/chunks/ssr/_1omom9y._.js +3 -0
  213. package/.next/server/chunks/ssr/_1pgxh81._.js +271 -0
  214. package/.next/server/chunks/ssr/{_0vo_oym._.js → _1r4mc3i._.js} +2 -2
  215. package/.next/server/chunks/ssr/_1soynbw._.js +6 -0
  216. package/.next/server/chunks/ssr/{_01al00i._.js → _1tx-2k7._.js} +2 -2
  217. package/.next/server/chunks/ssr/_1w899wx._.js +3 -0
  218. package/.next/server/chunks/ssr/_1xwtbdz._.js +3 -0
  219. package/.next/server/chunks/ssr/features_0796o8r._.js +1 -1
  220. package/.next/server/chunks/ssr/features_bot_0tb4ui-._.js +2 -2
  221. package/.next/server/chunks/ssr/features_bot_18gqkr_._.js +3 -0
  222. package/.next/server/chunks/ssr/{features_config_09n-q9q._.js → features_config_1ond01n._.js} +3 -3
  223. package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
  224. package/.next/server/chunks/ssr/features_memory_components_memory-setting_tsx_0oa43sw._.js +1 -1
  225. package/.next/server/chunks/ssr/features_routine_components_routine-setting_tsx_055fknz._.js +1 -1
  226. package/.next/server/chunks/ssr/features_workspace_workspace_ts_1wc7_u_._.js +4 -4
  227. package/.next/server/chunks/ssr/{node_modules_0msrhxf._.js → node_modules_004qt-z._.js} +1 -1
  228. package/.next/server/chunks/ssr/{node_modules_0q-klni._.js → node_modules_06m6e97._.js} +1 -1
  229. package/.next/server/chunks/ssr/{node_modules_13g-d25._.js → node_modules_09dy7tk._.js} +1 -1
  230. package/.next/server/chunks/ssr/{node_modules_0gd9hbz._.js → node_modules_0_hy3i2._.js} +1 -1
  231. package/.next/server/chunks/ssr/{node_modules_1gq3ght._.js → node_modules_0f485jl._.js} +1 -1
  232. package/.next/server/chunks/ssr/{node_modules_096up6a._.js → node_modules_0gbx70b._.js} +1 -1
  233. package/.next/server/chunks/ssr/{node_modules_13bqv6i._.js → node_modules_0i_v0-m._.js} +1 -1
  234. package/.next/server/chunks/ssr/{node_modules_04x5wyv._.js → node_modules_0lrn9ci._.js} +1 -1
  235. package/.next/server/chunks/ssr/{node_modules_0d6j33x._.js → node_modules_0lxwg2v._.js} +1 -1
  236. package/.next/server/chunks/ssr/{node_modules_113l3e5._.js → node_modules_0n2-p5q._.js} +1 -1
  237. package/.next/server/chunks/ssr/node_modules_0nj36zf._.js +3 -0
  238. package/.next/server/chunks/ssr/{node_modules_0cjnmzp._.js → node_modules_0ppirau._.js} +1 -1
  239. package/.next/server/chunks/ssr/{node_modules_0m73b88._.js → node_modules_0pw13ww._.js} +1 -1
  240. package/.next/server/chunks/ssr/node_modules_0qd7p5f._.js +3 -0
  241. package/.next/server/chunks/ssr/{node_modules_0nmkv-v._.js → node_modules_0upwx50._.js} +1 -1
  242. package/.next/server/chunks/ssr/{node_modules_0__0tvm._.js → node_modules_0v__o4h._.js} +1 -1
  243. package/.next/server/chunks/ssr/{node_modules_1k5i-_9._.js → node_modules_1-4q6is._.js} +1 -1
  244. package/.next/server/chunks/ssr/{node_modules_156kv_t._.js → node_modules_10mb0cv._.js} +1 -1
  245. package/.next/server/chunks/ssr/{node_modules_10_fv2a._.js → node_modules_16z7p8b._.js} +1 -1
  246. package/.next/server/chunks/ssr/{node_modules_1lmyts8._.js → node_modules_17o218r._.js} +1 -1
  247. package/.next/server/chunks/ssr/{node_modules_0k8-y89._.js → node_modules_1gpapfv._.js} +1 -1
  248. package/.next/server/chunks/ssr/{node_modules_1_8-jcj._.js → node_modules_1hdaxu9._.js} +1 -1
  249. package/.next/server/chunks/ssr/{node_modules_1ri_eip._.js → node_modules_1hjvwkh._.js} +1 -1
  250. package/.next/server/chunks/ssr/{node_modules_0nw5jz7._.js → node_modules_1j886a5._.js} +1 -1
  251. package/.next/server/chunks/ssr/{node_modules_1xb-ndg._.js → node_modules_1srjf5c._.js} +1 -1
  252. package/.next/server/chunks/ssr/{node_modules_1p_6sq7._.js → node_modules_1tus4vi._.js} +1 -1
  253. package/.next/server/chunks/ssr/{node_modules_021lid9._.js → node_modules_1tv_7lk._.js} +1 -1
  254. package/.next/server/chunks/ssr/{node_modules_1qstb1x._.js → node_modules_20448xv._.js} +1 -1
  255. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0amkw0b._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0lg9pkl._.js} +1 -1
  256. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0zq3l45._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1xgbf5j._.js} +1 -1
  257. package/.next/server/middleware-build-manifest.js +3 -3
  258. package/.next/server/middleware.js +1 -1
  259. package/.next/server/pages/404.html +1 -1
  260. package/.next/server/pages/500.html +1 -1
  261. package/.next/server/server-reference-manifest.js +1 -1
  262. package/.next/server/server-reference-manifest.json +205 -132
  263. package/.next/static/chunks/{166smhw8v-s3j.js → 05uvci-bk-vgp.js} +1 -1
  264. package/.next/static/chunks/09y_43y1cy5jw.js +1 -0
  265. package/.next/static/chunks/0_s4z70lx1tgs.js +1 -0
  266. package/.next/static/chunks/0oqviw3f55nfp.js +58 -0
  267. package/.next/static/chunks/0q9b2n6l4flqb.js +1 -0
  268. package/.next/static/chunks/0ruf3dqs--3ve.js +1 -0
  269. package/.next/static/chunks/0vggwjufw2-6r.js +1 -0
  270. package/.next/static/chunks/{3sla-dm1puqd1.js → 0x4m9nj2fazl2.js} +1 -1
  271. package/.next/static/chunks/{3t2c76awm9k_p.js → 1-1yfu34-3p2p.js} +1 -1
  272. package/.next/static/chunks/10oyyypxn_cpx.js +1 -0
  273. package/.next/static/chunks/{1cglo3a2mbeou.js → 17dx6w478vnb0.js} +1 -1
  274. package/.next/static/chunks/184-r80rv0xay.css +1 -0
  275. package/.next/static/chunks/1_hgdoungpm0o.js +1 -0
  276. package/.next/static/chunks/{0obogzscwwekj.js → 1dpg1u4a16ujt.js} +1 -1
  277. package/.next/static/chunks/{2qgkbdshzpq1c.js → 1h_6rh86q3i4p.js} +1 -1
  278. package/.next/static/chunks/{3b96xy59nl_gd.js → 1pe7i5yu779ta.js} +1 -1
  279. package/.next/static/chunks/{2zbl41hed17g3.js → 240nfv2dtidhc.js} +1 -1
  280. package/.next/static/chunks/{0uxq_vs6uxi-b.js → 27l8qwnk1j66z.js} +1 -1
  281. package/.next/static/chunks/2gxfy__ef51n9.js +3 -0
  282. package/.next/static/chunks/2kjwmo70judc2.js +15 -0
  283. package/.next/static/chunks/{3gsxnqqqphh-1.js → 2lzg4zedtmyic.js} +1 -1
  284. package/.next/static/chunks/2ug8q1x9e-_j6.js +1 -0
  285. package/.next/static/chunks/{01l7kw74vfp32.js → 2uk8rdtr-pk58.js} +1 -1
  286. package/.next/static/chunks/337g9g_ux2gj-.js +1 -0
  287. package/.next/static/chunks/{0o7o0eb7ihxi6.js → 396enq-m0sss5.js} +1 -1
  288. package/.next/static/chunks/{0p2f6uv4xytfm.js → 3r7u1y9xjoh-v.js} +1 -1
  289. package/.next/static/chunks/{3jtcieuk1l6tw.js → 3vg1-oc-zgw_7.js} +1 -1
  290. package/.next/static/chunks/40re_3ukjulg9.js +1 -0
  291. package/.next/static/chunks/41ztsnjn4qrn-.js +1 -0
  292. package/README.md +5 -5
  293. package/bin/autostart.mjs +32 -2
  294. package/bin/lock.mjs +85 -4
  295. package/bin/thursday.mjs +42 -15
  296. package/bin/tools.mjs +18 -1
  297. package/database/migrations/20260926021847_thread_cache_tokens/migration.sql +2 -0
  298. package/database/migrations/20260926021847_thread_cache_tokens/snapshot.json +1949 -0
  299. package/guide/bots.md +173 -317
  300. package/guide/calls.md +98 -146
  301. package/guide/index.md +2 -2
  302. package/guide/memory.md +14 -18
  303. package/guide/phone.md +86 -133
  304. package/guide/setup.md +127 -172
  305. package/guide/trouble.md +42 -65
  306. package/package.json +1 -1
  307. package/seed-skills/concierge/travel/scripts/itinerary.mjs +1 -1
  308. package/skills/artifact/runtime/shell/shell.js +32 -3
  309. package/.next/server/chunks/[root-of-the-server]__01ypm_z._.js +0 -3
  310. package/.next/server/chunks/[root-of-the-server]__021dkui._.js +0 -3
  311. package/.next/server/chunks/[root-of-the-server]__09gdscj._.js +0 -7
  312. package/.next/server/chunks/[root-of-the-server]__0ljizgj._.js +0 -5
  313. package/.next/server/chunks/[root-of-the-server]__0nmust6._.js +0 -5
  314. package/.next/server/chunks/[root-of-the-server]__0svzjwa._.js +0 -7
  315. package/.next/server/chunks/[root-of-the-server]__1c2kwku._.js +0 -12
  316. package/.next/server/chunks/[root-of-the-server]__1t02-1p._.js +0 -3
  317. package/.next/server/chunks/[root-of-the-server]__1t0jj1j._.js +0 -5
  318. package/.next/server/chunks/[root-of-the-server]__1vlxv19._.js +0 -5
  319. package/.next/server/chunks/_0j0-gq6._.js +0 -5
  320. package/.next/server/chunks/_0p6v1fr._.js +0 -5
  321. package/.next/server/chunks/_1ic3bew._.js +0 -5
  322. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0g87zst._.js +0 -3
  323. package/.next/server/chunks/ssr/[root-of-the-server]__0-af_o7._.js +0 -3
  324. package/.next/server/chunks/ssr/[root-of-the-server]__09f39cp._.js +0 -4
  325. package/.next/server/chunks/ssr/[root-of-the-server]__0ouu4qp._.js +0 -3
  326. package/.next/server/chunks/ssr/[root-of-the-server]__0q9g9ea._.js +0 -5
  327. package/.next/server/chunks/ssr/[root-of-the-server]__17h1ggo._.js +0 -46
  328. package/.next/server/chunks/ssr/[root-of-the-server]__1jyeu61._.js +0 -5
  329. package/.next/server/chunks/ssr/_0afrpci._.js +0 -3
  330. package/.next/server/chunks/ssr/_0bgse1c._.js +0 -162
  331. package/.next/server/chunks/ssr/_0qsmpcu._.js +0 -3
  332. package/.next/server/chunks/ssr/_0z38nha._.js +0 -3
  333. package/.next/server/chunks/ssr/_116lfdc._.js +0 -3
  334. package/.next/server/chunks/ssr/_14dfh7a._.js +0 -4
  335. package/.next/server/chunks/ssr/_17qtuv7._.js +0 -3
  336. package/.next/server/chunks/ssr/_1_5xof_._.js +0 -3
  337. package/.next/server/chunks/ssr/_1alxym6._.js +0 -3
  338. package/.next/server/chunks/ssr/_1ou5sj0._.js +0 -3
  339. package/.next/server/chunks/ssr/_1tmw842._.js +0 -5
  340. package/.next/server/chunks/ssr/_1uij_rj._.js +0 -3
  341. package/.next/server/chunks/ssr/_1w9w1ok._.js +0 -3
  342. package/.next/server/chunks/ssr/_20gq_24._.js +0 -3
  343. package/.next/server/chunks/ssr/features_bot_0ouemw8._.js +0 -3
  344. package/.next/server/chunks/ssr/node_modules_@base-ui_react_1j9i1ho._.js +0 -3
  345. package/.next/static/chunks/0a5_-jqhaktjj.js +0 -1
  346. package/.next/static/chunks/0npvak0wpgagb.js +0 -1
  347. package/.next/static/chunks/19l81deo_pyoc.js +0 -1
  348. package/.next/static/chunks/1bnhw-5fj7aiz.js +0 -1
  349. package/.next/static/chunks/1in6nxpu33iab.js +0 -1
  350. package/.next/static/chunks/1u7kg91f9qy3g.js +0 -1
  351. package/.next/static/chunks/1xv4g10m-cl1s.js +0 -1
  352. package/.next/static/chunks/2ajs12-fcdwzm.js +0 -1
  353. package/.next/static/chunks/2i7qtmxc1kuqg.js +0 -1
  354. package/.next/static/chunks/2kz1f6r59nky0.js +0 -3
  355. package/.next/static/chunks/31kn4_h2rvf6k.css +0 -1
  356. package/.next/static/chunks/35jj-5u4te56r.js +0 -1
  357. package/.next/static/chunks/37ixzapa06xlo.js +0 -1
  358. package/.next/static/chunks/3k1d8y03t5nax.js +0 -58
  359. package/.next/static/chunks/3yiqr95d7ybeq.js +0 -15
  360. /package/.next/static/{8I2hKtciyA9LXvd8txuOz → -IBxB5oqr6e3RuOCCmYtL}/_buildManifest.js +0 -0
  361. /package/.next/static/{8I2hKtciyA9LXvd8txuOz → -IBxB5oqr6e3RuOCCmYtL}/_clientMiddlewareManifest.js +0 -0
  362. /package/.next/static/{8I2hKtciyA9LXvd8txuOz → -IBxB5oqr6e3RuOCCmYtL}/_ssgManifest.js +0 -0
@@ -1,7 +1,7 @@
1
- module.exports=[652619,a=>a.a(async(b,c)=>{try{var d=a.i(666680),e=a.i(347299),f=a.i(345364),g=a.i(47919),h=a.i(868468),i=a.i(53112),j=a.i(569572),k=a.i(725466),l=a.i(176668),m=a.i(523095),n=a.i(293480),o=a.i(8412),p=a.i(182248),q=a.i(689656),r=b([k]);[k]=r.then?(await r)():r;let C="app_EMoamEEZ73f0CkXaXp7hrann",D="http://localhost:1455/auth/callback",E=["127.0.0.1","::1"],F="thursday",{apiKeyName:G,label:H}=q.TEXT_MODEL_PROVIDERS.chatgpt,I=`${H} is not signed in — sign in from Settings › API keys.`,J=i.z.object({access:i.z.string().min(1),refresh:i.z.string().min(1),expires:i.z.number(),accountId:i.z.string().min(1),plan:i.z.string().nullable()}),K=globalThis,L=K.__chatgptRenewal??=(0,o.createKeyedLock)();async function s(){t();let a=(0,d.randomBytes)(32).toString("base64url"),b=(0,d.randomBytes)(16).toString("hex"),c=[],f=(d,e)=>{u(d.url??"/",{state:b,verifier:a}).then(a=>{e.writeHead(a.status,{"content-type":"text/html; charset=utf-8"}),e.end((0,m.oauthPage)(a.title,a.detail,{autoClose:200===a.status}),()=>{a.last&&K.__chatgptListeners===c&&t()})})};for(let a of E){let b=(0,e.createServer)(f),d=await new Promise(c=>{b.once("error",c),b.listen(1455,a,()=>c(null))});if(!d){c.push(b);continue}if("EADDRNOTAVAIL"!==d.code&&"EAFNOSUPPORT"!==d.code){for(let a of c)a.close();(0,n.publicError)("EADDRINUSE"===d.code?"Port 1455 is in use by another app — often a ChatGPT or Codex sign-in still waiting. Finish or close it, then try again.":`Could not wait for the sign-in: ${(0,p.errorToString)(d)}`)}}K.__chatgptListeners=c,setTimeout(()=>{K.__chatgptListeners===c&&t()},j.CHATGPT_SIGN_IN.waitMs).unref();let g=new URL("https://auth.openai.com/oauth/authorize");return g.search=new URLSearchParams({response_type:"code",client_id:C,redirect_uri:D,scope:"openid profile email offline_access",code_challenge:(0,d.createHash)("sha256").update(a).digest("base64url"),code_challenge_method:"S256",state:b,id_token_add_organizations:"true",codex_cli_simplified_flow:"true",originator:F}).toString(),g.toString()}function t(){let a=K.__chatgptListeners;for(let b of(K.__chatgptListeners=null,a??[]))b.close(),b.closeIdleConnections()}async function u(a,b){let c=new URL(a,D);if("/auth/callback"!==c.pathname)return{status:404,title:"Not found",detail:"",last:!1};let d=c.searchParams.get("error");if(d){let a=c.searchParams.get("error_description");return{status:400,title:"Sign-in failed",detail:a?`${d}: ${a}`:d,last:!0}}let e=c.searchParams.get("code");if(!e||c.searchParams.get("state")!==b.state)return{status:400,title:"Sign-in failed",detail:"This is not the sign-in that was started. Start again from Settings › API keys.",last:!1};try{let a=await v({grant_type:"authorization_code",code:e,code_verifier:b.verifier,redirect_uri:D});return await (0,k.writeConfig)(G,JSON.stringify(a)),{status:200,title:"Signed in to ChatGPT",detail:"Bots can run on your plan now. This window closes itself.",last:!0}}catch(a){return l.logger.warn({cause:a},"chatgpt sign-in failed"),{status:502,title:"Sign-in failed",detail:(0,p.errorToString)(a),last:!0}}}async function v(a){let b=await fetch("https://auth.openai.com/oauth/token",{method:"POST",headers:{accept:"application/json","content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:C,...a})}).catch(a=>{l.logger.warn({cause:a},"chatgpt token endpoint unreachable"),(0,n.publicError)("Could not reach ChatGPT's sign-in")}),c=await b.json().catch(()=>null),d=c?.access_token;if(!b.ok||!d){let a=c?.error,d="string"==typeof a?[a,c?.error_description].filter(Boolean).join(": "):a?.message??a?.code??"";(0,n.publicError)(`ChatGPT's sign-in answered ${b.status}${d?`: ${d}`:""}`)}let e=function(a){try{let b=JSON.parse(Buffer.from(a.split(".")[1]??"","base64url").toString("utf8")),c=b["https://api.openai.com/auth"]??{};return{accountId:"string"==typeof c.chatgpt_account_id?c.chatgpt_account_id:null,plan:"string"==typeof c.chatgpt_plan_type?c.chatgpt_plan_type:null,expires:"number"==typeof b.exp?1e3*b.exp:null}}catch{return{accountId:null,plan:null,expires:null}}}(d),f=c?.refresh_token??a.refresh_token;e.accountId&&f||(0,n.publicError)("ChatGPT's sign-in came back without an account");let g=c?.expires_in;return{access:d,refresh:f,expires:"number"==typeof g?Date.now()+1e3*g:e.expires??Date.now(),accountId:e.accountId,plan:e.plan}}async function w(){let a=await (0,k.readConfig)(G);if(!a)return null;try{return J.parse(JSON.parse(a))}catch{return null}}let M=a=>a.expires-j.CHATGPT_SIGN_IN.renewBeforeMs<=Date.now();async function x(){let a=await w();return(a||(0,n.publicError)(I),M(a))?L(G,async()=>{let a=await w();if(a||(0,n.publicError)(I),!M(a))return a;try{let b=await v({grant_type:"refresh_token",refresh_token:a.refresh});return await (0,k.writeConfig)(G,JSON.stringify(b)),b}catch(a){(0,n.publicError)(`Could not renew the ${H} sign-in (${(0,p.errorToString)(a)}). If it keeps failing, sign in again from Settings › API keys.`)}}):a}async function y(){return(await w())?.plan??null}async function z(a,b){let c=await x(),d=new Headers(b?.headers);if(d.set("authorization",`Bearer ${c.access}`),d.set("chatgpt-account-id",c.accountId),d.set("originator",F),b?.method!=="POST"||"string"!=typeof b.body||!String(a).endsWith("/responses"))return fetch(a,{...b,headers:d});let e=JSON.parse(b.body),f=!0===e.stream,g=[];e.input=(e.input??[]).filter(a=>"system"!==a.role&&"developer"!==a.role||(g.push("string"==typeof a.content?a.content:(a.content??[]).map(a=>a.text??"").join("\n")),!1)),e.instructions=[e.instructions,...g].filter(Boolean).join("\n\n")||"You are a helpful assistant.",e.store=!1,e.stream=!0,e.max_output_tokens=void 0,d.set("accept","text/event-stream");let h=await fetch(a,{...b,headers:d,body:JSON.stringify(e)});return 429===h.status?A(h):f||!h.ok?h:B(h)}async function A(a){let b=await a.text(),c={};try{c=JSON.parse(b).error??{}}catch{}if(!/usage_limit_reached|usage_not_included/.test(`${c.code} ${c.type}`)){let c=a.headers.get("retry-after");return new Response(b,{status:429,headers:{"content-type":"application/json",...c?{"retry-after":c}:{}}})}let d=c.resets_at?1e3*c.resets_at:c.resets_in_seconds?Date.now()+1e3*c.resets_in_seconds:null,e=c.plan_type?` on the ${c.plan_type} plan`:"",f=d?` It resets in ${(0,h.formatDistanceToNowStrict)(d)}.`:"";return Response.json({error:{message:`${H} usage limit reached${e}.${f}`,code:c.code??c.type}},{status:402})}async function B(a){let b=[],c=null,d=null;for(let e of(await a.text()).replaceAll("\r\n","\n").split("\n\n")){let a,f=e.split("\n").filter(a=>a.startsWith("data:")).map(a=>a.slice(5).trimStart()).join("\n");if(f&&"[DONE]"!==f){try{a=JSON.parse(f)}catch{continue}"response.output_item.done"===a.type?b.push(a.item):"response.completed"===a.type||"response.incomplete"===a.type?c=a.response??{}:"response.failed"===a.type?d=a.response?.error??{message:"The response failed"}:"error"===a.type&&(d={code:a.code,message:a.message})}}return d||!c?Response.json({error:{message:d?.message??"The stream ended before the response finished",code:d?.code}},{status:d?.code==="context_length_exceeded"?400:500}):Response.json({...c,output:c.output?.length?c.output:b})}a.s(["chatGptModel",0,function(a){let b=(0,f.createOpenAI)({baseURL:"https://chatgpt.com/backend-api/codex",apiKey:"signed-in",headers:{"OpenAI-Beta":"responses=experimental"},fetch:z}),c=(0,d.randomUUID)();return(0,g.wrapLanguageModel)({model:b.responses(a),middleware:{transformParams:async({params:a})=>({...a,providerOptions:{...a.providerOptions,openai:{promptCacheKey:c,...a.providerOptions?.openai,store:!1,includeWebSearchSources:!1}}})}})},"chatGptSearch",0,()=>(0,f.createOpenAI)({apiKey:"signed-in"}).tools.webSearch(),"readChatGptPlan",0,y,"startChatGptSignIn",0,s]),c()}catch(a){c(a)}},!1),884780,a=>{"use strict";a.i(902157),a.i(912714);var b=a.i(750227),c=a.i(569572);(0,b.join)(c.APP_DIR,"guide");let d=".guide";a.s(["botGuideLine",0,()=>`How ${c.APP_NAME} itself works for the user — its screens and settings — is written under \`${d}/\` here, \`index.md\` first; read it only when the job is about the app.`,"guideLine",0,()=>`How ${c.APP_NAME} works for the person using it — its screens, its settings, what it connects to, what to do when something stops — is written under \`${d}/\` here, \`index.md\` first. Read it whenever an answer depends on how the app works: what can be asked for, where something is changed, a wish that needs a setting switched on, something that stopped or was refused. Answer from it rather than from what you assume.`])},738131,a=>a.a(async(b,c)=>{try{var d=a.i(527990),e=a.i(868468),f=a.i(569572),g=a.i(875931),h=a.i(938934),i=a.i(978876),j=a.i(375827),k=a.i(127507),l=a.i(467650),m=a.i(138902),n=a.i(345846),o=a.i(617594),p=a.i(622547),q=a.i(128232),r=a.i(382442),s=a.i(451017),t=a.i(762008),u=a.i(547613),v=a.i(446957),w=a.i(138100),x=a.i(821415),y=a.i(706210),z=a.i(176668),A=a.i(293480),B=a.i(987674),C=a.i(182248),D=b([g,i,m,n,o,p,q,s,w]);async function E(b){let{listThreadOverview:c}=await a.A(343064),d=await c();if(!d.length)return"No thread has been started yet.";let e=d.map(a=>`"${a.label}" (${a.bot}, ${a.status})`).join(", ");return`There is no thread called "${b}". The latest are: ${e}. Call again with one of those labels.`}async function F(a,b){let c=[];for(let[a,e]of Object.entries(b)){let b=await (0,d.asSchema)(e.inputSchema).jsonSchema,f="string"==typeof e.description?e.description:"";c.push({name:a,tokens:(0,B.estimateTokens)(f)+(0,B.estimateTokens)(JSON.stringify(b))})}c.sort((a,b)=>b.tokens-a.tokens);let e=c.reduce((a,b)=>a+b.tokens,0);z.logger.debug(`${a} tools ${e} tokens over ${c.length} — ${c.map(a=>`${a.name} ${a.tokens}`).join(", ")}`)}async function G(a){let b=await H(a);return f.IS_DEV&&await F(a.target,b),b}async function H(b){if("memory-edit"===b.target)return(0,n.createMemoryTools)("user",null,{countReads:!1});let c=(0,n.createMemoryTools)("call","thursday"===b.target?b.callId??null:null),z=await (0,x.openWorkspace)();if("thursday"===b.target){var B;let k,m,n=b.readSkills?(0,s.createSkillTools)({sandbox:z,skills:await (0,w.loadSkills)(z)}):{},q=!!(b.written&&b.model&&(0,g.seesToolImages)(b.model));return{...c,...n,...(0,u.createWorkspaceTools)(z,{write:!1,timeoutMs:f.CALL_EXEC_TIMEOUT_MS}),...!1===b.webSearch?{}:await (0,p.createCallSearchTool)(z),...Object.fromEntries(Object.entries((B=b.callId,k=async b=>{let{resolveThread:c}=await a.A(343064);return(b.trim()?await c(b.trim()):null)??await E(b)},m=async(b,c,d)=>{let e=await a.A(763543);try{return await e.answerThread(b,c,"thursday",d)}catch(a){if((0,A.isPublicError)(a))return a.message;throw a}},{[t.TOOL_NAMES.thread_start]:(0,d.tool)({description:i.threadStartSpec.description,inputSchema:i.threadStartSpec.parameters,execute:async({bot:b,request:c,label:d})=>{let{findJobBot:e,listJobBots:f}=await a.A(276307),g=await e(b);if(!g||g.disabled){let a=(await f()).map(a=>a.name);return`There is no bot called "${b}". The bots are: ${a.join(", ")}. Nothing was started — call again with one of those.`}let{startThread:h}=await a.A(763543);return{threadId:await h({bot:g.name,request:c,label:d,callId:B,from:"thursday"}),bot:g.name,label:d,note:`${g.name} has "${d}". Its updates reach the conversation on their own. Anything further about this work — a correction, the next step once it finishes — is \`${t.TOOL_NAMES.thread_tell}\` with "${d}"; a question it asks is answered with \`${t.TOOL_NAMES.thread_answer}\`.`}}}),[t.TOOL_NAMES.thread_tell]:(0,d.tool)({description:i.threadTellSpec.description,inputSchema:i.threadTellSpec.parameters,execute:async({thread:a,words:b})=>{let c=await k(a);if("string"==typeof c)return c;if(!b.trim())return"Say what to pass on.";let d=await m(c.id,b.trim());return"string"==typeof d?d:d?.answered?{label:c.label,answered:d.answered,note:`${d.answered.bot} was waiting on a question, and took this as its answer.`}:{label:c.label,bot:d?.to??c.bot,status:"running",note:"running"===c.status?"The bot reads it before its next step.":"The bot picks the thread back up from there."}}}),[t.TOOL_NAMES.thread_answer]:(0,d.tool)({description:i.threadAnswerSpec.description,inputSchema:i.threadAnswerSpec.parameters,execute:async({thread:b,bot:c,answer:d})=>{let e=await k(b);if("string"==typeof e)return e;if(!d.trim())return"Say what the answer is.";let{findThreadView:f}=await a.A(343064),g=(await f(e.id))?.room.questions??[],h=g.find(a=>a.bot.toLowerCase()===c.trim().toLowerCase());if(!h)return g.length?`${c} is not asking anything in "${e.label}". Waiting there: ${g.map(a=>a.bot).join(", ")}. Call again with that bot.`:`No question is waiting in "${e.label}". To say something else to it, use \`${t.TOOL_NAMES.thread_tell}\`.`;let i=await m(e.id,d.trim(),h.bot);return"string"==typeof i?i:{label:e.label,answered:i?.answered??{bot:h.bot,question:h.text},note:`${h.bot} has the answer to its question and goes on from it.`}}}),[t.TOOL_NAMES.thread_status]:(0,d.tool)({description:i.threadStatusSpec.description,inputSchema:i.threadStatusSpec.parameters,execute:async({thread:b})=>{let{listThreadOverview:c,findThreadView:d}=await a.A(343064),g={now:(0,h.clockNow)()},i=a=>(0,e.formatDistanceToNowStrict)((0,y.toDate)(a),{addSuffix:!0});if(!(!b.trim()||"all"===b.trim().toLowerCase())){let a=await k(b);if("string"==typeof a)return a;let c=(await d(a.id))?.room;return{...g,label:a.label,id:a.id,bot:a.bot,participants:c?.participants??[],questions:c?.questions??[],status:a.status,since:i(a.updatedAt),outcome:a.outcome,..."waiting"===a.status&&a.pending?.options.length?{options:a.pending.options}:{}}}let j=await c();return j.length?{...g,threads:j.map(a=>({id:a.id,label:a.label,bot:a.bot,status:a.status,participants:a.room.participants,questions:a.room.questions.map(a=>({...a,text:(0,C.clip)(a.text,f.PROMPT_LINE.threadStatus)})),since:i(a.updatedAt),...a.ask?{asking:a.ask.question,options:a.ask.options}:{},..."running"===a.status?{now:(0,v.threadActivity)(a.lines)}:{},...a.outcome&&"waiting"!==a.status?{outcome:(0,C.clip)(a.outcome,f.PROMPT_LINE.threadStatus)}:{}}))}:"No thread has been started yet."}}),[t.TOOL_NAMES.thread_cancel]:(0,d.tool)({description:i.threadCancelSpec.description,inputSchema:i.threadCancelSpec.parameters,execute:async({thread:b})=>{let c=await k(b);if("string"==typeof c)return c;let{cancelThread:d}=await a.A(763543);return await d(c.id),{label:c.label,status:"cancelled"}}}),[t.TOOL_NAMES.thread_show]:(0,d.tool)({description:i.threadShowSpec.description,inputSchema:i.threadShowSpec.parameters,execute:async({thread:b})=>{let c=await k(b);if("string"==typeof c)return c;let{appEvents:d}=await a.A(133300),{filesOnDisk:e}=await a.A(122690),{leadFirst:f,pathsIn:g,viewKindOf:h}=await a.A(394298),i=(await e(g(c.outcome??""),null)).filter(a=>"none"!==h(a));if(!i.length)return d.emit({type:"showThread",threadId:c.id}),{label:c.label,showing:"the thread"};let j=f(i);d.emit({type:"showFile",paths:j});let{markSeen:l}=await a.A(343064);return await l([c.id]),{label:c.label,showing:j[0]}}}),[t.TOOL_NAMES.thread_seen]:(0,d.tool)({description:i.threadSeenSpec.description,inputSchema:i.threadSeenSpec.parameters,execute:async({thread:b})=>{let c=await k(b);if("string"==typeof c)return c;let{markSeen:d}=await a.A(343064);return await d([c.id]),{label:c.label,seen:!0}}})})).filter(([a])=>!(b.phone&&a===t.TOOL_NAMES.thread_show))),...(0,o.createRoutineTools)(),...q?(0,l.createLookTool)():{},...b.written?{}:(0,j.callTools)()}}let D=await (0,w.loadSkills)(z,b.bot),F={...(0,x.jobShellEnv)(b.session),...(0,x.botShellEnv)(b.bot,(await (await a.A(276307)).findJobBot(b.bot))?.icon)},G=!!(b.model&&(0,g.seesToolImages)(b.model.ref));return{[t.TOOL_NAMES.memory_recall]:(0,n.createMemoryTools)("call",null,{tidies:!1})[t.TOOL_NAMES.memory_recall],...await (0,p.createSearchTool)(b.model,z),...(0,u.createWorkspaceTools)(z,{write:!0,env:F,guide:!0,bot:b.bot}),...await (0,m.createMcpTools)(b.bot,z),...(0,s.createSkillTools)({sandbox:z,skills:D,bot:b.bot}),...await (0,q.createSelfTools)(b.bot),...(0,k.createDeckTools)(z,b.bot,F,G),...G?(0,l.createLookTool)():{},...(0,r.createSignInTools)(z,b.bot,(0,x.jobShellEnv)(b.session)),...await (0,i.createThreadRecallTool)(b.bot,b.thread??null)}}[g,i,m,n,o,p,q,s,w]=D.then?(await D)():D,a.s(["loadTools",0,G]),c()}catch(a){c(a)}},!1),875931,a=>a.a(async(b,c)=>{try{var d=a.i(938537),e=a.i(674861),f=a.i(606016),g=a.i(388319),h=a.i(538177),i=a.i(767071),j=a.i(140358),k=a.i(873739),l=a.i(899042),m=a.i(345364),n=a.i(434451),o=a.i(655819),p=a.i(652685),q=a.i(156956),r=a.i(47919),s=a.i(569572),t=a.i(688034),u=a.i(725466),v=a.i(176668),w=a.i(293480),x=a.i(182248),y=a.i(652619),z=a.i(689656),A=b([u,y]);[u,y]=A.then?(await A)():A;let N=/context[ _-]?(length|window)|maximum context|prompt is too long|too many (input )?tokens|input token count|exceeds? the (maximum|model'?s?) (context|input|prompt|number of tokens)|maximum prompt length|request (entity )?too large/i;function B(a){return C(a).some(a=>{let{statusCode:b,message:c,error:d}=a;if(void 0!==b&&400!==b&&413!==b)return!1;let e=p.APICallError.isInstance(a)?a.responseBody:null;return[c,d,e].some(a=>"string"==typeof a&&N.test(a))})}let O=new Set([408,409,429]);function C(a){let b=[],c=[a];for(;c.length&&b.length<12;){let a=c.shift();!("object"!=typeof a||null===a||b.includes(a))&&(b.push(a),r.RetryError.isInstance(a)&&c.push(...a.errors),"cause"in a&&c.push(a.cause))}return b}let P=(a,b)=>({ref:a,model:b,searchTools:null}),Q=null;function D(a){if(null==a||""===a)return null;let b=Number(a);return Number.isFinite(b)?Math.round(1e6*b*1e4)/1e4:null}async function E(){if(Q&&Date.now()-Q.at<s.GATEWAY_CATALOG_MS)return Q.models;let a=await fetch("https://ai-gateway.vercel.sh/v1/models",{headers:{accept:"application/json"}}).catch(a=>{v.logger.warn({cause:a},"gateway catalog unreachable"),(0,w.publicError)("Could not reach the gateway")});a.ok||(0,w.publicError)(`The gateway answered ${a.status}`);let b=((await a.json()).data??[]).filter(a=>!!a.id).map(a=>{let b,c;return{id:a.id,label:a.name||a.id,owner:a.owned_by||a.id.slice(0,a.id.indexOf("/")),type:a.type??null,tags:a.tags??[],price:function(a){let b=a.pricing??{},c=D(b.input),d=D(b.output);if((a.tags??[]).includes("free")||0===c)return{in:0,out:0,note:null,free:!0};let e=b.transcription_duration_cost_per_second??b.realtime_session_duration_cost_per_second;if(e)return{in:null,out:null,note:`$${e}/s`,free:!1};if(b.speech_input_character_cost)return{in:null,out:null,note:"per character",free:!1};let f=Array.isArray(b.video_duration_pricing)?b.video_duration_pricing[0]:null;if(f?.cost_per_second)return{in:null,out:null,note:`$${f.cost_per_second}/s ${f.resolution??""}`.trimEnd(),free:!1};let g=b.image?`$${b.image}/image`:b.image_dimension_quality_pricing?"per image, by size":null;return null===c&&null===d?{in:null,out:null,note:g,free:!1}:{in:c,out:d,note:b.input_tiers?"tiered":b.varies_by_provider?"varies":g&&"+ per image",free:!1}}(a),retiring:!!a.deprecated_at,contextWindow:"number"==typeof a.context_window&&a.context_window>0?a.context_window:null,efforts:(b=(a.reasoning_options??[]).find(a=>a?.type==="effort"),(c=z.EFFORTS.filter(a=>b?.values?.includes(a))).length?c:null)}}).sort((a,b)=>a.id.localeCompare(b.id));return Q={at:Date.now(),models:b},b}async function F(a,b){if(b&&b>0)return b;let c=await G(a);return(0,z.compactAtFor)((0,z.contextWindowOf)(a.provider,a.model,c))}async function G(a){return"vercel-ai-gateway"!==a.provider?[]:await E().catch(()=>[])}async function H(a,b){let c=b??z.effortSchema.safeParse(await (0,u.readConfig)(t.DEFAULT_EFFORT_KEY)).data;if(!c)return;let d=await G(a);return(0,z.effortsOf)(a.provider,a.model,d)?.includes(c)?c:void 0}async function I(){return await E().then(a=>new Set(a.map(a=>a.id))).catch(()=>null)}async function J(a,b){if("vercel-ai-gateway"!==a)return b;let c=await I();if(!c)return b;let d=b.filter(a=>c.has(a.id));return d.length>0?d:b}async function K(a){let{label:b,apiKeyName:c,signIn:p}=z.TEXT_MODEL_PROVIDERS[a.provider],r=await (0,u.readConfig)(c);return r||(0,w.publicError)(p?`${b} is not signed in — sign in from Settings › API keys.`:`No ${b} key — add one in Settings › API keys.`),function(a,b){switch(a.provider){case"openai":{let c=(0,m.createOpenAI)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.webSearch()}}}case"chatgpt":return{ref:a,model:(0,y.chatGptModel)(a.model),searchTools:{search:(0,y.chatGptSearch)()}};case"anthropic":{let c=(0,d.createAnthropic)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.webSearch_20260209()}}}case"google":{let c=(0,j.createGoogleGenerativeAI)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.googleSearch({})}}}case"xai":{let c=(0,o.createXai)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.webSearch()}}}case"mistral":return P(a,(0,l.createMistral)({apiKey:b})(a.model));case"deepseek":return P(a,(0,h.createDeepSeek)({apiKey:b})(a.model));case"groq":return P(a,(0,k.createGroq)({apiKey:b})(a.model));case"cerebras":return P(a,(0,e.createCerebras)({apiKey:b})(a.model));case"togetherai":return P(a,(0,n.createTogetherAI)({apiKey:b})(a.model));case"fireworks":return P(a,(0,i.createFireworks)({apiKey:b})(a.model));case"deepinfra":return P(a,(0,g.createDeepInfra)({apiKey:b})(a.model));case"cohere":return P(a,(0,f.createCohere)({apiKey:b})(a.model));case"vercel-ai-gateway":{let c=(0,q.createGateway)({apiKey:b});return{ref:a,model:c(a.model),searchTools:null}}default:(0,w.publicError)(`Not supported provider: ${String(a.provider)}`)}}(a,r)}async function L(a,{quiet:b=!1}={}){let c=async a=>(0,z.defaultModelOf)({defaultTier:"chatgpt"===a.id&&await (0,y.readChatGptPlan)()==="free"?"small":a.defaultTier,suggestModels:await J(a.id,a.suggestModels)}),d=a?z.TEXT_MODEL_PROVIDER_LIST.find(b=>b.id===a):void 0,e=["chatgpt","openai","xai"].map(a=>({...z.TEXT_MODEL_PROVIDERS[a],id:a}));if(d){let a=await c(d);if(a)return{provider:d.id,model:a}}let f=(0,z.parseTextModel)(await (0,u.readConfig)(t.DEFAULT_MODEL_KEY)??void 0);if(f){let{label:a,apiKeyName:b,signIn:c}=z.TEXT_MODEL_PROVIDERS[f.provider];if(await (0,u.readConfig)(b))return f;(0,w.publicError)(c?`The default model is ${f.model} on ${a}, which is signed out — sign in again, or pick another in Settings › Models.`:`The default model is ${f.model}, and there is no ${a} key any more — add it in Settings › API keys, or pick another in Settings › Models.`)}for(let a of[...e,...z.TEXT_MODEL_PROVIDER_LIST]){if(!await (0,u.readConfig)(a.apiKeyName))continue;let d=await c(a);if(d)return b||v.logger.info(`no model set, falling back to ${a.id}/${d}`),{provider:a.id,model:d}}(0,w.publicError)("No model key is set — add one in Settings › API keys.")}async function M(a){let b=(0,z.parseMediaModel)(await (0,u.readConfig)(t.MEDIA_MODEL_KEYS[a]));if(!b||!(0,z.canMakeKind)(b.provider,a))return null;let c=await (0,u.readConfig)(z.MEDIA_MODEL_PROVIDERS[b.provider].apiKeyName);return c?{ref:b,apiKey:c}:null}a.s(["buildImageModel",0,function(a,b){switch(a.provider){case"openai":return(0,m.createOpenAI)({apiKey:b}).image(a.model);case"google":return(0,j.createGoogleGenerativeAI)({apiKey:b}).image(a.model);case"xai":return(0,o.createXai)({apiKey:b}).image(a.model);case"vercel-ai-gateway":return(0,q.createGateway)({apiKey:b}).image(a.model);default:(0,w.publicError)(`Not supported image provider: ${String(a.provider)}`)}},"buildSpeechModel",0,function(a,b){switch(a.provider){case"openai":return(0,m.createOpenAI)({apiKey:b}).speech(a.model);case"google":return(0,j.createGoogleGenerativeAI)({apiKey:b}).speech(a.model);case"xai":return(0,o.createXai)({apiKey:b}).speech();case"vercel-ai-gateway":return(0,q.createGateway)({apiKey:b}).speech(a.model);default:(0,w.publicError)(`Not supported speech provider: ${String(a.provider)}`)}},"buildTranscriptionModel",0,function(a,b){switch(a.provider){case"openai":return(0,m.createOpenAI)({apiKey:b}).transcription(a.model);case"google":return(0,j.createGoogleGenerativeAI)({apiKey:b}).transcription(a.model);case"xai":return(0,o.createXai)({apiKey:b}).transcription();case"vercel-ai-gateway":return(0,q.createGateway)({apiKey:b}).transcription(a.model);default:(0,w.publicError)(`Not supported transcription provider: ${String(a.provider)}`)}},"buildVideoModel",0,function(a,b){switch(a.provider){case"google":return(0,j.createGoogleGenerativeAI)({apiKey:b}).video(a.model);case"xai":return(0,o.createXai)({apiKey:b}).video(a.model);case"vercel-ai-gateway":return(0,q.createGateway)({apiKey:b}).video(a.model);default:(0,w.publicError)(`${a.provider} has no video model`)}},"compactBudget",0,F,"getTextModel",0,K,"isContextOverflow",0,B,"isProviderRefusal",0,function(a){return!B(a)&&C(a).some(a=>{let{statusCode:b}=a;return"number"==typeof b&&b>=400&&b<500&&!O.has(b)})},"modelErrorToString",0,function(a){if(!p.APICallError.isInstance(a))return(0,x.errorToString)(a);let b=a.statusCode?` (${a.statusCode})`:"",c=a.responseBody?.trim(),d=c&&!c.includes(a.message)?` ${(0,x.clip)(c,300)}`:"";return`${a.message}${b}${d}`},"resolveDefaultModel",0,L,"resolveMediaRef",0,M,"runEffort",0,H,"seesToolImages",0,function(a){let b="vercel-ai-gateway"===a.provider?z.GATEWAY_OWNERS[a.model.split("/")[0]]:a.provider;return void 0!==b&&["openai","chatgpt","anthropic","google","xai"].includes(b)}]),c()}catch(a){c(a)}},!1),735502,a=>a.a(async(b,c)=>{try{var d=a.i(12208),e=a.i(569572),f=a.i(884780),g=a.i(762008),h=a.i(641301),i=a.i(221214),j=a.i(446957),k=a.i(636616),l=a.i(344853),m=a.i(947950),n=a.i(986743),o=a.i(138100),p=a.i(684321),q=a.i(821415),r=a.i(706210),s=a.i(182248),t=a.i(644468),u=a.i(938934),v=b([i,l,m,n,o,t]);async function w(a,b,c,f){var k,v,w,z,A,B,C,D,E,F;let G,H,I,J,K,L,M,N=await (0,q.openWorkspace)(),O=a.trim(),[P,Q,R,S,T,U,V,W,X]=await Promise.all([(0,o.loadSkills)(N,O),(0,n.listNoteIndex)(),(0,t.listConnectedToolNames)(),(0,m.findPinnedTools)(O),(0,i.listJobBots)(),(0,h.listBotMemory)(O),(0,i.readBotMemoryOn)(),(0,q.readMachineTools)(N),(0,l.listBotWork)(O,c?.thread??null)]),Y=T.filter(a=>a.name!==O),Z=T.find(a=>a.name===O)??await (0,i.findJobBot)(O),$=[(k=O,v=Z,w=c,H=(G=w?.owner??k)===k?"**You** coordinate this thread: its result goes from you to Thursday.":`**${G}** coordinates this thread and brings its result to Thursday.`,I=w?`
1
+ module.exports=[652619,a=>a.a(async(b,c)=>{try{var d=a.i(666680),e=a.i(347299),f=a.i(345364),g=a.i(47919),h=a.i(868468),i=a.i(53112),j=a.i(569572),k=a.i(725466),l=a.i(176668),m=a.i(523095),n=a.i(293480),o=a.i(8412),p=a.i(182248),q=a.i(689656),r=b([k]);[k]=r.then?(await r)():r;let D="app_EMoamEEZ73f0CkXaXp7hrann",E="http://localhost:1455/auth/callback",F=["127.0.0.1","::1"],G="thursday",{apiKeyName:H,label:I}=q.TEXT_MODEL_PROVIDERS.chatgpt,J=`${I} is not signed in — sign in from Settings › API keys.`,K=i.z.object({access:i.z.string().min(1),refresh:i.z.string().min(1),expires:i.z.number(),accountId:i.z.string().min(1),plan:i.z.string().nullable()}),L=globalThis,M=L.__chatgptRenewal??=(0,o.createKeyedLock)();async function s(){t();let a=(0,d.randomBytes)(32).toString("base64url"),b=(0,d.randomBytes)(16).toString("hex"),c=[],f=(d,e)=>{u(d.url??"/",{state:b,verifier:a}).then(a=>{e.writeHead(a.status,{"content-type":"text/html; charset=utf-8"}),e.end((0,m.oauthPage)(a.title,a.detail,{autoClose:200===a.status}),()=>{a.last&&L.__chatgptListeners===c&&t()})})};for(let a of F){let b=(0,e.createServer)(f),d=await new Promise(c=>{b.once("error",c),b.listen(1455,a,()=>c(null))});if(!d){c.push(b);continue}if("EADDRNOTAVAIL"!==d.code&&"EAFNOSUPPORT"!==d.code){for(let a of c)a.close();(0,n.publicError)("EADDRINUSE"===d.code?"Port 1455 is in use by another app — often a ChatGPT or Codex sign-in still waiting. Finish or close it, then try again.":`Could not wait for the sign-in: ${(0,p.errorToString)(d)}`)}}L.__chatgptListeners=c,setTimeout(()=>{L.__chatgptListeners===c&&t()},j.CHATGPT_SIGN_IN.waitMs).unref();let g=new URL("https://auth.openai.com/oauth/authorize");return g.search=new URLSearchParams({response_type:"code",client_id:D,redirect_uri:E,scope:"openid profile email offline_access",code_challenge:(0,d.createHash)("sha256").update(a).digest("base64url"),code_challenge_method:"S256",state:b,id_token_add_organizations:"true",codex_cli_simplified_flow:"true",originator:G}).toString(),g.toString()}function t(){let a=L.__chatgptListeners;for(let b of(L.__chatgptListeners=null,a??[]))b.close(),b.closeIdleConnections()}async function u(a,b){let c=new URL(a,E);if("/auth/callback"!==c.pathname)return{status:404,title:"Not found",detail:"",last:!1};let d=c.searchParams.get("error");if(d){let a=c.searchParams.get("error_description");return{status:400,title:"Sign-in failed",detail:a?`${d}: ${a}`:d,last:!0}}let e=c.searchParams.get("code");if(!e||c.searchParams.get("state")!==b.state)return{status:400,title:"Sign-in failed",detail:"This is not the sign-in that was started. Start again from Settings › API keys.",last:!1};try{let a=await v({grant_type:"authorization_code",code:e,code_verifier:b.verifier,redirect_uri:E});return await (0,k.writeConfig)(H,JSON.stringify(a)),{status:200,title:"Signed in to ChatGPT",detail:"Bots can run on your plan now. This window closes itself.",last:!0}}catch(a){return l.logger.warn({cause:a},"chatgpt sign-in failed"),{status:502,title:"Sign-in failed",detail:(0,p.errorToString)(a),last:!0}}}async function v(a){let b=await fetch("https://auth.openai.com/oauth/token",{method:"POST",headers:{accept:"application/json","content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:D,...a})}).catch(a=>{l.logger.warn({cause:a},"chatgpt token endpoint unreachable"),(0,n.publicError)("Could not reach ChatGPT's sign-in")}),c=await b.json().catch(()=>null),d=c?.access_token;if(!b.ok||!d){let a=c?.error,d="string"==typeof a?[a,c?.error_description].filter(Boolean).join(": "):a?.message??a?.code??"";(0,n.publicError)(`ChatGPT's sign-in answered ${b.status}${d?`: ${d}`:""}`)}let e=function(a){try{let b=JSON.parse(Buffer.from(a.split(".")[1]??"","base64url").toString("utf8")),c=b["https://api.openai.com/auth"]??{};return{accountId:"string"==typeof c.chatgpt_account_id?c.chatgpt_account_id:null,plan:"string"==typeof c.chatgpt_plan_type?c.chatgpt_plan_type:null,expires:"number"==typeof b.exp?1e3*b.exp:null}}catch{return{accountId:null,plan:null,expires:null}}}(d),f=c?.refresh_token??a.refresh_token;e.accountId&&f||(0,n.publicError)("ChatGPT's sign-in came back without an account");let g=c?.expires_in;return{access:d,refresh:f,expires:"number"==typeof g?Date.now()+1e3*g:e.expires??Date.now(),accountId:e.accountId,plan:e.plan}}async function w(){let a=await (0,k.readConfig)(H);if(!a)return null;try{return K.parse(JSON.parse(a))}catch{return null}}let N=a=>a.expires-j.CHATGPT_SIGN_IN.renewBeforeMs<=Date.now();async function x(){let a=await w();return(a||(0,n.publicError)(J),N(a))?M(H,async()=>{let a=await w();if(a||(0,n.publicError)(J),!N(a))return a;try{let b=await v({grant_type:"refresh_token",refresh_token:a.refresh});return await (0,k.writeConfig)(H,JSON.stringify(b)),b}catch(a){(0,n.publicError)(`Could not renew the ${I} sign-in (${(0,p.errorToString)(a)}). If it keeps failing, sign in again from Settings › API keys.`)}}):a}async function y(){return(await w())?.plan??null}async function z(a,b){let c=await x(),d=new Headers(b?.headers);if(d.set("authorization",`Bearer ${c.access}`),d.set("chatgpt-account-id",c.accountId),d.set("originator",G),b?.method!=="POST"||"string"!=typeof b.body||!String(a).endsWith("/responses"))return fetch(a,{...b,headers:d});let e=JSON.parse(b.body),f=!0===e.stream;e.prompt_cache_key&&d.set("session-id",e.prompt_cache_key);let g=[];e.input=(e.input??[]).filter(a=>"system"!==a.role&&"developer"!==a.role||(g.push("string"==typeof a.content?a.content:(a.content??[]).map(a=>a.text??"").join("\n")),!1)),e.instructions=[e.instructions,...g].filter(Boolean).join("\n\n")||"You are a helpful assistant.",e.store=!1,e.stream=!0,e.max_output_tokens=void 0,d.set("accept","text/event-stream");let h=await fetch(a,{...b,headers:d,body:JSON.stringify(e)});return 429===h.status?B(h):h.ok?f?h:C(h):A(h)}async function A(a){let b=await a.clone().json().catch(()=>null);if("string"!=typeof b?.detail)return a;let c=a.headers.get("retry-after");return Response.json({error:{message:b.detail}},{status:a.status,headers:c?{"retry-after":c}:{}})}async function B(a){let b=await a.text(),c={};try{c=JSON.parse(b).error??{}}catch{}if(!/usage_limit_reached|usage_not_included/.test(`${c.code} ${c.type}`)){let c=a.headers.get("retry-after");return new Response(b,{status:429,headers:{"content-type":"application/json",...c?{"retry-after":c}:{}}})}let d=c.resets_at?1e3*c.resets_at:c.resets_in_seconds?Date.now()+1e3*c.resets_in_seconds:null,e=c.plan_type?` on the ${c.plan_type} plan`:"",f=d?` It resets in ${(0,h.formatDistanceToNowStrict)(d)}.`:"";return Response.json({error:{message:`${I} usage limit reached${e}.${f}`,code:c.code??c.type}},{status:402})}async function C(a){let b=[],c=null,d=null;for(let e of(await a.text()).replaceAll("\r\n","\n").split("\n\n")){let a,f=e.split("\n").filter(a=>a.startsWith("data:")).map(a=>a.slice(5).trimStart()).join("\n");if(f&&"[DONE]"!==f){try{a=JSON.parse(f)}catch{continue}"response.output_item.done"===a.type?b.push(a.item):"response.completed"===a.type||"response.incomplete"===a.type?c=a.response??{}:"response.failed"===a.type?d=a.response?.error??{message:"The response failed"}:"error"===a.type&&(d={code:a.code,message:a.message})}}return d||!c?Response.json({error:{message:d?.message??"The stream ended before the response finished",code:d?.code}},{status:d?.code==="context_length_exceeded"?400:500}):Response.json({...c,output:c.output?.length?c.output:b})}a.s(["chatGptModel",0,function(a){let b=(0,f.createOpenAI)({baseURL:"https://chatgpt.com/backend-api/codex",apiKey:"signed-in",headers:{"OpenAI-Beta":"responses=experimental"},fetch:z}),c=(0,d.randomUUID)();return(0,g.wrapLanguageModel)({model:b.responses(a),middleware:{transformParams:async({params:a})=>({...a,providerOptions:{...a.providerOptions,openai:{promptCacheKey:c,...a.providerOptions?.openai,store:!1,includeWebSearchSources:!1}}})}})},"chatGptSearch",0,()=>(0,f.createOpenAI)({apiKey:"signed-in"}).tools.webSearch(),"readChatGptPlan",0,y,"startChatGptSignIn",0,s]),c()}catch(a){c(a)}},!1),884780,a=>{"use strict";a.i(902157),a.i(912714);var b=a.i(750227),c=a.i(569572);(0,b.join)(c.APP_DIR,"guide");let d=".guide";a.s(["botGuideLine",0,()=>`How ${c.APP_NAME} itself works for the user — its screens and settings — is written under \`${d}/\` here, \`index.md\` first; read it only when the job is about the app.`,"guideLine",0,()=>`How ${c.APP_NAME} works for the person using it — its screens, its settings, what it connects to, what to do when something stops — is written under \`${d}/\` here, \`index.md\` first. Read it whenever an answer depends on how the app works: what can be asked for, where something is changed, a wish that needs a setting switched on, something that stopped or was refused. Answer from it rather than from what you assume.`])},738131,a=>a.a(async(b,c)=>{try{var d=a.i(527990),e=a.i(868468),f=a.i(569572),g=a.i(875931),h=a.i(938934),i=a.i(978876),j=a.i(375827),k=a.i(127507),l=a.i(467650),m=a.i(138902),n=a.i(345846),o=a.i(617594),p=a.i(622547),q=a.i(128232),r=a.i(382442),s=a.i(451017),t=a.i(762008),u=a.i(547613),v=a.i(446957),w=a.i(138100),x=a.i(821415),y=a.i(706210),z=a.i(176668),A=a.i(293480),B=a.i(987674),C=a.i(182248),D=b([g,i,m,n,o,p,q,s,w]);async function E(b){let{listThreadOverview:c}=await a.A(343064),d=await c();if(!d.length)return"No thread has been started yet.";let e=d.map(a=>`"${a.label}" (${a.bot}, ${a.status})`).join(", ");return`There is no thread called "${b}". The latest are: ${e}. Call again with one of those labels.`}async function F(a,b){let c=[];for(let[a,e]of Object.entries(b)){let b=await (0,d.asSchema)(e.inputSchema).jsonSchema,f="string"==typeof e.description?e.description:"";c.push({name:a,tokens:(0,B.estimateTokens)(f)+(0,B.estimateTokens)(JSON.stringify(b))})}c.sort((a,b)=>b.tokens-a.tokens);let e=c.reduce((a,b)=>a+b.tokens,0);z.logger.debug(`${a} tools ${e} tokens over ${c.length} — ${c.map(a=>`${a.name} ${a.tokens}`).join(", ")}`)}async function G(a){let b=await H(a);return f.IS_DEV&&await F(a.target,b),b}async function H(b){if("memory-edit"===b.target)return(0,n.createMemoryTools)("user",null,{countReads:!1});let c=(0,n.createMemoryTools)("call","thursday"===b.target?b.callId??null:null),z=await (0,x.openWorkspace)();if("thursday"===b.target){var B;let k,m,n=b.readSkills?(0,s.createSkillTools)({sandbox:z,skills:await (0,w.loadSkills)(z)}):{},q=!!(b.written&&b.model&&(0,g.seesToolImages)(b.model));return{...c,...n,...(0,u.createWorkspaceTools)(z,{write:!1,timeoutMs:f.CALL_EXEC_TIMEOUT_MS}),...!1===b.webSearch?{}:await (0,p.createCallSearchTool)(z),...Object.fromEntries(Object.entries((B=b.callId,k=async b=>{let{resolveThread:c}=await a.A(343064);return(b.trim()?await c(b.trim()):null)??await E(b)},m=async(b,c,d)=>{let e=await a.A(763543);try{return await e.answerThread(b,c,"thursday",d)}catch(a){if((0,A.isPublicError)(a))return a.message;throw a}},{[t.TOOL_NAMES.thread_start]:(0,d.tool)({description:i.threadStartSpec.description,inputSchema:i.threadStartSpec.parameters,execute:async({bot:b,request:c,label:d})=>{let{findJobBot:e,listJobBots:f}=await a.A(276307),g=await e(b);if(!g||g.disabled){let a=(await f()).map(a=>a.name);return`There is no bot called "${b}". The bots are: ${a.join(", ")}. Nothing was started — call again with one of those.`}let{startThread:h}=await a.A(763543);return{threadId:await h({bot:g.name,request:c,label:d,callId:B,from:"thursday"}),bot:g.name,label:d,note:`${g.name} has "${d}". Its updates reach the conversation on their own. Anything further about this work — a correction, the next step once it finishes — is \`${t.TOOL_NAMES.thread_tell}\` with "${d}"; a question it asks is answered with \`${t.TOOL_NAMES.thread_answer}\`.`}}}),[t.TOOL_NAMES.thread_tell]:(0,d.tool)({description:i.threadTellSpec.description,inputSchema:i.threadTellSpec.parameters,execute:async({thread:a,words:b})=>{let c=await k(a);if("string"==typeof c)return c;if(!b.trim())return"Say what to pass on.";let d=await m(c.id,b.trim());return"string"==typeof d?d:d?.answered?{label:c.label,answered:d.answered,note:`${d.answered.bot} was waiting on a question, and took this as its answer.`}:{label:c.label,bot:d?.to??c.bot,status:"running",note:"running"===c.status?"The bot reads it before its next step.":"The bot picks the thread back up from there."}}}),[t.TOOL_NAMES.thread_answer]:(0,d.tool)({description:i.threadAnswerSpec.description,inputSchema:i.threadAnswerSpec.parameters,execute:async({thread:b,bot:c,answer:d})=>{let e=await k(b);if("string"==typeof e)return e;if(!d.trim())return"Say what the answer is.";let{findThreadView:f}=await a.A(343064),g=(await f(e.id))?.room.questions??[],h=g.find(a=>a.bot.toLowerCase()===c.trim().toLowerCase());if(!h)return g.length?`${c} is not asking anything in "${e.label}". Waiting there: ${g.map(a=>a.bot).join(", ")}. Call again with that bot.`:`No question is waiting in "${e.label}". To say something else to it, use \`${t.TOOL_NAMES.thread_tell}\`.`;let i=await m(e.id,d.trim(),h.bot);return"string"==typeof i?i:{label:e.label,answered:i?.answered??{bot:h.bot,question:h.text},note:`${h.bot} has the answer to its question and goes on from it.`}}}),[t.TOOL_NAMES.thread_status]:(0,d.tool)({description:i.threadStatusSpec.description,inputSchema:i.threadStatusSpec.parameters,execute:async({thread:b})=>{let{listThreadOverview:c,findThreadView:d}=await a.A(343064),g={now:(0,h.clockNow)()},i=a=>(0,e.formatDistanceToNowStrict)((0,y.toDate)(a),{addSuffix:!0});if(!(!b.trim()||"all"===b.trim().toLowerCase())){let a=await k(b);if("string"==typeof a)return a;let c=(await d(a.id))?.room;return{...g,label:a.label,id:a.id,bot:a.bot,participants:c?.participants??[],questions:c?.questions??[],status:a.status,since:i(a.updatedAt),outcome:a.outcome,..."waiting"===a.status&&a.pending?.options.length?{options:a.pending.options}:{}}}let j=await c();return j.length?{...g,threads:j.map(a=>({id:a.id,label:a.label,bot:a.bot,status:a.status,participants:a.room.participants,questions:a.room.questions.map(a=>({...a,text:(0,C.clip)(a.text,f.PROMPT_LINE.threadStatus)})),since:i(a.updatedAt),...a.ask?{asking:a.ask.question,options:a.ask.options}:{},..."running"===a.status?{now:(0,v.threadActivity)(a.lines)}:{},...a.outcome&&"waiting"!==a.status?{outcome:(0,C.clip)(a.outcome,f.PROMPT_LINE.threadStatus)}:{}}))}:"No thread has been started yet."}}),[t.TOOL_NAMES.thread_cancel]:(0,d.tool)({description:i.threadCancelSpec.description,inputSchema:i.threadCancelSpec.parameters,execute:async({thread:b})=>{let c=await k(b);if("string"==typeof c)return c;let{cancelThread:d}=await a.A(763543);return await d(c.id),{label:c.label,status:"cancelled"}}}),[t.TOOL_NAMES.thread_show]:(0,d.tool)({description:i.threadShowSpec.description,inputSchema:i.threadShowSpec.parameters,execute:async({thread:b})=>{let c=await k(b);if("string"==typeof c)return c;let{appEvents:d}=await a.A(133300),{filesOnDisk:e}=await a.A(122690),{leadFirst:f,pathsIn:g,viewKindOf:h}=await a.A(394298),i=(await e(g(c.outcome??""),null)).filter(a=>"none"!==h(a));if(!i.length)return d.emit({type:"showThread",threadId:c.id}),{label:c.label,showing:"the thread"};let j=f(i);d.emit({type:"showFile",paths:j});let{markSeen:l}=await a.A(343064);return await l([c.id]),{label:c.label,showing:j[0]}}}),[t.TOOL_NAMES.thread_seen]:(0,d.tool)({description:i.threadSeenSpec.description,inputSchema:i.threadSeenSpec.parameters,execute:async({thread:b})=>{let c=await k(b);if("string"==typeof c)return c;let{markSeen:d}=await a.A(343064);return await d([c.id]),{label:c.label,seen:!0}}})})).filter(([a])=>!(b.phone&&a===t.TOOL_NAMES.thread_show))),...(0,o.createRoutineTools)(),...q?(0,l.createLookTool)():{},...b.written?{}:(0,j.callTools)()}}let D=await (0,w.loadSkills)(z,b.bot),F={...(0,x.jobShellEnv)(b.session),...(0,x.botShellEnv)(b.bot,(await (await a.A(276307)).findJobBot(b.bot))?.icon)},G=!!(b.model&&(0,g.seesToolImages)(b.model.ref));return{[t.TOOL_NAMES.memory_recall]:(0,n.createMemoryTools)("call",null,{tidies:!1})[t.TOOL_NAMES.memory_recall],...await (0,p.createSearchTool)(b.model,z),...(0,u.createWorkspaceTools)(z,{write:!0,env:F,guide:!0,bot:b.bot}),...await (0,m.createMcpTools)(b.bot,z),...(0,s.createSkillTools)({sandbox:z,skills:D,bot:b.bot}),...await (0,q.createSelfTools)(b.bot),...(0,k.createDeckTools)(z,b.bot,F,G),...G?(0,l.createLookTool)():{},...(0,r.createSignInTools)(z,b.bot,(0,x.jobShellEnv)(b.session)),...await (0,i.createThreadRecallTool)(b.bot,b.thread??null)}}[g,i,m,n,o,p,q,s,w]=D.then?(await D)():D,a.s(["loadTools",0,G]),c()}catch(a){c(a)}},!1),875931,a=>a.a(async(b,c)=>{try{var d=a.i(938537),e=a.i(674861),f=a.i(606016),g=a.i(388319),h=a.i(538177),i=a.i(767071),j=a.i(140358),k=a.i(873739),l=a.i(899042),m=a.i(345364),n=a.i(434451),o=a.i(655819),p=a.i(652685),q=a.i(156956),r=a.i(47919),s=a.i(569572),t=a.i(688034),u=a.i(725466),v=a.i(176668),w=a.i(293480),x=a.i(182248),y=a.i(652619),z=a.i(689656),A=b([u,y]);[u,y]=A.then?(await A)():A;let N=/context[ _-]?(length|window)|maximum context|prompt is too long|too many (input )?tokens|input token count|exceeds? the (maximum|model'?s?) (context|input|prompt|number of tokens)|maximum prompt length|request (entity )?too large/i;function B(a){return C(a).some(a=>{let{statusCode:b,message:c,error:d}=a;if(void 0!==b&&400!==b&&413!==b)return!1;let e=p.APICallError.isInstance(a)?a.responseBody:null;return[c,d,e].some(a=>"string"==typeof a&&N.test(a))})}let O=new Set([408,409,429]);function C(a){let b=[],c=[a];for(;c.length&&b.length<12;){let a=c.shift();!("object"!=typeof a||null===a||b.includes(a))&&(b.push(a),r.RetryError.isInstance(a)&&c.push(...a.errors),"cause"in a&&c.push(a.cause))}return b}let P=(a,b)=>({ref:a,model:b,searchTools:null}),Q=null;function D(a){if(null==a||""===a)return null;let b=Number(a);return Number.isFinite(b)?Math.round(1e6*b*1e4)/1e4:null}async function E(){if(Q&&Date.now()-Q.at<s.GATEWAY_CATALOG_MS)return Q.models;let a=await fetch("https://ai-gateway.vercel.sh/v1/models",{headers:{accept:"application/json"}}).catch(a=>{v.logger.warn({cause:a},"gateway catalog unreachable"),(0,w.publicError)("Could not reach the gateway")});a.ok||(0,w.publicError)(`The gateway answered ${a.status}`);let b=((await a.json()).data??[]).filter(a=>!!a.id).map(a=>{let b,c;return{id:a.id,label:a.name||a.id,owner:a.owned_by||a.id.slice(0,a.id.indexOf("/")),type:a.type??null,tags:a.tags??[],price:function(a){let b=a.pricing??{},c=D(b.input),d=D(b.output);if((a.tags??[]).includes("free")||0===c)return{in:0,out:0,note:null,free:!0};let e=b.transcription_duration_cost_per_second??b.realtime_session_duration_cost_per_second;if(e)return{in:null,out:null,note:`$${e}/s`,free:!1};if(b.speech_input_character_cost)return{in:null,out:null,note:"per character",free:!1};let f=Array.isArray(b.video_duration_pricing)?b.video_duration_pricing[0]:null;if(f?.cost_per_second)return{in:null,out:null,note:`$${f.cost_per_second}/s ${f.resolution??""}`.trimEnd(),free:!1};let g=b.image?`$${b.image}/image`:b.image_dimension_quality_pricing?"per image, by size":null;return null===c&&null===d?{in:null,out:null,note:g,free:!1}:{in:c,out:d,note:b.input_tiers?"tiered":b.varies_by_provider?"varies":g&&"+ per image",free:!1}}(a),retiring:!!a.deprecated_at,contextWindow:"number"==typeof a.context_window&&a.context_window>0?a.context_window:null,efforts:(b=(a.reasoning_options??[]).find(a=>a?.type==="effort"),(c=z.EFFORTS.filter(a=>b?.values?.includes(a))).length?c:null)}}).sort((a,b)=>a.id.localeCompare(b.id));return Q={at:Date.now(),models:b},b}async function F(a,b){if(b&&b>0)return b;let c=await G(a);return(0,z.compactAtFor)((0,z.contextWindowOf)(a.provider,a.model,c))}async function G(a){return"vercel-ai-gateway"!==a.provider?[]:await E().catch(()=>[])}async function H(a,b){let c=b??z.effortSchema.safeParse(await (0,u.readConfig)(t.DEFAULT_EFFORT_KEY)).data;if(!c)return;let d=await G(a);return(0,z.effortsOf)(a.provider,a.model,d)?.includes(c)?c:void 0}async function I(){return await E().then(a=>new Set(a.map(a=>a.id))).catch(()=>null)}async function J(a,b){if("vercel-ai-gateway"!==a)return b;let c=await I();if(!c)return b;let d=b.filter(a=>c.has(a.id));return d.length>0?d:b}async function K(a){let{label:b,apiKeyName:c,signIn:p}=z.TEXT_MODEL_PROVIDERS[a.provider],r=await (0,u.readConfig)(c);return r||(0,w.publicError)(p?`${b} is not signed in — sign in from Settings › API keys.`:`No ${b} key — add one in Settings › API keys.`),function(a,b){switch(a.provider){case"openai":{let c=(0,m.createOpenAI)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.webSearch()}}}case"chatgpt":return{ref:a,model:(0,y.chatGptModel)(a.model),searchTools:{search:(0,y.chatGptSearch)()}};case"anthropic":{let c=(0,d.createAnthropic)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.webSearch_20260209()}}}case"google":{let c=(0,j.createGoogleGenerativeAI)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.googleSearch({})}}}case"xai":{let c=(0,o.createXai)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.webSearch()}}}case"mistral":return P(a,(0,l.createMistral)({apiKey:b})(a.model));case"deepseek":return P(a,(0,h.createDeepSeek)({apiKey:b})(a.model));case"groq":return P(a,(0,k.createGroq)({apiKey:b})(a.model));case"cerebras":return P(a,(0,e.createCerebras)({apiKey:b})(a.model));case"togetherai":return P(a,(0,n.createTogetherAI)({apiKey:b})(a.model));case"fireworks":return P(a,(0,i.createFireworks)({apiKey:b})(a.model));case"deepinfra":return P(a,(0,g.createDeepInfra)({apiKey:b})(a.model));case"cohere":return P(a,(0,f.createCohere)({apiKey:b})(a.model));case"vercel-ai-gateway":{let c=(0,q.createGateway)({apiKey:b});return{ref:a,model:c(a.model),searchTools:null}}default:(0,w.publicError)(`Not supported provider: ${String(a.provider)}`)}}(a,r)}async function L(a,{quiet:b=!1}={}){let c=async a=>(0,z.defaultModelOf)({defaultTier:"chatgpt"===a.id&&await (0,y.readChatGptPlan)()==="free"?"small":a.defaultTier,suggestModels:await J(a.id,a.suggestModels)}),d=a?z.TEXT_MODEL_PROVIDER_LIST.find(b=>b.id===a):void 0,e=["chatgpt","openai","xai"].map(a=>({...z.TEXT_MODEL_PROVIDERS[a],id:a}));if(d){let a=await c(d);if(a)return{provider:d.id,model:a}}let f=(0,z.parseTextModel)(await (0,u.readConfig)(t.DEFAULT_MODEL_KEY)??void 0);if(f){let{label:a,apiKeyName:b,signIn:c}=z.TEXT_MODEL_PROVIDERS[f.provider];if(await (0,u.readConfig)(b))return f;(0,w.publicError)(c?`The default model is ${f.model} on ${a}, which is signed out — sign in again, or pick another in Settings › Models.`:`The default model is ${f.model}, and there is no ${a} key any more — add it in Settings › API keys, or pick another in Settings › Models.`)}for(let a of[...e,...z.TEXT_MODEL_PROVIDER_LIST]){if(!await (0,u.readConfig)(a.apiKeyName))continue;let d=await c(a);if(d)return b||v.logger.info(`no model set, falling back to ${a.id}/${d}`),{provider:a.id,model:d}}(0,w.publicError)("No model key is set — add one in Settings › API keys.")}async function M(a){let b=(0,z.parseMediaModel)(await (0,u.readConfig)(t.MEDIA_MODEL_KEYS[a]));if(!b||!(0,z.canMakeKind)(b.provider,a))return null;let c=await (0,u.readConfig)(z.MEDIA_MODEL_PROVIDERS[b.provider].apiKeyName);return c?{ref:b,apiKey:c}:null}a.s(["buildImageModel",0,function(a,b){switch(a.provider){case"openai":return(0,m.createOpenAI)({apiKey:b}).image(a.model);case"google":return(0,j.createGoogleGenerativeAI)({apiKey:b}).image(a.model);case"xai":return(0,o.createXai)({apiKey:b}).image(a.model);case"vercel-ai-gateway":return(0,q.createGateway)({apiKey:b}).image(a.model);default:(0,w.publicError)(`Not supported image provider: ${String(a.provider)}`)}},"buildSpeechModel",0,function(a,b){switch(a.provider){case"openai":return(0,m.createOpenAI)({apiKey:b}).speech(a.model);case"google":return(0,j.createGoogleGenerativeAI)({apiKey:b}).speech(a.model);case"xai":return(0,o.createXai)({apiKey:b}).speech();case"vercel-ai-gateway":return(0,q.createGateway)({apiKey:b}).speech(a.model);default:(0,w.publicError)(`Not supported speech provider: ${String(a.provider)}`)}},"buildTranscriptionModel",0,function(a,b){switch(a.provider){case"openai":return(0,m.createOpenAI)({apiKey:b}).transcription(a.model);case"google":return(0,j.createGoogleGenerativeAI)({apiKey:b}).transcription(a.model);case"xai":return(0,o.createXai)({apiKey:b}).transcription();case"vercel-ai-gateway":return(0,q.createGateway)({apiKey:b}).transcription(a.model);default:(0,w.publicError)(`Not supported transcription provider: ${String(a.provider)}`)}},"buildVideoModel",0,function(a,b){switch(a.provider){case"google":return(0,j.createGoogleGenerativeAI)({apiKey:b}).video(a.model);case"xai":return(0,o.createXai)({apiKey:b}).video(a.model);case"vercel-ai-gateway":return(0,q.createGateway)({apiKey:b}).video(a.model);default:(0,w.publicError)(`${a.provider} has no video model`)}},"compactBudget",0,F,"getTextModel",0,K,"isContextOverflow",0,B,"isProviderRefusal",0,function(a){return!B(a)&&C(a).some(a=>{let{statusCode:b}=a;return"number"==typeof b&&b>=400&&b<500&&!O.has(b)})},"modelErrorToString",0,function(a){if(!p.APICallError.isInstance(a))return(0,x.errorToString)(a);let b=a.statusCode?`(${a.statusCode})`:"",c=a.responseBody?.trim(),d=c&&!(a.message&&c.includes(a.message))?(0,x.clip)(c,300):"";return[a.message,b,d].filter(Boolean).join(" ")},"promptCacheOptions",0,function(a,b){switch(a.provider){case"openai":case"chatgpt":return b?{openai:{promptCacheKey:b}}:{};case"anthropic":return{anthropic:{cacheControl:{type:"ephemeral"}}};case"vercel-ai-gateway":return{gateway:{caching:"auto"}};default:return{}}},"resolveDefaultModel",0,L,"resolveMediaRef",0,M,"runEffort",0,H,"seesToolImages",0,function(a){let b="vercel-ai-gateway"===a.provider?z.GATEWAY_OWNERS[a.model.split("/")[0]]:a.provider;return void 0!==b&&["openai","chatgpt","anthropic","google","xai"].includes(b)}]),c()}catch(a){c(a)}},!1),735502,a=>a.a(async(b,c)=>{try{var d=a.i(12208),e=a.i(569572),f=a.i(884780),g=a.i(762008),h=a.i(641301),i=a.i(221214),j=a.i(446957),k=a.i(636616),l=a.i(344853),m=a.i(947950),n=a.i(986743),o=a.i(138100),p=a.i(684321),q=a.i(821415),r=a.i(706210),s=a.i(182248),t=a.i(644468),u=a.i(938934),v=b([i,l,m,n,o,t]);async function w(a,b,c,f){var k,v,w,z,A,B,C,D,E,F;let G,H,I,J,K,L,M,N=await (0,q.openWorkspace)(),O=a.trim(),[P,Q,R,S,T,U,V,W,X]=await Promise.all([(0,o.loadSkills)(N,O),(0,n.listNoteIndex)(),(0,t.listConnectedToolNames)(),(0,m.findPinnedTools)(O),(0,i.listJobBots)(),(0,h.listBotMemory)(O),(0,i.readBotMemoryOn)(),(0,q.readMachineTools)(N),(0,l.listBotWork)(O,c?.thread??null)]),Y=T.filter(a=>a.name!==O),Z=T.find(a=>a.name===O)??await (0,i.findJobBot)(O),$=[(k=O,v=Z,w=c,H=(G=w?.owner??k)===k?"**You** coordinate this thread: its result goes from you to Thursday.":`**${G}** coordinates this thread and brings its result to Thursday.`,I=w?`
2
2
 
3
3
  Current conversation: ${w.caller} → ${k}. Your final text goes back to ${w.caller}.`:"",J=v?`
4
- Others know you as: ${(0,j.rosterLine)(v)}`:"",`You are ${k}, one of the bots in this thread. ${(0,u.nowLine)()}${J}
4
+ Others know you as: ${(0,j.rosterLine)(v)}`:"",`You are ${k}, one of the bots in this thread. ${(0,u.todayLine)()}${J}
5
5
 
6
6
  - **The user** — the one person all of this is for. They talk with Thursday by voice and follow this thread on their screen.
7
7
  - **Thursday** — their personal assistant. She talks with them, hands bots the work that takes time, and tells them what comes back.
@@ -76,13 +76,13 @@ ${(0,f.botGuideLine)()}`};a.s(["buildThreadOpening",0,function(a){if(a.routine){
76
76
 
77
77
  ${a.request.trim()}`}]}let b="user"===a.from?"The user":"Thursday";return[{type:"text",text:`You are ${a.bot}. ${b} hands you this thread${"user"===a.from?" on screen":" during a call"}.`},{type:"text",text:`## ${b} → ${a.bot}: the job
78
78
 
79
- ${a.request.trim()}`}]},"loadBotPrompt",0,w]),c()}catch(a){c(a)}},!1),938934,a=>{"use strict";var b=a.i(12208),c=a.i(868468),d=a.i(569572),e=a.i(762008),f=a.i(951941),g=a.i(626550),h=a.i(706210),i=a.i(176668),j=a.i(987674),k=a.i(182248);let l=(a=new Date)=>`${(0,b.format)(a,"yyyy-MM-dd (EEE) HH:mm")} ${Intl.DateTimeFormat().resolvedOptions().timeZone}`,m=(a=new Date)=>`**Now**: ${l(a)}`,n=a=>`${(0,b.format)(a,"yyyy-MM-dd (EEE) HH:mm")} (${(0,c.formatDistanceToNowStrict)(a,{addSuffix:!0})})`,o={[e.STUDIO_TOOLS.generate_image]:"images",[e.STUDIO_TOOLS.generate_speech]:"speech",[e.STUDIO_TOOLS.transcribe]:"transcription",[e.STUDIO_TOOLS.generate_video]:"video"};a.s(["botWorkHead",0,function(a,d){let e=(0,c.formatDistanceToNowStrict)(a.updatedAt,{addSuffix:!0}),f="running"===a.status?`running, last moved ${e}`:a.asking?`waiting on the user's answer since ${e}`:"waiting"===a.status?`stopped ${e}, not finished`:`${"done"===a.status?"ended":"stopped by the user"} ${(0,b.format)(a.updatedAt,"yyyy-MM-dd")}`;return`"${a.label}" — ${a.owner===d?"yours":`${a.owner}'s`} — ${f}`},"clockNow",0,l,"logPromptSize",0,function(a,b){let c=(0,j.sectionTokens)(b),e=c.reduce((a,b)=>a+b.tokens,0);i.logger.debug(`${a} prompt ${e} tokens — ${c.map(a=>`${a.name} ${a.tokens}`).join(", ")}`);let f=c[0];e>d.PROMPT_BUDGET&&f&&i.logger.warn(`${a} prompt is ${e} tokens, over ${d.PROMPT_BUDGET}: ${f.name} carries ${f.tokens} of it. Every call and every job pays this.`)},"mcpToolLines",0,function(a){let b=new Map;for(let c of a){let a=b.get(c.server);a?a.push(c.name):b.set(c.server,[c.name])}return[...b].map(([a,b])=>`- **${a}**: ${b.join(", ")}`).join("\n")},"noteLines",0,function(a,b=!1){return a.length?a.map(a=>{var c;let d,e=b?` \xb7 ${c=a.lastSeenAt,(d=Math.floor((Date.now()-(0,h.toDate)(c).getTime())/864e5))>=365?`${Math.floor(d/365)}y`:d>=30?`${Math.floor(d/30)}mo`:`${Math.max(d,0)}d`}`:"";return`- ${a.path} — ${a.description?.trim()} (${a.factCount})${e}`}).join("\n"):"(nothing saved yet)"},"nowLine",0,m,"reachNames",0,function(a,b){let c=b.map(a=>a.server===d.STUDIO_SERVER?o[a.name]??a.name:a.server);return[...new Set([...a.map(a=>a.name),...c])].join(", ")},"recentCallLines",0,function(a,b){let c=[],f=0;a:for(let h=a.length-1;h>=0;h--){let i=a[h];for(let a=i.turns.length-1;a>=0;a--){let h=function(a,b){if("tool"!==a.role)return`${"user"===a.role?"user":"you"}: ${a.text}`;let c=(0,g.searchOf)(a.tool,a.text);if(c){let b=[...new Set(c.sources.flatMap(a=>(0,k.hostOf)(a.url)??[]))];return`you → ${a.tool} "${(0,k.clip)(c.query??"",d.PROMPT_LINE.toolArgs)}"${b.length?` — ${b.join(", ")}`:""}`}let f=`you → ${a.tool??"tool"} ${(0,k.clip)(a.text,d.PROMPT_LINE.toolArgs)}`;if(a.tool!==e.TOOL_NAMES.thread_start)return f;let h=(0,g.startedLabel)(a.tool,a.text),i=h?b.jobs?.find(a=>a.label===h):void 0;if(!i)return f;let j=i.outcome?`: ${(0,k.clip)(i.outcome,d.PROMPT_LINE.jobOutcome)}`:"";return`you → ${a.tool} "${i.label}" (${i.id}) — ${i.status}${j}`}(i.turns[a],i),l=(0,j.estimateTokens)(h)+3;if(f+l>b&&c.length)break a;f+=l,c.push({call:i,line:h})}}c.reverse();let h=[],i=null;for(let{call:a,line:b}of c)a!==i&&(i=a,h.push(`### ${n(a.startedAt)}`)),h.push(b);return h.join("\n")},"saidStamp",0,a=>(0,b.format)(a,"yyyy-MM-dd (EEE) HH:mm"),"skillLines",0,(a,b={})=>a.map(a=>{var c;let e,g;return`- **${a.name}**: ${b.short?(c=a.description,e=d.PROMPT_LINE.skill,(g=(0,f.firstSentence)(c)).length>e?`${g.slice(0,e).trim()}…`:g):a.description}`}).join("\n"),"styleLines",0,a=>a?.trim()?`## Who they want you to be
79
+ ${a.request.trim()}`}]},"loadBotPrompt",0,w]),c()}catch(a){c(a)}},!1),938934,a=>{"use strict";var b=a.i(12208),c=a.i(868468),d=a.i(569572),e=a.i(762008),f=a.i(951941),g=a.i(626550),h=a.i(706210),i=a.i(176668),j=a.i(987674),k=a.i(182248);let l=(a=new Date)=>`${(0,b.format)(a,"yyyy-MM-dd (EEE) HH:mm")} ${Intl.DateTimeFormat().resolvedOptions().timeZone}`,m=a=>(0,b.format)(a,"yyyy-MM-dd (EEE) a"),n=a=>`${(0,b.format)(a,"yyyy-MM-dd (EEE) HH:mm")} (${(0,c.formatDistanceToNowStrict)(a,{addSuffix:!0})})`,o={[e.STUDIO_TOOLS.generate_image]:"images",[e.STUDIO_TOOLS.generate_speech]:"speech",[e.STUDIO_TOOLS.transcribe]:"transcription",[e.STUDIO_TOOLS.generate_video]:"video"};a.s(["botWorkHead",0,function(a,c){let d=m(a.updatedAt),e="running"===a.status?`running, last moved ${d}`:a.asking?`waiting on the user's answer since ${d}`:"waiting"===a.status?`stopped ${d}, not finished`:`${"done"===a.status?"ended":"stopped by the user"} ${(0,b.format)(a.updatedAt,"yyyy-MM-dd")}`;return`"${a.label}" — ${a.owner===c?"yours":`${a.owner}'s`} — ${e}`},"clockNow",0,l,"logPromptSize",0,function(a,b){let c=(0,j.sectionTokens)(b),e=c.reduce((a,b)=>a+b.tokens,0);i.logger.debug(`${a} prompt ${e} tokens — ${c.map(a=>`${a.name} ${a.tokens}`).join(", ")}`);let f=c[0];e>d.PROMPT_BUDGET&&f&&i.logger.warn(`${a} prompt is ${e} tokens, over ${d.PROMPT_BUDGET}: ${f.name} carries ${f.tokens} of it. Every call and every job pays this.`)},"mcpToolLines",0,function(a){let b=new Map;for(let c of a){let a=b.get(c.server);a?a.push(c.name):b.set(c.server,[c.name])}return[...b].map(([a,b])=>`- **${a}**: ${b.join(", ")}`).join("\n")},"noteLines",0,function(a,b=!1){return a.length?a.map(a=>{var c;let d,e=b?` \xb7 ${c=a.lastSeenAt,(d=Math.floor((Date.now()-(0,h.toDate)(c).getTime())/864e5))>=365?`${Math.floor(d/365)}y`:d>=30?`${Math.floor(d/30)}mo`:`${Math.max(d,0)}d`}`:"";return`- ${a.path} — ${a.description?.trim()} (${a.factCount})${e}`}).join("\n"):"(nothing saved yet)"},"reachNames",0,function(a,b){let c=b.map(a=>a.server===d.STUDIO_SERVER?o[a.name]??a.name:a.server);return[...new Set([...a.map(a=>a.name),...c])].join(", ")},"recentCallLines",0,function(a,b){let c=[],f=0;a:for(let h=a.length-1;h>=0;h--){let i=a[h];for(let a=i.turns.length-1;a>=0;a--){let h=function(a,b){if("tool"!==a.role)return`${"user"===a.role?"user":"you"}: ${a.text}`;let c=(0,g.searchOf)(a.tool,a.text);if(c){let b=[...new Set(c.sources.flatMap(a=>(0,k.hostOf)(a.url)??[]))];return`you → ${a.tool} "${(0,k.clip)(c.query??"",d.PROMPT_LINE.toolArgs)}"${b.length?` — ${b.join(", ")}`:""}`}let f=`you → ${a.tool??"tool"} ${(0,k.clip)(a.text,d.PROMPT_LINE.toolArgs)}`;if(a.tool!==e.TOOL_NAMES.thread_start)return f;let h=(0,g.startedLabel)(a.tool,a.text),i=h?b.jobs?.find(a=>a.label===h):void 0;if(!i)return f;let j=i.outcome?`: ${(0,k.clip)(i.outcome,d.PROMPT_LINE.jobOutcome)}`:"";return`you → ${a.tool} "${i.label}" (${i.id}) — ${i.status}${j}`}(i.turns[a],i),l=(0,j.estimateTokens)(h)+3;if(f+l>b&&c.length)break a;f+=l,c.push({call:i,line:h})}}c.reverse();let h=[],i=null;for(let{call:a,line:b}of c)a!==i&&(i=a,h.push(`### ${n(a.startedAt)}`)),h.push(b);return h.join("\n")},"saidStamp",0,a=>(0,b.format)(a,"yyyy-MM-dd (EEE) HH:mm"),"skillLines",0,(a,b={})=>a.map(a=>{var c;let e,g;return`- **${a.name}**: ${b.short?(c=a.description,e=d.PROMPT_LINE.skill,(g=(0,f.firstSentence)(c)).length>e?`${g.slice(0,e).trim()}…`:g):a.description}`}).join("\n"),"styleLines",0,a=>a?.trim()?`## Who they want you to be
80
80
 
81
81
  Their own words, on top of the character above: how you talk to them, how much to say, what to leave out. Where they differ from anything above, theirs wins.
82
82
 
83
- ${a.trim()}`:"","thursdayIdentity",0,(a=new Date)=>`You are Thursday, this user's own: their friend first, and their assistant second — someone they call because they want to talk to you, who can also get whatever they need done in the background. Named after Friday, the AI in *Iron Man*: a name, not a day of the week. ${m(a)}
83
+ ${a.trim()}`:"","thursdayIdentity",0,(a=new Date)=>`You are Thursday, this user's own: their friend first, and their assistant second — someone they call because they want to talk to you, who can also get whatever they need done in the background: your bots work on this computer, with a shell, a browser and their files, while you two keep talking, and what they make stays here as a page or a file. Named after Friday, the AI in *Iron Man*: a name, not a day of the week. ${((a=new Date)=>`**Now**: ${l(a)}`)(a)}
84
84
 
85
- What they tell you is kept, so you know them better over time.`,"tidying",0,a=>({crowded:a.reduce((a,b)=>a+b.factCount,0)>d.MEMORY_LIMITS.facts,heavy:a.filter(a=>a.factCount>d.MEMORY_LIMITS.factsPerNote)})])},978876,a=>a.a(async(b,c)=>{try{var d=a.i(527990),e=a.i(794219),f=a.i(569572),g=a.i(938934),h=a.i(762008),i=a.i(446957),j=a.i(109955),k=a.i(344853),l=a.i(182248),m=b([k]);[k]=m.then?(await m)():m;let o=e.string().describe("Its label or id."),p={description:"Start a new thread: hand work to a bot. Returns a receipt at once; the work runs in the background and its updates reach the conversation on their own.",parameters:e.object({bot:e.string().describe("A name from the bot list."),request:e.string().describe("The whole of the work. The bot cannot hear the call, so everything it needs goes here — names, paths, what the user actually asked for — in their own language and their own words: it is the only language the bot has, and whatever it writes comes back to them. **Their request, never your reading of it**: a condition, a caution or a smaller goal they did not say is how work comes back as the wrong thing. When their words leave a real choice open, ask them on the call and put the answer here."),label:e.string().describe("Two or three words naming the thread, in the user's language. Used on screen and said out loud.")})},q={description:"Say something to a thread that exists. Its bot reads it with everything the thread already holds.",parameters:e.object({thread:o,words:e.string().describe("What to tell its bot, in the user's language and words.")})},r={description:`Answer a question a bot asked the user. Only for a question that is waiting; anything else said to a thread is \`${h.TOOL_NAMES.thread_tell}\`.`,parameters:e.object({thread:o,bot:e.string().describe("The bot that asked."),answer:e.string().describe("The user's answer, in their words.")})},s={description:`Read threads as they are now. "all" lists up to ${f.THREAD_STATUS_LIMIT}, running and waiting work before recent endings; a label or an id reads that one whole, with its result and any question waiting.`,parameters:e.object({thread:e.string().describe('"all", or one thread by its label or its id.')})},t={description:"Stop a thread now: its bot stops where it is. The thread is kept, and saying more to it later carries it on.",parameters:e.object({thread:o})},u={description:"Put a thread in front of the user on their screen: the file it made, or the thread itself when it made none. Showing it also counts as them having seen its result.",parameters:e.object({thread:o})},v={description:"Mark a thread's result as seen by the user. It leaves the work waiting on them.",parameters:e.object({thread:o})},w={description:"Send a message to another bot or to Thursday; the delivery receipt comes back immediately. A bot answers with the final text of its turn, which reaches you later as a new message. Mark a question for Thursday to request user input; ordinary messages to Thursday are notifications and need no answer.",parameters:j.RoomMessageSchema.extend({kind:j.RoomMessageSchema.shape.kind.describe("Use question only when Thursday must obtain an answer from the user: it ends your turn, and you continue when the answer arrives. Use message for bot collaboration, progress updates and reports."),options:j.RoomMessageSchema.shape.options.describe("With a question, offer concise answer choices when useful. Omit for an open-ended question; the user can always type their own answer."),to:e.string().trim().min(1).describe("A bot from the roster other than the one you are answering, or Thursday to reach the user."),text:e.string().trim().min(1).describe("Write the message and include the context the recipient needs. A question to Thursday is put to the user word for word, on screen, on their phone and read aloud: write it to them."),why:e.string().trim().min(1).describe("What you need from them, in a few words, written for the user to read: they see who was brought in and what for.")})},x={description:"Open one of your other threads whole: what you were asked there and your last words in full.",parameters:e.object({id:e.string().describe("The id in brackets on its line under Your other threads.")})};async function n(a,b){let c=await (0,k.listBotWork)(a,b),e=[...c.open,...c.recent];if(!e.some(a=>a.cut))return{};let j=new Set;return{[h.TOOL_NAMES.thread_recall]:(0,d.tool)({description:x.description,inputSchema:x.parameters,execute:async({id:b})=>{let c=b.trim().replace(/^\[|\]$/g,"").toLowerCase(),d=e.find(a=>c.length>=4&&(a.id.startsWith(c)||a.label.toLowerCase()===c));if(!d)return`No thread "${b}" on your list. The ids there: ${e.filter(a=>a.cut).map(a=>(0,i.workHandle)(a.id)).join(", ")}.`;if(!d.cut)return"Its line already shows all of it.";if(j.has(d.id))return"Already opened above, this turn.";if(j.size>=f.BOT_WORK.reads)return`${f.BOT_WORK.reads} threads are open already this turn. Carry on with what you have.`;j.add(d.id);let h=await (0,k.readBotAsk)(a,d),m=d.said??"";return[(0,g.botWorkHead)(d,a),h?`You were asked: ${(0,l.clip)(h,f.BOT_WORK.asked)}`:"",`Your last words there:
85
+ What they tell you is kept, so you know them better over time.`,"tidying",0,a=>({crowded:a.reduce((a,b)=>a+b.factCount,0)>d.MEMORY_LIMITS.facts,heavy:a.filter(a=>a.factCount>d.MEMORY_LIMITS.factsPerNote)}),"todayLine",0,(a=new Date)=>`**Today**: ${m(a)}, ${Intl.DateTimeFormat().resolvedOptions().timeZone} — \`date\` has the exact time`])},978876,a=>a.a(async(b,c)=>{try{var d=a.i(527990),e=a.i(794219),f=a.i(569572),g=a.i(938934),h=a.i(762008),i=a.i(446957),j=a.i(109955),k=a.i(344853),l=a.i(182248),m=b([k]);[k]=m.then?(await m)():m;let o=e.string().describe("Its label or id."),p={description:"Start a new thread: hand work to a bot. Returns a receipt at once; the work runs in the background and its updates reach the conversation on their own.",parameters:e.object({bot:e.string().describe("A name from the bot list."),request:e.string().describe("The whole of the work. The bot cannot hear the call, so everything it needs goes here — names, paths, what the user actually asked for — in their own language and their own words: it is the only language the bot has, and whatever it writes comes back to them. **Their request, never your reading of it**: a condition, a caution or a smaller goal they did not say is how work comes back as the wrong thing. When their words leave a real choice open, ask them on the call and put the answer here."),label:e.string().describe("Two or three words naming the thread, in the user's language. Used on screen and said out loud.")})},q={description:"Say something to a thread that exists. Its bot reads it with everything the thread already holds.",parameters:e.object({thread:o,words:e.string().describe("What to tell its bot, in the user's language and words.")})},r={description:`Answer a question a bot asked the user. Only for a question that is waiting; anything else said to a thread is \`${h.TOOL_NAMES.thread_tell}\`.`,parameters:e.object({thread:o,bot:e.string().describe("The bot that asked."),answer:e.string().describe("The user's answer, in their words.")})},s={description:`Read threads as they are now. "all" lists up to ${f.THREAD_STATUS_LIMIT}, running and waiting work before recent endings; a label or an id reads that one whole, with its result and any question waiting.`,parameters:e.object({thread:e.string().describe('"all", or one thread by its label or its id.')})},t={description:"Stop a thread now: its bot stops where it is. The thread is kept, and saying more to it later carries it on.",parameters:e.object({thread:o})},u={description:"Put a thread in front of the user on their screen: the file it made, or the thread itself when it made none. Showing it also counts as them having seen its result.",parameters:e.object({thread:o})},v={description:"Mark a thread's result as seen by the user. It leaves the work waiting on them.",parameters:e.object({thread:o})},w={description:"Send a message to another bot or to Thursday; the delivery receipt comes back immediately. A bot answers with the final text of its turn, which reaches you later as a new message. Mark a question for Thursday to request user input; ordinary messages to Thursday are notifications and need no answer.",parameters:j.RoomMessageSchema.extend({kind:j.RoomMessageSchema.shape.kind.describe("Use question only when Thursday must obtain an answer from the user: it ends your turn, and you continue when the answer arrives. Use message for bot collaboration, progress updates and reports."),options:j.RoomMessageSchema.shape.options.describe("With a question, offer concise answer choices when useful. Omit for an open-ended question; the user can always type their own answer."),to:e.string().trim().min(1).describe("A bot from the roster other than the one you are answering, or Thursday to reach the user."),text:e.string().trim().min(1).describe("Write the message and include the context the recipient needs. A question to Thursday is put to the user word for word, on screen, on their phone and read aloud: write it to them."),why:e.string().trim().min(1).describe("What you need from them, in a few words, written for the user to read: they see who was brought in and what for.")})},x={description:"Open one of your other threads whole: what you were asked there and your last words in full.",parameters:e.object({id:e.string().describe("The id in brackets on its line under Your other threads.")})};async function n(a,b){let c=await (0,k.listBotWork)(a,b),e=[...c.open,...c.recent];if(!e.some(a=>a.cut))return{};let j=new Set;return{[h.TOOL_NAMES.thread_recall]:(0,d.tool)({description:x.description,inputSchema:x.parameters,execute:async({id:b})=>{let c=b.trim().replace(/^\[|\]$/g,"").toLowerCase(),d=e.find(a=>c.length>=4&&(a.id.startsWith(c)||a.label.toLowerCase()===c));if(!d)return`No thread "${b}" on your list. The ids there: ${e.filter(a=>a.cut).map(a=>(0,i.workHandle)(a.id)).join(", ")}.`;if(!d.cut)return"Its line already shows all of it.";if(j.has(d.id))return"Already opened above, this turn.";if(j.size>=f.BOT_WORK.reads)return`${f.BOT_WORK.reads} threads are open already this turn. Carry on with what you have.`;j.add(d.id);let h=await (0,k.readBotAsk)(a,d),m=d.said??"";return[(0,g.botWorkHead)(d,a),h?`You were asked: ${(0,l.clip)(h,f.BOT_WORK.asked)}`:"",`Your last words there:
86
86
  ${m.length>f.BOT_WORK.readChars?`${m.slice(0,f.BOT_WORK.readChars)}
87
87
  [Cut here; the files it names hold the rest.]`:m}`].filter(Boolean).join("\n\n")}})}}a.s(["createThreadRecallTool",0,n,"sendMessageSpec",0,w,"threadAnswerSpec",0,r,"threadCancelSpec",0,t,"threadSeenSpec",0,v,"threadShowSpec",0,u,"threadStartSpec",0,p,"threadStatusSpec",0,s,"threadTellSpec",0,q]),c()}catch(a){c(a)}},!1),375827,a=>{"use strict";var b=a.i(527990),c=a.i(794219),d=a.i(762008);let e=Object.keys({A:[".##.","#..#","####","#..#","#..#"],B:["###.","#..#","###.","#..#","###."],C:[".###","#...","#...","#...",".###"],D:["###.","#..#","#..#","#..#","###."],E:["####","#...","###.","#...","####"],F:["####","#...","###.","#...","#..."],G:[".###","#...","#.##","#..#",".###"],H:["#..#","#..#","####","#..#","#..#"],I:["###",".#.",".#.",".#.","###"],J:["..##","...#","...#","#..#",".##."],K:["#..#","#.#.","##..","#.#.","#..#"],L:["#...","#...","#...","#...","####"],M:["#...#","##.##","#.#.#","#...#","#...#"],N:["#..#","##.#","#.##","#..#","#..#"],O:[".##.","#..#","#..#","#..#",".##."],P:["###.","#..#","###.","#...","#..."],Q:[".##.","#..#","#..#","#.#.",".#.#"],R:["###.","#..#","###.","#.#.","#..#"],S:[".###","#...",".##.","...#","###."],T:["###",".#.",".#.",".#.",".#."],U:["#..#","#..#","#..#","#..#",".##."],V:["#...#","#...#",".#.#.",".#.#.","..#.."],W:["#...#","#...#","#.#.#","##.##","#...#"],X:["#..#","#..#",".##.","#..#","#..#"],Y:["#.#","#.#",".#.",".#.",".#."],Z:["####","...#",".##.","#...","####"],0:[".##.","#.##","#..#","##.#",".##."],1:[".#.","##.",".#.",".#.","###"],2:["###.","...#",".##.","#...","####"],3:["###.","...#",".##.","...#","###."],4:["#..#","#..#","####","...#","...#"],5:["####","#...","###.","...#","###."],6:[".##.","#...","###.","#..#",".##."],7:["####","...#","..#.",".#..",".#.."],8:[".##.","#..#",".##.","#..#",".##."],9:[".##.","#..#",".###","...#",".##."],"!":["#","#","#",".","#"],"?":["###.","...#",".##.","....",".#.."],".":[".",".",".",".","#"],",":["..","..","..",".#","#."],"'":["#","#",".",".","."],"-":["...","...","###","...","..."],"+":["...",".#.","###",".#.","..."],":":[".","#",".","#","."],"(":[".#","#.","#.","#.",".#"],")":["#.",".#",".#",".#","#."],"<":["..#",".#.","#..",".#.","..#"],">":["#..",".#.","..#",".#.","#.."],"^":[".#.","#.#","...","...","..."],"~":["....",".#.#","#.#.","....","...."],"♥":[".#.#.","#####","#####",".###.","..#.."]," ":["..","..","..","..",".."]}).filter(a=>!/^[A-Z0-9 ]$/.test(a)),f={description:`End the call.
88
88
 
@@ -110,10 +110,10 @@ Every command is a new shell: \`cd\`, exported variables and an activated venv a
110
110
  Nothing is watching it. A command that stops to ask never gets an answer and is killed after ${e.EXEC_TIMEOUT_MS/1e3}s, so pass the flag that skips the question (\`-y\`, \`--yes\`, \`--no-input\`), and send anything genuinely long to the background with its output redirected to a file.
111
111
 
112
112
  Keys are not in the environment: every variable named like a key, a token or a secret is removed before the shell starts. An empty one is not an unset one — say which it was, and ask for what a command needs.`;a.s(["createWorkspaceTools",0,(a,e)=>{let k=!0===e.guide,l=async a=>{let b=e.bot;if(!b)return{result:await a(),memory:null};let c=await (0,g.holdBotMemory)(b);return{result:await a(),memory:await (0,g.keepBotMemory)(b,c)}},m=(0,c.tool)({description:i.BASH?"Run a bash command.":"Run a command in sh: this machine has no bash, so bash-only syntax fails.",inputSchema:d.default.object({command:d.default.string(),description:d.default.string().nullish().describe("One short line for the user: what this command does and why. Shown on their screen while it runs — not a restatement of the command.")}),execute:async({command:b},{abortSignal:c})=>{let{result:d,memory:f}=await l(()=>a.exec(b,{signal:c,env:e.env,timeoutMs:e.timeoutMs})),g=f?{...d,memory:f}:d;return k?(k=!1,{...g,guide:j}):g}});if(!e.write)return{[f.TOOL_NAMES.bash]:m};let n=(0,c.tool)({description:"Write a whole file — what was there is gone. Parent directories are created.",inputSchema:d.default.object({path:d.default.string().describe("Relative to the working directory — under one of its folders — or absolute"),content:d.default.string(),description:d.default.string().nullish().describe("One short line for the user: what this file is. Shown on their screen next to the path.")}),execute:async({path:c,content:d})=>{let f,g=a.resolve(c),i=(0,h.writeRefusal)(g,e.bot);if(i)return i;let{memory:j}=await l(()=>a.writeFile(c,d));return j??`Wrote ${(f=(0,b.relative)(a.cwd,g))&&!f.startsWith("..")?f:g} (${d.split("\n").length} lines)`}});return{[f.TOOL_NAMES.bash]:m,[f.TOOL_NAMES.write_file]:n}}])},346580,a=>{"use strict";a.s(["asWords",0,function(a,b,c=a=>a){let d=[];for(let e of a){if("tool"===e.role)continue;if("system"===e.role){d.push(e);continue}if("user"===e.role){d.push("string"==typeof e.content?{role:"user",content:c(e.content)}:e);continue}let a="string"==typeof e.content?[{type:"text",text:e.content}]:e.content,f=a.flatMap(a=>"text"===a.type?[a.text]:[]).join("\n").trim()||a.flatMap(a=>"tool-call"===a.type?[b(a.toolName,a.input)]:[]).join("\n");if(!f)continue;let g=d.at(-1);g?.role==="assistant"&&"string"==typeof g.content?d[d.length-1]={role:"assistant",content:`${g.content}
113
- ${c(f)}`}:d.push({role:"assistant",content:c(f)})}return d}])},641301,a=>{"use strict";var b=a.i(912714),c=a.i(750227),d=a.i(569572),e=a.i(821415);let f=a=>`${(0,e.botFolder)(a)}/memory`;async function g(a,b=d.BOT_MEMORY_LIMITS.files){let i=f(a),j=(0,c.join)(e.WORKSPACE,i),k=(await h(j)).sort((a,b)=>b.info.mtimeMs-a.info.mtimeMs),m=await Promise.all(k.slice(0,b).map(async({name:a,info:b})=>({file:a,path:`${i}/${a}`,line:await l((0,c.join)(j,a)),at:new Date(b.mtimeMs),bytes:b.size})));return{folder:i,entries:m,total:k.length}}async function h(a){let d=await (0,b.readdir)(a).catch(()=>[]);return(await Promise.all(d.filter(a=>!a.startsWith(".")).map(async d=>{let e=await (0,b.stat)((0,c.join)(a,d)).catch(()=>null);return e?.isFile()?{name:d,info:e}:null}))).filter(a=>null!==a)}async function i(a){let g=(0,c.join)(e.WORKSPACE,f(a)),i=new Map;return await Promise.all((await h(g)).map(async({name:a,info:e})=>{let f=e.size>4*d.BOT_MEMORY_LIMITS.chars?null:await (0,b.readFile)((0,c.join)(g,a),"utf8").catch(()=>null);i.set(a,{text:null!==f&&k(f)<=d.BOT_MEMORY_LIMITS.chars?f:null,size:e.size,mtimeMs:e.mtimeMs,atime:e.atime,mtime:e.mtime})})),i}async function j(a,g){let i=f(a),j=(0,c.join)(e.WORKSPACE,i),{files:l,chars:m}=d.BOT_MEMORY_LIMITS,n=[],o=[],p=0;for(let{name:a,info:d}of(await h(j))){p+=1;let e=g.get(a);if(e&&e.size===d.size&&e.mtimeMs===d.mtimeMs)continue;let f=(0,c.join)(j,a),h=k(await (0,b.readFile)(f,"utf8").catch(()=>""));if(h<=m){e||o.push(a);continue}let l=`${h.toLocaleString("en-US")} characters, past the ${m.toLocaleString("en-US")} a memory file holds`;e?null!==e.text?(await (0,b.writeFile)(f,e.text),await (0,b.utimes)(f,e.atime,e.mtime),n.push(`Not kept: \`${i}/${a}\` came to ${l}, so it is back as it was. Write it again shorter.`)):n.push(`\`${i}/${a}\` is ${l}. Shorten it.`):(await (0,b.rm)(f,{force:!0}),p-=1,n.push(`Not kept: \`${i}/${a}\` came to ${l}, so it was removed. Write it again shorter.`))}if(p>l&&o.length){await Promise.all(o.map(a=>(0,b.rm)((0,c.join)(j,a),{force:!0})));let a=o.map(a=>`\`${i}/${a}\``).join(", ");n.push(`Not kept: your memory holds ${l} files at most and this made ${p}, so ${a} ${1===o.length?"was":"were"} removed. Delete or merge files no longer worth keeping, then write it again.`)}return n.length?n.join("\n"):null}let k=a=>[...a.trim()].length;async function l(a){let c=await (0,b.open)(a,"r").catch(()=>null);if(!c)return"";try{let a=Buffer.alloc(1024),{bytesRead:b}=await c.read(a,0,1024,0),d=a.toString("utf8",0,b).split("\n").map(a=>a.trim()).filter(Boolean);if("---"===d[0]){let a=d.find(a=>a.startsWith("description:"));if(a)return a.slice(12).trim().replace(/^["']|["']$/g,"");let b=d.indexOf("---",1);return b>0?(d[b+1]??"").replace(/^#+\s*/,""):""}return(d[0]??"").replace(/^#+\s*/,"")}finally{await c.close()}}a.s(["botMemoryFolder",0,f,"holdBotMemory",0,i,"keepBotMemory",0,j,"listBotMemory",0,g])},654034,a=>a.a(async(b,c)=>{try{var d=a.i(47919),e=a.i(527990),f=a.i(569572),g=a.i(738131),h=a.i(875931),i=a.i(735502),j=a.i(978876),k=a.i(762008),l=a.i(346580),m=a.i(446957),n=a.i(487591),o=a.i(821415),p=a.i(176668),q=a.i(987674),r=a.i(221214),s=a.i(109955),t=a.i(344853),u=b([g,h,i,j,r,t]);[g,h,i,j,r,t]=u.then?(await u)():u;let z=f.BOT_RUN.steps;async function v(a,b){var c,l;let u,v,y,B,C,D,E,F,G,H=b.parent??null,I=await (0,r.findJobBot)(a.bot.trim()),J=I?.name??a.bot.trim(),K=a=>b.emit({...a,bot:J,parent:H});if(!I)return void await K({type:"error",message:`No bot named "${a.bot}". Use a name from the list.`,retry:!1});let L=a.messages,M=await ((c=I).provider&&c.model?(0,h.getTextModel)({provider:c.provider,model:c.model}):(0,h.resolveDefaultModel)().then(h.getTextModel)),N=b.threadId?await (0,t.findThread)(b.threadId):null,[O,{own:P,artifacts:Q}]=await Promise.all([b.threadId?(0,o.openJobScratch)(b.threadId,N?.label??"job"):null,(0,o.openBotFolders)(J)]),R=b.session??(b.threadId?(0,o.botBrowserSession)(b.threadId,J):null),[S,T]=await Promise.all([(0,i.loadBotPrompt)(J,I.systemPrompt,{thread:b.threadId??null,owner:b.owner,caller:b.caller},{scratch:O,own:P,artifacts:Q}),(0,g.loadTools)({target:"bot",bot:J,thread:b.threadId??null,session:R,model:M})]),U=Math.min(await (0,h.compactBudget)(M.ref,I.compactAt),b.contextBudget||1/0),V=await (0,h.runEffort)(M.ref,I.effort),W=!1,X={...T,[k.TOOL_NAMES.send_message]:(0,e.tool)({description:j.sendMessageSpec.description,inputSchema:j.sendMessageSpec.parameters,execute:async(a,c)=>{let d=await b.send({...a,id:c.toolCallId});if("question"===a.kind&&(W=!0),!d||"object"!=typeof d||!("to"in d))return d;let e=String(d.to);return e===s.ROOM_THURSDAY?d:{...d,note:`${e} has it now. When they finish, their answer — what they did and where the files are — comes to you as a new message and wakes you. Until then you do not know it: do not report it, guess it or do it yourself, and do not watch their folder. Go on with other work, or end your turn if there is none; the thread stays open.`}}})},Y=new Set,Z=(l=f.BOT_RUN.silenceMs,v=new AbortController,y=0,B=!1,C=()=>{clearTimeout(u),u=void 0,B||y>0||(u=setTimeout(()=>{v.abort(new DOMException(`The model sent nothing for ${Math.round(l/6e4)} minutes.`,"TimeoutError"))},l))},{signal:v.signal,touch:C,hold:()=>{y+=1,C()},release:()=>{y=Math.max(0,y-1),C()},end:()=>{B=!0,C()}});for(let[a,c]of Object.entries(X)){let d=c.execute;d&&(c.execute=(c,e)=>{let f=(async()=>{b.signal?.throwIfAborted(),await K({type:"tool",id:e.toolCallId,name:a,input:c}),Z.hold();try{b.signal?.throwIfAborted();let f=await d(c,e);if(f&&"object"==typeof f&&Symbol.asyncIterator in f){let a;for await(let b of f)a=b;f=a}return await K({type:"tool-result",id:e.toolCallId,name:a,output:f}),f}catch(b){throw await K({type:"tool-result",id:e.toolCallId,name:a,output:(0,h.modelErrorToString)(b),error:!0}),b}finally{Z.release()}})();return Y.add(f),f.finally(()=>Y.delete(f)).catch(()=>{}),f})}let $=Promise.resolve(),_=()=>{},aa=0,ab=new d.ToolLoopAgent({model:M.model,instructions:S.text,tools:X,reasoning:V,stopWhen:[(0,d.stepCountIs)(z),()=>W],prepareStep:async({stepNumber:a,steps:c,messages:d})=>{await $,b.signal?.throwIfAborted();let e={},f=(c.at(-1)?.usage.inputTokens??0)||d.reduce((a,b)=>a+(0,q.estimateTokens)("string"==typeof b.content?b.content:JSON.stringify(b.content))+4,0);aa=f;let g=d,h=b.compactNow?.()??!1;if((f>U||h)&&d.length>2){Z.hold();let a=await x(M.model,X,d,{signal:b.signal,budget:U,instructions:S.text}).finally(Z.release);p.logger.debug(`compacted ${d.length} messages at ${f} tokens (budget ${U})`);let c=`${a.text}${await w(N?.id??null,d,O)}`;await K({type:"compact",text:c,usage:a.usage,messages:d.length,tokens:f}),g=[d[0],{role:"user",content:c}]}let i=a>0?await b.notes?.()??[]:[];return(i.length&&(g=[...g,...i.map(a=>({role:"user",content:a}))]),g===d)?e:{...e,messages:g}}}),ac=(D=[],E=[],F=!1,{push(a){let b=E.shift();b?b(a):D.push(a)},take(){let a=D.shift();return a?Promise.resolve(a):F?Promise.resolve(null):new Promise(a=>E.push(a))},end(){for(let a of(F=!0,E.splice(0)))a(null)}}),ad=b.signal?AbortSignal.any([b.signal,Z.signal]):Z.signal;Z.touch();let ae=new AbortController,af=AbortSignal.any([ad,ae.signal]);try{G=await ab.stream({messages:L,abortSignal:af,onStepEnd:a=>{$=new Promise(a=>{_=a}),ac.push({messages:function(a){if(!a.toolResults.length)return a.response.messages;let b=new Map(a.toolResults.map(a=>[a.toolCallId,a.output]));return a.response.messages.map(a=>"tool"!==a.role?a:{...a,content:a.content.map(a=>{if("tool-result"!==a.type||!b.has(a.toolCallId))return a;let c=b.get(a.toolCallId);return{...a,output:"string"==typeof c?{type:"text",value:c}:{type:"json",value:c}}})})}(a),usage:A(a.usage)})}})}catch(a){throw Z.end(),ae.abort(),await Promise.allSettled([...Y]),a}let ag="",ah="",ai=null,aj=a=>{p.logger.error(`${J}: the model run broke`,a);let b=(0,h.modelErrorToString)(a),c=!(0,h.isProviderRefusal)(a);if(!(0,h.isContextOverflow)(a))return{type:"error",message:b,retry:c};let d=Math.floor(Math.min(U,aa||U)*f.BOT_RUN.overflowShrink);return{type:"error",message:b,budget:Math.max(m.COMPACT_AT_MIN,d),retry:c}};ad.addEventListener("abort",()=>{ac.end(),_()},{once:!0});try{for await(let a of G.stream)switch(Z.touch(),a.type){case"start-step":ah="",ag="";break;case"text-delta":ag+=a.text;break;case"text-end":{let a=ag.trim();if(ag="",!a)break;ah=[ah,a].filter(Boolean).join("\n\n"),await K({type:"text",text:a});break}case"tool-call":await K({type:"tool",id:a.toolCallId,name:a.toolName,input:a.input,providerExecuted:a.providerExecuted,providerOptions:a.providerMetadata});break;case"tool-result":await K({type:"tool-result",id:a.toolCallId,name:a.toolName,output:a.output});break;case"tool-error":await K({type:"tool-result",id:a.toolCallId,name:a.toolName,output:(0,h.modelErrorToString)(a.error),error:!0});break;case"finish-step":{ai=a.finishReason;let b=await ac.take();b&&await K({type:"step",...b,budget:U}),_();break}case"abort":if(b.signal?.aborted)return;await K(aj(a.reason??"The model stopped sending."));return;case"error":await K(aj(a.error));return}}finally{ae.abort(),ac.end(),Z.end(),_(),await Promise.allSettled([...Y]),R&&(0,n.renewSignIns)(R).catch(a=>p.logger.warn(`${J}: kept sign-ins were not renewed`,a))}try{await G.finalStep}catch(a){if(b.signal?.aborted)return;await K(aj(a));return}"content-filter"===ai?await K({type:"error",message:"The provider's content filter stopped the response.",retry:!1}):await K({type:"turn-end",text:ah,stopped:!W&&("length"===ai||"error"===ai||"tool-calls"===ai)})}async function w(a,b,c){try{let d=a?await (0,t.listWrittenPaths)(a):(0,t.writtenPathsIn)(b.map(a=>a.content)),e=await (0,o.filesOnDisk)(d,c);if(!e.length)return"";let g=e.slice(-f.BOT_RUN.compactFiles),h=e.length-g.length,i=g.map(a=>`- ${a}`);return h&&i.unshift(`- …and ${h} older ones`),`
113
+ ${c(f)}`}:d.push({role:"assistant",content:c(f)})}return d}])},641301,a=>{"use strict";var b=a.i(912714),c=a.i(750227),d=a.i(569572),e=a.i(821415);let f=a=>`${(0,e.botFolder)(a)}/memory`;async function g(a,b=d.BOT_MEMORY_LIMITS.files){let i=f(a),j=(0,c.join)(e.WORKSPACE,i),k=(await h(j)).sort((a,b)=>b.info.mtimeMs-a.info.mtimeMs),m=await Promise.all(k.slice(0,b).map(async({name:a,info:b})=>({file:a,path:`${i}/${a}`,line:await l((0,c.join)(j,a)),at:new Date(b.mtimeMs),bytes:b.size})));return{folder:i,entries:m,total:k.length}}async function h(a){let d=await (0,b.readdir)(a).catch(()=>[]);return(await Promise.all(d.filter(a=>!a.startsWith(".")).map(async d=>{let e=await (0,b.stat)((0,c.join)(a,d)).catch(()=>null);return e?.isFile()?{name:d,info:e}:null}))).filter(a=>null!==a)}async function i(a){let g=(0,c.join)(e.WORKSPACE,f(a)),i=new Map;return await Promise.all((await h(g)).map(async({name:a,info:e})=>{let f=e.size>4*d.BOT_MEMORY_LIMITS.chars?null:await (0,b.readFile)((0,c.join)(g,a),"utf8").catch(()=>null);i.set(a,{text:null!==f&&k(f)<=d.BOT_MEMORY_LIMITS.chars?f:null,size:e.size,mtimeMs:e.mtimeMs,atime:e.atime,mtime:e.mtime})})),i}async function j(a,g){let i=f(a),j=(0,c.join)(e.WORKSPACE,i),{files:l,chars:m}=d.BOT_MEMORY_LIMITS,n=[],o=[],p=0;for(let{name:a,info:d}of(await h(j))){p+=1;let e=g.get(a);if(e&&e.size===d.size&&e.mtimeMs===d.mtimeMs)continue;let f=(0,c.join)(j,a),h=k(await (0,b.readFile)(f,"utf8").catch(()=>""));if(h<=m){e||o.push(a);continue}let l=`${h.toLocaleString("en-US")} characters, past the ${m.toLocaleString("en-US")} a memory file holds`;e?null!==e.text?(await (0,b.writeFile)(f,e.text),await (0,b.utimes)(f,e.atime,e.mtime),n.push(`Not kept: \`${i}/${a}\` came to ${l}, so it is back as it was. Write it again shorter.`)):n.push(`\`${i}/${a}\` is ${l}. Shorten it.`):(await (0,b.rm)(f,{force:!0}),p-=1,n.push(`Not kept: \`${i}/${a}\` came to ${l}, so it was removed. Write it again shorter.`))}if(p>l&&o.length){await Promise.all(o.map(a=>(0,b.rm)((0,c.join)(j,a),{force:!0})));let a=o.map(a=>`\`${i}/${a}\``).join(", ");n.push(`Not kept: your memory holds ${l} files at most and this made ${p}, so ${a} ${1===o.length?"was":"were"} removed. Delete or merge files no longer worth keeping, then write it again.`)}return n.length?n.join("\n"):null}let k=a=>[...a.trim()].length;async function l(a){let c=await (0,b.open)(a,"r").catch(()=>null);if(!c)return"";try{let a=Buffer.alloc(1024),{bytesRead:b}=await c.read(a,0,1024,0),d=a.toString("utf8",0,b).split("\n").map(a=>a.trim()).filter(Boolean);if("---"===d[0]){let a=d.find(a=>a.startsWith("description:"));if(a)return a.slice(12).trim().replace(/^["']|["']$/g,"");let b=d.indexOf("---",1);return b>0?(d[b+1]??"").replace(/^#+\s*/,""):""}return(d[0]??"").replace(/^#+\s*/,"")}finally{await c.close()}}a.s(["botMemoryFolder",0,f,"holdBotMemory",0,i,"keepBotMemory",0,j,"listBotMemory",0,g])},654034,a=>a.a(async(b,c)=>{try{var d=a.i(666680),e=a.i(47919),f=a.i(527990),g=a.i(569572),h=a.i(738131),i=a.i(875931),j=a.i(735502),k=a.i(978876),l=a.i(762008),m=a.i(346580),n=a.i(446957),o=a.i(487591),p=a.i(821415),q=a.i(176668),r=a.i(987674),s=a.i(221214),t=a.i(109955),u=a.i(344853),v=b([h,i,j,k,s,u]);[h,i,j,k,s,u]=v.then?(await v)():v;let B=g.BOT_RUN.steps;async function w(a,b){var c;let d,m,v,w,z,E,F,G,H,I=b.parent??null,J=await (0,s.findJobBot)(a.bot.trim()),K=J?.name??a.bot.trim(),L=a=>b.emit({...a,bot:K,parent:I});if(!J)return void await L({type:"error",message:`No bot named "${a.bot}". Use a name from the list.`,retry:!1});let M=a.messages,N=await A(J),O=b.threadId?await (0,u.findThread)(b.threadId):null,[P,{own:Q,artifacts:R}]=await Promise.all([b.threadId?(0,p.openJobScratch)(b.threadId,O?.label??"job"):null,(0,p.openBotFolders)(K)]),S=b.session??(b.threadId?(0,p.botBrowserSession)(b.threadId,K):null),[T,U]=await Promise.all([(0,j.loadBotPrompt)(K,J.systemPrompt,{thread:b.threadId??null,owner:b.owner,caller:b.caller},{scratch:P,own:Q,artifacts:R}),(0,h.loadTools)({target:"bot",bot:K,thread:b.threadId??null,session:S,model:N})]),V=Math.min(await (0,i.compactBudget)(N.ref,J.compactAt),b.contextBudget||1/0),W=await (0,i.runEffort)(N.ref,J.effort),X=(0,i.promptCacheOptions)(N.ref,b.threadId?D(b.threadId,K):null),Y=!1,Z={...U,[l.TOOL_NAMES.send_message]:(0,f.tool)({description:k.sendMessageSpec.description,inputSchema:k.sendMessageSpec.parameters,execute:async(a,c)=>{let d=await b.send({...a,id:c.toolCallId});if("question"===a.kind&&(Y=!0),!d||"object"!=typeof d||!("to"in d))return d;let e=String(d.to);return e===t.ROOM_THURSDAY?d:{...d,note:`${e} has it now. When they finish, their answer — what they did and where the files are — comes to you as a new message and wakes you. Until then you do not know it: do not report it, guess it or do it yourself, and do not watch their folder. Go on with other work, or end your turn if there is none; the thread stays open.`}}})},$=new Set,_=(c=g.BOT_RUN.silenceMs,m=new AbortController,v=0,w=!1,z=()=>{clearTimeout(d),d=void 0,w||v>0||(d=setTimeout(()=>{m.abort(new DOMException(`The model sent nothing for ${Math.round(c/6e4)} minutes.`,"TimeoutError"))},c))},{signal:m.signal,touch:z,hold:()=>{v+=1,z()},release:()=>{v=Math.max(0,v-1),z()},end:()=>{w=!0,z()}});for(let[a,c]of Object.entries(Z)){let d=c.execute;d&&(c.execute=(c,e)=>{let f=(async()=>{b.signal?.throwIfAborted(),await L({type:"tool",id:e.toolCallId,name:a,input:c}),_.hold();try{b.signal?.throwIfAborted();let f=await d(c,e);if(f&&"object"==typeof f&&Symbol.asyncIterator in f){let a;for await(let b of f)a=b;f=a}return await L({type:"tool-result",id:e.toolCallId,name:a,output:f}),f}catch(b){throw await L({type:"tool-result",id:e.toolCallId,name:a,output:(0,i.modelErrorToString)(b),error:!0}),b}finally{_.release()}})();return $.add(f),f.finally(()=>$.delete(f)).catch(()=>{}),f})}let aa=Promise.resolve(),ab=()=>{},ac=0,ad=new e.ToolLoopAgent({model:N.model,instructions:T.text,tools:Z,reasoning:W,providerOptions:X,stopWhen:[(0,e.stepCountIs)(B),()=>Y],prepareStep:async({stepNumber:a,steps:c,messages:d})=>{await aa,b.signal?.throwIfAborted();let e={},f=(c.at(-1)?.usage.inputTokens??0)||d.reduce((a,b)=>a+(0,r.estimateTokens)("string"==typeof b.content?b.content:JSON.stringify(b.content))+4,0);ac=f;let g=d,h=b.compactNow?.()??!1;if((f>V||h)&&d.length>2){_.hold();let a=await y(N.model,Z,d,{signal:b.signal,budget:V,instructions:T.text,providerOptions:X}).finally(_.release);q.logger.debug(`compacted ${d.length} messages at ${f} tokens (budget ${V})`);let c=`${a.text}${await x(O?.id??null,d,P)}`;await L({type:"compact",text:c,usage:a.usage,messages:d.length,tokens:f}),g=[d[0],{role:"user",content:c}]}let i=a>0?await b.notes?.()??[]:[];return(i.length&&(g=[...g,...i.map(a=>({role:"user",content:a}))]),g===d)?e:{...e,messages:g}}}),ae=(E=[],F=[],G=!1,{push(a){let b=F.shift();b?b(a):E.push(a)},take(){let a=E.shift();return a?Promise.resolve(a):G?Promise.resolve(null):new Promise(a=>F.push(a))},end(){for(let a of(G=!0,F.splice(0)))a(null)}}),af=b.signal?AbortSignal.any([b.signal,_.signal]):_.signal;_.touch();let ag=new AbortController,ah=AbortSignal.any([af,ag.signal]);try{H=await ad.stream({messages:M,abortSignal:ah,onStepEnd:a=>{aa=new Promise(a=>{ab=a}),ae.push({messages:function(a){if(!a.toolResults.length)return a.response.messages;let b=new Map(a.toolResults.map(a=>[a.toolCallId,a.output]));return a.response.messages.map(a=>"tool"!==a.role?a:{...a,content:a.content.map(a=>{if("tool-result"!==a.type||!b.has(a.toolCallId))return a;let c=b.get(a.toolCallId);return{...a,output:"string"==typeof c?{type:"text",value:c}:{type:"json",value:c}}})})}(a),usage:C(a.usage)})}})}catch(a){throw _.end(),ag.abort(),await Promise.allSettled([...$]),a}let ai="",aj="",ak=null,al=a=>{q.logger.error(`${K}: the model run broke`,a);let b=(0,i.modelErrorToString)(a),c=!(0,i.isProviderRefusal)(a);if(!(0,i.isContextOverflow)(a))return{type:"error",message:b,retry:c};let d=Math.floor(Math.min(V,ac||V)*g.BOT_RUN.overflowShrink);return{type:"error",message:b,budget:Math.max(n.COMPACT_AT_MIN,d),retry:c}};af.addEventListener("abort",()=>{ae.end(),ab()},{once:!0});try{for await(let a of H.stream)switch(_.touch(),a.type){case"start-step":aj="",ai="";break;case"text-delta":ai+=a.text;break;case"text-end":{let a=ai.trim();if(ai="",!a)break;aj=[aj,a].filter(Boolean).join("\n\n"),await L({type:"text",text:a});break}case"tool-call":await L({type:"tool",id:a.toolCallId,name:a.toolName,input:a.input,providerExecuted:a.providerExecuted,providerOptions:a.providerMetadata});break;case"tool-result":await L({type:"tool-result",id:a.toolCallId,name:a.toolName,output:a.output});break;case"tool-error":await L({type:"tool-result",id:a.toolCallId,name:a.toolName,output:(0,i.modelErrorToString)(a.error),error:!0});break;case"finish-step":{ak=a.finishReason;let b=await ae.take();b&&await L({type:"step",...b,budget:V}),ab();break}case"abort":if(b.signal?.aborted)return;await L(al(a.reason??"The model stopped sending."));return;case"error":await L(al(a.error));return}}finally{ag.abort(),ae.end(),_.end(),ab(),await Promise.allSettled([...$]),S&&(0,o.renewSignIns)(S).catch(a=>q.logger.warn(`${K}: kept sign-ins were not renewed`,a))}try{await H.finalStep}catch(a){if(b.signal?.aborted)return;await L(al(a));return}"content-filter"===ak?await L({type:"error",message:"The provider's content filter stopped the response.",retry:!1}):await L({type:"turn-end",text:aj,stopped:!Y&&("length"===ak||"error"===ak||"tool-calls"===ak)})}async function x(a,b,c){try{let d=a?await (0,u.listWrittenPaths)(a):(0,u.writtenPathsIn)(b.map(a=>a.content)),e=await (0,p.filesOnDisk)(d,c);if(!e.length)return"";let f=e.slice(-g.BOT_RUN.compactFiles),h=e.length-f.length,i=f.map(a=>`- ${a}`);return h&&i.unshift(`- …and ${h} older ones`),`
114
114
 
115
115
  Files this job has on disk now — open one rather than fetching again what is in it:
116
- ${i.join("\n")}`}catch(a){return p.logger.warn("files under the summary could not be listed",a),""}}async function x(a,b,c,d){let e;try{return await y(a,b,c,d)}catch(a){if(d.signal?.aborted)throw a;e=a}if((0,h.isContextOverflow)(e)){let f=(0,l.asWords)(c,(a,b)=>`${a}: ${(0,t.argumentLine)(a,b)}`);try{return await y(a,b,f,d)}catch(a){if(d.signal?.aborted)throw a;e=a}}throw Error(`Could not compact the context (${(0,h.modelErrorToString)(e)}).`,{cause:e})}async function y(a,b,c,e){let g,{text:h,usage:i}=await (0,d.generateText)({model:a,instructions:e.instructions,tools:b,toolChoice:"none",messages:[...c,{role:"user",content:(g=(a=>{let{min:b,max:c,perTokens:d}=f.BOT_RUN.summaryWords;return Math.min(c,Math.max(b,Math.round(a/d)))})(e.budget),`Compact your context. The first message above — who handed you the job, and the job — stays exactly as it is. Everything after it is replaced by what you write now, and you carry on from that first message and this alone; nothing else above can be read again. Write it for a fresh copy of you that has your tools, your instructions and that first message, but has seen none of the rest.
116
+ ${i.join("\n")}`}catch(a){return q.logger.warn("files under the summary could not be listed",a),""}}async function y(a,b,c,d){let e;try{return await z(a,b,c,d)}catch(a){if(d.signal?.aborted)throw a;e=a}if((0,i.isContextOverflow)(e)){let f=(0,m.asWords)(c,(a,b)=>`${a}: ${(0,u.argumentLine)(a,b)}`);try{return await z(a,b,f,d)}catch(a){if(d.signal?.aborted)throw a;e=a}}throw Error(`Could not compact the context (${(0,i.modelErrorToString)(e)}).`,{cause:e})}async function z(a,b,c,d){let f,{text:h,usage:i}=await (0,e.generateText)({model:a,instructions:d.instructions,tools:b,toolChoice:"none",messages:[...c,{role:"user",content:(f=(a=>{let{min:b,max:c,perTokens:d}=g.BOT_RUN.summaryWords;return Math.min(c,Math.max(b,Math.round(a/d)))})(d.budget),`Compact your context. The first message above — who handed you the job, and the job — stays exactly as it is. Everything after it is replaced by what you write now, and you carry on from that first message and this alone; nothing else above can be read again. Write it for a fresh copy of you that has your tools, your instructions and that first message, but has seen none of the rest.
117
117
 
118
118
  Cover all of it, and prefer a fact over a description of a fact:
119
119
 
@@ -124,9 +124,10 @@ Cover all of it, and prefer a fact over a description of a fact:
124
124
  - **What did not work**, and why: the url that 404s, the endpoint that needs POST not GET, the selector that is not there, the site that refuses a headless browser, the argument a tool rejected. This is the part that stops the next steps repeating an hour of yours.
125
125
  - **What is left**, in the order you would do it.
126
126
 
127
- Plain text, under ${g} words. No preamble, no headings about the summary itself, no account of how you have been going.`)}],abortSignal:e.signal,timeout:f.BOT_RUN.silenceMs}),j=h.trim();if(!j)throw Error("The summary of the context came back empty, so there is nothing to carry on from.");return{text:`Everything between the first message and here was compacted. Below is your own summary of it; carry on from the first message and this.
127
+ Plain text, under ${f} words. No preamble, no headings about the summary itself, no account of how you have been going.`)}],abortSignal:d.signal,timeout:g.BOT_RUN.silenceMs,providerOptions:d.providerOptions}),j=h.trim();if(!j)throw Error("The summary of the context came back empty, so there is nothing to carry on from.");return{text:`Everything between the first message and here was compacted. Below is your own summary of it; carry on from the first message and this.
128
128
 
129
- ${j}`,usage:A(i)}}let A=a=>({input:a.inputTokens??0,output:a.outputTokens??0});a.s(["resumeTranscript",0,function(a,b=new Map){let c=new Map,d=new Set;for(let b of a)if(("tool"===b.role||"assistant"===b.role)&&Array.isArray(b.content))for(let a of b.content)"tool-result"===a.type&&(c.has(a.toolCallId)||c.set(a.toolCallId,a),"assistant"===b.role&&d.add(a.toolCallId));let e=[],f=new Set;for(let g of a){if("tool"===g.role){let a=g.content.filter(a=>"tool-result"!==a.type);a.length&&e.push({...g,content:a});continue}if("assistant"!==g.role||"string"==typeof g.content){e.push(g);continue}let a=[],h=[];for(let e of g.content){if("tool-call"!==e.type){h.push(e);continue}if(f.has(e.toolCallId))continue;let g=e.input;if("string"==typeof g)try{g=JSON.parse(g)}catch{g=void 0}if(!e.toolCallId||void 0===g){h.push({type:"text",text:"A tool argument stream was interrupted before a complete call was recorded. Inspect the saved work before continuing."});continue}let i=e.toolName===k.TOOL_NAMES.send_message?b.get(e.toolCallId):void 0,j=c.get(e.toolCallId)??(i?{type:"tool-result",toolCallId:e.toolCallId,toolName:e.toolName,output:{type:"json",value:i}}:void 0);if(e.providerExecuted&&(!j||!d.has(e.toolCallId))){h.push({type:"text",text:j?`The provider operation ${e.toolName} returned this data before its native continuation was interrupted: ${JSON.stringify(j.output)}`:`The provider operation ${e.toolName} was interrupted without a recorded result. Its remote execution state is unknown.`});continue}f.add(e.toolCallId),h.push({...e,input:g}),d.has(e.toolCallId)||a.push(j??{type:"tool-result",toolCallId:e.toolCallId,toolName:e.toolName,output:{type:"text",value:"No result: execution was interrupted before a result was recorded. The outcome is unknown. Inspect the current state before repeating the action."}})}h.length&&e.push({...g,content:h}),a.length&&e.push({role:"tool",content:a})}return e},"runBot",0,v]),c()}catch(a){c(a)}},!1),674986,a=>a.a(async(b,c)=>{try{var d=a.i(136340),e=a.i(203469),f=a.i(569572),g=a.i(875931),h=a.i(735502),i=a.i(569549),j=a.i(684321),k=a.i(821415),l=a.i(956802),m=a.i(176668),n=a.i(293480),o=a.i(8412),p=a.i(182248),q=a.i(221214),r=a.i(654034),s=a.i(446957),t=a.i(839430),u=a.i(109955),v=a.i(344853),w=b([g,h,i,q,r,t,v]);[g,h,i,q,r,t,v]=w.then?(await w)():w;let K=globalThis.__roomRuns??=new Map,L=globalThis.__roomThreadLock??=(0,o.createKeyedLock)(),M=globalThis.__roomCompactAsked??=new Set,N=(a,b)=>`${a}
129
+ ${j}`,usage:C(i)}}let C=a=>({input:a.inputTokens??0,output:a.outputTokens??0,cacheRead:a.inputTokenDetails?.cacheReadTokens??0,cacheWrite:a.inputTokenDetails?.cacheWriteTokens??0}),D=(a,b)=>(0,d.createHash)("sha256").update(`${a}
130
+ ${b}`).digest("hex").slice(0,32);function A(a,b={}){return a.provider&&a.model?(0,i.getTextModel)({provider:a.provider,model:a.model}):(0,i.resolveDefaultModel)(void 0,b).then(i.getTextModel)}a.s(["resolveModel",0,A,"resumeTranscript",0,function(a,b=new Map){let c=new Map,d=new Set;for(let b of a)if(("tool"===b.role||"assistant"===b.role)&&Array.isArray(b.content))for(let a of b.content)"tool-result"===a.type&&(c.has(a.toolCallId)||c.set(a.toolCallId,a),"assistant"===b.role&&d.add(a.toolCallId));let e=[],f=new Set;for(let g of a){if("tool"===g.role){let a=g.content.filter(a=>"tool-result"!==a.type);a.length&&e.push({...g,content:a});continue}if("assistant"!==g.role||"string"==typeof g.content){e.push(g);continue}let a=[],h=[];for(let e of g.content){if("tool-call"!==e.type){h.push(e);continue}if(f.has(e.toolCallId))continue;let g=e.input;if("string"==typeof g)try{g=JSON.parse(g)}catch{g=void 0}if(!e.toolCallId||void 0===g){h.push({type:"text",text:"A tool argument stream was interrupted before a complete call was recorded. Inspect the saved work before continuing."});continue}let i=e.toolName===l.TOOL_NAMES.send_message?b.get(e.toolCallId):void 0,j=c.get(e.toolCallId)??(i?{type:"tool-result",toolCallId:e.toolCallId,toolName:e.toolName,output:{type:"json",value:i}}:void 0);if(e.providerExecuted&&(!j||!d.has(e.toolCallId))){h.push({type:"text",text:j?`The provider operation ${e.toolName} returned this data before its native continuation was interrupted: ${JSON.stringify(j.output)}`:`The provider operation ${e.toolName} was interrupted without a recorded result. Its remote execution state is unknown.`});continue}f.add(e.toolCallId),h.push({...e,input:g}),d.has(e.toolCallId)||a.push(j??{type:"tool-result",toolCallId:e.toolCallId,toolName:e.toolName,output:{type:"text",value:"No result: execution was interrupted before a result was recorded. The outcome is unknown. Inspect the current state before repeating the action."}})}h.length&&e.push({...g,content:h}),a.length&&e.push({role:"tool",content:a})}return e},"runBot",0,w]),c()}catch(a){c(a)}},!1),674986,a=>a.a(async(b,c)=>{try{var d=a.i(136340),e=a.i(203469),f=a.i(569572),g=a.i(875931),h=a.i(735502),i=a.i(569549),j=a.i(684321),k=a.i(821415),l=a.i(956802),m=a.i(176668),n=a.i(293480),o=a.i(8412),p=a.i(182248),q=a.i(221214),r=a.i(654034),s=a.i(446957),t=a.i(839430),u=a.i(109955),v=a.i(344853),w=b([g,h,i,q,r,t,v]);[g,h,i,q,r,t,v]=w.then?(await w)():w;let K=globalThis.__roomRuns??=new Map,L=globalThis.__roomThreadLock??=(0,o.createKeyedLock)(),M=globalThis.__roomCompactAsked??=new Set,N=(a,b)=>`${a}
130
131
  ${b}`;async function x(a){let b=await (0,q.findJobBot)(a.bot);(!b||b.disabled)&&(0,n.publicError)("Choose an enabled bot.");let{from:c,routine:d,...e}={...a,bot:b.name},f=(0,h.buildThreadOpening)({bot:e.bot,request:e.request,from:c,routine:d}),g=await (0,v.insertThread)({...e,routineId:d?.id??null,opening:f});return await z(g.id),g.id}async function y(a,b,c="user",d,e){let f=null;return await L(a,async()=>{let g=await (0,v.findThread)(a);if(g||(0,n.publicError)("No such thread."),d){let b=(await (0,t.listRoomWork)(a)).find(a=>a.bot.toLowerCase()===d.trim().toLowerCase());b&&b.bot!==u.ROOM_THURSDAY||(0,n.publicError)("Choose a participant in this thread."),d=b.bot}b.trim()===s.THREAD_CONTINUE&&(0,s.isAppStop)(g.pending)?(await (0,t.resumeRoom)(a),(await (0,t.listRoomWork)(a)).some(a=>"queued"===a.state)||(f=await (0,t.tellRoom)(a,"Continue from the saved conversation.","user"===c?u.ROOM_USER:u.ROOM_THURSDAY,d,void 0,!1))):f=await (0,t.tellRoom)(a,b,"user"===c?u.ROOM_USER:u.ROOM_THURSDAY,d,e)}),await z(a),f}async function z(a){await L(a,async()=>{for(let b=0;b<2;b++){let b;for(;b=await (0,t.claimRoomWork)(a);)!function(a){let b,c=new AbortController,d=new Promise(a=>{b=a});K.set(a.id,{threadId:a.threadId,stop:c,done:d}),A(a,c.signal).catch(b=>m.logger.error(`thread ${a.threadId}: participant`,b)).finally(()=>{K.delete(a.id),b(),z(a.threadId).catch(b=>m.logger.error(`thread ${a.threadId}: scheduling`,b))})}(b);await (0,t.settleRoom)(a)}})}async function A(a,b){let c=await B(a,b);if(c?.failure?.retry&&!b.aborted&&(await (0,t.noteRoomBreak)(a,c.failure.message),await (0,d.setTimeout)(f.BOT_RUN.retryMs,void 0,{signal:b}).catch(()=>{}),b.aborted||(c=await B(a,b))),!c||b.aborted)return;let g=c.failure?.message,h=c.ending;if(g||!h||h.stopped){let b=g??"The turn was interrupted. Continue from the saved conversation.";L(a.threadId,async()=>{let c=(await (0,t.listRoomWork)(a.threadId)).find(b=>b.id===a.id);if(c?.state!=="running"||c.generation!==a.generation)return;let d=C(a.threadId);await (0,t.pauseRoom)(a.threadId,b),await d}).catch(b=>m.logger.error(`thread ${a.threadId}: pausing`,b));return}await (0,t.finishRoomWork)(a,h.text);let n=await (0,v.findThread)(a.threadId);if(n?.status==="done"){let a=(0,p.plainText)(n.outcome??"").slice(0,f.FINISHED_NOTICE.words);e.presence.watching||await (0,i.isAnyCallLive)()||(0,l.desktopNotify)(n.label,a);let b=await (0,k.filesOnDisk)((0,j.pathsIn)(n.outcome??""),null);e.appEvents.emit({type:"finished",threadId:n.id,label:n.label,bot:n.bot,words:a,paths:(0,j.leadFirst)(b)})}}async function B(a,b){let c=new O(a,b),d=null,e=null;try{let f=await (0,v.findThread)(a.threadId);if(!f)return null;(await (0,t.listParticipantTranscript)(a.threadId,a.bot)).length||await (0,t.appendRoomMessage)(a.threadId,{bot:a.bot,parent:a.id,role:"user",content:`Request: ${f.request}
131
132
  Coordinator: ${f.bot}. Continue as ${a.bot} in this thread.`,hidden:!0}),await (0,t.consumeRoomInbox)(a);let g=await (0,t.listParticipantTranscript)(a.threadId,a.bot);await (0,r.runBot)({bot:a.bot,messages:(0,r.resumeTranscript)(g,await (0,t.listRoomReceipts)(a.threadId,a.bot,g))},{signal:b,threadId:a.threadId,parent:a.id,caller:a.caller,owner:f.bot,contextBudget:await (0,t.roomContextBudget)(a.threadId,a.bot),compactNow:()=>M.delete(N(a.threadId,a.bot)),session:(0,k.botBrowserSession)(a.threadId,a.bot),notes:()=>(0,t.consumeRoomInbox)(a),send:async c=>{b.throwIfAborted();let d=c.to.trim();if(d.toLowerCase()===u.ROOM_THURSDAY.toLowerCase())d=u.ROOM_THURSDAY;else{let a=await (0,q.findJobBot)(d);(!a||a.disabled)&&(0,n.publicError)(`No enabled bot named "${d}".`),d=a.name}let e=await (0,t.sendRoomMessage)(a,{...c,to:d});return z(a.threadId).catch(a=>m.logger.error("room message scheduling",a)),e},emit:async g=>{(!b.aborted||"tool-result"===g.type)&&(await c.on(g),"step"===g.type&&await (0,v.addThreadUsage)(a.threadId,g.usage,a.bot===f.bot?{tokens:g.usage.input,budget:g.budget}:null),"compact"===g.type&&await (0,v.addThreadUsage)(a.threadId,g.usage),"turn-end"===g.type&&(d=g),"error"===g.type&&(e={message:g.message,retry:g.retry},g.budget&&await (0,t.lowerRoomContextBudget)(a,g.budget)))}})}catch(c){b.aborted||(m.logger.error(`thread ${a.threadId}: ${a.bot} broke`,c),e={message:(0,g.modelErrorToString)(c),retry:!(0,n.isPublicError)(c)&&!(0,g.isProviderRefusal)(c)})}return{ending:d,failure:e}}class O{work;signal;lane;assistant;tool;parts;calls;results;constructor(a,b){this.work=a,this.signal=b,this.lane=(0,p.PromiseChain)(),this.assistant=null,this.tool=null,this.parts={assistant:[],tool:[]},this.calls=new Set,this.results=new Set}async write(a,b,c=!1){let d={bot:this.work.bot,parent:this.work.id,role:b.role,content:b.content,compact:c,note:c};return null===a?(0,t.appendRoomMessage)(this.work.threadId,d):(await (0,v.upsertMessage)(this.work.threadId,a,d),a)}on(a){return this.lane(async()=>{if(!this.signal.aborted||"tool-result"===a.type)if("text"===a.type)this.parts.assistant.push({type:"text",text:a.text}),this.assistant=await this.write(this.assistant,{role:"assistant",content:this.parts.assistant});else if("tool"===a.type){if(this.calls.has(a.id)){let b=this.parts.assistant.find(b=>"tool-call"===b.type&&b.toolCallId===a.id);b&&"tool-call"===b.type&&a.providerOptions&&(b.providerOptions=a.providerOptions,this.assistant=await this.write(this.assistant,{role:"assistant",content:this.parts.assistant}));return}this.calls.add(a.id),this.parts.assistant.push({type:"tool-call",toolCallId:a.id,toolName:a.name,input:a.input,...a.providerExecuted?{providerExecuted:!0}:{},...a.providerOptions?{providerOptions:a.providerOptions}:{}}),this.assistant=await this.write(this.assistant,{role:"assistant",content:this.parts.assistant})}else if("tool-result"===a.type){if(this.results.has(a.id))return;this.results.add(a.id),this.parts.tool.push({type:"tool-result",toolCallId:a.id,toolName:a.name,output:a.error?{type:"error-text",value:String(a.output)}:"string"==typeof a.output?{type:"text",value:a.output}:{type:"json",value:a.output}}),this.tool=await this.write(this.tool,{role:"tool",content:this.parts.tool})}else if("step"===a.type){let b=[this.assistant,this.tool];for(let[c,d]of a.messages.entries())await this.write(b[c]??null,d);let c=b.slice(a.messages.length).filter(a=>null!==a);c.length&&await (0,v.deleteMessages)(this.work.threadId,c),this.assistant=this.tool=null,this.parts={assistant:[],tool:[]}}else"compact"===a.type&&await this.write(null,{role:"user",content:a.text},!0)})}}async function C(a){let b=[...K.values()].filter(b=>b.threadId===a);for(let a of b)a.stop.abort();await Promise.all(b.map(a=>a.done))}async function D(a){await L(a,async()=>{let b=await (0,v.findThread)(a);b||(0,n.publicError)("No such thread."),b.endedAt&&(0,n.publicError)("That thread has already ended."),await (0,t.cancelRoom)(a),await (0,v.updateThread)(a,{status:"cancelled",outcome:null,pending:null,seen:!0,endedAt:new Date}),await C(a),await (0,k.closeJobShell)(a)})}async function E(a){return L(a,()=>F(a))}async function F(a){let b=await (0,v.findThread)(a);await (0,t.cancelRoom)(a),await C(a),await (0,k.removeJobBrowsers)(a);let c=await (0,v.deleteThread)(a);return c&&b&&await (0,k.removeJobScratch)(a,b.label),c}async function G(a){let b=a?.getTime(),c=a=>void 0===b||(a.endedAt??a.updatedAt).getTime()<b,d=0;for(let a of(await (0,v.listThreadFolders)()))("done"===a.status||"cancelled"===a.status)&&c(a)&&await L(a.id,async()=>{let b=await (0,v.findThread)(a.id);b?.status!=="done"&&b?.status!=="cancelled"||c(b)&&await F(a.id)&&(d+=1)});return d}async function H(){let a=Date.now()-f.WORKSPACE_KEEP.forMs,b=b=>("done"===b.status||"cancelled"===b.status)&&(b.endedAt??b.updatedAt).getTime()<a,c=new Set(await (0,k.listScratchFolders)()),d=[];for(let a of(await (0,v.listThreadFolders)())){let e=(0,k.jobScratch)(a.id,a.label);c.delete(e)&&b(a)&&await L(a.id,async()=>{let c=await (0,v.findThread)(a.id);c&&b(c)&&(await (0,k.closeHiddenBrowser)(a.id),await (0,k.removeJobScratch)(a.id,a.label),d.push(e))})}return d.push(...await (0,k.removeUnchangedFolders)([...c])),await (0,k.pruneJobFiles)(),d.length&&m.logger.info(`cleared ${d.length} old job folder(s): ${d.join(", ")}`),d}async function I(){for(let a of(await (0,v.listRunningThreadIds)()))await L(a,async()=>{[...K.values()].some(b=>b.threadId===a)||(await (0,v.findThread)(a))?.status==="running"&&await (0,t.pauseRoom)(a,"The server restarted. Resume from the saved conversation.")})}async function J(a){let b=await (0,v.listRunningThreadIds)();await Promise.all(b.map(b=>L(b,async()=>{(await (0,v.findThread)(b))?.status==="running"&&(await C(b),await (0,t.pauseRoom)(b,a))})))}a.s(["answerThread",0,y,"askCompact",0,function(a,b){M.add(N(a,b))},"cancelThread",0,D,"pauseThreads",0,J,"removeFinishedThreads",0,G,"removeThread",0,E,"startThread",0,x,"sweepJobFiles",0,H,"sweepThreads",0,I]),c()}catch(a){c(a)}},!1),317844,a=>a.a(async(b,c)=>{try{var d,e=a.i(106450),f=a.i(64203),g=a.i(569572),h=a.i(176668),i=a.i(182248),j=a.i(947950),k=a.i(899284),l=b([j]);[j]=l.then?(await l)():l;class m extends Error{serverName;authorizationUrl;constructor(a,b){super(`MCP server "${a}" requires authorization`),this.serverName=a,this.authorizationUrl=b,this.name="McpAuthRequiredError"}}class n{store;serverName;oauth;callbackUrl;clientName;lastAuthorizationUrl;constructor(a,b,c,d,e){this.store=a,this.serverName=b,this.oauth=c,this.callbackUrl=d,this.clientName=e}get redirectUrl(){return this.callbackUrl}get clientMetadata(){return{client_name:this.clientName,redirect_uris:[this.callbackUrl],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"client_secret_post"}}async persist(a){this.oauth={...this.oauth,...a},await this.store.saveOAuth(this.serverName,this.oauth)}clientInformation(){return this.oauth.clientInformation}async saveClientInformation(a){await this.persist({clientInformation:a})}tokens(){return this.oauth.tokens}async saveTokens(a){await this.persist({tokens:a})}authorizationServerInformation(){return this.oauth.authorizationServer}async saveAuthorizationServerInformation(a){await this.persist({authorizationServer:a})}codeVerifier(){if(!this.oauth.codeVerifier)throw Error("No code verifier saved");return this.oauth.codeVerifier}async saveCodeVerifier(a){await this.persist({codeVerifier:a})}state(){return crypto.randomUUID()}async saveState(a){await this.persist({state:a})}storedState(){return this.oauth.state}redirectToAuthorization(a){this.lastAuthorizationUrl=a}async invalidateCredentials(a){let b={...this.oauth};("all"===a||"client"===a)&&(b.clientInformation=void 0),("all"===a||"tokens"===a)&&(b.tokens=void 0),("all"===a||"verifier"===a)&&(b.codeVerifier=void 0),this.oauth=b,await this.store.saveOAuth(this.serverName,b)}}let o=globalThis;o.__thursdayMcpManager&&o.__thursdayMcpManager.dispose(),d={callbackUrl:new URL("/api/mcp/oauth/callback",g.APP_URL).href,clientName:g.APP_NAME},o.__thursdayMcpManager=new class a{store;sessions;connecting;callbackUrl;clientName;constructor(a,b){this.store=a,this.sessions=new Map,this.connecting=new Map,this.callbackUrl=b.callbackUrl,this.clientName=b.clientName??g.APP_NAME}async connect(a){let b=this.connecting.get(a);if(b)return b;let c=this.doConnect(a).finally(()=>this.connecting.delete(a));return this.connecting.set(a,c),c}async callTool(a,b,c,d){let f=await this.ensureClient(a);try{let e=await f.callTool({name:b,arguments:c,options:d?{signal:d}:void 0});return this.touch(a),e}catch(b){if(b instanceof e.UnauthorizedError)throw await this.closeSession(a),new m(a);throw b}}async finishAuthorization(a){let b=a.get("state"),c=a.get("code");if(!b||!c)throw Error("OAuth callback is missing code or state");let d=await this.store.findByOAuthState(b);if(!d||!(0,k.isRemoteConfig)(d.config))throw Error("No server is waiting for this authorization");let f=this.providerFor(d),g=await (0,e.auth)(f,{serverUrl:d.config.url,authorizationCode:c,callbackState:b});if("AUTHORIZED"!==g)throw Error(`Token exchange ended in "${g}"`);return await f.invalidateCredentials("verifier"),await this.connect(d.name),d.name}async disconnect(a){await this.closeSession(a)}async dispose(){await Promise.all([...this.sessions.keys()].map(a=>this.closeSession(a)))}async doConnect(a){await this.closeSession(a);let b=await this.store.load(a);if(!b)throw Error(`Unknown MCP server "${a}"`);let c={};try{let d=await this.openClient(b,c),e=(await d.listTools()).tools.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema,outputSchema:a.outputSchema}));return this.adopt(a,d),await this.store.saveConnectionResult(a,{toolInfo:e,lastError:null}),h.logger.info(`mcp "${a}" connected — ${e.length} tools`),{status:"connected",tools:e}}catch(l){var d,f;let g;if(l instanceof e.UnauthorizedError||l?.cause instanceof e.UnauthorizedError){let b=c.href;if(b)return await this.store.saveConnectionResult(a,{toolInfo:[],lastError:"Authorization required — finish sign-in in the opened tab"}),{status:"auth_required",authorizationUrl:b}}let j=(d=l,f=b,g=(0,i.errorToString)(d),(0,k.isRemoteConfig)(f.config)&&!f.oauth?.clientInformation&&/Invalid OAuth error response/.test(g)?`This server does not let an app register itself for sign-in, so it cannot be connected here. It answered: ${g}`:g);throw await this.store.saveConnectionResult(a,{toolInfo:[],lastError:j}),h.logger.warn(`mcp "${a}" failed — ${j}`),Error(j,{cause:l})}}async openClient(a,b={}){if((0,k.isRemoteConfig)(a.config)){let c=this.providerFor(a);try{return await (0,e.createMCPClient)({name:this.clientName,transport:{type:"http",url:a.config.url,headers:a.config.headers,authProvider:c,redirect:"follow"}})}finally{b.href=c.lastAuthorizationUrl?.href}}return(0,e.createMCPClient)({name:this.clientName,transport:new f.Experimental_StdioMCPTransport({command:a.config.command,args:a.config.args,env:a.config.env})})}providerFor(a){return new n(this.store,a.name,a.oauth??{},this.callbackUrl,this.clientName)}async ensureClient(a){let b=this.sessions.get(a);if(b)return b.client;let c=await this.connect(a);if("auth_required"===c.status)throw new m(a,c.authorizationUrl);let d=this.sessions.get(a);if(!d)throw Error(`Session for "${a}" vanished mid-connect`);return d.client}adopt(a,b){this.sessions.set(a,{client:b,idleTimer:this.armIdleTimer(a)})}touch(a){let b=this.sessions.get(a);b&&(clearTimeout(b.idleTimer),b.idleTimer=this.armIdleTimer(a))}armIdleTimer(a){let b=setTimeout(()=>{this.closeSession(a)},g.MCP_IDLE_MS);return b.unref?.(),b}async closeSession(a){let b=this.sessions.get(a);b&&(this.sessions.delete(a),clearTimeout(b.idleTimer),await b.client.close().catch(()=>{}))}}({load:a=>(0,j.findServer)(a),saveOAuth:(a,b)=>(0,j.saveOAuthData)(a,b),saveConnectionResult:(a,b)=>null===b.lastError?(0,j.syncServerTools)(a,b.toolInfo):(0,j.saveConnectionError)(a,b.lastError),findByOAuthState:a=>(0,j.findServerByOAuthState)(a)},d);let p=o.__thursdayMcpManager;a.s(["McpAuthRequiredError",0,m,"mcpManager",0,p]),c()}catch(a){c(a)}},!1),947950,a=>a.a(async(b,c)=>{try{var d=a.i(93321),e=a.i(351674),f=a.i(203469),g=a.i(184838),h=a.i(714428),i=a.i(899284),j=b([g]);async function k(a){var b;let[c]=await g.database.select({name:h.mcpServerTable.name,config:h.mcpServerTable.config,lastError:h.mcpServerTable.lastError,toolsSyncedAt:h.mcpServerTable.toolsSyncedAt}).from(h.mcpServerTable).where((0,d.eq)(h.mcpServerTable.name,a));return c?{...c,config:(b=c.config,(0,i.isRemoteConfig)(b)?{url:b.url}:{command:b.command,args:b.args}),tools:await l(a)}:null}async function l(a){return g.database.select({id:h.mcpToolTable.id,name:h.mcpToolTable.name,description:h.mcpToolTable.description,inputSchema:h.mcpToolTable.inputSchema,outputSchema:h.mcpToolTable.outputSchema}).from(h.mcpToolTable).where((0,d.eq)(h.mcpToolTable.serverName,a)).orderBy(h.mcpToolTable.name)}async function m(a){let[b]=await g.database.select().from(h.mcpServerTable).where((0,d.eq)(h.mcpServerTable.name,a));return b??null}[g]=j.then?(await j)():j;let u=()=>f.appEvents.emit({type:"mcp"});async function n(a){let[b]=await g.database.insert(h.mcpServerTable).values({...a,lastError:null}).onConflictDoUpdate({target:h.mcpServerTable.name,set:{config:a.config,lastError:null}}).returning();return u(),b}async function o(a,b){await g.database.transaction(async c=>{b.length&&await c.insert(h.mcpToolTable).values(b.map(b=>({...b,serverName:a}))).onConflictDoUpdate({target:[h.mcpToolTable.serverName,h.mcpToolTable.name],set:{description:p(h.mcpToolTable.description),inputSchema:p(h.mcpToolTable.inputSchema),outputSchema:p(h.mcpToolTable.outputSchema)}}),await c.delete(h.mcpToolTable).where(b.length?(0,d.and)((0,d.eq)(h.mcpToolTable.serverName,a),(0,d.notInArray)(h.mcpToolTable.name,b.map(a=>a.name))):(0,d.eq)(h.mcpToolTable.serverName,a)),await c.update(h.mcpServerTable).set({lastError:null,toolsSyncedAt:new Date}).where((0,d.eq)(h.mcpServerTable.name,a))}),u()}function p(a){return e.sql.raw(`excluded."${a.name}"`)}async function q(a,b){await g.database.update(h.mcpServerTable).set({lastError:b}).where((0,d.eq)(h.mcpServerTable.name,a)),u()}async function r(a,b){await g.database.update(h.mcpServerTable).set({oauth:b}).where((0,d.eq)(h.mcpServerTable.name,a)),u()}async function s(a){let[b]=await g.database.select().from(h.mcpServerTable).where(e.sql`json_extract(${h.mcpServerTable.oauth}, '$.state') = ${a}`);return b??null}async function t(a){let b=await g.database.delete(h.mcpServerTable).where((0,d.eq)(h.mcpServerTable.name,a)).returning();return b.length>0&&u(),b.length>0}a.s(["deleteServer",0,t,"findPinnedTools",0,function(a){return g.database.select({server:h.mcpToolTable.serverName,name:h.mcpToolTable.name,description:h.mcpToolTable.description,inputSchema:h.mcpToolTable.inputSchema}).from(h.botMcpToolTable).innerJoin(h.mcpToolTable,(0,d.eq)(h.botMcpToolTable.toolId,h.mcpToolTable.id)).where((0,d.eq)(h.botMcpToolTable.botName,a)).orderBy(h.mcpToolTable.serverName,h.mcpToolTable.name)},"findServer",0,m,"findServerByOAuthState",0,s,"findServerDetail",0,k,"findToolSchemas",0,function(a,b){return b.length?g.database.select({name:h.mcpToolTable.name,description:h.mcpToolTable.description,inputSchema:h.mcpToolTable.inputSchema}).from(h.mcpToolTable).where((0,d.and)((0,d.eq)(h.mcpToolTable.serverName,a),(0,d.inArray)(h.mcpToolTable.name,b))).orderBy(h.mcpToolTable.name):Promise.resolve([])},"listServerNames",0,function(){return g.database.select({name:h.mcpServerTable.name}).from(h.mcpServerTable).orderBy(h.mcpServerTable.name)},"listToolNames",0,function(a){let b=g.database.select({server:h.mcpToolTable.serverName,name:h.mcpToolTable.name}).from(h.mcpToolTable);return a?b.where((0,d.eq)(h.mcpToolTable.serverName,a)).orderBy(h.mcpToolTable.name):b.orderBy(h.mcpToolTable.serverName,h.mcpToolTable.name)},"saveConnectionError",0,q,"saveOAuthData",0,r,"syncServerTools",0,o,"upsertServer",0,n]),c()}catch(a){c(a)}},!1),899284,a=>{"use strict";var b=a.i(53112),c=a.i(706210);let d=b.z.object({url:b.z.url(),headers:b.z.record(b.z.string(),b.z.string()).optional()}),e=b.z.object({command:b.z.string().min(1),args:b.z.array(b.z.string()).optional(),env:b.z.record(b.z.string(),b.z.string()).optional()}),f=b.z.union([d,e]),g=b.z.object({name:b.z.string(),description:b.z.string().optional(),inputSchema:b.z.looseObject({}).optional(),outputSchema:b.z.looseObject({}).optional()});b.z.object({clientInformation:b.z.looseObject({}).optional(),tokens:b.z.looseObject({}).optional(),authorizationServer:b.z.looseObject({}).optional(),codeVerifier:b.z.string().optional(),state:b.z.string().optional()});let h=b.z.object({name:b.z.string().min(1).max(40),config:f,toolCount:b.z.number().int(),lastError:b.z.string().nullish()}),i=g.extend({id:b.z.number().int(),description:b.z.string().nullish()});h.omit({toolCount:!0}).extend({tools:i.array().default([]),toolsSyncedAt:c.DateLikeSchema});let j=b.z.object({name:b.z.string().min(1,"Name is required").max(40).regex(/^[a-zA-Z0-9_-]+$/,"Only letters, numbers, - and _ are allowed"),config:f});b.z.union([b.z.object({mcpServers:b.z.record(b.z.string(),f)}),b.z.record(b.z.string(),f)]),a.s(["MCPServerFormSchema",0,j,"isRemoteConfig",0,function(a){return"url"in a}])},986743,a=>a.a(async(b,c)=>{try{var d=a.i(93321),e=a.i(530385),f=a.i(351674),g=a.i(203469);a.i(569572);var h=a.i(184838),i=a.i(714428),j=a.i(661210),k=b([h]);[h]=k.then?(await k)():k;let B=()=>g.appEvents.emit({type:"memory"});async function l(a,b,c={}){let[d]=await h.database.insert(i.memoryNoteTable).values({path:a,description:b,ownedByUser:c.ownedByUser??!1}).onConflictDoNothing({target:i.memoryNoteTable.path}).returning();return d&&B(),d??null}async function m(a,b){let[c]=await h.database.update(i.memoryNoteTable).set({...b,updatedAt:new Date}).where((0,d.eq)(i.memoryNoteTable.id,a)).returning();return c&&B(),c??null}async function n(a){let b=await h.database.delete(i.memoryNoteTable).where((0,d.eq)(i.memoryNoteTable.id,a)).returning({id:i.memoryNoteTable.id});return b.length>0&&B(),b.length>0}async function o(a,b){let[c]=await h.database.insert(i.memoryFactTable).values({noteId:a,text:b,source:"user"}).returning();return await r(a),B(),c}async function p(a,b,c){let e=await h.database.transaction(async e=>{let f=await e.update(i.memoryFactTable).set({isLatest:!1}).where((0,d.and)((0,d.eq)(i.memoryFactTable.id,b),(0,d.eq)(i.memoryFactTable.noteId,a),(0,d.eq)(i.memoryFactTable.isLatest,!0))).returning({id:i.memoryFactTable.id});if(0===f.length)return null;let[g]=await e.insert(i.memoryFactTable).values({noteId:a,text:c,source:"user"}).returning();return await e.update(i.memoryNoteTable).set({updatedAt:new Date}).where((0,d.eq)(i.memoryNoteTable.id,a)),g});return e&&B(),e}async function q(a,b){let c=await h.database.delete(i.memoryFactTable).where((0,d.and)((0,d.eq)(i.memoryFactTable.id,b),(0,d.eq)(i.memoryFactTable.noteId,a))).returning({id:i.memoryFactTable.id});return c.length>0&&(await r(a),B()),c.length>0}function r(a){return h.database.update(i.memoryNoteTable).set({updatedAt:new Date}).where((0,d.eq)(i.memoryNoteTable.id,a))}async function s(){for(let a of j.MEMORY_ALWAYS_LISTED){let b=j.MEMORY_PATHS.find(b=>b.path===a)?.of??a;await h.database.insert(i.memoryNoteTable).values({path:a,description:b}).onConflictDoUpdate({target:i.memoryNoteTable.path,set:{description:b}})}}async function t(a,b={}){let c=[...new Set(a.map(a=>a.trim()).filter(Boolean))];if(!c.length)return{notes:[],missing:[]};let g=await h.database.select({id:i.memoryNoteTable.id,path:i.memoryNoteTable.path,description:i.memoryNoteTable.description}).from(i.memoryNoteTable).where((0,d.inArray)(i.memoryNoteTable.path,c)),j=new Map(g.map(a=>[a.path,a])),k=c.filter(a=>!j.has(a));if(!g.length)return{notes:[],missing:k};let l=g.map(a=>a.id),m=await h.database.select({id:i.memoryFactTable.id,noteId:i.memoryFactTable.noteId,text:i.memoryFactTable.text,source:i.memoryFactTable.source,createdAt:i.memoryFactTable.createdAt,saidAt:i.callTable.startedAt}).from(i.memoryFactTable).leftJoin(i.callTable,(0,d.eq)(i.memoryFactTable.callId,i.callTable.id)).where((0,d.and)((0,d.eq)(i.memoryFactTable.isLatest,!0),(0,d.inArray)(i.memoryFactTable.noteId,l))).orderBy((0,e.asc)(i.memoryFactTable.id));return!1!==b.touch&&await h.database.update(i.memoryNoteTable).set({hits:f.sql`${i.memoryNoteTable.hits} + 1`,lastReadAt:new Date}).where((0,d.inArray)(i.memoryNoteTable.id,l)),{notes:c.flatMap(a=>{let b=j.get(a);return b?[{path:b.path,description:b.description,facts:m.filter(a=>a.noteId===b.id).map(a=>({id:a.id,text:a.text,...a.saidAt?{saidAt:a.saidAt}:{}}))}]:[]}),missing:k}}(0,d.inArray)(i.memoryNoteTable.path,j.MEMORY_ALWAYS_LISTED);let C=a=>a.toLowerCase().replace(/[\s.,!?…·'"`]/g,"");async function u(a,b,c,e,f){let g=await a.select({id:i.memoryFactTable.id,text:i.memoryFactTable.text}).from(i.memoryFactTable).where((0,d.and)((0,d.eq)(i.memoryFactTable.noteId,b),(0,d.eq)(i.memoryFactTable.isLatest,!0))),h=new Map(g.map(a=>[C(a.text),a]));for(let g of c){let c=g.text.trim();if(!c)continue;if(null!=g.replaces){let[j]=await a.select({id:i.memoryFactTable.id,text:i.memoryFactTable.text}).from(i.memoryFactTable).where((0,d.and)((0,d.eq)(i.memoryFactTable.id,g.replaces),(0,d.eq)(i.memoryFactTable.noteId,b),(0,d.eq)(i.memoryFactTable.isLatest,!0)));if(j){if(C(j.text)===C(c))continue;await a.update(i.memoryFactTable).set({isLatest:!1}).where((0,d.eq)(i.memoryFactTable.id,j.id)),h.delete(C(j.text));let[g]=await a.insert(i.memoryFactTable).values({noteId:b,text:c,source:e,callId:f}).returning({id:i.memoryFactTable.id});h.set(C(c),{...g,text:c});continue}}if(h.has(C(c)))continue;let[j]=await a.insert(i.memoryFactTable).values({noteId:b,text:c,source:e,callId:f}).returning({id:i.memoryFactTable.id});h.set(C(c),{...j,text:c})}await a.update(i.memoryNoteTable).set({updatedAt:new Date}).where((0,d.eq)(i.memoryNoteTable.id,b))}async function v(a,b,c,e=null){let f=a.trim();if(!await h.database.transaction(async a=>{let[g]=await a.select({id:i.memoryNoteTable.id}).from(i.memoryNoteTable).where((0,d.eq)(i.memoryNoteTable.path,f));return!!g&&(await u(a,g.id,b,c,e),!0)}))return null;let{notes:g}=await t([f],{touch:!1});return B(),g[0]??null}async function w(a,b,c,d,e=null){let f=a.trim();if(!await h.database.transaction(async a=>{let[g]=await a.insert(i.memoryNoteTable).values({path:f,description:b}).onConflictDoNothing({target:i.memoryNoteTable.path}).returning({id:i.memoryNoteTable.id});return!!g&&(await u(a,g.id,c,d,e),!0)}))return null;let{notes:g}=await t([f],{touch:!1});return B(),g[0]??null}async function x(a,b){let[c]=await h.database.update(i.memoryNoteTable).set({description:b,updatedAt:new Date}).where((0,d.eq)(i.memoryNoteTable.path,a.trim())).returning({id:i.memoryNoteTable.id});return c&&B(),!!c}async function y(){let[a,b]=await Promise.all([h.database.select({id:i.memoryNoteTable.id,path:i.memoryNoteTable.path,description:i.memoryNoteTable.description,hits:i.memoryNoteTable.hits,lastReadAt:i.memoryNoteTable.lastReadAt,createdAt:i.memoryNoteTable.createdAt}).from(i.memoryNoteTable),h.database.select({noteId:i.memoryFactTable.noteId,count:f.sql`count(*)`}).from(i.memoryFactTable).where((0,d.eq)(i.memoryFactTable.isLatest,!0)).groupBy(i.memoryFactTable.noteId)]),c=new Map(b.map(a=>[a.noteId,a.count]));return a.filter(a=>(0,j.isAlwaysListed)(a.path)||(c.get(a.id)??0)>0).sort((a,b)=>Number((0,j.isAlwaysListed)(b.path))-Number((0,j.isAlwaysListed)(a.path))||(0,j.recallScore)(b)-(0,j.recallScore)(a)).map(a=>({path:a.path,description:a.description,factCount:c.get(a.id)??0,lastSeenAt:a.lastReadAt??a.createdAt}))}async function z(a){let b=await h.database.transaction(async b=>{let c=await b.delete(i.memoryFactTable).where((0,d.eq)(i.memoryFactTable.id,a)).returning({noteId:i.memoryFactTable.noteId});if(0===c.length)return null;let e=c[0].noteId,[g]=await b.select({path:i.memoryNoteTable.path,ownedByUser:i.memoryNoteTable.ownedByUser}).from(i.memoryNoteTable).where((0,d.eq)(i.memoryNoteTable.id,e)),[h]=await b.select({count:f.sql`count(*)`}).from(i.memoryFactTable).where((0,d.and)((0,d.eq)(i.memoryFactTable.noteId,e),(0,d.eq)(i.memoryFactTable.isLatest,!0)));return h?.count!==0||!g||g.ownedByUser||(0,j.isAlwaysListed)(g.path)?(await b.update(i.memoryNoteTable).set({updatedAt:new Date}).where((0,d.eq)(i.memoryNoteTable.id,e)),{path:g?.path??"",noteGone:!1}):(await b.delete(i.memoryNoteTable).where((0,d.eq)(i.memoryNoteTable.id,e)),{path:g.path,noteGone:!0})});return b&&B(),b}async function A(){let a=await h.database.delete(i.memoryNoteTable).returning({id:i.memoryNoteTable.id});return await s(),a.length>0&&B(),a.length}a.s(["addFact",0,o,"createNote",0,l,"createNoteWithFacts",0,w,"deleteAllNotes",0,A,"deleteNote",0,n,"describeNote",0,x,"forgetFact",0,q,"forgetFactById",0,z,"listNoteIndex",0,y,"readNotes",0,t,"reviseFact",0,p,"updateNote",0,m,"writeFacts",0,v]),c()}catch(a){c(a)}},!1),661210,a=>{"use strict";var b=a.i(53112),c=a.i(569572),d=a.i(706210);let e=b.z.enum(["user","call","bot"]),f=b.z.string().trim().min(1,"A note needs a line saying what it is about").max(c.MEMORY_LIMITS.descriptionChars,`A note's line is one line: at most ${c.MEMORY_LIMITS.descriptionChars} characters`),g=b.z.object({id:b.z.number(),text:b.z.string(),source:e.nullish(),createdAt:d.DateLikeSchema});b.z.object({id:b.z.number(),path:b.z.string(),description:b.z.string(),ownedByUser:b.z.boolean(),hits:b.z.number(),lastReadAt:d.DateLikeSchema.nullable(),createdAt:d.DateLikeSchema,updatedAt:d.DateLikeSchema,factCount:b.z.number(),facts:g.array()});let h=[{path:"profile",of:"The user themselves — name, age, what they do, where they live, whatever else says who they are"},{path:"preferences",of:"How they want things done, and said — read whole on every call, so a rule for a particular situation goes here too"},{path:"people/",of:"Someone in their life, and what matters about them"},{path:"projects/",of:"Something with an end — a trip, a purchase, a deadline, a thing being built"},{path:"topics/",of:"Something ongoing that keeps coming back"}],i=h.filter(a=>!a.path.endsWith("/")).map(a=>a.path),j=h.filter(a=>a.path.endsWith("/")).map(a=>a.path.slice(0,-1)),k=RegExp(`^(?:${i.join("|")}|(?:${j.join("|")})/.+)$`);a.s(["MEMORY_ALWAYS_LISTED",0,i,"MEMORY_PATHS",0,h,"NoteLineSchema",0,f,"isAlwaysListed",0,a=>i.includes(a),"isMemoryPath",0,a=>k.test(a),"recallScore",0,function(a){let b=(0,d.toDate)(a.lastReadAt??a.createdAt),c=Math.max(0,(Date.now()-b.getTime())/864e5);return(a.hits+1)/(1+c)}])},780946,a=>a.a(async(b,c)=>{try{var d=a.i(93321),e=a.i(258261),f=a.i(530385),g=a.i(203469),h=a.i(569572),i=a.i(184838),j=a.i(714428),k=a.i(221214),l=a.i(293480),m=a.i(643020),n=b([i,k]);[i,k]=n.then?(await n)():n;let z=()=>g.appEvents.emit({type:"routines"});async function o(a,b){return i.database.select({id:j.threadTable.id,status:j.threadTable.status,outcome:j.threadTable.outcome,updatedAt:j.threadTable.updatedAt}).from(j.threadTable).where((0,d.eq)(j.threadTable.routineId,a)).orderBy((0,f.desc)(j.threadTable.createdAt)).limit(b)}let A=async a=>{let{createdAt:b,...c}=a;return{...c,runs:await o(a.id,h.ROUTINE.runsShown)}};async function p(){let a=await i.database.select().from(j.routineTable).orderBy(j.routineTable.createdAt);return Promise.all(a.map(A))}async function q(a){let[b]=await i.database.select().from(j.routineTable).where((0,d.eq)(j.routineTable.id,a));return b?A(b):null}async function r(a){let b=await q(a.trim());if(b)return b;let c=a.trim().toLowerCase(),d=(await p()).filter(a=>a.label.toLowerCase()===c);return 1===d.length?d[0]:null}async function s(a){let b=await (0,k.findJobBot)(a);return(!b||b.disabled)&&(0,l.publicError)("Choose an enabled bot."),b.name}function t(a,b){b&&"once"===a.kind&&(0,m.momentOf)(a.at)<=new Date&&(0,l.publicError)("That time has passed. Pick a later one.")}async function u(a){let[{total:b}]=await i.database.select({total:(0,e.count)()}).from(j.routineTable);b>=h.ROUTINE.max&&(0,l.publicError)(`There are already ${h.ROUTINE.max} routines. Delete one to make another.`),t(a.schedule,!0);let[c]=await i.database.insert(j.routineTable).values({id:crypto.randomUUID(),...a,bot:await s(a.bot),nextRunAt:(0,m.nextRun)(a.schedule,new Date)}).returning();return z(),A(c)}async function v(a,b){let[c]=await i.database.select().from(j.routineTable).where((0,d.eq)(j.routineTable.id,a));if(!c)return null;let e=b.schedule??c.schedule,f=!!(b.schedule&&!(0,m.sameSchedule)(b.schedule,c.schedule))||b.enabled&&!c.enabled;f&&t(e,b.enabled??c.enabled);let[g]=await i.database.update(j.routineTable).set({...b,...b.bot?{bot:await s(b.bot)}:{},...f?{nextRunAt:(0,m.nextRun)(e,new Date)}:{}}).where((0,d.eq)(j.routineTable.id,a)).returning();return z(),A(g)}async function w(a){let b=await i.database.delete(j.routineTable).where((0,d.eq)(j.routineTable.id,a)).returning({id:j.routineTable.id});return b.length&&z(),b.length>0}async function x(a){return(await o(a,1))[0]??null}async function y(a){return(await i.database.select({id:j.threadTable.id}).from(j.threadTable).where((0,d.and)((0,d.eq)(j.threadTable.routineId,a),(0,d.eq)(j.threadTable.seen,!1),(0,d.inArray)(j.threadTable.status,["done","cancelled"])))).map(a=>a.id)}a.s(["createRoutine",0,u,"deleteRoutine",0,w,"findRoutine",0,q,"latestRun",0,x,"listRoutines",0,p,"listUnseenRunIds",0,y,"resolveRoutine",0,r,"updateRoutine",0,v]),c()}catch(a){c(a)}},!1),643020,a=>{"use strict";var b=a.i(723885),c=a.i(569572),d=a.i(706210);let e=b.default.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"A time is HH:MM, 00:00 to 23:59");function f(a){let[b,c]=a.split(" "),[d,e,f]=b.split("-").map(Number),[g,h]=c.split(":").map(Number);return new Date(d,e-1,f,g,h)}let g=/^\d{4}-\d\d-\d\d ([01]\d|2[0-3]):[0-5]\d$/,h=b.default.string().regex(g,'A moment is "YYYY-MM-DD HH:MM"').refine(a=>{if(!g.test(a))return!0;let b=f(a);return b.getMonth()===Number(a.slice(5,7))-1&&b.getDate()===Number(a.slice(8,10))},"There is no such day"),i=b.default.discriminatedUnion("kind",[b.default.object({kind:b.default.literal("once"),at:h}),b.default.object({kind:b.default.literal("daily"),time:e,days:b.default.array(b.default.number().int().min(1).max(7)).min(1,"Pick at least one day").transform(a=>[...new Set(a)].sort((a,b)=>a-b))}),b.default.object({kind:b.default.literal("every"),hours:b.default.number().int().min(c.ROUTINE.minHours,`No more often than every ${c.ROUTINE.minHours}h`).max(168)})]),j=b.default.object({bot:b.default.string().trim().min(1,"Pick a bot"),label:b.default.string().trim().min(1,"Give it a name").max(80),request:b.default.string().trim().min(1,"Say what it should do"),schedule:i}),k=b.default.object({id:b.default.string(),status:b.default.enum(["running","waiting","done","cancelled"]),outcome:b.default.string().nullable(),updatedAt:d.DateLikeSchema});j.extend({id:b.default.string(),enabled:b.default.boolean(),nextRunAt:d.DateLikeSchema,runs:b.default.array(k)});let l=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],m=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];a.s(["RoutineInputSchema",0,j,"RoutineScheduleSchema",0,i,"momentOf",0,f,"nextRun",0,function(a,b){if("once"===a.kind)return f(a.at);if("every"===a.kind)return new Date(b.getTime()+36e5*a.hours);let[c,d]=a.time.split(":").map(Number);for(let e=0;e<=7;e++){let f=new Date(b);f.setDate(f.getDate()+e),f.setHours(c,d,0,0);let g=0===f.getDay()?7:f.getDay();if(f>b&&a.days.includes(g))return f}return new Date(b.getTime()+864e5)},"sameSchedule",0,function(a,b){if("once"===a.kind)return"once"===b.kind&&a.at===b.at;if("every"===a.kind)return"every"===b.kind&&a.hours===b.hours;let c=a=>[...a].sort((a,b)=>a-b).join();return"daily"===b.kind&&a.time===b.time&&c(a.days)===c(b.days)},"scheduleText",0,function(a){if("once"===a.kind){let[b,c]=a.at.split(" "),[,d,e]=b.split("-").map(Number);return`Once \xb7 ${m[d-1]} ${e} ${c}`}if("every"===a.kind)return 1===a.hours?"Every hour":`Every ${a.hours} hours`;let{days:b,time:c}=a;if(7===b.length)return`Daily ${c}`;if(1===b.length)return`${l[b[0]-1]} ${c}`;let d=b.every((a,c)=>0===c||a===b[c-1]+1)?`${l[b[0]-1]}–${l[b.at(-1)-1]}`:b.map(a=>l[a-1]).join(" ");return`Daily ${c} \xb7 ${d}`}])},487591,422807,a=>{"use strict";var b=a.i(912714),c=a.i(750227),d=a.i(203469),e=a.i(569572),f=a.i(821415);a.i(176668);let g=a=>a.trim().toLowerCase().replace(/^[a-z]+:\/\//,"").replace(/^www\./,"").replace(/[/?#].*$/,"");a.s(["siteOf",0,g],422807);let h=(0,c.join)(e.DATA_DIR,e.PATHS.signIns),i=a=>(0,c.join)(h,`${encodeURIComponent(g(a))}.json`),j=()=>d.appEvents.emit({type:"signins"});async function k(a){try{return JSON.parse(await (0,b.readFile)(i(a),"utf8"))}catch{return null}}async function l(a){let b=g(a),c=await k(b);if(c)return c;let d=(await n()).map(a=>a.site).filter(a=>b.endsWith(`.${a}`)).sort((a,b)=>b.length-a.length)[0];return d?k(d):null}async function m(a){await (0,b.mkdir)(h,{recursive:!0}),await (0,b.writeFile)(i(a.site),JSON.stringify(a),{mode:384}),j()}async function n(){let a=await (0,b.readdir)(h).catch(()=>[]);return(await Promise.all(a.filter(a=>a.endsWith(".json")).map(a=>k(decodeURIComponent(a.slice(0,-5)))))).flatMap(a=>a?[(({state:a,...b})=>b)(a)]:[]).sort((a,b)=>a.site.localeCompare(b.site))}async function o(a){let b=await l(a.site);if(b&&!b.bots.includes(a.bot)){let c=b.asking.includes(a.bot)?b:{...b,asking:[...b.asking,a.bot]};return c!==b&&await m(c),{kind:"taken",signIn:(({state:a,...b})=>b)(c)}}let c=b?.site??g(a.site),d={site:c,account:a.account.trim()||c,bots:[...new Set([...b?.bots??[],a.bot])],asking:(b?.asking??[]).filter(b=>b!==a.bot),keptAt:new Date().toISOString(),usedAt:b?.usedAt??null,state:a.state};return await m(d),{kind:"kept",signIn:(({state:a,...b})=>b)(d)}}let p=globalThis.__signInsHeld??=new Map;async function q(a,b){let c=await l(a);if(!c)return{kind:"none",kept:(await n()).map(a=>a.site)};if(!c.bots.includes(b))return c.asking.includes(b)||await m({...c,asking:[...c.asking,b]}),{kind:"ask",signIn:(({state:a,...b})=>b)(c)};let d={...c,usedAt:new Date().toISOString()};return await m(d),{kind:"state",signIn:(({state:a,...b})=>b)(d),state:c.state}}async function r(a,b){return(await (0,f.listBrowsers)(a,b)).find(a=>a.name===b.PLAYWRIGHT_CLI_SESSION)??null}async function s(a,b){let c=await r(a,b);return c?c.attached?"theirs":"own":null}async function t(a,b){let c=await r(a,b);return!!c&&!c.attached&&!0===c.headed}let u=a=>`${a.name}
132
133
  ${a.domain}
@@ -1,3 +1,3 @@
1
- module.exports=[199169,a=>{"use strict";var b=a.i(256711),c=a.i(912402),d=a.i(11065),e=a.i(156757);let f=e.z.union([e.z.date(),e.z.iso.datetime()]),g=a=>new Date(a);a.s(["DateLikeSchema",0,f,"shortAgo",0,function(a,b=Date.now()){let c=Math.max(0,Math.round((b-g(a).getTime())/1e3));if(c<60)return"now";let d=Math.round(c/60);if(d<60)return`${d}m`;let e=Math.round(d/60);return e<24?`${e}h`:`${Math.round(e/24)}d`},"toDate",0,g,"whenOf",0,function(a){let e=g(a),f=(0,b.format)(e,"HH:mm");return(0,c.isToday)(e)?f:(0,d.isYesterday)(e)?`Yesterday ${f}`:`${(0,b.format)(e,"MMM d")} \xb7 ${f}`}])},256711,a=>{"use strict";var b=a.i(244513),c=a.i(852587),d=a.i(23464),e=a.i(57270),f=a.i(959296),g=a.i(367638),h=a.i(774016);function i(a,b){let d=(0,c.getDefaultOptions)(),e=b?.weekStartsOn??b?.locale?.options?.weekStartsOn??d.weekStartsOn??d.locale?.options?.weekStartsOn??0,f=(0,h.toDate)(a,b?.in),g=f.getDay();return f.setDate(f.getDate()-(7*(g<e)+g-e)),f.setHours(0,0,0,0),f}function j(a,b){return i(a,{...b,weekStartsOn:1})}var k=a.i(42724);function l(a,b){let c=(0,h.toDate)(a,b?.in),d=c.getFullYear(),e=(0,k.constructFrom)(c,0);e.setFullYear(d+1,0,4),e.setHours(0,0,0,0);let f=j(e),g=(0,k.constructFrom)(c,0);g.setFullYear(d,0,4),g.setHours(0,0,0,0);let i=j(g);return c.getTime()>=f.getTime()?d+1:c.getTime()>=i.getTime()?d:d-1}function m(a,b){let d=(0,h.toDate)(a,b?.in),e=d.getFullYear(),f=(0,c.getDefaultOptions)(),g=b?.firstWeekContainsDate??b?.locale?.options?.firstWeekContainsDate??f.firstWeekContainsDate??f.locale?.options?.firstWeekContainsDate??1,j=(0,k.constructFrom)(b?.in||a,0);j.setFullYear(e+1,0,g),j.setHours(0,0,0,0);let l=i(j,b),m=(0,k.constructFrom)(b?.in||a,0);m.setFullYear(e,0,g),m.setHours(0,0,0,0);let n=i(m,b);return+d>=+l?e+1:+d>=+n?e:e-1}function n(a,b){let c=Math.abs(a).toString().padStart(b,"0");return(a<0?"-":"")+c}let o={y(a,b){let c=a.getFullYear(),d=c>0?c:1-c;return n("yy"===b?d%100:d,b.length)},M(a,b){let c=a.getMonth();return"M"===b?String(c+1):n(c+1,2)},d:(a,b)=>n(a.getDate(),b.length),a(a,b){let c=a.getHours()/12>=1?"pm":"am";switch(b){case"a":case"aa":return c.toUpperCase();case"aaa":return c;case"aaaaa":return c[0];default:return"am"===c?"a.m.":"p.m."}},h:(a,b)=>n(a.getHours()%12||12,b.length),H:(a,b)=>n(a.getHours(),b.length),m:(a,b)=>n(a.getMinutes(),b.length),s:(a,b)=>n(a.getSeconds(),b.length),S(a,b){let c=b.length;return n(Math.trunc(a.getMilliseconds()*Math.pow(10,c-3)),b.length)}},p={G:function(a,b,c){let d=+(a.getFullYear()>0);switch(b){case"G":case"GG":case"GGG":return c.era(d,{width:"abbreviated"});case"GGGGG":return c.era(d,{width:"narrow"});default:return c.era(d,{width:"wide"})}},y:function(a,b,c){if("yo"===b){let b=a.getFullYear();return c.ordinalNumber(b>0?b:1-b,{unit:"year"})}return o.y(a,b)},Y:function(a,b,c,d){let e=m(a,d),f=e>0?e:1-e;return"YY"===b?n(f%100,2):"Yo"===b?c.ordinalNumber(f,{unit:"year"}):n(f,b.length)},R:function(a,b){return n(l(a),b.length)},u:function(a,b){return n(a.getFullYear(),b.length)},Q:function(a,b,c){let d=Math.ceil((a.getMonth()+1)/3);switch(b){case"Q":return String(d);case"QQ":return n(d,2);case"Qo":return c.ordinalNumber(d,{unit:"quarter"});case"QQQ":return c.quarter(d,{width:"abbreviated",context:"formatting"});case"QQQQQ":return c.quarter(d,{width:"narrow",context:"formatting"});default:return c.quarter(d,{width:"wide",context:"formatting"})}},q:function(a,b,c){let d=Math.ceil((a.getMonth()+1)/3);switch(b){case"q":return String(d);case"qq":return n(d,2);case"qo":return c.ordinalNumber(d,{unit:"quarter"});case"qqq":return c.quarter(d,{width:"abbreviated",context:"standalone"});case"qqqqq":return c.quarter(d,{width:"narrow",context:"standalone"});default:return c.quarter(d,{width:"wide",context:"standalone"})}},M:function(a,b,c){let d=a.getMonth();switch(b){case"M":case"MM":return o.M(a,b);case"Mo":return c.ordinalNumber(d+1,{unit:"month"});case"MMM":return c.month(d,{width:"abbreviated",context:"formatting"});case"MMMMM":return c.month(d,{width:"narrow",context:"formatting"});default:return c.month(d,{width:"wide",context:"formatting"})}},L:function(a,b,c){let d=a.getMonth();switch(b){case"L":return String(d+1);case"LL":return n(d+1,2);case"Lo":return c.ordinalNumber(d+1,{unit:"month"});case"LLL":return c.month(d,{width:"abbreviated",context:"standalone"});case"LLLLL":return c.month(d,{width:"narrow",context:"standalone"});default:return c.month(d,{width:"wide",context:"standalone"})}},w:function(a,b,d,e){let g,j,l,o,p,q=Math.round((i(g=(0,h.toDate)(a,e?.in),e)-(j=(0,c.getDefaultOptions)(),l=e?.firstWeekContainsDate??e?.locale?.options?.firstWeekContainsDate??j.firstWeekContainsDate??j.locale?.options?.firstWeekContainsDate??1,o=m(g,e),(p=(0,k.constructFrom)(e?.in||g,0)).setFullYear(o,0,l),p.setHours(0,0,0,0),i(p,e)))/f.millisecondsInWeek)+1;return"wo"===b?d.ordinalNumber(q,{unit:"week"}):n(q,b.length)},I:function(a,b,c){let d,e,g,i=Math.round((j(d=(0,h.toDate)(a,void 0))-(e=l(d,void 0),(g=(0,k.constructFrom)(d,0)).setFullYear(e,0,4),g.setHours(0,0,0,0),j(g)))/f.millisecondsInWeek)+1;return"Io"===b?c.ordinalNumber(i,{unit:"week"}):n(i,b.length)},d:function(a,b,c){return"do"===b?c.ordinalNumber(a.getDate(),{unit:"date"}):o.d(a,b)},D:function(a,b,c){let i,j,k=function(a,b){let[c,h]=(0,e.normalizeDates)(void 0,a,b),i=(0,g.startOfDay)(c),j=(0,g.startOfDay)(h);return Math.round((i-(0,d.getTimezoneOffsetInMilliseconds)(i)-(j-(0,d.getTimezoneOffsetInMilliseconds)(j)))/f.millisecondsInDay)}(i=(0,h.toDate)(a,void 0),((j=(0,h.toDate)(i,void 0)).setFullYear(j.getFullYear(),0,1),j.setHours(0,0,0,0),j))+1;return"Do"===b?c.ordinalNumber(k,{unit:"dayOfYear"}):n(k,b.length)},E:function(a,b,c){let d=a.getDay();switch(b){case"E":case"EE":case"EEE":return c.day(d,{width:"abbreviated",context:"formatting"});case"EEEEE":return c.day(d,{width:"narrow",context:"formatting"});case"EEEEEE":return c.day(d,{width:"short",context:"formatting"});default:return c.day(d,{width:"wide",context:"formatting"})}},e:function(a,b,c,d){let e=a.getDay(),f=(e-d.weekStartsOn+8)%7||7;switch(b){case"e":return String(f);case"ee":return n(f,2);case"eo":return c.ordinalNumber(f,{unit:"day"});case"eee":return c.day(e,{width:"abbreviated",context:"formatting"});case"eeeee":return c.day(e,{width:"narrow",context:"formatting"});case"eeeeee":return c.day(e,{width:"short",context:"formatting"});default:return c.day(e,{width:"wide",context:"formatting"})}},c:function(a,b,c,d){let e=a.getDay(),f=(e-d.weekStartsOn+8)%7||7;switch(b){case"c":return String(f);case"cc":return n(f,b.length);case"co":return c.ordinalNumber(f,{unit:"day"});case"ccc":return c.day(e,{width:"abbreviated",context:"standalone"});case"ccccc":return c.day(e,{width:"narrow",context:"standalone"});case"cccccc":return c.day(e,{width:"short",context:"standalone"});default:return c.day(e,{width:"wide",context:"standalone"})}},i:function(a,b,c){let d=a.getDay(),e=0===d?7:d;switch(b){case"i":return String(e);case"ii":return n(e,b.length);case"io":return c.ordinalNumber(e,{unit:"day"});case"iii":return c.day(d,{width:"abbreviated",context:"formatting"});case"iiiii":return c.day(d,{width:"narrow",context:"formatting"});case"iiiiii":return c.day(d,{width:"short",context:"formatting"});default:return c.day(d,{width:"wide",context:"formatting"})}},a:function(a,b,c){let d=a.getHours()/12>=1?"pm":"am";switch(b){case"a":case"aa":return c.dayPeriod(d,{width:"abbreviated",context:"formatting"});case"aaa":return c.dayPeriod(d,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return c.dayPeriod(d,{width:"narrow",context:"formatting"});default:return c.dayPeriod(d,{width:"wide",context:"formatting"})}},b:function(a,b,c){let d,e=a.getHours();switch(d=12===e?"noon":0===e?"midnight":e/12>=1?"pm":"am",b){case"b":case"bb":return c.dayPeriod(d,{width:"abbreviated",context:"formatting"});case"bbb":return c.dayPeriod(d,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return c.dayPeriod(d,{width:"narrow",context:"formatting"});default:return c.dayPeriod(d,{width:"wide",context:"formatting"})}},B:function(a,b,c){let d,e=a.getHours();switch(d=e>=17?"evening":e>=12?"afternoon":e>=4?"morning":"night",b){case"B":case"BB":case"BBB":return c.dayPeriod(d,{width:"abbreviated",context:"formatting"});case"BBBBB":return c.dayPeriod(d,{width:"narrow",context:"formatting"});default:return c.dayPeriod(d,{width:"wide",context:"formatting"})}},h:function(a,b,c){if("ho"===b){let b=a.getHours()%12;return 0===b&&(b=12),c.ordinalNumber(b,{unit:"hour"})}return o.h(a,b)},H:function(a,b,c){return"Ho"===b?c.ordinalNumber(a.getHours(),{unit:"hour"}):o.H(a,b)},K:function(a,b,c){let d=a.getHours()%12;return"Ko"===b?c.ordinalNumber(d,{unit:"hour"}):n(d,b.length)},k:function(a,b,c){let d=a.getHours();return(0===d&&(d=24),"ko"===b)?c.ordinalNumber(d,{unit:"hour"}):n(d,b.length)},m:function(a,b,c){return"mo"===b?c.ordinalNumber(a.getMinutes(),{unit:"minute"}):o.m(a,b)},s:function(a,b,c){return"so"===b?c.ordinalNumber(a.getSeconds(),{unit:"second"}):o.s(a,b)},S:function(a,b){return o.S(a,b)},X:function(a,b,c){let d=a.getTimezoneOffset();if(0===d)return"Z";switch(b){case"X":return r(d);case"XXXX":case"XX":return s(d);default:return s(d,":")}},x:function(a,b,c){let d=a.getTimezoneOffset();switch(b){case"x":return r(d);case"xxxx":case"xx":return s(d);default:return s(d,":")}},O:function(a,b,c){let d=a.getTimezoneOffset();switch(b){case"O":case"OO":case"OOO":return"GMT"+q(d,":");default:return"GMT"+s(d,":")}},z:function(a,b,c){let d=a.getTimezoneOffset();switch(b){case"z":case"zz":case"zzz":return"GMT"+q(d,":");default:return"GMT"+s(d,":")}},t:function(a,b,c){return n(Math.trunc(a/1e3),b.length)},T:function(a,b,c){return n(+a,b.length)}};function q(a,b=""){let c=a>0?"-":"+",d=Math.abs(a),e=Math.trunc(d/60),f=d%60;return 0===f?c+String(e):c+String(e)+b+n(f,2)}function r(a,b){return a%60==0?(a>0?"-":"+")+n(Math.abs(a)/60,2):s(a,b)}function s(a,b=""){let c=Math.abs(a);return(a>0?"-":"+")+n(Math.trunc(c/60),2)+b+n(c%60,2)}let t=(a,b)=>{switch(a){case"P":return b.date({width:"short"});case"PP":return b.date({width:"medium"});case"PPP":return b.date({width:"long"});default:return b.date({width:"full"})}},u=(a,b)=>{switch(a){case"p":return b.time({width:"short"});case"pp":return b.time({width:"medium"});case"ppp":return b.time({width:"long"});default:return b.time({width:"full"})}},v={p:u,P:(a,b)=>{let c,d=a.match(/(P+)(p+)?/)||[],e=d[1],f=d[2];if(!f)return t(a,b);switch(e){case"P":c=b.dateTime({width:"short"});break;case"PP":c=b.dateTime({width:"medium"});break;case"PPP":c=b.dateTime({width:"long"});break;default:c=b.dateTime({width:"full"})}return c.replace("{{date}}",t(e,b)).replace("{{time}}",u(f,b))}},w=/^D+$/,x=/^Y+$/,y=["D","DD","YY","YYYY"],z=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,A=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,B=/^'([^]*?)'?$/,C=/''/g,D=/[a-zA-Z]/;a.s(["format",0,function(a,d,e){let f=(0,c.getDefaultOptions)(),g=e?.locale??f.locale??b.defaultLocale,i=e?.firstWeekContainsDate??e?.locale?.options?.firstWeekContainsDate??f.firstWeekContainsDate??f.locale?.options?.firstWeekContainsDate??1,j=e?.weekStartsOn??e?.locale?.options?.weekStartsOn??f.weekStartsOn??f.locale?.options?.weekStartsOn??0,k=(0,h.toDate)(a,e?.in);if(!(k instanceof Date||"object"==typeof k&&"[object Date]"===Object.prototype.toString.call(k))&&"number"!=typeof k||isNaN(+(0,h.toDate)(k)))throw RangeError("Invalid time value");let l=d.match(A).map(a=>{let b=a[0];return"p"===b||"P"===b?(0,v[b])(a,g.formatLong):a}).join("").match(z).map(a=>{if("''"===a)return{isToken:!1,value:"'"};let b=a[0];if("'"===b){var c;let b;return{isToken:!1,value:(b=(c=a).match(B))?b[1].replace(C,"'"):c}}if(p[b])return{isToken:!0,value:a};if(b.match(D))throw RangeError("Format string contains an unescaped latin alphabet character `"+b+"`");return{isToken:!1,value:a}});g.localize.preprocessor&&(l=g.localize.preprocessor(k,l));let m={firstWeekContainsDate:i,weekStartsOn:j,locale:g};return l.map(b=>{if(!b.isToken)return b.value;let c=b.value;return(!e?.useAdditionalWeekYearTokens&&x.test(c)||!e?.useAdditionalDayOfYearTokens&&w.test(c))&&function(a,b,c){var d,e,f;let g,h=(d=a,e=b,f=c,g="Y"===d[0]?"years":"days of the month",`Use \`${d.toLowerCase()}\` instead of \`${d}\` (in \`${e}\`) for formatting ${g} to the input \`${f}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`);if(console.warn(h),y.includes(a))throw RangeError(h)}(c,d,String(a)),(0,p[c[0]])(k,c,g.localize,m)}).join("")}],256711)},985579,a=>{"use strict";var b=a.i(57270),c=a.i(367638);a.s(["isSameDay",0,function(a,d,e){let[f,g]=(0,b.normalizeDates)(e?.in,a,d);return+(0,c.startOfDay)(f)==+(0,c.startOfDay)(g)}])},912402,a=>{"use strict";var b=a.i(42724),c=a.i(934754),d=a.i(985579);a.s(["isToday",0,function(a,e){return(0,d.isSameDay)((0,b.constructFrom)(e?.in||a,a),(0,c.constructNow)(e?.in||a))}])},11065,a=>{"use strict";var b=a.i(42724),c=a.i(934754),d=a.i(985579),e=a.i(774016);a.s(["isYesterday",0,function(a,f){var g,h;let i;return(0,d.isSameDay)((0,b.constructFrom)(f?.in||a,a),(g=(0,c.constructNow)(f?.in||a),h=void 0,i=(0,e.toDate)(g,h?.in),isNaN(-1)?(0,b.constructFrom)(h?.in||g,NaN):(i.setDate(i.getDate()+-1),i)))}],11065)},367638,a=>{"use strict";var b=a.i(774016);a.s(["startOfDay",0,function(a,c){let d=(0,b.toDate)(a,c?.in);return d.setHours(0,0,0,0),d}])}];
1
+ module.exports=[199169,a=>{"use strict";var b=a.i(256711),c=a.i(912402),d=a.i(11065),e=a.i(156757);let f=e.z.union([e.z.date(),e.z.iso.datetime()]),g=a=>new Date(a);a.s(["DateLikeSchema",0,f,"shortAgo",0,function(a,b=Date.now()){let c=Math.max(0,Math.round((b-g(a).getTime())/1e3));if(c<60)return"now";let d=Math.round(c/60);if(d<60)return`${d}m`;let e=Math.round(d/60);return e<24?`${e}h`:`${Math.round(e/24)}d`},"toDate",0,g,"whenOf",0,function(a){let e=g(a),f=(0,b.format)(e,"HH:mm");return(0,c.isToday)(e)?f:(0,d.isYesterday)(e)?`Yesterday ${f}`:`${(0,b.format)(e,"MMM d")} \xb7 ${f}`}])},256711,a=>{"use strict";var b=a.i(244513),c=a.i(852587),d=a.i(23464),e=a.i(57270),f=a.i(959296),g=a.i(367638),h=a.i(774016);function i(a,b){let d=(0,c.getDefaultOptions)(),e=b?.weekStartsOn??b?.locale?.options?.weekStartsOn??d.weekStartsOn??d.locale?.options?.weekStartsOn??0,f=(0,h.toDate)(a,b?.in),g=f.getDay();return f.setDate(f.getDate()-(7*(g<e)+g-e)),f.setHours(0,0,0,0),f}function j(a,b){return i(a,{...b,weekStartsOn:1})}var k=a.i(42724);function l(a,b){let c=(0,h.toDate)(a,b?.in),d=c.getFullYear(),e=(0,k.constructFrom)(c,0);e.setFullYear(d+1,0,4),e.setHours(0,0,0,0);let f=j(e),g=(0,k.constructFrom)(c,0);g.setFullYear(d,0,4),g.setHours(0,0,0,0);let i=j(g);return c.getTime()>=f.getTime()?d+1:c.getTime()>=i.getTime()?d:d-1}function m(a,b){let d=(0,h.toDate)(a,b?.in),e=d.getFullYear(),f=(0,c.getDefaultOptions)(),g=b?.firstWeekContainsDate??b?.locale?.options?.firstWeekContainsDate??f.firstWeekContainsDate??f.locale?.options?.firstWeekContainsDate??1,j=(0,k.constructFrom)(b?.in||a,0);j.setFullYear(e+1,0,g),j.setHours(0,0,0,0);let l=i(j,b),m=(0,k.constructFrom)(b?.in||a,0);m.setFullYear(e,0,g),m.setHours(0,0,0,0);let n=i(m,b);return+d>=+l?e+1:+d>=+n?e:e-1}function n(a,b){let c=Math.abs(a).toString().padStart(b,"0");return(a<0?"-":"")+c}let o={y(a,b){let c=a.getFullYear(),d=c>0?c:1-c;return n("yy"===b?d%100:d,b.length)},M(a,b){let c=a.getMonth();return"M"===b?String(c+1):n(c+1,2)},d:(a,b)=>n(a.getDate(),b.length),a(a,b){let c=a.getHours()/12>=1?"pm":"am";switch(b){case"a":case"aa":return c.toUpperCase();case"aaa":return c;case"aaaaa":return c[0];default:return"am"===c?"a.m.":"p.m."}},h:(a,b)=>n(a.getHours()%12||12,b.length),H:(a,b)=>n(a.getHours(),b.length),m:(a,b)=>n(a.getMinutes(),b.length),s:(a,b)=>n(a.getSeconds(),b.length),S(a,b){let c=b.length;return n(Math.trunc(a.getMilliseconds()*Math.pow(10,c-3)),b.length)}},p={G:function(a,b,c){let d=+(a.getFullYear()>0);switch(b){case"G":case"GG":case"GGG":return c.era(d,{width:"abbreviated"});case"GGGGG":return c.era(d,{width:"narrow"});default:return c.era(d,{width:"wide"})}},y:function(a,b,c){if("yo"===b){let b=a.getFullYear();return c.ordinalNumber(b>0?b:1-b,{unit:"year"})}return o.y(a,b)},Y:function(a,b,c,d){let e=m(a,d),f=e>0?e:1-e;return"YY"===b?n(f%100,2):"Yo"===b?c.ordinalNumber(f,{unit:"year"}):n(f,b.length)},R:function(a,b){return n(l(a),b.length)},u:function(a,b){return n(a.getFullYear(),b.length)},Q:function(a,b,c){let d=Math.ceil((a.getMonth()+1)/3);switch(b){case"Q":return String(d);case"QQ":return n(d,2);case"Qo":return c.ordinalNumber(d,{unit:"quarter"});case"QQQ":return c.quarter(d,{width:"abbreviated",context:"formatting"});case"QQQQQ":return c.quarter(d,{width:"narrow",context:"formatting"});default:return c.quarter(d,{width:"wide",context:"formatting"})}},q:function(a,b,c){let d=Math.ceil((a.getMonth()+1)/3);switch(b){case"q":return String(d);case"qq":return n(d,2);case"qo":return c.ordinalNumber(d,{unit:"quarter"});case"qqq":return c.quarter(d,{width:"abbreviated",context:"standalone"});case"qqqqq":return c.quarter(d,{width:"narrow",context:"standalone"});default:return c.quarter(d,{width:"wide",context:"standalone"})}},M:function(a,b,c){let d=a.getMonth();switch(b){case"M":case"MM":return o.M(a,b);case"Mo":return c.ordinalNumber(d+1,{unit:"month"});case"MMM":return c.month(d,{width:"abbreviated",context:"formatting"});case"MMMMM":return c.month(d,{width:"narrow",context:"formatting"});default:return c.month(d,{width:"wide",context:"formatting"})}},L:function(a,b,c){let d=a.getMonth();switch(b){case"L":return String(d+1);case"LL":return n(d+1,2);case"Lo":return c.ordinalNumber(d+1,{unit:"month"});case"LLL":return c.month(d,{width:"abbreviated",context:"standalone"});case"LLLLL":return c.month(d,{width:"narrow",context:"standalone"});default:return c.month(d,{width:"wide",context:"standalone"})}},w:function(a,b,d,e){let g,j,l,o,p,q=Math.round((i(g=(0,h.toDate)(a,e?.in),e)-(j=(0,c.getDefaultOptions)(),l=e?.firstWeekContainsDate??e?.locale?.options?.firstWeekContainsDate??j.firstWeekContainsDate??j.locale?.options?.firstWeekContainsDate??1,o=m(g,e),(p=(0,k.constructFrom)(e?.in||g,0)).setFullYear(o,0,l),p.setHours(0,0,0,0),i(p,e)))/f.millisecondsInWeek)+1;return"wo"===b?d.ordinalNumber(q,{unit:"week"}):n(q,b.length)},I:function(a,b,c){let d,e,g,i=Math.round((j(d=(0,h.toDate)(a,void 0))-(e=l(d,void 0),(g=(0,k.constructFrom)(d,0)).setFullYear(e,0,4),g.setHours(0,0,0,0),j(g)))/f.millisecondsInWeek)+1;return"Io"===b?c.ordinalNumber(i,{unit:"week"}):n(i,b.length)},d:function(a,b,c){return"do"===b?c.ordinalNumber(a.getDate(),{unit:"date"}):o.d(a,b)},D:function(a,b,c){let i,j,k=function(a,b){let[c,h]=(0,e.normalizeDates)(void 0,a,b),i=(0,g.startOfDay)(c),j=(0,g.startOfDay)(h);return Math.round((i-(0,d.getTimezoneOffsetInMilliseconds)(i)-(j-(0,d.getTimezoneOffsetInMilliseconds)(j)))/f.millisecondsInDay)}(i=(0,h.toDate)(a,void 0),((j=(0,h.toDate)(i,void 0)).setFullYear(j.getFullYear(),0,1),j.setHours(0,0,0,0),j))+1;return"Do"===b?c.ordinalNumber(k,{unit:"dayOfYear"}):n(k,b.length)},E:function(a,b,c){let d=a.getDay();switch(b){case"E":case"EE":case"EEE":return c.day(d,{width:"abbreviated",context:"formatting"});case"EEEEE":return c.day(d,{width:"narrow",context:"formatting"});case"EEEEEE":return c.day(d,{width:"short",context:"formatting"});default:return c.day(d,{width:"wide",context:"formatting"})}},e:function(a,b,c,d){let e=a.getDay(),f=(e-d.weekStartsOn+8)%7||7;switch(b){case"e":return String(f);case"ee":return n(f,2);case"eo":return c.ordinalNumber(f,{unit:"day"});case"eee":return c.day(e,{width:"abbreviated",context:"formatting"});case"eeeee":return c.day(e,{width:"narrow",context:"formatting"});case"eeeeee":return c.day(e,{width:"short",context:"formatting"});default:return c.day(e,{width:"wide",context:"formatting"})}},c:function(a,b,c,d){let e=a.getDay(),f=(e-d.weekStartsOn+8)%7||7;switch(b){case"c":return String(f);case"cc":return n(f,b.length);case"co":return c.ordinalNumber(f,{unit:"day"});case"ccc":return c.day(e,{width:"abbreviated",context:"standalone"});case"ccccc":return c.day(e,{width:"narrow",context:"standalone"});case"cccccc":return c.day(e,{width:"short",context:"standalone"});default:return c.day(e,{width:"wide",context:"standalone"})}},i:function(a,b,c){let d=a.getDay(),e=0===d?7:d;switch(b){case"i":return String(e);case"ii":return n(e,b.length);case"io":return c.ordinalNumber(e,{unit:"day"});case"iii":return c.day(d,{width:"abbreviated",context:"formatting"});case"iiiii":return c.day(d,{width:"narrow",context:"formatting"});case"iiiiii":return c.day(d,{width:"short",context:"formatting"});default:return c.day(d,{width:"wide",context:"formatting"})}},a:function(a,b,c){let d=a.getHours()/12>=1?"pm":"am";switch(b){case"a":case"aa":return c.dayPeriod(d,{width:"abbreviated",context:"formatting"});case"aaa":return c.dayPeriod(d,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return c.dayPeriod(d,{width:"narrow",context:"formatting"});default:return c.dayPeriod(d,{width:"wide",context:"formatting"})}},b:function(a,b,c){let d,e=a.getHours();switch(d=12===e?"noon":0===e?"midnight":e/12>=1?"pm":"am",b){case"b":case"bb":return c.dayPeriod(d,{width:"abbreviated",context:"formatting"});case"bbb":return c.dayPeriod(d,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return c.dayPeriod(d,{width:"narrow",context:"formatting"});default:return c.dayPeriod(d,{width:"wide",context:"formatting"})}},B:function(a,b,c){let d,e=a.getHours();switch(d=e>=17?"evening":e>=12?"afternoon":e>=4?"morning":"night",b){case"B":case"BB":case"BBB":return c.dayPeriod(d,{width:"abbreviated",context:"formatting"});case"BBBBB":return c.dayPeriod(d,{width:"narrow",context:"formatting"});default:return c.dayPeriod(d,{width:"wide",context:"formatting"})}},h:function(a,b,c){if("ho"===b){let b=a.getHours()%12;return 0===b&&(b=12),c.ordinalNumber(b,{unit:"hour"})}return o.h(a,b)},H:function(a,b,c){return"Ho"===b?c.ordinalNumber(a.getHours(),{unit:"hour"}):o.H(a,b)},K:function(a,b,c){let d=a.getHours()%12;return"Ko"===b?c.ordinalNumber(d,{unit:"hour"}):n(d,b.length)},k:function(a,b,c){let d=a.getHours();return(0===d&&(d=24),"ko"===b)?c.ordinalNumber(d,{unit:"hour"}):n(d,b.length)},m:function(a,b,c){return"mo"===b?c.ordinalNumber(a.getMinutes(),{unit:"minute"}):o.m(a,b)},s:function(a,b,c){return"so"===b?c.ordinalNumber(a.getSeconds(),{unit:"second"}):o.s(a,b)},S:function(a,b){return o.S(a,b)},X:function(a,b,c){let d=a.getTimezoneOffset();if(0===d)return"Z";switch(b){case"X":return r(d);case"XXXX":case"XX":return s(d);default:return s(d,":")}},x:function(a,b,c){let d=a.getTimezoneOffset();switch(b){case"x":return r(d);case"xxxx":case"xx":return s(d);default:return s(d,":")}},O:function(a,b,c){let d=a.getTimezoneOffset();switch(b){case"O":case"OO":case"OOO":return"GMT"+q(d,":");default:return"GMT"+s(d,":")}},z:function(a,b,c){let d=a.getTimezoneOffset();switch(b){case"z":case"zz":case"zzz":return"GMT"+q(d,":");default:return"GMT"+s(d,":")}},t:function(a,b,c){return n(Math.trunc(a/1e3),b.length)},T:function(a,b,c){return n(+a,b.length)}};function q(a,b=""){let c=a>0?"-":"+",d=Math.abs(a),e=Math.trunc(d/60),f=d%60;return 0===f?c+String(e):c+String(e)+b+n(f,2)}function r(a,b){return a%60==0?(a>0?"-":"+")+n(Math.abs(a)/60,2):s(a,b)}function s(a,b=""){let c=Math.abs(a);return(a>0?"-":"+")+n(Math.trunc(c/60),2)+b+n(c%60,2)}let t=(a,b)=>{switch(a){case"P":return b.date({width:"short"});case"PP":return b.date({width:"medium"});case"PPP":return b.date({width:"long"});default:return b.date({width:"full"})}},u=(a,b)=>{switch(a){case"p":return b.time({width:"short"});case"pp":return b.time({width:"medium"});case"ppp":return b.time({width:"long"});default:return b.time({width:"full"})}},v={p:u,P:(a,b)=>{let c,d=a.match(/(P+)(p+)?/)||[],e=d[1],f=d[2];if(!f)return t(a,b);switch(e){case"P":c=b.dateTime({width:"short"});break;case"PP":c=b.dateTime({width:"medium"});break;case"PPP":c=b.dateTime({width:"long"});break;default:c=b.dateTime({width:"full"})}return c.replace("{{date}}",t(e,b)).replace("{{time}}",u(f,b))}},w=/^D+$/,x=/^Y+$/,y=["D","DD","YY","YYYY"],z=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,A=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,B=/^'([^]*?)'?$/,C=/''/g,D=/[a-zA-Z]/;a.s(["format",0,function(a,d,e){let f=(0,c.getDefaultOptions)(),g=e?.locale??f.locale??b.defaultLocale,i=e?.firstWeekContainsDate??e?.locale?.options?.firstWeekContainsDate??f.firstWeekContainsDate??f.locale?.options?.firstWeekContainsDate??1,j=e?.weekStartsOn??e?.locale?.options?.weekStartsOn??f.weekStartsOn??f.locale?.options?.weekStartsOn??0,k=(0,h.toDate)(a,e?.in);if(!(k instanceof Date||"object"==typeof k&&"[object Date]"===Object.prototype.toString.call(k))&&"number"!=typeof k||isNaN(+(0,h.toDate)(k)))throw RangeError("Invalid time value");let l=d.match(A).map(a=>{let b=a[0];return"p"===b||"P"===b?(0,v[b])(a,g.formatLong):a}).join("").match(z).map(a=>{if("''"===a)return{isToken:!1,value:"'"};let b=a[0];if("'"===b){var c;let b;return{isToken:!1,value:(b=(c=a).match(B))?b[1].replace(C,"'"):c}}if(p[b])return{isToken:!0,value:a};if(b.match(D))throw RangeError("Format string contains an unescaped latin alphabet character `"+b+"`");return{isToken:!1,value:a}});g.localize.preprocessor&&(l=g.localize.preprocessor(k,l));let m={firstWeekContainsDate:i,weekStartsOn:j,locale:g};return l.map(b=>{if(!b.isToken)return b.value;let c=b.value;return(!e?.useAdditionalWeekYearTokens&&x.test(c)||!e?.useAdditionalDayOfYearTokens&&w.test(c))&&function(a,b,c){var d,e,f;let g,h=(d=a,e=b,f=c,g="Y"===d[0]?"years":"days of the month",`Use \`${d.toLowerCase()}\` instead of \`${d}\` (in \`${e}\`) for formatting ${g} to the input \`${f}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`);if(console.warn(h),y.includes(a))throw RangeError(h)}(c,d,String(a)),(0,p[c[0]])(k,c,g.localize,m)}).join("")}],256711)},985579,a=>{"use strict";var b=a.i(57270),c=a.i(367638);a.s(["isSameDay",0,function(a,d,e){let[f,g]=(0,b.normalizeDates)(e?.in,a,d);return+(0,c.startOfDay)(f)==+(0,c.startOfDay)(g)}])},912402,a=>{"use strict";var b=a.i(42724),c=a.i(934754),d=a.i(985579);a.s(["isToday",0,function(a,e){return(0,d.isSameDay)((0,b.constructFrom)(e?.in||a,a),(0,c.constructNow)(e?.in||a))}])},11065,a=>{"use strict";var b=a.i(42724),c=a.i(934754),d=a.i(985579),e=a.i(774016);a.s(["isYesterday",0,function(a,f){var g,h;let i;return(0,d.isSameDay)((0,b.constructFrom)(f?.in||a,a),(g=(0,c.constructNow)(f?.in||a),h=void 0,i=(0,e.toDate)(g,h?.in),isNaN(-1)?(0,b.constructFrom)(h?.in||g,NaN):(i.setDate(i.getDate()+-1),i)))}],11065)},367638,a=>{"use strict";var b=a.i(774016);a.s(["startOfDay",0,function(a,c){let d=(0,b.toDate)(a,c?.in);return d.setHours(0,0,0,0),d}])},474215,a=>{"use strict";var b=a.i(176965);a.s(["X",()=>b.default])}];
2
2
 
3
- //# sourceMappingURL=_123y-ah._.js.map
3
+ //# sourceMappingURL=_0is8m6y._.js.map