thursday-agent 0.10.0 → 0.12.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 (308) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +0 -1
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/routes-manifest.json +0 -6
  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.nft.json +1 -1
  20. package/.next/server/app/api/bot/keep-working/route.js.nft.json +1 -1
  21. package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
  22. package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
  23. package/.next/server/app/api/bot/route.js.nft.json +1 -1
  24. package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -1
  25. package/.next/server/app/api/bot/thread/route.js.nft.json +1 -1
  26. package/.next/server/app/api/config/route.js.nft.json +1 -1
  27. package/.next/server/app/api/events/route.js.nft.json +1 -1
  28. package/.next/server/app/api/favicon/[host]/route.js.nft.json +1 -1
  29. package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
  30. package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
  31. package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -1
  32. package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
  33. package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -1
  34. package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
  35. package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
  36. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  37. package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
  38. package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
  39. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  40. package/.next/server/app/api/reach/route.js +13 -13
  41. package/.next/server/app/api/reach/route.js.nft.json +1 -1
  42. package/.next/server/app/api/routine/route.js.nft.json +1 -1
  43. package/.next/server/app/api/signins/route.js +1 -1
  44. package/.next/server/app/api/signins/route.js.nft.json +1 -1
  45. package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
  46. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  47. package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
  48. package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
  49. package/.next/server/app/api/thursday/text/route.js.nft.json +1 -1
  50. package/.next/server/app/api/thursday/tool-call/route.js +14 -15
  51. package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
  52. package/.next/server/app/api/workspace/files/route.js.nft.json +1 -1
  53. package/.next/server/app/api/workspace/route.js.nft.json +1 -1
  54. package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +1 -1
  55. package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
  56. package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
  57. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  58. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  59. package/.next/server/app/page/server-reference-manifest.json +56 -56
  60. package/.next/server/app/page.js +4 -4
  61. package/.next/server/app/page.js.nft.json +1 -1
  62. package/.next/server/app/page_client-reference-manifest.js +1 -1
  63. package/.next/server/app-paths-manifest.json +0 -1
  64. package/.next/server/chunks/[root-of-the-server]__014ydvq._.js +2 -2
  65. package/.next/server/chunks/[root-of-the-server]__0209ah4._.js +7 -5
  66. package/.next/server/chunks/[root-of-the-server]__04r4h-2._.js +4 -2
  67. package/.next/server/chunks/[root-of-the-server]__04wldw9._.js +1 -1
  68. package/.next/server/chunks/[root-of-the-server]__0542v_d._.js +3 -0
  69. package/.next/server/chunks/[root-of-the-server]__0cfszwn._.js +1 -1
  70. package/.next/server/chunks/[root-of-the-server]__0gewdg9._.js +2 -2
  71. package/.next/server/chunks/[root-of-the-server]__0mrk2it._.js +1 -1
  72. package/.next/server/chunks/[root-of-the-server]__0npn_pn._.js +1 -1
  73. package/.next/server/chunks/[root-of-the-server]__0nr-v8s._.js +1 -1
  74. package/.next/server/chunks/[root-of-the-server]__0rqgb17._.js +1 -1
  75. package/.next/server/chunks/[root-of-the-server]__1-swlkw._.js +2 -2
  76. package/.next/server/chunks/[root-of-the-server]__12iddfq._.js +1 -1
  77. package/.next/server/chunks/[root-of-the-server]__1ai5lme._.js +3 -3
  78. package/.next/server/chunks/[root-of-the-server]__1cjxw0-._.js +2 -2
  79. package/.next/server/chunks/{[root-of-the-server]__1fy2g82._.js → [root-of-the-server]__1k3j52n._.js} +1 -1
  80. package/.next/server/chunks/[root-of-the-server]__1kyjt5m._.js +3 -3
  81. package/.next/server/chunks/[root-of-the-server]__1tg5got._.js +1 -1
  82. package/.next/server/chunks/[root-of-the-server]__1ygplx1._.js +1 -1
  83. package/.next/server/chunks/_05v8k21._.js +3 -1
  84. package/.next/server/chunks/_0awtznl._.js +1 -1
  85. package/.next/server/chunks/_0f6ts7z._.js +1 -1
  86. package/.next/server/chunks/_0na2fj1._.js +1 -1
  87. package/.next/server/chunks/_0x-ej3f._.js +17 -17
  88. package/.next/server/chunks/_10tkr26._.js +1 -1
  89. package/.next/server/chunks/_12-amdu._.js +2 -2
  90. package/.next/server/chunks/_15740dw._.js +60 -0
  91. package/.next/server/chunks/_1dc_d1q._.js +3 -3
  92. package/.next/server/chunks/_1i350l5._.js +3 -1
  93. package/.next/server/chunks/_1jc5g4p._.js +2 -2
  94. package/.next/server/chunks/_1jn-aep._.js +4 -4
  95. package/.next/server/chunks/_1m88lkh._.js +11 -11
  96. package/.next/server/chunks/_1ogqovh._.js +4 -4
  97. package/.next/server/chunks/_1taa4bs._.js +1 -1
  98. package/.next/server/chunks/_1tpr507._.js +1 -1
  99. package/.next/server/chunks/_1uuucy-._.js +1 -1
  100. package/.next/server/chunks/_1zxp-p6._.js +1 -1
  101. package/.next/server/chunks/features_0rfvely._.js +5 -3
  102. package/.next/server/chunks/ssr/[root-of-the-server]__0a967km._.js +3 -0
  103. package/.next/server/chunks/ssr/{[root-of-the-server]__1se25x0._.js → [root-of-the-server]__0hpp3nw._.js} +29 -13
  104. package/.next/server/chunks/ssr/[root-of-the-server]__0tzekbl._.js +24 -60
  105. package/.next/server/chunks/ssr/{[root-of-the-server]__0tvavy9._.js → [root-of-the-server]__1iwyp1e._.js} +1 -1
  106. package/.next/server/chunks/ssr/[root-of-the-server]__1r77-88._.js +3 -0
  107. package/.next/server/chunks/ssr/[root-of-the-server]__1w9hqq8._.js +1 -1
  108. package/.next/server/chunks/ssr/_026qnc9._.js +1 -1
  109. package/.next/server/chunks/ssr/{_173siic._.js → _02c7o30._.js} +2 -2
  110. package/.next/server/chunks/ssr/_097-ljd._.js +1 -1
  111. package/.next/server/chunks/ssr/_0euzzf8._.js +3 -0
  112. package/.next/server/chunks/ssr/{_1u2jw0i._.js → _0fbi6om._.js} +3 -3
  113. package/.next/server/chunks/ssr/_0fqhhwi._.js +1 -1
  114. package/.next/server/chunks/ssr/_0igfcax._.js +20 -0
  115. package/.next/server/chunks/ssr/_0ld9_qq._.js +1 -1
  116. package/.next/server/chunks/ssr/_0nvh1h9._.js +3 -0
  117. package/.next/server/chunks/ssr/_0qmpw35._.js +3 -0
  118. package/.next/server/chunks/ssr/{_1yk6yak._.js → _0rmaf32._.js} +2 -2
  119. package/.next/server/chunks/ssr/_0uv-qs4._.js +3 -0
  120. package/.next/server/chunks/ssr/{_1doidrw._.js → _10f-jib._.js} +2 -2
  121. package/.next/server/chunks/ssr/{_05rxyf9._.js → _10mo72m._.js} +2 -2
  122. package/.next/server/chunks/ssr/_12mijol._.js +11 -11
  123. package/.next/server/chunks/ssr/_132qkfz._.js +1 -1
  124. package/.next/server/chunks/ssr/_15zqt-t._.js +1 -1
  125. package/.next/server/chunks/ssr/_16gfxpn._.js +3 -0
  126. package/.next/server/chunks/ssr/_184327j._.js +1 -1
  127. package/.next/server/chunks/ssr/{_1ng831c._.js → _18ujhhq._.js} +2 -2
  128. package/.next/server/chunks/ssr/_1d423aj._.js +7 -5
  129. package/.next/server/chunks/ssr/_1lx6w_o._.js +67 -0
  130. package/.next/server/chunks/ssr/_1mqn9mc._.js +1 -1
  131. package/.next/server/chunks/ssr/_1neoj22._.js +1 -1
  132. package/.next/server/chunks/ssr/{_19n08g5._.js → _1ntpny5._.js} +2 -2
  133. package/.next/server/chunks/ssr/{_0bp-_fi._.js → _1o1g4uk._.js} +3 -3
  134. package/.next/server/chunks/ssr/_1xoch6f._.js +1 -1
  135. package/.next/server/chunks/ssr/_1yh5bj5._.js +1 -1
  136. package/.next/server/chunks/ssr/{_0tg0vf8._.js → _2008vmi._.js} +8 -8
  137. package/.next/server/chunks/ssr/{features_bot_1yr-_pm._.js → features_bot_1n1s7bh._.js} +2 -2
  138. package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
  139. package/.next/server/chunks/ssr/features_memory_components_memory-setting_tsx_0oa43sw._.js +1 -1
  140. package/.next/server/chunks/ssr/features_routine_components_routine-setting_tsx_055fknz._.js +1 -1
  141. package/.next/server/chunks/ssr/features_workspace_00jz2hu._.js +1 -1
  142. package/.next/server/chunks/ssr/{node_modules_1n0h9sf._.js → node_modules_0-x0zxm._.js} +1 -1
  143. package/.next/server/chunks/ssr/{node_modules_1xzo2wn._.js → node_modules_00nrzz_._.js} +1 -1
  144. package/.next/server/chunks/ssr/{node_modules_0511ha-._.js → node_modules_01ed0yi._.js} +1 -1
  145. package/.next/server/chunks/ssr/{node_modules_18woe20._.js → node_modules_01u4ea3._.js} +1 -1
  146. package/.next/server/chunks/ssr/{node_modules_1expacw._.js → node_modules_05b6e99._.js} +1 -1
  147. package/.next/server/chunks/ssr/{node_modules_0eb4rx7._.js → node_modules_07jp6tj._.js} +1 -1
  148. package/.next/server/chunks/ssr/{node_modules_0piws2a._.js → node_modules_0azd56x._.js} +1 -1
  149. package/.next/server/chunks/ssr/{node_modules_0f2k5l0._.js → node_modules_0b0iy01._.js} +1 -1
  150. package/.next/server/chunks/ssr/{node_modules_0wq4-ts._.js → node_modules_0fpnetd._.js} +1 -1
  151. package/.next/server/chunks/ssr/{node_modules_11hbkuj._.js → node_modules_0ky76fz._.js} +1 -1
  152. package/.next/server/chunks/ssr/{node_modules_048wmmj._.js → node_modules_0lautv3._.js} +1 -1
  153. package/.next/server/chunks/ssr/{node_modules_1dcbvfw._.js → node_modules_0m3_5ge._.js} +1 -1
  154. package/.next/server/chunks/ssr/{node_modules_0pk6i-e._.js → node_modules_0operbz._.js} +1 -1
  155. package/.next/server/chunks/ssr/{node_modules_1zkpek5._.js → node_modules_0ou0all._.js} +1 -1
  156. package/.next/server/chunks/ssr/{node_modules_04t200t._.js → node_modules_0ucridu._.js} +1 -1
  157. package/.next/server/chunks/ssr/{node_modules_08g12f-._.js → node_modules_0v_-uht._.js} +1 -1
  158. package/.next/server/chunks/ssr/{node_modules_1m2ho33._.js → node_modules_0yzmxfq._.js} +1 -1
  159. package/.next/server/chunks/ssr/{node_modules_1ksh9gy._.js → node_modules_19b0bir._.js} +1 -1
  160. package/.next/server/chunks/ssr/{node_modules_1qehmwm._.js → node_modules_1c2ikr9._.js} +1 -1
  161. package/.next/server/chunks/ssr/{node_modules_1_afpz7._.js → node_modules_1hv-j1l._.js} +1 -1
  162. package/.next/server/chunks/ssr/{node_modules_0cdu6jq._.js → node_modules_1iau_ea._.js} +1 -1
  163. package/.next/server/chunks/ssr/{node_modules_1zf46lp._.js → node_modules_1ma_y68._.js} +1 -1
  164. package/.next/server/chunks/ssr/{node_modules_0s1lwc9._.js → node_modules_1omg9xr._.js} +1 -1
  165. package/.next/server/chunks/ssr/{node_modules_1cxc8kn._.js → node_modules_1wgnj8q._.js} +1 -1
  166. package/.next/server/chunks/ssr/{node_modules_0zjqwz7._.js → node_modules_1wvf3oo._.js} +1 -1
  167. package/.next/server/chunks/ssr/{node_modules_1_ban4u._.js → node_modules_1z3sh11._.js} +1 -1
  168. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0avl8-1._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0tmjn9w._.js} +1 -1
  169. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_14oslro._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1_e8c3o._.js} +1 -1
  170. package/.next/server/middleware-build-manifest.js +3 -3
  171. package/.next/server/pages/404.html +1 -1
  172. package/.next/server/pages/500.html +1 -1
  173. package/.next/server/server-reference-manifest.js +1 -1
  174. package/.next/server/server-reference-manifest.json +57 -57
  175. package/.next/static/chunks/09pkygbht7ki8.js +18 -0
  176. package/.next/static/chunks/0bm-nhblcmmj4.js +17 -0
  177. package/.next/static/chunks/{22shnca_6zfzs.js → 0hhza87hkbqaz.js} +1 -1
  178. package/.next/static/chunks/{19ojn4lomsk0r.js → 0mscosx0eh3ee.js} +1 -1
  179. package/.next/static/chunks/{3vynnr71ghvom.js → 0p50d-au6-3hx.js} +2 -2
  180. package/.next/static/chunks/{42890jqk049q1.js → 0p9jcyqkpq71f.js} +1 -1
  181. package/.next/static/chunks/{35kwn237o4wdn.js → 0qgn3u86jkbm7.js} +1 -1
  182. package/.next/static/chunks/{2d4z3er53ng8r.js → 0samf80yu2b17.js} +1 -1
  183. package/.next/static/chunks/{1pjygp7hqib6j.js → 1czfknd4luo6t.js} +1 -1
  184. package/.next/static/chunks/{09120tms63y21.js → 1jz8n0mhtdzr8.js} +1 -1
  185. package/.next/static/chunks/206laxm6maiz2.js +1 -0
  186. package/.next/static/chunks/{24dst4mgurbsh.js → 2_c7mu6x1lu49.js} +1 -1
  187. package/.next/static/chunks/{2ky81z-jgvasc.js → 2h-tlhb2ffhkk.js} +1 -1
  188. package/.next/static/chunks/{0oz3rs47yy3p8.js → 2i5_w8olnrvo0.js} +2 -2
  189. package/.next/static/chunks/{1mwee7xvitlp9.js → 2m8iqwc6sykln.js} +1 -1
  190. package/.next/static/chunks/{0o980477kfqez.js → 2r6xnyg7ezyxr.js} +1 -1
  191. package/.next/static/chunks/33fyp-byw48ju.js +65 -0
  192. package/.next/static/chunks/{2ndw4w4u2x51r.js → 35yd_27d9ylra.js} +1 -1
  193. package/.next/static/chunks/{3exjsi8pfdvzj.js → 3ag1i3__yl94f.js} +1 -1
  194. package/.next/static/chunks/{3obf9n3cxj99k.js → 3jvldk2wvwbge.js} +1 -1
  195. package/.next/static/chunks/3m_ejzg-xn21r.css +1 -0
  196. package/.next/static/chunks/{0w20wnnfrscq7.js → 3s-jpd3ky49-n.js} +1 -1
  197. package/.next/static/chunks/40ij3wsn3vt7h.js +1 -0
  198. package/README.md +1 -1
  199. package/app/api/thursday/tool-call/route.ts +1 -15
  200. package/docs/images/demo-still.jpg +0 -0
  201. package/docs/live-calls.md +19 -11
  202. package/features/ai/components/model-picker.tsx +8 -2
  203. package/features/ai/model.schema.ts +26 -0
  204. package/features/ai/prompts/live.prompt.ts +51 -26
  205. package/features/ai/prompts/prompt-helper.ts +1 -9
  206. package/features/ai/prompts/thursday.prompt.ts +8 -2
  207. package/features/bot/bot.run.ts +9 -3
  208. package/features/bot/bot.seed.ts +35 -91
  209. package/features/bot/components/bot-room.tsx +3 -12
  210. package/features/bot/components/room-list.tsx +1 -1
  211. package/features/bot/components/room-pill.tsx +44 -55
  212. package/features/bot/seed-bots.ts +2 -2
  213. package/features/config/components/config-badge.tsx +6 -0
  214. package/features/config/components/config-setting.tsx +20 -1
  215. package/features/config/components/models-badge.tsx +5 -7
  216. package/features/config/components/voice-key.tsx +24 -1
  217. package/features/config/config.const.ts +7 -0
  218. package/features/intro/components/intro.tsx +4 -19
  219. package/features/reach/reach.ts +2 -2
  220. package/features/settings/components/setting-ui.tsx +14 -5
  221. package/features/settings/components/settings.tsx +3 -1
  222. package/features/settings/settings.alert.ts +12 -11
  223. package/features/signins/signins.query.ts +66 -1
  224. package/features/thursday/components/side-captions.tsx +31 -8
  225. package/features/thursday/components/tab-state.tsx +5 -2
  226. package/features/thursday/components/thursday.tsx +158 -68
  227. package/features/thursday/components/write-line.tsx +37 -17
  228. package/features/thursday/thursday.action.ts +4 -20
  229. package/features/thursday/thursday.schema.ts +0 -9
  230. package/features/thursday/thursday.store.ts +11 -15
  231. package/features/thursday/thursday.text.ts +10 -8
  232. package/features/thursday/tool-line.ts +17 -6
  233. package/features/thursday/use-call-ring.ts +1 -5
  234. package/features/thursday/use-text-call.ts +37 -21
  235. package/features/thursday/use-thursday.ts +14 -44
  236. package/features/workspace/workspace.ts +4 -2
  237. package/guide/bots.md +12 -2
  238. package/guide/calls.md +9 -6
  239. package/guide/setup.md +4 -1
  240. package/lib/live/live.session.ts +0 -39
  241. package/package.json +1 -1
  242. package/scripts/live-session.test.mts +19 -26
  243. package/seed-skills/analyst/README.md +3 -4
  244. package/seed-skills/analyst/data-report/SKILL.md +5 -4
  245. package/seed-skills/insta/instagram/SKILL.md +5 -2
  246. package/seed-skills/insta/instagram/references/post.md +2 -2
  247. package/seed-skills/insta/instagram/scripts/compose.mjs +5 -1
  248. package/seed-skills/insta/instagram/scripts/inbox.mjs +5 -1
  249. package/seed-skills/insta/instagram/scripts/lib.mjs +12 -70
  250. package/seed-skills/insta/instagram/scripts/media.mjs +1 -1
  251. package/seed-skills/insta/instagram/scripts/profile.mjs +6 -2
  252. package/seed-skills/insta/instagram/scripts/read.mjs +5 -1
  253. package/seed-skills/insta/instagram/scripts/search.mjs +6 -2
  254. package/seed-skills/insta/instagram/scripts/sheet.mjs +31 -88
  255. package/seed-skills/insta/instagram/templates/carousel.html +1 -1
  256. package/seed-skills/tutor/picture-book/SKILL.md +16 -0
  257. package/seed-skills/tutor/picture-book/book/book.css +181 -0
  258. package/seed-skills/tutor/picture-book/book/book.html +33 -0
  259. package/seed-skills/tutor/picture-book/book/book.js +60 -0
  260. package/seed-skills/tutor/picture-book/references/picture-book.md +104 -0
  261. package/seed-skills/tutor/picture-book/scripts/book-video.mjs +177 -0
  262. package/seed-skills/tutor/picture-book/scripts/book.mjs +98 -0
  263. package/skills/browser/SKILL.md +13 -4
  264. package/skills/browser/references/scripts.md +55 -0
  265. package/{seed-skills/insta/instagram → skills/browser}/scripts/render.mjs +1 -1
  266. package/skills/browser/scripts/session.mjs +105 -0
  267. package/skills/browser/scripts/sheet.mjs +97 -0
  268. package/{seed-skills/insta/instagram → skills/browser}/scripts/webimage.mjs +1 -1
  269. package/skills/interactive-page/SKILL.md +4 -3
  270. package/{seed-skills/analyst/data-report → skills/interactive-page}/scripts/chart.mjs +3 -3
  271. package/skills/interactive-page/scripts/page.mjs +1 -0
  272. package/.next/server/app/api/probe/route/app-paths-manifest.json +0 -3
  273. package/.next/server/app/api/probe/route/build-manifest.json +0 -12
  274. package/.next/server/app/api/probe/route/server-reference-manifest.json +0 -4
  275. package/.next/server/app/api/probe/route.js +0 -10
  276. package/.next/server/app/api/probe/route.js.map +0 -5
  277. package/.next/server/app/api/probe/route.js.nft.json +0 -1
  278. package/.next/server/app/api/probe/route_client-reference-manifest.js +0 -3
  279. package/.next/server/chunks/[root-of-the-server]__012s2o8._.js +0 -3
  280. package/.next/server/chunks/[root-of-the-server]__0z0hc1f._.js +0 -4
  281. package/.next/server/chunks/[root-of-the-server]__1v7-zke._.js +0 -5
  282. package/.next/server/chunks/_0whlpyi._.js +0 -4
  283. package/.next/server/chunks/_next-internal_server_app_api_probe_route_actions_0cqd30j.js +0 -3
  284. package/.next/server/chunks/ssr/[root-of-the-server]__0cxqzfc._.js +0 -103
  285. package/.next/server/chunks/ssr/[root-of-the-server]__1-d2tgh._.js +0 -3
  286. package/.next/server/chunks/ssr/_070nv1_._.js +0 -3
  287. package/.next/server/chunks/ssr/_0hlxij-._.js +0 -3
  288. package/.next/server/chunks/ssr/_0p9pmxe._.js +0 -3
  289. package/.next/server/chunks/ssr/_0s41irp._.js +0 -3
  290. package/.next/server/chunks/ssr/_157yfrk._.js +0 -3
  291. package/.next/server/chunks/ssr/_17v-33v._.js +0 -20
  292. package/.next/server/chunks/ssr/_1flsjeo._.js +0 -3
  293. package/.next/static/chunks/03kgfyrli_0gz.js +0 -1
  294. package/.next/static/chunks/1p764d75_0lhv.js +0 -18
  295. package/.next/static/chunks/25zq8gzhbdsr7.js +0 -1
  296. package/.next/static/chunks/2qod5tqlpz8b7.js +0 -17
  297. package/.next/static/chunks/30skcjexa57zn.js +0 -101
  298. package/.next/static/chunks/3qq4o8w2rv_e9.css +0 -1
  299. package/lib/probe.server.ts +0 -17
  300. package/lib/probe.ts +0 -55
  301. package/seed-skills/mail/mail/SKILL.md +0 -37
  302. package/seed-skills/mail/mail/recipes/gmail.mjs +0 -448
  303. package/seed-skills/mail/mail/references/recipes.md +0 -55
  304. package/seed-skills/mail/mail/scripts/mail.mjs +0 -202
  305. /package/.next/static/{Ar5V4kMdL4CE1trx8anrH → QSe0rTdXU5kh5BBzr2XBB}/_buildManifest.js +0 -0
  306. /package/.next/static/{Ar5V4kMdL4CE1trx8anrH → QSe0rTdXU5kh5BBzr2XBB}/_clientMiddlewareManifest.js +0 -0
  307. /package/.next/static/{Ar5V4kMdL4CE1trx8anrH → QSe0rTdXU5kh5BBzr2XBB}/_ssgManifest.js +0 -0
  308. /package/{seed-skills/insta/instagram → skills/browser}/scripts/image-size.mjs +0 -0
@@ -1,3 +1,3 @@
1
- module.exports=[418520,e=>e.a(async(i,a)=>{try{var t=await e.y("@libsql/client-6da938047d5fc1cd");e.n(t),a()}catch(e){a(e)}},!0),902157,(e,i,a)=>{i.exports=e.x("node:fs",()=>require("node:fs"))},750227,(e,i,a)=>{i.exports=e.x("node:path",()=>require("node:path"))},59639,(e,i,a)=>{i.exports=e.x("node:process",()=>require("node:process"))},509656,(e,i,a)=>{i.exports=e.x("node:tty",()=>require("node:tty"))},812057,(e,i,a)=>{i.exports=e.x("node:util",()=>require("node:util"))},911757,e=>{"use strict";var i=e.i(469719),a=e.i(514499),t=e.i(904309),l=e.i(264079);let r={id:"openai",label:"OpenAI",apiKeyName:l.TEXT_MODEL_PROVIDERS.openai.apiKeyName};l.TEXT_MODEL_PROVIDERS.openai.suggestModels;let o=i.z.string().max(a.COMMON_VALIDATE.prompt.max).default(""),s=i.z.object({voice:i.z.string().trim().min(1).max(128).default("marin"),voicePrompt:o,backendModel:i.z.string().trim().min(1).max(128).default(t.LIVE_BACKEND_MODEL),backendPrompt:o,reasoningEffort:i.z.enum(["none","minimal","low","medium","high","xhigh"]).nullable().default("low"),webSearch:i.z.boolean().default(!0)});s.parse({}),e.s(["LIVE_PROVIDER",0,r,"LiveSettingsSchema",0,s])},264079,e=>{"use strict";var i=e.i(469719),a=e.i(687388);let t=i.z.enum(["openai","chatgpt","anthropic","google","xai","vercel-ai-gateway","mistral","deepseek","groq","cerebras","togetherai","fireworks","deepinfra","cohere"]),l=i.z.object({provider:t,model:i.z.string().trim().min(1,"Model name is required").max(80)}),r=i.z.enum(["openai","google","xai","vercel-ai-gateway"]),o=i.z.object({provider:r,model:i.z.string().trim().min(1,"Model name is required").max(120)}),s={openai:{label:"Open AI",apiKeyName:"OPENAI_API_KEY",models:{image:[{id:"gpt-image-1-mini",label:"GPT Image 1 mini",tier:"small"},{id:"gpt-image-2.5-flare",label:"GPT Image 2.5 Flare",tier:"mid"},{id:"gpt-image-2.5-sunburst",label:"GPT Image 2.5 Sunburst",tier:"large"}],video:[],speech:[{id:"tts-1",label:"TTS 1",tier:"small"},{id:"gpt-4o-mini-tts",label:"4o mini TTS",tier:"mid"},{id:"tts-1-hd",label:"TTS 1 HD",tier:"large"}],transcription:[{id:"gpt-4o-mini-transcribe",label:"4o mini Transcribe",tier:"small"},{id:"gpt-transcribe",label:"GPT Transcribe",tier:"mid"}]}},google:{label:"Gemini",apiKeyName:"GOOGLE_GENERATIVE_AI_API_KEY",models:{image:[{id:"gemini-3.1-flash-lite-image",label:"3.1 Flash Lite Image",tier:"small"},{id:"gemini-3.1-flash-image",label:"3.1 Flash Image",tier:"mid"},{id:"gemini-3-pro-image",label:"3 Pro Image",tier:"large"}],video:[{id:"veo-3.1-lite-generate-preview",label:"Veo 3.1 Lite",tier:"small"},{id:"veo-3.1-fast-generate-preview",label:"Veo 3.1 Fast",tier:"mid"},{id:"veo-3.1-generate-preview",label:"Veo 3.1",tier:"large"}],speech:[{id:"gemini-2.5-flash-preview-tts",label:"2.5 Flash TTS",tier:"small"},{id:"gemini-3.1-flash-tts-preview",label:"3.1 Flash TTS",tier:"mid"},{id:"gemini-2.5-pro-preview-tts",label:"2.5 Pro TTS",tier:"large"}],transcription:[{id:"gemini-3.5-transcribe",label:"3.5 Transcribe",tier:"mid"}]}},xai:{label:"xAI",apiKeyName:"XAI_API_KEY",models:{image:[{id:"grok-imagine-image",label:"Grok Imagine",tier:"small"},{id:"grok-imagine-image-2.0",label:"Grok Imagine 2.0",tier:"mid"}],video:[{id:"grok-imagine-video",label:"Grok Imagine Video",tier:"small"},{id:"grok-imagine-video-1.5",label:"Grok Imagine Video 1.5",tier:"mid"}],speech:[{id:"grok-tts",label:"Grok TTS",tier:"mid"}],transcription:[{id:"grok-stt",label:"Grok STT",tier:"mid"}]}},"vercel-ai-gateway":{label:"Vercel AI GateWay",apiKeyName:"AI_GATEWAY_API_KEY",models:{image:[{id:"bytedance/seedream-5.0-lite",label:"Seedream 5.0 Lite",tier:"small"},{id:"bfl/flux-2-klein-9b",label:"FLUX 2 Klein 9B",tier:"small"},{id:"spacexai/grok-imagine-image-2.0",label:"Grok Imagine 2.0",tier:"small"},{id:"bfl/flux-2-pro",label:"FLUX 2 Pro",tier:"mid"},{id:"bytedance/seedream-5.0-pro",label:"Seedream 5.0 Pro",tier:"mid"},{id:"recraft/recraft-v4.1",label:"Recraft V4.1",tier:"mid"},{id:"openai/gpt-image-2.5-sunburst",label:"GPT Image 2.5 Sunburst",tier:"large"}],video:[{id:"bytedance/seedance-2.0-mini",label:"Seedance 2.0 Mini",tier:"small"},{id:"google/veo-3.1-lite-generate-001",label:"Veo 3.1 Lite",tier:"small"},{id:"alibaba/wan-v2.6-t2v",label:"Wan 2.6",tier:"small"},{id:"google/veo-3.1-fast-generate-001",label:"Veo 3.1 Fast",tier:"mid"},{id:"bytedance/seedance-2.5",label:"Seedance 2.5",tier:"mid"},{id:"spacexai/grok-imagine-video-1.5",label:"Grok Imagine Video 1.5",tier:"mid"},{id:"klingai/kling-v3.0-t2v",label:"Kling 3.0",tier:"large"},{id:"google/veo-3.1-generate-001",label:"Veo 3.1",tier:"large"}],speech:[{id:"fish-audio/s1",label:"Fish Audio S1",tier:"small"},{id:"openai/tts-1",label:"OpenAI TTS 1",tier:"small"},{id:"spacexai/grok-tts",label:"Grok TTS",tier:"mid"},{id:"fish-audio/s2.1-pro",label:"Fish Audio S2.1 Pro",tier:"mid"},{id:"openai/tts-1-hd",label:"OpenAI TTS 1 HD",tier:"large"}],transcription:[{id:"spacexai/grok-stt",label:"Grok STT",tier:"small"},{id:"fish-audio/transcribe-1",label:"Fish Transcribe 1",tier:"small"},{id:"openai/gpt-4o-mini-transcribe",label:"4o mini Transcribe",tier:"small"},{id:"openai/gpt-4o-transcribe",label:"4o Transcribe",tier:"mid"},{id:"google/gemini-3.5-transcribe",label:"Gemini 3.5 Transcribe",tier:"mid"}]}}},n=Object.keys(s).map(e=>({id:e,...s[e]})),d={openai:{label:"Open AI",apiKeyName:"OPENAI_API_KEY",suggestModels:[{id:"gpt-5.6-luna",label:"5.6 Luna",tier:"small",context:105e4},{id:"gpt-5.6-terra",label:"5.6 Terra",tier:"mid",context:105e4},{id:"gpt-5.6-sol",label:"5.6 Sol",tier:"large",context:105e4},{id:"gpt-6-astra",label:"6 Astra",tier:"large",context:105e4}]},chatgpt:{label:"GPT Subscription",apiKeyName:"CHATGPT_SIGN_IN",signIn:!0,suggestModels:[{id:"gpt-5.6-luna",label:"5.6 Luna",tier:"small",context:272e3},{id:"gpt-5.6-terra",label:"5.6 Terra",tier:"mid",context:272e3},{id:"gpt-5.6-sol",label:"5.6 Sol",tier:"large",context:272e3},{id:"gpt-6-astra",label:"6 Astra",tier:"large",context:272e3}]},anthropic:{label:"Claude",apiKeyName:"ANTHROPIC_API_KEY",suggestModels:[{id:"claude-haiku-4-5",label:"Haiku 4.5",tier:"small"},{id:"claude-sonnet-5",label:"Sonnet 5",tier:"mid",context:1e6},{id:"claude-opus-5",label:"Opus 5",tier:"large",context:1e6},{id:"claude-fable-5-1",label:"Fable 5.1",tier:"large"}]},google:{label:"Gemini",apiKeyName:"GOOGLE_GENERATIVE_AI_API_KEY",suggestModels:[{id:"gemini-3.5-flash-lite",label:"3.5 Flash Lite",tier:"small",context:1e6},{id:"gemini-3.8-flash",label:"3.8 Flash",tier:"mid",context:1e6}]},xai:{label:"xAI",apiKeyName:"XAI_API_KEY",suggestModels:[{id:"grok-4.6",label:"Grok 4.6",tier:"large",context:5e5}]},"vercel-ai-gateway":{label:"Vercel AI GateWay",apiKeyName:"AI_GATEWAY_API_KEY",suggestModels:[{id:"zai/glm-5.3-flash",label:"GLM 5.3 Flash",tier:"small"},{id:"google/gemini-3.8-flash",label:"Gemini 3.8 Flash",tier:"small"},{id:"openai/gpt-5.6-luna",label:"GPT 5.6 Luna",tier:"small",context:105e4},{id:"zai/glm-5.3",label:"GLM 5.3",tier:"mid"},{id:"spacexai/grok-4.6",label:"Grok 4.6",tier:"mid",context:5e5},{id:"anthropic/claude-sonnet-5",label:"Claude Sonnet 5",tier:"mid"},{id:"openai/gpt-5.6-terra",label:"GPT 5.6 Terra",tier:"mid",context:105e4},{id:"moonshotai/kimi-k3",label:"Kimi K3",tier:"mid"},{id:"openai/gpt-5.6-sol",label:"GPT 5.6 Sol",tier:"large",context:105e4},{id:"anthropic/claude-opus-5",label:"Claude Opus 5",tier:"large",context:1e6},{id:"openai/gpt-6-astra",label:"GPT 6 Astra",tier:"large",context:105e4}]},mistral:{label:"Mistral",apiKeyName:"MISTRAL_API_KEY",suggestModels:[{id:"ministral-8b-latest",label:"Ministral 8B",tier:"small"},{id:"mistral-small-latest",label:"Small",tier:"mid"},{id:"mistral-medium-latest",label:"Medium",tier:"large"},{id:"mistral-large-latest",label:"Large",tier:"large"}]},deepseek:{label:"DeepSeek",apiKeyName:"DEEPSEEK_API_KEY",suggestModels:[{id:"deepseek-flash",label:"V4.1 Flash",tier:"small",context:1e6},{id:"deepseek-v4-pro",label:"V4 Pro",tier:"large",context:1e6}]},groq:{label:"Groq",apiKeyName:"GROQ_API_KEY",suggestModels:[{id:"openai/gpt-oss-20b",label:"GPT OSS 20B",tier:"small",context:131072},{id:"openai/gpt-oss-120b",label:"GPT OSS 120B",tier:"mid",context:131072},{id:"llama-3.3-70b-versatile",label:"Llama 3.3 70B",tier:"mid",context:131072}]},cerebras:{label:"Cerebras",apiKeyName:"CEREBRAS_API_KEY",suggestModels:[{id:"qwen-3.8-27b",label:"Qwen 3.8 27B",tier:"small",context:64e3},{id:"gpt-oss-120b",label:"GPT OSS 120B",tier:"mid",context:65536}]},togetherai:{label:"Together",apiKeyName:"TOGETHER_AI_API_KEY",suggestModels:[{id:"Qwen/Qwen3.5-9B",label:"Qwen 3.5 9B",tier:"small",context:262144},{id:"zai-org/GLM-5.3-Flash",label:"GLM 5.3 Flash",tier:"small",context:1048575},{id:"openai/gpt-oss-120b",label:"GPT OSS 120B",tier:"mid",context:131072},{id:"deepseek-ai/DeepSeek-V4.1-Flash",label:"DeepSeek V4.1 Flash",tier:"mid",context:1e6},{id:"zai-org/GLM-5.3",label:"GLM 5.3",tier:"large",context:1048575},{id:"moonshotai/Kimi-K3",label:"Kimi K3",tier:"large",context:1048576}]},fireworks:{label:"Fireworks",apiKeyName:"FIREWORKS_API_KEY",suggestModels:[{id:"accounts/fireworks/models/glm-5p3-flash",label:"GLM 5.3 Flash",tier:"small",context:1048576},{id:"accounts/fireworks/models/deepseek-v4p1-flash",label:"DeepSeek V4.1 Flash",tier:"mid",context:1048576},{id:"accounts/fireworks/models/minimax-m3",label:"MiniMax M3",tier:"mid",context:512e3},{id:"accounts/fireworks/models/glm-5p3",label:"GLM 5.3",tier:"large",context:1048576},{id:"accounts/fireworks/models/kimi-k3",label:"Kimi K3",tier:"large",context:1048576}]},deepinfra:{label:"DeepInfra",apiKeyName:"DEEPINFRA_API_KEY",suggestModels:[{id:"deepseek-ai/DeepSeek-V4-Flash-0731",label:"DeepSeek V4 Flash",tier:"small",context:1048576},{id:"deepseek-ai/DeepSeek-V4.1-Flash",label:"DeepSeek V4.1 Flash",tier:"mid",context:1048576},{id:"zai-org/GLM-5.2",label:"GLM 5.2",tier:"mid",context:1048576},{id:"zai-org/GLM-5.3",label:"GLM 5.3",tier:"large",context:1048576},{id:"moonshotai/Kimi-K3",label:"Kimi K3",tier:"large",context:1048576}]},cohere:{label:"Cohere",apiKeyName:"COHERE_API_KEY",suggestModels:[{id:"command-r7b-12-2024",label:"Command R7B",tier:"small",context:128e3},{id:"command-a-03-2025",label:"Command A",tier:"mid",context:256e3},{id:"command-a-plus-05-2026",label:"Command A+",tier:"large",context:128e3}]}},m=Object.keys(d).map(e=>({id:e,...d[e]}));e.s(["MEDIA_MODEL_PROVIDERS",0,s,"MEDIA_MODEL_PROVIDER_LIST",0,n,"TEXT_MODEL_PROVIDERS",0,d,"TEXT_MODEL_PROVIDER_LIST",0,m,"canMakeKind",0,(e,i)=>(s[e]?.models[i]?.length??0)>0,"compactAtFor",0,e=>e&&e>0?Math.round(e*a.BOT_RUN.compactHeadroom):a.BOT_RUN.compactAt,"contextWindowOf",0,function(e,i,a=[]){if("vercel-ai-gateway"===e)return a.find(e=>e.id===i)?.contextWindow??null;let t=d[e].suggestModels;return t.find(e=>e.id===i)?.context??null},"defaultModelOf",0,e=>(e.suggestModels.find(e=>"mid"===e.tier)??e.suggestModels[0])?.id,"parseMediaModel",0,function(e){let[i,...a]=(e??"").trim().split("/"),t=o.safeParse({provider:i,model:a.join("/")});return t.success?t.data:null},"parseTextModel",0,function(e){let[i,...a]=(e??"").trim().split("/"),t=l.safeParse({provider:i,model:a.join("/")});return t.success?t.data:null},"textModelProviderSchema",0,t,"textModelRefSchema",0,l])},279041,e=>{"use strict";var i=e.i(911757),a=e.i(264079),t=e.i(834332);let l=[i.LIVE_PROVIDER.apiKeyName],r={image:"IMAGE_MODEL",video:"VIDEO_MODEL",speech:"SPEECH_MODEL",transcription:"TRANSCRIPTION_MODEL"},o={image:{label:"Image model",hint:"What bots draw with"},video:{label:"Video model",hint:"What bots film with — minutes a clip"},speech:{label:"Speech model",hint:"What reads text aloud into a file"},transcription:{label:"Transcription model",hint:"What turns a recording into text"}},s="EXA_API_KEY",n="DEFAULT_MODEL",d={key:n,label:"Default model",hint:"What a bot thinks with until it picks its own",text:!0,choices:a.TEXT_MODEL_PROVIDER_LIST.flatMap(e=>e.suggestModels.map(i=>({value:`${e.id}/${i.id}`,label:`${e.label} \xb7 ${i.label}`,needs:e.apiKeyName})))},m=e=>l.includes(e.apiKeyName),c=e=>!!e.signIn||"vercel-ai-gateway"===e.id,g=e=>({key:e.apiKeyName,label:e.label,provider:e.id,signIn:e.signIn}),b=[{id:"voice",title:"voice",hint:"calls run on this key",section:"keys",require:"any",note:"required for calls",entries:a.TEXT_MODEL_PROVIDER_LIST.filter(m).map(g)},{id:"easy",title:"the easy ways",hint:"one sign-in or one key opens every bot",section:"keys",require:"none",entries:a.TEXT_MODEL_PROVIDER_LIST.filter(c).map(e=>({...g(e),..."vercel-ai-gateway"===e.id&&{recommended:!0}}))},{id:"text",title:"or a provider's own key",hint:"what bots think with — add any, or none",section:"keys",require:"none",entries:a.TEXT_MODEL_PROVIDER_LIST.filter(e=>!m(e)&&!c(e)).map(g)},{id:"search",title:"search",hint:"how calls and bots look things up — one key, or their own model's",section:"keys",require:"none",entries:[{key:s,label:"Exa",hint:"web search in one call — dashboard.exa.ai",site:"exa.ai"}]},{id:"phone",title:"phone",hint:"write to Thursday from a chat app — nothing is opened to the outside",section:"keys",require:"none",entries:[{key:t.TELEGRAM_TOKEN_KEY,label:"Telegram",site:"telegram.org",hint:"a bot token from @BotFather — then write to your bot, and allow it here"},{key:t.DISCORD_TOKEN_KEY,label:"Discord",site:"discord.com",hint:"a bot token from discord.com/developers — add the bot to a server of yours, then write to it directly"},{key:t.SLACK_APP_TOKEN_KEY,label:"Slack · app token",site:"slack.com",hint:"starts with xapp- — opens the connection. Slack takes this and the bot token"},{key:t.SLACK_BOT_TOKEN_KEY,label:"Slack · bot token",site:"slack.com",hint:"starts with xoxb- — speaks as the app"}]},{id:"bots",title:"Bots",hint:"what a bot runs on when it has not picked its own — start small: a small model is quick and costs little",section:"models",require:"none",entries:[d]},{id:"studio",title:"Studio",hint:"what a bot draws, films and speaks with — off until you pick one",section:"models",require:"none",entries:Object.keys(r).map(e=>({key:r[e],...o[e],kind:e,choices:a.MEDIA_MODEL_PROVIDER_LIST.flatMap(i=>i.models[e].map(e=>({value:`${i.id}/${e.id}`,label:`${i.label} \xb7 ${e.label}`,needs:i.apiKeyName})))}))}];Object.fromEntries(b.flatMap(e=>e.entries).map(e=>[e.key,e]));let p=b.flatMap(e=>e.entries.map(e=>e.key)),u=Object.fromEntries(b.flatMap(e=>e.entries).filter(e=>e.choices?.length).map(e=>[e.key,e.choices]));e.s(["CONFIG_CHOICES",0,u,"CONFIG_KEYS",0,p,"DEFAULT_MODEL_KEY",0,n,"EXA_API_KEY",0,s,"MEDIA_MODEL_KEYS",0,r])},340698,e=>e.a(async(i,a)=>{try{var t=e.i(875225),l=e.i(528790),r=e.i(613240);e.i(279041);var o=i([l]);async function s(e){let i=process.env[e]?.trim();if(i)return i;let[a]=await l.database.select({value:r.configTable.value}).from(r.configTable).where((0,t.eq)(r.configTable.key,e));return a?.value.trim()||void 0}async function n(e,i){await l.database.insert(r.configTable).values({key:e,value:i}).onConflictDoUpdate({target:r.configTable.key,set:{value:i}})}[l]=o.then?(await o)():o,e.s(["readConfig",0,s,"writeConfig",0,n]),a()}catch(e){a(e)}},!1),834332,e=>{"use strict";let i="TELEGRAM_BOT_TOKEN",a="DISCORD_BOT_TOKEN",t="SLACK_APP_TOKEN",l="SLACK_BOT_TOKEN";e.s(["DISCORD_TOKEN_KEY",0,a,"REACH_CHANNELS",0,["telegram","discord","slack"],"REACH_KEYS",0,{telegram:[i],discord:[a],slack:[t,l]},"SLACK_APP_TOKEN_KEY",0,t,"SLACK_BOT_TOKEN_KEY",0,l,"TELEGRAM_TOKEN_KEY",0,i,"reachPersonKey",0,e=>`REACH_PERSON_${e.toUpperCase()}`])},514499,e=>{"use strict";e.s(["COMMON_VALIDATE",0,{name:{max:16},shortDescription:{max:60},description:{max:100},prompt:{max:4e3}}])},904309,e=>{"use strict";var i=e.i(469719);let a=i.z.object({start:i.z.number().nonnegative(),end:i.z.number().nonnegative(),text:i.z.string()});i.z.object({reason:i.z.string().max(128),seconds:i.z.number().nonnegative().nullable()}),e.s(["LIVE_BACKEND_MODEL",0,"gpt-5.6-luna","LiveFragmentSchema",0,a])},469719,e=>{"use strict";var i=e.i(562810);e.s(["z",0,i])}];
1
+ module.exports=[418520,e=>e.a(async(i,a)=>{try{var t=await e.y("@libsql/client-6da938047d5fc1cd");e.n(t),a()}catch(e){a(e)}},!0),902157,(e,i,a)=>{i.exports=e.x("node:fs",()=>require("node:fs"))},750227,(e,i,a)=>{i.exports=e.x("node:path",()=>require("node:path"))},59639,(e,i,a)=>{i.exports=e.x("node:process",()=>require("node:process"))},509656,(e,i,a)=>{i.exports=e.x("node:tty",()=>require("node:tty"))},812057,(e,i,a)=>{i.exports=e.x("node:util",()=>require("node:util"))},911757,e=>{"use strict";var i=e.i(469719),a=e.i(514499),t=e.i(904309),l=e.i(264079);let r={id:"openai",label:"OpenAI",apiKeyName:l.TEXT_MODEL_PROVIDERS.openai.apiKeyName};l.TEXT_MODEL_PROVIDERS.openai.suggestModels;let s=i.z.string().max(a.COMMON_VALIDATE.prompt.max).default(""),o=i.z.object({voice:i.z.string().trim().min(1).max(128).default("marin"),voicePrompt:s,backendModel:i.z.string().trim().min(1).max(128).default(t.LIVE_BACKEND_MODEL),backendPrompt:s,reasoningEffort:i.z.enum(["none","minimal","low","medium","high","xhigh"]).nullable().default("low"),webSearch:i.z.boolean().default(!0)});o.parse({}),e.s(["LIVE_PROVIDER",0,r,"LiveSettingsSchema",0,o])},264079,e=>{"use strict";var i=e.i(469719),a=e.i(687388);let t=i.z.enum(["openai","chatgpt","anthropic","google","xai","vercel-ai-gateway","mistral","deepseek","groq","cerebras","togetherai","fireworks","deepinfra","cohere"]),l=i.z.object({provider:t,model:i.z.string().trim().min(1,"Model name is required").max(80)}),r=i.z.enum(["openai","google","xai","vercel-ai-gateway"]),s=i.z.object({provider:r,model:i.z.string().trim().min(1,"Model name is required").max(120)}),o={openai:{label:"Open AI",apiKeyName:"OPENAI_API_KEY",models:{image:[{id:"gpt-image-1-mini",label:"GPT Image 1 mini",tier:"small"},{id:"gpt-image-2.5-flare",label:"GPT Image 2.5 Flare",tier:"mid"},{id:"gpt-image-2.5-sunburst",label:"GPT Image 2.5 Sunburst",tier:"large"}],video:[],speech:[{id:"tts-1",label:"TTS 1",tier:"small"},{id:"gpt-4o-mini-tts",label:"4o mini TTS",tier:"mid"},{id:"tts-1-hd",label:"TTS 1 HD",tier:"large"}],transcription:[{id:"gpt-4o-mini-transcribe",label:"4o mini Transcribe",tier:"small"},{id:"gpt-transcribe",label:"GPT Transcribe",tier:"mid"}]}},google:{label:"Gemini",apiKeyName:"GOOGLE_GENERATIVE_AI_API_KEY",models:{image:[{id:"gemini-3.1-flash-lite-image",label:"3.1 Flash Lite Image",tier:"small"},{id:"gemini-3.1-flash-image",label:"3.1 Flash Image",tier:"mid"},{id:"gemini-3-pro-image",label:"3 Pro Image",tier:"large"}],video:[{id:"veo-3.1-lite-generate-preview",label:"Veo 3.1 Lite",tier:"small"},{id:"veo-3.1-fast-generate-preview",label:"Veo 3.1 Fast",tier:"mid"},{id:"veo-3.1-generate-preview",label:"Veo 3.1",tier:"large"}],speech:[{id:"gemini-2.5-flash-preview-tts",label:"2.5 Flash TTS",tier:"small"},{id:"gemini-3.1-flash-tts-preview",label:"3.1 Flash TTS",tier:"mid"},{id:"gemini-2.5-pro-preview-tts",label:"2.5 Pro TTS",tier:"large"}],transcription:[{id:"gemini-3.5-transcribe",label:"3.5 Transcribe",tier:"mid"}]}},xai:{label:"xAI",apiKeyName:"XAI_API_KEY",models:{image:[{id:"grok-imagine-image",label:"Grok Imagine",tier:"small"},{id:"grok-imagine-image-2.0",label:"Grok Imagine 2.0",tier:"mid"}],video:[{id:"grok-imagine-video",label:"Grok Imagine Video",tier:"small"},{id:"grok-imagine-video-1.5",label:"Grok Imagine Video 1.5",tier:"mid"}],speech:[{id:"grok-tts",label:"Grok TTS",tier:"mid"}],transcription:[{id:"grok-stt",label:"Grok STT",tier:"mid"}]}},"vercel-ai-gateway":{label:"Vercel AI GateWay",apiKeyName:"AI_GATEWAY_API_KEY",models:{image:[{id:"bytedance/seedream-5.0-lite",label:"Seedream 5.0 Lite",tier:"small"},{id:"bfl/flux-2-klein-9b",label:"FLUX 2 Klein 9B",tier:"small"},{id:"spacexai/grok-imagine-image-2.0",label:"Grok Imagine 2.0",tier:"small"},{id:"bfl/flux-2-pro",label:"FLUX 2 Pro",tier:"mid"},{id:"bytedance/seedream-5.0-pro",label:"Seedream 5.0 Pro",tier:"mid"},{id:"recraft/recraft-v4.1",label:"Recraft V4.1",tier:"mid"},{id:"openai/gpt-image-2.5-sunburst",label:"GPT Image 2.5 Sunburst",tier:"large"}],video:[{id:"bytedance/seedance-2.0-mini",label:"Seedance 2.0 Mini",tier:"small"},{id:"google/veo-3.1-lite-generate-001",label:"Veo 3.1 Lite",tier:"small"},{id:"alibaba/wan-v2.6-t2v",label:"Wan 2.6",tier:"small"},{id:"google/veo-3.1-fast-generate-001",label:"Veo 3.1 Fast",tier:"mid"},{id:"bytedance/seedance-2.5",label:"Seedance 2.5",tier:"mid"},{id:"spacexai/grok-imagine-video-1.5",label:"Grok Imagine Video 1.5",tier:"mid"},{id:"klingai/kling-v3.0-t2v",label:"Kling 3.0",tier:"large"},{id:"google/veo-3.1-generate-001",label:"Veo 3.1",tier:"large"}],speech:[{id:"fish-audio/s1",label:"Fish Audio S1",tier:"small"},{id:"openai/tts-1",label:"OpenAI TTS 1",tier:"small"},{id:"spacexai/grok-tts",label:"Grok TTS",tier:"mid"},{id:"fish-audio/s2.1-pro",label:"Fish Audio S2.1 Pro",tier:"mid"},{id:"openai/tts-1-hd",label:"OpenAI TTS 1 HD",tier:"large"}],transcription:[{id:"spacexai/grok-stt",label:"Grok STT",tier:"small"},{id:"fish-audio/transcribe-1",label:"Fish Transcribe 1",tier:"small"},{id:"openai/gpt-4o-mini-transcribe",label:"4o mini Transcribe",tier:"small"},{id:"openai/gpt-4o-transcribe",label:"4o Transcribe",tier:"mid"},{id:"google/gemini-3.5-transcribe",label:"Gemini 3.5 Transcribe",tier:"mid"}]}}},n=Object.keys(o).map(e=>({id:e,...o[e]})),d={openai:{label:"Open AI",apiKeyName:"OPENAI_API_KEY",keysAt:"https://platform.openai.com/api-keys",keyLooks:"sk-…",suggestModels:[{id:"gpt-5.6-luna",label:"5.6 Luna",tier:"small",context:105e4},{id:"gpt-5.6-terra",label:"5.6 Terra",tier:"mid",context:105e4},{id:"gpt-5.6-sol",label:"5.6 Sol",tier:"large",context:105e4},{id:"gpt-6-astra",label:"6 Astra",tier:"large",context:105e4}]},chatgpt:{label:"GPT Subscription",apiKeyName:"CHATGPT_SIGN_IN",signIn:!0,suggestModels:[{id:"gpt-5.6-luna",label:"5.6 Luna",tier:"small",context:272e3},{id:"gpt-5.6-terra",label:"5.6 Terra",tier:"mid",context:272e3},{id:"gpt-5.6-sol",label:"5.6 Sol",tier:"large",context:272e3},{id:"gpt-6-astra",label:"6 Astra",tier:"large",context:272e3}]},anthropic:{label:"Claude",apiKeyName:"ANTHROPIC_API_KEY",keysAt:"https://platform.claude.com/settings/keys",keyLooks:"sk-ant-…",suggestModels:[{id:"claude-haiku-4-5",label:"Haiku 4.5",tier:"small"},{id:"claude-sonnet-5",label:"Sonnet 5",tier:"mid",context:1e6},{id:"claude-opus-5",label:"Opus 5",tier:"large",context:1e6},{id:"claude-fable-5-1",label:"Fable 5.1",tier:"large"}]},google:{label:"Gemini",apiKeyName:"GOOGLE_GENERATIVE_AI_API_KEY",keysAt:"https://aistudio.google.com/apikey",keyLooks:"AIza…",suggestModels:[{id:"gemini-3.5-flash-lite",label:"3.5 Flash Lite",tier:"small",context:1e6},{id:"gemini-3.8-flash",label:"3.8 Flash",tier:"mid",context:1e6}]},xai:{label:"xAI",apiKeyName:"XAI_API_KEY",keysAt:"https://console.x.ai",keyLooks:"xai-…",suggestModels:[{id:"grok-4.6",label:"Grok 4.6",tier:"large",context:5e5}]},"vercel-ai-gateway":{label:"Vercel AI GateWay",apiKeyName:"AI_GATEWAY_API_KEY",keysAt:"https://vercel.com/docs/ai-gateway/authentication-and-byok/authentication",suggestModels:[{id:"zai/glm-5.3-flash",label:"GLM 5.3 Flash",tier:"small"},{id:"google/gemini-3.8-flash",label:"Gemini 3.8 Flash",tier:"small"},{id:"openai/gpt-5.6-luna",label:"GPT 5.6 Luna",tier:"small",context:105e4},{id:"zai/glm-5.3",label:"GLM 5.3",tier:"mid"},{id:"spacexai/grok-4.6",label:"Grok 4.6",tier:"mid",context:5e5},{id:"anthropic/claude-sonnet-5",label:"Claude Sonnet 5",tier:"mid"},{id:"openai/gpt-5.6-terra",label:"GPT 5.6 Terra",tier:"mid",context:105e4},{id:"moonshotai/kimi-k3",label:"Kimi K3",tier:"mid"},{id:"openai/gpt-5.6-sol",label:"GPT 5.6 Sol",tier:"large",context:105e4},{id:"anthropic/claude-opus-5",label:"Claude Opus 5",tier:"large",context:1e6},{id:"openai/gpt-6-astra",label:"GPT 6 Astra",tier:"large",context:105e4}]},mistral:{label:"Mistral",apiKeyName:"MISTRAL_API_KEY",keysAt:"https://console.mistral.ai/api-keys",suggestModels:[{id:"ministral-8b-latest",label:"Ministral 8B",tier:"small"},{id:"mistral-small-latest",label:"Small",tier:"mid"},{id:"mistral-medium-latest",label:"Medium",tier:"large"},{id:"mistral-large-latest",label:"Large",tier:"large"}]},deepseek:{label:"DeepSeek",apiKeyName:"DEEPSEEK_API_KEY",keysAt:"https://platform.deepseek.com/api_keys",keyLooks:"sk-…",suggestModels:[{id:"deepseek-flash",label:"V4.1 Flash",tier:"small",context:1e6},{id:"deepseek-v4-pro",label:"V4 Pro",tier:"large",context:1e6}]},groq:{label:"Groq",apiKeyName:"GROQ_API_KEY",keysAt:"https://console.groq.com/keys",keyLooks:"gsk_…",suggestModels:[{id:"openai/gpt-oss-20b",label:"GPT OSS 20B",tier:"small",context:131072},{id:"openai/gpt-oss-120b",label:"GPT OSS 120B",tier:"mid",context:131072},{id:"llama-3.3-70b-versatile",label:"Llama 3.3 70B",tier:"mid",context:131072}]},cerebras:{label:"Cerebras",apiKeyName:"CEREBRAS_API_KEY",keysAt:"https://cloud.cerebras.ai",keyLooks:"csk-…",suggestModels:[{id:"qwen-3.8-27b",label:"Qwen 3.8 27B",tier:"small",context:64e3},{id:"gpt-oss-120b",label:"GPT OSS 120B",tier:"mid",context:65536}]},togetherai:{label:"Together",apiKeyName:"TOGETHER_AI_API_KEY",keysAt:"https://api.together.ai/settings/api-keys",suggestModels:[{id:"Qwen/Qwen3.5-9B",label:"Qwen 3.5 9B",tier:"small",context:262144},{id:"zai-org/GLM-5.3-Flash",label:"GLM 5.3 Flash",tier:"small",context:1048575},{id:"openai/gpt-oss-120b",label:"GPT OSS 120B",tier:"mid",context:131072},{id:"deepseek-ai/DeepSeek-V4.1-Flash",label:"DeepSeek V4.1 Flash",tier:"mid",context:1e6},{id:"zai-org/GLM-5.3",label:"GLM 5.3",tier:"large",context:1048575},{id:"moonshotai/Kimi-K3",label:"Kimi K3",tier:"large",context:1048576}]},fireworks:{label:"Fireworks",apiKeyName:"FIREWORKS_API_KEY",keysAt:"https://app.fireworks.ai/account/api-keys",keyLooks:"fw_…",suggestModels:[{id:"accounts/fireworks/models/glm-5p3-flash",label:"GLM 5.3 Flash",tier:"small",context:1048576},{id:"accounts/fireworks/models/deepseek-v4p1-flash",label:"DeepSeek V4.1 Flash",tier:"mid",context:1048576},{id:"accounts/fireworks/models/minimax-m3",label:"MiniMax M3",tier:"mid",context:512e3},{id:"accounts/fireworks/models/glm-5p3",label:"GLM 5.3",tier:"large",context:1048576},{id:"accounts/fireworks/models/kimi-k3",label:"Kimi K3",tier:"large",context:1048576}]},deepinfra:{label:"DeepInfra",apiKeyName:"DEEPINFRA_API_KEY",keysAt:"https://deepinfra.com/dash/api_keys",suggestModels:[{id:"deepseek-ai/DeepSeek-V4-Flash-0731",label:"DeepSeek V4 Flash",tier:"small",context:1048576},{id:"deepseek-ai/DeepSeek-V4.1-Flash",label:"DeepSeek V4.1 Flash",tier:"mid",context:1048576},{id:"zai-org/GLM-5.2",label:"GLM 5.2",tier:"mid",context:1048576},{id:"zai-org/GLM-5.3",label:"GLM 5.3",tier:"large",context:1048576},{id:"moonshotai/Kimi-K3",label:"Kimi K3",tier:"large",context:1048576}]},cohere:{label:"Cohere",apiKeyName:"COHERE_API_KEY",keysAt:"https://dashboard.cohere.com/api-keys",suggestModels:[{id:"command-r7b-12-2024",label:"Command R7B",tier:"small",context:128e3},{id:"command-a-03-2025",label:"Command A",tier:"mid",context:256e3},{id:"command-a-plus-05-2026",label:"Command A+",tier:"large",context:128e3}]}},m=Object.keys(d).map(e=>({id:e,...d[e]}));e.s(["MEDIA_MODEL_PROVIDERS",0,o,"MEDIA_MODEL_PROVIDER_LIST",0,n,"TEXT_MODEL_PROVIDERS",0,d,"TEXT_MODEL_PROVIDER_LIST",0,m,"canMakeKind",0,(e,i)=>(o[e]?.models[i]?.length??0)>0,"compactAtFor",0,e=>e&&e>0?Math.round(e*a.BOT_RUN.compactHeadroom):a.BOT_RUN.compactAt,"contextWindowOf",0,function(e,i,a=[]){if("vercel-ai-gateway"===e)return a.find(e=>e.id===i)?.contextWindow??null;let t=d[e].suggestModels;return t.find(e=>e.id===i)?.context??null},"defaultModelOf",0,e=>(e.suggestModels.find(e=>"mid"===e.tier)??e.suggestModels[0])?.id,"parseMediaModel",0,function(e){let[i,...a]=(e??"").trim().split("/"),t=s.safeParse({provider:i,model:a.join("/")});return t.success?t.data:null},"parseTextModel",0,function(e){let[i,...a]=(e??"").trim().split("/"),t=l.safeParse({provider:i,model:a.join("/")});return t.success?t.data:null},"textModelProviderSchema",0,t,"textModelRefSchema",0,l])},279041,e=>{"use strict";var i=e.i(911757),a=e.i(264079),t=e.i(834332);let l=[i.LIVE_PROVIDER.apiKeyName],r={image:"IMAGE_MODEL",video:"VIDEO_MODEL",speech:"SPEECH_MODEL",transcription:"TRANSCRIPTION_MODEL"},s={image:{label:"Image model",hint:"What bots draw with"},video:{label:"Video model",hint:"What bots film with — minutes a clip"},speech:{label:"Speech model",hint:"What reads text aloud into a file"},transcription:{label:"Transcription model",hint:"What turns a recording into text"}},o="EXA_API_KEY",n="DEFAULT_MODEL",d={key:n,label:"Default model",hint:"What a bot thinks with until it picks its own",text:!0,choices:a.TEXT_MODEL_PROVIDER_LIST.flatMap(e=>e.suggestModels.map(i=>({value:`${e.id}/${i.id}`,label:`${e.label} \xb7 ${i.label}`,needs:e.apiKeyName})))},m=e=>l.includes(e.apiKeyName),c=e=>!!e.signIn||"vercel-ai-gateway"===e.id,g=e=>({key:e.apiKeyName,label:e.label,provider:e.id,signIn:e.signIn,keysAt:e.keysAt,keyLooks:e.keyLooks}),p=[{id:"voice",title:"voice",hint:"calls run on this key",section:"keys",require:"any",note:"required for calls",entries:a.TEXT_MODEL_PROVIDER_LIST.filter(m).map(g)},{id:"easy",title:"the easy ways",hint:"one sign-in or one key opens every bot",section:"keys",require:"none",entries:a.TEXT_MODEL_PROVIDER_LIST.filter(c).map(e=>({...g(e),..."vercel-ai-gateway"===e.id&&{recommended:!0}}))},{id:"text",title:"or a provider's own key",hint:"what bots think with — add any, or none",section:"keys",require:"none",entries:a.TEXT_MODEL_PROVIDER_LIST.filter(e=>!m(e)&&!c(e)).map(g)},{id:"search",title:"search",hint:"how calls and bots look things up — one key, or their own model's",section:"keys",require:"none",entries:[{key:o,label:"Exa",hint:"web search in one call — dashboard.exa.ai",site:"exa.ai",keysAt:"https://dashboard.exa.ai/api-keys"}]},{id:"phone",title:"phone",hint:"write to Thursday from a chat app — nothing is opened to the outside",section:"keys",require:"none",entries:[{key:t.TELEGRAM_TOKEN_KEY,label:"Telegram",site:"telegram.org",hint:"a bot token from @BotFather — then write to your bot, and allow it here"},{key:t.DISCORD_TOKEN_KEY,label:"Discord",site:"discord.com",hint:"a bot token from discord.com/developers — add the bot to a server of yours, then write to it directly"},{key:t.SLACK_APP_TOKEN_KEY,label:"Slack · app token",site:"slack.com",hint:"starts with xapp- — opens the connection. Slack takes this and the bot token"},{key:t.SLACK_BOT_TOKEN_KEY,label:"Slack · bot token",site:"slack.com",hint:"starts with xoxb- — speaks as the app"}]},{id:"bots",title:"Bots",hint:"what a bot runs on when it has not picked its own — start small: a small model is quick and costs little",section:"models",require:"none",entries:[d]},{id:"studio",title:"Studio",hint:"what a bot draws, films and speaks with — off until you pick one",section:"models",require:"none",entries:Object.keys(r).map(e=>({key:r[e],...s[e],kind:e,choices:a.MEDIA_MODEL_PROVIDER_LIST.flatMap(i=>i.models[e].map(e=>({value:`${i.id}/${e.id}`,label:`${i.label} \xb7 ${e.label}`,needs:i.apiKeyName})))}))}];Object.fromEntries(p.flatMap(e=>e.entries).map(e=>[e.key,e]));let b=p.flatMap(e=>e.entries.map(e=>e.key)),h=Object.fromEntries(p.flatMap(e=>e.entries).filter(e=>e.choices?.length).map(e=>[e.key,e.choices]));e.s(["CONFIG_CHOICES",0,h,"CONFIG_KEYS",0,b,"DEFAULT_MODEL_KEY",0,n,"EXA_API_KEY",0,o,"MEDIA_MODEL_KEYS",0,r])},340698,e=>e.a(async(i,a)=>{try{var t=e.i(875225),l=e.i(528790),r=e.i(613240);e.i(279041);var s=i([l]);async function o(e){let i=process.env[e]?.trim();if(i)return i;let[a]=await l.database.select({value:r.configTable.value}).from(r.configTable).where((0,t.eq)(r.configTable.key,e));return a?.value.trim()||void 0}async function n(e,i){await l.database.insert(r.configTable).values({key:e,value:i}).onConflictDoUpdate({target:r.configTable.key,set:{value:i}})}[l]=s.then?(await s)():s,e.s(["readConfig",0,o,"writeConfig",0,n]),a()}catch(e){a(e)}},!1),834332,e=>{"use strict";let i="TELEGRAM_BOT_TOKEN",a="DISCORD_BOT_TOKEN",t="SLACK_APP_TOKEN",l="SLACK_BOT_TOKEN";e.s(["DISCORD_TOKEN_KEY",0,a,"REACH_CHANNELS",0,["telegram","discord","slack"],"REACH_KEYS",0,{telegram:[i],discord:[a],slack:[t,l]},"SLACK_APP_TOKEN_KEY",0,t,"SLACK_BOT_TOKEN_KEY",0,l,"TELEGRAM_TOKEN_KEY",0,i,"reachPersonKey",0,e=>`REACH_PERSON_${e.toUpperCase()}`])},514499,e=>{"use strict";e.s(["COMMON_VALIDATE",0,{name:{max:16},shortDescription:{max:60},description:{max:100},prompt:{max:4e3}}])},904309,e=>{"use strict";var i=e.i(469719);let a=i.z.object({start:i.z.number().nonnegative(),end:i.z.number().nonnegative(),text:i.z.string()});i.z.object({reason:i.z.string().max(128),seconds:i.z.number().nonnegative().nullable()}),e.s(["LIVE_BACKEND_MODEL",0,"gpt-5.6-luna","LiveFragmentSchema",0,a])},469719,e=>{"use strict";var i=e.i(562810);e.s(["z",0,i])}];
2
2
 
3
3
  //# sourceMappingURL=%5Broot-of-the-server%5D__0rqgb17._.js.map
@@ -4,7 +4,7 @@ module.exports=[874533,(e,t,r)=>{t.exports=e.x("node:child_process",()=>require(
4
4
 
5
5
  [${t} cut at ${i.max.toLocaleString("en")} chars — the whole thing (${c} lines) is at ${l}. Read the part you need with \`sed -n\`.]
6
6
 
7
- ${e.slice(-i.tail).trimStart()}`}let h=o.APP_DIR,f=(0,n.join)(o.DATA_DIR,o.PATHS.workspace),w=(process.env.THURSDAY_TOOL_PATH?.split(":")??[(0,n.join)(h,"node_modules",".bin")]).filter(Boolean),m=(0,n.join)(f,o.PATHS.artifacts),S=[o.PATHS.artifacts,o.PATHS.projects,o.PATHS.scratch,o.PATHS.bots],T=new Set([...S,".agents"]),y=(e,t)=>t===e||t.startsWith(e+n.sep),g=e=>(0,a.realpath)(e).catch(()=>null);async function _(e){let t=await g(f)??f,r=(0,n.resolve)(f,e);if(!y(f,r))return null;let a=r,i=await g(a);for(;null===i&&(0,n.dirname)(a)!==a;)a=(0,n.dirname)(a),i=await g(a);if(null===i)return null;let o=(0,n.relative)(a,r),s=o?(0,n.join)(i,o):i;return y(t,s)?s:null}function A(e,t){let r=t.trim().toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"").slice(0,40)||"job";return`${o.PATHS.scratch}/${r}-${e.slice(0,6)}`}let v=e=>e.replace(/[^\p{L}\p{N}_-]+/gu,"-"),E=e=>`${o.PATHS.bots}/${v(e)}`,$=e=>`${o.PATHS.artifacts}/${v(e)}`;async function P(e){let t=E(e),r=$(e);return await Promise.all([t,r].map(e=>(0,a.mkdir)((0,n.join)(f,e),{recursive:!0}))),{own:t,artifacts:r}}async function b(e,t){let r=A(e,t);return await (0,a.mkdir)((0,n.join)(f,r),{recursive:!0}),r}let x=e=>({PLAYWRIGHT_MCP_BROWSER:"chromium",...e?{PLAYWRIGHT_CLI_SESSION:`thread-${e}`,PLAYWRIGHT_MCP_VIEWPORT_SIZE:o.BROWSER_VIEWPORT}:{}}),I={runtimes:["node","python3","uv","bun","deno"],managers:["pnpm","npm","yarn"]};async function R(e){let t=Object.values(I).flat(),{stdout:r}=await e.exec(t.map(e=>`command -v ${e} >/dev/null 2>&1 && printf '%s ' ${e}`).join("; "),{timeoutMs:1e4}),a=new Set(r.trim().split(/\s+/).filter(Boolean)),i=e=>({found:e.filter(e=>a.has(e)),missing:e.filter(e=>!a.has(e))});return{runtimes:i(I.runtimes),managers:i(I.managers),browser:null}}async function H(){await M(),await L()}async function j(e){await k(e,await C(e,!1))}async function O(e){await C(e,!0)}async function W(e){await k(e,await C(e,!0))}async function k(e,r){let o=process.env.XDG_CACHE_HOME||(0,n.join)((0,i.homedir)(),".cache"),l=await (0,a.realpath)(f).catch(()=>f),c=(0,n.join)(o,"ms-playwright","daemon",(0,t.createHash)("sha1").update(l).digest("hex").slice(0,16)),u=x(e).PLAYWRIGHT_CLI_SESSION;for(let e of(await (0,a.readdir)(c).catch(()=>[]))){let t=e.startsWith("ud-")?e.slice(3):e;(t===u||t.startsWith(`${u}-`)||t.startsWith(`${u}.`))&&(r.some(e=>t===e||t.startsWith(`${e}-`)||t.startsWith(`${e}.`))||await (0,a.rm)((0,n.join)(c,e),{recursive:!0,force:!0}).catch(t=>s.logger.warn(`browser data ${e}: ${String(t)}`)))}}async function C(e,t){let r=await B(),a=x(e),i=await r.exec("playwright-cli list --json",{env:a,timeoutMs:15e3}).catch(()=>null),n=[];try{let{browsers:e}=JSON.parse(i?.stdout??"");n=e?.filter(e=>e.name===a.PLAYWRIGHT_CLI_SESSION||e.name.startsWith(`${a.PLAYWRIGHT_CLI_SESSION}-`))??[]}catch{}let o=[];for(let e of n){if(e.attached||!t&&!1!==e.headed){o.push(e.name);continue}await r.exec("playwright-cli close",{env:{...a,PLAYWRIGHT_CLI_SESSION:e.name},timeoutMs:15e3}).catch(()=>{})}return await H(),o}let L=()=>F(o.PATHS.output),M=()=>F(".playwright-cli");async function F(e){let t=(0,n.join)(f,e),r=await (0,a.readdir)(t,{withFileTypes:!0}).catch(()=>[]),i=Date.now()-o.WORKSPACE_KEEP.forMs;for(let e of r){if(!e.isFile())continue;let r=(0,n.join)(t,e.name),o=await (0,a.stat)(r).catch(()=>null);o&&o.mtimeMs<i&&await (0,a.unlink)(r).catch(()=>{})}}async function D(){return(await (0,a.readdir)((0,n.join)(f,o.PATHS.scratch),{withFileTypes:!0}).catch(()=>[])).filter(e=>e.isDirectory()).map(e=>`${o.PATHS.scratch}/${e.name}`)}async function G(e){let t=Date.now()-o.WORKSPACE_KEEP.forMs,r=[];for(let i of e){let e=(0,n.join)(f,i),o=await (0,a.stat)(e).catch(()=>null);o?.isDirectory()&&!(o.mtimeMs>=t)&&(await (0,a.rm)(e,{recursive:!0,force:!0}).catch(()=>{}),r.push(i))}return r}let N={"pnpm-workspace.yaml":"packages:\n - '**'\n",".npmrc":"recursive-install=false\n"};async function B(){for(let e of[...S,".playwright"])await (0,a.mkdir)((0,n.join)(f,e),{recursive:!0});for(let[e,t]of Object.entries(N))await (0,a.writeFile)((0,n.join)(f,e),t,{flag:"wx"}).catch(()=>{});return(({workingDirectory:e,spill:t,toolPath:r})=>{let i=(0,n.resolve)(e),o=(r??[]).filter(Boolean).join(":"),s=e=>e.startsWith("/")||/^[A-Za-z]:/.test(e)?e:(0,n.resolve)(i,e);return{cwd:i,resolve:s,readFile:(e,t)=>(0,a.readFile)(s(e),t),async writeFile(e,t){let r=s(e);await (0,a.mkdir)((0,n.join)(r,".."),{recursive:!0}),await (0,a.writeFile)(r,t)},readdir:(e,t)=>(0,a.readdir)(s(e),t),fold:(e,r="output")=>p(e,r,i,t),async glob(e,{path:t=".",limit:r=200}={}){let a=s(t),i=RegExp("^"+e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*\//g,"(?:.*/)?").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")+"$"),o=[];for await(let e of d(a)){let t=(0,n.relative)(a,e).split(n.sep).join("/");if((i.test(t)||i.test(e))&&o.push(e),o.length>=r)break}return o},exec:(e,{cwd:r,timeoutMs:a=c.EXEC_TIMEOUT_MS,signal:n,env:u}={})=>new Promise(d=>{let h,f,w=function(){let e={...process.env};for(let t of Object.keys(e))/KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|_AUTH/i.test(t)&&delete e[t];return e.TERM="dumb",e.PAGER="cat",e.GIT_PAGER="cat",e}();o&&(w.PATH=`${w.PATH??""}:${o}`);let m=(0,l.spawn)(e,{shell:!0,cwd:r?s(r):i,env:{...w,...u},detached:!0}),S="",T="";m.stdout?.on("data",e=>S+=e),m.stderr?.on("data",e=>T+=e);let y=e=>{try{m.pid&&process.kill(-m.pid,e)}catch{m.kill(e)}},g=!1,_=async e=>{g||(g=!0,clearTimeout(v),clearTimeout(h),clearTimeout(f),n?.removeEventListener("abort",E),d({...e,stdout:await p(e.stdout,"stdout",i,t),stderr:await p(e.stderr,"stderr",i,t)}))},A=e=>{h||g||(T+=`
8
- [${e}]`,y("SIGTERM"),h=setTimeout(()=>{T+="\n[Killed: it did not exit on SIGTERM]",y("SIGKILL"),f=setTimeout(()=>{m.stdout?.destroy(),m.stderr?.destroy(),_({stdout:S,stderr:T,exitCode:-1})},1e3)},c.EXEC_KILL_GRACE_MS))},v=setTimeout(()=>A(`Timed out after ${a}ms`),a),E=()=>A("Aborted");n?.aborted?E():n?.addEventListener("abort",E,{once:!0}),m.on("close",e=>_({stdout:S,stderr:T,exitCode:e??-1})),m.on("error",e=>_({stdout:S,stderr:T+String(e),exitCode:-1}))})}})({workingDirectory:f,spill:{dir:o.PATHS.output,...o.TOOL_OUTPUT},toolPath:w})}async function Y(e,t){let r=e.map(e=>(0,n.resolve)(f,e));if(t){let e=0;for await(let a of d((0,n.join)(f,t)))if(r.push(a),(e+=1)>=500)break}let i=new Map;for(let e of r){let t=await (0,a.stat)(e).catch(()=>null);if(!t?.isFile())continue;let r=(0,n.relative)(f,e);i.set(r&&!r.startsWith("..")?r:e,t.mtimeMs)}return[...i].sort((e,t)=>e[1]-t[1]).map(([e])=>e)}async function q(e,t){await (0,a.rm)((0,n.join)(f,A(e,t)),{recursive:!0,force:!0}).catch(()=>{})}e.s(["ARTIFACTS",0,m,"WORKSPACE",0,f,"botArtifacts",0,$,"botBrowserSession",0,(e,r)=>`${e}-bot-${(0,t.createHash)("sha256").update(r.trim().toLowerCase()).digest("hex").slice(0,20)}`,"botFolder",0,E,"botFolderName",0,v,"botShellEnv",0,e=>({THURSDAY_ARTIFACTS:$(e)}),"closeHiddenBrowser",0,j,"closeJobShell",0,O,"filesOnDisk",0,Y,"insideWorkspace",0,_,"jobScratch",0,A,"jobShellEnv",0,x,"listScratchFolders",0,D,"openBotFolders",0,P,"openJobScratch",0,b,"openWorkspace",0,B,"pruneJobFiles",0,H,"readMachineTools",0,R,"removeJobBrowsers",0,W,"removeJobScratch",0,q,"removeUnchangedFolders",0,G,"writeRefusal",0,function(e,t){if(y(f,e)){let a=(0,n.relative)(f,e),[i,s]=a.split(n.sep);return i&&T.has(i)?t&&i===o.PATHS.artifacts&&s&&s.toLowerCase()!==v(t).toLowerCase()&&!(0,r.existsSync)((0,n.join)(m,s))?`Not written: ${a} would sit loose at the top of ${o.PATHS.artifacts}/. Your finished work goes in ${$(t)}/.`:null:`Not written: ${a||"the workspace root"} is outside the workspace's folders. Finished work goes under ${t?$(t):o.PATHS.artifacts}/, code under ${o.PATHS.projects}/, your own kit under ${o.PATHS.bots}/, and this job's working material under ${o.PATHS.scratch}/.`}return y(h,e)?`Not written: ${e} is inside the app that is running you, not the user's files. Work in ${f}; outside it, write only where the user pointed you.`:null}],786025)}];
7
+ ${e.slice(-i.tail).trimStart()}`}let h=o.APP_DIR,f=(0,n.join)(o.DATA_DIR,o.PATHS.workspace),w=(process.env.THURSDAY_TOOL_PATH?.split(":")??[(0,n.join)(h,"node_modules",".bin")]).filter(Boolean),m=(0,n.join)(f,o.PATHS.artifacts),S=[o.PATHS.artifacts,o.PATHS.projects,o.PATHS.scratch,o.PATHS.bots],T=new Set([...S,".agents"]),y=(e,t)=>t===e||t.startsWith(e+n.sep),g=e=>(0,a.realpath)(e).catch(()=>null);async function _(e){let t=await g(f)??f,r=(0,n.resolve)(f,e);if(!y(f,r))return null;let a=r,i=await g(a);for(;null===i&&(0,n.dirname)(a)!==a;)a=(0,n.dirname)(a),i=await g(a);if(null===i)return null;let o=(0,n.relative)(a,r),s=o?(0,n.join)(i,o):i;return y(t,s)?s:null}function A(e,t){let r=t.trim().toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"").slice(0,40)||"job";return`${o.PATHS.scratch}/${r}-${e.slice(0,6)}`}let v=e=>e.replace(/[^\p{L}\p{N}_-]+/gu,"-"),E=e=>`${o.PATHS.bots}/${v(e)}`,P=e=>`${o.PATHS.artifacts}/${v(e)}`;async function $(e){let t=E(e),r=P(e);return await Promise.all([t,r].map(e=>(0,a.mkdir)((0,n.join)(f,e),{recursive:!0}))),{own:t,artifacts:r}}async function b(e,t){let r=A(e,t);return await (0,a.mkdir)((0,n.join)(f,r),{recursive:!0}),r}let I=e=>({PLAYWRIGHT_MCP_BROWSER:"chromium",...e?{PLAYWRIGHT_CLI_SESSION:`thread-${e}`,PLAYWRIGHT_MCP_VIEWPORT_SIZE:o.BROWSER_VIEWPORT}:{}}),R={runtimes:["node","python3","uv","bun","deno"],managers:["pnpm","npm","yarn"]};async function H(e){let t=Object.values(R).flat(),{stdout:r}=await e.exec(t.map(e=>`command -v ${e} >/dev/null 2>&1 && printf '%s ' ${e}`).join("; "),{timeoutMs:1e4}),a=new Set(r.trim().split(/\s+/).filter(Boolean)),i=e=>({found:e.filter(e=>a.has(e)),missing:e.filter(e=>!a.has(e))});return{runtimes:i(R.runtimes),managers:i(R.managers),browser:null}}async function x(){await M(),await C()}async function j(e){await k(e,await L(e,!1))}async function O(e){await L(e,!0)}async function W(e){await k(e,await L(e,!0))}async function k(e,r){let o=process.env.XDG_CACHE_HOME||(0,n.join)((0,i.homedir)(),".cache"),l=await (0,a.realpath)(f).catch(()=>f),c=(0,n.join)(o,"ms-playwright","daemon",(0,t.createHash)("sha1").update(l).digest("hex").slice(0,16)),u=I(e).PLAYWRIGHT_CLI_SESSION;for(let e of(await (0,a.readdir)(c).catch(()=>[]))){let t=e.startsWith("ud-")?e.slice(3):e;(t===u||t.startsWith(`${u}-`)||t.startsWith(`${u}.`))&&(r.some(e=>t===e||t.startsWith(`${e}-`)||t.startsWith(`${e}.`))||await (0,a.rm)((0,n.join)(c,e),{recursive:!0,force:!0}).catch(t=>s.logger.warn(`browser data ${e}: ${String(t)}`)))}}async function L(e,t){let r=await B(),a=I(e),i=await r.exec("playwright-cli list --json",{env:a,timeoutMs:15e3}).catch(()=>null),n=[];try{let{browsers:e}=JSON.parse(i?.stdout??"");n=e?.filter(e=>e.name===a.PLAYWRIGHT_CLI_SESSION||e.name.startsWith(`${a.PLAYWRIGHT_CLI_SESSION}-`))??[]}catch{}let o=[];for(let e of n){if(e.attached||!t&&!1!==e.headed){o.push(e.name);continue}await r.exec("playwright-cli close",{env:{...a,PLAYWRIGHT_CLI_SESSION:e.name},timeoutMs:15e3}).catch(()=>{})}return await x(),o}let C=()=>F(o.PATHS.output),M=()=>F(".playwright-cli");async function F(e){let t=(0,n.join)(f,e),r=await (0,a.readdir)(t,{withFileTypes:!0}).catch(()=>[]),i=Date.now()-o.WORKSPACE_KEEP.forMs;for(let e of r){if(!e.isFile())continue;let r=(0,n.join)(t,e.name),o=await (0,a.stat)(r).catch(()=>null);o&&o.mtimeMs<i&&await (0,a.unlink)(r).catch(()=>{})}}async function D(){return(await (0,a.readdir)((0,n.join)(f,o.PATHS.scratch),{withFileTypes:!0}).catch(()=>[])).filter(e=>e.isDirectory()).map(e=>`${o.PATHS.scratch}/${e.name}`)}async function G(e){let t=Date.now()-o.WORKSPACE_KEEP.forMs,r=[];for(let i of e){let e=(0,n.join)(f,i),o=await (0,a.stat)(e).catch(()=>null);o?.isDirectory()&&!(o.mtimeMs>=t)&&(await (0,a.rm)(e,{recursive:!0,force:!0}).catch(()=>{}),r.push(i))}return r}let N={"pnpm-workspace.yaml":"packages:\n - '**'\n",".npmrc":"recursive-install=false\n"};async function B(){for(let e of[...S,".playwright"])await (0,a.mkdir)((0,n.join)(f,e),{recursive:!0});for(let[e,t]of Object.entries(N))await (0,a.writeFile)((0,n.join)(f,e),t,{flag:"wx"}).catch(()=>{});return(({workingDirectory:e,spill:t,toolPath:r})=>{let i=(0,n.resolve)(e),o=(r??[]).filter(Boolean).join(":"),s=e=>e.startsWith("/")||/^[A-Za-z]:/.test(e)?e:(0,n.resolve)(i,e);return{cwd:i,resolve:s,readFile:(e,t)=>(0,a.readFile)(s(e),t),async writeFile(e,t){let r=s(e);await (0,a.mkdir)((0,n.join)(r,".."),{recursive:!0}),await (0,a.writeFile)(r,t)},readdir:(e,t)=>(0,a.readdir)(s(e),t),fold:(e,r="output")=>p(e,r,i,t),async glob(e,{path:t=".",limit:r=200}={}){let a=s(t),i=RegExp("^"+e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*\//g,"(?:.*/)?").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")+"$"),o=[];for await(let e of d(a)){let t=(0,n.relative)(a,e).split(n.sep).join("/");if((i.test(t)||i.test(e))&&o.push(e),o.length>=r)break}return o},exec:(e,{cwd:r,timeoutMs:a=c.EXEC_TIMEOUT_MS,signal:n,env:u}={})=>new Promise(d=>{let h,f,w=function(){let e={...process.env};for(let t of Object.keys(e))/KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|_AUTH/i.test(t)&&delete e[t];return e.TERM="dumb",e.PAGER="cat",e.GIT_PAGER="cat",e}();o&&(w.PATH=`${w.PATH??""}:${o}`);let m=(0,l.spawn)(e,{shell:!0,cwd:r?s(r):i,env:{...w,...u},detached:!0}),S="",T="";m.stdout?.on("data",e=>S+=e),m.stderr?.on("data",e=>T+=e);let y=e=>{try{m.pid&&process.kill(-m.pid,e)}catch{m.kill(e)}},g=!1,_=async e=>{g||(g=!0,clearTimeout(v),clearTimeout(h),clearTimeout(f),n?.removeEventListener("abort",E),d({...e,stdout:await p(e.stdout,"stdout",i,t),stderr:await p(e.stderr,"stderr",i,t)}))},A=e=>{h||g||(T+=`
8
+ [${e}]`,y("SIGTERM"),h=setTimeout(()=>{T+="\n[Killed: it did not exit on SIGTERM]",y("SIGKILL"),f=setTimeout(()=>{m.stdout?.destroy(),m.stderr?.destroy(),_({stdout:S,stderr:T,exitCode:-1})},1e3)},c.EXEC_KILL_GRACE_MS))},v=setTimeout(()=>A(`Timed out after ${a}ms`),a),E=()=>A("Aborted");n?.aborted?E():n?.addEventListener("abort",E,{once:!0}),m.on("close",e=>_({stdout:S,stderr:T,exitCode:e??-1})),m.on("error",e=>_({stdout:S,stderr:T+String(e),exitCode:-1}))})}})({workingDirectory:f,spill:{dir:o.PATHS.output,...o.TOOL_OUTPUT},toolPath:w})}async function Y(e,t){let r=e.map(e=>(0,n.resolve)(f,e));if(t){let e=0;for await(let a of d((0,n.join)(f,t)))if(r.push(a),(e+=1)>=500)break}let i=new Map;for(let e of r){let t=await (0,a.stat)(e).catch(()=>null);if(!t?.isFile())continue;let r=(0,n.relative)(f,e);i.set(r&&!r.startsWith("..")?r:e,t.mtimeMs)}return[...i].sort((e,t)=>e[1]-t[1]).map(([e])=>e)}async function K(e,t){await (0,a.rm)((0,n.join)(f,A(e,t)),{recursive:!0,force:!0}).catch(()=>{})}e.s(["ARTIFACTS",0,m,"WORKSPACE",0,f,"botArtifacts",0,P,"botBrowserSession",0,(e,r)=>`${e}-bot-${(0,t.createHash)("sha256").update(r.trim().toLowerCase()).digest("hex").slice(0,20)}`,"botFolder",0,E,"botFolderName",0,v,"botShellEnv",0,e=>({THURSDAY_ARTIFACTS:P(e),THURSDAY_SKILLS:(0,n.join)(o.APP_DIR,o.PATHS.skills.default)}),"closeHiddenBrowser",0,j,"closeJobShell",0,O,"filesOnDisk",0,Y,"insideWorkspace",0,_,"jobScratch",0,A,"jobShellEnv",0,I,"listScratchFolders",0,D,"openBotFolders",0,$,"openJobScratch",0,b,"openWorkspace",0,B,"pruneJobFiles",0,x,"readMachineTools",0,H,"removeJobBrowsers",0,W,"removeJobScratch",0,K,"removeUnchangedFolders",0,G,"writeRefusal",0,function(e,t){if(y(f,e)){let a=(0,n.relative)(f,e),[i,s]=a.split(n.sep);return i&&T.has(i)?t&&i===o.PATHS.artifacts&&s&&s.toLowerCase()!==v(t).toLowerCase()&&!(0,r.existsSync)((0,n.join)(m,s))?`Not written: ${a} would sit loose at the top of ${o.PATHS.artifacts}/. Your finished work goes in ${P(t)}/.`:null:`Not written: ${a||"the workspace root"} is outside the workspace's folders. Finished work goes under ${t?P(t):o.PATHS.artifacts}/, code under ${o.PATHS.projects}/, your own kit under ${o.PATHS.bots}/, and this job's working material under ${o.PATHS.scratch}/.`}return y(h,e)?`Not written: ${e} is inside the app that is running you, not the user's files. Work in ${f}; outside it, write only where the user pointed you.`:null}],786025)}];
9
9
 
10
10
  //# sourceMappingURL=%5Broot-of-the-server%5D__1-swlkw._.js.map
@@ -1,5 +1,5 @@
1
1
  module.exports=[418520,e=>e.a(async(t,a)=>{try{var l=await e.y("@libsql/client-6da938047d5fc1cd");e.n(l),a()}catch(e){a(e)}},!0),902157,(e,t,a)=>{t.exports=e.x("node:fs",()=>require("node:fs"))},750227,(e,t,a)=>{t.exports=e.x("node:path",()=>require("node:path"))},59639,(e,t,a)=>{t.exports=e.x("node:process",()=>require("node:process"))},509656,(e,t,a)=>{t.exports=e.x("node:tty",()=>require("node:tty"))},812057,(e,t,a)=>{t.exports=e.x("node:util",()=>require("node:util"))},232347,e=>{"use strict";let t,a,l,s,n,i;var r,o=e.i(333925),c=e.i(938281);let d={threads:!0,routines:!0,memory:!0,mcp:!0,config:!0,reach:!0,signins:!0},u=globalThis,m=u.__appEvents??=(t=new Set,{emit(e){for(let a of[...t])try{a(e)}catch(e){console.error("event listener failed",e)}},subscribe:e=>(t.add(e),()=>{t.delete(e)})}),T=u.__presence??=(r=o.BROWSER_GONE_MS,a=!1,l=null,s=new Set,n=new Set,i=e=>{for(let t of[...e])try{t()}catch(e){console.error("presence listener failed",e)}},{get watching(){return a},track(e){if(e>0){l&&clearTimeout(l),l=null,a||(a=!0,i(n));return}!l&&a&&(l=setTimeout(()=>{l=null,a=!1,i(s)},r))},onGone:e=>(s.add(e),()=>s.delete(e)),onBack:e=>(n.add(e),()=>n.delete(e))});u.__appEventStream??=function(e,t={}){let a=new TextEncoder,l=t.heartbeatMs??2e4,s=0;return{respond:(n,i)=>{let r=()=>{};return new Response(new ReadableStream({async start(o){let d=!1,u=new Map,m=[],T=e=>{if(!d)try{o.enqueue(a.encode(e))}catch{r()}},E=e=>T(`data: ${JSON.stringify(e)}
2
2
 
3
- `),f=e=>{let a=t.coalesce?.keyOf(e)??null;if(null===a)return E(e);let l=u.get(a);l&&clearTimeout(l),u.set(a,setTimeout(()=>{u.delete(a),E(e)},t.coalesce?.ms))},b=e.subscribe(e=>m?m.push(e):f(e)),h=setInterval(()=>T(": ping\n\n"),l);s+=1,t.onWatchers?.(s),r=()=>{if(!d){for(let e of(d=!0,s-=1,t.onWatchers?.(s),b(),clearInterval(h),u.values()))clearTimeout(e);try{o.close()}catch{}}},n.addEventListener("abort",r);try{for(let e of await i?.()??[])E(e)}catch(e){c.logger.error("event stream opening failed",e),r();return}let _=m;for(let e of(m=null,_))f(e)},cancel(){r()}}),{headers:{"Content-Type":"text/event-stream; charset=utf-8","Cache-Control":"no-store","X-Accel-Buffering":"no"}})},get watchers(){return s}}}(m,{coalesce:{ms:150,keyOf:e=>e.type in d?e.type:null},onWatchers:T.track}),u.__bootId??=crypto.randomUUID(),e.s(["appEvents",0,m,"presence",0,T],232347)},333925,e=>{"use strict";let t=process.env.THURSDAY_APP_DIR?.trim()||process.cwd(),a=process.env.THURSDAY_HOME?.trim()||process.cwd(),l=process.env.THURSDAY_URL?.trim()||`http://localhost:${process.env.PORT?.trim()||3e3}`,s=`file:${a}/local.db`,n=".ai-workspace",i={workspace:n,artifacts:"artifacts",projects:"projects",scratch:"scratch",bots:"bots",output:".output",signIns:".sign-ins",skills:{default:"skills",custom:`${n}/.agents/skills`,own:".agents/skills",seeds:"seed-skills"}};e.s(["APP_DIR",0,t,"APP_NAME",0,"Thursday","APP_URL",0,l,"ASCII_FACE",0,{charset:"emojiOnly",fontSize:{default:8,min:4,max:16},density:{default:1.4,min:.6,max:2}},"BOT_MEMORY_LIMITS",0,{files:20,chars:1e4},"BOT_RUN",0,{steps:100,compactAt:5e5,compactHeadroom:.8,summaryWords:{min:600,max:3e3,perTokens:200},participants:12,concurrent:4,turns:120,queuedMessages:200,silenceMs:3e5,overflowShrink:.6,retryMs:1e4,compactFiles:40},"BOT_WORK",0,{open:5,recent:5,said:80,files:2,reads:2,asked:400,readChars:4e3},"BROWSER_GONE_MS",0,1e4,"BROWSER_VIEWPORT",0,"700x700","CALL_EXEC_TIMEOUT_MS",0,15e3,"CALL_RELAY",0,{quietMs:7e3,perTurn:3,readMs:15e3,chars:600},"CHATGPT_SIGN_IN",0,{waitMs:6e5,renewBeforeMs:3e5},"CONNECTED_TOOL_TIMEOUT_MS",0,6e5,"DATA_DIR",0,a,"DB_FILE_NAME",0,s,"EXEC_KILL_GRACE_MS",0,5e3,"EXEC_TIMEOUT_MS",0,18e4,"FINISHED_NOTICE",0,{rows:5,words:240},"GIVEN_FILES",0,{dir:"inbox",maxBytes:0x1900000,perMessage:8},"INBOX_FINISHED",0,5,"IS_DEV",0,!1,"LIVE_CALL",0,{startupMs:3e4,closeMs:15e3,transcriptGapMs:1500,transcriptSaveMs:500,appendMs:15e3,backendOutputTokens:4096,reasoningCheckMs:5e3,keyCheckMs:5e3},"LOOK",0,{maxBytes:4194304},"MEMORY_CONVERSATION_PAGE",0,100,"MEMORY_LIMITS",0,{facts:400,factsPerNote:50,carried:20,expanded:10},"PATHS",0,i,"PROMPT_BUDGET",0,6e3,"PROMPT_LINE",0,{skill:90,toolArgs:30,jobOutcome:160,botMemory:100},"REACH",0,{pollSeconds:50,retryMs:5e3,idleMs:6e5,notifyAfterMs:6e4,chars:3500,files:3,fileBytes:0x2d00000},"RECENT_CALL",0,{rows:20,tokens:600},"ROUTINE",0,{tickMs:3e4,max:12,minHours:1,runsShown:5},"SEARCH",0,{sources:3,excerptChars:1200,timeoutMs:3e4},"STUDIO_SERVER",0,"studio","TEXT_CALL",0,{maxSteps:12,model:"text"},"THREAD_STATUS_LIMIT",0,10,"TOOL_OUTPUT",0,{max:8e3,head:5500,tail:1500},"WORKSPACE_KEEP",0,{forMs:2592e5,sweepEveryMs:36e5}])},247839,e=>{"use strict";var t=e.i(853205),a=e.i(986129),l=e.i(556325),s=e.i(864328);let n={id:"openai",label:"OpenAI",apiKeyName:s.TEXT_MODEL_PROVIDERS.openai.apiKeyName};s.TEXT_MODEL_PROVIDERS.openai.suggestModels;let i=t.z.string().max(a.COMMON_VALIDATE.prompt.max).default(""),r=t.z.object({voice:t.z.string().trim().min(1).max(128).default("marin"),voicePrompt:i,backendModel:t.z.string().trim().min(1).max(128).default(l.LIVE_BACKEND_MODEL),backendPrompt:i,reasoningEffort:t.z.enum(["none","minimal","low","medium","high","xhigh"]).nullable().default("low"),webSearch:t.z.boolean().default(!0)});r.parse({}),e.s(["LIVE_PROVIDER",0,n,"LiveSettingsSchema",0,r])},656719,e=>{"use strict";var t=e.i(247839),a=e.i(864328),l=e.i(735186);let s=[t.LIVE_PROVIDER.apiKeyName],n={image:"IMAGE_MODEL",video:"VIDEO_MODEL",speech:"SPEECH_MODEL",transcription:"TRANSCRIPTION_MODEL"},i={image:{label:"Image model",hint:"What bots draw with"},video:{label:"Video model",hint:"What bots film with — minutes a clip"},speech:{label:"Speech model",hint:"What reads text aloud into a file"},transcription:{label:"Transcription model",hint:"What turns a recording into text"}},r="EXA_API_KEY",o="DEFAULT_MODEL",c={key:o,label:"Default model",hint:"What a bot thinks with until it picks its own",text:!0,choices:a.TEXT_MODEL_PROVIDER_LIST.flatMap(e=>e.suggestModels.map(t=>({value:`${e.id}/${t.id}`,label:`${e.label} \xb7 ${t.label}`,needs:e.apiKeyName})))},d=e=>s.includes(e.apiKeyName),u=e=>!!e.signIn||"vercel-ai-gateway"===e.id,m=e=>({key:e.apiKeyName,label:e.label,provider:e.id,signIn:e.signIn}),T=[{id:"voice",title:"voice",hint:"calls run on this key",section:"keys",require:"any",note:"required for calls",entries:a.TEXT_MODEL_PROVIDER_LIST.filter(d).map(m)},{id:"easy",title:"the easy ways",hint:"one sign-in or one key opens every bot",section:"keys",require:"none",entries:a.TEXT_MODEL_PROVIDER_LIST.filter(u).map(e=>({...m(e),..."vercel-ai-gateway"===e.id&&{recommended:!0}}))},{id:"text",title:"or a provider's own key",hint:"what bots think with — add any, or none",section:"keys",require:"none",entries:a.TEXT_MODEL_PROVIDER_LIST.filter(e=>!d(e)&&!u(e)).map(m)},{id:"search",title:"search",hint:"how calls and bots look things up — one key, or their own model's",section:"keys",require:"none",entries:[{key:r,label:"Exa",hint:"web search in one call — dashboard.exa.ai",site:"exa.ai"}]},{id:"phone",title:"phone",hint:"write to Thursday from a chat app — nothing is opened to the outside",section:"keys",require:"none",entries:[{key:l.TELEGRAM_TOKEN_KEY,label:"Telegram",site:"telegram.org",hint:"a bot token from @BotFather — then write to your bot, and allow it here"},{key:l.DISCORD_TOKEN_KEY,label:"Discord",site:"discord.com",hint:"a bot token from discord.com/developers — add the bot to a server of yours, then write to it directly"},{key:l.SLACK_APP_TOKEN_KEY,label:"Slack · app token",site:"slack.com",hint:"starts with xapp- — opens the connection. Slack takes this and the bot token"},{key:l.SLACK_BOT_TOKEN_KEY,label:"Slack · bot token",site:"slack.com",hint:"starts with xoxb- — speaks as the app"}]},{id:"bots",title:"Bots",hint:"what a bot runs on when it has not picked its own — start small: a small model is quick and costs little",section:"models",require:"none",entries:[c]},{id:"studio",title:"Studio",hint:"what a bot draws, films and speaks with — off until you pick one",section:"models",require:"none",entries:Object.keys(n).map(e=>({key:n[e],...i[e],kind:e,choices:a.MEDIA_MODEL_PROVIDER_LIST.flatMap(t=>t.models[e].map(e=>({value:`${t.id}/${e.id}`,label:`${t.label} \xb7 ${e.label}`,needs:t.apiKeyName})))}))}];Object.fromEntries(T.flatMap(e=>e.entries).map(e=>[e.key,e])),T.flatMap(e=>e.entries.map(e=>e.key)),Object.fromEntries(T.flatMap(e=>e.entries).filter(e=>e.choices?.length).map(e=>[e.key,e.choices])),e.s(["DEFAULT_MODEL_KEY",0,o,"EXA_API_KEY",0,r,"MEDIA_MODEL_KEYS",0,n])},724185,e=>e.a(async(t,a)=>{try{var l=e.i(336763),s=e.i(876393),n=e.i(220376);e.i(656719);var i=t([s]);async function r(e){let t=process.env[e]?.trim();if(t)return t;let[a]=await s.database.select({value:n.configTable.value}).from(n.configTable).where((0,l.eq)(n.configTable.key,e));return a?.value.trim()||void 0}async function o(e,t){await s.database.insert(n.configTable).values({key:e,value:t}).onConflictDoUpdate({target:n.configTable.key,set:{value:t}})}async function c(e){await s.database.delete(n.configTable).where((0,l.eq)(n.configTable.key,e))}[s]=i.then?(await i)():i,e.s(["readConfig",0,r,"removeConfig",0,c,"writeConfig",0,o]),a()}catch(e){a(e)}},!1),735186,e=>{"use strict";let t="TELEGRAM_BOT_TOKEN",a="DISCORD_BOT_TOKEN",l="SLACK_APP_TOKEN",s="SLACK_BOT_TOKEN";e.s(["DISCORD_TOKEN_KEY",0,a,"REACH_CHANNELS",0,["telegram","discord","slack"],"REACH_KEYS",0,{telegram:[t],discord:[a],slack:[l,s]},"SLACK_APP_TOKEN_KEY",0,l,"SLACK_BOT_TOKEN_KEY",0,s,"TELEGRAM_TOKEN_KEY",0,t,"reachPersonKey",0,e=>`REACH_PERSON_${e.toUpperCase()}`])},520401,e=>e.a(async(t,a)=>{try{var l=e.i(336763),s=e.i(396918),n=e.i(533102);e.i(333925);var i=e.i(876393),r=e.i(220376),o=e.i(5509),c=e.i(724185),d=e.i(933395),u=t([i,o,c]);async function m(){return(0,d.isSkillsOn)(await (0,c.readConfig)(d.THURSDAY_KEYS.skills))}async function T(e){let[t]=await i.database.insert(r.callTable).values({id:crypto.randomUUID(),...e}).returning({id:r.callTable.id});return t.id}async function E(e,t){return(await i.database.update(r.callTable).set({endedAt:new Date,...t?{endedReason:t.reason,seconds:t.seconds??null}:{}}).where((0,l.and)((0,l.eq)(r.callTable.id,e),(0,l.isNull)(r.callTable.endedAt))).returning({id:r.callTable.id})).length>0}async function f(e,t){for(let a of t)await i.database.insert(r.callMessageTable).values({callId:e,...a,fragments:a.fragments??null}).onConflictDoUpdate({target:[r.callMessageTable.callId,r.callMessageTable.id],set:{text:a.text,role:a.role,tool:a.tool??null,fragments:a.fragments??null}})}async function b(e){let[t]=await i.database.select({seq:n.sql`max(${r.callMessageTable.seq})`}).from(r.callMessageTable).where((0,l.eq)(r.callMessageTable.callId,e));return t?.seq==null?0:Number(t.seq)+1}async function h(e,t){await i.database.insert(r.callThoughtTable).values({callId:e,...t}).onConflictDoNothing()}async function _(e){let t=await i.database.select({callId:r.callMessageTable.callId,startedAt:r.callTable.startedAt,role:r.callMessageTable.role,tool:r.callMessageTable.tool,text:r.callMessageTable.text,seq:r.callMessageTable.seq}).from(r.callMessageTable).innerJoin(r.callTable,(0,l.eq)(r.callMessageTable.callId,r.callTable.id)).orderBy((0,s.desc)(r.callTable.startedAt),(0,s.desc)(r.callMessageTable.seq)).limit(e),a=new Map;for(let e of t){let t=a.get(e.callId)??{callId:e.callId,startedAt:e.startedAt,turns:[]};t.turns.push({role:e.role,tool:e.tool,text:e.text,seq:e.seq}),a.set(e.callId,t)}return[...a.values()].reverse().map(e=>({...e,turns:e.turns.reverse()}))}async function p(e,t,a){let[o]=await i.database.select({startedAt:r.callTable.startedAt}).from(r.callTable).where((0,l.eq)(r.callTable.id,e));if(!o)return null;let[c]=await i.database.select({total:n.sql`count(*)`}).from(r.callMessageTable).where((0,l.eq)(r.callMessageTable.callId,e)),d=await i.database.select({role:r.callMessageTable.role,tool:r.callMessageTable.tool,text:r.callMessageTable.text}).from(r.callMessageTable).where((0,l.eq)(r.callMessageTable.callId,e)).orderBy((0,s.asc)(r.callMessageTable.seq)).limit(a).offset((t-1)*a);return{startedAt:o.startedAt,total:Number(c?.total??0),turns:d}}async function g(){return(await i.database.select({id:r.callTable.id}).from(r.callTable).where((0,l.isNull)(r.callTable.endedAt)).limit(1)).length>0}async function y(e){return(await i.database.select({id:r.callTable.id}).from(r.callTable).where((0,l.and)((0,l.eq)(r.callTable.id,e),(0,l.isNull)(r.callTable.endedAt))).limit(1)).length>0}async function O(){await i.database.update(r.callTable).set({endedAt:new Date}).where((0,l.isNull)(r.callTable.endedAt))}[i,o,c]=u.then?(await u)():u,e.s(["endCall",0,E,"insertCall",0,T,"isAnyCallLive",0,g,"isCallOpen",0,y,"listRecentTurns",0,_,"nextTurnSeq",0,b,"readCallConversation",0,p,"readCallSkillsOn",0,m,"saveThought",0,h,"saveTurns",0,f,"sweepCalls",0,O]),a()}catch(e){a(e)}},!1),933395,e=>{"use strict";var t=e.i(517435),a=e.i(333925),l=e.i(247839),s=e.i(864328),n=e.i(556325);let i=l.LiveSettingsSchema.extend({locale:t.default.string().max(35).nullish()}),r=[{id:"chatgpt",...s.TEXT_MODEL_PROVIDERS.chatgpt},{id:"openai",...s.TEXT_MODEL_PROVIDERS.openai}];t.default.object({charset:t.default.enum(["ascii","emoji","emojiOnly"]).default(a.ASCII_FACE.charset),fontSize:t.default.number().min(a.ASCII_FACE.fontSize.min).max(a.ASCII_FACE.fontSize.max).default(a.ASCII_FACE.fontSize.default),density:t.default.number().min(a.ASCII_FACE.density.min).max(a.ASCII_FACE.density.max).default(a.ASCII_FACE.density.default)}).parse({});t.default.object({enabled:t.default.boolean(),phrase:t.default.string().trim().min(3).max(32)}),t.default.object({enabled:t.default.boolean(),combo:t.default.string().trim().min(1).max(64)}),t.default.enum(["off","waiting","any"]),t.default.enum(["center","sides"]),t.default.object({id:t.default.string().min(1),role:t.default.enum(["user","assistant","tool"]),tool:t.default.string().nullish(),text:t.default.string(),seq:t.default.number().int().min(0),fragments:t.default.array(n.LiveFragmentSchema).nullish()}),t.default.object({id:t.default.string().min(1),text:t.default.string(),seq:t.default.number().int().min(0)}),e.s(["TEXT_CALL_PROVIDERS",0,r,"THURSDAY_KEYS",0,{skills:"THURSDAY_SKILLS"},"ThursdaySettingsSchema",0,i,"isSkillsOn",0,e=>e?.trim()==="on","textCallRunsOn",0,e=>r.find(t=>e(t.apiKeyName))?.id??null],933395)},556325,e=>{"use strict";var t=e.i(853205);let a=t.z.object({start:t.z.number().nonnegative(),end:t.z.number().nonnegative(),text:t.z.string()});t.z.object({reason:t.z.string().max(128),seconds:t.z.number().nonnegative().nullable()}),e.s(["LIVE_BACKEND_MODEL",0,"gpt-5.6-luna","LiveFragmentSchema",0,a])}];
3
+ `),f=e=>{let a=t.coalesce?.keyOf(e)??null;if(null===a)return E(e);let l=u.get(a);l&&clearTimeout(l),u.set(a,setTimeout(()=>{u.delete(a),E(e)},t.coalesce?.ms))},b=e.subscribe(e=>m?m.push(e):f(e)),p=setInterval(()=>T(": ping\n\n"),l);s+=1,t.onWatchers?.(s),r=()=>{if(!d){for(let e of(d=!0,s-=1,t.onWatchers?.(s),b(),clearInterval(p),u.values()))clearTimeout(e);try{o.close()}catch{}}},n.addEventListener("abort",r);try{for(let e of await i?.()??[])E(e)}catch(e){c.logger.error("event stream opening failed",e),r();return}let h=m;for(let e of(m=null,h))f(e)},cancel(){r()}}),{headers:{"Content-Type":"text/event-stream; charset=utf-8","Cache-Control":"no-store","X-Accel-Buffering":"no"}})},get watchers(){return s}}}(m,{coalesce:{ms:150,keyOf:e=>e.type in d?e.type:null},onWatchers:T.track}),u.__bootId??=crypto.randomUUID(),e.s(["appEvents",0,m,"presence",0,T],232347)},333925,e=>{"use strict";let t=process.env.THURSDAY_APP_DIR?.trim()||process.cwd(),a=process.env.THURSDAY_HOME?.trim()||process.cwd(),l=process.env.THURSDAY_URL?.trim()||`http://localhost:${process.env.PORT?.trim()||3e3}`,s=`file:${a}/local.db`,n=".ai-workspace",i={workspace:n,artifacts:"artifacts",projects:"projects",scratch:"scratch",bots:"bots",output:".output",signIns:".sign-ins",skills:{default:"skills",custom:`${n}/.agents/skills`,own:".agents/skills",seeds:"seed-skills"}};e.s(["APP_DIR",0,t,"APP_NAME",0,"Thursday","APP_URL",0,l,"ASCII_FACE",0,{charset:"emojiOnly",fontSize:{default:8,min:4,max:16},density:{default:1.4,min:.6,max:2}},"BOT_MEMORY_LIMITS",0,{files:20,chars:1e4},"BOT_RUN",0,{steps:100,compactAt:5e5,compactHeadroom:.8,summaryWords:{min:600,max:3e3,perTokens:200},participants:12,concurrent:4,turns:120,queuedMessages:200,silenceMs:3e5,overflowShrink:.6,retryMs:1e4,compactFiles:40},"BOT_WORK",0,{open:5,recent:5,said:80,files:2,reads:2,asked:400,readChars:4e3},"BROWSER_GONE_MS",0,1e4,"BROWSER_VIEWPORT",0,"700x700","CALL_EXEC_TIMEOUT_MS",0,15e3,"CALL_RELAY",0,{quietMs:7e3,perTurn:3,readMs:15e3,chars:600},"CHATGPT_SIGN_IN",0,{waitMs:6e5,renewBeforeMs:3e5},"CONNECTED_TOOL_TIMEOUT_MS",0,6e5,"DATA_DIR",0,a,"DB_FILE_NAME",0,s,"EXEC_KILL_GRACE_MS",0,5e3,"EXEC_TIMEOUT_MS",0,18e4,"FINISHED_NOTICE",0,{rows:5,words:240},"GIVEN_FILES",0,{dir:"inbox",maxBytes:0x1900000,perMessage:8},"INBOX_FINISHED",0,5,"IS_DEV",0,!1,"LIVE_CALL",0,{startupMs:3e4,closeMs:15e3,transcriptGapMs:1500,transcriptSaveMs:500,appendMs:15e3,backendOutputTokens:4096,reasoningCheckMs:5e3,keyCheckMs:5e3},"LOOK",0,{maxBytes:4194304},"MEMORY_CONVERSATION_PAGE",0,100,"MEMORY_LIMITS",0,{facts:400,factsPerNote:50,carried:20,expanded:10},"PATHS",0,i,"PROMPT_BUDGET",0,6e3,"PROMPT_LINE",0,{skill:90,toolArgs:30,jobOutcome:160,botMemory:100},"REACH",0,{pollSeconds:50,retryMs:5e3,idleMs:6e5,notifyAfterMs:6e4,chars:3500,files:3,fileBytes:0x2d00000},"RECENT_CALL",0,{rows:20,tokens:600},"ROUTINE",0,{tickMs:3e4,max:12,minHours:1,runsShown:5},"SEARCH",0,{sources:3,excerptChars:1200,timeoutMs:3e4},"STUDIO_SERVER",0,"studio","TEXT_CALL",0,{maxSteps:12,model:"text"},"THREAD_STATUS_LIMIT",0,10,"TOOL_OUTPUT",0,{max:8e3,head:5500,tail:1500},"WORKSPACE_KEEP",0,{forMs:2592e5,sweepEveryMs:36e5}])},247839,e=>{"use strict";var t=e.i(853205),a=e.i(986129),l=e.i(556325),s=e.i(864328);let n={id:"openai",label:"OpenAI",apiKeyName:s.TEXT_MODEL_PROVIDERS.openai.apiKeyName};s.TEXT_MODEL_PROVIDERS.openai.suggestModels;let i=t.z.string().max(a.COMMON_VALIDATE.prompt.max).default(""),r=t.z.object({voice:t.z.string().trim().min(1).max(128).default("marin"),voicePrompt:i,backendModel:t.z.string().trim().min(1).max(128).default(l.LIVE_BACKEND_MODEL),backendPrompt:i,reasoningEffort:t.z.enum(["none","minimal","low","medium","high","xhigh"]).nullable().default("low"),webSearch:t.z.boolean().default(!0)});r.parse({}),e.s(["LIVE_PROVIDER",0,n,"LiveSettingsSchema",0,r])},656719,e=>{"use strict";var t=e.i(247839),a=e.i(864328),l=e.i(735186);let s=[t.LIVE_PROVIDER.apiKeyName],n={image:"IMAGE_MODEL",video:"VIDEO_MODEL",speech:"SPEECH_MODEL",transcription:"TRANSCRIPTION_MODEL"},i={image:{label:"Image model",hint:"What bots draw with"},video:{label:"Video model",hint:"What bots film with — minutes a clip"},speech:{label:"Speech model",hint:"What reads text aloud into a file"},transcription:{label:"Transcription model",hint:"What turns a recording into text"}},r="EXA_API_KEY",o="DEFAULT_MODEL",c={key:o,label:"Default model",hint:"What a bot thinks with until it picks its own",text:!0,choices:a.TEXT_MODEL_PROVIDER_LIST.flatMap(e=>e.suggestModels.map(t=>({value:`${e.id}/${t.id}`,label:`${e.label} \xb7 ${t.label}`,needs:e.apiKeyName})))},d=e=>s.includes(e.apiKeyName),u=e=>!!e.signIn||"vercel-ai-gateway"===e.id,m=e=>({key:e.apiKeyName,label:e.label,provider:e.id,signIn:e.signIn,keysAt:e.keysAt,keyLooks:e.keyLooks}),T=[{id:"voice",title:"voice",hint:"calls run on this key",section:"keys",require:"any",note:"required for calls",entries:a.TEXT_MODEL_PROVIDER_LIST.filter(d).map(m)},{id:"easy",title:"the easy ways",hint:"one sign-in or one key opens every bot",section:"keys",require:"none",entries:a.TEXT_MODEL_PROVIDER_LIST.filter(u).map(e=>({...m(e),..."vercel-ai-gateway"===e.id&&{recommended:!0}}))},{id:"text",title:"or a provider's own key",hint:"what bots think with — add any, or none",section:"keys",require:"none",entries:a.TEXT_MODEL_PROVIDER_LIST.filter(e=>!d(e)&&!u(e)).map(m)},{id:"search",title:"search",hint:"how calls and bots look things up — one key, or their own model's",section:"keys",require:"none",entries:[{key:r,label:"Exa",hint:"web search in one call — dashboard.exa.ai",site:"exa.ai",keysAt:"https://dashboard.exa.ai/api-keys"}]},{id:"phone",title:"phone",hint:"write to Thursday from a chat app — nothing is opened to the outside",section:"keys",require:"none",entries:[{key:l.TELEGRAM_TOKEN_KEY,label:"Telegram",site:"telegram.org",hint:"a bot token from @BotFather — then write to your bot, and allow it here"},{key:l.DISCORD_TOKEN_KEY,label:"Discord",site:"discord.com",hint:"a bot token from discord.com/developers — add the bot to a server of yours, then write to it directly"},{key:l.SLACK_APP_TOKEN_KEY,label:"Slack · app token",site:"slack.com",hint:"starts with xapp- — opens the connection. Slack takes this and the bot token"},{key:l.SLACK_BOT_TOKEN_KEY,label:"Slack · bot token",site:"slack.com",hint:"starts with xoxb- — speaks as the app"}]},{id:"bots",title:"Bots",hint:"what a bot runs on when it has not picked its own — start small: a small model is quick and costs little",section:"models",require:"none",entries:[c]},{id:"studio",title:"Studio",hint:"what a bot draws, films and speaks with — off until you pick one",section:"models",require:"none",entries:Object.keys(n).map(e=>({key:n[e],...i[e],kind:e,choices:a.MEDIA_MODEL_PROVIDER_LIST.flatMap(t=>t.models[e].map(e=>({value:`${t.id}/${e.id}`,label:`${t.label} \xb7 ${e.label}`,needs:t.apiKeyName})))}))}];Object.fromEntries(T.flatMap(e=>e.entries).map(e=>[e.key,e])),T.flatMap(e=>e.entries.map(e=>e.key)),Object.fromEntries(T.flatMap(e=>e.entries).filter(e=>e.choices?.length).map(e=>[e.key,e.choices])),e.s(["DEFAULT_MODEL_KEY",0,o,"EXA_API_KEY",0,r,"MEDIA_MODEL_KEYS",0,n])},724185,e=>e.a(async(t,a)=>{try{var l=e.i(336763),s=e.i(876393),n=e.i(220376);e.i(656719);var i=t([s]);async function r(e){let t=process.env[e]?.trim();if(t)return t;let[a]=await s.database.select({value:n.configTable.value}).from(n.configTable).where((0,l.eq)(n.configTable.key,e));return a?.value.trim()||void 0}async function o(e,t){await s.database.insert(n.configTable).values({key:e,value:t}).onConflictDoUpdate({target:n.configTable.key,set:{value:t}})}async function c(e){await s.database.delete(n.configTable).where((0,l.eq)(n.configTable.key,e))}[s]=i.then?(await i)():i,e.s(["readConfig",0,r,"removeConfig",0,c,"writeConfig",0,o]),a()}catch(e){a(e)}},!1),735186,e=>{"use strict";let t="TELEGRAM_BOT_TOKEN",a="DISCORD_BOT_TOKEN",l="SLACK_APP_TOKEN",s="SLACK_BOT_TOKEN";e.s(["DISCORD_TOKEN_KEY",0,a,"REACH_CHANNELS",0,["telegram","discord","slack"],"REACH_KEYS",0,{telegram:[t],discord:[a],slack:[l,s]},"SLACK_APP_TOKEN_KEY",0,l,"SLACK_BOT_TOKEN_KEY",0,s,"TELEGRAM_TOKEN_KEY",0,t,"reachPersonKey",0,e=>`REACH_PERSON_${e.toUpperCase()}`])},520401,e=>e.a(async(t,a)=>{try{var l=e.i(336763),s=e.i(396918),n=e.i(533102);e.i(333925);var i=e.i(876393),r=e.i(220376),o=e.i(5509),c=e.i(724185),d=e.i(933395),u=t([i,o,c]);async function m(){return(0,d.isSkillsOn)(await (0,c.readConfig)(d.THURSDAY_KEYS.skills))}async function T(e){let[t]=await i.database.insert(r.callTable).values({id:crypto.randomUUID(),...e}).returning({id:r.callTable.id});return t.id}async function E(e,t){return(await i.database.update(r.callTable).set({endedAt:new Date,...t?{endedReason:t.reason,seconds:t.seconds??null}:{}}).where((0,l.and)((0,l.eq)(r.callTable.id,e),(0,l.isNull)(r.callTable.endedAt))).returning({id:r.callTable.id})).length>0}async function f(e,t){for(let a of t)await i.database.insert(r.callMessageTable).values({callId:e,...a,fragments:a.fragments??null}).onConflictDoUpdate({target:[r.callMessageTable.callId,r.callMessageTable.id],set:{text:a.text,role:a.role,tool:a.tool??null,fragments:a.fragments??null}})}async function b(e){let[t]=await i.database.select({seq:n.sql`max(${r.callMessageTable.seq})`}).from(r.callMessageTable).where((0,l.eq)(r.callMessageTable.callId,e));return t?.seq==null?0:Number(t.seq)+1}async function p(e,t){await i.database.insert(r.callThoughtTable).values({callId:e,...t}).onConflictDoNothing()}async function h(e){let t=await i.database.select({callId:r.callMessageTable.callId,startedAt:r.callTable.startedAt,role:r.callMessageTable.role,tool:r.callMessageTable.tool,text:r.callMessageTable.text,seq:r.callMessageTable.seq}).from(r.callMessageTable).innerJoin(r.callTable,(0,l.eq)(r.callMessageTable.callId,r.callTable.id)).orderBy((0,s.desc)(r.callTable.startedAt),(0,s.desc)(r.callMessageTable.seq)).limit(e),a=new Map;for(let e of t){let t=a.get(e.callId)??{callId:e.callId,startedAt:e.startedAt,turns:[]};t.turns.push({role:e.role,tool:e.tool,text:e.text,seq:e.seq}),a.set(e.callId,t)}return[...a.values()].reverse().map(e=>({...e,turns:e.turns.reverse()}))}async function _(e,t,a){let[o]=await i.database.select({startedAt:r.callTable.startedAt}).from(r.callTable).where((0,l.eq)(r.callTable.id,e));if(!o)return null;let[c]=await i.database.select({total:n.sql`count(*)`}).from(r.callMessageTable).where((0,l.eq)(r.callMessageTable.callId,e)),d=await i.database.select({role:r.callMessageTable.role,tool:r.callMessageTable.tool,text:r.callMessageTable.text}).from(r.callMessageTable).where((0,l.eq)(r.callMessageTable.callId,e)).orderBy((0,s.asc)(r.callMessageTable.seq)).limit(a).offset((t-1)*a);return{startedAt:o.startedAt,total:Number(c?.total??0),turns:d}}async function g(){return(await i.database.select({id:r.callTable.id}).from(r.callTable).where((0,l.isNull)(r.callTable.endedAt)).limit(1)).length>0}async function y(e){return(await i.database.select({id:r.callTable.id}).from(r.callTable).where((0,l.and)((0,l.eq)(r.callTable.id,e),(0,l.isNull)(r.callTable.endedAt))).limit(1)).length>0}async function O(){await i.database.update(r.callTable).set({endedAt:new Date}).where((0,l.isNull)(r.callTable.endedAt))}[i,o,c]=u.then?(await u)():u,e.s(["endCall",0,E,"insertCall",0,T,"isAnyCallLive",0,g,"isCallOpen",0,y,"listRecentTurns",0,h,"nextTurnSeq",0,b,"readCallConversation",0,_,"readCallSkillsOn",0,m,"saveThought",0,p,"saveTurns",0,f,"sweepCalls",0,O]),a()}catch(e){a(e)}},!1),933395,e=>{"use strict";var t=e.i(517435),a=e.i(333925),l=e.i(864328),s=e.i(556325);let n=[{id:"chatgpt",...l.TEXT_MODEL_PROVIDERS.chatgpt},{id:"openai",...l.TEXT_MODEL_PROVIDERS.openai}];t.default.object({charset:t.default.enum(["ascii","emoji","emojiOnly"]).default(a.ASCII_FACE.charset),fontSize:t.default.number().min(a.ASCII_FACE.fontSize.min).max(a.ASCII_FACE.fontSize.max).default(a.ASCII_FACE.fontSize.default),density:t.default.number().min(a.ASCII_FACE.density.min).max(a.ASCII_FACE.density.max).default(a.ASCII_FACE.density.default)}).parse({});t.default.object({enabled:t.default.boolean(),phrase:t.default.string().trim().min(3).max(32)}),t.default.object({enabled:t.default.boolean(),combo:t.default.string().trim().min(1).max(64)}),t.default.enum(["off","waiting","any"]),t.default.enum(["center","sides"]),t.default.object({id:t.default.string().min(1),role:t.default.enum(["user","assistant","tool"]),tool:t.default.string().nullish(),text:t.default.string(),seq:t.default.number().int().min(0),fragments:t.default.array(s.LiveFragmentSchema).nullish()}),t.default.object({id:t.default.string().min(1),text:t.default.string(),seq:t.default.number().int().min(0)}),e.s(["TEXT_CALL_PROVIDERS",0,n,"THURSDAY_KEYS",0,{skills:"THURSDAY_SKILLS"},"isSkillsOn",0,e=>e?.trim()==="on","textCallRunsOn",0,e=>n.find(t=>e(t.apiKeyName))?.id??null],933395)},556325,e=>{"use strict";var t=e.i(853205);let a=t.z.object({start:t.z.number().nonnegative(),end:t.z.number().nonnegative(),text:t.z.string()});t.z.object({reason:t.z.string().max(128),seconds:t.z.number().nonnegative().nullable()}),e.s(["LIVE_BACKEND_MODEL",0,"gpt-5.6-luna","LiveFragmentSchema",0,a])}];
4
4
 
5
5
  //# sourceMappingURL=%5Broot-of-the-server%5D__12iddfq._.js.map
@@ -1,8 +1,8 @@
1
- module.exports=[874533,(e,t,a)=>{t.exports=e.x("node:child_process",()=>require("node:child_process"))},666680,(e,t,a)=>{t.exports=e.x("node:crypto",()=>require("node:crypto"))},912714,(e,t,a)=>{t.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},660526,(e,t,a)=>{t.exports=e.x("node:os",()=>require("node:os"))},265143,e=>e.a(async(t,a)=>{try{var r=e.i(875225),o=e.i(518899),i=e.i(528790),n=e.i(613240),s=e.i(340698);e.i(786025);var l=e.i(944971),c=t([i,s]);[i,s]=c.then?(await c)():c;let T=e=>({name:e.name,description:e.description,systemPrompt:e.systemPrompt,icon:e.icon,provider:e.provider,model:e.model,disabled:e.disabled,compactAt:e.compactAt});async function u(){let e=await i.database.select().from(n.botTable).orderBy(n.botTable.createdAt);return e.length?e.filter(e=>!e.disabled).map(T):[l.DEFAULT_BOT]}async function d(e){let t=await f(e);if(t)return T(t);let a=e.trim().toLowerCase(),[s]=await i.database.select().from(n.botTable).where((0,r.eq)(o.sql`lower(${n.botTable.name})`,a));return s?T(s):l.DEFAULT_BOT.name.toLowerCase()===a?l.DEFAULT_BOT:null}async function m(){let[e,t,a]=await Promise.all([i.database.select().from(n.botTable).orderBy(n.botTable.createdAt),i.database.select({botName:n.botMcpToolTable.botName,id:n.mcpToolTable.id,name:n.mcpToolTable.name,serverName:n.mcpToolTable.serverName}).from(n.botMcpToolTable).innerJoin(n.mcpToolTable,(0,r.eq)(n.botMcpToolTable.toolId,n.mcpToolTable.id)),i.database.select({bot:n.threadTable.bot,input:o.sql`coalesce(sum(${n.threadTable.inputTokens}), 0)`,output:o.sql`coalesce(sum(${n.threadTable.outputTokens}), 0)`,lastJobAt:o.sql`max(${n.threadTable.updatedAt})`}).from(n.threadTable).groupBy(n.threadTable.bot)]),s=new Map;for(let{botName:e,...a}of t){let t=s.get(e)??[];t.push(a),s.set(e,t)}let l=new Map(a.map(e=>[e.bot,{input:Number(e.input),output:Number(e.output)}])),c=new Map(a.flatMap(e=>null==e.lastJobAt?[]:[[e.bot,new Date(1e3*Number(e.lastJobAt))]]));return e.map(e=>({...e,tools:s.get(e.name)??[],tokens:l.get(e.name)??{input:0,output:0},lastJobAt:c.get(e.name)??null}))}async function p(){return(0,l.isBotMemoryOn)(await (0,s.readConfig)(l.BOT_MEMORY_KEY))}async function h(){return(0,l.isKeepWorkingOn)(await (0,s.readConfig)(l.KEEP_WORKING_KEY))}async function f(e){let[t]=await i.database.select().from(n.botTable).where((0,r.eq)(n.botTable.name,e));return t??null}async function w(){let e=await i.database.select({name:n.botTable.name}).from(n.botTable);return[...new Set([...e.map(e=>e.name),l.DEFAULT_BOT.name])]}e.s(["findAllBots",0,m,"findJobBot",0,d,"listBotNames",0,w,"listJobBots",0,u,"readBotMemoryOn",0,p,"readKeepWorkingOn",0,h]),a()}catch(e){a(e)}},!1),786025,e=>{"use strict";var t=e.i(666680),a=e.i(902157),r=e.i(912714),o=e.i(660526),i=e.i(750227),n=e.i(687388),s=e.i(640911),l=e.i(874533),c=n;let u=new Set(["node_modules",".git",".next","dist","build",".venv","__pycache__",".turbo","coverage"]);async function*d(e){let t;try{t=await (0,r.readdir)(e,{withFileTypes:!0})}catch{return}for(let a of t){if(u.has(a.name)||a.name.startsWith("."))continue;let t=(0,i.join)(e,a.name);a.isDirectory()?yield*d(t):a.isFile()&&(yield t)}}async function m(e,t,a,o){if(e.length<=o.max)return e;let n=(0,i.join)(a,o.dir),s=(0,i.join)(n,`${new Date().toISOString().replace(/[:.]/g,"-")}-${t.replace(/[^a-zA-Z0-9_-]+/g,"_")}.txt`),l=s;try{await (0,r.mkdir)(n,{recursive:!0}),await (0,r.writeFile)(s,e),l=(0,i.relative)(a,s)||s}catch{l="(could not be written to a file)"}let c=(e.match(/\n/g)?.length??0)+1;return`${e.slice(0,o.head).trimEnd()}
1
+ module.exports=[874533,(e,t,a)=>{t.exports=e.x("node:child_process",()=>require("node:child_process"))},666680,(e,t,a)=>{t.exports=e.x("node:crypto",()=>require("node:crypto"))},912714,(e,t,a)=>{t.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},660526,(e,t,a)=>{t.exports=e.x("node:os",()=>require("node:os"))},265143,e=>e.a(async(t,a)=>{try{var r=e.i(875225),o=e.i(518899),i=e.i(528790),n=e.i(613240),s=e.i(340698);e.i(786025);var l=e.i(944971),c=t([i,s]);[i,s]=c.then?(await c)():c;let T=e=>({name:e.name,description:e.description,systemPrompt:e.systemPrompt,icon:e.icon,provider:e.provider,model:e.model,disabled:e.disabled,compactAt:e.compactAt});async function u(){let e=await i.database.select().from(n.botTable).orderBy(n.botTable.createdAt);return e.length?e.filter(e=>!e.disabled).map(T):[l.DEFAULT_BOT]}async function d(e){let t=await h(e);if(t)return T(t);let a=e.trim().toLowerCase(),[s]=await i.database.select().from(n.botTable).where((0,r.eq)(o.sql`lower(${n.botTable.name})`,a));return s?T(s):l.DEFAULT_BOT.name.toLowerCase()===a?l.DEFAULT_BOT:null}async function m(){let[e,t,a]=await Promise.all([i.database.select().from(n.botTable).orderBy(n.botTable.createdAt),i.database.select({botName:n.botMcpToolTable.botName,id:n.mcpToolTable.id,name:n.mcpToolTable.name,serverName:n.mcpToolTable.serverName}).from(n.botMcpToolTable).innerJoin(n.mcpToolTable,(0,r.eq)(n.botMcpToolTable.toolId,n.mcpToolTable.id)),i.database.select({bot:n.threadTable.bot,input:o.sql`coalesce(sum(${n.threadTable.inputTokens}), 0)`,output:o.sql`coalesce(sum(${n.threadTable.outputTokens}), 0)`,lastJobAt:o.sql`max(${n.threadTable.updatedAt})`}).from(n.threadTable).groupBy(n.threadTable.bot)]),s=new Map;for(let{botName:e,...a}of t){let t=s.get(e)??[];t.push(a),s.set(e,t)}let l=new Map(a.map(e=>[e.bot,{input:Number(e.input),output:Number(e.output)}])),c=new Map(a.flatMap(e=>null==e.lastJobAt?[]:[[e.bot,new Date(1e3*Number(e.lastJobAt))]]));return e.map(e=>({...e,tools:s.get(e.name)??[],tokens:l.get(e.name)??{input:0,output:0},lastJobAt:c.get(e.name)??null}))}async function p(){return(0,l.isBotMemoryOn)(await (0,s.readConfig)(l.BOT_MEMORY_KEY))}async function f(){return(0,l.isKeepWorkingOn)(await (0,s.readConfig)(l.KEEP_WORKING_KEY))}async function h(e){let[t]=await i.database.select().from(n.botTable).where((0,r.eq)(n.botTable.name,e));return t??null}async function w(){let e=await i.database.select({name:n.botTable.name}).from(n.botTable);return[...new Set([...e.map(e=>e.name),l.DEFAULT_BOT.name])]}e.s(["findAllBots",0,m,"findJobBot",0,d,"listBotNames",0,w,"listJobBots",0,u,"readBotMemoryOn",0,p,"readKeepWorkingOn",0,f]),a()}catch(e){a(e)}},!1),786025,e=>{"use strict";var t=e.i(666680),a=e.i(902157),r=e.i(912714),o=e.i(660526),i=e.i(750227),n=e.i(687388),s=e.i(640911),l=e.i(874533),c=n;let u=new Set(["node_modules",".git",".next","dist","build",".venv","__pycache__",".turbo","coverage"]);async function*d(e){let t;try{t=await (0,r.readdir)(e,{withFileTypes:!0})}catch{return}for(let a of t){if(u.has(a.name)||a.name.startsWith("."))continue;let t=(0,i.join)(e,a.name);a.isDirectory()?yield*d(t):a.isFile()&&(yield t)}}async function m(e,t,a,o){if(e.length<=o.max)return e;let n=(0,i.join)(a,o.dir),s=(0,i.join)(n,`${new Date().toISOString().replace(/[:.]/g,"-")}-${t.replace(/[^a-zA-Z0-9_-]+/g,"_")}.txt`),l=s;try{await (0,r.mkdir)(n,{recursive:!0}),await (0,r.writeFile)(s,e),l=(0,i.relative)(a,s)||s}catch{l="(could not be written to a file)"}let c=(e.match(/\n/g)?.length??0)+1;return`${e.slice(0,o.head).trimEnd()}
2
2
 
3
3
  [${t} cut at ${o.max.toLocaleString("en")} chars — the whole thing (${c} lines) is at ${l}. Read the part you need with \`sed -n\`.]
4
4
 
5
- ${e.slice(-o.tail).trimStart()}`}let p=n.APP_DIR,h=(0,i.join)(n.DATA_DIR,n.PATHS.workspace),f=(process.env.THURSDAY_TOOL_PATH?.split(":")??[(0,i.join)(p,"node_modules",".bin")]).filter(Boolean),w=(0,i.join)(h,n.PATHS.artifacts),T=[n.PATHS.artifacts,n.PATHS.projects,n.PATHS.scratch,n.PATHS.bots],b=new Set([...T,".agents"]),S=(e,t)=>t===e||t.startsWith(e+i.sep),y=e=>(0,r.realpath)(e).catch(()=>null);async function A(e){let t=await y(h)??h,a=(0,i.resolve)(h,e);if(!S(h,a))return null;let r=a,o=await y(r);for(;null===o&&(0,i.dirname)(r)!==r;)r=(0,i.dirname)(r),o=await y(r);if(null===o)return null;let n=(0,i.relative)(r,a),s=n?(0,i.join)(o,n):o;return S(t,s)?s:null}function g(e,t){let a=t.trim().toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"").slice(0,40)||"job";return`${n.PATHS.scratch}/${a}-${e.slice(0,6)}`}let _=e=>e.replace(/[^\p{L}\p{N}_-]+/gu,"-"),E=e=>`${n.PATHS.bots}/${_(e)}`,P=e=>`${n.PATHS.artifacts}/${_(e)}`;async function $(e){let t=E(e),a=P(e);return await Promise.all([t,a].map(e=>(0,r.mkdir)((0,i.join)(h,e),{recursive:!0}))),{own:t,artifacts:a}}async function v(e,t){let a=g(e,t);return await (0,r.mkdir)((0,i.join)(h,a),{recursive:!0}),a}let O=e=>({PLAYWRIGHT_MCP_BROWSER:"chromium",...e?{PLAYWRIGHT_CLI_SESSION:`thread-${e}`,PLAYWRIGHT_MCP_VIEWPORT_SIZE:n.BROWSER_VIEWPORT}:{}}),H={runtimes:["node","python3","uv","bun","deno"],managers:["pnpm","npm","yarn"]};async function R(e){let t=Object.values(H).flat(),{stdout:a}=await e.exec(t.map(e=>`command -v ${e} >/dev/null 2>&1 && printf '%s ' ${e}`).join("; "),{timeoutMs:1e4}),r=new Set(a.trim().split(/\s+/).filter(Boolean)),o=e=>({found:e.filter(e=>r.has(e)),missing:e.filter(e=>!r.has(e))});return{runtimes:o(H.runtimes),managers:o(H.managers),browser:null}}async function j(){await x(),await M()}async function I(e){await k(e,await C(e,!1))}async function L(e){await C(e,!0)}async function W(e){await k(e,await C(e,!0))}async function k(e,a){let n=process.env.XDG_CACHE_HOME||(0,i.join)((0,o.homedir)(),".cache"),l=await (0,r.realpath)(h).catch(()=>h),c=(0,i.join)(n,"ms-playwright","daemon",(0,t.createHash)("sha1").update(l).digest("hex").slice(0,16)),u=O(e).PLAYWRIGHT_CLI_SESSION;for(let e of(await (0,r.readdir)(c).catch(()=>[]))){let t=e.startsWith("ud-")?e.slice(3):e;(t===u||t.startsWith(`${u}-`)||t.startsWith(`${u}.`))&&(a.some(e=>t===e||t.startsWith(`${e}-`)||t.startsWith(`${e}.`))||await (0,r.rm)((0,i.join)(c,e),{recursive:!0,force:!0}).catch(t=>s.logger.warn(`browser data ${e}: ${String(t)}`)))}}async function C(e,t){let a=await G(),r=O(e),o=await a.exec("playwright-cli list --json",{env:r,timeoutMs:15e3}).catch(()=>null),i=[];try{let{browsers:e}=JSON.parse(o?.stdout??"");i=e?.filter(e=>e.name===r.PLAYWRIGHT_CLI_SESSION||e.name.startsWith(`${r.PLAYWRIGHT_CLI_SESSION}-`))??[]}catch{}let n=[];for(let e of i){if(e.attached||!t&&!1!==e.headed){n.push(e.name);continue}await a.exec("playwright-cli close",{env:{...r,PLAYWRIGHT_CLI_SESSION:e.name},timeoutMs:15e3}).catch(()=>{})}return await j(),n}let M=()=>F(n.PATHS.output),x=()=>F(".playwright-cli");async function F(e){let t=(0,i.join)(h,e),a=await (0,r.readdir)(t,{withFileTypes:!0}).catch(()=>[]),o=Date.now()-n.WORKSPACE_KEEP.forMs;for(let e of a){if(!e.isFile())continue;let a=(0,i.join)(t,e.name),n=await (0,r.stat)(a).catch(()=>null);n&&n.mtimeMs<o&&await (0,r.unlink)(a).catch(()=>{})}}async function B(){return(await (0,r.readdir)((0,i.join)(h,n.PATHS.scratch),{withFileTypes:!0}).catch(()=>[])).filter(e=>e.isDirectory()).map(e=>`${n.PATHS.scratch}/${e.name}`)}async function N(e){let t=Date.now()-n.WORKSPACE_KEEP.forMs,a=[];for(let o of e){let e=(0,i.join)(h,o),n=await (0,r.stat)(e).catch(()=>null);n?.isDirectory()&&!(n.mtimeMs>=t)&&(await (0,r.rm)(e,{recursive:!0,force:!0}).catch(()=>{}),a.push(o))}return a}let D={"pnpm-workspace.yaml":"packages:\n - '**'\n",".npmrc":"recursive-install=false\n"};async function G(){for(let e of[...T,".playwright"])await (0,r.mkdir)((0,i.join)(h,e),{recursive:!0});for(let[e,t]of Object.entries(D))await (0,r.writeFile)((0,i.join)(h,e),t,{flag:"wx"}).catch(()=>{});return(({workingDirectory:e,spill:t,toolPath:a})=>{let o=(0,i.resolve)(e),n=(a??[]).filter(Boolean).join(":"),s=e=>e.startsWith("/")||/^[A-Za-z]:/.test(e)?e:(0,i.resolve)(o,e);return{cwd:o,resolve:s,readFile:(e,t)=>(0,r.readFile)(s(e),t),async writeFile(e,t){let a=s(e);await (0,r.mkdir)((0,i.join)(a,".."),{recursive:!0}),await (0,r.writeFile)(a,t)},readdir:(e,t)=>(0,r.readdir)(s(e),t),fold:(e,a="output")=>m(e,a,o,t),async glob(e,{path:t=".",limit:a=200}={}){let r=s(t),o=RegExp("^"+e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*\//g,"(?:.*/)?").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")+"$"),n=[];for await(let e of d(r)){let t=(0,i.relative)(r,e).split(i.sep).join("/");if((o.test(t)||o.test(e))&&n.push(e),n.length>=a)break}return n},exec:(e,{cwd:a,timeoutMs:r=c.EXEC_TIMEOUT_MS,signal:i,env:u}={})=>new Promise(d=>{let p,h,f=function(){let e={...process.env};for(let t of Object.keys(e))/KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|_AUTH/i.test(t)&&delete e[t];return e.TERM="dumb",e.PAGER="cat",e.GIT_PAGER="cat",e}();n&&(f.PATH=`${f.PATH??""}:${n}`);let w=(0,l.spawn)(e,{shell:!0,cwd:a?s(a):o,env:{...f,...u},detached:!0}),T="",b="";w.stdout?.on("data",e=>T+=e),w.stderr?.on("data",e=>b+=e);let S=e=>{try{w.pid&&process.kill(-w.pid,e)}catch{w.kill(e)}},y=!1,A=async e=>{y||(y=!0,clearTimeout(_),clearTimeout(p),clearTimeout(h),i?.removeEventListener("abort",E),d({...e,stdout:await m(e.stdout,"stdout",o,t),stderr:await m(e.stderr,"stderr",o,t)}))},g=e=>{p||y||(b+=`
6
- [${e}]`,S("SIGTERM"),p=setTimeout(()=>{b+="\n[Killed: it did not exit on SIGTERM]",S("SIGKILL"),h=setTimeout(()=>{w.stdout?.destroy(),w.stderr?.destroy(),A({stdout:T,stderr:b,exitCode:-1})},1e3)},c.EXEC_KILL_GRACE_MS))},_=setTimeout(()=>g(`Timed out after ${r}ms`),r),E=()=>g("Aborted");i?.aborted?E():i?.addEventListener("abort",E,{once:!0}),w.on("close",e=>A({stdout:T,stderr:b,exitCode:e??-1})),w.on("error",e=>A({stdout:T,stderr:b+String(e),exitCode:-1}))})}})({workingDirectory:h,spill:{dir:n.PATHS.output,...n.TOOL_OUTPUT},toolPath:f})}async function K(e,t){let a=e.map(e=>(0,i.resolve)(h,e));if(t){let e=0;for await(let r of d((0,i.join)(h,t)))if(a.push(r),(e+=1)>=500)break}let o=new Map;for(let e of a){let t=await (0,r.stat)(e).catch(()=>null);if(!t?.isFile())continue;let a=(0,i.relative)(h,e);o.set(a&&!a.startsWith("..")?a:e,t.mtimeMs)}return[...o].sort((e,t)=>e[1]-t[1]).map(([e])=>e)}async function Y(e,t){await (0,r.rm)((0,i.join)(h,g(e,t)),{recursive:!0,force:!0}).catch(()=>{})}e.s(["ARTIFACTS",0,w,"WORKSPACE",0,h,"botArtifacts",0,P,"botBrowserSession",0,(e,a)=>`${e}-bot-${(0,t.createHash)("sha256").update(a.trim().toLowerCase()).digest("hex").slice(0,20)}`,"botFolder",0,E,"botFolderName",0,_,"botShellEnv",0,e=>({THURSDAY_ARTIFACTS:P(e)}),"closeHiddenBrowser",0,I,"closeJobShell",0,L,"filesOnDisk",0,K,"insideWorkspace",0,A,"jobScratch",0,g,"jobShellEnv",0,O,"listScratchFolders",0,B,"openBotFolders",0,$,"openJobScratch",0,v,"openWorkspace",0,G,"pruneJobFiles",0,j,"readMachineTools",0,R,"removeJobBrowsers",0,W,"removeJobScratch",0,Y,"removeUnchangedFolders",0,N,"writeRefusal",0,function(e,t){if(S(h,e)){let r=(0,i.relative)(h,e),[o,s]=r.split(i.sep);return o&&b.has(o)?t&&o===n.PATHS.artifacts&&s&&s.toLowerCase()!==_(t).toLowerCase()&&!(0,a.existsSync)((0,i.join)(w,s))?`Not written: ${r} would sit loose at the top of ${n.PATHS.artifacts}/. Your finished work goes in ${P(t)}/.`:null:`Not written: ${r||"the workspace root"} is outside the workspace's folders. Finished work goes under ${t?P(t):n.PATHS.artifacts}/, code under ${n.PATHS.projects}/, your own kit under ${n.PATHS.bots}/, and this job's working material under ${n.PATHS.scratch}/.`}return S(p,e)?`Not written: ${e} is inside the app that is running you, not the user's files. Work in ${h}; outside it, write only where the user pointed you.`:null}],786025)}];
5
+ ${e.slice(-o.tail).trimStart()}`}let p=n.APP_DIR,f=(0,i.join)(n.DATA_DIR,n.PATHS.workspace),h=(process.env.THURSDAY_TOOL_PATH?.split(":")??[(0,i.join)(p,"node_modules",".bin")]).filter(Boolean),w=(0,i.join)(f,n.PATHS.artifacts),T=[n.PATHS.artifacts,n.PATHS.projects,n.PATHS.scratch,n.PATHS.bots],b=new Set([...T,".agents"]),S=(e,t)=>t===e||t.startsWith(e+i.sep),y=e=>(0,r.realpath)(e).catch(()=>null);async function A(e){let t=await y(f)??f,a=(0,i.resolve)(f,e);if(!S(f,a))return null;let r=a,o=await y(r);for(;null===o&&(0,i.dirname)(r)!==r;)r=(0,i.dirname)(r),o=await y(r);if(null===o)return null;let n=(0,i.relative)(r,a),s=n?(0,i.join)(o,n):o;return S(t,s)?s:null}function g(e,t){let a=t.trim().toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"").slice(0,40)||"job";return`${n.PATHS.scratch}/${a}-${e.slice(0,6)}`}let P=e=>e.replace(/[^\p{L}\p{N}_-]+/gu,"-"),_=e=>`${n.PATHS.bots}/${P(e)}`,E=e=>`${n.PATHS.artifacts}/${P(e)}`;async function $(e){let t=_(e),a=E(e);return await Promise.all([t,a].map(e=>(0,r.mkdir)((0,i.join)(f,e),{recursive:!0}))),{own:t,artifacts:a}}async function v(e,t){let a=g(e,t);return await (0,r.mkdir)((0,i.join)(f,a),{recursive:!0}),a}let H=e=>({PLAYWRIGHT_MCP_BROWSER:"chromium",...e?{PLAYWRIGHT_CLI_SESSION:`thread-${e}`,PLAYWRIGHT_MCP_VIEWPORT_SIZE:n.BROWSER_VIEWPORT}:{}}),O={runtimes:["node","python3","uv","bun","deno"],managers:["pnpm","npm","yarn"]};async function R(e){let t=Object.values(O).flat(),{stdout:a}=await e.exec(t.map(e=>`command -v ${e} >/dev/null 2>&1 && printf '%s ' ${e}`).join("; "),{timeoutMs:1e4}),r=new Set(a.trim().split(/\s+/).filter(Boolean)),o=e=>({found:e.filter(e=>r.has(e)),missing:e.filter(e=>!r.has(e))});return{runtimes:o(O.runtimes),managers:o(O.managers),browser:null}}async function I(){await x(),await M()}async function j(e){await W(e,await C(e,!1))}async function L(e){await C(e,!0)}async function k(e){await W(e,await C(e,!0))}async function W(e,a){let n=process.env.XDG_CACHE_HOME||(0,i.join)((0,o.homedir)(),".cache"),l=await (0,r.realpath)(f).catch(()=>f),c=(0,i.join)(n,"ms-playwright","daemon",(0,t.createHash)("sha1").update(l).digest("hex").slice(0,16)),u=H(e).PLAYWRIGHT_CLI_SESSION;for(let e of(await (0,r.readdir)(c).catch(()=>[]))){let t=e.startsWith("ud-")?e.slice(3):e;(t===u||t.startsWith(`${u}-`)||t.startsWith(`${u}.`))&&(a.some(e=>t===e||t.startsWith(`${e}-`)||t.startsWith(`${e}.`))||await (0,r.rm)((0,i.join)(c,e),{recursive:!0,force:!0}).catch(t=>s.logger.warn(`browser data ${e}: ${String(t)}`)))}}async function C(e,t){let a=await K(),r=H(e),o=await a.exec("playwright-cli list --json",{env:r,timeoutMs:15e3}).catch(()=>null),i=[];try{let{browsers:e}=JSON.parse(o?.stdout??"");i=e?.filter(e=>e.name===r.PLAYWRIGHT_CLI_SESSION||e.name.startsWith(`${r.PLAYWRIGHT_CLI_SESSION}-`))??[]}catch{}let n=[];for(let e of i){if(e.attached||!t&&!1!==e.headed){n.push(e.name);continue}await a.exec("playwright-cli close",{env:{...r,PLAYWRIGHT_CLI_SESSION:e.name},timeoutMs:15e3}).catch(()=>{})}return await I(),n}let M=()=>F(n.PATHS.output),x=()=>F(".playwright-cli");async function F(e){let t=(0,i.join)(f,e),a=await (0,r.readdir)(t,{withFileTypes:!0}).catch(()=>[]),o=Date.now()-n.WORKSPACE_KEEP.forMs;for(let e of a){if(!e.isFile())continue;let a=(0,i.join)(t,e.name),n=await (0,r.stat)(a).catch(()=>null);n&&n.mtimeMs<o&&await (0,r.unlink)(a).catch(()=>{})}}async function B(){return(await (0,r.readdir)((0,i.join)(f,n.PATHS.scratch),{withFileTypes:!0}).catch(()=>[])).filter(e=>e.isDirectory()).map(e=>`${n.PATHS.scratch}/${e.name}`)}async function D(e){let t=Date.now()-n.WORKSPACE_KEEP.forMs,a=[];for(let o of e){let e=(0,i.join)(f,o),n=await (0,r.stat)(e).catch(()=>null);n?.isDirectory()&&!(n.mtimeMs>=t)&&(await (0,r.rm)(e,{recursive:!0,force:!0}).catch(()=>{}),a.push(o))}return a}let N={"pnpm-workspace.yaml":"packages:\n - '**'\n",".npmrc":"recursive-install=false\n"};async function K(){for(let e of[...T,".playwright"])await (0,r.mkdir)((0,i.join)(f,e),{recursive:!0});for(let[e,t]of Object.entries(N))await (0,r.writeFile)((0,i.join)(f,e),t,{flag:"wx"}).catch(()=>{});return(({workingDirectory:e,spill:t,toolPath:a})=>{let o=(0,i.resolve)(e),n=(a??[]).filter(Boolean).join(":"),s=e=>e.startsWith("/")||/^[A-Za-z]:/.test(e)?e:(0,i.resolve)(o,e);return{cwd:o,resolve:s,readFile:(e,t)=>(0,r.readFile)(s(e),t),async writeFile(e,t){let a=s(e);await (0,r.mkdir)((0,i.join)(a,".."),{recursive:!0}),await (0,r.writeFile)(a,t)},readdir:(e,t)=>(0,r.readdir)(s(e),t),fold:(e,a="output")=>m(e,a,o,t),async glob(e,{path:t=".",limit:a=200}={}){let r=s(t),o=RegExp("^"+e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*\//g,"(?:.*/)?").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")+"$"),n=[];for await(let e of d(r)){let t=(0,i.relative)(r,e).split(i.sep).join("/");if((o.test(t)||o.test(e))&&n.push(e),n.length>=a)break}return n},exec:(e,{cwd:a,timeoutMs:r=c.EXEC_TIMEOUT_MS,signal:i,env:u}={})=>new Promise(d=>{let p,f,h=function(){let e={...process.env};for(let t of Object.keys(e))/KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|_AUTH/i.test(t)&&delete e[t];return e.TERM="dumb",e.PAGER="cat",e.GIT_PAGER="cat",e}();n&&(h.PATH=`${h.PATH??""}:${n}`);let w=(0,l.spawn)(e,{shell:!0,cwd:a?s(a):o,env:{...h,...u},detached:!0}),T="",b="";w.stdout?.on("data",e=>T+=e),w.stderr?.on("data",e=>b+=e);let S=e=>{try{w.pid&&process.kill(-w.pid,e)}catch{w.kill(e)}},y=!1,A=async e=>{y||(y=!0,clearTimeout(P),clearTimeout(p),clearTimeout(f),i?.removeEventListener("abort",_),d({...e,stdout:await m(e.stdout,"stdout",o,t),stderr:await m(e.stderr,"stderr",o,t)}))},g=e=>{p||y||(b+=`
6
+ [${e}]`,S("SIGTERM"),p=setTimeout(()=>{b+="\n[Killed: it did not exit on SIGTERM]",S("SIGKILL"),f=setTimeout(()=>{w.stdout?.destroy(),w.stderr?.destroy(),A({stdout:T,stderr:b,exitCode:-1})},1e3)},c.EXEC_KILL_GRACE_MS))},P=setTimeout(()=>g(`Timed out after ${r}ms`),r),_=()=>g("Aborted");i?.aborted?_():i?.addEventListener("abort",_,{once:!0}),w.on("close",e=>A({stdout:T,stderr:b,exitCode:e??-1})),w.on("error",e=>A({stdout:T,stderr:b+String(e),exitCode:-1}))})}})({workingDirectory:f,spill:{dir:n.PATHS.output,...n.TOOL_OUTPUT},toolPath:h})}async function G(e,t){let a=e.map(e=>(0,i.resolve)(f,e));if(t){let e=0;for await(let r of d((0,i.join)(f,t)))if(a.push(r),(e+=1)>=500)break}let o=new Map;for(let e of a){let t=await (0,r.stat)(e).catch(()=>null);if(!t?.isFile())continue;let a=(0,i.relative)(f,e);o.set(a&&!a.startsWith("..")?a:e,t.mtimeMs)}return[...o].sort((e,t)=>e[1]-t[1]).map(([e])=>e)}async function Y(e,t){await (0,r.rm)((0,i.join)(f,g(e,t)),{recursive:!0,force:!0}).catch(()=>{})}e.s(["ARTIFACTS",0,w,"WORKSPACE",0,f,"botArtifacts",0,E,"botBrowserSession",0,(e,a)=>`${e}-bot-${(0,t.createHash)("sha256").update(a.trim().toLowerCase()).digest("hex").slice(0,20)}`,"botFolder",0,_,"botFolderName",0,P,"botShellEnv",0,e=>({THURSDAY_ARTIFACTS:E(e),THURSDAY_SKILLS:(0,i.join)(n.APP_DIR,n.PATHS.skills.default)}),"closeHiddenBrowser",0,j,"closeJobShell",0,L,"filesOnDisk",0,G,"insideWorkspace",0,A,"jobScratch",0,g,"jobShellEnv",0,H,"listScratchFolders",0,B,"openBotFolders",0,$,"openJobScratch",0,v,"openWorkspace",0,K,"pruneJobFiles",0,I,"readMachineTools",0,R,"removeJobBrowsers",0,k,"removeJobScratch",0,Y,"removeUnchangedFolders",0,D,"writeRefusal",0,function(e,t){if(S(f,e)){let r=(0,i.relative)(f,e),[o,s]=r.split(i.sep);return o&&b.has(o)?t&&o===n.PATHS.artifacts&&s&&s.toLowerCase()!==P(t).toLowerCase()&&!(0,a.existsSync)((0,i.join)(w,s))?`Not written: ${r} would sit loose at the top of ${n.PATHS.artifacts}/. Your finished work goes in ${E(t)}/.`:null:`Not written: ${r||"the workspace root"} is outside the workspace's folders. Finished work goes under ${t?E(t):n.PATHS.artifacts}/, code under ${n.PATHS.projects}/, your own kit under ${n.PATHS.bots}/, and this job's working material under ${n.PATHS.scratch}/.`}return S(p,e)?`Not written: ${e} is inside the app that is running you, not the user's files. Work in ${f}; outside it, write only where the user pointed you.`:null}],786025)}];
7
7
 
8
8
  //# sourceMappingURL=%5Broot-of-the-server%5D__1ai5lme._.js.map
@@ -2,7 +2,7 @@ module.exports=[874533,(e,t,r)=>{t.exports=e.x("node:child_process",()=>require(
2
2
 
3
3
  [${t} cut at ${i.max.toLocaleString("en")} chars — the whole thing (${l} lines) is at ${c}. Read the part you need with \`sed -n\`.]
4
4
 
5
- ${e.slice(-i.tail).trimStart()}`}let h=o.APP_DIR,m=(0,a.join)(o.DATA_DIR,o.PATHS.workspace),w=(process.env.THURSDAY_TOOL_PATH?.split(":")??[(0,a.join)(h,"node_modules",".bin")]).filter(Boolean),f=(0,a.join)(m,o.PATHS.artifacts),S=[o.PATHS.artifacts,o.PATHS.projects,o.PATHS.scratch,o.PATHS.bots],T=new Set([...S,".agents"]),_=(e,t)=>t===e||t.startsWith(e+a.sep),E=e=>(0,s.realpath)(e).catch(()=>null);async function A(e){let t=await E(m)??m,r=(0,a.resolve)(m,e);if(!_(m,r))return null;let s=r,i=await E(s);for(;null===i&&(0,a.dirname)(s)!==s;)s=(0,a.dirname)(s),i=await E(s);if(null===i)return null;let o=(0,a.relative)(s,r),n=o?(0,a.join)(i,o):i;return _(t,n)?n:null}function y(e,t){let r=t.trim().toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"").slice(0,40)||"job";return`${o.PATHS.scratch}/${r}-${e.slice(0,6)}`}let P=e=>`${o.PATHS.bots}/${e.replace(/[^\p{L}\p{N}_-]+/gu,"-")}`,R=e=>`${o.PATHS.artifacts}/${e.replace(/[^\p{L}\p{N}_-]+/gu,"-")}`;async function I(e){let t=P(e),r=R(e);return await Promise.all([t,r].map(e=>(0,s.mkdir)((0,a.join)(m,e),{recursive:!0}))),{own:t,artifacts:r}}async function M(e,t){let r=y(e,t);return await (0,s.mkdir)((0,a.join)(m,r),{recursive:!0}),r}let O=e=>({PLAYWRIGHT_MCP_BROWSER:"chromium",...e?{PLAYWRIGHT_CLI_SESSION:`thread-${e}`,PLAYWRIGHT_MCP_VIEWPORT_SIZE:o.BROWSER_VIEWPORT}:{}}),g=null,L={runtimes:["node","python3","uv","bun","deno"],managers:["pnpm","npm","yarn"]};async function x(e){let t=Object.values(L).flat(),{stdout:r}=await e.exec(t.map(e=>`command -v ${e} >/dev/null 2>&1 && printf '%s ' ${e}`).join("; "),{timeoutMs:1e4}),s=new Set(r.trim().split(/\s+/).filter(Boolean)),i=e=>({found:e.filter(e=>s.has(e)),missing:e.filter(e=>!s.has(e))});return{runtimes:i(L.runtimes),managers:i(L.managers),browser:g}}async function C(){if(process.env.THURSDAY_SKIP_BROWSER)return;let e=await U(),t=await e.exec("playwright-cli install-browser chromium").catch(e=>({exitCode:1,stderr:String(e)}));(g=0===t.exitCode)||n.logger.warn(`no browser — bots cannot open a page until \`playwright-cli install-browser chromium\` succeeds: ${t.stderr.trim().split("\n").at(-1)??""}`)}async function H(){await N(),await W()}async function $(e){await k(e,await j(e,!1))}async function v(e){await j(e,!0)}async function b(e){await k(e,await j(e,!0))}async function k(e,r){let o=process.env.XDG_CACHE_HOME||(0,a.join)((0,i.homedir)(),".cache"),c=await (0,s.realpath)(m).catch(()=>m),l=(0,a.join)(o,"ms-playwright","daemon",(0,t.createHash)("sha1").update(c).digest("hex").slice(0,16)),u=O(e).PLAYWRIGHT_CLI_SESSION;for(let e of(await (0,s.readdir)(l).catch(()=>[]))){let t=e.startsWith("ud-")?e.slice(3):e;(t===u||t.startsWith(`${u}-`)||t.startsWith(`${u}.`))&&(r.some(e=>t===e||t.startsWith(`${e}-`)||t.startsWith(`${e}.`))||await (0,s.rm)((0,a.join)(l,e),{recursive:!0,force:!0}).catch(t=>n.logger.warn(`browser data ${e}: ${String(t)}`)))}}async function j(e,t){let r=await U(),s=O(e),i=await r.exec("playwright-cli list --json",{env:s,timeoutMs:15e3}).catch(()=>null),a=[];try{let{browsers:e}=JSON.parse(i?.stdout??"");a=e?.filter(e=>e.name===s.PLAYWRIGHT_CLI_SESSION||e.name.startsWith(`${s.PLAYWRIGHT_CLI_SESSION}-`))??[]}catch{}let o=[];for(let e of a){if(e.attached||!t&&!1!==e.headed){o.push(e.name);continue}await r.exec("playwright-cli close",{env:{...s,PLAYWRIGHT_CLI_SESSION:e.name},timeoutMs:15e3}).catch(()=>{})}return await H(),o}let W=()=>D(o.PATHS.output),N=()=>D(".playwright-cli");async function D(e){let t=(0,a.join)(m,e),r=await (0,s.readdir)(t,{withFileTypes:!0}).catch(()=>[]),i=Date.now()-o.WORKSPACE_KEEP.forMs;for(let e of r){if(!e.isFile())continue;let r=(0,a.join)(t,e.name),o=await (0,s.stat)(r).catch(()=>null);o&&o.mtimeMs<i&&await (0,s.unlink)(r).catch(()=>{})}}async function F(){return(await (0,s.readdir)((0,a.join)(m,o.PATHS.scratch),{withFileTypes:!0}).catch(()=>[])).filter(e=>e.isDirectory()).map(e=>`${o.PATHS.scratch}/${e.name}`)}async function B(e){let t=Date.now()-o.WORKSPACE_KEEP.forMs,r=[];for(let i of e){let e=(0,a.join)(m,i),o=await (0,s.stat)(e).catch(()=>null);o?.isDirectory()&&!(o.mtimeMs>=t)&&(await (0,s.rm)(e,{recursive:!0,force:!0}).catch(()=>{}),r.push(i))}return r}let G={"pnpm-workspace.yaml":"packages:\n - '**'\n",".npmrc":"recursive-install=false\n"};async function U(){for(let e of[...S,".playwright"])await (0,s.mkdir)((0,a.join)(m,e),{recursive:!0});for(let[e,t]of Object.entries(G))await (0,s.writeFile)((0,a.join)(m,e),t,{flag:"wx"}).catch(()=>{});return(({workingDirectory:e,spill:t,toolPath:r})=>{let i=(0,a.resolve)(e),o=(r??[]).filter(Boolean).join(":"),n=e=>e.startsWith("/")||/^[A-Za-z]:/.test(e)?e:(0,a.resolve)(i,e);return{cwd:i,resolve:n,readFile:(e,t)=>(0,s.readFile)(n(e),t),async writeFile(e,t){let r=n(e);await (0,s.mkdir)((0,a.join)(r,".."),{recursive:!0}),await (0,s.writeFile)(r,t)},readdir:(e,t)=>(0,s.readdir)(n(e),t),fold:(e,r="output")=>p(e,r,i,t),async glob(e,{path:t=".",limit:r=200}={}){let s=n(t),i=RegExp("^"+e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*\//g,"(?:.*/)?").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")+"$"),o=[];for await(let e of d(s)){let t=(0,a.relative)(s,e).split(a.sep).join("/");if((i.test(t)||i.test(e))&&o.push(e),o.length>=r)break}return o},exec:(e,{cwd:r,timeoutMs:s=l.EXEC_TIMEOUT_MS,signal:a,env:u}={})=>new Promise(d=>{let h,m,w=function(){let e={...process.env};for(let t of Object.keys(e))/KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|_AUTH/i.test(t)&&delete e[t];return e.TERM="dumb",e.PAGER="cat",e.GIT_PAGER="cat",e}();o&&(w.PATH=`${w.PATH??""}:${o}`);let f=(0,c.spawn)(e,{shell:!0,cwd:r?n(r):i,env:{...w,...u},detached:!0}),S="",T="";f.stdout?.on("data",e=>S+=e),f.stderr?.on("data",e=>T+=e);let _=e=>{try{f.pid&&process.kill(-f.pid,e)}catch{f.kill(e)}},E=!1,A=async e=>{E||(E=!0,clearTimeout(P),clearTimeout(h),clearTimeout(m),a?.removeEventListener("abort",R),d({...e,stdout:await p(e.stdout,"stdout",i,t),stderr:await p(e.stderr,"stderr",i,t)}))},y=e=>{h||E||(T+=`
6
- [${e}]`,_("SIGTERM"),h=setTimeout(()=>{T+="\n[Killed: it did not exit on SIGTERM]",_("SIGKILL"),m=setTimeout(()=>{f.stdout?.destroy(),f.stderr?.destroy(),A({stdout:S,stderr:T,exitCode:-1})},1e3)},l.EXEC_KILL_GRACE_MS))},P=setTimeout(()=>y(`Timed out after ${s}ms`),s),R=()=>y("Aborted");a?.aborted?R():a?.addEventListener("abort",R,{once:!0}),f.on("close",e=>A({stdout:S,stderr:T,exitCode:e??-1})),f.on("error",e=>A({stdout:S,stderr:T+String(e),exitCode:-1}))})}})({workingDirectory:m,spill:{dir:o.PATHS.output,...o.TOOL_OUTPUT},toolPath:w})}async function Y(e,t){let r=e.map(e=>(0,a.resolve)(m,e));if(t){let e=0;for await(let s of d((0,a.join)(m,t)))if(r.push(s),(e+=1)>=500)break}let i=new Map;for(let e of r){let t=await (0,s.stat)(e).catch(()=>null);if(!t?.isFile())continue;let r=(0,a.relative)(m,e);i.set(r&&!r.startsWith("..")?r:e,t.mtimeMs)}return[...i].sort((e,t)=>e[1]-t[1]).map(([e])=>e)}async function K(e,t){await (0,s.rm)((0,a.join)(m,y(e,t)),{recursive:!0,force:!0}).catch(()=>{})}e.s(["WORKSPACE",0,m,"botArtifacts",0,R,"botBrowserSession",0,(e,r)=>`${e}-bot-${(0,t.createHash)("sha256").update(r.trim().toLowerCase()).digest("hex").slice(0,20)}`,"botFolder",0,P,"botShellEnv",0,e=>({THURSDAY_ARTIFACTS:R(e)}),"closeHiddenBrowser",0,$,"closeJobShell",0,v,"ensureBrowser",0,C,"filesOnDisk",0,Y,"insideWorkspace",0,A,"jobScratch",0,y,"jobShellEnv",0,O,"listScratchFolders",0,F,"openBotFolders",0,I,"openJobScratch",0,M,"openWorkspace",0,U,"pruneJobFiles",0,H,"readMachineTools",0,x,"removeJobBrowsers",0,b,"removeJobScratch",0,K,"removeUnchangedFolders",0,B,"writeRefusal",0,function(e,t){if(_(m,e)){let s=(0,a.relative)(m,e),[i,n]=s.split(a.sep);return i&&T.has(i)?t&&i===o.PATHS.artifacts&&n&&n.toLowerCase()!==t.replace(/[^\p{L}\p{N}_-]+/gu,"-").toLowerCase()&&!(0,r.existsSync)((0,a.join)(f,n))?`Not written: ${s} would sit loose at the top of ${o.PATHS.artifacts}/. Your finished work goes in ${R(t)}/.`:null:`Not written: ${s||"the workspace root"} is outside the workspace's folders. Finished work goes under ${t?R(t):o.PATHS.artifacts}/, code under ${o.PATHS.projects}/, your own kit under ${o.PATHS.bots}/, and this job's working material under ${o.PATHS.scratch}/.`}return _(h,e)?`Not written: ${e} is inside the app that is running you, not the user's files. Work in ${m}; outside it, write only where the user pointed you.`:null}],871096)}];
5
+ ${e.slice(-i.tail).trimStart()}`}let h=o.APP_DIR,m=(0,a.join)(o.DATA_DIR,o.PATHS.workspace),w=(process.env.THURSDAY_TOOL_PATH?.split(":")??[(0,a.join)(h,"node_modules",".bin")]).filter(Boolean),f=(0,a.join)(m,o.PATHS.artifacts),S=[o.PATHS.artifacts,o.PATHS.projects,o.PATHS.scratch,o.PATHS.bots],T=new Set([...S,".agents"]),_=(e,t)=>t===e||t.startsWith(e+a.sep),E=e=>(0,s.realpath)(e).catch(()=>null);async function A(e){let t=await E(m)??m,r=(0,a.resolve)(m,e);if(!_(m,r))return null;let s=r,i=await E(s);for(;null===i&&(0,a.dirname)(s)!==s;)s=(0,a.dirname)(s),i=await E(s);if(null===i)return null;let o=(0,a.relative)(s,r),n=o?(0,a.join)(i,o):i;return _(t,n)?n:null}function y(e,t){let r=t.trim().toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"").slice(0,40)||"job";return`${o.PATHS.scratch}/${r}-${e.slice(0,6)}`}let P=e=>`${o.PATHS.bots}/${e.replace(/[^\p{L}\p{N}_-]+/gu,"-")}`,R=e=>`${o.PATHS.artifacts}/${e.replace(/[^\p{L}\p{N}_-]+/gu,"-")}`;async function I(e){let t=P(e),r=R(e);return await Promise.all([t,r].map(e=>(0,s.mkdir)((0,a.join)(m,e),{recursive:!0}))),{own:t,artifacts:r}}async function M(e,t){let r=y(e,t);return await (0,s.mkdir)((0,a.join)(m,r),{recursive:!0}),r}let O=e=>({PLAYWRIGHT_MCP_BROWSER:"chromium",...e?{PLAYWRIGHT_CLI_SESSION:`thread-${e}`,PLAYWRIGHT_MCP_VIEWPORT_SIZE:o.BROWSER_VIEWPORT}:{}}),g=null,L={runtimes:["node","python3","uv","bun","deno"],managers:["pnpm","npm","yarn"]};async function x(e){let t=Object.values(L).flat(),{stdout:r}=await e.exec(t.map(e=>`command -v ${e} >/dev/null 2>&1 && printf '%s ' ${e}`).join("; "),{timeoutMs:1e4}),s=new Set(r.trim().split(/\s+/).filter(Boolean)),i=e=>({found:e.filter(e=>s.has(e)),missing:e.filter(e=>!s.has(e))});return{runtimes:i(L.runtimes),managers:i(L.managers),browser:g}}async function H(){if(process.env.THURSDAY_SKIP_BROWSER)return;let e=await G(),t=await e.exec("playwright-cli install-browser chromium").catch(e=>({exitCode:1,stderr:String(e)}));(g=0===t.exitCode)||n.logger.warn(`no browser — bots cannot open a page until \`playwright-cli install-browser chromium\` succeeds: ${t.stderr.trim().split("\n").at(-1)??""}`)}async function C(){await D(),await W()}async function $(e){await k(e,await j(e,!1))}async function v(e){await j(e,!0)}async function b(e){await k(e,await j(e,!0))}async function k(e,r){let o=process.env.XDG_CACHE_HOME||(0,a.join)((0,i.homedir)(),".cache"),c=await (0,s.realpath)(m).catch(()=>m),l=(0,a.join)(o,"ms-playwright","daemon",(0,t.createHash)("sha1").update(c).digest("hex").slice(0,16)),u=O(e).PLAYWRIGHT_CLI_SESSION;for(let e of(await (0,s.readdir)(l).catch(()=>[]))){let t=e.startsWith("ud-")?e.slice(3):e;(t===u||t.startsWith(`${u}-`)||t.startsWith(`${u}.`))&&(r.some(e=>t===e||t.startsWith(`${e}-`)||t.startsWith(`${e}.`))||await (0,s.rm)((0,a.join)(l,e),{recursive:!0,force:!0}).catch(t=>n.logger.warn(`browser data ${e}: ${String(t)}`)))}}async function j(e,t){let r=await G(),s=O(e),i=await r.exec("playwright-cli list --json",{env:s,timeoutMs:15e3}).catch(()=>null),a=[];try{let{browsers:e}=JSON.parse(i?.stdout??"");a=e?.filter(e=>e.name===s.PLAYWRIGHT_CLI_SESSION||e.name.startsWith(`${s.PLAYWRIGHT_CLI_SESSION}-`))??[]}catch{}let o=[];for(let e of a){if(e.attached||!t&&!1!==e.headed){o.push(e.name);continue}await r.exec("playwright-cli close",{env:{...s,PLAYWRIGHT_CLI_SESSION:e.name},timeoutMs:15e3}).catch(()=>{})}return await C(),o}let W=()=>N(o.PATHS.output),D=()=>N(".playwright-cli");async function N(e){let t=(0,a.join)(m,e),r=await (0,s.readdir)(t,{withFileTypes:!0}).catch(()=>[]),i=Date.now()-o.WORKSPACE_KEEP.forMs;for(let e of r){if(!e.isFile())continue;let r=(0,a.join)(t,e.name),o=await (0,s.stat)(r).catch(()=>null);o&&o.mtimeMs<i&&await (0,s.unlink)(r).catch(()=>{})}}async function F(){return(await (0,s.readdir)((0,a.join)(m,o.PATHS.scratch),{withFileTypes:!0}).catch(()=>[])).filter(e=>e.isDirectory()).map(e=>`${o.PATHS.scratch}/${e.name}`)}async function U(e){let t=Date.now()-o.WORKSPACE_KEEP.forMs,r=[];for(let i of e){let e=(0,a.join)(m,i),o=await (0,s.stat)(e).catch(()=>null);o?.isDirectory()&&!(o.mtimeMs>=t)&&(await (0,s.rm)(e,{recursive:!0,force:!0}).catch(()=>{}),r.push(i))}return r}let B={"pnpm-workspace.yaml":"packages:\n - '**'\n",".npmrc":"recursive-install=false\n"};async function G(){for(let e of[...S,".playwright"])await (0,s.mkdir)((0,a.join)(m,e),{recursive:!0});for(let[e,t]of Object.entries(B))await (0,s.writeFile)((0,a.join)(m,e),t,{flag:"wx"}).catch(()=>{});return(({workingDirectory:e,spill:t,toolPath:r})=>{let i=(0,a.resolve)(e),o=(r??[]).filter(Boolean).join(":"),n=e=>e.startsWith("/")||/^[A-Za-z]:/.test(e)?e:(0,a.resolve)(i,e);return{cwd:i,resolve:n,readFile:(e,t)=>(0,s.readFile)(n(e),t),async writeFile(e,t){let r=n(e);await (0,s.mkdir)((0,a.join)(r,".."),{recursive:!0}),await (0,s.writeFile)(r,t)},readdir:(e,t)=>(0,s.readdir)(n(e),t),fold:(e,r="output")=>p(e,r,i,t),async glob(e,{path:t=".",limit:r=200}={}){let s=n(t),i=RegExp("^"+e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*\//g,"(?:.*/)?").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")+"$"),o=[];for await(let e of d(s)){let t=(0,a.relative)(s,e).split(a.sep).join("/");if((i.test(t)||i.test(e))&&o.push(e),o.length>=r)break}return o},exec:(e,{cwd:r,timeoutMs:s=l.EXEC_TIMEOUT_MS,signal:a,env:u}={})=>new Promise(d=>{let h,m,w=function(){let e={...process.env};for(let t of Object.keys(e))/KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|_AUTH/i.test(t)&&delete e[t];return e.TERM="dumb",e.PAGER="cat",e.GIT_PAGER="cat",e}();o&&(w.PATH=`${w.PATH??""}:${o}`);let f=(0,c.spawn)(e,{shell:!0,cwd:r?n(r):i,env:{...w,...u},detached:!0}),S="",T="";f.stdout?.on("data",e=>S+=e),f.stderr?.on("data",e=>T+=e);let _=e=>{try{f.pid&&process.kill(-f.pid,e)}catch{f.kill(e)}},E=!1,A=async e=>{E||(E=!0,clearTimeout(P),clearTimeout(h),clearTimeout(m),a?.removeEventListener("abort",R),d({...e,stdout:await p(e.stdout,"stdout",i,t),stderr:await p(e.stderr,"stderr",i,t)}))},y=e=>{h||E||(T+=`
6
+ [${e}]`,_("SIGTERM"),h=setTimeout(()=>{T+="\n[Killed: it did not exit on SIGTERM]",_("SIGKILL"),m=setTimeout(()=>{f.stdout?.destroy(),f.stderr?.destroy(),A({stdout:S,stderr:T,exitCode:-1})},1e3)},l.EXEC_KILL_GRACE_MS))},P=setTimeout(()=>y(`Timed out after ${s}ms`),s),R=()=>y("Aborted");a?.aborted?R():a?.addEventListener("abort",R,{once:!0}),f.on("close",e=>A({stdout:S,stderr:T,exitCode:e??-1})),f.on("error",e=>A({stdout:S,stderr:T+String(e),exitCode:-1}))})}})({workingDirectory:m,spill:{dir:o.PATHS.output,...o.TOOL_OUTPUT},toolPath:w})}async function Y(e,t){let r=e.map(e=>(0,a.resolve)(m,e));if(t){let e=0;for await(let s of d((0,a.join)(m,t)))if(r.push(s),(e+=1)>=500)break}let i=new Map;for(let e of r){let t=await (0,s.stat)(e).catch(()=>null);if(!t?.isFile())continue;let r=(0,a.relative)(m,e);i.set(r&&!r.startsWith("..")?r:e,t.mtimeMs)}return[...i].sort((e,t)=>e[1]-t[1]).map(([e])=>e)}async function K(e,t){await (0,s.rm)((0,a.join)(m,y(e,t)),{recursive:!0,force:!0}).catch(()=>{})}e.s(["WORKSPACE",0,m,"botArtifacts",0,R,"botBrowserSession",0,(e,r)=>`${e}-bot-${(0,t.createHash)("sha256").update(r.trim().toLowerCase()).digest("hex").slice(0,20)}`,"botFolder",0,P,"botShellEnv",0,e=>({THURSDAY_ARTIFACTS:R(e),THURSDAY_SKILLS:(0,a.join)(o.APP_DIR,o.PATHS.skills.default)}),"closeHiddenBrowser",0,$,"closeJobShell",0,v,"ensureBrowser",0,H,"filesOnDisk",0,Y,"insideWorkspace",0,A,"jobScratch",0,y,"jobShellEnv",0,O,"listScratchFolders",0,F,"openBotFolders",0,I,"openJobScratch",0,M,"openWorkspace",0,G,"pruneJobFiles",0,C,"readMachineTools",0,x,"removeJobBrowsers",0,b,"removeJobScratch",0,K,"removeUnchangedFolders",0,U,"writeRefusal",0,function(e,t){if(_(m,e)){let s=(0,a.relative)(m,e),[i,n]=s.split(a.sep);return i&&T.has(i)?t&&i===o.PATHS.artifacts&&n&&n.toLowerCase()!==t.replace(/[^\p{L}\p{N}_-]+/gu,"-").toLowerCase()&&!(0,r.existsSync)((0,a.join)(f,n))?`Not written: ${s} would sit loose at the top of ${o.PATHS.artifacts}/. Your finished work goes in ${R(t)}/.`:null:`Not written: ${s||"the workspace root"} is outside the workspace's folders. Finished work goes under ${t?R(t):o.PATHS.artifacts}/, code under ${o.PATHS.projects}/, your own kit under ${o.PATHS.bots}/, and this job's working material under ${o.PATHS.scratch}/.`}return _(h,e)?`Not written: ${e} is inside the app that is running you, not the user's files. Work in ${m}; outside it, write only where the user pointed you.`:null}],871096)}];
7
7
 
8
8
  //# sourceMappingURL=%5Broot-of-the-server%5D__1cjxw0-._.js.map
@@ -1,3 +1,3 @@
1
1
  module.exports=[500874,(e,s,r)=>{s.exports=e.x("buffer",()=>require("buffer"))},233405,(e,s,r)=>{s.exports=e.x("child_process",()=>require("child_process"))},522734,(e,s,r)=>{s.exports=e.x("fs",()=>require("fs"))},70729,e=>{e.v(e=>Promise.resolve().then(()=>e(666680)))},347299,(e,s,r)=>{s.exports=e.x("node:http",()=>require("node:http"))},136340,(e,s,r)=>{s.exports=e.x("node:timers/promises",()=>require("node:timers/promises"))},446786,(e,s,r)=>{s.exports=e.x("os",()=>require("os"))},814747,(e,s,r)=>{s.exports=e.x("path",()=>require("path"))},605365,(e,s,r)=>{s.exports=e.x("process",()=>require("process"))},522275,e=>{e.v(e=>Promise.resolve().then(()=>e(380690)))},186304,e=>{"use strict";e.i(902157),e.i(912714);var s=e.i(750227),r=e.i(687388);(0,s.join)(r.APP_DIR,"guide");let t=".guide";e.s(["botGuideLine",0,()=>`How ${r.APP_NAME} itself works for the user — its screens and settings — is written under \`${t}/\` here, \`index.md\` first; read it only when the job is about the app.`,"guideLine",0,()=>`How ${r.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 \`${t}/\` 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.`])},814317,e=>{e.v(e=>Promise.resolve().then(()=>e(265143)))},994193,e=>{e.v(e=>Promise.resolve().then(()=>e(39803)))},866938,e=>{e.v(e=>Promise.resolve().then(()=>e(378884)))},628124,e=>{e.v(e=>Promise.resolve().then(()=>e(629668)))},440998,e=>{"use strict";var s=e.i(912714),r=e.i(750227),t=e.i(687388),i=e.i(53748),n=e.i(629668),o=e.i(786025);async function a(e,l=t.WORKSPACE_VIEW.rows){let h=await (0,o.insideWorkspace)(e);h||(0,i.publicError)("Outside the workspace");let u=await (0,s.readdir)(h,{withFileTypes:!0}).catch(()=>null);u||(0,i.publicError)("No such folder");let d=u.filter(e=>e.isDirectory()?(0,n.isListedFolder)(e.name):e.isFile()&&"none"!==(0,n.viewKindOf)(e.name)).sort((e,s)=>Number(e.isFile())-Number(s.isFile())||e.name.localeCompare(s.name)),m=await Promise.all(d.slice(0,l).map(async t=>{let i=e?`${e}/${t.name}`:t.name;if(t.isDirectory())return{kind:"dir",name:t.name,path:i};let o=await (0,s.stat)((0,r.join)(h,t.name)).catch(()=>null);return o?{kind:"file",name:t.name,path:i,bytes:o.size,at:o.mtime,view:(0,n.viewKindOf)(t.name)}:null}));return{path:e,entries:m.filter(e=>null!==e),total:d.length}}async function l(e){return(await Promise.all(e.map(async e=>{let r=await (0,o.insideWorkspace)(e);if(!r)return null;let t=await (0,s.stat)(r).catch(()=>null);return t?.isFile()?{path:e,bytes:t.size}:null}))).filter(e=>null!==e)}e.s(["readWorkspaceFolder",0,a,"statFiles",0,l])},149325,e=>{e.v(e=>Promise.resolve().then(()=>e(786025)))},967030,e=>{e.v(e=>Promise.resolve().then(()=>e(783697)))},683671,e=>{e.v(s=>Promise.all(["server/chunks/node_modules_@vercel_oidc_dist_token_1o4m7ms.js"].map(s=>e.l(s))).then(()=>s(390391)))},329280,e=>{e.v(s=>Promise.all(["server/chunks/[externals]_node_readline_1u65a-m._.js","server/chunks/node_modules_consola_dist_chunks_prompt_mjs_02axwqv._.js"].map(s=>e.l(s))).then(()=>s(781937)))}];
2
2
 
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__1fy2g82._.js.map
3
+ //# sourceMappingURL=%5Broot-of-the-server%5D__1k3j52n._.js.map
@@ -1,8 +1,8 @@
1
- module.exports=[874533,(e,t,i)=>{t.exports=e.x("node:child_process",()=>require("node:child_process"))},666680,(e,t,i)=>{t.exports=e.x("node:crypto",()=>require("node:crypto"))},902157,(e,t,i)=>{t.exports=e.x("node:fs",()=>require("node:fs"))},912714,(e,t,i)=>{t.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},660526,(e,t,i)=>{t.exports=e.x("node:os",()=>require("node:os"))},750227,(e,t,i)=>{t.exports=e.x("node:path",()=>require("node:path"))},59639,(e,t,i)=>{t.exports=e.x("node:process",()=>require("node:process"))},509656,(e,t,i)=>{t.exports=e.x("node:tty",()=>require("node:tty"))},812057,(e,t,i)=>{t.exports=e.x("node:util",()=>require("node:util"))},393189,e=>{"use strict";var t=e.i(912714),i=e.i(750227),r=e.i(687388),a=e.i(786025);let o=e=>`${(0,a.botFolder)(e)}/memory`;async function n(e,t=r.BOT_MEMORY_LIMITS.files){let l=o(e),c=(0,i.join)(a.WORKSPACE,l),u=(await s(c)).sort((e,t)=>t.info.mtimeMs-e.info.mtimeMs),m=await Promise.all(u.slice(0,t).map(async({name:e,info:t})=>({file:e,path:`${l}/${e}`,line:await d((0,i.join)(c,e)),at:new Date(t.mtimeMs),bytes:t.size})));return{folder:l,entries:m,total:u.length}}async function s(e){let r=await (0,t.readdir)(e).catch(()=>[]);return(await Promise.all(r.filter(e=>!e.startsWith(".")).map(async r=>{let a=await (0,t.stat)((0,i.join)(e,r)).catch(()=>null);return a?.isFile()?{name:r,info:a}:null}))).filter(e=>null!==e)}async function l(e){let n=(0,i.join)(a.WORKSPACE,o(e)),l=new Map;return await Promise.all((await s(n)).map(async({name:e,info:a})=>{let o=a.size>4*r.BOT_MEMORY_LIMITS.chars?null:await (0,t.readFile)((0,i.join)(n,e),"utf8").catch(()=>null);l.set(e,{text:null!==o&&u(o)<=r.BOT_MEMORY_LIMITS.chars?o:null,size:a.size,mtimeMs:a.mtimeMs,atime:a.atime,mtime:a.mtime})})),l}async function c(e,n){let l=o(e),c=(0,i.join)(a.WORKSPACE,l),{files:d,chars:m}=r.BOT_MEMORY_LIMITS,h=[],p=[],f=0;for(let{name:e,info:r}of(await s(c))){f+=1;let a=n.get(e);if(a&&a.size===r.size&&a.mtimeMs===r.mtimeMs)continue;let o=(0,i.join)(c,e),s=u(await (0,t.readFile)(o,"utf8").catch(()=>""));if(s<=m){a||p.push(e);continue}let d=`${s.toLocaleString("en-US")} characters, past the ${m.toLocaleString("en-US")} a memory file holds`;a?null!==a.text?(await (0,t.writeFile)(o,a.text),await (0,t.utimes)(o,a.atime,a.mtime),h.push(`Not kept: \`${l}/${e}\` came to ${d}, so it is back as it was. Write it again shorter.`)):h.push(`\`${l}/${e}\` is ${d}. Shorten it.`):(await (0,t.rm)(o,{force:!0}),f-=1,h.push(`Not kept: \`${l}/${e}\` came to ${d}, so it was removed. Write it again shorter.`))}if(f>d&&p.length){await Promise.all(p.map(e=>(0,t.rm)((0,i.join)(c,e),{force:!0})));let e=p.map(e=>`\`${l}/${e}\``).join(", ");h.push(`Not kept: your memory holds ${d} files at most and this made ${f}, so ${e} ${1===p.length?"was":"were"} removed. Delete or merge files no longer worth keeping, then write it again.`)}return h.length?h.join("\n"):null}let u=e=>[...e.trim()].length;async function d(e){let i=await (0,t.open)(e,"r").catch(()=>null);if(!i)return"";try{let e=Buffer.alloc(1024),{bytesRead:t}=await i.read(e,0,1024,0),r=e.toString("utf8",0,t).split("\n").map(e=>e.trim()).filter(Boolean);if("---"===r[0]){let e=r.find(e=>e.startsWith("description:"));if(e)return e.slice(12).trim().replace(/^["']|["']$/g,"");let t=r.indexOf("---",1);return t>0?(r[t+1]??"").replace(/^#+\s*/,""):""}return(r[0]??"").replace(/^#+\s*/,"")}finally{await i.close()}}e.s(["botMemoryFolder",0,o,"holdBotMemory",0,l,"keepBotMemory",0,c,"listBotMemory",0,n])},786025,e=>{"use strict";var t=e.i(666680),i=e.i(902157),r=e.i(912714),a=e.i(660526),o=e.i(750227),n=e.i(687388),s=e.i(640911),l=e.i(874533),c=n;let u=new Set(["node_modules",".git",".next","dist","build",".venv","__pycache__",".turbo","coverage"]);async function*d(e){let t;try{t=await (0,r.readdir)(e,{withFileTypes:!0})}catch{return}for(let i of t){if(u.has(i.name)||i.name.startsWith("."))continue;let t=(0,o.join)(e,i.name);i.isDirectory()?yield*d(t):i.isFile()&&(yield t)}}async function m(e,t,i,a){if(e.length<=a.max)return e;let n=(0,o.join)(i,a.dir),s=(0,o.join)(n,`${new Date().toISOString().replace(/[:.]/g,"-")}-${t.replace(/[^a-zA-Z0-9_-]+/g,"_")}.txt`),l=s;try{await (0,r.mkdir)(n,{recursive:!0}),await (0,r.writeFile)(s,e),l=(0,o.relative)(i,s)||s}catch{l="(could not be written to a file)"}let c=(e.match(/\n/g)?.length??0)+1;return`${e.slice(0,a.head).trimEnd()}
1
+ module.exports=[874533,(e,t,i)=>{t.exports=e.x("node:child_process",()=>require("node:child_process"))},666680,(e,t,i)=>{t.exports=e.x("node:crypto",()=>require("node:crypto"))},902157,(e,t,i)=>{t.exports=e.x("node:fs",()=>require("node:fs"))},912714,(e,t,i)=>{t.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},660526,(e,t,i)=>{t.exports=e.x("node:os",()=>require("node:os"))},750227,(e,t,i)=>{t.exports=e.x("node:path",()=>require("node:path"))},59639,(e,t,i)=>{t.exports=e.x("node:process",()=>require("node:process"))},509656,(e,t,i)=>{t.exports=e.x("node:tty",()=>require("node:tty"))},812057,(e,t,i)=>{t.exports=e.x("node:util",()=>require("node:util"))},393189,e=>{"use strict";var t=e.i(912714),i=e.i(750227),r=e.i(687388),a=e.i(786025);let o=e=>`${(0,a.botFolder)(e)}/memory`;async function n(e,t=r.BOT_MEMORY_LIMITS.files){let l=o(e),c=(0,i.join)(a.WORKSPACE,l),u=(await s(c)).sort((e,t)=>t.info.mtimeMs-e.info.mtimeMs),m=await Promise.all(u.slice(0,t).map(async({name:e,info:t})=>({file:e,path:`${l}/${e}`,line:await d((0,i.join)(c,e)),at:new Date(t.mtimeMs),bytes:t.size})));return{folder:l,entries:m,total:u.length}}async function s(e){let r=await (0,t.readdir)(e).catch(()=>[]);return(await Promise.all(r.filter(e=>!e.startsWith(".")).map(async r=>{let a=await (0,t.stat)((0,i.join)(e,r)).catch(()=>null);return a?.isFile()?{name:r,info:a}:null}))).filter(e=>null!==e)}async function l(e){let n=(0,i.join)(a.WORKSPACE,o(e)),l=new Map;return await Promise.all((await s(n)).map(async({name:e,info:a})=>{let o=a.size>4*r.BOT_MEMORY_LIMITS.chars?null:await (0,t.readFile)((0,i.join)(n,e),"utf8").catch(()=>null);l.set(e,{text:null!==o&&u(o)<=r.BOT_MEMORY_LIMITS.chars?o:null,size:a.size,mtimeMs:a.mtimeMs,atime:a.atime,mtime:a.mtime})})),l}async function c(e,n){let l=o(e),c=(0,i.join)(a.WORKSPACE,l),{files:d,chars:m}=r.BOT_MEMORY_LIMITS,h=[],f=[],p=0;for(let{name:e,info:r}of(await s(c))){p+=1;let a=n.get(e);if(a&&a.size===r.size&&a.mtimeMs===r.mtimeMs)continue;let o=(0,i.join)(c,e),s=u(await (0,t.readFile)(o,"utf8").catch(()=>""));if(s<=m){a||f.push(e);continue}let d=`${s.toLocaleString("en-US")} characters, past the ${m.toLocaleString("en-US")} a memory file holds`;a?null!==a.text?(await (0,t.writeFile)(o,a.text),await (0,t.utimes)(o,a.atime,a.mtime),h.push(`Not kept: \`${l}/${e}\` came to ${d}, so it is back as it was. Write it again shorter.`)):h.push(`\`${l}/${e}\` is ${d}. Shorten it.`):(await (0,t.rm)(o,{force:!0}),p-=1,h.push(`Not kept: \`${l}/${e}\` came to ${d}, so it was removed. Write it again shorter.`))}if(p>d&&f.length){await Promise.all(f.map(e=>(0,t.rm)((0,i.join)(c,e),{force:!0})));let e=f.map(e=>`\`${l}/${e}\``).join(", ");h.push(`Not kept: your memory holds ${d} files at most and this made ${p}, so ${e} ${1===f.length?"was":"were"} removed. Delete or merge files no longer worth keeping, then write it again.`)}return h.length?h.join("\n"):null}let u=e=>[...e.trim()].length;async function d(e){let i=await (0,t.open)(e,"r").catch(()=>null);if(!i)return"";try{let e=Buffer.alloc(1024),{bytesRead:t}=await i.read(e,0,1024,0),r=e.toString("utf8",0,t).split("\n").map(e=>e.trim()).filter(Boolean);if("---"===r[0]){let e=r.find(e=>e.startsWith("description:"));if(e)return e.slice(12).trim().replace(/^["']|["']$/g,"");let t=r.indexOf("---",1);return t>0?(r[t+1]??"").replace(/^#+\s*/,""):""}return(r[0]??"").replace(/^#+\s*/,"")}finally{await i.close()}}e.s(["botMemoryFolder",0,o,"holdBotMemory",0,l,"keepBotMemory",0,c,"listBotMemory",0,n])},786025,e=>{"use strict";var t=e.i(666680),i=e.i(902157),r=e.i(912714),a=e.i(660526),o=e.i(750227),n=e.i(687388),s=e.i(640911),l=e.i(874533),c=n;let u=new Set(["node_modules",".git",".next","dist","build",".venv","__pycache__",".turbo","coverage"]);async function*d(e){let t;try{t=await (0,r.readdir)(e,{withFileTypes:!0})}catch{return}for(let i of t){if(u.has(i.name)||i.name.startsWith("."))continue;let t=(0,o.join)(e,i.name);i.isDirectory()?yield*d(t):i.isFile()&&(yield t)}}async function m(e,t,i,a){if(e.length<=a.max)return e;let n=(0,o.join)(i,a.dir),s=(0,o.join)(n,`${new Date().toISOString().replace(/[:.]/g,"-")}-${t.replace(/[^a-zA-Z0-9_-]+/g,"_")}.txt`),l=s;try{await (0,r.mkdir)(n,{recursive:!0}),await (0,r.writeFile)(s,e),l=(0,o.relative)(i,s)||s}catch{l="(could not be written to a file)"}let c=(e.match(/\n/g)?.length??0)+1;return`${e.slice(0,a.head).trimEnd()}
2
2
 
3
3
  [${t} cut at ${a.max.toLocaleString("en")} chars — the whole thing (${c} lines) is at ${l}. Read the part you need with \`sed -n\`.]
4
4
 
5
- ${e.slice(-a.tail).trimStart()}`}let h=n.APP_DIR,p=(0,o.join)(n.DATA_DIR,n.PATHS.workspace),f=(process.env.THURSDAY_TOOL_PATH?.split(":")??[(0,o.join)(h,"node_modules",".bin")]).filter(Boolean),w=(0,o.join)(p,n.PATHS.artifacts),S=[n.PATHS.artifacts,n.PATHS.projects,n.PATHS.scratch,n.PATHS.bots],y=new Set([...S,".agents"]),T=(e,t)=>t===e||t.startsWith(e+o.sep),$=e=>(0,r.realpath)(e).catch(()=>null);async function g(e){let t=await $(p)??p,i=(0,o.resolve)(p,e);if(!T(p,i))return null;let r=i,a=await $(r);for(;null===a&&(0,o.dirname)(r)!==r;)r=(0,o.dirname)(r),a=await $(r);if(null===a)return null;let n=(0,o.relative)(r,i),s=n?(0,o.join)(a,n):a;return T(t,s)?s:null}function A(e,t){let i=t.trim().toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"").slice(0,40)||"job";return`${n.PATHS.scratch}/${i}-${e.slice(0,6)}`}let P=e=>e.replace(/[^\p{L}\p{N}_-]+/gu,"-"),_=e=>`${n.PATHS.bots}/${P(e)}`,E=e=>`${n.PATHS.artifacts}/${P(e)}`;async function j(e){let t=_(e),i=E(e);return await Promise.all([t,i].map(e=>(0,r.mkdir)((0,o.join)(p,e),{recursive:!0}))),{own:t,artifacts:i}}async function v(e,t){let i=A(e,t);return await (0,r.mkdir)((0,o.join)(p,i),{recursive:!0}),i}let M=e=>({PLAYWRIGHT_MCP_BROWSER:"chromium",...e?{PLAYWRIGHT_CLI_SESSION:`thread-${e}`,PLAYWRIGHT_MCP_VIEWPORT_SIZE:n.BROWSER_VIEWPORT}:{}}),I={runtimes:["node","python3","uv","bun","deno"],managers:["pnpm","npm","yarn"]};async function R(e){let t=Object.values(I).flat(),{stdout:i}=await e.exec(t.map(e=>`command -v ${e} >/dev/null 2>&1 && printf '%s ' ${e}`).join("; "),{timeoutMs:1e4}),r=new Set(i.trim().split(/\s+/).filter(Boolean)),a=e=>({found:e.filter(e=>r.has(e)),missing:e.filter(e=>!r.has(e))});return{runtimes:a(I.runtimes),managers:a(I.managers),browser:null}}async function b(){await C(),await k()}async function x(e){await W(e,await L(e,!1))}async function O(e){await L(e,!0)}async function H(e){await W(e,await L(e,!0))}async function W(e,i){let n=process.env.XDG_CACHE_HOME||(0,o.join)((0,a.homedir)(),".cache"),l=await (0,r.realpath)(p).catch(()=>p),c=(0,o.join)(n,"ms-playwright","daemon",(0,t.createHash)("sha1").update(l).digest("hex").slice(0,16)),u=M(e).PLAYWRIGHT_CLI_SESSION;for(let e of(await (0,r.readdir)(c).catch(()=>[]))){let t=e.startsWith("ud-")?e.slice(3):e;(t===u||t.startsWith(`${u}-`)||t.startsWith(`${u}.`))&&(i.some(e=>t===e||t.startsWith(`${e}-`)||t.startsWith(`${e}.`))||await (0,r.rm)((0,o.join)(c,e),{recursive:!0,force:!0}).catch(t=>s.logger.warn(`browser data ${e}: ${String(t)}`)))}}async function L(e,t){let i=await G(),r=M(e),a=await i.exec("playwright-cli list --json",{env:r,timeoutMs:15e3}).catch(()=>null),o=[];try{let{browsers:e}=JSON.parse(a?.stdout??"");o=e?.filter(e=>e.name===r.PLAYWRIGHT_CLI_SESSION||e.name.startsWith(`${r.PLAYWRIGHT_CLI_SESSION}-`))??[]}catch{}let n=[];for(let e of o){if(e.attached||!t&&!1!==e.headed){n.push(e.name);continue}await i.exec("playwright-cli close",{env:{...r,PLAYWRIGHT_CLI_SESSION:e.name},timeoutMs:15e3}).catch(()=>{})}return await b(),n}let k=()=>F(n.PATHS.output),C=()=>F(".playwright-cli");async function F(e){let t=(0,o.join)(p,e),i=await (0,r.readdir)(t,{withFileTypes:!0}).catch(()=>[]),a=Date.now()-n.WORKSPACE_KEEP.forMs;for(let e of i){if(!e.isFile())continue;let i=(0,o.join)(t,e.name),n=await (0,r.stat)(i).catch(()=>null);n&&n.mtimeMs<a&&await (0,r.unlink)(i).catch(()=>{})}}async function B(){return(await (0,r.readdir)((0,o.join)(p,n.PATHS.scratch),{withFileTypes:!0}).catch(()=>[])).filter(e=>e.isDirectory()).map(e=>`${n.PATHS.scratch}/${e.name}`)}async function D(e){let t=Date.now()-n.WORKSPACE_KEEP.forMs,i=[];for(let a of e){let e=(0,o.join)(p,a),n=await (0,r.stat)(e).catch(()=>null);n?.isDirectory()&&!(n.mtimeMs>=t)&&(await (0,r.rm)(e,{recursive:!0,force:!0}).catch(()=>{}),i.push(a))}return i}let N={"pnpm-workspace.yaml":"packages:\n - '**'\n",".npmrc":"recursive-install=false\n"};async function G(){for(let e of[...S,".playwright"])await (0,r.mkdir)((0,o.join)(p,e),{recursive:!0});for(let[e,t]of Object.entries(N))await (0,r.writeFile)((0,o.join)(p,e),t,{flag:"wx"}).catch(()=>{});return(({workingDirectory:e,spill:t,toolPath:i})=>{let a=(0,o.resolve)(e),n=(i??[]).filter(Boolean).join(":"),s=e=>e.startsWith("/")||/^[A-Za-z]:/.test(e)?e:(0,o.resolve)(a,e);return{cwd:a,resolve:s,readFile:(e,t)=>(0,r.readFile)(s(e),t),async writeFile(e,t){let i=s(e);await (0,r.mkdir)((0,o.join)(i,".."),{recursive:!0}),await (0,r.writeFile)(i,t)},readdir:(e,t)=>(0,r.readdir)(s(e),t),fold:(e,i="output")=>m(e,i,a,t),async glob(e,{path:t=".",limit:i=200}={}){let r=s(t),a=RegExp("^"+e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*\//g,"(?:.*/)?").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")+"$"),n=[];for await(let e of d(r)){let t=(0,o.relative)(r,e).split(o.sep).join("/");if((a.test(t)||a.test(e))&&n.push(e),n.length>=i)break}return n},exec:(e,{cwd:i,timeoutMs:r=c.EXEC_TIMEOUT_MS,signal:o,env:u}={})=>new Promise(d=>{let h,p,f=function(){let e={...process.env};for(let t of Object.keys(e))/KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|_AUTH/i.test(t)&&delete e[t];return e.TERM="dumb",e.PAGER="cat",e.GIT_PAGER="cat",e}();n&&(f.PATH=`${f.PATH??""}:${n}`);let w=(0,l.spawn)(e,{shell:!0,cwd:i?s(i):a,env:{...f,...u},detached:!0}),S="",y="";w.stdout?.on("data",e=>S+=e),w.stderr?.on("data",e=>y+=e);let T=e=>{try{w.pid&&process.kill(-w.pid,e)}catch{w.kill(e)}},$=!1,g=async e=>{$||($=!0,clearTimeout(P),clearTimeout(h),clearTimeout(p),o?.removeEventListener("abort",_),d({...e,stdout:await m(e.stdout,"stdout",a,t),stderr:await m(e.stderr,"stderr",a,t)}))},A=e=>{h||$||(y+=`
6
- [${e}]`,T("SIGTERM"),h=setTimeout(()=>{y+="\n[Killed: it did not exit on SIGTERM]",T("SIGKILL"),p=setTimeout(()=>{w.stdout?.destroy(),w.stderr?.destroy(),g({stdout:S,stderr:y,exitCode:-1})},1e3)},c.EXEC_KILL_GRACE_MS))},P=setTimeout(()=>A(`Timed out after ${r}ms`),r),_=()=>A("Aborted");o?.aborted?_():o?.addEventListener("abort",_,{once:!0}),w.on("close",e=>g({stdout:S,stderr:y,exitCode:e??-1})),w.on("error",e=>g({stdout:S,stderr:y+String(e),exitCode:-1}))})}})({workingDirectory:p,spill:{dir:n.PATHS.output,...n.TOOL_OUTPUT},toolPath:f})}async function Y(e,t){let i=e.map(e=>(0,o.resolve)(p,e));if(t){let e=0;for await(let r of d((0,o.join)(p,t)))if(i.push(r),(e+=1)>=500)break}let a=new Map;for(let e of i){let t=await (0,r.stat)(e).catch(()=>null);if(!t?.isFile())continue;let i=(0,o.relative)(p,e);a.set(i&&!i.startsWith("..")?i:e,t.mtimeMs)}return[...a].sort((e,t)=>e[1]-t[1]).map(([e])=>e)}async function K(e,t){await (0,r.rm)((0,o.join)(p,A(e,t)),{recursive:!0,force:!0}).catch(()=>{})}e.s(["ARTIFACTS",0,w,"WORKSPACE",0,p,"botArtifacts",0,E,"botBrowserSession",0,(e,i)=>`${e}-bot-${(0,t.createHash)("sha256").update(i.trim().toLowerCase()).digest("hex").slice(0,20)}`,"botFolder",0,_,"botFolderName",0,P,"botShellEnv",0,e=>({THURSDAY_ARTIFACTS:E(e)}),"closeHiddenBrowser",0,x,"closeJobShell",0,O,"filesOnDisk",0,Y,"insideWorkspace",0,g,"jobScratch",0,A,"jobShellEnv",0,M,"listScratchFolders",0,B,"openBotFolders",0,j,"openJobScratch",0,v,"openWorkspace",0,G,"pruneJobFiles",0,b,"readMachineTools",0,R,"removeJobBrowsers",0,H,"removeJobScratch",0,K,"removeUnchangedFolders",0,D,"writeRefusal",0,function(e,t){if(T(p,e)){let r=(0,o.relative)(p,e),[a,s]=r.split(o.sep);return a&&y.has(a)?t&&a===n.PATHS.artifacts&&s&&s.toLowerCase()!==P(t).toLowerCase()&&!(0,i.existsSync)((0,o.join)(w,s))?`Not written: ${r} would sit loose at the top of ${n.PATHS.artifacts}/. Your finished work goes in ${E(t)}/.`:null:`Not written: ${r||"the workspace root"} is outside the workspace's folders. Finished work goes under ${t?E(t):n.PATHS.artifacts}/, code under ${n.PATHS.projects}/, your own kit under ${n.PATHS.bots}/, and this job's working material under ${n.PATHS.scratch}/.`}return T(h,e)?`Not written: ${e} is inside the app that is running you, not the user's files. Work in ${p}; outside it, write only where the user pointed you.`:null}],786025)}];
5
+ ${e.slice(-a.tail).trimStart()}`}let h=n.APP_DIR,f=(0,o.join)(n.DATA_DIR,n.PATHS.workspace),p=(process.env.THURSDAY_TOOL_PATH?.split(":")??[(0,o.join)(h,"node_modules",".bin")]).filter(Boolean),w=(0,o.join)(f,n.PATHS.artifacts),S=[n.PATHS.artifacts,n.PATHS.projects,n.PATHS.scratch,n.PATHS.bots],y=new Set([...S,".agents"]),T=(e,t)=>t===e||t.startsWith(e+o.sep),$=e=>(0,r.realpath)(e).catch(()=>null);async function g(e){let t=await $(f)??f,i=(0,o.resolve)(f,e);if(!T(f,i))return null;let r=i,a=await $(r);for(;null===a&&(0,o.dirname)(r)!==r;)r=(0,o.dirname)(r),a=await $(r);if(null===a)return null;let n=(0,o.relative)(r,i),s=n?(0,o.join)(a,n):a;return T(t,s)?s:null}function A(e,t){let i=t.trim().toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"").slice(0,40)||"job";return`${n.PATHS.scratch}/${i}-${e.slice(0,6)}`}let P=e=>e.replace(/[^\p{L}\p{N}_-]+/gu,"-"),_=e=>`${n.PATHS.bots}/${P(e)}`,E=e=>`${n.PATHS.artifacts}/${P(e)}`;async function j(e){let t=_(e),i=E(e);return await Promise.all([t,i].map(e=>(0,r.mkdir)((0,o.join)(f,e),{recursive:!0}))),{own:t,artifacts:i}}async function v(e,t){let i=A(e,t);return await (0,r.mkdir)((0,o.join)(f,i),{recursive:!0}),i}let I=e=>({PLAYWRIGHT_MCP_BROWSER:"chromium",...e?{PLAYWRIGHT_CLI_SESSION:`thread-${e}`,PLAYWRIGHT_MCP_VIEWPORT_SIZE:n.BROWSER_VIEWPORT}:{}}),M={runtimes:["node","python3","uv","bun","deno"],managers:["pnpm","npm","yarn"]};async function R(e){let t=Object.values(M).flat(),{stdout:i}=await e.exec(t.map(e=>`command -v ${e} >/dev/null 2>&1 && printf '%s ' ${e}`).join("; "),{timeoutMs:1e4}),r=new Set(i.trim().split(/\s+/).filter(Boolean)),a=e=>({found:e.filter(e=>r.has(e)),missing:e.filter(e=>!r.has(e))});return{runtimes:a(M.runtimes),managers:a(M.managers),browser:null}}async function b(){await C(),await k()}async function x(e){await L(e,await W(e,!1))}async function H(e){await W(e,!0)}async function O(e){await L(e,await W(e,!0))}async function L(e,i){let n=process.env.XDG_CACHE_HOME||(0,o.join)((0,a.homedir)(),".cache"),l=await (0,r.realpath)(f).catch(()=>f),c=(0,o.join)(n,"ms-playwright","daemon",(0,t.createHash)("sha1").update(l).digest("hex").slice(0,16)),u=I(e).PLAYWRIGHT_CLI_SESSION;for(let e of(await (0,r.readdir)(c).catch(()=>[]))){let t=e.startsWith("ud-")?e.slice(3):e;(t===u||t.startsWith(`${u}-`)||t.startsWith(`${u}.`))&&(i.some(e=>t===e||t.startsWith(`${e}-`)||t.startsWith(`${e}.`))||await (0,r.rm)((0,o.join)(c,e),{recursive:!0,force:!0}).catch(t=>s.logger.warn(`browser data ${e}: ${String(t)}`)))}}async function W(e,t){let i=await Y(),r=I(e),a=await i.exec("playwright-cli list --json",{env:r,timeoutMs:15e3}).catch(()=>null),o=[];try{let{browsers:e}=JSON.parse(a?.stdout??"");o=e?.filter(e=>e.name===r.PLAYWRIGHT_CLI_SESSION||e.name.startsWith(`${r.PLAYWRIGHT_CLI_SESSION}-`))??[]}catch{}let n=[];for(let e of o){if(e.attached||!t&&!1!==e.headed){n.push(e.name);continue}await i.exec("playwright-cli close",{env:{...r,PLAYWRIGHT_CLI_SESSION:e.name},timeoutMs:15e3}).catch(()=>{})}return await b(),n}let k=()=>F(n.PATHS.output),C=()=>F(".playwright-cli");async function F(e){let t=(0,o.join)(f,e),i=await (0,r.readdir)(t,{withFileTypes:!0}).catch(()=>[]),a=Date.now()-n.WORKSPACE_KEEP.forMs;for(let e of i){if(!e.isFile())continue;let i=(0,o.join)(t,e.name),n=await (0,r.stat)(i).catch(()=>null);n&&n.mtimeMs<a&&await (0,r.unlink)(i).catch(()=>{})}}async function D(){return(await (0,r.readdir)((0,o.join)(f,n.PATHS.scratch),{withFileTypes:!0}).catch(()=>[])).filter(e=>e.isDirectory()).map(e=>`${n.PATHS.scratch}/${e.name}`)}async function B(e){let t=Date.now()-n.WORKSPACE_KEEP.forMs,i=[];for(let a of e){let e=(0,o.join)(f,a),n=await (0,r.stat)(e).catch(()=>null);n?.isDirectory()&&!(n.mtimeMs>=t)&&(await (0,r.rm)(e,{recursive:!0,force:!0}).catch(()=>{}),i.push(a))}return i}let N={"pnpm-workspace.yaml":"packages:\n - '**'\n",".npmrc":"recursive-install=false\n"};async function Y(){for(let e of[...S,".playwright"])await (0,r.mkdir)((0,o.join)(f,e),{recursive:!0});for(let[e,t]of Object.entries(N))await (0,r.writeFile)((0,o.join)(f,e),t,{flag:"wx"}).catch(()=>{});return(({workingDirectory:e,spill:t,toolPath:i})=>{let a=(0,o.resolve)(e),n=(i??[]).filter(Boolean).join(":"),s=e=>e.startsWith("/")||/^[A-Za-z]:/.test(e)?e:(0,o.resolve)(a,e);return{cwd:a,resolve:s,readFile:(e,t)=>(0,r.readFile)(s(e),t),async writeFile(e,t){let i=s(e);await (0,r.mkdir)((0,o.join)(i,".."),{recursive:!0}),await (0,r.writeFile)(i,t)},readdir:(e,t)=>(0,r.readdir)(s(e),t),fold:(e,i="output")=>m(e,i,a,t),async glob(e,{path:t=".",limit:i=200}={}){let r=s(t),a=RegExp("^"+e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*\//g,"(?:.*/)?").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")+"$"),n=[];for await(let e of d(r)){let t=(0,o.relative)(r,e).split(o.sep).join("/");if((a.test(t)||a.test(e))&&n.push(e),n.length>=i)break}return n},exec:(e,{cwd:i,timeoutMs:r=c.EXEC_TIMEOUT_MS,signal:o,env:u}={})=>new Promise(d=>{let h,f,p=function(){let e={...process.env};for(let t of Object.keys(e))/KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|_AUTH/i.test(t)&&delete e[t];return e.TERM="dumb",e.PAGER="cat",e.GIT_PAGER="cat",e}();n&&(p.PATH=`${p.PATH??""}:${n}`);let w=(0,l.spawn)(e,{shell:!0,cwd:i?s(i):a,env:{...p,...u},detached:!0}),S="",y="";w.stdout?.on("data",e=>S+=e),w.stderr?.on("data",e=>y+=e);let T=e=>{try{w.pid&&process.kill(-w.pid,e)}catch{w.kill(e)}},$=!1,g=async e=>{$||($=!0,clearTimeout(P),clearTimeout(h),clearTimeout(f),o?.removeEventListener("abort",_),d({...e,stdout:await m(e.stdout,"stdout",a,t),stderr:await m(e.stderr,"stderr",a,t)}))},A=e=>{h||$||(y+=`
6
+ [${e}]`,T("SIGTERM"),h=setTimeout(()=>{y+="\n[Killed: it did not exit on SIGTERM]",T("SIGKILL"),f=setTimeout(()=>{w.stdout?.destroy(),w.stderr?.destroy(),g({stdout:S,stderr:y,exitCode:-1})},1e3)},c.EXEC_KILL_GRACE_MS))},P=setTimeout(()=>A(`Timed out after ${r}ms`),r),_=()=>A("Aborted");o?.aborted?_():o?.addEventListener("abort",_,{once:!0}),w.on("close",e=>g({stdout:S,stderr:y,exitCode:e??-1})),w.on("error",e=>g({stdout:S,stderr:y+String(e),exitCode:-1}))})}})({workingDirectory:f,spill:{dir:n.PATHS.output,...n.TOOL_OUTPUT},toolPath:p})}async function G(e,t){let i=e.map(e=>(0,o.resolve)(f,e));if(t){let e=0;for await(let r of d((0,o.join)(f,t)))if(i.push(r),(e+=1)>=500)break}let a=new Map;for(let e of i){let t=await (0,r.stat)(e).catch(()=>null);if(!t?.isFile())continue;let i=(0,o.relative)(f,e);a.set(i&&!i.startsWith("..")?i:e,t.mtimeMs)}return[...a].sort((e,t)=>e[1]-t[1]).map(([e])=>e)}async function K(e,t){await (0,r.rm)((0,o.join)(f,A(e,t)),{recursive:!0,force:!0}).catch(()=>{})}e.s(["ARTIFACTS",0,w,"WORKSPACE",0,f,"botArtifacts",0,E,"botBrowserSession",0,(e,i)=>`${e}-bot-${(0,t.createHash)("sha256").update(i.trim().toLowerCase()).digest("hex").slice(0,20)}`,"botFolder",0,_,"botFolderName",0,P,"botShellEnv",0,e=>({THURSDAY_ARTIFACTS:E(e),THURSDAY_SKILLS:(0,o.join)(n.APP_DIR,n.PATHS.skills.default)}),"closeHiddenBrowser",0,x,"closeJobShell",0,H,"filesOnDisk",0,G,"insideWorkspace",0,g,"jobScratch",0,A,"jobShellEnv",0,I,"listScratchFolders",0,D,"openBotFolders",0,j,"openJobScratch",0,v,"openWorkspace",0,Y,"pruneJobFiles",0,b,"readMachineTools",0,R,"removeJobBrowsers",0,O,"removeJobScratch",0,K,"removeUnchangedFolders",0,B,"writeRefusal",0,function(e,t){if(T(f,e)){let r=(0,o.relative)(f,e),[a,s]=r.split(o.sep);return a&&y.has(a)?t&&a===n.PATHS.artifacts&&s&&s.toLowerCase()!==P(t).toLowerCase()&&!(0,i.existsSync)((0,o.join)(w,s))?`Not written: ${r} would sit loose at the top of ${n.PATHS.artifacts}/. Your finished work goes in ${E(t)}/.`:null:`Not written: ${r||"the workspace root"} is outside the workspace's folders. Finished work goes under ${t?E(t):n.PATHS.artifacts}/, code under ${n.PATHS.projects}/, your own kit under ${n.PATHS.bots}/, and this job's working material under ${n.PATHS.scratch}/.`}return T(h,e)?`Not written: ${e} is inside the app that is running you, not the user's files. Work in ${f}; outside it, write only where the user pointed you.`:null}],786025)}];
7
7
 
8
8
  //# sourceMappingURL=%5Broot-of-the-server%5D__1kyjt5m._.js.map