reflex-agent 0.2.1 → 0.2.2

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 (178) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +89 -89
  3. package/.next/app-path-routes-manifest.json +7 -7
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +3 -3
  6. package/.next/react-loadable-manifest.json +1 -1
  7. package/.next/server/app/_not-found/page.js +1 -1
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/_not-found.html +1 -1
  10. package/.next/server/app/_not-found.rsc +3 -3
  11. package/.next/server/app/agents/[agentId]/page.js +1 -1
  12. package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/agents/[agentId]/respond/route.js +1 -1
  14. package/.next/server/app/api/agents/[agentId]/respond/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/images/[rootId]/[file]/route.js +1 -1
  16. package/.next/server/app/api/images/[rootId]/[file]/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/oauth/callback/route.js +1 -1
  18. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/oauth/start/route.js +1 -1
  20. package/.next/server/app/api/oauth/start/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/roots/[id]/attachments/route.js +0 -0
  22. package/.next/server/app/api/roots/[id]/attachments/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/roots/[id]/chat/[topicId]/send/route.js +1 -1
  24. package/.next/server/app/api/roots/[id]/chat/[topicId]/send/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/roots/[id]/chat/[topicId]/stop/route.js +1 -1
  26. package/.next/server/app/api/roots/[id]/chat/[topicId]/stop/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/roots/[id]/chat/[topicId]/stream/route.js +1 -1
  28. package/.next/server/app/api/roots/[id]/chat/[topicId]/stream/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/roots/[id]/dashboard/route.js +1 -1
  30. package/.next/server/app/api/roots/[id]/dashboard/route.js.nft.json +1 -1
  31. package/.next/server/app/api/roots/[id]/dashboard/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/roots/[id]/suggestions/route.js +1 -1
  33. package/.next/server/app/api/roots/[id]/suggestions/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/utilities/[scope]/[id]/bundle.js/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/utilities/[scope]/[id]/host/route.js +1 -1
  36. package/.next/server/app/api/utilities/[scope]/[id]/host/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/utilities/[scope]/[id]/host-api.mjs/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/utilities/[scope]/[id]/host-ui.mjs/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/utilities/[scope]/[id]/iframe/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/utilities/[scope]/[id]/style.css/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/audit/page.js +2 -2
  42. package/.next/server/app/audit/page.js.nft.json +1 -1
  43. package/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  44. package/.next/server/app/index.html +1 -1
  45. package/.next/server/app/index.rsc +3 -3
  46. package/.next/server/app/onboarding/page.js +3 -3
  47. package/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  48. package/.next/server/app/page.js +2 -2
  49. package/.next/server/app/page.js.nft.json +1 -1
  50. package/.next/server/app/page_client-reference-manifest.js +1 -1
  51. package/.next/server/app/roots/[id]/chat/[topicId]/page.js +3 -3
  52. package/.next/server/app/roots/[id]/chat/[topicId]/page.js.nft.json +1 -1
  53. package/.next/server/app/roots/[id]/chat/[topicId]/page_client-reference-manifest.js +1 -1
  54. package/.next/server/app/roots/[id]/kb/[...slug]/page.js +3 -3
  55. package/.next/server/app/roots/[id]/kb/[...slug]/page.js.nft.json +1 -1
  56. package/.next/server/app/roots/[id]/kb/[...slug]/page_client-reference-manifest.js +1 -1
  57. package/.next/server/app/roots/[id]/page.js +3 -3
  58. package/.next/server/app/roots/[id]/page.js.nft.json +1 -1
  59. package/.next/server/app/roots/[id]/page_client-reference-manifest.js +1 -1
  60. package/.next/server/app/roots/[id]/workflows/[wfId]/page.js +2 -2
  61. package/.next/server/app/roots/[id]/workflows/[wfId]/page_client-reference-manifest.js +1 -1
  62. package/.next/server/app/roots/[id]/workflows/page.js +1 -1
  63. package/.next/server/app/roots/[id]/workflows/page.js.nft.json +1 -1
  64. package/.next/server/app/roots/[id]/workflows/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app/roots/new/page.js +2 -2
  66. package/.next/server/app/roots/new/page_client-reference-manifest.js +1 -1
  67. package/.next/server/app/roots/new.html +1 -1
  68. package/.next/server/app/roots/new.rsc +5 -5
  69. package/.next/server/app/settings/page.js +5 -5
  70. package/.next/server/app/settings/page.js.nft.json +1 -1
  71. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  72. package/.next/server/app/settings.html +1 -1
  73. package/.next/server/app/settings.rsc +6 -6
  74. package/.next/server/app/share/[id]/file/page.js +2 -2
  75. package/.next/server/app/share/[id]/file/page_client-reference-manifest.js +1 -1
  76. package/.next/server/app/share/[id]/page.js +2 -2
  77. package/.next/server/app/share/[id]/page.js.nft.json +1 -1
  78. package/.next/server/app/share/[id]/page_client-reference-manifest.js +1 -1
  79. package/.next/server/app/utilities/[scope]/[id]/page.js +2 -2
  80. package/.next/server/app/utilities/[scope]/[id]/page.js.nft.json +1 -1
  81. package/.next/server/app/utilities/[scope]/[id]/page_client-reference-manifest.js +1 -1
  82. package/.next/server/app/utilities/page.js +4 -4
  83. package/.next/server/app/utilities/page_client-reference-manifest.js +1 -1
  84. package/.next/server/app-paths-manifest.json +7 -7
  85. package/.next/server/chunks/1105.js +1 -1
  86. package/.next/server/chunks/1223.js +1 -1
  87. package/.next/server/chunks/133.js +5 -5
  88. package/.next/server/chunks/1455.js +1 -0
  89. package/.next/server/chunks/1888.js +1 -1
  90. package/.next/server/chunks/1986.js +1 -1
  91. package/.next/server/chunks/2433.js +1 -1
  92. package/.next/server/chunks/2485.js +1 -1
  93. package/.next/server/chunks/2503.js +1 -1
  94. package/.next/server/chunks/2977.js +1 -0
  95. package/.next/server/chunks/3076.js +1 -0
  96. package/.next/server/chunks/3332.js +1 -1
  97. package/.next/server/chunks/3610.js +1 -0
  98. package/.next/server/chunks/4031.js +1 -1
  99. package/.next/server/chunks/4567.js +3 -0
  100. package/.next/server/chunks/4925.js +1 -1
  101. package/.next/server/chunks/5243.js +1 -1
  102. package/.next/server/chunks/6730.js +1 -1
  103. package/.next/server/chunks/6809.js +3 -0
  104. package/.next/server/chunks/6909.js +3 -3
  105. package/.next/server/chunks/8514.js +1 -1
  106. package/.next/server/chunks/9098.js +1 -1
  107. package/.next/server/chunks/9293.js +1 -1
  108. package/.next/server/chunks/9328.js +2 -2
  109. package/.next/server/chunks/9731.js +4 -0
  110. package/.next/server/chunks/9905.js +1 -0
  111. package/.next/server/functions-config-manifest.json +2 -2
  112. package/.next/server/middleware-build-manifest.js +1 -1
  113. package/.next/server/middleware-manifest.json +5 -5
  114. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  115. package/.next/server/pages/404.html +1 -1
  116. package/.next/server/pages/500.html +1 -1
  117. package/.next/server/pages/_error.js +2 -2
  118. package/.next/server/server-reference-manifest.js +1 -1
  119. package/.next/server/server-reference-manifest.json +1 -1
  120. package/.next/static/chunks/1521-747af538ca131a44.js +1 -0
  121. package/.next/static/chunks/{6734-9d524ec49e4ba49c.js → 2641-a7e626d59cd967e8.js} +1 -1
  122. package/.next/static/chunks/2994-8b82d24eeb6d4a3d.js +1 -0
  123. package/.next/static/chunks/4108.610ef39d7984f25f.js +1 -0
  124. package/.next/static/chunks/6330-d46c4ceb6e522567.js +1 -0
  125. package/.next/static/chunks/9837-49687140bc7ce084.js +1 -0
  126. package/.next/static/chunks/app/layout-e51afdc17d552d1a.js +1 -0
  127. package/.next/static/chunks/app/onboarding/page-21cb4c231aa388b2.js +1 -0
  128. package/.next/static/chunks/app/page-1fa224b4a5160227.js +1 -0
  129. package/.next/static/chunks/app/roots/[id]/chat/[topicId]/page-495551937b420b76.js +1 -0
  130. package/.next/static/chunks/app/roots/[id]/kb/[...slug]/page-1b67558878e2cc43.js +1 -0
  131. package/.next/static/chunks/app/roots/[id]/page-0431ab3465b742f1.js +1 -0
  132. package/.next/static/chunks/app/roots/[id]/workflows/[wfId]/page-62fa8cfbf3c85457.js +1 -0
  133. package/.next/static/chunks/app/roots/new/page-918f809668694de6.js +1 -0
  134. package/.next/static/chunks/app/settings/page-9cf2f101424ec84c.js +1 -0
  135. package/.next/static/chunks/app/share/[id]/page-325593b9c70ca17c.js +1 -0
  136. package/.next/static/chunks/app/utilities/[scope]/[id]/page-fe0e445961d83cc2.js +1 -0
  137. package/.next/static/chunks/app/utilities/page-a1359423e5a9e7de.js +1 -0
  138. package/.next/static/chunks/{webpack-2e8cca5826414cc6.js → webpack-5a9c11af9261dd8a.js} +1 -1
  139. package/.next/trace +46 -46
  140. package/README.md +12 -1
  141. package/dist/bin/cli.js +1 -0
  142. package/dist/bin/cli.js.map +1 -1
  143. package/dist/bin/preload.js +14 -0
  144. package/dist/bin/preload.js.map +1 -0
  145. package/dist/lib/reflex/commands/start.js +2 -0
  146. package/dist/lib/reflex/commands/start.js.map +1 -1
  147. package/dist/lib/reflex/home.js +18 -0
  148. package/dist/lib/reflex/home.js.map +1 -0
  149. package/dist/lib/reflex/prompts/store.js +2 -2
  150. package/dist/lib/reflex/prompts/store.js.map +1 -1
  151. package/package.json +1 -1
  152. package/.next/server/chunks/5152.js +0 -1
  153. package/.next/server/chunks/5373.js +0 -1
  154. package/.next/server/chunks/5401.js +0 -1
  155. package/.next/server/chunks/5436.js +0 -1
  156. package/.next/server/chunks/5986.js +0 -3
  157. package/.next/server/chunks/613.js +0 -1
  158. package/.next/server/chunks/6536.js +0 -3
  159. package/.next/server/chunks/6602.js +0 -4
  160. package/.next/static/chunks/4108.d6ed46bc2fcab462.js +0 -1
  161. package/.next/static/chunks/4895-712004156efeccf2.js +0 -1
  162. package/.next/static/chunks/6489-ecde2d94e57eb8a9.js +0 -1
  163. package/.next/static/chunks/6727-d38536774bdb32d5.js +0 -1
  164. package/.next/static/chunks/6744-dbfe3cc4ce461613.js +0 -1
  165. package/.next/static/chunks/app/layout-c7a35075cfbfa3e3.js +0 -1
  166. package/.next/static/chunks/app/onboarding/page-cde5b92b13b03c63.js +0 -1
  167. package/.next/static/chunks/app/page-ddaeffdc9a15f597.js +0 -1
  168. package/.next/static/chunks/app/roots/[id]/chat/[topicId]/page-1b55f68984817d29.js +0 -1
  169. package/.next/static/chunks/app/roots/[id]/kb/[...slug]/page-d4358cb6042740c4.js +0 -1
  170. package/.next/static/chunks/app/roots/[id]/page-703d96bf8208af2f.js +0 -1
  171. package/.next/static/chunks/app/roots/[id]/workflows/[wfId]/page-738e8e4128baa722.js +0 -1
  172. package/.next/static/chunks/app/roots/new/page-534769dce46d0d29.js +0 -1
  173. package/.next/static/chunks/app/settings/page-86ee3d07ea1acbc7.js +0 -1
  174. package/.next/static/chunks/app/share/[id]/page-5bbc8503cb9a9eeb.js +0 -1
  175. package/.next/static/chunks/app/utilities/[scope]/[id]/page-72546d245b840091.js +0 -1
  176. package/.next/static/chunks/app/utilities/page-9f949d831421d314.js +0 -1
  177. /package/.next/static/{p8t15rbWhT5Rrs5fOXWZ6 → 6-mOMrzbiPmI97utKVIuW}/_buildManifest.js +0 -0
  178. /package/.next/static/{p8t15rbWhT5Rrs5fOXWZ6 → 6-mOMrzbiPmI97utKVIuW}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- "use strict";exports.id=1888,exports.ids=[94,1223,1888],exports.modules={1223:(a,b,c)=>{c.d(b,{De:()=>v,Dt:()=>t,Sh:()=>s,cL:()=>q,getOAuthTokens:()=>u,gi:()=>w,tY:()=>r});var d=c(73024),e=c(48161),f=c.n(e),g=c(76760),h=c.n(g),i=c(10094);let j=h().join(f().homedir(),".reflex","oauth"),k=h().join(j,"clients"),l=h().join(j,"tokens");function m(a){return h().join(k,`${a}.json`)}function n(a){return h().join(l,`${a}.json`)}async function o(a,b){await d.promises.mkdir(h().dirname(a),{recursive:!0}),await d.promises.writeFile(a,JSON.stringify(b,null,2)+"\n",{encoding:"utf8",mode:384});try{await d.promises.chmod(a,384)}catch{}}async function p(a){try{let b=await d.promises.readFile(a,"utf8");return JSON.parse(b)}catch{return null}}async function q(a,b){let{getOAuthProvider:d}=await Promise.resolve().then(c.bind(c,10094));if(!await d(a))throw Error(`unknown provider: ${a}`);await o(m(a),{...b,updatedAt:new Date().toISOString()})}async function r(a){return p(m(a))}async function s(a){try{await d.promises.unlink(m(a))}catch{}}async function t(a,b){await o(n(a),{...b,updatedAt:new Date().toISOString()})}async function u(a){return p(n(a))}async function v(a){try{await d.promises.unlink(n(a))}catch{}}async function w(){let a=[];for(let b of(await (0,i.E4)())){let c=b.def,d=await r(c.id),e=await u(c.id);a.push({id:c.id,label:c.label,hasClient:!!d,hasTokens:!!e,...e?.expiresAt!==void 0?{expiresAt:e.expiresAt}:{},setupHint:c.setupHint,consoleUrl:c.consoleUrl,origin:b.origin,setupSteps:c.setupSteps})}return a}},10094:(a,b,c)=>{c.d(b,{Cs:()=>n,E4:()=>s,H:()=>w,To:()=>v,getOAuthProvider:()=>t,isOAuthProviderId:()=>u,lL:()=>k,uq:()=>x});var d=c(73024),e=c(48161),f=c.n(e),g=c(76760),h=c.n(g),i=c(56149);let j=i.Ik({title:i.Yj().min(1).max(200),body:i.Yj().max(2e3).optional(),field:i.Yj().max(200).optional(),copy:i.Yj().max(2e3).optional(),choice:i.Yj().max(200).optional()}),k=i.Ik({id:i.Yj().min(1).max(64).regex(/^[a-z][a-z0-9-]*$/,"provider id must be kebab-case (e.g. google, dropbox)"),label:i.Yj().min(1).max(120),authorizeUrl:i.Yj().url(),tokenUrl:i.Yj().url(),defaultScopes:i.YO(i.Yj()).default([]),supportsPKCE:i.zM().default(!0),refreshTokenSupported:i.zM().default(!0),extraAuthorizeParams:i.g1(i.Yj(),i.Yj()).default({}),needsClientSecret:i.zM().default(!0),setupHint:i.Yj().default(""),consoleUrl:i.Yj().url(),setupSteps:i.YO(j).default([])}),l={google:{id:"google",label:"Google",authorizeUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",defaultScopes:["openid","email","https://www.googleapis.com/auth/calendar"],supportsPKCE:!0,refreshTokenSupported:!0,extraAuthorizeParams:{access_type:"offline",prompt:"consent"},needsClientSecret:!0,setupHint:"Если ещё не делал — сначала включи нужный API (Calendar/Gmail/Drive) во вкладке APIs & Services → Library.",consoleUrl:"https://console.cloud.google.com/apis/credentials",setupSteps:[{title:"Открой Google Cloud Console → APIs & Services → Credentials."},{title:"Нажми \xab+ CREATE CREDENTIALS\xbb → \xabOAuth client ID\xbb."},{title:"Application type",choice:"Web application",body:"Не \xabDesktop\xbb — Reflex использует фиксированный localhost-redirect."},{title:"Name — любое, например \xabReflex\xbb."},{title:"Authorized redirect URIs → ADD URI",field:"Authorized redirect URIs",copy:"http://localhost:3210/api/oauth/callback",body:"Точно как есть, без слэша в конце, http (не https)."},{title:"Жми CREATE → откроется попап с Client ID и Client Secret."},{title:"Скопируй сюда оба значения. (Если потерял — открой клиент в Credentials, \xabDownload JSON\xbb или \xabReset secret\xbb.)"},{title:"Перед первым Authorize убедись, что нужный API включён: APIs & Services → Library → Google Calendar API → Enable (для других сервисов — аналогично)."}]},github:{id:"github",label:"GitHub",authorizeUrl:"https://github.com/login/oauth/authorize",tokenUrl:"https://github.com/login/oauth/access_token",defaultScopes:["repo","read:user"],supportsPKCE:!1,refreshTokenSupported:!1,extraAuthorizeParams:{},needsClientSecret:!0,setupHint:"Личные OAuth Apps живут в Settings → Developer settings.",consoleUrl:"https://github.com/settings/developers",setupSteps:[{title:"Открой github.com/settings/developers → OAuth Apps."},{title:"Нажми \xabNew OAuth App\xbb."},{title:"Application name — что угодно, например \xabReflex\xbb."},{title:"Homepage URL",field:"Homepage URL",copy:"http://localhost:3210"},{title:"Authorization callback URL",field:"Authorization callback URL",copy:"http://localhost:3210/api/oauth/callback"},{title:"Жми \xabRegister application\xbb."},{title:"Скопируй \xabClient ID\xbb отсюда → в Reflex."},{title:"Нажми \xabGenerate a new client secret\xbb, скопируй значение сразу (показывается один раз) → в Reflex."}]},notion:{id:"notion",label:"Notion",authorizeUrl:"https://api.notion.com/v1/oauth/authorize",tokenUrl:"https://api.notion.com/v1/oauth/token",defaultScopes:[],supportsPKCE:!1,refreshTokenSupported:!1,extraAuthorizeParams:{owner:"user"},needsClientSecret:!0,setupHint:"Reflex использует Public integration (с OAuth flow), не Internal.",consoleUrl:"https://www.notion.so/profile/integrations",setupSteps:[{title:"Открой notion.so/profile/integrations → \xab+ New integration\xbb."},{title:"Name — \xabReflex\xbb."},{title:"Associated workspace — твой workspace."},{title:"Type",choice:"Public",body:"Internal не подходит — для OAuth flow нужна публичная integration."},{title:"Submit → integration создана. Перейди на её страницу."},{title:"В разделе \xabOAuth Domain & URIs\xbb → Redirect URIs → Add URI",field:"Redirect URIs",copy:"http://localhost:3210/api/oauth/callback"},{title:"Save."},{title:"В \xabSecrets\xbb скопируй OAuth client ID и OAuth client secret сюда."}]},slack:{id:"slack",label:"Slack",authorizeUrl:"https://slack.com/oauth/v2/authorize",tokenUrl:"https://slack.com/api/oauth.v2.access",defaultScopes:["chat:write","channels:read"],supportsPKCE:!1,refreshTokenSupported:!0,extraAuthorizeParams:{},needsClientSecret:!0,setupHint:"Scopes по умолчанию (chat:write, channels:read) можно расширить в OAuth & Permissions.",consoleUrl:"https://api.slack.com/apps",setupSteps:[{title:"Открой api.slack.com/apps → \xabCreate New App\xbb → \xabFrom scratch\xbb."},{title:"App Name — \xabReflex\xbb, выбери свой workspace → Create App."},{title:"В левой панели открой \xabOAuth & Permissions\xbb → Redirect URLs → \xabAdd New Redirect URL\xbb",field:"Redirect URLs",copy:"http://localhost:3210/api/oauth/callback"},{title:"Save URLs."},{title:"Под Scopes → User Token Scopes добавь нужные (chat:write, channels:read и т.д. — из defaults Reflex)."},{title:"Вверху страницы Install App → разреши доступ → получишь Client ID и Client Secret в \xabBasic Information\xbb."}]},linear:{id:"linear",label:"Linear",authorizeUrl:"https://linear.app/oauth/authorize",tokenUrl:"https://api.linear.app/oauth/token",defaultScopes:["read","write"],supportsPKCE:!1,refreshTokenSupported:!0,extraAuthorizeParams:{},needsClientSecret:!0,setupHint:"Личная OAuth-aplication привязывается к твоему workspace.",consoleUrl:"https://linear.app/settings/api/applications/new",setupSteps:[{title:"Открой linear.app/settings/api/applications/new (Settings → API → OAuth applications → Create new)."},{title:"Name — \xabReflex\xbb, описание любое."},{title:"Developer URL",field:"Developer URL",copy:"http://localhost:3210"},{title:"Callback URLs",field:"Callback URLs",copy:"http://localhost:3210/api/oauth/callback"},{title:"Scopes — отметь read + write (или те, что нужны: issues:create и т.п.)."},{title:"Submit → копируй Client ID + Client Secret сюда."}]}},m=Object.keys(l),n="http://localhost:3210/api/oauth/callback",o=h().join(f().homedir(),".reflex","oauth","providers.json"),p=i.Ik({version:i.eu(1),providers:i.YO(k)});async function q(){try{let a=await d.promises.readFile(o,"utf8"),b=p.safeParse(JSON.parse(a));if(!b.success)return{version:1,providers:[]};return b.data}catch{return{version:1,providers:[]}}}async function r(a){await d.promises.mkdir(h().dirname(o),{recursive:!0}),await d.promises.writeFile(o,JSON.stringify(a,null,2)+"\n",{encoding:"utf8",mode:384});try{await d.promises.chmod(o,384)}catch{}}async function s(){let a=await q(),b=new Set(a.providers.map(a=>a.id)),c=[];for(let a of m)b.has(a)||c.push({def:l[a],origin:"builtin"});for(let b of a.providers)c.push({def:b,origin:"user"});return c}async function t(a){let b=await s();return b.find(b=>b.def.id===a)?.def??null}async function u(a){return await t(a)!==null}async function v(a){let b=k.parse(a);if(void 0!==l[b.id])throw Error(`"${b.id}" is a built-in provider id — pick a different slug`);let c=await q();if(c.providers.some(a=>a.id===b.id))throw Error(`provider "${b.id}" already exists`);c.providers.push(b),await r(c)}async function w(a,b){if(void 0!==l[a])throw Error(`cannot edit built-in provider "${a}"`);let c=await q(),d=c.providers.findIndex(b=>b.id===a);if(d<0)throw Error(`provider "${a}" not found`);let e=k.parse({...c.providers[d],...b,id:a});c.providers[d]=e,await r(c)}async function x(a){if(void 0!==l[a])throw Error(`cannot remove built-in provider "${a}"`);let b=await q(),c=b.providers.filter(b=>b.id!==a);c.length!==b.providers.length&&(b.providers=c,await r(b))}},61888:(a,b,c)=>{c.d(b,{b:()=>i,getAccessToken:()=>j});var d=c(77598),e=c(10094),f=c(1223);let g=globalThis.__reflexOAuthPending??new Map;function h(a){return a.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function i(a,b){let c,i=Date.now()-9e5;for(let[a,b]of g)b.createdAt<i&&g.delete(a);let j=await (0,e.getOAuthProvider)(a);if(!j)throw Error(`unknown provider: ${a}`);let k=await (0,f.tY)(a);if(!k)throw Error(`OAuth client for "${a}" is not configured — set client_id/secret in Settings → OAuth first`);let l=h((0,d.randomBytes)(24)),m=b&&b.length>0?b:k.scopes&&k.scopes.length>0?k.scopes:j.defaultScopes,n=new URLSearchParams({client_id:k.clientId,redirect_uri:e.Cs,response_type:"code",state:l,...m.length>0?{scope:m.join(" ")}:{},...j.extraAuthorizeParams??{}});if(j.supportsPKCE){let{verifier:a,challenge:b}=function(){let a=h((0,d.randomBytes)(32)),b=h((0,d.createHash)("sha256").update(a).digest());return{verifier:a,challenge:b}}();c=a,n.set("code_challenge",b),n.set("code_challenge_method","S256")}g.set(l,{provider:a,...void 0!==c?{codeVerifier:c}:{},scopes:m,createdAt:Date.now()});let o=k.authorizeUrl??j.authorizeUrl;return{authorizeUrl:`${o}?${n.toString()}`,state:l}}async function j(a){let b=await (0,e.getOAuthProvider)(a);if(!b)throw Error(`unknown provider: ${a}`);let c=await (0,f.getOAuthTokens)(a);if(!c)throw Error(`provider "${a}" not authorized — open Settings → OAuth and click Authorize`);if(!(void 0!==c.expiresAt&&c.expiresAt-6e4<Date.now()))return c.accessToken;if(!c.refreshToken)throw Error(`access token for "${a}" expired and no refresh_token — re-authorize`);let d=await (0,f.tY)(a);if(!d)throw Error(`OAuth client for "${a}" is not configured`);let g=new URLSearchParams({grant_type:"refresh_token",refresh_token:c.refreshToken,client_id:d.clientId});b.needsClientSecret&&d.clientSecret&&g.set("client_secret",d.clientSecret);let h=await k(b,d,g),i={accessToken:h.accessToken,refreshToken:h.refreshToken??c.refreshToken,...void 0!==h.expiresAt?{expiresAt:h.expiresAt}:{},...h.scope?{scope:h.scope}:c.scope?{scope:c.scope}:{},...h.tokenType?{tokenType:h.tokenType}:c.tokenType?{tokenType:c.tokenType}:{}};return await (0,f.Dt)(a,i),i.accessToken}async function k(a,b,c){let d,e=b.tokenUrl??a.tokenUrl,f=await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"},body:c.toString()}),g=await f.text();if(!f.ok)throw Error(`token endpoint HTTP ${f.status}: ${g.slice(0,500)}`);if(g.trim().startsWith("{"))d=JSON.parse(g);else for(let[a,b]of(d={},new URLSearchParams(g)))d[a]=b;if(d.error)throw Error(`OAuth error: ${d.error}${d.error_description?` — ${d.error_description}`:""}`);let h="string"==typeof d.access_token?d.access_token:null;if(!h)throw Error(`token endpoint returned no access_token (${g.slice(0,200)})`);let i="number"==typeof d.expires_in?d.expires_in:"string"==typeof d.expires_in?Number(d.expires_in):void 0;return{accessToken:h,..."string"==typeof d.refresh_token?{refreshToken:d.refresh_token}:{},...void 0!==i&&!Number.isNaN(i)?{expiresAt:Date.now()+1e3*i}:{},..."string"==typeof d.scope?{scope:d.scope}:{},..."string"==typeof d.token_type?{tokenType:d.token_type}:{}}}globalThis.__reflexOAuthPending=g}};
1
+ "use strict";exports.id=1888,exports.ids=[94,1223,1888],exports.modules={1223:(a,b,c)=>{c.d(b,{De:()=>u,Dt:()=>s,Sh:()=>r,cL:()=>p,getOAuthTokens:()=>t,gi:()=>v,tY:()=>q});var d=c(73024),e=c(76760),f=c.n(e),g=c(10094),h=c(73652);let i=f().join((0,h._)(),"oauth"),j=f().join(i,"clients"),k=f().join(i,"tokens");function l(a){return f().join(j,`${a}.json`)}function m(a){return f().join(k,`${a}.json`)}async function n(a,b){await d.promises.mkdir(f().dirname(a),{recursive:!0}),await d.promises.writeFile(a,JSON.stringify(b,null,2)+"\n",{encoding:"utf8",mode:384});try{await d.promises.chmod(a,384)}catch{}}async function o(a){try{let b=await d.promises.readFile(a,"utf8");return JSON.parse(b)}catch{return null}}async function p(a,b){let{getOAuthProvider:d}=await Promise.resolve().then(c.bind(c,10094));if(!await d(a))throw Error(`unknown provider: ${a}`);await n(l(a),{...b,updatedAt:new Date().toISOString()})}async function q(a){return o(l(a))}async function r(a){try{await d.promises.unlink(l(a))}catch{}}async function s(a,b){await n(m(a),{...b,updatedAt:new Date().toISOString()})}async function t(a){return o(m(a))}async function u(a){try{await d.promises.unlink(m(a))}catch{}}async function v(){let a=[];for(let b of(await (0,g.E4)())){let c=b.def,d=await q(c.id),e=await t(c.id);a.push({id:c.id,label:c.label,hasClient:!!d,hasTokens:!!e,...e?.expiresAt!==void 0?{expiresAt:e.expiresAt}:{},setupHint:c.setupHint,consoleUrl:c.consoleUrl,origin:b.origin,setupSteps:c.setupSteps})}return a}},10094:(a,b,c)=>{c.d(b,{Cs:()=>n,E4:()=>s,H:()=>w,To:()=>v,getOAuthProvider:()=>t,isOAuthProviderId:()=>u,lL:()=>k,uq:()=>x});var d=c(73024),e=c(48161),f=c.n(e),g=c(76760),h=c.n(g),i=c(56149);let j=i.Ik({title:i.Yj().min(1).max(200),body:i.Yj().max(2e3).optional(),field:i.Yj().max(200).optional(),copy:i.Yj().max(2e3).optional(),choice:i.Yj().max(200).optional()}),k=i.Ik({id:i.Yj().min(1).max(64).regex(/^[a-z][a-z0-9-]*$/,"provider id must be kebab-case (e.g. google, dropbox)"),label:i.Yj().min(1).max(120),authorizeUrl:i.Yj().url(),tokenUrl:i.Yj().url(),defaultScopes:i.YO(i.Yj()).default([]),supportsPKCE:i.zM().default(!0),refreshTokenSupported:i.zM().default(!0),extraAuthorizeParams:i.g1(i.Yj(),i.Yj()).default({}),needsClientSecret:i.zM().default(!0),setupHint:i.Yj().default(""),consoleUrl:i.Yj().url(),setupSteps:i.YO(j).default([])}),l={google:{id:"google",label:"Google",authorizeUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",defaultScopes:["openid","email","https://www.googleapis.com/auth/calendar"],supportsPKCE:!0,refreshTokenSupported:!0,extraAuthorizeParams:{access_type:"offline",prompt:"consent"},needsClientSecret:!0,setupHint:"Если ещё не делал — сначала включи нужный API (Calendar/Gmail/Drive) во вкладке APIs & Services → Library.",consoleUrl:"https://console.cloud.google.com/apis/credentials",setupSteps:[{title:"Открой Google Cloud Console → APIs & Services → Credentials."},{title:"Нажми \xab+ CREATE CREDENTIALS\xbb → \xabOAuth client ID\xbb."},{title:"Application type",choice:"Web application",body:"Не \xabDesktop\xbb — Reflex использует фиксированный localhost-redirect."},{title:"Name — любое, например \xabReflex\xbb."},{title:"Authorized redirect URIs → ADD URI",field:"Authorized redirect URIs",copy:"http://localhost:3210/api/oauth/callback",body:"Точно как есть, без слэша в конце, http (не https)."},{title:"Жми CREATE → откроется попап с Client ID и Client Secret."},{title:"Скопируй сюда оба значения. (Если потерял — открой клиент в Credentials, \xabDownload JSON\xbb или \xabReset secret\xbb.)"},{title:"Перед первым Authorize убедись, что нужный API включён: APIs & Services → Library → Google Calendar API → Enable (для других сервисов — аналогично)."}]},github:{id:"github",label:"GitHub",authorizeUrl:"https://github.com/login/oauth/authorize",tokenUrl:"https://github.com/login/oauth/access_token",defaultScopes:["repo","read:user"],supportsPKCE:!1,refreshTokenSupported:!1,extraAuthorizeParams:{},needsClientSecret:!0,setupHint:"Личные OAuth Apps живут в Settings → Developer settings.",consoleUrl:"https://github.com/settings/developers",setupSteps:[{title:"Открой github.com/settings/developers → OAuth Apps."},{title:"Нажми \xabNew OAuth App\xbb."},{title:"Application name — что угодно, например \xabReflex\xbb."},{title:"Homepage URL",field:"Homepage URL",copy:"http://localhost:3210"},{title:"Authorization callback URL",field:"Authorization callback URL",copy:"http://localhost:3210/api/oauth/callback"},{title:"Жми \xabRegister application\xbb."},{title:"Скопируй \xabClient ID\xbb отсюда → в Reflex."},{title:"Нажми \xabGenerate a new client secret\xbb, скопируй значение сразу (показывается один раз) → в Reflex."}]},notion:{id:"notion",label:"Notion",authorizeUrl:"https://api.notion.com/v1/oauth/authorize",tokenUrl:"https://api.notion.com/v1/oauth/token",defaultScopes:[],supportsPKCE:!1,refreshTokenSupported:!1,extraAuthorizeParams:{owner:"user"},needsClientSecret:!0,setupHint:"Reflex использует Public integration (с OAuth flow), не Internal.",consoleUrl:"https://www.notion.so/profile/integrations",setupSteps:[{title:"Открой notion.so/profile/integrations → \xab+ New integration\xbb."},{title:"Name — \xabReflex\xbb."},{title:"Associated workspace — твой workspace."},{title:"Type",choice:"Public",body:"Internal не подходит — для OAuth flow нужна публичная integration."},{title:"Submit → integration создана. Перейди на её страницу."},{title:"В разделе \xabOAuth Domain & URIs\xbb → Redirect URIs → Add URI",field:"Redirect URIs",copy:"http://localhost:3210/api/oauth/callback"},{title:"Save."},{title:"В \xabSecrets\xbb скопируй OAuth client ID и OAuth client secret сюда."}]},slack:{id:"slack",label:"Slack",authorizeUrl:"https://slack.com/oauth/v2/authorize",tokenUrl:"https://slack.com/api/oauth.v2.access",defaultScopes:["chat:write","channels:read"],supportsPKCE:!1,refreshTokenSupported:!0,extraAuthorizeParams:{},needsClientSecret:!0,setupHint:"Scopes по умолчанию (chat:write, channels:read) можно расширить в OAuth & Permissions.",consoleUrl:"https://api.slack.com/apps",setupSteps:[{title:"Открой api.slack.com/apps → \xabCreate New App\xbb → \xabFrom scratch\xbb."},{title:"App Name — \xabReflex\xbb, выбери свой workspace → Create App."},{title:"В левой панели открой \xabOAuth & Permissions\xbb → Redirect URLs → \xabAdd New Redirect URL\xbb",field:"Redirect URLs",copy:"http://localhost:3210/api/oauth/callback"},{title:"Save URLs."},{title:"Под Scopes → User Token Scopes добавь нужные (chat:write, channels:read и т.д. — из defaults Reflex)."},{title:"Вверху страницы Install App → разреши доступ → получишь Client ID и Client Secret в \xabBasic Information\xbb."}]},linear:{id:"linear",label:"Linear",authorizeUrl:"https://linear.app/oauth/authorize",tokenUrl:"https://api.linear.app/oauth/token",defaultScopes:["read","write"],supportsPKCE:!1,refreshTokenSupported:!0,extraAuthorizeParams:{},needsClientSecret:!0,setupHint:"Личная OAuth-aplication привязывается к твоему workspace.",consoleUrl:"https://linear.app/settings/api/applications/new",setupSteps:[{title:"Открой linear.app/settings/api/applications/new (Settings → API → OAuth applications → Create new)."},{title:"Name — \xabReflex\xbb, описание любое."},{title:"Developer URL",field:"Developer URL",copy:"http://localhost:3210"},{title:"Callback URLs",field:"Callback URLs",copy:"http://localhost:3210/api/oauth/callback"},{title:"Scopes — отметь read + write (или те, что нужны: issues:create и т.п.)."},{title:"Submit → копируй Client ID + Client Secret сюда."}]}},m=Object.keys(l),n="http://localhost:3210/api/oauth/callback",o=h().join(f().homedir(),".reflex","oauth","providers.json"),p=i.Ik({version:i.eu(1),providers:i.YO(k)});async function q(){try{let a=await d.promises.readFile(o,"utf8"),b=p.safeParse(JSON.parse(a));if(!b.success)return{version:1,providers:[]};return b.data}catch{return{version:1,providers:[]}}}async function r(a){await d.promises.mkdir(h().dirname(o),{recursive:!0}),await d.promises.writeFile(o,JSON.stringify(a,null,2)+"\n",{encoding:"utf8",mode:384});try{await d.promises.chmod(o,384)}catch{}}async function s(){let a=await q(),b=new Set(a.providers.map(a=>a.id)),c=[];for(let a of m)b.has(a)||c.push({def:l[a],origin:"builtin"});for(let b of a.providers)c.push({def:b,origin:"user"});return c}async function t(a){let b=await s();return b.find(b=>b.def.id===a)?.def??null}async function u(a){return await t(a)!==null}async function v(a){let b=k.parse(a);if(void 0!==l[b.id])throw Error(`"${b.id}" is a built-in provider id — pick a different slug`);let c=await q();if(c.providers.some(a=>a.id===b.id))throw Error(`provider "${b.id}" already exists`);c.providers.push(b),await r(c)}async function w(a,b){if(void 0!==l[a])throw Error(`cannot edit built-in provider "${a}"`);let c=await q(),d=c.providers.findIndex(b=>b.id===a);if(d<0)throw Error(`provider "${a}" not found`);let e=k.parse({...c.providers[d],...b,id:a});c.providers[d]=e,await r(c)}async function x(a){if(void 0!==l[a])throw Error(`cannot remove built-in provider "${a}"`);let b=await q(),c=b.providers.filter(b=>b.id!==a);c.length!==b.providers.length&&(b.providers=c,await r(b))}},61888:(a,b,c)=>{c.d(b,{b:()=>i,getAccessToken:()=>j});var d=c(77598),e=c(10094),f=c(1223);let g=globalThis.__reflexOAuthPending??new Map;function h(a){return a.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function i(a,b){let c,i=Date.now()-9e5;for(let[a,b]of g)b.createdAt<i&&g.delete(a);let j=await (0,e.getOAuthProvider)(a);if(!j)throw Error(`unknown provider: ${a}`);let k=await (0,f.tY)(a);if(!k)throw Error(`OAuth client for "${a}" is not configured — set client_id/secret in Settings → OAuth first`);let l=h((0,d.randomBytes)(24)),m=b&&b.length>0?b:k.scopes&&k.scopes.length>0?k.scopes:j.defaultScopes,n=new URLSearchParams({client_id:k.clientId,redirect_uri:e.Cs,response_type:"code",state:l,...m.length>0?{scope:m.join(" ")}:{},...j.extraAuthorizeParams??{}});if(j.supportsPKCE){let{verifier:a,challenge:b}=function(){let a=h((0,d.randomBytes)(32)),b=h((0,d.createHash)("sha256").update(a).digest());return{verifier:a,challenge:b}}();c=a,n.set("code_challenge",b),n.set("code_challenge_method","S256")}g.set(l,{provider:a,...void 0!==c?{codeVerifier:c}:{},scopes:m,createdAt:Date.now()});let o=k.authorizeUrl??j.authorizeUrl;return{authorizeUrl:`${o}?${n.toString()}`,state:l}}async function j(a){let b=await (0,e.getOAuthProvider)(a);if(!b)throw Error(`unknown provider: ${a}`);let c=await (0,f.getOAuthTokens)(a);if(!c)throw Error(`provider "${a}" not authorized — open Settings → OAuth and click Authorize`);if(!(void 0!==c.expiresAt&&c.expiresAt-6e4<Date.now()))return c.accessToken;if(!c.refreshToken)throw Error(`access token for "${a}" expired and no refresh_token — re-authorize`);let d=await (0,f.tY)(a);if(!d)throw Error(`OAuth client for "${a}" is not configured`);let g=new URLSearchParams({grant_type:"refresh_token",refresh_token:c.refreshToken,client_id:d.clientId});b.needsClientSecret&&d.clientSecret&&g.set("client_secret",d.clientSecret);let h=await k(b,d,g),i={accessToken:h.accessToken,refreshToken:h.refreshToken??c.refreshToken,...void 0!==h.expiresAt?{expiresAt:h.expiresAt}:{},...h.scope?{scope:h.scope}:c.scope?{scope:c.scope}:{},...h.tokenType?{tokenType:h.tokenType}:c.tokenType?{tokenType:c.tokenType}:{}};return await (0,f.Dt)(a,i),i.accessToken}async function k(a,b,c){let d,e=b.tokenUrl??a.tokenUrl,f=await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"},body:c.toString()}),g=await f.text();if(!f.ok)throw Error(`token endpoint HTTP ${f.status}: ${g.slice(0,500)}`);if(g.trim().startsWith("{"))d=JSON.parse(g);else for(let[a,b]of(d={},new URLSearchParams(g)))d[a]=b;if(d.error)throw Error(`OAuth error: ${d.error}${d.error_description?` — ${d.error_description}`:""}`);let h="string"==typeof d.access_token?d.access_token:null;if(!h)throw Error(`token endpoint returned no access_token (${g.slice(0,200)})`);let i="number"==typeof d.expires_in?d.expires_in:"string"==typeof d.expires_in?Number(d.expires_in):void 0;return{accessToken:h,..."string"==typeof d.refresh_token?{refreshToken:d.refresh_token}:{},...void 0!==i&&!Number.isNaN(i)?{expiresAt:Date.now()+1e3*i}:{},..."string"==typeof d.scope?{scope:d.scope}:{},..."string"==typeof d.token_type?{tokenType:d.token_type}:{}}}globalThis.__reflexOAuthPending=g}};
@@ -1 +1 @@
1
- "use strict";exports.id=1986,exports.ids=[1986],exports.modules={17640:(a,b,c)=>{c.d(b,{M:()=>q,D:()=>r});var d=c(73024),e=c(76760),f=c.n(e),g=c(48161),h=c.n(g),i=c(14126);let j=i.Ik({"claude-code":i.Ik({enabled:i.zM().default(!0)}),codex:i.Ik({enabled:i.zM().default(!0)}),ollama:i.Ik({enabled:i.zM().default(!0),baseUrl:i.Yj().url().default("http://localhost:11434")})}),k=i.Ik({harness:i.k5(["claude-code","codex","ollama"]),model:i.Yj().min(1),allowedTools:i.YO(i.Yj()).default([])}),l=i.Ik({enabled:i.zM().default(!0),maxDimension:i.ai().int().min(256).max(8192).default(2e3),quality:i.ai().int().min(40).max(100).default(85),format:i.k5(["auto","jpeg","webp","original"]).default("auto")}),m=i.Ik({version:i.eu(1).default(1),language:i.Yj().min(1).default("english"),onboardedAt:i.Yj().optional(),userName:i.Yj().default(""),timezone:i.Yj().default(""),uiMode:i.k5(["simple","advanced"]).default("simple"),imageProcessing:l.default({enabled:!0,maxDimension:2e3,quality:85,format:"auto"}),harnesses:j.default({"claude-code":{enabled:!0},codex:{enabled:!0},ollama:{enabled:!0,baseUrl:"http://localhost:11434"}}),assignments:i.Ik({analyze:k,chat:k,rag:k,embed:k,quick:k}).default({analyze:{harness:"claude-code",model:"claude-opus-4-7",allowedTools:["Read","Write","Edit","LS","Glob","Grep","WebSearch","WebFetch"]},chat:{harness:"claude-code",model:"claude-sonnet-4-6",allowedTools:["Read","LS","Glob","Grep","WebSearch","WebFetch"]},rag:{harness:"ollama",model:"llama3.1:8b",allowedTools:[]},embed:{harness:"ollama",model:"nomic-embed-text",allowedTools:[]},quick:{harness:"claude-code",model:"claude-haiku-4-5",allowedTools:[]}}),mapServices:i.Ik({enabled:i.YO(i.Yj()).default(["google","yandex","apple","osm"])}).default({enabled:["google","yandex","apple","osm"]}),ngrok:i.Ik({authtoken:i.Yj().default(""),apiKey:i.Yj().default(""),domain:i.Yj().default(""),port:i.ai().int().min(1).max(65535).default(3210)}).default({authtoken:"",apiKey:"",domain:"",port:3210})}),n=m.parse({}),o=f().join(h().homedir(),".reflex"),p=f().join(o,"settings.json");async function q(){try{let a=await d.promises.readFile(p,"utf8"),b=m.safeParse(JSON.parse(a));if(!b.success)return n;return b.data}catch(b){var a;if("object"==typeof(a=b)&&null!==a&&"code"in a&&"ENOENT"===a.code)return n;throw b}}async function r(a){let b=m.parse(a);await d.promises.mkdir(o,{recursive:!0}),await d.promises.writeFile(p,JSON.stringify(b,null,2)+"\n","utf8")}},18746:(a,b,c)=>{c.d(b,{O1:()=>p,Gh:()=>q,AZ:()=>o,rD:()=>r,summarizeYoutubeAction:()=>n});var d=c(31776);c(428);var e=c(43180);let f=globalThis.__reflexGeminiModelsCache??new Map;async function g(a){let b,c=await (0,e.CG)("gemini");if(!c)throw Error("Gemini API key not configured");let d=c.slice(0,16),g=f.get(d);if(!a?.refresh&&g&&Date.now()-g.fetchedAt<36e5)return g.models;let i=[];do{let a=new URL("https://generativelanguage.googleapis.com/v1beta/models");a.searchParams.set("key",c),a.searchParams.set("pageSize","100"),b&&a.searchParams.set("pageToken",b);let d=await fetch(a.toString(),{headers:{Accept:"application/json"}});if(!d.ok){let a=await d.text();throw Error(`models.list HTTP ${d.status}: ${a.slice(0,500)}`)}let e=await d.json();for(let a of e.models??[]){if(!a.name)continue;let b=a.supportedGenerationMethods??[];if(!b.includes("generateContent"))continue;let c=a.name.toLowerCase();!c.includes("embedding")&&(c.includes("aqa")||i.push({name:a.name,id:a.name.replace(/^models\//,""),...a.displayName?{displayName:a.displayName}:{},...a.description?{description:a.description}:{},...void 0!==a.inputTokenLimit?{inputTokenLimit:a.inputTokenLimit}:{},...void 0!==a.outputTokenLimit?{outputTokenLimit:a.outputTokenLimit}:{},supportedGenerationMethods:b}))}b=e.nextPageToken}while(b);return i.sort(h),f.set(d,{fetchedAt:Date.now(),models:i}),i}function h(a,b){let c=i(a.id),d=i(b.id);if(c!==d)return c-d;let e=j(a.id),f=j(b.id);return e!==f?f-e:a.id.localeCompare(b.id)}function i(a){return a.endsWith("flash-latest")?0:a.includes("flash")&&!a.includes("lite")?1:a.includes("flash-lite")?2:a.endsWith("pro-latest")||a.includes("pro")?3:4}function j(a){let b=/gemini-(\d+)\.(\d+)/.exec(a);return b?100*Number(b[1])+Number(b[2]):0}async function k(a="general"){let b=await (0,e.$L)("gemini");if("video"===a&&b?.videoModel)return b.videoModel;if(b?.model)return b.model;try{let a=await g();if(a.length>0)return a[0].id}catch{}return"gemini-flash-latest"}async function l(a){let b=`https://generativelanguage.googleapis.com/v1beta/models/${encodeURIComponent(a.model)}:generateContent?key=${encodeURIComponent(a.apiKey)}`,c=await fetch(b,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({contents:a.contents,...a.generationConfig?{generationConfig:a.generationConfig}:{}})}),d=await c.text();if(!c.ok)throw Error(`Gemini HTTP ${c.status}: ${d.slice(0,800)}`);let e=JSON.parse(d);if(e.promptFeedback?.blockReason)throw Error(`Gemini blocked: ${e.promptFeedback.blockReason}`);return{text:(e.candidates??[]).flatMap(a=>a.content?.parts??[]).map(a=>a.text??"").filter(Boolean).join("\n").trim(),raw:e}}globalThis.__reflexGeminiModelsCache=f;var m=c(17640);async function n(a){var b;let c=await (0,e.CG)("gemini");if(!c)return{ok:!1,needsKey:!0,error:"Gemini API key не сохранён — введи его, чтобы суммаризировать видео."};let d=(await (0,m.M)()).language??"russian",f=a.prompt?.trim()||(b=d,/russ/i.test(b)||/рус/i.test(b)?"Сделай структурированную выжимку этого YouTube-видео:\n\n1. Один абзац — о чём видео целиком и для кого.\n2. Главные тезисы списком с тайм-кодами вида `[mm:ss]`.\n3. Ключевые цитаты (если есть запоминающиеся фразы) — с тайм-кодами.\n4. Если показаны диаграммы / схемы / код — кратко опиши что в них.\n5. Вывод 1-3 предложения: главное, что стоит унести.\n\nПиши на русском, лаконично. Без воды.":"Produce a structured summary of this YouTube video:\n\n1. One paragraph — what the video is about and who it's for.\n2. Main points as a bulleted list with `[mm:ss]` timestamps.\n3. Notable quotes (if any) with timestamps.\n4. If diagrams / slides / code are shown — briefly describe them.\n5. 1-3 sentence takeaway.\n\nBe concise. No filler."),g=a.modelOverride?.trim()||await k("video");try{let{text:b}=await l({model:g,apiKey:c,contents:[{parts:[{file_data:{file_uri:a.url,mime_type:"video/*"}},{text:f}]}]});if(!b)return{ok:!1,error:"Gemini вернул пустой ответ — возможно видео недоступно или приватное."};return{ok:!0,text:b,model:g}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function o(a){try{if(!a.trim())return{ok:!1,error:"API key is empty"};return await (0,e.Pc)("gemini",a),{ok:!0}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function p(a){return{ok:!0,present:await (0,e.hasApiKey)(a)}}async function q(a=!1){try{let b=await g({refresh:a});return{ok:!0,models:b.map(a=>({id:a.id,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:a.description}:{},...void 0!==a.inputTokenLimit?{inputTokenLimit:a.inputTokenLimit}:{},...void 0!==a.outputTokenLimit?{outputTokenLimit:a.outputTokenLimit}:{}})),currentModel:await k("general"),currentVideoModel:await k("video")}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function r(a){try{return await (0,e.ND)("gemini",a),{ok:!0}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}(0,c(97364).D)([n,o,p,q,r]),(0,d.A)(n,"40d2ac7d931df057cc763c3416ffd2aee8ff7a0ad9",null),(0,d.A)(o,"409d333d3e7b13a505853122dbd9a15ab36b9a90a4",null),(0,d.A)(p,"40005cf3d13239849c55972ebb98aacb986e67de11",null),(0,d.A)(q,"40d982925be69266f12ff9cbf16f52d32c99cf7e09",null),(0,d.A)(r,"402911dc86b1ac898af85fb3251818acdd51a6f4e4",null)},43180:(a,b,c)=>{c.d(b,{$L:()=>k,CG:()=>l,ND:()=>o,Pc:()=>n,hasApiKey:()=>p});var d=c(73024),e=c(48161),f=c.n(e),g=c(76760),h=c.n(g);let i=h().join(f().homedir(),".reflex","api-keys");function j(a){return h().join(i,`${a}.json`)}async function k(a){try{let b=await d.promises.readFile(j(a),"utf8"),c=JSON.parse(b);if("string"!=typeof c.apiKey||0===c.apiKey.length)return null;return{apiKey:c.apiKey,..."string"==typeof c.model?{model:c.model}:{},..."string"==typeof c.videoModel?{videoModel:c.videoModel}:{},updatedAt:"string"==typeof c.updatedAt?c.updatedAt:new Date().toISOString()}}catch{return null}}async function l(a){let b=await k(a);return b?.apiKey??null}async function m(a,b){let c=j(a);await d.promises.mkdir(h().dirname(c),{recursive:!0}),await d.promises.writeFile(c,JSON.stringify(b,null,2)+"\n",{encoding:"utf8",mode:384});try{await d.promises.chmod(c,384)}catch{}}async function n(a,b){let c=await k(a);await m(a,{...c??{},apiKey:b.trim(),updatedAt:new Date().toISOString()})}async function o(a,b){let c=await k(a);if(!c)throw Error(`API key for "${a}" is not saved`);let d={apiKey:c.apiKey,updatedAt:new Date().toISOString()},e=void 0===b.model?c.model:b.model??void 0,f=void 0===b.videoModel?c.videoModel:b.videoModel??void 0;e&&(d.model=e),f&&(d.videoModel=f),await m(a,d)}async function p(a){return await l(a)!==null}},49353:(a,b,c)=>{c.d(b,{j:()=>j});var d=c(73024),e=c(76760),f=c.n(e),g=c(30192),h=c.n(g),i=c(13474);async function j(a){var b;let{rootPath:c,directive:e,provenance:g}=a,j=k(e.kind)||"note",m=new Date().toISOString().slice(0,10),n=((b=e.date)&&/^\d{4}-\d{2}-\d{2}$/.test(b)?b:null)??m,o=k(e.slug&&e.slug.trim()?e.slug:e.title)||"entry",p=`${n}-${o}`,q=f().join((0,i.FF)(c),j);await d.promises.mkdir(q,{recursive:!0});let r=await l(q,p,".md"),s={title:e.title,kind:j,date:n,version:1,...e.meta&&"object"==typeof e.meta?e.meta:{}};g&&(s.createdBy=`${g.kind}:${g.id}${g.version?"@"+g.version:""}`);let t=(e.body??"").replace(/\r\n/g,"\n").trimEnd(),u=h().stringify(t?t+"\n":"",s);await d.promises.writeFile(r,u,"utf8");let v=f().relative((0,i.FF)(c),r).split(f().sep).join("/");return{kind:j,title:e.title,relPath:v,absPath:r}}function k(a){return a.normalize("NFKD").toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"").slice(0,60)}async function l(a,b,c){let d=f().join(a,b+c),e=1;for(;await m(d);){if(e>99){d=f().join(a,`${b}-${Date.now().toString(36)}${c}`);break}d=f().join(a,`${b}-${++e}${c}`)}return d}async function m(a){try{return await d.promises.access(a),!0}catch{return!1}}}};
1
+ "use strict";exports.id=1986,exports.ids=[1986],exports.modules={17640:(a,b,c)=>{c.d(b,{M:()=>o,D:()=>p});var d=c(73024),e=c(76760),f=c.n(e),g=c(14126);let h=g.Ik({"claude-code":g.Ik({enabled:g.zM().default(!0)}),codex:g.Ik({enabled:g.zM().default(!0)}),ollama:g.Ik({enabled:g.zM().default(!0),baseUrl:g.Yj().url().default("http://localhost:11434")})}),i=g.Ik({harness:g.k5(["claude-code","codex","ollama"]),model:g.Yj().min(1),allowedTools:g.YO(g.Yj()).default([])}),j=g.Ik({enabled:g.zM().default(!0),maxDimension:g.ai().int().min(256).max(8192).default(2e3),quality:g.ai().int().min(40).max(100).default(85),format:g.k5(["auto","jpeg","webp","original"]).default("auto")}),k=g.Ik({version:g.eu(1).default(1),language:g.Yj().min(1).default("english"),onboardedAt:g.Yj().optional(),userName:g.Yj().default(""),timezone:g.Yj().default(""),uiMode:g.k5(["simple","advanced"]).default("simple"),imageProcessing:j.default({enabled:!0,maxDimension:2e3,quality:85,format:"auto"}),harnesses:h.default({"claude-code":{enabled:!0},codex:{enabled:!0},ollama:{enabled:!0,baseUrl:"http://localhost:11434"}}),assignments:g.Ik({analyze:i,chat:i,rag:i,embed:i,quick:i}).default({analyze:{harness:"claude-code",model:"claude-opus-4-7",allowedTools:["Read","Write","Edit","LS","Glob","Grep","WebSearch","WebFetch"]},chat:{harness:"claude-code",model:"claude-sonnet-4-6",allowedTools:["Read","LS","Glob","Grep","WebSearch","WebFetch"]},rag:{harness:"ollama",model:"llama3.1:8b",allowedTools:[]},embed:{harness:"ollama",model:"nomic-embed-text",allowedTools:[]},quick:{harness:"claude-code",model:"claude-haiku-4-5",allowedTools:[]}}),mapServices:g.Ik({enabled:g.YO(g.Yj()).default(["google","yandex","apple","osm"])}).default({enabled:["google","yandex","apple","osm"]}),ngrok:g.Ik({authtoken:g.Yj().default(""),apiKey:g.Yj().default(""),domain:g.Yj().default(""),port:g.ai().int().min(1).max(65535).default(3210)}).default({authtoken:"",apiKey:"",domain:"",port:3210})}),l=k.parse({}),m=(0,c(29163)._)(),n=f().join(m,"settings.json");async function o(){try{let a=await d.promises.readFile(n,"utf8"),b=k.safeParse(JSON.parse(a));if(!b.success)return l;return b.data}catch(b){var a;if("object"==typeof(a=b)&&null!==a&&"code"in a&&"ENOENT"===a.code)return l;throw b}}async function p(a){let b=k.parse(a);await d.promises.mkdir(m,{recursive:!0}),await d.promises.writeFile(n,JSON.stringify(b,null,2)+"\n","utf8")}},18746:(a,b,c)=>{c.d(b,{O1:()=>p,Gh:()=>q,AZ:()=>o,rD:()=>r,summarizeYoutubeAction:()=>n});var d=c(31776);c(428);var e=c(43180);let f=globalThis.__reflexGeminiModelsCache??new Map;async function g(a){let b,c=await (0,e.CG)("gemini");if(!c)throw Error("Gemini API key not configured");let d=c.slice(0,16),g=f.get(d);if(!a?.refresh&&g&&Date.now()-g.fetchedAt<36e5)return g.models;let i=[];do{let a=new URL("https://generativelanguage.googleapis.com/v1beta/models");a.searchParams.set("key",c),a.searchParams.set("pageSize","100"),b&&a.searchParams.set("pageToken",b);let d=await fetch(a.toString(),{headers:{Accept:"application/json"}});if(!d.ok){let a=await d.text();throw Error(`models.list HTTP ${d.status}: ${a.slice(0,500)}`)}let e=await d.json();for(let a of e.models??[]){if(!a.name)continue;let b=a.supportedGenerationMethods??[];if(!b.includes("generateContent"))continue;let c=a.name.toLowerCase();!c.includes("embedding")&&(c.includes("aqa")||i.push({name:a.name,id:a.name.replace(/^models\//,""),...a.displayName?{displayName:a.displayName}:{},...a.description?{description:a.description}:{},...void 0!==a.inputTokenLimit?{inputTokenLimit:a.inputTokenLimit}:{},...void 0!==a.outputTokenLimit?{outputTokenLimit:a.outputTokenLimit}:{},supportedGenerationMethods:b}))}b=e.nextPageToken}while(b);return i.sort(h),f.set(d,{fetchedAt:Date.now(),models:i}),i}function h(a,b){let c=i(a.id),d=i(b.id);if(c!==d)return c-d;let e=j(a.id),f=j(b.id);return e!==f?f-e:a.id.localeCompare(b.id)}function i(a){return a.endsWith("flash-latest")?0:a.includes("flash")&&!a.includes("lite")?1:a.includes("flash-lite")?2:a.endsWith("pro-latest")||a.includes("pro")?3:4}function j(a){let b=/gemini-(\d+)\.(\d+)/.exec(a);return b?100*Number(b[1])+Number(b[2]):0}async function k(a="general"){let b=await (0,e.$L)("gemini");if("video"===a&&b?.videoModel)return b.videoModel;if(b?.model)return b.model;try{let a=await g();if(a.length>0)return a[0].id}catch{}return"gemini-flash-latest"}async function l(a){let b=`https://generativelanguage.googleapis.com/v1beta/models/${encodeURIComponent(a.model)}:generateContent?key=${encodeURIComponent(a.apiKey)}`,c=await fetch(b,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({contents:a.contents,...a.generationConfig?{generationConfig:a.generationConfig}:{}})}),d=await c.text();if(!c.ok)throw Error(`Gemini HTTP ${c.status}: ${d.slice(0,800)}`);let e=JSON.parse(d);if(e.promptFeedback?.blockReason)throw Error(`Gemini blocked: ${e.promptFeedback.blockReason}`);return{text:(e.candidates??[]).flatMap(a=>a.content?.parts??[]).map(a=>a.text??"").filter(Boolean).join("\n").trim(),raw:e}}globalThis.__reflexGeminiModelsCache=f;var m=c(17640);async function n(a){var b;let c=await (0,e.CG)("gemini");if(!c)return{ok:!1,needsKey:!0,error:"Gemini API key не сохранён — введи его, чтобы суммаризировать видео."};let d=(await (0,m.M)()).language??"russian",f=a.prompt?.trim()||(b=d,/russ/i.test(b)||/рус/i.test(b)?"Сделай структурированную выжимку этого YouTube-видео:\n\n1. Один абзац — о чём видео целиком и для кого.\n2. Главные тезисы списком с тайм-кодами вида `[mm:ss]`.\n3. Ключевые цитаты (если есть запоминающиеся фразы) — с тайм-кодами.\n4. Если показаны диаграммы / схемы / код — кратко опиши что в них.\n5. Вывод 1-3 предложения: главное, что стоит унести.\n\nПиши на русском, лаконично. Без воды.":"Produce a structured summary of this YouTube video:\n\n1. One paragraph — what the video is about and who it's for.\n2. Main points as a bulleted list with `[mm:ss]` timestamps.\n3. Notable quotes (if any) with timestamps.\n4. If diagrams / slides / code are shown — briefly describe them.\n5. 1-3 sentence takeaway.\n\nBe concise. No filler."),g=a.modelOverride?.trim()||await k("video");try{let{text:b}=await l({model:g,apiKey:c,contents:[{parts:[{file_data:{file_uri:a.url,mime_type:"video/*"}},{text:f}]}]});if(!b)return{ok:!1,error:"Gemini вернул пустой ответ — возможно видео недоступно или приватное."};return{ok:!0,text:b,model:g}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function o(a){try{if(!a.trim())return{ok:!1,error:"API key is empty"};return await (0,e.Pc)("gemini",a),{ok:!0}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function p(a){return{ok:!0,present:await (0,e.hasApiKey)(a)}}async function q(a=!1){try{let b=await g({refresh:a});return{ok:!0,models:b.map(a=>({id:a.id,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:a.description}:{},...void 0!==a.inputTokenLimit?{inputTokenLimit:a.inputTokenLimit}:{},...void 0!==a.outputTokenLimit?{outputTokenLimit:a.outputTokenLimit}:{}})),currentModel:await k("general"),currentVideoModel:await k("video")}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function r(a){try{return await (0,e.ND)("gemini",a),{ok:!0}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}(0,c(97364).D)([n,o,p,q,r]),(0,d.A)(n,"401eac9fe3fbb4a7f61eeff7ea7cc8e71c9f1a0977",null),(0,d.A)(o,"40fd1533240185f6135e50fb9eafce5e9282143166",null),(0,d.A)(p,"40468c5b8c69571e7920016705c223b3fb93f19224",null),(0,d.A)(q,"4005c7c57fb9c78e219414f3ac01086fada23025d7",null),(0,d.A)(r,"4048a385d11a64704556aef06b0e78717760f0aca5",null)},43180:(a,b,c)=>{c.d(b,{$L:()=>j,CG:()=>k,ND:()=>n,Pc:()=>m,hasApiKey:()=>o});var d=c(73024),e=c(76760),f=c.n(e),g=c(29163);let h=f().join((0,g._)(),"api-keys");function i(a){return f().join(h,`${a}.json`)}async function j(a){try{let b=await d.promises.readFile(i(a),"utf8"),c=JSON.parse(b);if("string"!=typeof c.apiKey||0===c.apiKey.length)return null;return{apiKey:c.apiKey,..."string"==typeof c.model?{model:c.model}:{},..."string"==typeof c.videoModel?{videoModel:c.videoModel}:{},updatedAt:"string"==typeof c.updatedAt?c.updatedAt:new Date().toISOString()}}catch{return null}}async function k(a){let b=await j(a);return b?.apiKey??null}async function l(a,b){let c=i(a);await d.promises.mkdir(f().dirname(c),{recursive:!0}),await d.promises.writeFile(c,JSON.stringify(b,null,2)+"\n",{encoding:"utf8",mode:384});try{await d.promises.chmod(c,384)}catch{}}async function m(a,b){let c=await j(a);await l(a,{...c??{},apiKey:b.trim(),updatedAt:new Date().toISOString()})}async function n(a,b){let c=await j(a);if(!c)throw Error(`API key for "${a}" is not saved`);let d={apiKey:c.apiKey,updatedAt:new Date().toISOString()},e=void 0===b.model?c.model:b.model??void 0,f=void 0===b.videoModel?c.videoModel:b.videoModel??void 0;e&&(d.model=e),f&&(d.videoModel=f),await l(a,d)}async function o(a){return await k(a)!==null}},49353:(a,b,c)=>{c.d(b,{j:()=>j});var d=c(73024),e=c(76760),f=c.n(e),g=c(30192),h=c.n(g),i=c(13474);async function j(a){var b;let{rootPath:c,directive:e,provenance:g}=a,j=k(e.kind)||"note",m=new Date().toISOString().slice(0,10),n=((b=e.date)&&/^\d{4}-\d{2}-\d{2}$/.test(b)?b:null)??m,o=k(e.slug&&e.slug.trim()?e.slug:e.title)||"entry",p=`${n}-${o}`,q=f().join((0,i.FF)(c),j);await d.promises.mkdir(q,{recursive:!0});let r=await l(q,p,".md"),s={title:e.title,kind:j,date:n,version:1,...e.meta&&"object"==typeof e.meta?e.meta:{}};g&&(s.createdBy=`${g.kind}:${g.id}${g.version?"@"+g.version:""}`);let t=(e.body??"").replace(/\r\n/g,"\n").trimEnd(),u=h().stringify(t?t+"\n":"",s);await d.promises.writeFile(r,u,"utf8");let v=f().relative((0,i.FF)(c),r).split(f().sep).join("/");return{kind:j,title:e.title,relPath:v,absPath:r}}function k(a){return a.normalize("NFKD").toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"").slice(0,60)}async function l(a,b,c){let d=f().join(a,b+c),e=1;for(;await m(d);){if(e>99){d=f().join(a,`${b}-${Date.now().toString(36)}${c}`);break}d=f().join(a,`${b}-${++e}${c}`)}return d}async function m(a){try{return await d.promises.access(a),!0}catch{return!1}}}};
@@ -1 +1 @@
1
- "use strict";exports.id=2433,exports.ids=[2433,5243,8124],exports.modules={5243:(a,b,c)=>{c.d(b,{addMcpServer:()=>s,getMcpServer:()=>r,listMcpServers:()=>q,updateMcpServer:()=>t});var d=c(73024),e=c(48161),f=c.n(e),g=c(76760),h=c.n(g),i=c(14126),j=c(88124);let k=h().join(f().homedir(),".reflex","mcp"),l=h().join(k,"servers.json"),m=i.Ik({id:i.Yj().min(1).max(64).regex(/^[a-zA-Z][a-zA-Z0-9_-]*$/,"id must start with a letter; letters, digits, '_' and '-' allowed"),label:i.Yj().min(1).max(120),description:i.Yj().max(2e3).default(""),config:j.McpConfigSchema,addedAt:i.Yj(),lastVerifiedAt:i.Yj().optional()}),n=i.Ik({version:i.eu(1),servers:i.YO(m)});async function o(){try{let a=await d.promises.readFile(l,"utf8"),b=n.safeParse(JSON.parse(a));if(!b.success)return{version:1,servers:[]};return b.data}catch{return{version:1,servers:[]}}}async function p(a){await d.promises.mkdir(k,{recursive:!0}),await d.promises.writeFile(l,JSON.stringify(a,null,2)+"\n",{encoding:"utf8",mode:384});try{await d.promises.chmod(l,384)}catch{}}async function q(){return[...(await o()).servers].sort((a,b)=>a.id.localeCompare(b.id))}async function r(a){return(await o()).servers.find(b=>b.id===a)??null}async function s(a){let b=m.parse({id:a.id,label:a.label,description:a.description??"",config:a.config,addedAt:new Date().toISOString()}),c=await o();if(c.servers.some(a=>a.id===b.id))throw Error(`MCP server "${b.id}" already exists`);return c.servers.push(b),await p(c),b}async function t(a,b){let c=await o(),d=c.servers.findIndex(b=>b.id===a);if(d<0)throw Error(`MCP server "${a}" not found`);let e=m.parse({...c.servers[d],...b});return c.servers[d]=e,await p(c),e}},42433:(a,b,c)=>{c.r(b),c.d(b,{resolveBraveKey:()=>g,searchBrave:()=>f});var d=c(43180),e=c(5243);async function f(a){let b=await g();if(!b)throw Error("Brave API key не найден. Подключи Brave Search MCP в Settings или добавь ключ в Settings → Картинки.");let c=new URL("https://api.search.brave.com/res/v1/images/search");c.searchParams.set("q",a.query),c.searchParams.set("count",String(Math.min(a.count,50))),c.searchParams.set("safesearch","strict");let d=await fetch(c,{headers:{Accept:"application/json","X-Subscription-Token":b}});if(!d.ok){let a=await d.text().catch(()=>"");throw Error(`Brave image search ${d.status}: ${a.slice(0,200)}`)}let e=await d.json(),f=[];for(let a of e.results??[]){let b=a.properties?.url,c=a.thumbnail?.src;if(!b||!c)continue;let d=a.url??"",e=a.source||a.meta_url?.hostname||function(a){try{return new URL(a).hostname}catch{return null}}(d)||"Brave";f.push({url:b,thumb:c,attribution:{name:e,link:d||b},provider:"brave"})}return f}async function g(){let a=await (0,d.CG)("brave");if(a)return a;let b=await h();if(b)return b;let c=process.env.BRAVE_API_KEY;return c&&c.length>0?c:null}async function h(){let a=await (0,e.getMcpServer)("brave-search"),b=a?[a]:[];if(!a){let{listMcpServers:a}=await Promise.resolve().then(c.bind(c,5243));for(let c of(await a()))"stdio"===c.config.transport&&c.config.env&&"string"==typeof c.config.env.BRAVE_API_KEY&&c.config.env.BRAVE_API_KEY.length>0&&b.push(c)}for(let a of b){if("stdio"!==a.config.transport)continue;let b=a.config.env?.BRAVE_API_KEY;if("string"==typeof b&&b.length>0)return b}return null}},88124:(a,b,c)=>{c.d(b,{Jc:()=>p,McpConfigSchema:()=>l,callTool:()=>r,connectAndListTools:()=>q});var d=c(43444),e=c(37567),f=c(1960),g=c(66133),h=c(14126);let i=h.Ik({transport:h.eu("stdio"),command:h.Yj().min(1),args:h.YO(h.Yj()).default([]),env:h.g1(h.Yj(),h.Yj()).default({}),cwd:h.Yj().optional()}),j=h.Ik({transport:h.eu("http"),url:h.Yj().url(),headers:h.g1(h.Yj(),h.Yj()).default({})}),k=h.Ik({transport:h.eu("sse"),url:h.Yj().url(),headers:h.g1(h.Yj(),h.Yj()).default({})}),l=h.gM("transport",[i,j,k]),m={name:"reflex-utility-bridge",version:"0.1.0"};async function n(a){let b=new d.K(m);if("stdio"===a.transport){let c=await p(a.env),d=new e.oQ({command:a.command,args:a.args,env:{...process.env,...c},cwd:a.cwd});return await b.connect(d),{client:b,close:()=>b.close()}}if("http"===a.transport){let c=await p(a.headers),d=new f.j(new URL(a.url),{requestInit:{headers:c}});return await b.connect(d),{client:b,close:()=>b.close()}}let c=await p(a.headers),h=new g.A(new URL(a.url),{requestInit:{headers:c}});return await b.connect(h),{client:b,close:()=>b.close()}}let o=/\$oauth:([a-z][a-z0-9-]*)/g;async function p(a){let b={};for(let[d,e]of Object.entries(a)){if("string"!=typeof e||!e.includes("$oauth:")){b[d]=e;continue}let a=new Set;e.replace(o,(b,c)=>(a.add(c),""));let f=e,{getAccessToken:g}=await c.e(2503).then(c.bind(c,82503)),{isOAuthProviderId:h}=await c.e(3657).then(c.bind(c,63657));for(let b of a){if(!h(b))throw Error(`unknown OAuth provider in placeholder: ${b}`);let a=await g(b);f=f.replace(RegExp(`\\$oauth:${b}\\b`,"g"),a)}b[d]=f}return b}async function q(a){let{client:b,close:c}=await n(a);try{let a=b.getServerVersion(),{tools:c}=await b.listTools();return{name:a?.name,version:a?.version,tools:c.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema}))}}finally{await c().catch(()=>{})}}async function r(a,b,c){let{client:d,close:e}=await n(a);try{let a=await d.callTool({name:b,arguments:c});return{isError:"boolean"==typeof a.isError?a.isError:void 0,content:a.content}}finally{await e().catch(()=>{})}}}};
1
+ "use strict";exports.id=2433,exports.ids=[2433,5243,8124],exports.modules={5243:(a,b,c)=>{c.d(b,{addMcpServer:()=>r,getMcpServer:()=>q,listMcpServers:()=>p,updateMcpServer:()=>s});var d=c(73024),e=c(76760),f=c.n(e),g=c(14126),h=c(88124),i=c(29163);let j=f().join((0,i._)(),"mcp"),k=f().join(j,"servers.json"),l=g.Ik({id:g.Yj().min(1).max(64).regex(/^[a-zA-Z][a-zA-Z0-9_-]*$/,"id must start with a letter; letters, digits, '_' and '-' allowed"),label:g.Yj().min(1).max(120),description:g.Yj().max(2e3).default(""),config:h.McpConfigSchema,addedAt:g.Yj(),lastVerifiedAt:g.Yj().optional()}),m=g.Ik({version:g.eu(1),servers:g.YO(l)});async function n(){try{let a=await d.promises.readFile(k,"utf8"),b=m.safeParse(JSON.parse(a));if(!b.success)return{version:1,servers:[]};return b.data}catch{return{version:1,servers:[]}}}async function o(a){await d.promises.mkdir(j,{recursive:!0}),await d.promises.writeFile(k,JSON.stringify(a,null,2)+"\n",{encoding:"utf8",mode:384});try{await d.promises.chmod(k,384)}catch{}}async function p(){return[...(await n()).servers].sort((a,b)=>a.id.localeCompare(b.id))}async function q(a){return(await n()).servers.find(b=>b.id===a)??null}async function r(a){let b=l.parse({id:a.id,label:a.label,description:a.description??"",config:a.config,addedAt:new Date().toISOString()}),c=await n();if(c.servers.some(a=>a.id===b.id))throw Error(`MCP server "${b.id}" already exists`);return c.servers.push(b),await o(c),b}async function s(a,b){let c=await n(),d=c.servers.findIndex(b=>b.id===a);if(d<0)throw Error(`MCP server "${a}" not found`);let e=l.parse({...c.servers[d],...b});return c.servers[d]=e,await o(c),e}},42433:(a,b,c)=>{c.r(b),c.d(b,{resolveBraveKey:()=>g,searchBrave:()=>f});var d=c(43180),e=c(5243);async function f(a){let b=await g();if(!b)throw Error("Brave API key не найден. Подключи Brave Search MCP в Settings или добавь ключ в Settings → Картинки.");let c=new URL("https://api.search.brave.com/res/v1/images/search");c.searchParams.set("q",a.query),c.searchParams.set("count",String(Math.min(a.count,50))),c.searchParams.set("safesearch","strict");let d=await fetch(c,{headers:{Accept:"application/json","X-Subscription-Token":b}});if(!d.ok){let a=await d.text().catch(()=>"");throw Error(`Brave image search ${d.status}: ${a.slice(0,200)}`)}let e=await d.json(),f=[];for(let a of e.results??[]){let b=a.properties?.url,c=a.thumbnail?.src;if(!b||!c)continue;let d=a.url??"",e=a.source||a.meta_url?.hostname||function(a){try{return new URL(a).hostname}catch{return null}}(d)||"Brave";f.push({url:b,thumb:c,attribution:{name:e,link:d||b},provider:"brave"})}return f}async function g(){let a=await (0,d.CG)("brave");if(a)return a;let b=await h();if(b)return b;let c=process.env.BRAVE_API_KEY;return c&&c.length>0?c:null}async function h(){let a=await (0,e.getMcpServer)("brave-search"),b=a?[a]:[];if(!a){let{listMcpServers:a}=await Promise.resolve().then(c.bind(c,5243));for(let c of(await a()))"stdio"===c.config.transport&&c.config.env&&"string"==typeof c.config.env.BRAVE_API_KEY&&c.config.env.BRAVE_API_KEY.length>0&&b.push(c)}for(let a of b){if("stdio"!==a.config.transport)continue;let b=a.config.env?.BRAVE_API_KEY;if("string"==typeof b&&b.length>0)return b}return null}},88124:(a,b,c)=>{c.d(b,{Jc:()=>p,McpConfigSchema:()=>l,callTool:()=>r,connectAndListTools:()=>q});var d=c(43444),e=c(37567),f=c(1960),g=c(66133),h=c(14126);let i=h.Ik({transport:h.eu("stdio"),command:h.Yj().min(1),args:h.YO(h.Yj()).default([]),env:h.g1(h.Yj(),h.Yj()).default({}),cwd:h.Yj().optional()}),j=h.Ik({transport:h.eu("http"),url:h.Yj().url(),headers:h.g1(h.Yj(),h.Yj()).default({})}),k=h.Ik({transport:h.eu("sse"),url:h.Yj().url(),headers:h.g1(h.Yj(),h.Yj()).default({})}),l=h.gM("transport",[i,j,k]),m={name:"reflex-utility-bridge",version:"0.1.0"};async function n(a){let b=new d.K(m);if("stdio"===a.transport){let c=await p(a.env),d=new e.oQ({command:a.command,args:a.args,env:{...process.env,...c},cwd:a.cwd});return await b.connect(d),{client:b,close:()=>b.close()}}if("http"===a.transport){let c=await p(a.headers),d=new f.j(new URL(a.url),{requestInit:{headers:c}});return await b.connect(d),{client:b,close:()=>b.close()}}let c=await p(a.headers),h=new g.A(new URL(a.url),{requestInit:{headers:c}});return await b.connect(h),{client:b,close:()=>b.close()}}let o=/\$oauth:([a-z][a-z0-9-]*)/g;async function p(a){let b={};for(let[d,e]of Object.entries(a)){if("string"!=typeof e||!e.includes("$oauth:")){b[d]=e;continue}let a=new Set;e.replace(o,(b,c)=>(a.add(c),""));let f=e,{getAccessToken:g}=await c.e(2503).then(c.bind(c,82503)),{isOAuthProviderId:h}=await c.e(3657).then(c.bind(c,63657));for(let b of a){if(!h(b))throw Error(`unknown OAuth provider in placeholder: ${b}`);let a=await g(b);f=f.replace(RegExp(`\\$oauth:${b}\\b`,"g"),a)}b[d]=f}return b}async function q(a){let{client:b,close:c}=await n(a);try{let a=b.getServerVersion(),{tools:c}=await b.listTools();return{name:a?.name,version:a?.version,tools:c.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema}))}}finally{await c().catch(()=>{})}}async function r(a,b,c){let{client:d,close:e}=await n(a);try{let a=await d.callTool({name:b,arguments:c});return{isError:"boolean"==typeof a.isError?a.isError:void 0,content:a.content}}finally{await e().catch(()=>{})}}}};
@@ -1,4 +1,4 @@
1
- "use strict";exports.id=2485,exports.ids=[2485],exports.modules={11178:(a,b,c)=>{c.d(b,{CA:()=>j,IK:()=>n,RP:()=>k,dj:()=>l,xO:()=>m});var d=c(73024),e=c(76760),f=c.n(e),g=c(30192),h=c.n(g),i=c(13474);async function j(a){let b=(0,i.FF)(a);return o(b,b)}async function k(a){let b=(0,i.FF)(a);try{let a=await o(b,b),c=a.reduce((a,b)=>a+b.size,0);return{exists:!0,fileCount:a.length,totalBytes:c}}catch{return{exists:!1,fileCount:0,totalBytes:0}}}async function l(a){let b=await j(a);return await Promise.all(b.map(async a=>({...a,meta:await p(a.abs)})))}async function m(a){return p(a)}async function n(a,b){let c=(0,i.FF)(a),e=f().resolve(c,b),g=f().relative(c,e);if(g.startsWith("..")||f().isAbsolute(g))throw Error(`Refused to read outside ${i.fW}: ${b}`);return d.promises.readFile(e,"utf8")}async function o(a,b){let c;try{c=await d.promises.readdir(b,{withFileTypes:!0})}catch{return[]}let e=[],g=[];for(let d of c){let c=f().join(b,d.name);if(d.isDirectory()){if(b===a&&"topics"===d.name)continue;e.push(o(a,c));continue}d.isFile()&&d.name.toLowerCase().endsWith(".md")&&g.push({rel:f().relative(a,c).split(f().sep).join("/"),abs:c,size:0,modifiedAt:""})}let h=await Promise.all(g.map(async a=>{try{let b=await d.promises.stat(a.abs);return{...a,size:b.size,modifiedAt:b.mtime.toISOString()}}catch{return a}}));for(let a of(await Promise.all(e)))h.push(...a);return h.sort((a,b)=>a.rel.localeCompare(b.rel)),h}async function p(a){try{let b=await d.promises.readFile(a,"utf8"),c=h()(b).data;return{...void 0!==q(c.title)?{title:q(c.title)}:{},...void 0!==r(c.version)?{version:r(c.version)}:{},...void 0!==q(c.date)?{date:q(c.date)}:{},...void 0!==q(c.kind)?{kind:q(c.kind)}:{},data:c}}catch{return{data:{}}}}function q(a){return"string"==typeof a?a:a instanceof Date?a.toISOString().slice(0,10):void 0}function r(a){if("string"==typeof a||"number"==typeof a)return a}},25475:(a,b,c)=>{c.d(b,{Md:()=>q,u0:()=>n,y4:()=>o});var d=c(73024),e=c(76760),f=c.n(e),g=c(48161),h=c.n(g),i=c(77598),j=c.n(i);let k=f().join(h().homedir(),".reflex","audit");function l(a){return f().join(k,`${a}.jsonl`)}function m(a=new Date){return a.toISOString().slice(0,10)}async function n(a){let b={ts:a.ts??new Date().toISOString(),...a};await d.promises.mkdir(k,{recursive:!0});let c=l(m());await d.promises.appendFile(c,JSON.stringify(b)+"\n","utf8")}async function o(a={}){let b,c=await p(),e=a.date??c[0]??m(),f=a.limit??500,g=l(e);try{b=await d.promises.readFile(g,"utf8")}catch{return{date:e,entries:[],availableDates:c}}let h=[],i=b.split(/\r?\n/);for(let b=i.length-1;b>=0&&h.length<f;b--){let c,d=i[b];if(d){try{c=JSON.parse(d)}catch{continue}(function(a,b){if(!b)return!0;if(b.utilityId&&a.utilityId!==b.utilityId||b.method&&a.method!==b.method||b.phase&&a.phase!==b.phase)return!1;if(b.status){let c=!a.error;if("ok"===b.status&&!c||"error"===b.status&&c)return!1}return!0})(c,a.filter)&&h.push(c)}}return{date:e,entries:h,availableDates:c}}async function p(){let a;try{a=await d.promises.readdir(k)}catch{return[]}return a.filter(a=>/^\d{4}-\d{2}-\d{2}\.jsonl$/.test(a)).map(a=>a.replace(/\.jsonl$/,"")).sort().reverse()}async function q(a,b){let c=j().randomUUID().replace(/-/g,"").slice(0,16),d=Date.now();await n({ts:new Date().toISOString(),utilityId:a.utilityId,scope:a.scope,channel:a.channel,method:a.method,phase:"start",correlationId:c,...a.parentCorrelationId?{parentCorrelationId:a.parentCorrelationId}:{},args:r(a.args)});try{let e=await b(c);return await n({ts:new Date().toISOString(),utilityId:a.utilityId,scope:a.scope,channel:a.channel,method:a.method,phase:"end",correlationId:c,durationMs:Date.now()-d,result:r(e)}),e}catch(e){let b=e instanceof Error?e.message:String(e);throw await n({ts:new Date().toISOString(),utilityId:a.utilityId,scope:a.scope,channel:a.channel,method:a.method,phase:"end",correlationId:c,durationMs:Date.now()-d,error:b}),e}}function r(a,b=0){if(null==a)return a;if("string"==typeof a)return a.length>2e3?a.slice(0,2e3)+"…[truncated]":a;if("object"!=typeof a)return a;if(b>3)return"[…]";if(Array.isArray(a))return a.slice(0,50).map(a=>r(a,b+1));let c={},d=0;for(let[e,f]of Object.entries(a)){if(d++>=50){c["…"]="truncated";break}c[e]=r(f,b+1)}return c}},62485:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{p:()=>p});var e=c(73024),f=c(76760),g=c.n(f),h=c(14126),i=c(25475),j=c(99048),k=c(49353),l=c(11178),m=c(24576),n=c(17640),o=a([j]);j=(o.then?(await o)():o)[0];let T=h.Ik({task:h.k5(["chat","quick","rag","embed"]).default("quick"),prompt:h.Yj().min(1),model:h.Yj().optional()}),U=h.Ik({kind:h.Yj().min(1).max(64),title:h.Yj().min(1).max(200),body:h.Yj().default(""),meta:h.g1(h.Yj(),h.L5()).optional(),slug:h.Yj().optional(),date:h.Yj().optional(),rootId:h.Yj().optional()}),V=h.Ik({kind:h.Yj().optional(),query:h.Yj().optional(),rootId:h.Yj().optional()}),W=h.Ik({relPath:h.Yj().min(1),rootId:h.Yj().optional()}),X=h.Ik({path:h.Yj().min(1),content:h.Yj().optional()}),Y=h.Ik({url:h.Yj().url(),method:h.k5(["GET","POST","PUT","DELETE","PATCH"]).default("GET"),headers:h.g1(h.Yj(),h.Yj()).optional(),body:h.KC([h.Yj(),h.g1(h.Yj(),h.L5())]).optional()}),Z=h.Ik({query:h.Yj().min(1).max(512)}),$=h.Ik({type:h.Yj().min(1).max(64),payload:h.L5().optional()}),_=h.Ik({server:h.Yj().min(1).optional(),tool:h.Yj().min(1),args:h.g1(h.Yj(),h.L5()).default({})}),aa=h.Ik({server:h.Yj().min(1).optional()}),ab=h.Ik({key:h.Yj().min(1)}),ac=h.Ik({name:h.Yj().min(1),args:h.L5().optional()}),ad=h.Ik({prompt:h.Yj().min(1).max(4e4),rootId:h.Yj().optional(),harness:h.Yj().optional(),model:h.Yj().optional(),language:h.Yj().optional(),label:h.Yj().optional(),timeoutMs:h.ai().int().min(1e3).max(9e5).optional()}),ae=h.Ik({rootId:h.Yj().optional()}),af=h.Ik({workflowId:h.Yj().min(1),rootId:h.Yj().optional()}),ag=h.Ik({workflowId:h.Yj().min(1),rootId:h.Yj().optional(),input:h.L5().optional()}),ah=h.Ik({prompt:h.Yj().min(1).max(8e3),provider:h.k5(["gemini","codex"]).optional(),size:h.Yj().max(40).optional(),aspectRatio:h.Yj().max(40).optional(),referenceImageUrls:h.YO(h.Yj().url()).max(6).optional(),alt:h.Yj().max(280).optional(),rootId:h.Yj().optional()}),ai=h.Ik({query:h.Yj().min(1).max(200),provider:h.k5(["unsplash","pexels","brave"]).optional(),count:h.ai().int().min(1).max(24).optional()}),aj=h.Ik({sourceUrl:h.Yj().url(),rootId:h.Yj().optional()}),ak=h.Ik({query:h.Yj().min(1).max(200),alt:h.Yj().max(280).default(""),context:h.Yj().max(2e3).default(""),candidates:h.YO(h.Ik({url:h.Yj().url(),thumb:h.Yj().url(),attribution:h.Ik({name:h.Yj().default(""),link:h.Yj().default("")})})).min(1).max(12),rootId:h.Yj().optional()}),al=h.Ik({widgetId:h.Yj().optional(),snapshot:h.Ik({kind:h.k5(["markdown","news-list","link-list","kpi","checklist","quote","kb-pinned","progress","image","stat-table","map"]),title:h.Yj().optional(),description:h.Yj().optional(),data:h.g1(h.Yj(),h.L5()).default({})}),rootId:h.Yj().optional()});async function p(a,b,c){let d={utilityId:a.utility.manifest.id,scope:a.utility.scope,channel:a.channel,method:b,args:c,...a.parentCorrelationId?{parentCorrelationId:a.parentCorrelationId}:{}};return(0,i.Md)(d,async d=>{switch(b){case"llm.complete":return w(a,T.parse(c));case"kb.add":return x(a,U.parse(c));case"kb.list":return y(a,V.parse(c));case"kb.read":return z(a,W.parse(c));case"fs.read":return B(a,X.parse(c));case"fs.write":return C(a,X.parse(c));case"fs.list":return D(a,X.parse(c));case"web.fetch":return E(a,Y.parse(c));case"web.search":return F(a,Z.parse(c));case"audit.log":return G(a,$.parse(c),d);case"actions.invoke":return H(a,ac.parse(c),d);case"mcp.call":return t(a,_.parse(c));case"mcp.listServers":return u(a);case"mcp.listTools":return v(a,aa.parse(c));case"secrets.get":return q(a,ab.parse(c));case"secrets.list":return r(a);case"agent.invoke":return I(a,ad.parse(c));case"workflow.list":return J(a,ae.parse(c));case"workflow.read":return K(a,af.parse(c));case"workflow.run":return L(a,ag.parse(c));case"cards.update":return M(a,al.parse(c));case"images.generate":return N(a,ah.parse(c));case"images.search":return O(a,ai.parse(c));case"images.attach":return P(a,aj.parse(c));case"images.pickBest":return Q(a,ak.parse(c));default:throw Error(`Unknown host method: ${b}`)}})}async function q(a,b){if(!(a.utility.manifest.secrets??[]).find(a=>a.key===b.key))throw Error(`secret "${b.key}" is not declared in manifest.secrets`);let{getSecret:d}=await c.e(9293).then(c.bind(c,59293)),e=await d(a.utility.scope,a.utility.manifest.id,b.key,a.utility.rootId);if(null==e)throw Error(`secret "${b.key}" is not set — fill it in the utility's panel`);return{value:e}}async function r(a){let b=a.utility.manifest.secrets??[],{listSecretKeys:d}=await c.e(9293).then(c.bind(c,59293)),e=new Set(await d(a.utility.scope,a.utility.manifest.id,a.utility.rootId));return{secrets:b.map(a=>({key:a.key,set:e.has(a.key),required:a.required,label:a.label,description:a.description}))}}async function s(a,b){let d=a.utility.manifest.mcpServers??[],f=b;if(!f)if(1===d.length)f=d[0];else if(a.utility.manifest.source?.type==="mcp"){let b=g().join(a.utility.dir,"mcp.json"),d=await e.promises.readFile(b,"utf8").catch(()=>null);if(!d)throw Error(`mcp config missing at ${b}`);let{McpConfigSchema:f}=await Promise.all([c.e(9631),c.e(8124)]).then(c.bind(c,88124));return{config:f.parse(JSON.parse(d)),serverId:"(bundled)"}}else throw Error(0===d.length?"manifest.mcpServers is empty — declare which server you want to use":"multiple mcpServers declared — pass `server` explicitly");if(!d.includes(f))throw Error(`mcp server "${f}" is not in manifest.mcpServers — declare it to gain access`);let{getMcpServer:h}=await Promise.all([c.e(9631),c.e(5243)]).then(c.bind(c,5243)),i=await h(f);if(!i)throw Error(`mcp server "${f}" is not registered — add it in Settings → MCP`);return{config:i.config,serverId:f}}async function t(a,b){let{config:d,serverId:e}=await s(a,b.server),{callTool:f}=await Promise.all([c.e(9631),c.e(8124)]).then(c.bind(c,88124)),g=await f(d,b.tool,b.args);return{server:e,...void 0!==g.isError?{isError:g.isError}:{},content:g.content}}async function u(a){let b=a.utility.manifest.mcpServers??[],{listMcpServers:d}=await Promise.all([c.e(9631),c.e(5243)]).then(c.bind(c,5243)),e=await d(),f=new Map(e.map(a=>[a.id,a]));return{servers:b.map(a=>{let b=f.get(a);return{id:a,label:b?.label??a,description:b?.description??"",registered:!!b}})}}async function v(a,b){let{config:d,serverId:e}=await s(a,b.server),{connectAndListTools:f}=await Promise.all([c.e(9631),c.e(8124)]).then(c.bind(c,88124)),g=await f(d);return{server:e,tools:g.tools}}async function w(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.llm?.tasks?.includes(b.task),`llm.${b.task} not granted in manifest`);let c={...(await (0,n.M)()).assignments[b.task],...b.model?{model:b.model}:{}};return{text:await (0,j.T)(c,b.prompt,{timeoutMs:6e4})}}async function x(a,b){if(R(a.utility.manifest,!!a.utility.manifest.permissions.kb?.write,"kb.write not granted"),a.utility.manifest.permissions.kb?.kinds&&!a.utility.manifest.permissions.kb.kinds.includes(b.kind))throw Error(`kb kind "${b.kind}" not in manifest allowlist`);let c=await S(a,b.rootId),d=await (0,k.j)({rootPath:c.path,directive:{kind:b.kind,title:b.title,...b.body?{body:b.body}:{},...b.meta?{meta:b.meta}:{},...b.slug?{slug:b.slug}:{},...b.date?{date:b.date}:{}},provenance:{kind:"utility",id:a.utility.manifest.id,version:a.utility.manifest.version}});return{relPath:d.relPath,absPath:d.absPath}}async function y(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.kb?.read,"kb.read not granted");let c=await S(a,b.rootId),d=await (0,l.dj)(c.path),e=b.query?.toLowerCase();return d.filter(a=>(!b.kind||a.rel.split("/")[0]===b.kind||a.meta.kind===b.kind)&&(!e||!!`${a.rel} ${a.meta.title??""}`.toLowerCase().includes(e))&&!0).map(a=>({relPath:a.rel,title:a.meta.title,kind:a.meta.kind,modifiedAt:a.modifiedAt}))}async function z(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.kb?.read,"kb.read not granted");let c=await S(a,b.rootId);return{content:await (0,l.IK)(c.path,b.relPath)}}function A(a,b){if(b.startsWith("/")||b.includes(".."))throw Error(`unsafe fs path: ${b}`);let c=g().join(a.utility.dir,"data"),d=g().resolve(c,b),e=g().relative(c,d);if(e.startsWith("..")||g().isAbsolute(e))throw Error(`fs path escapes data dir: ${b}`);return d}async function B(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.fs?.sandbox,"fs not granted");let c=A(a,b.path);return{content:await e.promises.readFile(c,"utf8")}}async function C(a,b){if(R(a.utility.manifest,!!a.utility.manifest.permissions.fs?.sandbox,"fs not granted"),"string"!=typeof b.content)throw Error("fs.write requires content (string)");let c=A(a,b.path);return await e.promises.mkdir(g().dirname(c),{recursive:!0}),await e.promises.writeFile(c,b.content,"utf8"),{ok:!0,bytes:Buffer.byteLength(b.content,"utf8")}}async function D(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.fs?.sandbox,"fs not granted");let c=A(a,b.path||".");try{return{entries:(await e.promises.readdir(c,{withFileTypes:!0})).map(a=>({name:a.name,isDir:a.isDirectory()}))}}catch{return{entries:[]}}}async function E(a,b){let c,d=a.utility.manifest.permissions.web?.fetch?.domains??[];try{c=new URL(b.url).hostname}catch{throw Error(`invalid url: ${b.url}`)}if(!d.some(a=>c===a||c.endsWith(`.${a}`)))throw Error(`web.fetch denied: domain "${c}" not in whitelist (${d.join(", ")})`);let e={method:b.method,...b.headers?{headers:b.headers}:{},signal:AbortSignal.timeout(2e4)};void 0!==b.body&&"GET"!==b.method&&(e.body="string"==typeof b.body?b.body:JSON.stringify(b.body));let f=await fetch(b.url,e),g=await f.text(),h={};return f.headers.forEach((a,b)=>{h[b]=a}),{status:f.status,headers:h,body:g}}async function F(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.web?.search,"web.search not granted");let c=await (0,n.M)(),d={...c.assignments.quick,allowedTools:Array.from(new Set([...c.assignments.quick.allowedTools??[],"WebSearch"]))},e=`Use the WebSearch tool to find recent results for the query below.
1
+ "use strict";exports.id=2485,exports.ids=[2485],exports.modules={11178:(a,b,c)=>{c.d(b,{CA:()=>j,IK:()=>n,RP:()=>k,dj:()=>l,xO:()=>m});var d=c(73024),e=c(76760),f=c.n(e),g=c(30192),h=c.n(g),i=c(13474);async function j(a){let b=(0,i.FF)(a);return o(b,b)}async function k(a){let b=(0,i.FF)(a);try{let a=await o(b,b),c=a.reduce((a,b)=>a+b.size,0);return{exists:!0,fileCount:a.length,totalBytes:c}}catch{return{exists:!1,fileCount:0,totalBytes:0}}}async function l(a){let b=await j(a);return await Promise.all(b.map(async a=>({...a,meta:await p(a.abs)})))}async function m(a){return p(a)}async function n(a,b){let c=(0,i.FF)(a),e=f().resolve(c,b),g=f().relative(c,e);if(g.startsWith("..")||f().isAbsolute(g))throw Error(`Refused to read outside ${i.fW}: ${b}`);return d.promises.readFile(e,"utf8")}async function o(a,b){let c;try{c=await d.promises.readdir(b,{withFileTypes:!0})}catch{return[]}let e=[],g=[];for(let d of c){let c=f().join(b,d.name);if(d.isDirectory()){if(b===a&&"topics"===d.name)continue;e.push(o(a,c));continue}d.isFile()&&d.name.toLowerCase().endsWith(".md")&&g.push({rel:f().relative(a,c).split(f().sep).join("/"),abs:c,size:0,modifiedAt:""})}let h=await Promise.all(g.map(async a=>{try{let b=await d.promises.stat(a.abs);return{...a,size:b.size,modifiedAt:b.mtime.toISOString()}}catch{return a}}));for(let a of(await Promise.all(e)))h.push(...a);return h.sort((a,b)=>a.rel.localeCompare(b.rel)),h}async function p(a){try{let b=await d.promises.readFile(a,"utf8"),c=h()(b).data;return{...void 0!==q(c.title)?{title:q(c.title)}:{},...void 0!==r(c.version)?{version:r(c.version)}:{},...void 0!==q(c.date)?{date:q(c.date)}:{},...void 0!==q(c.kind)?{kind:q(c.kind)}:{},data:c}}catch{return{data:{}}}}function q(a){return"string"==typeof a?a:a instanceof Date?a.toISOString().slice(0,10):void 0}function r(a){if("string"==typeof a||"number"==typeof a)return a}},25475:(a,b,c)=>{c.d(b,{Md:()=>p,u0:()=>m,y4:()=>n});var d=c(73024),e=c(76760),f=c.n(e),g=c(77598),h=c.n(g),i=c(29163);let j=f().join((0,i._)(),"audit");function k(a){return f().join(j,`${a}.jsonl`)}function l(a=new Date){return a.toISOString().slice(0,10)}async function m(a){let b={ts:a.ts??new Date().toISOString(),...a};await d.promises.mkdir(j,{recursive:!0});let c=k(l());await d.promises.appendFile(c,JSON.stringify(b)+"\n","utf8")}async function n(a={}){let b,c=await o(),e=a.date??c[0]??l(),f=a.limit??500,g=k(e);try{b=await d.promises.readFile(g,"utf8")}catch{return{date:e,entries:[],availableDates:c}}let h=[],i=b.split(/\r?\n/);for(let b=i.length-1;b>=0&&h.length<f;b--){let c,d=i[b];if(d){try{c=JSON.parse(d)}catch{continue}(function(a,b){if(!b)return!0;if(b.utilityId&&a.utilityId!==b.utilityId||b.method&&a.method!==b.method||b.phase&&a.phase!==b.phase)return!1;if(b.status){let c=!a.error;if("ok"===b.status&&!c||"error"===b.status&&c)return!1}return!0})(c,a.filter)&&h.push(c)}}return{date:e,entries:h,availableDates:c}}async function o(){let a;try{a=await d.promises.readdir(j)}catch{return[]}return a.filter(a=>/^\d{4}-\d{2}-\d{2}\.jsonl$/.test(a)).map(a=>a.replace(/\.jsonl$/,"")).sort().reverse()}async function p(a,b){let c=h().randomUUID().replace(/-/g,"").slice(0,16),d=Date.now();await m({ts:new Date().toISOString(),utilityId:a.utilityId,scope:a.scope,channel:a.channel,method:a.method,phase:"start",correlationId:c,...a.parentCorrelationId?{parentCorrelationId:a.parentCorrelationId}:{},args:q(a.args)});try{let e=await b(c);return await m({ts:new Date().toISOString(),utilityId:a.utilityId,scope:a.scope,channel:a.channel,method:a.method,phase:"end",correlationId:c,durationMs:Date.now()-d,result:q(e)}),e}catch(e){let b=e instanceof Error?e.message:String(e);throw await m({ts:new Date().toISOString(),utilityId:a.utilityId,scope:a.scope,channel:a.channel,method:a.method,phase:"end",correlationId:c,durationMs:Date.now()-d,error:b}),e}}function q(a,b=0){if(null==a)return a;if("string"==typeof a)return a.length>2e3?a.slice(0,2e3)+"…[truncated]":a;if("object"!=typeof a)return a;if(b>3)return"[…]";if(Array.isArray(a))return a.slice(0,50).map(a=>q(a,b+1));let c={},d=0;for(let[e,f]of Object.entries(a)){if(d++>=50){c["…"]="truncated";break}c[e]=q(f,b+1)}return c}},62485:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{p:()=>p});var e=c(73024),f=c(76760),g=c.n(f),h=c(14126),i=c(25475),j=c(99048),k=c(49353),l=c(11178),m=c(24576),n=c(17640),o=a([j]);j=(o.then?(await o)():o)[0];let T=h.Ik({task:h.k5(["chat","quick","rag","embed"]).default("quick"),prompt:h.Yj().min(1),model:h.Yj().optional()}),U=h.Ik({kind:h.Yj().min(1).max(64),title:h.Yj().min(1).max(200),body:h.Yj().default(""),meta:h.g1(h.Yj(),h.L5()).optional(),slug:h.Yj().optional(),date:h.Yj().optional(),rootId:h.Yj().optional()}),V=h.Ik({kind:h.Yj().optional(),query:h.Yj().optional(),rootId:h.Yj().optional()}),W=h.Ik({relPath:h.Yj().min(1),rootId:h.Yj().optional()}),X=h.Ik({path:h.Yj().min(1),content:h.Yj().optional()}),Y=h.Ik({url:h.Yj().url(),method:h.k5(["GET","POST","PUT","DELETE","PATCH"]).default("GET"),headers:h.g1(h.Yj(),h.Yj()).optional(),body:h.KC([h.Yj(),h.g1(h.Yj(),h.L5())]).optional()}),Z=h.Ik({query:h.Yj().min(1).max(512)}),$=h.Ik({type:h.Yj().min(1).max(64),payload:h.L5().optional()}),_=h.Ik({server:h.Yj().min(1).optional(),tool:h.Yj().min(1),args:h.g1(h.Yj(),h.L5()).default({})}),aa=h.Ik({server:h.Yj().min(1).optional()}),ab=h.Ik({key:h.Yj().min(1)}),ac=h.Ik({name:h.Yj().min(1),args:h.L5().optional()}),ad=h.Ik({prompt:h.Yj().min(1).max(4e4),rootId:h.Yj().optional(),harness:h.Yj().optional(),model:h.Yj().optional(),language:h.Yj().optional(),label:h.Yj().optional(),timeoutMs:h.ai().int().min(1e3).max(9e5).optional()}),ae=h.Ik({rootId:h.Yj().optional()}),af=h.Ik({workflowId:h.Yj().min(1),rootId:h.Yj().optional()}),ag=h.Ik({workflowId:h.Yj().min(1),rootId:h.Yj().optional(),input:h.L5().optional()}),ah=h.Ik({prompt:h.Yj().min(1).max(8e3),provider:h.k5(["gemini","codex"]).optional(),size:h.Yj().max(40).optional(),aspectRatio:h.Yj().max(40).optional(),referenceImageUrls:h.YO(h.Yj().url()).max(6).optional(),alt:h.Yj().max(280).optional(),rootId:h.Yj().optional()}),ai=h.Ik({query:h.Yj().min(1).max(200),provider:h.k5(["unsplash","pexels","brave"]).optional(),count:h.ai().int().min(1).max(24).optional()}),aj=h.Ik({sourceUrl:h.Yj().url(),rootId:h.Yj().optional()}),ak=h.Ik({query:h.Yj().min(1).max(200),alt:h.Yj().max(280).default(""),context:h.Yj().max(2e3).default(""),candidates:h.YO(h.Ik({url:h.Yj().url(),thumb:h.Yj().url(),attribution:h.Ik({name:h.Yj().default(""),link:h.Yj().default("")})})).min(1).max(12),rootId:h.Yj().optional()}),al=h.Ik({widgetId:h.Yj().optional(),snapshot:h.Ik({kind:h.k5(["markdown","news-list","link-list","kpi","checklist","quote","kb-pinned","progress","image","stat-table","map"]),title:h.Yj().optional(),description:h.Yj().optional(),data:h.g1(h.Yj(),h.L5()).default({})}),rootId:h.Yj().optional()});async function p(a,b,c){let d={utilityId:a.utility.manifest.id,scope:a.utility.scope,channel:a.channel,method:b,args:c,...a.parentCorrelationId?{parentCorrelationId:a.parentCorrelationId}:{}};return(0,i.Md)(d,async d=>{switch(b){case"llm.complete":return w(a,T.parse(c));case"kb.add":return x(a,U.parse(c));case"kb.list":return y(a,V.parse(c));case"kb.read":return z(a,W.parse(c));case"fs.read":return B(a,X.parse(c));case"fs.write":return C(a,X.parse(c));case"fs.list":return D(a,X.parse(c));case"web.fetch":return E(a,Y.parse(c));case"web.search":return F(a,Z.parse(c));case"audit.log":return G(a,$.parse(c),d);case"actions.invoke":return H(a,ac.parse(c),d);case"mcp.call":return t(a,_.parse(c));case"mcp.listServers":return u(a);case"mcp.listTools":return v(a,aa.parse(c));case"secrets.get":return q(a,ab.parse(c));case"secrets.list":return r(a);case"agent.invoke":return I(a,ad.parse(c));case"workflow.list":return J(a,ae.parse(c));case"workflow.read":return K(a,af.parse(c));case"workflow.run":return L(a,ag.parse(c));case"cards.update":return M(a,al.parse(c));case"images.generate":return N(a,ah.parse(c));case"images.search":return O(a,ai.parse(c));case"images.attach":return P(a,aj.parse(c));case"images.pickBest":return Q(a,ak.parse(c));default:throw Error(`Unknown host method: ${b}`)}})}async function q(a,b){if(!(a.utility.manifest.secrets??[]).find(a=>a.key===b.key))throw Error(`secret "${b.key}" is not declared in manifest.secrets`);let{getSecret:d}=await c.e(9293).then(c.bind(c,59293)),e=await d(a.utility.scope,a.utility.manifest.id,b.key,a.utility.rootId);if(null==e)throw Error(`secret "${b.key}" is not set — fill it in the utility's panel`);return{value:e}}async function r(a){let b=a.utility.manifest.secrets??[],{listSecretKeys:d}=await c.e(9293).then(c.bind(c,59293)),e=new Set(await d(a.utility.scope,a.utility.manifest.id,a.utility.rootId));return{secrets:b.map(a=>({key:a.key,set:e.has(a.key),required:a.required,label:a.label,description:a.description}))}}async function s(a,b){let d=a.utility.manifest.mcpServers??[],f=b;if(!f)if(1===d.length)f=d[0];else if(a.utility.manifest.source?.type==="mcp"){let b=g().join(a.utility.dir,"mcp.json"),d=await e.promises.readFile(b,"utf8").catch(()=>null);if(!d)throw Error(`mcp config missing at ${b}`);let{McpConfigSchema:f}=await Promise.all([c.e(9631),c.e(8124)]).then(c.bind(c,88124));return{config:f.parse(JSON.parse(d)),serverId:"(bundled)"}}else throw Error(0===d.length?"manifest.mcpServers is empty — declare which server you want to use":"multiple mcpServers declared — pass `server` explicitly");if(!d.includes(f))throw Error(`mcp server "${f}" is not in manifest.mcpServers — declare it to gain access`);let{getMcpServer:h}=await Promise.all([c.e(9631),c.e(5243)]).then(c.bind(c,5243)),i=await h(f);if(!i)throw Error(`mcp server "${f}" is not registered — add it in Settings → MCP`);return{config:i.config,serverId:f}}async function t(a,b){let{config:d,serverId:e}=await s(a,b.server),{callTool:f}=await Promise.all([c.e(9631),c.e(8124)]).then(c.bind(c,88124)),g=await f(d,b.tool,b.args);return{server:e,...void 0!==g.isError?{isError:g.isError}:{},content:g.content}}async function u(a){let b=a.utility.manifest.mcpServers??[],{listMcpServers:d}=await Promise.all([c.e(9631),c.e(5243)]).then(c.bind(c,5243)),e=await d(),f=new Map(e.map(a=>[a.id,a]));return{servers:b.map(a=>{let b=f.get(a);return{id:a,label:b?.label??a,description:b?.description??"",registered:!!b}})}}async function v(a,b){let{config:d,serverId:e}=await s(a,b.server),{connectAndListTools:f}=await Promise.all([c.e(9631),c.e(8124)]).then(c.bind(c,88124)),g=await f(d);return{server:e,tools:g.tools}}async function w(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.llm?.tasks?.includes(b.task),`llm.${b.task} not granted in manifest`);let c={...(await (0,n.M)()).assignments[b.task],...b.model?{model:b.model}:{}};return{text:await (0,j.T)(c,b.prompt,{timeoutMs:6e4})}}async function x(a,b){if(R(a.utility.manifest,!!a.utility.manifest.permissions.kb?.write,"kb.write not granted"),a.utility.manifest.permissions.kb?.kinds&&!a.utility.manifest.permissions.kb.kinds.includes(b.kind))throw Error(`kb kind "${b.kind}" not in manifest allowlist`);let c=await S(a,b.rootId),d=await (0,k.j)({rootPath:c.path,directive:{kind:b.kind,title:b.title,...b.body?{body:b.body}:{},...b.meta?{meta:b.meta}:{},...b.slug?{slug:b.slug}:{},...b.date?{date:b.date}:{}},provenance:{kind:"utility",id:a.utility.manifest.id,version:a.utility.manifest.version}});return{relPath:d.relPath,absPath:d.absPath}}async function y(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.kb?.read,"kb.read not granted");let c=await S(a,b.rootId),d=await (0,l.dj)(c.path),e=b.query?.toLowerCase();return d.filter(a=>(!b.kind||a.rel.split("/")[0]===b.kind||a.meta.kind===b.kind)&&(!e||!!`${a.rel} ${a.meta.title??""}`.toLowerCase().includes(e))&&!0).map(a=>({relPath:a.rel,title:a.meta.title,kind:a.meta.kind,modifiedAt:a.modifiedAt}))}async function z(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.kb?.read,"kb.read not granted");let c=await S(a,b.rootId);return{content:await (0,l.IK)(c.path,b.relPath)}}function A(a,b){if(b.startsWith("/")||b.includes(".."))throw Error(`unsafe fs path: ${b}`);let c=g().join(a.utility.dir,"data"),d=g().resolve(c,b),e=g().relative(c,d);if(e.startsWith("..")||g().isAbsolute(e))throw Error(`fs path escapes data dir: ${b}`);return d}async function B(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.fs?.sandbox,"fs not granted");let c=A(a,b.path);return{content:await e.promises.readFile(c,"utf8")}}async function C(a,b){if(R(a.utility.manifest,!!a.utility.manifest.permissions.fs?.sandbox,"fs not granted"),"string"!=typeof b.content)throw Error("fs.write requires content (string)");let c=A(a,b.path);return await e.promises.mkdir(g().dirname(c),{recursive:!0}),await e.promises.writeFile(c,b.content,"utf8"),{ok:!0,bytes:Buffer.byteLength(b.content,"utf8")}}async function D(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.fs?.sandbox,"fs not granted");let c=A(a,b.path||".");try{return{entries:(await e.promises.readdir(c,{withFileTypes:!0})).map(a=>({name:a.name,isDir:a.isDirectory()}))}}catch{return{entries:[]}}}async function E(a,b){let c,d=a.utility.manifest.permissions.web?.fetch?.domains??[];try{c=new URL(b.url).hostname}catch{throw Error(`invalid url: ${b.url}`)}if(!d.some(a=>c===a||c.endsWith(`.${a}`)))throw Error(`web.fetch denied: domain "${c}" not in whitelist (${d.join(", ")})`);let e={method:b.method,...b.headers?{headers:b.headers}:{},signal:AbortSignal.timeout(2e4)};void 0!==b.body&&"GET"!==b.method&&(e.body="string"==typeof b.body?b.body:JSON.stringify(b.body));let f=await fetch(b.url,e),g=await f.text(),h={};return f.headers.forEach((a,b)=>{h[b]=a}),{status:f.status,headers:h,body:g}}async function F(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.web?.search,"web.search not granted");let c=await (0,n.M)(),d={...c.assignments.quick,allowedTools:Array.from(new Set([...c.assignments.quick.allowedTools??[],"WebSearch"]))},e=`Use the WebSearch tool to find recent results for the query below.
2
2
  Return ONLY a JSON object on a single line with shape:
3
3
  {"results":[{"title":"…","url":"…","snippet":"…"}]}
4
4
  No prose, no markdown fences. Max 8 results.
@@ -1 +1 @@
1
- "use strict";exports.id=2503,exports.ids=[2503,3657,6730],exports.modules={63657:(a,b,c)=>{c.d(b,{Cs:()=>n,getOAuthProvider:()=>s,isOAuthProviderId:()=>t});var d=c(73024),e=c(48161),f=c.n(e),g=c(76760),h=c.n(g),i=c(14126);let j=i.Ik({title:i.Yj().min(1).max(200),body:i.Yj().max(2e3).optional(),field:i.Yj().max(200).optional(),copy:i.Yj().max(2e3).optional(),choice:i.Yj().max(200).optional()}),k=i.Ik({id:i.Yj().min(1).max(64).regex(/^[a-z][a-z0-9-]*$/,"provider id must be kebab-case (e.g. google, dropbox)"),label:i.Yj().min(1).max(120),authorizeUrl:i.Yj().url(),tokenUrl:i.Yj().url(),defaultScopes:i.YO(i.Yj()).default([]),supportsPKCE:i.zM().default(!0),refreshTokenSupported:i.zM().default(!0),extraAuthorizeParams:i.g1(i.Yj(),i.Yj()).default({}),needsClientSecret:i.zM().default(!0),setupHint:i.Yj().default(""),consoleUrl:i.Yj().url(),setupSteps:i.YO(j).default([])}),l={google:{id:"google",label:"Google",authorizeUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",defaultScopes:["openid","email","https://www.googleapis.com/auth/calendar"],supportsPKCE:!0,refreshTokenSupported:!0,extraAuthorizeParams:{access_type:"offline",prompt:"consent"},needsClientSecret:!0,setupHint:"Если ещё не делал — сначала включи нужный API (Calendar/Gmail/Drive) во вкладке APIs & Services → Library.",consoleUrl:"https://console.cloud.google.com/apis/credentials",setupSteps:[{title:"Открой Google Cloud Console → APIs & Services → Credentials."},{title:"Нажми \xab+ CREATE CREDENTIALS\xbb → \xabOAuth client ID\xbb."},{title:"Application type",choice:"Web application",body:"Не \xabDesktop\xbb — Reflex использует фиксированный localhost-redirect."},{title:"Name — любое, например \xabReflex\xbb."},{title:"Authorized redirect URIs → ADD URI",field:"Authorized redirect URIs",copy:"http://localhost:3210/api/oauth/callback",body:"Точно как есть, без слэша в конце, http (не https)."},{title:"Жми CREATE → откроется попап с Client ID и Client Secret."},{title:"Скопируй сюда оба значения. (Если потерял — открой клиент в Credentials, \xabDownload JSON\xbb или \xabReset secret\xbb.)"},{title:"Перед первым Authorize убедись, что нужный API включён: APIs & Services → Library → Google Calendar API → Enable (для других сервисов — аналогично)."}]},github:{id:"github",label:"GitHub",authorizeUrl:"https://github.com/login/oauth/authorize",tokenUrl:"https://github.com/login/oauth/access_token",defaultScopes:["repo","read:user"],supportsPKCE:!1,refreshTokenSupported:!1,extraAuthorizeParams:{},needsClientSecret:!0,setupHint:"Личные OAuth Apps живут в Settings → Developer settings.",consoleUrl:"https://github.com/settings/developers",setupSteps:[{title:"Открой github.com/settings/developers → OAuth Apps."},{title:"Нажми \xabNew OAuth App\xbb."},{title:"Application name — что угодно, например \xabReflex\xbb."},{title:"Homepage URL",field:"Homepage URL",copy:"http://localhost:3210"},{title:"Authorization callback URL",field:"Authorization callback URL",copy:"http://localhost:3210/api/oauth/callback"},{title:"Жми \xabRegister application\xbb."},{title:"Скопируй \xabClient ID\xbb отсюда → в Reflex."},{title:"Нажми \xabGenerate a new client secret\xbb, скопируй значение сразу (показывается один раз) → в Reflex."}]},notion:{id:"notion",label:"Notion",authorizeUrl:"https://api.notion.com/v1/oauth/authorize",tokenUrl:"https://api.notion.com/v1/oauth/token",defaultScopes:[],supportsPKCE:!1,refreshTokenSupported:!1,extraAuthorizeParams:{owner:"user"},needsClientSecret:!0,setupHint:"Reflex использует Public integration (с OAuth flow), не Internal.",consoleUrl:"https://www.notion.so/profile/integrations",setupSteps:[{title:"Открой notion.so/profile/integrations → \xab+ New integration\xbb."},{title:"Name — \xabReflex\xbb."},{title:"Associated workspace — твой workspace."},{title:"Type",choice:"Public",body:"Internal не подходит — для OAuth flow нужна публичная integration."},{title:"Submit → integration создана. Перейди на её страницу."},{title:"В разделе \xabOAuth Domain & URIs\xbb → Redirect URIs → Add URI",field:"Redirect URIs",copy:"http://localhost:3210/api/oauth/callback"},{title:"Save."},{title:"В \xabSecrets\xbb скопируй OAuth client ID и OAuth client secret сюда."}]},slack:{id:"slack",label:"Slack",authorizeUrl:"https://slack.com/oauth/v2/authorize",tokenUrl:"https://slack.com/api/oauth.v2.access",defaultScopes:["chat:write","channels:read"],supportsPKCE:!1,refreshTokenSupported:!0,extraAuthorizeParams:{},needsClientSecret:!0,setupHint:"Scopes по умолчанию (chat:write, channels:read) можно расширить в OAuth & Permissions.",consoleUrl:"https://api.slack.com/apps",setupSteps:[{title:"Открой api.slack.com/apps → \xabCreate New App\xbb → \xabFrom scratch\xbb."},{title:"App Name — \xabReflex\xbb, выбери свой workspace → Create App."},{title:"В левой панели открой \xabOAuth & Permissions\xbb → Redirect URLs → \xabAdd New Redirect URL\xbb",field:"Redirect URLs",copy:"http://localhost:3210/api/oauth/callback"},{title:"Save URLs."},{title:"Под Scopes → User Token Scopes добавь нужные (chat:write, channels:read и т.д. — из defaults Reflex)."},{title:"Вверху страницы Install App → разреши доступ → получишь Client ID и Client Secret в \xabBasic Information\xbb."}]},linear:{id:"linear",label:"Linear",authorizeUrl:"https://linear.app/oauth/authorize",tokenUrl:"https://api.linear.app/oauth/token",defaultScopes:["read","write"],supportsPKCE:!1,refreshTokenSupported:!0,extraAuthorizeParams:{},needsClientSecret:!0,setupHint:"Личная OAuth-aplication привязывается к твоему workspace.",consoleUrl:"https://linear.app/settings/api/applications/new",setupSteps:[{title:"Открой linear.app/settings/api/applications/new (Settings → API → OAuth applications → Create new)."},{title:"Name — \xabReflex\xbb, описание любое."},{title:"Developer URL",field:"Developer URL",copy:"http://localhost:3210"},{title:"Callback URLs",field:"Callback URLs",copy:"http://localhost:3210/api/oauth/callback"},{title:"Scopes — отметь read + write (или те, что нужны: issues:create и т.п.)."},{title:"Submit → копируй Client ID + Client Secret сюда."}]}},m=Object.keys(l),n="http://localhost:3210/api/oauth/callback",o=h().join(f().homedir(),".reflex","oauth","providers.json"),p=i.Ik({version:i.eu(1),providers:i.YO(k)});async function q(){try{let a=await d.promises.readFile(o,"utf8"),b=p.safeParse(JSON.parse(a));if(!b.success)return{version:1,providers:[]};return b.data}catch{return{version:1,providers:[]}}}async function r(){let a=await q(),b=new Set(a.providers.map(a=>a.id)),c=[];for(let a of m)b.has(a)||c.push({def:l[a],origin:"builtin"});for(let b of a.providers)c.push({def:b,origin:"user"});return c}async function s(a){let b=await r();return b.find(b=>b.def.id===a)?.def??null}async function t(a){return await s(a)!==null}},82503:(a,b,c)=>{c.d(b,{b:()=>i,getAccessToken:()=>k,z:()=>j});var d=c(77598),e=c(63657),f=c(96730);let g=globalThis.__reflexOAuthPending??new Map;function h(a){return a.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function i(a,b){let c,i=Date.now()-9e5;for(let[a,b]of g)b.createdAt<i&&g.delete(a);let j=await (0,e.getOAuthProvider)(a);if(!j)throw Error(`unknown provider: ${a}`);let k=await (0,f.tY)(a);if(!k)throw Error(`OAuth client for "${a}" is not configured — set client_id/secret in Settings → OAuth first`);let l=h((0,d.randomBytes)(24)),m=b&&b.length>0?b:k.scopes&&k.scopes.length>0?k.scopes:j.defaultScopes,n=new URLSearchParams({client_id:k.clientId,redirect_uri:e.Cs,response_type:"code",state:l,...m.length>0?{scope:m.join(" ")}:{},...j.extraAuthorizeParams??{}});if(j.supportsPKCE){let{verifier:a,challenge:b}=function(){let a=h((0,d.randomBytes)(32)),b=h((0,d.createHash)("sha256").update(a).digest());return{verifier:a,challenge:b}}();c=a,n.set("code_challenge",b),n.set("code_challenge_method","S256")}g.set(l,{provider:a,...void 0!==c?{codeVerifier:c}:{},scopes:m,createdAt:Date.now()});let o=k.authorizeUrl??j.authorizeUrl;return{authorizeUrl:`${o}?${n.toString()}`,state:l}}async function j(a,b){let c=g.get(a);if(!c)throw Error("unknown or expired state — restart the authorization");g.delete(a);let d=await (0,e.getOAuthProvider)(c.provider);if(!d)throw Error(`unknown provider: ${c.provider}`);let h=await (0,f.tY)(c.provider);if(!h)throw Error(`OAuth client for "${c.provider}" disappeared`);let i=new URLSearchParams({grant_type:"authorization_code",code:b,redirect_uri:e.Cs,client_id:h.clientId});d.needsClientSecret&&h.clientSecret&&i.set("client_secret",h.clientSecret),c.codeVerifier&&i.set("code_verifier",c.codeVerifier);let j=await l(d,h,i);return await (0,f.Dt)(c.provider,j),{provider:c.provider}}async function k(a){let b=await (0,e.getOAuthProvider)(a);if(!b)throw Error(`unknown provider: ${a}`);let c=await (0,f.getOAuthTokens)(a);if(!c)throw Error(`provider "${a}" not authorized — open Settings → OAuth and click Authorize`);if(!(void 0!==c.expiresAt&&c.expiresAt-6e4<Date.now()))return c.accessToken;if(!c.refreshToken)throw Error(`access token for "${a}" expired and no refresh_token — re-authorize`);let d=await (0,f.tY)(a);if(!d)throw Error(`OAuth client for "${a}" is not configured`);let g=new URLSearchParams({grant_type:"refresh_token",refresh_token:c.refreshToken,client_id:d.clientId});b.needsClientSecret&&d.clientSecret&&g.set("client_secret",d.clientSecret);let h=await l(b,d,g),i={accessToken:h.accessToken,refreshToken:h.refreshToken??c.refreshToken,...void 0!==h.expiresAt?{expiresAt:h.expiresAt}:{},...h.scope?{scope:h.scope}:c.scope?{scope:c.scope}:{},...h.tokenType?{tokenType:h.tokenType}:c.tokenType?{tokenType:c.tokenType}:{}};return await (0,f.Dt)(a,i),i.accessToken}async function l(a,b,c){let d,e=b.tokenUrl??a.tokenUrl,f=await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"},body:c.toString()}),g=await f.text();if(!f.ok)throw Error(`token endpoint HTTP ${f.status}: ${g.slice(0,500)}`);if(g.trim().startsWith("{"))d=JSON.parse(g);else for(let[a,b]of(d={},new URLSearchParams(g)))d[a]=b;if(d.error)throw Error(`OAuth error: ${d.error}${d.error_description?` — ${d.error_description}`:""}`);let h="string"==typeof d.access_token?d.access_token:null;if(!h)throw Error(`token endpoint returned no access_token (${g.slice(0,200)})`);let i="number"==typeof d.expires_in?d.expires_in:"string"==typeof d.expires_in?Number(d.expires_in):void 0;return{accessToken:h,..."string"==typeof d.refresh_token?{refreshToken:d.refresh_token}:{},...void 0!==i&&!Number.isNaN(i)?{expiresAt:Date.now()+1e3*i}:{},..."string"==typeof d.scope?{scope:d.scope}:{},..."string"==typeof d.token_type?{tokenType:d.token_type}:{}}}globalThis.__reflexOAuthPending=g},96730:(a,b,c)=>{c.d(b,{Dt:()=>p,getOAuthTokens:()=>q,tY:()=>o});var d=c(73024),e=c(48161),f=c.n(e),g=c(76760),h=c.n(g);c(63657);let i=h().join(f().homedir(),".reflex","oauth"),j=h().join(i,"clients"),k=h().join(i,"tokens");function l(a){return h().join(k,`${a}.json`)}async function m(a,b){await d.promises.mkdir(h().dirname(a),{recursive:!0}),await d.promises.writeFile(a,JSON.stringify(b,null,2)+"\n",{encoding:"utf8",mode:384});try{await d.promises.chmod(a,384)}catch{}}async function n(a){try{let b=await d.promises.readFile(a,"utf8");return JSON.parse(b)}catch{return null}}async function o(a){return n(h().join(j,`${a}.json`))}async function p(a,b){await m(l(a),{...b,updatedAt:new Date().toISOString()})}async function q(a){return n(l(a))}}};
1
+ "use strict";exports.id=2503,exports.ids=[2503,3657,6730],exports.modules={63657:(a,b,c)=>{c.d(b,{Cs:()=>n,getOAuthProvider:()=>s,isOAuthProviderId:()=>t});var d=c(73024),e=c(48161),f=c.n(e),g=c(76760),h=c.n(g),i=c(14126);let j=i.Ik({title:i.Yj().min(1).max(200),body:i.Yj().max(2e3).optional(),field:i.Yj().max(200).optional(),copy:i.Yj().max(2e3).optional(),choice:i.Yj().max(200).optional()}),k=i.Ik({id:i.Yj().min(1).max(64).regex(/^[a-z][a-z0-9-]*$/,"provider id must be kebab-case (e.g. google, dropbox)"),label:i.Yj().min(1).max(120),authorizeUrl:i.Yj().url(),tokenUrl:i.Yj().url(),defaultScopes:i.YO(i.Yj()).default([]),supportsPKCE:i.zM().default(!0),refreshTokenSupported:i.zM().default(!0),extraAuthorizeParams:i.g1(i.Yj(),i.Yj()).default({}),needsClientSecret:i.zM().default(!0),setupHint:i.Yj().default(""),consoleUrl:i.Yj().url(),setupSteps:i.YO(j).default([])}),l={google:{id:"google",label:"Google",authorizeUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",defaultScopes:["openid","email","https://www.googleapis.com/auth/calendar"],supportsPKCE:!0,refreshTokenSupported:!0,extraAuthorizeParams:{access_type:"offline",prompt:"consent"},needsClientSecret:!0,setupHint:"Если ещё не делал — сначала включи нужный API (Calendar/Gmail/Drive) во вкладке APIs & Services → Library.",consoleUrl:"https://console.cloud.google.com/apis/credentials",setupSteps:[{title:"Открой Google Cloud Console → APIs & Services → Credentials."},{title:"Нажми \xab+ CREATE CREDENTIALS\xbb → \xabOAuth client ID\xbb."},{title:"Application type",choice:"Web application",body:"Не \xabDesktop\xbb — Reflex использует фиксированный localhost-redirect."},{title:"Name — любое, например \xabReflex\xbb."},{title:"Authorized redirect URIs → ADD URI",field:"Authorized redirect URIs",copy:"http://localhost:3210/api/oauth/callback",body:"Точно как есть, без слэша в конце, http (не https)."},{title:"Жми CREATE → откроется попап с Client ID и Client Secret."},{title:"Скопируй сюда оба значения. (Если потерял — открой клиент в Credentials, \xabDownload JSON\xbb или \xabReset secret\xbb.)"},{title:"Перед первым Authorize убедись, что нужный API включён: APIs & Services → Library → Google Calendar API → Enable (для других сервисов — аналогично)."}]},github:{id:"github",label:"GitHub",authorizeUrl:"https://github.com/login/oauth/authorize",tokenUrl:"https://github.com/login/oauth/access_token",defaultScopes:["repo","read:user"],supportsPKCE:!1,refreshTokenSupported:!1,extraAuthorizeParams:{},needsClientSecret:!0,setupHint:"Личные OAuth Apps живут в Settings → Developer settings.",consoleUrl:"https://github.com/settings/developers",setupSteps:[{title:"Открой github.com/settings/developers → OAuth Apps."},{title:"Нажми \xabNew OAuth App\xbb."},{title:"Application name — что угодно, например \xabReflex\xbb."},{title:"Homepage URL",field:"Homepage URL",copy:"http://localhost:3210"},{title:"Authorization callback URL",field:"Authorization callback URL",copy:"http://localhost:3210/api/oauth/callback"},{title:"Жми \xabRegister application\xbb."},{title:"Скопируй \xabClient ID\xbb отсюда → в Reflex."},{title:"Нажми \xabGenerate a new client secret\xbb, скопируй значение сразу (показывается один раз) → в Reflex."}]},notion:{id:"notion",label:"Notion",authorizeUrl:"https://api.notion.com/v1/oauth/authorize",tokenUrl:"https://api.notion.com/v1/oauth/token",defaultScopes:[],supportsPKCE:!1,refreshTokenSupported:!1,extraAuthorizeParams:{owner:"user"},needsClientSecret:!0,setupHint:"Reflex использует Public integration (с OAuth flow), не Internal.",consoleUrl:"https://www.notion.so/profile/integrations",setupSteps:[{title:"Открой notion.so/profile/integrations → \xab+ New integration\xbb."},{title:"Name — \xabReflex\xbb."},{title:"Associated workspace — твой workspace."},{title:"Type",choice:"Public",body:"Internal не подходит — для OAuth flow нужна публичная integration."},{title:"Submit → integration создана. Перейди на её страницу."},{title:"В разделе \xabOAuth Domain & URIs\xbb → Redirect URIs → Add URI",field:"Redirect URIs",copy:"http://localhost:3210/api/oauth/callback"},{title:"Save."},{title:"В \xabSecrets\xbb скопируй OAuth client ID и OAuth client secret сюда."}]},slack:{id:"slack",label:"Slack",authorizeUrl:"https://slack.com/oauth/v2/authorize",tokenUrl:"https://slack.com/api/oauth.v2.access",defaultScopes:["chat:write","channels:read"],supportsPKCE:!1,refreshTokenSupported:!0,extraAuthorizeParams:{},needsClientSecret:!0,setupHint:"Scopes по умолчанию (chat:write, channels:read) можно расширить в OAuth & Permissions.",consoleUrl:"https://api.slack.com/apps",setupSteps:[{title:"Открой api.slack.com/apps → \xabCreate New App\xbb → \xabFrom scratch\xbb."},{title:"App Name — \xabReflex\xbb, выбери свой workspace → Create App."},{title:"В левой панели открой \xabOAuth & Permissions\xbb → Redirect URLs → \xabAdd New Redirect URL\xbb",field:"Redirect URLs",copy:"http://localhost:3210/api/oauth/callback"},{title:"Save URLs."},{title:"Под Scopes → User Token Scopes добавь нужные (chat:write, channels:read и т.д. — из defaults Reflex)."},{title:"Вверху страницы Install App → разреши доступ → получишь Client ID и Client Secret в \xabBasic Information\xbb."}]},linear:{id:"linear",label:"Linear",authorizeUrl:"https://linear.app/oauth/authorize",tokenUrl:"https://api.linear.app/oauth/token",defaultScopes:["read","write"],supportsPKCE:!1,refreshTokenSupported:!0,extraAuthorizeParams:{},needsClientSecret:!0,setupHint:"Личная OAuth-aplication привязывается к твоему workspace.",consoleUrl:"https://linear.app/settings/api/applications/new",setupSteps:[{title:"Открой linear.app/settings/api/applications/new (Settings → API → OAuth applications → Create new)."},{title:"Name — \xabReflex\xbb, описание любое."},{title:"Developer URL",field:"Developer URL",copy:"http://localhost:3210"},{title:"Callback URLs",field:"Callback URLs",copy:"http://localhost:3210/api/oauth/callback"},{title:"Scopes — отметь read + write (или те, что нужны: issues:create и т.п.)."},{title:"Submit → копируй Client ID + Client Secret сюда."}]}},m=Object.keys(l),n="http://localhost:3210/api/oauth/callback",o=h().join(f().homedir(),".reflex","oauth","providers.json"),p=i.Ik({version:i.eu(1),providers:i.YO(k)});async function q(){try{let a=await d.promises.readFile(o,"utf8"),b=p.safeParse(JSON.parse(a));if(!b.success)return{version:1,providers:[]};return b.data}catch{return{version:1,providers:[]}}}async function r(){let a=await q(),b=new Set(a.providers.map(a=>a.id)),c=[];for(let a of m)b.has(a)||c.push({def:l[a],origin:"builtin"});for(let b of a.providers)c.push({def:b,origin:"user"});return c}async function s(a){let b=await r();return b.find(b=>b.def.id===a)?.def??null}async function t(a){return await s(a)!==null}},82503:(a,b,c)=>{c.d(b,{b:()=>i,getAccessToken:()=>k,z:()=>j});var d=c(77598),e=c(63657),f=c(96730);let g=globalThis.__reflexOAuthPending??new Map;function h(a){return a.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function i(a,b){let c,i=Date.now()-9e5;for(let[a,b]of g)b.createdAt<i&&g.delete(a);let j=await (0,e.getOAuthProvider)(a);if(!j)throw Error(`unknown provider: ${a}`);let k=await (0,f.tY)(a);if(!k)throw Error(`OAuth client for "${a}" is not configured — set client_id/secret in Settings → OAuth first`);let l=h((0,d.randomBytes)(24)),m=b&&b.length>0?b:k.scopes&&k.scopes.length>0?k.scopes:j.defaultScopes,n=new URLSearchParams({client_id:k.clientId,redirect_uri:e.Cs,response_type:"code",state:l,...m.length>0?{scope:m.join(" ")}:{},...j.extraAuthorizeParams??{}});if(j.supportsPKCE){let{verifier:a,challenge:b}=function(){let a=h((0,d.randomBytes)(32)),b=h((0,d.createHash)("sha256").update(a).digest());return{verifier:a,challenge:b}}();c=a,n.set("code_challenge",b),n.set("code_challenge_method","S256")}g.set(l,{provider:a,...void 0!==c?{codeVerifier:c}:{},scopes:m,createdAt:Date.now()});let o=k.authorizeUrl??j.authorizeUrl;return{authorizeUrl:`${o}?${n.toString()}`,state:l}}async function j(a,b){let c=g.get(a);if(!c)throw Error("unknown or expired state — restart the authorization");g.delete(a);let d=await (0,e.getOAuthProvider)(c.provider);if(!d)throw Error(`unknown provider: ${c.provider}`);let h=await (0,f.tY)(c.provider);if(!h)throw Error(`OAuth client for "${c.provider}" disappeared`);let i=new URLSearchParams({grant_type:"authorization_code",code:b,redirect_uri:e.Cs,client_id:h.clientId});d.needsClientSecret&&h.clientSecret&&i.set("client_secret",h.clientSecret),c.codeVerifier&&i.set("code_verifier",c.codeVerifier);let j=await l(d,h,i);return await (0,f.Dt)(c.provider,j),{provider:c.provider}}async function k(a){let b=await (0,e.getOAuthProvider)(a);if(!b)throw Error(`unknown provider: ${a}`);let c=await (0,f.getOAuthTokens)(a);if(!c)throw Error(`provider "${a}" not authorized — open Settings → OAuth and click Authorize`);if(!(void 0!==c.expiresAt&&c.expiresAt-6e4<Date.now()))return c.accessToken;if(!c.refreshToken)throw Error(`access token for "${a}" expired and no refresh_token — re-authorize`);let d=await (0,f.tY)(a);if(!d)throw Error(`OAuth client for "${a}" is not configured`);let g=new URLSearchParams({grant_type:"refresh_token",refresh_token:c.refreshToken,client_id:d.clientId});b.needsClientSecret&&d.clientSecret&&g.set("client_secret",d.clientSecret);let h=await l(b,d,g),i={accessToken:h.accessToken,refreshToken:h.refreshToken??c.refreshToken,...void 0!==h.expiresAt?{expiresAt:h.expiresAt}:{},...h.scope?{scope:h.scope}:c.scope?{scope:c.scope}:{},...h.tokenType?{tokenType:h.tokenType}:c.tokenType?{tokenType:c.tokenType}:{}};return await (0,f.Dt)(a,i),i.accessToken}async function l(a,b,c){let d,e=b.tokenUrl??a.tokenUrl,f=await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"},body:c.toString()}),g=await f.text();if(!f.ok)throw Error(`token endpoint HTTP ${f.status}: ${g.slice(0,500)}`);if(g.trim().startsWith("{"))d=JSON.parse(g);else for(let[a,b]of(d={},new URLSearchParams(g)))d[a]=b;if(d.error)throw Error(`OAuth error: ${d.error}${d.error_description?` — ${d.error_description}`:""}`);let h="string"==typeof d.access_token?d.access_token:null;if(!h)throw Error(`token endpoint returned no access_token (${g.slice(0,200)})`);let i="number"==typeof d.expires_in?d.expires_in:"string"==typeof d.expires_in?Number(d.expires_in):void 0;return{accessToken:h,..."string"==typeof d.refresh_token?{refreshToken:d.refresh_token}:{},...void 0!==i&&!Number.isNaN(i)?{expiresAt:Date.now()+1e3*i}:{},..."string"==typeof d.scope?{scope:d.scope}:{},..."string"==typeof d.token_type?{tokenType:d.token_type}:{}}}globalThis.__reflexOAuthPending=g},96730:(a,b,c)=>{c.d(b,{Dt:()=>o,getOAuthTokens:()=>p,tY:()=>n});var d=c(73024),e=c(76760),f=c.n(e);c(63657);var g=c(29163);let h=f().join((0,g._)(),"oauth"),i=f().join(h,"clients"),j=f().join(h,"tokens");function k(a){return f().join(j,`${a}.json`)}async function l(a,b){await d.promises.mkdir(f().dirname(a),{recursive:!0}),await d.promises.writeFile(a,JSON.stringify(b,null,2)+"\n",{encoding:"utf8",mode:384});try{await d.promises.chmod(a,384)}catch{}}async function m(a){try{let b=await d.promises.readFile(a,"utf8");return JSON.parse(b)}catch{return null}}async function n(a){return m(f().join(i,`${a}.json`))}async function o(a,b){await l(k(a),{...b,updatedAt:new Date().toISOString()})}async function p(a){return m(k(a))}}};
@@ -0,0 +1 @@
1
+ "use strict";exports.id=2977,exports.ids=[2977],exports.modules={24139:(a,b,c)=>{c.d(b,{Z:()=>h});var d=c(73024),e=c(74342);function f(){return globalThis.__reflexPendingCache||(globalThis.__reflexPendingCache=new Map),globalThis.__reflexPendingCache}async function g(a,b){let c,g=(0,e.Rs)(a,b);try{c=await d.promises.stat(g)}catch{return[]}let h=f().get(g);if(h&&h.mtimeMs===c.mtimeMs&&h.size===c.size)return h.result;let i=function(a,b){let c=new Map;for(let d of a)switch(d.type){case"permission-request":c.set(`p:${d.requestId}`,{kind:"permission",topicId:b,requestId:d.requestId,ts:d.ts,summary:d.tool?`Permission: ${d.tool}`:d.action??"Permission request",...d.description?{details:d.description}:{}});break;case"permission-response":c.delete(`p:${d.requestId}`);break;case"question":c.set(`q:${d.questionId}`,{kind:"question",topicId:b,requestId:d.questionId,ts:d.ts,summary:d.prompt.slice(0,200),...d.choices&&d.choices.length?{details:d.choices.join(" / ")}:{}});break;case"answer":c.delete(`q:${d.questionId}`);break;case"mcp-add-request":c.set(`m:${d.requestId}`,{kind:"mcp-add",topicId:b,requestId:d.requestId,ts:d.ts,summary:`MCP add: ${d.label}`,...d.description?{details:d.description}:{}});break;case"mcp-add-response":c.delete(`m:${d.requestId}`)}return[...c.values()]}(await (0,e.wj)(a,b),b);return f().set(g,{mtimeMs:c.mtimeMs,size:c.size,result:i}),i}async function h(a,b){let c=[];return await Promise.all(b.map(async b=>{let d=await g(a,b);c.push(...d)})),c.sort((a,b)=>a.ts<b.ts?1:-1),c}},49809:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{k:()=>v,x:()=>t});var e=c(31776);c(428);var f=c(73024),g=c(76760),h=c.n(g),i=c(24576),j=c(11178),k=c(56843),l=c(16909),m=c(24139),n=c(1701),o=c(52129),p=c(7188),q=c(11244),r=c(97364),s=a([l,o]);async function t(a){try{let b=await (0,i.Zn)(a);if(!b)return{ok:!1,error:"Root not found"};let[c,d,e,f]=await Promise.all([(0,k.hk)(b.path),(0,j.CA)(b.path),(0,p.listWidgets)(b.path),(0,p.readLayout)(b.path)]),g=(0,p.reconcileLayout)(f,e.map(a=>a.id),q.SYSTEM_WIDGET_IDS);(g.order.join("|")!==f.order.join("|")||g.hidden.join("|")!==f.hidden.join("|")||JSON.stringify(g.sizes??{})!==JSON.stringify(f.sizes??{}))&&await (0,p.writeLayout)(b.path,g);let h=c.map(a=>a.meta.id),r=new Set("function"==typeof l.z.listRunningTopicsForRoot?l.z.listRunningTopicsForRoot(a):[]),[s,t,v]=await Promise.all([(0,m.Z)(b.path,h),(0,n.Mn)(),(0,o.Qv)(a).catch(()=>null)]),w=new Set(s.map(a=>a.requestId));for(let a of t)!w.has(a.requestId)&&h.includes(a.topicId)&&s.push({kind:"mcp-add",topicId:a.topicId,requestId:a.requestId,ts:a.createdAt,summary:`MCP add: ${a.directive.label}`,...a.directive.description?{details:a.directive.description}:{}});s.sort((a,b)=>a.ts<b.ts?1:-1);let x=new Map;for(let a of c)x.set(a.meta.id,a.meta);let y=[],z=[];for(let a of c){let b=a.meta;if(b.goal&&"active"===b.goalStatus){y.push({topicId:b.id,topicTitle:b.title,goal:b.goal,goalIterations:b.goalIterations??0,updatedAt:b.updatedAt,running:r.has(b.id)});continue}r.has(b.id)&&z.push({topicId:b.id,topicTitle:b.title,updatedAt:b.updatedAt})}y.sort((a,b)=>a.updatedAt<b.updatedAt?1:-1),z.sort((a,b)=>a.updatedAt<b.updatedAt?1:-1);let A=await u(d);return{ok:!0,snapshot:{rootId:a,rootPath:b.path,activeGoals:y,runningAgents:z,pendingApprovals:s,recentKb:A,suggestions:v,widgets:e,layout:g}}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function u(a){let b=Date.now()-2592e5,c=a.filter(a=>Date.parse(a.modifiedAt)>=b).sort((a,b)=>a.modifiedAt<b.modifiedAt?1:-1).slice(0,6);return Promise.all(c.map(async a=>{let b=await (0,j.xO)(a.abs);return{rel:a.rel,title:b.title??h().basename(a.rel),...b.kind?{kind:b.kind}:{},modifiedAt:a.modifiedAt,preview:""}}))}async function v(a,b){try{let c=await (0,i.Zn)(a);if(!c)return{ok:!1,error:"Root not found"};let d=h().join(c.path,".reflex",b),e=h().relative(h().join(c.path,".reflex"),d);if(e.startsWith("..")||h().isAbsolute(e))return{ok:!1,error:"Refused (path traversal)"};let g=await f.promises.readFile(d,"utf8");return{ok:!0,preview:function(a){let b=a,c=a.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return c&&(b=a.slice(c[0].length)),(b=b.replace(/^#+\s+/gm,"").replace(/\*\*([^*]+)\*\*/g,"$1").replace(/`([^`]+)`/g,"$1").replace(/\r?\n+/g," ").trim()).length>200&&(b=b.slice(0,197).trimEnd()+"…"),b}(g)}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}[l,o]=s.then?(await s)():s,(0,r.D)([t,v]),(0,e.A)(t,"40be16a4a75ef5c6c26d46cec0a9838d3083ed723a",null),(0,e.A)(v,"600317071a3aa75e37df0c1bd87067624f7a835518",null),d()}catch(a){d(a)}})},52129:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Qt:()=>t,Qv:()=>r});var e=c(73024),f=c(76760),g=c.n(f),h=c(29163),i=c(11178),j=c(56843),k=c(16909),l=c(24139),m=c(99048),n=c(17640),o=c(24576),p=a([k,m]);function q(a){let b=a.replace(/[^A-Za-z0-9_.-]/g,"_");return g().join((0,h._)(),"roots",b,"suggestions.json")}async function r(a){try{let b=await e.promises.readFile(q(a),"utf8"),c=JSON.parse(b);if(c.rootId!==a||!Array.isArray(c.items))return null;return c}catch{return null}}async function s(a){let b=q(a.rootId);await e.promises.mkdir(g().dirname(b),{recursive:!0}),await e.promises.writeFile(b,JSON.stringify(a,null,2)+"\n",{encoding:"utf8",mode:384});try{await e.promises.chmod(b,384)}catch{}}async function t(a){var b;let c=await (0,o.Zn)(a);if(!c)return{ok:!1,error:"Root not found"};let d=(await (0,n.M)()).assignments.quick,e=await u(a,c.path);if(e.empty){let b={rootId:a,generatedAt:new Date().toISOString(),model:"n/a",items:[{title:"Проект пуст",why:"Нет тем, нет KB-файлов — нечего предлагать. Начни с /chat или создай первую запись.",action:{kind:"none",label:"OK"}}]};return await s(b),{ok:!0,cache:b}}let f=(b=e,['You analyse the state of a local Reflex knowledge-base project and propose 2–4 high-leverage actions for the user.\nOutput STRICT JSON: an object with one key `items`, value array of {title, why, action}.\naction.kind ∈ {"open-topic", "open-kb", "send-message", "none"}.\n - open-topic: target = topic id from the snapshot\n - open-kb: target = rel-path from the snapshot (.reflex/-relative)\n - send-message: target = the literal text Reflex should send. topicId = which topic to send into (use an existing id from the snapshot or omit for new chat).\n - none: informational only\nEach action.label is the button text (3-6 words, Russian or English to match the project\'s vibe).\nEach `title` is 4-9 words; each `why` is one sentence explaining the trigger.\nSkip trivialities. Don\'t propose chores that don\'t move the project forward.\nReply in Russian unless titles/paths are obviously English.\n\n## Snapshot',JSON.stringify(b,null,2),"\nReturn only the JSON object — no preamble, no markdown fences, no comments. The reply MUST start with `{` and end with `}`."].join("\n"));try{let b=await (0,m.T)(d,f,{timeoutMs:45e3}),c=function(a){let b=a.trim();b.startsWith("```")&&(b=b.replace(/^```[a-z]*\r?\n/i,"").replace(/```\s*$/i,""));let c=b.indexOf("{"),d=b.lastIndexOf("}");c>=0&&d>c&&(b=b.slice(c,d+1));let e=JSON.parse(b);if(!e||"object"!=typeof e||!Array.isArray(e.items))throw Error("Модель вернула не-JSON или без items[]");let f=[];for(let a of e.items){if(!a||"object"!=typeof a)continue;let b="string"==typeof a.title?a.title:null,c="string"==typeof a.why?a.why:null,d=a.action&&"object"==typeof a.action?a.action:null;if(!b||!c||!d)continue;let e=d.kind;if("open-topic"!==e&&"open-kb"!==e&&"send-message"!==e&&"none"!==e)continue;let g="string"==typeof d.label?d.label:"Открыть";f.push({title:b,why:c,action:{kind:e,label:g,..."string"==typeof d.target?{target:d.target}:{},..."string"==typeof d.topicId?{topicId:d.topicId}:{}}})}return f}(b),e={rootId:a,generatedAt:new Date().toISOString(),model:`${d.harness}:${d.model}`,items:c.slice(0,5)};return await s(e),{ok:!0,cache:e}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function u(a,b){let[c,d]=await Promise.all([(0,j.hk)(b),(0,i.dj)(b)]),e=c.map(a=>a.meta.id),f=new Set("function"==typeof k.z.listRunningTopicsForRoot?k.z.listRunningTopicsForRoot(a):[]),g=await (0,l.Z)(b,e),h=Date.now()-432e6,m=c.filter(a=>Date.parse(a.meta.updatedAt)<h).filter(a=>a.meta.goal&&"active"===a.meta.goalStatus).map(a=>({id:a.meta.id,title:a.meta.title,updatedAt:a.meta.updatedAt}));return{empty:0===c.length&&0===d.length,topicCount:c.length,topicsWithGoal:c.filter(a=>a.meta.goal&&"active"===a.meta.goalStatus).map(a=>({id:a.meta.id,title:a.meta.title,goal:a.meta.goal,iterations:a.meta.goalIterations??0,updatedAt:a.meta.updatedAt,running:f.has(a.meta.id)})),runningTopics:c.filter(a=>f.has(a.meta.id)).map(a=>({id:a.meta.id,title:a.meta.title})),recentKb:d.slice().sort((a,b)=>a.modifiedAt<b.modifiedAt?1:-1).slice(0,8).map(a=>({rel:a.rel,title:a.meta.title??a.rel,modifiedAt:a.modifiedAt})),pendingCount:g.length,totalKbFiles:d.length,staleTopics:m}}[k,m]=p.then?(await p)():p,d()}catch(a){d(a)}})},62977:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{"4005c7c57fb9c78e219414f3ac01086fada23025d7":()=>f.Gh,"401eac9fe3fbb4a7f61eeff7ea7cc8e71c9f1a0977":()=>f.summarizeYoutubeAction,"40468c5b8c69571e7920016705c223b3fb93f19224":()=>f.O1,"4048a385d11a64704556aef06b0e78717760f0aca5":()=>f.rD,"40be16a4a75ef5c6c26d46cec0a9838d3083ed723a":()=>e.x,"40fd1533240185f6135e50fb9eafce5e9282143166":()=>f.AZ,"600317071a3aa75e37df0c1bd87067624f7a835518":()=>e.k});var e=c(49809),f=c(18746),g=a([e]);e=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},99048:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{T:()=>h});var e=c(7206),f=c(17640),g=a([e]);async function h(a,b,c){let d=c?.timeoutMs??3e4;if("claude-code"===a.harness)return(await (0,e.execa)("claude",["-p",b,"--permission-mode","default","--allowedTools","","--model",a.model],{timeout:d,stdio:["ignore","pipe","pipe"]})).stdout.trim();if("codex"===a.harness)return(await (0,e.execa)("codex",["exec","--sandbox","read-only","--model",a.model,b],{timeout:d,stdio:["ignore","pipe","pipe"]})).stdout.trim();if("ollama"===a.harness){let c=(await (0,f.M)()).harnesses.ollama.baseUrl.replace(/\/$/,""),e=await fetch(`${c}/api/generate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:a.model,prompt:b,stream:!1}),signal:AbortSignal.timeout(d)});if(!e.ok)throw Error(`Ollama /api/generate HTTP ${e.status}`);return((await e.json()).response??"").trim()}throw Error(`Unsupported quick harness: ${a.harness}`)}e=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})}};
@@ -0,0 +1 @@
1
+ "use strict";exports.id=3076,exports.ids=[3076],exports.modules={3076:(a,b,c)=>{c.d(b,{UtilityIframe:()=>r});var d=c(64173),e=c(17240),f=c(53186),g=c(65177),h=c(66979),i=c(69552),j=c(62261),k=c(73569),l=c(1056),m=c.n(l),n=c(44052),o=c(3265);function p({scope:a,utilityId:b,utilityName:c,rootId:l,requestSnapshot:o,onClose:p}){let[r,s]=(0,e.useState)(null),[t,u]=(0,e.useState)([]),[v,w]=(0,e.useState)(""),[x,y]=(0,e.useState)(null),[z,A]=(0,e.useTransition)(),[B,C]=(0,e.useState)(!1),D=(0,e.useRef)(null);(0,e.useRef)(null),(0,e.useRef)("");let[E,F]=(0,e.useState)(""),G=()=>{let a=v.trim();a&&l&&r&&(w(""),u(b=>[...b,{role:"user",text:a,ts:new Date().toISOString()}]),A(async()=>{let b;try{b=await Promise.race([o(),new Promise(a=>setTimeout(()=>a(void 0),600))])}catch{}let c=void 0!==b?function(a,b){let c;try{c="string"==typeof b?b:JSON.stringify(b,null,2)}catch{c=String(b)}return c.length>4e3&&(c=c.slice(0,4e3)+"\n…[truncated]"),["[Контекст мини-приложения]",c,"[/контекст]\n",a].join("\n")}(a,b):a;try{let a=await fetch(`/api/roots/${l}/chat/${r}/send`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:c})});if(!a.ok){let b=await a.json().catch(()=>({}));n.oR.error(b.error??`HTTP ${a.status}`)}}catch(a){n.oR.error(String(a))}}))};return(0,d.jsxs)("aside",{className:"flex h-full flex-col border-l bg-card",children:[(0,d.jsxs)("header",{className:"border-b px-3 py-2 flex items-center gap-2",children:[(0,d.jsx)(f.A,{className:"h-3.5 w-3.5 text-violet-600"}),(0,d.jsx)("span",{className:"text-sm font-medium",children:"Помощник"}),(0,d.jsx)("span",{className:"text-[10px] text-muted-foreground ml-1",children:"знает контекст этого приложения"}),l&&r&&(0,d.jsx)(m(),{href:`/roots/${l}/chat/${r}`,className:"ml-auto p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground",title:"Открыть в полном чате",children:(0,d.jsx)(g.A,{className:"h-3.5 w-3.5"})}),p&&(0,d.jsx)("button",{type:"button",onClick:p,className:"p-1 rounded hover:bg-accent "+(l&&r?"":"ml-auto"),title:"Скрыть",children:(0,d.jsx)(h.A,{className:"h-3.5 w-3.5"})})]}),(0,d.jsxs)("div",{ref:D,className:"flex-1 overflow-y-auto px-3 py-2 space-y-2 text-sm",children:[x&&(0,d.jsx)("p",{className:"text-xs text-red-600",children:x}),!x&&0===t.length&&!E&&(0,d.jsxs)("div",{className:"text-xs text-muted-foreground flex items-start gap-2",children:[(0,d.jsx)(i.A,{className:"h-3 w-3 mt-0.5 text-violet-600 shrink-0"}),(0,d.jsx)("span",{children:"Спроси что-нибудь про данные этого мини-приложения. Диалог сохраняется как обычный разговор — можно открыть полностью по иконке в углу."})]}),t.map((a,b)=>(0,d.jsx)(q,{role:a.role,text:a.text},b)),B&&E&&(0,d.jsx)(q,{role:"assistant",text:E,streaming:!0}),z&&!B&&(0,d.jsxs)("div",{className:"mr-6 rounded-md bg-muted/40 px-2 py-1.5 text-xs text-muted-foreground inline-flex items-center gap-2",children:[(0,d.jsx)(j.A,{className:"h-3 w-3 animate-spin"}),"Reflex думает…"]})]}),(0,d.jsxs)("div",{className:"border-t px-3 py-2 flex items-end gap-1.5",children:[(0,d.jsx)("textarea",{value:v,onChange:a=>w(a.target.value),onKeyDown:a=>{"Enter"===a.key&&(a.metaKey||a.ctrlKey)&&(a.preventDefault(),G())},rows:1,placeholder:"Спроси (⌘↵)…",disabled:z||!!x||!r,className:"flex-1 resize-none rounded border bg-background px-2 py-1 text-xs focus:outline-none focus:ring-1 focus:ring-violet-400 max-h-24"}),(0,d.jsx)("button",{type:"button",onClick:G,disabled:z||!v.trim()||!!x||!r,className:"inline-flex items-center justify-center rounded bg-violet-600 px-2 py-1 text-white hover:bg-violet-700 disabled:opacity-50",children:z?(0,d.jsx)(j.A,{className:"h-3 w-3 animate-spin"}):(0,d.jsx)(k.A,{className:"h-3 w-3"})})]})]})}function q({role:a,text:b,streaming:c}){let e=b;return("user"===a&&(e=e.replace(/^\s*\[Контекст мини-приложения\][\s\S]*?\[\/контекст\]\s*/,"").trim()),e.trim())?(0,d.jsxs)("div",{className:"user"===a?"ml-6 rounded-md bg-violet-50 dark:bg-violet-950/30 px-2 py-1.5":"mr-6 rounded-md bg-muted/40 px-2 py-1.5 whitespace-pre-wrap",children:[(0,d.jsxs)("div",{className:"text-[10px] uppercase tracking-wider text-muted-foreground mb-0.5",children:["user"===a?"Ты":"assistant"===a?"Reflex":"Система",c&&(0,d.jsx)("span",{className:"ml-1 text-violet-600",children:"●"})]}),e]}):null}function r({scope:a,id:b,rootId:c,className:g,title:h,agentChat:i,utilityName:j}){let k=(0,e.useRef)(null),l=(0,e.useRef)(null),[m,n]=(0,e.useState)(!0),o=c?`?rootId=${encodeURIComponent(c)}`:"",q=`/api/utilities/${a}/${b}/iframe${o}`,r=(0,d.jsx)("iframe",{ref:k,src:q,sandbox:"allow-scripts allow-forms allow-same-origin",className:g??"h-full w-full border-0 bg-white",title:h??`utility-${b}`});return i?(0,d.jsxs)("div",{className:"flex h-full w-full",children:[(0,d.jsxs)("div",{className:"flex-1 min-w-0 relative",children:[r,!m&&(0,d.jsxs)("button",{type:"button",onClick:()=>n(!0),className:"absolute right-3 bottom-3 inline-flex items-center gap-1 rounded-full bg-violet-600 px-3 py-1.5 text-xs text-white shadow-lg hover:bg-violet-700",title:"Открыть помощника",children:[(0,d.jsx)(f.A,{className:"h-3.5 w-3.5"}),"Помощник"]})]}),m&&(0,d.jsx)("div",{className:"w-80 shrink-0",children:(0,d.jsx)(p,{scope:a,utilityId:b,...j?{utilityName:j}:{},...c?{rootId:c}:{},requestSnapshot:()=>{let a=k.current?.contentWindow;return a?(l.current&&(clearTimeout(l.current.timer),l.current.resolve(void 0),l.current=null),new Promise(b=>{let c=setTimeout(()=>{l.current?.resolve===b&&(l.current=null,b(void 0))},500);l.current={resolve:b,timer:c};try{a.postMessage({type:"request-snapshot"},"*")}catch{clearTimeout(c),l.current=null,b(void 0)}})):Promise.resolve(void 0)},onClose:()=>n(!1)})})]}):r}o.callServer,o.findSourceMapURL,o.callServer,o.findSourceMapURL},65177:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(42557).A)("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]])},66979:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(42557).A)("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]])},73569:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(42557).A)("Send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]])}};
@@ -1 +1 @@
1
- "use strict";exports.id=3332,exports.ids=[3332],exports.modules={26429:(a,b,c)=>{c.d(b,{T:()=>e});var d=c(3265);let e=(0,d.createServerReference)("60e3090027a3d5604202b6d8326408b1a1c7f2da7d",d.callServer,void 0,d.findSourceMapURL,"beginOAuthAction")},30587:(a,b,c)=>{c.d(b,{o:()=>e});var d=c(3265);let e=(0,d.createServerReference)("00836cc3059073482c3919ef173b7f92521f4f56c9",d.callServer,void 0,d.findSourceMapURL,"listOAuthStatusesAction")},33332:(a,b,c)=>{c.d(b,{beginOAuthAction:()=>g.T,getOAuthClientAction:()=>e.J,listOAuthStatusesAction:()=>d.o,saveOAuthClientAction:()=>f.S});var d=c(30587),e=c(60909),f=c(36256),g=c(26429)},36256:(a,b,c)=>{c.d(b,{S:()=>e});var d=c(3265);let e=(0,d.createServerReference)("40f6801f3ea78f166da7a2ed774ca49c0b18e2a13b",d.callServer,void 0,d.findSourceMapURL,"saveOAuthClientAction")},60909:(a,b,c)=>{c.d(b,{J:()=>e});var d=c(3265);let e=(0,d.createServerReference)("408c94e084cce2b605b8c18c8fe0bd5c81ddd06919",d.callServer,void 0,d.findSourceMapURL,"getOAuthClientAction")}};
1
+ "use strict";exports.id=3332,exports.ids=[3332],exports.modules={29159:(a,b,c)=>{c.d(b,{S:()=>e});var d=c(3265);let e=(0,d.createServerReference)("40f08eb42b70482c9ac4bd8baf66d671a236a9dee5",d.callServer,void 0,d.findSourceMapURL,"saveOAuthClientAction")},33332:(a,b,c)=>{c.d(b,{beginOAuthAction:()=>g.T,getOAuthClientAction:()=>e.J,listOAuthStatusesAction:()=>d.o,saveOAuthClientAction:()=>f.S});var d=c(76514),e=c(41949),f=c(29159),g=c(85917)},41949:(a,b,c)=>{c.d(b,{J:()=>e});var d=c(3265);let e=(0,d.createServerReference)("405c90d8eb2301de2efb52983610ff3d46a26ef4db",d.callServer,void 0,d.findSourceMapURL,"getOAuthClientAction")},76514:(a,b,c)=>{c.d(b,{o:()=>e});var d=c(3265);let e=(0,d.createServerReference)("00a4ed7436adb81e87c7c9bb5ad657847538b5ecb5",d.callServer,void 0,d.findSourceMapURL,"listOAuthStatusesAction")},85917:(a,b,c)=>{c.d(b,{T:()=>e});var d=c(3265);let e=(0,d.createServerReference)("60cfc9c61911e6183132d7a6ef5ad0ead4a25de147",d.callServer,void 0,d.findSourceMapURL,"beginOAuthAction")}};
@@ -0,0 +1 @@
1
+ exports.id=3610,exports.ids=[3610],exports.modules={17596:(a,b,c)=>{"use strict";c.d(b,{A:()=>d});let d=(0,c(19963).A)("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]])},24576:(a,b,c)=>{"use strict";c.d(b,{Zn:()=>p,_S:()=>q,mM:()=>l,qV:()=>o});var d=c(73024),e=c(76760),f=c.n(e),g=c(77598),h=c.n(g);let i=(0,c(29163)._)(),j=f().join(i,"registry.json"),k={version:1,entries:[]};function l(a){return h().createHash("sha1").update(f().resolve(a)).digest("hex").slice(0,16)}async function m(){try{let a=await d.promises.readFile(j,"utf8"),b=JSON.parse(a);if("object"==typeof b&&null!==b&&"entries"in b&&Array.isArray(b.entries))return b;return k}catch(a){if("object"==typeof a&&null!==a&&"code"in a&&"ENOENT"===a.code)return k;throw a}}async function n(a){await d.promises.mkdir(i,{recursive:!0}),await d.promises.writeFile(j,JSON.stringify(a,null,2)+"\n","utf8")}async function o(){return[...(await m()).entries].sort((a,b)=>Date.parse(b.addedAt)-Date.parse(a.addedAt))}async function p(a){return(await m()).entries.find(b=>b.id===a)??null}async function q(a){let b=f().resolve(a),c=l(b),d=await m(),e=d.entries.find(a=>a.id===c);if(e)return e;let g={id:c,path:b,addedAt:new Date().toISOString()};return await n({...d,entries:[...d.entries,g]}),g}},26290:(a,b,c)=>{"use strict";c.d(b,{cn:()=>f});var d=c(83243),e=c(86103);function f(...a){return(0,e.QP)((0,d.$)(a))}},29163:(a,b,c)=>{"use strict";c.d(b,{_:()=>h});var d=c(48161),e=c.n(d),f=c(76760),g=c.n(f);function h(){let a=process.env.REFLEX_HOME;return a&&a.length>0?a:g().join(e().homedir(),".reflex")}},34818:(a,b,c)=>{Promise.resolve().then(c.bind(c,60524)),Promise.resolve().then(c.bind(c,50155)),Promise.resolve().then(c.bind(c,26922)),Promise.resolve().then(c.bind(c,79008)),Promise.resolve().then(c.bind(c,68146)),Promise.resolve().then(c.bind(c,60936)),Promise.resolve().then(c.bind(c,65138)),Promise.resolve().then(c.bind(c,68902)),Promise.resolve().then(c.bind(c,69644)),Promise.resolve().then(c.bind(c,49186)),Promise.resolve().then(c.bind(c,93099)),Promise.resolve().then(c.bind(c,83594)),Promise.resolve().then(c.bind(c,24375)),Promise.resolve().then(c.bind(c,67135)),Promise.resolve().then(c.bind(c,85105)),Promise.resolve().then(c.bind(c,41886)),Promise.resolve().then(c.bind(c,33309)),Promise.resolve().then(c.bind(c,37550)),Promise.resolve().then(c.bind(c,96623)),Promise.resolve().then(c.bind(c,77372)),Promise.resolve().then(c.bind(c,65478)),Promise.resolve().then(c.bind(c,97230)),Promise.resolve().then(c.bind(c,73552)),Promise.resolve().then(c.bind(c,391)),Promise.resolve().then(c.bind(c,4235)),Promise.resolve().then(c.bind(c,41138)),Promise.resolve().then(c.bind(c,60877)),Promise.resolve().then(c.bind(c,7671)),Promise.resolve().then(c.bind(c,5637)),Promise.resolve().then(c.bind(c,36786)),Promise.resolve().then(c.t.bind(c,20594,23))},52970:(a,b,c)=>{Promise.resolve().then(c.bind(c,68394)),Promise.resolve().then(c.bind(c,51189)),Promise.resolve().then(c.bind(c,66180)),Promise.resolve().then(c.bind(c,75266)),Promise.resolve().then(c.bind(c,14360)),Promise.resolve().then(c.bind(c,6786)),Promise.resolve().then(c.bind(c,44896)),Promise.resolve().then(c.bind(c,14848)),Promise.resolve().then(c.bind(c,53710)),Promise.resolve().then(c.bind(c,30544)),Promise.resolve().then(c.bind(c,13829)),Promise.resolve().then(c.bind(c,90044)),Promise.resolve().then(c.bind(c,57673)),Promise.resolve().then(c.bind(c,97053)),Promise.resolve().then(c.bind(c,43151)),Promise.resolve().then(c.bind(c,12156)),Promise.resolve().then(c.bind(c,71615)),Promise.resolve().then(c.bind(c,4080)),Promise.resolve().then(c.bind(c,87177)),Promise.resolve().then(c.bind(c,87634)),Promise.resolve().then(c.bind(c,6912)),Promise.resolve().then(c.bind(c,13976)),Promise.resolve().then(c.bind(c,18282)),Promise.resolve().then(c.bind(c,20633)),Promise.resolve().then(c.bind(c,61193)),Promise.resolve().then(c.bind(c,66188)),Promise.resolve().then(c.bind(c,66643)),Promise.resolve().then(c.bind(c,81669)),Promise.resolve().then(c.bind(c,39991)),Promise.resolve().then(c.bind(c,54972)),Promise.resolve().then(c.t.bind(c,1056,23))},60524:(a,b,c)=>{"use strict";c.d(b,{Separator:()=>d});let d=(0,c(54491).registerClientReference)(function(){throw Error("Attempted to call Separator() from the server but Separator is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/reflex-agent/reflex-agent/components/ui/separator.tsx","Separator")},67248:(a,b,c)=>{"use strict";c.d(b,{E:()=>i});var d=c(63003);c(34750);var e=c(86209),f=c(65715),g=c(26290);let h=(0,e.F)("inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3",{variants:{variant:{default:"bg-primary text-primary-foreground [a&]:hover:bg-primary/90",secondary:"bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",destructive:"bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90",outline:"border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",ghost:"[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",link:"text-primary underline-offset-4 [a&]:hover:underline"}},defaultVariants:{variant:"default"}});function i({className:a,variant:b="default",asChild:c=!1,...e}){let i=c?f.bL:"span";return(0,d.jsx)(i,{"data-slot":"badge","data-variant":b,className:(0,g.cn)(h({variant:b}),a),...e})}},84913:(a,b,c)=>{"use strict";c.d(b,{$:()=>i});var d=c(63003);c(34750);var e=c(86209),f=c(65715),g=c(26290);let h=(0,e.F)("inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",xs:"h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-xs":"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-8","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}});function i({className:a,variant:b="default",size:c="default",asChild:e=!1,...i}){let j=e?f.bL:"button";return(0,d.jsx)(j,{"data-slot":"button","data-variant":b,"data-size":c,className:(0,g.cn)(h({variant:b,size:c,className:a})),...i})}},87009:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{"00fe9a3719ce8c991ffe3927fedc993761e6a9b2d0":()=>g.i,"400ad73604dc430e89836c242471c62f07492a6ec1":()=>e.nC,"40696e5795e44ba3c265922c97a0776496bbb4361f":()=>e.nY,"408e29ec5a2ac06e76d0fd994672ca7302f6e425b8":()=>f.z,"40bebc2e11b5ad22c68344a412797b66b5efeb8434":()=>h.$z,"40f13c6810c336832a5abe5af39b9a1d905ba990f8":()=>f.u,"40fc252c8ca3031d9e89166587bf6b6441a8e472cd":()=>h.MU,"600b551ff0a65226940fd243f19af92ae3f64691b9":()=>e.OQ,"6021debc3cbf2b06c248810a659e911ef958fe1504":()=>e.T$,"6083f05fb2bd69b17e5bb113fda4f6c6d910bc6731":()=>h.Tc,"60a5bb03fb8b839e913b05e36d237f0b6c85be6aae":()=>e.L4,"70978bd27516caca844a607725d48a2b90e3d27efa":()=>e.h$,"78a3c90ed14e751ce1afe7920705919dbac5f7156d":()=>e.g3});var e=c(13415),f=c(3890),g=c(50995),h=c(15754),i=a([e,h]);[e,h]=i.then?(await i)():i,d()}catch(a){d(a)}})}};
@@ -1,4 +1,4 @@
1
- exports.id=4031,exports.ids=[4031],exports.modules={12140:(a,b,c)=>{"use strict";c.d(b,{Md:()=>q,u0:()=>n,y4:()=>o});var d=c(73024),e=c(76760),f=c.n(e),g=c(48161),h=c.n(g),i=c(77598),j=c.n(i);let k=f().join(h().homedir(),".reflex","audit");function l(a){return f().join(k,`${a}.jsonl`)}function m(a=new Date){return a.toISOString().slice(0,10)}async function n(a){let b={ts:a.ts??new Date().toISOString(),...a};await d.promises.mkdir(k,{recursive:!0});let c=l(m());await d.promises.appendFile(c,JSON.stringify(b)+"\n","utf8")}async function o(a={}){let b,c=await p(),e=a.date??c[0]??m(),f=a.limit??500,g=l(e);try{b=await d.promises.readFile(g,"utf8")}catch{return{date:e,entries:[],availableDates:c}}let h=[],i=b.split(/\r?\n/);for(let b=i.length-1;b>=0&&h.length<f;b--){let c,d=i[b];if(d){try{c=JSON.parse(d)}catch{continue}(function(a,b){if(!b)return!0;if(b.utilityId&&a.utilityId!==b.utilityId||b.method&&a.method!==b.method||b.phase&&a.phase!==b.phase)return!1;if(b.status){let c=!a.error;if("ok"===b.status&&!c||"error"===b.status&&c)return!1}return!0})(c,a.filter)&&h.push(c)}}return{date:e,entries:h,availableDates:c}}async function p(){let a;try{a=await d.promises.readdir(k)}catch{return[]}return a.filter(a=>/^\d{4}-\d{2}-\d{2}\.jsonl$/.test(a)).map(a=>a.replace(/\.jsonl$/,"")).sort().reverse()}async function q(a,b){let c=j().randomUUID().replace(/-/g,"").slice(0,16),d=Date.now();await n({ts:new Date().toISOString(),utilityId:a.utilityId,scope:a.scope,channel:a.channel,method:a.method,phase:"start",correlationId:c,...a.parentCorrelationId?{parentCorrelationId:a.parentCorrelationId}:{},args:r(a.args)});try{let e=await b(c);return await n({ts:new Date().toISOString(),utilityId:a.utilityId,scope:a.scope,channel:a.channel,method:a.method,phase:"end",correlationId:c,durationMs:Date.now()-d,result:r(e)}),e}catch(e){let b=e instanceof Error?e.message:String(e);throw await n({ts:new Date().toISOString(),utilityId:a.utilityId,scope:a.scope,channel:a.channel,method:a.method,phase:"end",correlationId:c,durationMs:Date.now()-d,error:b}),e}}function r(a,b=0){if(null==a)return a;if("string"==typeof a)return a.length>2e3?a.slice(0,2e3)+"…[truncated]":a;if("object"!=typeof a)return a;if(b>3)return"[…]";if(Array.isArray(a))return a.slice(0,50).map(a=>r(a,b+1));let c={},d=0;for(let[e,f]of Object.entries(a)){if(d++>=50){c["…"]="truncated";break}c[e]=r(f,b+1)}return c}},49556:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{runServerAction:()=>m});var e=c(75919),f=c(76760),g=c.n(f),h=c(73136),i=c(99861),j=c(99066),k=c(12140),l=a([i,j]);async function m(a){let b=(0,i.actionBundlePath)(a.utility.dir,a.action.name),c=(0,h.pathToFileURL)(b).toString(),d=function(){let a=g().resolve(process.cwd(),"lib/server/utilities/worker-bootstrap.js"),b=null;try{b=61880}catch{}return b&&g().isAbsolute(b)?b:a}();return new Promise((b,f)=>{let g=new e.Worker(d,{workerData:{bundleUrl:c,actionName:a.action.name,utilityId:a.utility.manifest.id,scope:a.utility.scope},env:{},eval:!1,resourceLimits:{maxOldGenerationSizeMb:256,maxYoungGenerationSizeMb:64}}),h=!1,i=(c,d,e)=>{h||(h=!0,clearTimeout(l),g.removeAllListeners(),g.terminate().catch(()=>{}),c?((0,k.u0)({ts:new Date().toISOString(),utilityId:a.utility.manifest.id,scope:a.utility.scope,channel:"worker",method:`action:${a.action.name}`,phase:"end",correlationId:a.parentCorrelationId??"(detached)",error:e??c.message}),f(c)):b(d))},l=setTimeout(()=>{i(Error("server action timed out"),void 0,"timeout")},a.action.timeoutMs);g.on("error",a=>i(a)),g.on("exit",a=>{0!==a&&i(Error(`worker exited with code ${a}`))}),g.on("message",async b=>{if(b&&"object"==typeof b){if("host-rpc"===b.type){let c=b.id,d=b.method,e=b.args;try{let b=await (0,j.p)({utility:a.utility,channel:"worker",...a.parentCorrelationId?{parentCorrelationId:a.parentCorrelationId}:{}},d,e);g.postMessage({type:"host-rpc-result",id:c,ok:!0,result:b})}catch(a){g.postMessage({type:"host-rpc-result",id:c,ok:!1,error:a instanceof Error?a.message:String(a)})}return}"invoke-result"===b.type&&(b.ok?i(null,b.result):i(Error(b.error||"server action failed")))}}),g.postMessage({type:"invoke",args:a.args})})}[i,j]=l.then?(await l)():l,d()}catch(a){d(a)}})},61880:(a,b,c)=>{"use strict";var d=c(75919);if(!d.parentPort)throw Error("worker-bootstrap.js must be loaded as a worker_threads child");let e=new Map,f=1,g=new Proxy({},{get(a,b){if("string"==typeof b)return new Proxy({},{get(a,c){if("string"==typeof c)return a=>new Promise((g,h)=>{let i=f++;e.set(i,{resolve:g,reject:h}),d.parentPort.postMessage({type:"host-rpc",id:i,method:`${b}.${c}`,args:a})})}})}});globalThis.__reflexHost=g,d.parentPort.on("message",async a=>{if(a&&"host-rpc-result"===a.type){let b=e.get(a.id);if(!b)return;e.delete(a.id),a.ok?b.resolve(a.result):b.reject(Error(a.error||"rpc failed"));return}if(a&&"invoke"===a.type)try{let b=await c(74664)(d.workerData.bundleUrl),e=b[d.workerData.actionName]??b.default;if("function"!=typeof e)throw Error(`action "${d.workerData.actionName}" must export a function (named export or default)`);let f=await e(a.args,g);d.parentPort.postMessage({type:"invoke-result",ok:!0,result:f})}catch(a){d.parentPort.postMessage({type:"invoke-result",ok:!1,error:a&&a.message?a.message:String(a)})}})},74664:a=>{function b(a){return Promise.resolve().then(()=>{var b=Error("Cannot find module '"+a+"'");throw b.code="MODULE_NOT_FOUND",b})}b.keys=()=>[],b.resolve=b,b.id=74664,a.exports=b},99066:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{p:()=>p});var e=c(73024),f=c(76760),g=c.n(f),h=c(56149),i=c(12140),j=c(99353),k=c(56942),l=c(19319),m=c(53905),n=c(36017),o=a([j]);j=(o.then?(await o)():o)[0];let T=h.Ik({task:h.k5(["chat","quick","rag","embed"]).default("quick"),prompt:h.Yj().min(1),model:h.Yj().optional()}),U=h.Ik({kind:h.Yj().min(1).max(64),title:h.Yj().min(1).max(200),body:h.Yj().default(""),meta:h.g1(h.Yj(),h.L5()).optional(),slug:h.Yj().optional(),date:h.Yj().optional(),rootId:h.Yj().optional()}),V=h.Ik({kind:h.Yj().optional(),query:h.Yj().optional(),rootId:h.Yj().optional()}),W=h.Ik({relPath:h.Yj().min(1),rootId:h.Yj().optional()}),X=h.Ik({path:h.Yj().min(1),content:h.Yj().optional()}),Y=h.Ik({url:h.Yj().url(),method:h.k5(["GET","POST","PUT","DELETE","PATCH"]).default("GET"),headers:h.g1(h.Yj(),h.Yj()).optional(),body:h.KC([h.Yj(),h.g1(h.Yj(),h.L5())]).optional()}),Z=h.Ik({query:h.Yj().min(1).max(512)}),$=h.Ik({type:h.Yj().min(1).max(64),payload:h.L5().optional()}),_=h.Ik({server:h.Yj().min(1).optional(),tool:h.Yj().min(1),args:h.g1(h.Yj(),h.L5()).default({})}),aa=h.Ik({server:h.Yj().min(1).optional()}),ab=h.Ik({key:h.Yj().min(1)}),ac=h.Ik({name:h.Yj().min(1),args:h.L5().optional()}),ad=h.Ik({prompt:h.Yj().min(1).max(4e4),rootId:h.Yj().optional(),harness:h.Yj().optional(),model:h.Yj().optional(),language:h.Yj().optional(),label:h.Yj().optional(),timeoutMs:h.ai().int().min(1e3).max(9e5).optional()}),ae=h.Ik({rootId:h.Yj().optional()}),af=h.Ik({workflowId:h.Yj().min(1),rootId:h.Yj().optional()}),ag=h.Ik({workflowId:h.Yj().min(1),rootId:h.Yj().optional(),input:h.L5().optional()}),ah=h.Ik({prompt:h.Yj().min(1).max(8e3),provider:h.k5(["gemini","codex"]).optional(),size:h.Yj().max(40).optional(),aspectRatio:h.Yj().max(40).optional(),referenceImageUrls:h.YO(h.Yj().url()).max(6).optional(),alt:h.Yj().max(280).optional(),rootId:h.Yj().optional()}),ai=h.Ik({query:h.Yj().min(1).max(200),provider:h.k5(["unsplash","pexels","brave"]).optional(),count:h.ai().int().min(1).max(24).optional()}),aj=h.Ik({sourceUrl:h.Yj().url(),rootId:h.Yj().optional()}),ak=h.Ik({query:h.Yj().min(1).max(200),alt:h.Yj().max(280).default(""),context:h.Yj().max(2e3).default(""),candidates:h.YO(h.Ik({url:h.Yj().url(),thumb:h.Yj().url(),attribution:h.Ik({name:h.Yj().default(""),link:h.Yj().default("")})})).min(1).max(12),rootId:h.Yj().optional()}),al=h.Ik({widgetId:h.Yj().optional(),snapshot:h.Ik({kind:h.k5(["markdown","news-list","link-list","kpi","checklist","quote","kb-pinned","progress","image","stat-table","map"]),title:h.Yj().optional(),description:h.Yj().optional(),data:h.g1(h.Yj(),h.L5()).default({})}),rootId:h.Yj().optional()});async function p(a,b,c){let d={utilityId:a.utility.manifest.id,scope:a.utility.scope,channel:a.channel,method:b,args:c,...a.parentCorrelationId?{parentCorrelationId:a.parentCorrelationId}:{}};return(0,i.Md)(d,async d=>{switch(b){case"llm.complete":return w(a,T.parse(c));case"kb.add":return x(a,U.parse(c));case"kb.list":return y(a,V.parse(c));case"kb.read":return z(a,W.parse(c));case"fs.read":return B(a,X.parse(c));case"fs.write":return C(a,X.parse(c));case"fs.list":return D(a,X.parse(c));case"web.fetch":return E(a,Y.parse(c));case"web.search":return F(a,Z.parse(c));case"audit.log":return G(a,$.parse(c),d);case"actions.invoke":return H(a,ac.parse(c),d);case"mcp.call":return t(a,_.parse(c));case"mcp.listServers":return u(a);case"mcp.listTools":return v(a,aa.parse(c));case"secrets.get":return q(a,ab.parse(c));case"secrets.list":return r(a);case"agent.invoke":return I(a,ad.parse(c));case"workflow.list":return J(a,ae.parse(c));case"workflow.read":return K(a,af.parse(c));case"workflow.run":return L(a,ag.parse(c));case"cards.update":return M(a,al.parse(c));case"images.generate":return N(a,ah.parse(c));case"images.search":return O(a,ai.parse(c));case"images.attach":return P(a,aj.parse(c));case"images.pickBest":return Q(a,ak.parse(c));default:throw Error(`Unknown host method: ${b}`)}})}async function q(a,b){if(!(a.utility.manifest.secrets??[]).find(a=>a.key===b.key))throw Error(`secret "${b.key}" is not declared in manifest.secrets`);let{getSecret:d}=await c.e(8514).then(c.bind(c,28514)),e=await d(a.utility.scope,a.utility.manifest.id,b.key,a.utility.rootId);if(null==e)throw Error(`secret "${b.key}" is not set — fill it in the utility's panel`);return{value:e}}async function r(a){let b=a.utility.manifest.secrets??[],{listSecretKeys:d}=await c.e(8514).then(c.bind(c,28514)),e=new Set(await d(a.utility.scope,a.utility.manifest.id,a.utility.rootId));return{secrets:b.map(a=>({key:a.key,set:e.has(a.key),required:a.required,label:a.label,description:a.description}))}}async function s(a,b){let d=a.utility.manifest.mcpServers??[],f=b;if(!f)if(1===d.length)f=d[0];else if(a.utility.manifest.source?.type==="mcp"){let b=g().join(a.utility.dir,"mcp.json"),d=await e.promises.readFile(b,"utf8").catch(()=>null);if(!d)throw Error(`mcp config missing at ${b}`);let{McpConfigSchema:f}=await Promise.resolve().then(c.bind(c,97453));return{config:f.parse(JSON.parse(d)),serverId:"(bundled)"}}else throw Error(0===d.length?"manifest.mcpServers is empty — declare which server you want to use":"multiple mcpServers declared — pass `server` explicitly");if(!d.includes(f))throw Error(`mcp server "${f}" is not in manifest.mcpServers — declare it to gain access`);let{getMcpServer:h}=await Promise.resolve().then(c.bind(c,580)),i=await h(f);if(!i)throw Error(`mcp server "${f}" is not registered — add it in Settings → MCP`);return{config:i.config,serverId:f}}async function t(a,b){let{config:d,serverId:e}=await s(a,b.server),{callTool:f}=await Promise.resolve().then(c.bind(c,97453)),g=await f(d,b.tool,b.args);return{server:e,...void 0!==g.isError?{isError:g.isError}:{},content:g.content}}async function u(a){let b=a.utility.manifest.mcpServers??[],{listMcpServers:d}=await Promise.resolve().then(c.bind(c,580)),e=await d(),f=new Map(e.map(a=>[a.id,a]));return{servers:b.map(a=>{let b=f.get(a);return{id:a,label:b?.label??a,description:b?.description??"",registered:!!b}})}}async function v(a,b){let{config:d,serverId:e}=await s(a,b.server),{connectAndListTools:f}=await Promise.resolve().then(c.bind(c,97453)),g=await f(d);return{server:e,tools:g.tools}}async function w(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.llm?.tasks?.includes(b.task),`llm.${b.task} not granted in manifest`);let c={...(await (0,n.M)()).assignments[b.task],...b.model?{model:b.model}:{}};return{text:await (0,j.T)(c,b.prompt,{timeoutMs:6e4})}}async function x(a,b){if(R(a.utility.manifest,!!a.utility.manifest.permissions.kb?.write,"kb.write not granted"),a.utility.manifest.permissions.kb?.kinds&&!a.utility.manifest.permissions.kb.kinds.includes(b.kind))throw Error(`kb kind "${b.kind}" not in manifest allowlist`);let c=await S(a,b.rootId),d=await (0,k.j)({rootPath:c.path,directive:{kind:b.kind,title:b.title,...b.body?{body:b.body}:{},...b.meta?{meta:b.meta}:{},...b.slug?{slug:b.slug}:{},...b.date?{date:b.date}:{}},provenance:{kind:"utility",id:a.utility.manifest.id,version:a.utility.manifest.version}});return{relPath:d.relPath,absPath:d.absPath}}async function y(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.kb?.read,"kb.read not granted");let c=await S(a,b.rootId),d=await (0,l.dj)(c.path),e=b.query?.toLowerCase();return d.filter(a=>(!b.kind||a.rel.split("/")[0]===b.kind||a.meta.kind===b.kind)&&(!e||!!`${a.rel} ${a.meta.title??""}`.toLowerCase().includes(e))&&!0).map(a=>({relPath:a.rel,title:a.meta.title,kind:a.meta.kind,modifiedAt:a.modifiedAt}))}async function z(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.kb?.read,"kb.read not granted");let c=await S(a,b.rootId);return{content:await (0,l.IK)(c.path,b.relPath)}}function A(a,b){if(b.startsWith("/")||b.includes(".."))throw Error(`unsafe fs path: ${b}`);let c=g().join(a.utility.dir,"data"),d=g().resolve(c,b),e=g().relative(c,d);if(e.startsWith("..")||g().isAbsolute(e))throw Error(`fs path escapes data dir: ${b}`);return d}async function B(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.fs?.sandbox,"fs not granted");let c=A(a,b.path);return{content:await e.promises.readFile(c,"utf8")}}async function C(a,b){if(R(a.utility.manifest,!!a.utility.manifest.permissions.fs?.sandbox,"fs not granted"),"string"!=typeof b.content)throw Error("fs.write requires content (string)");let c=A(a,b.path);return await e.promises.mkdir(g().dirname(c),{recursive:!0}),await e.promises.writeFile(c,b.content,"utf8"),{ok:!0,bytes:Buffer.byteLength(b.content,"utf8")}}async function D(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.fs?.sandbox,"fs not granted");let c=A(a,b.path||".");try{return{entries:(await e.promises.readdir(c,{withFileTypes:!0})).map(a=>({name:a.name,isDir:a.isDirectory()}))}}catch{return{entries:[]}}}async function E(a,b){let c,d=a.utility.manifest.permissions.web?.fetch?.domains??[];try{c=new URL(b.url).hostname}catch{throw Error(`invalid url: ${b.url}`)}if(!d.some(a=>c===a||c.endsWith(`.${a}`)))throw Error(`web.fetch denied: domain "${c}" not in whitelist (${d.join(", ")})`);let e={method:b.method,...b.headers?{headers:b.headers}:{},signal:AbortSignal.timeout(2e4)};void 0!==b.body&&"GET"!==b.method&&(e.body="string"==typeof b.body?b.body:JSON.stringify(b.body));let f=await fetch(b.url,e),g=await f.text(),h={};return f.headers.forEach((a,b)=>{h[b]=a}),{status:f.status,headers:h,body:g}}async function F(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.web?.search,"web.search not granted");let c=await (0,n.M)(),d={...c.assignments.quick,allowedTools:Array.from(new Set([...c.assignments.quick.allowedTools??[],"WebSearch"]))},e=`Use the WebSearch tool to find recent results for the query below.
1
+ exports.id=4031,exports.ids=[4031],exports.modules={12140:(a,b,c)=>{"use strict";c.d(b,{Md:()=>p,u0:()=>m,y4:()=>n});var d=c(73024),e=c(76760),f=c.n(e),g=c(77598),h=c.n(g),i=c(73652);let j=f().join((0,i._)(),"audit");function k(a){return f().join(j,`${a}.jsonl`)}function l(a=new Date){return a.toISOString().slice(0,10)}async function m(a){let b={ts:a.ts??new Date().toISOString(),...a};await d.promises.mkdir(j,{recursive:!0});let c=k(l());await d.promises.appendFile(c,JSON.stringify(b)+"\n","utf8")}async function n(a={}){let b,c=await o(),e=a.date??c[0]??l(),f=a.limit??500,g=k(e);try{b=await d.promises.readFile(g,"utf8")}catch{return{date:e,entries:[],availableDates:c}}let h=[],i=b.split(/\r?\n/);for(let b=i.length-1;b>=0&&h.length<f;b--){let c,d=i[b];if(d){try{c=JSON.parse(d)}catch{continue}(function(a,b){if(!b)return!0;if(b.utilityId&&a.utilityId!==b.utilityId||b.method&&a.method!==b.method||b.phase&&a.phase!==b.phase)return!1;if(b.status){let c=!a.error;if("ok"===b.status&&!c||"error"===b.status&&c)return!1}return!0})(c,a.filter)&&h.push(c)}}return{date:e,entries:h,availableDates:c}}async function o(){let a;try{a=await d.promises.readdir(j)}catch{return[]}return a.filter(a=>/^\d{4}-\d{2}-\d{2}\.jsonl$/.test(a)).map(a=>a.replace(/\.jsonl$/,"")).sort().reverse()}async function p(a,b){let c=h().randomUUID().replace(/-/g,"").slice(0,16),d=Date.now();await m({ts:new Date().toISOString(),utilityId:a.utilityId,scope:a.scope,channel:a.channel,method:a.method,phase:"start",correlationId:c,...a.parentCorrelationId?{parentCorrelationId:a.parentCorrelationId}:{},args:q(a.args)});try{let e=await b(c);return await m({ts:new Date().toISOString(),utilityId:a.utilityId,scope:a.scope,channel:a.channel,method:a.method,phase:"end",correlationId:c,durationMs:Date.now()-d,result:q(e)}),e}catch(e){let b=e instanceof Error?e.message:String(e);throw await m({ts:new Date().toISOString(),utilityId:a.utilityId,scope:a.scope,channel:a.channel,method:a.method,phase:"end",correlationId:c,durationMs:Date.now()-d,error:b}),e}}function q(a,b=0){if(null==a)return a;if("string"==typeof a)return a.length>2e3?a.slice(0,2e3)+"…[truncated]":a;if("object"!=typeof a)return a;if(b>3)return"[…]";if(Array.isArray(a))return a.slice(0,50).map(a=>q(a,b+1));let c={},d=0;for(let[e,f]of Object.entries(a)){if(d++>=50){c["…"]="truncated";break}c[e]=q(f,b+1)}return c}},49556:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{runServerAction:()=>m});var e=c(75919),f=c(76760),g=c.n(f),h=c(73136),i=c(99861),j=c(99066),k=c(12140),l=a([i,j]);async function m(a){let b=(0,i.actionBundlePath)(a.utility.dir,a.action.name),c=(0,h.pathToFileURL)(b).toString(),d=function(){let a=g().resolve(process.cwd(),"lib/server/utilities/worker-bootstrap.js"),b=null;try{b=61880}catch{}return b&&g().isAbsolute(b)?b:a}();return new Promise((b,f)=>{let g=new e.Worker(d,{workerData:{bundleUrl:c,actionName:a.action.name,utilityId:a.utility.manifest.id,scope:a.utility.scope},env:{},eval:!1,resourceLimits:{maxOldGenerationSizeMb:256,maxYoungGenerationSizeMb:64}}),h=!1,i=(c,d,e)=>{h||(h=!0,clearTimeout(l),g.removeAllListeners(),g.terminate().catch(()=>{}),c?((0,k.u0)({ts:new Date().toISOString(),utilityId:a.utility.manifest.id,scope:a.utility.scope,channel:"worker",method:`action:${a.action.name}`,phase:"end",correlationId:a.parentCorrelationId??"(detached)",error:e??c.message}),f(c)):b(d))},l=setTimeout(()=>{i(Error("server action timed out"),void 0,"timeout")},a.action.timeoutMs);g.on("error",a=>i(a)),g.on("exit",a=>{0!==a&&i(Error(`worker exited with code ${a}`))}),g.on("message",async b=>{if(b&&"object"==typeof b){if("host-rpc"===b.type){let c=b.id,d=b.method,e=b.args;try{let b=await (0,j.p)({utility:a.utility,channel:"worker",...a.parentCorrelationId?{parentCorrelationId:a.parentCorrelationId}:{}},d,e);g.postMessage({type:"host-rpc-result",id:c,ok:!0,result:b})}catch(a){g.postMessage({type:"host-rpc-result",id:c,ok:!1,error:a instanceof Error?a.message:String(a)})}return}"invoke-result"===b.type&&(b.ok?i(null,b.result):i(Error(b.error||"server action failed")))}}),g.postMessage({type:"invoke",args:a.args})})}[i,j]=l.then?(await l)():l,d()}catch(a){d(a)}})},61880:(a,b,c)=>{"use strict";var d=c(75919);if(!d.parentPort)throw Error("worker-bootstrap.js must be loaded as a worker_threads child");let e=new Map,f=1,g=new Proxy({},{get(a,b){if("string"==typeof b)return new Proxy({},{get(a,c){if("string"==typeof c)return a=>new Promise((g,h)=>{let i=f++;e.set(i,{resolve:g,reject:h}),d.parentPort.postMessage({type:"host-rpc",id:i,method:`${b}.${c}`,args:a})})}})}});globalThis.__reflexHost=g,d.parentPort.on("message",async a=>{if(a&&"host-rpc-result"===a.type){let b=e.get(a.id);if(!b)return;e.delete(a.id),a.ok?b.resolve(a.result):b.reject(Error(a.error||"rpc failed"));return}if(a&&"invoke"===a.type)try{let b=await c(74664)(d.workerData.bundleUrl),e=b[d.workerData.actionName]??b.default;if("function"!=typeof e)throw Error(`action "${d.workerData.actionName}" must export a function (named export or default)`);let f=await e(a.args,g);d.parentPort.postMessage({type:"invoke-result",ok:!0,result:f})}catch(a){d.parentPort.postMessage({type:"invoke-result",ok:!1,error:a&&a.message?a.message:String(a)})}})},74664:a=>{function b(a){return Promise.resolve().then(()=>{var b=Error("Cannot find module '"+a+"'");throw b.code="MODULE_NOT_FOUND",b})}b.keys=()=>[],b.resolve=b,b.id=74664,a.exports=b},99066:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{p:()=>p});var e=c(73024),f=c(76760),g=c.n(f),h=c(56149),i=c(12140),j=c(99353),k=c(56942),l=c(19319),m=c(53905),n=c(36017),o=a([j]);j=(o.then?(await o)():o)[0];let T=h.Ik({task:h.k5(["chat","quick","rag","embed"]).default("quick"),prompt:h.Yj().min(1),model:h.Yj().optional()}),U=h.Ik({kind:h.Yj().min(1).max(64),title:h.Yj().min(1).max(200),body:h.Yj().default(""),meta:h.g1(h.Yj(),h.L5()).optional(),slug:h.Yj().optional(),date:h.Yj().optional(),rootId:h.Yj().optional()}),V=h.Ik({kind:h.Yj().optional(),query:h.Yj().optional(),rootId:h.Yj().optional()}),W=h.Ik({relPath:h.Yj().min(1),rootId:h.Yj().optional()}),X=h.Ik({path:h.Yj().min(1),content:h.Yj().optional()}),Y=h.Ik({url:h.Yj().url(),method:h.k5(["GET","POST","PUT","DELETE","PATCH"]).default("GET"),headers:h.g1(h.Yj(),h.Yj()).optional(),body:h.KC([h.Yj(),h.g1(h.Yj(),h.L5())]).optional()}),Z=h.Ik({query:h.Yj().min(1).max(512)}),$=h.Ik({type:h.Yj().min(1).max(64),payload:h.L5().optional()}),_=h.Ik({server:h.Yj().min(1).optional(),tool:h.Yj().min(1),args:h.g1(h.Yj(),h.L5()).default({})}),aa=h.Ik({server:h.Yj().min(1).optional()}),ab=h.Ik({key:h.Yj().min(1)}),ac=h.Ik({name:h.Yj().min(1),args:h.L5().optional()}),ad=h.Ik({prompt:h.Yj().min(1).max(4e4),rootId:h.Yj().optional(),harness:h.Yj().optional(),model:h.Yj().optional(),language:h.Yj().optional(),label:h.Yj().optional(),timeoutMs:h.ai().int().min(1e3).max(9e5).optional()}),ae=h.Ik({rootId:h.Yj().optional()}),af=h.Ik({workflowId:h.Yj().min(1),rootId:h.Yj().optional()}),ag=h.Ik({workflowId:h.Yj().min(1),rootId:h.Yj().optional(),input:h.L5().optional()}),ah=h.Ik({prompt:h.Yj().min(1).max(8e3),provider:h.k5(["gemini","codex"]).optional(),size:h.Yj().max(40).optional(),aspectRatio:h.Yj().max(40).optional(),referenceImageUrls:h.YO(h.Yj().url()).max(6).optional(),alt:h.Yj().max(280).optional(),rootId:h.Yj().optional()}),ai=h.Ik({query:h.Yj().min(1).max(200),provider:h.k5(["unsplash","pexels","brave"]).optional(),count:h.ai().int().min(1).max(24).optional()}),aj=h.Ik({sourceUrl:h.Yj().url(),rootId:h.Yj().optional()}),ak=h.Ik({query:h.Yj().min(1).max(200),alt:h.Yj().max(280).default(""),context:h.Yj().max(2e3).default(""),candidates:h.YO(h.Ik({url:h.Yj().url(),thumb:h.Yj().url(),attribution:h.Ik({name:h.Yj().default(""),link:h.Yj().default("")})})).min(1).max(12),rootId:h.Yj().optional()}),al=h.Ik({widgetId:h.Yj().optional(),snapshot:h.Ik({kind:h.k5(["markdown","news-list","link-list","kpi","checklist","quote","kb-pinned","progress","image","stat-table","map"]),title:h.Yj().optional(),description:h.Yj().optional(),data:h.g1(h.Yj(),h.L5()).default({})}),rootId:h.Yj().optional()});async function p(a,b,c){let d={utilityId:a.utility.manifest.id,scope:a.utility.scope,channel:a.channel,method:b,args:c,...a.parentCorrelationId?{parentCorrelationId:a.parentCorrelationId}:{}};return(0,i.Md)(d,async d=>{switch(b){case"llm.complete":return w(a,T.parse(c));case"kb.add":return x(a,U.parse(c));case"kb.list":return y(a,V.parse(c));case"kb.read":return z(a,W.parse(c));case"fs.read":return B(a,X.parse(c));case"fs.write":return C(a,X.parse(c));case"fs.list":return D(a,X.parse(c));case"web.fetch":return E(a,Y.parse(c));case"web.search":return F(a,Z.parse(c));case"audit.log":return G(a,$.parse(c),d);case"actions.invoke":return H(a,ac.parse(c),d);case"mcp.call":return t(a,_.parse(c));case"mcp.listServers":return u(a);case"mcp.listTools":return v(a,aa.parse(c));case"secrets.get":return q(a,ab.parse(c));case"secrets.list":return r(a);case"agent.invoke":return I(a,ad.parse(c));case"workflow.list":return J(a,ae.parse(c));case"workflow.read":return K(a,af.parse(c));case"workflow.run":return L(a,ag.parse(c));case"cards.update":return M(a,al.parse(c));case"images.generate":return N(a,ah.parse(c));case"images.search":return O(a,ai.parse(c));case"images.attach":return P(a,aj.parse(c));case"images.pickBest":return Q(a,ak.parse(c));default:throw Error(`Unknown host method: ${b}`)}})}async function q(a,b){if(!(a.utility.manifest.secrets??[]).find(a=>a.key===b.key))throw Error(`secret "${b.key}" is not declared in manifest.secrets`);let{getSecret:d}=await c.e(8514).then(c.bind(c,28514)),e=await d(a.utility.scope,a.utility.manifest.id,b.key,a.utility.rootId);if(null==e)throw Error(`secret "${b.key}" is not set — fill it in the utility's panel`);return{value:e}}async function r(a){let b=a.utility.manifest.secrets??[],{listSecretKeys:d}=await c.e(8514).then(c.bind(c,28514)),e=new Set(await d(a.utility.scope,a.utility.manifest.id,a.utility.rootId));return{secrets:b.map(a=>({key:a.key,set:e.has(a.key),required:a.required,label:a.label,description:a.description}))}}async function s(a,b){let d=a.utility.manifest.mcpServers??[],f=b;if(!f)if(1===d.length)f=d[0];else if(a.utility.manifest.source?.type==="mcp"){let b=g().join(a.utility.dir,"mcp.json"),d=await e.promises.readFile(b,"utf8").catch(()=>null);if(!d)throw Error(`mcp config missing at ${b}`);let{McpConfigSchema:f}=await Promise.resolve().then(c.bind(c,97453));return{config:f.parse(JSON.parse(d)),serverId:"(bundled)"}}else throw Error(0===d.length?"manifest.mcpServers is empty — declare which server you want to use":"multiple mcpServers declared — pass `server` explicitly");if(!d.includes(f))throw Error(`mcp server "${f}" is not in manifest.mcpServers — declare it to gain access`);let{getMcpServer:h}=await Promise.resolve().then(c.bind(c,580)),i=await h(f);if(!i)throw Error(`mcp server "${f}" is not registered — add it in Settings → MCP`);return{config:i.config,serverId:f}}async function t(a,b){let{config:d,serverId:e}=await s(a,b.server),{callTool:f}=await Promise.resolve().then(c.bind(c,97453)),g=await f(d,b.tool,b.args);return{server:e,...void 0!==g.isError?{isError:g.isError}:{},content:g.content}}async function u(a){let b=a.utility.manifest.mcpServers??[],{listMcpServers:d}=await Promise.resolve().then(c.bind(c,580)),e=await d(),f=new Map(e.map(a=>[a.id,a]));return{servers:b.map(a=>{let b=f.get(a);return{id:a,label:b?.label??a,description:b?.description??"",registered:!!b}})}}async function v(a,b){let{config:d,serverId:e}=await s(a,b.server),{connectAndListTools:f}=await Promise.resolve().then(c.bind(c,97453)),g=await f(d);return{server:e,tools:g.tools}}async function w(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.llm?.tasks?.includes(b.task),`llm.${b.task} not granted in manifest`);let c={...(await (0,n.M)()).assignments[b.task],...b.model?{model:b.model}:{}};return{text:await (0,j.T)(c,b.prompt,{timeoutMs:6e4})}}async function x(a,b){if(R(a.utility.manifest,!!a.utility.manifest.permissions.kb?.write,"kb.write not granted"),a.utility.manifest.permissions.kb?.kinds&&!a.utility.manifest.permissions.kb.kinds.includes(b.kind))throw Error(`kb kind "${b.kind}" not in manifest allowlist`);let c=await S(a,b.rootId),d=await (0,k.j)({rootPath:c.path,directive:{kind:b.kind,title:b.title,...b.body?{body:b.body}:{},...b.meta?{meta:b.meta}:{},...b.slug?{slug:b.slug}:{},...b.date?{date:b.date}:{}},provenance:{kind:"utility",id:a.utility.manifest.id,version:a.utility.manifest.version}});return{relPath:d.relPath,absPath:d.absPath}}async function y(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.kb?.read,"kb.read not granted");let c=await S(a,b.rootId),d=await (0,l.dj)(c.path),e=b.query?.toLowerCase();return d.filter(a=>(!b.kind||a.rel.split("/")[0]===b.kind||a.meta.kind===b.kind)&&(!e||!!`${a.rel} ${a.meta.title??""}`.toLowerCase().includes(e))&&!0).map(a=>({relPath:a.rel,title:a.meta.title,kind:a.meta.kind,modifiedAt:a.modifiedAt}))}async function z(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.kb?.read,"kb.read not granted");let c=await S(a,b.rootId);return{content:await (0,l.IK)(c.path,b.relPath)}}function A(a,b){if(b.startsWith("/")||b.includes(".."))throw Error(`unsafe fs path: ${b}`);let c=g().join(a.utility.dir,"data"),d=g().resolve(c,b),e=g().relative(c,d);if(e.startsWith("..")||g().isAbsolute(e))throw Error(`fs path escapes data dir: ${b}`);return d}async function B(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.fs?.sandbox,"fs not granted");let c=A(a,b.path);return{content:await e.promises.readFile(c,"utf8")}}async function C(a,b){if(R(a.utility.manifest,!!a.utility.manifest.permissions.fs?.sandbox,"fs not granted"),"string"!=typeof b.content)throw Error("fs.write requires content (string)");let c=A(a,b.path);return await e.promises.mkdir(g().dirname(c),{recursive:!0}),await e.promises.writeFile(c,b.content,"utf8"),{ok:!0,bytes:Buffer.byteLength(b.content,"utf8")}}async function D(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.fs?.sandbox,"fs not granted");let c=A(a,b.path||".");try{return{entries:(await e.promises.readdir(c,{withFileTypes:!0})).map(a=>({name:a.name,isDir:a.isDirectory()}))}}catch{return{entries:[]}}}async function E(a,b){let c,d=a.utility.manifest.permissions.web?.fetch?.domains??[];try{c=new URL(b.url).hostname}catch{throw Error(`invalid url: ${b.url}`)}if(!d.some(a=>c===a||c.endsWith(`.${a}`)))throw Error(`web.fetch denied: domain "${c}" not in whitelist (${d.join(", ")})`);let e={method:b.method,...b.headers?{headers:b.headers}:{},signal:AbortSignal.timeout(2e4)};void 0!==b.body&&"GET"!==b.method&&(e.body="string"==typeof b.body?b.body:JSON.stringify(b.body));let f=await fetch(b.url,e),g=await f.text(),h={};return f.headers.forEach((a,b)=>{h[b]=a}),{status:f.status,headers:h,body:g}}async function F(a,b){R(a.utility.manifest,!!a.utility.manifest.permissions.web?.search,"web.search not granted");let c=await (0,n.M)(),d={...c.assignments.quick,allowedTools:Array.from(new Set([...c.assignments.quick.allowedTools??[],"WebSearch"]))},e=`Use the WebSearch tool to find recent results for the query below.
2
2
  Return ONLY a JSON object on a single line with shape:
3
3
  {"results":[{"title":"…","url":"…","snippet":"…"}]}
4
4
  No prose, no markdown fences. Max 8 results.
@@ -0,0 +1,3 @@
1
+ "use strict";exports.id=4567,exports.ids=[4567],exports.modules={879:(a,b,c)=>{c.d(b,{G:()=>k});var d=c(73024),e=c(76760),f=c.n(e),g=c(55136),h=c.n(g),i=c(54287);class j{constructor(a,b){this.root=a,this.layers=b}static async create(a){return new j(a,[]).enter(a)}async enter(a){let b,c=f().join(a,i.KZ);try{b=await d.promises.readFile(c,"utf8")}catch{return this}let e=h()().add(b);return new j(this.root,[...this.layers,{dir:a,ig:e}])}ignores(a){let b=f().basename(a);if(i.Lj.has(b))return!0;for(let{dir:b,ig:c}of this.layers){let d=f().relative(b,a);if(!(!d||d.startsWith(".."))&&c.ignores(d))return!0}return!1}}async function*k(a,b={}){let{maxDepth:c=1/0,followSymlinks:d=!1}=b,e=f().resolve(a),g=await j.create(e);yield{abs:e,rel:".",isDir:!0},yield*l(e,e,g,0,c,d)}async function*l(a,b,c,e,g,h){let i;if(!(e>=g)){try{i=await d.promises.readdir(b,{withFileTypes:!0})}catch{return}for(let d of(i.sort((a,b)=>a.name.localeCompare(b.name)),i)){var j,k;let i=f().join(b,d.name);if(c.ignores(i))continue;let n=d.isSymbolicLink();if(n&&!h)continue;let o=d.isDirectory()||n&&await m(i),p=(j=a,k=i,f().relative(j,k).split(f().sep).join("/"));if(yield{abs:i,rel:p,isDir:o},o){let b=await c.enter(i);yield*l(a,i,b,e+1,g,h)}}}}async function m(a){try{return(await d.promises.stat(a)).isDirectory()}catch{return!1}}},4168:(a,b,c)=>{c.d(b,{S:()=>j});var d=c(73745);c(66493);var e=c(76760),f=c.n(e),g=c(53905),h=c(54287),i=c(879);async function j(a,b){try{let d=await (0,g.Zn)(a);if(!d)return{ok:!1,error:"Root not found"};let e=(b??"").toLowerCase().trim(),j=[];try{let{listUtilities:b}=await Promise.resolve().then(c.bind(c,8118));for(let c of(await b({rootId:a})))j.push({kind:"utility",relPath:`util:${c.scope}/${c.manifest.id}`,absPath:"",label:`${c.manifest.name} (${c.scope})`,parent:"utilities"})}catch{}for await(let a of(0,i.G)((0,h.FF)(d.path))){if(a.isDir||!a.rel.toLowerCase().endsWith(".md")||a.rel.startsWith("topics/")||a.rel.startsWith("attachments/"))continue;let b=`${h.fW}/${a.rel}`;j.push({kind:"kb",relPath:b,absPath:a.abs,label:a.rel,parent:"."===f().dirname(a.rel)?h.fW:`${h.fW}/${f().dirname(a.rel)}`})}for await(let a of(0,i.G)(d.path))a.isDir||j.push({kind:"file",relPath:a.rel,absPath:a.abs,label:a.rel,parent:"."===f().dirname(a.rel)?"":f().dirname(a.rel)});let k=e?j.filter(a=>{let b=a.relPath.toLowerCase();return f().basename(a.relPath).toLowerCase().includes(e)||b.includes(e)}):j,l={utility:0,kb:1,file:2};return k.sort((a,b)=>{if(a.kind!==b.kind)return l[a.kind]-l[b.kind];if(e){let c=f().basename(a.label).toLowerCase(),d=f().basename(b.label).toLowerCase(),g=+!c.startsWith(e),h=+!d.startsWith(e);if(g!==h)return g-h}return a.relPath.localeCompare(b.relPath)}),{ok:!0,items:k.slice(0,30)}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}(0,c(63781).D)([j]),(0,d.A)(j,"60bed3ce7c2ca2e9fc67af0a578f3eb0c2f10be2c8",null)},8836:(a,b,c)=>{c.d(b,{E:()=>f});var d=c(64173),e=c(69552);function f({label:a="Спроси Reflex",headerRight:b,children:c}){return(0,d.jsx)("div",{className:"border-t bg-background",children:(0,d.jsx)("div",{className:"mx-auto max-w-3xl px-6 py-5",children:(0,d.jsx)("div",{className:"reflex-gradient rounded-2xl p-[2px] shadow-[0_8px_40px_-12px_oklch(0.55_0.2_290/0.45)]",children:(0,d.jsxs)("div",{className:"rounded-[14px] bg-background/85 backdrop-blur-xl px-5 py-4",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,d.jsx)("span",{className:"reflex-gradient inline-flex h-6 w-6 items-center justify-center rounded-full text-white shadow-sm",children:(0,d.jsx)(e.A,{className:"h-3.5 w-3.5"})}),(0,d.jsx)("span",{className:"text-[11px] uppercase tracking-[0.18em] text-muted-foreground",children:a}),b&&(0,d.jsx)("span",{className:"ml-auto flex items-center gap-1",children:b})]}),c]})})})})}},15956:(a,b,c)=>{c.d(b,{L:()=>M});var d=c(64173),e=c(17240),f=c(54249),g=c(75430),h=c(34719),i=c(56189),j=c(41856),k=c(33120),l=c(69552),m=c(97338),n=c(25299),o=c(63387),p=c(53834),q=c(97162),r=c(62261),s=c(77311),t=c(25436),u=c(24555),v=c(68669),w=c(79145),x=c(66979),y=c(87671),z=c(44052),A=c(20583),B=c(45477),C=c(91344),D=c(3265);let E=(0,D.createServerReference)("60bed3ce7c2ca2e9fc67af0a578f3eb0c2f10be2c8",D.callServer,void 0,D.findSourceMapURL,"searchMentionsAction"),F=[{id:"plan",trigger:"plan",label:"/plan",description:"Сначала покажи план — Reflex распишет шаги и подождёт одобрения.",kind:"agent-mode",usage:"/plan <задача>",icon:"ListChecks"},{id:"goal",trigger:"goal",label:"/goal",description:"Поставь цель — Reflex будет двигаться к ней сам, без напоминаний.",kind:"agent-mode",usage:"/goal <чего достичь>",icon:"Target"},{id:"research",trigger:"research",label:"/research",description:"Глубокое исследование темы — поиск в интернете + сводка с источниками.",kind:"agent-mode",usage:"/research <тема>",icon:"Telescope"},{id:"widget",trigger:"widget",label:"/widget",description:"Создать карточку на дашборде пространства.",kind:"agent-mode",usage:"/widget <что показать>",icon:"LayoutGrid"},{id:"workflow",trigger:"workflow",label:"/workflow",description:"Собрать рецепт — линейная автоматизация из шагов под задачу.",kind:"agent-mode",usage:"/workflow <что автоматизировать>",icon:"Workflow"},{id:"remember",trigger:"remember",label:"/remember",description:"Запомнить заметку — сразу в память, без обращения к AI.",kind:"direct",usage:"/remember <что запомнить>",icon:"BookmarkPlus"},{id:"mcp",trigger:"mcp",label:"/mcp",description:"Подключить внешний сервис (мастер настройки откроется в чате).",kind:"agent-mode",usage:"/mcp <что нужно>",icon:"PackagePlus"},{id:"skill",trigger:"skill",label:"/skill",description:"Подключить роль — готовый набор инструкций на этот разговор.",kind:"agent-mode",usage:"/skill <id-роли> [запрос]",icon:"Sparkles"},{id:"delete-topic",trigger:"delete-topic",label:"/delete-topic",description:"Удалить этот разговор (с подтверждением).",kind:"direct",usage:"/delete-topic",requiresConfirm:!0,allowEmpty:!0,icon:"Trash2"},{id:"clear-project",trigger:"clear-project",label:"/clear-project",description:"ОПАСНО: очистить пространство — все разговоры, карточки, память. Двойное подтверждение.",kind:"direct",usage:"/clear-project",requiresConfirm:!0,allowEmpty:!0,icon:"AlertOctagon"},{id:"util",trigger:"util",label:"/util",description:"Открыть мини-приложение (по части названия или из списка).",kind:"direct",usage:"/util <часть названия или id>",allowEmpty:!0,icon:"Boxes"},{id:"help",trigger:"help",label:"/help",description:"Список доступных команд.",kind:"direct",usage:"/help",allowEmpty:!0,icon:"HelpCircle"}],G=(0,D.createServerReference)("60a2a3ae0b64cb55755a3f21ebfe4bf6a4663bab70",D.callServer,void 0,D.findSourceMapURL,"rememberAction"),H=(0,D.createServerReference)("604ca7de85772eb88d7ba71e6cbd573e49904e07ff",D.callServer,void 0,D.findSourceMapURL,"deleteCurrentTopicCommand"),I=(0,D.createServerReference)("608fc4ce02acd0ac6ee3ba48a005cc8c26a7a750fd",D.callServer,void 0,D.findSourceMapURL,"openUtilityAction"),J=(0,D.createServerReference)("400e6721a0e22b6fc170d7dc6c41b9c64977cbb032",D.callServer,void 0,D.findSourceMapURL,"clearProjectAction");var K=c(88724);let L={ListChecks:f.A,Target:g.A,Telescope:h.A,LayoutGrid:i.A,BookmarkPlus:j.A,PackagePlus:k.A,Sparkles:l.A,Trash2:m.A,AlertOctagon:n.A,HelpCircle:o.A,Workflow:p.A,Boxes:q.A};function M({rootId:a,topicId:b,placeholder:c,submitLabel:f,pendingLabel:g,SubmitIcon:h,disabled:i,onSubmit:j,active:k,onStop:l,clarifyLabel:m="Уточнить",stopLabel:n="Стоп"}){let o=(0,y.useRouter)(),[p,q]=(0,e.useState)(""),[u,v]=(0,e.useState)([]),[w,x]=(0,e.useState)(!1),[D,G]=(0,e.useState)(!1),[H,I]=(0,e.useState)(!1),J=(0,e.useRef)(null),K=(0,e.useRef)(null),[L,M]=(0,e.useState)(null),[R,S]=(0,e.useState)([]),[T,U]=(0,e.useState)(0),[V,W]=(0,e.useState)(!1),X=(0,e.useRef)(0),[Y,Z]=(0,e.useState)(null);(0,e.useCallback)(()=>{let a=J.current;a&&(a.style.height="auto",a.style.height=Math.min(a.scrollHeight,240)+"px")},[]);let $=(0,e.useCallback)((b,c)=>{let d=c;for(;d>0;){let a=b[d-1];if("@"===a){d-=1;break}if(/\s/.test(a)){d=-1;break}d-=1}if(d<0||"@"!==b[d]||d>0&&!/\s/.test(b[d-1])){M(null),S([]);return}let e=b.slice(d+1,c);M({start:d,end:c}),U(0),W(!0);let f=++X.current;(async()=>{let b=await E(a,e);X.current===f&&(W(!1),S(b.ok?b.items:[]))})()},[a]),_=(0,e.useCallback)(()=>{M(null),S([]),X.current++},[]),aa=(0,e.useCallback)(a=>{if(!a.startsWith("/")||a.indexOf(" ")>=0)return void Z(null);let b=a.slice(1).toLowerCase(),c=F.filter(a=>a.trigger.startsWith(b)||a.label.toLowerCase().includes(b)||a.description.toLowerCase().includes(b));if(0===c.length)return void Z(null);Z({items:c,index:0})},[]),ab=(0,e.useCallback)(()=>Z(null),[]),ac=(0,e.useCallback)(a=>{let b=J.current,c=`/${a.trigger}${a.allowEmpty&&"direct"===a.kind?"":" "}`;q(c),Z(null),requestAnimationFrame(()=>{b&&(b.focus(),b.setSelectionRange(c.length,c.length))})},[]),ad=(0,e.useCallback)(a=>{let b=J.current;if(!b||!L)return;let c=p.slice(0,L.start),d=p.slice(L.end),e=`@${a.relPath} `;q(c+e+d),_();let f=c.length+e.length;requestAnimationFrame(()=>{b.focus(),b.setSelectionRange(f,f)})},[p,L,_]),ae=(0,e.useCallback)(async b=>{if(0!==b.length){x(!0);try{let c=new FormData;for(let a of b)c.append("files",a);let d=await fetch(`/api/roots/${a}/attachments`,{method:"POST",body:c});if(!d.ok){let a=await d.json().catch(()=>({}));z.oR.error(a.error??`Не удалось загрузить (${d.status})`);return}let e=await d.json();v(a=>[...a,...e.files])}catch(a){z.oR.error(a instanceof Error?a.message:String(a))}finally{x(!1)}}},[a]),af=p.trim().length>0||u.length>0,ag=k&&l?af?"clarify":"stop":"send",ah=(0,e.useCallback)(async()=>{if(D)return;if("stop"===ag){if(!l)return;G(!0);try{await l()}finally{G(!1)}return}let c=p.trim();if(!c&&0===u.length||i&&"send"===ag)return;let d=function(a){var b;let c=a.trim();if(!c.startsWith("/"))return null;let d=/^\/([a-z][a-z0-9-]*)(?:\s+([\s\S]*))?$/.exec(c);if(!d)return null;let e=(b=d[1],F.find(a=>a.trigger===b)??null);return e?{def:e,payload:(d[2]??"").trim()}:null}(c);if(d&&"direct"===d.def.kind){G(!0);try{await N({cmd:d.def,payload:d.payload,rootId:a,topicId:b,router:o}),q("")}finally{G(!1)}return}G(!0);try{"clarify"===ag&&l&&await l(),await j({message:c,attachments:u})&&(q(""),v([]))}finally{G(!1)}},[p,u,D,i,ag,l,j,a,b,o]),ai=!D&&!w&&("stop"===ag||af&&(!i||"clarify"===ag));return(0,d.jsxs)("form",{onSubmit:a=>{a.preventDefault(),ah()},onDragEnter:a=>{Array.from(a.dataTransfer.types).includes("Files")&&(a.preventDefault(),I(!0))},onDragOver:a=>{Array.from(a.dataTransfer.types).includes("Files")&&(a.preventDefault(),I(!0))},onDragLeave:a=>{a.currentTarget.contains(a.relatedTarget)||I(!1)},onDrop:a=>{a.preventDefault(),I(!1);let b=Array.from(a.dataTransfer.files);b.length>0&&ae(b)},className:(0,C.cn)("space-y-2 rounded-md transition-colors",H&&"ring-2 ring-ring/60 bg-accent/40"),children:[u.length>0&&(0,d.jsx)("div",{className:"flex flex-wrap gap-1.5",children:u.map((a,b)=>(0,d.jsx)(Q,{attachment:a,onRemove:()=>v(b=>b.filter(b=>b!==a))},a.absPath+b))}),(0,d.jsxs)("div",{className:"flex items-end gap-2",children:[(0,d.jsxs)("div",{className:"relative flex-1",children:[(0,d.jsx)(B.T,{ref:J,value:p,onChange:a=>{q(a.target.value),$(a.target.value,a.target.selectionStart),aa(a.target.value)},onKeyUp:a=>{let b=a.currentTarget;$(b.value,b.selectionStart),aa(b.value)},onClick:a=>{let b=a.currentTarget;$(b.value,b.selectionStart),aa(b.value)},onBlur:()=>{setTimeout(()=>{_(),ab()},150)},onKeyDown:a=>{if(Y){if("ArrowDown"===a.key){a.preventDefault(),Z(a=>a?{...a,index:Math.min(a.items.length-1,a.index+1)}:null);return}if("ArrowUp"===a.key){a.preventDefault(),Z(a=>a?{...a,index:Math.max(0,a.index-1)}:null);return}if("Tab"===a.key){a.preventDefault();let b=Y.items[Y.index];b&&ac(b);return}if("Escape"===a.key){a.preventDefault(),ab();return}}if(L&&R.length>0){if("ArrowDown"===a.key){a.preventDefault(),U(a=>Math.min(R.length-1,a+1));return}if("ArrowUp"===a.key){a.preventDefault(),U(a=>Math.max(0,a-1));return}if("Enter"===a.key||"Tab"===a.key){a.preventDefault();let b=R[T];b&&ad(b);return}if("Escape"===a.key){a.preventDefault(),_();return}}"Enter"!==a.key||a.shiftKey||a.nativeEvent.isComposing||(a.preventDefault(),ah())},onPaste:a=>{let b=Array.from(a.clipboardData.files);b.length>0&&(a.preventDefault(),ae(b))},placeholder:c,rows:1,disabled:i||D,className:"resize-none min-h-[44px] max-h-60 text-base bg-background/70 border-transparent focus-visible:border-ring py-2.5 w-full"}),L&&(0,d.jsx)(P,{items:R,index:T,loading:V,onPick:ad,onHover:a=>U(a)}),Y&&!L&&(0,d.jsx)(O,{items:Y.items,index:Y.index,onPick:ac,onHover:a=>Z(b=>b?{...b,index:a}:null),topicAvailable:!!b})]}),(0,d.jsx)("input",{ref:K,type:"file",multiple:!0,className:"hidden",onChange:a=>{let b=Array.from(a.target.files??[]);b.length>0&&ae(b),a.target.value=""}}),(0,d.jsx)(A.$,{type:"button",size:"icon",variant:"ghost",onClick:()=>K.current?.click(),disabled:w||D||i,title:"Прикрепить файлы (можно drag&drop или Cmd+V)",className:"h-11 w-11 shrink-0",children:w?(0,d.jsx)(r.A,{className:"h-4 w-4 animate-spin"}):(0,d.jsx)(s.A,{className:"h-4 w-4"})}),(0,d.jsx)(A.$,{type:"submit",size:"lg",disabled:!ai,variant:"stop"===ag?"destructive":"default",className:"h-11 px-6 shadow-md shrink-0",children:D?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(r.A,{className:"mr-2 h-4 w-4 animate-spin"}),g]}):"stop"===ag?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(t.A,{className:"mr-2 h-4 w-4",fill:"currentColor"}),n]}):"clarify"===ag?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(h,{className:"mr-2 h-4 w-4"}),m]}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(h,{className:"mr-2 h-4 w-4"}),f]})})]}),(0,d.jsx)("div",{className:"text-[10px] text-muted-foreground",children:"Enter — отправить \xb7 Shift+Enter — новая строка \xb7 @ — упомянуть файл/заметку \xb7 `/` — команды \xb7 можно перетащить файлы или вставить из буфера"})]})}async function N({cmd:a,payload:b,rootId:c,topicId:d,router:e}){if("help"===a.id){let a=F.map(a=>`• ${a.label} — ${a.description}`);z.oR.info(`Доступные команды:
2
+ ${a.join("\n")}`,{duration:12e3});return}if("remember"===a.id){if(!b)return void z.oR.error("Пусто — нечего запоминать. Использование: /remember <текст>");let a=await G(c,b);return void(a.ok?(z.oR.success(a.message??"Сохранено в KB"),(0,K.$d)(K.Zi.kbChanged(c))):z.oR.error(a.error))}if("delete-topic"===a.id){if(!d)return void z.oR.error("Команда работает только внутри топика.");if(!confirm("Удалить этот топик? Это необратимо."))return;let a=await H(c,d);return void(a.ok?(z.oR.success(a.message??"Удалено"),(0,K.$d)(K.Zi.topicsChanged(c)),a.redirectTo&&e.push(a.redirectTo)):z.oR.error(a.error))}if("util"===a.id){let a=await I(c,b);if(!a.ok)return void z.oR.error(a.error);if("redirect"===a.kind)return void e.push(a.url);let d=a.items.slice(0,8).map(a=>`• ${a.name} (${a.scope}/${a.id})`).join("\n");return void z.oR.message(`Несколько подходит — уточни запрос:
3
+ ${d}`,{duration:12e3})}if("clear-project"===a.id){if(!confirm("ВНИМАНИЕ: будут удалены ВСЕ топики, виджеты и KB-файлы этого проекта. Это необратимо. Продолжить?"))return;let a=prompt("Введи фразу \xabочистить\xbb (без кавычек), чтобы подтвердить:");if(a?.trim().toLowerCase()!=="очистить")return void z.oR.message("Подтверждение не прошло — отмена.");let b=await J(c);return void(b.ok?(z.oR.success(b.message??"Проект очищен"),(0,K.$d)(K.Zi.topicsChanged(c)),(0,K.$d)(K.Zi.kbChanged(c)),b.redirectTo&&e.push(b.redirectTo)):z.oR.error(b.error))}z.oR.error(`Неизвестная команда: ${a.label}`)}function O({items:a,index:b,onPick:c,onHover:e,topicAvailable:f}){return(0,d.jsxs)("div",{className:"absolute bottom-full left-0 right-0 mb-2 z-50 max-h-80 overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-lg",children:[(0,d.jsx)("div",{className:"px-3 py-1.5 text-[10px] uppercase tracking-wider text-muted-foreground border-b",children:"Команды \xb7 Tab — вставить \xb7 ↑↓ — выбор \xb7 Esc — закрыть"}),(0,d.jsx)("ul",{children:a.map((a,g)=>{let h=L[a.icon]??l.A,i="delete-topic"===a.id&&!f;return(0,d.jsx)("li",{children:(0,d.jsxs)("button",{type:"button",onMouseDown:b=>{b.preventDefault(),i||c(a)},onMouseEnter:()=>e(g),disabled:i,className:(0,C.cn)("w-full flex items-start gap-2 px-3 py-2 text-left",g===b?"bg-accent":"hover:bg-accent/60",i&&"opacity-40 cursor-not-allowed"),children:[(0,d.jsx)(h,{className:(0,C.cn)("h-3.5 w-3.5 mt-0.5 shrink-0","direct"===a.kind?"text-amber-600":"text-violet-600")}),(0,d.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,d.jsxs)("div",{className:"flex items-baseline gap-2 flex-wrap",children:[(0,d.jsx)("span",{className:"font-mono text-xs font-medium",children:a.label}),"direct"===a.kind&&(0,d.jsx)("span",{className:"text-[9px] uppercase tracking-wider text-amber-700",children:"прямое действие"}),a.requiresConfirm&&(0,d.jsx)("span",{className:"text-[9px] uppercase tracking-wider text-destructive",children:"с подтверждением"})]}),(0,d.jsx)("p",{className:"text-[11px] text-muted-foreground leading-snug mt-0.5",children:a.description}),(0,d.jsx)("p",{className:"text-[10px] text-muted-foreground/80 font-mono mt-0.5",children:a.usage})]})]})},a.id)})})]})}function P({items:a,index:b,loading:c,onPick:e,onHover:f}){return(0,d.jsx)("div",{className:"absolute bottom-full left-0 right-0 mb-2 z-50 max-h-72 overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-lg",children:c&&0===a.length?(0,d.jsxs)("div",{className:"px-3 py-2 text-xs text-muted-foreground flex items-center gap-2",children:[(0,d.jsx)(r.A,{className:"h-3 w-3 animate-spin"})," поиск…"]}):0===a.length?(0,d.jsx)("div",{className:"px-3 py-2 text-xs text-muted-foreground italic",children:"ничего не найдено"}):(0,d.jsx)("ul",{children:a.map((a,c)=>{let g="kb"===a.kind?u.A:v.A;return(0,d.jsx)("li",{children:(0,d.jsxs)("button",{type:"button",onMouseDown:b=>{b.preventDefault(),e(a)},onMouseEnter:()=>f(c),className:(0,C.cn)("w-full flex items-center gap-2 px-3 py-1.5 text-sm text-left",c===b?"bg-accent":"hover:bg-accent/60"),children:[(0,d.jsx)(g,{className:(0,C.cn)("h-3.5 w-3.5 shrink-0","kb"===a.kind?"text-primary":"text-muted-foreground")}),(0,d.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,d.jsx)("div",{className:"truncate font-mono text-xs",children:a.relPath}),a.parent&&(0,d.jsx)("div",{className:"truncate text-[10px] text-muted-foreground",children:a.parent})]}),(0,d.jsx)("span",{className:(0,C.cn)("text-[10px] uppercase tracking-wider shrink-0","kb"===a.kind?"text-primary":"text-muted-foreground"),children:a.kind})]})},a.absPath)})})})}function Q({attachment:a,onRemove:b}){var c;let e=a.mime.startsWith("image/")?w.A:v.A;return(0,d.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-1 text-[11px] max-w-[18rem]",children:[(0,d.jsx)(e,{className:"h-3 w-3 text-muted-foreground shrink-0"}),(0,d.jsx)("span",{className:"truncate",title:a.name,children:a.name}),(0,d.jsx)("span",{className:"text-muted-foreground",children:(c=a.size)<1024?`${c} B`:c<1048576?`${(c/1024).toFixed(1)} KB`:`${(c/1048576).toFixed(1)} MB`}),(0,d.jsx)("button",{type:"button",onClick:b,className:"ml-0.5 text-muted-foreground hover:text-foreground",children:(0,d.jsx)(x.A,{className:"h-3 w-3"})})]})}},26290:(a,b,c)=>{c.d(b,{cn:()=>f});var d=c(83243),e=c(86103);function f(...a){return(0,e.QP)((0,d.$)(a))}},45477:(a,b,c)=>{c.d(b,{T:()=>f});var d=c(64173);c(17240);var e=c(91344);function f({className:a,...b}){return(0,d.jsx)("textarea",{"data-slot":"textarea",className:(0,e.cn)("flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:ring-destructive/40",a),...b})}},67248:(a,b,c)=>{c.d(b,{E:()=>i});var d=c(63003);c(34750);var e=c(86209),f=c(65715),g=c(26290);let h=(0,e.F)("inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3",{variants:{variant:{default:"bg-primary text-primary-foreground [a&]:hover:bg-primary/90",secondary:"bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",destructive:"bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90",outline:"border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",ghost:"[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",link:"text-primary underline-offset-4 [a&]:hover:underline"}},defaultVariants:{variant:"default"}});function i({className:a,variant:b="default",asChild:c=!1,...e}){let i=c?f.bL:"span";return(0,d.jsx)(i,{"data-slot":"badge","data-variant":b,className:(0,g.cn)(h({variant:b}),a),...e})}},72901:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{LL:()=>v,ZC:()=>z,b2:()=>u,qO:()=>t,wd:()=>y});var e=c(73745);c(66493);var f=c(73024),g=c(76760),h=c.n(g),i=c(65326),j=c(53905),k=c(54287),l=c(56942),m=c(5492),n=c(13415),o=c(93554),p=c(49410),q=c(96921),r=c(63781),s=a([n,o]);async function t(a,b){try{let c=b.trim();if(!c)return{ok:!1,error:"Пусто — нечего запоминать."};let d=await (0,j.Zn)(a);if(!d)return{ok:!1,error:"Root not found"};let e=c.split(/\r?\n/,1)[0].trim(),f=e.length>80?e.slice(0,77).trimEnd()+"…":e,g=await (0,l.j)({rootPath:d.path,directive:{kind:"note",title:f,body:c}});return(0,i.revalidatePath)(`/roots/${a}`),{ok:!0,message:`Сохранено в ${g.relPath}`}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function u(a,b){let c=await (0,n.L4)(a,b);return c.ok?{ok:!0,redirectTo:`/roots/${a}`,message:"Топик удалён"}:{ok:!1,error:c.error??"Failed"}}async function v(a){try{let b=await (0,j.Zn)(a);if(!b)return{ok:!1,error:"Root not found"};let c=(0,k.FF)(b.path);for(let a of(await (0,m.hk)(b.path)))await o.z.stopTopic(a.meta.id).catch(()=>void 0);return await w(h().join(c,"widgets")),await w(h().join(c,"dashboard-layout.json")),await w(h().join(c,"topics")),await x(c),(0,i.revalidatePath)(`/roots/${a}`),{ok:!0,redirectTo:`/roots/${a}`,message:"Проект очищен. Поехали с нуля."}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function w(a){try{await f.promises.rm(a,{recursive:!0,force:!0})}catch{}}async function x(a){let b;try{b=await f.promises.readdir(a,{withFileTypes:!0})}catch{return}for(let c of b){let b=h().join(a,c.name);if(c.isDirectory()){await x(b);try{let a=await f.promises.readdir(b);0===a.length&&await f.promises.rmdir(b)}catch{}continue}c.name.toLowerCase().endsWith(".md")&&await f.promises.unlink(b).catch(()=>void 0)}}async function y(){let a=await (0,p.b)();return{ok:!0,commands:q.Lo,skills:a}}async function z(a,b){let{listUtilities:d}=await Promise.resolve().then(c.bind(c,8118)),e=await d({rootId:a}),f=b.trim().toLowerCase(),g=e.map(a=>({id:a.manifest.id,name:a.manifest.name,scope:a.scope,rootId:a.rootId})),h=a=>{let b=a.rootId?`?rootId=${encodeURIComponent(a.rootId)}`:"";return`/utilities/${a.scope}/${a.id}${b}`};if(!f)return 0===g.length?{ok:!1,error:"Пока ни одного мини-приложения не установлено."}:{ok:!0,kind:"choices",items:g.map(a=>({url:h(a),id:a.id,name:a.name,scope:a.scope}))};let i=g.find(a=>a.id.toLowerCase()===f);if(i)return{ok:!0,kind:"redirect",url:h(i)};let j=g.filter(a=>a.id.toLowerCase().includes(f)||a.name.toLowerCase().includes(f));return 1===j.length?{ok:!0,kind:"redirect",url:h(j[0])}:0===j.length?{ok:!1,error:`Ничего не нашлось по \xab${b}\xbb. Установлено: ${g.length}.`}:{ok:!0,kind:"choices",items:j.map(a=>({url:h(a),id:a.id,name:a.name,scope:a.scope}))}}[n,o]=s.then?(await s)():s,(0,r.D)([t,u,v,y,z]),(0,e.A)(t,"60a2a3ae0b64cb55755a3f21ebfe4bf6a4663bab70",null),(0,e.A)(u,"604ca7de85772eb88d7ba71e6cbd573e49904e07ff",null),(0,e.A)(v,"400e6721a0e22b6fc170d7dc6c41b9c64977cbb032",null),(0,e.A)(y,"00fc47c192abede86bd006f4d026279ffb0cc67613",null),(0,e.A)(z,"608fc4ce02acd0ac6ee3ba48a005cc8c26a7a750fd",null),d()}catch(a){d(a)}})},84913:(a,b,c)=>{c.d(b,{$:()=>i});var d=c(63003);c(34750);var e=c(86209),f=c(65715),g=c(26290);let h=(0,e.F)("inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",xs:"h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-xs":"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-8","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}});function i({className:a,variant:b="default",size:c="default",asChild:e=!1,...i}){let j=e?f.bL:"button";return(0,d.jsx)(j,{"data-slot":"button","data-variant":b,"data-size":c,className:(0,g.cn)(h({variant:b,size:c,className:a})),...i})}}};
@@ -1 +1 @@
1
- "use strict";exports.id=4925,exports.ids=[4925],exports.modules={44925:(a,b,c)=>{c.d(b,{getCuratedRegistry:()=>l});var d=c(73024),e=c(76760),f=c.n(e),g=c(48161),h=c.n(g);let i=[{id:"learn-anything",name:"Изучи что угодно",emoji:"\uD83C\uDF93",category:"study",description:"Универсальный AI-наставник. Спроси \xabхочу выучить X\xbb — соберёт курс под твой уровень: программа, статьи, видео, схемы, тесты, домашка и интерактивные тренажёры.",github:"builtin:learn-anything@0.1.0",suggestedScope:"project",author:"reflex-org"}],j=f().join(h().homedir(),".reflex","curated-registry.json"),k=null;async function l(){if(k&&m(k,36e5))return k.items;let a=await n();if(a&&m(a,864e5))return k=a,a.items;let b=await p();if(b){let a={fetchedAt:new Date().toISOString(),items:b};return k=a,o(a).catch(()=>null),b}return a?.items.length?a.items:i}function m(a,b){return Date.now()-Date.parse(a.fetchedAt)<b}async function n(){try{let a=await d.promises.readFile(j,"utf8"),b=JSON.parse(a);if(Array.isArray(b.items)&&"string"==typeof b.fetchedAt)return b}catch{}return null}async function o(a){await d.promises.mkdir(f().dirname(j),{recursive:!0}),await d.promises.writeFile(j,JSON.stringify(a,null,2)+"\n","utf8")}async function p(){try{let a=await fetch("https://raw.githubusercontent.com/reflex-org/utility-registry/main/index.json",{signal:AbortSignal.timeout(4e3),headers:{Accept:"application/json"}});if(!a.ok)return null;let b=await a.json();if(!Array.isArray(b.items))return null;return b.items.filter(a=>"string"==typeof a.id&&"string"==typeof a.name&&"string"==typeof a.github)}catch{return null}}}};
1
+ "use strict";exports.id=4925,exports.ids=[4925],exports.modules={44925:(a,b,c)=>{c.d(b,{getCuratedRegistry:()=>k});var d=c(73024),e=c(76760),f=c.n(e),g=c(73652);let h=[{id:"learn-anything",name:"Изучи что угодно",emoji:"\uD83C\uDF93",category:"study",description:"Универсальный AI-наставник. Спроси \xabхочу выучить X\xbb — соберёт курс под твой уровень: программа, статьи, видео, схемы, тесты, домашка и интерактивные тренажёры.",github:"builtin:learn-anything@0.1.0",suggestedScope:"project",author:"reflex-org"}],i=f().join((0,g._)(),"curated-registry.json"),j=null;async function k(){if(j&&l(j,36e5))return j.items;let a=await m();if(a&&l(a,864e5))return j=a,a.items;let b=await o();if(b){let a={fetchedAt:new Date().toISOString(),items:b};return j=a,n(a).catch(()=>null),b}return a?.items.length?a.items:h}function l(a,b){return Date.now()-Date.parse(a.fetchedAt)<b}async function m(){try{let a=await d.promises.readFile(i,"utf8"),b=JSON.parse(a);if(Array.isArray(b.items)&&"string"==typeof b.fetchedAt)return b}catch{}return null}async function n(a){await d.promises.mkdir(f().dirname(i),{recursive:!0}),await d.promises.writeFile(i,JSON.stringify(a,null,2)+"\n","utf8")}async function o(){try{let a=await fetch("https://raw.githubusercontent.com/reflex-org/utility-registry/main/index.json",{signal:AbortSignal.timeout(4e3),headers:{Accept:"application/json"}});if(!a.ok)return null;let b=await a.json();if(!Array.isArray(b.items))return null;return b.items.filter(a=>"string"==typeof a.id&&"string"==typeof a.name&&"string"==typeof a.github)}catch{return null}}}};