thursday-agent 0.4.0 → 0.5.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 (199) 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/page.js.nft.json +1 -1
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  10. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  11. package/.next/server/app/_not-found.html +1 -1
  12. package/.next/server/app/_not-found.rsc +1 -1
  13. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  14. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  16. package/.next/server/app/api/artifact/route.js +4 -4
  17. package/.next/server/app/api/artifact/route.js.nft.json +1 -1
  18. package/.next/server/app/api/bot/memory/files/route.js +3 -3
  19. package/.next/server/app/api/bot/memory/files/route.js.nft.json +1 -1
  20. package/.next/server/app/api/bot/memory/route.js.nft.json +1 -1
  21. package/.next/server/app/api/bot/route.js.nft.json +1 -1
  22. package/.next/server/app/api/bot/task/[id]/route.js +8 -8
  23. package/.next/server/app/api/bot/task/[id]/route.js.nft.json +1 -1
  24. package/.next/server/app/api/bot/task/route.js +6 -6
  25. package/.next/server/app/api/bot/task/route.js.nft.json +1 -1
  26. package/.next/server/app/api/config/route.js.nft.json +1 -1
  27. package/.next/server/app/api/events/route.js.nft.json +1 -1
  28. package/.next/server/app/api/file/[...path]/route.js +4 -4
  29. package/.next/server/app/api/file/[...path]/route.js.nft.json +1 -1
  30. package/.next/server/app/api/llm-model/catalog/route.js +2 -2
  31. package/.next/server/app/api/llm-model/catalog/route.js.nft.json +1 -1
  32. package/.next/server/app/api/llm-model/credits/route.js +2 -2
  33. package/.next/server/app/api/llm-model/credits/route.js.nft.json +1 -1
  34. package/.next/server/app/api/llm-model/route.js +2 -2
  35. package/.next/server/app/api/llm-model/route.js.nft.json +1 -1
  36. package/.next/server/app/api/llm-model/subscription/route.js +2 -2
  37. package/.next/server/app/api/llm-model/subscription/route.js.nft.json +1 -1
  38. package/.next/server/app/api/mcp/[name]/route.js.nft.json +1 -1
  39. package/.next/server/app/api/mcp/oauth/callback/route.js.nft.json +1 -1
  40. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  41. package/.next/server/app/api/mcp/tools/route.js.nft.json +1 -1
  42. package/.next/server/app/api/memory/edit/route.js +11 -11
  43. package/.next/server/app/api/memory/edit/route.js.nft.json +1 -1
  44. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  45. package/.next/server/app/api/skills/[source]/[name]/route.js.nft.json +1 -1
  46. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  47. package/.next/server/app/api/thursday/call/route.js +6 -6
  48. package/.next/server/app/api/thursday/call/route.js.nft.json +1 -1
  49. package/.next/server/app/api/thursday/skills/route.js +6 -6
  50. package/.next/server/app/api/thursday/skills/route.js.nft.json +1 -1
  51. package/.next/server/app/api/thursday/tool-call/route.js +8 -8
  52. package/.next/server/app/api/thursday/tool-call/route.js.nft.json +1 -1
  53. package/.next/server/app/api/workspace/route.js +3 -2
  54. package/.next/server/app/api/workspace/route.js.nft.json +1 -1
  55. package/.next/server/app/artifact/[...path]/page/server-reference-manifest.json +1 -1
  56. package/.next/server/app/artifact/[...path]/page.js +2 -2
  57. package/.next/server/app/artifact/[...path]/page.js.nft.json +1 -1
  58. package/.next/server/app/artifact/[...path]/page_client-reference-manifest.js +1 -1
  59. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  60. package/.next/server/app/page/server-reference-manifest.json +40 -40
  61. package/.next/server/app/page.js +1 -1
  62. package/.next/server/app/page.js.nft.json +1 -1
  63. package/.next/server/app/page_client-reference-manifest.js +1 -1
  64. package/.next/server/chunks/[root-of-the-server]__026u77e._.js +5 -0
  65. package/.next/server/chunks/{[root-of-the-server]__02xjoto._.js → [root-of-the-server]__050zri4._.js} +1 -1
  66. package/.next/server/chunks/[root-of-the-server]__0bg9710._.js +3 -0
  67. package/.next/server/chunks/[root-of-the-server]__0in-d5s._.js +3 -0
  68. package/.next/server/chunks/[root-of-the-server]__0pa9k-f._.js +8 -0
  69. package/.next/server/chunks/[root-of-the-server]__0qi_m0e._.js +8 -0
  70. package/.next/server/chunks/[root-of-the-server]__0tq0m_k._.js +3 -0
  71. package/.next/server/chunks/[root-of-the-server]__0xep6j_._.js +3 -0
  72. package/.next/server/chunks/[root-of-the-server]__144l7qt._.js +8 -0
  73. package/.next/server/chunks/[root-of-the-server]__1anc1p9._.js +1 -1
  74. package/.next/server/chunks/[root-of-the-server]__1jg8t86._.js +8 -0
  75. package/.next/server/chunks/{[root-of-the-server]__12cabg9._.js → [root-of-the-server]__1lldzy9._.js} +1 -1
  76. package/.next/server/chunks/{[root-of-the-server]__01dkp4a._.js → [root-of-the-server]__1peqvsi._.js} +1 -1
  77. package/.next/server/chunks/[root-of-the-server]__1w8gm5h._.js +10 -0
  78. package/.next/server/chunks/[root-of-the-server]__1xt39nn._.js +8 -0
  79. package/.next/server/chunks/[root-of-the-server]__1zb8mfo._.js +8 -0
  80. package/.next/server/chunks/_0-fjql4._.js +11 -6
  81. package/.next/server/chunks/_00xh_q0._.js +1 -1
  82. package/.next/server/chunks/{_1_9mjx-._.js → _091bi8d._.js} +1 -1
  83. package/.next/server/chunks/_0fzqt2y._.js +29 -21
  84. package/.next/server/chunks/{_0u4aiy2._.js → _0lr92vd._.js} +1 -1
  85. package/.next/server/chunks/_0mecv0f._.js +11 -6
  86. package/.next/server/chunks/{_0sbynis._.js → _0si7xzn._.js} +1 -1
  87. package/.next/server/chunks/_1230wbx._.js +5 -5
  88. package/.next/server/chunks/{_0obojvv._.js → _18d7-5p._.js} +1 -1
  89. package/.next/server/chunks/_1c78vw5._.js +33 -25
  90. package/.next/server/chunks/_1d0j961._.js +2 -2
  91. package/.next/server/chunks/_1krd9rf._.js +1 -1
  92. package/.next/server/chunks/{_03a0897._.js → _1zkfbaa._.js} +1 -1
  93. package/.next/server/chunks/features_1qf3cei._.js +6 -1
  94. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_0r28-sm._.js → node_modules_consola_dist_chunks_prompt_mjs_17k8irj._.js} +1 -1
  95. package/.next/server/chunks/{node_modules_consola_dist_chunks_prompt_mjs_1xoq2rl._.js → node_modules_consola_dist_chunks_prompt_mjs_1jidylq._.js} +1 -1
  96. package/.next/server/chunks/ssr/[root-of-the-server]__0-nob52._.js +4 -0
  97. package/.next/server/chunks/ssr/{[root-of-the-server]__202p40z._.js → [root-of-the-server]__0s4wb56._.js} +1 -1
  98. package/.next/server/chunks/ssr/{[root-of-the-server]__0xsog8n._.js → [root-of-the-server]__0sd3izg._.js} +2 -2
  99. package/.next/server/chunks/ssr/{[root-of-the-server]__1gtlw6v._.js → [root-of-the-server]__1-13tcn._.js} +2 -2
  100. package/.next/server/chunks/ssr/[root-of-the-server]__10-dz5o._.js +1 -1
  101. package/.next/server/chunks/ssr/{[root-of-the-server]__0s9l2sv._.js → [root-of-the-server]__1zidpfl._.js} +1 -1
  102. package/.next/server/chunks/ssr/_001_ms1._.js +6 -1
  103. package/.next/server/chunks/ssr/{_0gb4gmf._.js → _04z2c7b._.js} +2 -2
  104. package/.next/server/chunks/ssr/{_1nnsk7z._.js → _06tssji._.js} +2 -2
  105. package/.next/server/chunks/ssr/_0fk4c7d._.js +3 -0
  106. package/.next/server/chunks/ssr/_0i_6q1w._.js +1 -1
  107. package/.next/server/chunks/ssr/{_1h0rw11._.js → _0m2lsd1._.js} +2 -2
  108. package/.next/server/chunks/ssr/_0mggveb._.js +3 -0
  109. package/.next/server/chunks/ssr/{_1jhd09t._.js → _0nbpc_8._.js} +2 -2
  110. package/.next/server/chunks/ssr/{_1fojd41._.js → _0rzucul._.js} +3 -3
  111. package/.next/server/chunks/ssr/_0s99bgb._.js +1 -1
  112. package/.next/server/chunks/ssr/_1-teee5._.js +4 -4
  113. package/.next/server/chunks/ssr/{_0fz4mf_._.js → _11j92tu._.js} +2 -2
  114. package/.next/server/chunks/ssr/{_1b2mjwr._.js → _1ebxla1._.js} +2 -2
  115. package/.next/server/chunks/ssr/{_1gd8q8l._.js → _1jdgjv9._.js} +2 -2
  116. package/.next/server/chunks/ssr/_1lz_cq2._.js +19 -11
  117. package/.next/server/chunks/ssr/{_0ilna52._.js → _1nj4niv._.js} +2 -2
  118. package/.next/server/chunks/ssr/_1ovmc9s._.js +3 -0
  119. package/.next/server/chunks/ssr/features_config_components_config-setting_tsx_0xfwqdg._.js +1 -1
  120. package/.next/server/chunks/ssr/features_connectors_components_mcp-setting_tsx_0jmbgvp._.js +1 -1
  121. package/.next/server/chunks/ssr/{node_modules_0pvd7q-._.js → node_modules_0-dr_o7._.js} +1 -1
  122. package/.next/server/chunks/ssr/{node_modules_1_pc9kq._.js → node_modules_04sksn9._.js} +1 -1
  123. package/.next/server/chunks/ssr/{node_modules_1vh5ntv._.js → node_modules_05-n6dz._.js} +1 -1
  124. package/.next/server/chunks/ssr/{node_modules_0b__sgl._.js → node_modules_056qgf-._.js} +1 -1
  125. package/.next/server/chunks/ssr/{node_modules_0g7fzk3._.js → node_modules_07dsgkx._.js} +1 -1
  126. package/.next/server/chunks/ssr/{node_modules_04jf_m8._.js → node_modules_0bvopy2._.js} +1 -1
  127. package/.next/server/chunks/ssr/{node_modules_0arus10._.js → node_modules_0fkeku3._.js} +1 -1
  128. package/.next/server/chunks/ssr/{node_modules_14om4ar._.js → node_modules_0ifp389._.js} +1 -1
  129. package/.next/server/chunks/ssr/{node_modules_0cxaxk9._.js → node_modules_0iur59s._.js} +1 -1
  130. package/.next/server/chunks/ssr/{node_modules_1aaxuef._.js → node_modules_0m383r2._.js} +1 -1
  131. package/.next/server/chunks/ssr/{node_modules_1qpjvy5._.js → node_modules_0u9da1h._.js} +1 -1
  132. package/.next/server/chunks/ssr/{node_modules_1cx_ql6._.js → node_modules_0zeg3x_._.js} +1 -1
  133. package/.next/server/chunks/ssr/{node_modules_0_-_a--._.js → node_modules_1-y7nni._.js} +1 -1
  134. package/.next/server/chunks/ssr/{node_modules_08dhkiq._.js → node_modules_16mkxuo._.js} +1 -1
  135. package/.next/server/chunks/ssr/{node_modules_198nmll._.js → node_modules_1a0kmjl._.js} +1 -1
  136. package/.next/server/chunks/ssr/{node_modules_1efrqxi._.js → node_modules_1chvq5f._.js} +1 -1
  137. package/.next/server/chunks/ssr/{node_modules_0yugy6m._.js → node_modules_1j8j4pt._.js} +1 -1
  138. package/.next/server/chunks/ssr/{node_modules_09q35v_._.js → node_modules_1k6n600._.js} +1 -1
  139. package/.next/server/chunks/ssr/{node_modules_1cz2hle._.js → node_modules_1k7z2j6._.js} +1 -1
  140. package/.next/server/chunks/ssr/{node_modules_1gdh31p._.js → node_modules_1k8j8n0._.js} +1 -1
  141. package/.next/server/chunks/ssr/{node_modules_1eg7m6c._.js → node_modules_1lz0oxc._.js} +1 -1
  142. package/.next/server/chunks/ssr/{node_modules_0940ns5._.js → node_modules_1t77e4n._.js} +1 -1
  143. package/.next/server/chunks/ssr/{node_modules_00etblx._.js → node_modules_1uyk91w._.js} +1 -1
  144. package/.next/server/chunks/ssr/{node_modules_0had7xd._.js → node_modules_1x0ztf4._.js} +1 -1
  145. package/.next/server/chunks/ssr/{node_modules_14q6g4n._.js → node_modules_1y79i83._.js} +1 -1
  146. package/.next/server/chunks/ssr/{node_modules_1hpopmo._.js → node_modules_20c28js._.js} +1 -1
  147. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1b748ic._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0bkwd0u._.js} +1 -1
  148. package/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_1z4hm5e._.js → node_modules_@mermaid-js_parser_dist_chunks_mermaid-parser_core_0p9a9su._.js} +1 -1
  149. package/.next/server/chunks/ssr/{node_modules_@vercel_oidc_dist_06mk8id._.js → node_modules_@vercel_oidc_dist_1o553h-._.js} +1 -1
  150. package/.next/server/middleware-build-manifest.js +3 -3
  151. package/.next/server/pages/404.html +1 -1
  152. package/.next/server/pages/500.html +1 -1
  153. package/.next/server/server-reference-manifest.js +1 -1
  154. package/.next/server/server-reference-manifest.json +41 -41
  155. package/.next/static/chunks/{39j0fvpybzabl.js → 0n3jle9kbqfr2.js} +2 -2
  156. package/.next/static/chunks/{0fl3gwe4-l6tz.js → 11r2yp_yh9_qn.js} +1 -1
  157. package/.next/static/chunks/{1jd09sxcjddu1.js → 126fj4pga_72k.js} +1 -1
  158. package/.next/static/chunks/{0gnqdjn2lvdad.js → 159udiexf6dom.js} +1 -1
  159. package/.next/static/chunks/{08qe4as2q428z.js → 18gi7o2ibrgh8.js} +1 -1
  160. package/.next/static/chunks/{2u7xt6mxg44lf.js → 1q9z1tohil7xn.js} +1 -1
  161. package/.next/static/chunks/{3zmcsnuo25zvq.js → 1sjgfets224re.js} +1 -1
  162. package/.next/static/chunks/{0wcprt5ot5she.js → 1wszsr83t01gh.js} +1 -1
  163. package/.next/static/chunks/{0w52rrrmuj9r9.js → 2szintyibu0s5.js} +1 -1
  164. package/.next/static/chunks/{0hwap1-p0m5sa.js → 3-b6b7entqazs.js} +1 -1
  165. package/.next/static/chunks/{17p6tk6k88dq6.js → 3dmbhsv2u_8kj.js} +1 -1
  166. package/.next/static/chunks/{214ya3n5gxeih.js → 3i0a5px-oufgc.js} +1 -1
  167. package/.next/static/chunks/{1w73ece_6bheu.js → 3wexk9qo8zuj3.js} +3 -3
  168. package/.next/static/chunks/3xre8bu_pk1p_.js +1 -0
  169. package/.next/static/chunks/{3woj-xd7ki5_i.js → 3zv6t3i77xhr_.js} +1 -1
  170. package/.next/static/chunks/{3akmqm77muj4-.js → 408ueu4hfvcg7.js} +1 -1
  171. package/.next/static/chunks/{15m575979un5f.js → 435atsnhs7ksu.js} +6 -6
  172. package/bin/thursday.mjs +0 -0
  173. package/features/ai/prompts/bot.prompt.ts +1 -1
  174. package/features/ai/tools/bot.tool.ts +3 -3
  175. package/features/ai/tools/skills.tool.ts +25 -8
  176. package/features/bot/bot.run.ts +184 -73
  177. package/features/bot/bot.runner.ts +48 -23
  178. package/features/bot/task.query.ts +107 -4
  179. package/features/bot/task.store.ts +3 -5
  180. package/features/workspace/workspace.ts +27 -20
  181. package/package.json +1 -1
  182. package/skills/browser/SKILL.md +6 -5
  183. package/.next/server/chunks/[root-of-the-server]__04q--0f._.js +0 -8
  184. package/.next/server/chunks/[root-of-the-server]__0bl-e63._.js +0 -3
  185. package/.next/server/chunks/[root-of-the-server]__0jq4ohy._.js +0 -8
  186. package/.next/server/chunks/[root-of-the-server]__0ls6_8y._.js +0 -8
  187. package/.next/server/chunks/[root-of-the-server]__1339jnv._.js +0 -8
  188. package/.next/server/chunks/[root-of-the-server]__18_teo8._.js +0 -8
  189. package/.next/server/chunks/[root-of-the-server]__1ccon1w._.js +0 -10
  190. package/.next/server/chunks/[root-of-the-server]__1wa1k7r._.js +0 -8
  191. package/.next/server/chunks/_1zjrdag._.js +0 -3
  192. package/.next/server/chunks/ssr/[root-of-the-server]__1ox7hbk._.js +0 -4
  193. package/.next/server/chunks/ssr/_0n3toaw._.js +0 -3
  194. package/.next/server/chunks/ssr/_1-_etts._.js +0 -3
  195. package/.next/server/chunks/ssr/_1f-dg-6._.js +0 -3
  196. package/.next/static/chunks/00rd4-v8r7axp.js +0 -1
  197. /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → G6-gNoyGDEcgAsq-L4PE1}/_buildManifest.js +0 -0
  198. /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → G6-gNoyGDEcgAsq-L4PE1}/_clientMiddlewareManifest.js +0 -0
  199. /package/.next/static/{kaTO0UHqF1bMnWgCDik2f → G6-gNoyGDEcgAsq-L4PE1}/_ssgManifest.js +0 -0
@@ -17,7 +17,7 @@ ${(0,q.mcpToolLines)(d)}
17
17
 
18
18
  Names only: \`${f.TOOL_NAMES.tool_search}\` returns what each one takes, \`${f.TOOL_NAMES.tool_call}\` runs one.${e}`}(Q,R),(F=O,0===F.length?"":`## Skills
19
19
 
20
- Written-down methods. When the job is one of these, read it with \`${f.TOOL_NAMES.load_skill}\` before starting.
20
+ Written-down methods. Use the instructions already in your conversation. When the job needs a skill whose full instructions are absent, read it with \`${f.TOOL_NAMES.load_skill}\` before starting.
21
21
 
22
22
  ${(0,q.skillLines)(F)}`),y(L.cwd,V,r),U?(G=(0,g.botMemoryFolder)(M),J=(H=T).entries.length?H.entries.map(({file:a,line:b,at:c})=>{let f=b?` — ${(0,o.clip)(b,e.PROMPT_LINE.botMemory)}`:"";return`- ${a}${f} \xb7 ${(0,d.format)((0,m.toDate)(c),"yyyy-MM-dd")}`}).join("\n"):"Empty.",K=H.total>H.entries.length?`
23
23
 
@@ -88,7 +88,7 @@ Say goodbye first — nothing said after this reaches the user.`,parameters:c.ob
88
88
  what supports it. Say plainly what you could not find or confirm — do not fill
89
89
  the gap with a guess. Every number carries the date you saw it. Be brief: this
90
90
  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:
91
- ${h.join("\n")}`:""].filter(Boolean).join("\n\n")}let q=async(a,b)=>{let c=await (0,j.readConfig)(i.EXA_API_KEY),d=a?.searchTools?{model:a.model,tools:a.searchTools}:null,l=c?(a,b)=>m(c,a,b):d?(a,b)=>n(d,a,b):null;return l?{[h.TOOL_NAMES.web_search]:(0,e.tool)({description:"Search the web and get back what the pages say, with their links. For a fact, a price, a date, what a page says. Not for a page that has to be clicked, filled, or signed into — that is the browser.",inputSchema:f.default.object({query:p}),execute:async({query:a},{abortSignal:c})=>{let d=AbortSignal.timeout(g.SEARCH.timeoutMs),e=c?AbortSignal.any([c,d]):d,f=await l(a,e).catch(a=>{if(c?.aborted)throw a;return d.aborted?`The search did not come back in ${g.SEARCH.timeoutMs/1e3}s. Ask something narrower, or open the page in the browser.`:`Search failed: ${(0,k.errorToString)(a)}. The browser is the other way in.`});return b.fold(f,"web-search")}})}:{}};a.s(["createSearchTool",0,q]),c()}catch(a){c(a)}},!1),451017,a=>{"use strict";var b=a.i(527990),c=a.i(723885),d=a.i(762008),e=a.i(762805);a.s(["createSkillTools",0,({skills:a,sandbox:f})=>{let g=new Set;return{[d.TOOL_NAMES.load_skill]:(0,b.tool)({description:"Load one skill: its instructions, and the files that ship with it.",inputSchema:c.default.object({name:c.default.string().describe("Exact name from the Skills list. Do not guess names that are not on it.")}),execute:async({name:b})=>{let c=a.find(a=>a.name.toLowerCase()===b.toLowerCase());if(!c)return{error:`No skill named '${b}'.`,available:a.map(a=>a.name)};let d=`${c.path}/SKILL.md`;if(g.has(c.path))return{skillDirectory:c.path,note:`You already loaded '${c.name}' in this run — its instructions are above, unchanged. Scroll back to that result rather than reading it again; if you need the file itself, read ${d} with the shell.`};let h=await f.readFile(d,"utf-8"),{body:i}=(0,e.splitFrontmatter)(h),j=await f.glob("**/*",{path:c.path,limit:50});return g.add(c.path),{skillDirectory:c.path,files:j,content:i}}})}}])},500777,a=>a.a(async(b,c)=>{try{var d=a.i(912714),e=a.i(750227),f=a.i(47919),g=a.i(12208),h=a.i(723885),i=a.i(569572),j=a.i(875931),k=a.i(762008),l=a.i(176668),m=a.i(182248),n=b([j]);function o(a){return{...a,execute:(b,c)=>{let d=a.inputSchema.safeParse(b);if(!d.success)throw Error(h.default.prettifyError(d.error));return a.execute(d.data,c)}}}[j]=n.then?(await n)():n;let t={images:`${i.PATHS.artifacts}/images`,audio:`${i.PATHS.artifacts}/audio`,transcripts:`${i.PATHS.artifacts}/transcripts`,videos:`${i.PATHS.artifacts}/videos`};function p(a,b){let c=a.toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"").slice(0,40),d=(0,g.format)(new Date,"yyyyMMdd-HHmmss");return`${d}${c?`-${c}`:""}.${b}`}async function q(a,b,c,d){let e=`${b}/${c}`;return await a.exec(`mkdir -p ${b}`),await a.writeFile(e,Buffer.from(d)),e}let u=a=>`${a}
91
+ ${h.join("\n")}`:""].filter(Boolean).join("\n\n")}let q=async(a,b)=>{let c=await (0,j.readConfig)(i.EXA_API_KEY),d=a?.searchTools?{model:a.model,tools:a.searchTools}:null,l=c?(a,b)=>m(c,a,b):d?(a,b)=>n(d,a,b):null;return l?{[h.TOOL_NAMES.web_search]:(0,e.tool)({description:"Search the web and get back what the pages say, with their links. For a fact, a price, a date, what a page says. Not for a page that has to be clicked, filled, or signed into — that is the browser.",inputSchema:f.default.object({query:p}),execute:async({query:a},{abortSignal:c})=>{let d=AbortSignal.timeout(g.SEARCH.timeoutMs),e=c?AbortSignal.any([c,d]):d,f=await l(a,e).catch(a=>{if(c?.aborted)throw a;return d.aborted?`The search did not come back in ${g.SEARCH.timeoutMs/1e3}s. Ask something narrower, or open the page in the browser.`:`Search failed: ${(0,k.errorToString)(a)}. The browser is the other way in.`});return b.fold(f,"web-search")}})}:{}};a.s(["createSearchTool",0,q]),c()}catch(a){c(a)}},!1),451017,a=>{"use strict";var b=a.i(527990),c=a.i(723885),d=a.i(762008),e=a.i(762805);a.s(["createSkillTools",0,({skills:a,sandbox:f})=>({[d.TOOL_NAMES.load_skill]:(0,b.tool)({description:"Load one skill: its instructions, and the files that ship with it.",inputSchema:c.default.object({name:c.default.string().describe("Exact name from the Skills list. Do not guess names that are not on it.")}),execute:async({name:b},{messages:c})=>{let g=a.find(a=>a.name.toLowerCase()===b.toLowerCase());if(!g)return{error:`No skill named '${b}'.`,available:a.map(a=>a.name)};let h=`${g.path}/SKILL.md`;if(c.some(a=>Array.isArray(a.content)&&a.content.some(a=>{if("tool-result"!==a.type||a.toolName!==d.TOOL_NAMES.load_skill||"json"!==a.output.type)return!1;let b=a.output.value;return b?.skillDirectory===g.path&&"string"==typeof b.content})))return{skillDirectory:g.path,note:`Use the full '${g.name}' instructions already in your conversation. To check for changes on disk, read ${h} with the shell.`};let i=await f.readFile(h,"utf-8"),{body:j}=(0,e.splitFrontmatter)(i),k=await f.glob("**/*",{path:g.path,limit:50});return{skillDirectory:g.path,files:k,content:j}}})})])},500777,a=>a.a(async(b,c)=>{try{var d=a.i(912714),e=a.i(750227),f=a.i(47919),g=a.i(12208),h=a.i(723885),i=a.i(569572),j=a.i(875931),k=a.i(762008),l=a.i(176668),m=a.i(182248),n=b([j]);function o(a){return{...a,execute:(b,c)=>{let d=a.inputSchema.safeParse(b);if(!d.success)throw Error(h.default.prettifyError(d.error));return a.execute(d.data,c)}}}[j]=n.then?(await n)():n;let t={images:`${i.PATHS.artifacts}/images`,audio:`${i.PATHS.artifacts}/audio`,transcripts:`${i.PATHS.artifacts}/transcripts`,videos:`${i.PATHS.artifacts}/videos`};function p(a,b){let c=a.toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"").slice(0,40),d=(0,g.format)(new Date,"yyyyMMdd-HHmmss");return`${d}${c?`-${c}`:""}.${b}`}async function q(a,b,c,d){let e=`${b}/${c}`;return await a.exec(`mkdir -p ${b}`),await a.writeFile(e,Buffer.from(d)),e}let u=a=>`${a}
92
92
  Saved. Give the user this path — the file opens from the task row. Do not describe it back to them; they can open it.`,v=(a,b)=>a?.split("/")[1]?.split(";")[0]||b,w=["1:1","16:9","9:16","4:3","3:4"],x=async()=>{let a=await (0,j.resolveMediaRef)("image");if(!a)return null;let b=(0,j.buildImageModel)(a.ref,a.apiKey);return o({name:k.STUDIO_TOOLS.generate_image,description:"Draw an image and save it as a file in the workspace. What comes back is its path.",inputSchema:h.default.object({prompt:h.default.string().describe("What to draw, described: subject, style, mood, what is in frame. The image model does not see the job or the conversation, so nothing can be left implied."),aspectRatio:h.default.enum(w).nullish().describe("Aspect ratio. Null for square.")}),execute:async({prompt:a,aspectRatio:c},{sandbox:d,abortSignal:e})=>{let{image:g}=await (0,f.generateImage)({model:b,prompt:a,aspectRatio:c??"1:1",abortSignal:e}),h=await q(d,t.images,p(a,v(g.mediaType,"png")),g.uint8Array);return u(h)}})},y=async()=>{let a=await (0,j.resolveMediaRef)("speech");if(!a)return null;let b=(0,j.buildSpeechModel)(a.ref,a.apiKey);return o({name:k.STUDIO_TOOLS.generate_speech,description:"Read text aloud into an audio file in the workspace — something the user listens to or sends, not Thursday's voice. What comes back is its path.",inputSchema:h.default.object({text:h.default.string().min(1).max(4e3).describe("The words to read, up to 4000 characters. Longer pieces are read in parts, one call each."),voice:h.default.string().nullish().describe("A voice name the provider knows. Null for its default."),instructions:h.default.string().nullish().describe('How to read it — "slowly", "warm", "like a news anchor". Null for plain.')}),execute:async({text:a,voice:c,instructions:d},{sandbox:e,abortSignal:g})=>{let{audio:h}=await (0,f.generateSpeech)({model:b,text:a,voice:c??void 0,instructions:d??void 0,outputFormat:"mp3",abortSignal:g}),i=await q(e,t.audio,p(a.slice(0,60),h.format||"mp3"),h.uint8Array);return u(i)}})},z=async()=>{let a=await (0,j.resolveMediaRef)("transcription");if(!a)return null;let b=(0,j.buildTranscriptionModel)(a.ref,a.apiKey);return o({name:k.STUDIO_TOOLS.transcribe,description:"Turn an audio file — a recording, a voice memo, a meeting — into text. The transcript is saved as a file in the workspace; what comes back is its path and the text.",inputSchema:h.default.object({path:h.default.string().min(1).describe("The audio file: a path relative to the workspace, or an absolute one anywhere on this machine.")}),execute:async({path:a},{sandbox:c,abortSignal:g})=>{let h=await (0,d.readFile)(c.resolve(a)),i=await (0,f.transcribe)({model:b,audio:h,abortSignal:g}),j=i.segments.length?`
93
93
 
94
94
  ## Timeline
@@ -104,14 +104,22 @@ Every command is a new shell: \`cd\`, exported variables and an activated venv a
104
104
 
105
105
  Nothing is watching it. A command that stops to ask never gets an answer and is killed after ${e.EXEC_TIMEOUT_MS/1e3}s, so pass the flag that skips the question (\`-y\`, \`--yes\`, \`--no-input\`), and send anything genuinely long to the background with its output redirected to a file.
106
106
 
107
- Keys are not in the environment: every variable named like a key, a token or a secret is removed before the shell starts. An empty one is not an unset one — say which it was, and ask for what a command needs.`;a.s(["createWorkspaceTools",0,(a,e)=>{let i=!0===e.guide,j=(0,c.tool)({description:"Run a bash command.",inputSchema:d.default.object({command:d.default.string(),description:d.default.string().nullish().describe("One short line for the user: what this command does and why. Shown on their screen while it runs — not a restatement of the command.")}),execute:async({command:b},{abortSignal:c})=>{let d=await a.exec(b,{signal:c,env:e.env,timeoutMs:e.timeoutMs});return i?(i=!1,{...d,guide:h}):d}});if(!e.write)return{[f.TOOL_NAMES.bash]:j};let k=(0,c.tool)({description:"Write a whole file — what was there is gone. Parent directories are created.",inputSchema:d.default.object({path:d.default.string().describe("Relative to the working directory — under one of its folders — or absolute"),content:d.default.string(),description:d.default.string().nullish().describe("One short line for the user: what this file is. Shown on their screen next to the path.")}),execute:async({path:c,content:d})=>{let e,f=a.resolve(c),h=(0,g.writeRefusal)(f);return h?h:(await a.writeFile(c,d),`Wrote ${(e=(0,b.relative)(a.cwd,f))&&!e.startsWith("..")?e:f} (${d.split("\n").length} lines)`)}});return{[f.TOOL_NAMES.bash]:j,[f.TOOL_NAMES.write_file]:k}}])},641301,a=>{"use strict";var b=a.i(912714),c=a.i(750227),d=a.i(569572),e=a.i(821415);let f=a=>`${(0,e.botFolder)(a)}/memory`;async function g(a,i=d.BOT_MEMORY_LISTED){let j=f(a),k=(0,c.join)(e.WORKSPACE,j),l=await (0,b.readdir)(k).catch(()=>[]),m=(await Promise.all(l.filter(a=>!a.startsWith(".")).map(async a=>{let d=await (0,b.stat)((0,c.join)(k,a)).catch(()=>null);return d?.isFile()?{name:a,changed:d.mtimeMs,bytes:d.size}:null}))).filter(a=>null!==a).sort((a,b)=>b.changed-a.changed),n=await Promise.all(m.slice(0,i).map(async({name:a,changed:b,bytes:d})=>({file:a,path:`${j}/${a}`,line:await h((0,c.join)(k,a)),at:new Date(b),bytes:d})));return{folder:j,entries:n,total:m.length}}async function h(a){let c=await (0,b.open)(a,"r").catch(()=>null);if(!c)return"";try{let a=Buffer.alloc(1024),{bytesRead:b}=await c.read(a,0,1024,0),d=a.toString("utf8",0,b).split("\n").map(a=>a.trim()).filter(Boolean);if("---"===d[0]){let a=d.find(a=>a.startsWith("description:"));if(a)return a.slice(12).trim().replace(/^["']|["']$/g,"");let b=d.indexOf("---",1);return b>0?(d[b+1]??"").replace(/^#+\s*/,""):""}return(d[0]??"").replace(/^#+\s*/,"")}finally{await c.close()}}a.s(["botMemoryFolder",0,f,"listBotMemory",0,g])},654034,a=>a.a(async(b,c)=>{try{var d=a.i(47919),e=a.i(527990),f=a.i(569572),g=a.i(738131),h=a.i(875931),i=a.i(735502),j=a.i(978876),k=a.i(762008),l=a.i(446957),m=a.i(821415),n=a.i(176668),o=a.i(293480),p=a.i(987674),q=a.i(221214),r=a.i(84929),s=b([g,h,i,q,r]);[g,h,i,q,r]=s.then?(await s)():s;let z=f.BOT_RUN.steps;async function t(a,b){var c,o,s;let t,w,C,D,E,F,G,H,I=b.depth??0,J=b.parent??null,K=a.bot.trim(),L=a=>b.emit({...a,bot:K,parent:J}),M=await (0,q.findJobBot)(K);if(!M)return void await L({type:"error",message:`No bot named "${a.bot}". Use a name from the list.`,failure:"fatal"});if(M.disabled&&"request"in a)return void await L({type:"error",message:`${M.name} is switched off. Use a name from the list.`,failure:"fatal"});let N=await ((c=M).provider&&c.model?(0,h.getTextModel)({provider:c.provider,model:c.model}):(0,h.resolveDefaultModel)().then(h.getTextModel)),O=b.taskId?await (0,r.findTask)(b.taskId):null,[P,Q]=await Promise.all([b.taskId?(0,m.openJobScratch)(b.taskId,O?.label??"job"):null,(0,m.openBotFolder)(K)]),[R,S]=await Promise.all([(0,i.loadBotPrompt)(K,M.systemPrompt,"askedBy"in a?{askedBy:a.askedBy,above:a.above,canBorrow:I<f.BOT_RUN.depth}:null,{scratch:P,own:Q}),(0,g.loadTools)({target:"bot",bot:K,session:b.session??b.taskId,model:N})]),T=Math.min(await (0,h.compactBudget)(N.ref,M.compactAt),("askedBy"in a?0:O?.contextBudget)||1/0),U="messages"in a?a.messages:[{role:"user",content:(0,i.buildHandoff)({chain:a.chain,bots:[...a.above,K],did:a.context??null,part:a.request})}],V={left:f.BOT_RUN.askBack},W="askedBy"in a?function(a,b,c){let d={...a};delete d[k.TOOL_NAMES.ask_thursday];let{answer:f}=c;return f?{...d,[k.TOOL_NAMES.ask_back]:(0,e.tool)({description:j.askBackSpec.description,inputSchema:j.askBackSpec.parameters,execute:async({question:a})=>(b.left-=1,f(a))})}:d}(S,V,b):S,X=I<f.BOT_RUN.depth?function(a,b){if(0===b.peers.length)return a;let c={...a,[k.TOOL_NAMES.ask_bot]:(0,e.tool)({description:j.askBotSpec.description,inputSchema:j.askBotSpec.parameters,execute:async({bot:a,request:d,context:e},f)=>{if(a===b.name||b.above.includes(a))return`${a} is already on this job, above you and waiting on your part. Pick another bot, or do it yourself.`;let g=b.options.taskId?`${b.options.session??b.options.taskId}-${f.toolCallId.slice(0,8)}`:null,h=[],i=async e=>{let g=await y({model:b.model,instructions:b.instructions,tools:c,messages:f.messages,asked:{bot:a,request:d},question:e,signal:b.options.signal});return await b.emit({type:"answered",question:e,...g}),h.push({question:e,answer:g.text}),g.text};try{var j;let c=await x({bot:a,request:d,context:e,askedBy:b.name,chain:b.chain,above:[...b.above,b.name]},{...b.options,signal:f.abortSignal??b.options.signal,depth:b.depth+1,parent:f.toolCallId,session:g,answer:i});return h.length?`${c}
107
+ Keys are not in the environment: every variable named like a key, a token or a secret is removed before the shell starts. An empty one is not an unset one — say which it was, and ask for what a command needs.`;a.s(["createWorkspaceTools",0,(a,e)=>{let i=!0===e.guide,j=(0,c.tool)({description:"Run a bash command.",inputSchema:d.default.object({command:d.default.string(),description:d.default.string().nullish().describe("One short line for the user: what this command does and why. Shown on their screen while it runs — not a restatement of the command.")}),execute:async({command:b},{abortSignal:c})=>{let d=await a.exec(b,{signal:c,env:e.env,timeoutMs:e.timeoutMs});return i?(i=!1,{...d,guide:h}):d}});if(!e.write)return{[f.TOOL_NAMES.bash]:j};let k=(0,c.tool)({description:"Write a whole file — what was there is gone. Parent directories are created.",inputSchema:d.default.object({path:d.default.string().describe("Relative to the working directory — under one of its folders — or absolute"),content:d.default.string(),description:d.default.string().nullish().describe("One short line for the user: what this file is. Shown on their screen next to the path.")}),execute:async({path:c,content:d})=>{let e,f=a.resolve(c),h=(0,g.writeRefusal)(f);return h?h:(await a.writeFile(c,d),`Wrote ${(e=(0,b.relative)(a.cwd,f))&&!e.startsWith("..")?e:f} (${d.split("\n").length} lines)`)}});return{[f.TOOL_NAMES.bash]:j,[f.TOOL_NAMES.write_file]:k}}])},641301,a=>{"use strict";var b=a.i(912714),c=a.i(750227),d=a.i(569572),e=a.i(821415);let f=a=>`${(0,e.botFolder)(a)}/memory`;async function g(a,i=d.BOT_MEMORY_LISTED){let j=f(a),k=(0,c.join)(e.WORKSPACE,j),l=await (0,b.readdir)(k).catch(()=>[]),m=(await Promise.all(l.filter(a=>!a.startsWith(".")).map(async a=>{let d=await (0,b.stat)((0,c.join)(k,a)).catch(()=>null);return d?.isFile()?{name:a,changed:d.mtimeMs,bytes:d.size}:null}))).filter(a=>null!==a).sort((a,b)=>b.changed-a.changed),n=await Promise.all(m.slice(0,i).map(async({name:a,changed:b,bytes:d})=>({file:a,path:`${j}/${a}`,line:await h((0,c.join)(k,a)),at:new Date(b),bytes:d})));return{folder:j,entries:n,total:m.length}}async function h(a){let c=await (0,b.open)(a,"r").catch(()=>null);if(!c)return"";try{let a=Buffer.alloc(1024),{bytesRead:b}=await c.read(a,0,1024,0),d=a.toString("utf8",0,b).split("\n").map(a=>a.trim()).filter(Boolean);if("---"===d[0]){let a=d.find(a=>a.startsWith("description:"));if(a)return a.slice(12).trim().replace(/^["']|["']$/g,"");let b=d.indexOf("---",1);return b>0?(d[b+1]??"").replace(/^#+\s*/,""):""}return(d[0]??"").replace(/^#+\s*/,"")}finally{await c.close()}}a.s(["botMemoryFolder",0,f,"listBotMemory",0,g])},654034,a=>a.a(async(b,c)=>{try{var d=a.i(47919),e=a.i(527990),f=a.i(569572),g=a.i(738131),h=a.i(875931),i=a.i(735502),j=a.i(978876),k=a.i(762008),l=a.i(446957),m=a.i(821415),n=a.i(176668),o=a.i(293480),p=a.i(8412),q=a.i(987674),r=a.i(182248),s=a.i(221214),t=a.i(84929),u=b([g,h,i,s,t]);[g,h,i,s,t]=u.then?(await u)():u;let E=f.BOT_RUN.steps;async function v(a,b){var c,p,u;let v,y,H,I,J,K,L,M,N,O=b.depth??0,P=b.parent??null,Q=await (0,s.findJobBot)(a.bot.trim()),R=Q?.name??a.bot.trim(),S=a=>b.emit({...a,bot:R,parent:P});if(!Q)return void await S({type:"error",message:`No bot named "${a.bot}". Use a name from the list.`,failure:"fatal"});let T="askedBy"in a&&b.taskId?await (0,t.listBotThread)(b.taskId,R):[];if(Q.disabled&&"request"in a&&!T.length)return void await S({type:"error",message:`${Q.name} is switched off. Use a name from the list.`,failure:"fatal"});if(b={...b,desks:b.desks??A()},"messages"in a)N=a.messages;else{let c=T.length?`## ${a.askedBy} → ${R}: the next request
108
108
 
109
- ${j=a,h.map(({question:a,answer:b})=>`(On the way ${j} asked you: "${a}" — you answered: "${b}")`).join("\n")}`:c}finally{g&&(0,m.closeHiddenBrowser)(g)}}})};return c}(W,{name:K,model:N.model,instructions:R.text,peers:R.peers,depth:I,chain:(0,i.chainOf)(U[0]),above:"askedBy"in a?a.above:[],options:b,emit:L}):W,Y={compact:null,interjections:[]},Z=(o=f.BOT_RUN.silenceMs,w=new AbortController,C=0,D=!1,E=()=>{clearTimeout(t),t=void 0,D||C>0||(t=setTimeout(()=>{w.abort(new DOMException(`The model sent nothing for ${Math.round(o/6e4)} minutes.`,"TimeoutError"))},o))},{signal:w.signal,touch:E,hold:()=>{C+=1,E()},release:()=>{C=Math.max(0,C-1),E()},end:()=>{D=!0,E()}}),$=0,_=new d.ToolLoopAgent({model:N.model,instructions:R.text,tools:X,stopWhen:[(0,d.stepCountIs)(z),A,(0,d.hasToolCall)(k.TOOL_NAMES.ask_thursday)],prepareStep:async({stepNumber:a,steps:c,messages:d})=>{let e=a<z-1?{}:{activeTools:[k.TOOL_NAMES.answer],toolChoice:{type:"tool",toolName:k.TOOL_NAMES.answer}};!e.activeTools&&V.left<=0&&(e={...e,activeTools:Object.keys(X).filter(a=>a!==k.TOOL_NAMES.ask_back)});let f=c.at(-1)?.usage.inputTokens??0,g=Math.max(f,d.reduce((a,b)=>a+(0,p.estimateTokens)("string"==typeof b.content?b.content:JSON.stringify(b.content))+4,0));$=g;let h=d;if(g>T&&d.length>2){Z.hold();let a=await v(N.model,X,d,{signal:b.signal,budget:T,instructions:R.text}).finally(Z.release);n.logger.debug(`compacted ${d.length} messages at ${g} tokens (budget ${T})`);let c=`${a.text}${await u(O?.id??null,d,P)}`;Y.compact={type:"compact",text:c,usage:a.usage,messages:d.length,tokens:g},h=[d[0],{role:"user",content:c}]}let i=a>0?b.notes?.()??[]:[];return(i.length&&(Y.interjections.push(...i),h=[...h,...i.map(a=>({role:"user",content:a}))]),h===d)?e:{...e,messages:h}}}),aa=(F=[],G=[],H=!1,{push(a){let b=G.shift();b?b(a):F.push(a)},take(){let a=F.shift();return a?Promise.resolve(a):H?Promise.resolve(null):new Promise(a=>G.push(a))},end(){for(let a of(H=!0,G.splice(0)))a(null)}}),ab=b.signal?AbortSignal.any([b.signal,Z.signal]):Z.signal;Z.touch();let ac=await _.stream({messages:U,abortSignal:ab,onStepEnd:a=>aa.push({messages:a.response.messages,usage:B(a.usage)})}),ad="",ae=null,af=null,ag=null,ah=-1,ai=null,aj=new Set,ak=a=>{let b=(0,h.modelFailureOf)(a),c=(0,h.modelErrorToString)(a);if("overflow"!==b)return{type:"error",message:c,failure:b};let d=Math.floor(Math.min(T,$||T)*f.BOT_RUN.overflowShrink);return{type:"error",message:c,failure:b,budget:Math.max(l.COMPACT_AT_MIN,d)}};ab.addEventListener("abort",()=>aa.end(),{once:!0});try{for await(let a of ac.fullStream)switch(Z.touch(),a.type){case"start-step":for(let a of(ah+=1,Y.compact&&(await L(Y.compact),Y.compact=null),Y.interjections.splice(0)))await L({type:"interjection",text:a});break;case"text-delta":ad+=a.text;break;case"text-end":{let a=ad.trim();if(ad="",!a)break;ae=a,await L({type:"text",text:a});break}case"tool-call":if(a.toolName===k.TOOL_NAMES.ask_thursday){let b=a.input;af={id:a.toolCallId,question:String(b.question??""),options:(0,r.optionsOf)(b.options)}}else if(a.toolName===k.TOOL_NAMES.answer){let b=a.input;ag={text:String(b.result??"").trim(),stopped:ah>=z-1}}a.providerExecuted||a.toolName===k.TOOL_NAMES.ask_thursday||(aj.add(a.toolCallId),Z.hold()),await L({type:"tool",id:a.toolCallId,name:a.toolName,input:a.input});break;case"tool-result":aj.delete(a.toolCallId)&&Z.release(),a.toolName===k.TOOL_NAMES.answer&&ag&&!(0,j.answerAccepted)(a.output)&&(ag={text:`${ag.text}
109
+ ${a.request.trim()}${a.context?.trim()?`
110
110
 
111
- ${s=a.output,"string"==typeof s?s:s&&"object"==typeof s&&"value"in s?"string"==typeof s.value?s.value:JSON.stringify(s.value??""):JSON.stringify(s??"")}`,stopped:!0}),await L({type:"tool-result",id:a.toolCallId,name:a.toolName,output:a.output});break;case"tool-error":aj.delete(a.toolCallId)&&Z.release(),await L({type:"tool-result",id:a.toolCallId,name:a.toolName,output:(0,h.modelErrorToString)(a.error),error:!0});break;case"finish-step":{ai=a.finishReason;let b=await aa.take();b&&await L({type:"step",...b,budget:T});break}case"abort":if(b.signal?.aborted)return;await L({type:"error",message:a.reason??"The model stopped sending.",failure:"transient"});return;case"error":await L(ak(a.error));return}}finally{aa.end(),Z.end()}try{await ac.response}catch(a){if(b.signal?.aborted)return;await L(ak(a));return}af?await L({type:"waiting",...af}):ag?await L({type:"answer",...ag}):"content-filter"===ai?await L({type:"error",message:"The provider's content filter stopped the response.",failure:"fatal"}):await L({type:"answer",text:ae??"Stopped without handing anything back.",stopped:null===ae||"length"===ai||ah>=z-1})}let A=({steps:a})=>a.at(-1)?.toolResults.some(a=>a.toolName===k.TOOL_NAMES.answer&&(0,j.answerAccepted)(a.output))??!1;async function u(a,b,c){try{let d=a?await (0,r.listWrittenPaths)(a):(0,r.writtenPathsIn)(b.map(a=>a.content)),e=await (0,m.filesOnDisk)(d,c);if(!e.length)return"";let g=e.slice(-f.BOT_RUN.compactFiles),h=e.length-g.length,i=g.map(a=>`- ${a}`);return h&&i.unshift(`- …and ${h} older ones`),`
111
+ ## What ${a.askedBy} passes on
112
+
113
+ ${a.context.trim()}`:""}`:(0,i.buildHandoff)({chain:a.chain,bots:[...a.above,R],did:a.context??null,part:a.request});N=[...D(T,b.taskId?await (0,t.listBorrowedTails)(b.taskId):void 0),{role:"user",content:c}],b.signal?.throwIfAborted(),await S({type:"request",content:c})}let U=await ((c=Q).provider&&c.model?(0,h.getTextModel)({provider:c.provider,model:c.model}):(0,h.resolveDefaultModel)().then(h.getTextModel)),V=b.taskId?await (0,t.findTask)(b.taskId):null,[W,X]=await Promise.all([b.taskId?(0,m.openJobScratch)(b.taskId,V?.label??"job"):null,(0,m.openBotFolder)(R)]),[Y,Z]=await Promise.all([(0,i.loadBotPrompt)(R,Q.systemPrompt,"askedBy"in a?{askedBy:a.askedBy,above:a.above,canBorrow:O<f.BOT_RUN.depth}:null,{scratch:W,own:X}),(0,g.loadTools)({target:"bot",bot:R,session:b.session??b.taskId,model:U})]),$=Math.min(await (0,h.compactBudget)(U.ref,Q.compactAt),("askedBy"in a?0:V?.contextBudget)||1/0),_={left:f.BOT_RUN.askBack},aa="askedBy"in a?function(a,b,c){let d={...a};delete d[k.TOOL_NAMES.ask_thursday];let{answer:f}=c;return f?{...d,[k.TOOL_NAMES.ask_back]:(0,e.tool)({description:j.askBackSpec.description,inputSchema:j.askBackSpec.parameters,execute:async({question:a})=>(b.left-=1,f(a))})}:d}(Z,_,b):Z,ab=O<f.BOT_RUN.depth?function(a,b){if(0===b.peers.length)return a;let c=new WeakMap,d={...a,[k.TOOL_NAMES.ask_bot]:(0,e.tool)({description:j.askBotSpec.description,inputSchema:j.askBotSpec.parameters,execute:async({bot:a,request:e,context:f},g)=>{let i=await (0,s.findJobBot)(a);if(!i)return`No bot named "${a}". Use a name from the list.`;if((a=i.name)===b.name||b.above.includes(a))return`${a} is already above you and waiting on this part. Use ask_back for a question, or pick another bot.`;let j=g.abortSignal??b.options.signal;return b.options.desks.run(b.name,a,j,async()=>{let i=b.options.taskId?(0,m.botBrowserSession)(b.options.taskId,a):null,k=[],l=c.get(g.messages);l||(l={messages:[...g.messages],answer:(0,r.PromiseChain)()},c.set(g.messages,l));let n=l;try{let c=await z({bot:a,request:e,context:f,askedBy:b.name,chain:b.chain,above:[...b.above,b.name]},{...b.options,signal:j,depth:b.depth+1,parent:g.toolCallId,session:i,notes:void 0,answer:c=>n.answer(async()=>{j?.throwIfAborted();let f=await C({model:b.model,instructions:b.instructions,tools:d,messages:n.messages,asked:{bot:a,request:e},question:c,signal:j});return n.messages.push({role:"user",content:`${a} asks about the part you handed over:
114
+
115
+ ${c}`},{role:"assistant",content:f.text}),await b.emit({type:"answered",question:c,...f}),k.push({question:c,answer:f.text}),f.text})});return k.length?`${c}
116
+
117
+ ${B(a,k)}`:c}catch(b){j?.throwIfAborted(),(0,o.publicError)([(0,h.modelErrorToString)(b),B(a,k)].filter(Boolean).join("\n\n"))}})}})};return d}(aa,{name:R,model:U.model,instructions:Y.text,peers:Y.peers,depth:O,chain:(0,i.chainOf)(N[0]),above:"askedBy"in a?a.above:[],options:b,emit:S}):aa,ac={compact:null,interjections:[]},ad=(p=f.BOT_RUN.silenceMs,y=new AbortController,H=0,I=!1,J=()=>{clearTimeout(v),v=void 0,I||H>0||(v=setTimeout(()=>{y.abort(new DOMException(`The model sent nothing for ${Math.round(p/6e4)} minutes.`,"TimeoutError"))},p))},{signal:y.signal,touch:J,hold:()=>{H+=1,J()},release:()=>{H=Math.max(0,H-1),J()},end:()=>{I=!0,J()}}),ae=0,af=new d.ToolLoopAgent({model:U.model,instructions:Y.text,tools:ab,stopWhen:[(0,d.stepCountIs)(E),F,(0,d.hasToolCall)(k.TOOL_NAMES.ask_thursday)],prepareStep:async({stepNumber:a,steps:c,messages:d})=>{let e=a<E-1?{}:{activeTools:[k.TOOL_NAMES.answer],toolChoice:{type:"tool",toolName:k.TOOL_NAMES.answer}};!e.activeTools&&_.left<=0&&(e={...e,activeTools:Object.keys(ab).filter(a=>a!==k.TOOL_NAMES.ask_back)});let f=c.at(-1)?.usage.inputTokens??0,g=Math.max(f,d.reduce((a,b)=>a+(0,q.estimateTokens)("string"==typeof b.content?b.content:JSON.stringify(b.content))+4,0));ae=g;let h=d;if(g>$&&d.length>2){ad.hold();let a=await x(U.model,ab,d,{signal:b.signal,budget:$,instructions:Y.text}).finally(ad.release);n.logger.debug(`compacted ${d.length} messages at ${g} tokens (budget ${$})`);let c=`${a.text}${await w(V?.id??null,d,W)}`;ac.compact={type:"compact",text:c,usage:a.usage,messages:d.length,tokens:g},h=[d[0],{role:"user",content:c}]}let i=a>0?b.notes?.()??[]:[];return(i.length&&(ac.interjections.push(...i),h=[...h,...i.map(a=>({role:"user",content:a}))]),h===d)?e:{...e,messages:h}}}),ag=(K=[],L=[],M=!1,{push(a){let b=L.shift();b?b(a):K.push(a)},take(){let a=K.shift();return a?Promise.resolve(a):M?Promise.resolve(null):new Promise(a=>L.push(a))},end(){for(let a of(M=!0,L.splice(0)))a(null)}}),ah=b.signal?AbortSignal.any([b.signal,ad.signal]):ad.signal;ad.touch();let ai=await af.stream({messages:N,abortSignal:ah,onStepEnd:a=>ag.push({messages:a.response.messages,usage:G(a.usage)})}),aj="",ak=null,al=null,am=null,an=-1,ao=null,ap=new Set,aq=a=>{let b=(0,h.modelFailureOf)(a),c=(0,h.modelErrorToString)(a);if("overflow"!==b)return{type:"error",message:c,failure:b};let d=Math.floor(Math.min($,ae||$)*f.BOT_RUN.overflowShrink);return{type:"error",message:c,failure:b,budget:Math.max(l.COMPACT_AT_MIN,d)}};ah.addEventListener("abort",()=>ag.end(),{once:!0});try{for await(let a of ai.fullStream)switch(ad.touch(),a.type){case"start-step":for(let a of(an+=1,ac.compact&&(await S(ac.compact),ac.compact=null),ac.interjections.splice(0)))await S({type:"interjection",text:a});break;case"text-delta":aj+=a.text;break;case"text-end":{let a=aj.trim();if(aj="",!a)break;ak=a,await S({type:"text",text:a});break}case"tool-call":if(a.toolName===k.TOOL_NAMES.ask_thursday){let b=a.input;al={id:a.toolCallId,question:String(b.question??""),options:(0,t.optionsOf)(b.options)}}else if(a.toolName===k.TOOL_NAMES.answer){let b=a.input;am={text:String(b.result??"").trim(),stopped:an>=E-1}}a.providerExecuted||a.toolName===k.TOOL_NAMES.ask_thursday||(ap.add(a.toolCallId),ad.hold()),await S({type:"tool",id:a.toolCallId,name:a.toolName,input:a.input});break;case"tool-result":ap.delete(a.toolCallId)&&ad.release(),a.toolName===k.TOOL_NAMES.answer&&am&&!(0,j.answerAccepted)(a.output)&&(am={text:`${am.text}
118
+
119
+ ${u=a.output,"string"==typeof u?u:u&&"object"==typeof u&&"value"in u?"string"==typeof u.value?u.value:JSON.stringify(u.value??""):JSON.stringify(u??"")}`,stopped:!0}),await S({type:"tool-result",id:a.toolCallId,name:a.toolName,output:a.output});break;case"tool-error":ap.delete(a.toolCallId)&&ad.release(),await S({type:"tool-result",id:a.toolCallId,name:a.toolName,output:(0,h.modelErrorToString)(a.error),error:!0});break;case"finish-step":{ao=a.finishReason;let b=await ag.take();b&&await S({type:"step",...b,budget:$});break}case"abort":if(b.signal?.aborted)return;await S({type:"error",message:a.reason??"The model stopped sending.",failure:"transient"});return;case"error":await S(aq(a.error));return}}finally{ag.end(),ad.end()}try{await ai.response}catch(a){if(b.signal?.aborted)return;await S(aq(a));return}al?await S({type:"waiting",...al}):am?await S({type:"answer",...am}):"content-filter"===ao?await S({type:"error",message:"The provider's content filter stopped the response.",failure:"fatal"}):await S({type:"answer",text:ak??"Stopped without handing anything back.",stopped:null===ak||"length"===ao||an>=E-1})}let F=({steps:a})=>a.at(-1)?.toolResults.some(a=>a.toolName===k.TOOL_NAMES.answer&&(0,j.answerAccepted)(a.output))??!1;async function w(a,b,c){try{let d=a?await (0,t.listWrittenPaths)(a):(0,t.writtenPathsIn)(b.map(a=>a.content)),e=await (0,m.filesOnDisk)(d,c);if(!e.length)return"";let g=e.slice(-f.BOT_RUN.compactFiles),h=e.length-g.length,i=g.map(a=>`- ${a}`);return h&&i.unshift(`- …and ${h} older ones`),`
112
120
 
113
121
  Files this job has on disk now — open one rather than fetching again what is in it:
114
- ${i.join("\n")}`}catch(a){return n.logger.warn("files under the summary could not be listed",a),""}}async function v(a,b,c,e){let f;try{return await w(a,b,c,e)}catch(a){if(e.signal?.aborted)throw a;f=a}if("overflow"===(0,h.modelFailureOf)(f)){let g=(0,d.pruneMessages)({messages:c,toolCalls:"before-last-4-messages",emptyMessages:"remove"});try{return await w(a,b,g,e)}catch(a){if(e.signal?.aborted)throw a;f=a}}throw Error(`Could not compact the context (${(0,h.modelErrorToString)(f)}).`,{cause:f})}async function w(a,b,c,e){let g,{text:h,usage:i}=await (0,d.generateText)({model:a,system:e.instructions,tools:b,toolChoice:"none",messages:[...c,{role:"user",content:(g=(a=>{let{min:b,max:c,perTokens:d}=f.BOT_RUN.summaryWords;return Math.min(c,Math.max(b,Math.round(a/d)))})(e.budget),`Compact your context. The first message above — the job, the call it came from, and anything handed over with it — stays exactly as it is. Everything after it is replaced by what you write now, and you carry on from that first message and this alone; nothing else above can be read again. Write it for a fresh copy of you that has your tools, your instructions and that first message, but has seen none of the rest.
122
+ ${i.join("\n")}`}catch(a){return n.logger.warn("files under the summary could not be listed",a),""}}async function x(a,b,c,e){let f;try{return await y(a,b,c,e)}catch(a){if(e.signal?.aborted)throw a;f=a}if("overflow"===(0,h.modelFailureOf)(f)){let g=(0,d.pruneMessages)({messages:c,toolCalls:"before-last-4-messages",emptyMessages:"remove"});try{return await y(a,b,g,e)}catch(a){if(e.signal?.aborted)throw a;f=a}}throw Error(`Could not compact the context (${(0,h.modelErrorToString)(f)}).`,{cause:f})}async function y(a,b,c,e){let g,{text:h,usage:i}=await (0,d.generateText)({model:a,system:e.instructions,tools:b,toolChoice:"none",messages:[...c,{role:"user",content:(g=(a=>{let{min:b,max:c,perTokens:d}=f.BOT_RUN.summaryWords;return Math.min(c,Math.max(b,Math.round(a/d)))})(e.budget),`Compact your context. The first message above — the job, the call it came from, and anything handed over with it — stays exactly as it is. Everything after it is replaced by what you write now, and you carry on from that first message and this alone; nothing else above can be read again. Write it for a fresh copy of you that has your tools, your instructions and that first message, but has seen none of the rest.
115
123
 
116
124
  Cover all of it, and prefer a fact over a description of a fact:
117
125
 
@@ -124,9 +132,9 @@ Cover all of it, and prefer a fact over a description of a fact:
124
132
 
125
133
  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.
126
134
 
127
- ${j}`,usage:B(i)}}let B=a=>({input:a.inputTokens??0,output:a.outputTokens??0});async function x(a,b){let c="",d=null;return await t(a,{...b,emit:async a=>{"answer"===a.type&&(c=a.stopped?`${a.text}
135
+ ${j}`,usage:G(i)}}let G=a=>({input:a.inputTokens??0,output:a.outputTokens??0});async function z(a,b){let c="",d=null;return await v(a,{...b,emit:async a=>{a.parent===(b.parent??null)&&"answer"===a.type&&(c=a.stopped?`${a.text}
128
136
 
129
- (As far as they got — they stopped before finishing.)`:a.text),"error"===a.type&&(d=a.message),await b.emit(a)}}),d&&(0,o.publicError)(d),c}async function y(a){try{let b,c,{text:e,usage:g}=await (0,d.generateText)({model:a.model,system:a.instructions,tools:a.tools,toolChoice:"none",messages:[...a.messages,{role:"user",content:(b=a.asked,c=a.question,`You handed one part of your job to ${b.bot}:
137
+ (As far as they got — they stopped before finishing.)`:a.text),a.parent===(b.parent??null)&&"error"===a.type&&(d=a.message),await b.emit(a)}}),b.signal?.throwIfAborted(),d&&(0,o.publicError)(d),c}function A(){let a=(0,p.createKeyedLock)(),b=new Map,c=new Set,d=(a,c,e=new Set)=>a===c||!e.has(a)&&(e.add(a),[...b.get(a)?.keys()??[]].some(a=>d(a,c,e)));return{async run(e,f,g,h){g?.throwIfAborted(),d(f,e)&&(0,o.publicError)(`${f} is waiting on your work. Finish this part before asking them, or choose another bot.`);let i=b.get(e)??new Map;b.set(e,i),i.set(f,(i.get(f)??0)+1);let j=a(f,async()=>(g?.throwIfAborted(),h()));c.add(j);try{return await j}finally{c.delete(j);let a=(i.get(f)??1)-1;a?i.set(f,a):i.delete(f),i.size||b.delete(e)}},async settle(){for(;c.size;)await Promise.allSettled([...c])}}}function B(a,b){return b.map(({question:b,answer:c})=>`(On the way ${a} asked you: "${b}" — you answered: "${c}")`).join("\n")}async function C(a){try{let b,c,{text:e,usage:g}=await (0,d.generateText)({model:a.model,system:a.instructions,tools:a.tools,toolChoice:"none",messages:[...a.messages,{role:"user",content:(b=a.asked,c=a.question,`You handed one part of your job to ${b.bot}:
130
138
 
131
139
  > ${b.request.trim()}
132
140
 
@@ -134,13 +142,13 @@ Before going on, they ask you:
134
142
 
135
143
  > ${c.trim()}
136
144
 
137
- Answer from what you already have — the request as it reached you, the call it came out of, what you found before asking them. A few lines, plain text, and nothing else: no tools run here. If it is not in what you have, say so rather than guess, and say which way to go without it.`)}],abortSignal:a.signal,timeout:f.BOT_RUN.silenceMs});return{text:e.trim()||"They had nothing to add. Go on with your best reading, and say what you assumed in what you hand back.",usage:B(g)}}catch(b){if(a.signal?.aborted)throw b;return n.logger.warn(`ask_back: ${(0,h.modelErrorToString)(b)}`),{text:`No answer came back (${(0,h.modelErrorToString)(b)}). Go on with your best reading, and say what you assumed in what you hand back.`,usage:l.NO_TOKENS}}}a.s(["resumeThread",0,function(a,b=new Map){let c=new Set;for(let b of a)if(("tool"===b.role||"assistant"===b.role)&&"string"!=typeof b.content)for(let a of b.content)"tool-result"===a.type&&c.add(a.toolCallId);let d=[],e=[];for(let f of a){if(e.length&&"tool"===f.role){d.push({...f,content:[...e,...f.content]}),e=[];continue}e.length&&(d.push({role:"tool",content:e}),e=[]),d.push(f),"assistant"===f.role&&"string"!=typeof f.content&&(e=f.content.flatMap(a=>"tool-call"!==a.type||c.has(a.toolCallId)?[]:[{type:"tool-result",toolCallId:a.toolCallId,toolName:a.toolName,output:{type:"text",value:function(a,b){let c=a.toolName===k.TOOL_NAMES.ask_bot?b.get(a.toolCallId):void 0;return c?`No result: the run was stopped before ${c.bot} answered, and they are not working on it any more. What they had written by then:
145
+ Answer from what you already have — the request as it reached you, the call it came out of, what you found before asking them. A few lines, plain text, and nothing else: no tools run here. If it is not in what you have, say so rather than guess, and say which way to go without it.`)}],abortSignal:a.signal,timeout:f.BOT_RUN.silenceMs});return{text:e.trim()||"They had nothing to add. Go on with your best reading, and say what you assumed in what you hand back.",usage:G(g)}}catch(b){if(a.signal?.aborted)throw b;return n.logger.warn(`ask_back: ${(0,h.modelErrorToString)(b)}`),{text:`No answer came back (${(0,h.modelErrorToString)(b)}). Go on with your best reading, and say what you assumed in what you hand back.`,usage:l.NO_TOKENS}}}function D(a,b=new Map){let c=new Set;for(let b of a)if(("tool"===b.role||"assistant"===b.role)&&"string"!=typeof b.content)for(let a of b.content)"tool-result"===a.type&&c.add(a.toolCallId);let d=[],e=[];for(let f of a){if(e.length&&"tool"===f.role){d.push({...f,content:[...e,...f.content]}),e=[];continue}e.length&&(d.push({role:"tool",content:e}),e=[]),d.push(f),"assistant"===f.role&&"string"!=typeof f.content&&(e=f.content.flatMap(a=>"tool-call"!==a.type||c.has(a.toolCallId)?[]:[{type:"tool-result",toolCallId:a.toolCallId,toolName:a.toolName,output:{type:"text",value:function(a,b){let c=a.toolName===k.TOOL_NAMES.ask_bot?b.get(a.toolCallId):void 0;return c?`No result: the run was stopped before ${c.bot} answered, and they are not working on it any more. What they had written by then:
138
146
 
139
147
  ${c.tail}
140
148
 
141
- Check what they did before relying on it, then finish the part yourself or hand them what is left.`:"No result: the run was stopped before this call returned. Check what it did before relying on it."}(a,b)}}]))}return e.length&&d.push({role:"tool",content:e}),d},"runBot",0,t]),c()}catch(a){c(a)}},!1),674986,a=>a.a(async(b,c)=>{try{var d=a.i(203469),e=a.i(569572),f=a.i(875931),g=a.i(735502),h=a.i(762008),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(654034),q=a.i(446957),r=a.i(84929),s=b([f,g,i,p,r]);[f,g,i,p,r]=s.then?(await s)():s;let H=globalThis.__botRuns??=new Map,I=globalThis.__botTaskLock??=(0,o.createKeyedLock)(),J=globalThis.__botResumes??=new Map;async function t(a){let{from:b,...c}=a,d=c.callId?await (0,i.listCallTurns)(c.callId,g.OPENING_TURNS):[],e=(0,g.buildTaskOpening)({bot:c.bot,request:c.request,conversation:d,from:b}),f=await (0,r.insertTask)({...c,opening:e});return D(f.id,{bot:c.bot,messages:[{role:"user",content:e}]}),f.id}async function u(a,b,c){let d=c?(0,q.tagSpeaker)(c,b):b;return I(a,async()=>{let b=await (0,r.findTask)(a);b||(0,n.publicError)("No such job.");let c=H.get(a);if(c&&"running"===b.status&&c.note(d))return void m.logger.debug(`task ${a}: interjection queued`);c&&(c.stop.abort(),await c.done),y(a);let e=await (0,r.listThread)(a),{reply:f,as:g}=function(a,b,c){var d;let e,f,g="waiting"===a.status?a.pending:null,i=g?.toolCallId?(d=g.toolCallId,e=new Set(c.flatMap(a=>"tool"===a.role?a.content.flatMap(a=>"tool-result"===a.type?[a.toolCallId]:[]):[])),f=c.findLast(a=>"assistant"===a.role&&"string"!=typeof a.content&&a.content.some(a=>"tool-call"===a.type&&a.toolCallId===d)),(f?.role==="assistant"&&"string"!=typeof f.content?f.content.flatMap(a=>"tool-call"===a.type&&a.toolName===h.TOOL_NAMES.ask_thursday?[a.toolCallId]:[]):[d]).filter(a=>!e.has(a))):[];return i.length?{as:"answer",reply:{role:"tool",content:i.map(a=>({type:"tool-result",toolCallId:a,toolName:h.TOOL_NAMES.ask_thursday,output:{type:"text",value:b}}))}}:{as:"running"===a.status?"interruption":"waiting"===a.status?"answer":"follow-up",reply:{role:"user",content:b}}}(b,d,e);m.logger.debug(`task ${a}: ${g}`),await (0,r.upsertMessage)(a,await (0,r.lastSeq)(a)+1,{bot:null,parent:null,...f}),await (0,r.updateTask)(a,{status:"running",outcome:null,pending:null,seen:!1,endedAt:null}),D(a,{bot:b.bot,messages:(0,p.resumeThread)([...e,f],await (0,r.listBorrowedTails)(a))})})}async function v(a){return I(a,async()=>{let b=await (0,r.findTask)(a);b||(0,n.publicError)("No such job."),b.endedAt&&(0,n.publicError)("That job has already ended."),y(a),H.get(a)?.stop.abort(),await (0,r.updateTask)(a,{status:"failed",outcome:"Cancelled.",pending:null,seen:!0,endedAt:new Date}),(0,k.closeJobShell)(a)})}async function w(a){return I(a,async()=>{let b=await (0,r.findTask)(a);y(a),H.get(a)?.stop.abort(),H.delete(a),(0,k.closeJobShell)(a);let c=await (0,r.deleteTask)(a);return c&&b&&await (0,k.removeJobScratch)(a,b.label),c})}async function x(){let a=await (0,r.deleteFinishedTasks)();for(let b of a)await (0,k.removeJobScratch)(b.id,b.label);return a.length}function y(a){clearTimeout(J.get(a)),J.delete(a)}async function z(a){d.presence.watching&&await I(a,async()=>{let b=await (0,r.findTask)(a);if(!b||"waiting"!==b.status||!b.pending?.auto||H.has(a))return;m.logger.debug(`task ${a}: picking back up`);let c=await (0,r.listThread)(a);await (0,r.updateTask)(a,{status:"running",outcome:null,pending:null,seen:!1,endedAt:null}),D(a,{bot:b.bot,messages:(0,p.resumeThread)(c,await (0,r.listBorrowedTails)(a))})})}async function A(a,b){let c=await (0,r.countStopsSinceSpoken)(a),d=c<e.BOT_RUN.autoResumes,f=e.BOT_RUN.retryAfterMs,g=d&&b.retry?f[Math.min(c,f.length-1)]:0;await B(a,(0,r.stopNote)(b.why)).catch(b=>m.logger.warn(`task ${a}: stop not written`,b)),await C(a,{status:"waiting",outcome:d?`${b.why} ${g?`It tries again in ${K(g)}.`:"It picks back up by itself."}`:`${b.why} It has stopped ${c+1} times in a row, so it waits for you. Everything it had done is still here.`,pending:{toolCallId:null,options:[q.TASK_CONTINUE],...d?{auto:!0,retryAt:Date.now()+g}:{}},...b.budget?{contextBudget:b.budget}:{},seen:!1,endedAt:null}),d&&(y(a),J.set(a,setTimeout(()=>{J.delete(a),z(a).catch(b=>m.logger.error(`task ${a}: resume`,b))},Math.max(0,g))))}globalThis.__botPausing??={current:Promise.resolve()};let K=a=>a<6e4?`${Math.round(a/1e3)} seconds`:`${Math.round(a/6e4)} minutes`;async function B(a,b){await (0,r.upsertMessage)(a,await (0,r.lastSeq)(a)+1,{bot:null,parent:null,role:"user",content:b,note:!0})}async function C(a,b){for(let c of[1e3,3e3,null])try{await (0,r.updateTask)(a,b);return}catch(b){if(null===c)throw b;m.logger.warn(`task ${a}: ending not written, trying again`,b),await new Promise(a=>setTimeout(a,c))}}function D(a,b){let c=new AbortController,d=()=>{},e=new Promise(a=>{d=a}),f=[];H.set(a,{stop:c,done:e,note:b=>!!H.has(a)&&(f.push(b),!0)}),E(a,b,c.signal,f).catch(b=>{m.logger.error(`task ${a}`,b)}).finally(d)}class L{taskId;seq;steps;closed;constructor(a,b){this.taskId=a,this.steps=new Map,this.closed=!1,this.seq=b}close(){this.closed=!0}async note(a){await (0,r.upsertMessage)(this.taskId,++this.seq,{bot:null,parent:null,role:"user",content:a,note:!0})}step(a){let b=`${a.bot} ${a.parent??""}`,c=this.steps.get(b);return c||(c={assistant:null,tool:null,parts:{assistant:[],tool:[]}},this.steps.set(b,c)),c}write(a,b,c,d={}){let e={bot:b.bot,parent:b.parent,role:c.role,content:c.content,compact:d.compact??!1,note:d.note??!1};return(0,r.upsertMessage)(this.taskId,a,e)}async on(a){if(this.closed)return;let b=this.step(a);switch(a.type){case"text":return b.assistant??=++this.seq,b.parts.assistant.push({type:"text",text:a.text}),this.write(b.assistant,a,{role:"assistant",content:b.parts.assistant});case"tool":return b.assistant??=++this.seq,b.parts.assistant.push({type:"tool-call",toolCallId:a.id,toolName:a.name,input:a.input}),this.write(b.assistant,a,{role:"assistant",content:b.parts.assistant});case"tool-result":return b.assistant??=++this.seq,b.tool??=++this.seq,b.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.write(b.tool,a,{role:"tool",content:b.parts.tool});case"step":{let c=[b.assistant,b.tool];this.steps.delete(`${a.bot} ${a.parent??""}`);let d=new Set;for(let[b,e]of a.messages.entries()){let f=c[b]??++this.seq;d.add(f),await this.write(f,a,e)}let e=c.filter(a=>null!==a&&!d.has(a));e.length&&await (0,r.deleteMessages)(this.taskId,e);return}case"compact":return this.write(++this.seq,a,{role:"user",content:a.text},{compact:!0,note:!0});case"interjection":return this.write(++this.seq,a,{role:"user",content:a.text});default:return}}}async function E(a,b,c,g){let h=new L(a,await (0,r.lastSeq)(a)),i=null,l=null;try{await (0,p.runBot)(b,{signal:c,taskId:a,notes:()=>g.splice(0),emit:async b=>{await h.on(b),"step"===b.type&&await (0,r.addTaskUsage)(a,b.usage,b.parent?null:{tokens:b.usage.input,budget:b.budget}),("compact"===b.type||"answered"===b.type)&&await (0,r.addTaskUsage)(a,b.usage),b.parent||("waiting"===b.type?i={status:"waiting",outcome:b.question,pending:{toolCallId:b.id,options:b.options}}:"answer"===b.type?i=b.stopped?{status:"waiting",outcome:b.text,pending:{toolCallId:null,options:[q.TASK_CONTINUE]}}:{status:"done",outcome:b.text,pending:null}:"error"===b.type&&(l={message:b.message,failure:b.failure,budget:b.budget},i={status:"failed",outcome:F(b.message),pending:null}))}})}catch(a){l={message:(0,f.modelErrorToString)(a),failure:(0,f.modelFailureOf)(a)},i={status:"failed",outcome:F(l.message),pending:null}}finally{h.close(),H.delete(a)}if(c.aborted)return;let n=i??{status:"failed",outcome:"Stopped without handing anything back.",pending:null},o=l&&"fatal"!==l.failure?l:null;try{o?await A(a,{why:"overflow"===o.failure?`The model refused the context as too long (${o.message}); it is compacted before going on.`:`The model call failed (${o.message}).`,retry:"transient"===o.failure,budget:o.budget}):("failed"===n.status&&await h.note(`The run stopped here: ${l?.message??n.outcome}`).catch(b=>m.logger.warn(`task ${a}: break not written`,b)),await C(a,{...n,seen:!1,endedAt:"waiting"===n.status?null:new Date}))}catch(b){m.logger.error(`task ${a}: could not record how it ended`,b);return}o||"waiting"===n.status?(0,k.pruneJobFiles)():(0,k.closeHiddenBrowser)(a);let s=await (0,r.findTask)(a);if(s){if(g.length){let b=g.splice(0).join("\n\n");m.logger.debug(`task ${a}: interjection after the run ended — resuming`),u(a,b).catch(b=>{m.logger.error(`task ${a}: late interjection`,b)});return}if(!o&&(await G(s.label,n),"done"===n.status)){var t;let b,c=(t=n.outcome,(b=(0,j.pathsIn)(t)).find(a=>a.startsWith(`${e.PATHS.artifacts}/`))??b[0]??null);c&&d.appEvents.emit({type:"artifact",taskId:a,label:s.label,path:c})}}}function F(a){return`The run broke: ${a}
149
+ Check what they did before relying on it, then finish the part yourself or hand them what is left.`:"No result: the run was stopped before this call returned. Check what it did before relying on it."}(a,b)}}]))}return e.length&&d.push({role:"tool",content:e}),d}a.s(["createBotDesks",0,A,"resumeThread",0,D,"runBot",0,v]),c()}catch(a){c(a)}},!1),674986,a=>a.a(async(b,c)=>{try{var d=a.i(203469),e=a.i(569572),f=a.i(875931),g=a.i(735502),h=a.i(762008),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(654034),q=a.i(446957),r=a.i(84929),s=b([f,g,i,p,r]);[f,g,i,p,r]=s.then?(await s)():s;let I=globalThis.__botRuns??=new Map,J=globalThis.__botTaskLock??=(0,o.createKeyedLock)(),K=globalThis.__botResumes??=new Map;async function t(a){let{from:b,...c}=a,d=c.callId?await (0,i.listCallTurns)(c.callId,g.OPENING_TURNS):[],e=(0,g.buildTaskOpening)({bot:c.bot,request:c.request,conversation:d,from:b}),f=await (0,r.insertTask)({...c,opening:e});return E(f.id,{bot:c.bot,messages:[{role:"user",content:e}]}),f.id}async function u(a,b,c){let d=c?(0,q.tagSpeaker)(c,b):b;return J(a,async()=>{let b=await (0,r.findTask)(a);b||(0,n.publicError)("No such job.");let c=I.get(a);if(c&&"running"===b.status&&c.note(d))return void m.logger.debug(`task ${a}: interjection queued`);c&&(c.stop.abort(),await c.done),z(a);let e=await (0,r.listThread)(a),{reply:f,as:g}=function(a,b,c){var d;let e,f,g="waiting"===a.status?a.pending:null,i=g?.toolCallId?(d=g.toolCallId,e=new Set(c.flatMap(a=>"tool"===a.role?a.content.flatMap(a=>"tool-result"===a.type?[a.toolCallId]:[]):[])),f=c.findLast(a=>"assistant"===a.role&&"string"!=typeof a.content&&a.content.some(a=>"tool-call"===a.type&&a.toolCallId===d)),(f?.role==="assistant"&&"string"!=typeof f.content?f.content.flatMap(a=>"tool-call"===a.type&&a.toolName===h.TOOL_NAMES.ask_thursday?[a.toolCallId]:[]):[d]).filter(a=>!e.has(a))):[];return i.length?{as:"answer",reply:{role:"tool",content:i.map(a=>({type:"tool-result",toolCallId:a,toolName:h.TOOL_NAMES.ask_thursday,output:{type:"text",value:b}}))}}:{as:"running"===a.status?"interruption":"waiting"===a.status?"answer":"follow-up",reply:{role:"user",content:b}}}(b,d,e);m.logger.debug(`task ${a}: ${g}`),await (0,r.upsertMessage)(a,await (0,r.lastSeq)(a)+1,{bot:null,parent:null,...f}),await (0,r.updateTask)(a,{status:"running",outcome:null,pending:null,seen:!1,endedAt:null}),E(a,{bot:b.bot,messages:(0,p.resumeThread)([...e,f],await (0,r.listBorrowedTails)(a))})})}async function v(a){return J(a,async()=>{let b=await (0,r.findTask)(a);b||(0,n.publicError)("No such job."),b.endedAt&&(0,n.publicError)("That job has already ended."),z(a);let c=I.get(a);c?.stop.abort(),await (0,r.updateTask)(a,{status:"failed",outcome:"Cancelled.",pending:null,seen:!0,endedAt:new Date}),await c?.done,await (0,k.closeJobShell)(a)})}async function w(a){return J(a,()=>x(a))}async function x(a){let b=await (0,r.findTask)(a);z(a);let c=I.get(a);c?.stop.abort(),await c?.done,await (0,k.closeJobShell)(a);let d=await (0,r.deleteTask)(a);return d&&b&&await (0,k.removeJobScratch)(a,b.label),d}async function y(){let a=0;for(let b of(await (0,r.listTaskFolders)()))("done"===b.status||"failed"===b.status)&&await J(b.id,async()=>{let c=await (0,r.findTask)(b.id);(c?.status==="done"||c?.status==="failed")&&await x(b.id)&&(a+=1)});return a}function z(a){clearTimeout(K.get(a)),K.delete(a)}async function A(a){d.presence.watching&&await J(a,async()=>{let b=await (0,r.findTask)(a);if(!b||"waiting"!==b.status||!b.pending?.auto||I.has(a))return;m.logger.debug(`task ${a}: picking back up`);let c=await (0,r.listThread)(a);await (0,r.updateTask)(a,{status:"running",outcome:null,pending:null,seen:!1,endedAt:null}),E(a,{bot:b.bot,messages:(0,p.resumeThread)(c,await (0,r.listBorrowedTails)(a))})})}async function B(a,b){let c=await (0,r.countStopsSinceSpoken)(a),d=c<e.BOT_RUN.autoResumes,f=e.BOT_RUN.retryAfterMs,g=d&&b.retry?f[Math.min(c,f.length-1)]:0;await C(a,(0,r.stopNote)(b.why)).catch(b=>m.logger.warn(`task ${a}: stop not written`,b)),await D(a,{status:"waiting",outcome:d?`${b.why} ${g?`It tries again in ${L(g)}.`:"It picks back up by itself."}`:`${b.why} It has stopped ${c+1} times in a row, so it waits for you. Everything it had done is still here.`,pending:{toolCallId:null,options:[q.TASK_CONTINUE],...d?{auto:!0,retryAt:Date.now()+g}:{}},...b.budget?{contextBudget:b.budget}:{},seen:!1,endedAt:null}),d&&(z(a),K.set(a,setTimeout(()=>{K.delete(a),A(a).catch(b=>m.logger.error(`task ${a}: resume`,b))},Math.max(0,g))))}globalThis.__botPausing??={current:Promise.resolve()};let L=a=>a<6e4?`${Math.round(a/1e3)} seconds`:`${Math.round(a/6e4)} minutes`;async function C(a,b){await (0,r.upsertMessage)(a,await (0,r.lastSeq)(a)+1,{bot:null,parent:null,role:"user",content:b,note:!0})}async function D(a,b){for(let c of[1e3,3e3,null])try{await (0,r.updateTask)(a,b);return}catch(b){if(null===c)throw b;m.logger.warn(`task ${a}: ending not written, trying again`,b),await new Promise(a=>setTimeout(a,c))}}function E(a,b){let c=new AbortController,d=()=>{},e=new Promise(a=>{d=a}),f=[];I.set(a,{stop:c,done:e,note:b=>!!I.has(a)&&(f.push(b),!0)}),F(a,b,c.signal,f).catch(b=>{m.logger.error(`task ${a}`,b)}).finally(d)}class M{taskId;seq;steps;closed;constructor(a,b){this.taskId=a,this.steps=new Map,this.closed=!1,this.seq=b}close(){this.closed=!0}async note(a){await (0,r.upsertMessage)(this.taskId,++this.seq,{bot:null,parent:null,role:"user",content:a,note:!0})}step(a){let b=`${a.bot} ${a.parent??""}`,c=this.steps.get(b);return c||(c={assistant:null,tool:null,parts:{assistant:[],tool:[]}},this.steps.set(b,c)),c}write(a,b,c,d={}){let e={bot:b.bot,parent:b.parent,role:c.role,content:c.content,compact:d.compact??!1,note:d.note??!1};return(0,r.upsertMessage)(this.taskId,a,e)}async on(a){if(this.closed)return;let b=this.step(a);switch(a.type){case"request":return this.write(++this.seq,a,{role:"user",content:a.content});case"text":return b.assistant??=++this.seq,b.parts.assistant.push({type:"text",text:a.text}),this.write(b.assistant,a,{role:"assistant",content:b.parts.assistant});case"tool":return b.assistant??=++this.seq,b.parts.assistant.push({type:"tool-call",toolCallId:a.id,toolName:a.name,input:a.input}),this.write(b.assistant,a,{role:"assistant",content:b.parts.assistant});case"tool-result":return b.assistant??=++this.seq,b.tool??=++this.seq,b.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.write(b.tool,a,{role:"tool",content:b.parts.tool});case"step":{let c=[b.assistant,b.tool];this.steps.delete(`${a.bot} ${a.parent??""}`);let d=new Set;for(let[b,e]of a.messages.entries()){let f=c[b]??++this.seq;d.add(f),await this.write(f,a,e)}let e=c.filter(a=>null!==a&&!d.has(a));e.length&&await (0,r.deleteMessages)(this.taskId,e);return}case"compact":return this.write(++this.seq,a,{role:"user",content:a.text},{compact:!0,note:!0});case"interjection":return this.write(++this.seq,a,{role:"user",content:a.text});default:return}}}async function F(a,b,c,g){let h=new M(a,await (0,r.lastSeq)(a)),i=(0,p.createBotDesks)(),l=null,n=null;try{await (0,p.runBot)(b,{signal:c,taskId:a,desks:i,notes:()=>g.splice(0),emit:async b=>{await h.on(b),"step"===b.type&&await (0,r.addTaskUsage)(a,b.usage,b.parent?null:{tokens:b.usage.input,budget:b.budget}),("compact"===b.type||"answered"===b.type)&&await (0,r.addTaskUsage)(a,b.usage),b.parent||("waiting"===b.type?l={status:"waiting",outcome:b.question,pending:{toolCallId:b.id,options:b.options}}:"answer"===b.type?l=b.stopped?{status:"waiting",outcome:b.text,pending:{toolCallId:null,options:[q.TASK_CONTINUE]}}:{status:"done",outcome:b.text,pending:null}:"error"===b.type&&(n={message:b.message,failure:b.failure,budget:b.budget},l={status:"failed",outcome:G(b.message),pending:null}))}})}catch(a){n={message:(0,f.modelErrorToString)(a),failure:(0,f.modelFailureOf)(a)},l={status:"failed",outcome:G(n.message),pending:null}}finally{await i.settle(),h.close(),I.delete(a)}if(c.aborted)return;let o=l??{status:"failed",outcome:"Stopped without handing anything back.",pending:null},s=n&&"fatal"!==n.failure?n:null;try{s?await B(a,{why:"overflow"===s.failure?`The model refused the context as too long (${s.message}); it is compacted before going on.`:`The model call failed (${s.message}).`,retry:"transient"===s.failure,budget:s.budget}):("failed"===o.status&&await h.note(`The run stopped here: ${n?.message??o.outcome}`).catch(b=>m.logger.warn(`task ${a}: break not written`,b)),await D(a,{...o,seen:!1,endedAt:"waiting"===o.status?null:new Date}))}catch(b){m.logger.error(`task ${a}: could not record how it ended`,b);return}(0,k.pruneJobFiles)();let t=await (0,r.findTask)(a);if(t){if(g.length){let b=g.splice(0).join("\n\n");m.logger.debug(`task ${a}: interjection after the run ended — resuming`),u(a,b).catch(b=>{m.logger.error(`task ${a}: late interjection`,b)});return}if(!s&&(await H(t.label,o),"done"===o.status)){var v;let b,c=(v=o.outcome,(b=(0,j.pathsIn)(v)).find(a=>a.startsWith(`${e.PATHS.artifacts}/`))??b[0]??null);c&&d.appEvents.emit({type:"artifact",taskId:a,label:t.label,path:c})}}}function G(a){return`The run broke: ${a}
142
150
 
143
- Everything it had done is still here — answer to pick it back up.`}async function G(a,b){if(0!==d.appEventStream.watchers&&await (0,i.isAnyCallLive)())return;let c="waiting"===b.status?`${a} — needs you`:a;(0,l.desktopNotify)(c,b.outcome)}a.s(["answerTask",0,u,"cancelTask",0,v,"removeFinishedTasks",0,x,"removeTask",0,w,"startTask",0,t]),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"},{path:"inbox",of:"Nowhere obvious yet"}],g="inbox",h=f.filter(a=>!a.path.endsWith("/")).map(a=>a.path),i=f.filter(a=>a.path.endsWith("/")).map(a=>a.path.slice(0,-1)),j=RegExp(`^(?:${h.join("|")}|(?:${i.join("|")})/.+)$`),k=["profile","preferences"],l=[...k,g];a.s(["APP_NAMED_NOTES",0,l,"MEMORY_ALWAYS_LISTED",0,k,"MEMORY_INBOX",0,g,"MEMORY_PATHS",0,f,"appNoteLine",0,a=>f.find(b=>b.path===a)?.of??null,"isAlwaysListed",0,a=>k.includes(a),"isAppNamed",0,a=>l.includes(a),"isMemoryPath",0,a=>j.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`---
151
+ Everything it had done is still here — answer to pick it back up.`}async function H(a,b){if(0!==d.appEventStream.watchers&&await (0,i.isAnyCallLive)())return;let c="waiting"===b.status?`${a} — needs you`:a;(0,l.desktopNotify)(c,b.outcome)}a.s(["answerTask",0,u,"cancelTask",0,v,"removeFinishedTasks",0,y,"removeTask",0,w,"startTask",0,t]),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"},{path:"inbox",of:"Nowhere obvious yet"}],g="inbox",h=f.filter(a=>!a.path.endsWith("/")).map(a=>a.path),i=f.filter(a=>a.path.endsWith("/")).map(a=>a.path.slice(0,-1)),j=RegExp(`^(?:${h.join("|")}|(?:${i.join("|")})/.+)$`),k=["profile","preferences"],l=[...k,g];a.s(["APP_NAMED_NOTES",0,l,"MEMORY_ALWAYS_LISTED",0,k,"MEMORY_INBOX",0,g,"MEMORY_PATHS",0,f,"appNoteLine",0,a=>f.find(b=>b.path===a)?.of??null,"isAlwaysListed",0,a=>k.includes(a),"isAppNamed",0,a=>l.includes(a),"isMemoryPath",0,a=>j.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`---
144
152
  ${(0,d.stringify)(a).trim()}
145
153
  ---
146
154
 
@@ -37,6 +37,6 @@ Photos in one step too: every \`curl -o\` in a single \`bash\` call, into the tr
37
37
 
38
38
  The page is the deliverable: the days in order, the map under each, the photos with whose page they came from, and the facts that decide what to pack. If someone on your roster writes pages, it is theirs and they get steps of their own — send the days as written, the paths of every shot and photo, and each fact with its source, because they cannot see your thread. If nobody does, write it yourself with the \`interactive-page\` skill.
39
39
 
40
- Answer with the folder under \`artifacts/\` and what is in it: the page, a map per day, the pictures.`}],f=e.filter(a=>a.recommended);a.s(["BOT_SEEDS",0,e,"RECOMMENDED_SEEDS",0,f,"rollSeedColors",0,()=>(0,d.randomMarkColors)(e.length)])},754257,a=>{"use strict";var b=a.i(405050);let c=(0,b.createServerReference)("7fbba25fbc238da78607616372d2248ff6f07a1267",b.callServer,void 0,b.findSourceMapURL,"createSeedBotsAction");a.s(["createSeedBotsAction",0,c])},478978,a=>{"use strict";var b=a.i(61876);let c=[...new Set(Object.values(b.SPEACH_MODEL_PROVIDERS).map(a=>a.apiKeyName))],d={image:"IMAGE_MODEL",video:"VIDEO_MODEL",speech:"SPEECH_MODEL",transcription:"TRANSCRIPTION_MODEL"},e={image:{label:"Image model",hint:"What bots draw with"},video:{label:"Video model",hint:"What bots film with — minutes a clip"},speech:{label:"Speech model",hint:"What reads text aloud into a file"},transcription:{label:"Transcription model",hint:"What turns a recording into text"}},f="EXA_API_KEY",g={key:"DEFAULT_MODEL",label:"Default model",hint:"What a bot thinks with until it picks its own",text:!0,choices:b.TEXT_MODEL_PROVIDER_LIST.flatMap(a=>a.suggestModels.map(b=>({value:`${a.id}/${b.id}`,label:`${a.label} \xb7 ${b.label}`,needs:a.apiKeyName})))},h=a=>c.includes(a.apiKeyName),i=a=>({key:a.apiKeyName,label:a.label,provider:a.id,signIn:a.signIn}),j=[{id:"voice",title:"voice",hint:"calls run on one of these",section:"keys",require:"any",note:"one is required",entries:b.TEXT_MODEL_PROVIDER_LIST.filter(h).map(i)},{id:"text",title:"models",hint:"what bots think with — add any, or none",section:"keys",require:"none",entries:b.TEXT_MODEL_PROVIDER_LIST.filter(a=>!h(a)).map(i)},{id:"search",title:"search",hint:"how bots look things up — one key, or their own model's",section:"keys",require:"none",entries:[{key:f,label:"Exa",hint:"web search in one call — dashboard.exa.ai"}]},{id:"bots",title:"Bots",hint:"what a bot runs on when it has not picked its own",section:"models",require:"none",entries:[g]},{id:"studio",title:"Studio",hint:"what a bot draws, films and speaks with — off until you pick one",section:"models",require:"none",entries:Object.keys(d).map(a=>({key:d[a],...e[a],kind:a,choices:b.MEDIA_MODEL_PROVIDER_LIST.flatMap(b=>b.models[a].map(a=>({value:`${b.id}/${a.id}`,label:`${b.label} \xb7 ${a.label}`,needs:b.apiKeyName})))}))}];Object.fromEntries(j.flatMap(a=>a.entries).map(a=>[a.key,a])),j.flatMap(a=>a.entries.map(a=>a.key)),Object.fromEntries(j.flatMap(a=>a.entries).filter(a=>a.choices?.length).map(a=>[a.key,a.choices])),a.s(["CONFIG_GROUPS",0,j,"EXA_API_KEY",0,f,"MEDIA_MODEL_KEYS",0,d,"groupSatisfied",0,function(a,b){return"none"===a.require||(a.requireKeys??a.entries.map(a=>a.key)).some(b)},"isConfigSet",0,function(a,b){return a?.some(a=>a.key===b&&a.set)??!1},"mediaModelWords",0,a=>`${"image"===a?"an":"a"} ${a} model`])},28996,a=>{"use strict";let b=(0,a.i(920226).create)()(a=>({open:!1,section:"thursday",show:b=>a(a=>({open:!0,section:b??a.section})),hide:()=>a({open:!1}),pick:b=>a({section:b})}));a.s(["openSettings",0,a=>b.getState().show(a),"useSettingsStore",0,b])},616682,a=>{"use strict";a.s(["COMMON_VALIDATE",0,{name:{max:16},shortDescription:{max:60},description:{max:100},prompt:{max:4e3}}])},425256,a=>{"use strict";var b=a.i(164831);let c={name:"rotate-ccw-clock",size:24,node:[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]],aliases:["history"]};c.node;let d=(0,b.default)(c);a.s(["History",0,d],425256)},924613,a=>{"use strict";var b=a.i(164831);let c={name:"wrench",size:24,node:[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z",key:"1ngwbx"}]]};c.node;let d=(0,b.default)(c);a.s(["Wrench",0,d],924613)},920226,a=>{"use strict";var b=a.i(572131);let c=a=>{let b,c=new Set,d=(a,d)=>{let e="function"==typeof a?a(b):a;if(!Object.is(e,b)){let a=b;b=(null!=d?d:"object"!=typeof e||null===e)?e:Object.assign({},b,e),c.forEach(c=>c(b,a))}},e=()=>b,f={setState:d,getState:e,getInitialState:()=>g,subscribe:a=>(c.add(a),()=>c.delete(a))},g=b=a(d,e,f);return f},d=a=>{let d=a?c(a):c,e=a=>(function(a,c=a=>a){let d=b.default.useSyncExternalStore(a.subscribe,b.default.useCallback(()=>c(a.getState()),[a,c]),b.default.useCallback(()=>c(a.getInitialState()),[a,c]));return b.default.useDebugValue(d),d})(d,a);return Object.assign(e,d),e};a.s(["create",0,a=>a?d(a):d],920226)}];
40
+ Answer with the folder under \`artifacts/\` and what is in it: the page, a map per day, the pictures.`}],f=e.filter(a=>a.recommended);a.s(["BOT_SEEDS",0,e,"RECOMMENDED_SEEDS",0,f,"rollSeedColors",0,()=>(0,d.randomMarkColors)(e.length)])},629081,a=>{"use strict";var b=a.i(405050);let c=(0,b.createServerReference)("7fc17622031143b747ecc9e3a634af93cecf857419",b.callServer,void 0,b.findSourceMapURL,"createSeedBotsAction");a.s(["createSeedBotsAction",0,c])},478978,a=>{"use strict";var b=a.i(61876);let c=[...new Set(Object.values(b.SPEACH_MODEL_PROVIDERS).map(a=>a.apiKeyName))],d={image:"IMAGE_MODEL",video:"VIDEO_MODEL",speech:"SPEECH_MODEL",transcription:"TRANSCRIPTION_MODEL"},e={image:{label:"Image model",hint:"What bots draw with"},video:{label:"Video model",hint:"What bots film with — minutes a clip"},speech:{label:"Speech model",hint:"What reads text aloud into a file"},transcription:{label:"Transcription model",hint:"What turns a recording into text"}},f="EXA_API_KEY",g={key:"DEFAULT_MODEL",label:"Default model",hint:"What a bot thinks with until it picks its own",text:!0,choices:b.TEXT_MODEL_PROVIDER_LIST.flatMap(a=>a.suggestModels.map(b=>({value:`${a.id}/${b.id}`,label:`${a.label} \xb7 ${b.label}`,needs:a.apiKeyName})))},h=a=>c.includes(a.apiKeyName),i=a=>({key:a.apiKeyName,label:a.label,provider:a.id,signIn:a.signIn}),j=[{id:"voice",title:"voice",hint:"calls run on one of these",section:"keys",require:"any",note:"one is required",entries:b.TEXT_MODEL_PROVIDER_LIST.filter(h).map(i)},{id:"text",title:"models",hint:"what bots think with — add any, or none",section:"keys",require:"none",entries:b.TEXT_MODEL_PROVIDER_LIST.filter(a=>!h(a)).map(i)},{id:"search",title:"search",hint:"how bots look things up — one key, or their own model's",section:"keys",require:"none",entries:[{key:f,label:"Exa",hint:"web search in one call — dashboard.exa.ai"}]},{id:"bots",title:"Bots",hint:"what a bot runs on when it has not picked its own",section:"models",require:"none",entries:[g]},{id:"studio",title:"Studio",hint:"what a bot draws, films and speaks with — off until you pick one",section:"models",require:"none",entries:Object.keys(d).map(a=>({key:d[a],...e[a],kind:a,choices:b.MEDIA_MODEL_PROVIDER_LIST.flatMap(b=>b.models[a].map(a=>({value:`${b.id}/${a.id}`,label:`${b.label} \xb7 ${a.label}`,needs:b.apiKeyName})))}))}];Object.fromEntries(j.flatMap(a=>a.entries).map(a=>[a.key,a])),j.flatMap(a=>a.entries.map(a=>a.key)),Object.fromEntries(j.flatMap(a=>a.entries).filter(a=>a.choices?.length).map(a=>[a.key,a.choices])),a.s(["CONFIG_GROUPS",0,j,"EXA_API_KEY",0,f,"MEDIA_MODEL_KEYS",0,d,"groupSatisfied",0,function(a,b){return"none"===a.require||(a.requireKeys??a.entries.map(a=>a.key)).some(b)},"isConfigSet",0,function(a,b){return a?.some(a=>a.key===b&&a.set)??!1},"mediaModelWords",0,a=>`${"image"===a?"an":"a"} ${a} model`])},28996,a=>{"use strict";let b=(0,a.i(920226).create)()(a=>({open:!1,section:"thursday",show:b=>a(a=>({open:!0,section:b??a.section})),hide:()=>a({open:!1}),pick:b=>a({section:b})}));a.s(["openSettings",0,a=>b.getState().show(a),"useSettingsStore",0,b])},616682,a=>{"use strict";a.s(["COMMON_VALIDATE",0,{name:{max:16},shortDescription:{max:60},description:{max:100},prompt:{max:4e3}}])},425256,a=>{"use strict";var b=a.i(164831);let c={name:"rotate-ccw-clock",size:24,node:[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]],aliases:["history"]};c.node;let d=(0,b.default)(c);a.s(["History",0,d],425256)},924613,a=>{"use strict";var b=a.i(164831);let c={name:"wrench",size:24,node:[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z",key:"1ngwbx"}]]};c.node;let d=(0,b.default)(c);a.s(["Wrench",0,d],924613)},920226,a=>{"use strict";var b=a.i(572131);let c=a=>{let b,c=new Set,d=(a,d)=>{let e="function"==typeof a?a(b):a;if(!Object.is(e,b)){let a=b;b=(null!=d?d:"object"!=typeof e||null===e)?e:Object.assign({},b,e),c.forEach(c=>c(b,a))}},e=()=>b,f={setState:d,getState:e,getInitialState:()=>g,subscribe:a=>(c.add(a),()=>c.delete(a))},g=b=a(d,e,f);return f},d=a=>{let d=a?c(a):c,e=a=>(function(a,c=a=>a){let d=b.default.useSyncExternalStore(a.subscribe,b.default.useCallback(()=>c(a.getState()),[a,c]),b.default.useCallback(()=>c(a.getInitialState()),[a,c]));return b.default.useDebugValue(d),d})(d,a);return Object.assign(e,d),e};a.s(["create",0,a=>a?d(a):d],920226)}];
41
41
 
42
- //# sourceMappingURL=_0ilna52._.js.map
42
+ //# sourceMappingURL=_1nj4niv._.js.map
@@ -0,0 +1,3 @@
1
+ module.exports=[964665,a=>a.a(async(b,c)=>{try{var d=a.i(187924),e=a.i(707963),f=a.i(168370),g=a.i(998697),h=a.i(572327),i=a.i(707938),j=a.i(483138),k=a.i(844561),l=a.i(71215),m=a.i(595775),n=a.i(649268),o=a.i(239025),p=a.i(951675),q=a.i(586446),r=a.i(572131),s=a.i(767561),t=a.i(340695),u=a.i(446181),v=a.i(950463),w=a.i(287702),x=a.i(330171),y=a.i(619477),z=a.i(369768),A=a.i(12993),B=a.i(199169),C=a.i(313237),D=a.i(759497),E=a.i(497895),F=b([z]);[z]=F.then?(await F)():F;let L={markdown:j.FileText,csv:o.Sheet,json:i.FileJson,text:j.FileText,frame:h.FileCode2,image:l.Image,audio:n.Music,video:q.Video,none:g.File};function G({entry:a,active:b,onPick:c}){let e="set"===a.kind?m.Images:L[a.view];return(0,d.jsxs)("button",{type:"button",onClick:c,title:`${a.name} \xb7 ${(0,B.shortAgo)(a.at)}`,className:(0,E.cn)("mx-2 flex items-center gap-2 rounded-md px-2 py-1.5 text-left text-[13px] outline-none focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-inset",b?"bg-secondary font-medium text-foreground":"text-muted-foreground hover:bg-muted/60 hover:text-foreground"),children:[(0,d.jsx)(e,{className:"size-3.5 shrink-0 opacity-70"}),(0,d.jsx)("span",{className:"min-w-0 flex-1 truncate",children:a.name}),(0,d.jsx)("span",{className:"shrink-0 font-mono text-[11px] text-muted-foreground/75",children:"set"===a.kind?a.count:(0,E.formatBytes)(a.bytes)})]})}function H({row:a,file:b,onOpen:c,onBack:g,onGone:h}){let[i]=(0,C.useServerAction)(A.openFileAction),[j,l]=(0,C.useServerAction)(x.deleteArtifactAction,{okMessage:"Deleted",onOk:()=>{(0,D.revalidate)(s.queryKey.artifacts),b?g():h()}}),m=b?{path:b.path,bytes:b.bytes,at:b.at}:"file"===a.kind?{path:a.path,bytes:a.bytes,at:a.at}:null,n=async a=>{await u.notify.confirm({title:`Delete ${a.split("/").pop()}?`,description:"It is deleted from disk for good.",okText:"Delete",destructive:!0})&&j(a)};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("div",{className:"flex h-11 shrink-0 items-center gap-3 border-b border-border/60 px-6",children:[b&&(0,d.jsxs)("button",{type:"button",onClick:g,className:"-ml-1 flex shrink-0 items-center gap-1 rounded-md px-1.5 py-1 font-mono text-[11px] text-muted-foreground outline-none hover:bg-muted/60 hover:text-foreground focus-visible:ring-3 focus-visible:ring-ring/50",children:[(0,d.jsx)(e.ChevronLeft,{className:"size-3"}),a.name]}),(0,d.jsx)("span",{className:"min-w-0 flex-1 truncate font-mono text-[11px] text-foreground",children:m?m.path.split("/").pop()??a.name:a.name}),(0,d.jsx)("span",{className:"shrink-0 font-mono text-[11px] text-muted-foreground/70",children:m?`${(0,E.formatBytes)(m.bytes)} \xb7 ${(0,B.shortAgo)(m.at)}`:`${a.count} ${1===a.count?"file":"files"} \xb7 ${(0,B.shortAgo)(a.at)}`}),m&&(0,d.jsx)("a",{href:s.queryKey.fileView(m.path),target:"_blank",rel:"noreferrer","aria-label":"Open in a new tab",className:"grid size-7 shrink-0 place-items-center rounded-md text-muted-foreground outline-none transition-colors hover:bg-muted/60 hover:text-foreground focus-visible:ring-3 focus-visible:ring-ring/50",children:(0,d.jsx)(f.ExternalLink,{className:"size-4"})}),(0,d.jsx)(t.Button,{size:"icon-sm",variant:"ghost","aria-label":"Reveal in the file manager",className:"text-muted-foreground",onClick:()=>i(m?.path??a.path),children:(0,d.jsx)(k.FolderOpen,{})}),m&&(0,d.jsx)(t.Button,{size:"icon-sm",variant:"ghost","aria-label":"Delete",loading:l,className:"text-muted-foreground",onClick:()=>n(m.path),children:(0,d.jsx)(p.Trash2,{})})]}),(0,d.jsx)("div",{className:"min-h-0 flex-1 overflow-auto",children:m?(0,d.jsx)(z.FilePreview,{path:m.path,bytes:m.bytes}):(0,d.jsx)(I,{name:a.name,onOpen:c})})]})}function I({name:a,onOpen:b}){let{data:c,isLoading:e,error:f}=(0,D.useServerRoute)(s.queryKey.artifactSet(a,w.ARTIFACT_VIEW.setFiles));if(e)return(0,d.jsx)("div",{className:"grid grid-cols-4 gap-3 p-5",children:Array.from({length:8},(a,b)=>(0,d.jsx)(v.Skeleton,{className:"aspect-4/3 w-full rounded-xl"},b))});if(f)return(0,d.jsx)(y.SettingError,{message:f.message});let g=c?.files??[];return 0===g.length?(0,d.jsx)("p",{className:"p-5 text-xs text-muted-foreground/60",children:"Nothing in here the app can open."}):(0,d.jsxs)("div",{className:"p-5",children:[(0,d.jsx)("div",{className:"grid grid-cols-4 gap-3",children:g.map(a=>(0,d.jsxs)("button",{type:"button",onClick:()=>b(a),title:`${a.name} \xb7 ${(0,E.formatBytes)(a.bytes)}`,className:"flex flex-col gap-1.5 text-left outline-none focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-offset-2",children:[(0,d.jsx)(J,{file:a}),(0,d.jsx)("span",{className:"truncate font-mono text-[11px] text-muted-foreground",children:a.name})]},a.path))}),c&&c.total>g.length&&(0,d.jsx)("p",{className:"pt-4 font-mono text-[11px] text-muted-foreground/60",children:`${g.length} of ${c.total.toLocaleString("en")} — the rest are in the folder`})]})}function J({file:a}){if("image"===a.view&&a.bytes<=w.WORKSPACE_VIEW.elementMax)return(0,d.jsx)("img",{src:s.queryKey.file(a.path),alt:a.name,loading:"lazy",decoding:"async",className:"aspect-4/3 w-full rounded-xl object-cover"});let b=L[a.view];return(0,d.jsx)("span",{className:"grid aspect-4/3 w-full place-items-center rounded-xl bg-muted/40 text-muted-foreground",children:(0,d.jsx)(b,{className:"size-5"})})}function K({empty:a,onReveal:b}){return(0,d.jsxs)("div",{className:"space-y-4 p-8",children:[(0,d.jsx)("p",{className:"max-w-lg text-sm leading-relaxed text-muted-foreground",children:a?"Nothing finished yet. When a bot ends a job with something to hand over — a page, a report, a set of pictures — it lands here.":"Pick something on the left. A folder a bot filled is one row, and opens as a sheet."}),(0,d.jsxs)(t.Button,{variant:"outline",onClick:b,children:[(0,d.jsx)(k.FolderOpen,{}),"Reveal folder"]})]})}a.s(["ArtifactSetting",0,function(){let[a,b]=(0,r.useState)(null),[c,e]=(0,r.useState)(""),[f,g]=(0,r.useState)(w.ARTIFACT_VIEW.rows),{data:h,isLoading:i,error:j}=(0,D.useServerRoute)(s.queryKey.artifactShelf(f),{keepPreviousData:!0}),[l]=(0,C.useServerAction)(A.openFileAction);if(i)return(0,d.jsx)(y.SettingPanesSkeleton,{});if(j)return(0,d.jsx)(y.SettingError,{message:j.message});let m=h?.entries??[],n=h?.total??0,o=c.trim().toLowerCase(),p=o?m.filter(a=>a.name.toLowerCase().includes(o)):m,q=m.find(b=>b.path===a?.row.path)??a?.row;return(0,d.jsx)(y.SettingPanes,{footer:(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(y.SettingRailNote,{children:(0,d.jsxs)("span",{className:"font-mono",children:[(0,d.jsx)("span",{className:"font-medium text-foreground",children:"artifacts"}),` \xb7 ${function(a,b,c){if(0===b)return"empty";let d=b>a.length?`${a.length} of ${b.toLocaleString("en")} artifacts`:`${b} ${1===b?"artifact":"artifacts"}`;return c>b?`${d} \xb7 ${c.toLocaleString("en")} files`:d}(m,n,h?.files??0)}`]})}),(0,d.jsxs)(t.Button,{variant:"outline",size:"sm",onClick:()=>l("artifacts"),children:[(0,d.jsx)(k.FolderOpen,{}),"Reveal folder"]})]}),left:(0,d.jsxs)("div",{className:"flex flex-col py-2",children:[(0,d.jsx)(y.SettingFilter,{value:c,onChange:e,placeholder:"Filter artifacts",className:"mx-2 mb-1.5 w-auto"}),0===p.length?(0,d.jsx)("p",{className:"px-4 py-3 text-xs text-muted-foreground/60",children:o?"Nothing matches":"Nothing here yet"}):p.map(a=>(0,d.jsx)(G,{entry:a,active:a.path===q?.path,onPick:()=>b({row:a,file:null})},a.path)),n>m.length&&(0,d.jsx)("button",{type:"button",onClick:()=>g(f+w.ARTIFACT_VIEW.rows),className:"mx-2 mt-2 rounded-md px-2 py-1.5 text-left font-mono text-[11px] text-muted-foreground outline-none hover:bg-muted/60 hover:text-foreground focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-inset",children:`Show ${Math.min(w.ARTIFACT_VIEW.rows,n-m.length)} more of ${n.toLocaleString("en")}`})]}),right:q?(0,d.jsx)(H,{row:q,file:a?.file??null,onOpen:a=>b({row:q,file:a}),onBack:()=>b({row:q,file:null}),onGone:()=>b(null)},q.path):(0,d.jsx)(K,{empty:0===n,onReveal:()=>l("artifacts")})})}]),c()}catch(a){c(a)}},!1),330171,a=>{"use strict";var b=a.i(405050);let c=(0,b.createServerReference)("7f5e9d55d642fe92f8db17f028783ed35610b7df76",b.callServer,void 0,b.findSourceMapURL,"deleteArtifactAction");a.s(["deleteArtifactAction",0,c])},572327,a=>{"use strict";var b=a.i(164831);let c={name:"file-code-corner",size:24,node:[["path",{d:"M4 12.15V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2h-3.35",key:"1wthlu"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"m5 16-3 3 3 3",key:"331omg"}],["path",{d:"m9 22 3-3-3-3",key:"lsp7cz"}]],aliases:["file-code-2"]};c.node;let d=(0,b.default)(c);a.s(["FileCode2",0,d],572327)},595775,a=>{"use strict";var b=a.i(164831);let c={name:"images",size:24,node:[["path",{d:"m22 11-1.296-1.296a2.4 2.4 0 0 0-3.408 0L11 16",key:"9kzy35"}],["path",{d:"M4 8a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2",key:"1t0f0t"}],["circle",{cx:"13",cy:"7",r:"1",fill:"currentColor",key:"1obus6"}],["rect",{x:"8",y:"2",width:"14",height:"14",rx:"2",key:"1gvhby"}]]};c.node;let d=(0,b.default)(c);a.s(["Images",0,d],595775)},649268,a=>{"use strict";var b=a.i(164831);let c={name:"music",size:24,node:[["path",{d:"M9 18V5l12-2v13",key:"1jmyc2"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["circle",{cx:"18",cy:"16",r:"3",key:"1hluhg"}]]};c.node;let d=(0,b.default)(c);a.s(["Music",0,d],649268)},239025,a=>{"use strict";var b=a.i(164831);let c={name:"sheet",size:24,node:[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["line",{x1:"3",x2:"21",y1:"9",y2:"9",key:"1vqk6q"}],["line",{x1:"3",x2:"21",y1:"15",y2:"15",key:"o2sbyz"}],["line",{x1:"9",x2:"9",y1:"9",y2:"21",key:"1ib60c"}],["line",{x1:"15",x2:"15",y1:"9",y2:"21",key:"1n26ft"}]]};c.node;let d=(0,b.default)(c);a.s(["Sheet",0,d],239025)},951675,a=>{"use strict";var b=a.i(164831);let c={name:"trash",size:24,node:[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],aliases:["trash-2"]};c.node;let d=(0,b.default)(c);a.s(["Trash2",0,d],951675)},586446,a=>{"use strict";var b=a.i(164831);let c={name:"video",size:24,node:[["path",{d:"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5",key:"ftymec"}],["rect",{x:"2",y:"6",width:"14",height:"12",rx:"2",key:"158x01"}]]};c.node;let d=(0,b.default)(c);a.s(["Video",0,d],586446)}];
2
+
3
+ //# sourceMappingURL=_1ovmc9s._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[405593,a=>{"use strict";var b=a.i(187924),c=a.i(987234),d=a.i(164831);let e={name:"audio-lines",size:24,node:[["path",{d:"M2 10v3",key:"1fnikh"}],["path",{d:"M6 6v11",key:"11sgs0"}],["path",{d:"M10 3v18",key:"yhl04a"}],["path",{d:"M14 8v7",key:"3a1oy3"}],["path",{d:"M18 5v13",key:"123xd1"}],["path",{d:"M22 10v3",key:"154ddg"}]]};e.node;let f=(0,d.default)(e),g={name:"captions",size:24,node:[["rect",{width:"18",height:"14",x:"3",y:"5",rx:"2",ry:"2",key:"12ruh7"}],["path",{d:"M7 15h4M15 15h2M7 11h2M13 11h4",key:"1ueiar"}]],aliases:["subtitles"]};g.node;let h=(0,d.default)(g);var i=a.i(752562),j=a.i(141146);let k={name:"clapperboard",size:24,node:[["path",{d:"m12.296 3.464 3.02 3.956",key:"qash78"}],["path",{d:"M20.2 6 3 11l-.9-2.4c-.3-1.1.3-2.2 1.3-2.5l13.5-4c1.1-.3 2.2.3 2.5 1.3z",key:"1h7j8b"}],["path",{d:"M3 11h18v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",key:"4lm6w1"}],["path",{d:"m6.18 5.276 3.1 3.899",key:"zjj9t3"}]]};k.node;let l=(0,d.default)(k);var m=a.i(71215),n=a.i(126766),o=a.i(233540),p=a.i(26268),q=a.i(572131),r=a.i(767561),s=a.i(340695),t=a.i(205522),u=a.i(446181),v=a.i(950463),w=a.i(852307),x=a.i(608902),y=a.i(379630),z=a.i(61876),A=a.i(913834),B=a.i(405050);let C=(0,B.createServerReference)("7fa4730e940da24972c78a6934ce626fdecd092165",B.callServer,void 0,B.findSourceMapURL,"removeConfigAction");var D=a.i(477804),E=a.i(478978),F=a.i(619477),G=a.i(313237),H=a.i(759497),I=a.i(497895);let J={[E.EXA_API_KEY]:o.Search},K={image:m.Image,video:l,speech:f,transcription:h};function L({section:a}){let{data:c,isLoading:d,error:e}=(0,H.useServerRoute)(r.queryKey.config);if(d)return(0,b.jsx)(F.SettingSkeleton,{rows:4});if(e)return(0,b.jsx)(F.SettingError,{message:e.message});let f=a=>(0,E.isConfigSet)(c,a),g=a=>c?.find(b=>b.key===a)?.value,h=E.CONFIG_GROUPS.filter(b=>b.section===a),i=h.flatMap(a=>a.entries);return(0,b.jsx)(F.SettingScreen,{footer:(0,b.jsx)(F.SettingRailNote,{children:"keys"===a?(0,b.jsxs)(b.Fragment,{children:[i.filter(a=>f(a.key)).length," of"," ",i.length," set",h.some(a=>!(0,E.groupSatisfied)(a,f))?" · a call needs one voice key":" · your keys stay on this machine"]}):(0,b.jsxs)(b.Fragment,{children:[i.length," of ",i.length," resolved ·"," ",i.filter(a=>g(a.key)).length," pinned"]})}),children:h.map(a=>(0,b.jsx)(F.SettingGroup,{label:a.title,hint:a.hint,right:(0,b.jsx)(M,{group:a,isSet:f}),children:(0,b.jsx)(F.SettingItems,{children:a.entries.map(c=>c.choices?(0,b.jsx)(W,{entry:c,choices:c.choices,value:g(c.key),isSet:f},c.key):(0,b.jsx)(N,{entry:c,set:f(c.key),needed:!(0,E.groupSatisfied)(a,f)},c.key))})},a.id))})}function M({group:a,isSet:c}){return"none"===a.require?null:(0,E.groupSatisfied)(a,c)?(0,b.jsxs)("span",{className:"flex items-center gap-1 font-mono text-[11px] text-muted-foreground",children:[(0,b.jsx)(i.Check,{className:"size-3"}),"ready"]}):(0,b.jsxs)("span",{className:(0,I.cn)("flex items-center gap-1 font-mono text-[11px]",I.WAITING_INK),children:[(0,b.jsx)(p.TriangleAlert,{className:"size-3"}),a.note??"Required"]})}function N({entry:a,set:c,needed:d}){let e=Q(a,c),f=S(a,c),g=R(a,c),h=f.data?T(f.data):P(c,d,e.data,a.signIn);return(0,b.jsxs)("button",{type:"button",onClick:()=>{var d,e,f;return a.signIn?(d=a,u.notify.component({className:"sm:max-w-md",renderer:({close:a})=>(0,b.jsx)(Z,{entry:d,onDone:a})})):(e=a,f=c,u.notify.component({className:"sm:max-w-md",renderer:({close:a})=>(0,b.jsx)($,{entry:e,set:f,onDone:a})}))},className:"group flex w-full items-center gap-3 p-4 text-left outline-none transition-colors hover:bg-muted/50 focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-inset",children:[(0,b.jsx)("span",{className:"grid size-8 shrink-0 place-items-center rounded-lg bg-muted/60",children:(0,b.jsx)(V,{entry:a})}),(0,b.jsxs)("span",{className:"min-w-0 flex-1 space-y-0.5",children:[(0,b.jsx)("span",{className:"block truncate text-sm font-medium",children:a.label}),(0,b.jsx)("span",{className:"block truncate font-mono text-xs text-muted-foreground",children:a.signIn?c?U(f.data,g):"sign in with your account":a.key})]}),e.isLoading||f.isLoading?(0,b.jsx)(v.Skeleton,{className:"h-3 w-20 shrink-0"}):(0,b.jsxs)("span",{className:(0,I.cn)("flex shrink-0 items-center gap-1.5 font-mono text-xs",h.ink),children:[h.warn?(0,b.jsx)(p.TriangleAlert,{className:"size-3"}):c&&(0,b.jsx)(i.Check,{className:"size-3"}),h.text]}),(0,b.jsx)(j.ChevronRight,{className:"size-4 shrink-0 text-muted-foreground/60 transition-colors group-hover:text-foreground"})]})}let O=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"});function P(a,b,c,d){return a?c?"refused"in c?{text:"Key refused",ink:"text-destructive",warn:!0}:{text:`${O.format(c.balance)} left`,ink:c.low?I.WAITING_INK:"text-muted-foreground",warn:c.low}:{text:d?"Signed in":"Set",ink:"text-muted-foreground",warn:!1}:b?{text:"Needed",ink:I.WAITING_INK,warn:!0}:{text:d?"Signed out":"Not set",ink:"text-muted-foreground/60",warn:!1}}function Q(a,b){return(0,H.useServerRoute)(b&&"vercel-ai-gateway"===a.provider?r.queryKey.gatewayCredits:null)}function R(a,b){let{data:c}=(0,H.useServerRoute)(b&&a.signIn?r.queryKey.llmModel:null);return c?.find(b=>b.id===a.provider)?.plan??null}function S(a,b){return(0,H.useServerRoute)(b&&a.signIn?r.queryKey.subscriptionUsage:null)}function T(a){return"refused"in a?{text:"Sign-in refused",ink:"text-destructive",warn:!0}:{text:a.spent?"Limit reached":`${a.usedPercent}% used`,ink:a.high?I.WAITING_INK:"text-muted-foreground",warn:a.high}}function U(a,b){let d=!a||"refused"in a?null:a,e=`${d?.plan??b??"unknown"} plan`;return d?.resetsAt?`${e} \xb7 resets in ${(0,c.formatDistanceToNowStrict)(new Date(d.resetsAt))}`:e}function V({entry:a}){if(a.provider)return(0,b.jsx)(y.ProviderIcon,{provider:a.provider,className:"size-4"});let c=J[a.key]??n.KeyRound;return(0,b.jsx)(c,{className:"size-4 text-muted-foreground"})}function W({entry:a,choices:c,value:d,isSet:e}){let f=c.find(a=>a.value===d),g=c.filter(a=>e(a.needs)),h=d&&!f?d:null,i=a.kind?K[a.kind]:A.BotsMark;return(0,b.jsxs)("button",{type:"button",onClick:()=>{var d,e,f;return a.kind||a.text?(d=a,u.notify.component({className:"sm:max-w-lg",renderer:({close:a})=>(0,b.jsx)(X,{entry:d,onDone:a})})):(e=a,f=c,u.notify.component({className:"sm:max-w-md",renderer:({close:a})=>(0,b.jsx)(Y,{entry:e,choices:f,onDone:a})}))},className:"group flex w-full items-center gap-3 p-4 text-left outline-none transition-colors hover:bg-muted/50 focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-inset",children:[(0,b.jsx)("span",{className:"grid size-8 shrink-0 place-items-center rounded-lg bg-muted/60",children:(0,b.jsx)(i,{className:"size-4 text-muted-foreground"})}),(0,b.jsxs)("span",{className:"min-w-0 flex-1 space-y-1",children:[(0,b.jsx)("span",{className:"block truncate text-sm font-medium",children:a.label}),(0,b.jsxs)("span",{className:"flex min-w-0 items-center gap-1.5",children:[!f&&!h&&(0,b.jsx)("span",{className:(0,I.cn)("shrink-0 rounded-[5px] border border-border/60 px-1 font-mono text-[10px]",a.kind?I.WAITING_INK:"text-muted-foreground"),children:a.kind?"off":"auto"}),(0,b.jsx)("span",{className:"truncate font-mono text-xs text-muted-foreground",children:f?.label??h??(a.kind?"Not offered to bots until you pick one":g[0]?.label??"No key for any of these yet")})]})]}),(0,b.jsx)(j.ChevronRight,{className:"size-4 shrink-0 text-muted-foreground/60 transition-colors group-hover:text-foreground"})]})}function X({entry:a,onDone:c}){let{data:d}=(0,H.useServerRoute)(r.queryKey.config),e=d?.find(b=>b.key===a.key)?.value,[f,g]=(0,q.useState)(()=>{let b=a.text?(0,z.parseTextModel)(e):(0,z.parseMediaModel)(e);return{provider:b?.provider??null,model:b?.model??""}}),h=()=>{(0,H.revalidate)(r.queryKey.config),c()},[i]=(0,G.useServerAction)(D.setConfigAction,{okMessage:`${a.label} saved`,onOk:h}),[j,k]=(0,G.useServerAction)(C,{okMessage:a.kind?`${a.label} switched off`:`${a.label} back to automatic`,onOk:h});return(0,b.jsx)(F.SettingDialogContent,{title:a.label,description:a.hint,footer:(0,b.jsxs)(b.Fragment,{children:[e&&(0,b.jsx)(s.Button,{variant:"ghost",loading:k,onClick:()=>j(a.key),children:a.kind?"Turn off":"Automatic"}),(0,b.jsx)(s.Button,{variant:"ghost",onClick:c,children:"Close"})]}),children:(0,b.jsx)(x.ModelPicker,{kind:a.kind,provider:f.provider,model:f.model,onChange:b=>{g(b),b.model.trim()&&i(a.key,`${b.provider}/${b.model.trim()}`)}})})}function Y({entry:a,choices:c,onDone:d}){let{data:e}=(0,H.useServerRoute)(r.queryKey.config),f=e?.find(b=>b.key===a.key)?.value,g=()=>{(0,H.revalidate)(r.queryKey.config),d()},[h,i]=(0,G.useServerAction)(D.setConfigAction,{okMessage:`${a.label} saved`,onOk:g}),[j,k]=(0,G.useServerAction)(C,{okMessage:a.kind?`${a.label} switched off`:`${a.label} back to automatic`,onOk:g});return(0,b.jsx)(F.SettingDialogContent,{title:a.label,description:a.hint,footer:(0,b.jsxs)(b.Fragment,{children:[f&&(0,b.jsx)(s.Button,{variant:"ghost",loading:k,onClick:()=>j(a.key),children:a.kind?"Turn off":"Automatic"}),(0,b.jsx)(s.Button,{variant:"ghost",onClick:d,children:"Close"})]}),children:(0,b.jsx)(F.SettingChoiceRows,{options:c.map(a=>({value:a.value,label:a.label,disabled:!(0,E.isConfigSet)(e,a.needs)&&`needs ${a.needs}`})),value:f,onChange:b=>h(a.key,b),disabled:i})})}function Z({entry:a,onDone:c}){let{data:d}=(0,H.useServerRoute)(r.queryKey.config),e=(0,E.isConfigSet)(d,a.key),f=R(a,e),g=S(a,e),h=g.data?T(g.data):null,[i,j]=(0,G.useServerAction)(C,{okMessage:`Signed out of ${a.label}`,onOk:()=>{(0,H.revalidate)(r.queryKey.config),(0,H.revalidate)(r.queryKey.llmModel),c()}});return(0,b.jsx)(F.SettingDialogContent,{title:a.label,description:e?(0,b.jsxs)(b.Fragment,{children:["Signed in ·"," ",(0,b.jsx)("span",{className:"font-mono",children:U(g.data,f)}),h&&(0,b.jsxs)(b.Fragment,{children:[" · ",(0,b.jsx)("span",{className:(0,I.cn)("font-mono",h.ink),children:h.text})]})]}):"Sign in with your ChatGPT account instead of a key",footer:(0,b.jsxs)(b.Fragment,{children:[e&&(0,b.jsx)(s.Button,{variant:"ghost",loading:j,onClick:()=>i(a.key),children:"Sign out"}),(0,b.jsx)(s.Button,{variant:"ghost",onClick:c,children:e?"Close":"Cancel"}),!e&&(0,b.jsx)(w.ChatGptSignIn,{})]}),children:(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)(F.SettingNote,{children:e?"Bots on this subscription spend your plan's usage, not a key. When it runs out, the job stops and says when it resets.":"The sign-in opens in its own window. Approve it there, and this turns to signed in by itself."}),g.data&&"refused"in g.data&&(0,b.jsx)(F.SettingNote,{className:"wrap-break-word text-destructive",children:g.data.refused})]})})}function $({entry:a,set:c,onDone:d}){let[e,f]=(0,q.useState)(""),{data:g}=Q(a,c),h=g?P(c,!1,g):null,i=()=>{(0,H.revalidate)(r.queryKey.config),(0,H.revalidate)(r.queryKey.llmModel)},[j,k]=(0,G.useServerAction)(D.setConfigAction,{okMessage:`${a.label} key saved`,onOk:()=>{i(),d()}}),[l,m]=(0,G.useServerAction)(C,{okMessage:`${a.label} key removed`,onOk:()=>{i(),d()}});return(0,b.jsx)(F.SettingDialogContent,{title:a.label,description:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"font-mono",children:a.key}),a.hint&&(0,b.jsxs)(b.Fragment,{children:[" · ",a.hint]}),h&&(0,b.jsxs)(b.Fragment,{children:[" · ",(0,b.jsx)("span",{className:(0,I.cn)("font-mono",h.ink),children:h.text})]})]}),footer:(0,b.jsxs)(b.Fragment,{children:[c&&(0,b.jsx)(s.Button,{variant:"ghost",loading:m,onClick:()=>l(a.key),children:"Remove"}),(0,b.jsx)(s.Button,{variant:"ghost",onClick:d,children:"Cancel"}),(0,b.jsx)(s.Button,{loading:k,disabled:e.trim().length<8,onClick:()=>j(a.key,e),children:c?"Replace":"Save"})]}),children:(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)(t.Input,{value:e,onChange:a=>f(a.target.value),onKeyDown:b=>{"Enter"===b.key&&e.trim().length>=8&&j(a.key,e)},placeholder:c?"New value — replaces the current key":a.key,spellCheck:!1,type:"password",autoFocus:!0}),g&&"refused"in g&&(0,b.jsx)(F.SettingNote,{className:"wrap-break-word text-destructive",children:g.refused})]})})}a.s(["ConfigGroups",0,L,"ConfigSetting",0,function(){return(0,b.jsx)(L,{section:"keys"})}],405593)}];
1
+ module.exports=[405593,a=>{"use strict";var b=a.i(187924),c=a.i(987234),d=a.i(164831);let e={name:"audio-lines",size:24,node:[["path",{d:"M2 10v3",key:"1fnikh"}],["path",{d:"M6 6v11",key:"11sgs0"}],["path",{d:"M10 3v18",key:"yhl04a"}],["path",{d:"M14 8v7",key:"3a1oy3"}],["path",{d:"M18 5v13",key:"123xd1"}],["path",{d:"M22 10v3",key:"154ddg"}]]};e.node;let f=(0,d.default)(e),g={name:"captions",size:24,node:[["rect",{width:"18",height:"14",x:"3",y:"5",rx:"2",ry:"2",key:"12ruh7"}],["path",{d:"M7 15h4M15 15h2M7 11h2M13 11h4",key:"1ueiar"}]],aliases:["subtitles"]};g.node;let h=(0,d.default)(g);var i=a.i(752562),j=a.i(141146);let k={name:"clapperboard",size:24,node:[["path",{d:"m12.296 3.464 3.02 3.956",key:"qash78"}],["path",{d:"M20.2 6 3 11l-.9-2.4c-.3-1.1.3-2.2 1.3-2.5l13.5-4c1.1-.3 2.2.3 2.5 1.3z",key:"1h7j8b"}],["path",{d:"M3 11h18v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",key:"4lm6w1"}],["path",{d:"m6.18 5.276 3.1 3.899",key:"zjj9t3"}]]};k.node;let l=(0,d.default)(k);var m=a.i(71215),n=a.i(126766),o=a.i(233540),p=a.i(26268),q=a.i(572131),r=a.i(767561),s=a.i(340695),t=a.i(205522),u=a.i(446181),v=a.i(950463),w=a.i(852307),x=a.i(608902),y=a.i(379630),z=a.i(61876),A=a.i(913834),B=a.i(405050);let C=(0,B.createServerReference)("7fb6f8b381203a417ba7628fded304ddd5d574c1d9",B.callServer,void 0,B.findSourceMapURL,"removeConfigAction");var D=a.i(858819),E=a.i(478978),F=a.i(619477),G=a.i(313237),H=a.i(759497),I=a.i(497895);let J={[E.EXA_API_KEY]:o.Search},K={image:m.Image,video:l,speech:f,transcription:h};function L({section:a}){let{data:c,isLoading:d,error:e}=(0,H.useServerRoute)(r.queryKey.config);if(d)return(0,b.jsx)(F.SettingSkeleton,{rows:4});if(e)return(0,b.jsx)(F.SettingError,{message:e.message});let f=a=>(0,E.isConfigSet)(c,a),g=a=>c?.find(b=>b.key===a)?.value,h=E.CONFIG_GROUPS.filter(b=>b.section===a),i=h.flatMap(a=>a.entries);return(0,b.jsx)(F.SettingScreen,{footer:(0,b.jsx)(F.SettingRailNote,{children:"keys"===a?(0,b.jsxs)(b.Fragment,{children:[i.filter(a=>f(a.key)).length," of"," ",i.length," set",h.some(a=>!(0,E.groupSatisfied)(a,f))?" · a call needs one voice key":" · your keys stay on this machine"]}):(0,b.jsxs)(b.Fragment,{children:[i.length," of ",i.length," resolved ·"," ",i.filter(a=>g(a.key)).length," pinned"]})}),children:h.map(a=>(0,b.jsx)(F.SettingGroup,{label:a.title,hint:a.hint,right:(0,b.jsx)(M,{group:a,isSet:f}),children:(0,b.jsx)(F.SettingItems,{children:a.entries.map(c=>c.choices?(0,b.jsx)(W,{entry:c,choices:c.choices,value:g(c.key),isSet:f},c.key):(0,b.jsx)(N,{entry:c,set:f(c.key),needed:!(0,E.groupSatisfied)(a,f)},c.key))})},a.id))})}function M({group:a,isSet:c}){return"none"===a.require?null:(0,E.groupSatisfied)(a,c)?(0,b.jsxs)("span",{className:"flex items-center gap-1 font-mono text-[11px] text-muted-foreground",children:[(0,b.jsx)(i.Check,{className:"size-3"}),"ready"]}):(0,b.jsxs)("span",{className:(0,I.cn)("flex items-center gap-1 font-mono text-[11px]",I.WAITING_INK),children:[(0,b.jsx)(p.TriangleAlert,{className:"size-3"}),a.note??"Required"]})}function N({entry:a,set:c,needed:d}){let e=Q(a,c),f=S(a,c),g=R(a,c),h=f.data?T(f.data):P(c,d,e.data,a.signIn);return(0,b.jsxs)("button",{type:"button",onClick:()=>{var d,e,f;return a.signIn?(d=a,u.notify.component({className:"sm:max-w-md",renderer:({close:a})=>(0,b.jsx)(Z,{entry:d,onDone:a})})):(e=a,f=c,u.notify.component({className:"sm:max-w-md",renderer:({close:a})=>(0,b.jsx)($,{entry:e,set:f,onDone:a})}))},className:"group flex w-full items-center gap-3 p-4 text-left outline-none transition-colors hover:bg-muted/50 focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-inset",children:[(0,b.jsx)("span",{className:"grid size-8 shrink-0 place-items-center rounded-lg bg-muted/60",children:(0,b.jsx)(V,{entry:a})}),(0,b.jsxs)("span",{className:"min-w-0 flex-1 space-y-0.5",children:[(0,b.jsx)("span",{className:"block truncate text-sm font-medium",children:a.label}),(0,b.jsx)("span",{className:"block truncate font-mono text-xs text-muted-foreground",children:a.signIn?c?U(f.data,g):"sign in with your account":a.key})]}),e.isLoading||f.isLoading?(0,b.jsx)(v.Skeleton,{className:"h-3 w-20 shrink-0"}):(0,b.jsxs)("span",{className:(0,I.cn)("flex shrink-0 items-center gap-1.5 font-mono text-xs",h.ink),children:[h.warn?(0,b.jsx)(p.TriangleAlert,{className:"size-3"}):c&&(0,b.jsx)(i.Check,{className:"size-3"}),h.text]}),(0,b.jsx)(j.ChevronRight,{className:"size-4 shrink-0 text-muted-foreground/60 transition-colors group-hover:text-foreground"})]})}let O=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"});function P(a,b,c,d){return a?c?"refused"in c?{text:"Key refused",ink:"text-destructive",warn:!0}:{text:`${O.format(c.balance)} left`,ink:c.low?I.WAITING_INK:"text-muted-foreground",warn:c.low}:{text:d?"Signed in":"Set",ink:"text-muted-foreground",warn:!1}:b?{text:"Needed",ink:I.WAITING_INK,warn:!0}:{text:d?"Signed out":"Not set",ink:"text-muted-foreground/60",warn:!1}}function Q(a,b){return(0,H.useServerRoute)(b&&"vercel-ai-gateway"===a.provider?r.queryKey.gatewayCredits:null)}function R(a,b){let{data:c}=(0,H.useServerRoute)(b&&a.signIn?r.queryKey.llmModel:null);return c?.find(b=>b.id===a.provider)?.plan??null}function S(a,b){return(0,H.useServerRoute)(b&&a.signIn?r.queryKey.subscriptionUsage:null)}function T(a){return"refused"in a?{text:"Sign-in refused",ink:"text-destructive",warn:!0}:{text:a.spent?"Limit reached":`${a.usedPercent}% used`,ink:a.high?I.WAITING_INK:"text-muted-foreground",warn:a.high}}function U(a,b){let d=!a||"refused"in a?null:a,e=`${d?.plan??b??"unknown"} plan`;return d?.resetsAt?`${e} \xb7 resets in ${(0,c.formatDistanceToNowStrict)(new Date(d.resetsAt))}`:e}function V({entry:a}){if(a.provider)return(0,b.jsx)(y.ProviderIcon,{provider:a.provider,className:"size-4"});let c=J[a.key]??n.KeyRound;return(0,b.jsx)(c,{className:"size-4 text-muted-foreground"})}function W({entry:a,choices:c,value:d,isSet:e}){let f=c.find(a=>a.value===d),g=c.filter(a=>e(a.needs)),h=d&&!f?d:null,i=a.kind?K[a.kind]:A.BotsMark;return(0,b.jsxs)("button",{type:"button",onClick:()=>{var d,e,f;return a.kind||a.text?(d=a,u.notify.component({className:"sm:max-w-lg",renderer:({close:a})=>(0,b.jsx)(X,{entry:d,onDone:a})})):(e=a,f=c,u.notify.component({className:"sm:max-w-md",renderer:({close:a})=>(0,b.jsx)(Y,{entry:e,choices:f,onDone:a})}))},className:"group flex w-full items-center gap-3 p-4 text-left outline-none transition-colors hover:bg-muted/50 focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:ring-inset",children:[(0,b.jsx)("span",{className:"grid size-8 shrink-0 place-items-center rounded-lg bg-muted/60",children:(0,b.jsx)(i,{className:"size-4 text-muted-foreground"})}),(0,b.jsxs)("span",{className:"min-w-0 flex-1 space-y-1",children:[(0,b.jsx)("span",{className:"block truncate text-sm font-medium",children:a.label}),(0,b.jsxs)("span",{className:"flex min-w-0 items-center gap-1.5",children:[!f&&!h&&(0,b.jsx)("span",{className:(0,I.cn)("shrink-0 rounded-[5px] border border-border/60 px-1 font-mono text-[10px]",a.kind?I.WAITING_INK:"text-muted-foreground"),children:a.kind?"off":"auto"}),(0,b.jsx)("span",{className:"truncate font-mono text-xs text-muted-foreground",children:f?.label??h??(a.kind?"Not offered to bots until you pick one":g[0]?.label??"No key for any of these yet")})]})]}),(0,b.jsx)(j.ChevronRight,{className:"size-4 shrink-0 text-muted-foreground/60 transition-colors group-hover:text-foreground"})]})}function X({entry:a,onDone:c}){let{data:d}=(0,H.useServerRoute)(r.queryKey.config),e=d?.find(b=>b.key===a.key)?.value,[f,g]=(0,q.useState)(()=>{let b=a.text?(0,z.parseTextModel)(e):(0,z.parseMediaModel)(e);return{provider:b?.provider??null,model:b?.model??""}}),h=()=>{(0,H.revalidate)(r.queryKey.config),c()},[i]=(0,G.useServerAction)(D.setConfigAction,{okMessage:`${a.label} saved`,onOk:h}),[j,k]=(0,G.useServerAction)(C,{okMessage:a.kind?`${a.label} switched off`:`${a.label} back to automatic`,onOk:h});return(0,b.jsx)(F.SettingDialogContent,{title:a.label,description:a.hint,footer:(0,b.jsxs)(b.Fragment,{children:[e&&(0,b.jsx)(s.Button,{variant:"ghost",loading:k,onClick:()=>j(a.key),children:a.kind?"Turn off":"Automatic"}),(0,b.jsx)(s.Button,{variant:"ghost",onClick:c,children:"Close"})]}),children:(0,b.jsx)(x.ModelPicker,{kind:a.kind,provider:f.provider,model:f.model,onChange:b=>{g(b),b.model.trim()&&i(a.key,`${b.provider}/${b.model.trim()}`)}})})}function Y({entry:a,choices:c,onDone:d}){let{data:e}=(0,H.useServerRoute)(r.queryKey.config),f=e?.find(b=>b.key===a.key)?.value,g=()=>{(0,H.revalidate)(r.queryKey.config),d()},[h,i]=(0,G.useServerAction)(D.setConfigAction,{okMessage:`${a.label} saved`,onOk:g}),[j,k]=(0,G.useServerAction)(C,{okMessage:a.kind?`${a.label} switched off`:`${a.label} back to automatic`,onOk:g});return(0,b.jsx)(F.SettingDialogContent,{title:a.label,description:a.hint,footer:(0,b.jsxs)(b.Fragment,{children:[f&&(0,b.jsx)(s.Button,{variant:"ghost",loading:k,onClick:()=>j(a.key),children:a.kind?"Turn off":"Automatic"}),(0,b.jsx)(s.Button,{variant:"ghost",onClick:d,children:"Close"})]}),children:(0,b.jsx)(F.SettingChoiceRows,{options:c.map(a=>({value:a.value,label:a.label,disabled:!(0,E.isConfigSet)(e,a.needs)&&`needs ${a.needs}`})),value:f,onChange:b=>h(a.key,b),disabled:i})})}function Z({entry:a,onDone:c}){let{data:d}=(0,H.useServerRoute)(r.queryKey.config),e=(0,E.isConfigSet)(d,a.key),f=R(a,e),g=S(a,e),h=g.data?T(g.data):null,[i,j]=(0,G.useServerAction)(C,{okMessage:`Signed out of ${a.label}`,onOk:()=>{(0,H.revalidate)(r.queryKey.config),(0,H.revalidate)(r.queryKey.llmModel),c()}});return(0,b.jsx)(F.SettingDialogContent,{title:a.label,description:e?(0,b.jsxs)(b.Fragment,{children:["Signed in ·"," ",(0,b.jsx)("span",{className:"font-mono",children:U(g.data,f)}),h&&(0,b.jsxs)(b.Fragment,{children:[" · ",(0,b.jsx)("span",{className:(0,I.cn)("font-mono",h.ink),children:h.text})]})]}):"Sign in with your ChatGPT account instead of a key",footer:(0,b.jsxs)(b.Fragment,{children:[e&&(0,b.jsx)(s.Button,{variant:"ghost",loading:j,onClick:()=>i(a.key),children:"Sign out"}),(0,b.jsx)(s.Button,{variant:"ghost",onClick:c,children:e?"Close":"Cancel"}),!e&&(0,b.jsx)(w.ChatGptSignIn,{})]}),children:(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)(F.SettingNote,{children:e?"Bots on this subscription spend your plan's usage, not a key. When it runs out, the job stops and says when it resets.":"The sign-in opens in its own window. Approve it there, and this turns to signed in by itself."}),g.data&&"refused"in g.data&&(0,b.jsx)(F.SettingNote,{className:"wrap-break-word text-destructive",children:g.data.refused})]})})}function $({entry:a,set:c,onDone:d}){let[e,f]=(0,q.useState)(""),{data:g}=Q(a,c),h=g?P(c,!1,g):null,i=()=>{(0,H.revalidate)(r.queryKey.config),(0,H.revalidate)(r.queryKey.llmModel)},[j,k]=(0,G.useServerAction)(D.setConfigAction,{okMessage:`${a.label} key saved`,onOk:()=>{i(),d()}}),[l,m]=(0,G.useServerAction)(C,{okMessage:`${a.label} key removed`,onOk:()=>{i(),d()}});return(0,b.jsx)(F.SettingDialogContent,{title:a.label,description:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"font-mono",children:a.key}),a.hint&&(0,b.jsxs)(b.Fragment,{children:[" · ",a.hint]}),h&&(0,b.jsxs)(b.Fragment,{children:[" · ",(0,b.jsx)("span",{className:(0,I.cn)("font-mono",h.ink),children:h.text})]})]}),footer:(0,b.jsxs)(b.Fragment,{children:[c&&(0,b.jsx)(s.Button,{variant:"ghost",loading:m,onClick:()=>l(a.key),children:"Remove"}),(0,b.jsx)(s.Button,{variant:"ghost",onClick:d,children:"Cancel"}),(0,b.jsx)(s.Button,{loading:k,disabled:e.trim().length<8,onClick:()=>j(a.key,e),children:c?"Replace":"Save"})]}),children:(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)(t.Input,{value:e,onChange:a=>f(a.target.value),onKeyDown:b=>{"Enter"===b.key&&e.trim().length>=8&&j(a.key,e)},placeholder:c?"New value — replaces the current key":a.key,spellCheck:!1,type:"password",autoFocus:!0}),g&&"refused"in g&&(0,b.jsx)(F.SettingNote,{className:"wrap-break-word text-destructive",children:g.refused})]})})}a.s(["ConfigGroups",0,L,"ConfigSetting",0,function(){return(0,b.jsx)(L,{section:"keys"})}],405593)}];
2
2
 
3
3
  //# sourceMappingURL=features_config_components_config-setting_tsx_0xfwqdg._.js.map