@profoundlogic/coderflow-server 0.7.4 → 0.7.6

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 (179) hide show
  1. package/dist/coder-server.js +1 -1
  2. package/dist/config.js +1 -1
  3. package/dist/lib/agent-keepalive.js +1 -1
  4. package/dist/lib/agent-models.js +1 -1
  5. package/dist/lib/api-keys.js +1 -1
  6. package/dist/lib/apiKeys.js +1 -1
  7. package/dist/lib/app-server-ports.js +1 -1
  8. package/dist/lib/auto-judge.js +1 -1
  9. package/dist/lib/automation-service.js +1 -1
  10. package/dist/lib/basic-auth.js +1 -1
  11. package/dist/lib/bindings.js +1 -1
  12. package/dist/lib/build-history.js +1 -1
  13. package/dist/lib/build-output-service.js +1 -1
  14. package/dist/lib/build-scheduler.js +1 -1
  15. package/dist/lib/build-service.js +1 -1
  16. package/dist/lib/ca-certificates.js +1 -1
  17. package/dist/lib/claude-oauth-refresh.js +1 -1
  18. package/dist/lib/cli/build.js +1 -1
  19. package/dist/lib/cli/cleanup-users.js +1 -1
  20. package/dist/lib/cli/config-command.js +1 -1
  21. package/dist/lib/cli/config.js +1 -1
  22. package/dist/lib/cli/create-user.js +1 -1
  23. package/dist/lib/cli/grant-admin.js +1 -1
  24. package/dist/lib/cli/init.js +1 -1
  25. package/dist/lib/cli/jira.js +1 -1
  26. package/dist/lib/cli/license.js +1 -1
  27. package/dist/lib/cli/list-roles.js +1 -1
  28. package/dist/lib/cli/list-users.js +1 -1
  29. package/dist/lib/cli/server-manager.js +1 -1
  30. package/dist/lib/cli/set-password.js +1 -1
  31. package/dist/lib/config-migration.js +1 -1
  32. package/dist/lib/container-credential-sync.js +1 -1
  33. package/dist/lib/container-tokens.js +1 -1
  34. package/dist/lib/data-dir.js +1 -1
  35. package/dist/lib/deployment-history.js +1 -1
  36. package/dist/lib/deployment-service.js +1 -1
  37. package/dist/lib/docker-utils.js +1 -1
  38. package/dist/lib/email.js +1 -1
  39. package/dist/lib/emailTemplates.js +1 -1
  40. package/dist/lib/entitlement.js +1 -1
  41. package/dist/lib/external-connections.js +1 -1
  42. package/dist/lib/fetch-utils.js +1 -1
  43. package/dist/lib/git-commit-details-route.js +1 -1
  44. package/dist/lib/git-history-diff-guardrails.js +1 -1
  45. package/dist/lib/git-provider-service.js +1 -1
  46. package/dist/lib/git-provider-setup/github-setup-handler.js +1 -1
  47. package/dist/lib/git-provider-setup/index.js +1 -1
  48. package/dist/lib/git-provider-setup/setup-factory.js +1 -1
  49. package/dist/lib/git-provider-setup/setup-interface.js +1 -1
  50. package/dist/lib/git-providers/azure-devops-provider.js +1 -1
  51. package/dist/lib/git-providers/github-app-provider.js +1 -1
  52. package/dist/lib/git-providers/index.js +1 -1
  53. package/dist/lib/git-providers/provider-factory.js +1 -1
  54. package/dist/lib/git-providers/provider-interface.js +1 -1
  55. package/dist/lib/github-urls.js +1 -1
  56. package/dist/lib/group-objective-linking.js +1 -1
  57. package/dist/lib/ibmi-sync.js +1 -1
  58. package/dist/lib/jira-client.js +1 -1
  59. package/dist/lib/judge-blinding.js +1 -1
  60. package/dist/lib/logger.js +1 -1
  61. package/dist/lib/memory-utils.js +1 -1
  62. package/dist/lib/migration-to-scoped-rbac.js +1 -1
  63. package/dist/lib/model-fetcher.js +1 -1
  64. package/dist/lib/notifications.js +1 -1
  65. package/dist/lib/objective-context.js +1 -1
  66. package/dist/lib/oidc-auth.js +1 -1
  67. package/dist/lib/oidc-device-flow.js +1 -1
  68. package/dist/lib/passwordTokens.js +1 -1
  69. package/dist/lib/permission-resolver.js +1 -1
  70. package/dist/lib/pin-cascade.js +1 -1
  71. package/dist/lib/provider-accounts.js +1 -1
  72. package/dist/lib/provider-oauth.js +1 -1
  73. package/dist/lib/provider-profile.js +1 -1
  74. package/dist/lib/provider-token-refresh.js +1 -1
  75. package/dist/lib/rbac-user-state.js +1 -1
  76. package/dist/lib/request-url.js +1 -1
  77. package/dist/lib/rewind.js +1 -1
  78. package/dist/lib/role-definitions.js +1 -1
  79. package/dist/lib/roles.js +1 -1
  80. package/dist/lib/secrets.js +1 -1
  81. package/dist/lib/setup-repo-git-auth.js +1 -1
  82. package/dist/lib/state-capture.js +1 -1
  83. package/dist/lib/static-files.js +1 -1
  84. package/dist/lib/task-aliases.js +1 -1
  85. package/dist/lib/task-name-format.js +1 -1
  86. package/dist/lib/task-name-generator.js +1 -1
  87. package/dist/lib/task-source-metadata.js +1 -1
  88. package/dist/lib/teams.js +1 -1
  89. package/dist/lib/user-git-oauth.js +1 -1
  90. package/dist/lib/user-git-tokens.js +1 -1
  91. package/dist/lib/users.js +1 -1
  92. package/dist/middleware/requireAuth.js +1 -1
  93. package/dist/middleware/requireInit.js +1 -1
  94. package/dist/middleware/requirePermission.js +1 -1
  95. package/dist/package.json +1 -1
  96. package/dist/playwright.config.js +1 -1
  97. package/dist/playwright.task-terminal.config.js +1 -1
  98. package/dist/routes/apiKeys.js +1 -1
  99. package/dist/routes/auth-oidc.js +1 -1
  100. package/dist/routes/auth.js +1 -1
  101. package/dist/routes/automations.js +1 -1
  102. package/dist/routes/bindings.js +1 -1
  103. package/dist/routes/build.js +1 -1
  104. package/dist/routes/containers.js +1 -1
  105. package/dist/routes/deploy-task.js +1 -1
  106. package/dist/routes/environment-management.js +1 -1
  107. package/dist/routes/environments.js +1 -1
  108. package/dist/routes/external-skills.js +1 -1
  109. package/dist/routes/git-credentials.js +1 -1
  110. package/dist/routes/git-oauth.js +1 -1
  111. package/dist/routes/git-provider-setup.js +1 -1
  112. package/dist/routes/health.js +1 -1
  113. package/dist/routes/jira.js +1 -1
  114. package/dist/routes/objective-management.js +1 -1
  115. package/dist/routes/password.js +1 -1
  116. package/dist/routes/prompt.js +1 -1
  117. package/dist/routes/provider-auth.js +1 -1
  118. package/dist/routes/qa.js +1 -1
  119. package/dist/routes/roles.js +1 -1
  120. package/dist/routes/settings.js +1 -1
  121. package/dist/routes/skill-management.js +1 -1
  122. package/dist/routes/skills.js +1 -1
  123. package/dist/routes/tasks.js +1 -1
  124. package/dist/routes/teams.js +1 -1
  125. package/dist/routes/templates.js +1 -1
  126. package/dist/routes/test-task.js +1 -1
  127. package/dist/routes/test.js +1 -1
  128. package/dist/routes/users.js +1 -1
  129. package/dist/routes/visualizations.js +1 -1
  130. package/dist/scripts/create-user.js +1 -1
  131. package/dist/scripts/migrate-config-to-data-dir.js +1 -1
  132. package/dist/shipped-skills/environment-templates/SKILL.md +152 -17
  133. package/dist/start.js +1 -1
  134. package/dist/web-ui/public/activity-detail-modal.js +1 -1
  135. package/dist/web-ui/public/activity-feed.js +1 -1
  136. package/dist/web-ui/public/activity-formatters.js +1 -1
  137. package/dist/web-ui/public/agent-event-parser.js +1 -1
  138. package/dist/web-ui/public/app.js +1 -1
  139. package/dist/web-ui/public/approve-dialog.js +1 -1
  140. package/dist/web-ui/public/automation-links.js +1 -1
  141. package/dist/web-ui/public/automation-schedule.js +1 -1
  142. package/dist/web-ui/public/comments-widget.js +1 -1
  143. package/dist/web-ui/public/diff-utils.js +1 -1
  144. package/dist/web-ui/public/docs/admin/ai-providers.md +5 -5
  145. package/dist/web-ui/public/environments.js +1 -1
  146. package/dist/web-ui/public/feedback-widget.css +21 -5
  147. package/dist/web-ui/public/feedback-widget.js +1 -1
  148. package/dist/web-ui/public/file-selection-tree.js +1 -1
  149. package/dist/web-ui/public/git-history-lazy-utils.js +1 -1
  150. package/dist/web-ui/public/git-history.js +1 -1
  151. package/dist/web-ui/public/git-status.js +1 -1
  152. package/dist/web-ui/public/ibmi-file-filter.js +1 -1
  153. package/dist/web-ui/public/index.html +20 -0
  154. package/dist/web-ui/public/index.js +1 -1
  155. package/dist/web-ui/public/login.js +1 -1
  156. package/dist/web-ui/public/markdown-editor.js +1 -1
  157. package/dist/web-ui/public/markdown-file-editor.js +1 -1
  158. package/dist/web-ui/public/modal-maximize.js +1 -1
  159. package/dist/web-ui/public/notifications.js +1 -1
  160. package/dist/web-ui/public/permissions.js +1 -1
  161. package/dist/web-ui/public/pr-dialog.js +1 -1
  162. package/dist/web-ui/public/roles.js +1 -1
  163. package/dist/web-ui/public/server-health.js +1 -1
  164. package/dist/web-ui/public/settings.html +1 -1
  165. package/dist/web-ui/public/settings.js +1 -1
  166. package/dist/web-ui/public/setup-password.js +1 -1
  167. package/dist/web-ui/public/skills.js +1 -1
  168. package/dist/web-ui/public/sse-client.js +1 -1
  169. package/dist/web-ui/public/sse-shared-worker.js +1 -1
  170. package/dist/web-ui/public/styles.css +25 -0
  171. package/dist/web-ui/public/task-judging-helpers.js +1 -1
  172. package/dist/web-ui/public/task.html +15 -1
  173. package/dist/web-ui/public/task.js +1 -1
  174. package/dist/web-ui/public/teams.js +1 -1
  175. package/dist/web-ui/public/terminal.js +1 -1
  176. package/dist/web-ui/public/theme.js +1 -1
  177. package/dist/web-ui/public/users.js +1 -1
  178. package/dist/web-ui/public/variant-grouping.js +1 -1
  179. package/package.json +1 -1
@@ -1 +1 @@
1
- import{API,Utils,initializeAdminMenu}from'./app.js';import{initTheme,mountThemeToggle}from'./theme.js';const state={'teams':[],'users':[],'roles':[],'environments':[],'teamBindings':[],'currentUser':null,'editingTeamId':null,'bindingsTeamId':null,'deletingTeamId':null,'modalSnapshot':null};document['addEventListener']('DOMContentLoaded',async()=>{initTheme(),mountThemeToggle();try{state['currentUser']=await API['getCurrentUser']();}catch{window['location']['href']='login.html';return;}await initializeAdminMenu(state['currentUser']);const _0xb0c993=state['currentUser'];if(!Permissions['hasServerPermission'](_0xb0c993,'teams:view')&&!Permissions['hasTeamPermission'](_0xb0c993,'teams:manage')){Utils['showToast']('Access\x20denied:\x20You\x20do\x20not\x20have\x20permission\x20to\x20view\x20teams','error'),setTimeout(()=>{window['location']['href']='index.html';},0x7d0);return;}(Permissions['hasServerPermission'](_0xb0c993,'*')||Permissions['hasTeamPermission'](_0xb0c993,'teams:manage'))&&(document['getElementById']('create-team-btn')['hidden']=![]),bindEventListeners(),await Promise['all']([loadTeams(),loadUsers(),loadRoles(),loadEnvironments()]),renderTeams();});async function loadTeams(){const _0x243be5=document['getElementById']('teams-loading'),_0x2f1283=document['getElementById']('teams-error'),_0x1f3a5e=document['getElementById']('teams-content');try{_0x243be5['hidden']=![],_0x2f1283['hidden']=!![],_0x1f3a5e['hidden']=!![];const {teams:_0x4bae23}=await API['getTeams']();state['teams']=_0x4bae23||[],renderTeams(),_0x243be5['hidden']=!![],_0x1f3a5e['hidden']=![];}catch(_0x30d93b){_0x243be5['hidden']=!![],_0x2f1283['hidden']=![],document['getElementById']('teams-error-message')['textContent']=_0x30d93b['message'];}}async function loadUsers(){try{const {users:_0x42aee9}=await API['getUsers']();state['users']=_0x42aee9||[];}catch{state['users']=[];}}async function loadRoles(){try{const {roles:_0xa78fe7}=await API['getRoleDefinitions']();state['roles']=_0xa78fe7||[];}catch{state['roles']=[];}}async function loadEnvironments(){try{const _0x4517a8=await API['getEnvironments']();state['environments']=_0x4517a8['environments']||[];}catch{state['environments']=[];}}function renderTeams(){const _0x56272d=document['getElementById']('teams-table-body'),_0x5bf8f4=document['getElementById']('team-count');if(!_0x56272d)return;_0x5bf8f4&&(_0x5bf8f4['textContent']=state['teams']['length']+'\x20team'+(state['teams']['length']===0x1?'':'s'));if(state['teams']['length']===0x0){_0x56272d['innerHTML']='\x0a\x20\x20\x20\x20\x20\x20<tr>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<td\x20colspan=\x223\x22\x20style=\x22text-align:\x20center;\x20color:\x20var(--color-text-secondary);\x20padding:\x202rem;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20No\x20teams\x20yet.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(Permissions['hasServerPermission'](state['currentUser'],'*')||Permissions['hasTeamPermission'](state['currentUser'],'teams:manage')?'Click\x20<strong>Create\x20Team</strong>\x20to\x20get\x20started.':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20</tr>';return;}const _0x3f3ef9=Permissions['hasServerPermission'](state['currentUser'],'*');_0x56272d['innerHTML']=state['teams']['map'](_0x2e1b85=>{const _0x4da67f=_0x3f3ef9||_0x2e1b85['canManageTeam'],_0x40960c=_0x3f3ef9||_0x2e1b85['canManageMembers'],_0x433747=_0x4da67f||_0x40960c,_0x4c5b2e=(_0x2e1b85['members']||[])['length'];return'\x0a\x20\x20\x20\x20\x20\x20<tr>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-weight:\x20600;\x22>'+Utils['escapeHtml'](_0x2e1b85['name'])+'</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x2e1b85['description']?'<div\x20style=\x22font-size:\x200.8em;\x20color:\x20var(--color-text-secondary);\x20margin-top:\x200.15rem;\x22>'+Utils['escapeHtml'](_0x2e1b85['description'])+'</div>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<td>'+_0x4c5b2e+'</td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22user-actions\x22\x20style=\x22display:\x20flex;\x20gap:\x200.25rem;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x433747?'<button\x20class=\x22btn-icon\x22\x20title=\x22Edit\x20team\x22\x20onclick=\x22window.openTeamModal(\x27'+_0x2e1b85['id']+'\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2216\x22\x20height=\x2216\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M11\x204H4a2\x202\x200\x200\x200-2\x202v14a2\x202\x200\x200\x200\x202\x202h14a2\x202\x200\x200\x200\x202-2v-7\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M18.5\x202.5a2.121\x202.121\x200\x200\x201\x203\x203L12\x2015l-4\x201\x201-4\x209.5-9.5z\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x4da67f?'<button\x20class=\x22btn-icon\x22\x20title=\x22Access\x20bindings\x22\x20onclick=\x22window.openBindingsModal(\x27'+_0x2e1b85['id']+'\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2216\x22\x20height=\x2216\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M12\x2022s8-4\x208-10V5l-8-3-8\x203v7c0\x206\x208\x2010\x208\x2010z\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x4da67f?'<button\x20class=\x22btn-icon\x20btn-danger\x22\x20title=\x22Delete\x20team\x22\x20onclick=\x22window.deleteTeam(\x27'+_0x2e1b85['id']+'\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2216\x22\x20height=\x2216\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<polyline\x20points=\x223\x206\x205\x206\x2021\x206\x22></polyline>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M19\x206v14a2\x202\x200\x200\x201-2\x202H7a2\x202\x200\x200\x201-2-2V6m3\x200V4a2\x202\x200\x200\x201\x202-2h4a2\x202\x200\x200\x201\x202\x202v2\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20</tr>';})['join']('');}function bindEventListeners(){document['getElementById']('create-team-btn')?.['addEventListener']('click',showCreateTeamModal),document['getElementById']('retry-teams-btn')?.['addEventListener']('click',loadTeams),document['getElementById']('close-team-modal')?.['addEventListener']('click',requestHideTeamModal),document['getElementById']('cancel-team')?.['addEventListener']('click',requestHideTeamModal),document['getElementById']('save-team')?.['addEventListener']('click',saveTeam),document['querySelector']('#team-modal\x20.modal-overlay')?.['addEventListener']('click',requestHideTeamModal),document['getElementById']('add-member-btn')?.['addEventListener']('click',addMember),document['getElementById']('close-bindings-modal')?.['addEventListener']('click',hideBindingsModal),document['querySelector']('#bindings-modal\x20.modal-overlay')?.['addEventListener']('click',hideBindingsModal),document['getElementById']('add-binding-btn')?.['addEventListener']('click',()=>{document['getElementById']('add-binding-form')['hidden']=![],document['getElementById']('add-binding-btn')['hidden']=!![],populateBindingForm();}),document['getElementById']('cancel-binding-btn')?.['addEventListener']('click',()=>{document['getElementById']('add-binding-form')['hidden']=!![],document['getElementById']('add-binding-btn')['hidden']=![];}),document['getElementById']('save-binding-btn')?.['addEventListener']('click',saveBinding),document['getElementById']('binding-resource-type')?.['addEventListener']('change',onBindingResourceTypeChange),document['getElementById']('close-delete-team-modal')?.['addEventListener']('click',hideDeleteModal),document['getElementById']('cancel-delete-team')?.['addEventListener']('click',hideDeleteModal),document['getElementById']('confirm-delete-team')?.['addEventListener']('click',confirmDeleteTeam),document['querySelector']('#delete-team-modal\x20.modal-overlay')?.['addEventListener']('click',hideDeleteModal);}function showCreateTeamModal(){state['editingTeamId']=null,state['modalSnapshot']={'name':'','description':''},document['getElementById']('team-modal-title')['textContent']='Create\x20Team',document['getElementById']('team-name')['value']='',document['getElementById']('team-name')['disabled']=![],document['getElementById']('team-description')['value']='',document['getElementById']('team-description')['disabled']=![],document['getElementById']('team-form-error')['hidden']=!![],document['getElementById']('members-section')['hidden']=!![],document['getElementById']('save-team')['hidden']=![],document['getElementById']('team-modal-footer')['hidden']=![],document['getElementById']('team-modal')['hidden']=![],setTimeout(()=>document['getElementById']('team-name')['focus'](),0x64);}window['openTeamModal']=function(_0x1e6a99){const _0x386b83=state['teams']['find'](_0x6c64b6=>_0x6c64b6['id']===_0x1e6a99);if(!_0x386b83)return;state['editingTeamId']=_0x1e6a99;const _0x2d9cf0=Permissions['hasServerPermission'](state['currentUser'],'*'),_0x3f1970=_0x2d9cf0||_0x386b83['canManageTeam'],_0x4748e6=_0x2d9cf0||_0x386b83['canManageMembers'],_0x50256c=_0x3f1970,_0x564277=_0x3f1970||_0x4748e6,_0x4ae92e=_0x386b83['name'],_0x3ff8ac=_0x386b83['description']||'';state['modalSnapshot']={'name':_0x4ae92e,'description':_0x3ff8ac},document['getElementById']('team-modal-title')['textContent']=_0x4ae92e,document['getElementById']('team-name')['value']=_0x4ae92e,document['getElementById']('team-name')['disabled']=!_0x50256c,document['getElementById']('team-description')['value']=_0x3ff8ac,document['getElementById']('team-description')['disabled']=!_0x50256c,document['getElementById']('team-form-error')['hidden']=!![],document['getElementById']('members-section')['hidden']=![],document['getElementById']('save-team')['hidden']=!_0x50256c,renderMembersList(_0x386b83),updateMemberSelect(_0x386b83),document['getElementById']('team-modal')['hidden']=![];};function isTeamModalDirty(){if(!state['modalSnapshot'])return![];const _0x815ae1=document['getElementById']('team-name')['value']['trim'](),_0xac7b19=document['getElementById']('team-description')['value']['trim']();return _0x815ae1!==state['modalSnapshot']['name']||_0xac7b19!==state['modalSnapshot']['description'];}function requestHideTeamModal(){if(isTeamModalDirty()){if(!confirm('You\x20have\x20unsaved\x20changes.\x20Discard\x20them?'))return;}hideTeamModal();}function hideTeamModal(){document['getElementById']('team-modal')['hidden']=!![],document['getElementById']('team-name')['disabled']=![],document['getElementById']('team-description')['disabled']=![],state['editingTeamId']=null,state['modalSnapshot']=null;}window['openBindingsModal']=function(_0x38aae1){const _0x3fff22=state['teams']['find'](_0x51796e=>_0x51796e['id']===_0x38aae1);if(!_0x3fff22)return;state['bindingsTeamId']=_0x38aae1,document['getElementById']('bindings-modal-title')['textContent']='Access\x20Bindings\x20—\x20'+_0x3fff22['name'],document['getElementById']('add-binding-form')['hidden']=!![],document['getElementById']('bindings-modal')['hidden']=![],loadTeamBindings(_0x38aae1);};function hideBindingsModal(){document['getElementById']('bindings-modal')['hidden']=!![],state['bindingsTeamId']=null;}function renderMembersList(_0x1e4359){const _0x587774=Permissions['hasServerPermission'](state['currentUser'],'*'),_0x460a64=_0x587774||_0x1e4359['canManageMembers']||_0x1e4359['canManageTeam'],_0x499ff0=_0x1e4359['members']||[],_0x133423=document['getElementById']('members-list');if(_0x499ff0['length']===0x0){_0x133423['innerHTML']='<p\x20style=\x22font-size:\x200.875rem;\x20color:\x20var(--color-text-secondary);\x20margin:\x200.25rem\x200;\x22>No\x20members\x20yet</p>';return;}_0x133423['innerHTML']=_0x499ff0['map'](_0x37915d=>{const _0x4c1ef3=state['users']['find'](_0x3e3279=>_0x3e3279['id']===_0x37915d),_0x503e08=_0x4c1ef3?''+Utils['escapeHtml'](_0x4c1ef3['username'])+(_0x4c1ef3['name']?'\x20<span\x20style=\x22color:\x20var(--color-text-secondary);\x20font-size:\x200.85em;\x22>('+Utils['escapeHtml'](_0x4c1ef3['name'])+')</span>':''):Utils['escapeHtml'](_0x37915d);return'\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:\x20flex;\x20align-items:\x20center;\x20justify-content:\x20space-between;\x20padding:\x200.35rem\x200;\x20border-bottom:\x201px\x20solid\x20var(--color-border);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:\x200.875rem;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x503e08+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x460a64?'<button\x20type=\x22button\x22\x20class=\x22btn-ghost\x20btn-small\x22\x20onclick=\x22window.removeMemberClick(\x27'+_0x37915d+'\x27)\x22\x20style=\x22color:\x20var(--color-danger);\x20padding:\x200.15rem\x200.4rem;\x20font-size:\x200.8rem;\x22>Remove</button>':'')+'\x0a\x20\x20\x20\x20\x20\x20</div>';})['join']('');const _0x4c48dd=document['getElementById']('add-member-row');if(_0x4c48dd)_0x4c48dd['style']['display']=_0x460a64?'flex':'none';}function updateMemberSelect(_0x332246){const _0x4821e5=document['getElementById']('add-member-select');if(!_0x4821e5)return;const _0x401e83=new Set(_0x332246['members']||[]),_0x1641b7=state['users']['filter'](_0x445d95=>!_0x401e83['has'](_0x445d95['id']));_0x4821e5['innerHTML']='<option\x20value=\x22\x22>Add\x20a\x20member…</option>'+_0x1641b7['map'](_0x16e446=>'<option\x20value=\x22'+_0x16e446['id']+'\x22>'+Utils['escapeHtml'](_0x16e446['username'])+(_0x16e446['name']?'\x20('+Utils['escapeHtml'](_0x16e446['name'])+')':'')+'</option>')['join']('');}async function addMember(){const _0xe6ca90=document['getElementById']('add-member-select'),_0x233046=_0xe6ca90['value'];if(!_0x233046||!state['editingTeamId'])return;try{const {team:_0x2064f3}=await API['addTeamMember'](state['editingTeamId'],_0x233046);syncTeamInState(_0x2064f3),renderMembersList(_0x2064f3),updateMemberSelect(_0x2064f3),_0xe6ca90['value']='',Utils['showToast']('Member\x20added','success');}catch(_0x9f98fc){Utils['showToast'](_0x9f98fc['message'],'error');}}window['removeMemberClick']=async function(_0x22eb25){if(!state['editingTeamId'])return;try{const {team:_0x386b93}=await API['removeTeamMember'](state['editingTeamId'],_0x22eb25);syncTeamInState(_0x386b93),renderMembersList(_0x386b93),updateMemberSelect(_0x386b93),Utils['showToast']('Member\x20removed','success');}catch(_0x4e76df){Utils['showToast'](_0x4e76df['message'],'error');}};async function loadTeamBindings(_0x545e88){const _0x16f974=document['getElementById']('bindings-loading'),_0x377b08=document['getElementById']('bindings-empty'),_0x385d1e=document['getElementById']('bindings-list-container'),_0x484136=document['getElementById']('add-binding-btn');_0x16f974['hidden']=![],_0x377b08['hidden']=!![],_0x385d1e['style']['display']='none',_0x484136['hidden']=!![],document['getElementById']('add-binding-form')['hidden']=!![];try{const {bindings:_0xdc7f12}=await API['getBindings']({'subject_type':'team','subject_id':_0x545e88});state['teamBindings']=_0xdc7f12||[],_0x16f974['hidden']=!![],state['teamBindings']['length']===0x0?_0x377b08['hidden']=![]:(_0x385d1e['style']['display']='',renderBindingsTable()),(Permissions['hasServerPermission'](state['currentUser'],'*')||Permissions['hasTeamPermission'](state['currentUser'],'teams:manage'))&&(_0x484136['hidden']=![]);}catch(_0x2c370b){_0x16f974['hidden']=!![],Utils['showToast']('Failed\x20to\x20load\x20bindings:\x20'+_0x2c370b['message'],'error');}}function renderBindingsTable(){const _0x4db84c=document['getElementById']('bindings-table-body');if(!_0x4db84c)return;const _0x36905d=Permissions['hasServerPermission'](state['currentUser'],'*')||Permissions['hasTeamPermission'](state['currentUser'],'teams:manage');_0x4db84c['innerHTML']=state['teamBindings']['map'](_0x27f271=>{const _0x3820df=_0x27f271['resource_type']==='server'?'Server':_0x27f271['resource_id']==='*'?'All\x20'+_0x27f271['resource_type']+'s':Utils['escapeHtml'](_0x27f271['resource_name']||_0x27f271['resource_id']||'');return'\x0a\x20\x20\x20\x20<tr>\x0a\x20\x20\x20\x20\x20\x20<td>'+_0x3820df+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>'+Utils['escapeHtml'](_0x27f271['role_name']||_0x27f271['role_id'])+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x36905d?'<button\x20class=\x22btn-ghost\x20btn-small\x22\x20onclick=\x22window.deleteBindingClick(\x27'+_0x27f271['id']+'\x27)\x22\x20style=\x22color:\x20var(--color-danger);\x22>Remove</button>':'—')+'\x0a\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20</tr>';})['join']('');}function populateBindingForm(){const _0x2a8ad7=document['getElementById']('binding-resource-type');_0x2a8ad7['value']='environment',updateBindingFormForResourceType('environment');}function onBindingResourceTypeChange(){const _0xca0ee6=document['getElementById']('binding-resource-type')['value'];updateBindingFormForResourceType(_0xca0ee6);}function updateBindingFormForResourceType(_0x3fb7b5){const _0x49fa80=document['getElementById']('binding-resource-container'),_0x2f1b87=document['getElementById']('binding-resource'),_0x4a9ca4=document['getElementById']('binding-role');if(_0x3fb7b5==='server')_0x49fa80['style']['display']='none';else{_0x49fa80['style']['display']='';if(_0x3fb7b5==='environment'){const _0x2e911a=new Set(state['teamBindings']['filter'](_0x43a9f5=>_0x43a9f5['resource_type']==='environment')['map'](_0x3bf684=>_0x3bf684['resource_id'])),_0x108385=state['environments']['filter'](_0x363cec=>!_0x2e911a['has'](_0x363cec['name']));_0x2f1b87['innerHTML']=_0x108385['length']?_0x108385['map'](_0x57b69f=>'<option\x20value=\x22'+Utils['escapeHtml'](_0x57b69f['name'])+'\x22>'+Utils['escapeHtml'](_0x57b69f['name'])+'</option>')['join'](''):'<option\x20value=\x22\x22>All\x20environments\x20already\x20bound</option>';}else{if(_0x3fb7b5==='team'){const _0x1674db=new Set(state['teamBindings']['filter'](_0x3d4c7f=>_0x3d4c7f['resource_type']==='team')['map'](_0x56c121=>_0x56c121['resource_id'])),_0x1efa4e=state['teams']['filter'](_0x52afde=>!_0x1674db['has'](_0x52afde['id']));_0x2f1b87['innerHTML']=_0x1efa4e['length']?_0x1efa4e['map'](_0x1c380e=>'<option\x20value=\x22'+_0x1c380e['id']+'\x22>'+Utils['escapeHtml'](_0x1c380e['name'])+'</option>')['join'](''):'<option\x20value=\x22\x22>All\x20teams\x20already\x20bound</option>';}}}const _0x3ebcc4=state['roles']['filter'](_0x2b675d=>_0x2b675d['resource_type']===_0x3fb7b5);_0x4a9ca4['innerHTML']=_0x3ebcc4['length']?_0x3ebcc4['filter'](_0x4c5b36=>{const _0x1a85d2=_0x3fb7b5==='server'?undefined:_0x2f1b87['value'];return!state['teamBindings']['some'](_0xe2cc68=>_0xe2cc68['resource_type']===_0x3fb7b5&&_0xe2cc68['role_id']===_0x4c5b36['id']&&(_0x3fb7b5==='server'||_0xe2cc68['resource_id']===_0x1a85d2));})['map'](_0x206bf8=>'<option\x20value=\x22'+_0x206bf8['id']+'\x22>'+Utils['escapeHtml'](_0x206bf8['name'])+'</option>')['join']('')||'<option\x20value=\x22\x22>No\x20available\x20roles</option>':'<option\x20value=\x22\x22>No\x20roles\x20for\x20this\x20resource\x20type</option>';}async function saveBinding(){const _0x567a2e=document['getElementById']('binding-resource-type')['value'],_0x129415=document['getElementById']('binding-role')['value'];if(!_0x129415||!state['bindingsTeamId'])return;const _0x4c07b0=_0x567a2e==='server'?undefined:document['getElementById']('binding-resource')['value'];if(_0x567a2e!=='server'&&!_0x4c07b0)return;const _0x5c48f3=document['getElementById']('save-binding-btn');_0x5c48f3['disabled']=!![],_0x5c48f3['textContent']='Adding…';try{const _0x1b8ff2={'subject_type':'team','subject_id':state['bindingsTeamId'],'role_id':_0x129415,'resource_type':_0x567a2e};if(_0x4c07b0)_0x1b8ff2['resource_id']=_0x4c07b0;await API['createBinding'](_0x1b8ff2),Utils['showToast']('Binding\x20added','success'),document['getElementById']('add-binding-form')['hidden']=!![],document['getElementById']('add-binding-btn')['hidden']=![],await loadTeamBindings(state['bindingsTeamId']);}catch(_0x146000){Utils['showToast'](_0x146000['message'],'error');}finally{_0x5c48f3['disabled']=![],_0x5c48f3['textContent']='Add\x20Binding';}}window['deleteBindingClick']=async function(_0x5732e8){try{await API['deleteBinding'](_0x5732e8),Utils['showToast']('Binding\x20removed','success'),await loadTeamBindings(state['bindingsTeamId']);}catch(_0x15c882){Utils['showToast'](_0x15c882['message'],'error');}};async function saveTeam(){const _0x352621=document['getElementById']('team-name')['value']['trim'](),_0x45ecca=document['getElementById']('team-description')['value']['trim'](),_0x48ae53=document['getElementById']('team-form-error'),_0x700f3b=document['getElementById']('save-team');if(!_0x352621){_0x48ae53['textContent']='Team\x20name\x20is\x20required',_0x48ae53['hidden']=![];return;}_0x48ae53['hidden']=!![];const _0x433abb=_0x700f3b['textContent'];_0x700f3b['disabled']=!![],_0x700f3b['textContent']=state['editingTeamId']?'Saving…':'Creating…';try{if(state['editingTeamId']){const {team:_0x2807dc}=await API['updateTeam'](state['editingTeamId'],{'name':_0x352621,'description':_0x45ecca});syncTeamInState(_0x2807dc),document['getElementById']('team-modal-title')['textContent']=_0x2807dc['name'],Utils['showToast']('Team\x20updated','success');}else await API['createTeam']({'name':_0x352621,'description':_0x45ecca}),Utils['showToast']('Team\x20created','success');_0x700f3b['disabled']=![],_0x700f3b['textContent']=_0x433abb,hideTeamModal(),await loadTeams();}catch(_0x3e1a0d){_0x48ae53['textContent']=_0x3e1a0d['message'],_0x48ae53['hidden']=![],_0x700f3b['disabled']=![],_0x700f3b['textContent']=_0x433abb;}}window['deleteTeam']=function(_0x585ae2){const _0x5af856=state['teams']['find'](_0x32bbc0=>_0x32bbc0['id']===_0x585ae2);if(!_0x5af856)return;state['deletingTeamId']=_0x585ae2,document['getElementById']('delete-team-name')['textContent']=_0x5af856['name'],document['getElementById']('delete-team-modal')['hidden']=![];};function hideDeleteModal(){document['getElementById']('delete-team-modal')['hidden']=!![],state['deletingTeamId']=null;}async function confirmDeleteTeam(){if(!state['deletingTeamId'])return;const _0x27bb46=document['getElementById']('confirm-delete-team');_0x27bb46['disabled']=!![],_0x27bb46['textContent']='Deleting…';try{await API['deleteTeam'](state['deletingTeamId']),Utils['showToast']('Team\x20deleted','success'),_0x27bb46['disabled']=![],_0x27bb46['textContent']='Delete\x20Team',hideDeleteModal(),await loadTeams();}catch(_0x3b2c8){Utils['showToast']('Failed\x20to\x20delete\x20team:\x20'+_0x3b2c8['message'],'error'),_0x27bb46['disabled']=![],_0x27bb46['textContent']='Delete\x20Team';}}function syncTeamInState(_0x4fe97a){const _0x837d0a=state['teams']['findIndex'](_0x578402=>_0x578402['id']===_0x4fe97a['id']);if(_0x837d0a>=0x0)state['teams'][_0x837d0a]=_0x4fe97a;renderTeams();}
1
+ import{API,Utils,initializeAdminMenu}from'./app.js';import{initTheme,mountThemeToggle}from'./theme.js';const state={'teams':[],'users':[],'roles':[],'environments':[],'teamBindings':[],'currentUser':null,'editingTeamId':null,'bindingsTeamId':null,'deletingTeamId':null,'modalSnapshot':null};document['addEventListener']('DOMContentLoaded',async()=>{initTheme(),mountThemeToggle();try{state['currentUser']=await API['getCurrentUser']();}catch{window['location']['href']='login.html';return;}await initializeAdminMenu(state['currentUser']);const _0x588e0f=state['currentUser'];if(!Permissions['hasServerPermission'](_0x588e0f,'teams:view')&&!Permissions['hasTeamPermission'](_0x588e0f,'teams:manage')){Utils['showToast']('Access\x20denied:\x20You\x20do\x20not\x20have\x20permission\x20to\x20view\x20teams','error'),setTimeout(()=>{window['location']['href']='index.html';},0x7d0);return;}(Permissions['hasServerPermission'](_0x588e0f,'*')||Permissions['hasTeamPermission'](_0x588e0f,'teams:manage'))&&(document['getElementById']('create-team-btn')['hidden']=![]),bindEventListeners(),await Promise['all']([loadTeams(),loadUsers(),loadRoles(),loadEnvironments()]),renderTeams();});async function loadTeams(){const _0x4354fc=document['getElementById']('teams-loading'),_0x660b2=document['getElementById']('teams-error'),_0x543872=document['getElementById']('teams-content');try{_0x4354fc['hidden']=![],_0x660b2['hidden']=!![],_0x543872['hidden']=!![];const {teams:_0x154b45}=await API['getTeams']();state['teams']=_0x154b45||[],renderTeams(),_0x4354fc['hidden']=!![],_0x543872['hidden']=![];}catch(_0x3c8fc7){_0x4354fc['hidden']=!![],_0x660b2['hidden']=![],document['getElementById']('teams-error-message')['textContent']=_0x3c8fc7['message'];}}async function loadUsers(){try{const {users:_0x4378bd}=await API['getUsers']();state['users']=_0x4378bd||[];}catch{state['users']=[];}}async function loadRoles(){try{const {roles:_0x4675da}=await API['getRoleDefinitions']();state['roles']=_0x4675da||[];}catch{state['roles']=[];}}async function loadEnvironments(){try{const _0x2828ec=await API['getEnvironments']();state['environments']=_0x2828ec['environments']||[];}catch{state['environments']=[];}}function renderTeams(){const _0x48e64d=document['getElementById']('teams-table-body'),_0x5ea677=document['getElementById']('team-count');if(!_0x48e64d)return;_0x5ea677&&(_0x5ea677['textContent']=state['teams']['length']+'\x20team'+(state['teams']['length']===0x1?'':'s'));if(state['teams']['length']===0x0){_0x48e64d['innerHTML']='\x0a\x20\x20\x20\x20\x20\x20<tr>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<td\x20colspan=\x223\x22\x20style=\x22text-align:\x20center;\x20color:\x20var(--color-text-secondary);\x20padding:\x202rem;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20No\x20teams\x20yet.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(Permissions['hasServerPermission'](state['currentUser'],'*')||Permissions['hasTeamPermission'](state['currentUser'],'teams:manage')?'Click\x20<strong>Create\x20Team</strong>\x20to\x20get\x20started.':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20</tr>';return;}const _0x258f9d=Permissions['hasServerPermission'](state['currentUser'],'*');_0x48e64d['innerHTML']=state['teams']['map'](_0x236cb8=>{const _0x16fb16=_0x258f9d||_0x236cb8['canManageTeam'],_0x20913d=_0x258f9d||_0x236cb8['canManageMembers'],_0x3a9f75=_0x16fb16||_0x20913d,_0xcd5438=(_0x236cb8['members']||[])['length'];return'\x0a\x20\x20\x20\x20\x20\x20<tr>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-weight:\x20600;\x22>'+Utils['escapeHtml'](_0x236cb8['name'])+'</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x236cb8['description']?'<div\x20style=\x22font-size:\x200.8em;\x20color:\x20var(--color-text-secondary);\x20margin-top:\x200.15rem;\x22>'+Utils['escapeHtml'](_0x236cb8['description'])+'</div>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<td>'+_0xcd5438+'</td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22user-actions\x22\x20style=\x22display:\x20flex;\x20gap:\x200.25rem;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x3a9f75?'<button\x20class=\x22btn-icon\x22\x20title=\x22Edit\x20team\x22\x20onclick=\x22window.openTeamModal(\x27'+_0x236cb8['id']+'\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2216\x22\x20height=\x2216\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M11\x204H4a2\x202\x200\x200\x200-2\x202v14a2\x202\x200\x200\x200\x202\x202h14a2\x202\x200\x200\x200\x202-2v-7\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M18.5\x202.5a2.121\x202.121\x200\x200\x201\x203\x203L12\x2015l-4\x201\x201-4\x209.5-9.5z\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x16fb16?'<button\x20class=\x22btn-icon\x22\x20title=\x22Access\x20bindings\x22\x20onclick=\x22window.openBindingsModal(\x27'+_0x236cb8['id']+'\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2216\x22\x20height=\x2216\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M12\x2022s8-4\x208-10V5l-8-3-8\x203v7c0\x206\x208\x2010\x208\x2010z\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x16fb16?'<button\x20class=\x22btn-icon\x20btn-danger\x22\x20title=\x22Delete\x20team\x22\x20onclick=\x22window.deleteTeam(\x27'+_0x236cb8['id']+'\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2216\x22\x20height=\x2216\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<polyline\x20points=\x223\x206\x205\x206\x2021\x206\x22></polyline>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M19\x206v14a2\x202\x200\x200\x201-2\x202H7a2\x202\x200\x200\x201-2-2V6m3\x200V4a2\x202\x200\x200\x201\x202-2h4a2\x202\x200\x200\x201\x202\x202v2\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20</tr>';})['join']('');}function bindEventListeners(){document['getElementById']('create-team-btn')?.['addEventListener']('click',showCreateTeamModal),document['getElementById']('retry-teams-btn')?.['addEventListener']('click',loadTeams),document['getElementById']('close-team-modal')?.['addEventListener']('click',requestHideTeamModal),document['getElementById']('cancel-team')?.['addEventListener']('click',requestHideTeamModal),document['getElementById']('save-team')?.['addEventListener']('click',saveTeam),document['querySelector']('#team-modal\x20.modal-overlay')?.['addEventListener']('click',requestHideTeamModal),document['getElementById']('add-member-btn')?.['addEventListener']('click',addMember),document['getElementById']('close-bindings-modal')?.['addEventListener']('click',hideBindingsModal),document['querySelector']('#bindings-modal\x20.modal-overlay')?.['addEventListener']('click',hideBindingsModal),document['getElementById']('add-binding-btn')?.['addEventListener']('click',()=>{document['getElementById']('add-binding-form')['hidden']=![],document['getElementById']('add-binding-btn')['hidden']=!![],populateBindingForm();}),document['getElementById']('cancel-binding-btn')?.['addEventListener']('click',()=>{document['getElementById']('add-binding-form')['hidden']=!![],document['getElementById']('add-binding-btn')['hidden']=![];}),document['getElementById']('save-binding-btn')?.['addEventListener']('click',saveBinding),document['getElementById']('binding-resource-type')?.['addEventListener']('change',onBindingResourceTypeChange),document['getElementById']('close-delete-team-modal')?.['addEventListener']('click',hideDeleteModal),document['getElementById']('cancel-delete-team')?.['addEventListener']('click',hideDeleteModal),document['getElementById']('confirm-delete-team')?.['addEventListener']('click',confirmDeleteTeam),document['querySelector']('#delete-team-modal\x20.modal-overlay')?.['addEventListener']('click',hideDeleteModal);}function showCreateTeamModal(){state['editingTeamId']=null,state['modalSnapshot']={'name':'','description':''},document['getElementById']('team-modal-title')['textContent']='Create\x20Team',document['getElementById']('team-name')['value']='',document['getElementById']('team-name')['disabled']=![],document['getElementById']('team-description')['value']='',document['getElementById']('team-description')['disabled']=![],document['getElementById']('team-form-error')['hidden']=!![],document['getElementById']('members-section')['hidden']=!![],document['getElementById']('save-team')['hidden']=![],document['getElementById']('team-modal-footer')['hidden']=![],document['getElementById']('team-modal')['hidden']=![],setTimeout(()=>document['getElementById']('team-name')['focus'](),0x64);}window['openTeamModal']=function(_0x3ed370){const _0x2ba4d8=state['teams']['find'](_0xf0da12=>_0xf0da12['id']===_0x3ed370);if(!_0x2ba4d8)return;state['editingTeamId']=_0x3ed370;const _0x3077ec=Permissions['hasServerPermission'](state['currentUser'],'*'),_0x431967=_0x3077ec||_0x2ba4d8['canManageTeam'],_0x4c30ca=_0x3077ec||_0x2ba4d8['canManageMembers'],_0x26a962=_0x431967,_0x16f351=_0x431967||_0x4c30ca,_0x463ad9=_0x2ba4d8['name'],_0x10c5fa=_0x2ba4d8['description']||'';state['modalSnapshot']={'name':_0x463ad9,'description':_0x10c5fa},document['getElementById']('team-modal-title')['textContent']=_0x463ad9,document['getElementById']('team-name')['value']=_0x463ad9,document['getElementById']('team-name')['disabled']=!_0x26a962,document['getElementById']('team-description')['value']=_0x10c5fa,document['getElementById']('team-description')['disabled']=!_0x26a962,document['getElementById']('team-form-error')['hidden']=!![],document['getElementById']('members-section')['hidden']=![],document['getElementById']('save-team')['hidden']=!_0x26a962,renderMembersList(_0x2ba4d8),updateMemberSelect(_0x2ba4d8),document['getElementById']('team-modal')['hidden']=![];};function isTeamModalDirty(){if(!state['modalSnapshot'])return![];const _0x608891=document['getElementById']('team-name')['value']['trim'](),_0x3bdd75=document['getElementById']('team-description')['value']['trim']();return _0x608891!==state['modalSnapshot']['name']||_0x3bdd75!==state['modalSnapshot']['description'];}function requestHideTeamModal(){if(isTeamModalDirty()){if(!confirm('You\x20have\x20unsaved\x20changes.\x20Discard\x20them?'))return;}hideTeamModal();}function hideTeamModal(){document['getElementById']('team-modal')['hidden']=!![],document['getElementById']('team-name')['disabled']=![],document['getElementById']('team-description')['disabled']=![],state['editingTeamId']=null,state['modalSnapshot']=null;}window['openBindingsModal']=function(_0x4c9408){const _0x3da254=state['teams']['find'](_0x3ffa53=>_0x3ffa53['id']===_0x4c9408);if(!_0x3da254)return;state['bindingsTeamId']=_0x4c9408,document['getElementById']('bindings-modal-title')['textContent']='Access\x20Bindings\x20—\x20'+_0x3da254['name'],document['getElementById']('add-binding-form')['hidden']=!![],document['getElementById']('bindings-modal')['hidden']=![],loadTeamBindings(_0x4c9408);};function hideBindingsModal(){document['getElementById']('bindings-modal')['hidden']=!![],state['bindingsTeamId']=null;}function renderMembersList(_0x31b0a4){const _0x553318=Permissions['hasServerPermission'](state['currentUser'],'*'),_0x12d233=_0x553318||_0x31b0a4['canManageMembers']||_0x31b0a4['canManageTeam'],_0x526604=_0x31b0a4['members']||[],_0x753e4d=document['getElementById']('members-list');if(_0x526604['length']===0x0){_0x753e4d['innerHTML']='<p\x20style=\x22font-size:\x200.875rem;\x20color:\x20var(--color-text-secondary);\x20margin:\x200.25rem\x200;\x22>No\x20members\x20yet</p>';return;}_0x753e4d['innerHTML']=_0x526604['map'](_0x416969=>{const _0x9e59=state['users']['find'](_0x15142f=>_0x15142f['id']===_0x416969),_0x5e804e=_0x9e59?''+Utils['escapeHtml'](_0x9e59['username'])+(_0x9e59['name']?'\x20<span\x20style=\x22color:\x20var(--color-text-secondary);\x20font-size:\x200.85em;\x22>('+Utils['escapeHtml'](_0x9e59['name'])+')</span>':''):Utils['escapeHtml'](_0x416969);return'\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:\x20flex;\x20align-items:\x20center;\x20justify-content:\x20space-between;\x20padding:\x200.35rem\x200;\x20border-bottom:\x201px\x20solid\x20var(--color-border);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:\x200.875rem;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x5e804e+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x12d233?'<button\x20type=\x22button\x22\x20class=\x22btn-ghost\x20btn-small\x22\x20onclick=\x22window.removeMemberClick(\x27'+_0x416969+'\x27)\x22\x20style=\x22color:\x20var(--color-danger);\x20padding:\x200.15rem\x200.4rem;\x20font-size:\x200.8rem;\x22>Remove</button>':'')+'\x0a\x20\x20\x20\x20\x20\x20</div>';})['join']('');const _0xdf91c9=document['getElementById']('add-member-row');if(_0xdf91c9)_0xdf91c9['style']['display']=_0x12d233?'flex':'none';}function updateMemberSelect(_0x2bbcb2){const _0x26dbe0=document['getElementById']('add-member-select');if(!_0x26dbe0)return;const _0x4944d0=new Set(_0x2bbcb2['members']||[]),_0x341df7=state['users']['filter'](_0xb44c5a=>!_0x4944d0['has'](_0xb44c5a['id']));_0x26dbe0['innerHTML']='<option\x20value=\x22\x22>Add\x20a\x20member…</option>'+_0x341df7['map'](_0x15707c=>'<option\x20value=\x22'+_0x15707c['id']+'\x22>'+Utils['escapeHtml'](_0x15707c['username'])+(_0x15707c['name']?'\x20('+Utils['escapeHtml'](_0x15707c['name'])+')':'')+'</option>')['join']('');}async function addMember(){const _0x4c02c5=document['getElementById']('add-member-select'),_0x8597d1=_0x4c02c5['value'];if(!_0x8597d1||!state['editingTeamId'])return;try{const {team:_0x33f163}=await API['addTeamMember'](state['editingTeamId'],_0x8597d1);syncTeamInState(_0x33f163),renderMembersList(_0x33f163),updateMemberSelect(_0x33f163),_0x4c02c5['value']='',Utils['showToast']('Member\x20added','success');}catch(_0x4f6b15){Utils['showToast'](_0x4f6b15['message'],'error');}}window['removeMemberClick']=async function(_0x384ad8){if(!state['editingTeamId'])return;try{const {team:_0x245652}=await API['removeTeamMember'](state['editingTeamId'],_0x384ad8);syncTeamInState(_0x245652),renderMembersList(_0x245652),updateMemberSelect(_0x245652),Utils['showToast']('Member\x20removed','success');}catch(_0x58852d){Utils['showToast'](_0x58852d['message'],'error');}};async function loadTeamBindings(_0x1614f0){const _0x227f0b=document['getElementById']('bindings-loading'),_0x2d1e47=document['getElementById']('bindings-empty'),_0x1f6f9e=document['getElementById']('bindings-list-container'),_0x3aee38=document['getElementById']('add-binding-btn');_0x227f0b['hidden']=![],_0x2d1e47['hidden']=!![],_0x1f6f9e['style']['display']='none',_0x3aee38['hidden']=!![],document['getElementById']('add-binding-form')['hidden']=!![];try{const {bindings:_0x3b71ea}=await API['getBindings']({'subject_type':'team','subject_id':_0x1614f0});state['teamBindings']=_0x3b71ea||[],_0x227f0b['hidden']=!![],state['teamBindings']['length']===0x0?_0x2d1e47['hidden']=![]:(_0x1f6f9e['style']['display']='',renderBindingsTable()),(Permissions['hasServerPermission'](state['currentUser'],'*')||Permissions['hasTeamPermission'](state['currentUser'],'teams:manage'))&&(_0x3aee38['hidden']=![]);}catch(_0x4c49cb){_0x227f0b['hidden']=!![],Utils['showToast']('Failed\x20to\x20load\x20bindings:\x20'+_0x4c49cb['message'],'error');}}function renderBindingsTable(){const _0x414c46=document['getElementById']('bindings-table-body');if(!_0x414c46)return;const _0x4b1d8a=Permissions['hasServerPermission'](state['currentUser'],'*')||Permissions['hasTeamPermission'](state['currentUser'],'teams:manage');_0x414c46['innerHTML']=state['teamBindings']['map'](_0x1aacf4=>{const _0x4f7611=_0x1aacf4['resource_type']==='server'?'Server':_0x1aacf4['resource_id']==='*'?'All\x20'+_0x1aacf4['resource_type']+'s':Utils['escapeHtml'](_0x1aacf4['resource_name']||_0x1aacf4['resource_id']||'');return'\x0a\x20\x20\x20\x20<tr>\x0a\x20\x20\x20\x20\x20\x20<td>'+_0x4f7611+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>'+Utils['escapeHtml'](_0x1aacf4['role_name']||_0x1aacf4['role_id'])+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x4b1d8a?'<button\x20class=\x22btn-ghost\x20btn-small\x22\x20onclick=\x22window.deleteBindingClick(\x27'+_0x1aacf4['id']+'\x27)\x22\x20style=\x22color:\x20var(--color-danger);\x22>Remove</button>':'—')+'\x0a\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20</tr>';})['join']('');}function populateBindingForm(){const _0x140784=document['getElementById']('binding-resource-type');_0x140784['value']='environment',updateBindingFormForResourceType('environment');}function onBindingResourceTypeChange(){const _0x442905=document['getElementById']('binding-resource-type')['value'];updateBindingFormForResourceType(_0x442905);}function updateBindingFormForResourceType(_0x39a862){const _0x48a43a=document['getElementById']('binding-resource-container'),_0x4566c5=document['getElementById']('binding-resource'),_0x5c5470=document['getElementById']('binding-role');if(_0x39a862==='server')_0x48a43a['style']['display']='none';else{_0x48a43a['style']['display']='';if(_0x39a862==='environment'){const _0x42618e=new Set(state['teamBindings']['filter'](_0x28119f=>_0x28119f['resource_type']==='environment')['map'](_0x4ff8c0=>_0x4ff8c0['resource_id'])),_0x23025b=state['environments']['filter'](_0x48016f=>!_0x42618e['has'](_0x48016f['name']));_0x4566c5['innerHTML']=_0x23025b['length']?_0x23025b['map'](_0x489bd7=>'<option\x20value=\x22'+Utils['escapeHtml'](_0x489bd7['name'])+'\x22>'+Utils['escapeHtml'](_0x489bd7['name'])+'</option>')['join'](''):'<option\x20value=\x22\x22>All\x20environments\x20already\x20bound</option>';}else{if(_0x39a862==='team'){const _0x398d76=new Set(state['teamBindings']['filter'](_0x2a3aa1=>_0x2a3aa1['resource_type']==='team')['map'](_0x218dca=>_0x218dca['resource_id'])),_0x24c726=state['teams']['filter'](_0x1a9e94=>!_0x398d76['has'](_0x1a9e94['id']));_0x4566c5['innerHTML']=_0x24c726['length']?_0x24c726['map'](_0x3391a7=>'<option\x20value=\x22'+_0x3391a7['id']+'\x22>'+Utils['escapeHtml'](_0x3391a7['name'])+'</option>')['join'](''):'<option\x20value=\x22\x22>All\x20teams\x20already\x20bound</option>';}}}const _0x2211ec=state['roles']['filter'](_0x21aa57=>_0x21aa57['resource_type']===_0x39a862);_0x5c5470['innerHTML']=_0x2211ec['length']?_0x2211ec['filter'](_0x1c853e=>{const _0x4e9865=_0x39a862==='server'?undefined:_0x4566c5['value'];return!state['teamBindings']['some'](_0x484d31=>_0x484d31['resource_type']===_0x39a862&&_0x484d31['role_id']===_0x1c853e['id']&&(_0x39a862==='server'||_0x484d31['resource_id']===_0x4e9865));})['map'](_0x4afbfe=>'<option\x20value=\x22'+_0x4afbfe['id']+'\x22>'+Utils['escapeHtml'](_0x4afbfe['name'])+'</option>')['join']('')||'<option\x20value=\x22\x22>No\x20available\x20roles</option>':'<option\x20value=\x22\x22>No\x20roles\x20for\x20this\x20resource\x20type</option>';}async function saveBinding(){const _0x34398e=document['getElementById']('binding-resource-type')['value'],_0x419af5=document['getElementById']('binding-role')['value'];if(!_0x419af5||!state['bindingsTeamId'])return;const _0x44442c=_0x34398e==='server'?undefined:document['getElementById']('binding-resource')['value'];if(_0x34398e!=='server'&&!_0x44442c)return;const _0x4d41ef=document['getElementById']('save-binding-btn');_0x4d41ef['disabled']=!![],_0x4d41ef['textContent']='Adding…';try{const _0x36427b={'subject_type':'team','subject_id':state['bindingsTeamId'],'role_id':_0x419af5,'resource_type':_0x34398e};if(_0x44442c)_0x36427b['resource_id']=_0x44442c;await API['createBinding'](_0x36427b),Utils['showToast']('Binding\x20added','success'),document['getElementById']('add-binding-form')['hidden']=!![],document['getElementById']('add-binding-btn')['hidden']=![],await loadTeamBindings(state['bindingsTeamId']);}catch(_0x3bc3a2){Utils['showToast'](_0x3bc3a2['message'],'error');}finally{_0x4d41ef['disabled']=![],_0x4d41ef['textContent']='Add\x20Binding';}}window['deleteBindingClick']=async function(_0x8147a4){try{await API['deleteBinding'](_0x8147a4),Utils['showToast']('Binding\x20removed','success'),await loadTeamBindings(state['bindingsTeamId']);}catch(_0x2173f0){Utils['showToast'](_0x2173f0['message'],'error');}};async function saveTeam(){const _0x5421f2=document['getElementById']('team-name')['value']['trim'](),_0xb952c9=document['getElementById']('team-description')['value']['trim'](),_0x189a29=document['getElementById']('team-form-error'),_0x2fb9ad=document['getElementById']('save-team');if(!_0x5421f2){_0x189a29['textContent']='Team\x20name\x20is\x20required',_0x189a29['hidden']=![];return;}_0x189a29['hidden']=!![];const _0x11a667=_0x2fb9ad['textContent'];_0x2fb9ad['disabled']=!![],_0x2fb9ad['textContent']=state['editingTeamId']?'Saving…':'Creating…';try{if(state['editingTeamId']){const {team:_0x2c7903}=await API['updateTeam'](state['editingTeamId'],{'name':_0x5421f2,'description':_0xb952c9});syncTeamInState(_0x2c7903),document['getElementById']('team-modal-title')['textContent']=_0x2c7903['name'],Utils['showToast']('Team\x20updated','success');}else await API['createTeam']({'name':_0x5421f2,'description':_0xb952c9}),Utils['showToast']('Team\x20created','success');_0x2fb9ad['disabled']=![],_0x2fb9ad['textContent']=_0x11a667,hideTeamModal(),await loadTeams();}catch(_0x5ea79a){_0x189a29['textContent']=_0x5ea79a['message'],_0x189a29['hidden']=![],_0x2fb9ad['disabled']=![],_0x2fb9ad['textContent']=_0x11a667;}}window['deleteTeam']=function(_0x2d6fdd){const _0x4d7682=state['teams']['find'](_0x13f095=>_0x13f095['id']===_0x2d6fdd);if(!_0x4d7682)return;state['deletingTeamId']=_0x2d6fdd,document['getElementById']('delete-team-name')['textContent']=_0x4d7682['name'],document['getElementById']('delete-team-modal')['hidden']=![];};function hideDeleteModal(){document['getElementById']('delete-team-modal')['hidden']=!![],state['deletingTeamId']=null;}async function confirmDeleteTeam(){if(!state['deletingTeamId'])return;const _0x33513a=document['getElementById']('confirm-delete-team');_0x33513a['disabled']=!![],_0x33513a['textContent']='Deleting…';try{await API['deleteTeam'](state['deletingTeamId']),Utils['showToast']('Team\x20deleted','success'),_0x33513a['disabled']=![],_0x33513a['textContent']='Delete\x20Team',hideDeleteModal(),await loadTeams();}catch(_0x1778ec){Utils['showToast']('Failed\x20to\x20delete\x20team:\x20'+_0x1778ec['message'],'error'),_0x33513a['disabled']=![],_0x33513a['textContent']='Delete\x20Team';}}function syncTeamInState(_0x1b70d8){const _0x3e0183=state['teams']['findIndex'](_0x1945cc=>_0x1945cc['id']===_0x1b70d8['id']);if(_0x3e0183>=0x0)state['teams'][_0x3e0183]=_0x1b70d8;renderTeams();}
@@ -1 +1 @@
1
- import{API,Utils}from'./app.js';import{Terminal}from'/vendor/xterm/5.3.0/xterm.esm.js';import{FitAddon}from'/vendor/xterm-addon-fit/0.7.0/xterm-addon-fit.esm.js';import{getCurrentTheme,initTheme,mountThemeToggle,onThemeChange}from'./theme.js';const params=Utils['getQueryParams'](),containerId=params['container'],command=(params['cmd']||'')['trim'](),useServerExec=params['server_exec']==='true',isEmbedded=params['embedded']==='true',terminalTabId=params['tabId']||'',titleEl=document['getElementById']('terminal-title'),subtitleEl=document['getElementById']('terminal-subtitle'),statusEl=document['getElementById']('terminal-status'),terminalEl=document['getElementById']('terminal-container'),closeBtn=document['getElementById']('close-terminal');initTheme();isEmbedded?(document['documentElement']['classList']['add']('terminal-embedded'),document['body']['classList']['add']('terminal-embedded')):mountThemeToggle({'targetSelectors':['.terminal-actions']});const getXtermTheme=()=>{return{'background':'#0f172a','foreground':'#e2e8f0','cursor':'#e2e8f0','cursorAccent':'#0f172a'};};closeBtn&&closeBtn['addEventListener']('click',()=>{if(isEmbedded&&window['parent']&&window['parent']!==window){window['parent']['postMessage']({'type':'coderflow-terminal-close','tabId':terminalTabId},window['location']['origin']);return;}window['close']();});if(!containerId){updateStatus('Missing\x20container\x20identifier','error');throw new Error('container\x20parameter\x20is\x20required');}document['title']='Terminal\x20·\x20'+containerId['slice'](0x0,0xc),enrichContainerDetails(containerId)['catch'](()=>{subtitleEl['textContent']='Container\x20'+containerId['substring'](0x0,0xc);});const term=new Terminal({'convertEol':!![],'cursorBlink':!![],'fontFamily':'JetBrains\x20Mono,\x20SFMono-Regular,\x20Consolas,\x20monospace','fontSize':0x10,'theme':getXtermTheme()}),fitAddon=new FitAddon();term['loadAddon'](fitAddon),term['open'](terminalEl),term['focus']();let isFitting=![];const doFit=()=>{if(isFitting)return;isFitting=!![],fitAddon['fit'](),sendResize(),term['scrollToBottom'](),setTimeout(()=>{isFitting=![];},0x32);};window['addEventListener']('resize',()=>{requestAnimationFrame(()=>{!isFitting&&doFit();});});const resizeObserver=new ResizeObserver(()=>{requestAnimationFrame(()=>{!isFitting&&doFit();});});resizeObserver['observe'](terminalEl);const socketProtocol=window['location']['protocol']==='https:'?'wss':'ws',socketUrl=new URL('/ws/containers/'+encodeURIComponent(containerId),window['location']['href']);command&&useServerExec&&socketUrl['searchParams']['set']('cmd',command);socketUrl['protocol']=socketProtocol+':';const socket=new WebSocket(socketUrl['toString']());term['onData'](_0x2e22a1=>{socket['readyState']===WebSocket['OPEN']&&socket['send'](JSON['stringify']({'type':'data','data':_0x2e22a1}));});let commandSent=![],hasReceivedOutput=![];socket['addEventListener']('message',_0x94d956=>{try{const _0x19767f=JSON['parse'](_0x94d956['data']);if(_0x19767f['type']==='data'&&typeof _0x19767f['data']==='string')term['write'](_0x19767f['data']),!hasReceivedOutput&&_0x19767f['data']['length']>0x0&&(hasReceivedOutput=!![],command&&!useServerExec&&!commandSent&&(commandSent=!![],setTimeout(()=>{socket['readyState']===WebSocket['OPEN']&&socket['send'](JSON['stringify']({'type':'data','data':command+'\x0d'}));},0xc8)));else{if(_0x19767f['type']==='status'&&_0x19767f['status']){if(_0x19767f['status']==='connected'){if(command&&useServerExec)updateStatus('Running:\x20'+command,'info');else command?updateStatus('Preparing:\x20'+command,'info'):updateStatus('Terminal\x20connected','success');doFit(),term['focus'](),command&&!useServerExec&&!commandSent&&setTimeout(()=>{!commandSent&&socket['readyState']===WebSocket['OPEN']&&(commandSent=!![],socket['send'](JSON['stringify']({'type':'data','data':command+'\x0d'})),updateStatus('Running:\x20'+command,'info'));},0x7d0);}else updateStatus('Session\x20'+_0x19767f['status'],_0x19767f['status']==='connected'?'success':'info');}else _0x19767f['type']==='error'&&_0x19767f['message']&&updateStatus(_0x19767f['message'],'error');}}catch(_0x5d86f7){console['error']('Failed\x20to\x20parse\x20terminal\x20message',_0x5d86f7);}}),socket['addEventListener']('close',_0x21815b=>{const _0x3b6c78=_0x21815b['reason']||'Connection\x20closed';updateStatus(_0x3b6c78,_0x21815b['wasClean']?'info':'error'),isEmbedded&&terminalTabId&&window['parent']&&window['parent']!==window&&window['parent']['postMessage']({'type':'coderflow-terminal-disconnected','tabId':terminalTabId},window['location']['origin']);}),socket['addEventListener']('error',_0x527b11=>{console['error']('Terminal\x20websocket\x20error',_0x527b11),updateStatus('Connection\x20error','error');});function sendResize(){if(socket['readyState']!==WebSocket['OPEN'])return;const _0x1dfeba=term['cols'],_0x5e4582=term['rows'];socket['send'](JSON['stringify']({'type':'resize','cols':_0x1dfeba,'rows':_0x5e4582}));}function updateStatus(_0x4fbe98,_0x23b413='info'){if(!statusEl)return;statusEl['textContent']=_0x4fbe98,statusEl['dataset']['variant']=_0x23b413;}async function enrichContainerDetails(_0x3c516f){try{const _0x3f0269=await API['getContainer'](_0x3c516f);updateTerminalDetails(_0x3f0269);}catch{try{const _0x3299e1=await API['getContainers'](),_0x1b902b=(_0x3299e1['containers']||[])['find'](_0x4c0b2d=>_0x4c0b2d['containerId']===_0x3c516f||_0x4c0b2d['name']===_0x3c516f||_0x4c0b2d['fullContainerId']?.['startsWith'](_0x3c516f));if(_0x1b902b){updateTerminalDetails(_0x1b902b);return;}subtitleEl['textContent']='Container\x20'+_0x3c516f['substring'](0x0,0xc);}catch{subtitleEl['textContent']='Container\x20'+_0x3c516f['substring'](0x0,0xc);}}}function updateTerminalDetails(_0x53d154){const _0x1b3964=_0x53d154['containerId']||_0x53d154['name']||_0x53d154['fullContainerId']||containerId,_0x2f8162=_0x53d154['environment']?'Environment\x20'+_0x53d154['environment']:'Environment\x20unknown',_0x4e3a1=_0x53d154['defaultAgent']?'\x20·\x20Agent\x20'+_0x53d154['defaultAgent']:'',_0x574ea5=_0x53d154['createdAt']?'\x20·\x20Started\x20'+Utils['formatRelativeTime'](_0x53d154['createdAt']):'';titleEl['textContent']='Terminal\x20·\x20'+_0x1b3964['substring'](0x0,0xc);const _0x108d70=command?'\x20·\x20Command\x20'+command:'';subtitleEl['textContent']=''+_0x2f8162+_0x4e3a1+_0x574ea5+_0x108d70;}
1
+ import{API,Utils}from'./app.js';import{Terminal}from'/vendor/xterm/5.3.0/xterm.esm.js';import{FitAddon}from'/vendor/xterm-addon-fit/0.7.0/xterm-addon-fit.esm.js';import{getCurrentTheme,initTheme,mountThemeToggle,onThemeChange}from'./theme.js';const params=Utils['getQueryParams'](),containerId=params['container'],command=(params['cmd']||'')['trim'](),useServerExec=params['server_exec']==='true',isEmbedded=params['embedded']==='true',terminalTabId=params['tabId']||'',titleEl=document['getElementById']('terminal-title'),subtitleEl=document['getElementById']('terminal-subtitle'),statusEl=document['getElementById']('terminal-status'),terminalEl=document['getElementById']('terminal-container'),closeBtn=document['getElementById']('close-terminal');initTheme();isEmbedded?(document['documentElement']['classList']['add']('terminal-embedded'),document['body']['classList']['add']('terminal-embedded')):mountThemeToggle({'targetSelectors':['.terminal-actions']});const getXtermTheme=()=>{return{'background':'#0f172a','foreground':'#e2e8f0','cursor':'#e2e8f0','cursorAccent':'#0f172a'};};closeBtn&&closeBtn['addEventListener']('click',()=>{if(isEmbedded&&window['parent']&&window['parent']!==window){window['parent']['postMessage']({'type':'coderflow-terminal-close','tabId':terminalTabId},window['location']['origin']);return;}window['close']();});if(!containerId){updateStatus('Missing\x20container\x20identifier','error');throw new Error('container\x20parameter\x20is\x20required');}document['title']='Terminal\x20·\x20'+containerId['slice'](0x0,0xc),enrichContainerDetails(containerId)['catch'](()=>{subtitleEl['textContent']='Container\x20'+containerId['substring'](0x0,0xc);});const term=new Terminal({'convertEol':!![],'cursorBlink':!![],'fontFamily':'JetBrains\x20Mono,\x20SFMono-Regular,\x20Consolas,\x20monospace','fontSize':0x10,'theme':getXtermTheme()}),fitAddon=new FitAddon();term['loadAddon'](fitAddon),term['open'](terminalEl),term['focus']();let isFitting=![];const doFit=()=>{if(isFitting)return;isFitting=!![],fitAddon['fit'](),sendResize(),term['scrollToBottom'](),setTimeout(()=>{isFitting=![];},0x32);};window['addEventListener']('resize',()=>{requestAnimationFrame(()=>{!isFitting&&doFit();});});const resizeObserver=new ResizeObserver(()=>{requestAnimationFrame(()=>{!isFitting&&doFit();});});resizeObserver['observe'](terminalEl);const socketProtocol=window['location']['protocol']==='https:'?'wss':'ws',socketUrl=new URL('/ws/containers/'+encodeURIComponent(containerId),window['location']['href']);command&&useServerExec&&socketUrl['searchParams']['set']('cmd',command);socketUrl['protocol']=socketProtocol+':';const socket=new WebSocket(socketUrl['toString']());term['onData'](_0x5829bf=>{socket['readyState']===WebSocket['OPEN']&&socket['send'](JSON['stringify']({'type':'data','data':_0x5829bf}));});let commandSent=![],hasReceivedOutput=![];socket['addEventListener']('message',_0x2ba20b=>{try{const _0x373adb=JSON['parse'](_0x2ba20b['data']);if(_0x373adb['type']==='data'&&typeof _0x373adb['data']==='string')term['write'](_0x373adb['data']),!hasReceivedOutput&&_0x373adb['data']['length']>0x0&&(hasReceivedOutput=!![],command&&!useServerExec&&!commandSent&&(commandSent=!![],setTimeout(()=>{socket['readyState']===WebSocket['OPEN']&&socket['send'](JSON['stringify']({'type':'data','data':command+'\x0d'}));},0xc8)));else{if(_0x373adb['type']==='status'&&_0x373adb['status']){if(_0x373adb['status']==='connected'){if(command&&useServerExec)updateStatus('Running:\x20'+command,'info');else command?updateStatus('Preparing:\x20'+command,'info'):updateStatus('Terminal\x20connected','success');doFit(),term['focus'](),command&&!useServerExec&&!commandSent&&setTimeout(()=>{!commandSent&&socket['readyState']===WebSocket['OPEN']&&(commandSent=!![],socket['send'](JSON['stringify']({'type':'data','data':command+'\x0d'})),updateStatus('Running:\x20'+command,'info'));},0x7d0);}else updateStatus('Session\x20'+_0x373adb['status'],_0x373adb['status']==='connected'?'success':'info');}else _0x373adb['type']==='error'&&_0x373adb['message']&&updateStatus(_0x373adb['message'],'error');}}catch(_0x50dccc){console['error']('Failed\x20to\x20parse\x20terminal\x20message',_0x50dccc);}}),socket['addEventListener']('close',_0x26ebd5=>{const _0x1544c2=_0x26ebd5['reason']||'Connection\x20closed';updateStatus(_0x1544c2,_0x26ebd5['wasClean']?'info':'error'),isEmbedded&&terminalTabId&&window['parent']&&window['parent']!==window&&window['parent']['postMessage']({'type':'coderflow-terminal-disconnected','tabId':terminalTabId},window['location']['origin']);}),socket['addEventListener']('error',_0x5d2134=>{console['error']('Terminal\x20websocket\x20error',_0x5d2134),updateStatus('Connection\x20error','error');});function sendResize(){if(socket['readyState']!==WebSocket['OPEN'])return;const _0x499899=term['cols'],_0x4878bb=term['rows'];socket['send'](JSON['stringify']({'type':'resize','cols':_0x499899,'rows':_0x4878bb}));}function updateStatus(_0x4789a4,_0x182218='info'){if(!statusEl)return;statusEl['textContent']=_0x4789a4,statusEl['dataset']['variant']=_0x182218;}async function enrichContainerDetails(_0x255a11){try{const _0x403a11=await API['getContainer'](_0x255a11);updateTerminalDetails(_0x403a11);}catch{try{const _0x3d9ded=await API['getContainers'](),_0x9532bb=(_0x3d9ded['containers']||[])['find'](_0x58e132=>_0x58e132['containerId']===_0x255a11||_0x58e132['name']===_0x255a11||_0x58e132['fullContainerId']?.['startsWith'](_0x255a11));if(_0x9532bb){updateTerminalDetails(_0x9532bb);return;}subtitleEl['textContent']='Container\x20'+_0x255a11['substring'](0x0,0xc);}catch{subtitleEl['textContent']='Container\x20'+_0x255a11['substring'](0x0,0xc);}}}function updateTerminalDetails(_0xd4502b){const _0x342205=_0xd4502b['containerId']||_0xd4502b['name']||_0xd4502b['fullContainerId']||containerId,_0x25d7f8=_0xd4502b['environment']?'Environment\x20'+_0xd4502b['environment']:'Environment\x20unknown',_0x5ee59a=_0xd4502b['defaultAgent']?'\x20·\x20Agent\x20'+_0xd4502b['defaultAgent']:'',_0x3f2c49=_0xd4502b['createdAt']?'\x20·\x20Started\x20'+Utils['formatRelativeTime'](_0xd4502b['createdAt']):'';titleEl['textContent']='Terminal\x20·\x20'+_0x342205['substring'](0x0,0xc);const _0x3483a7=command?'\x20·\x20Command\x20'+command:'';subtitleEl['textContent']=''+_0x25d7f8+_0x5ee59a+_0x3f2c49+_0x3483a7;}
@@ -1 +1 @@
1
- const THEME_STORAGE_KEY='profound-coder-theme',THEME_CHANGE_EVENT='profound-theme-change',VALID_THEMES=new Set(['light','dark']),DEFAULT_TARGET_SELECTORS=['#theme-toggle-container','.header-actions','.status-actions','.terminal-actions','.top-bar'];function readStoredTheme(){try{const _0x377abf=localStorage['getItem'](THEME_STORAGE_KEY);if(_0x377abf&&VALID_THEMES['has'](_0x377abf))return _0x377abf;}catch(_0x2f99b8){console['warn']('[Theme]\x20Failed\x20to\x20read\x20stored\x20theme\x20preference:',_0x2f99b8);}return null;}export function getPreferredTheme(){const _0x895f6a=readStoredTheme();if(_0x895f6a)return _0x895f6a;const _0x317a19=window['matchMedia']&&window['matchMedia']('(prefers-color-scheme:\x20dark)')['matches'];return _0x317a19?'dark':'light';}export function getCurrentTheme(){const _0x3f5cea=document['documentElement']['dataset']['theme'];if(_0x3f5cea&&VALID_THEMES['has'](_0x3f5cea))return _0x3f5cea;return getPreferredTheme();}export function applyTheme(_0x2ca41d,{persist:persist=!![],emitEvent:emitEvent=!![]}={}){const _0x57c45c=VALID_THEMES['has'](_0x2ca41d)?_0x2ca41d:'light';document['documentElement']['dataset']['theme']=_0x57c45c,document['documentElement']['style']['colorScheme']=_0x57c45c==='dark'?'dark':'light';if(persist)try{localStorage['setItem'](THEME_STORAGE_KEY,_0x57c45c);}catch(_0x478628){console['warn']('[Theme]\x20Failed\x20to\x20persist\x20theme\x20preference:',_0x478628);}return emitEvent&&window['dispatchEvent'](new CustomEvent(THEME_CHANGE_EVENT,{'detail':{'theme':_0x57c45c}})),_0x57c45c;}export function initTheme(_0x218408={}){const {emitEvent:emitEvent=![]}=_0x218408;return applyTheme(getPreferredTheme(),{'persist':![],'emitEvent':emitEvent});}export function toggleTheme(){const _0x561e64=getCurrentTheme()==='dark'?'light':'dark';return applyTheme(_0x561e64);}export function onThemeChange(_0x5e54f7,{runImmediately:runImmediately=![]}={}){const _0x4fd632=_0x89b5b1=>{_0x5e54f7(_0x89b5b1['detail']['theme']);};return window['addEventListener'](THEME_CHANGE_EVENT,_0x4fd632),runImmediately&&_0x5e54f7(getCurrentTheme()),()=>window['removeEventListener'](THEME_CHANGE_EVENT,_0x4fd632);}export function mountThemeToggle(_0x391a55={}){const {targetSelectors:targetSelectors=DEFAULT_TARGET_SELECTORS}=_0x391a55,_0x41d0d2=targetSelectors['map'](_0x5d3f96=>document['querySelector'](_0x5d3f96))['find'](Boolean),_0x4d02f1=document['createElement']('button');_0x4d02f1['type']='button',_0x4d02f1['className']='btn-ghost\x20theme-toggle-btn',_0x4d02f1['id']='theme-toggle-btn',_0x4d02f1['setAttribute']('aria-pressed','false'),_0x4d02f1['style']['padding']='8px',_0x4d02f1['style']['lineHeight']='0',_0x4d02f1['style']['width']='36px',_0x4d02f1['style']['height']='36px',_0x4d02f1['style']['display']='flex',_0x4d02f1['style']['alignItems']='center',_0x4d02f1['style']['justifyContent']='center';const _0x449a8c=document['createElement']('span');_0x449a8c['className']='theme-icon',_0x449a8c['style']['display']='flex',_0x4d02f1['append'](_0x449a8c);const _0x506590='<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20width=\x2220\x22\x20height=\x2220\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22><path\x20d=\x22M21\x2012.79A9\x209\x200\x201\x201\x2011.21\x203\x207\x207\x200\x200\x200\x2021\x2012.79z\x22></path></svg>',_0x16f07d='<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20width=\x2220\x22\x20height=\x2220\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22><circle\x20cx=\x2212\x22\x20cy=\x2212\x22\x20r=\x225\x22></circle><line\x20x1=\x2212\x22\x20y1=\x221\x22\x20x2=\x2212\x22\x20y2=\x223\x22></line><line\x20x1=\x2212\x22\x20y1=\x2221\x22\x20x2=\x2212\x22\x20y2=\x2223\x22></line><line\x20x1=\x224.22\x22\x20y1=\x224.22\x22\x20x2=\x225.64\x22\x20y2=\x225.64\x22></line><line\x20x1=\x2218.36\x22\x20y1=\x2218.36\x22\x20x2=\x2219.78\x22\x20y2=\x2219.78\x22></line><line\x20x1=\x221\x22\x20y1=\x2212\x22\x20x2=\x223\x22\x20y2=\x2212\x22></line><line\x20x1=\x2221\x22\x20y1=\x2212\x22\x20x2=\x2223\x22\x20y2=\x2212\x22></line><line\x20x1=\x224.22\x22\x20y1=\x2219.78\x22\x20x2=\x225.64\x22\x20y2=\x2218.36\x22></line><line\x20x1=\x2218.36\x22\x20y1=\x225.64\x22\x20x2=\x2219.78\x22\x20y2=\x224.22\x22></line></svg>',_0x225155=_0x5c57a5=>{const _0x276cef=_0x5c57a5==='dark';_0x449a8c['innerHTML']=_0x276cef?_0x506590:_0x16f07d,_0x4d02f1['title']=_0x276cef?'Switch\x20to\x20light\x20mode':'Switch\x20to\x20dark\x20mode',_0x4d02f1['dataset']['theme']=_0x5c57a5,_0x4d02f1['setAttribute']('aria-pressed',String(_0x276cef));};return _0x4d02f1['addEventListener']('click',()=>{const _0xf6bbad=getCurrentTheme()==='dark'?'light':'dark';applyTheme(_0xf6bbad);}),_0x41d0d2?_0x41d0d2['appendChild'](_0x4d02f1):(_0x4d02f1['classList']['add']('theme-toggle-floating'),document['body']['appendChild'](_0x4d02f1)),_0x225155(initTheme()),onThemeChange(_0x225155),_0x4d02f1;}export{THEME_STORAGE_KEY,THEME_CHANGE_EVENT};
1
+ const THEME_STORAGE_KEY='profound-coder-theme',THEME_CHANGE_EVENT='profound-theme-change',VALID_THEMES=new Set(['light','dark']),DEFAULT_TARGET_SELECTORS=['#theme-toggle-container','.header-actions','.status-actions','.terminal-actions','.top-bar'];function readStoredTheme(){try{const _0x302b78=localStorage['getItem'](THEME_STORAGE_KEY);if(_0x302b78&&VALID_THEMES['has'](_0x302b78))return _0x302b78;}catch(_0x4700ac){console['warn']('[Theme]\x20Failed\x20to\x20read\x20stored\x20theme\x20preference:',_0x4700ac);}return null;}export function getPreferredTheme(){const _0x1bb8f8=readStoredTheme();if(_0x1bb8f8)return _0x1bb8f8;const _0x144ab1=window['matchMedia']&&window['matchMedia']('(prefers-color-scheme:\x20dark)')['matches'];return _0x144ab1?'dark':'light';}export function getCurrentTheme(){const _0x11af3a=document['documentElement']['dataset']['theme'];if(_0x11af3a&&VALID_THEMES['has'](_0x11af3a))return _0x11af3a;return getPreferredTheme();}export function applyTheme(_0x2f16ad,{persist:persist=!![],emitEvent:emitEvent=!![]}={}){const _0x29566e=VALID_THEMES['has'](_0x2f16ad)?_0x2f16ad:'light';document['documentElement']['dataset']['theme']=_0x29566e,document['documentElement']['style']['colorScheme']=_0x29566e==='dark'?'dark':'light';if(persist)try{localStorage['setItem'](THEME_STORAGE_KEY,_0x29566e);}catch(_0x17d863){console['warn']('[Theme]\x20Failed\x20to\x20persist\x20theme\x20preference:',_0x17d863);}return emitEvent&&window['dispatchEvent'](new CustomEvent(THEME_CHANGE_EVENT,{'detail':{'theme':_0x29566e}})),_0x29566e;}export function initTheme(_0x3754db={}){const {emitEvent:emitEvent=![]}=_0x3754db;return applyTheme(getPreferredTheme(),{'persist':![],'emitEvent':emitEvent});}export function toggleTheme(){const _0x5703d0=getCurrentTheme()==='dark'?'light':'dark';return applyTheme(_0x5703d0);}export function onThemeChange(_0x583eb4,{runImmediately:runImmediately=![]}={}){const _0x385d33=_0x12697f=>{_0x583eb4(_0x12697f['detail']['theme']);};return window['addEventListener'](THEME_CHANGE_EVENT,_0x385d33),runImmediately&&_0x583eb4(getCurrentTheme()),()=>window['removeEventListener'](THEME_CHANGE_EVENT,_0x385d33);}export function mountThemeToggle(_0xbf3a04={}){const {targetSelectors:targetSelectors=DEFAULT_TARGET_SELECTORS}=_0xbf3a04,_0x358786=targetSelectors['map'](_0x2a193b=>document['querySelector'](_0x2a193b))['find'](Boolean),_0x48c00a=document['createElement']('button');_0x48c00a['type']='button',_0x48c00a['className']='btn-ghost\x20theme-toggle-btn',_0x48c00a['id']='theme-toggle-btn',_0x48c00a['setAttribute']('aria-pressed','false'),_0x48c00a['style']['padding']='8px',_0x48c00a['style']['lineHeight']='0',_0x48c00a['style']['width']='36px',_0x48c00a['style']['height']='36px',_0x48c00a['style']['display']='flex',_0x48c00a['style']['alignItems']='center',_0x48c00a['style']['justifyContent']='center';const _0x458246=document['createElement']('span');_0x458246['className']='theme-icon',_0x458246['style']['display']='flex',_0x48c00a['append'](_0x458246);const _0x236f70='<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20width=\x2220\x22\x20height=\x2220\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22><path\x20d=\x22M21\x2012.79A9\x209\x200\x201\x201\x2011.21\x203\x207\x207\x200\x200\x200\x2021\x2012.79z\x22></path></svg>',_0x5f32bd='<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20width=\x2220\x22\x20height=\x2220\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22><circle\x20cx=\x2212\x22\x20cy=\x2212\x22\x20r=\x225\x22></circle><line\x20x1=\x2212\x22\x20y1=\x221\x22\x20x2=\x2212\x22\x20y2=\x223\x22></line><line\x20x1=\x2212\x22\x20y1=\x2221\x22\x20x2=\x2212\x22\x20y2=\x2223\x22></line><line\x20x1=\x224.22\x22\x20y1=\x224.22\x22\x20x2=\x225.64\x22\x20y2=\x225.64\x22></line><line\x20x1=\x2218.36\x22\x20y1=\x2218.36\x22\x20x2=\x2219.78\x22\x20y2=\x2219.78\x22></line><line\x20x1=\x221\x22\x20y1=\x2212\x22\x20x2=\x223\x22\x20y2=\x2212\x22></line><line\x20x1=\x2221\x22\x20y1=\x2212\x22\x20x2=\x2223\x22\x20y2=\x2212\x22></line><line\x20x1=\x224.22\x22\x20y1=\x2219.78\x22\x20x2=\x225.64\x22\x20y2=\x2218.36\x22></line><line\x20x1=\x2218.36\x22\x20y1=\x225.64\x22\x20x2=\x2219.78\x22\x20y2=\x224.22\x22></line></svg>',_0x3d9cf8=_0x127e10=>{const _0x514072=_0x127e10==='dark';_0x458246['innerHTML']=_0x514072?_0x236f70:_0x5f32bd,_0x48c00a['title']=_0x514072?'Switch\x20to\x20light\x20mode':'Switch\x20to\x20dark\x20mode',_0x48c00a['dataset']['theme']=_0x127e10,_0x48c00a['setAttribute']('aria-pressed',String(_0x514072));};return _0x48c00a['addEventListener']('click',()=>{const _0x1f872a=getCurrentTheme()==='dark'?'light':'dark';applyTheme(_0x1f872a);}),_0x358786?_0x358786['appendChild'](_0x48c00a):(_0x48c00a['classList']['add']('theme-toggle-floating'),document['body']['appendChild'](_0x48c00a)),_0x3d9cf8(initTheme()),onThemeChange(_0x3d9cf8),_0x48c00a;}export{THEME_STORAGE_KEY,THEME_CHANGE_EVENT};
@@ -1 +1 @@
1
- import{API,Utils,ConfirmDialog,initializeAdminMenu}from'./app.js';import{initTheme,mountThemeToggle}from'./theme.js';const state={'users':[],'editingUserId':null,'bindingsUserId':null,'deletingUserId':null,'setupLinkData':null,'emailConfigured':![],'currentUser':null,'roles':[],'environments':[],'teams':[],'userBindings':[],'bindingsDirty':![]};document['addEventListener']('DOMContentLoaded',async()=>{initTheme(),mountThemeToggle(),await checkAdminAccess(),await initializeAdminMenu(state['currentUser']),await Promise['all']([checkEmailConfig(),loadRoles(),loadEnvironments(),loadTeams()]),bindEventListeners(),await loadUsers();});async function checkAdminAccess(){try{const _0x2cbf2d=await API['getCurrentUser']();state['currentUser']=_0x2cbf2d;if(!Permissions['hasServerPermission'](_0x2cbf2d,'*')&&!Permissions['hasServerPermission'](_0x2cbf2d,'users:create')){Utils['showToast']('Access\x20denied:\x20Server\x20admin\x20privileges\x20required','error'),setTimeout(()=>{window['location']['href']='index.html';},0x7d0);return;}}catch(_0x3cbe37){window['location']['href']='login.html';}}async function checkEmailConfig(){try{const _0x330661=await API['getEmailConfig']();state['emailConfigured']=_0x330661['configured'];}catch(_0x2255e0){console['error']('Failed\x20to\x20check\x20email\x20config',_0x2255e0),state['emailConfigured']=![];}}async function loadRoles(){try{const {roles:_0x55ebc7}=await API['getRoleDefinitions']();state['roles']=_0x55ebc7||[];}catch{state['roles']=[];}}async function loadEnvironments(){try{const _0x1a578f=await API['getEnvironments']();state['environments']=_0x1a578f['environments']||[];}catch{state['environments']=[];}}async function loadTeams(){try{const {teams:_0x2fd43c}=await API['getTeams']();state['teams']=_0x2fd43c||[];}catch{state['teams']=[];}}function bindEventListeners(){document['getElementById']('create-user-btn')?.['addEventListener']('click',showCreateUserModal),document['getElementById']('close-user-modal')?.['addEventListener']('click',hideUserModal),document['getElementById']('cancel-user')?.['addEventListener']('click',hideUserModal),document['getElementById']('save-user')?.['addEventListener']('click',saveUser),document['querySelector']('#user-modal\x20.modal-overlay')?.['addEventListener']('click',hideUserModal),document['getElementById']('close-delete-modal')?.['addEventListener']('click',hideDeleteModal),document['getElementById']('cancel-delete')?.['addEventListener']('click',hideDeleteModal),document['getElementById']('confirm-delete')?.['addEventListener']('click',confirmDeleteUser),document['querySelector']('#delete-modal\x20.modal-overlay')?.['addEventListener']('click',hideDeleteModal),document['getElementById']('close-setup-link-modal')?.['addEventListener']('click',hideSetupLinkModal),document['getElementById']('close-setup-link')?.['addEventListener']('click',hideSetupLinkModal),document['getElementById']('copy-setup-link')?.['addEventListener']('click',copySetupLink),document['getElementById']('email-setup-link')?.['addEventListener']('click',emailSetupLink),document['querySelector']('#setup-link-modal\x20.modal-overlay')?.['addEventListener']('click',hideSetupLinkModal),document['getElementById']('skip-password')?.['addEventListener']('change',handleSkipPasswordChange),document['getElementById']('retry-users-btn')?.['addEventListener']('click',loadUsers),document['getElementById']('close-bindings-modal')?.['addEventListener']('click',hideAccessBindingsModal),document['getElementById']('close-bindings-modal-footer')?.['addEventListener']('click',hideAccessBindingsModal),document['querySelector']('#bindings-modal\x20.modal-overlay')?.['addEventListener']('click',hideAccessBindingsModal),document['getElementById']('add-user-binding-btn')?.['addEventListener']('click',()=>{document['getElementById']('add-user-binding-form')['hidden']=![],document['getElementById']('add-user-binding-btn')['hidden']=!![],populateUserBindingForm();}),document['getElementById']('cancel-user-binding-btn')?.['addEventListener']('click',()=>{document['getElementById']('add-user-binding-form')['hidden']=!![],document['getElementById']('add-user-binding-btn')['hidden']=![];}),document['getElementById']('save-user-binding-btn')?.['addEventListener']('click',saveUserBinding),document['getElementById']('user-binding-resource-type')?.['addEventListener']('change',onUserBindingResourceTypeChange);}async function loadUsers(){const _0xcaa4f1=document['getElementById']('users-loading'),_0x1d5769=document['getElementById']('users-error'),_0x255015=document['getElementById']('users-content');try{_0xcaa4f1['hidden']=![],_0x1d5769['hidden']=!![],_0x255015['hidden']=!![];const _0x17b9fd=await API['getUsers']();state['users']=_0x17b9fd['users']||[],renderUsers(),_0xcaa4f1['hidden']=!![],_0x255015['hidden']=![];}catch(_0x4c8c3c){console['error']('Failed\x20to\x20load\x20users',_0x4c8c3c),_0xcaa4f1['hidden']=!![],_0x1d5769['hidden']=![],document['getElementById']('users-error-message')['textContent']=_0x4c8c3c['message'];}}function renderUsers(){const _0x4a6bb7=document['getElementById']('users-table-body'),_0x61d02c=document['getElementById']('user-count');if(!_0x4a6bb7)return;_0x61d02c&&(_0x61d02c['textContent']=state['users']['length']+'\x20user'+(state['users']['length']===0x1?'':'s'));const _0x48ce73=[...state['users']]['sort']((_0x597d38,_0x4d7e40)=>{const _0xacdc8a=new Date(_0x597d38['created_at'])['getTime'](),_0x323552=new Date(_0x4d7e40['created_at'])['getTime']();return _0x323552-_0xacdc8a;});_0x4a6bb7['innerHTML']=_0x48ce73['map'](_0x18dbb8=>'\x0a\x20\x20\x20\x20<tr>\x0a\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22user-username\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+Utils['escapeHtml'](_0x18dbb8['username'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20<td>'+Utils['escapeHtml'](_0x18dbb8['name'])+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>'+Utils['escapeHtml'](_0x18dbb8['email'])+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22access-badges\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x18dbb8['isServerAdmin']?'<span\x20class=\x22role-badge\x20role-admin\x22>Server\x20Admin</span>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x18dbb8['hasUserBinding']?'<span\x20class=\x22role-badge\x20role-user-binding\x22>User\x20Binding</span>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x18dbb8['hasTeamBinding']?'<span\x20class=\x22role-badge\x20role-team-binding\x22>Team\x20Binding</span>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20<td>'+Utils['formatRelativeTime'](_0x18dbb8['created_at'])+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22user-actions\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22btn-icon\x20btn-small\x22\x20onclick=\x22window.editUser(\x27'+_0x18dbb8['id']+'\x27)\x22\x20title=\x22Edit\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2214\x22\x20height=\x2214\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M11\x204H4a2\x202\x200\x200\x200-2\x202v14a2\x202\x200\x200\x200\x202\x202h14a2\x202\x200\x200\x200\x202-2v-7\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M18.5\x202.5a2.121\x202.121\x200\x200\x201\x203\x203L12\x2015l-4\x201\x201-4\x209.5-9.5z\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22btn-icon\x20btn-small\x22\x20onclick=\x22window.showAccessBindings(\x27'+_0x18dbb8['id']+'\x27)\x22\x20title=\x22Access\x20Bindings\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2214\x22\x20height=\x2214\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M12\x2022s8-4\x208-10V5l-8-3-8\x203v7c0\x206\x208\x2010\x208\x2010z\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22btn-icon\x20btn-small\x20btn-danger\x22\x20onclick=\x22window.deleteUser(\x27'+_0x18dbb8['id']+'\x27)\x22\x20title=\x22Delete\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2214\x22\x20height=\x2214\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<polyline\x20points=\x223\x206\x205\x206\x2021\x206\x22></polyline>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M19\x206v14a2\x202\x200\x200\x201-2\x202H7a2\x202\x200\x200\x201-2-2V6m3\x200V4a2\x202\x200\x200\x201\x202-2h4a2\x202\x200\x200\x201\x202\x202v2\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22btn-secondary\x20btn-small\x22\x20onclick=\x22window.resetPassword(\x27'+_0x18dbb8['id']+'\x27)\x22>Reset\x20Password</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20</tr>\x0a\x20\x20')['join']('');}window['showAccessBindings']=function(_0x2ec2f8){const _0x19aa8d=state['users']['find'](_0x5c2441=>_0x5c2441['id']===_0x2ec2f8);if(!_0x19aa8d)return;state['bindingsUserId']=_0x2ec2f8,state['bindingsDirty']=![];const _0x5ae011=document['getElementById']('bindings-modal'),_0x3a1660=document['getElementById']('bindings-modal-title');_0x3a1660['textContent']='Access\x20Bindings\x20—\x20'+_0x19aa8d['name'],document['getElementById']('add-user-binding-form')['hidden']=!![],document['getElementById']('add-user-binding-btn')['hidden']=![],_0x5ae011['hidden']=![],loadUserBindings(_0x2ec2f8);};function hasUnsavedBindingChanges(){const _0xd4cd2a=document['getElementById']('add-user-binding-form');return _0xd4cd2a&&!_0xd4cd2a['hidden'];}async function hideAccessBindingsModal(){if(hasUnsavedBindingChanges()){if(!confirm('You\x20have\x20an\x20unsaved\x20binding.\x20Discard\x20changes?'))return;document['getElementById']('add-user-binding-form')['hidden']=!![],document['getElementById']('add-user-binding-btn')['hidden']=![];}const _0x411838=document['getElementById']('bindings-modal');_0x411838['hidden']=!![];const _0x2b4620=state['bindingsDirty'];state['bindingsUserId']=null,state['userBindings']=[],state['bindingsDirty']=![],_0x2b4620&&await loadUsers();}async function loadUserBindings(_0x55f16c){const _0x12bfbd=document['getElementById']('user-bindings-loading'),_0x555720=document['getElementById']('user-bindings-empty'),_0x427bb9=document['getElementById']('user-bindings-list-container'),_0x2cbafd=document['getElementById']('add-user-binding-btn'),_0x25c8aa=document['getElementById']('user-team-bindings-note'),_0x1ed93a=document['getElementById']('user-team-bindings-text');_0x12bfbd['hidden']=![],_0x555720['hidden']=!![],_0x427bb9['style']['display']='none',_0x2cbafd['hidden']=!![],_0x25c8aa['hidden']=!![],document['getElementById']('add-user-binding-form')['hidden']=!![];try{const [_0x4df5b1,_0x58e365]=await Promise['all']([API['getBindings']({'subject_type':'user','subject_id':_0x55f16c}),API['getTeams']()]);state['userBindings']=_0x4df5b1['bindings']||[];const _0x349b11=(_0x58e365['teams']||[])['filter'](_0xe13040=>(_0xe13040['members']||[])['includes'](_0x55f16c)),_0x29c834=[];if(_0x349b11['length']>0x0){const _0x9ec5b7=await Promise['all'](_0x349b11['map'](_0x140afb=>API['getBindings']({'subject_type':'team','subject_id':_0x140afb['id']})));for(let _0x451aa8=0x0;_0x451aa8<_0x349b11['length'];_0x451aa8++){const _0x23842e=_0x9ec5b7[_0x451aa8]['bindings']||[];_0x23842e['length']>0x0&&_0x29c834['push'](_0x349b11[_0x451aa8]);}}_0x12bfbd['hidden']=!![];state['userBindings']['length']===0x0?_0x555720['hidden']=![]:(_0x427bb9['style']['display']='',renderUserBindingsTable());if(_0x29c834['length']>0x0){const _0x593a36=_0x29c834['map'](_0xce3464=>_0xce3464['name']),_0x20eaba=_0x593a36['length']<=0x3?_0x593a36['join'](',\x20'):_0x593a36['slice'](0x0,0x3)['join'](',\x20')+(',\x20and\x20'+(_0x593a36['length']-0x3)+'\x20more');_0x1ed93a['textContent']='This\x20user\x20also\x20has\x20access\x20via\x20team\x20memberships\x20('+_0x20eaba+').';}else _0x1ed93a['textContent']='This\x20user\x20has\x20no\x20access\x20via\x20team\x20memberships.';_0x25c8aa['hidden']=![],_0x2cbafd['hidden']=![];}catch(_0x2546e7){_0x12bfbd['hidden']=!![],Utils['showToast']('Failed\x20to\x20load\x20bindings:\x20'+_0x2546e7['message'],'error');}}function renderUserBindingsTable(){const _0x35187d=document['getElementById']('user-bindings-table-body');if(!_0x35187d)return;_0x35187d['innerHTML']=state['userBindings']['map'](_0x2478ca=>{const _0x938a6c=_0x2478ca['resource_type']==='server'?'Server':_0x2478ca['resource_id']==='*'?'All\x20'+_0x2478ca['resource_type']+'s':Utils['escapeHtml'](_0x2478ca['resource_id']||'');return'\x0a\x20\x20\x20\x20<tr>\x0a\x20\x20\x20\x20\x20\x20<td>'+_0x938a6c+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>'+Utils['escapeHtml'](_0x2478ca['role_name']||_0x2478ca['role_id'])+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22btn-ghost\x20btn-small\x22\x20onclick=\x22window.deleteUserBindingClick(\x27'+_0x2478ca['id']+'\x27)\x22\x20style=\x22color:\x20var(--color-danger);\x22>Remove</button>\x0a\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20</tr>';})['join']('');}function populateUserBindingForm(){const _0x37c400=document['getElementById']('user-binding-resource-type');_0x37c400['value']='environment',updateUserBindingFormForResourceType('environment');}function onUserBindingResourceTypeChange(){const _0x15692b=document['getElementById']('user-binding-resource-type')['value'];updateUserBindingFormForResourceType(_0x15692b);}function updateUserBindingFormForResourceType(_0x546d0f){const _0x5ae0e0=document['getElementById']('user-binding-resource-container'),_0x3f7f7b=document['getElementById']('user-binding-resource'),_0x3f422=document['getElementById']('user-binding-role');if(_0x546d0f==='server')_0x5ae0e0['style']['display']='none';else{_0x5ae0e0['style']['display']='';if(_0x546d0f==='environment'){const _0x4f498e=new Set(state['userBindings']['filter'](_0x276848=>_0x276848['resource_type']==='environment')['map'](_0xdfa7f8=>_0xdfa7f8['resource_id'])),_0x47a2a8=state['environments']['filter'](_0x3ed75c=>!_0x4f498e['has'](_0x3ed75c['name']));_0x3f7f7b['innerHTML']=_0x47a2a8['length']?_0x47a2a8['map'](_0x56b904=>'<option\x20value=\x22'+Utils['escapeHtml'](_0x56b904['name'])+'\x22>'+Utils['escapeHtml'](_0x56b904['name'])+'</option>')['join'](''):'<option\x20value=\x22\x22>All\x20environments\x20already\x20bound</option>';}else{if(_0x546d0f==='team'){const _0x293513=new Set(state['userBindings']['filter'](_0x58b33d=>_0x58b33d['resource_type']==='team')['map'](_0x197764=>_0x197764['resource_id'])),_0x2db3ca=state['teams']['filter'](_0x340c6a=>!_0x293513['has'](_0x340c6a['id']));_0x3f7f7b['innerHTML']=_0x2db3ca['length']?_0x2db3ca['map'](_0x4ed232=>'<option\x20value=\x22'+_0x4ed232['id']+'\x22>'+Utils['escapeHtml'](_0x4ed232['name'])+'</option>')['join'](''):'<option\x20value=\x22\x22>All\x20teams\x20already\x20bound</option>';}}}const _0x143d08=state['roles']['filter'](_0x34d4c7=>_0x34d4c7['resource_type']===_0x546d0f);_0x3f422['innerHTML']=_0x143d08['length']?_0x143d08['filter'](_0x5ee9fa=>{const _0x1b92cd=_0x546d0f==='server'?undefined:_0x3f7f7b['value'];return!state['userBindings']['some'](_0x29e5e8=>_0x29e5e8['resource_type']===_0x546d0f&&_0x29e5e8['role_id']===_0x5ee9fa['id']&&(_0x546d0f==='server'||_0x29e5e8['resource_id']===_0x1b92cd));})['map'](_0x18e929=>'<option\x20value=\x22'+_0x18e929['id']+'\x22>'+Utils['escapeHtml'](_0x18e929['name'])+'</option>')['join']('')||'<option\x20value=\x22\x22>No\x20available\x20roles</option>':'<option\x20value=\x22\x22>No\x20roles\x20for\x20this\x20resource\x20type</option>';}async function saveUserBinding(){const _0x2d63eb=document['getElementById']('user-binding-resource-type')['value'],_0x1b81da=document['getElementById']('user-binding-role')['value'];if(!_0x1b81da||!state['bindingsUserId'])return;const _0x3ebcd9=_0x2d63eb==='server'?undefined:document['getElementById']('user-binding-resource')['value'];if(_0x2d63eb!=='server'&&!_0x3ebcd9)return;const _0x1ce05c=document['getElementById']('save-user-binding-btn');_0x1ce05c['disabled']=!![],_0x1ce05c['textContent']='Adding…';try{const _0x4303a4={'subject_type':'user','subject_id':state['bindingsUserId'],'role_id':_0x1b81da,'resource_type':_0x2d63eb};if(_0x3ebcd9)_0x4303a4['resource_id']=_0x3ebcd9;await API['createBinding'](_0x4303a4),Utils['showToast']('Binding\x20added','success'),state['bindingsDirty']=!![],document['getElementById']('add-user-binding-form')['hidden']=!![],document['getElementById']('add-user-binding-btn')['hidden']=![],await loadUserBindings(state['bindingsUserId']);}catch(_0x563a11){Utils['showToast'](_0x563a11['message'],'error');}finally{_0x1ce05c['disabled']=![],_0x1ce05c['textContent']='Add\x20Binding';}}window['deleteUserBindingClick']=async function(_0x4c9fd6){try{await API['deleteBinding'](_0x4c9fd6),Utils['showToast']('Binding\x20removed','success'),state['bindingsDirty']=!![],await loadUserBindings(state['bindingsUserId']);}catch(_0x5ead82){Utils['showToast'](_0x5ead82['message'],'error');}};function showCreateUserModal(){state['editingUserId']=null;const _0x18844e=document['getElementById']('user-modal'),_0x2885b7=document['getElementById']('modal-title'),_0x2fcb6f=document['getElementById']('user-password'),_0x3215e2=document['getElementById']('password-required'),_0x29d2d2=document['getElementById']('password-hint'),_0x1f505e=document['getElementById']('skip-password-container'),_0x4151eb=document['getElementById']('skip-password');_0x2885b7['textContent']='Create\x20User',document['getElementById']('user-form')['reset'](),_0x2fcb6f['required']=!![];if(_0x3215e2)_0x3215e2['textContent']='*';_0x1f505e&&(_0x1f505e['style']['display']='block',_0x4151eb['checked']=![]),_0x29d2d2&&(_0x29d2d2['textContent']='Minimum\x208\x20characters'),_0x18844e['hidden']=![],setTimeout(()=>{document['getElementById']('user-username')['focus']();},0x64);}window['editUser']=function(_0x590eee){const _0x45cbe4=state['users']['find'](_0x3cc456=>_0x3cc456['id']===_0x590eee);if(!_0x45cbe4)return;state['editingUserId']=_0x590eee;const _0x3811f8=document['getElementById']('user-modal'),_0x828476=document['getElementById']('modal-title'),_0x254204=document['getElementById']('user-password'),_0x2c2b2b=document['getElementById']('password-required'),_0x185220=document['getElementById']('password-hint'),_0x4906b0=document['getElementById']('skip-password-container');_0x828476['textContent']='Edit\x20User',document['getElementById']('user-username')['value']=_0x45cbe4['username'],document['getElementById']('user-name')['value']=_0x45cbe4['name'],document['getElementById']('user-email')['value']=_0x45cbe4['email'],_0x254204['value']='',_0x254204['required']=![];if(_0x2c2b2b)_0x2c2b2b['textContent']='';_0x4906b0&&(_0x4906b0['style']['display']='none'),_0x185220&&(_0x185220['textContent']='Leave\x20blank\x20to\x20keep\x20current\x20password'),_0x3811f8['hidden']=![],setTimeout(()=>{document['getElementById']('user-username')['focus']();},0x64);};function hideUserModal(){const _0x23fb6d=document['getElementById']('user-modal'),_0xa9b836=document['getElementById']('form-error'),_0xbb9c16=document['getElementById']('save-user');_0x23fb6d['hidden']=!![],_0xa9b836['hidden']=!![],state['editingUserId']=null,_0xbb9c16&&(_0xbb9c16['disabled']=![],_0xbb9c16['textContent']='Save\x20User');}async function saveUser(){const _0xfb4b95=document['getElementById']('user-form'),_0x56d8a9=document['getElementById']('skip-password')?.['checked']||![];if(!_0x56d8a9&&!_0xfb4b95['checkValidity']()){_0xfb4b95['reportValidity']();return;}const _0x4db2d6=document['getElementById']('form-error'),_0x47314d=document['getElementById']('save-user'),_0x375fc9=document['getElementById']('user-username')['value']['trim'](),_0x3a1b51=document['getElementById']('user-name')['value']['trim'](),_0x307484=document['getElementById']('user-email')['value']['trim'](),_0x263738=document['getElementById']('user-password')['value'];if(!_0x375fc9||!_0x3a1b51||!_0x307484){_0x4db2d6['textContent']='Please\x20fill\x20in\x20all\x20required\x20fields',_0x4db2d6['hidden']=![],_0x4db2d6['scrollIntoView']({'behavior':'smooth','block':'nearest'});return;}_0x4db2d6['hidden']=!![];const _0x491e5d=_0x47314d['textContent'];_0x47314d['disabled']=!![],_0x47314d['textContent']=state['editingUserId']?'Updating...':'Creating...';try{if(state['editingUserId']){const _0x19fbc6={'username':_0x375fc9,'name':_0x3a1b51,'email':_0x307484};_0x263738&&(_0x19fbc6['password']=_0x263738),await API['updateUser'](state['editingUserId'],_0x19fbc6),Utils['showToast']('User\x20updated\x20successfully','success'),await loadUsers(),hideUserModal();}else{const _0x320bb0={'username':_0x375fc9,'name':_0x3a1b51,'email':_0x307484};if(!_0x56d8a9){if(!_0x263738)throw new Error('Password\x20is\x20required\x20for\x20new\x20users');_0x320bb0['password']=_0x263738;}const _0x335373=await API['createUser'](_0x320bb0),_0x315173=_0x335373['user'];if(_0x56d8a9||!_0x263738){const _0x3683ee=await API['createPasswordToken'](_0x315173['id'],'setup',![]);state['setupLinkData']={'username':_0x315173['username'],'email':_0x315173['email'],'url':_0x3683ee['token']['setupUrl'],'userId':_0x315173['id'],'type':'setup','emailSent':![]},await loadUsers(),hideUserModal(),showSetupLinkModal();}else Utils['showToast']('User\x20created\x20successfully','success'),await loadUsers(),hideUserModal();}}catch(_0x2f52ad){console['error']('Failed\x20to\x20save\x20user',_0x2f52ad),_0x4db2d6['textContent']=_0x2f52ad['message'],_0x4db2d6['hidden']=![],_0x4db2d6['scrollIntoView']({'behavior':'smooth','block':'nearest'}),_0x47314d['disabled']=![],_0x47314d['textContent']=_0x491e5d;}}window['deleteUser']=function(_0x48fe4e){const _0x3af69e=state['users']['find'](_0x4690ce=>_0x4690ce['id']===_0x48fe4e);if(!_0x3af69e)return;state['deletingUserId']=_0x48fe4e;const _0x9b528a=document['getElementById']('delete-modal'),_0x3fc7c3=document['getElementById']('delete-user-name');_0x3fc7c3['textContent']=_0x3af69e['name']+'\x20('+_0x3af69e['username']+')',_0x9b528a['hidden']=![];};function hideDeleteModal(){const _0x2b772f=document['getElementById']('delete-modal');_0x2b772f['hidden']=!![],state['deletingUserId']=null;const _0x3c774b=document['getElementById']('confirm-delete');_0x3c774b&&(_0x3c774b['disabled']=![],_0x3c774b['textContent']='Delete\x20User');}async function confirmDeleteUser(){if(!state['deletingUserId'])return;const _0x41c82f=document['getElementById']('confirm-delete'),_0x343b3a=_0x41c82f['textContent'];_0x41c82f['disabled']=!![],_0x41c82f['textContent']='Deleting...';try{await API['deleteUser'](state['deletingUserId']),Utils['showToast']('User\x20deleted\x20successfully','success'),await loadUsers(),hideDeleteModal();}catch(_0x4044c2){console['error']('Failed\x20to\x20delete\x20user',_0x4044c2),Utils['showToast']('Failed\x20to\x20delete\x20user:\x20'+_0x4044c2['message'],'error'),_0x41c82f['disabled']=![],_0x41c82f['textContent']=_0x343b3a;}}function handleSkipPasswordChange(_0x5794c6){const _0x1561f7=document['getElementById']('user-password'),_0x361b0a=_0x5794c6['target']['checked'];_0x361b0a?(_0x1561f7['required']=![],_0x1561f7['disabled']=!![],_0x1561f7['value']=''):(_0x1561f7['required']=!![],_0x1561f7['disabled']=![]);}function showSetupLinkModal(){if(!state['setupLinkData'])return;const _0x3ab7ae=document['getElementById']('setup-link-modal'),_0x420d39=document['getElementById']('setup-link-username'),_0x3860df=document['getElementById']('setup-link-url'),_0x1661ab=document['getElementById']('email-setup-link'),_0x256ff0=document['getElementById']('email-button-text');_0x420d39['textContent']=state['setupLinkData']['username'],_0x3860df['textContent']=state['setupLinkData']['url'],_0x1661ab&&_0x256ff0&&(_0x1661ab['disabled']=![],_0x256ff0['textContent']='Email\x20Link',state['emailConfigured']&&!state['setupLinkData']['emailSent']?_0x1661ab['style']['display']='inline-block':_0x1661ab['style']['display']='none'),_0x3ab7ae['hidden']=![];}function hideSetupLinkModal(){const _0x350d69=document['getElementById']('setup-link-modal');_0x350d69['hidden']=!![],state['setupLinkData']=null;}async function copySetupLink(){if(!state['setupLinkData'])return;try{await navigator['clipboard']['writeText'](state['setupLinkData']['url']),Utils['showToast']('Link\x20copied\x20to\x20clipboard','success');}catch(_0x3a9f4c){console['error']('Failed\x20to\x20copy\x20link',_0x3a9f4c),Utils['showToast']('Failed\x20to\x20copy\x20link','error');}}async function emailSetupLink(){if(!state['setupLinkData'])return;const _0x7061f9=document['getElementById']('email-setup-link'),_0x423c9d=document['getElementById']('email-button-text');if(!_0x7061f9||!_0x423c9d)return;const _0x553788=_0x423c9d['textContent'];_0x7061f9['disabled']=!![],_0x423c9d['textContent']='Sending...';try{const _0x5dfdd3=await API['createPasswordToken'](state['setupLinkData']['userId'],state['setupLinkData']['type'],!![]);if(_0x5dfdd3['emailSent'])Utils['showToast']('Email\x20sent\x20to\x20'+state['setupLinkData']['email'],'success'),state['setupLinkData']['emailSent']=!![],_0x7061f9['style']['display']='none';else{const _0x54a215=_0x5dfdd3['emailError']||'Failed\x20to\x20send\x20email';Utils['showToast'](_0x54a215,'error'),_0x7061f9['disabled']=![],_0x423c9d['textContent']=_0x553788;}}catch(_0x3e4d5f){console['error']('Failed\x20to\x20email\x20setup\x20link',_0x3e4d5f),Utils['showToast']('Failed\x20to\x20send\x20email:\x20'+_0x3e4d5f['message'],'error'),_0x7061f9['disabled']=![],_0x423c9d['textContent']=_0x553788;}}window['resetPassword']=async function(_0x1ecf49){const _0x11c667=state['users']['find'](_0x4cb26b=>_0x4cb26b['id']===_0x1ecf49);if(!_0x11c667)return;const _0x45a028=await ConfirmDialog['show']({'title':'Reset\x20Password','message':'Generate\x20a\x20password\x20reset\x20link\x20for\x20'+_0x11c667['name']+'\x20('+_0x11c667['username']+')?\x20This\x20will\x20create\x20a\x20link\x20that\x20they\x20can\x20use\x20to\x20set\x20a\x20new\x20password.','confirmText':'Generate\x20Link'});if(!_0x45a028)return;try{const _0x46521c=await API['createPasswordToken'](_0x1ecf49,'reset',![]);state['setupLinkData']={'username':_0x11c667['username'],'email':_0x11c667['email'],'url':_0x46521c['token']['setupUrl'],'userId':_0x11c667['id'],'type':'reset','emailSent':![]},showSetupLinkModal();}catch(_0x5a7dbb){console['error']('Failed\x20to\x20create\x20password\x20reset\x20link',_0x5a7dbb),Utils['showToast']('Failed\x20to\x20create\x20password\x20reset\x20link:\x20'+_0x5a7dbb['message'],'error');}};
1
+ import{API,Utils,ConfirmDialog,initializeAdminMenu}from'./app.js';import{initTheme,mountThemeToggle}from'./theme.js';const state={'users':[],'editingUserId':null,'bindingsUserId':null,'deletingUserId':null,'setupLinkData':null,'emailConfigured':![],'currentUser':null,'roles':[],'environments':[],'teams':[],'userBindings':[],'bindingsDirty':![]};document['addEventListener']('DOMContentLoaded',async()=>{initTheme(),mountThemeToggle(),await checkAdminAccess(),await initializeAdminMenu(state['currentUser']),await Promise['all']([checkEmailConfig(),loadRoles(),loadEnvironments(),loadTeams()]),bindEventListeners(),await loadUsers();});async function checkAdminAccess(){try{const _0x228fe1=await API['getCurrentUser']();state['currentUser']=_0x228fe1;if(!Permissions['hasServerPermission'](_0x228fe1,'*')&&!Permissions['hasServerPermission'](_0x228fe1,'users:create')){Utils['showToast']('Access\x20denied:\x20Server\x20admin\x20privileges\x20required','error'),setTimeout(()=>{window['location']['href']='index.html';},0x7d0);return;}}catch(_0x2810e8){window['location']['href']='login.html';}}async function checkEmailConfig(){try{const _0xe297c0=await API['getEmailConfig']();state['emailConfigured']=_0xe297c0['configured'];}catch(_0x1621d1){console['error']('Failed\x20to\x20check\x20email\x20config',_0x1621d1),state['emailConfigured']=![];}}async function loadRoles(){try{const {roles:_0x74f21e}=await API['getRoleDefinitions']();state['roles']=_0x74f21e||[];}catch{state['roles']=[];}}async function loadEnvironments(){try{const _0x367289=await API['getEnvironments']();state['environments']=_0x367289['environments']||[];}catch{state['environments']=[];}}async function loadTeams(){try{const {teams:_0x48e2f5}=await API['getTeams']();state['teams']=_0x48e2f5||[];}catch{state['teams']=[];}}function bindEventListeners(){document['getElementById']('create-user-btn')?.['addEventListener']('click',showCreateUserModal),document['getElementById']('close-user-modal')?.['addEventListener']('click',hideUserModal),document['getElementById']('cancel-user')?.['addEventListener']('click',hideUserModal),document['getElementById']('save-user')?.['addEventListener']('click',saveUser),document['querySelector']('#user-modal\x20.modal-overlay')?.['addEventListener']('click',hideUserModal),document['getElementById']('close-delete-modal')?.['addEventListener']('click',hideDeleteModal),document['getElementById']('cancel-delete')?.['addEventListener']('click',hideDeleteModal),document['getElementById']('confirm-delete')?.['addEventListener']('click',confirmDeleteUser),document['querySelector']('#delete-modal\x20.modal-overlay')?.['addEventListener']('click',hideDeleteModal),document['getElementById']('close-setup-link-modal')?.['addEventListener']('click',hideSetupLinkModal),document['getElementById']('close-setup-link')?.['addEventListener']('click',hideSetupLinkModal),document['getElementById']('copy-setup-link')?.['addEventListener']('click',copySetupLink),document['getElementById']('email-setup-link')?.['addEventListener']('click',emailSetupLink),document['querySelector']('#setup-link-modal\x20.modal-overlay')?.['addEventListener']('click',hideSetupLinkModal),document['getElementById']('skip-password')?.['addEventListener']('change',handleSkipPasswordChange),document['getElementById']('retry-users-btn')?.['addEventListener']('click',loadUsers),document['getElementById']('close-bindings-modal')?.['addEventListener']('click',hideAccessBindingsModal),document['getElementById']('close-bindings-modal-footer')?.['addEventListener']('click',hideAccessBindingsModal),document['querySelector']('#bindings-modal\x20.modal-overlay')?.['addEventListener']('click',hideAccessBindingsModal),document['getElementById']('add-user-binding-btn')?.['addEventListener']('click',()=>{document['getElementById']('add-user-binding-form')['hidden']=![],document['getElementById']('add-user-binding-btn')['hidden']=!![],populateUserBindingForm();}),document['getElementById']('cancel-user-binding-btn')?.['addEventListener']('click',()=>{document['getElementById']('add-user-binding-form')['hidden']=!![],document['getElementById']('add-user-binding-btn')['hidden']=![];}),document['getElementById']('save-user-binding-btn')?.['addEventListener']('click',saveUserBinding),document['getElementById']('user-binding-resource-type')?.['addEventListener']('change',onUserBindingResourceTypeChange);}async function loadUsers(){const _0xbb05db=document['getElementById']('users-loading'),_0x245485=document['getElementById']('users-error'),_0x139dac=document['getElementById']('users-content');try{_0xbb05db['hidden']=![],_0x245485['hidden']=!![],_0x139dac['hidden']=!![];const _0x130921=await API['getUsers']();state['users']=_0x130921['users']||[],renderUsers(),_0xbb05db['hidden']=!![],_0x139dac['hidden']=![];}catch(_0x53a3fb){console['error']('Failed\x20to\x20load\x20users',_0x53a3fb),_0xbb05db['hidden']=!![],_0x245485['hidden']=![],document['getElementById']('users-error-message')['textContent']=_0x53a3fb['message'];}}function renderUsers(){const _0x33304e=document['getElementById']('users-table-body'),_0x41a7b8=document['getElementById']('user-count');if(!_0x33304e)return;_0x41a7b8&&(_0x41a7b8['textContent']=state['users']['length']+'\x20user'+(state['users']['length']===0x1?'':'s'));const _0x4e8030=[...state['users']]['sort']((_0x4a60f5,_0x16955b)=>{const _0xb8c948=new Date(_0x4a60f5['created_at'])['getTime'](),_0x2ffea0=new Date(_0x16955b['created_at'])['getTime']();return _0x2ffea0-_0xb8c948;});_0x33304e['innerHTML']=_0x4e8030['map'](_0x15ba05=>'\x0a\x20\x20\x20\x20<tr>\x0a\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22user-username\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+Utils['escapeHtml'](_0x15ba05['username'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20<td>'+Utils['escapeHtml'](_0x15ba05['name'])+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>'+Utils['escapeHtml'](_0x15ba05['email'])+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22access-badges\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x15ba05['isServerAdmin']?'<span\x20class=\x22role-badge\x20role-admin\x22>Server\x20Admin</span>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x15ba05['hasUserBinding']?'<span\x20class=\x22role-badge\x20role-user-binding\x22>User\x20Binding</span>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x15ba05['hasTeamBinding']?'<span\x20class=\x22role-badge\x20role-team-binding\x22>Team\x20Binding</span>':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20<td>'+Utils['formatRelativeTime'](_0x15ba05['created_at'])+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22user-actions\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22btn-icon\x20btn-small\x22\x20onclick=\x22window.editUser(\x27'+_0x15ba05['id']+'\x27)\x22\x20title=\x22Edit\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2214\x22\x20height=\x2214\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M11\x204H4a2\x202\x200\x200\x200-2\x202v14a2\x202\x200\x200\x200\x202\x202h14a2\x202\x200\x200\x200\x202-2v-7\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M18.5\x202.5a2.121\x202.121\x200\x200\x201\x203\x203L12\x2015l-4\x201\x201-4\x209.5-9.5z\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22btn-icon\x20btn-small\x22\x20onclick=\x22window.showAccessBindings(\x27'+_0x15ba05['id']+'\x27)\x22\x20title=\x22Access\x20Bindings\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2214\x22\x20height=\x2214\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M12\x2022s8-4\x208-10V5l-8-3-8\x203v7c0\x206\x208\x2010\x208\x2010z\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22btn-icon\x20btn-small\x20btn-danger\x22\x20onclick=\x22window.deleteUser(\x27'+_0x15ba05['id']+'\x27)\x22\x20title=\x22Delete\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x2214\x22\x20height=\x2214\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<polyline\x20points=\x223\x206\x205\x206\x2021\x206\x22></polyline>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M19\x206v14a2\x202\x200\x200\x201-2\x202H7a2\x202\x200\x200\x201-2-2V6m3\x200V4a2\x202\x200\x200\x201\x202-2h4a2\x202\x200\x200\x201\x202\x202v2\x22></path>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22btn-secondary\x20btn-small\x22\x20onclick=\x22window.resetPassword(\x27'+_0x15ba05['id']+'\x27)\x22>Reset\x20Password</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20</tr>\x0a\x20\x20')['join']('');}window['showAccessBindings']=function(_0x495e23){const _0x2ab471=state['users']['find'](_0x5a6bb6=>_0x5a6bb6['id']===_0x495e23);if(!_0x2ab471)return;state['bindingsUserId']=_0x495e23,state['bindingsDirty']=![];const _0x236e99=document['getElementById']('bindings-modal'),_0x2c8216=document['getElementById']('bindings-modal-title');_0x2c8216['textContent']='Access\x20Bindings\x20—\x20'+_0x2ab471['name'],document['getElementById']('add-user-binding-form')['hidden']=!![],document['getElementById']('add-user-binding-btn')['hidden']=![],_0x236e99['hidden']=![],loadUserBindings(_0x495e23);};function hasUnsavedBindingChanges(){const _0x56436b=document['getElementById']('add-user-binding-form');return _0x56436b&&!_0x56436b['hidden'];}async function hideAccessBindingsModal(){if(hasUnsavedBindingChanges()){if(!confirm('You\x20have\x20an\x20unsaved\x20binding.\x20Discard\x20changes?'))return;document['getElementById']('add-user-binding-form')['hidden']=!![],document['getElementById']('add-user-binding-btn')['hidden']=![];}const _0x3e9f6b=document['getElementById']('bindings-modal');_0x3e9f6b['hidden']=!![];const _0x3794bd=state['bindingsDirty'];state['bindingsUserId']=null,state['userBindings']=[],state['bindingsDirty']=![],_0x3794bd&&await loadUsers();}async function loadUserBindings(_0x485f74){const _0x5e7819=document['getElementById']('user-bindings-loading'),_0x423dfd=document['getElementById']('user-bindings-empty'),_0x283fc5=document['getElementById']('user-bindings-list-container'),_0x40f9bc=document['getElementById']('add-user-binding-btn'),_0x881105=document['getElementById']('user-team-bindings-note'),_0x4beae1=document['getElementById']('user-team-bindings-text');_0x5e7819['hidden']=![],_0x423dfd['hidden']=!![],_0x283fc5['style']['display']='none',_0x40f9bc['hidden']=!![],_0x881105['hidden']=!![],document['getElementById']('add-user-binding-form')['hidden']=!![];try{const [_0x767098,_0x420ad8]=await Promise['all']([API['getBindings']({'subject_type':'user','subject_id':_0x485f74}),API['getTeams']()]);state['userBindings']=_0x767098['bindings']||[];const _0x3b765f=(_0x420ad8['teams']||[])['filter'](_0x39016c=>(_0x39016c['members']||[])['includes'](_0x485f74)),_0x43ad59=[];if(_0x3b765f['length']>0x0){const _0x375bcb=await Promise['all'](_0x3b765f['map'](_0x1e80e7=>API['getBindings']({'subject_type':'team','subject_id':_0x1e80e7['id']})));for(let _0x23d1eb=0x0;_0x23d1eb<_0x3b765f['length'];_0x23d1eb++){const _0x98a1d=_0x375bcb[_0x23d1eb]['bindings']||[];_0x98a1d['length']>0x0&&_0x43ad59['push'](_0x3b765f[_0x23d1eb]);}}_0x5e7819['hidden']=!![];state['userBindings']['length']===0x0?_0x423dfd['hidden']=![]:(_0x283fc5['style']['display']='',renderUserBindingsTable());if(_0x43ad59['length']>0x0){const _0x23ef85=_0x43ad59['map'](_0x21e645=>_0x21e645['name']),_0x516b84=_0x23ef85['length']<=0x3?_0x23ef85['join'](',\x20'):_0x23ef85['slice'](0x0,0x3)['join'](',\x20')+(',\x20and\x20'+(_0x23ef85['length']-0x3)+'\x20more');_0x4beae1['textContent']='This\x20user\x20also\x20has\x20access\x20via\x20team\x20memberships\x20('+_0x516b84+').';}else _0x4beae1['textContent']='This\x20user\x20has\x20no\x20access\x20via\x20team\x20memberships.';_0x881105['hidden']=![],_0x40f9bc['hidden']=![];}catch(_0x2a798d){_0x5e7819['hidden']=!![],Utils['showToast']('Failed\x20to\x20load\x20bindings:\x20'+_0x2a798d['message'],'error');}}function renderUserBindingsTable(){const _0x29e88d=document['getElementById']('user-bindings-table-body');if(!_0x29e88d)return;_0x29e88d['innerHTML']=state['userBindings']['map'](_0x363159=>{const _0x40a06d=_0x363159['resource_type']==='server'?'Server':_0x363159['resource_id']==='*'?'All\x20'+_0x363159['resource_type']+'s':Utils['escapeHtml'](_0x363159['resource_id']||'');return'\x0a\x20\x20\x20\x20<tr>\x0a\x20\x20\x20\x20\x20\x20<td>'+_0x40a06d+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>'+Utils['escapeHtml'](_0x363159['role_name']||_0x363159['role_id'])+'</td>\x0a\x20\x20\x20\x20\x20\x20<td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22btn-ghost\x20btn-small\x22\x20onclick=\x22window.deleteUserBindingClick(\x27'+_0x363159['id']+'\x27)\x22\x20style=\x22color:\x20var(--color-danger);\x22>Remove</button>\x0a\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20</tr>';})['join']('');}function populateUserBindingForm(){const _0x5a991e=document['getElementById']('user-binding-resource-type');_0x5a991e['value']='environment',updateUserBindingFormForResourceType('environment');}function onUserBindingResourceTypeChange(){const _0x342091=document['getElementById']('user-binding-resource-type')['value'];updateUserBindingFormForResourceType(_0x342091);}function updateUserBindingFormForResourceType(_0x1847fb){const _0x34b1dc=document['getElementById']('user-binding-resource-container'),_0x1f95e6=document['getElementById']('user-binding-resource'),_0x515d02=document['getElementById']('user-binding-role');if(_0x1847fb==='server')_0x34b1dc['style']['display']='none';else{_0x34b1dc['style']['display']='';if(_0x1847fb==='environment'){const _0x2a0faa=new Set(state['userBindings']['filter'](_0x2033e0=>_0x2033e0['resource_type']==='environment')['map'](_0x55be35=>_0x55be35['resource_id'])),_0x1baee3=state['environments']['filter'](_0xe2d5ab=>!_0x2a0faa['has'](_0xe2d5ab['name']));_0x1f95e6['innerHTML']=_0x1baee3['length']?_0x1baee3['map'](_0x22719e=>'<option\x20value=\x22'+Utils['escapeHtml'](_0x22719e['name'])+'\x22>'+Utils['escapeHtml'](_0x22719e['name'])+'</option>')['join'](''):'<option\x20value=\x22\x22>All\x20environments\x20already\x20bound</option>';}else{if(_0x1847fb==='team'){const _0x31c0fd=new Set(state['userBindings']['filter'](_0x2a1151=>_0x2a1151['resource_type']==='team')['map'](_0xc65903=>_0xc65903['resource_id'])),_0x8d42c3=state['teams']['filter'](_0x3c07a4=>!_0x31c0fd['has'](_0x3c07a4['id']));_0x1f95e6['innerHTML']=_0x8d42c3['length']?_0x8d42c3['map'](_0x7ab63a=>'<option\x20value=\x22'+_0x7ab63a['id']+'\x22>'+Utils['escapeHtml'](_0x7ab63a['name'])+'</option>')['join'](''):'<option\x20value=\x22\x22>All\x20teams\x20already\x20bound</option>';}}}const _0x57ed64=state['roles']['filter'](_0x3b48f0=>_0x3b48f0['resource_type']===_0x1847fb);_0x515d02['innerHTML']=_0x57ed64['length']?_0x57ed64['filter'](_0x8253f0=>{const _0x5adb9d=_0x1847fb==='server'?undefined:_0x1f95e6['value'];return!state['userBindings']['some'](_0x5fdb7d=>_0x5fdb7d['resource_type']===_0x1847fb&&_0x5fdb7d['role_id']===_0x8253f0['id']&&(_0x1847fb==='server'||_0x5fdb7d['resource_id']===_0x5adb9d));})['map'](_0x18bb6f=>'<option\x20value=\x22'+_0x18bb6f['id']+'\x22>'+Utils['escapeHtml'](_0x18bb6f['name'])+'</option>')['join']('')||'<option\x20value=\x22\x22>No\x20available\x20roles</option>':'<option\x20value=\x22\x22>No\x20roles\x20for\x20this\x20resource\x20type</option>';}async function saveUserBinding(){const _0x2f095e=document['getElementById']('user-binding-resource-type')['value'],_0x15e734=document['getElementById']('user-binding-role')['value'];if(!_0x15e734||!state['bindingsUserId'])return;const _0x2d5035=_0x2f095e==='server'?undefined:document['getElementById']('user-binding-resource')['value'];if(_0x2f095e!=='server'&&!_0x2d5035)return;const _0x3e23c1=document['getElementById']('save-user-binding-btn');_0x3e23c1['disabled']=!![],_0x3e23c1['textContent']='Adding…';try{const _0x2814f9={'subject_type':'user','subject_id':state['bindingsUserId'],'role_id':_0x15e734,'resource_type':_0x2f095e};if(_0x2d5035)_0x2814f9['resource_id']=_0x2d5035;await API['createBinding'](_0x2814f9),Utils['showToast']('Binding\x20added','success'),state['bindingsDirty']=!![],document['getElementById']('add-user-binding-form')['hidden']=!![],document['getElementById']('add-user-binding-btn')['hidden']=![],await loadUserBindings(state['bindingsUserId']);}catch(_0x8c8b8d){Utils['showToast'](_0x8c8b8d['message'],'error');}finally{_0x3e23c1['disabled']=![],_0x3e23c1['textContent']='Add\x20Binding';}}window['deleteUserBindingClick']=async function(_0x28395d){try{await API['deleteBinding'](_0x28395d),Utils['showToast']('Binding\x20removed','success'),state['bindingsDirty']=!![],await loadUserBindings(state['bindingsUserId']);}catch(_0xaf1bae){Utils['showToast'](_0xaf1bae['message'],'error');}};function showCreateUserModal(){state['editingUserId']=null;const _0x87f0e3=document['getElementById']('user-modal'),_0x50a9f1=document['getElementById']('modal-title'),_0x520fda=document['getElementById']('user-password'),_0x5b0f3f=document['getElementById']('password-required'),_0x67e26a=document['getElementById']('password-hint'),_0x2fbedb=document['getElementById']('skip-password-container'),_0x322a34=document['getElementById']('skip-password');_0x50a9f1['textContent']='Create\x20User',document['getElementById']('user-form')['reset'](),_0x520fda['required']=!![];if(_0x5b0f3f)_0x5b0f3f['textContent']='*';_0x2fbedb&&(_0x2fbedb['style']['display']='block',_0x322a34['checked']=![]),_0x67e26a&&(_0x67e26a['textContent']='Minimum\x208\x20characters'),_0x87f0e3['hidden']=![],setTimeout(()=>{document['getElementById']('user-username')['focus']();},0x64);}window['editUser']=function(_0x5be629){const _0x5985e9=state['users']['find'](_0x385980=>_0x385980['id']===_0x5be629);if(!_0x5985e9)return;state['editingUserId']=_0x5be629;const _0x20acdb=document['getElementById']('user-modal'),_0x54fe38=document['getElementById']('modal-title'),_0x3f8b07=document['getElementById']('user-password'),_0x52d5ab=document['getElementById']('password-required'),_0x2267a1=document['getElementById']('password-hint'),_0x3ee405=document['getElementById']('skip-password-container');_0x54fe38['textContent']='Edit\x20User',document['getElementById']('user-username')['value']=_0x5985e9['username'],document['getElementById']('user-name')['value']=_0x5985e9['name'],document['getElementById']('user-email')['value']=_0x5985e9['email'],_0x3f8b07['value']='',_0x3f8b07['required']=![];if(_0x52d5ab)_0x52d5ab['textContent']='';_0x3ee405&&(_0x3ee405['style']['display']='none'),_0x2267a1&&(_0x2267a1['textContent']='Leave\x20blank\x20to\x20keep\x20current\x20password'),_0x20acdb['hidden']=![],setTimeout(()=>{document['getElementById']('user-username')['focus']();},0x64);};function hideUserModal(){const _0x400659=document['getElementById']('user-modal'),_0x461010=document['getElementById']('form-error'),_0x194ea0=document['getElementById']('save-user');_0x400659['hidden']=!![],_0x461010['hidden']=!![],state['editingUserId']=null,_0x194ea0&&(_0x194ea0['disabled']=![],_0x194ea0['textContent']='Save\x20User');}async function saveUser(){const _0x1115b9=document['getElementById']('user-form'),_0x2ddfe9=document['getElementById']('skip-password')?.['checked']||![];if(!_0x2ddfe9&&!_0x1115b9['checkValidity']()){_0x1115b9['reportValidity']();return;}const _0x2094ea=document['getElementById']('form-error'),_0x36ede9=document['getElementById']('save-user'),_0x1f5b10=document['getElementById']('user-username')['value']['trim'](),_0x498fa9=document['getElementById']('user-name')['value']['trim'](),_0x1f20fa=document['getElementById']('user-email')['value']['trim'](),_0x504422=document['getElementById']('user-password')['value'];if(!_0x1f5b10||!_0x498fa9||!_0x1f20fa){_0x2094ea['textContent']='Please\x20fill\x20in\x20all\x20required\x20fields',_0x2094ea['hidden']=![],_0x2094ea['scrollIntoView']({'behavior':'smooth','block':'nearest'});return;}_0x2094ea['hidden']=!![];const _0x360cb2=_0x36ede9['textContent'];_0x36ede9['disabled']=!![],_0x36ede9['textContent']=state['editingUserId']?'Updating...':'Creating...';try{if(state['editingUserId']){const _0x3c0b7f={'username':_0x1f5b10,'name':_0x498fa9,'email':_0x1f20fa};_0x504422&&(_0x3c0b7f['password']=_0x504422),await API['updateUser'](state['editingUserId'],_0x3c0b7f),Utils['showToast']('User\x20updated\x20successfully','success'),await loadUsers(),hideUserModal();}else{const _0x452ff9={'username':_0x1f5b10,'name':_0x498fa9,'email':_0x1f20fa};if(!_0x2ddfe9){if(!_0x504422)throw new Error('Password\x20is\x20required\x20for\x20new\x20users');_0x452ff9['password']=_0x504422;}const _0x25858d=await API['createUser'](_0x452ff9),_0x2973dc=_0x25858d['user'];if(_0x2ddfe9||!_0x504422){const _0x358539=await API['createPasswordToken'](_0x2973dc['id'],'setup',![]);state['setupLinkData']={'username':_0x2973dc['username'],'email':_0x2973dc['email'],'url':_0x358539['token']['setupUrl'],'userId':_0x2973dc['id'],'type':'setup','emailSent':![]},await loadUsers(),hideUserModal(),showSetupLinkModal();}else Utils['showToast']('User\x20created\x20successfully','success'),await loadUsers(),hideUserModal();}}catch(_0xc29009){console['error']('Failed\x20to\x20save\x20user',_0xc29009),_0x2094ea['textContent']=_0xc29009['message'],_0x2094ea['hidden']=![],_0x2094ea['scrollIntoView']({'behavior':'smooth','block':'nearest'}),_0x36ede9['disabled']=![],_0x36ede9['textContent']=_0x360cb2;}}window['deleteUser']=function(_0x58f782){const _0x13065b=state['users']['find'](_0x48e7db=>_0x48e7db['id']===_0x58f782);if(!_0x13065b)return;state['deletingUserId']=_0x58f782;const _0x231527=document['getElementById']('delete-modal'),_0x39f070=document['getElementById']('delete-user-name');_0x39f070['textContent']=_0x13065b['name']+'\x20('+_0x13065b['username']+')',_0x231527['hidden']=![];};function hideDeleteModal(){const _0x1199cf=document['getElementById']('delete-modal');_0x1199cf['hidden']=!![],state['deletingUserId']=null;const _0xb7f281=document['getElementById']('confirm-delete');_0xb7f281&&(_0xb7f281['disabled']=![],_0xb7f281['textContent']='Delete\x20User');}async function confirmDeleteUser(){if(!state['deletingUserId'])return;const _0x44f46c=document['getElementById']('confirm-delete'),_0x4899b0=_0x44f46c['textContent'];_0x44f46c['disabled']=!![],_0x44f46c['textContent']='Deleting...';try{await API['deleteUser'](state['deletingUserId']),Utils['showToast']('User\x20deleted\x20successfully','success'),await loadUsers(),hideDeleteModal();}catch(_0x527e2d){console['error']('Failed\x20to\x20delete\x20user',_0x527e2d),Utils['showToast']('Failed\x20to\x20delete\x20user:\x20'+_0x527e2d['message'],'error'),_0x44f46c['disabled']=![],_0x44f46c['textContent']=_0x4899b0;}}function handleSkipPasswordChange(_0x5c94fd){const _0x2740db=document['getElementById']('user-password'),_0x23e917=_0x5c94fd['target']['checked'];_0x23e917?(_0x2740db['required']=![],_0x2740db['disabled']=!![],_0x2740db['value']=''):(_0x2740db['required']=!![],_0x2740db['disabled']=![]);}function showSetupLinkModal(){if(!state['setupLinkData'])return;const _0x53179f=document['getElementById']('setup-link-modal'),_0x3431ef=document['getElementById']('setup-link-username'),_0x3b1701=document['getElementById']('setup-link-url'),_0xc5dc0a=document['getElementById']('email-setup-link'),_0xf48070=document['getElementById']('email-button-text');_0x3431ef['textContent']=state['setupLinkData']['username'],_0x3b1701['textContent']=state['setupLinkData']['url'],_0xc5dc0a&&_0xf48070&&(_0xc5dc0a['disabled']=![],_0xf48070['textContent']='Email\x20Link',state['emailConfigured']&&!state['setupLinkData']['emailSent']?_0xc5dc0a['style']['display']='inline-block':_0xc5dc0a['style']['display']='none'),_0x53179f['hidden']=![];}function hideSetupLinkModal(){const _0x402123=document['getElementById']('setup-link-modal');_0x402123['hidden']=!![],state['setupLinkData']=null;}async function copySetupLink(){if(!state['setupLinkData'])return;try{await navigator['clipboard']['writeText'](state['setupLinkData']['url']),Utils['showToast']('Link\x20copied\x20to\x20clipboard','success');}catch(_0x164077){console['error']('Failed\x20to\x20copy\x20link',_0x164077),Utils['showToast']('Failed\x20to\x20copy\x20link','error');}}async function emailSetupLink(){if(!state['setupLinkData'])return;const _0x22e95f=document['getElementById']('email-setup-link'),_0x59695a=document['getElementById']('email-button-text');if(!_0x22e95f||!_0x59695a)return;const _0x5f4d47=_0x59695a['textContent'];_0x22e95f['disabled']=!![],_0x59695a['textContent']='Sending...';try{const _0x42d2ec=await API['createPasswordToken'](state['setupLinkData']['userId'],state['setupLinkData']['type'],!![]);if(_0x42d2ec['emailSent'])Utils['showToast']('Email\x20sent\x20to\x20'+state['setupLinkData']['email'],'success'),state['setupLinkData']['emailSent']=!![],_0x22e95f['style']['display']='none';else{const _0x3ccebc=_0x42d2ec['emailError']||'Failed\x20to\x20send\x20email';Utils['showToast'](_0x3ccebc,'error'),_0x22e95f['disabled']=![],_0x59695a['textContent']=_0x5f4d47;}}catch(_0x35bebc){console['error']('Failed\x20to\x20email\x20setup\x20link',_0x35bebc),Utils['showToast']('Failed\x20to\x20send\x20email:\x20'+_0x35bebc['message'],'error'),_0x22e95f['disabled']=![],_0x59695a['textContent']=_0x5f4d47;}}window['resetPassword']=async function(_0x23b2b1){const _0x4d93d2=state['users']['find'](_0xb26310=>_0xb26310['id']===_0x23b2b1);if(!_0x4d93d2)return;const _0x356006=await ConfirmDialog['show']({'title':'Reset\x20Password','message':'Generate\x20a\x20password\x20reset\x20link\x20for\x20'+_0x4d93d2['name']+'\x20('+_0x4d93d2['username']+')?\x20This\x20will\x20create\x20a\x20link\x20that\x20they\x20can\x20use\x20to\x20set\x20a\x20new\x20password.','confirmText':'Generate\x20Link'});if(!_0x356006)return;try{const _0x3e8e90=await API['createPasswordToken'](_0x23b2b1,'reset',![]);state['setupLinkData']={'username':_0x4d93d2['username'],'email':_0x4d93d2['email'],'url':_0x3e8e90['token']['setupUrl'],'userId':_0x4d93d2['id'],'type':'reset','emailSent':![]},showSetupLinkModal();}catch(_0x3c22fe){console['error']('Failed\x20to\x20create\x20password\x20reset\x20link',_0x3c22fe),Utils['showToast']('Failed\x20to\x20create\x20password\x20reset\x20link:\x20'+_0x3c22fe['message'],'error');}};
@@ -1 +1 @@
1
- import{API,Utils}from'./app.js';const dragState={'draggedTaskId':null,'draggedElement':null,'sourceGroupId':null,'isDragging':![]},AGENT_ICONS={'claude':'<svg\x20viewBox=\x220\x200\x2016\x2016\x22\x20fill=\x22currentColor\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20aria-hidden=\x22true\x22><path\x20d=\x22m3.127\x2010.604\x203.135-1.76.053-.153-.053-.085H6.11l-.525-.032-1.791-.048-1.554-.065-1.505-.08-.38-.081L0\x207.832l.036-.234.32-.214.455.04\x201.009.069\x201.513.105\x201.097.064\x201.626.17h.259l.036-.105-.089-.065-.068-.064-1.566-1.062-1.695-1.121-.887-.646-.48-.327-.243-.306-.104-.67.435-.48.585.04.15.04.593.456\x201.267.981\x201.654\x201.218.242.202.097-.068.012-.049-.109-.181-.9-1.626-.96-1.655-.428-.686-.113-.411a2\x202\x200\x200\x201-.068-.484l.496-.674L4.446\x200l.662.089.279.242.411.94.666\x201.48\x201.033\x202.014.302.597.162.553.06.17h.105v-.097l.085-1.134.157-1.392.154-1.792.052-.504.25-.605.497-.327.387.186.319.456-.045.294-.19\x201.23-.37\x201.93-.243\x201.29h.142l.161-.16.654-.868\x201.097-1.372.484-.545.565-.601.363-.287h.686l.505.751-.226.775-.707.895-.585.759-.839\x201.13-.524.904.048.072.125-.012\x201.897-.403\x201.024-.186\x201.223-.21.553.258.06.263-.218.536-1.307.323-1.533.307-2.284.54-.028.02.032.04\x201.029.098.44.024h1.077l2.005.15.525.346.315.424-.053.323-.807.411-3.631-.863-.872-.218h-.12v.073l.726.71\x201.331\x201.202\x201.667\x201.55.084.383-.214.302-.226-.032-1.464-1.101-.565-.497-1.28-1.077h-.084v.113l.295.432\x201.557\x202.34.08.718-.112.234-.404.141-.444-.08-.911-1.28-.94-1.44-.759-1.291-.093.053-.448\x204.821-.21.246-.484.186-.403-.307-.214-.496.214-.98.258-1.28.21-1.016.19-1.263.112-.42-.008-.028-.092.012-.953\x201.307-1.448\x201.957-1.146\x201.227-.274.109-.477-.247.045-.44.266-.39\x201.586-2.018.956-1.25.617-.723-.004-.105h-.036l-4.212\x204.212z\x22/></svg>','codex':'<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22currentColor\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20aria-hidden=\x22true\x22><path\x20d=\x22M22.2819\x209.8211a5.9847\x205.9847\x200\x200\x200-.5157-4.9108\x206.0462\x206.0462\x200\x200\x200-6.5098-2.9A6.0651\x206.0651\x200\x200\x200\x204.9807\x204.1818a5.9847\x205.9847\x200\x200\x200-3.9977\x202.9\x206.0462\x206.0462\x200\x200\x200\x20.7427\x207.0966\x205.98\x205.98\x200\x200\x200\x20.511\x204.9107\x206.051\x206.051\x200\x200\x200\x206.5146\x202.9001A5.9847\x205.9847\x200\x200\x200\x2013.2599\x2024a6.0557\x206.0557\x200\x200\x200\x205.7718-4.2058\x205.9894\x205.9894\x200\x200\x200\x203.9977-2.9001\x206.0557\x206.0557\x200\x200\x200-.7475-7.0729zm-9.022\x2012.6081a4.4755\x204.4755\x200\x200\x201-2.8764-1.0408l.1419-.0804\x204.7783-2.7582a.7948.7948\x200\x200\x200\x20.3927-.6813v-6.7369l2.02\x201.1686a.071.071\x200\x200\x201\x20.038.052v5.5826a4.504\x204.504\x200\x200\x201-4.4945\x204.4944zm-9.6607-4.1254a4.4708\x204.4708\x200\x200\x201-.5346-3.0137l.142.0852\x204.783\x202.7582a.7712.7712\x200\x200\x200\x20.7806\x200l5.8428-3.3685v2.3324a.0804.0804\x200\x200\x201-.0332.0615L9.74\x2019.9502a4.4992\x204.4992\x200\x200\x201-6.1408-1.6464zM2.3408\x207.8956a4.485\x204.485\x200\x200\x201\x202.3655-1.9728V11.6a.7664.7664\x200\x200\x200\x20.3879.6765l5.8144\x203.3543-2.0201\x201.1685a.0757.0757\x200\x200\x201-.071\x200l-4.8303-2.7865A4.504\x204.504\x200\x200\x201\x202.3408\x207.872zm16.5963\x203.8558L13.1038\x208.364\x2015.1192\x207.2a.0757.0757\x200\x200\x201\x20.071\x200l4.8303\x202.7913a4.4944\x204.4944\x200\x200\x201-.6765\x208.1042v-5.6772a.79.79\x200\x200\x200-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759\x200\x200\x200-.7854\x200L9.409\x209.2297V6.8974a.0662.0662\x200\x200\x201\x20.0284-.0615l4.8303-2.7866a4.4992\x204.4992\x200\x200\x201\x206.6802\x204.66zM8.3065\x2012.863l-2.02-1.1638a.0804.0804\x200\x200\x201-.038-.0567V6.0742a4.4992\x204.4992\x200\x200\x201\x207.3757-3.4537l-.142.0805L8.704\x205.459a.7948.7948\x200\x200\x200-.3927.6813zm1.0976-2.3654l2.602-1.4998\x202.6069\x201.4998v2.9994l-2.5974\x201.4997-2.6067-1.4997Z\x22/></svg>','gemini':'<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20aria-hidden=\x22true\x22><path\x20d=\x22M12\x202L9.09\x209.09\x202\x2012l7.09\x202.91L12\x2022l2.91-7.09L22\x2012l-7.09-2.91z\x22></path></svg>','unknown':'<svg\x20viewBox=\x220\x200\x2020\x2020\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x221.6\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20aria-hidden=\x22true\x22><circle\x20cx=\x2210\x22\x20cy=\x2210\x22\x20r=\x228\x22\x20/><path\x20d=\x22M10\x206.5c-1.1\x200-2\x20.7-2\x201.6\x200\x20.9\x201\x201.3\x201.6\x201.7.7.4\x201\x20.8\x201\x201.5V12\x22\x20/><circle\x20cx=\x2210\x22\x20cy=\x2214\x22\x20r=\x220.8\x22\x20fill=\x22currentColor\x22\x20stroke=\x22none\x22\x20/></svg>'},STATUS_ICONS={'running':'<svg\x20class=\x22status-icon\x20spinning\x22\x20viewBox=\x220\x200\x2016\x2016\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222.5\x22\x20stroke-linecap=\x22round\x22><path\x20d=\x22M8\x202\x20A6\x206\x200\x200\x201\x2014\x208\x22/></svg>','completed':'<svg\x20class=\x22status-icon\x22\x20viewBox=\x220\x200\x2016\x2016\x22\x20fill=\x22currentColor\x22><path\x20d=\x22M8\x200a8\x208\x200\x201\x200\x200\x2016A8\x208\x200\x200\x200\x208\x200zm3.78\x206.28-4.5\x204.5a.75.75\x200\x200\x201-1.06\x200l-2-2a.75.75\x200\x201\x201\x201.06-1.06L6.75\x209.19l3.97-3.97a.75.75\x200\x201\x201\x201.06\x201.06z\x22/></svg>','failed':'<svg\x20class=\x22status-icon\x22\x20viewBox=\x220\x200\x2016\x2016\x22\x20fill=\x22currentColor\x22><path\x20d=\x22M8\x200a8\x208\x200\x201\x200\x200\x2016A8\x208\x200\x200\x200\x208\x200zm3.53\x2010.47a.75.75\x200\x201\x201-1.06\x201.06L8\x209.06l-2.47\x202.47a.75.75\x200\x200\x201-1.06-1.06L6.94\x208\x204.47\x205.53a.75.75\x200\x200\x201\x201.06-1.06L8\x206.94l2.47-2.47a.75.75\x200\x200\x201\x201.06\x201.06L9.06\x208l2.47\x202.47z\x22/></svg>','staged':'<svg\x20class=\x22status-icon\x22\x20viewBox=\x220\x200\x2016\x2016\x22\x20fill=\x22currentColor\x22><path\x20d=\x22M8\x200a8\x208\x200\x201\x200\x200\x2016A8\x208\x200\x200\x200\x208\x200zm0\x2012a.75.75\x200\x201\x201\x200-1.5.75.75\x200\x200\x201\x200\x201.5zm1-3.5a1\x201\x200\x200\x201-2\x200V5a1\x201\x200\x201\x201\x202\x200v3.5z\x22/></svg>','queued':'<svg\x20class=\x22status-icon\x22\x20viewBox=\x220\x200\x2016\x2016\x22\x20fill=\x22currentColor\x22><path\x20d=\x22M8\x200a8\x208\x200\x201\x200\x200\x2016A8\x208\x200\x200\x200\x208\x200zm0\x2014A6\x206\x200\x201\x201\x208\x202a6\x206\x200\x200\x201\x200\x2012zm1-6.5V4H7v4.5l3\x203\x201.5-1.5-2.5-2.5z\x22/></svg>'};export class VariantGroupingManager{constructor(_0x4607ac={}){this['container']=null,this['onGroupChange']=_0x4607ac['onGroupChange']||(()=>{}),this['onAddExistingTask']=_0x4607ac['onAddExistingTask']||(()=>{}),this['tasks']=[],this['groupId']=_0x4607ac['groupId']||null,this['isOpen']=![];}['init'](_0x178fe0,_0x25047d,_0x47ee41){this['container']=_0x178fe0,this['tasks']=_0x25047d,this['groupId']=_0x47ee41,this['render'](),this['attachEventListeners']();}['updateTasks'](_0x301bcd){const _0x1e7a1d=new Map(_0x301bcd['map'](_0x417a1f=>[_0x417a1f['taskId'],_0x417a1f]));this['tasks']=this['tasks']['map'](_0x6587d5=>{const _0x5a453f=_0x1e7a1d['get'](_0x6587d5['taskId']);return _0x5a453f?_0x5a453f:_0x6587d5;});for(const _0x4b1d9f of _0x301bcd){!this['tasks']['some'](_0x32e76d=>_0x32e76d['taskId']===_0x4b1d9f['taskId'])&&this['tasks']['push'](_0x4b1d9f);}this['isOpen']&&this['render']();}['open'](){this['isOpen']=!![],this['render'](),this['container']?.['classList']['add']('open');}['close'](){this['isOpen']=![],this['container']?.['classList']['remove']('open');}['render'](){if(!this['container'])return;const _0x533c15=this['tasks']['filter'](_0x1a6aba=>_0x1a6aba['groupId']===this['groupId'])['sort']((_0x481848,_0x4e0847)=>(_0x481848['groupIndex']??0x0)-(_0x4e0847['groupIndex']??0x0)),_0x435e58=this['tasks']['filter'](_0xf2cef7=>!_0xf2cef7['groupId']||_0xf2cef7['groupId']!==this['groupId']);this['container']['innerHTML']='\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22variant-grouping-manager\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<h3>Manage\x20Task\x20Group</h3>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22vgm-close-btn\x22\x20title=\x22Close\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20width=\x2220\x22\x20height=\x2220\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M18\x206L6\x2018M6\x206l12\x2012\x22/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-content\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-section\x20vgm-grouped\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-section-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-section-title\x22>Grouped\x20Variants</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-section-count\x22>'+_0x533c15['length']+'</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-drop-zone\x20vgm-grouped-zone\x22\x20data-zone=\x22grouped\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x533c15['length']===0x0?'<div\x20class=\x22vgm-empty-hint\x22>Drag\x20variants\x20here\x20to\x20add\x20to\x20group</div>':_0x533c15['map']((_0x56ad01,_0xbe2f)=>this['renderVariantCard'](_0x56ad01,_0xbe2f,!![]))['join'](''))+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-divider\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-divider-line\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-divider-text\x22>Drag\x20to\x20move</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-divider-line\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-section\x20vgm-ungrouped\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-section-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-section-title\x22>Ungrouped\x20Tasks</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-section-count\x22>'+_0x435e58['length']+'</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-drop-zone\x20vgm-ungrouped-zone\x22\x20data-zone=\x22ungrouped\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x435e58['length']===0x0?'<div\x20class=\x22vgm-empty-hint\x22>Drag\x20variants\x20here\x20to\x20remove\x20from\x20group</div>':_0x435e58['map']((_0x1cf988,_0x4ed13e)=>this['renderVariantCard'](_0x1cf988,_0x4ed13e,![]))['join'](''))+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-actions\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22vgm-btn\x20vgm-btn-secondary\x20vgm-add-existing-btn\x22\x20title=\x22Add\x20an\x20existing\x20task\x20to\x20this\x20group\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M12\x205v14M5\x2012h14\x22/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Add\x20Existing\x20Task\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20';}['renderVariantCard'](_0x5d257c,_0x5c5039,_0x11f840){const _0x4d8903=_0x5d257c['envVars']?.['CODER_AGENT']||_0x5d257c['envVars']?.['default_agent']||'claude',_0x4df607=AGENT_ICONS[_0x4d8903['toLowerCase']()]||AGENT_ICONS['claude'],_0x1f9b77=STATUS_ICONS[_0x5d257c['status']]||'',_0x37da15='status-'+(_0x5d257c['status']||'unknown'),_0x2dcd07=_0x5d257c['isWinner']?'<span\x20class=\x22vgm-badge\x20vgm-badge-winner\x22\x20title=\x22Winner\x22>★</span>':'',_0x4df07d=_0x5d257c['approvedBy']?'<span\x20class=\x22vgm-badge\x20vgm-badge-approved\x22\x20title=\x22Approved\x22><svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22\x20width=\x2212\x22\x20height=\x2212\x22><path\x20d=\x22M14\x209V5a3\x203\x200\x200\x200-3-3l-4\x209v11h11.28a2\x202\x200\x200\x200\x202-1.7l1.38-9a2\x202\x200\x200\x200-2-2.3zM7\x2022H4a2\x202\x200\x200\x201-2-2v-7a2\x202\x200\x200\x201\x202-2h3\x22></path></svg></span>':'';return'\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-variant-card\x20'+_0x37da15+'\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20draggable=\x22true\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20data-task-id=\x22'+_0x5d257c['taskId']+'\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20data-is-grouped=\x22'+_0x11f840+'\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20data-index=\x22'+_0x5c5039+'\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-variant-drag-handle\x22\x20title=\x22Drag\x20to\x20reorder\x20or\x20move\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20fill=\x22currentColor\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M8\x206h2v2H8V6zm6\x200h2v2h-2V6zM8\x2011h2v2H8v-2zm6\x200h2v2h-2v-2zm-6\x205h2v2H8v-2zm6\x200h2v2h-2v-2z\x22/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-variant-icon\x22\x20data-agent=\x22'+_0x4d8903['toLowerCase']()+'\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x4df607+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-variant-info\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-variant-name\x22>'+Utils['escapeHtml'](_0x5d257c['name']||'Task\x20'+_0x5d257c['taskId']['slice'](-0x6))+'</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-variant-meta\x22>'+Utils['escapeHtml'](_0x4d8903)+'\x20·\x20'+(_0x5d257c['status']||'unknown')+'</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-variant-badges\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x2dcd07+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x4df07d+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-variant-status\x20'+_0x37da15+'\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x1f9b77+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22vgm-variant-remove-btn\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title=\x22'+(_0x11f840?'Remove\x20from\x20group':'Add\x20to\x20group')+'\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20data-task-id=\x22'+_0x5d257c['taskId']+'\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20data-action=\x22'+(_0x11f840?'remove':'add')+'\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x11f840?'<path\x20d=\x22M18\x206L6\x2018M6\x206l12\x2012\x22/>':'<path\x20d=\x22M12\x205v14M5\x2012h14\x22/>')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20';}['attachEventListeners'](){if(!this['container'])return;this['container']['addEventListener']('click',_0xf38902=>{_0xf38902['target']['closest']('.vgm-close-btn')&&(this['close'](),this['onGroupChange'](this['tasks'])),_0xf38902['target']['closest']('.vgm-add-existing-btn')&&(this['close'](),this['onAddExistingTask'](this['groupId']));}),this['container']['addEventListener']('click',async _0x40cdc5=>{const _0x4605a6=_0x40cdc5['target']['closest']('.vgm-variant-remove-btn');if(!_0x4605a6)return;const _0x29db32=_0x4605a6['dataset']['taskId'],_0x3519ac=_0x4605a6['dataset']['action'];try{_0x3519ac==='remove'?await this['removeFromGroup'](_0x29db32):await this['addToGroup'](_0x29db32);}catch(_0x34d458){console['error']('Failed\x20to\x20update\x20group:',_0x34d458),Utils['showToast'](_0x34d458['message']||'Failed\x20to\x20update\x20group','error');}}),this['container']['addEventListener']('dragstart',_0x5328df=>this['handleDragStart'](_0x5328df)),this['container']['addEventListener']('dragend',_0x2a9d3b=>this['handleDragEnd'](_0x2a9d3b)),this['container']['addEventListener']('dragover',_0x42c719=>this['handleDragOver'](_0x42c719)),this['container']['addEventListener']('dragleave',_0x45cbd2=>this['handleDragLeave'](_0x45cbd2)),this['container']['addEventListener']('drop',_0x3c67c3=>this['handleDrop'](_0x3c67c3));}['handleDragStart'](_0x4e4b2c){const _0x2c6292=_0x4e4b2c['target']['closest']('.vgm-variant-card');if(!_0x2c6292)return;dragState['draggedTaskId']=_0x2c6292['dataset']['taskId'],dragState['draggedElement']=_0x2c6292,dragState['sourceGroupId']=_0x2c6292['dataset']['isGrouped']==='true'?this['groupId']:null,dragState['isDragging']=!![],_0x2c6292['classList']['add']('dragging'),_0x4e4b2c['dataTransfer']['effectAllowed']='move',_0x4e4b2c['dataTransfer']['setData']('text/plain',_0x2c6292['dataset']['taskId']),this['container']['classList']['add']('is-dragging');}['handleDragEnd'](_0x2fb63c){const _0x460c59=_0x2fb63c['target']['closest']('.vgm-variant-card');_0x460c59&&_0x460c59['classList']['remove']('dragging'),this['container']['querySelectorAll']('.drag-over,\x20.drop-indicator')['forEach'](_0x41ccb4=>{_0x41ccb4['classList']['remove']('drag-over','drop-indicator','drop-before','drop-after');}),this['container']['classList']['remove']('is-dragging'),dragState['isDragging']=![],dragState['draggedTaskId']=null,dragState['draggedElement']=null,dragState['sourceGroupId']=null;}['handleDragOver'](_0x2f7cae){_0x2f7cae['preventDefault'](),_0x2f7cae['dataTransfer']['dropEffect']='move';const _0x26e8b1=_0x2f7cae['target']['closest']('.vgm-drop-zone'),_0x4d748e=_0x2f7cae['target']['closest']('.vgm-variant-card');this['container']['querySelectorAll']('.vgm-drop-zone')['forEach'](_0x4a7879=>{_0x4a7879['classList']['toggle']('drag-over',_0x4a7879===_0x26e8b1);});if(_0x4d748e&&_0x4d748e!==dragState['draggedElement']){const _0x222ea8=_0x4d748e['getBoundingClientRect'](),_0x1ccb7b=_0x222ea8['top']+_0x222ea8['height']/0x2,_0x487ff6=_0x2f7cae['clientY']<_0x1ccb7b;this['container']['querySelectorAll']('.vgm-variant-card')['forEach'](_0xc99c96=>{_0xc99c96!==_0x4d748e&&_0xc99c96['classList']['remove']('drop-before','drop-after');}),_0x4d748e['classList']['toggle']('drop-before',_0x487ff6),_0x4d748e['classList']['toggle']('drop-after',!_0x487ff6);}}['handleDragLeave'](_0x4cad2c){const _0x58347b=_0x4cad2c['target']['closest']('.vgm-drop-zone');_0x58347b&&!_0x58347b['contains'](_0x4cad2c['relatedTarget'])&&_0x58347b['classList']['remove']('drag-over');}async['handleDrop'](_0x47c591){_0x47c591['preventDefault']();const _0xb31966=_0x47c591['target']['closest']('.vgm-drop-zone'),_0x5782f7=_0x47c591['target']['closest']('.vgm-variant-card'),_0x5b43f6=_0x47c591['dataTransfer']['getData']('text/plain');if(!_0xb31966||!_0x5b43f6)return;this['container']['querySelectorAll']('.drag-over,\x20.drop-before,\x20.drop-after')['forEach'](_0x19ad02=>{_0x19ad02['classList']['remove']('drag-over','drop-before','drop-after');});const _0x54c951=_0xb31966['dataset']['zone'],_0x38469f=_0x54c951==='grouped',_0x2a3617=dragState['sourceGroupId']===this['groupId'];try{if(_0x38469f&&!_0x2a3617){let _0xfcee39=this['tasks']['filter'](_0x3a2dec=>_0x3a2dec['groupId']===this['groupId'])['length'];if(_0x5782f7){const _0x4c5303=_0x5782f7['dataset']['taskId'],_0x1a884f=this['tasks']['find'](_0x5c20c9=>_0x5c20c9['taskId']===_0x4c5303);if(_0x1a884f?.['groupIndex']!==undefined){const _0x2b65c1=_0x5782f7['getBoundingClientRect'](),_0x1d9867=_0x47c591['clientY']<_0x2b65c1['top']+_0x2b65c1['height']/0x2;_0xfcee39=_0x1a884f['groupIndex']+(_0x1d9867?0x0:0x1);}}await this['addToGroup'](_0x5b43f6,_0xfcee39);}else{if(!_0x38469f&&_0x2a3617)await this['removeFromGroup'](_0x5b43f6);else _0x38469f&&_0x2a3617&&_0x5782f7&&await this['reorderInGroup'](_0x5b43f6,_0x5782f7,_0x47c591['clientY']);}}catch(_0x20af4d){console['error']('Drop\x20operation\x20failed:',_0x20af4d),Utils['showToast'](_0x20af4d['message']||'Failed\x20to\x20move\x20variant','error');}}async['addToGroup'](_0x4cb14a,_0x35c09a){const _0xc04181=this['tasks']['find'](_0x16d5bb=>_0x16d5bb['taskId']===_0x4cb14a);if(!_0xc04181)return;_0x35c09a===undefined&&(_0x35c09a=this['tasks']['filter'](_0x14eaa8=>_0x14eaa8['groupId']===this['groupId'])['length']),!this['groupId']&&(this['groupId']=API['generateGroupId'](),await API['createTaskGroup']({'groupId':this['groupId']})),await API['updateTaskGroup'](_0x4cb14a,this['groupId'],_0x35c09a),_0xc04181['groupId']=this['groupId'],_0xc04181['groupIndex']=_0x35c09a,this['render'](),this['onGroupChange'](this['tasks']);}async['removeFromGroup'](_0x3e1cc1){const _0x58d6c6=this['tasks']['find'](_0x298cc5=>_0x298cc5['taskId']===_0x3e1cc1);if(!_0x58d6c6)return;await API['removeTaskFromGroup'](_0x3e1cc1),_0x58d6c6['groupId']=null,_0x58d6c6['groupIndex']=null,this['render'](),this['onGroupChange'](this['tasks']);}async['reorderInGroup'](_0x202bc0,_0x42e3de,_0x4d2fac){const _0x1ad385=this['tasks']['find'](_0x3223ad=>_0x3223ad['taskId']===_0x202bc0),_0x1b2522=_0x42e3de['dataset']['taskId'],_0x1f86a9=this['tasks']['find'](_0xee802f=>_0xee802f['taskId']===_0x1b2522);if(!_0x1ad385||!_0x1f86a9||_0x1ad385['taskId']===_0x1f86a9['taskId'])return;const _0x4cf614=_0x42e3de['getBoundingClientRect'](),_0x2fd59d=_0x4d2fac<_0x4cf614['top']+_0x4cf614['height']/0x2;let _0x1bebce=_0x1f86a9['groupIndex']??0x0;if(!_0x2fd59d)_0x1bebce++;if((_0x1ad385['groupIndex']??0x0)<(_0x1f86a9['groupIndex']??0x0))_0x1bebce--;if(_0x1bebce===_0x1ad385['groupIndex'])return;await API['updateTaskGroup'](_0x202bc0,this['groupId'],_0x1bebce);const _0x1e44cb=this['tasks']['filter'](_0x37a0e4=>_0x37a0e4['groupId']===this['groupId'])['sort']((_0x7d9f75,_0x41fa7c)=>(_0x7d9f75['groupIndex']??0x0)-(_0x41fa7c['groupIndex']??0x0)),_0xeb1b36=_0x1e44cb['findIndex'](_0x442c68=>_0x442c68['taskId']===_0x202bc0);_0xeb1b36!==-0x1&&_0x1e44cb['splice'](_0xeb1b36,0x1),_0x1e44cb['splice'](_0x1bebce,0x0,_0x1ad385),_0x1e44cb['forEach']((_0x3dacea,_0x3f7db1)=>{_0x3dacea['groupIndex']=_0x3f7db1;}),this['render'](),this['onGroupChange'](this['tasks']);}}export function initializeTabDragDrop(_0x261250,_0x56b24c,_0xb061b7,_0x40ae8c={}){if(!_0x261250)return;const {onReorder:_0x410451,onRemove:_0x15e7d5}=_0x40ae8c,_0x205506=_0x261250['querySelectorAll']('.task-tab');_0x205506['forEach']((_0x2d1293,_0x2befa2)=>{_0x2d1293['setAttribute']('draggable','true'),_0x2d1293['dataset']['index']=_0x2befa2,_0x2d1293['addEventListener']('dragstart',_0x775951=>{_0x775951['dataTransfer']['effectAllowed']='move',_0x775951['dataTransfer']['setData']('text/plain',_0x2d1293['dataset']['taskId']),_0x2d1293['classList']['add']('dragging'),_0x261250['classList']['add']('is-dragging');}),_0x2d1293['addEventListener']('dragend',()=>{_0x2d1293['classList']['remove']('dragging'),_0x261250['classList']['remove']('is-dragging'),_0x261250['querySelectorAll']('.drop-indicator')['forEach'](_0x8dea78=>{_0x8dea78['classList']['remove']('drop-indicator','drop-before','drop-after');});}),_0x2d1293['addEventListener']('dragover',_0x3c2aca=>{_0x3c2aca['preventDefault'](),_0x3c2aca['dataTransfer']['dropEffect']='move';if(_0x2d1293['classList']['contains']('dragging'))return;const _0x1bda10=_0x2d1293['getBoundingClientRect'](),_0x74ad70=_0x1bda10['left']+_0x1bda10['width']/0x2,_0x1c9456=_0x3c2aca['clientX']<_0x74ad70;_0x205506['forEach'](_0x56aa52=>_0x56aa52['classList']['remove']('drop-before','drop-after')),_0x2d1293['classList']['add'](_0x1c9456?'drop-before':'drop-after');}),_0x2d1293['addEventListener']('dragleave',()=>{_0x2d1293['classList']['remove']('drop-before','drop-after');}),_0x2d1293['addEventListener']('drop',async _0xc4d860=>{_0xc4d860['preventDefault']();const _0x24d76b=_0xc4d860['dataTransfer']['getData']('text/plain'),_0x20a504=_0x2d1293['dataset']['taskId'];if(_0x24d76b===_0x20a504)return;const _0x504f01=_0x2d1293['getBoundingClientRect'](),_0x59305c=_0xc4d860['clientX']<_0x504f01['left']+_0x504f01['width']/0x2;_0x2d1293['classList']['remove']('drop-before','drop-after'),_0x410451&&await _0x410451(_0x24d76b,_0x20a504,_0x59305c);});});const _0x8e539f=document['createElement']('div');return _0x8e539f['className']='task-tab-remove-zone',_0x8e539f['innerHTML']='\x0a\x20\x20\x20\x20<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20<path\x20d=\x22M18\x206L6\x2018M6\x206l12\x2012\x22/>\x0a\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20<span>Remove\x20from\x20group</span>\x0a\x20\x20',_0x8e539f['style']['display']='none',_0x8e539f['addEventListener']('dragover',_0x251db2=>{_0x251db2['preventDefault'](),_0x8e539f['classList']['add']('drag-over');}),_0x8e539f['addEventListener']('dragleave',()=>{_0x8e539f['classList']['remove']('drag-over');}),_0x8e539f['addEventListener']('drop',async _0x5e037c=>{_0x5e037c['preventDefault'](),_0x8e539f['classList']['remove']('drag-over');const _0x1d6883=_0x5e037c['dataTransfer']['getData']('text/plain');_0x15e7d5&&await _0x15e7d5(_0x1d6883);}),_0x261250['addEventListener']('dragstart',()=>{_0x56b24c['length']>0x1&&(_0x8e539f['style']['display']='flex');}),_0x261250['addEventListener']('dragend',()=>{_0x8e539f['style']['display']='none';}),_0x261250['appendChild'](_0x8e539f),{'destroy':()=>{_0x8e539f['remove']();}};}export default VariantGroupingManager;
1
+ import{API,Utils}from'./app.js';const dragState={'draggedTaskId':null,'draggedElement':null,'sourceGroupId':null,'isDragging':![]},AGENT_ICONS={'claude':'<svg\x20viewBox=\x220\x200\x2016\x2016\x22\x20fill=\x22currentColor\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20aria-hidden=\x22true\x22><path\x20d=\x22m3.127\x2010.604\x203.135-1.76.053-.153-.053-.085H6.11l-.525-.032-1.791-.048-1.554-.065-1.505-.08-.38-.081L0\x207.832l.036-.234.32-.214.455.04\x201.009.069\x201.513.105\x201.097.064\x201.626.17h.259l.036-.105-.089-.065-.068-.064-1.566-1.062-1.695-1.121-.887-.646-.48-.327-.243-.306-.104-.67.435-.48.585.04.15.04.593.456\x201.267.981\x201.654\x201.218.242.202.097-.068.012-.049-.109-.181-.9-1.626-.96-1.655-.428-.686-.113-.411a2\x202\x200\x200\x201-.068-.484l.496-.674L4.446\x200l.662.089.279.242.411.94.666\x201.48\x201.033\x202.014.302.597.162.553.06.17h.105v-.097l.085-1.134.157-1.392.154-1.792.052-.504.25-.605.497-.327.387.186.319.456-.045.294-.19\x201.23-.37\x201.93-.243\x201.29h.142l.161-.16.654-.868\x201.097-1.372.484-.545.565-.601.363-.287h.686l.505.751-.226.775-.707.895-.585.759-.839\x201.13-.524.904.048.072.125-.012\x201.897-.403\x201.024-.186\x201.223-.21.553.258.06.263-.218.536-1.307.323-1.533.307-2.284.54-.028.02.032.04\x201.029.098.44.024h1.077l2.005.15.525.346.315.424-.053.323-.807.411-3.631-.863-.872-.218h-.12v.073l.726.71\x201.331\x201.202\x201.667\x201.55.084.383-.214.302-.226-.032-1.464-1.101-.565-.497-1.28-1.077h-.084v.113l.295.432\x201.557\x202.34.08.718-.112.234-.404.141-.444-.08-.911-1.28-.94-1.44-.759-1.291-.093.053-.448\x204.821-.21.246-.484.186-.403-.307-.214-.496.214-.98.258-1.28.21-1.016.19-1.263.112-.42-.008-.028-.092.012-.953\x201.307-1.448\x201.957-1.146\x201.227-.274.109-.477-.247.045-.44.266-.39\x201.586-2.018.956-1.25.617-.723-.004-.105h-.036l-4.212\x204.212z\x22/></svg>','codex':'<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22currentColor\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20aria-hidden=\x22true\x22><path\x20d=\x22M22.2819\x209.8211a5.9847\x205.9847\x200\x200\x200-.5157-4.9108\x206.0462\x206.0462\x200\x200\x200-6.5098-2.9A6.0651\x206.0651\x200\x200\x200\x204.9807\x204.1818a5.9847\x205.9847\x200\x200\x200-3.9977\x202.9\x206.0462\x206.0462\x200\x200\x200\x20.7427\x207.0966\x205.98\x205.98\x200\x200\x200\x20.511\x204.9107\x206.051\x206.051\x200\x200\x200\x206.5146\x202.9001A5.9847\x205.9847\x200\x200\x200\x2013.2599\x2024a6.0557\x206.0557\x200\x200\x200\x205.7718-4.2058\x205.9894\x205.9894\x200\x200\x200\x203.9977-2.9001\x206.0557\x206.0557\x200\x200\x200-.7475-7.0729zm-9.022\x2012.6081a4.4755\x204.4755\x200\x200\x201-2.8764-1.0408l.1419-.0804\x204.7783-2.7582a.7948.7948\x200\x200\x200\x20.3927-.6813v-6.7369l2.02\x201.1686a.071.071\x200\x200\x201\x20.038.052v5.5826a4.504\x204.504\x200\x200\x201-4.4945\x204.4944zm-9.6607-4.1254a4.4708\x204.4708\x200\x200\x201-.5346-3.0137l.142.0852\x204.783\x202.7582a.7712.7712\x200\x200\x200\x20.7806\x200l5.8428-3.3685v2.3324a.0804.0804\x200\x200\x201-.0332.0615L9.74\x2019.9502a4.4992\x204.4992\x200\x200\x201-6.1408-1.6464zM2.3408\x207.8956a4.485\x204.485\x200\x200\x201\x202.3655-1.9728V11.6a.7664.7664\x200\x200\x200\x20.3879.6765l5.8144\x203.3543-2.0201\x201.1685a.0757.0757\x200\x200\x201-.071\x200l-4.8303-2.7865A4.504\x204.504\x200\x200\x201\x202.3408\x207.872zm16.5963\x203.8558L13.1038\x208.364\x2015.1192\x207.2a.0757.0757\x200\x200\x201\x20.071\x200l4.8303\x202.7913a4.4944\x204.4944\x200\x200\x201-.6765\x208.1042v-5.6772a.79.79\x200\x200\x200-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759\x200\x200\x200-.7854\x200L9.409\x209.2297V6.8974a.0662.0662\x200\x200\x201\x20.0284-.0615l4.8303-2.7866a4.4992\x204.4992\x200\x200\x201\x206.6802\x204.66zM8.3065\x2012.863l-2.02-1.1638a.0804.0804\x200\x200\x201-.038-.0567V6.0742a4.4992\x204.4992\x200\x200\x201\x207.3757-3.4537l-.142.0805L8.704\x205.459a.7948.7948\x200\x200\x200-.3927.6813zm1.0976-2.3654l2.602-1.4998\x202.6069\x201.4998v2.9994l-2.5974\x201.4997-2.6067-1.4997Z\x22/></svg>','gemini':'<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20aria-hidden=\x22true\x22><path\x20d=\x22M12\x202L9.09\x209.09\x202\x2012l7.09\x202.91L12\x2022l2.91-7.09L22\x2012l-7.09-2.91z\x22></path></svg>','unknown':'<svg\x20viewBox=\x220\x200\x2020\x2020\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x221.6\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20aria-hidden=\x22true\x22><circle\x20cx=\x2210\x22\x20cy=\x2210\x22\x20r=\x228\x22\x20/><path\x20d=\x22M10\x206.5c-1.1\x200-2\x20.7-2\x201.6\x200\x20.9\x201\x201.3\x201.6\x201.7.7.4\x201\x20.8\x201\x201.5V12\x22\x20/><circle\x20cx=\x2210\x22\x20cy=\x2214\x22\x20r=\x220.8\x22\x20fill=\x22currentColor\x22\x20stroke=\x22none\x22\x20/></svg>'},STATUS_ICONS={'running':'<svg\x20class=\x22status-icon\x20spinning\x22\x20viewBox=\x220\x200\x2016\x2016\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222.5\x22\x20stroke-linecap=\x22round\x22><path\x20d=\x22M8\x202\x20A6\x206\x200\x200\x201\x2014\x208\x22/></svg>','completed':'<svg\x20class=\x22status-icon\x22\x20viewBox=\x220\x200\x2016\x2016\x22\x20fill=\x22currentColor\x22><path\x20d=\x22M8\x200a8\x208\x200\x201\x200\x200\x2016A8\x208\x200\x200\x200\x208\x200zm3.78\x206.28-4.5\x204.5a.75.75\x200\x200\x201-1.06\x200l-2-2a.75.75\x200\x201\x201\x201.06-1.06L6.75\x209.19l3.97-3.97a.75.75\x200\x201\x201\x201.06\x201.06z\x22/></svg>','failed':'<svg\x20class=\x22status-icon\x22\x20viewBox=\x220\x200\x2016\x2016\x22\x20fill=\x22currentColor\x22><path\x20d=\x22M8\x200a8\x208\x200\x201\x200\x200\x2016A8\x208\x200\x200\x200\x208\x200zm3.53\x2010.47a.75.75\x200\x201\x201-1.06\x201.06L8\x209.06l-2.47\x202.47a.75.75\x200\x200\x201-1.06-1.06L6.94\x208\x204.47\x205.53a.75.75\x200\x200\x201\x201.06-1.06L8\x206.94l2.47-2.47a.75.75\x200\x200\x201\x201.06\x201.06L9.06\x208l2.47\x202.47z\x22/></svg>','staged':'<svg\x20class=\x22status-icon\x22\x20viewBox=\x220\x200\x2016\x2016\x22\x20fill=\x22currentColor\x22><path\x20d=\x22M8\x200a8\x208\x200\x201\x200\x200\x2016A8\x208\x200\x200\x200\x208\x200zm0\x2012a.75.75\x200\x201\x201\x200-1.5.75.75\x200\x200\x201\x200\x201.5zm1-3.5a1\x201\x200\x200\x201-2\x200V5a1\x201\x200\x201\x201\x202\x200v3.5z\x22/></svg>','queued':'<svg\x20class=\x22status-icon\x22\x20viewBox=\x220\x200\x2016\x2016\x22\x20fill=\x22currentColor\x22><path\x20d=\x22M8\x200a8\x208\x200\x201\x200\x200\x2016A8\x208\x200\x200\x200\x208\x200zm0\x2014A6\x206\x200\x201\x201\x208\x202a6\x206\x200\x200\x201\x200\x2012zm1-6.5V4H7v4.5l3\x203\x201.5-1.5-2.5-2.5z\x22/></svg>'};export class VariantGroupingManager{constructor(_0x702c46={}){this['container']=null,this['onGroupChange']=_0x702c46['onGroupChange']||(()=>{}),this['onAddExistingTask']=_0x702c46['onAddExistingTask']||(()=>{}),this['tasks']=[],this['groupId']=_0x702c46['groupId']||null,this['isOpen']=![];}['init'](_0x2a7285,_0x5b290c,_0x121483){this['container']=_0x2a7285,this['tasks']=_0x5b290c,this['groupId']=_0x121483,this['render'](),this['attachEventListeners']();}['updateTasks'](_0x4d1fe0){const _0x29b308=new Map(_0x4d1fe0['map'](_0x1d3de4=>[_0x1d3de4['taskId'],_0x1d3de4]));this['tasks']=this['tasks']['map'](_0xceed33=>{const _0x1ec0ec=_0x29b308['get'](_0xceed33['taskId']);return _0x1ec0ec?_0x1ec0ec:_0xceed33;});for(const _0x333799 of _0x4d1fe0){!this['tasks']['some'](_0x1efd00=>_0x1efd00['taskId']===_0x333799['taskId'])&&this['tasks']['push'](_0x333799);}this['isOpen']&&this['render']();}['open'](){this['isOpen']=!![],this['render'](),this['container']?.['classList']['add']('open');}['close'](){this['isOpen']=![],this['container']?.['classList']['remove']('open');}['render'](){if(!this['container'])return;const _0x5a300b=this['tasks']['filter'](_0x32b306=>_0x32b306['groupId']===this['groupId'])['sort']((_0x4d488d,_0x1719f5)=>(_0x4d488d['groupIndex']??0x0)-(_0x1719f5['groupIndex']??0x0)),_0xa4538c=this['tasks']['filter'](_0x46fea4=>!_0x46fea4['groupId']||_0x46fea4['groupId']!==this['groupId']);this['container']['innerHTML']='\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22variant-grouping-manager\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<h3>Manage\x20Task\x20Group</h3>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22vgm-close-btn\x22\x20title=\x22Close\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20width=\x2220\x22\x20height=\x2220\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M18\x206L6\x2018M6\x206l12\x2012\x22/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-content\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-section\x20vgm-grouped\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-section-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-section-title\x22>Grouped\x20Variants</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-section-count\x22>'+_0x5a300b['length']+'</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-drop-zone\x20vgm-grouped-zone\x22\x20data-zone=\x22grouped\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x5a300b['length']===0x0?'<div\x20class=\x22vgm-empty-hint\x22>Drag\x20variants\x20here\x20to\x20add\x20to\x20group</div>':_0x5a300b['map']((_0x92b8b7,_0x1fd322)=>this['renderVariantCard'](_0x92b8b7,_0x1fd322,!![]))['join'](''))+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-divider\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-divider-line\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-divider-text\x22>Drag\x20to\x20move</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-divider-line\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-section\x20vgm-ungrouped\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-section-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-section-title\x22>Ungrouped\x20Tasks</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-section-count\x22>'+_0xa4538c['length']+'</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-drop-zone\x20vgm-ungrouped-zone\x22\x20data-zone=\x22ungrouped\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0xa4538c['length']===0x0?'<div\x20class=\x22vgm-empty-hint\x22>Drag\x20variants\x20here\x20to\x20remove\x20from\x20group</div>':_0xa4538c['map']((_0x2d0e4c,_0x17f63c)=>this['renderVariantCard'](_0x2d0e4c,_0x17f63c,![]))['join'](''))+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-actions\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22vgm-btn\x20vgm-btn-secondary\x20vgm-add-existing-btn\x22\x20title=\x22Add\x20an\x20existing\x20task\x20to\x20this\x20group\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M12\x205v14M5\x2012h14\x22/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Add\x20Existing\x20Task\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20';}['renderVariantCard'](_0x48b006,_0x3c0a26,_0x2f858f){const _0x527e04=_0x48b006['envVars']?.['CODER_AGENT']||_0x48b006['envVars']?.['default_agent']||'claude',_0x422e8a=AGENT_ICONS[_0x527e04['toLowerCase']()]||AGENT_ICONS['claude'],_0x557913=STATUS_ICONS[_0x48b006['status']]||'',_0x4962e8='status-'+(_0x48b006['status']||'unknown'),_0x35a3fa=_0x48b006['isWinner']?'<span\x20class=\x22vgm-badge\x20vgm-badge-winner\x22\x20title=\x22Winner\x22>★</span>':'',_0x23bd98=_0x48b006['approvedBy']?'<span\x20class=\x22vgm-badge\x20vgm-badge-approved\x22\x20title=\x22Approved\x22><svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22\x20stroke-linecap=\x22round\x22\x20stroke-linejoin=\x22round\x22\x20width=\x2212\x22\x20height=\x2212\x22><path\x20d=\x22M14\x209V5a3\x203\x200\x200\x200-3-3l-4\x209v11h11.28a2\x202\x200\x200\x200\x202-1.7l1.38-9a2\x202\x200\x200\x200-2-2.3zM7\x2022H4a2\x202\x200\x200\x201-2-2v-7a2\x202\x200\x200\x201\x202-2h3\x22></path></svg></span>':'';return'\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-variant-card\x20'+_0x4962e8+'\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20draggable=\x22true\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20data-task-id=\x22'+_0x48b006['taskId']+'\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20data-is-grouped=\x22'+_0x2f858f+'\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20data-index=\x22'+_0x3c0a26+'\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-variant-drag-handle\x22\x20title=\x22Drag\x20to\x20reorder\x20or\x20move\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20fill=\x22currentColor\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20d=\x22M8\x206h2v2H8V6zm6\x200h2v2h-2V6zM8\x2011h2v2H8v-2zm6\x200h2v2h-2v-2zm-6\x205h2v2H8v-2zm6\x200h2v2h-2v-2z\x22/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-variant-icon\x22\x20data-agent=\x22'+_0x527e04['toLowerCase']()+'\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x422e8a+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-variant-info\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-variant-name\x22>'+Utils['escapeHtml'](_0x48b006['name']||'Task\x20'+_0x48b006['taskId']['slice'](-0x6))+'</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vgm-variant-meta\x22>'+Utils['escapeHtml'](_0x527e04)+'\x20·\x20'+(_0x48b006['status']||'unknown')+'</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-variant-badges\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x35a3fa+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x23bd98+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22vgm-variant-status\x20'+_0x4962e8+'\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x557913+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22vgm-variant-remove-btn\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title=\x22'+(_0x2f858f?'Remove\x20from\x20group':'Add\x20to\x20group')+'\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20data-task-id=\x22'+_0x48b006['taskId']+'\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20data-action=\x22'+(_0x2f858f?'remove':'add')+'\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(_0x2f858f?'<path\x20d=\x22M18\x206L6\x2018M6\x206l12\x2012\x22/>':'<path\x20d=\x22M12\x205v14M5\x2012h14\x22/>')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20';}['attachEventListeners'](){if(!this['container'])return;this['container']['addEventListener']('click',_0x3a643b=>{_0x3a643b['target']['closest']('.vgm-close-btn')&&(this['close'](),this['onGroupChange'](this['tasks'])),_0x3a643b['target']['closest']('.vgm-add-existing-btn')&&(this['close'](),this['onAddExistingTask'](this['groupId']));}),this['container']['addEventListener']('click',async _0x3a3130=>{const _0x5b69a4=_0x3a3130['target']['closest']('.vgm-variant-remove-btn');if(!_0x5b69a4)return;const _0x50595f=_0x5b69a4['dataset']['taskId'],_0x1240fd=_0x5b69a4['dataset']['action'];try{_0x1240fd==='remove'?await this['removeFromGroup'](_0x50595f):await this['addToGroup'](_0x50595f);}catch(_0xafdf1c){console['error']('Failed\x20to\x20update\x20group:',_0xafdf1c),Utils['showToast'](_0xafdf1c['message']||'Failed\x20to\x20update\x20group','error');}}),this['container']['addEventListener']('dragstart',_0x2c0e09=>this['handleDragStart'](_0x2c0e09)),this['container']['addEventListener']('dragend',_0x57a16c=>this['handleDragEnd'](_0x57a16c)),this['container']['addEventListener']('dragover',_0x4bd6af=>this['handleDragOver'](_0x4bd6af)),this['container']['addEventListener']('dragleave',_0x558722=>this['handleDragLeave'](_0x558722)),this['container']['addEventListener']('drop',_0x370d27=>this['handleDrop'](_0x370d27));}['handleDragStart'](_0x5dd088){const _0x2f20b3=_0x5dd088['target']['closest']('.vgm-variant-card');if(!_0x2f20b3)return;dragState['draggedTaskId']=_0x2f20b3['dataset']['taskId'],dragState['draggedElement']=_0x2f20b3,dragState['sourceGroupId']=_0x2f20b3['dataset']['isGrouped']==='true'?this['groupId']:null,dragState['isDragging']=!![],_0x2f20b3['classList']['add']('dragging'),_0x5dd088['dataTransfer']['effectAllowed']='move',_0x5dd088['dataTransfer']['setData']('text/plain',_0x2f20b3['dataset']['taskId']),this['container']['classList']['add']('is-dragging');}['handleDragEnd'](_0xd4aa80){const _0x23e7a1=_0xd4aa80['target']['closest']('.vgm-variant-card');_0x23e7a1&&_0x23e7a1['classList']['remove']('dragging'),this['container']['querySelectorAll']('.drag-over,\x20.drop-indicator')['forEach'](_0x24e336=>{_0x24e336['classList']['remove']('drag-over','drop-indicator','drop-before','drop-after');}),this['container']['classList']['remove']('is-dragging'),dragState['isDragging']=![],dragState['draggedTaskId']=null,dragState['draggedElement']=null,dragState['sourceGroupId']=null;}['handleDragOver'](_0x24b8d2){_0x24b8d2['preventDefault'](),_0x24b8d2['dataTransfer']['dropEffect']='move';const _0x39e6de=_0x24b8d2['target']['closest']('.vgm-drop-zone'),_0xb4854b=_0x24b8d2['target']['closest']('.vgm-variant-card');this['container']['querySelectorAll']('.vgm-drop-zone')['forEach'](_0x47bc42=>{_0x47bc42['classList']['toggle']('drag-over',_0x47bc42===_0x39e6de);});if(_0xb4854b&&_0xb4854b!==dragState['draggedElement']){const _0x1bb4bc=_0xb4854b['getBoundingClientRect'](),_0x35417e=_0x1bb4bc['top']+_0x1bb4bc['height']/0x2,_0x483f65=_0x24b8d2['clientY']<_0x35417e;this['container']['querySelectorAll']('.vgm-variant-card')['forEach'](_0xa7b67e=>{_0xa7b67e!==_0xb4854b&&_0xa7b67e['classList']['remove']('drop-before','drop-after');}),_0xb4854b['classList']['toggle']('drop-before',_0x483f65),_0xb4854b['classList']['toggle']('drop-after',!_0x483f65);}}['handleDragLeave'](_0x3fefe9){const _0x42a2a0=_0x3fefe9['target']['closest']('.vgm-drop-zone');_0x42a2a0&&!_0x42a2a0['contains'](_0x3fefe9['relatedTarget'])&&_0x42a2a0['classList']['remove']('drag-over');}async['handleDrop'](_0x37be0c){_0x37be0c['preventDefault']();const _0xcbe5ca=_0x37be0c['target']['closest']('.vgm-drop-zone'),_0x436e1f=_0x37be0c['target']['closest']('.vgm-variant-card'),_0x5e8fb3=_0x37be0c['dataTransfer']['getData']('text/plain');if(!_0xcbe5ca||!_0x5e8fb3)return;this['container']['querySelectorAll']('.drag-over,\x20.drop-before,\x20.drop-after')['forEach'](_0x3f76df=>{_0x3f76df['classList']['remove']('drag-over','drop-before','drop-after');});const _0x1d6743=_0xcbe5ca['dataset']['zone'],_0xc8a4ab=_0x1d6743==='grouped',_0x417e5a=dragState['sourceGroupId']===this['groupId'];try{if(_0xc8a4ab&&!_0x417e5a){let _0x23c71f=this['tasks']['filter'](_0x15bb8f=>_0x15bb8f['groupId']===this['groupId'])['length'];if(_0x436e1f){const _0xd13d6=_0x436e1f['dataset']['taskId'],_0x21afcb=this['tasks']['find'](_0x111959=>_0x111959['taskId']===_0xd13d6);if(_0x21afcb?.['groupIndex']!==undefined){const _0x4a4baa=_0x436e1f['getBoundingClientRect'](),_0x1cb2fd=_0x37be0c['clientY']<_0x4a4baa['top']+_0x4a4baa['height']/0x2;_0x23c71f=_0x21afcb['groupIndex']+(_0x1cb2fd?0x0:0x1);}}await this['addToGroup'](_0x5e8fb3,_0x23c71f);}else{if(!_0xc8a4ab&&_0x417e5a)await this['removeFromGroup'](_0x5e8fb3);else _0xc8a4ab&&_0x417e5a&&_0x436e1f&&await this['reorderInGroup'](_0x5e8fb3,_0x436e1f,_0x37be0c['clientY']);}}catch(_0x3ba68c){console['error']('Drop\x20operation\x20failed:',_0x3ba68c),Utils['showToast'](_0x3ba68c['message']||'Failed\x20to\x20move\x20variant','error');}}async['addToGroup'](_0x4a6893,_0x1e1aac){const _0x4a4f9d=this['tasks']['find'](_0x296016=>_0x296016['taskId']===_0x4a6893);if(!_0x4a4f9d)return;_0x1e1aac===undefined&&(_0x1e1aac=this['tasks']['filter'](_0x38c4ea=>_0x38c4ea['groupId']===this['groupId'])['length']),!this['groupId']&&(this['groupId']=API['generateGroupId'](),await API['createTaskGroup']({'groupId':this['groupId']})),await API['updateTaskGroup'](_0x4a6893,this['groupId'],_0x1e1aac),_0x4a4f9d['groupId']=this['groupId'],_0x4a4f9d['groupIndex']=_0x1e1aac,this['render'](),this['onGroupChange'](this['tasks']);}async['removeFromGroup'](_0x56f4ce){const _0x3d0b3a=this['tasks']['find'](_0x564010=>_0x564010['taskId']===_0x56f4ce);if(!_0x3d0b3a)return;await API['removeTaskFromGroup'](_0x56f4ce),_0x3d0b3a['groupId']=null,_0x3d0b3a['groupIndex']=null,this['render'](),this['onGroupChange'](this['tasks']);}async['reorderInGroup'](_0x4bd9f9,_0x90f1d7,_0x4a58af){const _0x407104=this['tasks']['find'](_0x1461f4=>_0x1461f4['taskId']===_0x4bd9f9),_0x34d72e=_0x90f1d7['dataset']['taskId'],_0x53f2ad=this['tasks']['find'](_0x397a9f=>_0x397a9f['taskId']===_0x34d72e);if(!_0x407104||!_0x53f2ad||_0x407104['taskId']===_0x53f2ad['taskId'])return;const _0x463395=_0x90f1d7['getBoundingClientRect'](),_0x4998b2=_0x4a58af<_0x463395['top']+_0x463395['height']/0x2;let _0x75ca87=_0x53f2ad['groupIndex']??0x0;if(!_0x4998b2)_0x75ca87++;if((_0x407104['groupIndex']??0x0)<(_0x53f2ad['groupIndex']??0x0))_0x75ca87--;if(_0x75ca87===_0x407104['groupIndex'])return;await API['updateTaskGroup'](_0x4bd9f9,this['groupId'],_0x75ca87);const _0x2cbef7=this['tasks']['filter'](_0x5dff7b=>_0x5dff7b['groupId']===this['groupId'])['sort']((_0x497e29,_0x4f1758)=>(_0x497e29['groupIndex']??0x0)-(_0x4f1758['groupIndex']??0x0)),_0x589030=_0x2cbef7['findIndex'](_0xf03c85=>_0xf03c85['taskId']===_0x4bd9f9);_0x589030!==-0x1&&_0x2cbef7['splice'](_0x589030,0x1),_0x2cbef7['splice'](_0x75ca87,0x0,_0x407104),_0x2cbef7['forEach']((_0x313740,_0x43d885)=>{_0x313740['groupIndex']=_0x43d885;}),this['render'](),this['onGroupChange'](this['tasks']);}}export function initializeTabDragDrop(_0xd087ad,_0x2549dd,_0x45f14e,_0x374d7d={}){if(!_0xd087ad)return;const {onReorder:_0x8040f1,onRemove:_0xa29a94}=_0x374d7d,_0x4faeee=_0xd087ad['querySelectorAll']('.task-tab');_0x4faeee['forEach']((_0xb56a6d,_0x4b1857)=>{_0xb56a6d['setAttribute']('draggable','true'),_0xb56a6d['dataset']['index']=_0x4b1857,_0xb56a6d['addEventListener']('dragstart',_0x440f37=>{_0x440f37['dataTransfer']['effectAllowed']='move',_0x440f37['dataTransfer']['setData']('text/plain',_0xb56a6d['dataset']['taskId']),_0xb56a6d['classList']['add']('dragging'),_0xd087ad['classList']['add']('is-dragging');}),_0xb56a6d['addEventListener']('dragend',()=>{_0xb56a6d['classList']['remove']('dragging'),_0xd087ad['classList']['remove']('is-dragging'),_0xd087ad['querySelectorAll']('.drop-indicator')['forEach'](_0x3ab905=>{_0x3ab905['classList']['remove']('drop-indicator','drop-before','drop-after');});}),_0xb56a6d['addEventListener']('dragover',_0x5ed000=>{_0x5ed000['preventDefault'](),_0x5ed000['dataTransfer']['dropEffect']='move';if(_0xb56a6d['classList']['contains']('dragging'))return;const _0x4b60fb=_0xb56a6d['getBoundingClientRect'](),_0x2fdad0=_0x4b60fb['left']+_0x4b60fb['width']/0x2,_0x46023a=_0x5ed000['clientX']<_0x2fdad0;_0x4faeee['forEach'](_0x30b11a=>_0x30b11a['classList']['remove']('drop-before','drop-after')),_0xb56a6d['classList']['add'](_0x46023a?'drop-before':'drop-after');}),_0xb56a6d['addEventListener']('dragleave',()=>{_0xb56a6d['classList']['remove']('drop-before','drop-after');}),_0xb56a6d['addEventListener']('drop',async _0xe5699a=>{_0xe5699a['preventDefault']();const _0xa2e18f=_0xe5699a['dataTransfer']['getData']('text/plain'),_0x52acb7=_0xb56a6d['dataset']['taskId'];if(_0xa2e18f===_0x52acb7)return;const _0x36214c=_0xb56a6d['getBoundingClientRect'](),_0x53c7cb=_0xe5699a['clientX']<_0x36214c['left']+_0x36214c['width']/0x2;_0xb56a6d['classList']['remove']('drop-before','drop-after'),_0x8040f1&&await _0x8040f1(_0xa2e18f,_0x52acb7,_0x53c7cb);});});const _0x80b266=document['createElement']('div');return _0x80b266['className']='task-tab-remove-zone',_0x80b266['innerHTML']='\x0a\x20\x20\x20\x20<svg\x20viewBox=\x220\x200\x2024\x2024\x22\x20width=\x2216\x22\x20height=\x2216\x22\x20fill=\x22none\x22\x20stroke=\x22currentColor\x22\x20stroke-width=\x222\x22>\x0a\x20\x20\x20\x20\x20\x20<path\x20d=\x22M18\x206L6\x2018M6\x206l12\x2012\x22/>\x0a\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20<span>Remove\x20from\x20group</span>\x0a\x20\x20',_0x80b266['style']['display']='none',_0x80b266['addEventListener']('dragover',_0x556214=>{_0x556214['preventDefault'](),_0x80b266['classList']['add']('drag-over');}),_0x80b266['addEventListener']('dragleave',()=>{_0x80b266['classList']['remove']('drag-over');}),_0x80b266['addEventListener']('drop',async _0x1024fd=>{_0x1024fd['preventDefault'](),_0x80b266['classList']['remove']('drag-over');const _0x269e91=_0x1024fd['dataTransfer']['getData']('text/plain');_0xa29a94&&await _0xa29a94(_0x269e91);}),_0xd087ad['addEventListener']('dragstart',()=>{_0x2549dd['length']>0x1&&(_0x80b266['style']['display']='flex');}),_0xd087ad['addEventListener']('dragend',()=>{_0x80b266['style']['display']='none';}),_0xd087ad['appendChild'](_0x80b266),{'destroy':()=>{_0x80b266['remove']();}};}export default VariantGroupingManager;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@profoundlogic/coderflow-server",
3
- "version": "0.7.4",
3
+ "version": "0.7.6",
4
4
  "description": "AI Coder Server - Manages Docker containers for AI agent task execution",
5
5
  "main": "dist/start.js",
6
6
  "type": "module",