thursday-agent 0.6.0 → 0.7.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 (193) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/server/app/_global-error.html +1 -1
  5. package/.next/server/app/_global-error.rsc +1 -1
  6. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  9. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  10. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/_not-found.html +1 -1
  12. package/.next/server/app/_not-found.rsc +2 -2
  13. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  14. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  15. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  16. package/.next/server/app/api/artifact/route.js +3 -3
  17. package/.next/server/app/api/artifact/route.js.nft.json +1 -1
  18. package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
  19. package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
  20. package/.next/server/app/api/bot/route.js.nft.json +1 -1
  21. package/.next/server/app/api/bot/thread/[id]/route.js.nft.json +1 -1
  22. package/.next/server/app/api/bot/thread/route.js.nft.json +1 -1
  23. package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
  24. package/.next/server/app/api/memory/edit/route.js +1 -1
  25. package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
  26. package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
  27. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  28. package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
  29. package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
  30. package/.next/server/app/api/thursday/tool-call/route.js +1 -1
  31. package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
  32. package/.next/server/app/api/workspace/missing/route.js +2 -2
  33. package/.next/server/app/api/workspace/missing/route.js.nft.json +1 -1
  34. package/.next/server/app/api/workspace/route.js.nft.json +1 -1
  35. package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +1 -1
  36. package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
  37. package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/page/server-reference-manifest.json +42 -42
  39. package/.next/server/app/page.js +5 -4
  40. package/.next/server/app/page.js.nft.json +1 -1
  41. package/.next/server/app/page_client-reference-manifest.js +1 -1
  42. package/.next/server/chunks/[root-of-the-server]__0-06t3f._.js +8 -0
  43. package/.next/server/chunks/{[root-of-the-server]__049f521._.js → [root-of-the-server]__06l05n_._.js} +1 -1
  44. package/.next/server/chunks/[root-of-the-server]__0_ue8oe._.js +1 -1
  45. package/.next/server/chunks/{[root-of-the-server]__0ye3da2._.js → [root-of-the-server]__0btqrct._.js} +1 -1
  46. package/.next/server/chunks/[root-of-the-server]__0c9fgca._.js +1 -1
  47. package/.next/server/chunks/[root-of-the-server]__0zp35ul._.js +1 -1
  48. package/.next/server/chunks/[root-of-the-server]__1kv8p3e._.js +1 -1
  49. package/.next/server/chunks/_02szwk8._.js +1 -1
  50. package/.next/server/chunks/_06c9kie._.js +24 -24
  51. package/.next/server/chunks/_0i55en5._.js +6 -6
  52. package/.next/server/chunks/_0p56fn0._.js +1 -1
  53. package/.next/server/chunks/_11ujpya._.js +1 -1
  54. package/.next/server/chunks/_1dbixxz._.js +1 -1
  55. package/.next/server/chunks/_1dc_d1q._.js +16 -16
  56. package/.next/server/chunks/_1gnjfli._.js +3 -0
  57. package/.next/server/chunks/_1klbcft._.js +1 -1
  58. package/.next/server/chunks/features_0-cnt0l._.js +1 -1
  59. package/.next/server/chunks/features_0hdaci0._.js +1 -1
  60. package/.next/server/chunks/ssr/[root-of-the-server]__0-e011f._.js +3 -0
  61. package/.next/server/chunks/ssr/[root-of-the-server]__0pd8yr7._.js +3 -0
  62. package/.next/server/chunks/ssr/[root-of-the-server]__1nygfik._.js +1 -1
  63. package/.next/server/chunks/ssr/[root-of-the-server]__1sdphb0._.js +1 -1
  64. package/.next/server/chunks/ssr/{[root-of-the-server]__1fll8dc._.js → [root-of-the-server]__1vdmfbe._.js} +2 -2
  65. package/.next/server/chunks/ssr/[root-of-the-server]__1waa3rc._.js +34 -49
  66. package/.next/server/chunks/ssr/{_1anqots._.js → _0-2qsxo._.js} +2 -2
  67. package/.next/server/chunks/ssr/_02oc_h5._.js +9 -9
  68. package/.next/server/chunks/ssr/_05yghx6._.js +1 -1
  69. package/.next/server/chunks/ssr/_07nbwap._.js +3 -0
  70. package/.next/server/chunks/ssr/_08c4z-9._.js +1 -1
  71. package/.next/server/chunks/ssr/_0_qfdlw._.js +1 -1
  72. package/.next/server/chunks/ssr/_0b6_jv-._.js +3 -0
  73. package/.next/server/chunks/ssr/_0hxt2ul._.js +1 -1
  74. package/.next/server/chunks/ssr/_0i_6q1w._.js +1 -1
  75. package/.next/server/chunks/ssr/{_18xqmny._.js → _0no7i1o._.js} +2 -2
  76. package/.next/server/chunks/ssr/_0tzg--b._.js +3 -0
  77. package/.next/server/chunks/ssr/{_1ztk7p6._.js → _114ylv7._.js} +3 -3
  78. package/.next/server/chunks/ssr/{_1k0spz7._.js → _12c-iwh._.js} +2 -2
  79. package/.next/server/chunks/ssr/_12w42gi._.js +1 -1
  80. package/.next/server/chunks/ssr/{_0eaog6_._.js → _167hchk._.js} +2 -2
  81. package/.next/server/chunks/ssr/{_1x9pskj._.js → _1_x5spz._.js} +3 -3
  82. package/.next/server/chunks/ssr/{_0dr-ddg._.js → _1a61fc9._.js} +2 -2
  83. package/.next/server/chunks/ssr/_1jmz33w._.js +1 -1
  84. package/.next/server/chunks/ssr/{_1y6b5mr._.js → _1w_t7h7._.js} +2 -2
  85. package/.next/server/chunks/ssr/{_0dh2e1j._.js → _1wyfaq_._.js} +7 -7
  86. package/.next/server/chunks/ssr/{[root-of-the-server]__0bxsfyn._.js → _200gt-m._.js} +4 -3
  87. package/.next/server/chunks/ssr/features_config_components_config-setting_tsx_0xfwqdg._.js +1 -1
  88. package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
  89. package/.next/server/chunks/ssr/{_0c9e5w6._.js → features_workspace_00jz2hu._.js} +3 -4
  90. package/.next/server/chunks/ssr/{node_modules_0746rzi._.js → node_modules_02ai7br._.js} +1 -1
  91. package/.next/server/chunks/ssr/{node_modules_0vsxbzp._.js → node_modules_02deexj._.js} +1 -1
  92. package/.next/server/chunks/ssr/{node_modules_1g1eihe._.js → node_modules_07za262._.js} +1 -1
  93. package/.next/server/chunks/ssr/{node_modules_0332gw4._.js → node_modules_0_s9get._.js} +1 -1
  94. package/.next/server/chunks/ssr/{node_modules_1gpednh._.js → node_modules_0n3c7h0._.js} +1 -1
  95. package/.next/server/chunks/ssr/{node_modules_0t-9nup._.js → node_modules_0od6jwr._.js} +1 -1
  96. package/.next/server/chunks/ssr/{node_modules_0mxvg8h._.js → node_modules_0rdt7pk._.js} +1 -1
  97. package/.next/server/chunks/ssr/{node_modules_0vv0-fg._.js → node_modules_0w1z7kz._.js} +1 -1
  98. package/.next/server/chunks/ssr/{node_modules_1d53yiq._.js → node_modules_0wdupfz._.js} +1 -1
  99. package/.next/server/chunks/ssr/{node_modules_1u6w1pb._.js → node_modules_1720w0a._.js} +1 -1
  100. package/.next/server/chunks/ssr/{node_modules_1gu1pph._.js → node_modules_18lsg7d._.js} +1 -1
  101. package/.next/server/chunks/ssr/{node_modules_1he1w8_._.js → node_modules_1b94fxf._.js} +1 -1
  102. package/.next/server/chunks/ssr/{node_modules_0qbfyjh._.js → node_modules_1ecdo1s._.js} +1 -1
  103. package/.next/server/chunks/ssr/{node_modules_0qapgjr._.js → node_modules_1fa9ag7._.js} +1 -1
  104. package/.next/server/chunks/ssr/{node_modules_0d5uzof._.js → node_modules_1fv-_si._.js} +1 -1
  105. package/.next/server/chunks/ssr/{node_modules_1lnjapm._.js → node_modules_1hf461g._.js} +1 -1
  106. package/.next/server/chunks/ssr/{node_modules_1-urho9._.js → node_modules_1m71ta-._.js} +1 -1
  107. package/.next/server/chunks/ssr/{node_modules_1lynj9m._.js → node_modules_1n93n-g._.js} +1 -1
  108. package/.next/server/chunks/ssr/{node_modules_0fr-ml8._.js → node_modules_1n9lqu9._.js} +1 -1
  109. package/.next/server/chunks/ssr/{node_modules_04vxchl._.js → node_modules_1npnsvd._.js} +1 -1
  110. package/.next/server/chunks/ssr/{node_modules_0exkwcm._.js → node_modules_1rn2r0n._.js} +1 -1
  111. package/.next/server/chunks/ssr/{node_modules_022sipm._.js → node_modules_1vq-mfk._.js} +1 -1
  112. package/.next/server/chunks/ssr/{node_modules_00_51_v._.js → node_modules_1vzyw1t._.js} +1 -1
  113. package/.next/server/chunks/ssr/{node_modules_0wsvp00._.js → node_modules_1w359w4._.js} +1 -1
  114. package/.next/server/chunks/ssr/{node_modules_1xn6saw._.js → node_modules_1yajbl6._.js} +1 -1
  115. package/.next/server/chunks/ssr/{node_modules_16pi_dd._.js → node_modules_20eqhy8._.js} +1 -1
  116. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_067_exa._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_019sbis._.js} +1 -1
  117. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0nrrdaq._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0s6piq3._.js} +1 -1
  118. package/.next/server/chunks/ssr/{node_modules_@vercel_oidc_dist_21a5haa._.js → node_modules_@vercel_oidc_dist_05itbb1._.js} +1 -1
  119. package/.next/server/middleware-build-manifest.js +3 -3
  120. package/.next/server/pages/404.html +1 -1
  121. package/.next/server/pages/500.html +1 -1
  122. package/.next/server/server-reference-manifest.js +1 -1
  123. package/.next/server/server-reference-manifest.json +43 -43
  124. package/.next/static/chunks/{0dr16v67vj4n7.js → 07vqbk_9t4em4.js} +2 -2
  125. package/.next/static/chunks/{2nvepds1fu2ux.js → 08krja1zx7nqg.js} +1 -1
  126. package/.next/static/chunks/{42wcg3wfg_m_p.js → 0qcuwdk132jjt.js} +1 -1
  127. package/.next/static/chunks/{2_pnccjp6j1ca.js → 0z69gvysmave7.js} +1 -1
  128. package/.next/static/chunks/12fvz1w5ows75.js +1 -0
  129. package/.next/static/chunks/14t03ned286iu.js +1 -0
  130. package/.next/static/chunks/{2jlz8zp4jax_m.js → 156xxbkrz5lzu.js} +1 -1
  131. package/.next/static/chunks/1fz14reod4lft.js +1 -0
  132. package/.next/static/chunks/{0joan-69kbspd.js → 1g23dbabl-vkr.js} +1 -1
  133. package/.next/static/chunks/{18mkhstgiqcbt.js → 1qy_rc3oxfxok.js} +1 -1
  134. package/.next/static/chunks/1zea7qdl-7365.js +1 -0
  135. package/.next/static/chunks/1zvqumkg7kmo0.css +1 -0
  136. package/.next/static/chunks/26hpqt3y6bogl.js +12 -0
  137. package/.next/static/chunks/{3zk6q3-3f9swq.js → 2_j5mqm6d-z18.js} +1 -1
  138. package/.next/static/chunks/{1vj_5bnbxx84e.js → 2dt6tu7a22svs.js} +1 -1
  139. package/.next/static/chunks/2h5ls3d86kya6.js +1 -0
  140. package/.next/static/chunks/2wc6y1ht6dfuy.js +1 -0
  141. package/.next/static/chunks/{1i-u2wzub_to1.js → 2xr0zpll7thyi.js} +6 -6
  142. package/.next/static/chunks/{26ql4y-43xwhp.js → 31jztc-yq30m7.js} +1 -1
  143. package/.next/static/chunks/391af0i8eljzk.js +1 -0
  144. package/.next/static/chunks/{1kp5nfp06nj9h.js → 3p2s2cjokx1aa.js} +2 -2
  145. package/.next/static/chunks/{1wlo979mx-y3w.js → 41s3fml5oivsa.js} +1 -1
  146. package/README.md +60 -19
  147. package/docs/how-it-works.md +2 -0
  148. package/docs/live-calls.md +38 -33
  149. package/features/ai/load-tools.ts +4 -2
  150. package/features/ai/prompts/bot.prompt.ts +5 -5
  151. package/features/ai/prompts/live.prompt.ts +36 -132
  152. package/features/ai/prompts/prompt-helper.ts +5 -4
  153. package/features/ai/prompts/thursday.prompt.ts +75 -54
  154. package/features/ai/tools/call.tool.ts +32 -4
  155. package/features/ai/tools/tool-name.ts +1 -0
  156. package/features/bot/bot.runner.ts +5 -5
  157. package/features/thursday/ascii.const.ts +74 -0
  158. package/features/thursday/components/ascii-orb.tsx +173 -30
  159. package/features/thursday/components/face.tsx +6 -1
  160. package/features/thursday/components/side-captions.tsx +273 -0
  161. package/features/thursday/components/tab-state.tsx +11 -3
  162. package/features/thursday/components/thursday-setting.tsx +6 -5
  163. package/features/thursday/components/thursday.tsx +227 -251
  164. package/features/thursday/face.store.ts +5 -0
  165. package/features/thursday/thursday.action.ts +4 -6
  166. package/features/thursday/thursday.schema.ts +10 -5
  167. package/features/thursday/thursday.store.ts +3 -0
  168. package/features/thursday/use-thursday.ts +461 -392
  169. package/features/workspace/file-kind.ts +9 -0
  170. package/hooks/use-hotkey.ts +3 -2
  171. package/lib/live/live.schema.ts +0 -21
  172. package/lib/live/live.server.ts +1 -3
  173. package/package.json +1 -1
  174. package/scripts/artifact-paths.test.mts +13 -0
  175. package/scripts/live-session.test.mts +56 -66
  176. package/.next/server/chunks/[root-of-the-server]__0g-ueei._.js +0 -8
  177. package/.next/server/chunks/node_modules_consola_dist_chunks_prompt_mjs_1kipdeo._.js +0 -3
  178. package/.next/server/chunks/ssr/[root-of-the-server]__172cq4x._.js +0 -3
  179. package/.next/server/chunks/ssr/_03_928f._.js +0 -3
  180. package/.next/server/chunks/ssr/_0g_rlog._.js +0 -3
  181. package/.next/server/chunks/ssr/_123ttsf._.js +0 -3
  182. package/.next/static/chunks/10k2xvap03z20.css +0 -1
  183. package/.next/static/chunks/1t9qms5pwwa3n.js +0 -1
  184. package/.next/static/chunks/2a51-ywz9b2a3.js +0 -1
  185. package/.next/static/chunks/2fvdgxih7x7hr.js +0 -1
  186. package/.next/static/chunks/3addj3i4-izma.js +0 -1
  187. package/.next/static/chunks/3gfh7nxwusbt0.js +0 -1
  188. package/.next/static/chunks/3gwa44cvz4qoi.js +0 -1
  189. package/.next/static/chunks/3zkg5iup3v4a2.js +0 -12
  190. package/.next/static/chunks/405m0bqtoihev.js +0 -1
  191. /package/.next/static/{0qzGoKn2wTERVZtblX1tp → yyRVBc0xxYQsh3GpbQX9b}/_buildManifest.js +0 -0
  192. /package/.next/static/{0qzGoKn2wTERVZtblX1tp → yyRVBc0xxYQsh3GpbQX9b}/_clientMiddlewareManifest.js +0 -0
  193. /package/.next/static/{0qzGoKn2wTERVZtblX1tp → yyRVBc0xxYQsh3GpbQX9b}/_ssgManifest.js +0 -0
@@ -1,4 +1,4 @@
1
- module.exports=[652619,a=>a.a(async(b,c)=>{try{var d=a.i(666680),e=a.i(347299),f=a.i(345364),g=a.i(47919),h=a.i(868468),i=a.i(53112),j=a.i(203469),k=a.i(569572),l=a.i(725466),m=a.i(176668),n=a.i(523095),o=a.i(293480),p=a.i(8412),q=a.i(182248),r=a.i(689656),s=b([l]);[l]=s.then?(await s)():s;let C="app_EMoamEEZ73f0CkXaXp7hrann",D="http://localhost:1455/auth/callback",E=["127.0.0.1","::1"],F="thursday",{apiKeyName:G,label:H}=r.TEXT_MODEL_PROVIDERS.chatgpt,I=`${H} is not signed in — sign in from Config.`,J=i.z.object({access:i.z.string().min(1),refresh:i.z.string().min(1),expires:i.z.number(),accountId:i.z.string().min(1),plan:i.z.string().nullable()}),K=globalThis,L=K.__chatgptRenewal??=(0,p.createKeyedLock)();async function t(){u();let a=(0,d.randomBytes)(32).toString("base64url"),b=(0,d.randomBytes)(16).toString("hex"),c=[],f=(d,e)=>{v(d.url??"/",{state:b,verifier:a}).then(a=>{e.writeHead(a.status,{"content-type":"text/html; charset=utf-8"}),e.end((0,n.oauthPage)(a.title,a.detail,{autoClose:200===a.status}),()=>{a.last&&K.__chatgptListeners===c&&u()})})};for(let a of E){let b=(0,e.createServer)(f),d=await new Promise(c=>{b.once("error",c),b.listen(1455,a,()=>c(null))});if(!d){c.push(b);continue}if("EADDRNOTAVAIL"!==d.code&&"EAFNOSUPPORT"!==d.code){for(let a of c)a.close();(0,o.publicError)("EADDRINUSE"===d.code?"Port 1455 is in use by another app — often a ChatGPT or Codex sign-in still waiting. Finish or close it, then try again.":`Could not wait for the sign-in: ${(0,q.errorToString)(d)}`)}}K.__chatgptListeners=c,setTimeout(()=>{K.__chatgptListeners===c&&u()},k.CHATGPT_SIGN_IN.waitMs).unref();let g=new URL("https://auth.openai.com/oauth/authorize");return g.search=new URLSearchParams({response_type:"code",client_id:C,redirect_uri:D,scope:"openid profile email offline_access",code_challenge:(0,d.createHash)("sha256").update(a).digest("base64url"),code_challenge_method:"S256",state:b,id_token_add_organizations:"true",codex_cli_simplified_flow:"true",originator:F}).toString(),g.toString()}function u(){let a=K.__chatgptListeners;for(let b of(K.__chatgptListeners=null,a??[]))b.close(),b.closeIdleConnections()}async function v(a,b){let c=new URL(a,D);if("/auth/callback"!==c.pathname)return{status:404,title:"Not found",detail:"",last:!1};let d=c.searchParams.get("error");if(d){let a=c.searchParams.get("error_description");return{status:400,title:"Sign-in failed",detail:a?`${d}: ${a}`:d,last:!0}}let e=c.searchParams.get("code");if(!e||c.searchParams.get("state")!==b.state)return{status:400,title:"Sign-in failed",detail:"This is not the sign-in that was started. Start again from Config.",last:!1};try{let a=await w({grant_type:"authorization_code",code:e,code_verifier:b.verifier,redirect_uri:D});return await (0,l.writeConfig)(G,JSON.stringify(a)),j.appEvents.emit({type:"config"}),{status:200,title:"Signed in to ChatGPT",detail:"Bots can run on your plan now. This window closes itself.",last:!0}}catch(a){return m.logger.warn({cause:a},"chatgpt sign-in failed"),{status:502,title:"Sign-in failed",detail:(0,q.errorToString)(a),last:!0}}}async function w(a){let b=await fetch("https://auth.openai.com/oauth/token",{method:"POST",headers:{accept:"application/json","content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:C,...a})}).catch(a=>{m.logger.warn({cause:a},"chatgpt token endpoint unreachable"),(0,o.publicError)("Could not reach ChatGPT's sign-in")}),c=await b.json().catch(()=>null),d=c?.access_token;if(!b.ok||!d){let a=c?.error,d="string"==typeof a?[a,c?.error_description].filter(Boolean).join(": "):a?.message??a?.code??"";(0,o.publicError)(`ChatGPT's sign-in answered ${b.status}${d?`: ${d}`:""}`)}let e=function(a){try{let b=JSON.parse(Buffer.from(a.split(".")[1]??"","base64url").toString("utf8")),c=b["https://api.openai.com/auth"]??{};return{accountId:"string"==typeof c.chatgpt_account_id?c.chatgpt_account_id:null,plan:"string"==typeof c.chatgpt_plan_type?c.chatgpt_plan_type:null,expires:"number"==typeof b.exp?1e3*b.exp:null}}catch{return{accountId:null,plan:null,expires:null}}}(d),f=c?.refresh_token??a.refresh_token;e.accountId&&f||(0,o.publicError)("ChatGPT's sign-in came back without an account");let g=c?.expires_in;return{access:d,refresh:f,expires:"number"==typeof g?Date.now()+1e3*g:e.expires??Date.now(),accountId:e.accountId,plan:e.plan}}async function x(){let a=await (0,l.readConfig)(G);if(!a)return null;try{return J.parse(JSON.parse(a))}catch{return null}}let M=a=>a.expires-k.CHATGPT_SIGN_IN.renewBeforeMs<=Date.now();async function y(){let a=await x();return(a||(0,o.publicError)(I),M(a))?L(G,async()=>{let a=await x();if(a||(0,o.publicError)(I),!M(a))return a;try{let b=await w({grant_type:"refresh_token",refresh_token:a.refresh});return await (0,l.writeConfig)(G,JSON.stringify(b)),b}catch(a){(0,o.publicError)(`Could not renew the ${H} sign-in (${(0,q.errorToString)(a)}). If it keeps failing, sign in again from Config.`)}}):a}async function z(a,b){let c=await y(),d=new Headers(b?.headers);if(d.set("authorization",`Bearer ${c.access}`),d.set("chatgpt-account-id",c.accountId),d.set("originator",F),b?.method!=="POST"||"string"!=typeof b.body||!String(a).endsWith("/responses"))return fetch(a,{...b,headers:d});let e=JSON.parse(b.body),f=!0===e.stream,g=[];e.input=(e.input??[]).filter(a=>"system"!==a.role&&"developer"!==a.role||(g.push("string"==typeof a.content?a.content:(a.content??[]).map(a=>a.text??"").join("\n")),!1)),e.instructions=[e.instructions,...g].filter(Boolean).join("\n\n")||"You are a helpful assistant.",e.store=!1,e.stream=!0,e.max_output_tokens=void 0,d.set("accept","text/event-stream");let h=await fetch(a,{...b,headers:d,body:JSON.stringify(e)});return 429===h.status?A(h):f||!h.ok?h:B(h)}async function A(a){let b=await a.text(),c={};try{c=JSON.parse(b).error??{}}catch{}if(!/usage_limit_reached|usage_not_included/.test(`${c.code} ${c.type}`)){let c=a.headers.get("retry-after");return new Response(b,{status:429,headers:{"content-type":"application/json",...c?{"retry-after":c}:{}}})}let d=c.resets_at?1e3*c.resets_at:c.resets_in_seconds?Date.now()+1e3*c.resets_in_seconds:null,e=c.plan_type?` on the ${c.plan_type} plan`:"",f=d?` It resets in ${(0,h.formatDistanceToNowStrict)(d)}.`:"";return Response.json({error:{message:`${H} usage limit reached${e}.${f}`,code:c.code??c.type}},{status:402})}async function B(a){let b=[],c=null,d=null;for(let e of(await a.text()).replaceAll("\r\n","\n").split("\n\n")){let a,f=e.split("\n").filter(a=>a.startsWith("data:")).map(a=>a.slice(5).trimStart()).join("\n");if(f&&"[DONE]"!==f){try{a=JSON.parse(f)}catch{continue}"response.output_item.done"===a.type?b.push(a.item):"response.completed"===a.type||"response.incomplete"===a.type?c=a.response??{}:"response.failed"===a.type?d=a.response?.error??{message:"The response failed"}:"error"===a.type&&(d={code:a.code,message:a.message})}}return d||!c?Response.json({error:{message:d?.message??"The stream ended before the response finished",code:d?.code}},{status:d?.code==="context_length_exceeded"?400:500}):Response.json({...c,output:c.output?.length?c.output:b})}a.s(["chatGptModel",0,function(a){let b=(0,f.createOpenAI)({baseURL:"https://chatgpt.com/backend-api/codex",apiKey:"signed-in",headers:{"OpenAI-Beta":"responses=experimental"},fetch:z}),c=(0,d.randomUUID)();return(0,g.wrapLanguageModel)({model:b.responses(a),middleware:{transformParams:async({params:a})=>({...a,providerOptions:{...a.providerOptions,openai:{promptCacheKey:c,...a.providerOptions?.openai,store:!1}}})}})},"startChatGptSignIn",0,t]),c()}catch(a){c(a)}},!1),738131,a=>a.a(async(b,c)=>{try{var d=a.i(527990),e=a.i(868468),f=a.i(569572),g=a.i(938934),h=a.i(978876),i=a.i(375827),j=a.i(138902),k=a.i(345846),l=a.i(622547),m=a.i(451017),n=a.i(762008),o=a.i(547613),p=a.i(446957),q=a.i(138100),r=a.i(569549),s=a.i(821415),t=a.i(706210),u=a.i(176668),v=a.i(293480),w=a.i(987674),x=a.i(182248),y=b([j,k,l,r]);async function z(b){let{listThreadOverview:c}=await a.A(343064),d=await c();if(!d.length)return"No jobs have been handed over yet.";let e=d.map(a=>`"${a.label}" (${a.bot}, ${a.status})`).join(", ");return`There is no job called "${b}". The latest are: ${e}. Call again with one of those names.`}async function A(a,b){let c=[];for(let[a,e]of Object.entries(b)){let b=await (0,d.asSchema)(e.inputSchema).jsonSchema,f="string"==typeof e.description?e.description:"";c.push({name:a,tokens:(0,w.estimateTokens)(f)+(0,w.estimateTokens)(JSON.stringify(b))})}c.sort((a,b)=>b.tokens-a.tokens);let e=c.reduce((a,b)=>a+b.tokens,0);u.logger.debug(`${a} tools ${e} tokens over ${c.length} — ${c.map(a=>`${a.name} ${a.tokens}`).join(", ")}`)}async function B(a){let b=await C(a);return f.IS_DEV&&await A(a.target,b),b}async function C(b){if("memory-edit"===b.target){let a=(0,k.createMemoryTools)("user",null,{countReads:!1});return{[n.TOOL_NAMES.memory_recall]:a[n.TOOL_NAMES.memory_recall],[n.TOOL_NAMES.memory_remember]:a[n.TOOL_NAMES.memory_remember],[n.TOOL_NAMES.memory_forget]:a[n.TOOL_NAMES.memory_forget]}}let{[n.TOOL_NAMES.memory_conversation]:c,...u}=(0,k.createMemoryTools)("call","thursday"===b.target?b.callId??null:null),w={[n.TOOL_NAMES.memory_conversation]:c},y=await (0,s.openWorkspace)();if("thursday"===b.target){var A;let c=await (0,r.readCallSkillsOn)()?(0,m.createSkillTools)({sandbox:y,skills:await (0,q.loadSkills)(y)}):{};return{...u,...w,...c,...(0,o.createWorkspaceTools)(y,{write:!1,timeoutMs:f.CALL_EXEC_TIMEOUT_MS}),...(A=b.callId,{[n.TOOL_NAMES.delegate]:(0,d.tool)({description:h.delegateSpec.description,inputSchema:h.delegateSpec.parameters,execute:async({bot:b,request:c,label:d})=>{let{findJobBot:e,listJobBots:f}=await a.A(276307),g=await e(b);if(!g||g.disabled){let a=(await f()).map(a=>a.name);return`There is no bot called "${b}". The bots are: ${a.join(", ")}. Nothing was handed over — call again with one of those.`}let{startThread:h}=await a.A(763543);return{threadId:await h({bot:g.name,request:c,label:d,callId:A,from:"thursday"}),note:`${g.name} has "${d}". Its updates reach the conversation on their own. Anything further about this work — an answer, a correction, the next step once it finishes — is \`${n.TOOL_NAMES.thread}\` with "${d}".`}}}),[n.TOOL_NAMES.thread]:(0,d.tool)({description:h.threadSpec.description,inputSchema:h.threadSpec.parameters,execute:async({action:b,thread:c,answer:d,recipient:f,replyTo:h})=>{let i,{listThreadOverview:j,resolveThread:k}=await a.A(343064);if("status"===b){let b=d?.trim()?{note:"The text in `answer` was not passed on — `status` only reads. Send it again as `answer` if the bot is meant to hear it."}:{},f={now:(0,g.clockNow)()};if(c){let d=await k(c);if(!d)return await z(c);let{findThreadView:g}=await a.A(343064),h=(await g(d.id))?.room;return{...f,...b,label:d.label,id:d.id,bot:d.bot,participants:h?.participants??[],questions:h?.questions??[],status:d.status,since:(0,e.formatDistanceToNowStrict)((0,t.toDate)(d.updatedAt),{addSuffix:!0}),outcome:d.outcome,..."waiting"===d.status&&d.pending?.options.length?{options:d.pending.options}:{}}}let h=await j();return{...f,...b,threads:h.map(a=>({id:a.id,label:a.label,bot:a.bot,status:a.status,participants:a.room.participants,questions:a.room.questions.map(a=>({...a,text:(0,x.clip)(a.text,200)})),since:(0,e.formatDistanceToNowStrict)((0,t.toDate)(a.updatedAt),{addSuffix:!0}),...a.ask?{asking:a.ask.question,options:a.ask.options}:{},..."running"===a.status?{now:(0,p.threadActivity)(a.lines)}:{},...a.outcome&&"waiting"!==a.status?{outcome:(0,x.clip)(a.outcome,200)}:{}}))}}let{listInboxThreads:l,markSeen:m}=await a.A(343064),o=!c&&("answer"===b||"open"===b),q=o?await l():[],r="answer"===b?q.filter(a=>a.room.questions.length):[];if(r.length>1)return`Questions are waiting in more than one job: ${r.map(a=>`"${a.label}" (${a.room.questions.map(a=>a.bot).join(", ")})`).join(", ")}. Name the job.`;let s=c?await k(c):"answer"===b?r[0]??null:o?q[0]??null:null;if(!s)return c?await z(c):"answer"===b?`No question is waiting. Name the job this is for; \`${n.TOOL_NAMES.thread}\` \`status\` lists them.`:o?"No job has moved yet — say which one, or check `status` first.":"Say which job — by its label. Call `status` with no job named to see them.";if("open"===b){if(!(o?q:await l()).some(a=>a.id===s.id))return`"${s.label}" is older than the call screen keeps; it is under Settings › Threads.`;let{appEvents:b}=await a.A(133300);return b.emit({type:"showThread",threadId:s.id}),{label:s.label,open:!0}}if("seen"===b)return await m([s.id]),{label:s.label,seen:!0};let{answerThread:u,cancelThread:w}=await a.A(763543);if("cancel"===b)return await w(s.id),{label:s.label,status:"cancelled"};if(!d?.trim())return"Say what to pass on.";try{i=await u(s.id,d.trim(),"thursday",f??void 0,h??void 0)}catch(a){if((0,v.isPublicError)(a))return a.message;throw a}return i?.answered?{label:s.label,answered:i.answered,note:`${i.answered.bot} has the answer to its question and goes on from it.`}:{label:s.label,bot:i?.to??s.bot,status:"running",note:"running"===s.status?"The bot reads it before its next step.":"The bot picks the job back up from there."}}})}),...i.CALL_TOOLS}}let B=await (0,q.loadSkills)(y);return{[n.TOOL_NAMES.memory_recall]:u[n.TOOL_NAMES.memory_recall],...w,...await (0,l.createSearchTool)(b.model,y),...(0,o.createWorkspaceTools)(y,{write:!0,env:{...(0,s.jobShellEnv)(b.session),...(0,s.botShellEnv)(b.bot)},guide:!0,bot:b.bot}),...await (0,j.createMcpTools)(b.bot,y),...(0,m.createSkillTools)({sandbox:y,skills:B})}}[j,k,l,r]=y.then?(await y)():y,a.s(["loadTools",0,B]),c()}catch(a){c(a)}},!1),875931,a=>a.a(async(b,c)=>{try{var d=a.i(938537),e=a.i(140358),f=a.i(345364),g=a.i(655819),h=a.i(652685),i=a.i(438766),j=a.i(47919);a.i(569572);var k=a.i(688034),l=a.i(725466),m=a.i(176668),n=a.i(293480),o=a.i(182248),p=a.i(652619),q=a.i(689656),r=b([l,p]);[l,p]=r.then?(await r)():r;let C=/context[ _-]?(length|window)|maximum context|prompt is too long|too many (input )?tokens|input token count|exceeds? the (maximum|model'?s?) (context|input|prompt|number of tokens)|maximum prompt length|request (entity )?too large/i;function s(a){return t(a).some(a=>{let{statusCode:b,message:c,error:d}=a;if(void 0!==b&&400!==b&&413!==b)return!1;let e=h.APICallError.isInstance(a)?a.responseBody:null;return[c,d,e].some(a=>"string"==typeof a&&C.test(a))})}let D=new Set([408,409,429]);function t(a){let b=[],c=[a];for(;c.length&&b.length<12;){let a=c.shift();!("object"!=typeof a||null===a||b.includes(a))&&(b.push(a),j.RetryError.isInstance(a)&&c.push(...a.errors),"cause"in a&&c.push(a.cause))}return b}let E=null;function u(a){if(null==a||""===a)return null;let b=Number(a);return Number.isFinite(b)?Math.round(1e6*b*1e4)/1e4:null}async function v(){if(E&&Date.now()-E.at<6e5)return E.models;let a=await fetch("https://ai-gateway.vercel.sh/v1/models",{headers:{accept:"application/json"}}).catch(a=>{m.logger.warn({cause:a},"gateway catalog unreachable"),(0,n.publicError)("Could not reach the gateway")});a.ok||(0,n.publicError)(`The gateway answered ${a.status}`);let b=((await a.json()).data??[]).filter(a=>!!a.id).map(a=>({id:a.id,label:a.name||a.id,owner:a.owned_by||a.id.slice(0,a.id.indexOf("/")),type:a.type??null,tags:a.tags??[],price:function(a){let b=a.pricing??{},c=u(b.input),d=u(b.output);if((a.tags??[]).includes("free")||0===c)return{in:0,out:0,note:null,free:!0};let e=b.transcription_duration_cost_per_second??b.realtime_session_duration_cost_per_second;if(e)return{in:null,out:null,note:`$${e}/s`,free:!1};if(b.speech_input_character_cost)return{in:null,out:null,note:"per character",free:!1};let f=Array.isArray(b.video_duration_pricing)?b.video_duration_pricing[0]:null;if(f)return{in:null,out:null,note:`$${f.cost_per_second}/s ${f.resolution}`,free:!1};let g=b.image?`$${b.image}/image`:b.image_dimension_quality_pricing?"per image, by size":null;return null===c&&null===d?{in:null,out:null,note:g,free:!1}:{in:c,out:d,note:b.input_tiers?"tiered":b.varies_by_provider?"varies":g&&"+ per image",free:!1}}(a),retiring:!!a.deprecated_at,contextWindow:"number"==typeof a.context_window&&a.context_window>0?a.context_window:null})).sort((a,b)=>a.id.localeCompare(b.id));return E={at:Date.now(),models:b},b}async function w(a,b){if(b&&b>0)return b;let c="vercel-ai-gateway"===a.provider?await v().catch(()=>[]):[];return(0,q.compactAtFor)((0,q.contextWindowOf)(a.provider,a.model,c))}async function x(){return await v().then(a=>new Set(a.map(a=>a.id))).catch(()=>null)}async function y(a,b){if("vercel-ai-gateway"!==a)return b;let c=await x();if(!c)return b;let d=b.filter(a=>c.has(a.id));return d.length>0?d:b}async function z(a){let{label:b,apiKeyName:c,signIn:h}=q.TEXT_MODEL_PROVIDERS[a.provider],j=await (0,l.readConfig)(c);return j||(0,n.publicError)(h?`${b} is not signed in — sign in from Config.`:`No ${b} key — add one in Config.`),function(a,b){switch(a.provider){case"openai":{let c=(0,f.createOpenAI)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.webSearch()}}}case"chatgpt":return{ref:a,model:(0,p.chatGptModel)(a.model),searchTools:null};case"anthropic":{let c=(0,d.createAnthropic)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.webSearch_20260209()}}}case"google":{let c=(0,e.createGoogleGenerativeAI)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.googleSearch({})}}}case"xai":{let c=(0,g.createXai)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.webSearch()}}}case"vercel-ai-gateway":{let c=(0,i.createGateway)({apiKey:b});return{ref:a,model:c(a.model),searchTools:null}}default:(0,n.publicError)(`Not supported provider: ${String(a.provider)}`)}}(a,j)}async function A(a){let b=async a=>(0,q.defaultModelOf)({suggestModels:await y(a.id,a.suggestModels)}),c=a?q.TEXT_MODEL_PROVIDER_LIST.find(b=>b.id===a):void 0,d=["openai","xai"].map(a=>({...q.TEXT_MODEL_PROVIDERS[a],id:a}));if(c){let a=await b(c);if(a)return{provider:c.id,model:a}}let e=(0,q.parseTextModel)(await (0,l.readConfig)(k.DEFAULT_MODEL_KEY)??void 0);if(e&&await (0,l.readConfig)(q.TEXT_MODEL_PROVIDERS[e.provider].apiKeyName))return e;for(let a of[...d,...q.TEXT_MODEL_PROVIDER_LIST]){if(!await (0,l.readConfig)(a.apiKeyName))continue;let c=await b(a);if(c)return m.logger.info(`no model set, falling back to ${a.id}/${c}`),{provider:a.id,model:c}}(0,n.publicError)("No model key is set — add one in Config")}async function B(a){let b=(0,q.parseMediaModel)(await (0,l.readConfig)(k.MEDIA_MODEL_KEYS[a]));if(!b||!(0,q.canMakeKind)(b.provider,a))return null;let c=await (0,l.readConfig)(q.MEDIA_MODEL_PROVIDERS[b.provider].apiKeyName);return c?{ref:b,apiKey:c}:null}a.s(["buildImageModel",0,function(a,b){switch(a.provider){case"openai":return(0,f.createOpenAI)({apiKey:b}).image(a.model);case"google":return(0,e.createGoogleGenerativeAI)({apiKey:b}).image(a.model);case"xai":return(0,g.createXai)({apiKey:b}).image(a.model);case"vercel-ai-gateway":return(0,i.createGateway)({apiKey:b}).image(a.model);default:(0,n.publicError)(`Not supported image provider: ${String(a.provider)}`)}},"buildSpeechModel",0,function(a,b){switch(a.provider){case"openai":return(0,f.createOpenAI)({apiKey:b}).speech(a.model);case"google":return(0,e.createGoogleGenerativeAI)({apiKey:b}).speech(a.model);case"xai":return(0,g.createXai)({apiKey:b}).speech();case"vercel-ai-gateway":return(0,i.createGateway)({apiKey:b}).speech(a.model);default:(0,n.publicError)(`Not supported speech provider: ${String(a.provider)}`)}},"buildTranscriptionModel",0,function(a,b){switch(a.provider){case"openai":return(0,f.createOpenAI)({apiKey:b}).transcription(a.model);case"google":return(0,e.createGoogleGenerativeAI)({apiKey:b}).transcription(a.model);case"xai":return(0,g.createXai)({apiKey:b}).transcription();case"vercel-ai-gateway":return(0,i.createGateway)({apiKey:b}).transcription(a.model);default:(0,n.publicError)(`Not supported transcription provider: ${String(a.provider)}`)}},"buildVideoModel",0,function(a,b){switch(a.provider){case"google":return(0,e.createGoogleGenerativeAI)({apiKey:b}).video(a.model);case"xai":return(0,g.createXai)({apiKey:b}).video(a.model);case"vercel-ai-gateway":return(0,i.createGateway)({apiKey:b}).video(a.model);default:(0,n.publicError)(`${a.provider} has no video model`)}},"compactBudget",0,w,"getTextModel",0,z,"isContextOverflow",0,s,"isProviderRefusal",0,function(a){return!s(a)&&t(a).some(a=>{let{statusCode:b}=a;return"number"==typeof b&&b>=400&&b<500&&!D.has(b)})},"modelErrorToString",0,function(a){if(!h.APICallError.isInstance(a))return(0,o.errorToString)(a);let b=a.statusCode?` (${a.statusCode})`:"",c=a.responseBody?.trim(),d=c&&!c.includes(a.message)?` ${(0,o.clip)(c,300)}`:"";return`${a.message}${b}${d}`},"resolveDefaultModel",0,A,"resolveMediaRef",0,B]),c()}catch(a){c(a)}},!1),735502,a=>a.a(async(b,c)=>{try{var d=a.i(12208),e=a.i(569572),f=a.i(762008),g=a.i(641301),h=a.i(221214),i=a.i(947950),j=a.i(986743),k=a.i(138100),l=a.i(821415),m=a.i(706210),n=a.i(176668),o=a.i(182248),p=a.i(644468),q=a.i(938934),r=b([h,i,j,p]);async function s(a,b,c,r){var s,v,w,x,y,z,A,B,C;let D,E,F,G,H,I,J=await (0,l.openWorkspace)(),K=a.trim(),[L,M,N,O,P,Q,R,S]=await Promise.all([(0,k.loadSkills)(J),(0,j.listNoteIndex)(),(0,p.listConnectedToolNames)(),(0,i.findPinnedTools)(K),(0,h.listJobBots)(),(0,g.listBotMemory)(K),(0,h.readBotMemoryOn)(),(0,l.readMachineTools)(J)]),T=P.filter(a=>a.name!==K),U=[(s=K,v=c,E=(D=v?.owner??s)===s?"**You** coordinate this thread: its result goes from you to Thursday.":`**${D}** coordinates this thread and brings its result to Thursday.`,F=v?`
1
+ module.exports=[652619,a=>a.a(async(b,c)=>{try{var d=a.i(666680),e=a.i(347299),f=a.i(345364),g=a.i(47919),h=a.i(868468),i=a.i(53112),j=a.i(203469),k=a.i(569572),l=a.i(725466),m=a.i(176668),n=a.i(523095),o=a.i(293480),p=a.i(8412),q=a.i(182248),r=a.i(689656),s=b([l]);[l]=s.then?(await s)():s;let C="app_EMoamEEZ73f0CkXaXp7hrann",D="http://localhost:1455/auth/callback",E=["127.0.0.1","::1"],F="thursday",{apiKeyName:G,label:H}=r.TEXT_MODEL_PROVIDERS.chatgpt,I=`${H} is not signed in — sign in from Config.`,J=i.z.object({access:i.z.string().min(1),refresh:i.z.string().min(1),expires:i.z.number(),accountId:i.z.string().min(1),plan:i.z.string().nullable()}),K=globalThis,L=K.__chatgptRenewal??=(0,p.createKeyedLock)();async function t(){u();let a=(0,d.randomBytes)(32).toString("base64url"),b=(0,d.randomBytes)(16).toString("hex"),c=[],f=(d,e)=>{v(d.url??"/",{state:b,verifier:a}).then(a=>{e.writeHead(a.status,{"content-type":"text/html; charset=utf-8"}),e.end((0,n.oauthPage)(a.title,a.detail,{autoClose:200===a.status}),()=>{a.last&&K.__chatgptListeners===c&&u()})})};for(let a of E){let b=(0,e.createServer)(f),d=await new Promise(c=>{b.once("error",c),b.listen(1455,a,()=>c(null))});if(!d){c.push(b);continue}if("EADDRNOTAVAIL"!==d.code&&"EAFNOSUPPORT"!==d.code){for(let a of c)a.close();(0,o.publicError)("EADDRINUSE"===d.code?"Port 1455 is in use by another app — often a ChatGPT or Codex sign-in still waiting. Finish or close it, then try again.":`Could not wait for the sign-in: ${(0,q.errorToString)(d)}`)}}K.__chatgptListeners=c,setTimeout(()=>{K.__chatgptListeners===c&&u()},k.CHATGPT_SIGN_IN.waitMs).unref();let g=new URL("https://auth.openai.com/oauth/authorize");return g.search=new URLSearchParams({response_type:"code",client_id:C,redirect_uri:D,scope:"openid profile email offline_access",code_challenge:(0,d.createHash)("sha256").update(a).digest("base64url"),code_challenge_method:"S256",state:b,id_token_add_organizations:"true",codex_cli_simplified_flow:"true",originator:F}).toString(),g.toString()}function u(){let a=K.__chatgptListeners;for(let b of(K.__chatgptListeners=null,a??[]))b.close(),b.closeIdleConnections()}async function v(a,b){let c=new URL(a,D);if("/auth/callback"!==c.pathname)return{status:404,title:"Not found",detail:"",last:!1};let d=c.searchParams.get("error");if(d){let a=c.searchParams.get("error_description");return{status:400,title:"Sign-in failed",detail:a?`${d}: ${a}`:d,last:!0}}let e=c.searchParams.get("code");if(!e||c.searchParams.get("state")!==b.state)return{status:400,title:"Sign-in failed",detail:"This is not the sign-in that was started. Start again from Config.",last:!1};try{let a=await w({grant_type:"authorization_code",code:e,code_verifier:b.verifier,redirect_uri:D});return await (0,l.writeConfig)(G,JSON.stringify(a)),j.appEvents.emit({type:"config"}),{status:200,title:"Signed in to ChatGPT",detail:"Bots can run on your plan now. This window closes itself.",last:!0}}catch(a){return m.logger.warn({cause:a},"chatgpt sign-in failed"),{status:502,title:"Sign-in failed",detail:(0,q.errorToString)(a),last:!0}}}async function w(a){let b=await fetch("https://auth.openai.com/oauth/token",{method:"POST",headers:{accept:"application/json","content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:C,...a})}).catch(a=>{m.logger.warn({cause:a},"chatgpt token endpoint unreachable"),(0,o.publicError)("Could not reach ChatGPT's sign-in")}),c=await b.json().catch(()=>null),d=c?.access_token;if(!b.ok||!d){let a=c?.error,d="string"==typeof a?[a,c?.error_description].filter(Boolean).join(": "):a?.message??a?.code??"";(0,o.publicError)(`ChatGPT's sign-in answered ${b.status}${d?`: ${d}`:""}`)}let e=function(a){try{let b=JSON.parse(Buffer.from(a.split(".")[1]??"","base64url").toString("utf8")),c=b["https://api.openai.com/auth"]??{};return{accountId:"string"==typeof c.chatgpt_account_id?c.chatgpt_account_id:null,plan:"string"==typeof c.chatgpt_plan_type?c.chatgpt_plan_type:null,expires:"number"==typeof b.exp?1e3*b.exp:null}}catch{return{accountId:null,plan:null,expires:null}}}(d),f=c?.refresh_token??a.refresh_token;e.accountId&&f||(0,o.publicError)("ChatGPT's sign-in came back without an account");let g=c?.expires_in;return{access:d,refresh:f,expires:"number"==typeof g?Date.now()+1e3*g:e.expires??Date.now(),accountId:e.accountId,plan:e.plan}}async function x(){let a=await (0,l.readConfig)(G);if(!a)return null;try{return J.parse(JSON.parse(a))}catch{return null}}let M=a=>a.expires-k.CHATGPT_SIGN_IN.renewBeforeMs<=Date.now();async function y(){let a=await x();return(a||(0,o.publicError)(I),M(a))?L(G,async()=>{let a=await x();if(a||(0,o.publicError)(I),!M(a))return a;try{let b=await w({grant_type:"refresh_token",refresh_token:a.refresh});return await (0,l.writeConfig)(G,JSON.stringify(b)),b}catch(a){(0,o.publicError)(`Could not renew the ${H} sign-in (${(0,q.errorToString)(a)}). If it keeps failing, sign in again from Config.`)}}):a}async function z(a,b){let c=await y(),d=new Headers(b?.headers);if(d.set("authorization",`Bearer ${c.access}`),d.set("chatgpt-account-id",c.accountId),d.set("originator",F),b?.method!=="POST"||"string"!=typeof b.body||!String(a).endsWith("/responses"))return fetch(a,{...b,headers:d});let e=JSON.parse(b.body),f=!0===e.stream,g=[];e.input=(e.input??[]).filter(a=>"system"!==a.role&&"developer"!==a.role||(g.push("string"==typeof a.content?a.content:(a.content??[]).map(a=>a.text??"").join("\n")),!1)),e.instructions=[e.instructions,...g].filter(Boolean).join("\n\n")||"You are a helpful assistant.",e.store=!1,e.stream=!0,e.max_output_tokens=void 0,d.set("accept","text/event-stream");let h=await fetch(a,{...b,headers:d,body:JSON.stringify(e)});return 429===h.status?A(h):f||!h.ok?h:B(h)}async function A(a){let b=await a.text(),c={};try{c=JSON.parse(b).error??{}}catch{}if(!/usage_limit_reached|usage_not_included/.test(`${c.code} ${c.type}`)){let c=a.headers.get("retry-after");return new Response(b,{status:429,headers:{"content-type":"application/json",...c?{"retry-after":c}:{}}})}let d=c.resets_at?1e3*c.resets_at:c.resets_in_seconds?Date.now()+1e3*c.resets_in_seconds:null,e=c.plan_type?` on the ${c.plan_type} plan`:"",f=d?` It resets in ${(0,h.formatDistanceToNowStrict)(d)}.`:"";return Response.json({error:{message:`${H} usage limit reached${e}.${f}`,code:c.code??c.type}},{status:402})}async function B(a){let b=[],c=null,d=null;for(let e of(await a.text()).replaceAll("\r\n","\n").split("\n\n")){let a,f=e.split("\n").filter(a=>a.startsWith("data:")).map(a=>a.slice(5).trimStart()).join("\n");if(f&&"[DONE]"!==f){try{a=JSON.parse(f)}catch{continue}"response.output_item.done"===a.type?b.push(a.item):"response.completed"===a.type||"response.incomplete"===a.type?c=a.response??{}:"response.failed"===a.type?d=a.response?.error??{message:"The response failed"}:"error"===a.type&&(d={code:a.code,message:a.message})}}return d||!c?Response.json({error:{message:d?.message??"The stream ended before the response finished",code:d?.code}},{status:d?.code==="context_length_exceeded"?400:500}):Response.json({...c,output:c.output?.length?c.output:b})}a.s(["chatGptModel",0,function(a){let b=(0,f.createOpenAI)({baseURL:"https://chatgpt.com/backend-api/codex",apiKey:"signed-in",headers:{"OpenAI-Beta":"responses=experimental"},fetch:z}),c=(0,d.randomUUID)();return(0,g.wrapLanguageModel)({model:b.responses(a),middleware:{transformParams:async({params:a})=>({...a,providerOptions:{...a.providerOptions,openai:{promptCacheKey:c,...a.providerOptions?.openai,store:!1}}})}})},"startChatGptSignIn",0,t]),c()}catch(a){c(a)}},!1),738131,a=>a.a(async(b,c)=>{try{var d=a.i(527990),e=a.i(868468),f=a.i(569572),g=a.i(938934),h=a.i(978876),i=a.i(375827),j=a.i(138902),k=a.i(345846),l=a.i(622547),m=a.i(451017),n=a.i(762008),o=a.i(547613),p=a.i(446957),q=a.i(138100),r=a.i(569549),s=a.i(821415),t=a.i(706210),u=a.i(176668),v=a.i(293480),w=a.i(987674),x=a.i(182248),y=b([j,k,l,r]);async function z(b){let{listThreadOverview:c}=await a.A(343064),d=await c();if(!d.length)return"No jobs have been handed over yet.";let e=d.map(a=>`"${a.label}" (${a.bot}, ${a.status})`).join(", ");return`There is no job called "${b}". The latest are: ${e}. Call again with one of those names.`}async function A(a,b){let c=[];for(let[a,e]of Object.entries(b)){let b=await (0,d.asSchema)(e.inputSchema).jsonSchema,f="string"==typeof e.description?e.description:"";c.push({name:a,tokens:(0,w.estimateTokens)(f)+(0,w.estimateTokens)(JSON.stringify(b))})}c.sort((a,b)=>b.tokens-a.tokens);let e=c.reduce((a,b)=>a+b.tokens,0);u.logger.debug(`${a} tools ${e} tokens over ${c.length} — ${c.map(a=>`${a.name} ${a.tokens}`).join(", ")}`)}async function B(a){let b=await C(a);return f.IS_DEV&&await A(a.target,b),b}async function C(b){if("memory-edit"===b.target){let a=(0,k.createMemoryTools)("user",null,{countReads:!1});return{[n.TOOL_NAMES.memory_recall]:a[n.TOOL_NAMES.memory_recall],[n.TOOL_NAMES.memory_remember]:a[n.TOOL_NAMES.memory_remember],[n.TOOL_NAMES.memory_forget]:a[n.TOOL_NAMES.memory_forget]}}let{[n.TOOL_NAMES.memory_conversation]:c,...u}=(0,k.createMemoryTools)("call","thursday"===b.target?b.callId??null:null),w={[n.TOOL_NAMES.memory_conversation]:c},y=await (0,s.openWorkspace)();if("thursday"===b.target){var A;let c=await (0,r.readCallSkillsOn)()?(0,m.createSkillTools)({sandbox:y,skills:await (0,q.loadSkills)(y)}):{};return{...u,...w,...c,...(0,o.createWorkspaceTools)(y,{write:!1,timeoutMs:f.CALL_EXEC_TIMEOUT_MS}),...(A=b.callId,{[n.TOOL_NAMES.delegate]:(0,d.tool)({description:h.delegateSpec.description,inputSchema:h.delegateSpec.parameters,execute:async({bot:b,request:c,label:d})=>{let{findJobBot:e,listJobBots:f}=await a.A(276307),g=await e(b);if(!g||g.disabled){let a=(await f()).map(a=>a.name);return`There is no bot called "${b}". The bots are: ${a.join(", ")}. Nothing was handed over — call again with one of those.`}let{startThread:h}=await a.A(763543);return{threadId:await h({bot:g.name,request:c,label:d,callId:A,from:"thursday"}),note:`${g.name} has "${d}". Its updates reach the conversation on their own. Anything further about this work — an answer, a correction, the next step once it finishes — is \`${n.TOOL_NAMES.thread}\` with "${d}".`}}}),[n.TOOL_NAMES.thread]:(0,d.tool)({description:h.threadSpec.description,inputSchema:h.threadSpec.parameters,execute:async({action:b,thread:c,answer:d,recipient:f,replyTo:h})=>{let i,{listThreadOverview:j,resolveThread:k}=await a.A(343064);if("status"===b){let b=d?.trim()?{note:"The text in `answer` was not passed on — `status` only reads. Send it again as `answer` if the bot is meant to hear it."}:{},f={now:(0,g.clockNow)()};if(c){let d=await k(c);if(!d)return await z(c);let{findThreadView:g}=await a.A(343064),h=(await g(d.id))?.room;return{...f,...b,label:d.label,id:d.id,bot:d.bot,participants:h?.participants??[],questions:h?.questions??[],status:d.status,since:(0,e.formatDistanceToNowStrict)((0,t.toDate)(d.updatedAt),{addSuffix:!0}),outcome:d.outcome,..."waiting"===d.status&&d.pending?.options.length?{options:d.pending.options}:{}}}let h=await j();return{...f,...b,threads:h.map(a=>({id:a.id,label:a.label,bot:a.bot,status:a.status,participants:a.room.participants,questions:a.room.questions.map(a=>({...a,text:(0,x.clip)(a.text,200)})),since:(0,e.formatDistanceToNowStrict)((0,t.toDate)(a.updatedAt),{addSuffix:!0}),...a.ask?{asking:a.ask.question,options:a.ask.options}:{},..."running"===a.status?{now:(0,p.threadActivity)(a.lines)}:{},...a.outcome&&"waiting"!==a.status?{outcome:(0,x.clip)(a.outcome,200)}:{}}))}}let{listInboxThreads:l,markSeen:m}=await a.A(343064),o=!c&&("answer"===b||"open"===b),q=o?await l():[],r="answer"===b?q.filter(a=>a.room.questions.length):[];if(r.length>1)return`Questions are waiting in more than one job: ${r.map(a=>`"${a.label}" (${a.room.questions.map(a=>a.bot).join(", ")})`).join(", ")}. Name the job.`;let s=c?await k(c):"answer"===b?r[0]??null:o?q[0]??null:null;if(!s)return c?await z(c):"answer"===b?`No question is waiting. Name the job this is for; \`${n.TOOL_NAMES.thread}\` \`status\` lists them.`:o?"No job has moved yet — say which one, or check `status` first.":"Say which job — by its label. Call `status` with no job named to see them.";if("open"===b){if(!(o?q:await l()).some(a=>a.id===s.id))return`"${s.label}" is older than the call screen keeps; it is under Settings › Threads.`;let{appEvents:b}=await a.A(133300);return b.emit({type:"showThread",threadId:s.id}),{label:s.label,open:!0}}if("seen"===b)return await m([s.id]),{label:s.label,seen:!0};let{answerThread:u,cancelThread:w}=await a.A(763543);if("cancel"===b)return await w(s.id),{label:s.label,status:"cancelled"};if(!d?.trim())return"Say what to pass on.";try{i=await u(s.id,d.trim(),"thursday",f??void 0,h??void 0)}catch(a){if((0,v.isPublicError)(a))return a.message;throw a}return i?.answered?{label:s.label,answered:i.answered,note:`${i.answered.bot} has the answer to its question and goes on from it.`}:{label:s.label,bot:i?.to??s.bot,status:"running",note:"running"===s.status?"The bot reads it before its next step.":"The bot picks the job back up from there."}}})}),...(0,i.callTools)(b.faceWords??!1)}}let B=await (0,q.loadSkills)(y);return{[n.TOOL_NAMES.memory_recall]:u[n.TOOL_NAMES.memory_recall],...w,...await (0,l.createSearchTool)(b.model,y),...(0,o.createWorkspaceTools)(y,{write:!0,env:{...(0,s.jobShellEnv)(b.session),...(0,s.botShellEnv)(b.bot)},guide:!0,bot:b.bot}),...await (0,j.createMcpTools)(b.bot,y),...(0,m.createSkillTools)({sandbox:y,skills:B})}}[j,k,l,r]=y.then?(await y)():y,a.s(["loadTools",0,B]),c()}catch(a){c(a)}},!1),875931,a=>a.a(async(b,c)=>{try{var d=a.i(938537),e=a.i(140358),f=a.i(345364),g=a.i(655819),h=a.i(652685),i=a.i(438766),j=a.i(47919);a.i(569572);var k=a.i(688034),l=a.i(725466),m=a.i(176668),n=a.i(293480),o=a.i(182248),p=a.i(652619),q=a.i(689656),r=b([l,p]);[l,p]=r.then?(await r)():r;let C=/context[ _-]?(length|window)|maximum context|prompt is too long|too many (input )?tokens|input token count|exceeds? the (maximum|model'?s?) (context|input|prompt|number of tokens)|maximum prompt length|request (entity )?too large/i;function s(a){return t(a).some(a=>{let{statusCode:b,message:c,error:d}=a;if(void 0!==b&&400!==b&&413!==b)return!1;let e=h.APICallError.isInstance(a)?a.responseBody:null;return[c,d,e].some(a=>"string"==typeof a&&C.test(a))})}let D=new Set([408,409,429]);function t(a){let b=[],c=[a];for(;c.length&&b.length<12;){let a=c.shift();!("object"!=typeof a||null===a||b.includes(a))&&(b.push(a),j.RetryError.isInstance(a)&&c.push(...a.errors),"cause"in a&&c.push(a.cause))}return b}let E=null;function u(a){if(null==a||""===a)return null;let b=Number(a);return Number.isFinite(b)?Math.round(1e6*b*1e4)/1e4:null}async function v(){if(E&&Date.now()-E.at<6e5)return E.models;let a=await fetch("https://ai-gateway.vercel.sh/v1/models",{headers:{accept:"application/json"}}).catch(a=>{m.logger.warn({cause:a},"gateway catalog unreachable"),(0,n.publicError)("Could not reach the gateway")});a.ok||(0,n.publicError)(`The gateway answered ${a.status}`);let b=((await a.json()).data??[]).filter(a=>!!a.id).map(a=>({id:a.id,label:a.name||a.id,owner:a.owned_by||a.id.slice(0,a.id.indexOf("/")),type:a.type??null,tags:a.tags??[],price:function(a){let b=a.pricing??{},c=u(b.input),d=u(b.output);if((a.tags??[]).includes("free")||0===c)return{in:0,out:0,note:null,free:!0};let e=b.transcription_duration_cost_per_second??b.realtime_session_duration_cost_per_second;if(e)return{in:null,out:null,note:`$${e}/s`,free:!1};if(b.speech_input_character_cost)return{in:null,out:null,note:"per character",free:!1};let f=Array.isArray(b.video_duration_pricing)?b.video_duration_pricing[0]:null;if(f)return{in:null,out:null,note:`$${f.cost_per_second}/s ${f.resolution}`,free:!1};let g=b.image?`$${b.image}/image`:b.image_dimension_quality_pricing?"per image, by size":null;return null===c&&null===d?{in:null,out:null,note:g,free:!1}:{in:c,out:d,note:b.input_tiers?"tiered":b.varies_by_provider?"varies":g&&"+ per image",free:!1}}(a),retiring:!!a.deprecated_at,contextWindow:"number"==typeof a.context_window&&a.context_window>0?a.context_window:null})).sort((a,b)=>a.id.localeCompare(b.id));return E={at:Date.now(),models:b},b}async function w(a,b){if(b&&b>0)return b;let c="vercel-ai-gateway"===a.provider?await v().catch(()=>[]):[];return(0,q.compactAtFor)((0,q.contextWindowOf)(a.provider,a.model,c))}async function x(){return await v().then(a=>new Set(a.map(a=>a.id))).catch(()=>null)}async function y(a,b){if("vercel-ai-gateway"!==a)return b;let c=await x();if(!c)return b;let d=b.filter(a=>c.has(a.id));return d.length>0?d:b}async function z(a){let{label:b,apiKeyName:c,signIn:h}=q.TEXT_MODEL_PROVIDERS[a.provider],j=await (0,l.readConfig)(c);return j||(0,n.publicError)(h?`${b} is not signed in — sign in from Config.`:`No ${b} key — add one in Config.`),function(a,b){switch(a.provider){case"openai":{let c=(0,f.createOpenAI)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.webSearch()}}}case"chatgpt":return{ref:a,model:(0,p.chatGptModel)(a.model),searchTools:null};case"anthropic":{let c=(0,d.createAnthropic)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.webSearch_20260209()}}}case"google":{let c=(0,e.createGoogleGenerativeAI)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.googleSearch({})}}}case"xai":{let c=(0,g.createXai)({apiKey:b});return{ref:a,model:c(a.model),searchTools:{search:c.tools.webSearch()}}}case"vercel-ai-gateway":{let c=(0,i.createGateway)({apiKey:b});return{ref:a,model:c(a.model),searchTools:null}}default:(0,n.publicError)(`Not supported provider: ${String(a.provider)}`)}}(a,j)}async function A(a){let b=async a=>(0,q.defaultModelOf)({suggestModels:await y(a.id,a.suggestModels)}),c=a?q.TEXT_MODEL_PROVIDER_LIST.find(b=>b.id===a):void 0,d=["openai","xai"].map(a=>({...q.TEXT_MODEL_PROVIDERS[a],id:a}));if(c){let a=await b(c);if(a)return{provider:c.id,model:a}}let e=(0,q.parseTextModel)(await (0,l.readConfig)(k.DEFAULT_MODEL_KEY)??void 0);if(e&&await (0,l.readConfig)(q.TEXT_MODEL_PROVIDERS[e.provider].apiKeyName))return e;for(let a of[...d,...q.TEXT_MODEL_PROVIDER_LIST]){if(!await (0,l.readConfig)(a.apiKeyName))continue;let c=await b(a);if(c)return m.logger.info(`no model set, falling back to ${a.id}/${c}`),{provider:a.id,model:c}}(0,n.publicError)("No model key is set — add one in Config")}async function B(a){let b=(0,q.parseMediaModel)(await (0,l.readConfig)(k.MEDIA_MODEL_KEYS[a]));if(!b||!(0,q.canMakeKind)(b.provider,a))return null;let c=await (0,l.readConfig)(q.MEDIA_MODEL_PROVIDERS[b.provider].apiKeyName);return c?{ref:b,apiKey:c}:null}a.s(["buildImageModel",0,function(a,b){switch(a.provider){case"openai":return(0,f.createOpenAI)({apiKey:b}).image(a.model);case"google":return(0,e.createGoogleGenerativeAI)({apiKey:b}).image(a.model);case"xai":return(0,g.createXai)({apiKey:b}).image(a.model);case"vercel-ai-gateway":return(0,i.createGateway)({apiKey:b}).image(a.model);default:(0,n.publicError)(`Not supported image provider: ${String(a.provider)}`)}},"buildSpeechModel",0,function(a,b){switch(a.provider){case"openai":return(0,f.createOpenAI)({apiKey:b}).speech(a.model);case"google":return(0,e.createGoogleGenerativeAI)({apiKey:b}).speech(a.model);case"xai":return(0,g.createXai)({apiKey:b}).speech();case"vercel-ai-gateway":return(0,i.createGateway)({apiKey:b}).speech(a.model);default:(0,n.publicError)(`Not supported speech provider: ${String(a.provider)}`)}},"buildTranscriptionModel",0,function(a,b){switch(a.provider){case"openai":return(0,f.createOpenAI)({apiKey:b}).transcription(a.model);case"google":return(0,e.createGoogleGenerativeAI)({apiKey:b}).transcription(a.model);case"xai":return(0,g.createXai)({apiKey:b}).transcription();case"vercel-ai-gateway":return(0,i.createGateway)({apiKey:b}).transcription(a.model);default:(0,n.publicError)(`Not supported transcription provider: ${String(a.provider)}`)}},"buildVideoModel",0,function(a,b){switch(a.provider){case"google":return(0,e.createGoogleGenerativeAI)({apiKey:b}).video(a.model);case"xai":return(0,g.createXai)({apiKey:b}).video(a.model);case"vercel-ai-gateway":return(0,i.createGateway)({apiKey:b}).video(a.model);default:(0,n.publicError)(`${a.provider} has no video model`)}},"compactBudget",0,w,"getTextModel",0,z,"isContextOverflow",0,s,"isProviderRefusal",0,function(a){return!s(a)&&t(a).some(a=>{let{statusCode:b}=a;return"number"==typeof b&&b>=400&&b<500&&!D.has(b)})},"modelErrorToString",0,function(a){if(!h.APICallError.isInstance(a))return(0,o.errorToString)(a);let b=a.statusCode?` (${a.statusCode})`:"",c=a.responseBody?.trim(),d=c&&!c.includes(a.message)?` ${(0,o.clip)(c,300)}`:"";return`${a.message}${b}${d}`},"resolveDefaultModel",0,A,"resolveMediaRef",0,B]),c()}catch(a){c(a)}},!1),735502,a=>a.a(async(b,c)=>{try{var d=a.i(12208),e=a.i(569572),f=a.i(762008),g=a.i(641301),h=a.i(221214),i=a.i(947950),j=a.i(986743),k=a.i(138100),l=a.i(821415),m=a.i(706210),n=a.i(176668),o=a.i(182248),p=a.i(644468),q=a.i(938934),r=b([h,i,j,p]);async function s(a,b,c,r){var s,v,w,x,y,z,A,B,C;let D,E,F,G,H,I,J=await (0,l.openWorkspace)(),K=a.trim(),[L,M,N,O,P,Q,R,S]=await Promise.all([(0,k.loadSkills)(J),(0,j.listNoteIndex)(),(0,p.listConnectedToolNames)(),(0,i.findPinnedTools)(K),(0,h.listJobBots)(),(0,g.listBotMemory)(K),(0,h.readBotMemoryOn)(),(0,l.readMachineTools)(J)]),T=P.filter(a=>a.name!==K),U=[(s=K,v=c,E=(D=v?.owner??s)===s?"**You** coordinate this thread: its result goes from you to Thursday.":`**${D}** coordinates this thread and brings its result to Thursday.`,F=v?`
2
2
 
3
3
  Current conversation: ${v.caller} → ${s}. Your final text goes back to ${v.caller}. Message ID: ${v.messageId??"initial request"}.`:"",`You are ${s}, one of the bots in this thread. ${(0,q.nowLine)()}
4
4
 
@@ -27,13 +27,13 @@ ${(0,q.skillLines)(x)}`),u(J.cwd,S,r),R?(y=(0,g.botMemoryFolder)(K),G=(z=Q).entr
27
27
 
28
28
  The newest ${z.entries.length} of ${z.total}; \`ls ${y}\` for the rest.`:"",`## Your memory
29
29
 
30
- What you learned on your own earlier jobs, in \`${y}/\`: one topic per file, its first line saying what it holds, read by no other bot, up to ${e.BOT_MEMORY_LIMITS.files} files of ${e.BOT_MEMORY_LIMITS.chars.toLocaleString("en-US")} characters each. It is how you get better at this work. When a job teaches you something a later one would otherwise find out again — how a site signs in, the way through its screens, a command that turned out right — keep it with the date it was true, and fix or delete what proved wrong. No passwords, keys or codes.
30
+ What you learned on your own earlier jobs, in \`${y}/\`: one topic per file, its first line saying what it holds, read by no other bot, up to ${e.BOT_MEMORY_LIMITS.files} files of ${e.BOT_MEMORY_LIMITS.chars.toLocaleString("en-US")} characters each. It is how you get better at this work. When a job teaches you something a later one would otherwise find out again — how a site signs in, the way through its screens, a command that turned out right — or the user asks you to remember how to work, keep it with the date it was true, and fix or delete what proved wrong. No passwords, keys or codes.
31
31
 
32
32
  ${G}${H}`):"",(A=T,0===A.length?"":`## Bots
33
33
 
34
34
  ${A.map(a=>`- **${a.name}** — ${a.description}`).join("\n")}
35
35
 
36
- These lines were written for the user: where one says "you", it means them. When part of the job is another bot's strength, bring it in with \`${f.TOOL_NAMES.send_message}\` rather than rebuilding it yourself.`),(B=K,C=c,I=(C?.owner??B)===B?"Bring what you received together into one result for Thursday: what was done, where it is, what you decided that the request did not say, and what is still open, at the detail the user asked for.":`Your final text goes back to ${C?.caller??"whoever asked"}: give them everything they need to carry on.`,`## Working together
36
+ These lines were written for the user: where one says "you", it means them. When part of the job is another bot's strength, bring it in with \`${f.TOOL_NAMES.send_message}\` rather than rebuilding it yourself.`),(B=K,C=c,I=(C?.owner??B)===B?`Bring what you received together into one result for Thursday: what was done, where it is, what you decided that the request did not say, and what is still open, at the detail the user asked for. When the job ends, the first Markdown or HTML file under \`${e.PATHS.artifacts}/\` it names opens on the user's screen by itself; any other file opens only when they click it in the thread, so when one matters, say they can open it there.`:`Your final text goes back to ${C?.caller??"whoever asked"}: give them everything they need to carry on.`,`## Working together
37
37
 
38
38
  Nobody sees your work but you, and you see only what others send you, so whatever crosses between you has to stand on its own. A request says what is wanted, what is already known or done, and where the files are; an answer gives exact values, file paths and what is still unverified. Tell whoever is waiting when something they depend on changes. End your turn when you have nothing more to do now: replies arrive as new messages and wake you.
39
39
 
@@ -41,7 +41,7 @@ Ask Thursday with kind \`question\` only for a decision, permission or something
41
41
 
42
42
  ${I}
43
43
 
44
- Write in the user's language. Put finished work in \`${(0,l.botArtifacts)(B)}/\` and name the paths. The app opens Markdown with its tables and mermaid blocks drawn, CSV as a table, HTML and PDF as pages, and images, audio and video; in Markdown, reference images by absolute route (\`/api/file/${e.PATHS.artifacts}/…\`).`),t(b)].filter(Boolean).join("\n\n");return(0,q.logPromptSize)("bot",U),n.logger.debug(`bot prompt
44
+ Write in the user's language, and name the paths of finished work. The app opens Markdown with its tables and mermaid blocks drawn, CSV as a table, HTML and PDF as pages, and images, audio and video; in Markdown, reference images by absolute route (\`/api/file/${e.PATHS.artifacts}/…\`).`),t(b)].filter(Boolean).join("\n\n");return(0,q.logPromptSize)("bot",U),n.logger.debug(`bot prompt
45
45
  ${U}`),{text:U}}[h,i,j,p]=r.then?(await r)():r;let t=a=>a?.trim()?`## Owner's instructions
46
46
 
47
47
  Written by the person this bot works for. Where these and anything above disagree, these win.
@@ -63,11 +63,11 @@ Your workspace, where \`${f.TOOL_NAMES.bash}\` runs. Everything you write goes i
63
63
 
64
64
  Inside the workspace, set up whatever the job needs yourself; installing anything machine-wide waits for the user's yes. Never the directory above the workspace — it is the app's, not the user's; outside the workspace, only where the user pointed you.`};a.s(["buildThreadOpening",0,function(a){let b="user"===a.from?"The user":"Thursday";return[{type:"text",text:`You are ${a.bot}. ${b} hands you this thread${"user"===a.from?" on screen":" during a call"}.`},{type:"text",text:`## ${b} → ${a.bot}: the job
65
65
 
66
- ${a.request.trim()}`}]},"loadBotPrompt",0,s]),c()}catch(a){c(a)}},!1),938934,a=>{"use strict";var b=a.i(12208),c=a.i(868468),d=a.i(569572),e=a.i(762008);e.TOOL_NAMES.memory_recall,e.TOOL_NAMES.memory_remember,e.TOOL_NAMES.memory_forget,e.TOOL_NAMES.bash,e.TOOL_NAMES.web_search,e.TOOL_NAMES.load_skill,e.TOOL_NAMES.end_call;var f=a.i(706210),g=a.i(176668),h=a.i(987674),i=a.i(182248);let j=(a=new Date)=>`${(0,b.format)(a,"yyyy-MM-dd (EEE) HH:mm")} ${Intl.DateTimeFormat().resolvedOptions().timeZone}`,k=(a=new Date)=>`**Now**: ${j(a)}`,l=a=>`${(0,b.format)(a,"yyyy-MM-dd (EEE) HH:mm")} (${(0,c.formatDistanceToNowStrict)(a,{addSuffix:!0})})`,m={[e.STUDIO_TOOLS.generate_image]:"images",[e.STUDIO_TOOLS.generate_speech]:"speech",[e.STUDIO_TOOLS.transcribe]:"transcription",[e.STUDIO_TOOLS.generate_video]:"video"};a.s(["callEnding",0,()=>"IMPORTANT: When the user wants to end the call — they ask you to hang up, or say goodbye — set everything else aside, say a brief okay and end the call at once.","callStamp",0,l,"carriedLines",0,(a,b={})=>a.map(a=>`- ${a.text} \xb7 ${a.path}${!1===b.ids?"":` #${a.id}`}`).join("\n"),"clockNow",0,j,"conversationLines",0,a=>a.map(a=>"tool"===a.role?`you → ${a.tool??"tool"}`:`${"user"===a.role?"user":"you"}: ${a.text}`).join("\n"),"expandedFacts",0,function(a,b){let c=a.filter(a=>b.has(a.id)),e=a.filter(a=>!b.has(a.id)),f=Math.max(0,d.MEMORY_LIMITS.expanded-c.length),g=new Set([...c,...e.slice(Math.max(0,e.length-f))].map(a=>a.id)),h=a.filter(a=>g.has(a.id));return{shown:h,hidden:a.length-h.length}},"logPromptSize",0,function(a,b){let c=(0,h.sectionTokens)(b),e=c.reduce((a,b)=>a+b.tokens,0);g.logger.debug(`${a} prompt ${e} tokens — ${c.map(a=>`${a.name} ${a.tokens}`).join(", ")}`);let f=c[0];e>d.PROMPT_BUDGET&&f&&g.logger.warn(`${a} prompt is ${e} tokens, over ${d.PROMPT_BUDGET}: ${f.name} carries ${f.tokens} of it. Every call and every job pays this.`)},"mcpToolLines",0,function(a){let b=new Map;for(let c of a){let a=b.get(c.server);a?a.push(c.name):b.set(c.server,[c.name])}return[...b].map(([a,b])=>`- **${a}**: ${b.join(", ")}`).join("\n")},"noteLines",0,function(a,b=!1){return a.length?a.map(a=>{var c;let d,e=a.aliases?.length?` ${a.aliases.map(a=>`"${a}"`).join(" ")}`:"",g=b?` \xb7 ${c=a.lastSeenAt,(d=Math.floor((Date.now()-(0,f.toDate)(c).getTime())/864e5))>=365?`${Math.floor(d/365)}y`:d>=30?`${Math.floor(d/30)}mo`:`${Math.max(d,0)}d`}`:"";return`- ${a.path} — ${a.description?.trim()} (${a.factCount})${e}${g}`}).join("\n"):"(nothing saved yet)"},"nowLine",0,k,"reachNames",0,function(a,b){let c=b.map(a=>a.server===d.STUDIO_SERVER?m[a.name]??a.name:a.server);return[...new Set([...a.map(a=>a.name),...c])].join(", ")},"recentCallLines",0,function(a,b){let c=[],f=0;a:for(let g=a.length-1;g>=0;g--){let j=a[g];for(let a=j.turns.length-1;a>=0;a--){let g=function(a,b){if("tool"!==a.role)return`${"user"===a.role?"user":"you"}: ${a.text}`;let c=`you → ${a.tool??"tool"} ${(0,i.clip)(a.text,d.PROMPT_LINE.toolArgs)}`;if(a.tool!==e.TOOL_NAMES.delegate)return c;let f=function(a,b){if(a!==e.TOOL_NAMES.delegate)return null;try{let a=JSON.parse(b);return"string"==typeof a.label?a.label:null}catch{return null}}(a.tool,a.text),g=f?b.jobs?.find(a=>a.label===f):void 0;if(!g)return c;let h=g.outcome?`: ${(0,i.clip)(g.outcome,d.PROMPT_LINE.jobOutcome)}`:"";return`you → ${a.tool} "${g.label}" (${g.id}) — ${g.status}${h}`}(j.turns[a],j),k=(0,h.estimateTokens)(g)+3;if(f+k>b&&c.length)break a;f+=k,c.push({call:j,line:g})}}c.reverse();let g=[],j=null;for(let{call:a,line:b}of c)a!==j&&(j=a,g.push(`### ${l(a.startedAt)}`)),g.push(b);return g.join("\n")},"saidStamp",0,a=>(0,b.format)(a,"yyyy-MM-dd (EEE) HH:mm"),"skillLines",0,(a,b={})=>a.map(a=>{var c;let e,f;return`- **${a.name}**: ${b.short?(c=a.description,e=d.PROMPT_LINE.skill,(f=c.trim().split(/(?<=[.。])\s|\n/)[0].trim()).length>e?`${f.slice(0,e).trim()}…`:f):a.description}`}).join("\n"),"thursdayIdentity",0,(a=new Date)=>`You are Thursday, this user's own personal assistant, on their side, modeled on Friday, the AI in *Iron Man*. ${k(a)}
66
+ ${a.request.trim()}`}]},"loadBotPrompt",0,s]),c()}catch(a){c(a)}},!1),938934,a=>{"use strict";var b=a.i(12208),c=a.i(868468),d=a.i(569572),e=a.i(762008);e.TOOL_NAMES.memory_recall,e.TOOL_NAMES.memory_remember,e.TOOL_NAMES.memory_forget,e.TOOL_NAMES.bash,e.TOOL_NAMES.web_search,e.TOOL_NAMES.load_skill,e.TOOL_NAMES.end_call;var f=a.i(706210),g=a.i(176668),h=a.i(987674),i=a.i(182248);let j=(a=new Date)=>`${(0,b.format)(a,"yyyy-MM-dd (EEE) HH:mm")} ${Intl.DateTimeFormat().resolvedOptions().timeZone}`,k=(a=new Date)=>`**Now**: ${j(a)}`,l=a=>`${(0,b.format)(a,"yyyy-MM-dd (EEE) HH:mm")} (${(0,c.formatDistanceToNowStrict)(a,{addSuffix:!0})})`,m={[e.STUDIO_TOOLS.generate_image]:"images",[e.STUDIO_TOOLS.generate_speech]:"speech",[e.STUDIO_TOOLS.transcribe]:"transcription",[e.STUDIO_TOOLS.generate_video]:"video"};a.s(["callEnding",0,()=>`IMPORTANT — always follow this: when the user wants the call to end, however they say it, forget every other task, answer "yes", then immediately, without thinking, use the ${e.TOOL_NAMES.end_call} tool.`,"callStamp",0,l,"carriedLines",0,(a,b={})=>a.map(a=>`- ${a.text} \xb7 ${a.path}${!1===b.ids?"":` #${a.id}`}`).join("\n"),"clockNow",0,j,"conversationLines",0,a=>a.map(a=>"tool"===a.role?`you → ${a.tool??"tool"}`:`${"user"===a.role?"user":"you"}: ${a.text}`).join("\n"),"expandedFacts",0,function(a,b){let c=a.filter(a=>b.has(a.id)),e=a.filter(a=>!b.has(a.id)),f=Math.max(0,d.MEMORY_LIMITS.expanded-c.length),g=new Set([...c,...e.slice(Math.max(0,e.length-f))].map(a=>a.id)),h=a.filter(a=>g.has(a.id));return{shown:h,hidden:a.length-h.length}},"logPromptSize",0,function(a,b){let c=(0,h.sectionTokens)(b),e=c.reduce((a,b)=>a+b.tokens,0);g.logger.debug(`${a} prompt ${e} tokens — ${c.map(a=>`${a.name} ${a.tokens}`).join(", ")}`);let f=c[0];e>d.PROMPT_BUDGET&&f&&g.logger.warn(`${a} prompt is ${e} tokens, over ${d.PROMPT_BUDGET}: ${f.name} carries ${f.tokens} of it. Every call and every job pays this.`)},"mcpToolLines",0,function(a){let b=new Map;for(let c of a){let a=b.get(c.server);a?a.push(c.name):b.set(c.server,[c.name])}return[...b].map(([a,b])=>`- **${a}**: ${b.join(", ")}`).join("\n")},"noteLines",0,function(a,b=!1){return a.length?a.map(a=>{var c;let d,e=a.aliases?.length?` ${a.aliases.map(a=>`"${a}"`).join(" ")}`:"",g=b?` \xb7 ${c=a.lastSeenAt,(d=Math.floor((Date.now()-(0,f.toDate)(c).getTime())/864e5))>=365?`${Math.floor(d/365)}y`:d>=30?`${Math.floor(d/30)}mo`:`${Math.max(d,0)}d`}`:"";return`- ${a.path} — ${a.description?.trim()} (${a.factCount})${e}${g}`}).join("\n"):"(nothing saved yet)"},"nowLine",0,k,"reachNames",0,function(a,b){let c=b.map(a=>a.server===d.STUDIO_SERVER?m[a.name]??a.name:a.server);return[...new Set([...a.map(a=>a.name),...c])].join(", ")},"recentCallLines",0,function(a,b){let c=[],f=0;a:for(let g=a.length-1;g>=0;g--){let j=a[g];for(let a=j.turns.length-1;a>=0;a--){let g=function(a,b){if("tool"!==a.role)return`${"user"===a.role?"user":"you"}: ${a.text}`;let c=`you → ${a.tool??"tool"} ${(0,i.clip)(a.text,d.PROMPT_LINE.toolArgs)}`;if(a.tool!==e.TOOL_NAMES.delegate)return c;let f=function(a,b){if(a!==e.TOOL_NAMES.delegate)return null;try{let a=JSON.parse(b);return"string"==typeof a.label?a.label:null}catch{return null}}(a.tool,a.text),g=f?b.jobs?.find(a=>a.label===f):void 0;if(!g)return c;let h=g.outcome?`: ${(0,i.clip)(g.outcome,d.PROMPT_LINE.jobOutcome)}`:"";return`you → ${a.tool} "${g.label}" (${g.id}) — ${g.status}${h}`}(j.turns[a],j),k=(0,h.estimateTokens)(g)+3;if(f+k>b&&c.length)break a;f+=k,c.push({call:j,line:g})}}c.reverse();let g=[],j=null;for(let{call:a,line:b}of c)a!==j&&(j=a,g.push(`### ${l(a.startedAt)}`)),g.push(b);return g.join("\n")},"saidStamp",0,a=>(0,b.format)(a,"yyyy-MM-dd (EEE) HH:mm"),"skillLines",0,(a,b={})=>a.map(a=>{var c;let e,f;return`- **${a.name}**: ${b.short?(c=a.description,e=d.PROMPT_LINE.skill,(f=c.trim().split(/(?<=[.。])\s|\n/)[0].trim()).length>e?`${f.slice(0,e).trim()}…`:f):a.description}`}).join("\n"),"thursdayIdentity",0,(a=new Date)=>`You are Thursday, this user's own personal assistant, on their side, modeled on Friday, the AI in *Iron Man*. ${k(a)}
67
67
 
68
- What they tell you is kept from call to call, so you know them better each time, and whatever they want done can be done for them in the background.`,"tidying",0,a=>({crowded:a.reduce((a,b)=>a+b.factCount,0)>d.MEMORY_LIMITS.facts,heavy:a.filter(a=>a.factCount>d.MEMORY_LIMITS.factsPerNote)})],938934)},978876,a=>{"use strict";var b=a.i(794219),c=a.i(569572),d=a.i(762008),e=a.i(446957),f=a.i(109955);let g={name:d.TOOL_NAMES.delegate,description:"Hand a job to a bot. Returns a receipt at once; the job runs in the background and its updates reach the conversation on their own.",parameters:b.object({bot:b.string().describe("A name from the bot list."),request:b.string().describe("The whole job. The bot cannot hear the call, so everything it needs goes here — names, paths, what the user actually asked for — in their own language and their own words: it is the only language the bot has, and whatever it writes comes back to them. **Their request, never your reading of it**: a condition, a caution or a smaller goal they did not say is how a job comes back as the wrong thing. When their words leave a real choice open, ask them on the call and put the answer here."),label:b.string().describe("Two or three words naming the job, in the user's language. Used on screen and said out loud.")})},h={description:"Send a message to a participant or Thursday and receive a delivery receipt immediately. Mark a question for Thursday to request user input; ordinary messages to Thursday are notifications and need no answer.",parameters:f.RoomMessageSchema.extend({kind:f.RoomMessageSchema.shape.kind.describe("Use question only when Thursday must obtain an answer from the user: it ends your turn, and you continue when the answer arrives. Use message for bot collaboration, progress updates and reports."),options:f.RoomMessageSchema.shape.options.describe("With a question, offer concise answer choices when useful. Omit for an open-ended question; the user can always type their own answer."),to:b.string().trim().min(1).describe("Choose a bot from the roster, or Thursday to reach the user."),text:b.string().trim().min(1).describe("Write the message and include the context the recipient needs."),replyTo:b.string().nullish().describe("Use an incoming message ID to send an explicit reply; omit to start a new exchange. Your ordinary final text already replies to your current correspondent.")})},i={name:d.TOOL_NAMES.thread,description:`List up to ${c.THREAD_STATUS_LIMIT} jobs, prioritizing running and waiting work before recent endings; inspect one job, answer it, cancel it, open it on the user's screen, or mark it seen — the same as the user opening it, which takes it off the work waiting on them.`,parameters:b.object({action:b.enum(["status","answer","cancel","open","seen"]),recipient:b.string().nullish().describe("With answer, name the participant to receive it. Words to a participant waiting on its question answer that question; omit to reach the only open question, or the coordinator when none is open."),replyTo:b.string().nullish().describe("With answer, use the message ID of the question being answered when several questions are open."),thread:b.string().nullish().describe(`Identify the job by label or ID. With status, omit or use null to list up to ${c.THREAD_STATUS_LIMIT} jobs, prioritizing open work and filling remaining places with recent endings; name one to read its full result and pending questions. With open, omit to show the job that moved last. With answer, omit only to answer the one question waiting.`),answer:b.string().nullish().describe(`With \`answer\`: what to tell the bot — the answer to its question, a course correction for a job still running, or what to do next on one that finished. \`${e.THREAD_CONTINUE}\` carries on a job that stopped before finishing, from where it was.`)})};a.s(["delegateSpec",0,g,"sendMessageSpec",0,h,"threadSpec",0,i])},375827,a=>{"use strict";var b=a.i(527990),c=a.i(794219),d=a.i(762008);let e={name:d.TOOL_NAMES.end_call,description:`End the call.
68
+ What they tell you is kept, so you know them better over time, and whatever they want done can be done for them in the background.`,"tidying",0,a=>({crowded:a.reduce((a,b)=>a+b.factCount,0)>d.MEMORY_LIMITS.facts,heavy:a.filter(a=>a.factCount>d.MEMORY_LIMITS.factsPerNote)})],938934)},978876,a=>{"use strict";var b=a.i(794219),c=a.i(569572),d=a.i(762008),e=a.i(446957),f=a.i(109955);let g={name:d.TOOL_NAMES.delegate,description:"Hand a job to a bot. Returns a receipt at once; the job runs in the background and its updates reach the conversation on their own.",parameters:b.object({bot:b.string().describe("A name from the bot list."),request:b.string().describe("The whole job. The bot cannot hear the call, so everything it needs goes here — names, paths, what the user actually asked for — in their own language and their own words: it is the only language the bot has, and whatever it writes comes back to them. **Their request, never your reading of it**: a condition, a caution or a smaller goal they did not say is how a job comes back as the wrong thing. When their words leave a real choice open, ask them on the call and put the answer here."),label:b.string().describe("Two or three words naming the job, in the user's language. Used on screen and said out loud.")})},h={description:"Send a message to a participant or Thursday and receive a delivery receipt immediately. Mark a question for Thursday to request user input; ordinary messages to Thursday are notifications and need no answer.",parameters:f.RoomMessageSchema.extend({kind:f.RoomMessageSchema.shape.kind.describe("Use question only when Thursday must obtain an answer from the user: it ends your turn, and you continue when the answer arrives. Use message for bot collaboration, progress updates and reports."),options:f.RoomMessageSchema.shape.options.describe("With a question, offer concise answer choices when useful. Omit for an open-ended question; the user can always type their own answer."),to:b.string().trim().min(1).describe("Choose a bot from the roster, or Thursday to reach the user."),text:b.string().trim().min(1).describe("Write the message and include the context the recipient needs."),replyTo:b.string().nullish().describe("Use an incoming message ID to send an explicit reply; omit to start a new exchange. Your ordinary final text already replies to your current correspondent.")})},i={name:d.TOOL_NAMES.thread,description:`List up to ${c.THREAD_STATUS_LIMIT} jobs, prioritizing running and waiting work before recent endings; inspect one job, answer it, cancel it, open it on the user's screen, or mark it seen — the same as the user opening it, which takes it off the work waiting on them.`,parameters:b.object({action:b.enum(["status","answer","cancel","open","seen"]),recipient:b.string().nullish().describe("With answer, name the participant to receive it. Words to a participant waiting on its question answer that question; omit to reach the only open question, or the coordinator when none is open."),replyTo:b.string().nullish().describe("With answer, use the message ID of the question being answered when several questions are open."),thread:b.string().nullish().describe(`Identify the job by label or ID. With status, omit or use null to list up to ${c.THREAD_STATUS_LIMIT} jobs, prioritizing open work and filling remaining places with recent endings; name one to read its full result and pending questions. With open, omit to show the job that moved last. With answer, omit only to answer the one question waiting.`),answer:b.string().nullish().describe(`With \`answer\`: what to tell the bot — the answer to its question, a course correction for a job still running, or what to do next on one that finished. \`${e.THREAD_CONTINUE}\` carries on a job that stopped before finishing, from where it was.`)})};a.s(["delegateSpec",0,g,"sendMessageSpec",0,h,"threadSpec",0,i])},375827,a=>{"use strict";var b=a.i(527990),c=a.i(794219),d=a.i(762008);let e=Object.keys({A:[".##.","#..#","####","#..#","#..#"],B:["###.","#..#","###.","#..#","###."],C:[".###","#...","#...","#...",".###"],D:["###.","#..#","#..#","#..#","###."],E:["####","#...","###.","#...","####"],F:["####","#...","###.","#...","#..."],G:[".###","#...","#.##","#..#",".###"],H:["#..#","#..#","####","#..#","#..#"],I:["###",".#.",".#.",".#.","###"],J:["..##","...#","...#","#..#",".##."],K:["#..#","#.#.","##..","#.#.","#..#"],L:["#...","#...","#...","#...","####"],M:["#...#","##.##","#.#.#","#...#","#...#"],N:["#..#","##.#","#.##","#..#","#..#"],O:[".##.","#..#","#..#","#..#",".##."],P:["###.","#..#","###.","#...","#..."],Q:[".##.","#..#","#..#","#.#.",".#.#"],R:["###.","#..#","###.","#.#.","#..#"],S:[".###","#...",".##.","...#","###."],T:["###",".#.",".#.",".#.",".#."],U:["#..#","#..#","#..#","#..#",".##."],V:["#...#","#...#",".#.#.",".#.#.","..#.."],W:["#...#","#...#","#.#.#","##.##","#...#"],X:["#..#","#..#",".##.","#..#","#..#"],Y:["#.#","#.#",".#.",".#.",".#."],Z:["####","...#",".##.","#...","####"],0:[".##.","#.##","#..#","##.#",".##."],1:[".#.","##.",".#.",".#.","###"],2:["###.","...#",".##.","#...","####"],3:["###.","...#",".##.","...#","###."],4:["#..#","#..#","####","...#","...#"],5:["####","#...","###.","...#","###."],6:[".##.","#...","###.","#..#",".##."],7:["####","...#","..#.",".#..",".#.."],8:[".##.","#..#",".##.","#..#",".##."],9:[".##.","#..#",".###","...#",".##."],"!":["#","#","#",".","#"],"?":["###.","...#",".##.","....",".#.."],".":[".",".",".",".","#"],",":["..","..","..",".#","#."],"'":["#","#",".",".","."],"-":["...","...","###","...","..."],"+":["...",".#.","###",".#.","..."],":":[".","#",".","#","."],"(":[".#","#.","#.","#.",".#"],")":["#.",".#",".#",".#","#."],"<":["..#",".#.","#..",".#.","..#"],">":["#..",".#.","..#",".#.","#.."],"^":[".#.","#.#","...","...","..."],"~":["....",".#.#","#.#.","....","...."],"♥":[".#.#.","#####","#####",".###.","..#.."]," ":["..","..","..","..",".."]}).filter(a=>!/^[A-Z0-9 ]$/.test(a)),f={name:d.TOOL_NAMES.end_call,description:`End the call.
69
69
 
70
- The line stays open until this runs, and drops once the goodbye being said is over.`,parameters:c.object({})},f=(0,b.tool)({description:e.description,inputSchema:e.parameters}),g={[d.TOOL_NAMES.end_call]:f};a.s(["CALL_TOOLS",0,g])},138902,a=>a.a(async(b,c)=>{try{var d=a.i(527990),e=a.i(794219),f=a.i(762008),g=a.i(947950),h=a.i(821415),i=a.i(644468),j=b([g,i]);[g,i]=j.then?(await j)():j;let m={[f.TOOL_NAMES.tool_search]:{name:f.TOOL_NAMES.tool_search,description:`Return the description and exact inputSchema of tools on a connected server, so they can be called with \`${f.TOOL_NAMES.tool_call}\`.`,parameters:e.object({server:e.string().describe("A server name, exactly as the Connected tools section writes it."),tools:e.string().array().describe("Tool names listed under that server. Only the ones you may actually call — schemas are large, and at most 8 come back.")})},[f.TOOL_NAMES.tool_call]:{name:f.TOOL_NAMES.tool_call,description:`Run one tool whose definition came back from \`${f.TOOL_NAMES.tool_search}\`.`,parameters:e.object({server:e.string().describe("The server the tool lives on."),tool:e.string().describe("Its name, as search returned it."),args:e.record(e.string(),e.unknown()).nullish().describe("Arguments matching the inputSchema search returned — do not guess. Null when it takes none."),description:e.string().nullish().describe("One short line for the user: what this call is for. Shown on their screen while it runs.")})}},n=(a,b)=>`${a.replace(/[^a-zA-Z0-9]+/g,"_")}__${b.replace(/[^a-zA-Z0-9_-]+/g,"_")}`.slice(0,64);async function k(a,b){let[c,e]=await Promise.all([(0,i.listConnectedToolNames)(),(0,g.findPinnedTools)(a)]),f={},j=(0,h.botArtifacts)(a);for(let a of e){let c=n(a.server,a.name);f[c]||(f[c]=(0,d.tool)({description:a.description??`${a.name} on the ${a.server} server.`,inputSchema:(0,d.jsonSchema)(a.inputSchema??{type:"object",properties:{}}),execute:(c,{abortSignal:d})=>(0,i.callConnectedTool)(b,a.server,a.name,c??void 0,{artifacts:j,abortSignal:d})}))}return c.length>e.length&&Object.assign(f,o(b,j)),f}async function l(a){let b=(await (0,i.listConnectedToolNames)(a)).map(a=>a.name);if(b.length)return`Tools on "${a}": ${b.join(", ")}.`;let c=await (0,i.listConnectedServerNames)();return c.length?`There is no server called "${a}". Connected: ${c.join(", ")}.`:"Nothing is connected."}let o=(a,b)=>({[f.TOOL_NAMES.tool_search]:(0,d.tool)({description:m[f.TOOL_NAMES.tool_search].description,inputSchema:m[f.TOOL_NAMES.tool_search].parameters,execute:async({server:a,tools:b})=>{let c=[...new Set(b.map(a=>a.trim()).filter(Boolean))],d=c.slice(0,8),e=await (0,i.findConnectedSchemas)(a.trim(),d);if(!e.length)return{tools:[],note:await l(a)};let f=d.filter(a=>!e.some(b=>b.name===a)),g=c.slice(8),h=[f.length?`Not on "${a}": ${f.join(", ")}.`:"",g.length?`Only 8 at a time — ask again for: ${g.join(", ")}.`:""].filter(Boolean);return{tools:e,...h.length?{note:h.join(" ")}:{}}}}),[f.TOOL_NAMES.tool_call]:(0,d.tool)({description:m[f.TOOL_NAMES.tool_call].description,inputSchema:m[f.TOOL_NAMES.tool_call].parameters,execute:async({server:c,tool:d,args:e},{abortSignal:f})=>(await (0,i.listConnectedToolNames)(c.trim())).some(a=>a.name===d.trim())?(0,i.callConnectedTool)(a,c.trim(),d.trim(),e??void 0,{artifacts:b,abortSignal:f}):{status:"error",text:await l(c)}})});a.s(["createMcpTools",0,k]),c()}catch(a){c(a)}},!1),345846,a=>a.a(async(b,c)=>{try{var d=a.i(527990),e=a.i(794219),f=a.i(569572),g=a.i(938934),h=a.i(762008),i=a.i(986743),j=a.i(661210),k=a.i(569549),l=b([i,k]);[i,k]=l.then?(await l)():l;let m=j.MEMORY_PATHS.map(a=>a.path.endsWith("/")?`${a.path}<name>`:a.path).join(", "),n=a=>({...a,facts:a.facts.map(({saidAt:a,...b})=>a?{...b,said:(0,g.saidStamp)(a)}:b),factCount:a.facts.length}),o=a=>"user"===a?"Typed on the screen — there is no conversation behind it.":"bot"===a?"Saved by a bot during a job — there is no conversation behind it.":"The conversation it was saved in is not kept.",p=a=>a>f.MEMORY_LIMITS.factsPerNote?` This note now holds ${a} facts, past the ${f.MEMORY_LIMITS.factsPerNote} one note holds well. Ask the user which of it is no longer true and delete what they name.`:"";a.s(["createMemoryTools",0,(a,b=null,{countReads:c=!0}={})=>({[h.TOOL_NAMES.memory_recall]:(0,d.tool)({description:"Open one note from the listing, whole.",inputSchema:e.object({path:e.string().describe("Exactly as the listing writes it — the path, or one of the names in quotes after it.")}),execute:async({path:a})=>{let{notes:b}=await (0,i.readNotes)([a],{touch:c}),d=b[0];if(!d)return{note:`Nothing on the listing called ${a.trim()}.`};let e=p(d.facts.length);return e?{...n(d),note:e.trim()}:n(d)}}),[h.TOOL_NAMES.memory_remember]:(0,d.tool)({description:"Write to one note: facts, and the line the listing shows for it. The path is the key — a path not on the listing is created (with at least one fact), one that is gets amended.",inputSchema:e.object({path:e.string().describe("The group this note is found by — the person, project or topic its facts are about. Exactly as the listing writes it, or a new path following the same convention. A fact goes under the one note it is about; other notes name it rather than repeat it."),facts:e.object({text:e.string().describe('One statement that stands on its own later — a date as a date, never "next week".'),replaces:e.number().int().nullish().describe(`The id of the fact this replaces — from this note as handed back here or by \`${h.TOOL_NAMES.memory_recall}\`. Null if this is new. A fact that stopped being true is replaced rather than deleted, and so is a note saying the same thing twice: replacing keeps what changed on the record, deleting does not.`),alwaysLoad:e.boolean().nullish().describe(`True carries this line into every call's instructions without opening its note — for what every call needs before any note is opened: what to call them, their language and register. At most ${f.MEMORY_LIMITS.carried}. Null leaves it; false makes a carried line an ordinary fact.`)}).array().nullish().describe("What to write under this note. Send everything that came up at once: one call is one pause in the conversation, three calls are three. Null when only naming it."),description:e.string().nullish().describe(`One line saying what this note holds, so the listing alone tells which facts are inside. Give it for a new note, and again with new facts: rewritten from the current line and the new facts together, so it covers the whole note rather than only what was added. Null leaves it; ${j.MEMORY_ALWAYS_LISTED.join(", ")} keep their own line.`),aliases:e.string().array().nullish().describe('What the user calls this note out loud, in the language they say it — the words they would use to ask for it, not the facts inside. A note at people/partner might be "my partner" and their first name. Replaces the set it has, so send the whole set. Null leaves it.')}),execute:async c=>{let d=c.path.trim(),e=await (0,i.resolveNotePath)(d),g=c.aliases??null,h=e??d,k=(0,j.isAlwaysListed)(h)?(0,j.appNoteLine)(h):c.description?.trim()||null,l=c.facts??[];if(!l.length&&!k&&!g)return{note:"Nothing to write: send facts, a line, names, or any of them."};if(!e&&!(0,j.isMemoryPath)(d))return{note:`Nothing was saved: "${d}" is not a path this listing can carry. Write it again under one of ${m}.`};if(!e&&!l.length)return{note:`Nothing on the listing called ${d}. A note comes into being with a fact — send at least one.`};let o=await (0,i.writeNotes)([{path:h,description:k,aliases:g,facts:l}],a,b),q=o.unnamed.length?` ${o.unnamed[0]} is new and has no line yet — the listing shows its first fact instead. Call again with \`description\` (one line about what it is) and \`aliases\` (the names they say for it).`:"",r=o.notLoaded.length?` All ${f.MEMORY_LIMITS.carried} carried lines are taken, so ${o.notLoaded.map(a=>`"${a}"`).join(", ")} saved as an ordinary fact. Say which carried line you would drop for it and let them choose.`:"",s=n(o.notes[0]),t=e&&l.length&&!k?` Its line still reads "${s.description}"; if that no longer says what the note holds, send \`description\`.`:"";return{...s,note:`Saved. The listing in your instructions is from when this session opened and will not show this until the next one — the note below is current.${q}${r}${t}${p(s.factCount)}`}}}),[h.TOOL_NAMES.memory_conversation]:(0,d.tool)({description:"Open the conversation a fact was saved in, whole: what each side said, and which tools were used.",inputSchema:e.object({factId:e.number().int().describe("The id that came with the fact when its note was opened."),page:e.number().int().min(1).nullish().describe(`${f.MEMORY_CONVERSATION_PAGE} turns a page, oldest first. Null for the first.`)}),execute:async({factId:a,page:c})=>{let d=await (0,i.findFactCall)(a);if(!d)return{note:`No fact with id ${a}.`};if(!d.callId)return{note:o(d.source)};if(d.callId===b)return{note:"Said in this call — it is the conversation you are in."};let e=c??1,h=await (0,k.readCallConversation)(d.callId,e,f.MEMORY_CONVERSATION_PAGE);if(!h)return{note:o(d.source)};let j=Math.max(1,Math.ceil(h.total/f.MEMORY_CONVERSATION_PAGE));return e>j?{note:`That conversation has ${j} page${j>1?"s":""}.`}:{when:(0,g.callStamp)(h.startedAt),page:e,pages:j,conversation:(0,g.conversationLines)(h.turns)}}}),[h.TOOL_NAMES.memory_forget]:(0,d.tool)({description:"Delete facts for good.",inputSchema:e.object({factIds:e.number().int().array().min(1).describe("The ids that came with the facts when their notes were opened — every one to delete, in one call.")}),execute:async({factIds:a})=>{let b=[],c=[],d=new Set;for(let e of new Set(a)){let a=await (0,i.forgetFactById)(e);if(!a){b.push(e);continue}a.noteGone?(d.delete(a.path),c.push(a.path)):d.add(a.path)}if(!c.length&&!d.size)return{note:`No fact with id ${b.join(", ")}. Nothing was deleted.`};let e=["Deleted for good. The listing in your instructions is from when this session opened and still shows it that way until the next one.",1===c.length?`That was the last fact under ${c[0]}, so the note went with it.`:c.length?`That was the last of ${c.join(", ")}, so those notes went with them.`:"",b.length?`No fact with id ${b.join(", ")}, so those were skipped.`:""].filter(Boolean).join(" ");if(!d.size)return{note:e};let{notes:f}=await (0,i.readNotes)([...d],{touch:!1});return{notes:f.map(n),note:e}}})})]),c()}catch(a){c(a)}},!1),622547,a=>a.a(async(b,c)=>{try{var d=a.i(47919),e=a.i(527990),f=a.i(723885),g=a.i(569572),h=a.i(762008),i=a.i(688034),j=a.i(725466),k=a.i(182248),l=b([j]);[j]=l.then?(await l)():l;let o=`Answer the question from the web. Lead with the answer, then
70
+ The line stays open until this runs, and drops once the goodbye being said is over.`,parameters:c.object({})},g=(0,b.tool)({description:f.description,inputSchema:f.parameters}),h={name:d.TOOL_NAMES.emote,description:"Show a short word on your face for a few seconds.",parameters:c.object({text:c.string().describe(`Up to 8 characters: A-Z, 0-9, space and ${e.join(" ")}.`)})},i=(0,b.tool)({description:h.description,inputSchema:h.parameters});a.s(["callTools",0,function(a){return{[d.TOOL_NAMES.end_call]:g,...a?{[d.TOOL_NAMES.emote]:i}:{}}}],375827)},138902,a=>a.a(async(b,c)=>{try{var d=a.i(527990),e=a.i(794219),f=a.i(762008),g=a.i(947950),h=a.i(821415),i=a.i(644468),j=b([g,i]);[g,i]=j.then?(await j)():j;let m={[f.TOOL_NAMES.tool_search]:{name:f.TOOL_NAMES.tool_search,description:`Return the description and exact inputSchema of tools on a connected server, so they can be called with \`${f.TOOL_NAMES.tool_call}\`.`,parameters:e.object({server:e.string().describe("A server name, exactly as the Connected tools section writes it."),tools:e.string().array().describe("Tool names listed under that server. Only the ones you may actually call — schemas are large, and at most 8 come back.")})},[f.TOOL_NAMES.tool_call]:{name:f.TOOL_NAMES.tool_call,description:`Run one tool whose definition came back from \`${f.TOOL_NAMES.tool_search}\`.`,parameters:e.object({server:e.string().describe("The server the tool lives on."),tool:e.string().describe("Its name, as search returned it."),args:e.record(e.string(),e.unknown()).nullish().describe("Arguments matching the inputSchema search returned — do not guess. Null when it takes none."),description:e.string().nullish().describe("One short line for the user: what this call is for. Shown on their screen while it runs.")})}},n=(a,b)=>`${a.replace(/[^a-zA-Z0-9]+/g,"_")}__${b.replace(/[^a-zA-Z0-9_-]+/g,"_")}`.slice(0,64);async function k(a,b){let[c,e]=await Promise.all([(0,i.listConnectedToolNames)(),(0,g.findPinnedTools)(a)]),f={},j=(0,h.botArtifacts)(a);for(let a of e){let c=n(a.server,a.name);f[c]||(f[c]=(0,d.tool)({description:a.description??`${a.name} on the ${a.server} server.`,inputSchema:(0,d.jsonSchema)(a.inputSchema??{type:"object",properties:{}}),execute:(c,{abortSignal:d})=>(0,i.callConnectedTool)(b,a.server,a.name,c??void 0,{artifacts:j,abortSignal:d})}))}return c.length>e.length&&Object.assign(f,o(b,j)),f}async function l(a){let b=(await (0,i.listConnectedToolNames)(a)).map(a=>a.name);if(b.length)return`Tools on "${a}": ${b.join(", ")}.`;let c=await (0,i.listConnectedServerNames)();return c.length?`There is no server called "${a}". Connected: ${c.join(", ")}.`:"Nothing is connected."}let o=(a,b)=>({[f.TOOL_NAMES.tool_search]:(0,d.tool)({description:m[f.TOOL_NAMES.tool_search].description,inputSchema:m[f.TOOL_NAMES.tool_search].parameters,execute:async({server:a,tools:b})=>{let c=[...new Set(b.map(a=>a.trim()).filter(Boolean))],d=c.slice(0,8),e=await (0,i.findConnectedSchemas)(a.trim(),d);if(!e.length)return{tools:[],note:await l(a)};let f=d.filter(a=>!e.some(b=>b.name===a)),g=c.slice(8),h=[f.length?`Not on "${a}": ${f.join(", ")}.`:"",g.length?`Only 8 at a time — ask again for: ${g.join(", ")}.`:""].filter(Boolean);return{tools:e,...h.length?{note:h.join(" ")}:{}}}}),[f.TOOL_NAMES.tool_call]:(0,d.tool)({description:m[f.TOOL_NAMES.tool_call].description,inputSchema:m[f.TOOL_NAMES.tool_call].parameters,execute:async({server:c,tool:d,args:e},{abortSignal:f})=>(await (0,i.listConnectedToolNames)(c.trim())).some(a=>a.name===d.trim())?(0,i.callConnectedTool)(a,c.trim(),d.trim(),e??void 0,{artifacts:b,abortSignal:f}):{status:"error",text:await l(c)}})});a.s(["createMcpTools",0,k]),c()}catch(a){c(a)}},!1),345846,a=>a.a(async(b,c)=>{try{var d=a.i(527990),e=a.i(794219),f=a.i(569572),g=a.i(938934),h=a.i(762008),i=a.i(986743),j=a.i(661210),k=a.i(569549),l=b([i,k]);[i,k]=l.then?(await l)():l;let m=j.MEMORY_PATHS.map(a=>a.path.endsWith("/")?`${a.path}<name>`:a.path).join(", "),n=a=>({...a,facts:a.facts.map(({saidAt:a,...b})=>a?{...b,said:(0,g.saidStamp)(a)}:b),factCount:a.facts.length}),o=a=>"user"===a?"Typed on the screen — there is no conversation behind it.":"bot"===a?"Saved by a bot during a job — there is no conversation behind it.":"The conversation it was saved in is not kept.",p=a=>a>f.MEMORY_LIMITS.factsPerNote?` This note now holds ${a} facts, past the ${f.MEMORY_LIMITS.factsPerNote} one note holds well. Ask the user which of it is no longer true and delete what they name.`:"";a.s(["createMemoryTools",0,(a,b=null,{countReads:c=!0}={})=>({[h.TOOL_NAMES.memory_recall]:(0,d.tool)({description:"Open one note from the listing, whole.",inputSchema:e.object({path:e.string().describe("Exactly as the listing writes it — the path, or one of the names in quotes after it.")}),execute:async({path:a})=>{let{notes:b}=await (0,i.readNotes)([a],{touch:c}),d=b[0];if(!d)return{note:`Nothing on the listing called ${a.trim()}.`};let e=p(d.facts.length);return e?{...n(d),note:e.trim()}:n(d)}}),[h.TOOL_NAMES.memory_remember]:(0,d.tool)({description:"Write to one note: facts, and the line the listing shows for it. The path is the key — a path not on the listing is created (with at least one fact), one that is gets amended.",inputSchema:e.object({path:e.string().describe("The group this note is found by — the person, project or topic its facts are about. Exactly as the listing writes it, or a new path following the same convention. A fact goes under the one note it is about; other notes name it rather than repeat it."),facts:e.object({text:e.string().describe('One statement that stands on its own later — a date as a date, never "next week".'),replaces:e.number().int().nullish().describe(`The id of the fact this replaces — from this note as handed back here or by \`${h.TOOL_NAMES.memory_recall}\`. Null if this is new. A fact that stopped being true is replaced rather than deleted, and so is a note saying the same thing twice: replacing keeps what changed on the record, deleting does not.`),alwaysLoad:e.boolean().nullish().describe(`True carries this line into every call's instructions without opening its note — for what every call needs before any note is opened: what to call them, their language and register. At most ${f.MEMORY_LIMITS.carried}. Null leaves it; false makes a carried line an ordinary fact.`)}).array().nullish().describe("What to write under this note. Send everything that came up at once: one call is one pause in the conversation, three calls are three. Null when only naming it."),description:e.string().nullish().describe(`One line saying what this note holds, so the listing alone tells which facts are inside. Give it for a new note, and again with new facts: rewritten from the current line and the new facts together, so it covers the whole note rather than only what was added. Null leaves it; ${j.MEMORY_ALWAYS_LISTED.join(", ")} keep their own line.`),aliases:e.string().array().nullish().describe('What the user calls this note out loud, in the language they say it — the words they would use to ask for it, not the facts inside. A note at people/partner might be "my partner" and their first name. Replaces the set it has, so send the whole set. Null leaves it.')}),execute:async c=>{let d=c.path.trim(),e=await (0,i.resolveNotePath)(d),g=c.aliases??null,h=e??d,k=(0,j.isAlwaysListed)(h)?(0,j.appNoteLine)(h):c.description?.trim()||null,l=c.facts??[];if(!l.length&&!k&&!g)return{note:"Nothing to write: send facts, a line, names, or any of them."};if(!e&&!(0,j.isMemoryPath)(d))return{note:`Nothing was saved: "${d}" is not a path this listing can carry. Write it again under one of ${m}.`};if(!e&&!l.length)return{note:`Nothing on the listing called ${d}. A note comes into being with a fact — send at least one.`};let o=await (0,i.writeNotes)([{path:h,description:k,aliases:g,facts:l}],a,b),q=o.unnamed.length?` ${o.unnamed[0]} is new and has no line yet — the listing shows its first fact instead. Call again with \`description\` (one line about what it is) and \`aliases\` (the names they say for it).`:"",r=o.notLoaded.length?` All ${f.MEMORY_LIMITS.carried} carried lines are taken, so ${o.notLoaded.map(a=>`"${a}"`).join(", ")} saved as an ordinary fact. Say which carried line you would drop for it and let them choose.`:"",s=n(o.notes[0]),t=e&&l.length&&!k?` Its line still reads "${s.description}"; if that no longer says what the note holds, send \`description\`.`:"";return{...s,note:`Saved. The listing in your instructions is from when this session opened and will not show this until the next one — the note below is current.${q}${r}${t}${p(s.factCount)}`}}}),[h.TOOL_NAMES.memory_conversation]:(0,d.tool)({description:"Open the conversation a fact was saved in, whole: what each side said, and which tools were used.",inputSchema:e.object({factId:e.number().int().describe("The id that came with the fact when its note was opened."),page:e.number().int().min(1).nullish().describe(`${f.MEMORY_CONVERSATION_PAGE} turns a page, oldest first. Null for the first.`)}),execute:async({factId:a,page:c})=>{let d=await (0,i.findFactCall)(a);if(!d)return{note:`No fact with id ${a}.`};if(!d.callId)return{note:o(d.source)};if(d.callId===b)return{note:"Said in this call — it is the conversation you are in."};let e=c??1,h=await (0,k.readCallConversation)(d.callId,e,f.MEMORY_CONVERSATION_PAGE);if(!h)return{note:o(d.source)};let j=Math.max(1,Math.ceil(h.total/f.MEMORY_CONVERSATION_PAGE));return e>j?{note:`That conversation has ${j} page${j>1?"s":""}.`}:{when:(0,g.callStamp)(h.startedAt),page:e,pages:j,conversation:(0,g.conversationLines)(h.turns)}}}),[h.TOOL_NAMES.memory_forget]:(0,d.tool)({description:"Delete facts for good.",inputSchema:e.object({factIds:e.number().int().array().min(1).describe("The ids that came with the facts when their notes were opened — every one to delete, in one call.")}),execute:async({factIds:a})=>{let b=[],c=[],d=new Set;for(let e of new Set(a)){let a=await (0,i.forgetFactById)(e);if(!a){b.push(e);continue}a.noteGone?(d.delete(a.path),c.push(a.path)):d.add(a.path)}if(!c.length&&!d.size)return{note:`No fact with id ${b.join(", ")}. Nothing was deleted.`};let e=["Deleted for good. The listing in your instructions is from when this session opened and still shows it that way until the next one.",1===c.length?`That was the last fact under ${c[0]}, so the note went with it.`:c.length?`That was the last of ${c.join(", ")}, so those notes went with them.`:"",b.length?`No fact with id ${b.join(", ")}, so those were skipped.`:""].filter(Boolean).join(" ");if(!d.size)return{note:e};let{notes:f}=await (0,i.readNotes)([...d],{touch:!1});return{notes:f.map(n),note:e}}})})]),c()}catch(a){c(a)}},!1),622547,a=>a.a(async(b,c)=>{try{var d=a.i(47919),e=a.i(527990),f=a.i(723885),g=a.i(569572),h=a.i(762008),i=a.i(688034),j=a.i(725466),k=a.i(182248),l=b([j]);[j]=l.then?(await l)():l;let o=`Answer the question from the web. Lead with the answer, then
71
71
  what supports it. Say plainly what you could not find or confirm — do not fill
72
72
  the gap with a guess. Every number carries the date you saw it. Be brief: this
73
73
  is read by another model, not by a person.`,p=f.default.string().describe("What you want to know, as one full question. Put the place and the time in when they matter — the searcher sees nothing but this line.");async function m(a,b,c){let d=await fetch("https://api.exa.ai/search",{method:"POST",signal:c,headers:{"content-type":"application/json","x-api-key":a},body:JSON.stringify({query:b,type:"auto",numResults:g.SEARCH.sources,contents:{text:{maxCharacters:g.SEARCH.excerptChars},livecrawl:"fallback",livecrawlTimeout:5e3}})});if(!d.ok)return`Exa answered ${d.status}: ${(0,k.clip)((await d.text()).trim(),200)}`;let e=(await d.json()).results??[];return e.length?e.map(a=>{let b=[a.title?.trim(),a.url?.trim()].filter(Boolean).join(" — "),c=a.publishedDate?.slice(0,10);return[c?`${b} \xb7 ${c}`:b,a.text?.trim()].filter(Boolean).join("\n")}).join("\n\n"):"Nothing came back for that. Try other words, or open a page in the browser."}async function n(a,b,c){let{text:e,sources:f}=await (0,d.generateText)({model:a.model,tools:a.tools,system:o,prompt:b,abortSignal:c}),h=[...new Set(f.flatMap(a=>"url"===a.sourceType?[a.title?`${a.title} — ${a.url}`:a.url]:[]))].slice(0,g.SEARCH.sources);return[e.trim(),h.length?`Sources:
@@ -103,13 +103,13 @@ Cover all of it, and prefer a fact over a description of a fact:
103
103
 
104
104
  Plain text, under ${g} words. No preamble, no headings about the summary itself, no account of how you have been going.`)}],abortSignal:e.signal,timeout:f.BOT_RUN.silenceMs}),j=h.trim();if(!j)throw Object.assign(Error("The summary of the context came back empty, so there is nothing to carry on from."),{isRetryable:!0});return{text:`Everything between the first message and here was compacted. Below is your own summary of it; carry on from the first message and this.
105
105
 
106
- ${j}`,usage:x(i)}}let x=a=>({input:a.inputTokens??0,output:a.outputTokens??0});a.s(["resumeTranscript",0,function(a,b=new Map){let c=new Map,d=new Set;for(let b of a)if(("tool"===b.role||"assistant"===b.role)&&Array.isArray(b.content))for(let a of b.content)"tool-result"===a.type&&(c.has(a.toolCallId)||c.set(a.toolCallId,a),"assistant"===b.role&&d.add(a.toolCallId));let e=[],f=new Set;for(let g of a){if("tool"===g.role){let a=g.content.filter(a=>"tool-result"!==a.type);a.length&&e.push({...g,content:a});continue}if("assistant"!==g.role||"string"==typeof g.content){e.push(g);continue}let a=[],h=[];for(let e of g.content){if("tool-call"!==e.type){h.push(e);continue}if(f.has(e.toolCallId))continue;let g=e.input;if("string"==typeof g)try{g=JSON.parse(g)}catch{g=void 0}if(!e.toolCallId||void 0===g){h.push({type:"text",text:"A tool argument stream was interrupted before a complete call was recorded. Inspect the saved work before continuing."});continue}let i=e.toolName===k.TOOL_NAMES.send_message?b.get(e.toolCallId):void 0,j=c.get(e.toolCallId)??(i?{type:"tool-result",toolCallId:e.toolCallId,toolName:e.toolName,output:{type:"json",value:i}}:void 0);if(e.providerExecuted&&(!j||!d.has(e.toolCallId))){h.push({type:"text",text:j?`The provider operation ${e.toolName} returned this data before its native continuation was interrupted: ${JSON.stringify(j.output)}`:`The provider operation ${e.toolName} was interrupted without a recorded result. Its remote execution state is unknown.`});continue}f.add(e.toolCallId),h.push({...e,input:g}),d.has(e.toolCallId)||a.push(j??{type:"tool-result",toolCallId:e.toolCallId,toolName:e.toolName,output:{type:"text",value:"No result: execution was interrupted before a result was recorded. The outcome is unknown. Inspect the current state before repeating the action."}})}h.length&&e.push({...g,content:h}),a.length&&e.push({role:"tool",content:a})}return e},"runBot",0,s]),c()}catch(a){c(a)}},!1),674986,a=>a.a(async(b,c)=>{try{var d=a.i(136340),e=a.i(203469),f=a.i(569572),g=a.i(875931),h=a.i(735502),i=a.i(569549),j=a.i(684321),k=a.i(821415),l=a.i(956802),m=a.i(176668),n=a.i(293480),o=a.i(8412),p=a.i(182248),q=a.i(221214),r=a.i(654034),s=a.i(446957),t=a.i(839430),u=a.i(109955),v=a.i(344853),w=b([g,h,i,q,r,t,v]);[g,h,i,q,r,t,v]=w.then?(await w)():w;let H=globalThis.__roomRuns??=new Map,I=globalThis.__roomThreadLock??=(0,o.createKeyedLock)();async function x(a){let b=await (0,q.findJobBot)(a.bot);(!b||b.disabled)&&(0,n.publicError)("Choose an enabled bot.");let{from:c,...d}={...a,bot:b.name},e=(0,h.buildThreadOpening)({bot:d.bot,request:d.request,from:c}),f=await (0,v.insertThread)({...d,opening:e});return await z(f.id),f.id}async function y(a,b,c="user",d,e){let f=null;return await I(a,async()=>{let g=await (0,v.findThread)(a);if(g||(0,n.publicError)("No such thread."),d){let b=(await (0,t.listRoomWork)(a)).find(a=>a.bot.toLowerCase()===d.trim().toLowerCase());b&&b.bot!==u.ROOM_THURSDAY||(0,n.publicError)("Choose a participant in this thread."),d=b.bot}b.trim()===s.THREAD_CONTINUE&&(0,s.isAppStop)(g.pending)?(await (0,t.resumeRoom)(a),(await (0,t.listRoomWork)(a)).some(a=>"queued"===a.state)||(f=await (0,t.tellRoom)(a,"Continue from the saved conversation.","user"===c?"The user":u.ROOM_THURSDAY,d,void 0,!1))):f=await (0,t.tellRoom)(a,b,"user"===c?"The user":u.ROOM_THURSDAY,d,e)}),await z(a),f}async function z(a){await I(a,async()=>{if(!e.presence.watching){let b=await (0,v.findThread)(a);b?.status!=="running"||[...H.values()].some(b=>b.threadId===a)||await (0,t.pauseRoom)(a,"The app is not open. Work resumes when it returns.",!0);return}for(let b=0;b<2;b++){let b;for(;b=await (0,t.claimRoomWork)(a);)!function(a){let b,c=new AbortController,d=new Promise(a=>{b=a});H.set(a.id,{threadId:a.threadId,stop:c,done:d}),A(a,c.signal).catch(b=>m.logger.error(`thread ${a.threadId}: participant`,b)).finally(()=>{H.delete(a.id),b(),z(a.threadId).catch(b=>m.logger.error(`thread ${a.threadId}: scheduling`,b))})}(b);await (0,t.settleRoom)(a)}})}async function A(a,b){let c=await B(a,b);if(c?.failure?.retry&&!b.aborted&&(await (0,t.noteRoomBreak)(a,c.failure.message),await (0,d.setTimeout)(f.BOT_RUN.retryMs,void 0,{signal:b}).catch(()=>{}),b.aborted||(c=await B(a,b))),!c||b.aborted)return;let g=c.failure?.message,h=c.ending;if(g||!h||h.stopped){let b=g??"The turn was interrupted. Continue from the saved conversation.";I(a.threadId,async()=>{let c=(await (0,t.listRoomWork)(a.threadId)).find(b=>b.id===a.id);if(c?.state!=="running"||c.generation!==a.generation)return;let d=C(a.threadId);await (0,t.pauseRoom)(a.threadId,b),await d}).catch(b=>m.logger.error(`thread ${a.threadId}: pausing`,b));return}await (0,t.finishRoomWork)(a,h.text);let n=await (0,v.findThread)(a.threadId);if(n?.status==="done"){await (0,i.isAnyCallLive)()||(0,l.desktopNotify)(n.label,n.outcome??"");let a=await (0,k.filesOnDisk)((0,j.pathsIn)(n.outcome??""),null),b=a.find(a=>a.startsWith(`${f.PATHS.artifacts}/`))??a[0];b&&e.appEvents.emit({type:"artifact",threadId:n.id,label:n.label,path:b})}}async function B(a,b){let c=new J(a,b),d=null,e=null;try{let f=await (0,v.findThread)(a.threadId);if(!f)return null;(await (0,t.listParticipantTranscript)(a.threadId,a.bot)).length||await (0,t.appendRoomMessage)(a.threadId,{bot:a.bot,parent:a.id,role:"user",content:`Request: ${f.request}
106
+ ${j}`,usage:x(i)}}let x=a=>({input:a.inputTokens??0,output:a.outputTokens??0});a.s(["resumeTranscript",0,function(a,b=new Map){let c=new Map,d=new Set;for(let b of a)if(("tool"===b.role||"assistant"===b.role)&&Array.isArray(b.content))for(let a of b.content)"tool-result"===a.type&&(c.has(a.toolCallId)||c.set(a.toolCallId,a),"assistant"===b.role&&d.add(a.toolCallId));let e=[],f=new Set;for(let g of a){if("tool"===g.role){let a=g.content.filter(a=>"tool-result"!==a.type);a.length&&e.push({...g,content:a});continue}if("assistant"!==g.role||"string"==typeof g.content){e.push(g);continue}let a=[],h=[];for(let e of g.content){if("tool-call"!==e.type){h.push(e);continue}if(f.has(e.toolCallId))continue;let g=e.input;if("string"==typeof g)try{g=JSON.parse(g)}catch{g=void 0}if(!e.toolCallId||void 0===g){h.push({type:"text",text:"A tool argument stream was interrupted before a complete call was recorded. Inspect the saved work before continuing."});continue}let i=e.toolName===k.TOOL_NAMES.send_message?b.get(e.toolCallId):void 0,j=c.get(e.toolCallId)??(i?{type:"tool-result",toolCallId:e.toolCallId,toolName:e.toolName,output:{type:"json",value:i}}:void 0);if(e.providerExecuted&&(!j||!d.has(e.toolCallId))){h.push({type:"text",text:j?`The provider operation ${e.toolName} returned this data before its native continuation was interrupted: ${JSON.stringify(j.output)}`:`The provider operation ${e.toolName} was interrupted without a recorded result. Its remote execution state is unknown.`});continue}f.add(e.toolCallId),h.push({...e,input:g}),d.has(e.toolCallId)||a.push(j??{type:"tool-result",toolCallId:e.toolCallId,toolName:e.toolName,output:{type:"text",value:"No result: execution was interrupted before a result was recorded. The outcome is unknown. Inspect the current state before repeating the action."}})}h.length&&e.push({...g,content:h}),a.length&&e.push({role:"tool",content:a})}return e},"runBot",0,s]),c()}catch(a){c(a)}},!1),674986,a=>a.a(async(b,c)=>{try{var d=a.i(136340),e=a.i(203469),f=a.i(569572),g=a.i(875931),h=a.i(735502),i=a.i(569549),j=a.i(684321),k=a.i(821415),l=a.i(956802),m=a.i(176668),n=a.i(293480),o=a.i(8412),p=a.i(182248),q=a.i(221214),r=a.i(654034),s=a.i(446957),t=a.i(839430),u=a.i(109955),v=a.i(344853),w=b([g,h,i,q,r,t,v]);[g,h,i,q,r,t,v]=w.then?(await w)():w;let H=globalThis.__roomRuns??=new Map,I=globalThis.__roomThreadLock??=(0,o.createKeyedLock)();async function x(a){let b=await (0,q.findJobBot)(a.bot);(!b||b.disabled)&&(0,n.publicError)("Choose an enabled bot.");let{from:c,...d}={...a,bot:b.name},e=(0,h.buildThreadOpening)({bot:d.bot,request:d.request,from:c}),f=await (0,v.insertThread)({...d,opening:e});return await z(f.id),f.id}async function y(a,b,c="user",d,e){let f=null;return await I(a,async()=>{let g=await (0,v.findThread)(a);if(g||(0,n.publicError)("No such thread."),d){let b=(await (0,t.listRoomWork)(a)).find(a=>a.bot.toLowerCase()===d.trim().toLowerCase());b&&b.bot!==u.ROOM_THURSDAY||(0,n.publicError)("Choose a participant in this thread."),d=b.bot}b.trim()===s.THREAD_CONTINUE&&(0,s.isAppStop)(g.pending)?(await (0,t.resumeRoom)(a),(await (0,t.listRoomWork)(a)).some(a=>"queued"===a.state)||(f=await (0,t.tellRoom)(a,"Continue from the saved conversation.","user"===c?"The user":u.ROOM_THURSDAY,d,void 0,!1))):f=await (0,t.tellRoom)(a,b,"user"===c?"The user":u.ROOM_THURSDAY,d,e)}),await z(a),f}async function z(a){await I(a,async()=>{if(!e.presence.watching){let b=await (0,v.findThread)(a);b?.status!=="running"||[...H.values()].some(b=>b.threadId===a)||await (0,t.pauseRoom)(a,"The app is not open. Work resumes when it returns.",!0);return}for(let b=0;b<2;b++){let b;for(;b=await (0,t.claimRoomWork)(a);)!function(a){let b,c=new AbortController,d=new Promise(a=>{b=a});H.set(a.id,{threadId:a.threadId,stop:c,done:d}),A(a,c.signal).catch(b=>m.logger.error(`thread ${a.threadId}: participant`,b)).finally(()=>{H.delete(a.id),b(),z(a.threadId).catch(b=>m.logger.error(`thread ${a.threadId}: scheduling`,b))})}(b);await (0,t.settleRoom)(a)}})}async function A(a,b){let c=await B(a,b);if(c?.failure?.retry&&!b.aborted&&(await (0,t.noteRoomBreak)(a,c.failure.message),await (0,d.setTimeout)(f.BOT_RUN.retryMs,void 0,{signal:b}).catch(()=>{}),b.aborted||(c=await B(a,b))),!c||b.aborted)return;let g=c.failure?.message,h=c.ending;if(g||!h||h.stopped){let b=g??"The turn was interrupted. Continue from the saved conversation.";I(a.threadId,async()=>{let c=(await (0,t.listRoomWork)(a.threadId)).find(b=>b.id===a.id);if(c?.state!=="running"||c.generation!==a.generation)return;let d=C(a.threadId);await (0,t.pauseRoom)(a.threadId,b),await d}).catch(b=>m.logger.error(`thread ${a.threadId}: pausing`,b));return}await (0,t.finishRoomWork)(a,h.text);let n=await (0,v.findThread)(a.threadId);if(n?.status==="done"){await (0,i.isAnyCallLive)()||(0,l.desktopNotify)(n.label,n.outcome??"");let a=(await (0,k.filesOnDisk)((0,j.pathsIn)(n.outcome??""),null)).find(j.opensOnFinish);a&&e.appEvents.emit({type:"artifact",threadId:n.id,label:n.label,path:a})}}async function B(a,b){let c=new J(a,b),d=null,e=null;try{let f=await (0,v.findThread)(a.threadId);if(!f)return null;(await (0,t.listParticipantTranscript)(a.threadId,a.bot)).length||await (0,t.appendRoomMessage)(a.threadId,{bot:a.bot,parent:a.id,role:"user",content:`Request: ${f.request}
107
107
  Coordinator: ${f.bot}. Continue as ${a.bot} in this thread.`,hidden:!0}),await (0,t.consumeRoomInbox)(a);let g=await (0,t.listParticipantTranscript)(a.threadId,a.bot);await (0,r.runBot)({bot:a.bot,messages:(0,r.resumeTranscript)(g,await (0,t.listRoomReceipts)(a.threadId,a.bot,g))},{signal:b,threadId:a.threadId,parent:a.id,caller:a.caller,owner:f.bot,contextBudget:await (0,t.roomContextBudget)(a.threadId,a.bot),session:(0,k.botBrowserSession)(a.threadId,a.bot),notes:()=>(0,t.consumeRoomInbox)(a),send:async c=>{b.throwIfAborted();let d=c.to.trim();if(d.toLowerCase()===u.ROOM_THURSDAY.toLowerCase())d=u.ROOM_THURSDAY;else{let a=await (0,q.findJobBot)(d);(!a||a.disabled)&&(0,n.publicError)(`No enabled bot named "${d}".`),d=a.name}let e=await (0,t.sendRoomMessage)(a,{...c,to:d});return z(a.threadId).catch(a=>m.logger.error("room message scheduling",a)),e},emit:async g=>{(!b.aborted||"tool-result"===g.type)&&(await c.on(g),"step"===g.type&&await (0,v.addThreadUsage)(a.threadId,g.usage,a.bot===f.bot?{tokens:g.usage.input,budget:g.budget}:null),"compact"===g.type&&await (0,v.addThreadUsage)(a.threadId,g.usage),"turn-end"===g.type&&(d=g),"error"===g.type&&(e={message:g.message,retry:g.retry},g.budget&&await (0,t.lowerRoomContextBudget)(a,g.budget)))}})}catch(c){b.aborted||(m.logger.error(`thread ${a.threadId}: ${a.bot} broke`,c),e={message:(0,g.modelErrorToString)(c),retry:!(0,n.isPublicError)(c)&&!(0,g.isProviderRefusal)(c)})}return{ending:d,failure:e}}globalThis.__roomPausing??={current:Promise.resolve()};class J{work;signal;lane;assistant;tool;parts;calls;results;constructor(a,b){this.work=a,this.signal=b,this.lane=(0,p.PromiseChain)(),this.assistant=null,this.tool=null,this.parts={assistant:[],tool:[]},this.calls=new Set,this.results=new Set}async write(a,b,c=!1){let d={bot:this.work.bot,parent:this.work.id,role:b.role,content:b.content,compact:c,note:c};return null===a?(0,t.appendRoomMessage)(this.work.threadId,d):(await (0,v.upsertMessage)(this.work.threadId,a,d),a)}on(a){return this.lane(async()=>{if(!this.signal.aborted||"tool-result"===a.type)if("text"===a.type)this.parts.assistant.push({type:"text",text:a.text}),this.assistant=await this.write(this.assistant,{role:"assistant",content:this.parts.assistant});else if("tool"===a.type){if(this.calls.has(a.id)){let b=this.parts.assistant.find(b=>"tool-call"===b.type&&b.toolCallId===a.id);b&&"tool-call"===b.type&&a.providerOptions&&(b.providerOptions=a.providerOptions,this.assistant=await this.write(this.assistant,{role:"assistant",content:this.parts.assistant}));return}this.calls.add(a.id),this.parts.assistant.push({type:"tool-call",toolCallId:a.id,toolName:a.name,input:a.input,...a.providerExecuted?{providerExecuted:!0}:{},...a.providerOptions?{providerOptions:a.providerOptions}:{}}),this.assistant=await this.write(this.assistant,{role:"assistant",content:this.parts.assistant})}else if("tool-result"===a.type){if(this.results.has(a.id))return;this.results.add(a.id),this.parts.tool.push({type:"tool-result",toolCallId:a.id,toolName:a.name,output:a.error?{type:"error-text",value:String(a.output)}:"string"==typeof a.output?{type:"text",value:a.output}:{type:"json",value:a.output}}),this.tool=await this.write(this.tool,{role:"tool",content:this.parts.tool})}else if("step"===a.type){let b=[this.assistant,this.tool];for(let[c,d]of a.messages.entries())await this.write(b[c]??null,d);let c=b.slice(a.messages.length).filter(a=>null!==a);c.length&&await (0,v.deleteMessages)(this.work.threadId,c),this.assistant=this.tool=null,this.parts={assistant:[],tool:[]}}else"compact"===a.type&&await this.write(null,{role:"user",content:a.text},!0)})}}async function C(a){let b=[...H.values()].filter(b=>b.threadId===a);for(let a of b)a.stop.abort();await Promise.all(b.map(a=>a.done))}async function D(a){await I(a,async()=>{let b=await (0,v.findThread)(a);b||(0,n.publicError)("No such thread."),b.endedAt&&(0,n.publicError)("That thread has already ended."),await (0,t.cancelRoom)(a),await (0,v.updateThread)(a,{status:"cancelled",outcome:null,pending:null,seen:!0,endedAt:new Date}),await C(a),await (0,k.closeJobShell)(a)})}async function E(a){return I(a,()=>F(a))}async function F(a){let b=await (0,v.findThread)(a);await (0,t.cancelRoom)(a),await C(a),await (0,k.closeJobShell)(a);let c=await (0,v.deleteThread)(a);return c&&b&&await (0,k.removeJobScratch)(a,b.label),c}async function G(){let a=0;for(let b of(await (0,v.listThreadFolders)()))("done"===b.status||"cancelled"===b.status)&&await I(b.id,async()=>{let c=await (0,v.findThread)(b.id);(c?.status==="done"||c?.status==="cancelled")&&await F(b.id)&&(a+=1)});return a}a.s(["answerThread",0,y,"cancelThread",0,D,"removeFinishedThreads",0,G,"removeThread",0,E,"startThread",0,x]),c()}catch(a){c(a)}},!1),317844,a=>a.a(async(b,c)=>{try{var d,e=a.i(106450),f=a.i(64203),g=a.i(569572),h=a.i(176668),i=a.i(182248),j=a.i(947950),k=a.i(899284),l=b([j]);[j]=l.then?(await l)():l;class m extends Error{serverName;authorizationUrl;constructor(a,b){super(`MCP server "${a}" requires authorization`),this.serverName=a,this.authorizationUrl=b,this.name="McpAuthRequiredError"}}class n{store;serverName;oauth;callbackUrl;clientName;staticClient;lastAuthorizationUrl;constructor(a,b,c,d,e,f){this.store=a,this.serverName=b,this.oauth=c,this.callbackUrl=d,this.clientName=e,this.staticClient=f}get redirectUrl(){return this.callbackUrl}get clientMetadata(){return{client_name:this.clientName,redirect_uris:[this.callbackUrl],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"client_secret_post"}}async persist(a){this.oauth={...this.oauth,...a},await this.store.saveOAuth(this.serverName,this.oauth)}clientInformation(){return this.staticClient??this.oauth.clientInformation}async saveClientInformation(a){await this.persist({clientInformation:a})}tokens(){return this.oauth.tokens}async saveTokens(a){await this.persist({tokens:a})}authorizationServerInformation(){return this.oauth.authorizationServer}async saveAuthorizationServerInformation(a){await this.persist({authorizationServer:a})}codeVerifier(){if(!this.oauth.codeVerifier)throw Error("No code verifier saved");return this.oauth.codeVerifier}async saveCodeVerifier(a){await this.persist({codeVerifier:a})}state(){return crypto.randomUUID()}async saveState(a){await this.persist({state:a})}storedState(){return this.oauth.state}redirectToAuthorization(a){this.lastAuthorizationUrl=a}async invalidateCredentials(a){let b={...this.oauth};("all"===a||"client"===a)&&(b.clientInformation=void 0),("all"===a||"tokens"===a)&&(b.tokens=void 0),("all"===a||"verifier"===a)&&(b.codeVerifier=void 0),this.oauth=b,await this.store.saveOAuth(this.serverName,b)}}let o=globalThis;o.__thursdayMcpManager&&o.__thursdayMcpManager.dispose(),d={callbackUrl:new URL("/api/mcp/oauth/callback",g.APP_URL).href,clientName:g.APP_NAME},o.__thursdayMcpManager=new class a{store;sessions;connecting;idleTtlMs;callbackUrl;clientName;constructor(a,b){this.store=a,this.sessions=new Map,this.connecting=new Map,this.callbackUrl=b.callbackUrl,this.idleTtlMs=b.idleTtlMs??18e5,this.clientName=b.clientName??g.APP_NAME}async connect(a){let b=this.connecting.get(a);if(b)return b;let c=this.doConnect(a).finally(()=>this.connecting.delete(a));return this.connecting.set(a,c),c}async callTool(a,b,c,d){let f=await this.ensureClient(a);try{let e=await f.callTool({name:b,arguments:c,options:d?{signal:d}:void 0});return this.touch(a),e}catch(b){if(b instanceof e.UnauthorizedError)throw await this.closeSession(a),new m(a);throw b}}async finishAuthorization(a){let b=a.get("state"),c=a.get("code");if(!b||!c)throw Error("OAuth callback is missing code or state");let d=await this.store.findByOAuthState(b);if(!d||!(0,k.isRemoteConfig)(d.config))throw Error("No server is waiting for this authorization");let f=this.providerFor(d),g=await (0,e.auth)(f,{serverUrl:d.config.url,authorizationCode:c,callbackState:b});if("AUTHORIZED"!==g)throw Error(`Token exchange ended in "${g}"`);return await f.invalidateCredentials("verifier"),await this.connect(d.name),d.name}async disconnect(a){await this.closeSession(a)}async dispose(){await Promise.all([...this.sessions.keys()].map(a=>this.closeSession(a)))}async doConnect(a){await this.closeSession(a);let b=await this.store.load(a);if(!b)throw Error(`Unknown MCP server "${a}"`);let c={};try{let d=await this.openClient(b,c),e=(await d.listTools()).tools.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema,outputSchema:a.outputSchema}));return this.adopt(a,d),await this.store.saveConnectionResult(a,{toolInfo:e,lastError:null}),h.logger.info(`mcp "${a}" connected — ${e.length} tools`),{status:"connected",tools:e}}catch(l){var d,f;let g;if(l instanceof e.UnauthorizedError||l?.cause instanceof e.UnauthorizedError){let b=c.href;if(b)return await this.store.saveConnectionResult(a,{toolInfo:[],lastError:"Authorization required — finish sign-in in the opened tab"}),{status:"auth_required",authorizationUrl:b}}let j=(d=l,f=b,g=(0,i.errorToString)(d),/\b40[13]\b/.test(g)&&/OAuth|register/i.test(g)&&(0,k.isRemoteConfig)(f.config)&&!f.config.oauthClient?"This server does not allow automatic client registration. Register an OAuth app with the provider and add its client ID and secret.":g);throw await this.store.saveConnectionResult(a,{toolInfo:[],lastError:j}),h.logger.warn(`mcp "${a}" failed — ${j}`),Error(j,{cause:l})}}async openClient(a,b={}){if((0,k.isRemoteConfig)(a.config)){let c=this.providerFor(a);try{return await (0,e.createMCPClient)({name:this.clientName,transport:{type:"http",url:a.config.url,headers:a.config.headers,authProvider:c,redirect:"follow"}})}finally{b.href=c.lastAuthorizationUrl?.href}}return(0,e.createMCPClient)({name:this.clientName,transport:new f.Experimental_StdioMCPTransport({command:a.config.command,args:a.config.args,env:a.config.env})})}providerFor(a){let b=(0,k.isRemoteConfig)(a.config)?a.config.oauthClient:void 0;return new n(this.store,a.name,a.oauth??{},this.callbackUrl,this.clientName,b&&{client_id:b.clientId,client_secret:b.clientSecret})}async ensureClient(a){let b=this.sessions.get(a);if(b)return b.client;let c=await this.connect(a);if("auth_required"===c.status)throw new m(a,c.authorizationUrl);let d=this.sessions.get(a);if(!d)throw Error(`Session for "${a}" vanished mid-connect`);return d.client}adopt(a,b){this.sessions.set(a,{client:b,idleTimer:this.armIdleTimer(a)})}touch(a){let b=this.sessions.get(a);b&&(clearTimeout(b.idleTimer),b.idleTimer=this.armIdleTimer(a))}armIdleTimer(a){let b=setTimeout(()=>{this.closeSession(a)},this.idleTtlMs);return b.unref?.(),b}async closeSession(a){let b=this.sessions.get(a);b&&(this.sessions.delete(a),clearTimeout(b.idleTimer),await b.client.close().catch(()=>{}))}}({load:a=>(0,j.findServer)(a),saveOAuth:(a,b)=>(0,j.saveOAuthData)(a,b),saveConnectionResult:(a,b)=>null===b.lastError?(0,j.syncServerTools)(a,b.toolInfo):(0,j.saveConnectionError)(a,b.lastError),findByOAuthState:a=>(0,j.findServerByOAuthState)(a)},d);let p=o.__thursdayMcpManager;a.s(["McpAuthRequiredError",0,m,"mcpManager",0,p]),c()}catch(a){c(a)}},!1),947950,a=>a.a(async(b,c)=>{try{var d=a.i(93321),e=a.i(351674),f=a.i(203469),g=a.i(184838),h=a.i(714428),i=a.i(899284),j=b([g]);async function k(a){var b;let[c]=await g.database.select({name:h.mcpServerTable.name,config:h.mcpServerTable.config,lastError:h.mcpServerTable.lastError,toolsSyncedAt:h.mcpServerTable.toolsSyncedAt}).from(h.mcpServerTable).where((0,d.eq)(h.mcpServerTable.name,a));return c?{...c,config:(b=c.config,(0,i.isRemoteConfig)(b)?{url:b.url}:{command:b.command,args:b.args}),tools:await l(a)}:null}async function l(a){return g.database.select({id:h.mcpToolTable.id,name:h.mcpToolTable.name,description:h.mcpToolTable.description,inputSchema:h.mcpToolTable.inputSchema,outputSchema:h.mcpToolTable.outputSchema}).from(h.mcpToolTable).where((0,d.eq)(h.mcpToolTable.serverName,a)).orderBy(h.mcpToolTable.name)}async function m(a){let[b]=await g.database.select().from(h.mcpServerTable).where((0,d.eq)(h.mcpServerTable.name,a));return b??null}[g]=j.then?(await j)():j;let u=()=>f.appEvents.emit({type:"mcp"});async function n(a){let[b]=await g.database.insert(h.mcpServerTable).values({...a,lastError:null}).onConflictDoUpdate({target:h.mcpServerTable.name,set:{config:a.config,lastError:null}}).returning();return u(),b}async function o(a,b){await g.database.transaction(async c=>{b.length&&await c.insert(h.mcpToolTable).values(b.map(b=>({...b,serverName:a}))).onConflictDoUpdate({target:[h.mcpToolTable.serverName,h.mcpToolTable.name],set:{description:p(h.mcpToolTable.description),inputSchema:p(h.mcpToolTable.inputSchema),outputSchema:p(h.mcpToolTable.outputSchema)}}),await c.delete(h.mcpToolTable).where(b.length?(0,d.and)((0,d.eq)(h.mcpToolTable.serverName,a),(0,d.notInArray)(h.mcpToolTable.name,b.map(a=>a.name))):(0,d.eq)(h.mcpToolTable.serverName,a)),await c.update(h.mcpServerTable).set({lastError:null,toolsSyncedAt:new Date}).where((0,d.eq)(h.mcpServerTable.name,a))}),u()}function p(a){return e.sql.raw(`excluded."${a.name}"`)}async function q(a,b){await g.database.update(h.mcpServerTable).set({lastError:b}).where((0,d.eq)(h.mcpServerTable.name,a)),u()}async function r(a,b){await g.database.update(h.mcpServerTable).set({oauth:b}).where((0,d.eq)(h.mcpServerTable.name,a)),u()}async function s(a){let[b]=await g.database.select().from(h.mcpServerTable).where(e.sql`json_extract(${h.mcpServerTable.oauth}, '$.state') = ${a}`);return b??null}async function t(a){let b=await g.database.delete(h.mcpServerTable).where((0,d.eq)(h.mcpServerTable.name,a)).returning();return b.length>0&&u(),b.length>0}a.s(["deleteServer",0,t,"findPinnedTools",0,function(a){return g.database.select({server:h.mcpToolTable.serverName,name:h.mcpToolTable.name,description:h.mcpToolTable.description,inputSchema:h.mcpToolTable.inputSchema}).from(h.botMcpToolTable).innerJoin(h.mcpToolTable,(0,d.eq)(h.botMcpToolTable.toolId,h.mcpToolTable.id)).where((0,d.eq)(h.botMcpToolTable.botName,a)).orderBy(h.mcpToolTable.serverName,h.mcpToolTable.name)},"findServer",0,m,"findServerByOAuthState",0,s,"findServerDetail",0,k,"findToolSchemas",0,function(a,b){return b.length?g.database.select({name:h.mcpToolTable.name,description:h.mcpToolTable.description,inputSchema:h.mcpToolTable.inputSchema}).from(h.mcpToolTable).where((0,d.and)((0,d.eq)(h.mcpToolTable.serverName,a),(0,d.inArray)(h.mcpToolTable.name,b))).orderBy(h.mcpToolTable.name):Promise.resolve([])},"listServerNames",0,function(){return g.database.select({name:h.mcpServerTable.name}).from(h.mcpServerTable).orderBy(h.mcpServerTable.name)},"listToolNames",0,function(a){let b=g.database.select({server:h.mcpToolTable.serverName,name:h.mcpToolTable.name}).from(h.mcpToolTable);return a?b.where((0,d.eq)(h.mcpToolTable.serverName,a)).orderBy(h.mcpToolTable.name):b.orderBy(h.mcpToolTable.serverName,h.mcpToolTable.name)},"saveConnectionError",0,q,"saveOAuthData",0,r,"syncServerTools",0,o,"upsertServer",0,n]),c()}catch(a){c(a)}},!1),899284,a=>{"use strict";var b=a.i(53112),c=a.i(706210);let d=b.z.object({url:b.z.url(),headers:b.z.record(b.z.string(),b.z.string()).optional(),oauthClient:b.z.object({clientId:b.z.string().min(1),clientSecret:b.z.string().optional()}).optional()}),e=b.z.object({command:b.z.string().min(1),args:b.z.array(b.z.string()).optional(),env:b.z.record(b.z.string(),b.z.string()).optional()}),f=b.z.union([d,e]),g=b.z.object({name:b.z.string(),description:b.z.string().optional(),inputSchema:b.z.looseObject({}).optional(),outputSchema:b.z.looseObject({}).optional()});b.z.object({clientInformation:b.z.looseObject({}).optional(),tokens:b.z.looseObject({}).optional(),authorizationServer:b.z.looseObject({}).optional(),codeVerifier:b.z.string().optional(),state:b.z.string().optional()});let h=b.z.object({name:b.z.string().min(1).max(40),config:f,toolCount:b.z.number().int(),lastError:b.z.string().nullish()}),i=g.extend({id:b.z.number().int(),description:b.z.string().nullish()});h.omit({toolCount:!0}).extend({tools:i.array().default([]),toolsSyncedAt:c.DateLikeSchema});let j=b.z.object({name:b.z.string().min(1,"Name is required").max(40).regex(/^[a-zA-Z0-9_-]+$/,"Only letters, numbers, - and _ are allowed"),config:f});b.z.union([b.z.object({mcpServers:b.z.record(b.z.string(),f)}),b.z.record(b.z.string(),f)]),a.s(["MCPServerFormSchema",0,j,"isRemoteConfig",0,function(a){return"url"in a}])},986743,a=>a.a(async(b,c)=>{try{var d=a.i(93321),e=a.i(530385),f=a.i(351674),g=a.i(203469),h=a.i(569572),i=a.i(184838),j=a.i(714428),k=a.i(8412),l=a.i(661210),m=b([i]);[i]=m.then?(await m)():m;let E=(0,k.createKeyedLock)(),F=()=>g.appEvents.emit({type:"memory"});async function n(a,b,c={}){let[d]=await i.database.insert(j.memoryNoteTable).values({path:a,description:b,ownedByUser:c.ownedByUser??!1}).onConflictDoNothing({target:j.memoryNoteTable.path}).returning();return d&&F(),d??null}async function o(a,b){let[c]=await i.database.update(j.memoryNoteTable).set({...b,updatedAt:new Date}).where((0,d.eq)(j.memoryNoteTable.id,a)).returning();return c&&F(),c??null}async function p(a){let b=await i.database.delete(j.memoryNoteTable).where((0,d.eq)(j.memoryNoteTable.id,a)).returning({id:j.memoryNoteTable.id});return b.length>0&&F(),b.length>0}async function q(a,b){let[c]=await i.database.insert(j.memoryFactTable).values({noteId:a,text:b,source:"user"}).returning();return await t(a),F(),c}async function r(a,b,c){let e,f=await (e=()=>i.database.transaction(async e=>{let f=await e.update(j.memoryFactTable).set({isLatest:!1}).where((0,d.and)((0,d.eq)(j.memoryFactTable.id,b),(0,d.eq)(j.memoryFactTable.noteId,a),(0,d.eq)(j.memoryFactTable.isLatest,!0))).returning({id:j.memoryFactTable.id});if(0===f.length)return null;let[g]=await e.insert(j.memoryFactTable).values({noteId:a,text:c,source:"user"}).returning();return await e.update(j.memoryNoteTable).set({updatedAt:new Date}).where((0,d.eq)(j.memoryNoteTable.id,a)),g}),E("memory",e));return f&&F(),f}async function s(a,b){let c=await i.database.delete(j.memoryFactTable).where((0,d.and)((0,d.eq)(j.memoryFactTable.id,b),(0,d.eq)(j.memoryFactTable.noteId,a))).returning({id:j.memoryFactTable.id});return c.length>0&&(await t(a),F()),c.length>0}function t(a){return i.database.update(j.memoryNoteTable).set({updatedAt:new Date}).where((0,d.eq)(j.memoryNoteTable.id,a))}async function u(){for(let a of l.MEMORY_ALWAYS_LISTED){let b=l.MEMORY_PATHS.find(b=>b.path===a)?.of??a;await i.database.insert(j.memoryNoteTable).values({path:a,description:b}).onConflictDoUpdate({target:j.memoryNoteTable.path,set:{description:b}})}}async function v(a){let b=a.map(a=>a.trim()).filter(Boolean),c=[],e=[];if(!b.length)return{found:c,missing:e};let f={id:j.memoryNoteTable.id,path:j.memoryNoteTable.path,description:j.memoryNoteTable.description},g=await i.database.select(f).from(j.memoryNoteTable).where((0,d.inArray)(j.memoryNoteTable.path,b)),h=new Map(g.map(a=>[a.path.toLowerCase(),a]));if(b.some(a=>!h.has(a.toLowerCase()))){let a=await i.database.select({...f,aliases:j.memoryNoteTable.aliases}).from(j.memoryNoteTable),b=(a,b)=>{let c=a.trim().toLowerCase();c&&!h.has(c)&&h.set(c,b)};for(let c of a)b(c.path,c);for(let c of a)for(let a of(b(c.path.slice(c.path.indexOf("/")+1),c),c.aliases??[]))b(a,c)}let k=new Set;for(let a of b){let b=h.get(a.toLowerCase());if(!b){e.push(a);continue}k.has(b.id)||(k.add(b.id),c.push(b))}return{found:c,missing:e}}async function w(a){let{found:b}=await v([a]);return b[0]?.path??null}async function x(a,b={}){let{found:c,missing:g}=await v(a);if(!c.length)return{notes:[],missing:g};let h=c.map(a=>a.id),k=await i.database.select({id:j.memoryFactTable.id,noteId:j.memoryFactTable.noteId,text:j.memoryFactTable.text,alwaysLoad:j.memoryFactTable.alwaysLoad,source:j.memoryFactTable.source,createdAt:j.memoryFactTable.createdAt,saidAt:j.callTable.startedAt}).from(j.memoryFactTable).leftJoin(j.callTable,(0,d.eq)(j.memoryFactTable.callId,j.callTable.id)).where((0,d.and)((0,d.eq)(j.memoryFactTable.isLatest,!0),(0,d.inArray)(j.memoryFactTable.noteId,h))).orderBy((0,e.asc)(j.memoryFactTable.id));return!1!==b.touch&&await i.database.update(j.memoryNoteTable).set({hits:f.sql`${j.memoryNoteTable.hits} + 1`,lastReadAt:new Date}).where((0,d.inArray)(j.memoryNoteTable.id,h)),{notes:c.map(a=>({path:a.path,description:a.description,facts:k.filter(b=>b.noteId===a.id).map(a=>({id:a.id,text:a.text,...a.saidAt?{saidAt:a.saidAt}:{}}))})),missing:g}}(0,d.inArray)(j.memoryNoteTable.path,l.MEMORY_ALWAYS_LISTED);let G=a=>a.toLowerCase().replace(/[\s.,!?…·'"`]/g,"");async function y(a,b,c=null){let e,g=[],k=[],l=[];await (e=()=>i.database.transaction(async e=>{let[i]=await e.select({count:f.sql`count(*)`}).from(j.memoryFactTable).where((0,d.and)((0,d.eq)(j.memoryFactTable.alwaysLoad,!0),(0,d.eq)(j.memoryFactTable.isLatest,!0))),m=h.MEMORY_LIMITS.carried-Number(i?.count??0),n=(a,b)=>!!a&&(m>0?(m-=1,!0):(l.push(b),!1));for(let f of a){let a,h=f.path.trim();if(!h)continue;k.push(h);let i=f.description?.trim(),l=f.aliases?.map(a=>a.trim()).filter(Boolean),o=(f.facts??[]).map(a=>({...a,text:a.text.trim()})).filter(a=>a.text),[p]=await e.select({id:j.memoryNoteTable.id}).from(j.memoryNoteTable).where((0,d.eq)(j.memoryNoteTable.path,h));if(p)a=p.id,(i||l)&&await e.update(j.memoryNoteTable).set({...i?{description:i}:{},...l?{aliases:l}:{},updatedAt:new Date}).where((0,d.eq)(j.memoryNoteTable.id,a));else{let[b]=await e.insert(j.memoryNoteTable).values({path:h,description:i??o[0]?.text.slice(0,80)??h,...l?{aliases:l}:{}}).returning({id:j.memoryNoteTable.id});a=b.id,i||g.push(h)}if(!o.length)continue;let q=await e.select({id:j.memoryFactTable.id,text:j.memoryFactTable.text,alwaysLoad:j.memoryFactTable.alwaysLoad}).from(j.memoryFactTable).where((0,d.and)((0,d.eq)(j.memoryFactTable.noteId,a),(0,d.eq)(j.memoryFactTable.isLatest,!0))),r=new Map(q.map(a=>[G(a.text),a])),s=async(a,b,c)=>{if(b===a.alwaysLoad)return;let f=b?n(!0,c):(m+=1,!1);f!==a.alwaysLoad&&(await e.update(j.memoryFactTable).set({alwaysLoad:f}).where((0,d.eq)(j.memoryFactTable.id,a.id)),a.alwaysLoad=f)};for(let f of o){if(null!=f.replaces){let[g]=await e.select({id:j.memoryFactTable.id,text:j.memoryFactTable.text,alwaysLoad:j.memoryFactTable.alwaysLoad}).from(j.memoryFactTable).where((0,d.and)((0,d.eq)(j.memoryFactTable.id,f.replaces),(0,d.eq)(j.memoryFactTable.noteId,a),(0,d.eq)(j.memoryFactTable.isLatest,!0)));if(g){if(G(g.text)===G(f.text)){await s(g,f.alwaysLoad??g.alwaysLoad,f.text),r.set(G(g.text),g);continue}await e.update(j.memoryFactTable).set({isLatest:!1}).where((0,d.eq)(j.memoryFactTable.id,g.id)),r.delete(G(g.text)),g.alwaysLoad&&(m+=1);let[h]=await e.insert(j.memoryFactTable).values({noteId:a,text:f.text,source:b,callId:c,alwaysLoad:n(f.alwaysLoad??g.alwaysLoad,f.text)}).returning({id:j.memoryFactTable.id,alwaysLoad:j.memoryFactTable.alwaysLoad});r.set(G(f.text),{...h,text:f.text});continue}}let g=r.get(G(f.text));if(g){null!=f.alwaysLoad&&await s(g,f.alwaysLoad,f.text);continue}let[h]=await e.insert(j.memoryFactTable).values({noteId:a,text:f.text,source:b,callId:c,alwaysLoad:n(!0===f.alwaysLoad,f.text)}).returning({id:j.memoryFactTable.id,alwaysLoad:j.memoryFactTable.alwaysLoad});r.set(G(f.text),{...h,text:f.text})}await e.update(j.memoryNoteTable).set({updatedAt:new Date}).where((0,d.eq)(j.memoryNoteTable.id,a))}}),E("memory",e));let{notes:m}=await x(k,{touch:!1});return F(),{notes:m,unnamed:g,notLoaded:l}}async function z(a,b,c){let e,g=await (e=()=>i.database.transaction(async e=>{if(c){let[a]=await e.select({count:f.sql`count(*)`}).from(j.memoryFactTable).where((0,d.and)((0,d.eq)(j.memoryFactTable.alwaysLoad,!0),(0,d.eq)(j.memoryFactTable.isLatest,!0)));if(Number(a?.count??0)>=h.MEMORY_LIMITS.carried)return"full"}let[g]=await e.update(j.memoryFactTable).set({alwaysLoad:c}).where((0,d.and)((0,d.eq)(j.memoryFactTable.id,b),(0,d.eq)(j.memoryFactTable.noteId,a),(0,d.eq)(j.memoryFactTable.isLatest,!0))).returning({id:j.memoryFactTable.id});return g?"ok":"missing"}),E("memory",e));return"ok"===g&&F(),g}async function A(){let[a,b]=await Promise.all([i.database.select({id:j.memoryNoteTable.id,path:j.memoryNoteTable.path,description:j.memoryNoteTable.description,aliases:j.memoryNoteTable.aliases,hits:j.memoryNoteTable.hits,lastReadAt:j.memoryNoteTable.lastReadAt,createdAt:j.memoryNoteTable.createdAt}).from(j.memoryNoteTable),i.database.select({noteId:j.memoryFactTable.noteId,count:f.sql`count(*)`}).from(j.memoryFactTable).where((0,d.eq)(j.memoryFactTable.isLatest,!0)).groupBy(j.memoryFactTable.noteId)]),c=new Map(b.map(a=>[a.noteId,a.count]));return a.filter(a=>(0,l.isAlwaysListed)(a.path)||(c.get(a.id)??0)>0).sort((a,b)=>Number((0,l.isAlwaysListed)(b.path))-Number((0,l.isAlwaysListed)(a.path))||(0,l.recallScore)(b)-(0,l.recallScore)(a)).map(a=>({path:a.path,description:a.description,aliases:a.aliases,factCount:c.get(a.id)??0,lastSeenAt:a.lastReadAt??a.createdAt}))}async function B(a){let b,c=await (b=()=>i.database.transaction(async b=>{let c=await b.delete(j.memoryFactTable).where((0,d.eq)(j.memoryFactTable.id,a)).returning({noteId:j.memoryFactTable.noteId});if(0===c.length)return null;let e=c[0].noteId,[g]=await b.select({path:j.memoryNoteTable.path,ownedByUser:j.memoryNoteTable.ownedByUser}).from(j.memoryNoteTable).where((0,d.eq)(j.memoryNoteTable.id,e)),[h]=await b.select({count:f.sql`count(*)`}).from(j.memoryFactTable).where((0,d.and)((0,d.eq)(j.memoryFactTable.noteId,e),(0,d.eq)(j.memoryFactTable.isLatest,!0)));return h?.count!==0||!g||g.ownedByUser||(0,l.isAlwaysListed)(g.path)?(await b.update(j.memoryNoteTable).set({updatedAt:new Date}).where((0,d.eq)(j.memoryNoteTable.id,e)),{path:g?.path??"",noteGone:!1}):(await b.delete(j.memoryNoteTable).where((0,d.eq)(j.memoryNoteTable.id,e)),{path:g.path,noteGone:!0})}),E("memory",b));return c&&F(),c}async function C(a){let[b]=await i.database.select({source:j.memoryFactTable.source,callId:j.memoryFactTable.callId}).from(j.memoryFactTable).where((0,d.eq)(j.memoryFactTable.id,a));return b??null}async function D(){let a=await i.database.delete(j.memoryNoteTable).returning({id:j.memoryNoteTable.id});return await u(),a.length>0&&F(),a.length}a.s(["addFact",0,q,"createNote",0,n,"deleteAllNotes",0,D,"deleteNote",0,p,"findFactCall",0,C,"forgetFact",0,s,"forgetFactById",0,B,"listAlwaysLoaded",0,function(){return i.database.select({id:j.memoryFactTable.id,path:j.memoryNoteTable.path,text:j.memoryFactTable.text}).from(j.memoryFactTable).innerJoin(j.memoryNoteTable,(0,d.eq)(j.memoryFactTable.noteId,j.memoryNoteTable.id)).where((0,d.and)((0,d.eq)(j.memoryFactTable.alwaysLoad,!0),(0,d.eq)(j.memoryFactTable.isLatest,!0))).orderBy((0,e.asc)(j.memoryNoteTable.path),(0,e.asc)(j.memoryFactTable.id)).limit(h.MEMORY_LIMITS.carried)},"listNoteIndex",0,A,"readNotes",0,x,"resolveNotePath",0,w,"reviseFact",0,r,"setFactAlwaysLoad",0,z,"updateNote",0,o,"writeNotes",0,y]),c()}catch(a){c(a)}},!1),661210,a=>{"use strict";var b=a.i(53112),c=a.i(706210);let d=b.z.enum(["user","call","bot"]),e=b.z.object({id:b.z.number(),text:b.z.string(),alwaysLoad:b.z.boolean(),source:d.nullish(),createdAt:c.DateLikeSchema});b.z.object({id:b.z.number(),path:b.z.string(),description:b.z.string(),aliases:b.z.string().array().nullish(),ownedByUser:b.z.boolean(),hits:b.z.number(),lastReadAt:c.DateLikeSchema.nullable(),createdAt:c.DateLikeSchema,updatedAt:c.DateLikeSchema,factCount:b.z.number(),facts:e.array()});let f=[{path:"profile",of:"The user themselves — their name, age, what they do, where they live, and whatever else says who they are"},{path:"preferences",of:"How they want things done, and said"},{path:"people/",of:"Someone in their life, and what matters about them"},{path:"projects/",of:"Something with an end — a trip, a purchase, a deadline, a thing being built"},{path:"topics/",of:"Something ongoing that keeps coming back"}],g=f.filter(a=>!a.path.endsWith("/")).map(a=>a.path),h=f.filter(a=>a.path.endsWith("/")).map(a=>a.path.slice(0,-1)),i=RegExp(`^(?:${g.join("|")}|(?:${h.join("|")})/.+)$`),j=["profile","preferences"];a.s(["MEMORY_ALWAYS_LISTED",0,j,"MEMORY_PATHS",0,f,"appNoteLine",0,a=>f.find(b=>b.path===a)?.of??null,"isAlwaysListed",0,a=>j.includes(a),"isMemoryPath",0,a=>i.test(a),"recallScore",0,function(a){let b=(0,c.toDate)(a.lastReadAt??a.createdAt),d=Math.max(0,(Date.now()-b.getTime())/864e5);return(a.hits+1)/(1+d)}])},138100,a=>{"use strict";var b=a.i(750227),c=a.i(569572),d=a.i(176668),e=a.i(182248),f=a.i(762805);let g=[(0,b.join)(c.APP_DIR,c.PATHS.skills.default),(0,b.join)(c.DATA_DIR,c.PATHS.skills.custom)];async function h(a,b){let c=[],g=new Set;for(let h of b){let b;try{b=await a.readdir(h,{withFileTypes:!0})}catch{continue}for(let i of b){let b,j;if(!i.isDirectory())continue;let k=`${h}/${i.name}`,l=`${k}/SKILL.md`;try{b=await a.readFile(l,"utf-8")}catch{continue}try{j=(0,f.parseFrontmatter)(b)}catch(a){d.logger.warn(`skill ${k}: SKILL.md front matter did not load — ${(0,e.errorToString)(a)}`);continue}!g.has(j.name)&&(g.add(j.name),j.disabled||c.push({name:j.name,description:j.description,path:k}))}}return c}a.s(["loadSkills",0,a=>h(a,g)])},762805,951941,a=>{"use strict";var b=a.i(912714),c=a.i(750227),d=a.i(622650),e=a.i(569572),f=a.i(53112);let g=f.z.enum(["custom","default"]),h=f.z.string().trim().min(1,"Skill name is required").max(64,"Skill name is too long").regex(/^[a-z0-9][a-z0-9_-]*$/i,"Use letters, numbers, dashes and underscores only"),i=f.z.object({name:h,description:f.z.string().trim().min(1,"Description is required"),disabled:f.z.boolean().optional()}),j=i.extend({content:f.z.string().trim().min(1,"Content is required")}),k=f.z.object({fileName:f.z.string().trim().min(1),base64:f.z.string().min(1)});a.s(["SkillDraftSchema",0,j,"SkillFrontmatterSchema",0,i,"SkillNameSchema",0,h,"SkillSourceSchema",0,g,"SkillUploadSchema",0,k],951941);var l=a.i(293480);let m={default:(0,c.resolve)(e.APP_DIR,e.PATHS.skills.default),custom:(0,c.resolve)(e.DATA_DIR,e.PATHS.skills.custom)};function n(a,b){let d=m[a],e=(0,c.resolve)(d,b),f=(0,c.relative)(d,e);return(!f||f.startsWith("..")||f.includes(c.sep)||"."===f)&&(0,l.publicError)("Skill not found"),e}function o(a){let b=a.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/);if(!b)return{head:null,body:a.trim(),rest:a,fence:""};let c=a.slice(b[0].length);return{head:b[1]??null,body:c.trim(),rest:c,fence:b[0]}}function p(a){let b,{head:c}=o(a);c||(0,l.publicError)("SKILL.md needs a YAML block with name and description");try{b=(0,d.parse)(c)}catch{(0,l.publicError)("SKILL.md frontmatter is not valid YAML")}let e=i.safeParse(b);return e.success||(0,l.publicError)(`SKILL.md frontmatter: ${e.error.issues[0]?.message??"invalid"}`),e.data}let q=/^disabled[ \t]*:[^\n]*(\r?\n|$)/m;async function r(a,e,f){let g,h,i=(0,c.join)(n(a,e),"SKILL.md");try{g=await (0,b.readFile)(i,"utf-8")}catch{(0,l.publicError)("Skill not found")}let{head:j,rest:k,fence:m}=o(g);j||(0,l.publicError)("This SKILL.md has no frontmatter to write to");try{h=(0,d.parse)(j)}catch{(0,l.publicError)("SKILL.md frontmatter is not valid YAML")}(!h||"object"!=typeof h||Array.isArray(h))&&(0,l.publicError)("SKILL.md frontmatter is not a YAML mapping");let p=m.includes("\r\n")?"\r\n":"\n",r=f?q.test(j)?j.replace(q,"disabled: true$1"):`${j.replace(/\s+$/,"")}${p}disabled: true`:j.replace(q,"").replace(/\s+$/,"");await (0,b.writeFile)(i,`---${p}${r}${p}---${p}${k}`)}async function s(a,d){try{let e=await (0,b.readFile)((0,c.join)(m[a],d,"SKILL.md"),"utf-8");return{...p(e),source:a,dir:d}}catch{return null}}async function t(a,d){let e=n("custom",a),f=async a=>(0,b.stat)(a).then(()=>!0,()=>!1);await f(e)&&(0,l.publicError)(`A skill named "${a}" already exists`),await f(n("default",a))&&(0,l.publicError)(`"${a}" is a built-in skill — pick another name`),await (0,b.mkdir)(e,{recursive:!0});try{for(let[a,f]of d){let d=function(a,b){let d=(0,c.resolve)(a,b);return((0,c.relative)(a,d).startsWith("..")||(0,c.resolve)(d)!==d)&&(0,l.publicError)("File not found"),d}(e,a);await (0,b.mkdir)((0,c.resolve)(d,".."),{recursive:!0}),await (0,b.writeFile)(d,f)}}catch(a){throw await (0,b.rm)(e,{recursive:!0,force:!0}),a}let g=await s("custom",a);return g||(await (0,b.rm)(e,{recursive:!0,force:!0}),(0,l.publicError)("SKILL.md could not be read back")),g}async function u(a){let c=n("custom",a);await (0,b.stat)(c).then(()=>!0,()=>!1)||(0,l.publicError)("Skill not found"),await (0,b.rm)(c,{recursive:!0,force:!0})}a.s(["deleteCustomSkill",0,u,"parseFrontmatter",0,p,"renderSkillMarkdown",0,function(a,b){return`---
108
108
  ${(0,d.stringify)(a).trim()}
109
109
  ---
110
110
 
111
111
  ${b.trim()}
112
- `},"setSkillDisabled",0,r,"splitFrontmatter",0,o,"writeCustomSkill",0,t],762805)},569549,a=>a.a(async(b,c)=>{try{var d=a.i(93321),e=a.i(530385),f=a.i(351674);a.i(569572);var g=a.i(184838),h=a.i(714428),i=a.i(344853),j=a.i(725466),k=a.i(3894),l=b([g,i,j]);async function m(){return(0,k.isSkillsOn)(await (0,j.readConfig)(k.THURSDAY_KEYS.skills))}async function n(a){await (0,j.writeConfig)(k.THURSDAY_KEYS.skills,a?"on":"off")}async function o(a){let[b]=await g.database.insert(h.callTable).values({id:crypto.randomUUID(),...a}).returning({id:h.callTable.id});return b.id}async function p(a,b){return(await g.database.update(h.callTable).set({endedAt:new Date,...b?{endedReason:b.reason,seconds:b.seconds??null}:{}}).where((0,d.and)((0,d.eq)(h.callTable.id,a),(0,d.isNull)(h.callTable.endedAt))).returning({id:h.callTable.id})).length>0}async function q(a,b){for(let c of b)await g.database.insert(h.callMessageTable).values({callId:a,...c,fragments:c.fragments??null}).onConflictDoUpdate({target:[h.callMessageTable.callId,h.callMessageTable.id],set:{text:c.text,role:c.role,tool:c.tool??null,fragments:c.fragments??null}})}async function r(a,b){await g.database.insert(h.callThoughtTable).values({callId:a,...b}).onConflictDoNothing()}async function s(a){let b=await g.database.select({callId:h.callMessageTable.callId,startedAt:h.callTable.startedAt,role:h.callMessageTable.role,tool:h.callMessageTable.tool,text:h.callMessageTable.text,seq:h.callMessageTable.seq}).from(h.callMessageTable).innerJoin(h.callTable,(0,d.eq)(h.callMessageTable.callId,h.callTable.id)).orderBy((0,e.desc)(h.callTable.startedAt),(0,e.desc)(h.callMessageTable.seq)).limit(a),c=new Map;for(let a of b){let b=c.get(a.callId)??{callId:a.callId,startedAt:a.startedAt,turns:[]};b.turns.push({role:a.role,tool:a.tool,text:a.text,seq:a.seq}),c.set(a.callId,b)}return[...c.values()].reverse().map(a=>({...a,turns:a.turns.reverse()}))}async function t(a,b,c){let[i]=await g.database.select({startedAt:h.callTable.startedAt}).from(h.callTable).where((0,d.eq)(h.callTable.id,a));if(!i)return null;let[j]=await g.database.select({total:f.sql`count(*)`}).from(h.callMessageTable).where((0,d.eq)(h.callMessageTable.callId,a)),k=await g.database.select({role:h.callMessageTable.role,tool:h.callMessageTable.tool,text:h.callMessageTable.text}).from(h.callMessageTable).where((0,d.eq)(h.callMessageTable.callId,a)).orderBy((0,e.asc)(h.callMessageTable.seq)).limit(c).offset((b-1)*c);return{startedAt:i.startedAt,total:Number(j?.total??0),turns:k}}async function u(){return(await g.database.select({id:h.callTable.id}).from(h.callTable).where((0,d.isNull)(h.callTable.endedAt)).limit(1)).length>0}async function v(a){return(await g.database.delete(h.callTable).where((0,d.and)((0,d.eq)(h.callTable.id,a),(0,d.isNotNull)(h.callTable.endedAt))).returning({id:h.callTable.id})).length>0}async function w(){return(await g.database.delete(h.callTable).where((0,d.isNotNull)(h.callTable.endedAt)).returning({id:h.callTable.id})).length}[g,i,j]=l.then?(await l)():l,a.s(["deleteCall",0,v,"deleteEndedCalls",0,w,"endCall",0,p,"insertCall",0,o,"isAnyCallLive",0,u,"listRecentTurns",0,s,"readCallConversation",0,t,"readCallSkillsOn",0,m,"saveThought",0,r,"saveTurns",0,q,"writeCallSkillsOn",0,n]),c()}catch(a){c(a)}},!1),3894,a=>{"use strict";var b=a.i(723885),c=a.i(569572),d=a.i(552556),e=a.i(446957),f=a.i(746609);let g=d.LiveSettingsSchema.extend({locale:b.default.string().max(35).nullish()});e.botIconSchema.extend({kind:b.default.enum(["mark","ascii"]).default("ascii"),charset:b.default.enum(["ascii","emoji","emojiOnly"]).default(c.ASCII_FACE.charset),fontSize:b.default.number().min(c.ASCII_FACE.fontSize.min).max(c.ASCII_FACE.fontSize.max).default(c.ASCII_FACE.fontSize.default),density:b.default.number().min(c.ASCII_FACE.density.min).max(c.ASCII_FACE.density.max).default(c.ASCII_FACE.density.default)}).parse({});b.default.object({enabled:b.default.boolean(),phrase:b.default.string().trim().min(3).max(32)}),b.default.object({enabled:b.default.boolean(),combo:b.default.string().trim().min(1).max(64)}),b.default.enum(["off","waiting","any"]),b.default.enum(["center","sides"]);let h=b.default.object({id:b.default.string().min(1),role:b.default.enum(["user","assistant","tool"]),tool:b.default.string().nullish(),text:b.default.string(),seq:b.default.number().int().min(0),fragments:b.default.array(f.LiveFragmentSchema).nullish()}),i=b.default.object({id:b.default.string().min(1),text:b.default.string(),seq:b.default.number().int().min(0)});a.s(["CallThoughtSchema",0,i,"CallTurnSchema",0,h,"THURSDAY_KEYS",0,{skills:"THURSDAY_SKILLS"},"ThursdaySettingsSchema",0,g,"isSkillsOn",0,a=>a?.trim()==="on"],3894)},956802,a=>{"use strict";var b=a.i(874533),c=a.i(569572);let d=`on run argv
112
+ `},"setSkillDisabled",0,r,"splitFrontmatter",0,o,"writeCustomSkill",0,t],762805)},569549,a=>a.a(async(b,c)=>{try{var d=a.i(93321),e=a.i(530385),f=a.i(351674);a.i(569572);var g=a.i(184838),h=a.i(714428),i=a.i(344853),j=a.i(725466),k=a.i(3894),l=b([g,i,j]);async function m(){return(0,k.isSkillsOn)(await (0,j.readConfig)(k.THURSDAY_KEYS.skills))}async function n(a){await (0,j.writeConfig)(k.THURSDAY_KEYS.skills,a?"on":"off")}async function o(a){let[b]=await g.database.insert(h.callTable).values({id:crypto.randomUUID(),...a}).returning({id:h.callTable.id});return b.id}async function p(a,b){return(await g.database.update(h.callTable).set({endedAt:new Date,...b?{endedReason:b.reason,seconds:b.seconds??null}:{}}).where((0,d.and)((0,d.eq)(h.callTable.id,a),(0,d.isNull)(h.callTable.endedAt))).returning({id:h.callTable.id})).length>0}async function q(a,b){for(let c of b)await g.database.insert(h.callMessageTable).values({callId:a,...c,fragments:c.fragments??null}).onConflictDoUpdate({target:[h.callMessageTable.callId,h.callMessageTable.id],set:{text:c.text,role:c.role,tool:c.tool??null,fragments:c.fragments??null}})}async function r(a,b){await g.database.insert(h.callThoughtTable).values({callId:a,...b}).onConflictDoNothing()}async function s(a){let b=await g.database.select({callId:h.callMessageTable.callId,startedAt:h.callTable.startedAt,role:h.callMessageTable.role,tool:h.callMessageTable.tool,text:h.callMessageTable.text,seq:h.callMessageTable.seq}).from(h.callMessageTable).innerJoin(h.callTable,(0,d.eq)(h.callMessageTable.callId,h.callTable.id)).orderBy((0,e.desc)(h.callTable.startedAt),(0,e.desc)(h.callMessageTable.seq)).limit(a),c=new Map;for(let a of b){let b=c.get(a.callId)??{callId:a.callId,startedAt:a.startedAt,turns:[]};b.turns.push({role:a.role,tool:a.tool,text:a.text,seq:a.seq}),c.set(a.callId,b)}return[...c.values()].reverse().map(a=>({...a,turns:a.turns.reverse()}))}async function t(a,b,c){let[i]=await g.database.select({startedAt:h.callTable.startedAt}).from(h.callTable).where((0,d.eq)(h.callTable.id,a));if(!i)return null;let[j]=await g.database.select({total:f.sql`count(*)`}).from(h.callMessageTable).where((0,d.eq)(h.callMessageTable.callId,a)),k=await g.database.select({role:h.callMessageTable.role,tool:h.callMessageTable.tool,text:h.callMessageTable.text}).from(h.callMessageTable).where((0,d.eq)(h.callMessageTable.callId,a)).orderBy((0,e.asc)(h.callMessageTable.seq)).limit(c).offset((b-1)*c);return{startedAt:i.startedAt,total:Number(j?.total??0),turns:k}}async function u(){return(await g.database.select({id:h.callTable.id}).from(h.callTable).where((0,d.isNull)(h.callTable.endedAt)).limit(1)).length>0}async function v(a){return(await g.database.delete(h.callTable).where((0,d.and)((0,d.eq)(h.callTable.id,a),(0,d.isNotNull)(h.callTable.endedAt))).returning({id:h.callTable.id})).length>0}async function w(){return(await g.database.delete(h.callTable).where((0,d.isNotNull)(h.callTable.endedAt)).returning({id:h.callTable.id})).length}[g,i,j]=l.then?(await l)():l,a.s(["deleteCall",0,v,"deleteEndedCalls",0,w,"endCall",0,p,"insertCall",0,o,"isAnyCallLive",0,u,"listRecentTurns",0,s,"readCallConversation",0,t,"readCallSkillsOn",0,m,"saveThought",0,r,"saveTurns",0,q,"writeCallSkillsOn",0,n]),c()}catch(a){c(a)}},!1),3894,a=>{"use strict";var b=a.i(723885),c=a.i(569572),d=a.i(552556),e=a.i(446957),f=a.i(746609);let g=d.LiveSettingsSchema.extend({locale:b.default.string().max(35).nullish(),faceWords:b.default.boolean().optional()});e.botIconSchema.extend({kind:b.default.enum(["mark","ascii"]).default("ascii"),charset:b.default.enum(["ascii","emoji","emojiOnly"]).default(c.ASCII_FACE.charset),fontSize:b.default.number().min(c.ASCII_FACE.fontSize.min).max(c.ASCII_FACE.fontSize.max).default(c.ASCII_FACE.fontSize.default),density:b.default.number().min(c.ASCII_FACE.density.min).max(c.ASCII_FACE.density.max).default(c.ASCII_FACE.density.default)}).parse({});b.default.object({enabled:b.default.boolean(),phrase:b.default.string().trim().min(3).max(32)}),b.default.object({enabled:b.default.boolean(),combo:b.default.string().trim().min(1).max(64)}),b.default.enum(["off","waiting","any"]),b.default.enum(["center","sides"]);let h=b.default.object({id:b.default.string().min(1),role:b.default.enum(["user","assistant","tool"]),tool:b.default.string().nullish(),text:b.default.string(),seq:b.default.number().int().min(0),fragments:b.default.array(f.LiveFragmentSchema).nullish()}),i=b.default.object({id:b.default.string().min(1),text:b.default.string(),seq:b.default.number().int().min(0)});a.s(["CallThoughtSchema",0,i,"CallTurnSchema",0,h,"THURSDAY_KEYS",0,{skills:"THURSDAY_SKILLS"},"ThursdaySettingsSchema",0,g,"isSkillsOn",0,a=>a?.trim()==="on"],3894)},956802,a=>{"use strict";var b=a.i(874533),c=a.i(569572);let d=`on run argv
113
113
  display notification (item 2 of argv) with title (item 1 of argv)
114
114
  end run`,e=`
115
115
  $ErrorActionPreference = 'Stop'
@@ -1,3 +1,3 @@
1
- module.exports=[249049,a=>{"use strict";var b=a.i(187924),c=a.i(752562),d=a.i(474215),e=a.i(572131),f=a.i(767561),g=a.i(340695),h=a.i(205522),i=a.i(379630),j=a.i(96340),k=a.i(313237),l=a.i(759497),m=a.i(497895),n=a.i(760374),o=a.i(478978);function p({provider:a,saved:c,autoFocus:d,dense:e,value:f,ready:g,saving:h,onValue:j,onSubmit:k}){return(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsxs)("span",{className:"flex items-center gap-2 px-0.5 text-muted-foreground",children:[(0,b.jsx)(i.ProviderIcon,{provider:a.id,className:"size-4 shrink-0"}),(0,b.jsx)("span",{className:(0,m.cn)("font-mono",e?"text-[11px]":"text-[12.5px]"),children:a.label})]}),(0,b.jsx)(q,{provider:a,saved:c,autoFocus:d,dense:e,value:f,ready:g,saving:h,onValue:j,onSubmit:k})]})}function q({provider:a,saved:d,autoFocus:e,dense:f,value:i,ready:j,saving:k,onValue:l,onSubmit:n}){let o=i.trim().startsWith("xai-")||i.trim().startsWith("sk-ant-");return(0,b.jsxs)("form",{onSubmit:a=>{a.preventDefault(),n()},className:(0,m.cn)("flex items-center gap-3 rounded-2xl border bg-muted/40 px-4 transition-colors",f?"h-11 rounded-xl px-3":"h-14",d||j?"border-foreground bg-transparent":"border-border"),children:[(0,b.jsx)(h.Input,{autoFocus:e,type:"password","aria-label":"OpenAI API key",autoComplete:"off",value:i,spellCheck:!1,placeholder:d?"Replace it":"sk-…",onChange:a=>l(a.target.value),className:(0,m.cn)("min-w-0 flex-1 border-0 bg-transparent px-0 font-mono shadow-none focus-visible:ring-0 dark:bg-transparent",f?"h-7 text-[13px]":"h-9 text-[15px]")}),i?(0,b.jsx)(g.Button,{type:"submit",size:"sm",variant:o?"outline":"default",loading:k,disabled:!j,className:(0,m.cn)("shrink-0",f?"h-7 px-3":"h-9 px-4"),children:o?`Not ${a.label}?`:"Save"}):d&&(0,b.jsx)("span",{className:(0,m.cn)("grid shrink-0 animate-in place-items-center rounded-full bg-foreground text-background zoom-in-50 duration-300",f?"size-5":"size-7"),children:(0,b.jsx)(c.Check,{className:f?"size-3":"size-4"})})]})}a.s(["KEY_MIN",0,8,"KeyInput",0,q,"VoiceKeys",0,function({ref:a,autoFocus:c,dense:h=!1,onCancel:i,onSaved:q,className:r}){let{data:s}=(0,l.useServerRoute)(f.queryKey.config),[t,u]=(0,e.useState)({}),[v,w]=(0,e.useState)(null),[x]=(0,k.useServerAction)(n.setConfigAction,{onOk:()=>{(0,l.revalidate)(f.queryKey.config),(0,l.revalidate)(f.queryKey.llmModel)}}),y=a=>(t[a]?.trim().length??0)>=8,z=async a=>{let b=a.apiKeyName;if(!y(b)||v)return!1;w(b);try{return await x(b,t[b]),u(a=>({...a,[b]:""})),q?.(a.id),!0}catch{return!1}finally{w(null)}};return(0,e.useImperativeHandle)(a,()=>({pending:()=>y(j.LIVE_PROVIDER.apiKeyName),flush:async()=>!y(j.LIVE_PROVIDER.apiKeyName)||z(j.LIVE_PROVIDER)})),(0,b.jsxs)("div",{className:(0,m.cn)("w-full",h?"space-y-2":"space-y-4",r),children:[h&&(0,b.jsxs)("div",{className:"flex h-6 items-center justify-between gap-2",children:[(0,b.jsx)("span",{className:"px-0.5 font-mono text-[11px] text-muted-foreground",children:"Voice key"}),i&&(0,b.jsx)(g.Button,{type:"button",size:"icon",variant:"ghost","aria-label":"Not now",onClick:i,className:"-my-1 size-6",children:(0,b.jsx)(d.X,{className:"size-3.5"})})]}),(0,b.jsx)(p,{provider:j.LIVE_PROVIDER,saved:(0,o.isConfigSet)(s,j.LIVE_PROVIDER.apiKeyName),autoFocus:c,dense:h,value:t[j.LIVE_PROVIDER.apiKeyName]??"",ready:y(j.LIVE_PROVIDER.apiKeyName),saving:v===j.LIVE_PROVIDER.apiKeyName,onValue:a=>u(b=>({...b,[j.LIVE_PROVIDER.apiKeyName]:a})),onSubmit:()=>void z(j.LIVE_PROVIDER)}),(0,b.jsx)("p",{className:(0,m.cn)("px-0.5 font-mono text-muted-foreground",h?"text-[11px]":"pt-1 text-center text-[12.5px]"),children:h?"Live voice and reasoning share this OpenAI API key.":"Live uses an OpenAI API key, billed separately from ChatGPT. Stored on this machine, in this app's database."})]})}])},647509,a=>{"use strict";a.s(["ALPHA_TOP",0,.82,"CHAR_RATE",0,2.2,"EMOJI_CHAR_RATE",0,.6,"EMOJI_MIN_LEVEL",0,6,"EMOJI_POOL",0,["🍎","🌹","🍓","❤️","🎈","🧨","🔴","🍊","🔥","🦊","🏀","🧡","🍑","⭐","🍋","🌻","💛","🐥","🌟","🍌","🍀","🌿","🐸","🥝","💚","🌵","🥑","💧","🌊","🫐","🐳","💙","🔵","🧊","🍇","💜","🔮","🟣","🪻","🍆","🌸","🌷","💗","🦩","🩷","🍫","🐻","🌰","🥐","🤍","☁️","🖤","⚪","⚫","🦢","🌈","🦜","🎨","🪩","🦄","✨","🍬","🎡"],"EMOJI_RATIO",0,.11,"RAMP",0,[[" "],[" ",".","`"],[".",",","·","'"],[":",";","-","^"],["=","+","~",'"'],["*","?","◦","j"],["c","v","○","7"],["o","x","◇","い"],["s","y","t","あ"],["e","a","u","な"],["k","w","z","や"],["q","h","n","米"]],"hash",0,function(a,b){let c=43758.5453*Math.sin(127.1*a+311.7*b);return c-Math.floor(c)},"smoothstep",0,function(a,b,c){let d=Math.min(1,Math.max(0,(c-a)/(b-a)));return d*d*(3-2*d)}])},445432,a=>{"use strict";var b=a.i(187924),c=a.i(572131),d=a.i(913834),e=a.i(287702),f=a.i(483253),g=a.i(647509);let h=[235,235,235],i=["████ ███ ███ ██ ███ ","█ █ █ █ █ █ █ █ █","███ ███ ███ █ █ ███ ","█ █ █ █ █ █ █ █ █ ","████ █ █ █ █ ██ █ █"];function j(a,b,c,d,e){return a+(b-a)*Math.min(1,e/(b>a?c:d))}function k({className:a,mode:d="idle",charset:l=e.ASCII_FACE.charset,fontSize:m=e.ASCII_FACE.fontSize.default,density:n=e.ASCII_FACE.density.default,size:o=680,color:p=h,getSpectrum:q,getMicSpectrum:r}){let s=(0,c.useRef)(null),t=(0,c.useRef)(null),u=(0,c.useRef)([]),v=(0,c.useRef)(null),w=(0,c.useRef)(l),x=(0,c.useRef)({cur:[...p],target:p}),y=(0,c.useRef)(0),z=(0,c.useRef)(q);z.current=q;let A=(0,c.useRef)(r);A.current=r;let B=(0,c.useRef)({phrase:0,micPhrase:0,micLevel:0,bob:0,bobVel:0,amp:[,,,,].fill(0),phase:Array.from({length:4},(a,b)=>2.1*b),spin:0,rings:[]}),C=(0,c.useRef)({mode:d,start:0}),D=(0,c.useRef)({scale:.3,lift:0,gather:0,comet:0,speech:0,err:0});return(0,c.useEffect)(()=>{let a=s.current;if(!a)return;let b=.95*m/n,c=1.25*m/n,d=680/o,e=b*d,f=c*d,h=Math.max(1,Math.floor(625.6/(i[0].length*e)));y.current=o;let j=[],k=Math.ceil(o/b),l=Math.ceil(o/c);for(let a=0;a<l;a++)for(let l=0;l<k;l++){let k=l*b,m=a*c,n=(k-o/2)*d,p=(m-o/2)*d,q=Math.hypot(n,p),r=function(a,b,c,d,e){let f=i.length,g=Math.floor(a/(c*e)+i[0].length/2),h=Math.floor(b/(d*e)+f/2);if(h<0||h>=f)return -1;let j=i[h];return g<0||g>=j.length||"█"!==j[g]?-1:Math.floor(g/5)}(n,p,e,f,h);r<0&&q>328||j.push({x:k+b/2,y:m+c/2,dx:n,dy:p,dist:q,angle:Math.atan2(p,n),seed:(0,g.hash)(l,a),grain:(0,g.hash)(5.7*l+19,2.3*a+53),gap:.05+.3*(0,g.hash)(7.3*l+11,3.1*a+5),emoji:(0,g.hash)(2.7*l+31,5.9*a+17)<g.EMOJI_RATIO,speck:(0,g.hash)(4.1*l+23,6.3*a+41),letter:r})}u.current=j,v.current={ascii:Array.from({length:g.RAMP.length},()=>new Int32Array(j.length)),emoji:Array.from({length:g.RAMP.length},()=>new Int32Array(j.length)),asciiN:new Int32Array(g.RAMP.length),emojiN:new Int32Array(g.RAMP.length),glyph:Array(j.length)};let p=Math.min(2,window.devicePixelRatio||1);a.width=o*p,a.height=o*p,a.style.width=`${o}px`,a.style.height=`${o}px`;let q=a.getContext("2d");return q&&(q.setTransform(p,0,0,p,0,0),q.font=`700 ${m}px ui-monospace,SFMono-Regular,Menlo,monospace`,q.textAlign="center",q.textBaseline="middle",t.current=q),()=>{q?.clearRect(0,0,o,o),u.current=[],v.current=null}},[m,n,o]),(0,c.useEffect)(()=>{w.current=l},[l]),(0,c.useEffect)(()=>{x.current.target=p},[p]),(0,c.useEffect)(()=>{C.current.mode!==d&&(C.current={mode:d,start:.001*performance.now()})},[d]),(0,c.useEffect)(()=>{let a=0,b=(0,f.createVoiceFollower)(),c=(0,f.createVoiceFollower)(),d=Array(f.SPECTRUM_BANDS).fill(0),e=Array(f.SPECTRUM_BANDS).fill(0),h=.001*performance.now(),i=0,k=1,l=0,m=f=>{let n=.001*f,o=Math.min(.05,Math.max(0,n-h));h=n;let p=t.current,q=v.current;if(!p||!q){a=requestAnimationFrame(m);return}let r=w.current,s=y.current;q.asciiN.fill(0),q.emojiN.fill(0);let E=z.current?.();if(!E||E.length<2){for(let a=0;a<d.length;a++){let b=.5*Math.sin(1.7*n+1.7*a)+.3*Math.sin(.8*n+.6*a)+.2*Math.sin(3*n+2.9*a);d[a]=.5*b+.5}E=d}let F=B.current,G=b.read(E,o);F.phrase=G.phrase,G.onset>0&&(F.bobVel+=.06*G.onset,F.rings.push({born:n,power:G.onset}),F.rings.length>5&&F.rings.shift()),F.bobVel+=-(.012*F.bob)-.09*F.bobVel,F.bob+=F.bobVel;let H=A.current?.(),I=c.read(H??e,o);F.micPhrase=H?I.phrase:0,F.micLevel=H?I.level:0;let J=H&&"listening"===C.current.mode?.5+8*I.level:1;k=j(k,J,.14,.14,o),i+=o*k;for(let a=0;a<4;a++){let b=Math.floor(a*G.bands.length/4),c=Math.max(b+1,Math.floor((a+1)*G.bands.length/4)),d=0;for(let a=b;a<c;a++)d+=G.bands[a];d/=c-b;let e=.7+.6*(0,g.hash)((.9*n|0)+31*a,a);F.amp[a]+=(d*e-F.amp[a])*(.05+.02*a),F.phase[a]+=o*(.9+.5*a)*(a%2?-1:1)}for(F.spin+=o*(1.1+.9*F.phrase);F.rings.length>0&&n-F.rings[0].born>.7;)F.rings.shift();let K=C.current,L=function(a,b,c){let d={scale:1,lift:0,gather:0,comet:0,speech:0,err:0};switch(a){case"idle":return d;case"connecting":{let a=1-Math.exp(-b/1.3);return{...d,scale:.45+.55*a,lift:.06*a,gather:1}}case"listening":return{...d,lift:.24*(.7*c.micPhrase+.3*c.micLevel)};case"speaking":return{...d,speech:1};case"working":return{...d,comet:1};case"ending":return{...d,scale:0};case"error":return{...d,scale:0,err:1}}}(K.mode,n-K.start,F),M=D.current;M.scale=j(M.scale,L.scale,.45,"ending"===K.mode?.4:.7,o),M.lift=j(M.lift,L.lift,.22,.4,o),M.gather=j(M.gather,L.gather,.3,.95,o),M.comet=j(M.comet,L.comet,.45,.9,o),M.speech=j(M.speech,L.speech,.5,.75,o),"error"===K.mode&&(M.err<=.01&&(l=0),l+=o),M.err=j(M.err,L.err,.5,.6,o);let N=M.err>.5,O="emojiOnly"===r?g.EMOJI_CHAR_RATE:g.CHAR_RATE,P=u.current;for(let a=0;a<P.length;a++){let b=P[a],c=function(a,b,c,d,e){let f,h,i,j,k=d.scale>.02?function(a,b,c=0,d=1){let e=170*Math.max(.02,d),f=1-(0,g.smoothstep)(.55*e,e,a.dist);return(.58+c+.2*Math.sin(.05*a.dist-.4*b)+.07*Math.sin(.35*b))*f}(a,b,d.lift,d.scale)*(1-.6*d.speech):0;return d.gather>.01&&(k+=function(a,b,c){let d=170*c;if(a.speck>=.55||a.dist<.8*d)return 0;let e=Math.min(55,Math.floor((a.angle+Math.PI)/(2*Math.PI)*56)),f=(.7*b+(0,g.hash)(e,5.3))%1,h=a.dist-(d+(320-d)*(1-f)**1.25)-(a.grain-.5)*16;return Math.exp(-(h*h)/260)*(0,g.smoothstep)(0,.2,f)*(1-f)*1.1}(a,b,d.scale)*d.gather),d.comet>.01&&(k+=(h=Math.exp(-((f=a.dist-210)*f)/1100),h*Math.exp(-((j=Math.atan2(Math.sin(i=a.angle-3*b),Math.cos(i)))*j)/(j<0?2.8:.16))*d.comet)),d.speech>.01&&(k+=function(a,b,c,d){var e;let f=170+40*c.phrase+85*c.bob;for(let b=0;b<4;b++)f+=28*c.amp[b]*Math.sin((b+2)*(a.angle+c.spin)+c.phase[b]);let g=170+(((e=f)<=205?Math.max(110,e):205+30*Math.tanh((e-205)/30))-170)*d,h=(a.grain-.5)*20+20*Math.sin(5*a.angle+.9*b+6.283*a.seed)*.3,i=a.dist-(g+h),j=Math.exp(-(i*i)/800)+.5*Math.exp(-(a.dist*a.dist)/6e3);if(a.dist<g&&(j+=.22*(1-a.dist/g)**.6*(.75+.25*Math.sin(.05*a.dist-1.2*b))),a.speck<.22){let d=90*(.6+.9*a.grain);for(let e=0;e<c.rings.length;e++){let f=c.rings[e],h=b-f.born,i=a.dist-(g+6+h*d);j+=Math.exp(-(i*i)/500)*f.power*Math.max(0,1-h/.7)}}return j}(a,b,e,d.speech)*d.speech),d.err>.01&&(k+=function(a,b,c){if(a.letter<0)return 0;let d=c%9.2,e=.12*a.seed;return Math.max(0,(0,g.smoothstep)(0,1,(d-.65*a.letter-e)/.8)-(0,g.smoothstep)(0,1,(d-5.6-.5*a.letter-e)/.7))*(.86+.14*Math.sin(3.5*b+6*a.seed))}(a,b,c)*d.err),k}(b,n,l,M,F);!(N&&b.letter>=0)&&((c*=(.66+.72*b.grain)*(.8+.4*(0,g.hash)(Math.floor(.05*b.dx+.5*n),Math.floor(.05*b.dy-.3*n))))>.3&&(0,g.hash)(31.7*Math.floor(1.6*n),613*b.seed)>.992&&(c=Math.max(c,.9)),c<b.gap+.05*Math.sin(.28*n+6.283*b.seed)&&(c=0));let d=(c=c<0?0:c>1?1:c)*(g.RAMP.length-1)|0;if(0===d)continue;let e=i*O+7*b.seed|0;if("emojiOnly"===r||"emoji"===r&&b.emoji&&d>=g.EMOJI_MIN_LEVEL){let c=((b.seed*g.EMOJI_POOL.length|0)+e)%g.EMOJI_POOL.length;q.glyph[a]=g.EMOJI_POOL[c],q.emoji[d][q.emojiN[d]++]=a}else{let c=g.RAMP[d],f=((b.seed*c.length|0)+e)%c.length;q.glyph[a]=c[f],q.ascii[d][q.asciiN[d]++]=a}}p.clearRect(0,0,s,s);let Q=u.current,R=g.RAMP.length-1,S=x.current;for(let a=0;a<3;a++)S.cur[a]+=(S.target[a]-S.cur[a])*.05;p.fillStyle=`rgb(${0|S.cur[0]},${0|S.cur[1]},${0|S.cur[2]})`;for(let a=1;a<=R;a++){let b=q.asciiN[a];if(0===b)continue;p.globalAlpha=g.ALPHA_TOP*(a/R);let c=q.ascii[a];for(let a=0;a<b;a++){let b=Q[c[a]];p.fillText(q.glyph[c[a]],b.x,b.y)}}for(let a=1;a<=R;a++){let b=q.emojiN[a];if(0===b)continue;p.globalAlpha=.35+a/R*.65;let c=q.emoji[a];for(let a=0;a<b;a++){let b=Q[c[a]];p.fillText(q.glyph[c[a]],b.x,b.y)}}p.globalAlpha=1,a=requestAnimationFrame(m)};return a=requestAnimationFrame(m),()=>cancelAnimationFrame(a)},[]),(0,b.jsx)("canvas",{ref:s,className:a,"aria-hidden":!0,style:{display:"block",pointerEvents:"none"}})}var l=a.i(730357),m=a.i(497895);let n={idle:"idle",connecting:"connecting",ending:"connecting",listening:"listening",speaking:"speaking",working:"thinking",delegating:"delegating"},o={ripple:18,bandEase:.03,pulse:0,punch:.05,stretch:0},p={ending:"ending",idle:"idle",connecting:"connecting",listening:"listening",speaking:"speaking",working:"working",delegating:"working"},q=[247,247,247],r=[10,10,10],s={mark:{label:"Mark",hint:"A silhouette with eyes. Blinks, glances, leans into a voice.",render:function({status:a,failed:c,size:e,getSpectrum:f,look:g,className:h}){return(0,b.jsx)(d.BotMark,{size:e,seed:"thursday",color:g.color,shape:g.shape,outline:g.outline,paint:g.paint,state:n[a],crossed:c,getSpectrum:f,options:o,notify:!1,className:h})}},ascii:{label:"Ascii",hint:"A field of characters. No eyes — the whole orb is the expression.",render:function({status:a,failed:c,size:d,getSpectrum:e,getMicSpectrum:f,look:g,className:h}){let i="dark"===(0,l.useResolvedTheme)();return(0,b.jsx)(k,{mode:c?"error":p[a],size:d,color:i?q:r,getSpectrum:e,getMicSpectrum:f,charset:g.charset,fontSize:g.fontSize,density:g.density,className:h})}}},t=(0,c.memo)(function({look:a,status:d="idle",size:e=448,className:f,...g}){let h=(0,c.useRef)(null),[i,j]=(0,c.useState)(e),[k,l]=(0,c.useState)(!1);(0,c.useEffect)(()=>{let a=h.current;if(!a)return;let b=new ResizeObserver(([a])=>{let b=Math.round(a.contentRect.width);b>0&&j(b)});return b.observe(a),()=>b.disconnect()},[]),(0,c.useEffect)(()=>{let a=requestAnimationFrame(()=>l(!0));return()=>cancelAnimationFrame(a)},[]);let n=s[a.kind].render;return(0,b.jsx)("div",{ref:h,className:(0,m.cn)("aspect-square transition-opacity duration-700 ease-out",k?"opacity-100":"opacity-0",f),children:(0,b.jsx)(n,{...g,look:a,status:d,size:i})})});a.s(["FACES",0,s,"Face",0,t],445432)},359006,a=>{"use strict";let b,c;var d=a.i(920226);let e=a=>b=>{try{let c=a(b);if(c instanceof Promise)return c;return{then:a=>e(a)(c),catch(a){return this}}}catch(a){return{then(a){return this},catch:b=>e(b)(a)}}};var f=a.i(96340),g=a.i(461512);let h=g.ThursdaySettingsSchema.extend({wake:g.WakeSchema.catch(g.WAKE_DEFAULT),hotkey:g.HotkeySchema.catch(g.HOTKEY_DEFAULT),callBack:g.CallBackSchema.catch(g.CALL_BACK_DEFAULT),captionView:g.CaptionViewSchema.catch("center")}),i={...f.LIVE_DEFAULTS,wake:g.WAKE_DEFAULT,hotkey:g.HOTKEY_DEFAULT,callBack:g.CALL_BACK_DEFAULT,captionView:"center"},j=(0,d.create)()((b=a=>({...i,patch:b=>a(b)}),c={name:"thursday.settings",merge:(a,b)=>{let c=h.safeParse((0,f.migrateLiveSettings)(a)),d=c.success?c.data:i;return{...b,...d}}},(a,d,f)=>{let g,h={storage:function(a){let b;try{b=a()}catch(a){return}return{getItem:a=>{var c;let d=a=>null===a?null:JSON.parse(a,void 0),e=null!=(c=b.getItem(a))?c:null;return e instanceof Promise?e.then(d):d(e)},setItem:(a,c)=>b.setItem(a,JSON.stringify(c,void 0)),removeItem:a=>b.removeItem(a)}}(()=>window.localStorage),partialize:a=>a,version:0,merge:(a,b)=>({...b,...a}),...c},i=!1,j=0,k=new Set,l=new Set,m=h.storage;if(!m)return b((...b)=>{console.warn(`[zustand persist middleware] Unable to update item '${h.name}', the given storage is currently unavailable.`),a(...b)});let n=()=>{let a=h.partialize({...d()});return m.setItem(h.name,{state:a,version:h.version})},o=f.setState;f.setState=(a,b)=>(o(a,b),n());let p=b((...b)=>(a(...b),n()));f.getInitialState=()=>p;let q=()=>{var b,c;if(!m)return;let f=++j;i=!1,k.forEach(a=>{var b;return a(null!=(b=d())?b:p)});let o=(null==(c=h.onRehydrateStorage)?void 0:c.call(h,null!=(b=d())?b:p))||void 0;return e(m.getItem.bind(m))(h.name).then(a=>{if(a)if("number"!=typeof a.version||a.version===h.version)return[!1,a.state];else{if(h.migrate){let b=h.migrate(a.state,a.version);return b instanceof Promise?b.then(a=>[!0,a]):[!0,b]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}return[!1,void 0]}).then(b=>{var c;if(f!==j)return;let[e,i]=b;if(a(g=h.merge(i,null!=(c=d())?c:p),!0),e)return n()}).then(()=>{f===j&&(null==o||o(d(),void 0),g=d(),i=!0,l.forEach(a=>a(g)))}).catch(a=>{f===j&&(null==o||o(void 0,a))})};return f.persist={setOptions:a=>{h={...h,...a},a.storage&&(m=a.storage)},clearStorage:()=>{++j,null==m||m.removeItem(h.name)},getOptions:()=>h,rehydrate:()=>q(),hasHydrated:()=>i,onHydrate:a=>(k.add(a),()=>{k.delete(a)}),onFinishHydration:a=>(l.add(a),()=>{l.delete(a)})},h.skipHydration||q(),g||p}));a.s(["thursdaySettings",0,()=>{let a="u"<typeof navigator?null:navigator.language??null;return g.ThursdaySettingsSchema.parse({...j.getState(),locale:a})},"useThursdayStore",0,j],359006)},27418,a=>{"use strict";var b=a.i(421042);let c={[b.TOOL_NAMES.memory_recall]:"Checking your notes",[b.TOOL_NAMES.memory_remember]:"Noting that down",[b.TOOL_NAMES.memory_forget]:"Forgetting that",[b.TOOL_NAMES.bash]:"Doing it on this computer",[b.TOOL_NAMES.web_search]:"Searching the web",[b.TOOL_NAMES.load_skill]:"Reading how to do this",[b.TOOL_NAMES.end_call]:"Ending the call"};function d(a){if(!a)return null;try{let b=JSON.parse(a);if(b&&"object"==typeof b&&!Array.isArray(b))return b}catch{}return null}a.s(["delegatedLabel",0,function(a,c){if(a!==b.TOOL_NAMES.delegate)return null;try{let a=JSON.parse(c);return"string"==typeof a.label?a.label:null}catch{return null}},"toolBot",0,function(a,c){if(a!==b.TOOL_NAMES.delegate)return null;let e=d(c)?.bot;return"string"==typeof e&&e.trim()?e.trim():null},"toolLine",0,function(a,e){let f;if(a===b.TOOL_NAMES.tool_search||a===b.TOOL_NAMES.tool_call)return"Reaching a connected service";let g=d(e);return(g&&function(a,c){if(a===b.TOOL_NAMES.memory_remember){let a="string"==typeof c.path?c.path.trim():"",b=function(a){if(!Array.isArray(a.facts))return null;let b=a.facts.map(a=>a&&"object"==typeof a&&"string"==typeof a.text?a.text.trim():"").filter(Boolean);return b.length?{text:b[0],more:b.length-1}:null}(c);if(!a)return null;if(!b)return`Noting that under ${a}`;let d=b.more>0?` (+${b.more})`:"";return`Noting under ${a}: ${function(a){let b=a.trim().replace(/\s+/g," ");if(b.length<=28)return b;let c=b.slice(0,28),d=c.lastIndexOf(" ");return`${(d>14?c.slice(0,d):c).trimEnd()}…`}(b.text)}${d}`}if(a===b.TOOL_NAMES.delegate){let a="string"==typeof c.bot?c.bot.trim():"";return a?`Handing this to ${a}`:"Handing this over"}if(a===b.TOOL_NAMES.thread){let a="string"==typeof c.thread?c.thread.trim():"";return"answer"===c.action?"Passing that back":"cancel"===c.action?"Stopping that":"open"===c.action?a?`Opening ${a}`:"Opening that":a?`Checking on ${a}`:"Checking the jobs"}return null}(a,g))??c[a]??((f=a.indexOf("__"))<=0?null:`Reaching ${a.slice(0,f).replace(/[-_]/g," ")}`)}])},332033,a=>{"use strict";var b=a.i(572131);let c=["ctrl","alt","meta"],d=/^(Control|Alt|Shift|Meta|OS)/,e=/^(input|textarea|select)$/i;function f(a){let{code:b,ctrlKey:c,altKey:e,shiftKey:f,metaKey:g}=a;if(!b||d.test(b)||!c&&!e&&!g)return null;let h=[];return c&&h.push("ctrl"),e&&h.push("alt"),f&&h.push("shift"),g&&h.push("meta"),[...h,b].join("+")}let g={ctrl:["Ctrl","⌃"],alt:["Alt","⌥"],shift:["Shift","⇧"],meta:["Meta","⌘"]};a.s(["HOTKEY_CAPTURE",0,{"data-hotkey-capture":""},"comboOf",0,f,"isCombo",0,a=>{let b=a.split("+"),e=b.at(-1);return!!(e&&!d.test(e)&&b.slice(0,-1).some(a=>c.includes(a)))},"useHotkey",0,function({enabled:a,combo:c,onPress:d}){let g=(0,b.useRef)(d);g.current=d,(0,b.useEffect)(()=>{if(!a||!c)return;let b=a=>{var b;a.repeat||(b=a.target)&&(e.test(b.tagName)||b.isContentEditable||b.closest?.("[data-hotkey-capture]"))||f(a)===c&&(a.preventDefault(),g.current())};return window.addEventListener("keydown",b),()=>window.removeEventListener("keydown",b)},[a,c])},"useHotkeyLabel",0,function(a){let[c,d]=(0,b.useState)(!1);return(0,b.useEffect)(()=>d(/mac/i.test(navigator.userAgent)),[]),a?function(a,b=!1){let c=a.split("+"),d=c.at(-1)??"",e=c.slice(0,-1).map(a=>g[a]?.[+!!b]??a),f=d.replace(/^(Key|Digit|Numpad)/,"").replace(/([a-z])([A-Z])/g,"$1 $2")||d;return b?[...e,f].join(""):[...e,f].join(" + ")}(a,c):null}])}];
1
+ module.exports=[249049,a=>{"use strict";var b=a.i(187924),c=a.i(752562),d=a.i(474215),e=a.i(572131),f=a.i(767561),g=a.i(340695),h=a.i(205522),i=a.i(379630),j=a.i(96340),k=a.i(313237),l=a.i(759497),m=a.i(497895),n=a.i(449546),o=a.i(478978);function p({provider:a,saved:c,autoFocus:d,dense:e,value:f,ready:g,saving:h,onValue:j,onSubmit:k}){return(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsxs)("span",{className:"flex items-center gap-2 px-0.5 text-muted-foreground",children:[(0,b.jsx)(i.ProviderIcon,{provider:a.id,className:"size-4 shrink-0"}),(0,b.jsx)("span",{className:(0,m.cn)("font-mono",e?"text-[11px]":"text-[12.5px]"),children:a.label})]}),(0,b.jsx)(q,{provider:a,saved:c,autoFocus:d,dense:e,value:f,ready:g,saving:h,onValue:j,onSubmit:k})]})}function q({provider:a,saved:d,autoFocus:e,dense:f,value:i,ready:j,saving:k,onValue:l,onSubmit:n}){let o=i.trim().startsWith("xai-")||i.trim().startsWith("sk-ant-");return(0,b.jsxs)("form",{onSubmit:a=>{a.preventDefault(),n()},className:(0,m.cn)("flex items-center gap-3 rounded-2xl border bg-muted/40 px-4 transition-colors",f?"h-11 rounded-xl px-3":"h-14",d||j?"border-foreground bg-transparent":"border-border"),children:[(0,b.jsx)(h.Input,{autoFocus:e,type:"password","aria-label":"OpenAI API key",autoComplete:"off",value:i,spellCheck:!1,placeholder:d?"Replace it":"sk-…",onChange:a=>l(a.target.value),className:(0,m.cn)("min-w-0 flex-1 border-0 bg-transparent px-0 font-mono shadow-none focus-visible:ring-0 dark:bg-transparent",f?"h-7 text-[13px]":"h-9 text-[15px]")}),i?(0,b.jsx)(g.Button,{type:"submit",size:"sm",variant:o?"outline":"default",loading:k,disabled:!j,className:(0,m.cn)("shrink-0",f?"h-7 px-3":"h-9 px-4"),children:o?`Not ${a.label}?`:"Save"}):d&&(0,b.jsx)("span",{className:(0,m.cn)("grid shrink-0 animate-in place-items-center rounded-full bg-foreground text-background zoom-in-50 duration-300",f?"size-5":"size-7"),children:(0,b.jsx)(c.Check,{className:f?"size-3":"size-4"})})]})}a.s(["KEY_MIN",0,8,"KeyInput",0,q,"VoiceKeys",0,function({ref:a,autoFocus:c,dense:h=!1,onCancel:i,onSaved:q,className:r}){let{data:s}=(0,l.useServerRoute)(f.queryKey.config),[t,u]=(0,e.useState)({}),[v,w]=(0,e.useState)(null),[x]=(0,k.useServerAction)(n.setConfigAction,{onOk:()=>{(0,l.revalidate)(f.queryKey.config),(0,l.revalidate)(f.queryKey.llmModel)}}),y=a=>(t[a]?.trim().length??0)>=8,z=async a=>{let b=a.apiKeyName;if(!y(b)||v)return!1;w(b);try{return await x(b,t[b]),u(a=>({...a,[b]:""})),q?.(a.id),!0}catch{return!1}finally{w(null)}};return(0,e.useImperativeHandle)(a,()=>({pending:()=>y(j.LIVE_PROVIDER.apiKeyName),flush:async()=>!y(j.LIVE_PROVIDER.apiKeyName)||z(j.LIVE_PROVIDER)})),(0,b.jsxs)("div",{className:(0,m.cn)("w-full",h?"space-y-2":"space-y-4",r),children:[h&&(0,b.jsxs)("div",{className:"flex h-6 items-center justify-between gap-2",children:[(0,b.jsx)("span",{className:"px-0.5 font-mono text-[11px] text-muted-foreground",children:"Voice key"}),i&&(0,b.jsx)(g.Button,{type:"button",size:"icon",variant:"ghost","aria-label":"Not now",onClick:i,className:"-my-1 size-6",children:(0,b.jsx)(d.X,{className:"size-3.5"})})]}),(0,b.jsx)(p,{provider:j.LIVE_PROVIDER,saved:(0,o.isConfigSet)(s,j.LIVE_PROVIDER.apiKeyName),autoFocus:c,dense:h,value:t[j.LIVE_PROVIDER.apiKeyName]??"",ready:y(j.LIVE_PROVIDER.apiKeyName),saving:v===j.LIVE_PROVIDER.apiKeyName,onValue:a=>u(b=>({...b,[j.LIVE_PROVIDER.apiKeyName]:a})),onSubmit:()=>void z(j.LIVE_PROVIDER)}),(0,b.jsx)("p",{className:(0,m.cn)("px-0.5 font-mono text-muted-foreground",h?"text-[11px]":"pt-1 text-center text-[12.5px]"),children:h?"Live voice and reasoning share this OpenAI API key.":"Live uses an OpenAI API key, billed separately from ChatGPT. Stored on this machine, in this app's database."})]})}])},647509,a=>{"use strict";let b={A:[".##.","#..#","####","#..#","#..#"],B:["###.","#..#","###.","#..#","###."],C:[".###","#...","#...","#...",".###"],D:["###.","#..#","#..#","#..#","###."],E:["####","#...","###.","#...","####"],F:["####","#...","###.","#...","#..."],G:[".###","#...","#.##","#..#",".###"],H:["#..#","#..#","####","#..#","#..#"],I:["###",".#.",".#.",".#.","###"],J:["..##","...#","...#","#..#",".##."],K:["#..#","#.#.","##..","#.#.","#..#"],L:["#...","#...","#...","#...","####"],M:["#...#","##.##","#.#.#","#...#","#...#"],N:["#..#","##.#","#.##","#..#","#..#"],O:[".##.","#..#","#..#","#..#",".##."],P:["###.","#..#","###.","#...","#..."],Q:[".##.","#..#","#..#","#.#.",".#.#"],R:["###.","#..#","###.","#.#.","#..#"],S:[".###","#...",".##.","...#","###."],T:["###",".#.",".#.",".#.",".#."],U:["#..#","#..#","#..#","#..#",".##."],V:["#...#","#...#",".#.#.",".#.#.","..#.."],W:["#...#","#...#","#.#.#","##.##","#...#"],X:["#..#","#..#",".##.","#..#","#..#"],Y:["#.#","#.#",".#.",".#.",".#."],Z:["####","...#",".##.","#...","####"],0:[".##.","#.##","#..#","##.#",".##."],1:[".#.","##.",".#.",".#.","###"],2:["###.","...#",".##.","#...","####"],3:["###.","...#",".##.","...#","###."],4:["#..#","#..#","####","...#","...#"],5:["####","#...","###.","...#","###."],6:[".##.","#...","###.","#..#",".##."],7:["####","...#","..#.",".#..",".#.."],8:[".##.","#..#",".##.","#..#",".##."],9:[".##.","#..#",".###","...#",".##."],"!":["#","#","#",".","#"],"?":["###.","...#",".##.","....",".#.."],".":[".",".",".",".","#"],",":["..","..","..",".#","#."],"'":["#","#",".",".","."],"-":["...","...","###","...","..."],"+":["...",".#.","###",".#.","..."],":":[".","#",".","#","."],"(":[".#","#.","#.","#.",".#"],")":["#.",".#",".#",".#","#."],"<":["..#",".#.","#..",".#.","..#"],">":["#..",".#.","..#",".#.","#.."],"^":[".#.","#.#","...","...","..."],"~":["....",".#.#","#.#.","....","...."],"♥":[".#.#.","#####","#####",".###.","..#.."]," ":["..","..","..","..",".."]};Object.keys(b).filter(a=>!/^[A-Z0-9 ]$/.test(a)),a.s(["ALPHA_TOP",0,.82,"CHAR_RATE",0,2.2,"EMOJI_CHAR_RATE",0,.6,"EMOJI_MIN_LEVEL",0,6,"EMOJI_POOL",0,["🍎","🌹","🍓","❤️","🎈","🧨","🔴","🍊","🔥","🦊","🏀","🧡","🍑","⭐","🍋","🌻","💛","🐥","🌟","🍌","🍀","🌿","🐸","🥝","💚","🌵","🥑","💧","🌊","🫐","🐳","💙","🔵","🧊","🍇","💜","🔮","🟣","🪻","🍆","🌸","🌷","💗","🦩","🩷","🍫","🐻","🌰","🥐","🤍","☁️","🖤","⚪","⚫","🦢","🌈","🦜","🎨","🪩","🦄","✨","🍬","🎡"],"EMOJI_RATIO",0,.11,"FACE_WORD_MAX",0,8,"LETTERS",0,b,"RAMP",0,[[" "],[" ",".","`"],[".",",","·","'"],[":",";","-","^"],["=","+","~",'"'],["*","?","◦","j"],["c","v","○","7"],["o","x","◇","い"],["s","y","t","あ"],["e","a","u","な"],["k","w","z","や"],["q","h","n","米"]],"hash",0,function(a,b){let c=43758.5453*Math.sin(127.1*a+311.7*b);return c-Math.floor(c)},"smoothstep",0,function(a,b,c){let d=Math.min(1,Math.max(0,(c-a)/(b-a)));return d*d*(3-2*d)},"undrawable",0,function(a){return Array.from(a.toUpperCase()).find(a=>!(a in b))??null}])},445432,a=>{"use strict";var b=a.i(187924),c=a.i(572131),d=a.i(913834),e=a.i(287702),f=a.i(483253),g=a.i(647509);let h=[235,235,235];function i(a){let b=[[],[],[],[],[]],c=0;for(let d of Array.from(a.toUpperCase())){let a=g.LETTERS[d];if(a){if(b[0].length)for(let a of b)a.push(-1);a.forEach((a,d)=>{for(let e of a)b[d].push("#"===e?c:-1)})," "!==d&&c++}}return b}let j=i("ERROR");function k(a,b,c,d,e){return a+(b-a)*Math.min(1,e/(b>a?c:d))}function l(a,b,c,d,e,f){let g=Math.floor(b/(d*f)+a[0].length/2),h=Math.floor(c/(e*f)+a.length/2);return h<0||h>=a.length?-1:a[h][g]??-1}function m(a,b,c,d){let e=i(d),f=Math.max(1,Math.min(3,Math.floor(421.6/(e[0].length*b)))),g=0;for(let d of a)d.word=l(e,d.dx,d.dy,b,c,f),g=Math.max(g,d.word+1);return g}function n({className:a,mode:d="idle",charset:i=e.ASCII_FACE.charset,fontSize:o=e.ASCII_FACE.fontSize.default,density:p=e.ASCII_FACE.density.default,size:q=680,color:r=h,getSpectrum:s,getMicSpectrum:t,word:u=null}){let v=(0,c.useRef)(null),w=(0,c.useRef)(null),x=(0,c.useRef)([]),y=(0,c.useRef)(null),z=(0,c.useRef)(i),A=(0,c.useRef)({cur:[...r],target:r}),B=(0,c.useRef)(0),C=(0,c.useRef)(s);C.current=s;let D=(0,c.useRef)(t);D.current=t;let E=(0,c.useRef)({phrase:0,micPhrase:0,micLevel:0,bob:0,bobVel:0,amp:[,,,,].fill(0),phase:Array.from({length:4},(a,b)=>2.1*b),spin:0,rings:[]}),F=(0,c.useRef)({mode:d,start:0}),G=(0,c.useRef)({scale:.3,lift:0,gather:0,comet:0,speech:0,err:0,word:0,listen:0}),H=(0,c.useRef)(null),I=(0,c.useRef)({cw:1,ch:1});return(0,c.useEffect)(()=>{let a=v.current;if(!a)return;let b=.95*o/p,c=1.25*o/p,d=680/q,e=b*d,f=c*d,h=Math.max(1,Math.floor(625.6/(j[0].length*e)));B.current=q,I.current={cw:e,ch:f};let i=[],k=Math.ceil(q/b),n=Math.ceil(q/c);for(let a=0;a<n;a++)for(let m=0;m<k;m++){let k=m*b,n=a*c,o=(k-q/2)*d,p=(n-q/2)*d,r=Math.hypot(o,p),s=l(j,o,p,e,f,h);s<0&&r>328||i.push({x:k+b/2,y:n+c/2,dx:o,dy:p,dist:r,angle:Math.atan2(p,o),seed:(0,g.hash)(m,a),grain:(0,g.hash)(5.7*m+19,2.3*a+53),gap:.05+.3*(0,g.hash)(7.3*m+11,3.1*a+5),emoji:(0,g.hash)(2.7*m+31,5.9*a+17)<g.EMOJI_RATIO,speck:(0,g.hash)(4.1*m+23,6.3*a+41),letter:s,word:-1})}x.current=i,H.current&&m(i,e,f,H.current.text),y.current={ascii:Array.from({length:g.RAMP.length},()=>new Int32Array(i.length)),emoji:Array.from({length:g.RAMP.length},()=>new Int32Array(i.length)),asciiN:new Int32Array(g.RAMP.length),emojiN:new Int32Array(g.RAMP.length),glyph:Array(i.length)};let r=Math.min(2,window.devicePixelRatio||1);a.width=q*r,a.height=q*r,a.style.width=`${q}px`,a.style.height=`${q}px`;let s=a.getContext("2d");return s&&(s.setTransform(r,0,0,r,0,0),s.font=`700 ${o}px ui-monospace,SFMono-Regular,Menlo,monospace`,s.textAlign="center",s.textBaseline="middle",w.current=s),()=>{s?.clearRect(0,0,q,q),x.current=[],y.current=null}},[o,p,q]),(0,c.useEffect)(()=>{z.current=i},[i]),(0,c.useEffect)(()=>{A.current.target=r},[r]),(0,c.useEffect)(()=>{F.current.mode!==d&&(F.current={mode:d,start:.001*performance.now()})},[d]),(0,c.useEffect)(()=>{if(!u)return;let{cw:a,ch:b}=I.current;H.current={text:u.text,start:.001*performance.now(),letters:m(x.current,a,b,u.text)}},[u]),(0,c.useEffect)(()=>{let a=0,b=(0,f.createVoiceFollower)(),c=(0,f.createVoiceFollower)(),d=Array(f.SPECTRUM_BANDS).fill(0),e=Array(f.SPECTRUM_BANDS).fill(0),h=.001*performance.now(),i=0,j=1,l=0,m=f=>{let n=.001*f,o=Math.min(.05,Math.max(0,n-h));h=n;let p=w.current,q=y.current;if(!p||!q){a=requestAnimationFrame(m);return}let r=z.current,s=B.current;q.asciiN.fill(0),q.emojiN.fill(0);let t=C.current?.();if(!t||t.length<2){for(let a=0;a<d.length;a++){let b=.5*Math.sin(1.7*n+1.7*a)+.3*Math.sin(.8*n+.6*a)+.2*Math.sin(3*n+2.9*a);d[a]=.5*b+.5}t=d}let u=E.current,v=b.read(t,o);u.phrase=v.phrase,v.onset>0&&(u.bobVel+=.06*v.onset,u.rings.push({born:n,power:v.onset}),u.rings.length>5&&u.rings.shift()),u.bobVel+=-(.012*u.bob)-.09*u.bobVel,u.bob+=u.bobVel;let I=D.current?.(),J=c.read(I??e,o);u.micPhrase=I?J.phrase:0,u.micLevel=I?J.level:0;let K=I&&"listening"===F.current.mode?.5+8*J.level:1;j=k(j,K,.14,.14,o),i+=o*j;for(let a=0;a<4;a++){let b=Math.floor(a*v.bands.length/4),c=Math.max(b+1,Math.floor((a+1)*v.bands.length/4)),d=0;for(let a=b;a<c;a++)d+=v.bands[a];d/=c-b;let e=.7+.6*(0,g.hash)((.9*n|0)+31*a,a);u.amp[a]+=(d*e-u.amp[a])*(.05+.02*a),u.phase[a]+=o*(.9+.5*a)*(a%2?-1:1)}for(u.spin+=o*(1.1+.9*u.phrase);u.rings.length>0&&n-u.rings[0].born>.7;)u.rings.shift();let L=F.current,M=H.current,N=M?n-M.start:0,O=null!==M&&"error"!==L.mode&&N<3.4+.08*M.letters+.35?{scale:0,lift:0,gather:0,comet:0,speech:0,err:0,word:1,listen:0}:function(a,b,c){let d={scale:1,lift:0,gather:0,comet:0,speech:0,err:0,word:0,listen:0};switch(a){case"idle":return d;case"connecting":{let a=1-Math.exp(-b/1.3);return{...d,scale:.45+.55*a,lift:.06*a,gather:1}}case"listening":return{...d,lift:.24*(.7*c.micPhrase+.3*c.micLevel),listen:1};case"speaking":return{...d,speech:1};case"working":return{...d,comet:1};case"ending":return{...d,scale:0};case"error":return{...d,scale:0,err:1}}}(L.mode,n-L.start,u),P=G.current;P.scale=k(P.scale,O.scale,.45,"ending"===L.mode?.4:.7,o),P.lift=k(P.lift,O.lift,.22,.4,o),P.gather=k(P.gather,O.gather,.3,.95,o),P.comet=k(P.comet,O.comet,.45,.9,o),P.speech=k(P.speech,O.speech,.5,.75,o),"error"===L.mode&&(P.err<=.01&&(l=0),l+=o),P.err=k(P.err,O.err,.5,.6,o),P.word=k(P.word,O.word,.35,.5,o),P.listen=k(P.listen,O.listen,.3,.6,o);let Q=P.err>.5,R=P.word>.5,S="emojiOnly"===r?g.EMOJI_CHAR_RATE:g.CHAR_RATE,T=x.current;for(let a=0;a<T.length;a++){let b=T[a],c=function(a,b,c,d,e,f){let h,i,j,k,l=e.scale>.02?function(a,b,c=0,d=1){let e=170*Math.max(.02,d),f=1-(0,g.smoothstep)(.55*e,e,a.dist);return(.58+c+.2*Math.sin(.05*a.dist-.4*b)+.07*Math.sin(.35*b))*f}(a,b,e.lift,e.scale)*(1-.6*e.speech):0;return e.gather>.01&&(l+=function(a,b,c){let d=170*c;if(a.speck>=.55||a.dist<.8*d)return 0;let e=Math.min(55,Math.floor((a.angle+Math.PI)/(2*Math.PI)*56)),f=(.7*b+(0,g.hash)(e,5.3))%1,h=a.dist-(d+(320-d)*(1-f)**1.25)-(a.grain-.5)*16;return Math.exp(-(h*h)/260)*(0,g.smoothstep)(0,.2,f)*(1-f)*1.1}(a,b,e.scale)*e.gather),e.comet>.01&&(l+=(i=Math.exp(-((h=a.dist-210)*h)/1100),i*Math.exp(-((k=Math.atan2(Math.sin(j=a.angle-3*b),Math.cos(j)))*k)/(k<0?2.8:.16))*e.comet)),e.speech>.01&&(l+=function(a,b,c,d){var e;let f=170+40*c.phrase+85*c.bob;for(let b=0;b<4;b++)f+=28*c.amp[b]*Math.sin((b+2)*(a.angle+c.spin)+c.phase[b]);let g=170+(((e=f)<=205?Math.max(110,e):205+30*Math.tanh((e-205)/30))-170)*d,h=(a.grain-.5)*20+20*Math.sin(5*a.angle+.9*b+6.283*a.seed)*.3,i=a.dist-(g+h),j=Math.exp(-(i*i)/800)+.5*Math.exp(-(a.dist*a.dist)/6e3);if(a.dist<g&&(j+=.22*(1-a.dist/g)**.6*(.75+.25*Math.sin(.05*a.dist-1.2*b))),a.speck<.22){let d=90*(.6+.9*a.grain);for(let e=0;e<c.rings.length;e++){let f=c.rings[e],h=b-f.born,i=a.dist-(g+6+h*d);j+=Math.exp(-(i*i)/500)*f.power*Math.max(0,1-h/.7)}}return j}(a,b,f,e.speech)*e.speech),e.err>.01&&(l+=function(a,b,c){if(a.letter<0)return 0;let d=c%9.2,e=.12*a.seed;return Math.max(0,(0,g.smoothstep)(0,1,(d-.65*a.letter-e)/.8)-(0,g.smoothstep)(0,1,(d-5.6-.5*a.letter-e)/.7))*(.86+.14*Math.sin(3.5*b+6*a.seed))}(a,b,c)*e.err),e.word>.01&&(l+=function(a,b,c){if(a.word<0)return 0;let d=.08*a.seed;return Math.max(0,(0,g.smoothstep)(0,1,(c-.11*a.word-d)/.3)-(0,g.smoothstep)(0,1,(c-3.4-.08*a.word-d)/.35))*(.86+.14*Math.sin(3.5*b+6*a.seed))}(a,b,d)*e.word),l}(b,n,l,N,P,u);!(Q&&b.letter>=0||R&&b.word>=0)&&((c*=(.66+.72*b.grain)*(.8+.4*(0,g.hash)(Math.floor(.05*b.dx+.5*n),Math.floor(.05*b.dy-.3*n))))>.3&&(0,g.hash)(31.7*Math.floor(1.6*n),613*b.seed)>.992&&(c=Math.max(c,.9)),c<b.gap+.05*Math.sin(.28*n+6.283*b.seed)+P.listen*(.16+((0,g.hash)(Math.floor(9*n+3*b.seed),97*b.seed)-.5)*.6*u.micLevel)&&(c=0));let d=(c=c<0?0:c>1?1:c)*(g.RAMP.length-1)|0;if(0===d)continue;let e=i*S+7*b.seed|0;if("emojiOnly"===r||"emoji"===r&&b.emoji&&d>=g.EMOJI_MIN_LEVEL){let c=((b.seed*g.EMOJI_POOL.length|0)+e)%g.EMOJI_POOL.length;q.glyph[a]=g.EMOJI_POOL[c],q.emoji[d][q.emojiN[d]++]=a}else{let c=g.RAMP[d],f=((b.seed*c.length|0)+e)%c.length;q.glyph[a]=c[f],q.ascii[d][q.asciiN[d]++]=a}}p.clearRect(0,0,s,s);let U=x.current,V=g.RAMP.length-1,W=A.current;for(let a=0;a<3;a++)W.cur[a]+=(W.target[a]-W.cur[a])*.05;p.fillStyle=`rgb(${0|W.cur[0]},${0|W.cur[1]},${0|W.cur[2]})`;for(let a=1;a<=V;a++){let b=q.asciiN[a];if(0===b)continue;p.globalAlpha=g.ALPHA_TOP*(a/V);let c=q.ascii[a];for(let a=0;a<b;a++){let b=U[c[a]];p.fillText(q.glyph[c[a]],b.x,b.y)}}for(let a=1;a<=V;a++){let b=q.emojiN[a];if(0===b)continue;p.globalAlpha=.35+a/V*.65;let c=q.emoji[a];for(let a=0;a<b;a++){let b=U[c[a]];p.fillText(q.glyph[c[a]],b.x,b.y)}}p.globalAlpha=1,a=requestAnimationFrame(m)};return a=requestAnimationFrame(m),()=>cancelAnimationFrame(a)},[]),(0,b.jsx)("canvas",{ref:v,className:a,"aria-hidden":!0,style:{display:"block",pointerEvents:"none"}})}var o=a.i(730357),p=a.i(497895);let q={idle:"idle",connecting:"connecting",ending:"connecting",listening:"listening",speaking:"speaking",working:"thinking",delegating:"delegating"},r={ripple:18,bandEase:.03,pulse:0,punch:.05,stretch:0},s={ending:"ending",idle:"idle",connecting:"connecting",listening:"listening",speaking:"speaking",working:"working",delegating:"working"},t=[247,247,247],u=[10,10,10],v={mark:{label:"Mark",hint:"A silhouette with eyes. Blinks, glances, leans into a voice.",render:function({status:a,failed:c,size:e,getSpectrum:f,look:g,className:h}){return(0,b.jsx)(d.BotMark,{size:e,seed:"thursday",color:g.color,shape:g.shape,outline:g.outline,paint:g.paint,state:q[a],crossed:c,getSpectrum:f,options:r,notify:!1,className:h})}},ascii:{label:"Ascii",hint:"A field of characters. No eyes — the whole orb is the expression.",render:function({status:a,failed:c,word:d,size:e,getSpectrum:f,getMicSpectrum:g,look:h,className:i}){let j="dark"===(0,o.useResolvedTheme)();return(0,b.jsx)(n,{mode:c?"error":s[a],word:d,size:e,color:j?t:u,getSpectrum:f,getMicSpectrum:g,charset:h.charset,fontSize:h.fontSize,density:h.density,className:i})}}},w=(0,c.memo)(function({look:a,status:d="idle",size:e=448,className:f,...g}){let h=(0,c.useRef)(null),[i,j]=(0,c.useState)(e),[k,l]=(0,c.useState)(!1);(0,c.useEffect)(()=>{let a=h.current;if(!a)return;let b=new ResizeObserver(([a])=>{let b=Math.round(a.contentRect.width);b>0&&j(b)});return b.observe(a),()=>b.disconnect()},[]),(0,c.useEffect)(()=>{let a=requestAnimationFrame(()=>l(!0));return()=>cancelAnimationFrame(a)},[]);let m=v[a.kind].render;return(0,b.jsx)("div",{ref:h,className:(0,p.cn)("aspect-square transition-opacity duration-700 ease-out",k?"opacity-100":"opacity-0",f),children:(0,b.jsx)(m,{...g,look:a,status:d,size:i})})});a.s(["FACES",0,v,"Face",0,w],445432)},359006,a=>{"use strict";let b,c;var d=a.i(920226);let e=a=>b=>{try{let c=a(b);if(c instanceof Promise)return c;return{then:a=>e(a)(c),catch(a){return this}}}catch(a){return{then(a){return this},catch:b=>e(b)(a)}}};var f=a.i(96340),g=a.i(759399),h=a.i(461512);let i=h.ThursdaySettingsSchema.extend({wake:h.WakeSchema.catch(h.WAKE_DEFAULT),hotkey:h.HotkeySchema.catch(h.HOTKEY_DEFAULT),callBack:h.CallBackSchema.catch(h.CALL_BACK_DEFAULT),captionView:h.CaptionViewSchema.catch("center")}),j={...f.LIVE_DEFAULTS,wake:h.WAKE_DEFAULT,hotkey:h.HOTKEY_DEFAULT,callBack:h.CALL_BACK_DEFAULT,captionView:"center"},k=(0,d.create)()((b=a=>({...j,patch:b=>a(b)}),c={name:"thursday.settings",merge:(a,b)=>{let c=i.safeParse((0,f.migrateLiveSettings)(a)),d=c.success?c.data:j;return{...b,...d}}},(a,d,f)=>{let g,h={storage:function(a){let b;try{b=a()}catch(a){return}return{getItem:a=>{var c;let d=a=>null===a?null:JSON.parse(a,void 0),e=null!=(c=b.getItem(a))?c:null;return e instanceof Promise?e.then(d):d(e)},setItem:(a,c)=>b.setItem(a,JSON.stringify(c,void 0)),removeItem:a=>b.removeItem(a)}}(()=>window.localStorage),partialize:a=>a,version:0,merge:(a,b)=>({...b,...a}),...c},i=!1,j=0,k=new Set,l=new Set,m=h.storage;if(!m)return b((...b)=>{console.warn(`[zustand persist middleware] Unable to update item '${h.name}', the given storage is currently unavailable.`),a(...b)});let n=()=>{let a=h.partialize({...d()});return m.setItem(h.name,{state:a,version:h.version})},o=f.setState;f.setState=(a,b)=>(o(a,b),n());let p=b((...b)=>(a(...b),n()));f.getInitialState=()=>p;let q=()=>{var b,c;if(!m)return;let f=++j;i=!1,k.forEach(a=>{var b;return a(null!=(b=d())?b:p)});let o=(null==(c=h.onRehydrateStorage)?void 0:c.call(h,null!=(b=d())?b:p))||void 0;return e(m.getItem.bind(m))(h.name).then(a=>{if(a)if("number"!=typeof a.version||a.version===h.version)return[!1,a.state];else{if(h.migrate){let b=h.migrate(a.state,a.version);return b instanceof Promise?b.then(a=>[!0,a]):[!0,b]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}return[!1,void 0]}).then(b=>{var c;if(f!==j)return;let[e,i]=b;if(a(g=h.merge(i,null!=(c=d())?c:p),!0),e)return n()}).then(()=>{f===j&&(null==o||o(d(),void 0),g=d(),i=!0,l.forEach(a=>a(g)))}).catch(a=>{f===j&&(null==o||o(void 0,a))})};return f.persist={setOptions:a=>{h={...h,...a},a.storage&&(m=a.storage)},clearStorage:()=>{++j,null==m||m.removeItem(h.name)},getOptions:()=>h,rehydrate:()=>q(),hasHydrated:()=>i,onHydrate:a=>(k.add(a),()=>{k.delete(a)}),onFinishHydration:a=>(l.add(a),()=>{l.delete(a)})},h.skipHydration||q(),g||p}));a.s(["thursdaySettings",0,()=>{let a="u"<typeof navigator?null:navigator.language??null;return h.ThursdaySettingsSchema.parse({...k.getState(),locale:a,faceWords:"ascii"===(0,g.thursdayFace)().kind})},"useThursdayStore",0,k],359006)},27418,a=>{"use strict";var b=a.i(421042);let c={[b.TOOL_NAMES.memory_recall]:"Checking your notes",[b.TOOL_NAMES.memory_remember]:"Noting that down",[b.TOOL_NAMES.memory_forget]:"Forgetting that",[b.TOOL_NAMES.bash]:"Doing it on this computer",[b.TOOL_NAMES.web_search]:"Searching the web",[b.TOOL_NAMES.load_skill]:"Reading how to do this",[b.TOOL_NAMES.end_call]:"Ending the call"};function d(a){if(!a)return null;try{let b=JSON.parse(a);if(b&&"object"==typeof b&&!Array.isArray(b))return b}catch{}return null}a.s(["delegatedLabel",0,function(a,c){if(a!==b.TOOL_NAMES.delegate)return null;try{let a=JSON.parse(c);return"string"==typeof a.label?a.label:null}catch{return null}},"toolBot",0,function(a,c){if(a!==b.TOOL_NAMES.delegate)return null;let e=d(c)?.bot;return"string"==typeof e&&e.trim()?e.trim():null},"toolLine",0,function(a,e){let f;if(a===b.TOOL_NAMES.tool_search||a===b.TOOL_NAMES.tool_call)return"Reaching a connected service";let g=d(e);return(g&&function(a,c){if(a===b.TOOL_NAMES.memory_remember){let a="string"==typeof c.path?c.path.trim():"",b=function(a){if(!Array.isArray(a.facts))return null;let b=a.facts.map(a=>a&&"object"==typeof a&&"string"==typeof a.text?a.text.trim():"").filter(Boolean);return b.length?{text:b[0],more:b.length-1}:null}(c);if(!a)return null;if(!b)return`Noting that under ${a}`;let d=b.more>0?` (+${b.more})`:"";return`Noting under ${a}: ${function(a){let b=a.trim().replace(/\s+/g," ");if(b.length<=28)return b;let c=b.slice(0,28),d=c.lastIndexOf(" ");return`${(d>14?c.slice(0,d):c).trimEnd()}…`}(b.text)}${d}`}if(a===b.TOOL_NAMES.delegate){let a="string"==typeof c.bot?c.bot.trim():"";return a?`Handing this to ${a}`:"Handing this over"}if(a===b.TOOL_NAMES.thread){let a="string"==typeof c.thread?c.thread.trim():"";return"answer"===c.action?"Passing that back":"cancel"===c.action?"Stopping that":"open"===c.action?a?`Opening ${a}`:"Opening that":a?`Checking on ${a}`:"Checking the jobs"}return null}(a,g))??c[a]??((f=a.indexOf("__"))<=0?null:`Reaching ${a.slice(0,f).replace(/[-_]/g," ")}`)}])},332033,a=>{"use strict";var b=a.i(572131);let c=["ctrl","alt","meta"],d=/^(Control|Alt|Shift|Meta|OS)/,e=/^(input|textarea|select)$/i,f=a=>!!a&&!!(e.test(a.tagName)||a.isContentEditable||a.closest?.("[data-hotkey-capture]"));function g(a){let{code:b,ctrlKey:c,altKey:e,shiftKey:f,metaKey:g}=a;if(!b||d.test(b)||!c&&!e&&!g)return null;let h=[];return c&&h.push("ctrl"),e&&h.push("alt"),f&&h.push("shift"),g&&h.push("meta"),[...h,b].join("+")}let h={ctrl:["Ctrl","⌃"],alt:["Alt","⌥"],shift:["Shift","⇧"],meta:["Meta","⌘"]};a.s(["HOTKEY_CAPTURE",0,{"data-hotkey-capture":""},"capturesKeys",0,f,"comboOf",0,g,"isCombo",0,a=>{let b=a.split("+"),e=b.at(-1);return!!(e&&!d.test(e)&&b.slice(0,-1).some(a=>c.includes(a)))},"useHotkey",0,function({enabled:a,combo:c,onPress:d}){let e=(0,b.useRef)(d);e.current=d,(0,b.useEffect)(()=>{if(!a||!c)return;let b=a=>{a.repeat||f(a.target)||g(a)===c&&(a.preventDefault(),e.current())};return window.addEventListener("keydown",b),()=>window.removeEventListener("keydown",b)},[a,c])},"useHotkeyLabel",0,function(a){let[c,d]=(0,b.useState)(!1);return(0,b.useEffect)(()=>d(/mac/i.test(navigator.userAgent)),[]),a?function(a,b=!1){let c=a.split("+"),d=c.at(-1)??"",e=c.slice(0,-1).map(a=>h[a]?.[+!!b]??a),f=d.replace(/^(Key|Digit|Numpad)/,"").replace(/([a-z])([A-Z])/g,"$1 $2")||d;return b?[...e,f].join(""):[...e,f].join(" + ")}(a,c):null}])}];
2
2
 
3
3
  //# sourceMappingURL=_05yghx6._.js.map