@darkclaw921/umgt 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +8 -0
  2. package/dist/server/agents/core-tools.d.ts +6 -2
  3. package/dist/server/agents/core-tools.js +8 -3
  4. package/dist/server/agents/core-tools.js.map +1 -1
  5. package/dist/server/agents/core.js +4 -3
  6. package/dist/server/agents/core.js.map +1 -1
  7. package/dist/server/asset-media.d.ts +2 -1
  8. package/dist/server/asset-media.js +1 -1
  9. package/dist/server/asset-media.js.map +1 -1
  10. package/dist/server/chat-computer.d.ts +3 -1
  11. package/dist/server/chat-computer.js +8 -3
  12. package/dist/server/chat-computer.js.map +1 -1
  13. package/dist/server/chat.js +4 -3
  14. package/dist/server/chat.js.map +1 -1
  15. package/dist/server/core-client.d.ts +4 -0
  16. package/dist/server/core-client.js +19 -0
  17. package/dist/server/core-client.js.map +1 -1
  18. package/dist/server/generated-media.d.ts +19 -0
  19. package/dist/server/generated-media.js +342 -0
  20. package/dist/server/generated-media.js.map +1 -0
  21. package/dist/server/routes.js +3 -1
  22. package/dist/server/routes.js.map +1 -1
  23. package/dist/shared/generated-media.d.ts +2 -0
  24. package/dist/shared/generated-media.js +3 -0
  25. package/dist/shared/generated-media.js.map +1 -0
  26. package/dist/web/assets/{AgentActivity-sYJeY5Yf.js → AgentActivity-DRuju8iC.js} +1 -1
  27. package/dist/web/assets/{AssetSelectionWizard-a43_6NO7.js → AssetSelectionWizard-7SBX7wym.js} +1 -1
  28. package/dist/web/assets/CoreAccount-BfH0gEKJ.js +1 -0
  29. package/dist/web/assets/{KidsApp-D-8t3HPy.js → KidsApp-ChVKRU9B.js} +2 -2
  30. package/dist/web/assets/{PlainChat-CMxYwKko.js → PlainChat-C4V_wRVc.js} +1 -1
  31. package/dist/web/assets/{WorkflowJournal-Did0sRta.js → WorkflowJournal-BlTNapOH.js} +1 -1
  32. package/dist/web/assets/{YandexGamesView-R64RSJRL.js → YandexGamesView-BAuOI0EI.js} +1 -1
  33. package/dist/web/assets/{index-sNciOZYG.js → index-B6_q6dBC.js} +2 -2
  34. package/dist/web/assets/{resources-DppXCagL.js → resources-xyl8IpX6.js} +1 -1
  35. package/dist/web/assets/{workflow-BrIKN5ER.js → workflow-CEkwrbrT.js} +4 -4
  36. package/dist/web/assets/workflow-s2TewWL6.css +1 -0
  37. package/dist/web/index.html +1 -1
  38. package/package.json +7 -7
  39. package/dist/web/assets/CoreAccount-D4ZC8CWv.js +0 -1
  40. package/dist/web/assets/workflow-BhcU9uvG.css +0 -1
@@ -1 +1 @@
1
- import{o as e,r as t,t as n}from"./jsx-runtime-CdVFa8IP.js";import{i as r,t as i}from"./AssetMediaPreview-D2cd6oQO.js";import{t as a}from"./ArrowRight.es-9w41WqD8.js";import{t as o}from"./ArrowUpRight.es-BmIrpjWN.js";import{t as ee}from"./CheckCircle.es-D5B3hdvz.js";import{i as te,n as s,o as c,r as ne,t as l}from"./ui-wHE_yBK0.js";import{t as re}from"./MagnifyingGlass.es-rkdOU2rH.js";import{t as ie}from"./UploadSimple.es-DxIuxpCC.js";import{t as ae}from"./WarningCircle.es-D63H8cL9.js";import{H as oe,M as u,S as d,U as f,j as se}from"./index-sNciOZYG.js";var p=e(t(),1),m=n();function h(e){if(e.choice?.kind===`skip`)return!e.required;if(e.choice?.kind===`upload`)return!0;let t=e.choice;return t?.kind===`candidate`&&e.candidates.some(e=>e.id===t.candidateId&&e.asset.importMode===`automatic`)}function g(e){if(e)try{let t=new URL(e,`http://localhost`);return[`http:`,`https:`].includes(t.protocol)?e:void 0}catch{return}}var ce={searching:`Ищем варианты`,ready:`Выберите вариант`,importing:`Импортируем`,imported:`В проекте`,skipped:`Пропущено`,failed:`Нужен повтор`};function _({open:e,onOpenChange:t,workspace:n,request:g,onRefresh:_,onPlan:ue,journal:de,events:fe=[]}){let v=n.assetSelection&&(!g||g.planId!==n.assetSelection.planId||n.assetSelection.createdAt>=g.startedAt)?n.assetSelection:void 0,[y,b]=(0,p.useState)(``),[x,S]=(0,p.useState)(``),[C,w]=(0,p.useState)(``),[T,E]=(0,p.useState)(``),[D,O]=(0,p.useState)(null),[k,A]=(0,p.useState)(``),[j,M]=(0,p.useState)(``),[N,P]=(0,p.useState)(``),[F,I]=(0,p.useState)(``),[pe,L]=(0,p.useState)(!1),[R,z]=(0,p.useState)(!1),[me,B]=(0,p.useState)(),V=(0,p.useRef)(null),H=(0,p.useRef)(0);(0,p.useEffect)(()=>(b(``),E(``),w(``),L(!1),()=>{H.current++,V.current?.abort()}),[n.project.id,v?.id]);let he=n.plans.toSorted((e,t)=>t.version-e.version)[0],U=!!v&&(v.planId!==he?.id||n.planNeedsUpdate===!0),W=U||!!v?.confirmationRequestedAt||v?.status===`confirmed`||v?.status===`cancelled`,G=v?.needs.find(e=>e.id===y)??(y===`summary`?void 0:v?.needs.find(e=>!h(e))??v?.needs[0]);(0,p.useEffect)(()=>{!y&&v?.needs.length&&b(v.needs.find(e=>!h(e))?.id??v.needs[0].id)},[y,v?.id,v?.needs[0]?.id]),(0,p.useEffect)(()=>{S(G?.query??``),O(null),A(``),M(``),P(``),I(``),L(!1)},[G?.id]);let ge=`/projects/${n.project.id}/asset-selection`,K=v?`${ge}/${v.id}`:ge,q=async(e,t,n={},r=`POST`)=>{let i=++H.current;w(e),E(``);try{await se(t,r,n),await _()}catch(e){i===H.current&&(E(u(e)),await _().catch(()=>{}))}finally{i===H.current&&w(``)}},_e=e=>G&&v&&void q(`Сохраняем выбор`,`${K}/needs/${G.id}`,{revision:v.revision,choice:{kind:`candidate`,candidateId:e}},`PATCH`),ve=e=>{if(e.preventDefault(),!D||!G||!v||C)return;let t=new FormData;t.append(`revision`,String(v.revision)),k.trim()&&t.append(`sourceUrl`,k.trim()),t.append(`license`,j),t.append(`author`,N),F.trim()&&t.append(`licenseUrl`,F.trim()),R&&G.choice?.kind===`candidate`&&t.append(`candidateId`,G.choice.candidateId),t.append(`file`,D),w(`Загружаем выбранный файл`),E(``),B(void 0);let n=new XMLHttpRequest;V.current=n,n.open(`POST`,`/api/v1${K}/needs/${G.id}/upload`),n.upload.onprogress=e=>{e.lengthComputable&&B(e.loaded/e.total*100)},n.onerror=()=>{w(``),E(`Не удалось загрузить файл. Выбор сохранён; повторите загрузку.`)},n.onabort=()=>{V.current=null},n.onload=()=>{(async()=>{try{let e=JSON.parse(n.responseText);if(n.status<200||n.status>=300)throw Error(e.message??`Ошибка загрузки`);await _(),L(!1),O(null)}catch(e){E(u(e))}finally{w(``),B(void 0),V.current=null}})()},n.send(t)},J=v?.needs.filter(e=>!h(e))??[],Y=v?.status===`discovering`||v?.needs.some(e=>e.status===`searching`),X=y===`summary`||v?.needs.length===0&&!Y,Z=v?.needs.filter(e=>e.status===`imported`).length??0,Q=fe.findLast(e=>e.projectId===n.project.id&&e.type===`asset.progress`&&v&&e.payload.selectionId===v.id)?.payload,ye=Q?.total&&Q.downloaded!==void 0?Q.downloaded/Q.total*100:void 0,be=!v||W||!!C||!!Y||J.length>0||v.status===`failed`,$=G?.choice?.kind===`candidate`?G.candidates.find(e=>e.id===G.choice.candidateId):void 0;return(0,p.useEffect)(()=>{L(!1),O(null),z(!1)},[$?.id]),(0,m.jsx)(te,{open:e,onOpenChange:e=>{V.current||t(e)},title:`Подберём ассеты для игры`,description:`Задачи готовятся параллельно. Выберите материалы, проверьте итог и подтвердите набор перед разработкой.`,wide:!0,children:(0,m.jsxs)(`div`,{className:`asset-selection-wizard`,"data-testid":`asset-selection-wizard`,"data-status":v?.status??`pending`,children:[de,T&&(0,m.jsx)(l,{children:T}),U&&(0,m.jsx)(l,{children:`План изменился. Откройте актуальную версию и утвердите её, чтобы подобрать подходящие ассеты.`}),v?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)(`div`,{className:`selection-status-line`,children:[(0,m.jsx)(`span`,{className:`badge`,children:n.assetReadiness?.tasksReady?`Задачи готовы`:`Готовим задачи`}),(0,m.jsx)(`span`,{children:v.status===`confirmed`?`В проекте: ${Z}`:v.confirmationRequestedAt?`Набор подтверждён · ждём готовности задач и импорта`:`Выбрано ${v.needs.length-J.length} из ${v.needs.length}`})]}),v.error&&(0,m.jsx)(l,{children:v.error}),(v.status===`failed`||v.status===`cancelled`)&&!U&&(0,m.jsxs)(`div`,{className:`selection-recovery`,children:[(0,m.jsx)(`span`,{children:v.status===`cancelled`?`Подбор остановлен. Сохранённые материалы доступны после повтора.`:`Повторите незавершённый поиск или импорт.`}),(0,m.jsxs)(s,{busy:!!C,"data-testid":`selection-retry`,onClick:()=>void q(`Возобновляем подбор`,`${K}/retry`),children:[(0,m.jsx)(r,{size:16}),`Повторить`]})]}),Y&&(0,m.jsx)(c,{label:`Ищем материалы по плану`,detail:`Покажем доступные варианты по мере получения. Их количество зависит от источников.`}),(0,m.jsxs)(`div`,{className:`selection-layout`,children:[(0,m.jsxs)(`nav`,{className:`selection-needs`,"aria-label":`Потребности в ассетах`,children:[v.needs.map((e,t)=>(0,m.jsxs)(`button`,{type:`button`,className:G?.id===e.id&&!X?`active`:``,onClick:()=>b(e.id),"data-testid":`asset-need-${t}`,"aria-current":G?.id===e.id&&!X?`step`:void 0,children:[(0,m.jsx)(`span`,{className:`selection-need-number`,children:h(e)?(0,m.jsx)(f,{size:15}):String(t+1).padStart(2,`0`)}),(0,m.jsxs)(`span`,{children:[(0,m.jsx)(`strong`,{children:e.title}),(0,m.jsxs)(`small`,{children:[e.required?`Обязательно`:`По желанию`,` · `,e.choice&&e.status===`ready`?`Выбрано`:ce[e.status]]})]})]},e.id)),(0,m.jsxs)(`button`,{type:`button`,onClick:()=>b(`summary`),className:X?`active`:``,"data-testid":`selection-summary`,children:[(0,m.jsx)(ee,{size:18}),(0,m.jsxs)(`span`,{children:[(0,m.jsx)(`strong`,{children:`Итоговый набор`}),(0,m.jsx)(`small`,{children:`Проверка перед разработкой`})]})]})]}),(0,m.jsx)(`div`,{className:`selection-content`,children:X?(0,m.jsxs)(`section`,{className:`selection-summary-panel`,children:[(0,m.jsx)(`div`,{className:`eyebrow`,children:`ВАШ ВЫБОР`}),(0,m.jsx)(`h3`,{children:`Материалы для утверждённого плана`}),v.needs.length===0?(0,m.jsx)(`p`,{children:`Для этого плана дополнительные ассеты не нужны. Подтвердите пустой набор, чтобы продолжить подготовку и разработку.`}):(0,m.jsx)(`ul`,{children:v.needs.map(e=>(0,m.jsxs)(`li`,{children:[(0,m.jsxs)(`div`,{children:[(0,m.jsx)(`strong`,{children:e.title}),(0,m.jsx)(`small`,{children:e.choice?.kind===`skip`?`Пропущено по вашему выбору`:e.importedAsset?.name??(e.choice?.kind===`upload`?e.choice.asset.name:e.candidates.find(t=>e.choice?.kind===`candidate`&&t.id===e.choice.candidateId)?.asset.name)??`Ещё не выбрано`})]}),(0,m.jsx)(`span`,{className:`badge ${h(e)?`badge-success`:``}`,children:e.status===`imported`?`В проекте`:h(e)?`Готово`:`Нужен выбор`})]},e.id))}),J.length>0&&(0,m.jsxs)(`p`,{className:`selection-summary-note`,children:[`Осталось завершить выбор: `,J.length,`. Необязательные материалы можно пропустить.`]}),(0,m.jsx)(`p`,{className:`selection-summary-note`,children:`Файлы попадут в проект после подтверждения набора и готовности задач. Затем агент начнёт реализацию утверждённого плана.`})]}):G?(0,m.jsxs)(`section`,{children:[(0,m.jsxs)(`div`,{className:`selection-need-heading`,children:[(0,m.jsxs)(`div`,{children:[(0,m.jsxs)(`div`,{className:`eyebrow`,children:[G.type,` · `,G.required?`ОБЯЗАТЕЛЬНЫЙ МАТЕРИАЛ`:`ПО ЖЕЛАНИЮ`]}),(0,m.jsx)(`h3`,{children:(0,m.jsx)(d,{id:`selection:${v.id}:${G.id}:title`,children:G.title})}),(0,m.jsx)(`p`,{children:(0,m.jsx)(d,{id:`selection:${v.id}:${G.id}:rationale`,children:G.rationale})})]}),!G.required&&(0,m.jsx)(s,{disabled:W||!!C,"data-testid":`selection-skip`,onClick:()=>void q(`Сохраняем пропуск`,`${K}/needs/${G.id}`,{revision:v.revision,choice:{kind:`skip`}},`PATCH`),children:`Пропустить`})]}),G.warnings?.map((e,t)=>(0,m.jsxs)(`p`,{className:`selection-provider-warning`,children:[(0,m.jsx)(ae,{size:15}),e]},t)),G.error&&(0,m.jsx)(l,{children:G.error}),(0,m.jsxs)(`form`,{className:`selection-query`,onSubmit:e=>{e.preventDefault(),q(`Ищем другие варианты`,`${K}/needs/${G.id}/search`,{revision:v.revision,query:x.trim()})},children:[(0,m.jsx)(`label`,{className:`sr-only`,htmlFor:`selection-query`,children:`Поисковый запрос`}),(0,m.jsx)(re,{size:18}),(0,m.jsx)(`input`,{id:`selection-query`,value:x,onChange:e=>S(e.target.value),disabled:W||!!C}),(0,m.jsx)(s,{type:`submit`,disabled:W||!!C||!x.trim(),"data-testid":`selection-search`,children:`Найти другие`})]}),(0,m.jsx)(`div`,{className:`selection-candidates`,children:G.candidates.map((e,t)=>(0,m.jsx)(le,{asset:e.asset,reason:e.reason,generatedId:`selection:${v.id}:${G.id}:candidate:${e.id}`,selected:G.choice?.kind===`candidate`&&G.choice.candidateId===e.id,disabled:W||!!C||G.status===`searching`,onChoose:()=>_e(e.id),testId:`asset-option-${t}`},e.id))}),!G.candidates.length&&G.status!==`searching`&&(0,m.jsx)(ne,{icon:(0,m.jsx)(oe,{size:26}),title:`Подходящих вариантов пока нет`,children:`Измените запрос или добавьте файл, который уже выбрали сами.`}),$?.asset.importMode===`manual`&&(0,m.jsxs)(`div`,{className:`selection-manual-note`,children:[(0,m.jsx)(o,{size:18}),(0,m.jsx)(`span`,{children:`Этот источник требует скачивания вручную. Откройте страницу, скачайте ресурс и загрузите файл ниже; одной ссылки для разработки недостаточно.`})]}),G.choice?.kind===`upload`&&(0,m.jsxs)(`div`,{className:`selection-staged-preview`,"data-testid":`staged-asset-preview`,children:[(0,m.jsxs)(l,{type:`success`,children:[`Файл «`,G.choice.asset.name,`» выбран и сохранён для импорта.`]}),(0,m.jsx)(i,{asset:G.importedAsset??G.choice.asset})]}),!W&&(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)(s,{className:`selection-upload-toggle`,onClick:()=>{L(e=>!e),z(!!$),$&&(I($.asset.licenseUrl??``),A($.asset.sourceUrl),M($.asset.license),P($.asset.author??``))},children:[(0,m.jsx)(ie,{size:17}),pe?`Скрыть загрузку`:`Загрузить свой файл`]}),pe&&(0,m.jsxs)(`form`,{onSubmit:ve,className:`selection-upload-form`,children:[$&&(0,m.jsxs)(`label`,{className:`agent-permission-setting`,children:[(0,m.jsx)(`input`,{type:`checkbox`,checked:R,onChange:e=>{z(e.target.checked),e.target.checked?(A($.asset.sourceUrl),M($.asset.license),P($.asset.author??``),I($.asset.licenseUrl??``)):(A(``),M(``),P(``),I(``))}}),`Это файл со страницы «`,$.asset.name,`»`]}),(0,m.jsx)(`small`,{children:R?`Будут сохранены автор и лицензия выбранного источника. Загрузите именно его файл.`:`Для своего ресурса укажите действительную лицензию. Ссылка не нужна, если источник — ваша собственная работа.`}),(0,m.jsxs)(`label`,{children:[`Файл`,(0,m.jsx)(`input`,{type:`file`,required:!0,disabled:!!C,"data-testid":`selection-file`,onChange:e=>O(e.target.files?.[0]??null)})]}),(0,m.jsxs)(`div`,{className:`form-columns`,children:[(0,m.jsxs)(`label`,{children:[`Источник`,(0,m.jsx)(`input`,{type:`url`,value:k,onChange:e=>A(e.target.value),required:j.startsWith(`CC-BY-`),disabled:R,"aria-label":`Источник загружаемого ассета`})]}),(0,m.jsxs)(`label`,{children:[`Лицензия`,(0,m.jsx)(`input`,{value:j,onChange:e=>M(e.target.value),required:!0,disabled:R,"aria-label":`Лицензия загружаемого ассета`})]})]}),(0,m.jsxs)(`div`,{className:`form-columns`,children:[(0,m.jsxs)(`label`,{children:[`Автор`,(0,m.jsx)(`input`,{value:N,required:j.startsWith(`CC-BY-`),disabled:R,onChange:e=>P(e.target.value)})]}),(0,m.jsxs)(`label`,{children:[`Ссылка на лицензию`,(0,m.jsx)(`input`,{type:`url`,disabled:R,value:F,onChange:e=>I(e.target.value)})]})]}),(0,m.jsx)(s,{type:`submit`,disabled:!D||!!C,"data-testid":`selection-upload`,children:`Загрузить и выбрать`})]})]})]},G.id):null})]}),C&&(0,m.jsx)(c,{label:C,value:me}),v.status===`importing`&&(0,m.jsx)(c,{label:`Импортируем выбранные ассеты`,value:ye,detail:Q?.file??`Готово материалов: ${Z} из ${v.needs.filter(e=>e.choice?.kind!==`skip`).length}`}),(0,m.jsxs)(`div`,{className:`selection-footer`,children:[(0,m.jsxs)(`div`,{children:[U?(0,m.jsx)(s,{onClick:ue,children:`Открыть актуальный план`}):(!W||v.status===`importing`||!!v.confirmationRequestedAt)&&v.status!==`confirmed`&&v.status!==`cancelled`&&(0,m.jsx)(s,{tone:`ghost`,disabled:!!C,onClick:()=>void q(`Останавливаем подбор`,`${K}/cancel`),"data-testid":`selection-cancel`,children:`Остановить подбор`}),(0,m.jsx)(`small`,{children:`Выбор сохранён. Окно можно закрыть и открыть снова.`})]}),!X&&!W?(0,m.jsxs)(s,{tone:`primary`,onClick:()=>b(`summary`),"data-testid":`selection-review`,children:[`Проверить набор `,(0,m.jsx)(a,{size:16})]}):v.status===`confirmed`?(0,m.jsxs)(s,{tone:`primary`,onClick:()=>t(!1),children:[`Вернуться к проекту `,(0,m.jsx)(a,{size:16})]}):(0,m.jsxs)(s,{tone:`primary`,disabled:be,"data-testid":`selection-confirm`,onClick:()=>void q(`Подтверждаем набор`,`${K}/confirm`,{revision:v.revision}),children:[v.confirmationRequestedAt?`Набор подтверждён`:`Подтвердить набор и продолжить`,(0,m.jsx)(a,{size:16})]})]})]}):(0,m.jsx)(`div`,{className:`selection-pending`,children:g?.status===`failed`?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(l,{children:g.error??`Не удалось утвердить план.`}),(0,m.jsx)(s,{onClick:ue,children:`Вернуться к плану`})]}):(0,m.jsx)(c,{label:g?.status===`pending`?`Подтверждаем план`:`Определяем, какие ассеты нужны`,detail:`Ваш выбор появится здесь; разработка дождётся подтверждения набора.`})})]})})}function le({asset:e,reason:t,generatedId:n,selected:r,disabled:a,onChoose:ee,testId:te}){return(0,m.jsxs)(`article`,{className:`selection-option ${r?`selected`:``}`,"data-testid":te,children:[(0,m.jsxs)(`div`,{className:`selection-media-wrap`,children:[(0,m.jsx)(i,{asset:e,compact:!0}),r&&(0,m.jsxs)(`span`,{className:`selection-chosen`,children:[(0,m.jsx)(f,{size:13}),`Выбрано`]})]}),(0,m.jsxs)(`div`,{className:`selection-option-copy`,children:[(0,m.jsx)(`small`,{children:e.provider}),(0,m.jsx)(`h4`,{children:e.name}),(0,m.jsx)(`p`,{children:(0,m.jsx)(d,{id:n,children:t})}),(0,m.jsxs)(`div`,{className:`selection-asset-meta`,children:[(0,m.jsx)(`span`,{children:e.license}),(0,m.jsx)(`span`,{children:e.formats?.join(` · `)||`Формат указан на странице`})]}),e.author&&(0,m.jsxs)(`small`,{children:[`Автор: `,e.author]}),e.attribution&&(0,m.jsx)(`small`,{children:e.attribution}),g(e.licenseUrl)&&(0,m.jsxs)(`a`,{className:`selection-license-link`,href:g(e.licenseUrl),target:`_blank`,rel:`noopener noreferrer`,children:[`Условия лицензии `,(0,m.jsx)(o,{size:12})]}),(0,m.jsxs)(`div`,{className:`selection-option-actions`,children:[g(e.sourceUrl)&&(0,m.jsxs)(`a`,{href:g(e.sourceUrl),target:`_blank`,rel:`noopener noreferrer`,children:[`Источник `,(0,m.jsx)(o,{size:13})]}),(0,m.jsx)(s,{disabled:a,"aria-pressed":r,onClick:ee,children:r?`Выбран`:`Выбрать`})]})]})]})}export{_ as AssetSelectionWizard};
1
+ import{o as e,r as t,t as n}from"./jsx-runtime-CdVFa8IP.js";import{i as r,t as i}from"./AssetMediaPreview-D2cd6oQO.js";import{t as a}from"./ArrowRight.es-9w41WqD8.js";import{t as o}from"./ArrowUpRight.es-BmIrpjWN.js";import{t as ee}from"./CheckCircle.es-D5B3hdvz.js";import{i as te,n as s,o as c,r as ne,t as l}from"./ui-wHE_yBK0.js";import{t as re}from"./MagnifyingGlass.es-rkdOU2rH.js";import{t as ie}from"./UploadSimple.es-DxIuxpCC.js";import{t as ae}from"./WarningCircle.es-D63H8cL9.js";import{H as oe,M as u,S as d,U as f,j as se}from"./index-B6_q6dBC.js";var p=e(t(),1),m=n();function h(e){if(e.choice?.kind===`skip`)return!e.required;if(e.choice?.kind===`upload`)return!0;let t=e.choice;return t?.kind===`candidate`&&e.candidates.some(e=>e.id===t.candidateId&&e.asset.importMode===`automatic`)}function g(e){if(e)try{let t=new URL(e,`http://localhost`);return[`http:`,`https:`].includes(t.protocol)?e:void 0}catch{return}}var ce={searching:`Ищем варианты`,ready:`Выберите вариант`,importing:`Импортируем`,imported:`В проекте`,skipped:`Пропущено`,failed:`Нужен повтор`};function _({open:e,onOpenChange:t,workspace:n,request:g,onRefresh:_,onPlan:ue,journal:de,events:fe=[]}){let v=n.assetSelection&&(!g||g.planId!==n.assetSelection.planId||n.assetSelection.createdAt>=g.startedAt)?n.assetSelection:void 0,[y,b]=(0,p.useState)(``),[x,S]=(0,p.useState)(``),[C,w]=(0,p.useState)(``),[T,E]=(0,p.useState)(``),[D,O]=(0,p.useState)(null),[k,A]=(0,p.useState)(``),[j,M]=(0,p.useState)(``),[N,P]=(0,p.useState)(``),[F,I]=(0,p.useState)(``),[pe,L]=(0,p.useState)(!1),[R,z]=(0,p.useState)(!1),[me,B]=(0,p.useState)(),V=(0,p.useRef)(null),H=(0,p.useRef)(0);(0,p.useEffect)(()=>(b(``),E(``),w(``),L(!1),()=>{H.current++,V.current?.abort()}),[n.project.id,v?.id]);let he=n.plans.toSorted((e,t)=>t.version-e.version)[0],U=!!v&&(v.planId!==he?.id||n.planNeedsUpdate===!0),W=U||!!v?.confirmationRequestedAt||v?.status===`confirmed`||v?.status===`cancelled`,G=v?.needs.find(e=>e.id===y)??(y===`summary`?void 0:v?.needs.find(e=>!h(e))??v?.needs[0]);(0,p.useEffect)(()=>{!y&&v?.needs.length&&b(v.needs.find(e=>!h(e))?.id??v.needs[0].id)},[y,v?.id,v?.needs[0]?.id]),(0,p.useEffect)(()=>{S(G?.query??``),O(null),A(``),M(``),P(``),I(``),L(!1)},[G?.id]);let ge=`/projects/${n.project.id}/asset-selection`,K=v?`${ge}/${v.id}`:ge,q=async(e,t,n={},r=`POST`)=>{let i=++H.current;w(e),E(``);try{await se(t,r,n),await _()}catch(e){i===H.current&&(E(u(e)),await _().catch(()=>{}))}finally{i===H.current&&w(``)}},_e=e=>G&&v&&void q(`Сохраняем выбор`,`${K}/needs/${G.id}`,{revision:v.revision,choice:{kind:`candidate`,candidateId:e}},`PATCH`),ve=e=>{if(e.preventDefault(),!D||!G||!v||C)return;let t=new FormData;t.append(`revision`,String(v.revision)),k.trim()&&t.append(`sourceUrl`,k.trim()),t.append(`license`,j),t.append(`author`,N),F.trim()&&t.append(`licenseUrl`,F.trim()),R&&G.choice?.kind===`candidate`&&t.append(`candidateId`,G.choice.candidateId),t.append(`file`,D),w(`Загружаем выбранный файл`),E(``),B(void 0);let n=new XMLHttpRequest;V.current=n,n.open(`POST`,`/api/v1${K}/needs/${G.id}/upload`),n.upload.onprogress=e=>{e.lengthComputable&&B(e.loaded/e.total*100)},n.onerror=()=>{w(``),E(`Не удалось загрузить файл. Выбор сохранён; повторите загрузку.`)},n.onabort=()=>{V.current=null},n.onload=()=>{(async()=>{try{let e=JSON.parse(n.responseText);if(n.status<200||n.status>=300)throw Error(e.message??`Ошибка загрузки`);await _(),L(!1),O(null)}catch(e){E(u(e))}finally{w(``),B(void 0),V.current=null}})()},n.send(t)},J=v?.needs.filter(e=>!h(e))??[],Y=v?.status===`discovering`||v?.needs.some(e=>e.status===`searching`),X=y===`summary`||v?.needs.length===0&&!Y,Z=v?.needs.filter(e=>e.status===`imported`).length??0,Q=fe.findLast(e=>e.projectId===n.project.id&&e.type===`asset.progress`&&v&&e.payload.selectionId===v.id)?.payload,ye=Q?.total&&Q.downloaded!==void 0?Q.downloaded/Q.total*100:void 0,be=!v||W||!!C||!!Y||J.length>0||v.status===`failed`,$=G?.choice?.kind===`candidate`?G.candidates.find(e=>e.id===G.choice.candidateId):void 0;return(0,p.useEffect)(()=>{L(!1),O(null),z(!1)},[$?.id]),(0,m.jsx)(te,{open:e,onOpenChange:e=>{V.current||t(e)},title:`Подберём ассеты для игры`,description:`Задачи готовятся параллельно. Выберите материалы, проверьте итог и подтвердите набор перед разработкой.`,wide:!0,children:(0,m.jsxs)(`div`,{className:`asset-selection-wizard`,"data-testid":`asset-selection-wizard`,"data-status":v?.status??`pending`,children:[de,T&&(0,m.jsx)(l,{children:T}),U&&(0,m.jsx)(l,{children:`План изменился. Откройте актуальную версию и утвердите её, чтобы подобрать подходящие ассеты.`}),v?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)(`div`,{className:`selection-status-line`,children:[(0,m.jsx)(`span`,{className:`badge`,children:n.assetReadiness?.tasksReady?`Задачи готовы`:`Готовим задачи`}),(0,m.jsx)(`span`,{children:v.status===`confirmed`?`В проекте: ${Z}`:v.confirmationRequestedAt?`Набор подтверждён · ждём готовности задач и импорта`:`Выбрано ${v.needs.length-J.length} из ${v.needs.length}`})]}),v.error&&(0,m.jsx)(l,{children:v.error}),(v.status===`failed`||v.status===`cancelled`)&&!U&&(0,m.jsxs)(`div`,{className:`selection-recovery`,children:[(0,m.jsx)(`span`,{children:v.status===`cancelled`?`Подбор остановлен. Сохранённые материалы доступны после повтора.`:`Повторите незавершённый поиск или импорт.`}),(0,m.jsxs)(s,{busy:!!C,"data-testid":`selection-retry`,onClick:()=>void q(`Возобновляем подбор`,`${K}/retry`),children:[(0,m.jsx)(r,{size:16}),`Повторить`]})]}),Y&&(0,m.jsx)(c,{label:`Ищем материалы по плану`,detail:`Покажем доступные варианты по мере получения. Их количество зависит от источников.`}),(0,m.jsxs)(`div`,{className:`selection-layout`,children:[(0,m.jsxs)(`nav`,{className:`selection-needs`,"aria-label":`Потребности в ассетах`,children:[v.needs.map((e,t)=>(0,m.jsxs)(`button`,{type:`button`,className:G?.id===e.id&&!X?`active`:``,onClick:()=>b(e.id),"data-testid":`asset-need-${t}`,"aria-current":G?.id===e.id&&!X?`step`:void 0,children:[(0,m.jsx)(`span`,{className:`selection-need-number`,children:h(e)?(0,m.jsx)(f,{size:15}):String(t+1).padStart(2,`0`)}),(0,m.jsxs)(`span`,{children:[(0,m.jsx)(`strong`,{children:e.title}),(0,m.jsxs)(`small`,{children:[e.required?`Обязательно`:`По желанию`,` · `,e.choice&&e.status===`ready`?`Выбрано`:ce[e.status]]})]})]},e.id)),(0,m.jsxs)(`button`,{type:`button`,onClick:()=>b(`summary`),className:X?`active`:``,"data-testid":`selection-summary`,children:[(0,m.jsx)(ee,{size:18}),(0,m.jsxs)(`span`,{children:[(0,m.jsx)(`strong`,{children:`Итоговый набор`}),(0,m.jsx)(`small`,{children:`Проверка перед разработкой`})]})]})]}),(0,m.jsx)(`div`,{className:`selection-content`,children:X?(0,m.jsxs)(`section`,{className:`selection-summary-panel`,children:[(0,m.jsx)(`div`,{className:`eyebrow`,children:`ВАШ ВЫБОР`}),(0,m.jsx)(`h3`,{children:`Материалы для утверждённого плана`}),v.needs.length===0?(0,m.jsx)(`p`,{children:`Для этого плана дополнительные ассеты не нужны. Подтвердите пустой набор, чтобы продолжить подготовку и разработку.`}):(0,m.jsx)(`ul`,{children:v.needs.map(e=>(0,m.jsxs)(`li`,{children:[(0,m.jsxs)(`div`,{children:[(0,m.jsx)(`strong`,{children:e.title}),(0,m.jsx)(`small`,{children:e.choice?.kind===`skip`?`Пропущено по вашему выбору`:e.importedAsset?.name??(e.choice?.kind===`upload`?e.choice.asset.name:e.candidates.find(t=>e.choice?.kind===`candidate`&&t.id===e.choice.candidateId)?.asset.name)??`Ещё не выбрано`})]}),(0,m.jsx)(`span`,{className:`badge ${h(e)?`badge-success`:``}`,children:e.status===`imported`?`В проекте`:h(e)?`Готово`:`Нужен выбор`})]},e.id))}),J.length>0&&(0,m.jsxs)(`p`,{className:`selection-summary-note`,children:[`Осталось завершить выбор: `,J.length,`. Необязательные материалы можно пропустить.`]}),(0,m.jsx)(`p`,{className:`selection-summary-note`,children:`Файлы попадут в проект после подтверждения набора и готовности задач. Затем агент начнёт реализацию утверждённого плана.`})]}):G?(0,m.jsxs)(`section`,{children:[(0,m.jsxs)(`div`,{className:`selection-need-heading`,children:[(0,m.jsxs)(`div`,{children:[(0,m.jsxs)(`div`,{className:`eyebrow`,children:[G.type,` · `,G.required?`ОБЯЗАТЕЛЬНЫЙ МАТЕРИАЛ`:`ПО ЖЕЛАНИЮ`]}),(0,m.jsx)(`h3`,{children:(0,m.jsx)(d,{id:`selection:${v.id}:${G.id}:title`,children:G.title})}),(0,m.jsx)(`p`,{children:(0,m.jsx)(d,{id:`selection:${v.id}:${G.id}:rationale`,children:G.rationale})})]}),!G.required&&(0,m.jsx)(s,{disabled:W||!!C,"data-testid":`selection-skip`,onClick:()=>void q(`Сохраняем пропуск`,`${K}/needs/${G.id}`,{revision:v.revision,choice:{kind:`skip`}},`PATCH`),children:`Пропустить`})]}),G.warnings?.map((e,t)=>(0,m.jsxs)(`p`,{className:`selection-provider-warning`,children:[(0,m.jsx)(ae,{size:15}),e]},t)),G.error&&(0,m.jsx)(l,{children:G.error}),(0,m.jsxs)(`form`,{className:`selection-query`,onSubmit:e=>{e.preventDefault(),q(`Ищем другие варианты`,`${K}/needs/${G.id}/search`,{revision:v.revision,query:x.trim()})},children:[(0,m.jsx)(`label`,{className:`sr-only`,htmlFor:`selection-query`,children:`Поисковый запрос`}),(0,m.jsx)(re,{size:18}),(0,m.jsx)(`input`,{id:`selection-query`,value:x,onChange:e=>S(e.target.value),disabled:W||!!C}),(0,m.jsx)(s,{type:`submit`,disabled:W||!!C||!x.trim(),"data-testid":`selection-search`,children:`Найти другие`})]}),(0,m.jsx)(`div`,{className:`selection-candidates`,children:G.candidates.map((e,t)=>(0,m.jsx)(le,{asset:e.asset,reason:e.reason,generatedId:`selection:${v.id}:${G.id}:candidate:${e.id}`,selected:G.choice?.kind===`candidate`&&G.choice.candidateId===e.id,disabled:W||!!C||G.status===`searching`,onChoose:()=>_e(e.id),testId:`asset-option-${t}`},e.id))}),!G.candidates.length&&G.status!==`searching`&&(0,m.jsx)(ne,{icon:(0,m.jsx)(oe,{size:26}),title:`Подходящих вариантов пока нет`,children:`Измените запрос или добавьте файл, который уже выбрали сами.`}),$?.asset.importMode===`manual`&&(0,m.jsxs)(`div`,{className:`selection-manual-note`,children:[(0,m.jsx)(o,{size:18}),(0,m.jsx)(`span`,{children:`Этот источник требует скачивания вручную. Откройте страницу, скачайте ресурс и загрузите файл ниже; одной ссылки для разработки недостаточно.`})]}),G.choice?.kind===`upload`&&(0,m.jsxs)(`div`,{className:`selection-staged-preview`,"data-testid":`staged-asset-preview`,children:[(0,m.jsxs)(l,{type:`success`,children:[`Файл «`,G.choice.asset.name,`» выбран и сохранён для импорта.`]}),(0,m.jsx)(i,{asset:G.importedAsset??G.choice.asset})]}),!W&&(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)(s,{className:`selection-upload-toggle`,onClick:()=>{L(e=>!e),z(!!$),$&&(I($.asset.licenseUrl??``),A($.asset.sourceUrl),M($.asset.license),P($.asset.author??``))},children:[(0,m.jsx)(ie,{size:17}),pe?`Скрыть загрузку`:`Загрузить свой файл`]}),pe&&(0,m.jsxs)(`form`,{onSubmit:ve,className:`selection-upload-form`,children:[$&&(0,m.jsxs)(`label`,{className:`agent-permission-setting`,children:[(0,m.jsx)(`input`,{type:`checkbox`,checked:R,onChange:e=>{z(e.target.checked),e.target.checked?(A($.asset.sourceUrl),M($.asset.license),P($.asset.author??``),I($.asset.licenseUrl??``)):(A(``),M(``),P(``),I(``))}}),`Это файл со страницы «`,$.asset.name,`»`]}),(0,m.jsx)(`small`,{children:R?`Будут сохранены автор и лицензия выбранного источника. Загрузите именно его файл.`:`Для своего ресурса укажите действительную лицензию. Ссылка не нужна, если источник — ваша собственная работа.`}),(0,m.jsxs)(`label`,{children:[`Файл`,(0,m.jsx)(`input`,{type:`file`,required:!0,disabled:!!C,"data-testid":`selection-file`,onChange:e=>O(e.target.files?.[0]??null)})]}),(0,m.jsxs)(`div`,{className:`form-columns`,children:[(0,m.jsxs)(`label`,{children:[`Источник`,(0,m.jsx)(`input`,{type:`url`,value:k,onChange:e=>A(e.target.value),required:j.startsWith(`CC-BY-`),disabled:R,"aria-label":`Источник загружаемого ассета`})]}),(0,m.jsxs)(`label`,{children:[`Лицензия`,(0,m.jsx)(`input`,{value:j,onChange:e=>M(e.target.value),required:!0,disabled:R,"aria-label":`Лицензия загружаемого ассета`})]})]}),(0,m.jsxs)(`div`,{className:`form-columns`,children:[(0,m.jsxs)(`label`,{children:[`Автор`,(0,m.jsx)(`input`,{value:N,required:j.startsWith(`CC-BY-`),disabled:R,onChange:e=>P(e.target.value)})]}),(0,m.jsxs)(`label`,{children:[`Ссылка на лицензию`,(0,m.jsx)(`input`,{type:`url`,disabled:R,value:F,onChange:e=>I(e.target.value)})]})]}),(0,m.jsx)(s,{type:`submit`,disabled:!D||!!C,"data-testid":`selection-upload`,children:`Загрузить и выбрать`})]})]})]},G.id):null})]}),C&&(0,m.jsx)(c,{label:C,value:me}),v.status===`importing`&&(0,m.jsx)(c,{label:`Импортируем выбранные ассеты`,value:ye,detail:Q?.file??`Готово материалов: ${Z} из ${v.needs.filter(e=>e.choice?.kind!==`skip`).length}`}),(0,m.jsxs)(`div`,{className:`selection-footer`,children:[(0,m.jsxs)(`div`,{children:[U?(0,m.jsx)(s,{onClick:ue,children:`Открыть актуальный план`}):(!W||v.status===`importing`||!!v.confirmationRequestedAt)&&v.status!==`confirmed`&&v.status!==`cancelled`&&(0,m.jsx)(s,{tone:`ghost`,disabled:!!C,onClick:()=>void q(`Останавливаем подбор`,`${K}/cancel`),"data-testid":`selection-cancel`,children:`Остановить подбор`}),(0,m.jsx)(`small`,{children:`Выбор сохранён. Окно можно закрыть и открыть снова.`})]}),!X&&!W?(0,m.jsxs)(s,{tone:`primary`,onClick:()=>b(`summary`),"data-testid":`selection-review`,children:[`Проверить набор `,(0,m.jsx)(a,{size:16})]}):v.status===`confirmed`?(0,m.jsxs)(s,{tone:`primary`,onClick:()=>t(!1),children:[`Вернуться к проекту `,(0,m.jsx)(a,{size:16})]}):(0,m.jsxs)(s,{tone:`primary`,disabled:be,"data-testid":`selection-confirm`,onClick:()=>void q(`Подтверждаем набор`,`${K}/confirm`,{revision:v.revision}),children:[v.confirmationRequestedAt?`Набор подтверждён`:`Подтвердить набор и продолжить`,(0,m.jsx)(a,{size:16})]})]})]}):(0,m.jsx)(`div`,{className:`selection-pending`,children:g?.status===`failed`?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(l,{children:g.error??`Не удалось утвердить план.`}),(0,m.jsx)(s,{onClick:ue,children:`Вернуться к плану`})]}):(0,m.jsx)(c,{label:g?.status===`pending`?`Подтверждаем план`:`Определяем, какие ассеты нужны`,detail:`Ваш выбор появится здесь; разработка дождётся подтверждения набора.`})})]})})}function le({asset:e,reason:t,generatedId:n,selected:r,disabled:a,onChoose:ee,testId:te}){return(0,m.jsxs)(`article`,{className:`selection-option ${r?`selected`:``}`,"data-testid":te,children:[(0,m.jsxs)(`div`,{className:`selection-media-wrap`,children:[(0,m.jsx)(i,{asset:e,compact:!0}),r&&(0,m.jsxs)(`span`,{className:`selection-chosen`,children:[(0,m.jsx)(f,{size:13}),`Выбрано`]})]}),(0,m.jsxs)(`div`,{className:`selection-option-copy`,children:[(0,m.jsx)(`small`,{children:e.provider}),(0,m.jsx)(`h4`,{children:e.name}),(0,m.jsx)(`p`,{children:(0,m.jsx)(d,{id:n,children:t})}),(0,m.jsxs)(`div`,{className:`selection-asset-meta`,children:[(0,m.jsx)(`span`,{children:e.license}),(0,m.jsx)(`span`,{children:e.formats?.join(` · `)||`Формат указан на странице`})]}),e.author&&(0,m.jsxs)(`small`,{children:[`Автор: `,e.author]}),e.attribution&&(0,m.jsx)(`small`,{children:e.attribution}),g(e.licenseUrl)&&(0,m.jsxs)(`a`,{className:`selection-license-link`,href:g(e.licenseUrl),target:`_blank`,rel:`noopener noreferrer`,children:[`Условия лицензии `,(0,m.jsx)(o,{size:12})]}),(0,m.jsxs)(`div`,{className:`selection-option-actions`,children:[g(e.sourceUrl)&&(0,m.jsxs)(`a`,{href:g(e.sourceUrl),target:`_blank`,rel:`noopener noreferrer`,children:[`Источник `,(0,m.jsx)(o,{size:13})]}),(0,m.jsx)(s,{disabled:a,"aria-pressed":r,onClick:ee,children:r?`Выбран`:`Выбрать`})]})]})]})}export{_ as AssetSelectionWizard};
@@ -0,0 +1 @@
1
+ import{n as e,o as t,r as n,t as r}from"./jsx-runtime-CdVFa8IP.js";import{n as i}from"./ui-wHE_yBK0.js";import{M as a,c as o,j as s,m as c}from"./index-B6_q6dBC.js";var l=t(n(),1),u=new Map([[`bold`,l.createElement(l.Fragment,null,l.createElement(`path`,{d:`M208,36H48A20,20,0,0,0,28,56v56c0,54.29,26.32,87.22,48.4,105.29,23.71,19.39,47.44,26,48.44,26.29a12.1,12.1,0,0,0,6.32,0c1-.28,24.73-6.9,48.44-26.29,22.08-18.07,48.4-51,48.4-105.29V56A20,20,0,0,0,208,36Zm-4,76c0,35.71-13.09,64.69-38.91,86.15A126.28,126.28,0,0,1,128,219.38a126.14,126.14,0,0,1-37.09-21.23C65.09,176.69,52,147.71,52,112V60H204ZM79.51,144.49a12,12,0,1,1,17-17L112,143l47.51-47.52a12,12,0,0,1,17,17l-56,56a12,12,0,0,1-17,0Z`}))],[`duotone`,l.createElement(l.Fragment,null,l.createElement(`path`,{d:`M216,56v56c0,96-88,120-88,120S40,208,40,112V56a8,8,0,0,1,8-8H208A8,8,0,0,1,216,56Z`,opacity:`0.2`}),l.createElement(`path`,{d:`M208,40H48A16,16,0,0,0,32,56v56c0,52.72,25.52,84.67,46.93,102.19,23.06,18.86,46,25.26,47,25.53a8,8,0,0,0,4.2,0c1-.27,23.91-6.67,47-25.53C198.48,196.67,224,164.72,224,112V56A16,16,0,0,0,208,40Zm0,72c0,37.07-13.66,67.16-40.6,89.42A129.3,129.3,0,0,1,128,223.62a128.25,128.25,0,0,1-38.92-21.81C61.82,179.51,48,149.3,48,112l0-56,160,0ZM82.34,141.66a8,8,0,0,1,11.32-11.32L112,148.69l50.34-50.35a8,8,0,0,1,11.32,11.32l-56,56a8,8,0,0,1-11.32,0Z`}))],[`fill`,l.createElement(l.Fragment,null,l.createElement(`path`,{d:`M208,40H48A16,16,0,0,0,32,56v56c0,52.72,25.52,84.67,46.93,102.19,23.06,18.86,46,25.26,47,25.53a8,8,0,0,0,4.2,0c1-.27,23.91-6.67,47-25.53C198.48,196.67,224,164.72,224,112V56A16,16,0,0,0,208,40Zm-34.32,69.66-56,56a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L112,148.69l50.34-50.35a8,8,0,0,1,11.32,11.32Z`}))],[`light`,l.createElement(l.Fragment,null,l.createElement(`path`,{d:`M208,42H48A14,14,0,0,0,34,56v56c0,51.94,25.12,83.4,46.2,100.64,22.73,18.6,45.27,24.89,46.22,25.15a6,6,0,0,0,3.16,0c.95-.26,23.49-6.55,46.22-25.15C196.88,195.4,222,163.94,222,112V56A14,14,0,0,0,208,42Zm2,70c0,37.76-13.94,68.39-41.44,91.06A131.17,131.17,0,0,1,128,225.72a130.94,130.94,0,0,1-40.56-22.66C59.94,180.39,46,149.76,46,112V56a2,2,0,0,1,2-2H208a2,2,0,0,1,2,2ZM172.24,99.76a6,6,0,0,1,0,8.48l-56,56a6,6,0,0,1-8.48,0l-24-24a6,6,0,0,1,8.48-8.48L112,151.51l51.76-51.75A6,6,0,0,1,172.24,99.76Z`}))],[`regular`,l.createElement(l.Fragment,null,l.createElement(`path`,{d:`M208,40H48A16,16,0,0,0,32,56v56c0,52.72,25.52,84.67,46.93,102.19,23.06,18.86,46,25.26,47,25.53a8,8,0,0,0,4.2,0c1-.27,23.91-6.67,47-25.53C198.48,196.67,224,164.72,224,112V56A16,16,0,0,0,208,40Zm0,72c0,37.07-13.66,67.16-40.6,89.42A129.3,129.3,0,0,1,128,223.62a128.25,128.25,0,0,1-38.92-21.81C61.82,179.51,48,149.3,48,112l0-56,160,0ZM82.34,141.66a8,8,0,0,1,11.32-11.32L112,148.69l50.34-50.35a8,8,0,0,1,11.32,11.32l-56,56a8,8,0,0,1-11.32,0Z`}))],[`thin`,l.createElement(l.Fragment,null,l.createElement(`path`,{d:`M208,44H48A12,12,0,0,0,36,56v56c0,51.16,24.73,82.12,45.47,99.1,22.4,18.32,44.55,24.5,45.48,24.76a4,4,0,0,0,2.1,0c.93-.26,23.08-6.44,45.48-24.76,20.74-17,45.47-47.94,45.47-99.1V56A12,12,0,0,0,208,44Zm4,68c0,38.44-14.23,69.63-42.29,92.71A132.45,132.45,0,0,1,128,227.82a132.23,132.23,0,0,1-41.71-23.11C58.23,181.63,44,150.44,44,112V56a4,4,0,0,1,4-4H208a4,4,0,0,1,4,4Zm-41.17-10.83a4,4,0,0,1,0,5.66l-56,56a4,4,0,0,1-5.66,0l-24-24a4,4,0,0,1,5.66-5.66L112,154.34l53.17-53.17A4,4,0,0,1,170.83,101.17Z`}))]]),d=new Map([[`bold`,l.createElement(l.Fragment,null,l.createElement(`path`,{d:`M196,136a16,16,0,1,1-16-16A16,16,0,0,1,196,136Zm40-36v80a32,32,0,0,1-32,32H60a32,32,0,0,1-32-32V60.92A32,32,0,0,1,60,28H192a12,12,0,0,1,0,24H60a8,8,0,0,0-8,8.26v.08A8.32,8.32,0,0,0,60.48,68H204A32,32,0,0,1,236,100Zm-24,0a8,8,0,0,0-8-8H60.48A33.72,33.72,0,0,1,52,90.92V180a8,8,0,0,0,8,8H204a8,8,0,0,0,8-8Z`}))],[`duotone`,l.createElement(l.Fragment,null,l.createElement(`path`,{d:`M224,80V192a8,8,0,0,1-8,8H56a16,16,0,0,1-16-16V56A16,16,0,0,0,56,72H216A8,8,0,0,1,224,80Z`,opacity:`0.2`}),l.createElement(`path`,{d:`M216,64H56a8,8,0,0,1,0-16H192a8,8,0,0,0,0-16H56A24,24,0,0,0,32,56V184a24,24,0,0,0,24,24H216a16,16,0,0,0,16-16V80A16,16,0,0,0,216,64Zm0,128H56a8,8,0,0,1-8-8V78.63A23.84,23.84,0,0,0,56,80H216Zm-48-60a12,12,0,1,1,12,12A12,12,0,0,1,168,132Z`}))],[`fill`,l.createElement(l.Fragment,null,l.createElement(`path`,{d:`M216,64H56a8,8,0,0,1,0-16H192a8,8,0,0,0,0-16H56A24,24,0,0,0,32,56V184a24,24,0,0,0,24,24H216a16,16,0,0,0,16-16V80A16,16,0,0,0,216,64Zm-36,80a12,12,0,1,1,12-12A12,12,0,0,1,180,144Z`}))],[`light`,l.createElement(l.Fragment,null,l.createElement(`path`,{d:`M216,66H56a10,10,0,0,1,0-20H192a6,6,0,0,0,0-12H56A22,22,0,0,0,34,56V184a22,22,0,0,0,22,22H216a14,14,0,0,0,14-14V80A14,14,0,0,0,216,66Zm2,126a2,2,0,0,1-2,2H56a10,10,0,0,1-10-10V75.59A21.84,21.84,0,0,0,56,78H216a2,2,0,0,1,2,2Zm-28-60a10,10,0,1,1-10-10A10,10,0,0,1,190,132Z`}))],[`regular`,l.createElement(l.Fragment,null,l.createElement(`path`,{d:`M216,64H56a8,8,0,0,1,0-16H192a8,8,0,0,0,0-16H56A24,24,0,0,0,32,56V184a24,24,0,0,0,24,24H216a16,16,0,0,0,16-16V80A16,16,0,0,0,216,64Zm0,128H56a8,8,0,0,1-8-8V78.63A23.84,23.84,0,0,0,56,80H216Zm-48-60a12,12,0,1,1,12,12A12,12,0,0,1,168,132Z`}))],[`thin`,l.createElement(l.Fragment,null,l.createElement(`path`,{d:`M216,68H56a12,12,0,0,1,0-24H192a4,4,0,0,0,0-8H56A20,20,0,0,0,36,56V184a20,20,0,0,0,20,20H216a12,12,0,0,0,12-12V80A12,12,0,0,0,216,68Zm4,124a4,4,0,0,1-4,4H56a12,12,0,0,1-12-12V72a19.86,19.86,0,0,0,12,4H216a4,4,0,0,1,4,4Zm-32-60a8,8,0,1,1-8-8A8,8,0,0,1,188,132Z`}))]]),f=l.forwardRef((t,n)=>l.createElement(e,{ref:n,...t,weights:u}));f.displayName=`ShieldCheckIcon`;var p=f,m=l.forwardRef((t,n)=>l.createElement(e,{ref:n,...t,weights:d}));m.displayName=`WalletIcon`;var h=m,g=r(),_={monthly:[`Месячный лимит`,`За месяц`],weekly:[`Недельный лимит`,`За неделю`],daily:[`Дневной лимит`,`За сутки`]},v=e=>e>0&&e<1?`<1%`:e>99&&e<100?`>99%`:`${e.toLocaleString(`ru-RU`,{maximumFractionDigits:1})}%`;function y({budget:e,legacy:t,modern:n=!1}){let r=e?.status===`inactive`,i=e?.status===`unavailable`,a=r?`Подписка не активна`:`Данные лимита пока недоступны`;return(0,g.jsxs)(g.Fragment,{children:[e?.status===`active`&&(0,g.jsx)(`p`,{className:`core-budget-description`,children:`Лимиты подписки обновляются по московскому времени.`}),e&&e.status!==`active`&&(0,g.jsx)(`p`,{role:`status`,children:e.message||a}),(0,g.jsx)(`div`,{className:`core-account-periods core-account-periods-three`,children:[`monthly`,`weekly`,`daily`].map(o=>{let s=e?e.status===`active`?e[o]:void 0:o===`monthly`?void 0:t?.[o],c=s&&Number.isFinite(s.left)&&Number.isFinite(s.limit)?s.limit>0?Math.min(100,Math.max(0,s.left/s.limit*100)):0:void 0,l=c===void 0?`unavailable`:c<=10?`critical`:c<=20?`warning`:`normal`,u=s?.reserved??0,d=(!!s?.pending_costs||u>0)&&(s?.left??0)>0,f=c===void 0?`—`:`${d?`≈`:``}${v(c)}`,p=s?.resets_at&&Number.isFinite(Date.parse(s.resets_at))?new Date(s.resets_at).toLocaleString(`ru-RU`,{timeZone:`Europe/Moscow`})+` МСК`:void 0;return n?(0,g.jsxs)(`section`,{className:`core-limit`,"data-level":l,"aria-label":_[o][0],children:[(0,g.jsx)(`div`,{className:`core-limit-heading`,children:(0,g.jsx)(`h3`,{children:_[o][1]})}),(0,g.jsxs)(`p`,{className:`core-limit-count`,children:[(0,g.jsx)(`span`,{children:`Осталось`}),(0,g.jsx)(`b`,{children:f})]}),c===void 0?(0,g.jsx)(`p`,{className:`core-limit-used`,children:a}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(`progress`,{max:100,value:c,"aria-valuetext":f,"aria-label":`Остаток ${o===`daily`?`дневного`:o===`weekly`?`недельного`:`месячного`} лимита`}),(0,g.jsxs)(`p`,{className:`core-limit-used`,children:[`Использовано `,s?.pending_costs?`≈`:``,v(s&&s.limit>0?Math.min(100,Math.max(0,s.used/s.limit*100)):100)]}),u>0&&s&&(0,g.jsxs)(`small`,{children:[`Зарезервировано для генерации:`,` `,v(Math.min(100,u/s.limit*100))]}),l===`critical`&&(0,g.jsx)(`small`,{className:`core-limit-notice`,children:c===0?u>0?`Доступный лимит зарезервирован`:`Лимит исчерпан`:`Критически мало доступного лимита`}),l===`warning`&&(0,g.jsx)(`small`,{className:`core-limit-notice`,children:`Лимит заканчивается`})]}),d&&(0,g.jsx)(`small`,{children:u>0?`Часть лимита занята ожидающей генерацией. Итоговая цена уточнится после завершения.`:`Расчёт по подтверждённой стоимости. Цена части запросов пока неизвестна.`}),p?(0,g.jsxs)(`small`,{children:[`Обновление: `,p]}):(0,g.jsx)(`small`,{children:r?`Лимиты появятся после активации подписки.`:i?`Нажмите «Обновить», чтобы повторить загрузку.`:`Нажмите «Обновить», чтобы уточнить данные.`})]},o):(0,g.jsxs)(`p`,{"aria-label":_[o][0],children:[_[o][1],`: осталось `,f,`.`,` `,c===void 0?a:p?`Обновление: ${p}`:``]},o)})})]})}var b=e=>e===void 0?`—`:e.toLocaleString(`ru-RU`),x=(e,t)=>!Number.isFinite(e)||!Number.isFinite(t)?void 0:t<=0?0:Math.min(100,Math.max(0,e/t*100)),S=e=>e===void 0?`—`:e>0&&e<1?`<1%`:e>99&&e<100?`>99%`:`${e.toLocaleString(o()===`en`?`en-US`:`ru-RU`,{maximumFractionDigits:1})}%`,C=e=>e?new Date(e).toLocaleString(o()===`en`?`en-US`:`ru-RU`):`—`;function w({modern:e=!1}){let[t,n]=(0,l.useState)(),[r,o]=(0,l.useState)(`https://umgt.aircoding.ai`),[u,d]=(0,l.useState)(``),[f,m]=(0,l.useState)(``),[_,v]=(0,l.useState)(!1),[w,T]=(0,l.useState)(),E=(0,l.useRef)(0),D=async()=>{let e=++E.current,t=await s(`/core`);e===E.current&&(n(t),o(t.url||`https://umgt.aircoding.ai`))};(0,l.useEffect)(()=>{let e=()=>{D().catch(e=>m(a(e)))},t=()=>{E.current++,n(void 0),T(void 0),d(``),e()};return e(),window.addEventListener(`umgt-usage-changed`,e),window.addEventListener(`umgt-account-changed`,t),()=>{E.current++,window.removeEventListener(`umgt-usage-changed`,e),window.removeEventListener(`umgt-account-changed`,t)}},[]);let O=async e=>{v(!0),m(``);try{await e(),await D(),window.dispatchEvent(new Event(`umgt-account-updated`))}catch(e){m(a(e))}finally{v(!1)}},k=async e=>{e.preventDefault(),await O(async()=>{await s(`/core/connect`,`POST`,{url:r,key:u}),n(void 0),d(``),T(void 0),window.dispatchEvent(new Event(`umgt-account-changed`))})},A=t?.entitlements,j=A?.ai_budget;return(0,g.jsxs)(`section`,{className:`settings-section core-account ${e?`core-account-modern`:``}`,"aria-label":`Подписка и доступ`,children:[(0,g.jsxs)(`div`,{className:`settings-description`,children:[(0,g.jsx)(`h2`,{children:`Подписка и доступ`}),(0,g.jsx)(`p`,{children:`Подключите аккаунт UMGT для работы AI. Проекты и инструменты остаются на вашем компьютере.`})]}),(0,g.jsxs)(`div`,{className:`settings-fields`,children:[f&&(0,g.jsx)(`p`,{role:`alert`,children:f}),!t?.connected&&(0,g.jsx)(`p`,{children:`Скопируйте личный API-ключ в кабинете game.aircoding.ai и вставьте его ниже. После подключения появятся баланс, подписка и остатки лимитов.`}),t?.connected&&t.profile&&(0,g.jsxs)(`div`,{className:`core-account-profile`,children:[(0,g.jsx)(c,{profile:t.profile}),(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`h3`,{children:t.profile.name||`Аккаунт UMGT`}),(0,g.jsx)(`p`,{children:`Профиль личного кабинета`})]})]}),A&&(0,g.jsxs)(g.Fragment,{children:[e?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsxs)(`div`,{className:`core-membership ${A.subscription?.active?`active`:``}`,children:[(0,g.jsx)(`span`,{className:`core-card-icon`,children:(0,g.jsx)(p,{size:32,weight:`duotone`})}),(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`h3`,{children:A.subscription?.active?`Подписка активна`:`Подписка не активна`}),(0,g.jsx)(`p`,{children:A.subscription?.active?`Действует до ${C(A.subscription?.until)}`:`Оформи подписку или увеличь доступный лимит.`})]}),(0,g.jsx)(`span`,{className:`core-membership-badge`,children:A.subscription?.active?`Подключено`:`Без подписки`})]}),(0,g.jsx)(`dl`,{className:`core-metrics`,children:(0,g.jsxs)(`div`,{className:`core-metric core-metric-balance`,children:[(0,g.jsxs)(`dt`,{children:[(0,g.jsx)(h,{size:25,weight:`duotone`}),`Баланс`]}),(0,g.jsxs)(`dd`,{children:[b(A.balance_kop===void 0?void 0:A.balance_kop/100),` `,(0,g.jsx)(`span`,{children:`₽`})]}),(0,g.jsx)(`small`,{children:`Для генерации 3D и других услуг`})]})})]}):(0,g.jsxs)(`dl`,{className:`core-account-summary`,children:[(0,g.jsx)(`dt`,{children:`Подписка`}),(0,g.jsx)(`dd`,{children:A.subscription?.active?`Действует`:`Не активна`}),(0,g.jsx)(`dt`,{children:`Действует до`}),(0,g.jsx)(`dd`,{children:C(A.subscription?.until)}),(0,g.jsx)(`dt`,{children:`Баланс`}),(0,g.jsxs)(`dd`,{children:[b(A.balance_kop===void 0?void 0:A.balance_kop/100),` `,`₽`]})]}),(0,g.jsx)(y,{budget:j,legacy:A.limits,modern:e}),!j&&A.usage?.length?(0,g.jsxs)(`details`,{children:[(0,g.jsxs)(`summary`,{children:[`Расход за `,A.period??`месяц`]}),(0,g.jsx)(`ul`,{children:A.usage.map(e=>{let t=e.monthly_limit===null?void 0:x(e.monthly_limit-e.used_tokens,e.monthly_limit);return(0,g.jsxs)(`li`,{children:[e.service,`: `,e.monthly_limit===null?`Без ограничения`:`Осталось ${S(t)} · Использовано ${S(t===void 0?void 0:100-t)}`,`; `,b(e.spent_kop/100),` ₽`]},e.service)})})]}):null,A.courses?.length?(0,g.jsxs)(`p`,{children:[`Курсы: `,A.courses.join(`, `)]}):null,(0,g.jsx)(`div`,{className:`core-services`,children:A.access?.services?.map(e=>(0,g.jsxs)(`p`,{children:[e.name,`:`,` `,e.status===`active`?`доступен`:e.status===`disabled`?`выключен в UMGT`:`нет баланса`]},e.id))}),(0,g.jsxs)(`div`,{className:`core-account-actions`,children:[(0,g.jsx)(i,{type:`button`,disabled:_,onClick:()=>void O(async()=>{}),children:`Обновить`}),(0,g.jsx)(i,{type:`button`,disabled:_,onClick:()=>void O(async()=>T(await s(`/core/operations`))),children:`История операций`})]}),w&&(0,g.jsx)(`ul`,{className:`core-operation-history`,children:w.length?w.map(e=>(0,g.jsxs)(`li`,{children:[C(e.created_at),`: `,e.service??`game_hub`,`,`,` `,e.status,`,`,` `,b(Number(e.cost_kop??0)/100),` ₽`,e.error_code?` (${e.error_code})`:``]},e.id)):(0,g.jsx)(`li`,{children:`Операций пока нет.`})})]}),(0,g.jsxs)(`div`,{className:`core-account-links`,children:[(0,g.jsx)(`a`,{href:`https://game.aircoding.ai/app/`,target:`_blank`,rel:`noreferrer`,children:`Кабинет UMGT`}),(0,g.jsx)(`a`,{href:`https://game.aircoding.ai/app/checkout/subscription`,target:`_blank`,rel:`noreferrer`,children:`Оформить подписку`}),(0,g.jsx)(`a`,{href:`https://game.aircoding.ai/app/checkout/tokens`,target:`_blank`,rel:`noreferrer`,children:`Увеличить лимит`}),(0,g.jsx)(`a`,{href:`https://game.aircoding.ai/app/checkout/topup`,target:`_blank`,rel:`noreferrer`,children:`Пополнить баланс`})]}),(0,g.jsxs)(`form`,{onSubmit:k,className:`core-connect-form`,children:[e&&(0,g.jsx)(`h3`,{children:t?.connected?`Ключ подключения`:`Подключи свой аккаунт`}),(0,g.jsxs)(`label`,{children:[`Адрес ядра`,(0,g.jsx)(`input`,{type:`url`,required:!0,placeholder:`https://umgt.aircoding.ai`,value:r,onChange:e=>o(e.target.value),disabled:_})]}),(0,g.jsxs)(`label`,{children:[t?.connected?`Новый ключ UMGT`:`API-ключ UMGT`,(0,g.jsx)(`input`,{type:`password`,required:!0,autoComplete:`off`,placeholder:`umgt_…`,spellCheck:!1,value:u,onChange:e=>d(e.target.value),disabled:_})]}),(0,g.jsx)(`p`,{children:`Ключ передаётся ядру по защищённому соединению и не сохраняется в браузере. Работа AI расходует доступный лимит; генерация 3D оплачивается отдельно с рублёвого баланса по цене сервиса.`}),(0,g.jsx)(i,{tone:`primary`,disabled:_||!u||!r,children:t?.connected?`Заменить ключ`:`Подключить`})]}),(0,g.jsx)(i,{className:`core-account-logout`,type:`button`,disabled:_,onClick:()=>void O(async()=>{await s(`/core/logout`,`POST`,{}),n(void 0),T(void 0),d(``),window.dispatchEvent(new Event(`umgt-account-changed`))}),children:`Выйти из аккаунта Hub`})]})]})}export{w as CoreAccount};