thursday-agent 0.9.0 → 0.11.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 (320) 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]__0542v_d._.js +3 -0
  68. package/.next/server/chunks/[root-of-the-server]__0gewdg9._.js +2 -2
  69. package/.next/server/chunks/[root-of-the-server]__0mrk2it._.js +1 -1
  70. package/.next/server/chunks/[root-of-the-server]__1-swlkw._.js +2 -2
  71. package/.next/server/chunks/[root-of-the-server]__12iddfq._.js +1 -1
  72. package/.next/server/chunks/[root-of-the-server]__1ai5lme._.js +3 -3
  73. package/.next/server/chunks/[root-of-the-server]__1cjxw0-._.js +2 -2
  74. package/.next/server/chunks/{[root-of-the-server]__1fy2g82._.js → [root-of-the-server]__1k3j52n._.js} +1 -1
  75. package/.next/server/chunks/[root-of-the-server]__1kyjt5m._.js +3 -3
  76. package/.next/server/chunks/[root-of-the-server]__1ygplx1._.js +1 -1
  77. package/.next/server/chunks/_05v8k21._.js +3 -1
  78. package/.next/server/chunks/_0awtznl._.js +1 -1
  79. package/.next/server/chunks/_0na2fj1._.js +1 -1
  80. package/.next/server/chunks/_0x-ej3f._.js +17 -17
  81. package/.next/server/chunks/_12-amdu._.js +2 -2
  82. package/.next/server/chunks/_15740dw._.js +60 -0
  83. package/.next/server/chunks/_1dc_d1q._.js +3 -3
  84. package/.next/server/chunks/_1i350l5._.js +3 -1
  85. package/.next/server/chunks/_1jc5g4p._.js +2 -2
  86. package/.next/server/chunks/_1jn-aep._.js +4 -4
  87. package/.next/server/chunks/_1m88lkh._.js +11 -11
  88. package/.next/server/chunks/_1ogqovh._.js +4 -4
  89. package/.next/server/chunks/_1uuucy-._.js +1 -1
  90. package/.next/server/chunks/_1zxp-p6._.js +1 -1
  91. package/.next/server/chunks/features_0rfvely._.js +5 -3
  92. package/.next/server/chunks/ssr/{[root-of-the-server]__1se25x0._.js → [root-of-the-server]__0hpp3nw._.js} +29 -13
  93. package/.next/server/chunks/ssr/[root-of-the-server]__0m7u9j-._.js +3 -0
  94. package/.next/server/chunks/ssr/[root-of-the-server]__0tzekbl._.js +24 -60
  95. package/.next/server/chunks/ssr/[root-of-the-server]__1cz2rz5._.js +3 -0
  96. package/.next/server/chunks/ssr/{[root-of-the-server]__0tvavy9._.js → [root-of-the-server]__1iwyp1e._.js} +1 -1
  97. package/.next/server/chunks/ssr/[root-of-the-server]__1w9hqq8._.js +1 -1
  98. package/.next/server/chunks/ssr/_097-ljd._.js +1 -1
  99. package/.next/server/chunks/ssr/{_1tmu8z-._.js → _0btzccu._.js} +2 -2
  100. package/.next/server/chunks/ssr/_0fqhhwi._.js +1 -1
  101. package/.next/server/chunks/ssr/_0hjzb5o._.js +3 -0
  102. package/.next/server/chunks/ssr/_0ld9_qq._.js +1 -1
  103. package/.next/server/chunks/ssr/{_0urj3mc._.js → _0ouzu9f._.js} +2 -2
  104. package/.next/server/chunks/ssr/{_1-zyvdb._.js → _0u7ko71._.js} +2 -2
  105. package/.next/server/chunks/ssr/{_0ltz2q5._.js → _0wd_o8-._.js} +2 -2
  106. package/.next/server/chunks/ssr/_0ya0cb0._.js +3 -0
  107. package/.next/server/chunks/ssr/_10yyqtk._.js +67 -0
  108. package/.next/server/chunks/ssr/{_1uy0xom._.js → _12eyown._.js} +3 -3
  109. package/.next/server/chunks/ssr/_12mijol._.js +11 -11
  110. package/.next/server/chunks/ssr/_132qkfz._.js +1 -1
  111. package/.next/server/chunks/ssr/_184327j._.js +1 -1
  112. package/.next/server/chunks/ssr/{_1z74dmq._.js → _19ps4p3._.js} +7 -7
  113. package/.next/server/chunks/ssr/{_1flbs77._.js → _1bhy4yg._.js} +2 -2
  114. package/.next/server/chunks/ssr/_1d423aj._.js +7 -5
  115. package/.next/server/chunks/ssr/{_1a-nuxx._.js → _1kd843u._.js} +2 -2
  116. package/.next/server/chunks/ssr/{_0ital-2._.js → _1kq2ye_._.js} +2 -2
  117. package/.next/server/chunks/ssr/_1mqn9mc._.js +1 -1
  118. package/.next/server/chunks/ssr/_1neoj22._.js +1 -1
  119. package/.next/server/chunks/ssr/_1p8xorg._.js +3 -0
  120. package/.next/server/chunks/ssr/{_1x-kojb._.js → _1q683w8._.js} +3 -3
  121. package/.next/server/chunks/ssr/_1tawxu2._.js +3 -0
  122. package/.next/server/chunks/ssr/{_0scf7xy._.js → _1w2oba6._.js} +2 -2
  123. package/.next/server/chunks/ssr/_1xoch6f._.js +1 -1
  124. package/.next/server/chunks/ssr/{_0kjj5ts._.js → _1ybo1hd._.js} +3 -3
  125. package/.next/server/chunks/ssr/features_bot_0s11m4r._.js +3 -0
  126. package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
  127. package/.next/server/chunks/ssr/features_memory_components_memory-setting_tsx_0oa43sw._.js +1 -1
  128. package/.next/server/chunks/ssr/features_routine_components_routine-setting_tsx_055fknz._.js +1 -1
  129. package/.next/server/chunks/ssr/features_workspace_00jz2hu._.js +1 -1
  130. package/.next/server/chunks/ssr/{node_modules_1af3w91._.js → node_modules_00pocul._.js} +1 -1
  131. package/.next/server/chunks/ssr/{node_modules_0th357h._.js → node_modules_02zt4az._.js} +1 -1
  132. package/.next/server/chunks/ssr/{node_modules_0jljel9._.js → node_modules_05ojmcl._.js} +1 -1
  133. package/.next/server/chunks/ssr/{node_modules_0wnlddw._.js → node_modules_06i6bli._.js} +1 -1
  134. package/.next/server/chunks/ssr/{node_modules_06bb4q8._.js → node_modules_09dj429._.js} +1 -1
  135. package/.next/server/chunks/ssr/{node_modules_068ws5v._.js → node_modules_0auzgvx._.js} +1 -1
  136. package/.next/server/chunks/ssr/{node_modules_1ogczzz._.js → node_modules_0evjwh1._.js} +1 -1
  137. package/.next/server/chunks/ssr/{node_modules_13kwejm._.js → node_modules_0gmdur8._.js} +1 -1
  138. package/.next/server/chunks/ssr/{node_modules_1s-gb-1._.js → node_modules_0j3te-1._.js} +1 -1
  139. package/.next/server/chunks/ssr/{node_modules_1bucjlk._.js → node_modules_0rbaymq._.js} +1 -1
  140. package/.next/server/chunks/ssr/{node_modules_1wbkzl9._.js → node_modules_0tf8_1e._.js} +1 -1
  141. package/.next/server/chunks/ssr/{node_modules_12et8d5._.js → node_modules_0yqy-0b._.js} +1 -1
  142. package/.next/server/chunks/ssr/{node_modules_1lkix61._.js → node_modules_1-53ebx._.js} +1 -1
  143. package/.next/server/chunks/ssr/{node_modules_03d0rfz._.js → node_modules_1-y9aho._.js} +1 -1
  144. package/.next/server/chunks/ssr/{node_modules_0x630an._.js → node_modules_11bltzp._.js} +1 -1
  145. package/.next/server/chunks/ssr/{node_modules_0uyh_vb._.js → node_modules_18jn2qo._.js} +1 -1
  146. package/.next/server/chunks/ssr/{node_modules_0dzm4um._.js → node_modules_1_te3bu._.js} +1 -1
  147. package/.next/server/chunks/ssr/{node_modules_07rs_p2._.js → node_modules_1c0pg3k._.js} +1 -1
  148. package/.next/server/chunks/ssr/{node_modules_0sgy-dc._.js → node_modules_1en2jx5._.js} +1 -1
  149. package/.next/server/chunks/ssr/{node_modules_0ubdtk-._.js → node_modules_1p-c8cr._.js} +1 -1
  150. package/.next/server/chunks/ssr/{node_modules_1z1lrbk._.js → node_modules_1qe-oxg._.js} +1 -1
  151. package/.next/server/chunks/ssr/{node_modules_04_sbbc._.js → node_modules_1rjt833._.js} +1 -1
  152. package/.next/server/chunks/ssr/{node_modules_0yvz9e0._.js → node_modules_1tzw5sn._.js} +1 -1
  153. package/.next/server/chunks/ssr/{node_modules_1uwg-gz._.js → node_modules_1x6uwvn._.js} +1 -1
  154. package/.next/server/chunks/ssr/{node_modules_0t_ez6-._.js → node_modules_1zqddke._.js} +1 -1
  155. package/.next/server/chunks/ssr/{node_modules_05ybmta._.js → node_modules_211zgim._.js} +1 -1
  156. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0r443fh._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0y51bqj._.js} +1 -1
  157. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_10wnlbk._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1sc114e._.js} +1 -1
  158. package/.next/server/middleware-build-manifest.js +3 -3
  159. package/.next/server/pages/404.html +1 -1
  160. package/.next/server/pages/500.html +1 -1
  161. package/.next/server/server-reference-manifest.js +1 -1
  162. package/.next/server/server-reference-manifest.json +57 -57
  163. package/.next/static/chunks/{13ixzheqw7o-w.js → 03-724sj0nk_z.js} +2 -2
  164. package/.next/static/chunks/03bhu4mk8en2q.js +1 -0
  165. package/.next/static/chunks/{3h2e-xv1zxh_f.js → 04imzjhvzw65d.js} +2 -2
  166. package/.next/static/chunks/{27tvv1i-smrck.js → 0gljzv9fz1g7d.js} +1 -1
  167. package/.next/static/chunks/{37j27b3e1gt7r.js → 0h0lythv1ql93.js} +1 -1
  168. package/.next/static/chunks/{2o4dndk0d68do.js → 0hzbj7f48cmx0.js} +1 -1
  169. package/.next/static/chunks/0lwunwbl7u7pt.js +1 -0
  170. package/.next/static/chunks/{0u9ae9k_2g7k3.js → 0r6nwxg4dv83t.js} +1 -1
  171. package/.next/static/chunks/0rn9nbg6aif9f.js +17 -0
  172. package/.next/static/chunks/{3bbzsitgiltnt.js → 0x_w4shtvrrfg.js} +1 -1
  173. package/.next/static/chunks/{2sdwbfs1x5skp.js → 0ympuji_ufypd.js} +1 -1
  174. package/.next/static/chunks/{3t9huugh-5_ps.js → 0zmrz4zfzm4dt.js} +1 -1
  175. package/.next/static/chunks/{0qmd8n52hp-6v.js → 11tlxkr7a_rpc.js} +1 -1
  176. package/.next/static/chunks/{2c64drdevdla3.js → 12scesro428m7.js} +2 -2
  177. package/.next/static/chunks/16s2fx3890_jd.js +65 -0
  178. package/.next/static/chunks/{0oyz95sujd2c7.js → 1qzfgplyo18tc.js} +1 -1
  179. package/.next/static/chunks/{04e-e--5lk26x.js → 1r4zajz14jp9-.js} +1 -1
  180. package/.next/static/chunks/1s6m4cmbn7htf.js +1 -0
  181. package/.next/static/chunks/1wl9t1-3i-q8p.css +1 -0
  182. package/.next/static/chunks/2-asot3p1j3yg.js +1 -0
  183. package/.next/static/chunks/{0u3ktztrzu1fa.js → 2-jn4xscbm-i2.js} +1 -1
  184. package/.next/static/chunks/22h9gvclqtx_2.js +1 -0
  185. package/.next/static/chunks/{337g9g_ux2gj-.js → 26-eblxwnykck.js} +1 -1
  186. package/.next/static/chunks/{43q9cgbuw8krx.js → 2kzwhbuobpkw3.js} +2 -2
  187. package/.next/static/chunks/2m6jd3586ijb-.js +1 -0
  188. package/.next/static/chunks/{0_awn8tucznxc.js → 304q9p54tcgm1.js} +1 -1
  189. package/.next/static/chunks/{1u5i-jti87jbo.js → 35wdx3wt7cg4a.js} +1 -1
  190. package/.next/static/chunks/37unh9460im7v.js +18 -0
  191. package/.next/static/chunks/{01xjer0i_e5z5.js → 39gj5vxz1zpm_.js} +1 -1
  192. package/.next/static/chunks/{427qsc6kahxyo.js → 39vrqy1r_00jc.js} +1 -1
  193. package/.next/static/chunks/{245hb85nsy6j4.js → 3dipmu0mptqum.js} +1 -1
  194. package/.next/static/chunks/3gki-squw28yu.js +1 -0
  195. package/.next/static/chunks/{3obf9n3cxj99k.js → 3jvldk2wvwbge.js} +1 -1
  196. package/.next/static/chunks/{38301ji-85i30.js → 3nnzdl_te20hv.js} +1 -1
  197. package/.next/static/chunks/{2m267diam_vib.js → 3tz4dr0_8pq1-.js} +1 -1
  198. package/.next/static/chunks/{2gocl3dq0_h1s.js → 3x6pggb-2kyrk.js} +1 -1
  199. package/.next/static/chunks/{025bmrgeukcb2.js → 4440mws9jz3mt.js} +1 -1
  200. package/README.md +4 -0
  201. package/app/api/thursday/tool-call/route.ts +1 -15
  202. package/components/ui/radio-group.tsx +2 -2
  203. package/docs/images/demo-still.jpg +0 -0
  204. package/docs/live-calls.md +19 -11
  205. package/features/ai/prompts/live.prompt.ts +51 -26
  206. package/features/ai/prompts/prompt-helper.ts +1 -9
  207. package/features/ai/prompts/thursday.prompt.ts +8 -2
  208. package/features/bot/bot.run.ts +9 -3
  209. package/features/bot/bot.seed.ts +35 -91
  210. package/features/bot/components/bot-room.tsx +0 -6
  211. package/features/bot/components/bot-setting.tsx +4 -4
  212. package/features/bot/components/room-pill.tsx +4 -2
  213. package/features/bot/seed-bots.ts +2 -2
  214. package/features/intro/components/intro.tsx +2 -3
  215. package/features/reach/reach.ts +2 -2
  216. package/features/routine/components/routine-setting.tsx +1 -1
  217. package/features/signins/signins.query.ts +66 -1
  218. package/features/thursday/components/side-captions.tsx +31 -8
  219. package/features/thursday/components/thursday-setting.tsx +5 -5
  220. package/features/thursday/components/thursday.tsx +97 -39
  221. package/features/thursday/components/write-line.tsx +28 -17
  222. package/features/thursday/thursday.action.ts +4 -20
  223. package/features/thursday/thursday.schema.ts +0 -9
  224. package/features/thursday/thursday.store.ts +11 -15
  225. package/features/thursday/thursday.text.ts +10 -8
  226. package/features/thursday/tool-line.ts +17 -6
  227. package/features/thursday/use-call-ring.ts +1 -5
  228. package/features/thursday/use-text-call.ts +37 -21
  229. package/features/thursday/use-thursday.ts +14 -44
  230. package/features/workspace/workspace.ts +4 -2
  231. package/guide/bots.md +13 -3
  232. package/guide/calls.md +7 -5
  233. package/knip.json +1 -0
  234. package/lib/live/live.session.ts +0 -39
  235. package/package.json +1 -1
  236. package/scripts/live-session.test.mts +19 -26
  237. package/seed-skills/analyst/README.md +18 -0
  238. package/seed-skills/analyst/data-report/SKILL.md +60 -0
  239. package/seed-skills/analyst/data-report/references/brief.md +31 -0
  240. package/seed-skills/analyst/data-report/references/company.md +41 -0
  241. package/seed-skills/analyst/data-report/references/comparison.md +42 -0
  242. package/seed-skills/analyst/data-report/references/decision.md +28 -0
  243. package/seed-skills/analyst/data-report/references/market-size.md +49 -0
  244. package/seed-skills/analyst/data-report/references/price-check.md +33 -0
  245. package/seed-skills/analyst/data-report/references/sources.md +51 -0
  246. package/seed-skills/analyst/data-report/references/trend.md +39 -0
  247. package/seed-skills/analyst/data-report/scripts/fetch.mjs +521 -0
  248. package/seed-skills/insta/instagram/SKILL.md +36 -0
  249. package/seed-skills/insta/instagram/references/dm.md +49 -0
  250. package/seed-skills/insta/instagram/references/post.md +74 -0
  251. package/seed-skills/insta/instagram/scripts/compose.mjs +333 -0
  252. package/seed-skills/insta/instagram/scripts/inbox.mjs +163 -0
  253. package/seed-skills/insta/instagram/scripts/lib.mjs +33 -0
  254. package/seed-skills/insta/instagram/scripts/media.mjs +104 -0
  255. package/seed-skills/insta/instagram/scripts/profile.mjs +143 -0
  256. package/seed-skills/insta/instagram/scripts/read.mjs +244 -0
  257. package/seed-skills/insta/instagram/scripts/search.mjs +137 -0
  258. package/seed-skills/insta/instagram/scripts/selectors.mjs +56 -0
  259. package/seed-skills/insta/instagram/scripts/sheet.mjs +43 -0
  260. package/seed-skills/insta/instagram/templates/carousel.html +62 -0
  261. package/seed-skills/marketer/README.md +6 -4
  262. package/seed-skills/marketer/copywriting/SKILL.md +1 -1
  263. package/seed-skills/marketer/emails/SKILL.md +1 -1
  264. package/seed-skills/marketer/launch/SKILL.md +1 -1
  265. package/seed-skills/marketer/product-marketing/SKILL.md +5 -5
  266. package/seed-skills/marketer/seo-audit/SKILL.md +1 -1
  267. package/seed-skills/marketer/social/SKILL.md +1 -1
  268. package/seed-skills/tutor/picture-book/SKILL.md +16 -0
  269. package/seed-skills/tutor/picture-book/book/book.css +181 -0
  270. package/seed-skills/tutor/picture-book/book/book.html +33 -0
  271. package/seed-skills/tutor/picture-book/book/book.js +60 -0
  272. package/seed-skills/tutor/picture-book/references/picture-book.md +104 -0
  273. package/seed-skills/tutor/picture-book/scripts/book-video.mjs +177 -0
  274. package/seed-skills/tutor/picture-book/scripts/book.mjs +98 -0
  275. package/skills/browser/SKILL.md +13 -4
  276. package/skills/browser/references/scripts.md +55 -0
  277. package/skills/browser/scripts/image-size.mjs +30 -0
  278. package/skills/browser/scripts/render.mjs +126 -0
  279. package/skills/browser/scripts/session.mjs +105 -0
  280. package/skills/browser/scripts/sheet.mjs +97 -0
  281. package/skills/browser/scripts/webimage.mjs +105 -0
  282. package/skills/interactive-page/SKILL.md +4 -3
  283. package/skills/interactive-page/scripts/chart.mjs +679 -0
  284. package/skills/interactive-page/scripts/page.mjs +1 -0
  285. package/.next/server/app/api/probe/route/app-paths-manifest.json +0 -3
  286. package/.next/server/app/api/probe/route/build-manifest.json +0 -12
  287. package/.next/server/app/api/probe/route/server-reference-manifest.json +0 -4
  288. package/.next/server/app/api/probe/route.js +0 -10
  289. package/.next/server/app/api/probe/route.js.map +0 -5
  290. package/.next/server/app/api/probe/route.js.nft.json +0 -1
  291. package/.next/server/app/api/probe/route_client-reference-manifest.js +0 -3
  292. package/.next/server/chunks/[root-of-the-server]__012s2o8._.js +0 -3
  293. package/.next/server/chunks/[root-of-the-server]__0z0hc1f._.js +0 -4
  294. package/.next/server/chunks/[root-of-the-server]__1v7-zke._.js +0 -5
  295. package/.next/server/chunks/_0whlpyi._.js +0 -4
  296. package/.next/server/chunks/_next-internal_server_app_api_probe_route_actions_0cqd30j.js +0 -3
  297. package/.next/server/chunks/ssr/[root-of-the-server]__0oo-wlv._.js +0 -103
  298. package/.next/server/chunks/ssr/[root-of-the-server]__0zuns7e._.js +0 -3
  299. package/.next/server/chunks/ssr/_070nv1_._.js +0 -3
  300. package/.next/server/chunks/ssr/_0dshsh4._.js +0 -3
  301. package/.next/server/chunks/ssr/_0l_mcfz._.js +0 -3
  302. package/.next/server/chunks/ssr/_0u5xv6g._.js +0 -3
  303. package/.next/server/chunks/ssr/_157yfrk._.js +0 -3
  304. package/.next/server/chunks/ssr/features_bot_1nr94ks._.js +0 -3
  305. package/.next/static/chunks/06nt9tatr-dug.js +0 -1
  306. package/.next/static/chunks/0ge-hx0ed83a1.js +0 -1
  307. package/.next/static/chunks/0pda_vf-abwvx.js +0 -1
  308. package/.next/static/chunks/0rowp9rx3qbxu.js +0 -18
  309. package/.next/static/chunks/1grkt5gr8pbg1.js +0 -17
  310. package/.next/static/chunks/1yugpvvi8qrbu.js +0 -101
  311. package/.next/static/chunks/27lkanxvtdn09.js +0 -1
  312. package/.next/static/chunks/3fec-aeteddr-.js +0 -1
  313. package/.next/static/chunks/3go3hwp1z2_h2.css +0 -1
  314. package/.next/static/chunks/3h2bun3hcggg8.js +0 -1
  315. package/.next/static/chunks/3j1y335o95mj7.js +0 -1
  316. package/lib/probe.server.ts +0 -17
  317. package/lib/probe.ts +0 -55
  318. /package/.next/static/{u8kJqShUAa49vY7BxAWsw → En1vUPazxcYjPjnnahcN5}/_buildManifest.js +0 -0
  319. /package/.next/static/{u8kJqShUAa49vY7BxAWsw → En1vUPazxcYjPjnnahcN5}/_clientMiddlewareManifest.js +0 -0
  320. /package/.next/static/{u8kJqShUAa49vY7BxAWsw → En1vUPazxcYjPjnnahcN5}/_ssgManifest.js +0 -0
@@ -0,0 +1,3 @@
1
+ module.exports=[70729,e=>{e.v(e=>Promise.resolve().then(()=>e(666680)))},522275,e=>{e.v(e=>Promise.resolve().then(()=>e(380690)))},871049,e=>e.a(async(t,a)=>{try{var r=e.i(847841),n=e.i(105249),o=e.i(159479),s=e.i(386075),i=e.i(91264),l=e.i(53748),u=t([o,s]);[o,s]=u.then?(await u)():u;let c=n.default.object({toolCallId:n.default.string().min(1),callId:n.default.string().nullish(),webSearch:n.default.boolean().default(!0),name:n.default.string().min(1),input:n.default.unknown().optional()});async function d(e){let t;if("object"!=typeof e||null===e||!(Symbol.asyncIterator in e))return e;for await(let a of e)t=a;return t}let p=(0,i.serverRoute)(async e=>{let{toolCallId:t,callId:a,webSearch:n,name:i,input:u}=c.parse(await e.json()),p=(await (0,o.loadTools)({target:"thursday",callId:a,webSearch:n}))[i];p||(0,l.publicError)(`There is no tool called "${i}".`),p.execute||(0,l.publicError)(`"${i}" is handled by the page, not here.`);let h=await (0,r.asSchema)(p.inputSchema).validate?.(u??{});h&&!h.success&&(0,l.publicError)(`"${i}" got arguments that do not fit: ${h.error.message}`);try{let a=await p.execute(h?.value??u??{},{toolCallId:t,messages:[],context:void 0,abortSignal:e.signal});return{output:await d(a)}}catch(e){(0,l.publicError)(`"${i}" failed: ${(0,s.modelErrorToString)(e)}`)}});e.s(["POST",0,p]),a()}catch(e){a(e)}},!1),441895,e=>{"use strict";var t=e.i(747909),a=e.i(174017),r=e.i(996250),n=e.i(759756),o=e.i(561916),s=e.i(174677),i=e.i(869741),l=e.i(316795),u=e.i(487718),d=e.i(995169),c=e.i(47587),p=e.i(666012),h=e.i(570101),v=e.i(626937),m=e.i(10372),R=e.i(193695);e.i(52474);var f=e.i(600220);let g=new t.AppRouteRouteModule({definition:{kind:a.RouteKind.APP_ROUTE,page:"/api/thursday/tool-call/route",pathname:"/api/thursday/tool-call",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/app/api/thursday/tool-call/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(871049),...{}}),{workAsyncStorage:w,workUnitAsyncStorage:E,serverHooks:_}=g;async function y(e,t,r){r.requestMeta&&(0,n.setRequestMeta)(e,r.requestMeta),g.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let w="/api/thursday/tool-call/route";w=w.replace(/\/index$/,"")||"/";let E=await g.prepare(e,t,{srcPage:w,multiZoneDraftMode:!1});if(!E)return t.statusCode=400,t.end("Bad Request"),null==r.waitUntil||r.waitUntil.call(r,Promise.resolve()),null;let{buildId:_,deploymentId:y,params:C,nextConfig:x,parsedUrl:P,isDraftMode:b,prerenderManifest:T,routerServerContext:S,isOnDemandRevalidate:A,revalidateOnlyGenerated:N,resolvedPathname:k,clientReferenceManifest:q,serverActionsManifest:O}=E,I=(0,i.normalizeAppPath)(w),H=!!(T.dynamicRoutes[I]||T.routes[k]),j=async()=>((null==S?void 0:S.render404)?await S.render404(e,t,P,!1):t.end("This page could not be found"),null);if(H&&!b){let e=!!T.routes[k],t=T.dynamicRoutes[I];if(t&&!1===t.fallback&&!e){if(x.adapterPath)return await j();throw new R.NoFallbackError}}let M=null;!H||g.isDev||b||(M="/index"===(M=k)?"/":M);let U=!0===g.isDev||!H,D=H&&!U;O&&q&&(0,s.setManifestsSingleton)({page:w,clientReferenceManifest:q,serverActionsManifest:O});let $=e.method||"GET",F=(0,o.getTracer)(),K=F.getActiveScopeSpan(),L=!!(null==S?void 0:S.isWrappedByNextServer),B=!!(0,n.getRequestMeta)(e,"minimalMode"),G=(0,n.getRequestMeta)(e,"incrementalCache")||await g.getIncrementalCache(e,x,T,B);null==G||G.resetRequestCache(),globalThis.__incrementalCache=G;let V={params:C,previewProps:T.preview,renderOpts:{experimental:{authInterrupts:!!x.experimental.authInterrupts,useCacheTimeout:x.experimental.useCacheTimeout},cacheComponents:!!x.cacheComponents,validationLevel:x.experimental.instantInsights.validationLevel,supportsDynamicResponse:U,incrementalCache:G,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:x.cacheLife,staticPageGenerationTimeout:x.staticPageGenerationTimeout,waitUntil:r.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,a,r,n)=>g.onRequestError(e,t,r,n,S)},sharedContext:{buildId:_,deploymentId:y}},X=new l.NodeNextRequest(e),W=new l.NodeNextResponse(t),z=u.NextRequestAdapter.fromNodeNextRequest(X,(0,u.signalFromNodeResponse)(t)),Z=async({previousCacheEntry:a})=>{try{if(!B&&A&&N&&!a)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await g.handle(z,V);e.fetchMetrics=V.renderOpts.fetchMetrics;let o=V.renderOpts.pendingWaitUntil;o&&r.waitUntil&&(r.waitUntil(o),o=void 0);let s=V.renderOpts.collectedTags;if(!H)return await (0,p.sendResponse)(X,W,n,o),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);s&&(t[m.NEXT_CACHE_TAGS_HEADER]=s),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let a=void 0!==V.renderOpts.collectedRevalidate&&!(V.renderOpts.collectedRevalidate>=m.INFINITE_CACHE)&&V.renderOpts.collectedRevalidate,r=void 0===V.renderOpts.collectedExpire||V.renderOpts.collectedExpire>=m.INFINITE_CACHE?!1!==a&&a>0?x.expireTime:void 0:V.renderOpts.collectedExpire;return{value:{kind:f.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:a,expire:r}}}}catch(t){throw(null==a?void 0:a.isStale)&&await g.onRequestError(e,t,{routerKind:"App Router",routePath:w,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:D,isOnDemandRevalidate:A})},!1,S),t}},J=async(n,s)=>{try{var i,l;let n=await g.handleResponse({req:e,nextConfig:x,cacheKey:M,routeKind:a.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:T,isRoutePPREnabled:!1,isOnDemandRevalidate:A,revalidateOnlyGenerated:N,responseGenerator:Z,waitUntil:r.waitUntil,isMinimalMode:B});if(!H)return;if((null==n||null==(i=n.value)?void 0:i.kind)!==f.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(l=n.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});B||t.setHeader("x-nextjs-cache",A?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),b&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let o=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);B&&H||o.delete(m.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||o.get("Cache-Control")||o.set("Cache-Control",(0,v.getCacheControlHeader)(n.cacheControl)),await (0,p.sendResponse)(X,W,new Response(n.value.body,{headers:o,status:n.value.status||200}));return}catch(t){if(t instanceof R.NoFallbackError||await g.onRequestError(e,t,{routerKind:"App Router",routePath:I,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:D,isOnDemandRevalidate:A})},!1,S),H)throw t;await (0,p.sendResponse)(X,W,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:o.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let a=F.getRootSpanAttributes();if(!a)return;if(a.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${a.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let r=a.get("next.route")||I,i=`${$} ${r}`;n.setAttributes({"next.route":r,"http.route":r,"next.span_name":i}),n.updateName(i),s&&s!==n&&(s.setAttribute("http.route",r),s.updateName(i))})()}};if(L&&K)await J(K,void 0);else{let t=F.getActiveScopeSpan();await F.withPropagatedContext(e.headers,()=>F.trace(d.BaseServerSpan.handleRequest,{spanName:`${$} ${w}`,kind:o.SpanKind.SERVER,attributes:{"http.method":$,"http.target":e.url}},e=>J(e,t)),void 0,!L)}}e.s(["handler",0,y,"patchFetch",0,function(){return(0,r.patchFetch)({workAsyncStorage:w,workUnitAsyncStorage:E})},"routeModule",0,g,"serverHooks",0,_,"workAsyncStorage",0,w,"workUnitAsyncStorage",0,E])},814317,e=>{e.v(e=>Promise.resolve().then(()=>e(265143)))},994193,e=>{e.v(t=>Promise.all(["server/chunks/[root-of-the-server]__1nmflqk._.js","server/chunks/_1dc_d1q._.js"].map(t=>e.l(t))).then(()=>t(39803)))},866938,e=>{e.v(e=>Promise.resolve().then(()=>e(378884)))},628124,e=>{e.v(e=>Promise.resolve().then(()=>e(629668)))},149325,e=>{e.v(e=>Promise.resolve().then(()=>e(786025)))},967030,e=>{e.v(e=>Promise.resolve().then(()=>e(783697)))},683671,e=>{e.v(t=>Promise.all(["server/chunks/node_modules_@vercel_oidc_dist_token_1o4m7ms.js"].map(t=>e.l(t))).then(()=>t(390391)))},329280,e=>{e.v(t=>Promise.all(["server/chunks/[externals]_node_readline_1u65a-m._.js","server/chunks/node_modules_consola_dist_chunks_prompt_mjs_02axwqv._.js"].map(t=>e.l(t))).then(()=>t(781937)))}];
2
+
3
+ //# sourceMappingURL=%5Broot-of-the-server%5D__0542v_d._.js.map
@@ -2,7 +2,7 @@ module.exports=[874533,(e,t,i)=>{t.exports=e.x("node:child_process",()=>require(
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 p=n.APP_DIR,h=(0,o.join)(n.DATA_DIR,n.PATHS.workspace),f=(process.env.THURSDAY_TOOL_PATH?.split(":")??[(0,o.join)(p,"node_modules",".bin")]).filter(Boolean),w=(0,o.join)(h,n.PATHS.artifacts),y=[n.PATHS.artifacts,n.PATHS.projects,n.PATHS.scratch,n.PATHS.bots],g=new Set([...y,".agents"]),S=(e,t)=>t===e||t.startsWith(e+o.sep),k=e=>(0,r.realpath)(e).catch(()=>null);async function T(e){let t=await k(h)??h,i=(0,o.resolve)(h,e);if(!S(h,i))return null;let r=i,a=await k(r);for(;null===a&&(0,o.dirname)(r)!==r;)r=(0,o.dirname)(r),a=await k(r);if(null===a)return null;let n=(0,o.relative)(r,i),s=n?(0,o.join)(a,n):a;return S(t,s)?s:null}function b(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 $=e=>e.replace(/[^\p{L}\p{N}_-]+/gu,"-"),v=e=>`${n.PATHS.bots}/${$(e)}`,A=e=>`${n.PATHS.artifacts}/${$(e)}`;async function _(e){let t=v(e),i=A(e);return await Promise.all([t,i].map(e=>(0,r.mkdir)((0,o.join)(h,e),{recursive:!0}))),{own:t,artifacts:i}}async function P(e,t){let i=b(e,t);return await (0,r.mkdir)((0,o.join)(h,i),{recursive:!0}),i}let x=e=>({PLAYWRIGHT_MCP_BROWSER:"chromium",...e?{PLAYWRIGHT_CLI_SESSION:`thread-${e}`,PLAYWRIGHT_MCP_VIEWPORT_SIZE:n.BROWSER_VIEWPORT}:{}}),j={runtimes:["node","python3","uv","bun","deno"],managers:["pnpm","npm","yarn"]};async function E(e){let t=Object.values(j).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(j.runtimes),managers:a(j.managers),browser:null}}async function H(){await F(),await W()}async function I(e){await L(e,await O(e,!1))}async function R(e){await O(e,!0)}async function C(e){await L(e,await O(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)(h).catch(()=>h),c=(0,o.join)(n,"ms-playwright","daemon",(0,t.createHash)("sha1").update(l).digest("hex").slice(0,16)),d=x(e).PLAYWRIGHT_CLI_SESSION;for(let e of(await (0,r.readdir)(c).catch(()=>[]))){let t=e.startsWith("ud-")?e.slice(3):e;(t===d||t.startsWith(`${d}-`)||t.startsWith(`${d}.`))&&(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 O(e,t){let i=await G(),r=x(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 H(),n}let W=()=>q(n.PATHS.output),F=()=>q(".playwright-cli");async function q(e){let t=(0,o.join)(h,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 M(){return(await (0,r.readdir)((0,o.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,i=[];for(let a of e){let e=(0,o.join)(h,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 D={"pnpm-workspace.yaml":"packages:\n - '**'\n",".npmrc":"recursive-install=false\n"};async function G(){for(let e of[...y,".playwright"])await (0,r.mkdir)((0,o.join)(h,e),{recursive:!0});for(let[e,t]of Object.entries(D))await (0,r.writeFile)((0,o.join)(h,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 u(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:d}={})=>new Promise(u=>{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:i?s(i):a,env:{...f,...d},detached:!0}),y="",g="";w.stdout?.on("data",e=>y+=e),w.stderr?.on("data",e=>g+=e);let S=e=>{try{w.pid&&process.kill(-w.pid,e)}catch{w.kill(e)}},k=!1,T=async e=>{k||(k=!0,clearTimeout($),clearTimeout(p),clearTimeout(h),o?.removeEventListener("abort",v),u({...e,stdout:await m(e.stdout,"stdout",a,t),stderr:await m(e.stderr,"stderr",a,t)}))},b=e=>{p||k||(g+=`
6
- [${e}]`,S("SIGTERM"),p=setTimeout(()=>{g+="\n[Killed: it did not exit on SIGTERM]",S("SIGKILL"),h=setTimeout(()=>{w.stdout?.destroy(),w.stderr?.destroy(),T({stdout:y,stderr:g,exitCode:-1})},1e3)},c.EXEC_KILL_GRACE_MS))},$=setTimeout(()=>b(`Timed out after ${r}ms`),r),v=()=>b("Aborted");o?.aborted?v():o?.addEventListener("abort",v,{once:!0}),w.on("close",e=>T({stdout:y,stderr:g,exitCode:e??-1})),w.on("error",e=>T({stdout:y,stderr:g+String(e),exitCode:-1}))})}})({workingDirectory:h,spill:{dir:n.PATHS.output,...n.TOOL_OUTPUT},toolPath:f})}async function K(e,t){let i=e.map(e=>(0,o.resolve)(h,e));if(t){let e=0;for await(let r of u((0,o.join)(h,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)(h,e);a.set(i&&!i.startsWith("..")?i:e,t.mtimeMs)}return[...a].sort((e,t)=>e[1]-t[1]).map(([e])=>e)}async function U(e,t){await (0,r.rm)((0,o.join)(h,b(e,t)),{recursive:!0,force:!0}).catch(()=>{})}e.s(["ARTIFACTS",0,w,"WORKSPACE",0,h,"botArtifacts",0,A,"botBrowserSession",0,(e,i)=>`${e}-bot-${(0,t.createHash)("sha256").update(i.trim().toLowerCase()).digest("hex").slice(0,20)}`,"botFolder",0,v,"botFolderName",0,$,"botShellEnv",0,e=>({THURSDAY_ARTIFACTS:A(e)}),"closeHiddenBrowser",0,I,"closeJobShell",0,R,"filesOnDisk",0,K,"insideWorkspace",0,T,"jobScratch",0,b,"jobShellEnv",0,x,"listScratchFolders",0,M,"openBotFolders",0,_,"openJobScratch",0,P,"openWorkspace",0,G,"pruneJobFiles",0,H,"readMachineTools",0,E,"removeJobBrowsers",0,C,"removeJobScratch",0,U,"removeUnchangedFolders",0,N,"writeRefusal",0,function(e,t){if(S(h,e)){let r=(0,o.relative)(h,e),[a,s]=r.split(o.sep);return a&&g.has(a)?t&&a===n.PATHS.artifacts&&s&&s.toLowerCase()!==$(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 ${A(t)}/.`:null:`Not written: ${r||"the workspace root"} is outside the workspace's folders. Finished work goes under ${t?A(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(-a.tail).trimStart()}`}let p=n.APP_DIR,h=(0,o.join)(n.DATA_DIR,n.PATHS.workspace),f=(process.env.THURSDAY_TOOL_PATH?.split(":")??[(0,o.join)(p,"node_modules",".bin")]).filter(Boolean),w=(0,o.join)(h,n.PATHS.artifacts),y=[n.PATHS.artifacts,n.PATHS.projects,n.PATHS.scratch,n.PATHS.bots],g=new Set([...y,".agents"]),S=(e,t)=>t===e||t.startsWith(e+o.sep),k=e=>(0,r.realpath)(e).catch(()=>null);async function T(e){let t=await k(h)??h,i=(0,o.resolve)(h,e);if(!S(h,i))return null;let r=i,a=await k(r);for(;null===a&&(0,o.dirname)(r)!==r;)r=(0,o.dirname)(r),a=await k(r);if(null===a)return null;let n=(0,o.relative)(r,i),s=n?(0,o.join)(a,n):a;return S(t,s)?s:null}function b(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 A=e=>e.replace(/[^\p{L}\p{N}_-]+/gu,"-"),$=e=>`${n.PATHS.bots}/${A(e)}`,v=e=>`${n.PATHS.artifacts}/${A(e)}`;async function _(e){let t=$(e),i=v(e);return await Promise.all([t,i].map(e=>(0,r.mkdir)((0,o.join)(h,e),{recursive:!0}))),{own:t,artifacts:i}}async function P(e,t){let i=b(e,t);return await (0,r.mkdir)((0,o.join)(h,i),{recursive:!0}),i}let x=e=>({PLAYWRIGHT_MCP_BROWSER:"chromium",...e?{PLAYWRIGHT_CLI_SESSION:`thread-${e}`,PLAYWRIGHT_MCP_VIEWPORT_SIZE:n.BROWSER_VIEWPORT}:{}}),j={runtimes:["node","python3","uv","bun","deno"],managers:["pnpm","npm","yarn"]};async function E(e){let t=Object.values(j).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(j.runtimes),managers:a(j.managers),browser:null}}async function H(){await F(),await W()}async function I(e){await C(e,await O(e,!1))}async function R(e){await O(e,!0)}async function L(e){await C(e,await O(e,!0))}async function C(e,i){let n=process.env.XDG_CACHE_HOME||(0,o.join)((0,a.homedir)(),".cache"),l=await (0,r.realpath)(h).catch(()=>h),c=(0,o.join)(n,"ms-playwright","daemon",(0,t.createHash)("sha1").update(l).digest("hex").slice(0,16)),d=x(e).PLAYWRIGHT_CLI_SESSION;for(let e of(await (0,r.readdir)(c).catch(()=>[]))){let t=e.startsWith("ud-")?e.slice(3):e;(t===d||t.startsWith(`${d}-`)||t.startsWith(`${d}.`))&&(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 O(e,t){let i=await G(),r=x(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 H(),n}let W=()=>q(n.PATHS.output),F=()=>q(".playwright-cli");async function q(e){let t=(0,o.join)(h,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 M(){return(await (0,r.readdir)((0,o.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,i=[];for(let a of e){let e=(0,o.join)(h,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 D={"pnpm-workspace.yaml":"packages:\n - '**'\n",".npmrc":"recursive-install=false\n"};async function G(){for(let e of[...y,".playwright"])await (0,r.mkdir)((0,o.join)(h,e),{recursive:!0});for(let[e,t]of Object.entries(D))await (0,r.writeFile)((0,o.join)(h,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 u(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:d}={})=>new Promise(u=>{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:i?s(i):a,env:{...f,...d},detached:!0}),y="",g="";w.stdout?.on("data",e=>y+=e),w.stderr?.on("data",e=>g+=e);let S=e=>{try{w.pid&&process.kill(-w.pid,e)}catch{w.kill(e)}},k=!1,T=async e=>{k||(k=!0,clearTimeout(A),clearTimeout(p),clearTimeout(h),o?.removeEventListener("abort",$),u({...e,stdout:await m(e.stdout,"stdout",a,t),stderr:await m(e.stderr,"stderr",a,t)}))},b=e=>{p||k||(g+=`
6
+ [${e}]`,S("SIGTERM"),p=setTimeout(()=>{g+="\n[Killed: it did not exit on SIGTERM]",S("SIGKILL"),h=setTimeout(()=>{w.stdout?.destroy(),w.stderr?.destroy(),T({stdout:y,stderr:g,exitCode:-1})},1e3)},c.EXEC_KILL_GRACE_MS))},A=setTimeout(()=>b(`Timed out after ${r}ms`),r),$=()=>b("Aborted");o?.aborted?$():o?.addEventListener("abort",$,{once:!0}),w.on("close",e=>T({stdout:y,stderr:g,exitCode:e??-1})),w.on("error",e=>T({stdout:y,stderr:g+String(e),exitCode:-1}))})}})({workingDirectory:h,spill:{dir:n.PATHS.output,...n.TOOL_OUTPUT},toolPath:f})}async function K(e,t){let i=e.map(e=>(0,o.resolve)(h,e));if(t){let e=0;for await(let r of u((0,o.join)(h,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)(h,e);a.set(i&&!i.startsWith("..")?i:e,t.mtimeMs)}return[...a].sort((e,t)=>e[1]-t[1]).map(([e])=>e)}async function U(e,t){await (0,r.rm)((0,o.join)(h,b(e,t)),{recursive:!0,force:!0}).catch(()=>{})}e.s(["ARTIFACTS",0,w,"WORKSPACE",0,h,"botArtifacts",0,v,"botBrowserSession",0,(e,i)=>`${e}-bot-${(0,t.createHash)("sha256").update(i.trim().toLowerCase()).digest("hex").slice(0,20)}`,"botFolder",0,$,"botFolderName",0,A,"botShellEnv",0,e=>({THURSDAY_ARTIFACTS:v(e),THURSDAY_SKILLS:(0,o.join)(n.APP_DIR,n.PATHS.skills.default)}),"closeHiddenBrowser",0,I,"closeJobShell",0,R,"filesOnDisk",0,K,"insideWorkspace",0,T,"jobScratch",0,b,"jobShellEnv",0,x,"listScratchFolders",0,M,"openBotFolders",0,_,"openJobScratch",0,P,"openWorkspace",0,G,"pruneJobFiles",0,H,"readMachineTools",0,E,"removeJobBrowsers",0,L,"removeJobScratch",0,U,"removeUnchangedFolders",0,N,"writeRefusal",0,function(e,t){if(S(h,e)){let r=(0,o.relative)(h,e),[a,s]=r.split(o.sep);return a&&g.has(a)?t&&a===n.PATHS.artifacts&&s&&s.toLowerCase()!==A(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 ${v(t)}/.`:null:`Not written: ${r||"the workspace root"} is outside the workspace's folders. Finished work goes under ${t?v(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)}];
7
7
 
8
8
  //# sourceMappingURL=%5Broot-of-the-server%5D__0gewdg9._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[70729,s=>{s.v(e=>Promise.all(["server/chunks/[externals]_node_crypto_1kn79-7._.js"].map(e=>s.l(e))).then(()=>e(666680)))},102473,s=>{s.v(e=>Promise.all(["server/chunks/[root-of-the-server]__18-2tsq._.js","server/chunks/lib_logger_ts_07e65t5._.js"].map(e=>s.l(e))).then(()=>e(232347)))},242792,s=>{s.v(e=>Promise.all(["server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1y49572._.js","server/chunks/_10tkr26._.js","server/chunks/[root-of-the-server]__0nr-v8s._.js","server/chunks/_1y8w80a._.js","server/chunks/lib_logger_ts_07e65t5._.js","server/chunks/_1kg70wc._.js","server/chunks/_1ogqovh._.js"].map(e=>s.l(e))).then(()=>e(799791)))},327784,s=>{s.v(e=>Promise.all(["server/chunks/[root-of-the-server]__0mrk2it._.js","server/chunks/_1tpr507._.js","server/chunks/features_0rfvely._.js","server/chunks/_05h2cii._.js","server/chunks/[root-of-the-server]__1wnzmx9._.js","server/chunks/_10tkr26._.js","server/chunks/_136j09a._.js","server/chunks/_1kg70wc._.js","server/chunks/features_0hdaci0._.js","server/chunks/_1jn-aep._.js","server/chunks/_1zxp-p6._.js","server/chunks/lib_logger_ts_07e65t5._.js"].map(e=>s.l(e))).then(()=>e(49002)))},193435,s=>{s.v(e=>Promise.all(["server/chunks/[root-of-the-server]__0h_x6q6._.js","server/chunks/features_0hdaci0._.js","server/chunks/_0f6ts7z._.js","server/chunks/_1e48czp._.js","server/chunks/_1y8w80a._.js","server/chunks/lib_logger_ts_07e65t5._.js"].map(e=>s.l(e))).then(()=>e(5509)))},890054,s=>{s.v(e=>Promise.all(["server/chunks/_0eauz4t._.js"].map(e=>s.l(e))).then(()=>e(375814)))},51833,s=>{s.v(e=>Promise.all(["server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1y49572._.js","server/chunks/lib_logger_ts_07e65t5._.js","server/chunks/[root-of-the-server]__1cjxw0-._.js"].map(e=>s.l(e))).then(()=>e(871096)))},573349,s=>{s.v(e=>Promise.all(["server/chunks/[root-of-the-server]__1wbc1wv._.js"].map(e=>s.l(e))).then(()=>e(913803)))},566462,s=>{s.v(e=>Promise.all(["server/chunks/[root-of-the-server]__0rl-fef._.js"].map(e=>s.l(e))).then(()=>e(313176)))},207580,s=>{s.v(e=>Promise.all(["server/chunks/[externals]__0y3n8y6._.js","server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0q8fc1x._.js"].map(e=>s.l(e))).then(()=>e(27996)))}];
1
+ module.exports=[70729,s=>{s.v(e=>Promise.all(["server/chunks/[externals]_node_crypto_1kn79-7._.js"].map(e=>s.l(e))).then(()=>e(666680)))},102473,s=>{s.v(e=>Promise.all(["server/chunks/[root-of-the-server]__18-2tsq._.js","server/chunks/lib_logger_ts_07e65t5._.js"].map(e=>s.l(e))).then(()=>e(232347)))},242792,s=>{s.v(e=>Promise.all(["server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1y49572._.js","server/chunks/_10tkr26._.js","server/chunks/[root-of-the-server]__0nr-v8s._.js","server/chunks/_1y8w80a._.js","server/chunks/lib_logger_ts_07e65t5._.js","server/chunks/_1kg70wc._.js","server/chunks/_1ogqovh._.js"].map(e=>s.l(e))).then(()=>e(799791)))},327784,s=>{s.v(e=>Promise.all(["server/chunks/[root-of-the-server]__0mrk2it._.js","server/chunks/features_0rfvely._.js","server/chunks/_1tpr507._.js","server/chunks/_05h2cii._.js","server/chunks/[root-of-the-server]__1wnzmx9._.js","server/chunks/_10tkr26._.js","server/chunks/_1jn-aep._.js","server/chunks/_1kg70wc._.js","server/chunks/features_0hdaci0._.js","server/chunks/_136j09a._.js","server/chunks/_1zxp-p6._.js","server/chunks/lib_logger_ts_07e65t5._.js"].map(e=>s.l(e))).then(()=>e(49002)))},193435,s=>{s.v(e=>Promise.all(["server/chunks/[root-of-the-server]__0h_x6q6._.js","server/chunks/features_0hdaci0._.js","server/chunks/_0f6ts7z._.js","server/chunks/_1e48czp._.js","server/chunks/_1y8w80a._.js","server/chunks/lib_logger_ts_07e65t5._.js"].map(e=>s.l(e))).then(()=>e(5509)))},890054,s=>{s.v(e=>Promise.all(["server/chunks/_0eauz4t._.js"].map(e=>s.l(e))).then(()=>e(375814)))},51833,s=>{s.v(e=>Promise.all(["server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1y49572._.js","server/chunks/lib_logger_ts_07e65t5._.js","server/chunks/[root-of-the-server]__1cjxw0-._.js"].map(e=>s.l(e))).then(()=>e(871096)))},573349,s=>{s.v(e=>Promise.all(["server/chunks/[root-of-the-server]__1wbc1wv._.js"].map(e=>s.l(e))).then(()=>e(913803)))},566462,s=>{s.v(e=>Promise.all(["server/chunks/[root-of-the-server]__0rl-fef._.js"].map(e=>s.l(e))).then(()=>e(313176)))},207580,s=>{s.v(e=>Promise.all(["server/chunks/[externals]__0y3n8y6._.js","server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0q8fc1x._.js"].map(e=>s.l(e))).then(()=>e(27996)))}];
2
2
 
3
3
  //# sourceMappingURL=%5Broot-of-the-server%5D__0mrk2it._.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)),_=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(_),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 p=m;for(let e of(m=null,p))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 _(e,t){await i.database.insert(r.callThoughtTable).values({callId:e,...t}).onConflictDoNothing()}async function p(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 h(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,p,"nextTurnSeq",0,b,"readCallConversation",0,h,"readCallSkillsOn",0,m,"saveThought",0,_,"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
@@ -1,3 +1,3 @@
1
- module.exports=[70729,e=>{e.v(s=>Promise.all(["server/chunks/[externals]_node_crypto_1kn79-7._.js"].map(s=>e.l(s))).then(()=>s(666680)))},102473,e=>{e.v(s=>Promise.all(["server/chunks/[root-of-the-server]__18-2tsq._.js","server/chunks/lib_logger_ts_07e65t5._.js"].map(s=>e.l(s))).then(()=>s(232347)))},242792,e=>{e.v(s=>Promise.all(["server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1y49572._.js","server/chunks/_10tkr26._.js","server/chunks/[root-of-the-server]__0nr-v8s._.js","server/chunks/_1y8w80a._.js","server/chunks/lib_logger_ts_07e65t5._.js","server/chunks/_1kg70wc._.js","server/chunks/_1ogqovh._.js"].map(s=>e.l(s))).then(()=>s(799791)))},327784,e=>{e.v(s=>Promise.all(["server/chunks/[root-of-the-server]__0mrk2it._.js","server/chunks/_1tpr507._.js","server/chunks/features_0rfvely._.js","server/chunks/_05h2cii._.js","server/chunks/[root-of-the-server]__1wnzmx9._.js","server/chunks/_10tkr26._.js","server/chunks/_136j09a._.js","server/chunks/_1kg70wc._.js","server/chunks/features_0hdaci0._.js","server/chunks/_1jn-aep._.js","server/chunks/_1zxp-p6._.js","server/chunks/lib_logger_ts_07e65t5._.js"].map(s=>e.l(s))).then(()=>s(49002)))},193435,e=>{e.v(s=>Promise.all(["server/chunks/[root-of-the-server]__0h_x6q6._.js","server/chunks/features_0hdaci0._.js","server/chunks/_0f6ts7z._.js","server/chunks/_1e48czp._.js","server/chunks/_1y8w80a._.js","server/chunks/lib_logger_ts_07e65t5._.js"].map(s=>e.l(s))).then(()=>s(5509)))},733184,e=>e.a(async(s,r)=>{try{var t=e.i(232347),_=e.i(333925),n=e.i(799791),o=e.i(49002),l=e.i(5509),a=e.i(900533),i=e.i(938281),u=e.i(519645),c=e.i(275841),h=s([n,o,l,u]);[n,o,l,u]=h.then?(await h)():h;let j=e=>e?.status==="running"||e?.status==="waiting";async function v(e){let s=await (0,u.latestRun)(e.id);return await (0,l.markSeen)(await (0,u.listUnseenRunIds)(e.id)),(0,o.startThread)({bot:e.bot,request:e.request,label:e.label,from:"user",routine:{id:e.id,when:(0,c.scheduleText)(e.schedule),last:s?.status==="done"&&s.outcome?{at:(0,a.toDate)(s.updatedAt),said:s.outcome}:null}})}async function k(e=new Date){let s=await (0,u.listDueRoutines)(e);if(s.length&&(t.presence.watching||await (0,n.readKeepWorkingOn)()))for(let r of s){let s=await (0,n.findJobBot)(r.bot);if(s&&!s.disabled&&await (0,u.claimRoutine)(r,e)){if(j(await (0,u.latestRun)(r.id))){i.logger.info(`routine "${r.label}" skipped: its last run is still open`);continue}await v(r).catch(e=>i.logger.error(`routine "${r.label}" could not start`,e))}}}e.s(["startRoutineClock",0,function(){let e=globalThis;e.__routineClock&&clearInterval(e.__routineClock);let s=!1;e.__routineClock=setInterval(()=>{s||(s=!0,k().catch(e=>i.logger.error("routine clock",e)).finally(()=>{s=!1}))},_.ROUTINE.tickMs),e.__routineClock.unref()}]),r()}catch(e){r(e)}},!1),890054,e=>{e.v(s=>Promise.all(["server/chunks/_0eauz4t._.js"].map(s=>e.l(s))).then(()=>s(375814)))},51833,e=>{e.v(s=>Promise.all(["server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1y49572._.js","server/chunks/lib_logger_ts_07e65t5._.js","server/chunks/[root-of-the-server]__1cjxw0-._.js"].map(s=>e.l(s))).then(()=>s(871096)))},573349,e=>{e.v(s=>Promise.all(["server/chunks/[root-of-the-server]__1wbc1wv._.js"].map(s=>e.l(s))).then(()=>s(913803)))},566462,e=>{e.v(s=>Promise.all(["server/chunks/[root-of-the-server]__0rl-fef._.js"].map(s=>e.l(s))).then(()=>s(313176)))},207580,e=>{e.v(s=>Promise.all(["server/chunks/[externals]__0y3n8y6._.js","server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0q8fc1x._.js"].map(s=>e.l(s))).then(()=>s(27996)))}];
1
+ module.exports=[70729,e=>{e.v(s=>Promise.all(["server/chunks/[externals]_node_crypto_1kn79-7._.js"].map(s=>e.l(s))).then(()=>s(666680)))},102473,e=>{e.v(s=>Promise.all(["server/chunks/[root-of-the-server]__18-2tsq._.js","server/chunks/lib_logger_ts_07e65t5._.js"].map(s=>e.l(s))).then(()=>s(232347)))},242792,e=>{e.v(s=>Promise.all(["server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1y49572._.js","server/chunks/_10tkr26._.js","server/chunks/[root-of-the-server]__0nr-v8s._.js","server/chunks/_1y8w80a._.js","server/chunks/lib_logger_ts_07e65t5._.js","server/chunks/_1kg70wc._.js","server/chunks/_1ogqovh._.js"].map(s=>e.l(s))).then(()=>s(799791)))},327784,e=>{e.v(s=>Promise.all(["server/chunks/[root-of-the-server]__0mrk2it._.js","server/chunks/features_0rfvely._.js","server/chunks/_1tpr507._.js","server/chunks/_05h2cii._.js","server/chunks/[root-of-the-server]__1wnzmx9._.js","server/chunks/_10tkr26._.js","server/chunks/_1jn-aep._.js","server/chunks/_1kg70wc._.js","server/chunks/features_0hdaci0._.js","server/chunks/_136j09a._.js","server/chunks/_1zxp-p6._.js","server/chunks/lib_logger_ts_07e65t5._.js"].map(s=>e.l(s))).then(()=>s(49002)))},193435,e=>{e.v(s=>Promise.all(["server/chunks/[root-of-the-server]__0h_x6q6._.js","server/chunks/features_0hdaci0._.js","server/chunks/_0f6ts7z._.js","server/chunks/_1e48czp._.js","server/chunks/_1y8w80a._.js","server/chunks/lib_logger_ts_07e65t5._.js"].map(s=>e.l(s))).then(()=>s(5509)))},733184,e=>e.a(async(s,r)=>{try{var t=e.i(232347),_=e.i(333925),n=e.i(799791),o=e.i(49002),l=e.i(5509),a=e.i(900533),i=e.i(938281),u=e.i(519645),c=e.i(275841),h=s([n,o,l,u]);[n,o,l,u]=h.then?(await h)():h;let j=e=>e?.status==="running"||e?.status==="waiting";async function v(e){let s=await (0,u.latestRun)(e.id);return await (0,l.markSeen)(await (0,u.listUnseenRunIds)(e.id)),(0,o.startThread)({bot:e.bot,request:e.request,label:e.label,from:"user",routine:{id:e.id,when:(0,c.scheduleText)(e.schedule),last:s?.status==="done"&&s.outcome?{at:(0,a.toDate)(s.updatedAt),said:s.outcome}:null}})}async function k(e=new Date){let s=await (0,u.listDueRoutines)(e);if(s.length&&(t.presence.watching||await (0,n.readKeepWorkingOn)()))for(let r of s){let s=await (0,n.findJobBot)(r.bot);if(s&&!s.disabled&&await (0,u.claimRoutine)(r,e)){if(j(await (0,u.latestRun)(r.id))){i.logger.info(`routine "${r.label}" skipped: its last run is still open`);continue}await v(r).catch(e=>i.logger.error(`routine "${r.label}" could not start`,e))}}}e.s(["startRoutineClock",0,function(){let e=globalThis;e.__routineClock&&clearInterval(e.__routineClock);let s=!1;e.__routineClock=setInterval(()=>{s||(s=!0,k().catch(e=>i.logger.error("routine clock",e)).finally(()=>{s=!1}))},_.ROUTINE.tickMs),e.__routineClock.unref()}]),r()}catch(e){r(e)}},!1),890054,e=>{e.v(s=>Promise.all(["server/chunks/_0eauz4t._.js"].map(s=>e.l(s))).then(()=>s(375814)))},51833,e=>{e.v(s=>Promise.all(["server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1y49572._.js","server/chunks/lib_logger_ts_07e65t5._.js","server/chunks/[root-of-the-server]__1cjxw0-._.js"].map(s=>e.l(s))).then(()=>s(871096)))},573349,e=>{e.v(s=>Promise.all(["server/chunks/[root-of-the-server]__1wbc1wv._.js"].map(s=>e.l(s))).then(()=>s(913803)))},566462,e=>{e.v(s=>Promise.all(["server/chunks/[root-of-the-server]__0rl-fef._.js"].map(s=>e.l(s))).then(()=>s(313176)))},207580,e=>{e.v(s=>Promise.all(["server/chunks/[externals]__0y3n8y6._.js","server/chunks/node_modules_consola_dist_chunks_prompt_mjs_0q8fc1x._.js"].map(s=>e.l(s))).then(()=>s(27996)))}];
2
2
 
3
3
  //# sourceMappingURL=%5Broot-of-the-server%5D__1ygplx1._.js.map