@profoundlogic/coderflow-server 0.6.2 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/dist/base-image/Dockerfile +4 -2
  2. package/dist/base-image/agent-wrapper.sh +32 -4
  3. package/dist/base-image/entrypoint.sh +3 -0
  4. package/dist/coder-server.js +1 -1
  5. package/dist/config/cli-models.json +12 -0
  6. package/dist/config.js +1 -1
  7. package/dist/lib/agent-keepalive.js +1 -1
  8. package/dist/lib/agent-models.js +1 -1
  9. package/dist/lib/api-keys.js +1 -1
  10. package/dist/lib/apiKeys.js +1 -1
  11. package/dist/lib/app-server-ports.js +1 -1
  12. package/dist/lib/auto-judge.js +1 -1
  13. package/dist/lib/automation-service.js +1 -1
  14. package/dist/lib/basic-auth.js +1 -1
  15. package/dist/lib/bindings.js +1 -1
  16. package/dist/lib/build-history.js +1 -1
  17. package/dist/lib/build-output-service.js +1 -1
  18. package/dist/lib/build-scheduler.js +1 -1
  19. package/dist/lib/build-service.js +1 -1
  20. package/dist/lib/ca-certificates.js +1 -1
  21. package/dist/lib/claude-oauth-refresh.js +1 -1
  22. package/dist/lib/cli/build.js +1 -1
  23. package/dist/lib/cli/cleanup-users.js +1 -1
  24. package/dist/lib/cli/config-command.js +1 -1
  25. package/dist/lib/cli/config.js +1 -1
  26. package/dist/lib/cli/create-user.js +1 -1
  27. package/dist/lib/cli/grant-admin.js +1 -1
  28. package/dist/lib/cli/init.js +1 -1
  29. package/dist/lib/cli/jira.js +1 -1
  30. package/dist/lib/cli/license.js +1 -1
  31. package/dist/lib/cli/list-roles.js +1 -1
  32. package/dist/lib/cli/list-users.js +1 -1
  33. package/dist/lib/cli/server-manager.js +1 -1
  34. package/dist/lib/cli/set-password.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/migration-to-scoped-rbac.js +1 -1
  66. package/dist/lib/model-fetcher.js +1 -1
  67. package/dist/lib/notifications.js +1 -1
  68. package/dist/lib/objective-context.js +1 -1
  69. package/dist/lib/oidc-auth.js +1 -1
  70. package/dist/lib/oidc-device-flow.js +1 -1
  71. package/dist/lib/passwordTokens.js +1 -1
  72. package/dist/lib/permission-resolver.js +1 -1
  73. package/dist/lib/pin-cascade.js +1 -1
  74. package/dist/lib/provider-accounts.js +1 -1
  75. package/dist/lib/provider-oauth.js +1 -1
  76. package/dist/lib/provider-profile.js +1 -1
  77. package/dist/lib/provider-token-refresh.js +1 -1
  78. package/dist/lib/rbac-user-state.js +1 -1
  79. package/dist/lib/request-url.js +1 -1
  80. package/dist/lib/rewind.js +1 -1
  81. package/dist/lib/role-definitions.js +1 -1
  82. package/dist/lib/roles.js +1 -1
  83. package/dist/lib/secrets.js +1 -1
  84. package/dist/lib/setup-repo-git-auth.js +1 -1
  85. package/dist/lib/state-capture.js +1 -1
  86. package/dist/lib/static-files.js +1 -1
  87. package/dist/lib/task-name-format.js +1 -1
  88. package/dist/lib/task-name-generator.js +1 -1
  89. package/dist/lib/task-source-metadata.js +1 -1
  90. package/dist/lib/teams.js +1 -1
  91. package/dist/lib/user-git-oauth.js +1 -1
  92. package/dist/lib/user-git-tokens.js +1 -1
  93. package/dist/lib/users.js +1 -1
  94. package/dist/middleware/requireAuth.js +1 -1
  95. package/dist/middleware/requireInit.js +1 -1
  96. package/dist/middleware/requirePermission.js +1 -1
  97. package/dist/package.json +1 -1
  98. package/dist/playwright.config.js +1 -1
  99. package/dist/playwright.task-terminal.config.js +1 -1
  100. package/dist/routes/apiKeys.js +1 -1
  101. package/dist/routes/auth-oidc.js +1 -1
  102. package/dist/routes/auth.js +1 -1
  103. package/dist/routes/automations.js +1 -1
  104. package/dist/routes/bindings.js +1 -1
  105. package/dist/routes/build.js +1 -1
  106. package/dist/routes/containers.js +1 -1
  107. package/dist/routes/deploy-task.js +1 -1
  108. package/dist/routes/environment-management.js +1 -1
  109. package/dist/routes/environments.js +1 -1
  110. package/dist/routes/external-skills.js +1 -1
  111. package/dist/routes/git-credentials.js +1 -1
  112. package/dist/routes/git-oauth.js +1 -1
  113. package/dist/routes/git-provider-setup.js +1 -1
  114. package/dist/routes/health.js +1 -1
  115. package/dist/routes/jira.js +1 -1
  116. package/dist/routes/objective-management.js +1 -1
  117. package/dist/routes/password.js +1 -1
  118. package/dist/routes/prompt.js +1 -1
  119. package/dist/routes/provider-auth.js +1 -1
  120. package/dist/routes/qa.js +1 -1
  121. package/dist/routes/roles.js +1 -1
  122. package/dist/routes/settings.js +1 -1
  123. package/dist/routes/skill-management.js +1 -1
  124. package/dist/routes/skills.js +1 -1
  125. package/dist/routes/tasks.js +1 -1
  126. package/dist/routes/teams.js +1 -1
  127. package/dist/routes/templates.js +1 -1
  128. package/dist/routes/test-task.js +1 -1
  129. package/dist/routes/test.js +1 -1
  130. package/dist/routes/users.js +1 -1
  131. package/dist/routes/visualizations.js +1 -1
  132. package/dist/scripts/create-user.js +1 -1
  133. package/dist/scripts/migrate-config-to-data-dir.js +1 -1
  134. package/dist/start.js +1 -1
  135. package/dist/web-ui/public/activity-detail-modal.js +1 -1
  136. package/dist/web-ui/public/activity-feed.js +1 -1
  137. package/dist/web-ui/public/activity-formatters.js +1 -1
  138. package/dist/web-ui/public/agent-event-parser.js +1 -1
  139. package/dist/web-ui/public/app.js +1 -1
  140. package/dist/web-ui/public/approve-dialog.js +1 -1
  141. package/dist/web-ui/public/automation-links.js +1 -1
  142. package/dist/web-ui/public/automation-schedule.js +1 -1
  143. package/dist/web-ui/public/comments-widget.js +1 -1
  144. package/dist/web-ui/public/diff-utils.js +1 -1
  145. package/dist/web-ui/public/environments.js +1 -1
  146. package/dist/web-ui/public/feedback-widget.js +1 -1
  147. package/dist/web-ui/public/file-selection-tree.js +1 -1
  148. package/dist/web-ui/public/git-history-lazy-utils.js +1 -1
  149. package/dist/web-ui/public/git-history.js +1 -1
  150. package/dist/web-ui/public/git-status.js +1 -1
  151. package/dist/web-ui/public/ibmi-file-filter.js +1 -1
  152. package/dist/web-ui/public/index.html +39 -0
  153. package/dist/web-ui/public/index.js +1 -1
  154. package/dist/web-ui/public/login.js +1 -1
  155. package/dist/web-ui/public/markdown-editor.js +1 -1
  156. package/dist/web-ui/public/markdown-file-editor.js +1 -1
  157. package/dist/web-ui/public/modal-maximize.js +1 -1
  158. package/dist/web-ui/public/notifications.js +1 -1
  159. package/dist/web-ui/public/permissions.js +1 -1
  160. package/dist/web-ui/public/pr-dialog.js +1 -1
  161. package/dist/web-ui/public/roles.js +1 -1
  162. package/dist/web-ui/public/server-health.js +1 -1
  163. package/dist/web-ui/public/settings.html +23 -0
  164. package/dist/web-ui/public/settings.js +1 -1
  165. package/dist/web-ui/public/setup-password.js +1 -1
  166. package/dist/web-ui/public/skills.js +1 -1
  167. package/dist/web-ui/public/sse-client.js +1 -1
  168. package/dist/web-ui/public/sse-shared-worker.js +1 -1
  169. package/dist/web-ui/public/styles.css +101 -1
  170. package/dist/web-ui/public/task.html +46 -1
  171. package/dist/web-ui/public/task.js +1 -1
  172. package/dist/web-ui/public/teams.js +1 -1
  173. package/dist/web-ui/public/terminal.js +1 -1
  174. package/dist/web-ui/public/theme.js +1 -1
  175. package/dist/web-ui/public/users.js +1 -1
  176. package/dist/web-ui/public/variant-grouping.js +1 -1
  177. package/package.json +1 -1
  178. package/dist/.claude/settings.local.json +0 -20
  179. package/dist/playwright-test-results/.last-run.json +0 -54
@@ -1 +1 @@
1
- function isSharedWorkerSupported(){return typeof SharedWorker!=='undefined';}function eventTypeToHandler(_0x108de5){if(_0x108de5==='connected')return'onConnected';if(_0x108de5==='error')return'onError';return'on'+_0x108de5['split']('-')['map'](_0x4878d5=>_0x4878d5['charAt'](0x0)['toUpperCase']()+_0x4878d5['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'](_0x272c5a,_0x478c78){return!this['listeners']['has'](_0x272c5a)&&this['listeners']['set'](_0x272c5a,new Set()),this['listeners']['get'](_0x272c5a)['add'](_0x478c78),this;}['off'](_0x296d37,_0x2e2cc5){return this['listeners']['has'](_0x296d37)&&this['listeners']['get'](_0x296d37)['delete'](_0x2e2cc5),this;}['_emit'](_0xb710ac,_0x4628e6){this['listeners']['has'](_0xb710ac)&&this['listeners']['get'](_0xb710ac)['forEach'](_0x16d5cc=>{try{_0x16d5cc(_0x4628e6);}catch(_0x5f1e08){console['error']('[SSE\x20Client]\x20Error\x20in\x20'+_0xb710ac+'\x20listener:',_0x5f1e08);}});}['connect'](_0x1de3f6='me'){this['userId']=_0x1de3f6,this['useSharedWorker']?this['_connectViaWorker'](_0x1de3f6):this['_connectDirect'](_0x1de3f6);}['_connectViaWorker'](_0x38123e){try{this['_ensureWorker'](),this['port']['postMessage']({'action':'connect','userId':_0x38123e});}catch(_0x5a3146){console['error']('[SSE\x20Client]\x20SharedWorker\x20failed,\x20falling\x20back\x20to\x20direct\x20SSE:',_0x5a3146),this['useSharedWorker']=![],this['_connectDirect'](_0x38123e);}}['_ensureWorker'](){!this['worker']&&(this['worker']=new SharedWorker('/sse-shared-worker.js'),this['port']=this['worker']['port'],this['port']['onmessage']=this['_handleWorkerMessage'],this['port']['onmessageerror']=_0x56cd06=>{console['error']('[SSE\x20Client]\x20Worker\x20message\x20error:',_0x56cd06),this['_emit']('error',{'error':'Worker\x20message\x20error'});},this['port']['start']());}['_handleWorkerMessage'](_0x549fd9){const _0x22eefb=_0x549fd9['data'];if(_0x22eefb['type']&&_0x22eefb['type']['startsWith']('task:')){this['_handleTaskStreamMessage'](_0x22eefb);return;}switch(_0x22eefb['type']){case'connected':this['connected']=!![],this['_emit']('connected',{});break;case'snapshot':case'activity':case'status':case'new-task':case'queue-position':try{const _0x43fab4=JSON['parse'](_0x22eefb['data']);this['_emit'](_0x22eefb['type'],_0x43fab4);}catch(_0x41678e){console['error']('[SSE\x20Client]\x20Failed\x20to\x20parse\x20'+_0x22eefb['type']+'\x20data:',_0x41678e);}break;case'error':this['connected']=![],this['_emit']('error',_0x22eefb);break;default:console['warn']('[SSE\x20Client]\x20Unknown\x20message\x20type:',_0x22eefb['type']);}}['_handleTaskStreamMessage'](_0x328d48){const {taskId:_0x5ae7f7,type:_0x218449,data:_0x5d6b19}=_0x328d48,_0xfeb0ee=this['_taskSubscriptions']['get'](_0x5ae7f7);if(!_0xfeb0ee||_0xfeb0ee['size']===0x0)return;const _0x252f83=_0x218449['replace']('task:',''),_0x18a024=eventTypeToHandler(_0x252f83);_0xfeb0ee['forEach'](_0x301e7b=>{if(_0x301e7b['handlers'][_0x18a024])try{const _0x400c89=typeof _0x5d6b19==='string'?JSON['parse'](_0x5d6b19):_0x5d6b19;_0x301e7b['handlers'][_0x18a024](_0x400c89);}catch(_0x3969b7){console['error']('[SSE\x20Client]\x20Error\x20in\x20task\x20'+_0x252f83+'\x20handler:',_0x3969b7);}});}['_connectDirect'](_0x54084e){this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null);const _0x403ec6=_0x54084e&&_0x54084e!=='me'?'?userId='+_0x54084e:'';try{this['eventSource']=new EventSource('/tasks/updates'+_0x403ec6),this['eventSource']['addEventListener']('open',()=>{this['connected']=!![],this['reconnectAttempts']=0x0,this['_emit']('connected',{});}),this['eventSource']['addEventListener']('snapshot',_0x46f55b=>{this['_handleDirectSSE']('snapshot',_0x46f55b),this['reconnectAttempts']=0x0;}),this['eventSource']['addEventListener']('activity',_0x143314=>{this['_handleDirectSSE']('activity',_0x143314);}),this['eventSource']['addEventListener']('status',_0x24025a=>{this['_handleDirectSSE']('status',_0x24025a);}),this['eventSource']['addEventListener']('new-task',_0x52d67f=>{this['_handleDirectSSE']('new-task',_0x52d67f);}),this['eventSource']['addEventListener']('queue-position',_0x4a8a65=>{this['_handleDirectSSE']('queue-position',_0x4a8a65);}),this['eventSource']['addEventListener']('error',_0x4bebd7=>{console['error']('[SSE\x20Client]\x20Direct\x20SSE\x20error:',_0x4bebd7),this['connected']=![],this['_emit']('error',{'error':'Connection\x20error'}),this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null),this['_scheduleReconnect']();});}catch(_0x31ae59){console['error']('[SSE\x20Client]\x20Failed\x20to\x20create\x20EventSource:',_0x31ae59),this['_emit']('error',{'error':_0x31ae59['message']}),this['_scheduleReconnect']();}}['_handleDirectSSE'](_0x363be1,_0x3f751d){try{const _0x3ab46c=JSON['parse'](_0x3f751d['data']);this['_emit'](_0x363be1,_0x3ab46c);}catch(_0xddf8dc){console['error']('[SSE\x20Client]\x20Failed\x20to\x20parse\x20'+_0x363be1+'\x20data:',_0xddf8dc);}}['_scheduleReconnect'](){this['reconnectTimeout']&&clearTimeout(this['reconnectTimeout']);const _0x4527da=Math['min'](0x3e8*Math['pow'](0x2,this['reconnectAttempts']),0x7530);this['reconnectAttempts']++,console['log']('[SSE\x20Client]\x20Scheduling\x20reconnect\x20in\x20'+_0x4527da+'ms'),this['reconnectTimeout']=setTimeout(()=>{this['_connectDirect'](this['userId']);},_0x4527da);}['changeFilter'](_0x4af55c){if(_0x4af55c===this['userId'])return;this['userId']=_0x4af55c;if(this['useSharedWorker']&&this['port'])this['port']['postMessage']({'action':'changeFilter','userId':_0x4af55c});else this['eventSource']&&this['_connectDirect'](_0x4af55c);}['subscribeTask'](_0x4531d9,_0x522bc8){return this['useSharedWorker']?this['_subscribeTaskViaWorker'](_0x4531d9,_0x522bc8):this['_subscribeTaskDirect'](_0x4531d9,_0x522bc8);}['unsubscribeTask'](_0x31dc5b){if(!_0x31dc5b)return;_0x31dc5b['type']==='worker'?this['_unsubscribeTaskWorker'](_0x31dc5b):this['_unsubscribeTaskDirect'](_0x31dc5b);}['_subscribeTaskViaWorker'](_0x8025a6,_0x346b5e){try{this['_ensureWorker']();}catch(_0x375b53){return console['error']('[SSE\x20Client]\x20SharedWorker\x20failed\x20for\x20task\x20sub,\x20falling\x20back:',_0x375b53),this['useSharedWorker']=![],this['_subscribeTaskDirect'](_0x8025a6,_0x346b5e);}const _0x31fb77=++this['_taskSubIdCounter'],_0x4f42a6={'type':'worker','taskId':_0x8025a6,'handlers':_0x346b5e,'id':_0x31fb77};return!this['_taskSubscriptions']['has'](_0x8025a6)&&(this['_taskSubscriptions']['set'](_0x8025a6,new Set()),this['port']['postMessage']({'action':'subscribeTask','taskId':_0x8025a6})),this['_taskSubscriptions']['get'](_0x8025a6)['add'](_0x4f42a6),_0x4f42a6;}['_unsubscribeTaskWorker'](_0x274dad){const {taskId:_0x257a6d}=_0x274dad,_0x16a001=this['_taskSubscriptions']['get'](_0x257a6d);if(_0x16a001){_0x16a001['delete'](_0x274dad);if(_0x16a001['size']===0x0){this['_taskSubscriptions']['delete'](_0x257a6d);try{this['port']&&this['port']['postMessage']({'action':'unsubscribeTask','taskId':_0x257a6d});}catch(_0x43e471){}}}}['_subscribeTaskDirect'](_0x390b12,_0x299984){const _0x45413b=++this['_taskSubIdCounter'],_0x7fe44f=new EventSource('/tasks/'+_0x390b12+'/stream'),_0x343d54={'type':'direct','taskId':_0x390b12,'handlers':_0x299984,'id':_0x45413b,'eventSource':_0x7fe44f};!this['_taskSubscriptions']['has'](_0x390b12)&&this['_taskSubscriptions']['set'](_0x390b12,new Set());this['_taskSubscriptions']['get'](_0x390b12)['add'](_0x343d54);for(const _0xd325 of TASK_STREAM_EVENTS){const _0x2d2fa6=eventTypeToHandler(_0xd325);_0x7fe44f['addEventListener'](_0xd325,_0x7701f8=>{if(_0x299984[_0x2d2fa6])try{const _0x3958cf=JSON['parse'](_0x7701f8['data']);_0x299984[_0x2d2fa6](_0x3958cf);}catch(_0x52db59){console['error']('[SSE\x20Client]\x20Error\x20parsing\x20task\x20'+_0xd325+':',_0x52db59);}});}return _0x7fe44f['addEventListener']('open',()=>{if(_0x299984['onConnected'])_0x299984['onConnected']();}),_0x7fe44f['addEventListener']('error',()=>{if(_0x299984['onError'])_0x299984['onError']({'error':'Connection\x20error'});}),_0x343d54;}['_unsubscribeTaskDirect'](_0x5e911f){_0x5e911f['eventSource']&&(_0x5e911f['eventSource']['close'](),_0x5e911f['eventSource']=null);const _0x4b5ce8=this['_taskSubscriptions']['get'](_0x5e911f['taskId']);_0x4b5ce8&&(_0x4b5ce8['delete'](_0x5e911f),_0x4b5ce8['size']===0x0&&this['_taskSubscriptions']['delete'](_0x5e911f['taskId']));}['disconnect'](){this['reconnectTimeout']&&(clearTimeout(this['reconnectTimeout']),this['reconnectTimeout']=null);this['_taskSubscriptions']['forEach']((_0x280b9a,_0x3fe894)=>{_0x280b9a['forEach'](_0x308557=>{_0x308557['type']==='direct'&&_0x308557['eventSource']&&_0x308557['eventSource']['close']();});}),this['_taskSubscriptions']['clear']();if(this['useSharedWorker']&&this['port'])try{this['port']['postMessage']({'action':'disconnect'});}catch(_0x2a5c8c){}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(_0x39c04b){if(_0x39c04b==='connected')return'onConnected';if(_0x39c04b==='error')return'onError';return'on'+_0x39c04b['split']('-')['map'](_0x32e48f=>_0x32e48f['charAt'](0x0)['toUpperCase']()+_0x32e48f['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'](_0x5d6b68,_0x4ac297){return!this['listeners']['has'](_0x5d6b68)&&this['listeners']['set'](_0x5d6b68,new Set()),this['listeners']['get'](_0x5d6b68)['add'](_0x4ac297),this;}['off'](_0x1e57d7,_0x289b74){return this['listeners']['has'](_0x1e57d7)&&this['listeners']['get'](_0x1e57d7)['delete'](_0x289b74),this;}['_emit'](_0x3c5742,_0x5c62f0){this['listeners']['has'](_0x3c5742)&&this['listeners']['get'](_0x3c5742)['forEach'](_0x323541=>{try{_0x323541(_0x5c62f0);}catch(_0x1873ea){console['error']('[SSE\x20Client]\x20Error\x20in\x20'+_0x3c5742+'\x20listener:',_0x1873ea);}});}['connect'](_0x218801='me'){this['userId']=_0x218801,this['useSharedWorker']?this['_connectViaWorker'](_0x218801):this['_connectDirect'](_0x218801);}['_connectViaWorker'](_0x1d509f){try{this['_ensureWorker'](),this['port']['postMessage']({'action':'connect','userId':_0x1d509f});}catch(_0x1b978b){console['error']('[SSE\x20Client]\x20SharedWorker\x20failed,\x20falling\x20back\x20to\x20direct\x20SSE:',_0x1b978b),this['useSharedWorker']=![],this['_connectDirect'](_0x1d509f);}}['_ensureWorker'](){!this['worker']&&(this['worker']=new SharedWorker('/sse-shared-worker.js'),this['port']=this['worker']['port'],this['port']['onmessage']=this['_handleWorkerMessage'],this['port']['onmessageerror']=_0xf29ef1=>{console['error']('[SSE\x20Client]\x20Worker\x20message\x20error:',_0xf29ef1),this['_emit']('error',{'error':'Worker\x20message\x20error'});},this['port']['start']());}['_handleWorkerMessage'](_0x4dbda9){const _0x23d0e5=_0x4dbda9['data'];if(_0x23d0e5['type']&&_0x23d0e5['type']['startsWith']('task:')){this['_handleTaskStreamMessage'](_0x23d0e5);return;}switch(_0x23d0e5['type']){case'connected':this['connected']=!![],this['_emit']('connected',{});break;case'snapshot':case'activity':case'status':case'new-task':case'queue-position':try{const _0x45f918=JSON['parse'](_0x23d0e5['data']);this['_emit'](_0x23d0e5['type'],_0x45f918);}catch(_0x50e739){console['error']('[SSE\x20Client]\x20Failed\x20to\x20parse\x20'+_0x23d0e5['type']+'\x20data:',_0x50e739);}break;case'error':this['connected']=![],this['_emit']('error',_0x23d0e5);break;default:console['warn']('[SSE\x20Client]\x20Unknown\x20message\x20type:',_0x23d0e5['type']);}}['_handleTaskStreamMessage'](_0x2055dc){const {taskId:_0x5c8882,type:_0xd89f41,data:_0x486e29}=_0x2055dc,_0x40e8ac=this['_taskSubscriptions']['get'](_0x5c8882);if(!_0x40e8ac||_0x40e8ac['size']===0x0)return;const _0x50fd41=_0xd89f41['replace']('task:',''),_0x5f5ba2=eventTypeToHandler(_0x50fd41);_0x40e8ac['forEach'](_0x377f6b=>{if(_0x377f6b['handlers'][_0x5f5ba2])try{const _0x23f756=typeof _0x486e29==='string'?JSON['parse'](_0x486e29):_0x486e29;_0x377f6b['handlers'][_0x5f5ba2](_0x23f756);}catch(_0x3d66b1){console['error']('[SSE\x20Client]\x20Error\x20in\x20task\x20'+_0x50fd41+'\x20handler:',_0x3d66b1);}});}['_connectDirect'](_0x5d4ed6){this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null);const _0x15e929=_0x5d4ed6&&_0x5d4ed6!=='me'?'?userId='+_0x5d4ed6:'';try{this['eventSource']=new EventSource('/tasks/updates'+_0x15e929),this['eventSource']['addEventListener']('open',()=>{this['connected']=!![],this['reconnectAttempts']=0x0,this['_emit']('connected',{});}),this['eventSource']['addEventListener']('snapshot',_0x361dab=>{this['_handleDirectSSE']('snapshot',_0x361dab),this['reconnectAttempts']=0x0;}),this['eventSource']['addEventListener']('activity',_0x1424e0=>{this['_handleDirectSSE']('activity',_0x1424e0);}),this['eventSource']['addEventListener']('status',_0x2744c5=>{this['_handleDirectSSE']('status',_0x2744c5);}),this['eventSource']['addEventListener']('new-task',_0xcb8913=>{this['_handleDirectSSE']('new-task',_0xcb8913);}),this['eventSource']['addEventListener']('queue-position',_0x1b07cf=>{this['_handleDirectSSE']('queue-position',_0x1b07cf);}),this['eventSource']['addEventListener']('error',_0xb1e47d=>{console['error']('[SSE\x20Client]\x20Direct\x20SSE\x20error:',_0xb1e47d),this['connected']=![],this['_emit']('error',{'error':'Connection\x20error'}),this['eventSource']&&(this['eventSource']['close'](),this['eventSource']=null),this['_scheduleReconnect']();});}catch(_0x326c5b){console['error']('[SSE\x20Client]\x20Failed\x20to\x20create\x20EventSource:',_0x326c5b),this['_emit']('error',{'error':_0x326c5b['message']}),this['_scheduleReconnect']();}}['_handleDirectSSE'](_0x1f6048,_0x4c85d4){try{const _0x13c74b=JSON['parse'](_0x4c85d4['data']);this['_emit'](_0x1f6048,_0x13c74b);}catch(_0x98c1be){console['error']('[SSE\x20Client]\x20Failed\x20to\x20parse\x20'+_0x1f6048+'\x20data:',_0x98c1be);}}['_scheduleReconnect'](){this['reconnectTimeout']&&clearTimeout(this['reconnectTimeout']);const _0x5b277d=Math['min'](0x3e8*Math['pow'](0x2,this['reconnectAttempts']),0x7530);this['reconnectAttempts']++,console['log']('[SSE\x20Client]\x20Scheduling\x20reconnect\x20in\x20'+_0x5b277d+'ms'),this['reconnectTimeout']=setTimeout(()=>{this['_connectDirect'](this['userId']);},_0x5b277d);}['changeFilter'](_0x404bf6){if(_0x404bf6===this['userId'])return;this['userId']=_0x404bf6;if(this['useSharedWorker']&&this['port'])this['port']['postMessage']({'action':'changeFilter','userId':_0x404bf6});else this['eventSource']&&this['_connectDirect'](_0x404bf6);}['subscribeTask'](_0x555718,_0x100343){return this['useSharedWorker']?this['_subscribeTaskViaWorker'](_0x555718,_0x100343):this['_subscribeTaskDirect'](_0x555718,_0x100343);}['unsubscribeTask'](_0x44a8a8){if(!_0x44a8a8)return;_0x44a8a8['type']==='worker'?this['_unsubscribeTaskWorker'](_0x44a8a8):this['_unsubscribeTaskDirect'](_0x44a8a8);}['_subscribeTaskViaWorker'](_0x14fb16,_0x280fc8){try{this['_ensureWorker']();}catch(_0x4c4cc7){return console['error']('[SSE\x20Client]\x20SharedWorker\x20failed\x20for\x20task\x20sub,\x20falling\x20back:',_0x4c4cc7),this['useSharedWorker']=![],this['_subscribeTaskDirect'](_0x14fb16,_0x280fc8);}const _0x3360d4=++this['_taskSubIdCounter'],_0x5baab1={'type':'worker','taskId':_0x14fb16,'handlers':_0x280fc8,'id':_0x3360d4};return!this['_taskSubscriptions']['has'](_0x14fb16)&&(this['_taskSubscriptions']['set'](_0x14fb16,new Set()),this['port']['postMessage']({'action':'subscribeTask','taskId':_0x14fb16})),this['_taskSubscriptions']['get'](_0x14fb16)['add'](_0x5baab1),_0x5baab1;}['_unsubscribeTaskWorker'](_0xd9ddf5){const {taskId:_0x344acb}=_0xd9ddf5,_0x387fa2=this['_taskSubscriptions']['get'](_0x344acb);if(_0x387fa2){_0x387fa2['delete'](_0xd9ddf5);if(_0x387fa2['size']===0x0){this['_taskSubscriptions']['delete'](_0x344acb);try{this['port']&&this['port']['postMessage']({'action':'unsubscribeTask','taskId':_0x344acb});}catch(_0x4df8b1){}}}}['_subscribeTaskDirect'](_0x21f226,_0x4861b7){const _0x3e80c0=++this['_taskSubIdCounter'],_0x37985c=new EventSource('/tasks/'+_0x21f226+'/stream'),_0x4a0ddd={'type':'direct','taskId':_0x21f226,'handlers':_0x4861b7,'id':_0x3e80c0,'eventSource':_0x37985c};!this['_taskSubscriptions']['has'](_0x21f226)&&this['_taskSubscriptions']['set'](_0x21f226,new Set());this['_taskSubscriptions']['get'](_0x21f226)['add'](_0x4a0ddd);for(const _0x545119 of TASK_STREAM_EVENTS){const _0x5091da=eventTypeToHandler(_0x545119);_0x37985c['addEventListener'](_0x545119,_0xcfda1e=>{if(_0x4861b7[_0x5091da])try{const _0x43a349=JSON['parse'](_0xcfda1e['data']);_0x4861b7[_0x5091da](_0x43a349);}catch(_0x3b4eca){console['error']('[SSE\x20Client]\x20Error\x20parsing\x20task\x20'+_0x545119+':',_0x3b4eca);}});}return _0x37985c['addEventListener']('open',()=>{if(_0x4861b7['onConnected'])_0x4861b7['onConnected']();}),_0x37985c['addEventListener']('error',()=>{if(_0x4861b7['onError'])_0x4861b7['onError']({'error':'Connection\x20error'});}),_0x4a0ddd;}['_unsubscribeTaskDirect'](_0x1e7886){_0x1e7886['eventSource']&&(_0x1e7886['eventSource']['close'](),_0x1e7886['eventSource']=null);const _0x1726e5=this['_taskSubscriptions']['get'](_0x1e7886['taskId']);_0x1726e5&&(_0x1726e5['delete'](_0x1e7886),_0x1726e5['size']===0x0&&this['_taskSubscriptions']['delete'](_0x1e7886['taskId']));}['disconnect'](){this['reconnectTimeout']&&(clearTimeout(this['reconnectTimeout']),this['reconnectTimeout']=null);this['_taskSubscriptions']['forEach']((_0x4d4447,_0x5d6ce3)=>{_0x4d4447['forEach'](_0x17aaa3=>{_0x17aaa3['type']==='direct'&&_0x17aaa3['eventSource']&&_0x17aaa3['eventSource']['close']();});}),this['_taskSubscriptions']['clear']();if(this['useSharedWorker']&&this['port'])try{this['port']['postMessage']({'action':'disconnect'});}catch(_0x7c7ade){}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(_0xcf5906){eventSource&&currentUserId!==_0xcf5906&&(eventSource['close'](),eventSource=null);if(eventSource&&eventSource['readyState']!==EventSource['CLOSED'])return;currentUserId=_0xcf5906;const _0x2908be=_0xcf5906&&_0xcf5906!=='me'?'?userId='+_0xcf5906:'';try{eventSource=new EventSource('/tasks/updates'+_0x2908be),eventSource['addEventListener']('snapshot',_0x4b1f1c=>{broadcast({'type':'snapshot','data':_0x4b1f1c['data']}),reconnectAttempts=0x0;}),eventSource['addEventListener']('activity',_0x122064=>{broadcast({'type':'activity','data':_0x122064['data']});}),eventSource['addEventListener']('status',_0x1ce1d7=>{broadcast({'type':'status','data':_0x1ce1d7['data']});}),eventSource['addEventListener']('new-task',_0x14413c=>{broadcast({'type':'new-task','data':_0x14413c['data']});}),eventSource['addEventListener']('queue-position',_0x26a3f9=>{broadcast({'type':'queue-position','data':_0x26a3f9['data']});}),eventSource['addEventListener']('open',()=>{broadcast({'type':'connected'}),reconnectAttempts=0x0;}),eventSource['addEventListener']('error',_0x4dd726=>{console['error']('[SSE\x20Worker]\x20Connection\x20error:',_0x4dd726),broadcast({'type':'error','error':'Connection\x20error'}),eventSource&&(eventSource['close'](),eventSource=null),scheduleReconnect();});}catch(_0x3d7b28){console['error']('[SSE\x20Worker]\x20Failed\x20to\x20create\x20EventSource:',_0x3d7b28),broadcast({'type':'error','error':_0x3d7b28['message']}),scheduleReconnect();}}function scheduleReconnect(){reconnectTimeout&&clearTimeout(reconnectTimeout);if(ports['size']===0x0)return;const _0x548157=Math['min'](0x3e8*Math['pow'](0x2,reconnectAttempts),MAX_RECONNECT_DELAY);reconnectAttempts++,console['log']('[SSE\x20Worker]\x20Scheduling\x20reconnect\x20in\x20'+_0x548157+'ms\x20(attempt\x20'+reconnectAttempts+')'),reconnectTimeout=setTimeout(()=>{ports['size']>0x0&&connect(currentUserId);},_0x548157);}function broadcast(_0x2e0ffa){const _0x503f4d=[];ports['forEach'](_0x257ca8=>{try{_0x257ca8['postMessage'](_0x2e0ffa);}catch(_0x44d12d){console['warn']('[SSE\x20Worker]\x20Failed\x20to\x20send\x20to\x20port,\x20removing:',_0x44d12d),_0x503f4d['push'](_0x257ca8);}}),_0x503f4d['length']>0x0&&cleanUpDeadPorts(_0x503f4d),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(_0xd89d38,_0x81f771){let _0x181293=taskStreams['get'](_0x81f771);!_0x181293&&(_0x181293={'eventSource':null,'reconnectTimeout':null,'reconnectAttempts':0x0,'subscribedPorts':new Set()},taskStreams['set'](_0x81f771,_0x181293));_0x181293['subscribedPorts']['add'](_0xd89d38);if(!_0x181293['eventSource']||_0x181293['eventSource']['readyState']===EventSource['CLOSED'])connectTaskStream(_0x81f771);else{if(_0x181293['eventSource']['readyState']===EventSource['OPEN'])try{_0xd89d38['postMessage']({'type':'task:connected','taskId':_0x81f771});}catch(_0xc35661){}}}function unsubscribeTask(_0x28604c,_0x5b6226){const _0x1c389f=taskStreams['get'](_0x5b6226);if(!_0x1c389f)return;_0x1c389f['subscribedPorts']['delete'](_0x28604c),_0x1c389f['subscribedPorts']['size']===0x0&&deferredCloseTaskStream(_0x5b6226);}function connectTaskStream(_0x4dfe19){const _0x4e953f=taskStreams['get'](_0x4dfe19);if(!_0x4e953f)return;_0x4e953f['eventSource']&&(_0x4e953f['eventSource']['close'](),_0x4e953f['eventSource']=null);try{_0x4e953f['eventSource']=new EventSource('/tasks/'+_0x4dfe19+'/stream');for(const _0x2c114d of TASK_STREAM_EVENTS){_0x4e953f['eventSource']['addEventListener'](_0x2c114d,_0x297056=>{broadcastToTask(_0x4dfe19,'task:'+_0x2c114d,_0x297056['data']),_0x4e953f['reconnectAttempts']=0x0;});}_0x4e953f['eventSource']['addEventListener']('open',()=>{broadcastToTask(_0x4dfe19,'task:connected','{}'),_0x4e953f['reconnectAttempts']=0x0;}),_0x4e953f['eventSource']['addEventListener']('error',()=>{broadcastToTask(_0x4dfe19,'task:error',JSON['stringify']({'error':'Connection\x20error'})),_0x4e953f['eventSource']&&(_0x4e953f['eventSource']['close'](),_0x4e953f['eventSource']=null),scheduleTaskReconnect(_0x4dfe19);});}catch(_0x5b4bb2){console['error']('[SSE\x20Worker]\x20Failed\x20to\x20create\x20task\x20EventSource\x20for\x20'+_0x4dfe19+':',_0x5b4bb2),broadcastToTask(_0x4dfe19,'task:error',JSON['stringify']({'error':_0x5b4bb2['message']})),scheduleTaskReconnect(_0x4dfe19);}}function broadcastToTask(_0x2ca0d3,_0x8df62e,_0x2363a4){const _0x573299=taskStreams['get'](_0x2ca0d3);if(!_0x573299)return;const _0x983c4a=[];_0x573299['subscribedPorts']['forEach'](_0x42f3dc=>{try{_0x42f3dc['postMessage']({'type':_0x8df62e,'taskId':_0x2ca0d3,'data':_0x2363a4});}catch(_0x355741){_0x983c4a['push'](_0x42f3dc);}}),_0x983c4a['length']>0x0&&(_0x983c4a['forEach'](_0x4cd3bf=>_0x573299['subscribedPorts']['delete'](_0x4cd3bf)),cleanUpDeadPorts(_0x983c4a),_0x573299['subscribedPorts']['size']===0x0&&closeTaskStream(_0x2ca0d3));}function closeTaskStream(_0x4c81cf){const _0x482501=taskStreams['get'](_0x4c81cf);if(!_0x482501)return;_0x482501['eventSource']&&_0x482501['eventSource']['close'](),_0x482501['reconnectTimeout']&&clearTimeout(_0x482501['reconnectTimeout']),taskStreams['delete'](_0x4c81cf);}function deferredCloseTaskStream(_0x453c13){setTimeout(()=>{const _0x4bda93=taskStreams['get'](_0x453c13);_0x4bda93&&_0x4bda93['subscribedPorts']['size']===0x0&&closeTaskStream(_0x453c13);},0x0);}function scheduleTaskReconnect(_0x74480c){const _0x349abd=taskStreams['get'](_0x74480c);if(!_0x349abd||_0x349abd['subscribedPorts']['size']===0x0)return;_0x349abd['reconnectTimeout']&&clearTimeout(_0x349abd['reconnectTimeout']);const _0xa3bbc2=Math['min'](0x3e8*Math['pow'](0x2,_0x349abd['reconnectAttempts']),MAX_RECONNECT_DELAY);_0x349abd['reconnectAttempts']++,console['log']('[SSE\x20Worker]\x20Scheduling\x20task\x20stream\x20reconnect\x20for\x20'+_0x74480c+'\x20in\x20'+_0xa3bbc2+'ms'),_0x349abd['reconnectTimeout']=setTimeout(()=>{_0x349abd['subscribedPorts']['size']>0x0&&connectTaskStream(_0x74480c);},_0xa3bbc2);}function cleanUpDeadPorts(_0x176709){for(const _0x3c1c50 of _0x176709){ports['delete'](_0x3c1c50),taskStreams['forEach']((_0x1f8c72,_0x5c0daa)=>{_0x1f8c72['subscribedPorts']['delete'](_0x3c1c50),_0x1f8c72['subscribedPorts']['size']===0x0&&closeTaskStream(_0x5c0daa);});}}function removePortFromAllTasks(_0x1c2947){taskStreams['forEach']((_0x128fdc,_0x2f9ecd)=>{_0x128fdc['subscribedPorts']['has'](_0x1c2947)&&(_0x128fdc['subscribedPorts']['delete'](_0x1c2947),_0x128fdc['subscribedPorts']['size']===0x0&&closeTaskStream(_0x2f9ecd));});}self['onconnect']=function(_0x510bb5){const _0x351cef=_0x510bb5['ports'][0x0];ports['add'](_0x351cef),console['log']('[SSE\x20Worker]\x20New\x20port\x20connected.\x20Total\x20ports:\x20'+ports['size']),_0x351cef['onmessage']=function(_0x3fba73){const {action:_0xcdfeb6,userId:_0x8c95bf,taskId:_0x5718be}=_0x3fba73['data'];switch(_0xcdfeb6){case'connect':connect(_0x8c95bf);eventSource&&eventSource['readyState']===EventSource['OPEN']&&_0x351cef['postMessage']({'type':'connected'});break;case'disconnect':ports['delete'](_0x351cef),removePortFromAllTasks(_0x351cef),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':_0x8c95bf!==currentUserId&&connect(_0x8c95bf);break;case'subscribeTask':subscribeTask(_0x351cef,_0x5718be);break;case'unsubscribeTask':unsubscribeTask(_0x351cef,_0x5718be);break;default:console['warn']('[SSE\x20Worker]\x20Unknown\x20action:',_0xcdfeb6);}},_0x351cef['onmessageerror']=function(_0xa1e18f){console['error']('[SSE\x20Worker]\x20Port\x20message\x20error:',_0xa1e18f),ports['delete'](_0x351cef),removePortFromAllTasks(_0x351cef);},_0x351cef['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(_0x300844){eventSource&&currentUserId!==_0x300844&&(eventSource['close'](),eventSource=null);if(eventSource&&eventSource['readyState']!==EventSource['CLOSED'])return;currentUserId=_0x300844;const _0x5837e4=_0x300844&&_0x300844!=='me'?'?userId='+_0x300844:'';try{eventSource=new EventSource('/tasks/updates'+_0x5837e4),eventSource['addEventListener']('snapshot',_0x50d8bd=>{broadcast({'type':'snapshot','data':_0x50d8bd['data']}),reconnectAttempts=0x0;}),eventSource['addEventListener']('activity',_0x43f626=>{broadcast({'type':'activity','data':_0x43f626['data']});}),eventSource['addEventListener']('status',_0x17fb9e=>{broadcast({'type':'status','data':_0x17fb9e['data']});}),eventSource['addEventListener']('new-task',_0x142e30=>{broadcast({'type':'new-task','data':_0x142e30['data']});}),eventSource['addEventListener']('queue-position',_0x89789c=>{broadcast({'type':'queue-position','data':_0x89789c['data']});}),eventSource['addEventListener']('open',()=>{broadcast({'type':'connected'}),reconnectAttempts=0x0;}),eventSource['addEventListener']('error',_0x4b91d9=>{console['error']('[SSE\x20Worker]\x20Connection\x20error:',_0x4b91d9),broadcast({'type':'error','error':'Connection\x20error'}),eventSource&&(eventSource['close'](),eventSource=null),scheduleReconnect();});}catch(_0x2b15af){console['error']('[SSE\x20Worker]\x20Failed\x20to\x20create\x20EventSource:',_0x2b15af),broadcast({'type':'error','error':_0x2b15af['message']}),scheduleReconnect();}}function scheduleReconnect(){reconnectTimeout&&clearTimeout(reconnectTimeout);if(ports['size']===0x0)return;const _0x4f77bc=Math['min'](0x3e8*Math['pow'](0x2,reconnectAttempts),MAX_RECONNECT_DELAY);reconnectAttempts++,console['log']('[SSE\x20Worker]\x20Scheduling\x20reconnect\x20in\x20'+_0x4f77bc+'ms\x20(attempt\x20'+reconnectAttempts+')'),reconnectTimeout=setTimeout(()=>{ports['size']>0x0&&connect(currentUserId);},_0x4f77bc);}function broadcast(_0x3f5770){const _0x2ed8df=[];ports['forEach'](_0xdd7140=>{try{_0xdd7140['postMessage'](_0x3f5770);}catch(_0x74a6d2){console['warn']('[SSE\x20Worker]\x20Failed\x20to\x20send\x20to\x20port,\x20removing:',_0x74a6d2),_0x2ed8df['push'](_0xdd7140);}}),_0x2ed8df['length']>0x0&&cleanUpDeadPorts(_0x2ed8df),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(_0x23d815,_0x3b7682){let _0x1124e4=taskStreams['get'](_0x3b7682);!_0x1124e4&&(_0x1124e4={'eventSource':null,'reconnectTimeout':null,'reconnectAttempts':0x0,'subscribedPorts':new Set()},taskStreams['set'](_0x3b7682,_0x1124e4));_0x1124e4['subscribedPorts']['add'](_0x23d815);if(!_0x1124e4['eventSource']||_0x1124e4['eventSource']['readyState']===EventSource['CLOSED'])connectTaskStream(_0x3b7682);else{if(_0x1124e4['eventSource']['readyState']===EventSource['OPEN'])try{_0x23d815['postMessage']({'type':'task:connected','taskId':_0x3b7682});}catch(_0x3efbea){}}}function unsubscribeTask(_0x5dc6dd,_0x2f37bb){const _0x48c1b3=taskStreams['get'](_0x2f37bb);if(!_0x48c1b3)return;_0x48c1b3['subscribedPorts']['delete'](_0x5dc6dd),_0x48c1b3['subscribedPorts']['size']===0x0&&deferredCloseTaskStream(_0x2f37bb);}function connectTaskStream(_0x358008){const _0x200479=taskStreams['get'](_0x358008);if(!_0x200479)return;_0x200479['eventSource']&&(_0x200479['eventSource']['close'](),_0x200479['eventSource']=null);try{_0x200479['eventSource']=new EventSource('/tasks/'+_0x358008+'/stream');for(const _0xe3d334 of TASK_STREAM_EVENTS){_0x200479['eventSource']['addEventListener'](_0xe3d334,_0x2eba15=>{broadcastToTask(_0x358008,'task:'+_0xe3d334,_0x2eba15['data']),_0x200479['reconnectAttempts']=0x0;});}_0x200479['eventSource']['addEventListener']('open',()=>{broadcastToTask(_0x358008,'task:connected','{}'),_0x200479['reconnectAttempts']=0x0;}),_0x200479['eventSource']['addEventListener']('error',()=>{broadcastToTask(_0x358008,'task:error',JSON['stringify']({'error':'Connection\x20error'})),_0x200479['eventSource']&&(_0x200479['eventSource']['close'](),_0x200479['eventSource']=null),scheduleTaskReconnect(_0x358008);});}catch(_0x2441b6){console['error']('[SSE\x20Worker]\x20Failed\x20to\x20create\x20task\x20EventSource\x20for\x20'+_0x358008+':',_0x2441b6),broadcastToTask(_0x358008,'task:error',JSON['stringify']({'error':_0x2441b6['message']})),scheduleTaskReconnect(_0x358008);}}function broadcastToTask(_0xee04f8,_0x3f439f,_0x5844b8){const _0xe2635=taskStreams['get'](_0xee04f8);if(!_0xe2635)return;const _0x194459=[];_0xe2635['subscribedPorts']['forEach'](_0x271be2=>{try{_0x271be2['postMessage']({'type':_0x3f439f,'taskId':_0xee04f8,'data':_0x5844b8});}catch(_0x3af877){_0x194459['push'](_0x271be2);}}),_0x194459['length']>0x0&&(_0x194459['forEach'](_0x94a68a=>_0xe2635['subscribedPorts']['delete'](_0x94a68a)),cleanUpDeadPorts(_0x194459),_0xe2635['subscribedPorts']['size']===0x0&&closeTaskStream(_0xee04f8));}function closeTaskStream(_0x13f17c){const _0x199492=taskStreams['get'](_0x13f17c);if(!_0x199492)return;_0x199492['eventSource']&&_0x199492['eventSource']['close'](),_0x199492['reconnectTimeout']&&clearTimeout(_0x199492['reconnectTimeout']),taskStreams['delete'](_0x13f17c);}function deferredCloseTaskStream(_0x2b0b46){setTimeout(()=>{const _0x3568ee=taskStreams['get'](_0x2b0b46);_0x3568ee&&_0x3568ee['subscribedPorts']['size']===0x0&&closeTaskStream(_0x2b0b46);},0x0);}function scheduleTaskReconnect(_0x25c1fa){const _0x147c8e=taskStreams['get'](_0x25c1fa);if(!_0x147c8e||_0x147c8e['subscribedPorts']['size']===0x0)return;_0x147c8e['reconnectTimeout']&&clearTimeout(_0x147c8e['reconnectTimeout']);const _0x3aeee0=Math['min'](0x3e8*Math['pow'](0x2,_0x147c8e['reconnectAttempts']),MAX_RECONNECT_DELAY);_0x147c8e['reconnectAttempts']++,console['log']('[SSE\x20Worker]\x20Scheduling\x20task\x20stream\x20reconnect\x20for\x20'+_0x25c1fa+'\x20in\x20'+_0x3aeee0+'ms'),_0x147c8e['reconnectTimeout']=setTimeout(()=>{_0x147c8e['subscribedPorts']['size']>0x0&&connectTaskStream(_0x25c1fa);},_0x3aeee0);}function cleanUpDeadPorts(_0x35c243){for(const _0x3b7a3b of _0x35c243){ports['delete'](_0x3b7a3b),taskStreams['forEach']((_0x35367a,_0x40fc2d)=>{_0x35367a['subscribedPorts']['delete'](_0x3b7a3b),_0x35367a['subscribedPorts']['size']===0x0&&closeTaskStream(_0x40fc2d);});}}function removePortFromAllTasks(_0x303f5a){taskStreams['forEach']((_0x468acd,_0x2afa43)=>{_0x468acd['subscribedPorts']['has'](_0x303f5a)&&(_0x468acd['subscribedPorts']['delete'](_0x303f5a),_0x468acd['subscribedPorts']['size']===0x0&&closeTaskStream(_0x2afa43));});}self['onconnect']=function(_0x9f6ebd){const _0x218054=_0x9f6ebd['ports'][0x0];ports['add'](_0x218054),console['log']('[SSE\x20Worker]\x20New\x20port\x20connected.\x20Total\x20ports:\x20'+ports['size']),_0x218054['onmessage']=function(_0x19a545){const {action:_0x1cdee4,userId:_0x4b81a7,taskId:_0x4412b9}=_0x19a545['data'];switch(_0x1cdee4){case'connect':connect(_0x4b81a7);eventSource&&eventSource['readyState']===EventSource['OPEN']&&_0x218054['postMessage']({'type':'connected'});break;case'disconnect':ports['delete'](_0x218054),removePortFromAllTasks(_0x218054),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':_0x4b81a7!==currentUserId&&connect(_0x4b81a7);break;case'subscribeTask':subscribeTask(_0x218054,_0x4412b9);break;case'unsubscribeTask':unsubscribeTask(_0x218054,_0x4412b9);break;default:console['warn']('[SSE\x20Worker]\x20Unknown\x20action:',_0x1cdee4);}},_0x218054['onmessageerror']=function(_0xb64bc2){console['error']('[SSE\x20Worker]\x20Port\x20message\x20error:',_0xb64bc2),ports['delete'](_0x218054),removePortFromAllTasks(_0x218054);},_0x218054['start']();};
@@ -1949,6 +1949,10 @@ body.task-list-open .task-sticky-header {
1949
1949
  color: #4285f4; /* Gemini blue */
1950
1950
  }
1951
1951
 
1952
+ .sticky-agent-icon[data-agent="bob"] {
1953
+ color: #6366F1; /* Bob indigo */
1954
+ }
1955
+
1952
1956
  .sticky-agent-name {
1953
1957
  font-size: 13px;
1954
1958
  font-weight: 600;
@@ -2144,6 +2148,11 @@ body.task-list-open .task-sticky-header {
2144
2148
  color: #4285f4; /* Gemini blue */
2145
2149
  }
2146
2150
 
2151
+ .task-tab .task-tab-icon[data-agent="bob"],
2152
+ .task-tab-mini .task-tab-icon[data-agent="bob"] {
2153
+ color: #6366F1; /* Bob indigo */
2154
+ }
2155
+
2147
2156
  .task-tab .task-tab-icon,
2148
2157
  .task-tab-mini .task-tab-icon {
2149
2158
  color: var(--color-text-muted);
@@ -3663,6 +3672,12 @@ button:disabled,
3663
3672
  border-color: rgba(66, 133, 244, 0.35);
3664
3673
  }
3665
3674
 
3675
+ .task-agent-icon[data-agent="bob"] {
3676
+ color: #6366F1;
3677
+ background: rgba(99, 102, 241, 0.12);
3678
+ border-color: rgba(99, 102, 241, 0.35);
3679
+ }
3680
+
3666
3681
  /* Judge task icon - uses gold/amber to match ⚖️ emoji appearance */
3667
3682
  .task-agent-icon.is-judge {
3668
3683
  color: #b8860b !important;
@@ -6313,6 +6328,50 @@ select option[value=""] {
6313
6328
  box-shadow: 0 4px 16px rgba(66, 133, 244, 0.15);
6314
6329
  }
6315
6330
 
6331
+ /* Bob (IBM) - Indigo #6366F1 */
6332
+ .agent-card[data-agent="bob"]:not([data-count="0"]) {
6333
+ background: linear-gradient(135deg, rgba(99, 102, 241, 0.1) 0%, rgba(99, 102, 241, 0.05) 100%);
6334
+ border-color: rgba(99, 102, 241, 0.4);
6335
+ }
6336
+
6337
+ .agent-card[data-agent="bob"]:not([data-count="0"]) .agent-icon svg {
6338
+ opacity: 1;
6339
+ color: #6366F1;
6340
+ }
6341
+
6342
+ .agent-card[data-agent="bob"]:not([data-count="0"]) .agent-btn-decrement,
6343
+ .agent-card[data-agent="bob"]:not([data-count="0"]) .agent-btn-increment {
6344
+ color: #6366F1;
6345
+ opacity: 0.6;
6346
+ }
6347
+
6348
+ .agent-card[data-agent="bob"]:not([data-count="0"]) .agent-btn-decrement:hover,
6349
+ .agent-card[data-agent="bob"]:not([data-count="0"]) .agent-btn-increment:hover {
6350
+ opacity: 1;
6351
+ background: rgba(99, 102, 241, 0.1);
6352
+ }
6353
+
6354
+ .agent-card[data-agent="bob"]:not([data-count="0"]) .agent-count-badge {
6355
+ background: #6366F1;
6356
+ opacity: 1;
6357
+ transform: scale(1);
6358
+ }
6359
+
6360
+ .agent-card[data-agent="bob"]:hover {
6361
+ border-color: rgba(99, 102, 241, 0.6);
6362
+ box-shadow: 0 4px 16px rgba(99, 102, 241, 0.15);
6363
+ }
6364
+
6365
+ .agent-card.agent-disabled {
6366
+ display: none;
6367
+ }
6368
+ .judge-agent-btn.agent-disabled {
6369
+ display: none;
6370
+ }
6371
+ .agent-card.agent-disabled .agent-icon {
6372
+ cursor: default;
6373
+ }
6374
+
6316
6375
  /* Focus states for accessibility */
6317
6376
  .agent-card:focus-visible {
6318
6377
  outline: 2px solid var(--color-accent);
@@ -6386,6 +6445,11 @@ select option[value=""] {
6386
6445
  font-weight: 600;
6387
6446
  }
6388
6447
 
6448
+ .compact-counter[data-agent="bob"] .counter-display {
6449
+ color: #6366F1;
6450
+ font-weight: 600;
6451
+ }
6452
+
6389
6453
  .btn-icon-launch {
6390
6454
  width: 36px;
6391
6455
  height: 36px;
@@ -14130,6 +14194,9 @@ input.toggle-switch:focus {
14130
14194
  .compare-agent-header.is-winner .agent-icon[data-agent="gemini"] { color: #4285f4; }
14131
14195
  .compare-agent-header.is-winner .agent-icon[data-agent="gemini"] ~ .agent-name { color: #4285f4; }
14132
14196
 
14197
+ .compare-agent-header.is-winner .agent-icon[data-agent="bob"] { color: #6366F1; }
14198
+ .compare-agent-header.is-winner .agent-icon[data-agent="bob"] ~ .agent-name { color: #6366F1; }
14199
+
14133
14200
  .compare-agent-header .agent-name {
14134
14201
  font-size: 14px;
14135
14202
  font-weight: 700;
@@ -14968,7 +15035,7 @@ input.toggle-switch:focus {
14968
15035
  /* Judge Agent Selector - Enhanced */
14969
15036
  .judge-agent-selector {
14970
15037
  display: grid;
14971
- grid-template-columns: repeat(3, 1fr);
15038
+ grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
14972
15039
  gap: 12px;
14973
15040
  }
14974
15041
 
@@ -15010,6 +15077,10 @@ input.toggle-switch:focus {
15010
15077
  background: radial-gradient(circle at center, rgba(66, 133, 244, 0.15) 0%, transparent 70%);
15011
15078
  }
15012
15079
 
15080
+ .judge-agent-btn[data-agent="bob"] .agent-card-glow {
15081
+ background: radial-gradient(circle at center, rgba(99, 102, 241, 0.15) 0%, transparent 70%);
15082
+ }
15083
+
15013
15084
  .judge-agent-btn:hover .agent-card-glow {
15014
15085
  opacity: 0.5;
15015
15086
  }
@@ -15046,6 +15117,11 @@ input.toggle-switch:focus {
15046
15117
  box-shadow: 0 4px 16px rgba(66, 133, 244, 0.25);
15047
15118
  }
15048
15119
 
15120
+ .judge-agent-btn[data-agent="bob"].selected {
15121
+ border-color: #6366F1;
15122
+ box-shadow: 0 4px 16px rgba(99, 102, 241, 0.25);
15123
+ }
15124
+
15049
15125
  .judge-agent-icon {
15050
15126
  width: 32px;
15051
15127
  height: 32px;
@@ -15075,6 +15151,10 @@ input.toggle-switch:focus {
15075
15151
  color: #4285f4;
15076
15152
  }
15077
15153
 
15154
+ .judge-agent-btn[data-agent="bob"] .judge-agent-icon {
15155
+ color: #6366F1;
15156
+ }
15157
+
15078
15158
  .judge-agent-btn:hover .judge-agent-icon,
15079
15159
  .judge-agent-btn.selected .judge-agent-icon {
15080
15160
  transform: scale(1.1);
@@ -15396,6 +15476,7 @@ input.toggle-switch:focus {
15396
15476
  .timeline-agent[data-agent="claude"] .timeline-agent-icon { color: #D97757; }
15397
15477
  .timeline-agent[data-agent="codex"] .timeline-agent-icon { color: #10a37f; }
15398
15478
  .timeline-agent[data-agent="gemini"] .timeline-agent-icon { color: #4285f4; }
15479
+ .timeline-agent[data-agent="bob"] .timeline-agent-icon { color: #6366F1; }
15399
15480
 
15400
15481
  .timeline-time {
15401
15482
  font-size: 12px;
@@ -15914,6 +15995,11 @@ input.toggle-switch:focus {
15914
15995
  color: #4285f4;
15915
15996
  }
15916
15997
 
15998
+ .judgment-judge[data-agent="bob"] .judgment-agent-icon,
15999
+ .judgment-winner[data-agent="bob"] .judgment-agent-icon {
16000
+ color: #6366F1;
16001
+ }
16002
+
15917
16003
  .judgment-actions {
15918
16004
  /* Keep this as a normal table-cell so vertical alignment works consistently.
15919
16005
  Use margins for spacing instead of flex layout on the <td>. */
@@ -16379,6 +16465,11 @@ input.toggle-switch:focus {
16379
16465
  color: #4285f4;
16380
16466
  }
16381
16467
 
16468
+ .variant-feedback-agent[data-agent="bob"] .variant-agent-icon {
16469
+ background: rgba(99, 102, 241, 0.15);
16470
+ color: #6366F1;
16471
+ }
16472
+
16382
16473
  .variant-winner-badge {
16383
16474
  display: inline-flex;
16384
16475
  align-items: center;
@@ -19417,6 +19508,10 @@ body.task-list-open .task-list-side-trigger {
19417
19508
  color: #4285f4;
19418
19509
  }
19419
19510
 
19511
+ .model-provider-logo[data-agent="bob"] {
19512
+ color: #6366F1;
19513
+ }
19514
+
19420
19515
  .model-provider-name {
19421
19516
  font-weight: 600;
19422
19517
  font-size: 14px;
@@ -20255,6 +20350,11 @@ body.task-list-open .task-list-side-trigger {
20255
20350
  background: rgba(66, 133, 244, 0.1);
20256
20351
  }
20257
20352
 
20353
+ .vgm-variant-icon[data-agent="bob"] {
20354
+ color: #6366F1;
20355
+ background: rgba(99, 102, 241, 0.1);
20356
+ }
20357
+
20258
20358
  /* Variant info */
20259
20359
  .vgm-variant-info {
20260
20360
  flex: 1;
@@ -39,8 +39,16 @@
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=78"></script>
42
+ <script type="module" src="task.js?v=79"></script>
43
43
  <!-- Dev QA shortcut: Ctrl+Shift+Q to launch current page in QA mode -->
44
+ <style>
45
+ .agent-card.agent-disabled {
46
+ display: none;
47
+ }
48
+ .judge-agent-btn.agent-disabled {
49
+ display: none;
50
+ }
51
+ </style>
44
52
  </head>
45
53
  <body>
46
54
  <button id="task-list-side-trigger" class="task-list-side-trigger" title="Browse other tasks">
@@ -1318,6 +1326,17 @@
1318
1326
  <div class="agent-count-badge" id="resubmit-gemini-count-display">0</div>
1319
1327
  <input type="number" min="0" max="5" step="1" id="resubmit-gemini-count" value="0" hidden readonly aria-label="Number of Gemini containers">
1320
1328
  </div>
1329
+ <div class="agent-card" data-agent="bob" data-count="0">
1330
+ <button type="button" class="agent-btn-decrement" data-counter="down" aria-label="Decrease Bob count" title="Remove Bob">−</button>
1331
+ <div class="agent-icon" role="button" tabindex="0" aria-label="Bob" title="Bob (click to add, right-click to remove)">
1332
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round">
1333
+ <rect x="3.5" y="10.5" width="17" height="12" rx="3"></rect><circle cx="9" cy="15.5" r="2" fill="currentColor" stroke="none"></circle><circle cx="15" cy="15.5" r="2" fill="currentColor" stroke="none"></circle><path d="M10 20q2 1.2 4 0"></path><path d="M3.5 14.5a1.5 1.5 0 0 0 0 3" stroke-width="1.7"></path><path d="M20.5 14.5a1.5 1.5 0 0 1 0 3" stroke-width="1.7"></path><path d="M2 10.5h20" stroke-width="2.5"></path><path d="M5 10.5V8c0-3 3.2-5.5 7-5.5s7 2.5 7 5.5v2.5" stroke-width="1.7"></path><path d="M5 7.5h14" stroke-width="1.2"></path>
1334
+ </svg>
1335
+ </div>
1336
+ <button type="button" class="agent-btn-increment" data-counter="up" aria-label="Increase Bob count" title="Add Bob">+</button>
1337
+ <div class="agent-count-badge" id="resubmit-bob-count-display">0</div>
1338
+ <input type="number" min="0" max="5" step="1" id="resubmit-bob-count" value="0" hidden readonly aria-label="Number of Bob containers">
1339
+ </div>
1321
1340
  </div>
1322
1341
 
1323
1342
  <!-- Agent Selection Hint -->
@@ -1443,6 +1462,17 @@
1443
1462
  <div class="agent-count-badge" id="save-objective-gemini-count-display">0</div>
1444
1463
  <input type="number" min="0" max="5" step="1" id="save-objective-gemini-count" value="0" hidden readonly aria-label="Number of Gemini agents">
1445
1464
  </div>
1465
+ <div class="agent-card" data-agent="bob" data-count="0">
1466
+ <button type="button" class="agent-btn-decrement" data-counter="down" aria-label="Decrease Bob count" title="Remove Bob">−</button>
1467
+ <div class="agent-icon" role="button" tabindex="0" aria-label="Bob" title="Bob (click to add, right-click to remove)">
1468
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round">
1469
+ <rect x="3.5" y="10.5" width="17" height="12" rx="3"></rect><circle cx="9" cy="15.5" r="2" fill="currentColor" stroke="none"></circle><circle cx="15" cy="15.5" r="2" fill="currentColor" stroke="none"></circle><path d="M10 20q2 1.2 4 0"></path><path d="M3.5 14.5a1.5 1.5 0 0 0 0 3" stroke-width="1.7"></path><path d="M20.5 14.5a1.5 1.5 0 0 1 0 3" stroke-width="1.7"></path><path d="M2 10.5h20" stroke-width="2.5"></path><path d="M5 10.5V8c0-3 3.2-5.5 7-5.5s7 2.5 7 5.5v2.5" stroke-width="1.7"></path><path d="M5 7.5h14" stroke-width="1.2"></path>
1470
+ </svg>
1471
+ </div>
1472
+ <button type="button" class="agent-btn-increment" data-counter="up" aria-label="Increase Bob count" title="Add Bob">+</button>
1473
+ <div class="agent-count-badge" id="save-objective-bob-count-display">0</div>
1474
+ <input type="number" min="0" max="5" step="1" id="save-objective-bob-count" value="0" hidden readonly aria-label="Number of Bob agents">
1475
+ </div>
1446
1476
  </div>
1447
1477
  <div class="agent-hint" id="save-objective-agent-hint" data-visible="true">
1448
1478
  <span class="agent-hint-arrow">&larr;</span>
@@ -1901,6 +1931,21 @@
1901
1931
  </svg>
1902
1932
  </span>
1903
1933
  </button>
1934
+ <button class="judge-agent-btn" data-agent="bob" title="Bob - IBM's AI Assistant">
1935
+ <div class="agent-card-glow"></div>
1936
+ <span class="judge-agent-icon">
1937
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round">
1938
+ <rect x="3.5" y="10.5" width="17" height="12" rx="3"></rect><circle cx="9" cy="15.5" r="2" fill="currentColor" stroke="none"></circle><circle cx="15" cy="15.5" r="2" fill="currentColor" stroke="none"></circle><path d="M10 20q2 1.2 4 0"></path><path d="M3.5 14.5a1.5 1.5 0 0 0 0 3" stroke-width="1.7"></path><path d="M20.5 14.5a1.5 1.5 0 0 1 0 3" stroke-width="1.7"></path><path d="M2 10.5h20" stroke-width="2.5"></path><path d="M5 10.5V8c0-3 3.2-5.5 7-5.5s7 2.5 7 5.5v2.5" stroke-width="1.7"></path><path d="M5 7.5h14" stroke-width="1.2"></path>
1939
+ </svg>
1940
+ </span>
1941
+ <span class="judge-agent-name">Bob</span>
1942
+ <span class="judge-agent-desc">IBM</span>
1943
+ <span class="agent-selection-indicator">
1944
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3">
1945
+ <polyline points="20 6 9 17 4 12"></polyline>
1946
+ </svg>
1947
+ </span>
1948
+ </button>
1904
1949
  </div>
1905
1950
  </div>
1906
1951