@myagentroam/node 0.9.62 → 0.9.65

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 (161) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +4 -0
  3. package/dist/capabilities.js +110 -2
  4. package/dist/claude-agent-sdk.js +330 -2
  5. package/dist/claude-channel.js +44 -2
  6. package/dist/codex-app-server.js +510 -2
  7. package/dist/config.js +106 -2
  8. package/dist/connector/node-connector-options.js +1 -2
  9. package/dist/connector/node-operation-router.js +22 -2
  10. package/dist/connector.js +1736 -2
  11. package/dist/control-outbound-scheduler.js +153 -2
  12. package/dist/database.js +639 -2
  13. package/dist/fake-runner.js +129 -2
  14. package/dist/git-askpass.js +12 -0
  15. package/dist/git-execution-helper.js +266 -0
  16. package/dist/health.js +3 -2
  17. package/dist/main.js +57 -2
  18. package/dist/mcp-installation-model.js +1 -2
  19. package/dist/migrations/v004.js +55 -3
  20. package/dist/migrations/v005.js +13 -3
  21. package/dist/migrations/v006.js +90 -3
  22. package/dist/migrations/v007.js +22 -3
  23. package/dist/migrations/v008.js +18 -3
  24. package/dist/migrations/v009.js +70 -4
  25. package/dist/migrations/v010.js +43 -3
  26. package/dist/migrations/v011.js +20 -3
  27. package/dist/migrations/v012.js +8 -0
  28. package/dist/native-jsonl-reader.js +186 -2
  29. package/dist/native-session-history.js +1143 -2
  30. package/dist/opencode-runtime.js +80 -2
  31. package/dist/opencode-server.js +259 -2
  32. package/dist/operational.js +122 -2
  33. package/dist/process-tree.js +18 -2
  34. package/dist/ripgrep-binary.js +31 -2
  35. package/dist/rotating-log.js +67 -2
  36. package/dist/runner/abstract-runner.js +260 -2
  37. package/dist/runner/claude/managed-run-controller.js +355 -2
  38. package/dist/runner/claude/tool-normalizer.js +120 -2
  39. package/dist/runner/claude-code-runner.js +303 -2
  40. package/dist/runner/codex/composer-image-markers.js +8 -2
  41. package/dist/runner/codex/conversation-parser.js +913 -2
  42. package/dist/runner/codex/managed-run-controller.js +494 -2
  43. package/dist/runner/codex/tool-normalizer.js +214 -2
  44. package/dist/runner/codex-runner.js +585 -2
  45. package/dist/runner/fake-test-runner.js +47 -2
  46. package/dist/runner/mar-agent/conversation-normalizer.js +644 -2
  47. package/dist/runner/mar-agent/executor-stdio-client-transport.js +139 -2
  48. package/dist/runner/mar-agent/generated-images.js +41 -2
  49. package/dist/runner/mar-agent/history-projection.js +106 -2
  50. package/dist/runner/mar-agent/hosted-conversation-runtime.js +446 -2
  51. package/dist/runner/mar-agent/managed-run-controller.js +785 -2
  52. package/dist/runner/mar-agent/mcp-client-pool.js +233 -2
  53. package/dist/runner/mar-agent/runtime-model-factory.js +326 -2
  54. package/dist/runner/mar-agent-runner.js +458 -2
  55. package/dist/runner/opencode/conversation-parser.js +221 -2
  56. package/dist/runner/opencode/managed-run-controller.js +588 -2
  57. package/dist/runner/opencode/tool-normalizer.js +80 -2
  58. package/dist/runner/opencode-runner.js +426 -2
  59. package/dist/runner/runner-registry.js +87 -2
  60. package/dist/runner-command-engine.js +71 -2
  61. package/dist/runner-profiles.js +323 -2
  62. package/dist/runner-usage.js +190 -2
  63. package/dist/runtime-command-detector.js +73 -2
  64. package/dist/runtime-model.js +1 -2
  65. package/dist/runtime-state.js +1509 -2
  66. package/dist/service/attachment-domain-state.js +7 -2
  67. package/dist/service/bubblewrap-sandbox-executor.js +543 -2
  68. package/dist/service/continuous-run-coordinator.js +425 -2
  69. package/dist/service/conversation-history-service.js +552 -2
  70. package/dist/service/conversation-hosting-capability-service.js +61 -2
  71. package/dist/service/conversation-hosting-enablement-service.js +91 -2
  72. package/dist/service/conversation-hosting-maintenance-service.js +174 -2
  73. package/dist/service/conversation-segment-service.js +162 -2
  74. package/dist/service/conversation-template-node-service.js +992 -2
  75. package/dist/service/external-session-resume-service.js +152 -2
  76. package/dist/service/fake-managed-run-service.js +60 -2
  77. package/dist/service/git-execution-service.js +418 -0
  78. package/dist/service/git-operation-service.js +57 -0
  79. package/dist/service/hosted-conversation-node-service.js +1982 -2
  80. package/dist/service/hosted-conversation-store.js +1405 -2
  81. package/dist/service/managed-runner-session-service.js +35 -2
  82. package/dist/service/mar-agent-model-transport-test-service.js +88 -2
  83. package/dist/service/mcp-installation-verifier.js +87 -2
  84. package/dist/service/mcp-node-operation-service.js +90 -2
  85. package/dist/service/mission-mcp-server.js +124 -2
  86. package/dist/service/mission-mcp-stdio.js +40 -2
  87. package/dist/service/mission-runtime.js +142 -2
  88. package/dist/service/native-session-projection-service.js +274 -2
  89. package/dist/service/native-session-watch-service.js +683 -2
  90. package/dist/service/node-connection-lifecycle-service.js +88 -2
  91. package/dist/service/node-control-channel.js +85 -2
  92. package/dist/service/node-control-message-service.js +109 -2
  93. package/dist/service/node-request-service.js +62 -2
  94. package/dist/service/node-run-event-bridge.js +88 -2
  95. package/dist/service/node-terminal-channel.js +202 -2
  96. package/dist/service/node-upgrade-coordinator.js +137 -2
  97. package/dist/service/node-workspace-coordinator.js +97 -2
  98. package/dist/service/recent-run-projection-service.js +99 -2
  99. package/dist/service/run-attachment-service.js +321 -2
  100. package/dist/service/run-domain-state.js +4 -2
  101. package/dist/service/run-event-service.js +246 -2
  102. package/dist/service/run-ownership-policy.js +22 -2
  103. package/dist/service/run-workbench-service.js +120 -2
  104. package/dist/service/runner-channel-message-service.js +20 -2
  105. package/dist/service/runner-interaction-service.js +243 -2
  106. package/dist/service/runner-service.js +69 -2
  107. package/dist/service/runtime-credential-control-service.js +95 -2
  108. package/dist/service/session-catalog-service.js +404 -2
  109. package/dist/service/session-command-service.js +125 -2
  110. package/dist/service/session-context-service.js +128 -2
  111. package/dist/service/session-domain-state.js +9 -2
  112. package/dist/service/session-identity-service.js +86 -2
  113. package/dist/service/session-lifecycle-service.js +248 -2
  114. package/dist/service/session-message-service.js +270 -2
  115. package/dist/service/session-presentation-service.js +43 -2
  116. package/dist/service/session-query-service.js +82 -2
  117. package/dist/service/session-watch-slot-coordinator.js +21 -2
  118. package/dist/service/skill-directory-service.js +238 -2
  119. package/dist/service/skill-install-service.js +434 -2
  120. package/dist/service/skill-node-operation-service.js +206 -2
  121. package/dist/service/terminal-relay-state.js +3 -2
  122. package/dist/service/terminal-service.js +90 -2
  123. package/dist/service/web-search-error.js +40 -2
  124. package/dist/service/workbench-event-service.js +21 -2
  125. package/dist/service/workbench-manifest-service.js +69 -2
  126. package/dist/service/workspace-change-service.js +290 -2
  127. package/dist/service/workspace-content-search-service.js +457 -2
  128. package/dist/service/workspace-domain-state.js +41 -2
  129. package/dist/service/workspace-file-service.js +150 -2
  130. package/dist/service/workspace-git-exclude-service.js +119 -2
  131. package/dist/service/workspace-queue-workbench-service.js +176 -2
  132. package/dist/service/workspace-service.js +92 -2
  133. package/dist/service/workspace-session-service.js +154 -2
  134. package/dist/service/workspace-upload-service.js +262 -2
  135. package/dist/service/workspace-watch-controller.js +68 -2
  136. package/dist/service/workspace-watch-service.js +170 -2
  137. package/dist/service/workspace-watch-snapshot-service.js +218 -2
  138. package/dist/service/workspace-workbench-service.js +239 -2
  139. package/dist/service.js +91 -2
  140. package/dist/storage.js +32 -2
  141. package/dist/supervisor.js +136 -2
  142. package/dist/terminal.js +496 -2
  143. package/dist/util/git-credential-client.js +32 -0
  144. package/dist/util/node-operation-data.js +9 -2
  145. package/dist/util/node-operation-parsers.js +382 -2
  146. package/dist/util/personal-instructions.js +34 -2
  147. package/dist/util/runner-error.js +70 -2
  148. package/dist/util/runner-native-session-parsers.js +510 -2
  149. package/dist/util/safe-error.js +8 -2
  150. package/dist/util/secret-environment.js +25 -2
  151. package/dist/workspace.js +1793 -2
  152. package/package.json +11 -8
  153. package/vendor/ripgrep/darwin-arm64/rg +0 -0
  154. package/vendor/ripgrep/darwin-x64/rg +0 -0
  155. package/vendor/ripgrep/manifest.json +12 -0
  156. package/README.md +0 -42
  157. package/dist/event-buffer.js +0 -2
  158. package/dist/migrations/v001.js +0 -107
  159. package/dist/migrations/v002.js +0 -2
  160. package/dist/migrations/v003.js +0 -2
  161. package/dist/service/mcp-package-installer.js +0 -2
@@ -1,2 +1,153 @@
1
- /* mar-release-protected */
2
- const _0x5c87e7=_0x1286;(function(_0x4c0cf8,_0x14e45c){const _0x363a5a=_0x1286,_0x2f42de=_0x4c0cf8();while(!![]){try{const _0x8c7aaf=parseInt(_0x363a5a(0x1bd))/(0x1e50+0x1a26+0x3875*-0x1)*(parseInt(_0x363a5a(0x19f))/(-0x7*0x469+-0x3*0x5ae+0x2feb*0x1))+-parseInt(_0x363a5a(0x194))/(-0x1cf*-0x4+0x230c+0xe17*-0x3)*(-parseInt(_0x363a5a(0x1b1))/(-0x1bf1+0x8de+-0x65d*-0x3))+-parseInt(_0x363a5a(0x199))/(-0xea8+-0x2526*-0x1+-0x1679)*(parseInt(_0x363a5a(0x197))/(0x1*-0x1cbe+-0x25d0+-0x1*-0x4294))+-parseInt(_0x363a5a(0x1bb))/(0x2681+-0xfb+0x257f*-0x1)+-parseInt(_0x363a5a(0x1a6))/(-0x1*-0x15c5+0x1afc+-0x30b9)+parseInt(_0x363a5a(0x1ad))/(-0x1b7d+0x7e1*-0x3+0x74f*0x7)+parseInt(_0x363a5a(0x1a7))/(0x71*-0x47+0x8d7*0x1+0x168a);if(_0x8c7aaf===_0x14e45c)break;else _0x2f42de['push'](_0x2f42de['shift']());}catch(_0x33ac60){_0x2f42de['push'](_0x2f42de['shift']());}}}(_0x2bfe,-0x11c3*-0x36+-0x1*0x113b38+0x18852f));import{nodeLog}from'./operational.js';function _0x1286(_0x5a2d58,_0x13fc43){_0x5a2d58=_0x5a2d58-(-0xbfd+-0x1e9+-0x527*-0x3);const _0xcbd419=_0x2bfe();let _0x478ab6=_0xcbd419[_0x5a2d58];if(_0x1286['iRKbuk']===undefined){var _0x5e5436=function(_0x5da5fe){const _0x3528d0='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xa5949e='',_0x11e7af='';for(let _0x13dc80=-0x26c4+0x312+0x23b2,_0xf46b96,_0x127f75,_0x2be99c=0x594+-0x4*0x162+-0x2*0x6;_0x127f75=_0x5da5fe['charAt'](_0x2be99c++);~_0x127f75&&(_0xf46b96=_0x13dc80%(-0x1dd3+-0x128*-0x1e+-0x4d9)?_0xf46b96*(0xabf+0xf82+0x1a01*-0x1)+_0x127f75:_0x127f75,_0x13dc80++%(0x87b+-0x539+-0x53*0xa))?_0xa5949e+=String['fromCharCode'](0x17b8+0x2*0x78b+-0x25cf*0x1&_0xf46b96>>(-(-0x2f*-0xd+0x263c+-0x25*0x119)*_0x13dc80&0x1*0x1fb7+-0x1*-0x1f81+-0x3f32)):-0x1*0x7b7+0x1*0x1dec+-0x1635){_0x127f75=_0x3528d0['indexOf'](_0x127f75);}for(let _0x3f2a7b=0x451*-0x4+0x2182+-0x103e,_0x47f2f0=_0xa5949e['length'];_0x3f2a7b<_0x47f2f0;_0x3f2a7b++){_0x11e7af+='%'+('00'+_0xa5949e['charCodeAt'](_0x3f2a7b)['toString'](0x2*-0x702+-0x8*-0x2ba+0x3de*-0x2))['slice'](-(-0x2440+-0x3e7+0x1*0x2829));}return decodeURIComponent(_0x11e7af);};_0x1286['vXtfza']=_0x5e5436,_0x1286['AbzHLX']={},_0x1286['iRKbuk']=!![];}const _0x35dd48=_0xcbd419[-0x18e3+-0x1a48+0x332b];_0x1286['mNkRDj']!==_0x35dd48&&(_0x1286['AbzHLX']={},_0x1286['mNkRDj']=_0x35dd48);const _0x17fbac=_0x1286['AbzHLX'][_0x5a2d58];return _0x17fbac===undefined?(_0x478ab6=_0x1286['vXtfza'](_0x478ab6),_0x1286['AbzHLX'][_0x5a2d58]=_0x478ab6):_0x478ab6=_0x17fbac,_0x478ab6;}const MAX_FRAMES_PER_TURN=-0x13e9+0x594+-0x1*-0xe75,MAX_BYTES_PER_TURN=(0xad5+-0x74b*0x1+-0x41*0xa)*(-0x7*0x121+0xabf+0x128*0x1),SOCKET_NORMAL_DIRECT_WATER_BYTES=(0x87b+-0x539+-0x22*0x11)*(0x17b8+0x2*0x78b+-0x32a*0xb),SOCKET_HIGH_WATER_BYTES=(-0x2f*-0xd+0x263c+-0xf*0x271)*(0x1*0x1fb7+-0x1*-0x1f81+-0x3b38),BACKPRESSURE_RETRY_MS=-0x1*0x7b7+0x1*0x1dec+-0x1630,OUTBOUND_QUEUE_TTL_MS=0x6797*-0x1+0xc90a+0x13bd;export class ControlOutboundScheduler{[_0x5c87e7(0x1b3)];[_0x5c87e7(0x1bc)];[_0x5c87e7(0x1a3)]=[];[_0x5c87e7(0x1a8)]=[];[_0x5c87e7(0x1b7)]=![];[_0x5c87e7(0x19d)];[_0x5c87e7(0x1a2)];[_0x5c87e7(0x1a1)];[_0x5c87e7(0x1a9)]=![];[_0x5c87e7(0x1a4)]=0x2*-0x702+-0x8*-0x2ba+0x7cc*-0x1;[_0x5c87e7(0x198)]=-0x2440+-0x3e7+0x1*0x2827;constructor(_0x4e0482,_0x1c8f84=()=>undefined){const _0x4005ae=_0x5c87e7;this[_0x4005ae(0x1b3)]=_0x4e0482,this[_0x4005ae(0x1bc)]=_0x1c8f84;}[_0x5c87e7(0x19c)](_0x4a49a5,_0x4c1073){const _0x438e85=_0x5c87e7,_0x10f9ab=this[_0x438e85(0x1b3)](),_0x29cec8=_0x10f9ab?.[_0x438e85(0x1ab)]??-0x18e3+-0x1a48+0x332b;if(_0x10f9ab!==undefined&&_0x10f9ab[_0x438e85(0x1b6)]===0x22d0+0x16b3*-0x1+-0x32*0x3e&&this[_0x438e85(0x1a3)][_0x438e85(0x19a)]===0x25a8+0x47c+-0x2a24&&(_0x4c1073===_0x438e85(0x1a3)||this[_0x438e85(0x1a8)][_0x438e85(0x19a)]===-0x1a8e+-0x988*0x4+0x40ae*0x1)&&_0x29cec8<=SOCKET_NORMAL_DIRECT_WATER_BYTES){_0x10f9ab[_0x438e85(0x19e)](JSON[_0x438e85(0x191)](_0x4a49a5));return;}(_0x4c1073===_0x438e85(0x1a3)?this[_0x438e85(0x1a3)]:this[_0x438e85(0x1a8)])[_0x438e85(0x1a5)]({'envelope':_0x4a49a5,'expiresAt':Date[_0x438e85(0x1b5)]()+OUTBOUND_QUEUE_TTL_MS}),this[_0x438e85(0x1a4)]=Math[_0x438e85(0x193)](this[_0x438e85(0x1a4)],this[_0x438e85(0x1a3)][_0x438e85(0x19a)]),this[_0x438e85(0x198)]=Math[_0x438e85(0x193)](this[_0x438e85(0x198)],this[_0x438e85(0x1a8)][_0x438e85(0x19a)]),this[_0x438e85(0x1b9)](),this[_0x438e85(0x195)]();}[_0x5c87e7(0x1b0)](){const _0x4b7fb0=_0x5c87e7;this[_0x4b7fb0(0x1a3)][_0x4b7fb0(0x19a)]=0x1d*0x5b+0x1efa+-0x2949,this[_0x4b7fb0(0x1a8)][_0x4b7fb0(0x19a)]=-0xdf7+0xf9a*-0x1+-0x1d*-0x105,this[_0x4b7fb0(0x1b7)]=![];if(this[_0x4b7fb0(0x19d)]!==undefined)clearTimeout(this[_0x4b7fb0(0x19d)]);this[_0x4b7fb0(0x19d)]=undefined;if(this[_0x4b7fb0(0x1a2)]!==undefined)clearTimeout(this[_0x4b7fb0(0x1a2)]);this[_0x4b7fb0(0x1a2)]=undefined,this[_0x4b7fb0(0x1b4)](_0x4b7fb0(0x1b0));}[_0x5c87e7(0x195)](){const _0x3e1aaf=_0x5c87e7;if(this[_0x3e1aaf(0x1b7)]||this[_0x3e1aaf(0x19d)]!==undefined)return;this[_0x3e1aaf(0x1b7)]=!![],setImmediate(()=>this[_0x3e1aaf(0x1ae)]());}[_0x5c87e7(0x1ae)](){const _0x2a0115=_0x5c87e7;this[_0x2a0115(0x1b7)]=![];const _0x143b16=this[_0x2a0115(0x1b3)]();if(_0x143b16===undefined||_0x143b16[_0x2a0115(0x1b6)]!==0x591+0x1531+0x2f9*-0x9)return;if((_0x143b16[_0x2a0115(0x1ab)]??-0x1712+-0x23a1+0x3ab3)>SOCKET_HIGH_WATER_BYTES){this[_0x2a0115(0x1b2)](_0x143b16,_0x2a0115(0x1a3));return;}let _0x172cc7=0x1907+-0xb5*0x1d+0x3*-0x182,_0x5d6aac=-0x2445+-0x16*-0x14+0x6e9*0x5;while(_0x172cc7<MAX_FRAMES_PER_TURN){const _0x30387b=this[_0x2a0115(0x1a3)][_0x2a0115(0x19a)]>0x148+0x3ce+-0x516?this[_0x2a0115(0x1a3)]:this[_0x2a0115(0x1a8)],_0x3b315f=_0x30387b[0xb*-0x36+0x1*0x217e+-0x1f2c];if(_0x3b315f===undefined)break;if(_0x30387b===this[_0x2a0115(0x1a8)]&&(_0x143b16[_0x2a0115(0x1ab)]??0x2115+-0x192e*0x1+-0x7e7)>SOCKET_NORMAL_DIRECT_WATER_BYTES){this[_0x2a0115(0x1b2)](_0x143b16,_0x2a0115(0x1a8));return;}const _0x358abf=JSON[_0x2a0115(0x191)](_0x3b315f[_0x2a0115(0x1ba)]),_0x27c707=Buffer[_0x2a0115(0x1a0)](_0x358abf);if(_0x172cc7>0x3b2+-0x2061+0x1caf&&_0x5d6aac+_0x27c707>MAX_BYTES_PER_TURN)break;_0x30387b[_0x2a0115(0x1b8)](),_0x143b16[_0x2a0115(0x19e)](_0x358abf),_0x172cc7+=0xb00+-0xae8+-0x17,_0x5d6aac+=_0x27c707;if((_0x143b16[_0x2a0115(0x1ab)]??-0x240+0x1923+-0x16e3)>SOCKET_HIGH_WATER_BYTES)break;}if(this[_0x2a0115(0x1a3)][_0x2a0115(0x19a)]>-0x12c3+0x15bc+-0x2f9||this[_0x2a0115(0x1a8)][_0x2a0115(0x19a)]>0x1d*0x107+-0xfe3+-0x2*0x6f4)this[_0x2a0115(0x195)]();else{if(this[_0x2a0115(0x1a2)]!==undefined)clearTimeout(this[_0x2a0115(0x1a2)]);this[_0x2a0115(0x1a2)]=undefined,this[_0x2a0115(0x1b4)](_0x2a0115(0x1ac));}}[_0x5c87e7(0x1b2)](_0x4ed53a,_0x48c189){const _0x4589b2=_0x5c87e7;this[_0x4589b2(0x1a1)]??=Date[_0x4589b2(0x1b5)](),!this[_0x4589b2(0x1a9)]&&Date[_0x4589b2(0x1b5)]()-this[_0x4589b2(0x1a1)]>=0x541+0x9a9*-0x1+0xd*0x6a&&(this[_0x4589b2(0x1a9)]=!![],nodeLog(_0x4589b2(0x18f),{'level':_0x48c189,'bufferedBytes':_0x4ed53a[_0x4589b2(0x1ab)],'highDepth':this[_0x4589b2(0x1a3)][_0x4589b2(0x19a)],'normalDepth':this[_0x4589b2(0x1a8)][_0x4589b2(0x19a)]})),this[_0x4589b2(0x19d)]=setTimeout(()=>{const _0x84b7d6=_0x4589b2;this[_0x84b7d6(0x19d)]=undefined,this[_0x84b7d6(0x195)]();},BACKPRESSURE_RETRY_MS);}[_0x5c87e7(0x1b4)](_0x2ffb53){const _0xb59b56=_0x5c87e7;if(this[_0xb59b56(0x1a9)])nodeLog(_0xb59b56(0x19b),{'reason':_0x2ffb53,'durationMs':Date[_0xb59b56(0x1b5)]()-(this[_0xb59b56(0x1a1)]??Date[_0xb59b56(0x1b5)]()),'maximumHighDepth':this[_0xb59b56(0x1a4)],'maximumNormalDepth':this[_0xb59b56(0x198)]});this[_0xb59b56(0x1a1)]=undefined,this[_0xb59b56(0x1a9)]=![],this[_0xb59b56(0x1a4)]=0x641+0x9*0x265+-0x1*0x1bce,this[_0xb59b56(0x198)]=0x1*0x1136+0x1*0x1ea2+-0x2fd8;}[_0x5c87e7(0x1b9)](){const _0x3357be=_0x5c87e7;if(this[_0x3357be(0x1a2)]!==undefined)return;const _0x42ac2c=Math[_0x3357be(0x192)](this[_0x3357be(0x1a3)][0x1b99+0x10db*0x1+0x1*-0x2c74]?.[_0x3357be(0x190)]??Number[_0x3357be(0x196)],this[_0x3357be(0x1a8)][0xa91+0x455*-0x9+0xe36*0x2]?.[_0x3357be(0x190)]??Number[_0x3357be(0x196)]);if(!Number[_0x3357be(0x1af)](_0x42ac2c))return;this[_0x3357be(0x1a2)]=setTimeout(()=>{const _0x233906=_0x3357be;this[_0x233906(0x1a2)]=undefined;if((this[_0x233906(0x1a3)][-0x9ea*0x3+-0x22e4+0x40a2]?.[_0x233906(0x190)]??Number[_0x233906(0x196)])>Date[_0x233906(0x1b5)]()&&(this[_0x233906(0x1a8)][-0x14c1+0xa09+0xab8]?.[_0x233906(0x190)]??Number[_0x233906(0x196)])>Date[_0x233906(0x1b5)]()){this[_0x233906(0x1b9)]();return;}this[_0x233906(0x1b0)](),this[_0x233906(0x1bc)]();},Math[_0x3357be(0x193)](0xc1b+0x2*0x609+-0x182d,_0x42ac2c-Date[_0x3357be(0x1b5)]())),this[_0x3357be(0x1a2)][_0x3357be(0x1aa)]();}}function _0x2bfe(){const _0xfc904a=['mJy0nZq1nNP6vxfjyG','mJu0odeWq29ZBvnt','BM9YBwfS','yMfJA3bYzxnZDxjLtg9Nz2vK','Dw5Yzwy','yNvMzMvYzwrbBw91BNq','zhjHAw5Lza','mta0ndq1ntryzgvVquy','zMX1C2G','AxngAw5PDgu','CMvZzxq','otq4nhfYEw9kBq','D2fPDezVCKjHy2TWCMvZC3vYzq','C29JA2v0','zMLUAxnOqMfJA3bYzxnZDxjL','BM93','CMvHzhLtDgf0zq','C2nOzwr1BgvK','C2HPzNq','C2nOzwr1BgvfEhbPCNK','zw52zwXVCgu','nJK0ody1nurLuNDIuW','B25fEhbPCMvK','mwrxzNbmrW','y29UDhjVBc5VDxrIB3vUzc5IywnRChjLC3n1CMu','zxHWAxjLC0f0','C3rYAw5NAwz5','BwLU','Bwf4','mti2m253Eurwyq','C2nOzwr1Bgu','ue9tsvrjvKvFsu5gsu5jvfK','nZe0re10wxPg','Bwf4Aw11Bu5VCM1HBerLChrO','nZC2mgzqyvbIsG','BgvUz3rO','y29UDhjVBc5VDxrIB3vUzc5IywnRChjLC3n1CMuUCMvJB3zLCMvK','zw5XDwv1zq','CMv0CNLuAw1LCG','C2vUza','otq2nJrhwu9rruS','yNL0zuXLBMD0Aa','yMfJA3bYzxnZDxjLu3rHCNrLzef0','zxHWAxj5vgLTzxi','AgLNAa','Bwf4Aw11BuHPz2Hezxb0Aa','ChvZAa'];_0x2bfe=function(){return _0xfc904a;};return _0x2bfe();}
1
+ import { nodeLog } from './operational.js';
2
+ const MAX_FRAMES_PER_TURN = 32;
3
+ const MAX_BYTES_PER_TURN = 256 * 1024;
4
+ const SOCKET_NORMAL_DIRECT_WATER_BYTES = 256 * 1024;
5
+ const SOCKET_HIGH_WATER_BYTES = 1024 * 1024;
6
+ const BACKPRESSURE_RETRY_MS = 5;
7
+ const OUTBOUND_QUEUE_TTL_MS = 30_000;
8
+ /** Keeps control responses responsive while reliable Workbench events are busy. */
9
+ export class ControlOutboundScheduler {
10
+ socket;
11
+ onExpired;
12
+ high = [];
13
+ normal = [];
14
+ scheduled = false;
15
+ retryTimer;
16
+ expiryTimer;
17
+ backpressureStartedAt;
18
+ backpressureLogged = false;
19
+ maximumHighDepth = 0;
20
+ maximumNormalDepth = 0;
21
+ constructor(socket, onExpired = () => undefined) {
22
+ this.socket = socket;
23
+ this.onExpired = onExpired;
24
+ }
25
+ enqueue(envelope, priority) {
26
+ const socket = this.socket();
27
+ const bufferedAmount = socket?.bufferedAmount ?? 0;
28
+ if (socket !== undefined &&
29
+ socket.readyState === 1 &&
30
+ this.high.length === 0 &&
31
+ (priority === 'high' || this.normal.length === 0) &&
32
+ bufferedAmount <= SOCKET_NORMAL_DIRECT_WATER_BYTES) {
33
+ socket.send(JSON.stringify(envelope));
34
+ return;
35
+ }
36
+ (priority === 'high' ? this.high : this.normal).push({
37
+ envelope,
38
+ expiresAt: Date.now() + OUTBOUND_QUEUE_TTL_MS
39
+ });
40
+ this.maximumHighDepth = Math.max(this.maximumHighDepth, this.high.length);
41
+ this.maximumNormalDepth = Math.max(this.maximumNormalDepth, this.normal.length);
42
+ this.scheduleExpiry();
43
+ this.schedule();
44
+ }
45
+ reset() {
46
+ this.high.length = 0;
47
+ this.normal.length = 0;
48
+ this.scheduled = false;
49
+ if (this.retryTimer !== undefined)
50
+ clearTimeout(this.retryTimer);
51
+ this.retryTimer = undefined;
52
+ if (this.expiryTimer !== undefined)
53
+ clearTimeout(this.expiryTimer);
54
+ this.expiryTimer = undefined;
55
+ this.finishBackpressure('reset');
56
+ }
57
+ schedule() {
58
+ if (this.scheduled || this.retryTimer !== undefined)
59
+ return;
60
+ this.scheduled = true;
61
+ setImmediate(() => this.flush());
62
+ }
63
+ flush() {
64
+ this.scheduled = false;
65
+ const socket = this.socket();
66
+ if (socket === undefined || socket.readyState !== 1)
67
+ return;
68
+ if ((socket.bufferedAmount ?? 0) > SOCKET_HIGH_WATER_BYTES) {
69
+ this.waitForBackpressure(socket, 'high');
70
+ return;
71
+ }
72
+ let frames = 0;
73
+ let bytes = 0;
74
+ while (frames < MAX_FRAMES_PER_TURN) {
75
+ const queue = this.high.length > 0 ? this.high : this.normal;
76
+ const queued = queue[0];
77
+ if (queued === undefined)
78
+ break;
79
+ // High-frequency Workbench events can arrive in bursts. Stop normal traffic early so a later
80
+ // HTTP/control response keeps WebSocket buffer headroom instead of waiting behind the burst.
81
+ if (queue === this.normal &&
82
+ (socket.bufferedAmount ?? 0) > SOCKET_NORMAL_DIRECT_WATER_BYTES) {
83
+ this.waitForBackpressure(socket, 'normal');
84
+ return;
85
+ }
86
+ const serialized = JSON.stringify(queued.envelope);
87
+ const size = Buffer.byteLength(serialized);
88
+ if (frames > 0 && bytes + size > MAX_BYTES_PER_TURN)
89
+ break;
90
+ queue.shift();
91
+ socket.send(serialized);
92
+ frames += 1;
93
+ bytes += size;
94
+ if ((socket.bufferedAmount ?? 0) > SOCKET_HIGH_WATER_BYTES)
95
+ break;
96
+ }
97
+ if (this.high.length > 0 || this.normal.length > 0)
98
+ this.schedule();
99
+ else {
100
+ if (this.expiryTimer !== undefined)
101
+ clearTimeout(this.expiryTimer);
102
+ this.expiryTimer = undefined;
103
+ this.finishBackpressure('drained');
104
+ }
105
+ }
106
+ waitForBackpressure(socket, level) {
107
+ this.backpressureStartedAt ??= Date.now();
108
+ if (!this.backpressureLogged && Date.now() - this.backpressureStartedAt >= 250) {
109
+ this.backpressureLogged = true;
110
+ nodeLog('control.outbound.backpressure', {
111
+ level,
112
+ bufferedBytes: socket.bufferedAmount,
113
+ highDepth: this.high.length,
114
+ normalDepth: this.normal.length
115
+ });
116
+ }
117
+ this.retryTimer = setTimeout(() => {
118
+ this.retryTimer = undefined;
119
+ this.schedule();
120
+ }, BACKPRESSURE_RETRY_MS);
121
+ }
122
+ finishBackpressure(reason) {
123
+ if (this.backpressureLogged)
124
+ nodeLog('control.outbound.backpressure.recovered', {
125
+ reason,
126
+ durationMs: Date.now() - (this.backpressureStartedAt ?? Date.now()),
127
+ maximumHighDepth: this.maximumHighDepth,
128
+ maximumNormalDepth: this.maximumNormalDepth
129
+ });
130
+ this.backpressureStartedAt = undefined;
131
+ this.backpressureLogged = false;
132
+ this.maximumHighDepth = 0;
133
+ this.maximumNormalDepth = 0;
134
+ }
135
+ scheduleExpiry() {
136
+ if (this.expiryTimer !== undefined)
137
+ return;
138
+ const expiresAt = Math.min(this.high[0]?.expiresAt ?? Number.POSITIVE_INFINITY, this.normal[0]?.expiresAt ?? Number.POSITIVE_INFINITY);
139
+ if (!Number.isFinite(expiresAt))
140
+ return;
141
+ this.expiryTimer = setTimeout(() => {
142
+ this.expiryTimer = undefined;
143
+ if ((this.high[0]?.expiresAt ?? Number.POSITIVE_INFINITY) > Date.now() &&
144
+ (this.normal[0]?.expiresAt ?? Number.POSITIVE_INFINITY) > Date.now()) {
145
+ this.scheduleExpiry();
146
+ return;
147
+ }
148
+ this.reset();
149
+ this.onExpired();
150
+ }, Math.max(0, expiresAt - Date.now()));
151
+ this.expiryTimer.unref();
152
+ }
153
+ }