@profoundlogic/coderflow-server 0.7.9 → 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 (185) hide show
  1. package/dist/base-image/coder-git-credential-helper +16 -0
  2. package/dist/base-image/entrypoint.sh +75 -5
  3. package/dist/base-image/sync-repos.sh +30 -1
  4. package/dist/coder-server.js +1 -1
  5. package/dist/config.js +1 -1
  6. package/dist/lib/agent-keepalive.js +1 -1
  7. package/dist/lib/agent-models.js +1 -1
  8. package/dist/lib/api-keys.js +1 -1
  9. package/dist/lib/apiKeys.js +1 -1
  10. package/dist/lib/app-server-ports.js +1 -1
  11. package/dist/lib/auto-judge.js +1 -1
  12. package/dist/lib/automation-service.js +1 -1
  13. package/dist/lib/basic-auth.js +1 -1
  14. package/dist/lib/bindings.js +1 -1
  15. package/dist/lib/build-history.js +1 -1
  16. package/dist/lib/build-output-service.js +1 -1
  17. package/dist/lib/build-scheduler.js +1 -1
  18. package/dist/lib/build-service.js +1 -1
  19. package/dist/lib/ca-certificates.js +1 -1
  20. package/dist/lib/claude-oauth-refresh.js +1 -1
  21. package/dist/lib/cli/build.js +1 -1
  22. package/dist/lib/cli/cleanup-users.js +1 -1
  23. package/dist/lib/cli/config-command.js +1 -1
  24. package/dist/lib/cli/config.js +1 -1
  25. package/dist/lib/cli/create-user.js +1 -1
  26. package/dist/lib/cli/grant-admin.js +1 -1
  27. package/dist/lib/cli/init.js +1 -1
  28. package/dist/lib/cli/jira.js +1 -1
  29. package/dist/lib/cli/license.js +1 -1
  30. package/dist/lib/cli/list-roles.js +1 -1
  31. package/dist/lib/cli/list-users.js +1 -1
  32. package/dist/lib/cli/server-manager.js +1 -1
  33. package/dist/lib/cli/set-password.js +1 -1
  34. package/dist/lib/compression-filter.js +1 -1
  35. package/dist/lib/config-migration.js +1 -1
  36. package/dist/lib/container-credential-sync.js +1 -1
  37. package/dist/lib/container-tokens.js +1 -1
  38. package/dist/lib/data-dir.js +1 -1
  39. package/dist/lib/deployment-history.js +1 -1
  40. package/dist/lib/deployment-service.js +1 -1
  41. package/dist/lib/docker-utils.js +1 -1
  42. package/dist/lib/email.js +1 -1
  43. package/dist/lib/emailTemplates.js +1 -1
  44. package/dist/lib/entitlement.js +1 -1
  45. package/dist/lib/external-connections.js +1 -1
  46. package/dist/lib/fetch-utils.js +1 -1
  47. package/dist/lib/git-commit-details-route.js +1 -1
  48. package/dist/lib/git-history-diff-guardrails.js +1 -1
  49. package/dist/lib/git-provider-service.js +1 -1
  50. package/dist/lib/git-provider-setup/github-setup-handler.js +1 -1
  51. package/dist/lib/git-provider-setup/index.js +1 -1
  52. package/dist/lib/git-provider-setup/setup-factory.js +1 -1
  53. package/dist/lib/git-provider-setup/setup-interface.js +1 -1
  54. package/dist/lib/git-providers/azure-devops-provider.js +1 -1
  55. package/dist/lib/git-providers/github-app-provider.js +1 -1
  56. package/dist/lib/git-providers/index.js +1 -1
  57. package/dist/lib/git-providers/provider-factory.js +1 -1
  58. package/dist/lib/git-providers/provider-interface.js +1 -1
  59. package/dist/lib/github-urls.js +1 -1
  60. package/dist/lib/group-objective-linking.js +1 -1
  61. package/dist/lib/ibmi-sync.js +1 -1
  62. package/dist/lib/jira-client.js +1 -1
  63. package/dist/lib/judge-blinding.js +1 -1
  64. package/dist/lib/logger.js +1 -1
  65. package/dist/lib/memory-utils.js +1 -1
  66. package/dist/lib/migration-to-scoped-rbac.js +1 -1
  67. package/dist/lib/model-fetcher.js +1 -1
  68. package/dist/lib/notifications.js +1 -1
  69. package/dist/lib/objective-context.js +1 -1
  70. package/dist/lib/oidc-auth.js +1 -1
  71. package/dist/lib/oidc-device-flow.js +1 -1
  72. package/dist/lib/passwordTokens.js +1 -1
  73. package/dist/lib/permission-resolver.js +1 -1
  74. package/dist/lib/pin-cascade.js +1 -1
  75. package/dist/lib/provider-accounts.js +1 -1
  76. package/dist/lib/provider-oauth.js +1 -1
  77. package/dist/lib/provider-profile.js +1 -1
  78. package/dist/lib/provider-token-refresh.js +1 -1
  79. package/dist/lib/rbac-user-state.js +1 -1
  80. package/dist/lib/request-url.js +1 -1
  81. package/dist/lib/rewind.js +1 -1
  82. package/dist/lib/role-definitions.js +1 -1
  83. package/dist/lib/roles.js +1 -1
  84. package/dist/lib/secrets.js +1 -1
  85. package/dist/lib/setup-repo-git-auth.js +1 -1
  86. package/dist/lib/state-capture.js +1 -1
  87. package/dist/lib/static-files.js +1 -1
  88. package/dist/lib/task-aliases.js +1 -1
  89. package/dist/lib/task-container-init.js +1 -0
  90. package/dist/lib/task-context-usage.js +1 -0
  91. package/dist/lib/task-name-format.js +1 -1
  92. package/dist/lib/task-name-generator.js +1 -1
  93. package/dist/lib/task-source-metadata.js +1 -1
  94. package/dist/lib/teams.js +1 -1
  95. package/dist/lib/user-git-oauth.js +1 -1
  96. package/dist/lib/user-git-tokens.js +1 -1
  97. package/dist/lib/users.js +1 -1
  98. package/dist/middleware/requireAuth.js +1 -1
  99. package/dist/middleware/requireInit.js +1 -1
  100. package/dist/middleware/requirePermission.js +1 -1
  101. package/dist/package.json +1 -1
  102. package/dist/playwright.config.js +1 -1
  103. package/dist/playwright.task-terminal.config.js +1 -1
  104. package/dist/routes/apiKeys.js +1 -1
  105. package/dist/routes/auth-oidc.js +1 -1
  106. package/dist/routes/auth.js +1 -1
  107. package/dist/routes/automations.js +1 -1
  108. package/dist/routes/bindings.js +1 -1
  109. package/dist/routes/build.js +1 -1
  110. package/dist/routes/containers.js +1 -1
  111. package/dist/routes/deploy-task.js +1 -1
  112. package/dist/routes/environment-management.js +1 -1
  113. package/dist/routes/environments.js +1 -1
  114. package/dist/routes/external-skills.js +1 -1
  115. package/dist/routes/git-credentials.js +1 -1
  116. package/dist/routes/git-oauth.js +1 -1
  117. package/dist/routes/git-provider-setup.js +1 -1
  118. package/dist/routes/health.js +1 -1
  119. package/dist/routes/jira.js +1 -1
  120. package/dist/routes/logs.js +1 -1
  121. package/dist/routes/objective-management.js +1 -1
  122. package/dist/routes/password.js +1 -1
  123. package/dist/routes/prompt.js +1 -1
  124. package/dist/routes/provider-auth.js +1 -1
  125. package/dist/routes/qa.js +1 -1
  126. package/dist/routes/roles.js +1 -1
  127. package/dist/routes/settings.js +1 -1
  128. package/dist/routes/skill-management.js +1 -1
  129. package/dist/routes/skills.js +1 -1
  130. package/dist/routes/stats.js +1 -1
  131. package/dist/routes/tasks.js +1 -1
  132. package/dist/routes/teams.js +1 -1
  133. package/dist/routes/templates.js +1 -1
  134. package/dist/routes/test-task.js +1 -1
  135. package/dist/routes/test.js +1 -1
  136. package/dist/routes/users.js +1 -1
  137. package/dist/routes/visualizations.js +1 -1
  138. package/dist/scripts/create-user.js +1 -1
  139. package/dist/scripts/migrate-config-to-data-dir.js +1 -1
  140. package/dist/start.js +1 -1
  141. package/dist/web-ui/public/activity-detail-modal.js +1 -1
  142. package/dist/web-ui/public/activity-feed.js +1 -1
  143. package/dist/web-ui/public/activity-formatters.js +1 -1
  144. package/dist/web-ui/public/admin.css +95 -1
  145. package/dist/web-ui/public/admin.html +29 -1
  146. package/dist/web-ui/public/admin.js +1 -1
  147. package/dist/web-ui/public/agent-event-parser.js +1 -1
  148. package/dist/web-ui/public/app.js +1 -1
  149. package/dist/web-ui/public/approve-dialog.js +1 -1
  150. package/dist/web-ui/public/automation-links.js +1 -1
  151. package/dist/web-ui/public/automation-schedule.js +1 -1
  152. package/dist/web-ui/public/comments-widget.js +1 -1
  153. package/dist/web-ui/public/diff-utils.js +1 -1
  154. package/dist/web-ui/public/environments.js +1 -1
  155. package/dist/web-ui/public/feedback-widget.css +45 -0
  156. package/dist/web-ui/public/feedback-widget.js +1 -1
  157. package/dist/web-ui/public/file-selection-tree.js +1 -1
  158. package/dist/web-ui/public/git-history-lazy-utils.js +1 -1
  159. package/dist/web-ui/public/git-history.js +1 -1
  160. package/dist/web-ui/public/git-status.js +1 -1
  161. package/dist/web-ui/public/ibmi-file-filter.js +1 -1
  162. package/dist/web-ui/public/index.js +1 -1
  163. package/dist/web-ui/public/login.js +1 -1
  164. package/dist/web-ui/public/markdown-editor.js +1 -1
  165. package/dist/web-ui/public/markdown-file-editor.js +1 -1
  166. package/dist/web-ui/public/modal-maximize.js +1 -1
  167. package/dist/web-ui/public/notifications.js +1 -1
  168. package/dist/web-ui/public/permissions.js +1 -1
  169. package/dist/web-ui/public/pr-dialog.js +1 -1
  170. package/dist/web-ui/public/roles.js +1 -1
  171. package/dist/web-ui/public/settings.js +1 -1
  172. package/dist/web-ui/public/setup-password.js +1 -1
  173. package/dist/web-ui/public/skills.js +1 -1
  174. package/dist/web-ui/public/sse-client.js +1 -1
  175. package/dist/web-ui/public/sse-shared-worker.js +1 -1
  176. package/dist/web-ui/public/styles.css +81 -0
  177. package/dist/web-ui/public/task-judging-helpers.js +1 -1
  178. package/dist/web-ui/public/task.html +35 -1
  179. package/dist/web-ui/public/task.js +1 -1
  180. package/dist/web-ui/public/teams.js +1 -1
  181. package/dist/web-ui/public/terminal.js +1 -1
  182. package/dist/web-ui/public/theme.js +1 -1
  183. package/dist/web-ui/public/users.js +1 -1
  184. package/dist/web-ui/public/variant-grouping.js +1 -1
  185. package/package.json +1 -1
@@ -1 +1 @@
1
- function isSharedWorkerSupported(){return typeof SharedWorker!=='undefined';}function eventTypeToHandler(_0x27039e){if(_0x27039e==='connected')return'onConnected';if(_0x27039e==='error')return'onError';return'on'+_0x27039e['split']('-')['map'](_0x3977a0=>_0x3977a0['charAt'](0x0)['toUpperCase']()+_0x3977a0['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'](_0xd1b504,_0x50673f){return!this['listeners']['has'](_0xd1b504)&&this['listeners']['set'](_0xd1b504,new Set()),this['listeners']['get'](_0xd1b504)['add'](_0x50673f),this;}['off'](_0x4d3453,_0x48d1ee){return this['listeners']['has'](_0x4d3453)&&this['listeners']['get'](_0x4d3453)['delete'](_0x48d1ee),this;}['_emit'](_0x2c4d5c,_0x34be2){this['listeners']['has'](_0x2c4d5c)&&this['listeners']['get'](_0x2c4d5c)['forEach'](_0x377912=>{try{_0x377912(_0x34be2);}catch(_0x3c5006){console['error']('[SSE\x20Client]\x20Error\x20in\x20'+_0x2c4d5c+'\x20listener:',_0x3c5006);}});}['connect'](_0x26504d='me'){this['userId']=_0x26504d,this['useSharedWorker']?this['_connectViaWorker'](_0x26504d):this['_connectDirect'](_0x26504d);}['_connectViaWorker'](_0x50e950){try{this['_ensureWorker'](),this['port']['postMessage']({'action':'connect','userId':_0x50e950});}catch(_0x49ef0f){console['error']('[SSE\x20Client]\x20SharedWorker\x20failed,\x20falling\x20back\x20to\x20direct\x20SSE:',_0x49ef0f),this['useSharedWorker']=![],this['_connectDirect'](_0x50e950);}}['_ensureWorker'](){!this['worker']&&(this['worker']=new SharedWorker('/sse-shared-worker.js'),this['port']=this['worker']['port'],this['port']['onmessage']=this['_handleWorkerMessage'],this['port']['onmessageerror']=_0x1763ca=>{console['error']('[SSE\x20Client]\x20Worker\x20message\x20error:',_0x1763ca),this['_emit']('error',{'error':'Worker\x20message\x20error'});},this['port']['start']());}['_handleWorkerMessage'](_0x400451){const _0x41dcc8=_0x400451['data'];if(_0x41dcc8['type']&&_0x41dcc8['type']['startsWith']('task:')){this['_handleTaskStreamMessage'](_0x41dcc8);return;}switch(_0x41dcc8['type']){case'connected':this['connected']=!![],this['_emit']('connected',{});break;case'snapshot':case'activity':case'status':case'new-task':case'queue-position':try{const _0x7168ab=JSON['parse'](_0x41dcc8['data']);this['_emit'](_0x41dcc8['type'],_0x7168ab);}catch(_0x289a26){console['error']('[SSE\x20Client]\x20Failed\x20to\x20parse\x20'+_0x41dcc8['type']+'\x20data:',_0x289a26);}break;case'error':this['connected']=![],this['_emit']('error',_0x41dcc8);break;default:console['warn']('[SSE\x20Client]\x20Unknown\x20message\x20type:',_0x41dcc8['type']);}}['_handleTaskStreamMessage'](_0x3231a4){const {taskId:_0xbb252b,type:_0x24c2f8,data:_0x4f4496}=_0x3231a4,_0x2ac546=this['_taskSubscriptions']['get'](_0xbb252b);if(!_0x2ac546||_0x2ac546['size']===0x0)return;const _0x4d04bd=_0x24c2f8['replace']('task:',''),_0x43cfe2=eventTypeToHandler(_0x4d04bd);_0x2ac546['forEach'](_0x705a31=>{if(_0x705a31['handlers'][_0x43cfe2])try{const _0x101d6c=typeof _0x4f4496==='string'?JSON['parse'](_0x4f4496):_0x4f4496;_0x705a31['handlers'][_0x43cfe2](_0x101d6c);}catch(_0x14f4c3){console['error']('[SSE\x20Client]\x20Error\x20in\x20task\x20'+_0x4d04bd+'\x20handler:',_0x14f4c3);}});}['_connectDirect'](_0x4bff82){this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null);const _0x5b0fa9=_0x4bff82&&_0x4bff82!=='me'?'?userId='+_0x4bff82:'';try{this['eventSource']=new EventSource('/tasks/updates'+_0x5b0fa9),this['eventSource']['addEventListener']('open',()=>{this['connected']=!![],this['reconnectAttempts']=0x0,this['_emit']('connected',{});}),this['eventSource']['addEventListener']('snapshot',_0x17e5a1=>{this['_handleDirectSSE']('snapshot',_0x17e5a1),this['reconnectAttempts']=0x0;}),this['eventSource']['addEventListener']('activity',_0x492350=>{this['_handleDirectSSE']('activity',_0x492350);}),this['eventSource']['addEventListener']('status',_0x33777c=>{this['_handleDirectSSE']('status',_0x33777c);}),this['eventSource']['addEventListener']('new-task',_0x5e62d2=>{this['_handleDirectSSE']('new-task',_0x5e62d2);}),this['eventSource']['addEventListener']('queue-position',_0x319f13=>{this['_handleDirectSSE']('queue-position',_0x319f13);}),this['eventSource']['addEventListener']('error',_0x30cff3=>{console['error']('[SSE\x20Client]\x20Direct\x20SSE\x20error:',_0x30cff3),this['connected']=![],this['_emit']('error',{'error':'Connection\x20error'}),this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null),this['_scheduleReconnect']();});}catch(_0x3b39bb){console['error']('[SSE\x20Client]\x20Failed\x20to\x20create\x20EventSource:',_0x3b39bb),this['_emit']('error',{'error':_0x3b39bb['message']}),this['_scheduleReconnect']();}}['_handleDirectSSE'](_0x45fae0,_0x487727){try{const _0x1a3184=JSON['parse'](_0x487727['data']);this['_emit'](_0x45fae0,_0x1a3184);}catch(_0x162757){console['error']('[SSE\x20Client]\x20Failed\x20to\x20parse\x20'+_0x45fae0+'\x20data:',_0x162757);}}['_scheduleReconnect'](){this['reconnectTimeout']&&clearTimeout(this['reconnectTimeout']);const _0x1627fd=Math['min'](0x3e8*Math['pow'](0x2,this['reconnectAttempts']),0x7530);this['reconnectAttempts']++,console['log']('[SSE\x20Client]\x20Scheduling\x20reconnect\x20in\x20'+_0x1627fd+'ms'),this['reconnectTimeout']=setTimeout(()=>{this['_connectDirect'](this['userId']);},_0x1627fd);}['changeFilter'](_0x2583fc){if(_0x2583fc===this['userId'])return;this['userId']=_0x2583fc;if(this['useSharedWorker']&&this['port'])this['port']['postMessage']({'action':'changeFilter','userId':_0x2583fc});else this['eventSource']&&this['_connectDirect'](_0x2583fc);}['subscribeTask'](_0x59b939,_0x1620fd){return this['useSharedWorker']?this['_subscribeTaskViaWorker'](_0x59b939,_0x1620fd):this['_subscribeTaskDirect'](_0x59b939,_0x1620fd);}['unsubscribeTask'](_0x5d7746){if(!_0x5d7746)return;_0x5d7746['type']==='worker'?this['_unsubscribeTaskWorker'](_0x5d7746):this['_unsubscribeTaskDirect'](_0x5d7746);}['_subscribeTaskViaWorker'](_0x2fc9b2,_0x24edf5){try{this['_ensureWorker']();}catch(_0x2edde8){return console['error']('[SSE\x20Client]\x20SharedWorker\x20failed\x20for\x20task\x20sub,\x20falling\x20back:',_0x2edde8),this['useSharedWorker']=![],this['_subscribeTaskDirect'](_0x2fc9b2,_0x24edf5);}const _0x42a58e=++this['_taskSubIdCounter'],_0x22812b={'type':'worker','taskId':_0x2fc9b2,'handlers':_0x24edf5,'id':_0x42a58e};return!this['_taskSubscriptions']['has'](_0x2fc9b2)&&(this['_taskSubscriptions']['set'](_0x2fc9b2,new Set()),this['port']['postMessage']({'action':'subscribeTask','taskId':_0x2fc9b2})),this['_taskSubscriptions']['get'](_0x2fc9b2)['add'](_0x22812b),_0x22812b;}['_unsubscribeTaskWorker'](_0x389f3d){const {taskId:_0x409bbd}=_0x389f3d,_0x77ba53=this['_taskSubscriptions']['get'](_0x409bbd);if(_0x77ba53){_0x77ba53['delete'](_0x389f3d);if(_0x77ba53['size']===0x0){this['_taskSubscriptions']['delete'](_0x409bbd);try{this['port']&&this['port']['postMessage']({'action':'unsubscribeTask','taskId':_0x409bbd});}catch(_0x558027){}}}}['_subscribeTaskDirect'](_0x1d24b0,_0xb6e153){const _0x3e01e3=++this['_taskSubIdCounter'],_0xa89d8f=new EventSource('/tasks/'+_0x1d24b0+'/stream'),_0x1a6ed0={'type':'direct','taskId':_0x1d24b0,'handlers':_0xb6e153,'id':_0x3e01e3,'eventSource':_0xa89d8f};!this['_taskSubscriptions']['has'](_0x1d24b0)&&this['_taskSubscriptions']['set'](_0x1d24b0,new Set());this['_taskSubscriptions']['get'](_0x1d24b0)['add'](_0x1a6ed0);for(const _0x3a2840 of TASK_STREAM_EVENTS){const _0x4189f5=eventTypeToHandler(_0x3a2840);_0xa89d8f['addEventListener'](_0x3a2840,_0x322ff0=>{if(_0xb6e153[_0x4189f5])try{const _0x3cd868=JSON['parse'](_0x322ff0['data']);_0xb6e153[_0x4189f5](_0x3cd868);}catch(_0xdc06d6){console['error']('[SSE\x20Client]\x20Error\x20parsing\x20task\x20'+_0x3a2840+':',_0xdc06d6);}});}return _0xa89d8f['addEventListener']('open',()=>{if(_0xb6e153['onConnected'])_0xb6e153['onConnected']();}),_0xa89d8f['addEventListener']('error',()=>{if(_0xb6e153['onError'])_0xb6e153['onError']({'error':'Connection\x20error'});}),_0x1a6ed0;}['_unsubscribeTaskDirect'](_0x39bef0){_0x39bef0['eventSource']&&(_0x39bef0['eventSource']['close'](),_0x39bef0['eventSource']=null);const _0x4e3a5b=this['_taskSubscriptions']['get'](_0x39bef0['taskId']);_0x4e3a5b&&(_0x4e3a5b['delete'](_0x39bef0),_0x4e3a5b['size']===0x0&&this['_taskSubscriptions']['delete'](_0x39bef0['taskId']));}['disconnect'](){this['reconnectTimeout']&&(clearTimeout(this['reconnectTimeout']),this['reconnectTimeout']=null);this['_taskSubscriptions']['forEach']((_0x58be48,_0x445eb3)=>{_0x58be48['forEach'](_0x2cbea3=>{_0x2cbea3['type']==='direct'&&_0x2cbea3['eventSource']&&_0x2cbea3['eventSource']['close']();});}),this['_taskSubscriptions']['clear']();if(this['useSharedWorker']&&this['port'])try{this['port']['postMessage']({'action':'disconnect'});}catch(_0x8e4ec6){}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(_0x28b747){eventSource&&currentUserId!==_0x28b747&&(eventSource['close'](),eventSource=null);if(eventSource&&eventSource['readyState']!==EventSource['CLOSED'])return;currentUserId=_0x28b747;const _0x5180f7=_0x28b747&&_0x28b747!=='me'?'?userId='+_0x28b747:'';try{eventSource=new EventSource('/tasks/updates'+_0x5180f7),eventSource['addEventListener']('snapshot',_0x23dc19=>{broadcast({'type':'snapshot','data':_0x23dc19['data']}),reconnectAttempts=0x0;}),eventSource['addEventListener']('activity',_0x331d2f=>{broadcast({'type':'activity','data':_0x331d2f['data']});}),eventSource['addEventListener']('status',_0x1ef853=>{broadcast({'type':'status','data':_0x1ef853['data']});}),eventSource['addEventListener']('new-task',_0x312949=>{broadcast({'type':'new-task','data':_0x312949['data']});}),eventSource['addEventListener']('queue-position',_0x739f3b=>{broadcast({'type':'queue-position','data':_0x739f3b['data']});}),eventSource['addEventListener']('open',()=>{broadcast({'type':'connected'}),reconnectAttempts=0x0;}),eventSource['addEventListener']('error',_0x13ea4f=>{console['error']('[SSE\x20Worker]\x20Connection\x20error:',_0x13ea4f),broadcast({'type':'error','error':'Connection\x20error'}),eventSource&&(eventSource['close'](),eventSource=null),scheduleReconnect();});}catch(_0x32e3dd){console['error']('[SSE\x20Worker]\x20Failed\x20to\x20create\x20EventSource:',_0x32e3dd),broadcast({'type':'error','error':_0x32e3dd['message']}),scheduleReconnect();}}function scheduleReconnect(){reconnectTimeout&&clearTimeout(reconnectTimeout);if(ports['size']===0x0)return;const _0x4ae876=Math['min'](0x3e8*Math['pow'](0x2,reconnectAttempts),MAX_RECONNECT_DELAY);reconnectAttempts++,console['log']('[SSE\x20Worker]\x20Scheduling\x20reconnect\x20in\x20'+_0x4ae876+'ms\x20(attempt\x20'+reconnectAttempts+')'),reconnectTimeout=setTimeout(()=>{ports['size']>0x0&&connect(currentUserId);},_0x4ae876);}function broadcast(_0x1875f4){const _0x5d645f=[];ports['forEach'](_0x2b8b79=>{try{_0x2b8b79['postMessage'](_0x1875f4);}catch(_0x5c02a2){console['warn']('[SSE\x20Worker]\x20Failed\x20to\x20send\x20to\x20port,\x20removing:',_0x5c02a2),_0x5d645f['push'](_0x2b8b79);}}),_0x5d645f['length']>0x0&&cleanUpDeadPorts(_0x5d645f),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(_0x48ddd0,_0xa5f594){let _0x1a03fd=taskStreams['get'](_0xa5f594);!_0x1a03fd&&(_0x1a03fd={'eventSource':null,'reconnectTimeout':null,'reconnectAttempts':0x0,'subscribedPorts':new Set()},taskStreams['set'](_0xa5f594,_0x1a03fd));_0x1a03fd['subscribedPorts']['add'](_0x48ddd0);if(!_0x1a03fd['eventSource']||_0x1a03fd['eventSource']['readyState']===EventSource['CLOSED'])connectTaskStream(_0xa5f594);else{if(_0x1a03fd['eventSource']['readyState']===EventSource['OPEN'])try{_0x48ddd0['postMessage']({'type':'task:connected','taskId':_0xa5f594});}catch(_0x53fe5e){}}}function unsubscribeTask(_0x4efcec,_0xe5b57f){const _0x5166d4=taskStreams['get'](_0xe5b57f);if(!_0x5166d4)return;_0x5166d4['subscribedPorts']['delete'](_0x4efcec),_0x5166d4['subscribedPorts']['size']===0x0&&deferredCloseTaskStream(_0xe5b57f);}function connectTaskStream(_0xdf8493){const _0x445da2=taskStreams['get'](_0xdf8493);if(!_0x445da2)return;_0x445da2['eventSource']&&(_0x445da2['eventSource']['close'](),_0x445da2['eventSource']=null);try{_0x445da2['eventSource']=new EventSource('/tasks/'+_0xdf8493+'/stream');for(const _0x390cb5 of TASK_STREAM_EVENTS){_0x445da2['eventSource']['addEventListener'](_0x390cb5,_0x3c6eff=>{broadcastToTask(_0xdf8493,'task:'+_0x390cb5,_0x3c6eff['data']),_0x445da2['reconnectAttempts']=0x0;});}_0x445da2['eventSource']['addEventListener']('open',()=>{broadcastToTask(_0xdf8493,'task:connected','{}'),_0x445da2['reconnectAttempts']=0x0;}),_0x445da2['eventSource']['addEventListener']('error',()=>{broadcastToTask(_0xdf8493,'task:error',JSON['stringify']({'error':'Connection\x20error'})),_0x445da2['eventSource']&&(_0x445da2['eventSource']['close'](),_0x445da2['eventSource']=null),scheduleTaskReconnect(_0xdf8493);});}catch(_0x2825ec){console['error']('[SSE\x20Worker]\x20Failed\x20to\x20create\x20task\x20EventSource\x20for\x20'+_0xdf8493+':',_0x2825ec),broadcastToTask(_0xdf8493,'task:error',JSON['stringify']({'error':_0x2825ec['message']})),scheduleTaskReconnect(_0xdf8493);}}function broadcastToTask(_0x42122f,_0x4287ea,_0x46cf98){const _0x11d22a=taskStreams['get'](_0x42122f);if(!_0x11d22a)return;const _0x47a69b=[];_0x11d22a['subscribedPorts']['forEach'](_0x1bd58e=>{try{_0x1bd58e['postMessage']({'type':_0x4287ea,'taskId':_0x42122f,'data':_0x46cf98});}catch(_0x1ef77c){_0x47a69b['push'](_0x1bd58e);}}),_0x47a69b['length']>0x0&&(_0x47a69b['forEach'](_0x2833b1=>_0x11d22a['subscribedPorts']['delete'](_0x2833b1)),cleanUpDeadPorts(_0x47a69b),_0x11d22a['subscribedPorts']['size']===0x0&&closeTaskStream(_0x42122f));}function closeTaskStream(_0x105da2){const _0x55c62c=taskStreams['get'](_0x105da2);if(!_0x55c62c)return;_0x55c62c['eventSource']&&_0x55c62c['eventSource']['close'](),_0x55c62c['reconnectTimeout']&&clearTimeout(_0x55c62c['reconnectTimeout']),taskStreams['delete'](_0x105da2);}function deferredCloseTaskStream(_0x269c13){setTimeout(()=>{const _0xb9d302=taskStreams['get'](_0x269c13);_0xb9d302&&_0xb9d302['subscribedPorts']['size']===0x0&&closeTaskStream(_0x269c13);},0x0);}function scheduleTaskReconnect(_0x493742){const _0x55cb8d=taskStreams['get'](_0x493742);if(!_0x55cb8d||_0x55cb8d['subscribedPorts']['size']===0x0)return;_0x55cb8d['reconnectTimeout']&&clearTimeout(_0x55cb8d['reconnectTimeout']);const _0x33a1ce=Math['min'](0x3e8*Math['pow'](0x2,_0x55cb8d['reconnectAttempts']),MAX_RECONNECT_DELAY);_0x55cb8d['reconnectAttempts']++,console['log']('[SSE\x20Worker]\x20Scheduling\x20task\x20stream\x20reconnect\x20for\x20'+_0x493742+'\x20in\x20'+_0x33a1ce+'ms'),_0x55cb8d['reconnectTimeout']=setTimeout(()=>{_0x55cb8d['subscribedPorts']['size']>0x0&&connectTaskStream(_0x493742);},_0x33a1ce);}function cleanUpDeadPorts(_0x441f02){for(const _0xb8adb6 of _0x441f02){ports['delete'](_0xb8adb6),taskStreams['forEach']((_0x17a4e5,_0x5ce015)=>{_0x17a4e5['subscribedPorts']['delete'](_0xb8adb6),_0x17a4e5['subscribedPorts']['size']===0x0&&closeTaskStream(_0x5ce015);});}}function removePortFromAllTasks(_0x13b4b6){taskStreams['forEach']((_0x1179c9,_0x14e533)=>{_0x1179c9['subscribedPorts']['has'](_0x13b4b6)&&(_0x1179c9['subscribedPorts']['delete'](_0x13b4b6),_0x1179c9['subscribedPorts']['size']===0x0&&closeTaskStream(_0x14e533));});}self['onconnect']=function(_0x553439){const _0x1ea04b=_0x553439['ports'][0x0];ports['add'](_0x1ea04b),console['log']('[SSE\x20Worker]\x20New\x20port\x20connected.\x20Total\x20ports:\x20'+ports['size']),_0x1ea04b['onmessage']=function(_0x2c1416){const {action:_0x30b88f,userId:_0x13932a,taskId:_0x554371}=_0x2c1416['data'];switch(_0x30b88f){case'connect':connect(_0x13932a);eventSource&&eventSource['readyState']===EventSource['OPEN']&&_0x1ea04b['postMessage']({'type':'connected'});break;case'disconnect':ports['delete'](_0x1ea04b),removePortFromAllTasks(_0x1ea04b),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':_0x13932a!==currentUserId&&connect(_0x13932a);break;case'subscribeTask':subscribeTask(_0x1ea04b,_0x554371);break;case'unsubscribeTask':unsubscribeTask(_0x1ea04b,_0x554371);break;default:console['warn']('[SSE\x20Worker]\x20Unknown\x20action:',_0x30b88f);}},_0x1ea04b['onmessageerror']=function(_0x3eb9b9){console['error']('[SSE\x20Worker]\x20Port\x20message\x20error:',_0x3eb9b9),ports['delete'](_0x1ea04b),removePortFromAllTasks(_0x1ea04b);},_0x1ea04b['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']();};
@@ -6880,6 +6880,42 @@ select option[value=""] {
6880
6880
  font-size: 15px;
6881
6881
  }
6882
6882
 
6883
+ .context-usage-meta {
6884
+ display: flex;
6885
+ align-items: center;
6886
+ gap: 10px;
6887
+ min-height: 20px;
6888
+ }
6889
+
6890
+ .context-usage-bar {
6891
+ width: 128px;
6892
+ height: 8px;
6893
+ flex: 0 0 auto;
6894
+ overflow: hidden;
6895
+ border-radius: 999px;
6896
+ background: rgba(148, 163, 184, 0.24);
6897
+ }
6898
+
6899
+ .context-usage-fill {
6900
+ width: 0;
6901
+ height: 100%;
6902
+ border-radius: inherit;
6903
+ background: var(--color-accent);
6904
+ transition: width 0.2s ease, background-color 0.2s ease;
6905
+ }
6906
+
6907
+ .context-usage-fill.context-usage-ok {
6908
+ background: var(--color-success);
6909
+ }
6910
+
6911
+ .context-usage-fill.context-usage-warning {
6912
+ background: var(--color-warning);
6913
+ }
6914
+
6915
+ .context-usage-fill.context-usage-danger {
6916
+ background: var(--color-danger);
6917
+ }
6918
+
6883
6919
  .log-window {
6884
6920
  border: 1px solid var(--color-border);
6885
6921
  border-radius: var(--radius-small);
@@ -7449,6 +7485,51 @@ body.terminal-embedded .terminal-container .xterm {
7449
7485
  background: linear-gradient(135deg, #25a268 0%, #1e8a55 100%);
7450
7486
  }
7451
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
+
7452
7533
  /* Wider modal for activity details to accommodate code and tool outputs */
7453
7534
  #activity-detail-modal .modal-content,
7454
7535
  #widget-activity-detail-modal .modal-content {
@@ -1 +1 @@
1
- export function toDisplayAgentName(_0x5486b2,{fallback:fallback='Unknown'}={}){const _0x4df974=String(_0x5486b2||'')['trim']()['toLowerCase']();if(!_0x4df974)return fallback;return _0x4df974['charAt'](0x0)['toUpperCase']()+_0x4df974['slice'](0x1);}export function escapeRegExp(_0x1f1484){return String(_0x1f1484)['replace'](/[.*+?^${}()|[\]\\]/g,'\x5c$&');}export function compareJudgmentsForAliasOrder(_0xfb5091,_0x5a9b69){const _0x482872=String(_0xfb5091?.['createdAt']||''),_0x415017=String(_0x5a9b69?.['createdAt']||'');if(_0x482872!==_0x415017)return _0x482872['localeCompare'](_0x415017);return String(_0xfb5091?.['taskId']||'')['localeCompare'](String(_0x5a9b69?.['taskId']||''));}export function parseJudgeAliasNumber(_0x3bbd9c,_0x4bbb7b){const _0x2029cf=typeof _0x3bbd9c==='string'?_0x3bbd9c['trim']():'',_0x4932e6=toDisplayAgentName(_0x4bbb7b,{'fallback':''});if(!_0x2029cf||!_0x4932e6)return null;const _0x19863e=_0x2029cf['toLowerCase'](),_0x4acb48=_0x4932e6['toLowerCase']();if(_0x19863e===_0x4acb48||_0x19863e===_0x4acb48+'\x20judge')return 0x1;const _0x5a78ee=[new RegExp('^'+escapeRegExp(_0x4932e6)+'\x5cs+(\x5cd+)$','i'),new RegExp('^'+escapeRegExp(_0x4932e6)+'\x5cs+Judge\x5cs+(\x5cd+)$','i')];for(const _0x4cde2a of _0x5a78ee){const _0x5eaced=_0x2029cf['match'](_0x4cde2a);if(_0x5eaced){const _0x393674=Number(_0x5eaced[0x1]);if(Number['isInteger'](_0x393674)&&_0x393674>0x0)return _0x393674;}}return null;}export function formatJudgeDisplayName({alias:_0xe2af9e,agent:_0x345f2b,number:number=null,hasDuplicates:hasDuplicates=![]}={}){const _0x434dba=toDisplayAgentName(_0x345f2b,{'fallback':'Judge'}),_0x5cc3f4=typeof _0xe2af9e==='string'?_0xe2af9e['trim']():'';if(Number['isInteger'](number)&&number>0x0)return _0x434dba+'\x20Judge\x20'+number;if(_0x5cc3f4)return/\bjudge\b/i['test'](_0x5cc3f4)?_0x5cc3f4:_0x5cc3f4+'\x20Judge';if(hasDuplicates)return _0x434dba+'\x20Judge';return _0x434dba==='Judge'?_0x434dba:_0x434dba+'\x20Judge';}export function buildJudgmentDisplayNameMap(_0x563eb6=[]){const _0x1157f4=Array['isArray'](_0x563eb6)?_0x563eb6['filter'](Boolean):[],_0x222727=new Map();_0x1157f4['forEach'](_0x3834a3=>{const _0x4e0152=_0x3834a3?.['judgeAgent']||_0x3834a3?.['envVars']?.['CODER_AGENT']||'unknown',_0x309685=String(_0x4e0152||'')['trim']()['toLowerCase']()||'unknown';!_0x222727['has'](_0x309685)&&_0x222727['set'](_0x309685,[]),_0x222727['get'](_0x309685)['push'](_0x3834a3);});const _0x13572e=new Map();return _0x222727['forEach'](_0x522d51=>{const _0x2b8fc6=[..._0x522d51]['sort'](compareJudgmentsForAliasOrder),_0xa0e290=_0x2b8fc6['length']>0x1,_0x31f1cb=new Set(),_0x31d366=new Map();_0xa0e290&&_0x2b8fc6['forEach'](_0x5f24d7=>{const _0x4952ba=parseJudgeAliasNumber(_0x5f24d7?.['judgeAlias'],_0x5f24d7?.['judgeAgent']);if(!Number['isInteger'](_0x4952ba)||_0x4952ba<=0x0||_0x31f1cb['has'](_0x4952ba))return;_0x31d366['set'](_0x5f24d7['taskId'],_0x4952ba),_0x31f1cb['add'](_0x4952ba);});let _0x14bae7=0x1;const _0x1be4a5=()=>{while(_0x31f1cb['has'](_0x14bae7)){_0x14bae7+=0x1;}return _0x31f1cb['add'](_0x14bae7),_0x14bae7;};_0x2b8fc6['forEach'](_0xa4cb2a=>{let _0x41eef1=_0x31d366['get'](_0xa4cb2a['taskId'])||null;_0xa0e290&&_0x41eef1===null&&!String(_0xa4cb2a?.['judgeAlias']||'')['trim']()&&(_0x41eef1=_0x1be4a5()),_0x13572e['set'](_0xa4cb2a['taskId'],formatJudgeDisplayName({'alias':_0xa4cb2a?.['judgeAlias']||null,'agent':_0xa4cb2a?.['judgeAgent']||_0xa4cb2a?.['envVars']?.['CODER_AGENT']||'unknown','number':_0x41eef1,'hasDuplicates':_0xa0e290}));});}),_0x13572e;}export function buildTaskNavigationHref(_0x5775fd,{currentUrl:_0x5702ef,groupedTaskIds:groupedTaskIds=[],groupId:groupId=null}={}){const _0x49ea35=new URL(_0x5702ef),_0x447e28=String(_0x5775fd||'')['trim'](),_0x2f6ee7=String(groupId||'')['trim'](),_0x5773a1=Array['isArray'](groupedTaskIds)?groupedTaskIds['map'](_0x5cee3e=>String(_0x5cee3e||'')['trim']())['filter'](Boolean):[],_0x28a877=Boolean(_0x2f6ee7)||_0x5773a1['length']>0x1;if(!_0x28a877)return _0x447e28&&_0x49ea35['searchParams']['set']('id',_0x447e28),_0x49ea35['searchParams']['delete']('groupId'),_0x49ea35['toString']();const _0x51632d=_0x5773a1['includes'](_0x447e28)?_0x5773a1:[..._0x5773a1,_0x447e28]['filter'](Boolean);if(_0x51632d['length']>0x0)_0x49ea35['searchParams']['set']('id',_0x51632d['join'](','));else _0x447e28&&_0x49ea35['searchParams']['set']('id',_0x447e28);return _0x2f6ee7?_0x49ea35['searchParams']['set']('groupId',_0x2f6ee7):_0x49ea35['searchParams']['delete']('groupId'),_0x49ea35['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 {
@@ -695,6 +695,17 @@
695
695
  <dt>Duration</dt>
696
696
  <dd id="meta-duration">—</dd>
697
697
  </div>
698
+ <div id="meta-context-usage-wrapper" hidden>
699
+ <dt>Context %</dt>
700
+ <dd>
701
+ <div class="context-usage-meta">
702
+ <div class="context-usage-bar" aria-hidden="true">
703
+ <div class="context-usage-fill" id="context-usage-fill"></div>
704
+ </div>
705
+ <span id="context-usage-text">—</span>
706
+ </div>
707
+ </dd>
708
+ </div>
698
709
  <div>
699
710
  <dt>Exit code</dt>
700
711
  <dd id="meta-exit">—</dd>
@@ -1251,6 +1262,29 @@
1251
1262
  </div>
1252
1263
  </div>
1253
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
+
1254
1288
  <!-- Stop Container Modal -->
1255
1289
  <div id="stop-modal" class="modal" hidden>
1256
1290
  <div class="modal-overlay"></div>