@profoundlogic/coderflow-server 0.8.0 → 0.8.1

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 (184) hide show
  1. package/dist/base-image/coder-git-credential-helper +16 -0
  2. package/dist/base-image/sync-repos.sh +30 -1
  3. package/dist/coder-server.js +1 -1
  4. package/dist/config.js +1 -1
  5. package/dist/lib/agent-keepalive.js +1 -1
  6. package/dist/lib/agent-models.js +1 -1
  7. package/dist/lib/api-keys.js +1 -1
  8. package/dist/lib/apiKeys.js +1 -1
  9. package/dist/lib/app-server-ports.js +1 -1
  10. package/dist/lib/auto-judge.js +1 -1
  11. package/dist/lib/automation-service.js +1 -1
  12. package/dist/lib/basic-auth.js +1 -1
  13. package/dist/lib/bindings.js +1 -1
  14. package/dist/lib/build-history.js +1 -1
  15. package/dist/lib/build-output-service.js +1 -1
  16. package/dist/lib/build-scheduler.js +1 -1
  17. package/dist/lib/build-service.js +1 -1
  18. package/dist/lib/ca-certificates.js +1 -1
  19. package/dist/lib/claude-oauth-refresh.js +1 -1
  20. package/dist/lib/cli/build.js +1 -1
  21. package/dist/lib/cli/cleanup-users.js +1 -1
  22. package/dist/lib/cli/config-command.js +1 -1
  23. package/dist/lib/cli/config.js +1 -1
  24. package/dist/lib/cli/create-user.js +1 -1
  25. package/dist/lib/cli/grant-admin.js +1 -1
  26. package/dist/lib/cli/init.js +1 -1
  27. package/dist/lib/cli/jira.js +1 -1
  28. package/dist/lib/cli/license.js +1 -1
  29. package/dist/lib/cli/list-roles.js +1 -1
  30. package/dist/lib/cli/list-users.js +1 -1
  31. package/dist/lib/cli/server-manager.js +1 -1
  32. package/dist/lib/cli/set-password.js +1 -1
  33. package/dist/lib/compression-filter.js +1 -1
  34. package/dist/lib/config-migration.js +1 -1
  35. package/dist/lib/container-credential-sync.js +1 -1
  36. package/dist/lib/container-tokens.js +1 -1
  37. package/dist/lib/data-dir.js +1 -1
  38. package/dist/lib/deployment-history.js +1 -1
  39. package/dist/lib/deployment-service.js +1 -1
  40. package/dist/lib/docker-utils.js +1 -1
  41. package/dist/lib/email.js +1 -1
  42. package/dist/lib/emailTemplates.js +1 -1
  43. package/dist/lib/entitlement.js +1 -1
  44. package/dist/lib/external-connections.js +1 -1
  45. package/dist/lib/fetch-utils.js +1 -1
  46. package/dist/lib/git-commit-details-route.js +1 -1
  47. package/dist/lib/git-history-diff-guardrails.js +1 -1
  48. package/dist/lib/git-provider-service.js +1 -1
  49. package/dist/lib/git-provider-setup/github-setup-handler.js +1 -1
  50. package/dist/lib/git-provider-setup/index.js +1 -1
  51. package/dist/lib/git-provider-setup/setup-factory.js +1 -1
  52. package/dist/lib/git-provider-setup/setup-interface.js +1 -1
  53. package/dist/lib/git-providers/azure-devops-provider.js +1 -1
  54. package/dist/lib/git-providers/github-app-provider.js +1 -1
  55. package/dist/lib/git-providers/index.js +1 -1
  56. package/dist/lib/git-providers/provider-factory.js +1 -1
  57. package/dist/lib/git-providers/provider-interface.js +1 -1
  58. package/dist/lib/github-urls.js +1 -1
  59. package/dist/lib/group-objective-linking.js +1 -1
  60. package/dist/lib/ibmi-sync.js +1 -1
  61. package/dist/lib/jira-client.js +1 -1
  62. package/dist/lib/judge-blinding.js +1 -1
  63. package/dist/lib/logger.js +1 -1
  64. package/dist/lib/memory-utils.js +1 -1
  65. package/dist/lib/migration-to-scoped-rbac.js +1 -1
  66. package/dist/lib/model-fetcher.js +1 -1
  67. package/dist/lib/notifications.js +1 -1
  68. package/dist/lib/objective-context.js +1 -1
  69. package/dist/lib/oidc-auth.js +1 -1
  70. package/dist/lib/oidc-device-flow.js +1 -1
  71. package/dist/lib/passwordTokens.js +1 -1
  72. package/dist/lib/permission-resolver.js +1 -1
  73. package/dist/lib/pin-cascade.js +1 -1
  74. package/dist/lib/provider-accounts.js +1 -1
  75. package/dist/lib/provider-oauth.js +1 -1
  76. package/dist/lib/provider-profile.js +1 -1
  77. package/dist/lib/provider-token-refresh.js +1 -1
  78. package/dist/lib/rbac-user-state.js +1 -1
  79. package/dist/lib/request-url.js +1 -1
  80. package/dist/lib/rewind.js +1 -1
  81. package/dist/lib/role-definitions.js +1 -1
  82. package/dist/lib/roles.js +1 -1
  83. package/dist/lib/secrets.js +1 -1
  84. package/dist/lib/setup-repo-git-auth.js +1 -1
  85. package/dist/lib/state-capture.js +1 -1
  86. package/dist/lib/static-files.js +1 -1
  87. package/dist/lib/task-aliases.js +1 -1
  88. package/dist/lib/task-container-init.js +1 -1
  89. package/dist/lib/task-context-usage.js +1 -1
  90. package/dist/lib/task-name-format.js +1 -1
  91. package/dist/lib/task-name-generator.js +1 -1
  92. package/dist/lib/task-source-metadata.js +1 -1
  93. package/dist/lib/teams.js +1 -1
  94. package/dist/lib/user-git-oauth.js +1 -1
  95. package/dist/lib/user-git-tokens.js +1 -1
  96. package/dist/lib/users.js +1 -1
  97. package/dist/middleware/requireAuth.js +1 -1
  98. package/dist/middleware/requireInit.js +1 -1
  99. package/dist/middleware/requirePermission.js +1 -1
  100. package/dist/package.json +1 -1
  101. package/dist/playwright.config.js +1 -1
  102. package/dist/playwright.task-terminal.config.js +1 -1
  103. package/dist/routes/apiKeys.js +1 -1
  104. package/dist/routes/auth-oidc.js +1 -1
  105. package/dist/routes/auth.js +1 -1
  106. package/dist/routes/automations.js +1 -1
  107. package/dist/routes/bindings.js +1 -1
  108. package/dist/routes/build.js +1 -1
  109. package/dist/routes/containers.js +1 -1
  110. package/dist/routes/deploy-task.js +1 -1
  111. package/dist/routes/environment-management.js +1 -1
  112. package/dist/routes/environments.js +1 -1
  113. package/dist/routes/external-skills.js +1 -1
  114. package/dist/routes/git-credentials.js +1 -1
  115. package/dist/routes/git-oauth.js +1 -1
  116. package/dist/routes/git-provider-setup.js +1 -1
  117. package/dist/routes/health.js +1 -1
  118. package/dist/routes/jira.js +1 -1
  119. package/dist/routes/logs.js +1 -1
  120. package/dist/routes/objective-management.js +1 -1
  121. package/dist/routes/password.js +1 -1
  122. package/dist/routes/prompt.js +1 -1
  123. package/dist/routes/provider-auth.js +1 -1
  124. package/dist/routes/qa.js +1 -1
  125. package/dist/routes/roles.js +1 -1
  126. package/dist/routes/settings.js +1 -1
  127. package/dist/routes/skill-management.js +1 -1
  128. package/dist/routes/skills.js +1 -1
  129. package/dist/routes/stats.js +1 -1
  130. package/dist/routes/tasks.js +1 -1
  131. package/dist/routes/teams.js +1 -1
  132. package/dist/routes/templates.js +1 -1
  133. package/dist/routes/test-task.js +1 -1
  134. package/dist/routes/test.js +1 -1
  135. package/dist/routes/users.js +1 -1
  136. package/dist/routes/visualizations.js +1 -1
  137. package/dist/scripts/create-user.js +1 -1
  138. package/dist/scripts/migrate-config-to-data-dir.js +1 -1
  139. package/dist/start.js +1 -1
  140. package/dist/web-ui/public/activity-detail-modal.js +1 -1
  141. package/dist/web-ui/public/activity-feed.js +1 -1
  142. package/dist/web-ui/public/activity-formatters.js +1 -1
  143. package/dist/web-ui/public/admin.css +95 -1
  144. package/dist/web-ui/public/admin.html +29 -1
  145. package/dist/web-ui/public/admin.js +1 -1
  146. package/dist/web-ui/public/agent-event-parser.js +1 -1
  147. package/dist/web-ui/public/app.js +1 -1
  148. package/dist/web-ui/public/approve-dialog.js +1 -1
  149. package/dist/web-ui/public/automation-links.js +1 -1
  150. package/dist/web-ui/public/automation-schedule.js +1 -1
  151. package/dist/web-ui/public/comments-widget.js +1 -1
  152. package/dist/web-ui/public/diff-utils.js +1 -1
  153. package/dist/web-ui/public/environments.js +1 -1
  154. package/dist/web-ui/public/feedback-widget.css +45 -0
  155. package/dist/web-ui/public/feedback-widget.js +1 -1
  156. package/dist/web-ui/public/file-selection-tree.js +1 -1
  157. package/dist/web-ui/public/git-history-lazy-utils.js +1 -1
  158. package/dist/web-ui/public/git-history.js +1 -1
  159. package/dist/web-ui/public/git-status.js +1 -1
  160. package/dist/web-ui/public/ibmi-file-filter.js +1 -1
  161. package/dist/web-ui/public/index.js +1 -1
  162. package/dist/web-ui/public/login.js +1 -1
  163. package/dist/web-ui/public/markdown-editor.js +1 -1
  164. package/dist/web-ui/public/markdown-file-editor.js +1 -1
  165. package/dist/web-ui/public/modal-maximize.js +1 -1
  166. package/dist/web-ui/public/notifications.js +1 -1
  167. package/dist/web-ui/public/permissions.js +1 -1
  168. package/dist/web-ui/public/pr-dialog.js +1 -1
  169. package/dist/web-ui/public/roles.js +1 -1
  170. package/dist/web-ui/public/settings.js +1 -1
  171. package/dist/web-ui/public/setup-password.js +1 -1
  172. package/dist/web-ui/public/skills.js +1 -1
  173. package/dist/web-ui/public/sse-client.js +1 -1
  174. package/dist/web-ui/public/sse-shared-worker.js +1 -1
  175. package/dist/web-ui/public/styles.css +45 -0
  176. package/dist/web-ui/public/task-judging-helpers.js +1 -1
  177. package/dist/web-ui/public/task.html +25 -2
  178. package/dist/web-ui/public/task.js +1 -1
  179. package/dist/web-ui/public/teams.js +1 -1
  180. package/dist/web-ui/public/terminal.js +1 -1
  181. package/dist/web-ui/public/theme.js +1 -1
  182. package/dist/web-ui/public/users.js +1 -1
  183. package/dist/web-ui/public/variant-grouping.js +1 -1
  184. package/package.json +1 -1
@@ -1 +1 @@
1
- function isSharedWorkerSupported(){return typeof SharedWorker!=='undefined';}function eventTypeToHandler(_0x17cb7a){if(_0x17cb7a==='connected')return'onConnected';if(_0x17cb7a==='error')return'onError';return'on'+_0x17cb7a['split']('-')['map'](_0x2c9a89=>_0x2c9a89['charAt'](0x0)['toUpperCase']()+_0x2c9a89['slice'](0x1))['join']('');}const TASK_STREAM_EVENTS=['activity','logs','metadata','summary','changed-files','app-server-status','complete'];export class TaskUpdatesClient{constructor(){this['listeners']=new Map(),this['worker']=null,this['port']=null,this['eventSource']=null,this['userId']=null,this['reconnectTimeout']=null,this['reconnectAttempts']=0x0,this['useSharedWorker']=isSharedWorkerSupported(),this['connected']=![],this['_taskSubscriptions']=new Map(),this['_taskSubIdCounter']=0x0,this['_handleWorkerMessage']=this['_handleWorkerMessage']['bind'](this),this['_handleDirectSSE']=this['_handleDirectSSE']['bind'](this);}['on'](_0x5d877,_0x37914f){return!this['listeners']['has'](_0x5d877)&&this['listeners']['set'](_0x5d877,new Set()),this['listeners']['get'](_0x5d877)['add'](_0x37914f),this;}['off'](_0x2e4454,_0x3d3f4b){return this['listeners']['has'](_0x2e4454)&&this['listeners']['get'](_0x2e4454)['delete'](_0x3d3f4b),this;}['_emit'](_0x5768d5,_0x335e86){this['listeners']['has'](_0x5768d5)&&this['listeners']['get'](_0x5768d5)['forEach'](_0x2155af=>{try{_0x2155af(_0x335e86);}catch(_0x6c8c89){console['error']('[SSE\x20Client]\x20Error\x20in\x20'+_0x5768d5+'\x20listener:',_0x6c8c89);}});}['connect'](_0x5f35fe='me'){this['userId']=_0x5f35fe,this['useSharedWorker']?this['_connectViaWorker'](_0x5f35fe):this['_connectDirect'](_0x5f35fe);}['_connectViaWorker'](_0x375a69){try{this['_ensureWorker'](),this['port']['postMessage']({'action':'connect','userId':_0x375a69});}catch(_0x359031){console['error']('[SSE\x20Client]\x20SharedWorker\x20failed,\x20falling\x20back\x20to\x20direct\x20SSE:',_0x359031),this['useSharedWorker']=![],this['_connectDirect'](_0x375a69);}}['_ensureWorker'](){!this['worker']&&(this['worker']=new SharedWorker('/sse-shared-worker.js'),this['port']=this['worker']['port'],this['port']['onmessage']=this['_handleWorkerMessage'],this['port']['onmessageerror']=_0x38c692=>{console['error']('[SSE\x20Client]\x20Worker\x20message\x20error:',_0x38c692),this['_emit']('error',{'error':'Worker\x20message\x20error'});},this['port']['start']());}['_handleWorkerMessage'](_0x4ab126){const _0x1ae69f=_0x4ab126['data'];if(_0x1ae69f['type']&&_0x1ae69f['type']['startsWith']('task:')){this['_handleTaskStreamMessage'](_0x1ae69f);return;}switch(_0x1ae69f['type']){case'connected':this['connected']=!![],this['_emit']('connected',{});break;case'snapshot':case'activity':case'status':case'new-task':case'queue-position':try{const _0x45d9ab=JSON['parse'](_0x1ae69f['data']);this['_emit'](_0x1ae69f['type'],_0x45d9ab);}catch(_0x4c94ad){console['error']('[SSE\x20Client]\x20Failed\x20to\x20parse\x20'+_0x1ae69f['type']+'\x20data:',_0x4c94ad);}break;case'error':this['connected']=![],this['_emit']('error',_0x1ae69f);break;default:console['warn']('[SSE\x20Client]\x20Unknown\x20message\x20type:',_0x1ae69f['type']);}}['_handleTaskStreamMessage'](_0x5e991d){const {taskId:_0x84a4ba,type:_0x477e14,data:_0x31e679}=_0x5e991d,_0x462c81=this['_taskSubscriptions']['get'](_0x84a4ba);if(!_0x462c81||_0x462c81['size']===0x0)return;const _0x1eacb8=_0x477e14['replace']('task:',''),_0x49a6cc=eventTypeToHandler(_0x1eacb8);_0x462c81['forEach'](_0x4c626f=>{if(_0x4c626f['handlers'][_0x49a6cc])try{const _0x3698eb=typeof _0x31e679==='string'?JSON['parse'](_0x31e679):_0x31e679;_0x4c626f['handlers'][_0x49a6cc](_0x3698eb);}catch(_0x109752){console['error']('[SSE\x20Client]\x20Error\x20in\x20task\x20'+_0x1eacb8+'\x20handler:',_0x109752);}});}['_connectDirect'](_0x44982c){this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null);const _0x25f32f=_0x44982c&&_0x44982c!=='me'?'?userId='+_0x44982c:'';try{this['eventSource']=new EventSource('/tasks/updates'+_0x25f32f),this['eventSource']['addEventListener']('open',()=>{this['connected']=!![],this['reconnectAttempts']=0x0,this['_emit']('connected',{});}),this['eventSource']['addEventListener']('snapshot',_0x57c99e=>{this['_handleDirectSSE']('snapshot',_0x57c99e),this['reconnectAttempts']=0x0;}),this['eventSource']['addEventListener']('activity',_0x11602c=>{this['_handleDirectSSE']('activity',_0x11602c);}),this['eventSource']['addEventListener']('status',_0x30a37a=>{this['_handleDirectSSE']('status',_0x30a37a);}),this['eventSource']['addEventListener']('new-task',_0x308f57=>{this['_handleDirectSSE']('new-task',_0x308f57);}),this['eventSource']['addEventListener']('queue-position',_0x4e26d3=>{this['_handleDirectSSE']('queue-position',_0x4e26d3);}),this['eventSource']['addEventListener']('error',_0x208e0b=>{console['error']('[SSE\x20Client]\x20Direct\x20SSE\x20error:',_0x208e0b),this['connected']=![],this['_emit']('error',{'error':'Connection\x20error'}),this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null),this['_scheduleReconnect']();});}catch(_0x17118f){console['error']('[SSE\x20Client]\x20Failed\x20to\x20create\x20EventSource:',_0x17118f),this['_emit']('error',{'error':_0x17118f['message']}),this['_scheduleReconnect']();}}['_handleDirectSSE'](_0x1499ed,_0x4e01fa){try{const _0x3c0750=JSON['parse'](_0x4e01fa['data']);this['_emit'](_0x1499ed,_0x3c0750);}catch(_0x267011){console['error']('[SSE\x20Client]\x20Failed\x20to\x20parse\x20'+_0x1499ed+'\x20data:',_0x267011);}}['_scheduleReconnect'](){this['reconnectTimeout']&&clearTimeout(this['reconnectTimeout']);const _0x4c7dcb=Math['min'](0x3e8*Math['pow'](0x2,this['reconnectAttempts']),0x7530);this['reconnectAttempts']++,console['log']('[SSE\x20Client]\x20Scheduling\x20reconnect\x20in\x20'+_0x4c7dcb+'ms'),this['reconnectTimeout']=setTimeout(()=>{this['_connectDirect'](this['userId']);},_0x4c7dcb);}['changeFilter'](_0xd9d821){if(_0xd9d821===this['userId'])return;this['userId']=_0xd9d821;if(this['useSharedWorker']&&this['port'])this['port']['postMessage']({'action':'changeFilter','userId':_0xd9d821});else this['eventSource']&&this['_connectDirect'](_0xd9d821);}['subscribeTask'](_0x58b2c4,_0x30f89c){return this['useSharedWorker']?this['_subscribeTaskViaWorker'](_0x58b2c4,_0x30f89c):this['_subscribeTaskDirect'](_0x58b2c4,_0x30f89c);}['unsubscribeTask'](_0x11d7be){if(!_0x11d7be)return;_0x11d7be['type']==='worker'?this['_unsubscribeTaskWorker'](_0x11d7be):this['_unsubscribeTaskDirect'](_0x11d7be);}['_subscribeTaskViaWorker'](_0xcf055d,_0x338cd5){try{this['_ensureWorker']();}catch(_0x2b40b5){return console['error']('[SSE\x20Client]\x20SharedWorker\x20failed\x20for\x20task\x20sub,\x20falling\x20back:',_0x2b40b5),this['useSharedWorker']=![],this['_subscribeTaskDirect'](_0xcf055d,_0x338cd5);}const _0x1256ef=++this['_taskSubIdCounter'],_0x2d934c={'type':'worker','taskId':_0xcf055d,'handlers':_0x338cd5,'id':_0x1256ef};return!this['_taskSubscriptions']['has'](_0xcf055d)&&(this['_taskSubscriptions']['set'](_0xcf055d,new Set()),this['port']['postMessage']({'action':'subscribeTask','taskId':_0xcf055d})),this['_taskSubscriptions']['get'](_0xcf055d)['add'](_0x2d934c),_0x2d934c;}['_unsubscribeTaskWorker'](_0x5068f1){const {taskId:_0x43efc4}=_0x5068f1,_0x3007ae=this['_taskSubscriptions']['get'](_0x43efc4);if(_0x3007ae){_0x3007ae['delete'](_0x5068f1);if(_0x3007ae['size']===0x0){this['_taskSubscriptions']['delete'](_0x43efc4);try{this['port']&&this['port']['postMessage']({'action':'unsubscribeTask','taskId':_0x43efc4});}catch(_0x4e73aa){}}}}['_subscribeTaskDirect'](_0x25e3ed,_0x363e1a){const _0x409b3b=++this['_taskSubIdCounter'],_0x28982c=new EventSource('/tasks/'+_0x25e3ed+'/stream'),_0x401582={'type':'direct','taskId':_0x25e3ed,'handlers':_0x363e1a,'id':_0x409b3b,'eventSource':_0x28982c};!this['_taskSubscriptions']['has'](_0x25e3ed)&&this['_taskSubscriptions']['set'](_0x25e3ed,new Set());this['_taskSubscriptions']['get'](_0x25e3ed)['add'](_0x401582);for(const _0x1fa76a of TASK_STREAM_EVENTS){const _0x54792a=eventTypeToHandler(_0x1fa76a);_0x28982c['addEventListener'](_0x1fa76a,_0x478bb6=>{if(_0x363e1a[_0x54792a])try{const _0x263902=JSON['parse'](_0x478bb6['data']);_0x363e1a[_0x54792a](_0x263902);}catch(_0x409e61){console['error']('[SSE\x20Client]\x20Error\x20parsing\x20task\x20'+_0x1fa76a+':',_0x409e61);}});}return _0x28982c['addEventListener']('open',()=>{if(_0x363e1a['onConnected'])_0x363e1a['onConnected']();}),_0x28982c['addEventListener']('error',()=>{if(_0x363e1a['onError'])_0x363e1a['onError']({'error':'Connection\x20error'});}),_0x401582;}['_unsubscribeTaskDirect'](_0x3f6488){_0x3f6488['eventSource']&&(_0x3f6488['eventSource']['close'](),_0x3f6488['eventSource']=null);const _0xd7b37=this['_taskSubscriptions']['get'](_0x3f6488['taskId']);_0xd7b37&&(_0xd7b37['delete'](_0x3f6488),_0xd7b37['size']===0x0&&this['_taskSubscriptions']['delete'](_0x3f6488['taskId']));}['disconnect'](){this['reconnectTimeout']&&(clearTimeout(this['reconnectTimeout']),this['reconnectTimeout']=null);this['_taskSubscriptions']['forEach']((_0x13587e,_0x1b8ee3)=>{_0x13587e['forEach'](_0x1144ae=>{_0x1144ae['type']==='direct'&&_0x1144ae['eventSource']&&_0x1144ae['eventSource']['close']();});}),this['_taskSubscriptions']['clear']();if(this['useSharedWorker']&&this['port'])try{this['port']['postMessage']({'action':'disconnect'});}catch(_0x541afd){}this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null),this['connected']=![];}['isConnected'](){return this['connected'];}['isUsingSharedWorker'](){return this['useSharedWorker'];}}let globalClient=null;export function getTaskUpdatesClient(){return!globalClient&&(globalClient=new TaskUpdatesClient()),globalClient;}
1
+ function isSharedWorkerSupported(){return typeof SharedWorker!=='undefined';}function eventTypeToHandler(_0x29e2ad){if(_0x29e2ad==='connected')return'onConnected';if(_0x29e2ad==='error')return'onError';return'on'+_0x29e2ad['split']('-')['map'](_0x52733a=>_0x52733a['charAt'](0x0)['toUpperCase']()+_0x52733a['slice'](0x1))['join']('');}const TASK_STREAM_EVENTS=['activity','logs','metadata','summary','changed-files','app-server-status','complete'];export class TaskUpdatesClient{constructor(){this['listeners']=new Map(),this['worker']=null,this['port']=null,this['eventSource']=null,this['userId']=null,this['reconnectTimeout']=null,this['reconnectAttempts']=0x0,this['useSharedWorker']=isSharedWorkerSupported(),this['connected']=![],this['_taskSubscriptions']=new Map(),this['_taskSubIdCounter']=0x0,this['_handleWorkerMessage']=this['_handleWorkerMessage']['bind'](this),this['_handleDirectSSE']=this['_handleDirectSSE']['bind'](this);}['on'](_0x12804c,_0x2b324d){return!this['listeners']['has'](_0x12804c)&&this['listeners']['set'](_0x12804c,new Set()),this['listeners']['get'](_0x12804c)['add'](_0x2b324d),this;}['off'](_0x5a4f29,_0x1891c7){return this['listeners']['has'](_0x5a4f29)&&this['listeners']['get'](_0x5a4f29)['delete'](_0x1891c7),this;}['_emit'](_0x32754d,_0x2393b4){this['listeners']['has'](_0x32754d)&&this['listeners']['get'](_0x32754d)['forEach'](_0x3d9698=>{try{_0x3d9698(_0x2393b4);}catch(_0x275b09){console['error']('[SSE\x20Client]\x20Error\x20in\x20'+_0x32754d+'\x20listener:',_0x275b09);}});}['connect'](_0x4f47b9='me'){this['userId']=_0x4f47b9,this['useSharedWorker']?this['_connectViaWorker'](_0x4f47b9):this['_connectDirect'](_0x4f47b9);}['_connectViaWorker'](_0x47e988){try{this['_ensureWorker'](),this['port']['postMessage']({'action':'connect','userId':_0x47e988});}catch(_0x2c4f96){console['error']('[SSE\x20Client]\x20SharedWorker\x20failed,\x20falling\x20back\x20to\x20direct\x20SSE:',_0x2c4f96),this['useSharedWorker']=![],this['_connectDirect'](_0x47e988);}}['_ensureWorker'](){!this['worker']&&(this['worker']=new SharedWorker('/sse-shared-worker.js'),this['port']=this['worker']['port'],this['port']['onmessage']=this['_handleWorkerMessage'],this['port']['onmessageerror']=_0x43843f=>{console['error']('[SSE\x20Client]\x20Worker\x20message\x20error:',_0x43843f),this['_emit']('error',{'error':'Worker\x20message\x20error'});},this['port']['start']());}['_handleWorkerMessage'](_0x959b8c){const _0x12b0de=_0x959b8c['data'];if(_0x12b0de['type']&&_0x12b0de['type']['startsWith']('task:')){this['_handleTaskStreamMessage'](_0x12b0de);return;}switch(_0x12b0de['type']){case'connected':this['connected']=!![],this['_emit']('connected',{});break;case'snapshot':case'activity':case'status':case'new-task':case'queue-position':try{const _0x3baf44=JSON['parse'](_0x12b0de['data']);this['_emit'](_0x12b0de['type'],_0x3baf44);}catch(_0x19d556){console['error']('[SSE\x20Client]\x20Failed\x20to\x20parse\x20'+_0x12b0de['type']+'\x20data:',_0x19d556);}break;case'error':this['connected']=![],this['_emit']('error',_0x12b0de);break;default:console['warn']('[SSE\x20Client]\x20Unknown\x20message\x20type:',_0x12b0de['type']);}}['_handleTaskStreamMessage'](_0x3e02cc){const {taskId:_0x15cb8f,type:_0x1ba88c,data:_0x2a0690}=_0x3e02cc,_0x4edc80=this['_taskSubscriptions']['get'](_0x15cb8f);if(!_0x4edc80||_0x4edc80['size']===0x0)return;const _0x2de66f=_0x1ba88c['replace']('task:',''),_0xe8ac6=eventTypeToHandler(_0x2de66f);_0x4edc80['forEach'](_0x10322b=>{if(_0x10322b['handlers'][_0xe8ac6])try{const _0x44f8c1=typeof _0x2a0690==='string'?JSON['parse'](_0x2a0690):_0x2a0690;_0x10322b['handlers'][_0xe8ac6](_0x44f8c1);}catch(_0x25ec88){console['error']('[SSE\x20Client]\x20Error\x20in\x20task\x20'+_0x2de66f+'\x20handler:',_0x25ec88);}});}['_connectDirect'](_0x243949){this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null);const _0x3ea8d4=_0x243949&&_0x243949!=='me'?'?userId='+_0x243949:'';try{this['eventSource']=new EventSource('/tasks/updates'+_0x3ea8d4),this['eventSource']['addEventListener']('open',()=>{this['connected']=!![],this['reconnectAttempts']=0x0,this['_emit']('connected',{});}),this['eventSource']['addEventListener']('snapshot',_0x2f4268=>{this['_handleDirectSSE']('snapshot',_0x2f4268),this['reconnectAttempts']=0x0;}),this['eventSource']['addEventListener']('activity',_0x3975a4=>{this['_handleDirectSSE']('activity',_0x3975a4);}),this['eventSource']['addEventListener']('status',_0x4d2152=>{this['_handleDirectSSE']('status',_0x4d2152);}),this['eventSource']['addEventListener']('new-task',_0x75c318=>{this['_handleDirectSSE']('new-task',_0x75c318);}),this['eventSource']['addEventListener']('queue-position',_0x164597=>{this['_handleDirectSSE']('queue-position',_0x164597);}),this['eventSource']['addEventListener']('error',_0x3a4f81=>{console['error']('[SSE\x20Client]\x20Direct\x20SSE\x20error:',_0x3a4f81),this['connected']=![],this['_emit']('error',{'error':'Connection\x20error'}),this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null),this['_scheduleReconnect']();});}catch(_0x2f5eb5){console['error']('[SSE\x20Client]\x20Failed\x20to\x20create\x20EventSource:',_0x2f5eb5),this['_emit']('error',{'error':_0x2f5eb5['message']}),this['_scheduleReconnect']();}}['_handleDirectSSE'](_0x50070e,_0x39d6d0){try{const _0x1c81ab=JSON['parse'](_0x39d6d0['data']);this['_emit'](_0x50070e,_0x1c81ab);}catch(_0x36d915){console['error']('[SSE\x20Client]\x20Failed\x20to\x20parse\x20'+_0x50070e+'\x20data:',_0x36d915);}}['_scheduleReconnect'](){this['reconnectTimeout']&&clearTimeout(this['reconnectTimeout']);const _0x372a66=Math['min'](0x3e8*Math['pow'](0x2,this['reconnectAttempts']),0x7530);this['reconnectAttempts']++,console['log']('[SSE\x20Client]\x20Scheduling\x20reconnect\x20in\x20'+_0x372a66+'ms'),this['reconnectTimeout']=setTimeout(()=>{this['_connectDirect'](this['userId']);},_0x372a66);}['changeFilter'](_0x25e574){if(_0x25e574===this['userId'])return;this['userId']=_0x25e574;if(this['useSharedWorker']&&this['port'])this['port']['postMessage']({'action':'changeFilter','userId':_0x25e574});else this['eventSource']&&this['_connectDirect'](_0x25e574);}['subscribeTask'](_0x506158,_0x27cc20){return this['useSharedWorker']?this['_subscribeTaskViaWorker'](_0x506158,_0x27cc20):this['_subscribeTaskDirect'](_0x506158,_0x27cc20);}['unsubscribeTask'](_0x51c311){if(!_0x51c311)return;_0x51c311['type']==='worker'?this['_unsubscribeTaskWorker'](_0x51c311):this['_unsubscribeTaskDirect'](_0x51c311);}['_subscribeTaskViaWorker'](_0x2591aa,_0xb57823){try{this['_ensureWorker']();}catch(_0x2323b9){return console['error']('[SSE\x20Client]\x20SharedWorker\x20failed\x20for\x20task\x20sub,\x20falling\x20back:',_0x2323b9),this['useSharedWorker']=![],this['_subscribeTaskDirect'](_0x2591aa,_0xb57823);}const _0x5a09e3=++this['_taskSubIdCounter'],_0x1e1d90={'type':'worker','taskId':_0x2591aa,'handlers':_0xb57823,'id':_0x5a09e3};return!this['_taskSubscriptions']['has'](_0x2591aa)&&(this['_taskSubscriptions']['set'](_0x2591aa,new Set()),this['port']['postMessage']({'action':'subscribeTask','taskId':_0x2591aa})),this['_taskSubscriptions']['get'](_0x2591aa)['add'](_0x1e1d90),_0x1e1d90;}['_unsubscribeTaskWorker'](_0x36acb4){const {taskId:_0x2f2a91}=_0x36acb4,_0x4a4795=this['_taskSubscriptions']['get'](_0x2f2a91);if(_0x4a4795){_0x4a4795['delete'](_0x36acb4);if(_0x4a4795['size']===0x0){this['_taskSubscriptions']['delete'](_0x2f2a91);try{this['port']&&this['port']['postMessage']({'action':'unsubscribeTask','taskId':_0x2f2a91});}catch(_0x4c0084){}}}}['_subscribeTaskDirect'](_0x54780b,_0x55c435){const _0xae6ac6=++this['_taskSubIdCounter'],_0x401309=new EventSource('/tasks/'+_0x54780b+'/stream'),_0x36ccd4={'type':'direct','taskId':_0x54780b,'handlers':_0x55c435,'id':_0xae6ac6,'eventSource':_0x401309};!this['_taskSubscriptions']['has'](_0x54780b)&&this['_taskSubscriptions']['set'](_0x54780b,new Set());this['_taskSubscriptions']['get'](_0x54780b)['add'](_0x36ccd4);for(const _0x338f5e of TASK_STREAM_EVENTS){const _0x1722fc=eventTypeToHandler(_0x338f5e);_0x401309['addEventListener'](_0x338f5e,_0x25eb42=>{if(_0x55c435[_0x1722fc])try{const _0x2ced5b=JSON['parse'](_0x25eb42['data']);_0x55c435[_0x1722fc](_0x2ced5b);}catch(_0x8d0480){console['error']('[SSE\x20Client]\x20Error\x20parsing\x20task\x20'+_0x338f5e+':',_0x8d0480);}});}return _0x401309['addEventListener']('open',()=>{if(_0x55c435['onConnected'])_0x55c435['onConnected']();}),_0x401309['addEventListener']('error',()=>{if(_0x55c435['onError'])_0x55c435['onError']({'error':'Connection\x20error'});}),_0x36ccd4;}['_unsubscribeTaskDirect'](_0x586efa){_0x586efa['eventSource']&&(_0x586efa['eventSource']['close'](),_0x586efa['eventSource']=null);const _0x18305a=this['_taskSubscriptions']['get'](_0x586efa['taskId']);_0x18305a&&(_0x18305a['delete'](_0x586efa),_0x18305a['size']===0x0&&this['_taskSubscriptions']['delete'](_0x586efa['taskId']));}['disconnect'](){this['reconnectTimeout']&&(clearTimeout(this['reconnectTimeout']),this['reconnectTimeout']=null);this['_taskSubscriptions']['forEach']((_0x21a142,_0x1b73e7)=>{_0x21a142['forEach'](_0x7991b2=>{_0x7991b2['type']==='direct'&&_0x7991b2['eventSource']&&_0x7991b2['eventSource']['close']();});}),this['_taskSubscriptions']['clear']();if(this['useSharedWorker']&&this['port'])try{this['port']['postMessage']({'action':'disconnect'});}catch(_0x2082f7){}this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null),this['connected']=![];}['isConnected'](){return this['connected'];}['isUsingSharedWorker'](){return this['useSharedWorker'];}}let globalClient=null;export function getTaskUpdatesClient(){return!globalClient&&(globalClient=new TaskUpdatesClient()),globalClient;}
@@ -1 +1 @@
1
- const ports=new Set();let eventSource=null,currentUserId=null,reconnectTimeout=null,reconnectAttempts=0x0;const MAX_RECONNECT_DELAY=0x7530,taskStreams=new Map(),TASK_STREAM_EVENTS=['activity','logs','metadata','summary','changed-files','app-server-status','complete'];function connect(_0x278928){eventSource&&currentUserId!==_0x278928&&(eventSource['close'](),eventSource=null);if(eventSource&&eventSource['readyState']!==EventSource['CLOSED'])return;currentUserId=_0x278928;const _0x3b20d4=_0x278928&&_0x278928!=='me'?'?userId='+_0x278928:'';try{eventSource=new EventSource('/tasks/updates'+_0x3b20d4),eventSource['addEventListener']('snapshot',_0x16ad5c=>{broadcast({'type':'snapshot','data':_0x16ad5c['data']}),reconnectAttempts=0x0;}),eventSource['addEventListener']('activity',_0x3e3f44=>{broadcast({'type':'activity','data':_0x3e3f44['data']});}),eventSource['addEventListener']('status',_0xf937fe=>{broadcast({'type':'status','data':_0xf937fe['data']});}),eventSource['addEventListener']('new-task',_0x388b7a=>{broadcast({'type':'new-task','data':_0x388b7a['data']});}),eventSource['addEventListener']('queue-position',_0x2b5172=>{broadcast({'type':'queue-position','data':_0x2b5172['data']});}),eventSource['addEventListener']('open',()=>{broadcast({'type':'connected'}),reconnectAttempts=0x0;}),eventSource['addEventListener']('error',_0x29047e=>{console['error']('[SSE\x20Worker]\x20Connection\x20error:',_0x29047e),broadcast({'type':'error','error':'Connection\x20error'}),eventSource&&(eventSource['close'](),eventSource=null),scheduleReconnect();});}catch(_0x2f0075){console['error']('[SSE\x20Worker]\x20Failed\x20to\x20create\x20EventSource:',_0x2f0075),broadcast({'type':'error','error':_0x2f0075['message']}),scheduleReconnect();}}function scheduleReconnect(){reconnectTimeout&&clearTimeout(reconnectTimeout);if(ports['size']===0x0)return;const _0x4fe889=Math['min'](0x3e8*Math['pow'](0x2,reconnectAttempts),MAX_RECONNECT_DELAY);reconnectAttempts++,console['log']('[SSE\x20Worker]\x20Scheduling\x20reconnect\x20in\x20'+_0x4fe889+'ms\x20(attempt\x20'+reconnectAttempts+')'),reconnectTimeout=setTimeout(()=>{ports['size']>0x0&&connect(currentUserId);},_0x4fe889);}function broadcast(_0x5494b1){const _0x5998d3=[];ports['forEach'](_0x2362b8=>{try{_0x2362b8['postMessage'](_0x5494b1);}catch(_0x5bff6b){console['warn']('[SSE\x20Worker]\x20Failed\x20to\x20send\x20to\x20port,\x20removing:',_0x5bff6b),_0x5998d3['push'](_0x2362b8);}}),_0x5998d3['length']>0x0&&cleanUpDeadPorts(_0x5998d3),ports['size']===0x0&&eventSource&&(console['log']('[SSE\x20Worker]\x20No\x20more\x20connected\x20ports,\x20closing\x20SSE'),eventSource['close'](),eventSource=null,reconnectTimeout&&(clearTimeout(reconnectTimeout),reconnectTimeout=null));}function subscribeTask(_0x109569,_0x15f905){let _0x5befb1=taskStreams['get'](_0x15f905);!_0x5befb1&&(_0x5befb1={'eventSource':null,'reconnectTimeout':null,'reconnectAttempts':0x0,'subscribedPorts':new Set()},taskStreams['set'](_0x15f905,_0x5befb1));_0x5befb1['subscribedPorts']['add'](_0x109569);if(!_0x5befb1['eventSource']||_0x5befb1['eventSource']['readyState']===EventSource['CLOSED'])connectTaskStream(_0x15f905);else{if(_0x5befb1['eventSource']['readyState']===EventSource['OPEN'])try{_0x109569['postMessage']({'type':'task:connected','taskId':_0x15f905});}catch(_0xf6b30a){}}}function unsubscribeTask(_0x58bca4,_0x2b1c9f){const _0x2158fc=taskStreams['get'](_0x2b1c9f);if(!_0x2158fc)return;_0x2158fc['subscribedPorts']['delete'](_0x58bca4),_0x2158fc['subscribedPorts']['size']===0x0&&deferredCloseTaskStream(_0x2b1c9f);}function connectTaskStream(_0x338acc){const _0x52123c=taskStreams['get'](_0x338acc);if(!_0x52123c)return;_0x52123c['eventSource']&&(_0x52123c['eventSource']['close'](),_0x52123c['eventSource']=null);try{_0x52123c['eventSource']=new EventSource('/tasks/'+_0x338acc+'/stream');for(const _0x3dab5b of TASK_STREAM_EVENTS){_0x52123c['eventSource']['addEventListener'](_0x3dab5b,_0x1828fc=>{broadcastToTask(_0x338acc,'task:'+_0x3dab5b,_0x1828fc['data']),_0x52123c['reconnectAttempts']=0x0;});}_0x52123c['eventSource']['addEventListener']('open',()=>{broadcastToTask(_0x338acc,'task:connected','{}'),_0x52123c['reconnectAttempts']=0x0;}),_0x52123c['eventSource']['addEventListener']('error',()=>{broadcastToTask(_0x338acc,'task:error',JSON['stringify']({'error':'Connection\x20error'})),_0x52123c['eventSource']&&(_0x52123c['eventSource']['close'](),_0x52123c['eventSource']=null),scheduleTaskReconnect(_0x338acc);});}catch(_0x5046c3){console['error']('[SSE\x20Worker]\x20Failed\x20to\x20create\x20task\x20EventSource\x20for\x20'+_0x338acc+':',_0x5046c3),broadcastToTask(_0x338acc,'task:error',JSON['stringify']({'error':_0x5046c3['message']})),scheduleTaskReconnect(_0x338acc);}}function broadcastToTask(_0x2b8c5f,_0x1f88e8,_0x44f210){const _0x3e4593=taskStreams['get'](_0x2b8c5f);if(!_0x3e4593)return;const _0x20fabc=[];_0x3e4593['subscribedPorts']['forEach'](_0x41aedf=>{try{_0x41aedf['postMessage']({'type':_0x1f88e8,'taskId':_0x2b8c5f,'data':_0x44f210});}catch(_0x53f2b2){_0x20fabc['push'](_0x41aedf);}}),_0x20fabc['length']>0x0&&(_0x20fabc['forEach'](_0x218918=>_0x3e4593['subscribedPorts']['delete'](_0x218918)),cleanUpDeadPorts(_0x20fabc),_0x3e4593['subscribedPorts']['size']===0x0&&closeTaskStream(_0x2b8c5f));}function closeTaskStream(_0x316c8a){const _0x23b17a=taskStreams['get'](_0x316c8a);if(!_0x23b17a)return;_0x23b17a['eventSource']&&_0x23b17a['eventSource']['close'](),_0x23b17a['reconnectTimeout']&&clearTimeout(_0x23b17a['reconnectTimeout']),taskStreams['delete'](_0x316c8a);}function deferredCloseTaskStream(_0x780320){setTimeout(()=>{const _0x1fac84=taskStreams['get'](_0x780320);_0x1fac84&&_0x1fac84['subscribedPorts']['size']===0x0&&closeTaskStream(_0x780320);},0x0);}function scheduleTaskReconnect(_0x518e2e){const _0x38b942=taskStreams['get'](_0x518e2e);if(!_0x38b942||_0x38b942['subscribedPorts']['size']===0x0)return;_0x38b942['reconnectTimeout']&&clearTimeout(_0x38b942['reconnectTimeout']);const _0x21fec4=Math['min'](0x3e8*Math['pow'](0x2,_0x38b942['reconnectAttempts']),MAX_RECONNECT_DELAY);_0x38b942['reconnectAttempts']++,console['log']('[SSE\x20Worker]\x20Scheduling\x20task\x20stream\x20reconnect\x20for\x20'+_0x518e2e+'\x20in\x20'+_0x21fec4+'ms'),_0x38b942['reconnectTimeout']=setTimeout(()=>{_0x38b942['subscribedPorts']['size']>0x0&&connectTaskStream(_0x518e2e);},_0x21fec4);}function cleanUpDeadPorts(_0x3036b4){for(const _0x30ba00 of _0x3036b4){ports['delete'](_0x30ba00),taskStreams['forEach']((_0x70139f,_0x4441df)=>{_0x70139f['subscribedPorts']['delete'](_0x30ba00),_0x70139f['subscribedPorts']['size']===0x0&&closeTaskStream(_0x4441df);});}}function removePortFromAllTasks(_0xadd407){taskStreams['forEach']((_0x3fbfbf,_0x36fbaa)=>{_0x3fbfbf['subscribedPorts']['has'](_0xadd407)&&(_0x3fbfbf['subscribedPorts']['delete'](_0xadd407),_0x3fbfbf['subscribedPorts']['size']===0x0&&closeTaskStream(_0x36fbaa));});}self['onconnect']=function(_0xb0a897){const _0x3fbeda=_0xb0a897['ports'][0x0];ports['add'](_0x3fbeda),console['log']('[SSE\x20Worker]\x20New\x20port\x20connected.\x20Total\x20ports:\x20'+ports['size']),_0x3fbeda['onmessage']=function(_0x37dc12){const {action:_0x220d74,userId:_0x3d753b,taskId:_0x535ae5}=_0x37dc12['data'];switch(_0x220d74){case'connect':connect(_0x3d753b);eventSource&&eventSource['readyState']===EventSource['OPEN']&&_0x3fbeda['postMessage']({'type':'connected'});break;case'disconnect':ports['delete'](_0x3fbeda),removePortFromAllTasks(_0x3fbeda),console['log']('[SSE\x20Worker]\x20Port\x20disconnected.\x20Total\x20ports:\x20'+ports['size']);ports['size']===0x0&&eventSource&&(eventSource['close'](),eventSource=null,reconnectTimeout&&(clearTimeout(reconnectTimeout),reconnectTimeout=null));break;case'changeFilter':_0x3d753b!==currentUserId&&connect(_0x3d753b);break;case'subscribeTask':subscribeTask(_0x3fbeda,_0x535ae5);break;case'unsubscribeTask':unsubscribeTask(_0x3fbeda,_0x535ae5);break;default:console['warn']('[SSE\x20Worker]\x20Unknown\x20action:',_0x220d74);}},_0x3fbeda['onmessageerror']=function(_0x263c9f){console['error']('[SSE\x20Worker]\x20Port\x20message\x20error:',_0x263c9f),ports['delete'](_0x3fbeda),removePortFromAllTasks(_0x3fbeda);},_0x3fbeda['start']();};
1
+ const ports=new Set();let eventSource=null,currentUserId=null,reconnectTimeout=null,reconnectAttempts=0x0;const MAX_RECONNECT_DELAY=0x7530,taskStreams=new Map(),TASK_STREAM_EVENTS=['activity','logs','metadata','summary','changed-files','app-server-status','complete'];function connect(_0x5c7e9f){eventSource&&currentUserId!==_0x5c7e9f&&(eventSource['close'](),eventSource=null);if(eventSource&&eventSource['readyState']!==EventSource['CLOSED'])return;currentUserId=_0x5c7e9f;const _0x26cc46=_0x5c7e9f&&_0x5c7e9f!=='me'?'?userId='+_0x5c7e9f:'';try{eventSource=new EventSource('/tasks/updates'+_0x26cc46),eventSource['addEventListener']('snapshot',_0x10f5b7=>{broadcast({'type':'snapshot','data':_0x10f5b7['data']}),reconnectAttempts=0x0;}),eventSource['addEventListener']('activity',_0x7f5a3d=>{broadcast({'type':'activity','data':_0x7f5a3d['data']});}),eventSource['addEventListener']('status',_0x29109f=>{broadcast({'type':'status','data':_0x29109f['data']});}),eventSource['addEventListener']('new-task',_0x78fed9=>{broadcast({'type':'new-task','data':_0x78fed9['data']});}),eventSource['addEventListener']('queue-position',_0xacf46d=>{broadcast({'type':'queue-position','data':_0xacf46d['data']});}),eventSource['addEventListener']('open',()=>{broadcast({'type':'connected'}),reconnectAttempts=0x0;}),eventSource['addEventListener']('error',_0x4f1890=>{console['error']('[SSE\x20Worker]\x20Connection\x20error:',_0x4f1890),broadcast({'type':'error','error':'Connection\x20error'}),eventSource&&(eventSource['close'](),eventSource=null),scheduleReconnect();});}catch(_0x51a394){console['error']('[SSE\x20Worker]\x20Failed\x20to\x20create\x20EventSource:',_0x51a394),broadcast({'type':'error','error':_0x51a394['message']}),scheduleReconnect();}}function scheduleReconnect(){reconnectTimeout&&clearTimeout(reconnectTimeout);if(ports['size']===0x0)return;const _0x534fe7=Math['min'](0x3e8*Math['pow'](0x2,reconnectAttempts),MAX_RECONNECT_DELAY);reconnectAttempts++,console['log']('[SSE\x20Worker]\x20Scheduling\x20reconnect\x20in\x20'+_0x534fe7+'ms\x20(attempt\x20'+reconnectAttempts+')'),reconnectTimeout=setTimeout(()=>{ports['size']>0x0&&connect(currentUserId);},_0x534fe7);}function broadcast(_0x171704){const _0xd3ed50=[];ports['forEach'](_0x5ec920=>{try{_0x5ec920['postMessage'](_0x171704);}catch(_0x466729){console['warn']('[SSE\x20Worker]\x20Failed\x20to\x20send\x20to\x20port,\x20removing:',_0x466729),_0xd3ed50['push'](_0x5ec920);}}),_0xd3ed50['length']>0x0&&cleanUpDeadPorts(_0xd3ed50),ports['size']===0x0&&eventSource&&(console['log']('[SSE\x20Worker]\x20No\x20more\x20connected\x20ports,\x20closing\x20SSE'),eventSource['close'](),eventSource=null,reconnectTimeout&&(clearTimeout(reconnectTimeout),reconnectTimeout=null));}function subscribeTask(_0x440142,_0x461c28){let _0x1c9d50=taskStreams['get'](_0x461c28);!_0x1c9d50&&(_0x1c9d50={'eventSource':null,'reconnectTimeout':null,'reconnectAttempts':0x0,'subscribedPorts':new Set()},taskStreams['set'](_0x461c28,_0x1c9d50));_0x1c9d50['subscribedPorts']['add'](_0x440142);if(!_0x1c9d50['eventSource']||_0x1c9d50['eventSource']['readyState']===EventSource['CLOSED'])connectTaskStream(_0x461c28);else{if(_0x1c9d50['eventSource']['readyState']===EventSource['OPEN'])try{_0x440142['postMessage']({'type':'task:connected','taskId':_0x461c28});}catch(_0x2d51b){}}}function unsubscribeTask(_0x29dfc2,_0xf13e4c){const _0x32f12a=taskStreams['get'](_0xf13e4c);if(!_0x32f12a)return;_0x32f12a['subscribedPorts']['delete'](_0x29dfc2),_0x32f12a['subscribedPorts']['size']===0x0&&deferredCloseTaskStream(_0xf13e4c);}function connectTaskStream(_0x19f8f7){const _0x2619dc=taskStreams['get'](_0x19f8f7);if(!_0x2619dc)return;_0x2619dc['eventSource']&&(_0x2619dc['eventSource']['close'](),_0x2619dc['eventSource']=null);try{_0x2619dc['eventSource']=new EventSource('/tasks/'+_0x19f8f7+'/stream');for(const _0x3304ef of TASK_STREAM_EVENTS){_0x2619dc['eventSource']['addEventListener'](_0x3304ef,_0x8fb57=>{broadcastToTask(_0x19f8f7,'task:'+_0x3304ef,_0x8fb57['data']),_0x2619dc['reconnectAttempts']=0x0;});}_0x2619dc['eventSource']['addEventListener']('open',()=>{broadcastToTask(_0x19f8f7,'task:connected','{}'),_0x2619dc['reconnectAttempts']=0x0;}),_0x2619dc['eventSource']['addEventListener']('error',()=>{broadcastToTask(_0x19f8f7,'task:error',JSON['stringify']({'error':'Connection\x20error'})),_0x2619dc['eventSource']&&(_0x2619dc['eventSource']['close'](),_0x2619dc['eventSource']=null),scheduleTaskReconnect(_0x19f8f7);});}catch(_0x32d418){console['error']('[SSE\x20Worker]\x20Failed\x20to\x20create\x20task\x20EventSource\x20for\x20'+_0x19f8f7+':',_0x32d418),broadcastToTask(_0x19f8f7,'task:error',JSON['stringify']({'error':_0x32d418['message']})),scheduleTaskReconnect(_0x19f8f7);}}function broadcastToTask(_0x4b3052,_0x21c6e5,_0x12a74a){const _0x598273=taskStreams['get'](_0x4b3052);if(!_0x598273)return;const _0x4ea5ed=[];_0x598273['subscribedPorts']['forEach'](_0x424798=>{try{_0x424798['postMessage']({'type':_0x21c6e5,'taskId':_0x4b3052,'data':_0x12a74a});}catch(_0x1ad8df){_0x4ea5ed['push'](_0x424798);}}),_0x4ea5ed['length']>0x0&&(_0x4ea5ed['forEach'](_0x2fd00f=>_0x598273['subscribedPorts']['delete'](_0x2fd00f)),cleanUpDeadPorts(_0x4ea5ed),_0x598273['subscribedPorts']['size']===0x0&&closeTaskStream(_0x4b3052));}function closeTaskStream(_0x1dc955){const _0x213b9a=taskStreams['get'](_0x1dc955);if(!_0x213b9a)return;_0x213b9a['eventSource']&&_0x213b9a['eventSource']['close'](),_0x213b9a['reconnectTimeout']&&clearTimeout(_0x213b9a['reconnectTimeout']),taskStreams['delete'](_0x1dc955);}function deferredCloseTaskStream(_0x34d1c6){setTimeout(()=>{const _0x598dd3=taskStreams['get'](_0x34d1c6);_0x598dd3&&_0x598dd3['subscribedPorts']['size']===0x0&&closeTaskStream(_0x34d1c6);},0x0);}function scheduleTaskReconnect(_0x30a217){const _0x31da72=taskStreams['get'](_0x30a217);if(!_0x31da72||_0x31da72['subscribedPorts']['size']===0x0)return;_0x31da72['reconnectTimeout']&&clearTimeout(_0x31da72['reconnectTimeout']);const _0x527c7e=Math['min'](0x3e8*Math['pow'](0x2,_0x31da72['reconnectAttempts']),MAX_RECONNECT_DELAY);_0x31da72['reconnectAttempts']++,console['log']('[SSE\x20Worker]\x20Scheduling\x20task\x20stream\x20reconnect\x20for\x20'+_0x30a217+'\x20in\x20'+_0x527c7e+'ms'),_0x31da72['reconnectTimeout']=setTimeout(()=>{_0x31da72['subscribedPorts']['size']>0x0&&connectTaskStream(_0x30a217);},_0x527c7e);}function cleanUpDeadPorts(_0x594583){for(const _0x3efcc3 of _0x594583){ports['delete'](_0x3efcc3),taskStreams['forEach']((_0x227b66,_0x17ba26)=>{_0x227b66['subscribedPorts']['delete'](_0x3efcc3),_0x227b66['subscribedPorts']['size']===0x0&&closeTaskStream(_0x17ba26);});}}function removePortFromAllTasks(_0xe7e32a){taskStreams['forEach']((_0x383a9a,_0x151580)=>{_0x383a9a['subscribedPorts']['has'](_0xe7e32a)&&(_0x383a9a['subscribedPorts']['delete'](_0xe7e32a),_0x383a9a['subscribedPorts']['size']===0x0&&closeTaskStream(_0x151580));});}self['onconnect']=function(_0x4da2b0){const _0x40a8c6=_0x4da2b0['ports'][0x0];ports['add'](_0x40a8c6),console['log']('[SSE\x20Worker]\x20New\x20port\x20connected.\x20Total\x20ports:\x20'+ports['size']),_0x40a8c6['onmessage']=function(_0xa8db55){const {action:_0x27870e,userId:_0x20ceea,taskId:_0x42e231}=_0xa8db55['data'];switch(_0x27870e){case'connect':connect(_0x20ceea);eventSource&&eventSource['readyState']===EventSource['OPEN']&&_0x40a8c6['postMessage']({'type':'connected'});break;case'disconnect':ports['delete'](_0x40a8c6),removePortFromAllTasks(_0x40a8c6),console['log']('[SSE\x20Worker]\x20Port\x20disconnected.\x20Total\x20ports:\x20'+ports['size']);ports['size']===0x0&&eventSource&&(eventSource['close'](),eventSource=null,reconnectTimeout&&(clearTimeout(reconnectTimeout),reconnectTimeout=null));break;case'changeFilter':_0x20ceea!==currentUserId&&connect(_0x20ceea);break;case'subscribeTask':subscribeTask(_0x40a8c6,_0x42e231);break;case'unsubscribeTask':unsubscribeTask(_0x40a8c6,_0x42e231);break;default:console['warn']('[SSE\x20Worker]\x20Unknown\x20action:',_0x27870e);}},_0x40a8c6['onmessageerror']=function(_0x4a22b2){console['error']('[SSE\x20Worker]\x20Port\x20message\x20error:',_0x4a22b2),ports['delete'](_0x40a8c6),removePortFromAllTasks(_0x40a8c6);},_0x40a8c6['start']();};
@@ -7485,6 +7485,51 @@ body.terminal-embedded .terminal-container .xterm {
7485
7485
  background: linear-gradient(135deg, #25a268 0%, #1e8a55 100%);
7486
7486
  }
7487
7487
 
7488
+ /* Conflict resolution panel shown when approval hits merge conflicts */
7489
+ .conflict-resolution-panel {
7490
+ margin-top: 20px;
7491
+ padding-top: 16px;
7492
+ border-top: 1px solid var(--color-border, rgba(255, 255, 255, 0.1));
7493
+ }
7494
+
7495
+ .conflict-resolution-message {
7496
+ display: flex;
7497
+ align-items: flex-start;
7498
+ gap: 8px;
7499
+ padding: 10px 12px;
7500
+ background: rgba(255, 152, 0, 0.08);
7501
+ border: 1px solid rgba(255, 152, 0, 0.25);
7502
+ border-radius: 6px;
7503
+ color: var(--color-text, #e0e0e0);
7504
+ font-size: 13px;
7505
+ line-height: 1.4;
7506
+ margin-bottom: 16px;
7507
+ }
7508
+
7509
+ .conflict-resolution-message .warning-icon {
7510
+ flex-shrink: 0;
7511
+ }
7512
+
7513
+ .conflict-resolution-options {
7514
+ display: flex;
7515
+ flex-direction: column;
7516
+ gap: 6px;
7517
+ }
7518
+
7519
+ .conflict-resolution-options button {
7520
+ width: 100%;
7521
+ text-align: left;
7522
+ padding: 10px 12px;
7523
+ }
7524
+
7525
+ .conflict-resolution-options .field-hint {
7526
+ margin: 0 0 10px 12px;
7527
+ }
7528
+
7529
+ .conflict-resolution-options button:last-child {
7530
+ margin-top: 6px;
7531
+ }
7532
+
7488
7533
  /* Wider modal for activity details to accommodate code and tool outputs */
7489
7534
  #activity-detail-modal .modal-content,
7490
7535
  #widget-activity-detail-modal .modal-content {
@@ -1 +1 @@
1
- export function toDisplayAgentName(_0x3dcfee,{fallback:fallback='Unknown'}={}){const _0x3d12e8=String(_0x3dcfee||'')['trim']()['toLowerCase']();if(!_0x3d12e8)return fallback;return _0x3d12e8['charAt'](0x0)['toUpperCase']()+_0x3d12e8['slice'](0x1);}export function escapeRegExp(_0x2cb0e0){return String(_0x2cb0e0)['replace'](/[.*+?^${}()|[\]\\]/g,'\x5c$&');}export function compareJudgmentsForAliasOrder(_0x3eafc3,_0x438fe2){const _0x45f27e=String(_0x3eafc3?.['createdAt']||''),_0x14f74a=String(_0x438fe2?.['createdAt']||'');if(_0x45f27e!==_0x14f74a)return _0x45f27e['localeCompare'](_0x14f74a);return String(_0x3eafc3?.['taskId']||'')['localeCompare'](String(_0x438fe2?.['taskId']||''));}export function parseJudgeAliasNumber(_0x241a0c,_0x461336){const _0x4e752d=typeof _0x241a0c==='string'?_0x241a0c['trim']():'',_0x1645ab=toDisplayAgentName(_0x461336,{'fallback':''});if(!_0x4e752d||!_0x1645ab)return null;const _0xe870ad=_0x4e752d['toLowerCase'](),_0x32b0e2=_0x1645ab['toLowerCase']();if(_0xe870ad===_0x32b0e2||_0xe870ad===_0x32b0e2+'\x20judge')return 0x1;const _0x249a30=[new RegExp('^'+escapeRegExp(_0x1645ab)+'\x5cs+(\x5cd+)$','i'),new RegExp('^'+escapeRegExp(_0x1645ab)+'\x5cs+Judge\x5cs+(\x5cd+)$','i')];for(const _0x2c97dd of _0x249a30){const _0x5af505=_0x4e752d['match'](_0x2c97dd);if(_0x5af505){const _0x1a3248=Number(_0x5af505[0x1]);if(Number['isInteger'](_0x1a3248)&&_0x1a3248>0x0)return _0x1a3248;}}return null;}export function formatJudgeDisplayName({alias:_0x318372,agent:_0x1a6f1c,number:number=null,hasDuplicates:hasDuplicates=![]}={}){const _0x364abf=toDisplayAgentName(_0x1a6f1c,{'fallback':'Judge'}),_0x392db2=typeof _0x318372==='string'?_0x318372['trim']():'';if(Number['isInteger'](number)&&number>0x0)return _0x364abf+'\x20Judge\x20'+number;if(_0x392db2)return/\bjudge\b/i['test'](_0x392db2)?_0x392db2:_0x392db2+'\x20Judge';if(hasDuplicates)return _0x364abf+'\x20Judge';return _0x364abf==='Judge'?_0x364abf:_0x364abf+'\x20Judge';}export function buildJudgmentDisplayNameMap(_0x5b0c98=[]){const _0x5dec77=Array['isArray'](_0x5b0c98)?_0x5b0c98['filter'](Boolean):[],_0x577b7a=new Map();_0x5dec77['forEach'](_0x382145=>{const _0xbc0f5f=_0x382145?.['judgeAgent']||_0x382145?.['envVars']?.['CODER_AGENT']||'unknown',_0x2ebd18=String(_0xbc0f5f||'')['trim']()['toLowerCase']()||'unknown';!_0x577b7a['has'](_0x2ebd18)&&_0x577b7a['set'](_0x2ebd18,[]),_0x577b7a['get'](_0x2ebd18)['push'](_0x382145);});const _0x3cb1cf=new Map();return _0x577b7a['forEach'](_0x5d99c1=>{const _0x3b3d3d=[..._0x5d99c1]['sort'](compareJudgmentsForAliasOrder),_0x49007e=_0x3b3d3d['length']>0x1,_0x4561e2=new Set(),_0xc131d9=new Map();_0x49007e&&_0x3b3d3d['forEach'](_0x2dba80=>{const _0x2646e9=parseJudgeAliasNumber(_0x2dba80?.['judgeAlias'],_0x2dba80?.['judgeAgent']);if(!Number['isInteger'](_0x2646e9)||_0x2646e9<=0x0||_0x4561e2['has'](_0x2646e9))return;_0xc131d9['set'](_0x2dba80['taskId'],_0x2646e9),_0x4561e2['add'](_0x2646e9);});let _0x25b207=0x1;const _0xaacdc=()=>{while(_0x4561e2['has'](_0x25b207)){_0x25b207+=0x1;}return _0x4561e2['add'](_0x25b207),_0x25b207;};_0x3b3d3d['forEach'](_0x4df8f0=>{let _0x908add=_0xc131d9['get'](_0x4df8f0['taskId'])||null;_0x49007e&&_0x908add===null&&!String(_0x4df8f0?.['judgeAlias']||'')['trim']()&&(_0x908add=_0xaacdc()),_0x3cb1cf['set'](_0x4df8f0['taskId'],formatJudgeDisplayName({'alias':_0x4df8f0?.['judgeAlias']||null,'agent':_0x4df8f0?.['judgeAgent']||_0x4df8f0?.['envVars']?.['CODER_AGENT']||'unknown','number':_0x908add,'hasDuplicates':_0x49007e}));});}),_0x3cb1cf;}export function buildTaskNavigationHref(_0x3635bc,{currentUrl:_0x39900d,groupedTaskIds:groupedTaskIds=[],groupId:groupId=null}={}){const _0x15175f=new URL(_0x39900d),_0x15b782=String(_0x3635bc||'')['trim'](),_0x395f58=String(groupId||'')['trim'](),_0x304f93=Array['isArray'](groupedTaskIds)?groupedTaskIds['map'](_0x3031d8=>String(_0x3031d8||'')['trim']())['filter'](Boolean):[],_0xdebfd3=Boolean(_0x395f58)||_0x304f93['length']>0x1;if(!_0xdebfd3)return _0x15b782&&_0x15175f['searchParams']['set']('id',_0x15b782),_0x15175f['searchParams']['delete']('groupId'),_0x15175f['toString']();const _0x5db02c=_0x304f93['includes'](_0x15b782)?_0x304f93:[..._0x304f93,_0x15b782]['filter'](Boolean);if(_0x5db02c['length']>0x0)_0x15175f['searchParams']['set']('id',_0x5db02c['join'](','));else _0x15b782&&_0x15175f['searchParams']['set']('id',_0x15b782);return _0x395f58?_0x15175f['searchParams']['set']('groupId',_0x395f58):_0x15175f['searchParams']['delete']('groupId'),_0x15175f['toString']();}
1
+ export function toDisplayAgentName(_0x330281,{fallback:fallback='Unknown'}={}){const _0x459893=String(_0x330281||'')['trim']()['toLowerCase']();if(!_0x459893)return fallback;return _0x459893['charAt'](0x0)['toUpperCase']()+_0x459893['slice'](0x1);}export function escapeRegExp(_0x196ce6){return String(_0x196ce6)['replace'](/[.*+?^${}()|[\]\\]/g,'\x5c$&');}export function compareJudgmentsForAliasOrder(_0x353f3c,_0x5a1118){const _0x53a500=String(_0x353f3c?.['createdAt']||''),_0xfbd5a7=String(_0x5a1118?.['createdAt']||'');if(_0x53a500!==_0xfbd5a7)return _0x53a500['localeCompare'](_0xfbd5a7);return String(_0x353f3c?.['taskId']||'')['localeCompare'](String(_0x5a1118?.['taskId']||''));}export function parseJudgeAliasNumber(_0x504b4f,_0x49c0f9){const _0x44bd98=typeof _0x504b4f==='string'?_0x504b4f['trim']():'',_0x3adc91=toDisplayAgentName(_0x49c0f9,{'fallback':''});if(!_0x44bd98||!_0x3adc91)return null;const _0x4b165b=_0x44bd98['toLowerCase'](),_0x47c2c5=_0x3adc91['toLowerCase']();if(_0x4b165b===_0x47c2c5||_0x4b165b===_0x47c2c5+'\x20judge')return 0x1;const _0x5bc648=[new RegExp('^'+escapeRegExp(_0x3adc91)+'\x5cs+(\x5cd+)$','i'),new RegExp('^'+escapeRegExp(_0x3adc91)+'\x5cs+Judge\x5cs+(\x5cd+)$','i')];for(const _0x22478a of _0x5bc648){const _0x2cc9c8=_0x44bd98['match'](_0x22478a);if(_0x2cc9c8){const _0x253b43=Number(_0x2cc9c8[0x1]);if(Number['isInteger'](_0x253b43)&&_0x253b43>0x0)return _0x253b43;}}return null;}export function formatJudgeDisplayName({alias:_0x38dd48,agent:_0x435ddc,number:number=null,hasDuplicates:hasDuplicates=![]}={}){const _0x578a84=toDisplayAgentName(_0x435ddc,{'fallback':'Judge'}),_0x3dff22=typeof _0x38dd48==='string'?_0x38dd48['trim']():'';if(Number['isInteger'](number)&&number>0x0)return _0x578a84+'\x20Judge\x20'+number;if(_0x3dff22)return/\bjudge\b/i['test'](_0x3dff22)?_0x3dff22:_0x3dff22+'\x20Judge';if(hasDuplicates)return _0x578a84+'\x20Judge';return _0x578a84==='Judge'?_0x578a84:_0x578a84+'\x20Judge';}export function buildJudgmentDisplayNameMap(_0x555e96=[]){const _0x508dad=Array['isArray'](_0x555e96)?_0x555e96['filter'](Boolean):[],_0x3e6457=new Map();_0x508dad['forEach'](_0x15441e=>{const _0x1d5a0d=_0x15441e?.['judgeAgent']||_0x15441e?.['envVars']?.['CODER_AGENT']||'unknown',_0x1309d0=String(_0x1d5a0d||'')['trim']()['toLowerCase']()||'unknown';!_0x3e6457['has'](_0x1309d0)&&_0x3e6457['set'](_0x1309d0,[]),_0x3e6457['get'](_0x1309d0)['push'](_0x15441e);});const _0x1eeb0a=new Map();return _0x3e6457['forEach'](_0x222f62=>{const _0x100932=[..._0x222f62]['sort'](compareJudgmentsForAliasOrder),_0xbf749a=_0x100932['length']>0x1,_0x4ffb49=new Set(),_0x1b13c6=new Map();_0xbf749a&&_0x100932['forEach'](_0x5a7697=>{const _0x489a56=parseJudgeAliasNumber(_0x5a7697?.['judgeAlias'],_0x5a7697?.['judgeAgent']);if(!Number['isInteger'](_0x489a56)||_0x489a56<=0x0||_0x4ffb49['has'](_0x489a56))return;_0x1b13c6['set'](_0x5a7697['taskId'],_0x489a56),_0x4ffb49['add'](_0x489a56);});let _0x3dd7f4=0x1;const _0x54aaa7=()=>{while(_0x4ffb49['has'](_0x3dd7f4)){_0x3dd7f4+=0x1;}return _0x4ffb49['add'](_0x3dd7f4),_0x3dd7f4;};_0x100932['forEach'](_0x5d6717=>{let _0x1b1f46=_0x1b13c6['get'](_0x5d6717['taskId'])||null;_0xbf749a&&_0x1b1f46===null&&!String(_0x5d6717?.['judgeAlias']||'')['trim']()&&(_0x1b1f46=_0x54aaa7()),_0x1eeb0a['set'](_0x5d6717['taskId'],formatJudgeDisplayName({'alias':_0x5d6717?.['judgeAlias']||null,'agent':_0x5d6717?.['judgeAgent']||_0x5d6717?.['envVars']?.['CODER_AGENT']||'unknown','number':_0x1b1f46,'hasDuplicates':_0xbf749a}));});}),_0x1eeb0a;}export function buildTaskNavigationHref(_0xc97a38,{currentUrl:_0x224f11,groupedTaskIds:groupedTaskIds=[],groupId:groupId=null}={}){const _0xb1f1e5=new URL(_0x224f11),_0x4ea777=String(_0xc97a38||'')['trim'](),_0x48abdb=String(groupId||'')['trim'](),_0x1bc428=Array['isArray'](groupedTaskIds)?groupedTaskIds['map'](_0x160526=>String(_0x160526||'')['trim']())['filter'](Boolean):[],_0x2a71d2=Boolean(_0x48abdb)||_0x1bc428['length']>0x1;if(!_0x2a71d2)return _0x4ea777&&_0xb1f1e5['searchParams']['set']('id',_0x4ea777),_0xb1f1e5['searchParams']['delete']('groupId'),_0xb1f1e5['toString']();const _0x564e35=_0x1bc428['includes'](_0x4ea777)?_0x1bc428:[..._0x1bc428,_0x4ea777]['filter'](Boolean);if(_0x564e35['length']>0x0)_0xb1f1e5['searchParams']['set']('id',_0x564e35['join'](','));else _0x4ea777&&_0xb1f1e5['searchParams']['set']('id',_0x4ea777);return _0x48abdb?_0xb1f1e5['searchParams']['set']('groupId',_0x48abdb):_0xb1f1e5['searchParams']['delete']('groupId'),_0xb1f1e5['toString']();}
@@ -39,7 +39,7 @@
39
39
  <script type="module" src="markdown-editor.js?v=2"></script>
40
40
  <script src="markdown-file-editor.js?v=2"></script>
41
41
  <script type="module" src="comments-widget.js?v=2"></script>
42
- <script type="module" src="task.js?v=80"></script>
42
+ <script type="module" src="task.js?v=81"></script>
43
43
  <!-- Dev QA shortcut: Ctrl+Shift+Q to launch current page in QA mode -->
44
44
  <style>
45
45
  .agent-card.agent-disabled {
@@ -696,7 +696,7 @@
696
696
  <dd id="meta-duration">—</dd>
697
697
  </div>
698
698
  <div id="meta-context-usage-wrapper" hidden>
699
- <dt>Context Usage</dt>
699
+ <dt>Context %</dt>
700
700
  <dd>
701
701
  <div class="context-usage-meta">
702
702
  <div class="context-usage-bar" aria-hidden="true">
@@ -1262,6 +1262,29 @@
1262
1262
  </div>
1263
1263
  </div>
1264
1264
 
1265
+ <!-- Pull Conflict Modal -->
1266
+ <div id="pull-conflict-modal" class="modal" hidden>
1267
+ <div class="modal-overlay"></div>
1268
+ <div class="modal-content">
1269
+ <div class="modal-header">
1270
+ <h2>Merge Conflict</h2>
1271
+ <button class="modal-close" id="close-pull-conflict-modal">&times;</button>
1272
+ </div>
1273
+ <div class="modal-body">
1274
+ <div class="modal-section">
1275
+ <p id="pull-conflict-message">Remote has conflicting changes that could not be merged automatically.</p>
1276
+ </div>
1277
+ <div class="modal-section">
1278
+ <p class="field-hint" style="margin: 0;">Would you like the agent to pull the remote changes and resolve the conflicts?</p>
1279
+ </div>
1280
+ </div>
1281
+ <div class="modal-footer">
1282
+ <button class="btn-ghost" id="cancel-pull-conflict">Cancel</button>
1283
+ <button class="btn-primary" id="confirm-pull-conflict">Let the Agent Resolve</button>
1284
+ </div>
1285
+ </div>
1286
+ </div>
1287
+
1265
1288
  <!-- Stop Container Modal -->
1266
1289
  <div id="stop-modal" class="modal" hidden>
1267
1290
  <div class="modal-overlay"></div>