@profoundlogic/coderflow-server 0.8.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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(_0xd8f79a){if(_0xd8f79a==='connected')return'onConnected';if(_0xd8f79a==='error')return'onError';return'on'+_0xd8f79a['split']('-')['map'](_0x173e5a=>_0x173e5a['charAt'](0x0)['toUpperCase']()+_0x173e5a['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'](_0xfd9433,_0x558bec){return!this['listeners']['has'](_0xfd9433)&&this['listeners']['set'](_0xfd9433,new Set()),this['listeners']['get'](_0xfd9433)['add'](_0x558bec),this;}['off'](_0x295a3a,_0x311adf){return this['listeners']['has'](_0x295a3a)&&this['listeners']['get'](_0x295a3a)['delete'](_0x311adf),this;}['_emit'](_0x26a2ee,_0x1a02f0){this['listeners']['has'](_0x26a2ee)&&this['listeners']['get'](_0x26a2ee)['forEach'](_0xc8faff=>{try{_0xc8faff(_0x1a02f0);}catch(_0x42c01b){console['error']('[SSE\x20Client]\x20Error\x20in\x20'+_0x26a2ee+'\x20listener:',_0x42c01b);}});}['connect'](_0x55aae8='me'){this['userId']=_0x55aae8,this['useSharedWorker']?this['_connectViaWorker'](_0x55aae8):this['_connectDirect'](_0x55aae8);}['_connectViaWorker'](_0x24b0fd){try{this['_ensureWorker'](),this['port']['postMessage']({'action':'connect','userId':_0x24b0fd});}catch(_0x325d63){console['error']('[SSE\x20Client]\x20SharedWorker\x20failed,\x20falling\x20back\x20to\x20direct\x20SSE:',_0x325d63),this['useSharedWorker']=![],this['_connectDirect'](_0x24b0fd);}}['_ensureWorker'](){!this['worker']&&(this['worker']=new SharedWorker('/sse-shared-worker.js'),this['port']=this['worker']['port'],this['port']['onmessage']=this['_handleWorkerMessage'],this['port']['onmessageerror']=_0x290d99=>{console['error']('[SSE\x20Client]\x20Worker\x20message\x20error:',_0x290d99),this['_emit']('error',{'error':'Worker\x20message\x20error'});},this['port']['start']());}['_handleWorkerMessage'](_0x45afd8){const _0x12e175=_0x45afd8['data'];if(_0x12e175['type']&&_0x12e175['type']['startsWith']('task:')){this['_handleTaskStreamMessage'](_0x12e175);return;}switch(_0x12e175['type']){case'connected':this['connected']=!![],this['_emit']('connected',{});break;case'snapshot':case'activity':case'status':case'new-task':case'queue-position':try{const _0x53693d=JSON['parse'](_0x12e175['data']);this['_emit'](_0x12e175['type'],_0x53693d);}catch(_0x19ed68){console['error']('[SSE\x20Client]\x20Failed\x20to\x20parse\x20'+_0x12e175['type']+'\x20data:',_0x19ed68);}break;case'error':this['connected']=![],this['_emit']('error',_0x12e175);break;default:console['warn']('[SSE\x20Client]\x20Unknown\x20message\x20type:',_0x12e175['type']);}}['_handleTaskStreamMessage'](_0x3db940){const {taskId:_0x4c0e46,type:_0x1262b9,data:_0x4c4e63}=_0x3db940,_0xc21133=this['_taskSubscriptions']['get'](_0x4c0e46);if(!_0xc21133||_0xc21133['size']===0x0)return;const _0x55f5a6=_0x1262b9['replace']('task:',''),_0x414bb1=eventTypeToHandler(_0x55f5a6);_0xc21133['forEach'](_0xc87943=>{if(_0xc87943['handlers'][_0x414bb1])try{const _0x22a6fb=typeof _0x4c4e63==='string'?JSON['parse'](_0x4c4e63):_0x4c4e63;_0xc87943['handlers'][_0x414bb1](_0x22a6fb);}catch(_0x3e5b3d){console['error']('[SSE\x20Client]\x20Error\x20in\x20task\x20'+_0x55f5a6+'\x20handler:',_0x3e5b3d);}});}['_connectDirect'](_0x544c6c){this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null);const _0x29af92=_0x544c6c&&_0x544c6c!=='me'?'?userId='+_0x544c6c:'';try{this['eventSource']=new EventSource('/tasks/updates'+_0x29af92),this['eventSource']['addEventListener']('open',()=>{this['connected']=!![],this['reconnectAttempts']=0x0,this['_emit']('connected',{});}),this['eventSource']['addEventListener']('snapshot',_0x443d1b=>{this['_handleDirectSSE']('snapshot',_0x443d1b),this['reconnectAttempts']=0x0;}),this['eventSource']['addEventListener']('activity',_0x29f716=>{this['_handleDirectSSE']('activity',_0x29f716);}),this['eventSource']['addEventListener']('status',_0x5b9f3b=>{this['_handleDirectSSE']('status',_0x5b9f3b);}),this['eventSource']['addEventListener']('new-task',_0x5b2909=>{this['_handleDirectSSE']('new-task',_0x5b2909);}),this['eventSource']['addEventListener']('queue-position',_0x56ceb7=>{this['_handleDirectSSE']('queue-position',_0x56ceb7);}),this['eventSource']['addEventListener']('error',_0x7e963c=>{console['error']('[SSE\x20Client]\x20Direct\x20SSE\x20error:',_0x7e963c),this['connected']=![],this['_emit']('error',{'error':'Connection\x20error'}),this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null),this['_scheduleReconnect']();});}catch(_0xdf62e){console['error']('[SSE\x20Client]\x20Failed\x20to\x20create\x20EventSource:',_0xdf62e),this['_emit']('error',{'error':_0xdf62e['message']}),this['_scheduleReconnect']();}}['_handleDirectSSE'](_0x506e70,_0xce88db){try{const _0x1e828f=JSON['parse'](_0xce88db['data']);this['_emit'](_0x506e70,_0x1e828f);}catch(_0x130d91){console['error']('[SSE\x20Client]\x20Failed\x20to\x20parse\x20'+_0x506e70+'\x20data:',_0x130d91);}}['_scheduleReconnect'](){this['reconnectTimeout']&&clearTimeout(this['reconnectTimeout']);const _0x39dd64=Math['min'](0x3e8*Math['pow'](0x2,this['reconnectAttempts']),0x7530);this['reconnectAttempts']++,console['log']('[SSE\x20Client]\x20Scheduling\x20reconnect\x20in\x20'+_0x39dd64+'ms'),this['reconnectTimeout']=setTimeout(()=>{this['_connectDirect'](this['userId']);},_0x39dd64);}['changeFilter'](_0x2b7831){if(_0x2b7831===this['userId'])return;this['userId']=_0x2b7831;if(this['useSharedWorker']&&this['port'])this['port']['postMessage']({'action':'changeFilter','userId':_0x2b7831});else this['eventSource']&&this['_connectDirect'](_0x2b7831);}['subscribeTask'](_0x508e2f,_0x2172c6){return this['useSharedWorker']?this['_subscribeTaskViaWorker'](_0x508e2f,_0x2172c6):this['_subscribeTaskDirect'](_0x508e2f,_0x2172c6);}['unsubscribeTask'](_0x4249be){if(!_0x4249be)return;_0x4249be['type']==='worker'?this['_unsubscribeTaskWorker'](_0x4249be):this['_unsubscribeTaskDirect'](_0x4249be);}['_subscribeTaskViaWorker'](_0x243562,_0x232639){try{this['_ensureWorker']();}catch(_0x3daa2c){return console['error']('[SSE\x20Client]\x20SharedWorker\x20failed\x20for\x20task\x20sub,\x20falling\x20back:',_0x3daa2c),this['useSharedWorker']=![],this['_subscribeTaskDirect'](_0x243562,_0x232639);}const _0x595900=++this['_taskSubIdCounter'],_0x55b24a={'type':'worker','taskId':_0x243562,'handlers':_0x232639,'id':_0x595900};return!this['_taskSubscriptions']['has'](_0x243562)&&(this['_taskSubscriptions']['set'](_0x243562,new Set()),this['port']['postMessage']({'action':'subscribeTask','taskId':_0x243562})),this['_taskSubscriptions']['get'](_0x243562)['add'](_0x55b24a),_0x55b24a;}['_unsubscribeTaskWorker'](_0x31d4f6){const {taskId:_0x5d3d96}=_0x31d4f6,_0x3b16bb=this['_taskSubscriptions']['get'](_0x5d3d96);if(_0x3b16bb){_0x3b16bb['delete'](_0x31d4f6);if(_0x3b16bb['size']===0x0){this['_taskSubscriptions']['delete'](_0x5d3d96);try{this['port']&&this['port']['postMessage']({'action':'unsubscribeTask','taskId':_0x5d3d96});}catch(_0x1beeb8){}}}}['_subscribeTaskDirect'](_0x5628cc,_0x260674){const _0x2cf4cb=++this['_taskSubIdCounter'],_0x3ec867=new EventSource('/tasks/'+_0x5628cc+'/stream'),_0x512c84={'type':'direct','taskId':_0x5628cc,'handlers':_0x260674,'id':_0x2cf4cb,'eventSource':_0x3ec867};!this['_taskSubscriptions']['has'](_0x5628cc)&&this['_taskSubscriptions']['set'](_0x5628cc,new Set());this['_taskSubscriptions']['get'](_0x5628cc)['add'](_0x512c84);for(const _0x347854 of TASK_STREAM_EVENTS){const _0x337ce2=eventTypeToHandler(_0x347854);_0x3ec867['addEventListener'](_0x347854,_0x148fe8=>{if(_0x260674[_0x337ce2])try{const _0x12a0d8=JSON['parse'](_0x148fe8['data']);_0x260674[_0x337ce2](_0x12a0d8);}catch(_0x5935ad){console['error']('[SSE\x20Client]\x20Error\x20parsing\x20task\x20'+_0x347854+':',_0x5935ad);}});}return _0x3ec867['addEventListener']('open',()=>{if(_0x260674['onConnected'])_0x260674['onConnected']();}),_0x3ec867['addEventListener']('error',()=>{if(_0x260674['onError'])_0x260674['onError']({'error':'Connection\x20error'});}),_0x512c84;}['_unsubscribeTaskDirect'](_0x588459){_0x588459['eventSource']&&(_0x588459['eventSource']['close'](),_0x588459['eventSource']=null);const _0x4f0c6f=this['_taskSubscriptions']['get'](_0x588459['taskId']);_0x4f0c6f&&(_0x4f0c6f['delete'](_0x588459),_0x4f0c6f['size']===0x0&&this['_taskSubscriptions']['delete'](_0x588459['taskId']));}['disconnect'](){this['reconnectTimeout']&&(clearTimeout(this['reconnectTimeout']),this['reconnectTimeout']=null);this['_taskSubscriptions']['forEach']((_0x24eee8,_0x40ef0e)=>{_0x24eee8['forEach'](_0x4a98bf=>{_0x4a98bf['type']==='direct'&&_0x4a98bf['eventSource']&&_0x4a98bf['eventSource']['close']();});}),this['_taskSubscriptions']['clear']();if(this['useSharedWorker']&&this['port'])try{this['port']['postMessage']({'action':'disconnect'});}catch(_0x3b3472){}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(_0x1d8c08){eventSource&&currentUserId!==_0x1d8c08&&(eventSource['close'](),eventSource=null);if(eventSource&&eventSource['readyState']!==EventSource['CLOSED'])return;currentUserId=_0x1d8c08;const _0x25d86e=_0x1d8c08&&_0x1d8c08!=='me'?'?userId='+_0x1d8c08:'';try{eventSource=new EventSource('/tasks/updates'+_0x25d86e),eventSource['addEventListener']('snapshot',_0x4d5682=>{broadcast({'type':'snapshot','data':_0x4d5682['data']}),reconnectAttempts=0x0;}),eventSource['addEventListener']('activity',_0x16ac16=>{broadcast({'type':'activity','data':_0x16ac16['data']});}),eventSource['addEventListener']('status',_0x4ab63f=>{broadcast({'type':'status','data':_0x4ab63f['data']});}),eventSource['addEventListener']('new-task',_0x2dd2bf=>{broadcast({'type':'new-task','data':_0x2dd2bf['data']});}),eventSource['addEventListener']('queue-position',_0x12ed93=>{broadcast({'type':'queue-position','data':_0x12ed93['data']});}),eventSource['addEventListener']('open',()=>{broadcast({'type':'connected'}),reconnectAttempts=0x0;}),eventSource['addEventListener']('error',_0x3d1e6d=>{console['error']('[SSE\x20Worker]\x20Connection\x20error:',_0x3d1e6d),broadcast({'type':'error','error':'Connection\x20error'}),eventSource&&(eventSource['close'](),eventSource=null),scheduleReconnect();});}catch(_0x7ee5d2){console['error']('[SSE\x20Worker]\x20Failed\x20to\x20create\x20EventSource:',_0x7ee5d2),broadcast({'type':'error','error':_0x7ee5d2['message']}),scheduleReconnect();}}function scheduleReconnect(){reconnectTimeout&&clearTimeout(reconnectTimeout);if(ports['size']===0x0)return;const _0x1fdc6b=Math['min'](0x3e8*Math['pow'](0x2,reconnectAttempts),MAX_RECONNECT_DELAY);reconnectAttempts++,console['log']('[SSE\x20Worker]\x20Scheduling\x20reconnect\x20in\x20'+_0x1fdc6b+'ms\x20(attempt\x20'+reconnectAttempts+')'),reconnectTimeout=setTimeout(()=>{ports['size']>0x0&&connect(currentUserId);},_0x1fdc6b);}function broadcast(_0x4af9a4){const _0xb6b040=[];ports['forEach'](_0x2d4557=>{try{_0x2d4557['postMessage'](_0x4af9a4);}catch(_0x5cf51b){console['warn']('[SSE\x20Worker]\x20Failed\x20to\x20send\x20to\x20port,\x20removing:',_0x5cf51b),_0xb6b040['push'](_0x2d4557);}}),_0xb6b040['length']>0x0&&cleanUpDeadPorts(_0xb6b040),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(_0x20b502,_0x5059e3){let _0x1aeb59=taskStreams['get'](_0x5059e3);!_0x1aeb59&&(_0x1aeb59={'eventSource':null,'reconnectTimeout':null,'reconnectAttempts':0x0,'subscribedPorts':new Set()},taskStreams['set'](_0x5059e3,_0x1aeb59));_0x1aeb59['subscribedPorts']['add'](_0x20b502);if(!_0x1aeb59['eventSource']||_0x1aeb59['eventSource']['readyState']===EventSource['CLOSED'])connectTaskStream(_0x5059e3);else{if(_0x1aeb59['eventSource']['readyState']===EventSource['OPEN'])try{_0x20b502['postMessage']({'type':'task:connected','taskId':_0x5059e3});}catch(_0x4556cb){}}}function unsubscribeTask(_0x265b92,_0x1cd35a){const _0x39eb00=taskStreams['get'](_0x1cd35a);if(!_0x39eb00)return;_0x39eb00['subscribedPorts']['delete'](_0x265b92),_0x39eb00['subscribedPorts']['size']===0x0&&deferredCloseTaskStream(_0x1cd35a);}function connectTaskStream(_0x52ac6e){const _0x4b8b06=taskStreams['get'](_0x52ac6e);if(!_0x4b8b06)return;_0x4b8b06['eventSource']&&(_0x4b8b06['eventSource']['close'](),_0x4b8b06['eventSource']=null);try{_0x4b8b06['eventSource']=new EventSource('/tasks/'+_0x52ac6e+'/stream');for(const _0x3ebf76 of TASK_STREAM_EVENTS){_0x4b8b06['eventSource']['addEventListener'](_0x3ebf76,_0x39a5c4=>{broadcastToTask(_0x52ac6e,'task:'+_0x3ebf76,_0x39a5c4['data']),_0x4b8b06['reconnectAttempts']=0x0;});}_0x4b8b06['eventSource']['addEventListener']('open',()=>{broadcastToTask(_0x52ac6e,'task:connected','{}'),_0x4b8b06['reconnectAttempts']=0x0;}),_0x4b8b06['eventSource']['addEventListener']('error',()=>{broadcastToTask(_0x52ac6e,'task:error',JSON['stringify']({'error':'Connection\x20error'})),_0x4b8b06['eventSource']&&(_0x4b8b06['eventSource']['close'](),_0x4b8b06['eventSource']=null),scheduleTaskReconnect(_0x52ac6e);});}catch(_0x48572e){console['error']('[SSE\x20Worker]\x20Failed\x20to\x20create\x20task\x20EventSource\x20for\x20'+_0x52ac6e+':',_0x48572e),broadcastToTask(_0x52ac6e,'task:error',JSON['stringify']({'error':_0x48572e['message']})),scheduleTaskReconnect(_0x52ac6e);}}function broadcastToTask(_0x2c2f65,_0x4d831b,_0x21aec5){const _0x163642=taskStreams['get'](_0x2c2f65);if(!_0x163642)return;const _0x44b495=[];_0x163642['subscribedPorts']['forEach'](_0x46c420=>{try{_0x46c420['postMessage']({'type':_0x4d831b,'taskId':_0x2c2f65,'data':_0x21aec5});}catch(_0x6952bd){_0x44b495['push'](_0x46c420);}}),_0x44b495['length']>0x0&&(_0x44b495['forEach'](_0xee88b9=>_0x163642['subscribedPorts']['delete'](_0xee88b9)),cleanUpDeadPorts(_0x44b495),_0x163642['subscribedPorts']['size']===0x0&&closeTaskStream(_0x2c2f65));}function closeTaskStream(_0x53f346){const _0x369f99=taskStreams['get'](_0x53f346);if(!_0x369f99)return;_0x369f99['eventSource']&&_0x369f99['eventSource']['close'](),_0x369f99['reconnectTimeout']&&clearTimeout(_0x369f99['reconnectTimeout']),taskStreams['delete'](_0x53f346);}function deferredCloseTaskStream(_0x54bf2f){setTimeout(()=>{const _0x860b2e=taskStreams['get'](_0x54bf2f);_0x860b2e&&_0x860b2e['subscribedPorts']['size']===0x0&&closeTaskStream(_0x54bf2f);},0x0);}function scheduleTaskReconnect(_0x549a6b){const _0x54209e=taskStreams['get'](_0x549a6b);if(!_0x54209e||_0x54209e['subscribedPorts']['size']===0x0)return;_0x54209e['reconnectTimeout']&&clearTimeout(_0x54209e['reconnectTimeout']);const _0x5a4d1f=Math['min'](0x3e8*Math['pow'](0x2,_0x54209e['reconnectAttempts']),MAX_RECONNECT_DELAY);_0x54209e['reconnectAttempts']++,console['log']('[SSE\x20Worker]\x20Scheduling\x20task\x20stream\x20reconnect\x20for\x20'+_0x549a6b+'\x20in\x20'+_0x5a4d1f+'ms'),_0x54209e['reconnectTimeout']=setTimeout(()=>{_0x54209e['subscribedPorts']['size']>0x0&&connectTaskStream(_0x549a6b);},_0x5a4d1f);}function cleanUpDeadPorts(_0x5ccee9){for(const _0x49155c of _0x5ccee9){ports['delete'](_0x49155c),taskStreams['forEach']((_0x3e80de,_0x3ac78d)=>{_0x3e80de['subscribedPorts']['delete'](_0x49155c),_0x3e80de['subscribedPorts']['size']===0x0&&closeTaskStream(_0x3ac78d);});}}function removePortFromAllTasks(_0xafa810){taskStreams['forEach']((_0x1dba35,_0x488faf)=>{_0x1dba35['subscribedPorts']['has'](_0xafa810)&&(_0x1dba35['subscribedPorts']['delete'](_0xafa810),_0x1dba35['subscribedPorts']['size']===0x0&&closeTaskStream(_0x488faf));});}self['onconnect']=function(_0x247401){const _0x3b727a=_0x247401['ports'][0x0];ports['add'](_0x3b727a),console['log']('[SSE\x20Worker]\x20New\x20port\x20connected.\x20Total\x20ports:\x20'+ports['size']),_0x3b727a['onmessage']=function(_0x255f0f){const {action:_0x19f504,userId:_0x58abd3,taskId:_0x22b05e}=_0x255f0f['data'];switch(_0x19f504){case'connect':connect(_0x58abd3);eventSource&&eventSource['readyState']===EventSource['OPEN']&&_0x3b727a['postMessage']({'type':'connected'});break;case'disconnect':ports['delete'](_0x3b727a),removePortFromAllTasks(_0x3b727a),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':_0x58abd3!==currentUserId&&connect(_0x58abd3);break;case'subscribeTask':subscribeTask(_0x3b727a,_0x22b05e);break;case'unsubscribeTask':unsubscribeTask(_0x3b727a,_0x22b05e);break;default:console['warn']('[SSE\x20Worker]\x20Unknown\x20action:',_0x19f504);}},_0x3b727a['onmessageerror']=function(_0x1fd117){console['error']('[SSE\x20Worker]\x20Port\x20message\x20error:',_0x1fd117),ports['delete'](_0x3b727a),removePortFromAllTasks(_0x3b727a);},_0x3b727a['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(_0x12fdab,{fallback:fallback='Unknown'}={}){const _0x5d32bd=String(_0x12fdab||'')['trim']()['toLowerCase']();if(!_0x5d32bd)return fallback;return _0x5d32bd['charAt'](0x0)['toUpperCase']()+_0x5d32bd['slice'](0x1);}export function escapeRegExp(_0x277eea){return String(_0x277eea)['replace'](/[.*+?^${}()|[\]\\]/g,'\x5c$&');}export function compareJudgmentsForAliasOrder(_0x43b739,_0x5b9e22){const _0x3457df=String(_0x43b739?.['createdAt']||''),_0x3bffc2=String(_0x5b9e22?.['createdAt']||'');if(_0x3457df!==_0x3bffc2)return _0x3457df['localeCompare'](_0x3bffc2);return String(_0x43b739?.['taskId']||'')['localeCompare'](String(_0x5b9e22?.['taskId']||''));}export function parseJudgeAliasNumber(_0x35c64e,_0x567ecd){const _0x3ba592=typeof _0x35c64e==='string'?_0x35c64e['trim']():'',_0x4280f1=toDisplayAgentName(_0x567ecd,{'fallback':''});if(!_0x3ba592||!_0x4280f1)return null;const _0x1ecb56=_0x3ba592['toLowerCase'](),_0x1ca0fc=_0x4280f1['toLowerCase']();if(_0x1ecb56===_0x1ca0fc||_0x1ecb56===_0x1ca0fc+'\x20judge')return 0x1;const _0x114a73=[new RegExp('^'+escapeRegExp(_0x4280f1)+'\x5cs+(\x5cd+)$','i'),new RegExp('^'+escapeRegExp(_0x4280f1)+'\x5cs+Judge\x5cs+(\x5cd+)$','i')];for(const _0x567124 of _0x114a73){const _0x5747c2=_0x3ba592['match'](_0x567124);if(_0x5747c2){const _0x1a3f49=Number(_0x5747c2[0x1]);if(Number['isInteger'](_0x1a3f49)&&_0x1a3f49>0x0)return _0x1a3f49;}}return null;}export function formatJudgeDisplayName({alias:_0x40ce34,agent:_0x426f2e,number:number=null,hasDuplicates:hasDuplicates=![]}={}){const _0x3413af=toDisplayAgentName(_0x426f2e,{'fallback':'Judge'}),_0x3427c6=typeof _0x40ce34==='string'?_0x40ce34['trim']():'';if(Number['isInteger'](number)&&number>0x0)return _0x3413af+'\x20Judge\x20'+number;if(_0x3427c6)return/\bjudge\b/i['test'](_0x3427c6)?_0x3427c6:_0x3427c6+'\x20Judge';if(hasDuplicates)return _0x3413af+'\x20Judge';return _0x3413af==='Judge'?_0x3413af:_0x3413af+'\x20Judge';}export function buildJudgmentDisplayNameMap(_0xe13120=[]){const _0x1117ba=Array['isArray'](_0xe13120)?_0xe13120['filter'](Boolean):[],_0x5bbc12=new Map();_0x1117ba['forEach'](_0x156de7=>{const _0x282934=_0x156de7?.['judgeAgent']||_0x156de7?.['envVars']?.['CODER_AGENT']||'unknown',_0x586f42=String(_0x282934||'')['trim']()['toLowerCase']()||'unknown';!_0x5bbc12['has'](_0x586f42)&&_0x5bbc12['set'](_0x586f42,[]),_0x5bbc12['get'](_0x586f42)['push'](_0x156de7);});const _0x37fa53=new Map();return _0x5bbc12['forEach'](_0x13d9d6=>{const _0x3c6825=[..._0x13d9d6]['sort'](compareJudgmentsForAliasOrder),_0x50fa99=_0x3c6825['length']>0x1,_0x5435db=new Set(),_0x3f6de5=new Map();_0x50fa99&&_0x3c6825['forEach'](_0x5a7a62=>{const _0x16d2d4=parseJudgeAliasNumber(_0x5a7a62?.['judgeAlias'],_0x5a7a62?.['judgeAgent']);if(!Number['isInteger'](_0x16d2d4)||_0x16d2d4<=0x0||_0x5435db['has'](_0x16d2d4))return;_0x3f6de5['set'](_0x5a7a62['taskId'],_0x16d2d4),_0x5435db['add'](_0x16d2d4);});let _0x57290e=0x1;const _0x219b03=()=>{while(_0x5435db['has'](_0x57290e)){_0x57290e+=0x1;}return _0x5435db['add'](_0x57290e),_0x57290e;};_0x3c6825['forEach'](_0x34a05d=>{let _0x9b9b74=_0x3f6de5['get'](_0x34a05d['taskId'])||null;_0x50fa99&&_0x9b9b74===null&&!String(_0x34a05d?.['judgeAlias']||'')['trim']()&&(_0x9b9b74=_0x219b03()),_0x37fa53['set'](_0x34a05d['taskId'],formatJudgeDisplayName({'alias':_0x34a05d?.['judgeAlias']||null,'agent':_0x34a05d?.['judgeAgent']||_0x34a05d?.['envVars']?.['CODER_AGENT']||'unknown','number':_0x9b9b74,'hasDuplicates':_0x50fa99}));});}),_0x37fa53;}export function buildTaskNavigationHref(_0x349c22,{currentUrl:_0x4332c4,groupedTaskIds:groupedTaskIds=[],groupId:groupId=null}={}){const _0x54591e=new URL(_0x4332c4),_0x16ed9b=String(_0x349c22||'')['trim'](),_0x5629a5=String(groupId||'')['trim'](),_0x19e491=Array['isArray'](groupedTaskIds)?groupedTaskIds['map'](_0x45208a=>String(_0x45208a||'')['trim']())['filter'](Boolean):[],_0x3e0be3=Boolean(_0x5629a5)||_0x19e491['length']>0x1;if(!_0x3e0be3)return _0x16ed9b&&_0x54591e['searchParams']['set']('id',_0x16ed9b),_0x54591e['searchParams']['delete']('groupId'),_0x54591e['toString']();const _0x2e2537=_0x19e491['includes'](_0x16ed9b)?_0x19e491:[..._0x19e491,_0x16ed9b]['filter'](Boolean);if(_0x2e2537['length']>0x0)_0x54591e['searchParams']['set']('id',_0x2e2537['join'](','));else _0x16ed9b&&_0x54591e['searchParams']['set']('id',_0x16ed9b);return _0x5629a5?_0x54591e['searchParams']['set']('groupId',_0x5629a5):_0x54591e['searchParams']['delete']('groupId'),_0x54591e['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>