@profoundlogic/coderflow-server 0.7.8 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/dist/base-image/entrypoint.sh +75 -5
  2. package/dist/coder-server.js +1 -1
  3. package/dist/config.js +1 -1
  4. package/dist/lib/agent-keepalive.js +1 -1
  5. package/dist/lib/agent-models.js +1 -1
  6. package/dist/lib/api-keys.js +1 -1
  7. package/dist/lib/apiKeys.js +1 -1
  8. package/dist/lib/app-server-ports.js +1 -1
  9. package/dist/lib/auto-judge.js +1 -1
  10. package/dist/lib/automation-service.js +1 -1
  11. package/dist/lib/basic-auth.js +1 -1
  12. package/dist/lib/bindings.js +1 -1
  13. package/dist/lib/build-history.js +1 -1
  14. package/dist/lib/build-output-service.js +1 -1
  15. package/dist/lib/build-scheduler.js +1 -1
  16. package/dist/lib/build-service.js +1 -1
  17. package/dist/lib/ca-certificates.js +1 -1
  18. package/dist/lib/claude-oauth-refresh.js +1 -1
  19. package/dist/lib/cli/build.js +1 -1
  20. package/dist/lib/cli/cleanup-users.js +1 -1
  21. package/dist/lib/cli/config-command.js +1 -1
  22. package/dist/lib/cli/config.js +1 -1
  23. package/dist/lib/cli/create-user.js +1 -1
  24. package/dist/lib/cli/grant-admin.js +1 -1
  25. package/dist/lib/cli/init.js +1 -1
  26. package/dist/lib/cli/jira.js +1 -1
  27. package/dist/lib/cli/license.js +1 -1
  28. package/dist/lib/cli/list-roles.js +1 -1
  29. package/dist/lib/cli/list-users.js +1 -1
  30. package/dist/lib/cli/server-manager.js +1 -1
  31. package/dist/lib/cli/set-password.js +1 -1
  32. package/dist/lib/compression-filter.js +1 -1
  33. package/dist/lib/config-migration.js +1 -1
  34. package/dist/lib/container-credential-sync.js +1 -1
  35. package/dist/lib/container-tokens.js +1 -1
  36. package/dist/lib/data-dir.js +1 -1
  37. package/dist/lib/deployment-history.js +1 -1
  38. package/dist/lib/deployment-service.js +1 -1
  39. package/dist/lib/docker-utils.js +1 -1
  40. package/dist/lib/email.js +1 -1
  41. package/dist/lib/emailTemplates.js +1 -1
  42. package/dist/lib/entitlement.js +1 -1
  43. package/dist/lib/external-connections.js +1 -1
  44. package/dist/lib/fetch-utils.js +1 -1
  45. package/dist/lib/git-commit-details-route.js +1 -1
  46. package/dist/lib/git-history-diff-guardrails.js +1 -1
  47. package/dist/lib/git-provider-service.js +1 -1
  48. package/dist/lib/git-provider-setup/github-setup-handler.js +1 -1
  49. package/dist/lib/git-provider-setup/index.js +1 -1
  50. package/dist/lib/git-provider-setup/setup-factory.js +1 -1
  51. package/dist/lib/git-provider-setup/setup-interface.js +1 -1
  52. package/dist/lib/git-providers/azure-devops-provider.js +1 -1
  53. package/dist/lib/git-providers/github-app-provider.js +1 -1
  54. package/dist/lib/git-providers/index.js +1 -1
  55. package/dist/lib/git-providers/provider-factory.js +1 -1
  56. package/dist/lib/git-providers/provider-interface.js +1 -1
  57. package/dist/lib/github-urls.js +1 -1
  58. package/dist/lib/group-objective-linking.js +1 -1
  59. package/dist/lib/ibmi-sync.js +1 -1
  60. package/dist/lib/jira-client.js +1 -1
  61. package/dist/lib/judge-blinding.js +1 -1
  62. package/dist/lib/logger.js +1 -1
  63. package/dist/lib/memory-utils.js +1 -1
  64. package/dist/lib/migration-to-scoped-rbac.js +1 -1
  65. package/dist/lib/model-fetcher.js +1 -1
  66. package/dist/lib/notifications.js +1 -1
  67. package/dist/lib/objective-context.js +1 -1
  68. package/dist/lib/oidc-auth.js +1 -1
  69. package/dist/lib/oidc-device-flow.js +1 -1
  70. package/dist/lib/passwordTokens.js +1 -1
  71. package/dist/lib/permission-resolver.js +1 -1
  72. package/dist/lib/pin-cascade.js +1 -1
  73. package/dist/lib/provider-accounts.js +1 -1
  74. package/dist/lib/provider-oauth.js +1 -1
  75. package/dist/lib/provider-profile.js +1 -1
  76. package/dist/lib/provider-token-refresh.js +1 -1
  77. package/dist/lib/rbac-user-state.js +1 -1
  78. package/dist/lib/request-url.js +1 -1
  79. package/dist/lib/rewind.js +1 -1
  80. package/dist/lib/role-definitions.js +1 -1
  81. package/dist/lib/roles.js +1 -1
  82. package/dist/lib/secrets.js +1 -1
  83. package/dist/lib/setup-repo-git-auth.js +1 -1
  84. package/dist/lib/state-capture.js +1 -1
  85. package/dist/lib/static-files.js +1 -1
  86. package/dist/lib/task-aliases.js +1 -1
  87. package/dist/lib/task-container-init.js +1 -0
  88. package/dist/lib/task-context-usage.js +1 -0
  89. package/dist/lib/task-name-format.js +1 -1
  90. package/dist/lib/task-name-generator.js +1 -1
  91. package/dist/lib/task-source-metadata.js +1 -1
  92. package/dist/lib/teams.js +1 -1
  93. package/dist/lib/user-git-oauth.js +1 -1
  94. package/dist/lib/user-git-tokens.js +1 -1
  95. package/dist/lib/users.js +1 -1
  96. package/dist/middleware/requireAuth.js +1 -1
  97. package/dist/middleware/requireInit.js +1 -1
  98. package/dist/middleware/requirePermission.js +1 -1
  99. package/dist/package.json +1 -1
  100. package/dist/playwright.config.js +1 -1
  101. package/dist/playwright.task-terminal.config.js +1 -1
  102. package/dist/routes/apiKeys.js +1 -1
  103. package/dist/routes/auth-oidc.js +1 -1
  104. package/dist/routes/auth.js +1 -1
  105. package/dist/routes/automations.js +1 -1
  106. package/dist/routes/bindings.js +1 -1
  107. package/dist/routes/build.js +1 -1
  108. package/dist/routes/containers.js +1 -1
  109. package/dist/routes/deploy-task.js +1 -1
  110. package/dist/routes/environment-management.js +1 -1
  111. package/dist/routes/environments.js +1 -1
  112. package/dist/routes/external-skills.js +1 -1
  113. package/dist/routes/git-credentials.js +1 -1
  114. package/dist/routes/git-oauth.js +1 -1
  115. package/dist/routes/git-provider-setup.js +1 -1
  116. package/dist/routes/health.js +1 -1
  117. package/dist/routes/jira.js +1 -1
  118. package/dist/routes/logs.js +1 -1
  119. package/dist/routes/objective-management.js +1 -1
  120. package/dist/routes/password.js +1 -1
  121. package/dist/routes/prompt.js +1 -1
  122. package/dist/routes/provider-auth.js +1 -1
  123. package/dist/routes/qa.js +1 -1
  124. package/dist/routes/roles.js +1 -1
  125. package/dist/routes/settings.js +1 -1
  126. package/dist/routes/skill-management.js +1 -1
  127. package/dist/routes/skills.js +1 -1
  128. package/dist/routes/stats.js +1 -1
  129. package/dist/routes/tasks.js +1 -1
  130. package/dist/routes/teams.js +1 -1
  131. package/dist/routes/templates.js +1 -1
  132. package/dist/routes/test-task.js +1 -1
  133. package/dist/routes/test.js +1 -1
  134. package/dist/routes/users.js +1 -1
  135. package/dist/routes/visualizations.js +1 -1
  136. package/dist/scripts/create-user.js +1 -1
  137. package/dist/scripts/migrate-config-to-data-dir.js +1 -1
  138. package/dist/start.js +1 -1
  139. package/dist/web-ui/public/activity-detail-modal.js +1 -1
  140. package/dist/web-ui/public/activity-feed.js +1 -1
  141. package/dist/web-ui/public/activity-formatters.js +1 -1
  142. package/dist/web-ui/public/admin.css +108 -1
  143. package/dist/web-ui/public/admin.html +35 -23
  144. package/dist/web-ui/public/admin.js +1 -1
  145. package/dist/web-ui/public/agent-event-parser.js +1 -1
  146. package/dist/web-ui/public/app.js +1 -1
  147. package/dist/web-ui/public/approve-dialog.js +1 -1
  148. package/dist/web-ui/public/automation-links.js +1 -1
  149. package/dist/web-ui/public/automation-schedule.js +1 -1
  150. package/dist/web-ui/public/comments-widget.js +1 -1
  151. package/dist/web-ui/public/diff-utils.js +1 -1
  152. package/dist/web-ui/public/environments.html +1 -1
  153. package/dist/web-ui/public/environments.js +1 -1
  154. package/dist/web-ui/public/feedback-widget.js +1 -1
  155. package/dist/web-ui/public/file-selection-tree.js +1 -1
  156. package/dist/web-ui/public/git-history-lazy-utils.js +1 -1
  157. package/dist/web-ui/public/git-history.js +1 -1
  158. package/dist/web-ui/public/git-status.js +1 -1
  159. package/dist/web-ui/public/ibmi-file-filter.js +1 -1
  160. package/dist/web-ui/public/index.js +1 -1
  161. package/dist/web-ui/public/login.js +1 -1
  162. package/dist/web-ui/public/markdown-editor.js +1 -1
  163. package/dist/web-ui/public/markdown-file-editor.js +1 -1
  164. package/dist/web-ui/public/modal-maximize.js +1 -1
  165. package/dist/web-ui/public/notifications.js +1 -1
  166. package/dist/web-ui/public/permissions.js +1 -1
  167. package/dist/web-ui/public/pr-dialog.js +1 -1
  168. package/dist/web-ui/public/roles.js +1 -1
  169. package/dist/web-ui/public/settings.js +1 -1
  170. package/dist/web-ui/public/setup-password.js +1 -1
  171. package/dist/web-ui/public/skills.js +1 -1
  172. package/dist/web-ui/public/sse-client.js +1 -1
  173. package/dist/web-ui/public/sse-shared-worker.js +1 -1
  174. package/dist/web-ui/public/styles.css +45 -1
  175. package/dist/web-ui/public/task-judging-helpers.js +1 -1
  176. package/dist/web-ui/public/task.html +11 -0
  177. package/dist/web-ui/public/task.js +1 -1
  178. package/dist/web-ui/public/teams.js +1 -1
  179. package/dist/web-ui/public/terminal.js +1 -1
  180. package/dist/web-ui/public/theme.js +1 -1
  181. package/dist/web-ui/public/users.js +1 -1
  182. package/dist/web-ui/public/variant-grouping.js +1 -1
  183. package/package.json +1 -1
@@ -1 +1 @@
1
- function isSharedWorkerSupported(){return typeof SharedWorker!=='undefined';}function eventTypeToHandler(_0x26f321){if(_0x26f321==='connected')return'onConnected';if(_0x26f321==='error')return'onError';return'on'+_0x26f321['split']('-')['map'](_0x228c57=>_0x228c57['charAt'](0x0)['toUpperCase']()+_0x228c57['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'](_0x1312d0,_0x2f63d3){return!this['listeners']['has'](_0x1312d0)&&this['listeners']['set'](_0x1312d0,new Set()),this['listeners']['get'](_0x1312d0)['add'](_0x2f63d3),this;}['off'](_0x367623,_0x1c87fb){return this['listeners']['has'](_0x367623)&&this['listeners']['get'](_0x367623)['delete'](_0x1c87fb),this;}['_emit'](_0x61fd54,_0x3e9765){this['listeners']['has'](_0x61fd54)&&this['listeners']['get'](_0x61fd54)['forEach'](_0x4e6415=>{try{_0x4e6415(_0x3e9765);}catch(_0x2e17d6){console['error']('[SSE\x20Client]\x20Error\x20in\x20'+_0x61fd54+'\x20listener:',_0x2e17d6);}});}['connect'](_0x295bf1='me'){this['userId']=_0x295bf1,this['useSharedWorker']?this['_connectViaWorker'](_0x295bf1):this['_connectDirect'](_0x295bf1);}['_connectViaWorker'](_0x555952){try{this['_ensureWorker'](),this['port']['postMessage']({'action':'connect','userId':_0x555952});}catch(_0x4c69e9){console['error']('[SSE\x20Client]\x20SharedWorker\x20failed,\x20falling\x20back\x20to\x20direct\x20SSE:',_0x4c69e9),this['useSharedWorker']=![],this['_connectDirect'](_0x555952);}}['_ensureWorker'](){!this['worker']&&(this['worker']=new SharedWorker('/sse-shared-worker.js'),this['port']=this['worker']['port'],this['port']['onmessage']=this['_handleWorkerMessage'],this['port']['onmessageerror']=_0x19cbdc=>{console['error']('[SSE\x20Client]\x20Worker\x20message\x20error:',_0x19cbdc),this['_emit']('error',{'error':'Worker\x20message\x20error'});},this['port']['start']());}['_handleWorkerMessage'](_0x101d3a){const _0x57ee0a=_0x101d3a['data'];if(_0x57ee0a['type']&&_0x57ee0a['type']['startsWith']('task:')){this['_handleTaskStreamMessage'](_0x57ee0a);return;}switch(_0x57ee0a['type']){case'connected':this['connected']=!![],this['_emit']('connected',{});break;case'snapshot':case'activity':case'status':case'new-task':case'queue-position':try{const _0x3b1824=JSON['parse'](_0x57ee0a['data']);this['_emit'](_0x57ee0a['type'],_0x3b1824);}catch(_0xd24da8){console['error']('[SSE\x20Client]\x20Failed\x20to\x20parse\x20'+_0x57ee0a['type']+'\x20data:',_0xd24da8);}break;case'error':this['connected']=![],this['_emit']('error',_0x57ee0a);break;default:console['warn']('[SSE\x20Client]\x20Unknown\x20message\x20type:',_0x57ee0a['type']);}}['_handleTaskStreamMessage'](_0x4d2fe9){const {taskId:_0x22d04a,type:_0x4087ad,data:_0x189b69}=_0x4d2fe9,_0x291707=this['_taskSubscriptions']['get'](_0x22d04a);if(!_0x291707||_0x291707['size']===0x0)return;const _0x4a6f0f=_0x4087ad['replace']('task:',''),_0x24043c=eventTypeToHandler(_0x4a6f0f);_0x291707['forEach'](_0x532d63=>{if(_0x532d63['handlers'][_0x24043c])try{const _0x4d8bac=typeof _0x189b69==='string'?JSON['parse'](_0x189b69):_0x189b69;_0x532d63['handlers'][_0x24043c](_0x4d8bac);}catch(_0x29d405){console['error']('[SSE\x20Client]\x20Error\x20in\x20task\x20'+_0x4a6f0f+'\x20handler:',_0x29d405);}});}['_connectDirect'](_0x130789){this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null);const _0x1a9c8d=_0x130789&&_0x130789!=='me'?'?userId='+_0x130789:'';try{this['eventSource']=new EventSource('/tasks/updates'+_0x1a9c8d),this['eventSource']['addEventListener']('open',()=>{this['connected']=!![],this['reconnectAttempts']=0x0,this['_emit']('connected',{});}),this['eventSource']['addEventListener']('snapshot',_0x375ced=>{this['_handleDirectSSE']('snapshot',_0x375ced),this['reconnectAttempts']=0x0;}),this['eventSource']['addEventListener']('activity',_0x585d40=>{this['_handleDirectSSE']('activity',_0x585d40);}),this['eventSource']['addEventListener']('status',_0x45048e=>{this['_handleDirectSSE']('status',_0x45048e);}),this['eventSource']['addEventListener']('new-task',_0x18d92f=>{this['_handleDirectSSE']('new-task',_0x18d92f);}),this['eventSource']['addEventListener']('queue-position',_0x493143=>{this['_handleDirectSSE']('queue-position',_0x493143);}),this['eventSource']['addEventListener']('error',_0x382e25=>{console['error']('[SSE\x20Client]\x20Direct\x20SSE\x20error:',_0x382e25),this['connected']=![],this['_emit']('error',{'error':'Connection\x20error'}),this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null),this['_scheduleReconnect']();});}catch(_0x1b2f51){console['error']('[SSE\x20Client]\x20Failed\x20to\x20create\x20EventSource:',_0x1b2f51),this['_emit']('error',{'error':_0x1b2f51['message']}),this['_scheduleReconnect']();}}['_handleDirectSSE'](_0x17b499,_0x3b358e){try{const _0x586f53=JSON['parse'](_0x3b358e['data']);this['_emit'](_0x17b499,_0x586f53);}catch(_0x1ec19d){console['error']('[SSE\x20Client]\x20Failed\x20to\x20parse\x20'+_0x17b499+'\x20data:',_0x1ec19d);}}['_scheduleReconnect'](){this['reconnectTimeout']&&clearTimeout(this['reconnectTimeout']);const _0x39e450=Math['min'](0x3e8*Math['pow'](0x2,this['reconnectAttempts']),0x7530);this['reconnectAttempts']++,console['log']('[SSE\x20Client]\x20Scheduling\x20reconnect\x20in\x20'+_0x39e450+'ms'),this['reconnectTimeout']=setTimeout(()=>{this['_connectDirect'](this['userId']);},_0x39e450);}['changeFilter'](_0x5f289f){if(_0x5f289f===this['userId'])return;this['userId']=_0x5f289f;if(this['useSharedWorker']&&this['port'])this['port']['postMessage']({'action':'changeFilter','userId':_0x5f289f});else this['eventSource']&&this['_connectDirect'](_0x5f289f);}['subscribeTask'](_0x4bbb1f,_0x4ce524){return this['useSharedWorker']?this['_subscribeTaskViaWorker'](_0x4bbb1f,_0x4ce524):this['_subscribeTaskDirect'](_0x4bbb1f,_0x4ce524);}['unsubscribeTask'](_0x5515b1){if(!_0x5515b1)return;_0x5515b1['type']==='worker'?this['_unsubscribeTaskWorker'](_0x5515b1):this['_unsubscribeTaskDirect'](_0x5515b1);}['_subscribeTaskViaWorker'](_0x411b0e,_0x1c7089){try{this['_ensureWorker']();}catch(_0x49b203){return console['error']('[SSE\x20Client]\x20SharedWorker\x20failed\x20for\x20task\x20sub,\x20falling\x20back:',_0x49b203),this['useSharedWorker']=![],this['_subscribeTaskDirect'](_0x411b0e,_0x1c7089);}const _0x3225e2=++this['_taskSubIdCounter'],_0xbaeee6={'type':'worker','taskId':_0x411b0e,'handlers':_0x1c7089,'id':_0x3225e2};return!this['_taskSubscriptions']['has'](_0x411b0e)&&(this['_taskSubscriptions']['set'](_0x411b0e,new Set()),this['port']['postMessage']({'action':'subscribeTask','taskId':_0x411b0e})),this['_taskSubscriptions']['get'](_0x411b0e)['add'](_0xbaeee6),_0xbaeee6;}['_unsubscribeTaskWorker'](_0x3fdc54){const {taskId:_0x375f94}=_0x3fdc54,_0x2379e8=this['_taskSubscriptions']['get'](_0x375f94);if(_0x2379e8){_0x2379e8['delete'](_0x3fdc54);if(_0x2379e8['size']===0x0){this['_taskSubscriptions']['delete'](_0x375f94);try{this['port']&&this['port']['postMessage']({'action':'unsubscribeTask','taskId':_0x375f94});}catch(_0x5f319f){}}}}['_subscribeTaskDirect'](_0x51c420,_0x5ab31e){const _0xe2e71=++this['_taskSubIdCounter'],_0x34b4cc=new EventSource('/tasks/'+_0x51c420+'/stream'),_0x4c1f5c={'type':'direct','taskId':_0x51c420,'handlers':_0x5ab31e,'id':_0xe2e71,'eventSource':_0x34b4cc};!this['_taskSubscriptions']['has'](_0x51c420)&&this['_taskSubscriptions']['set'](_0x51c420,new Set());this['_taskSubscriptions']['get'](_0x51c420)['add'](_0x4c1f5c);for(const _0x5069aa of TASK_STREAM_EVENTS){const _0x40d770=eventTypeToHandler(_0x5069aa);_0x34b4cc['addEventListener'](_0x5069aa,_0x230d06=>{if(_0x5ab31e[_0x40d770])try{const _0x5a9b4f=JSON['parse'](_0x230d06['data']);_0x5ab31e[_0x40d770](_0x5a9b4f);}catch(_0x3d6a3a){console['error']('[SSE\x20Client]\x20Error\x20parsing\x20task\x20'+_0x5069aa+':',_0x3d6a3a);}});}return _0x34b4cc['addEventListener']('open',()=>{if(_0x5ab31e['onConnected'])_0x5ab31e['onConnected']();}),_0x34b4cc['addEventListener']('error',()=>{if(_0x5ab31e['onError'])_0x5ab31e['onError']({'error':'Connection\x20error'});}),_0x4c1f5c;}['_unsubscribeTaskDirect'](_0x14d2ff){_0x14d2ff['eventSource']&&(_0x14d2ff['eventSource']['close'](),_0x14d2ff['eventSource']=null);const _0x49b92a=this['_taskSubscriptions']['get'](_0x14d2ff['taskId']);_0x49b92a&&(_0x49b92a['delete'](_0x14d2ff),_0x49b92a['size']===0x0&&this['_taskSubscriptions']['delete'](_0x14d2ff['taskId']));}['disconnect'](){this['reconnectTimeout']&&(clearTimeout(this['reconnectTimeout']),this['reconnectTimeout']=null);this['_taskSubscriptions']['forEach']((_0x2cdf36,_0x1d478f)=>{_0x2cdf36['forEach'](_0x3f2a59=>{_0x3f2a59['type']==='direct'&&_0x3f2a59['eventSource']&&_0x3f2a59['eventSource']['close']();});}),this['_taskSubscriptions']['clear']();if(this['useSharedWorker']&&this['port'])try{this['port']['postMessage']({'action':'disconnect'});}catch(_0x482d30){}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(_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 +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(_0x2b299f){eventSource&&currentUserId!==_0x2b299f&&(eventSource['close'](),eventSource=null);if(eventSource&&eventSource['readyState']!==EventSource['CLOSED'])return;currentUserId=_0x2b299f;const _0x58c1da=_0x2b299f&&_0x2b299f!=='me'?'?userId='+_0x2b299f:'';try{eventSource=new EventSource('/tasks/updates'+_0x58c1da),eventSource['addEventListener']('snapshot',_0x4b8d35=>{broadcast({'type':'snapshot','data':_0x4b8d35['data']}),reconnectAttempts=0x0;}),eventSource['addEventListener']('activity',_0xe05584=>{broadcast({'type':'activity','data':_0xe05584['data']});}),eventSource['addEventListener']('status',_0x2d26d1=>{broadcast({'type':'status','data':_0x2d26d1['data']});}),eventSource['addEventListener']('new-task',_0x3d2444=>{broadcast({'type':'new-task','data':_0x3d2444['data']});}),eventSource['addEventListener']('queue-position',_0x17eb60=>{broadcast({'type':'queue-position','data':_0x17eb60['data']});}),eventSource['addEventListener']('open',()=>{broadcast({'type':'connected'}),reconnectAttempts=0x0;}),eventSource['addEventListener']('error',_0x2b6311=>{console['error']('[SSE\x20Worker]\x20Connection\x20error:',_0x2b6311),broadcast({'type':'error','error':'Connection\x20error'}),eventSource&&(eventSource['close'](),eventSource=null),scheduleReconnect();});}catch(_0x56c1f8){console['error']('[SSE\x20Worker]\x20Failed\x20to\x20create\x20EventSource:',_0x56c1f8),broadcast({'type':'error','error':_0x56c1f8['message']}),scheduleReconnect();}}function scheduleReconnect(){reconnectTimeout&&clearTimeout(reconnectTimeout);if(ports['size']===0x0)return;const _0x1e161c=Math['min'](0x3e8*Math['pow'](0x2,reconnectAttempts),MAX_RECONNECT_DELAY);reconnectAttempts++,console['log']('[SSE\x20Worker]\x20Scheduling\x20reconnect\x20in\x20'+_0x1e161c+'ms\x20(attempt\x20'+reconnectAttempts+')'),reconnectTimeout=setTimeout(()=>{ports['size']>0x0&&connect(currentUserId);},_0x1e161c);}function broadcast(_0x58b2e7){const _0x370fb0=[];ports['forEach'](_0x263a22=>{try{_0x263a22['postMessage'](_0x58b2e7);}catch(_0x112b18){console['warn']('[SSE\x20Worker]\x20Failed\x20to\x20send\x20to\x20port,\x20removing:',_0x112b18),_0x370fb0['push'](_0x263a22);}}),_0x370fb0['length']>0x0&&cleanUpDeadPorts(_0x370fb0),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(_0x5b95d2,_0x176d31){let _0x494083=taskStreams['get'](_0x176d31);!_0x494083&&(_0x494083={'eventSource':null,'reconnectTimeout':null,'reconnectAttempts':0x0,'subscribedPorts':new Set()},taskStreams['set'](_0x176d31,_0x494083));_0x494083['subscribedPorts']['add'](_0x5b95d2);if(!_0x494083['eventSource']||_0x494083['eventSource']['readyState']===EventSource['CLOSED'])connectTaskStream(_0x176d31);else{if(_0x494083['eventSource']['readyState']===EventSource['OPEN'])try{_0x5b95d2['postMessage']({'type':'task:connected','taskId':_0x176d31});}catch(_0x2fd7ad){}}}function unsubscribeTask(_0x15987e,_0x808a35){const _0x578ab3=taskStreams['get'](_0x808a35);if(!_0x578ab3)return;_0x578ab3['subscribedPorts']['delete'](_0x15987e),_0x578ab3['subscribedPorts']['size']===0x0&&deferredCloseTaskStream(_0x808a35);}function connectTaskStream(_0x21f606){const _0xa0d9b1=taskStreams['get'](_0x21f606);if(!_0xa0d9b1)return;_0xa0d9b1['eventSource']&&(_0xa0d9b1['eventSource']['close'](),_0xa0d9b1['eventSource']=null);try{_0xa0d9b1['eventSource']=new EventSource('/tasks/'+_0x21f606+'/stream');for(const _0x222d49 of TASK_STREAM_EVENTS){_0xa0d9b1['eventSource']['addEventListener'](_0x222d49,_0x55216e=>{broadcastToTask(_0x21f606,'task:'+_0x222d49,_0x55216e['data']),_0xa0d9b1['reconnectAttempts']=0x0;});}_0xa0d9b1['eventSource']['addEventListener']('open',()=>{broadcastToTask(_0x21f606,'task:connected','{}'),_0xa0d9b1['reconnectAttempts']=0x0;}),_0xa0d9b1['eventSource']['addEventListener']('error',()=>{broadcastToTask(_0x21f606,'task:error',JSON['stringify']({'error':'Connection\x20error'})),_0xa0d9b1['eventSource']&&(_0xa0d9b1['eventSource']['close'](),_0xa0d9b1['eventSource']=null),scheduleTaskReconnect(_0x21f606);});}catch(_0x1a78cf){console['error']('[SSE\x20Worker]\x20Failed\x20to\x20create\x20task\x20EventSource\x20for\x20'+_0x21f606+':',_0x1a78cf),broadcastToTask(_0x21f606,'task:error',JSON['stringify']({'error':_0x1a78cf['message']})),scheduleTaskReconnect(_0x21f606);}}function broadcastToTask(_0x4c78bb,_0x41d872,_0x43df00){const _0x5e6b4c=taskStreams['get'](_0x4c78bb);if(!_0x5e6b4c)return;const _0x2f25fe=[];_0x5e6b4c['subscribedPorts']['forEach'](_0x3afbf3=>{try{_0x3afbf3['postMessage']({'type':_0x41d872,'taskId':_0x4c78bb,'data':_0x43df00});}catch(_0x159048){_0x2f25fe['push'](_0x3afbf3);}}),_0x2f25fe['length']>0x0&&(_0x2f25fe['forEach'](_0x5358f7=>_0x5e6b4c['subscribedPorts']['delete'](_0x5358f7)),cleanUpDeadPorts(_0x2f25fe),_0x5e6b4c['subscribedPorts']['size']===0x0&&closeTaskStream(_0x4c78bb));}function closeTaskStream(_0x552aad){const _0x346448=taskStreams['get'](_0x552aad);if(!_0x346448)return;_0x346448['eventSource']&&_0x346448['eventSource']['close'](),_0x346448['reconnectTimeout']&&clearTimeout(_0x346448['reconnectTimeout']),taskStreams['delete'](_0x552aad);}function deferredCloseTaskStream(_0x2f1c54){setTimeout(()=>{const _0x53b411=taskStreams['get'](_0x2f1c54);_0x53b411&&_0x53b411['subscribedPorts']['size']===0x0&&closeTaskStream(_0x2f1c54);},0x0);}function scheduleTaskReconnect(_0x2f488d){const _0x3ffc5c=taskStreams['get'](_0x2f488d);if(!_0x3ffc5c||_0x3ffc5c['subscribedPorts']['size']===0x0)return;_0x3ffc5c['reconnectTimeout']&&clearTimeout(_0x3ffc5c['reconnectTimeout']);const _0x1630ed=Math['min'](0x3e8*Math['pow'](0x2,_0x3ffc5c['reconnectAttempts']),MAX_RECONNECT_DELAY);_0x3ffc5c['reconnectAttempts']++,console['log']('[SSE\x20Worker]\x20Scheduling\x20task\x20stream\x20reconnect\x20for\x20'+_0x2f488d+'\x20in\x20'+_0x1630ed+'ms'),_0x3ffc5c['reconnectTimeout']=setTimeout(()=>{_0x3ffc5c['subscribedPorts']['size']>0x0&&connectTaskStream(_0x2f488d);},_0x1630ed);}function cleanUpDeadPorts(_0x42f05b){for(const _0xe0685a of _0x42f05b){ports['delete'](_0xe0685a),taskStreams['forEach']((_0x529912,_0x2e6bc3)=>{_0x529912['subscribedPorts']['delete'](_0xe0685a),_0x529912['subscribedPorts']['size']===0x0&&closeTaskStream(_0x2e6bc3);});}}function removePortFromAllTasks(_0x105d29){taskStreams['forEach']((_0x4ad3bc,_0x55afba)=>{_0x4ad3bc['subscribedPorts']['has'](_0x105d29)&&(_0x4ad3bc['subscribedPorts']['delete'](_0x105d29),_0x4ad3bc['subscribedPorts']['size']===0x0&&closeTaskStream(_0x55afba));});}self['onconnect']=function(_0x2b42f1){const _0x5b0234=_0x2b42f1['ports'][0x0];ports['add'](_0x5b0234),console['log']('[SSE\x20Worker]\x20New\x20port\x20connected.\x20Total\x20ports:\x20'+ports['size']),_0x5b0234['onmessage']=function(_0x5475d3){const {action:_0x38380c,userId:_0x54c74a,taskId:_0x58bedb}=_0x5475d3['data'];switch(_0x38380c){case'connect':connect(_0x54c74a);eventSource&&eventSource['readyState']===EventSource['OPEN']&&_0x5b0234['postMessage']({'type':'connected'});break;case'disconnect':ports['delete'](_0x5b0234),removePortFromAllTasks(_0x5b0234),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':_0x54c74a!==currentUserId&&connect(_0x54c74a);break;case'subscribeTask':subscribeTask(_0x5b0234,_0x58bedb);break;case'unsubscribeTask':unsubscribeTask(_0x5b0234,_0x58bedb);break;default:console['warn']('[SSE\x20Worker]\x20Unknown\x20action:',_0x38380c);}},_0x5b0234['onmessageerror']=function(_0x37737d){console['error']('[SSE\x20Worker]\x20Port\x20message\x20error:',_0x37737d),ports['delete'](_0x5b0234),removePortFromAllTasks(_0x5b0234);},_0x5b0234['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(_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']();};
@@ -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);
@@ -7779,7 +7815,8 @@ body.terminal-embedded .terminal-container .xterm {
7779
7815
  color: var(--color-text-muted);
7780
7816
  }
7781
7817
 
7782
- .modal-section label.checkbox-label {
7818
+ .modal-section label.checkbox-label,
7819
+ .modal-body label.checkbox-label {
7783
7820
  display: flex;
7784
7821
  align-items: center;
7785
7822
  gap: 8px;
@@ -13930,6 +13967,13 @@ input.toggle-switch:focus {
13930
13967
  z-index: 10001;
13931
13968
  }
13932
13969
 
13970
+ /* Allow deployment parameter dropdowns to escape modal boundaries */
13971
+ #deploy-param-modal .custom-select-dropdown,
13972
+ #run-deployment-modal .custom-select-dropdown {
13973
+ position: fixed;
13974
+ z-index: 10001;
13975
+ }
13976
+
13933
13977
  /* Task Tab Actions (Winner/Loser) */
13934
13978
  .task-tab-actions-primary {
13935
13979
  position: absolute;
@@ -1 +1 @@
1
- export function toDisplayAgentName(_0x2e7669,{fallback:fallback='Unknown'}={}){const _0x5637a6=String(_0x2e7669||'')['trim']()['toLowerCase']();if(!_0x5637a6)return fallback;return _0x5637a6['charAt'](0x0)['toUpperCase']()+_0x5637a6['slice'](0x1);}export function escapeRegExp(_0x45782f){return String(_0x45782f)['replace'](/[.*+?^${}()|[\]\\]/g,'\x5c$&');}export function compareJudgmentsForAliasOrder(_0x4a7c84,_0x147c85){const _0x96797d=String(_0x4a7c84?.['createdAt']||''),_0x4f92ce=String(_0x147c85?.['createdAt']||'');if(_0x96797d!==_0x4f92ce)return _0x96797d['localeCompare'](_0x4f92ce);return String(_0x4a7c84?.['taskId']||'')['localeCompare'](String(_0x147c85?.['taskId']||''));}export function parseJudgeAliasNumber(_0x3a90eb,_0x46109f){const _0x54ce1a=typeof _0x3a90eb==='string'?_0x3a90eb['trim']():'',_0x24e740=toDisplayAgentName(_0x46109f,{'fallback':''});if(!_0x54ce1a||!_0x24e740)return null;const _0x2e27de=_0x54ce1a['toLowerCase'](),_0x3338d5=_0x24e740['toLowerCase']();if(_0x2e27de===_0x3338d5||_0x2e27de===_0x3338d5+'\x20judge')return 0x1;const _0x2a3f0b=[new RegExp('^'+escapeRegExp(_0x24e740)+'\x5cs+(\x5cd+)$','i'),new RegExp('^'+escapeRegExp(_0x24e740)+'\x5cs+Judge\x5cs+(\x5cd+)$','i')];for(const _0x48910e of _0x2a3f0b){const _0x7d5fc9=_0x54ce1a['match'](_0x48910e);if(_0x7d5fc9){const _0xcbdb22=Number(_0x7d5fc9[0x1]);if(Number['isInteger'](_0xcbdb22)&&_0xcbdb22>0x0)return _0xcbdb22;}}return null;}export function formatJudgeDisplayName({alias:_0x295224,agent:_0x1a0b94,number:number=null,hasDuplicates:hasDuplicates=![]}={}){const _0x13a7b5=toDisplayAgentName(_0x1a0b94,{'fallback':'Judge'}),_0x35e8db=typeof _0x295224==='string'?_0x295224['trim']():'';if(Number['isInteger'](number)&&number>0x0)return _0x13a7b5+'\x20Judge\x20'+number;if(_0x35e8db)return/\bjudge\b/i['test'](_0x35e8db)?_0x35e8db:_0x35e8db+'\x20Judge';if(hasDuplicates)return _0x13a7b5+'\x20Judge';return _0x13a7b5==='Judge'?_0x13a7b5:_0x13a7b5+'\x20Judge';}export function buildJudgmentDisplayNameMap(_0x117ccb=[]){const _0x2b76f3=Array['isArray'](_0x117ccb)?_0x117ccb['filter'](Boolean):[],_0x5e5bd2=new Map();_0x2b76f3['forEach'](_0x5012a6=>{const _0x342d25=_0x5012a6?.['judgeAgent']||_0x5012a6?.['envVars']?.['CODER_AGENT']||'unknown',_0x43f3f2=String(_0x342d25||'')['trim']()['toLowerCase']()||'unknown';!_0x5e5bd2['has'](_0x43f3f2)&&_0x5e5bd2['set'](_0x43f3f2,[]),_0x5e5bd2['get'](_0x43f3f2)['push'](_0x5012a6);});const _0x1a233b=new Map();return _0x5e5bd2['forEach'](_0x49a63d=>{const _0x1f0685=[..._0x49a63d]['sort'](compareJudgmentsForAliasOrder),_0xa61af7=_0x1f0685['length']>0x1,_0x1ab70a=new Set(),_0x111402=new Map();_0xa61af7&&_0x1f0685['forEach'](_0x259177=>{const _0x4db95a=parseJudgeAliasNumber(_0x259177?.['judgeAlias'],_0x259177?.['judgeAgent']);if(!Number['isInteger'](_0x4db95a)||_0x4db95a<=0x0||_0x1ab70a['has'](_0x4db95a))return;_0x111402['set'](_0x259177['taskId'],_0x4db95a),_0x1ab70a['add'](_0x4db95a);});let _0x538653=0x1;const _0xb133a2=()=>{while(_0x1ab70a['has'](_0x538653)){_0x538653+=0x1;}return _0x1ab70a['add'](_0x538653),_0x538653;};_0x1f0685['forEach'](_0x2da9d7=>{let _0x2ade5e=_0x111402['get'](_0x2da9d7['taskId'])||null;_0xa61af7&&_0x2ade5e===null&&!String(_0x2da9d7?.['judgeAlias']||'')['trim']()&&(_0x2ade5e=_0xb133a2()),_0x1a233b['set'](_0x2da9d7['taskId'],formatJudgeDisplayName({'alias':_0x2da9d7?.['judgeAlias']||null,'agent':_0x2da9d7?.['judgeAgent']||_0x2da9d7?.['envVars']?.['CODER_AGENT']||'unknown','number':_0x2ade5e,'hasDuplicates':_0xa61af7}));});}),_0x1a233b;}export function buildTaskNavigationHref(_0x3c219d,{currentUrl:_0x39e880,groupedTaskIds:groupedTaskIds=[],groupId:groupId=null}={}){const _0x1ed5dc=new URL(_0x39e880),_0x5e376e=String(_0x3c219d||'')['trim'](),_0x2141e6=String(groupId||'')['trim'](),_0x415b6b=Array['isArray'](groupedTaskIds)?groupedTaskIds['map'](_0x22075e=>String(_0x22075e||'')['trim']())['filter'](Boolean):[],_0x300c3a=Boolean(_0x2141e6)||_0x415b6b['length']>0x1;if(!_0x300c3a)return _0x5e376e&&_0x1ed5dc['searchParams']['set']('id',_0x5e376e),_0x1ed5dc['searchParams']['delete']('groupId'),_0x1ed5dc['toString']();const _0x2533df=_0x415b6b['includes'](_0x5e376e)?_0x415b6b:[..._0x415b6b,_0x5e376e]['filter'](Boolean);if(_0x2533df['length']>0x0)_0x1ed5dc['searchParams']['set']('id',_0x2533df['join'](','));else _0x5e376e&&_0x1ed5dc['searchParams']['set']('id',_0x5e376e);return _0x2141e6?_0x1ed5dc['searchParams']['set']('groupId',_0x2141e6):_0x1ed5dc['searchParams']['delete']('groupId'),_0x1ed5dc['toString']();}
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']();}
@@ -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 Usage</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>