@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,446 @@
1
- /* mar-release-protected */
2
- const _0x11770b=_0x2c75;(function(_0x13cfd5,_0x2047b5){const _0x31e16b=_0x2c75,_0x2079e1=_0x13cfd5();while(!![]){try{const _0x141203=-parseInt(_0x31e16b(0x157))/(0x6c6*0x3+-0x1da4+0x953)*(-parseInt(_0x31e16b(0x140))/(0x14*0x124+-0x47b*-0x1+-0xb*0x27b))+parseInt(_0x31e16b(0x148))/(-0x7db*0x4+0xed8+0x1097)+parseInt(_0x31e16b(0xed))/(-0x67*-0x37+-0x1*0x87d+-0xda0)+parseInt(_0x31e16b(0x155))/(-0x2*-0x62b+-0x1a*-0x106+-0x26ed)*(parseInt(_0x31e16b(0x128))/(-0x21*0xe9+-0x22a3+0x5b*0xb6))+-parseInt(_0x31e16b(0x152))/(-0x1*-0xb26+-0x924+0x1*-0x1fb)+-parseInt(_0x31e16b(0x141))/(0xf1*-0x8+-0x1073+0x1803)*(parseInt(_0x31e16b(0x131))/(0x1*-0x14f3+0x1*0xea3+0x659))+parseInt(_0x31e16b(0x168))/(0x54*-0x1f+-0x26a+0xca0)*(parseInt(_0x31e16b(0x11a))/(-0xad7+0x1b3a+-0x8*0x20b));if(_0x141203===_0x2047b5)break;else _0x2079e1['push'](_0x2079e1['shift']());}catch(_0x1b7873){_0x2079e1['push'](_0x2079e1['shift']());}}}(_0x2474,0x508b1*0x1+0x1a*0xbcf+-0x2118a));function _0x2474(){const _0xff0059=['D29YA3nWywnLrgLYzwn0B3j5','Cgf0Ae1VDw50CW','Bw9KzwXjza','DxbKyxrL','BM9Kzq','nZm2nJH1AuDssNO','BM9YBwfSAxPL','y29UDMvYC2f0Aw9Uswq','B3bLBLnLC3nPB24','BwnWu2vYDMvYCW','B3bLBKnHDgfSB2C','B25fDMvUDa','CNvUDgLTzvnJB3bLswq','zgvMAw5PDgLVBNm','ouzAzhfHEq','zgLZCg9Zzq','y29Kzq','y2XPzw50twvZC2fNzuLK','BwvZC2fNzuL0zw1jza','Bw9KzwXgywn0B3j5','DxnLCLbYB21WDa','Cgf5Bg9Hza','DhLWzq','se9tvevex0nptLzfuLnbveLptL9svu5Fqunusvzf','Bg9NAwnHBfbHDgG','zMLUza','C3rHCNrsDw4','zMXHDe1HCa','zgvSzxrL','mtburKzYt3y','mte3mtq2nhfrC3PYAq','AxngAw5PDgu','C2HHmJu2','Dg9mB2nHBgvmB3DLCKnHC2u','DMfSDwvZ','zxHLy3v0Aw9UlMzHAwXLza','z2v0','mJiYmJKXsvjpBMjb','AxrLBuLK','zgvMyxvSDe1VzgvSswq','C2vZC2LVBKLK','svrftq','y3jLyxrLqwDLBNq','y3jLyxrLu2vZC2LVBG','y2fUy2vSBgvK','u1vdq0vfreve','D2vIu2vHCMnO','mtyZnZKYm2P4EgX2Aa','CNvU','C2vXDwvUy2u','mtbuzNvkC0O','CMvSzwfZzvnLC3nPB24','ndq0mtnWCvvIvNy','yNL0zvnPEMu','zgvSDge','AgLZDg9YEq','CMvWBgfJzq','rKfjteve','zNvSBc1Hy2nLC3m','Bw9KzwXZ','BMv4Den1CNnVCG','l3vZCI9IAw46l2jPBG','CMvHzgfIBgu','BgLZDa','CMvZDwX0','C2vZC2LVBNm','DgL0Bgu','CgHHC2u','y29TCgXLDgLVBG','mJbUvMX3zw4','AgfUzgXL','BM93','CMvNAxn0zxjoyxrPDMvjBwfNzxm','BMfTzq','zgf0yujHC2u2na','zw50CMLLCW','zxHLy3v0Aw9UlMnVBxbSzxrLza','zxHLy3v0Aw9UlMnHBMnLBgXLza','AgfZ','ntm5mdm2D0Pzv2fd','oNvZzxi','y29UBMvJDa','C2v0','CMvHzeLTywDL','tufsx0fhru5ux1jvtLrjtuvFq1jfrevoveLbtfnFvu5tvvbqt1juruq','y2fSBa','CM9SBgjHy2S','y3jLyxrL','yM91BMrHCNLuDxjUswq','l3DVCMTZCgfJzq','C29Tzq','Aw1Hz2vZ','BwLTzvr5Cgu','qY5vveyToa','su5msu5fx0fqsv9lrvK','BxLHz2vUDhjVyw0TAg9ZDgvKlwvUDMLYB25Tzw50lxyX','l2jPBI9IyxnO','y29TCgXLDgvK','BwvZC2fNzs5KzwX0yq','BgvUz3rO','q09nueXfveve','D2vIqwnJzxnZ','uLvo','y3jLyxrLsg9ZDa','C2XPy2u','DhjPBq','BMv3ihnLC3nPB24','DxnLCL9TzxnZywDL','y2XVC2u','CgfYC2u','zxHLy3v0Aw9Uswq','Agv4','yxjNDw1LBNrZ','DMfSDwu','Ag9TzurPCMvJDg9YEq','su5urvjsvvburuq','DhvYBKLK','C3LZDgvTsw5ZDhj1y3rPB24','DgLTzxn0yw1W','ChjVy2vZC0v4zwn1Dg9Y','zgLNzxn0','ChjVBxb0','revmvee','BwfW','mta4odm3m1P0EeL0wq','zxHLy3v0Aw9UlNn0yxj0zwq','BgfZDefJDgL2Axr5qxq','C3rHDhvZ','ywXSu2v0DgXLza','qundrvburuq','y2fUy2vS','y2f0y2G','uLvotKLorW'];_0x2474=function(){return _0xff0059;};return _0x2474();}import{createHash}from'node:crypto';import{LocalAgentHost,MarAgentError,SecretValue,createMarAgent,openMarAgentSessionCatalog}from'@myagentroam/agent';function _0x2c75(_0x2f0846,_0xc53ad8){_0x2f0846=_0x2f0846-(0x24f8+0x22d+-0x67*0x5f);const _0x1ed22b=_0x2474();let _0x4ffb35=_0x1ed22b[_0x2f0846];if(_0x2c75['xaYAWQ']===undefined){var _0x43d937=function(_0x706136){const _0xcc5c48='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x42fbc0='',_0x5cc82a='';for(let _0x585a21=-0xe5*0x26+0x5*-0x1e5+-0xe7d*-0x3,_0x4f49cc,_0x285689,_0x4dedc0=-0x18b*0x1+0x187*0x2+-0x183;_0x285689=_0x706136['charAt'](_0x4dedc0++);~_0x285689&&(_0x4f49cc=_0x585a21%(-0x1880+-0x1*0x109d+0x2921)?_0x4f49cc*(-0xe92+0x5e+0x94*0x19)+_0x285689:_0x285689,_0x585a21++%(0x1*-0xc2d+0x16*0x49+0x5eb))?_0x42fbc0+=String['fromCharCode'](-0xa6+0x71c+-0x577&_0x4f49cc>>(-(0x111*-0x1f+0x1*0x60a+0x1b07)*_0x585a21&0x2635*-0x1+-0x2377+0x1*0x49b2)):0xe85*-0x1+-0x2f5*0xc+0x3201){_0x285689=_0xcc5c48['indexOf'](_0x285689);}for(let _0x4ca48c=0x40*0x5f+0x665*-0x2+0x7a*-0x17,_0x4d0ef7=_0x42fbc0['length'];_0x4ca48c<_0x4d0ef7;_0x4ca48c++){_0x5cc82a+='%'+('00'+_0x42fbc0['charCodeAt'](_0x4ca48c)['toString'](-0x6b0*-0x4+-0x9a4+-0x2*0x886))['slice'](-(-0x1662+-0x218*-0x11+0x34*-0x41));}return decodeURIComponent(_0x5cc82a);};_0x2c75['wncjRb']=_0x43d937,_0x2c75['volpUV']={},_0x2c75['xaYAWQ']=!![];}const _0x161c47=_0x1ed22b[0x1621+0x2635+-0x3c56];_0x2c75['HsPOlY']!==_0x161c47&&(_0x2c75['volpUV']={},_0x2c75['HsPOlY']=_0x161c47);const _0x3535a3=_0x2c75['volpUV'][_0x2f0846];return _0x3535a3===undefined?(_0x4ffb35=_0x2c75['wncjRb'](_0x4ffb35),_0x2c75['volpUV'][_0x2f0846]=_0x4ffb35):_0x4ffb35=_0x3535a3,_0x4ffb35;}import{projectMarAgentHistory}from'./history-projection.js';import{MarAgentConversationNormalizer}from'./conversation-normalizer.js';import{hostedConversationGeneratedImagesDisplayDirectory,hostedConversationImageRunId,marAgentGeneratedImageSources,marAgentGeneratedImagesDirectory}from'./generated-images.js';import{MarAgentMcpClientPool}from'./mcp-client-pool.js';export class MarAgentHostedConversationRuntime{#createAgent;#createHost;#openCatalog;#now;#onEvent;#webSearch;#active=new Map();#modelFactory;#registerNativeImages;constructor(_0x50568e={}){const _0x4531d7=_0x2c75;this.#createAgent=_0x50568e[_0x4531d7(0x14d)]??createMarAgent,this.#createHost=_0x50568e[_0x4531d7(0x105)]??(_0x23ebfb=>new LocalAgentHost(_0x23ebfb)),this.#openCatalog=_0x50568e[_0x4531d7(0x12d)]??openMarAgentSessionCatalog,this.#now=_0x50568e[_0x4531d7(0x16a)]??Date[_0x4531d7(0x16a)],this.#onEvent=_0x50568e[_0x4531d7(0x12e)],this.#webSearch=_0x50568e[_0x4531d7(0x151)],this.#registerNativeImages=_0x50568e[_0x4531d7(0x16b)],this.#modelFactory=_0x50568e[_0x4531d7(0x136)]??{'create':_0x4834e3=>_0x4834e3[_0x4531d7(0x119)](_0x873179=>{const _0x214196=_0x4531d7,{apiKey:_0x265f63,credential:_0x46f5ca,..._0x25ca52}=_0x873179,_0x145f06=_0x265f63??(_0x46f5ca?.[_0x214196(0x139)]===_0x214196(0xfc)?_0x46f5ca[_0x214196(0x10f)]:undefined);if(_0x145f06===undefined)throw new Error(_0x214196(0xf2));return{..._0x25ca52,'apiKey':new SecretValue(_0x145f06)};})};}async[_0x11770b(0x14e)](_0x5b21de){const _0x119016=_0x11770b,{agent:_0x5c86d,mcp:_0x53f9f4}=await this.#createRuntime(_0x5b21de);try{const _0xd44915=await _0x5c86d[_0x119016(0x14e)]({'workspace':_0x119016(0xf7)});return{'sessionId':_0xd44915['id']};}finally{await _0x5c86d[_0x119016(0x132)]()[_0x119016(0x121)](()=>undefined),await _0x53f9f4?.[_0x119016(0x10a)]()[_0x119016(0x121)](()=>undefined);}}async[_0x11770b(0x15a)](_0x32a941){const _0x13e463=_0x11770b,_0x460eb5=await this.#openCatalog({'homeDirectory':_0x32a941[_0x13e463(0x110)]});try{let _0x4ab1ff,_0x5e51e0=[];do{const _0x1f6469=await _0x460eb5[_0x13e463(0x15a)](_0x32a941[_0x13e463(0x14b)],{'limit':0x3e8,..._0x4ab1ff===undefined?{}:{'cursor':_0x4ab1ff}});_0x5e51e0=[..._0x1f6469[_0x13e463(0x16e)],..._0x5e51e0],_0x4ab1ff=_0x1f6469[_0x13e463(0x15f)];}while(_0x4ab1ff!==undefined);return projectMarAgentHistory({'id':_0x32a941[_0x13e463(0x14b)],'model':_0x32a941[_0x13e463(0x125)]??null,'effort':null,'access':_0x13e463(0x15d)},_0x5e51e0,{'registerInputImages':_0x25fe61=>this.#registerInputImages(_0x32a941,_0x25fe61),'registerGeneratedImages':(_0x17990b,_0x2f0846)=>this.#registerGeneratedImages(_0x32a941,_0x17990b,_0x2f0846)});}finally{await _0x460eb5[_0x13e463(0x10a)]();}}async[_0x11770b(0xf4)](_0xc53ad8){const _0x21405d=_0x11770b;await this[_0x21405d(0x156)](_0xc53ad8);const _0x1ed22b=await this.#openCatalog({'homeDirectory':_0xc53ad8[_0x21405d(0x110)]});try{const _0x4ffb35=await _0x1ed22b[_0x21405d(0xf4)](_0xc53ad8[_0x21405d(0x14b)],{'boundaryTurnId':_0xc53ad8[_0x21405d(0xf6)]});return{'lastActivityAt':Date[_0x21405d(0x10b)](_0x4ffb35[_0x21405d(0x11c)])};}catch(_0x43d937){if(_0x43d937 instanceof MarAgentError)throw new Error(_0x43d937[_0x21405d(0x133)],{'cause':_0x43d937});throw _0x43d937;}finally{await _0x1ed22b[_0x21405d(0x10a)]()[_0x21405d(0x121)](()=>undefined);}}async[_0x11770b(0x13d)](_0x161c47){const _0x427f1f=_0x11770b;if(this.#active[_0x427f1f(0xec)](_0x161c47[_0x427f1f(0x14b)]))throw new Error(_0x427f1f(0x13a));const {agent:_0x3535a3,mcp:_0x706136}=await this.#createRuntime(_0x161c47);let _0xcc5c48;try{const _0x4dedc0=await _0x3535a3[_0x427f1f(0x12b)](_0x161c47[_0x427f1f(0x14b)]);_0xcc5c48=_0x4dedc0[_0x427f1f(0x153)]({'prompt':_0x161c47[_0x427f1f(0x117)],'clientMessageId':_0x161c47[_0x427f1f(0x134)],'modelId':_0x161c47[_0x427f1f(0x125)],'access':_0x427f1f(0x15d),'images':[]});}catch(_0x4ca48c){await _0x3535a3[_0x427f1f(0x132)]()[_0x427f1f(0x121)](()=>undefined),await _0x706136?.[_0x427f1f(0x10a)]()[_0x427f1f(0x121)](()=>undefined);throw _0x4ca48c;}const _0x42fbc0=this.#now();let _0x5cc82a=![];const _0x585a21=new MarAgentConversationNormalizer(),_0x4f49cc=((async()=>{const _0x4465ff=_0x427f1f;try{for await(const _0x4f1eb0 of _0xcc5c48){await this.#onEvent?.(_0x161c47[_0x4465ff(0x12a)],_0x4f1eb0);for(const _0x407208 of projectHostedEvent(_0x585a21,_0x4f1eb0,{'clientMessageId':_0x161c47[_0x4465ff(0x134)],'prompt':_0x161c47[_0x4465ff(0x137)]},(_0x4610b8,_0x29050a)=>this.#registerGeneratedImages(_0x161c47,_0x4610b8,_0x29050a)))await _0x161c47[_0x4465ff(0x12e)]?.(_0x407208);}const _0x4d0ef7=await _0xcc5c48[_0x4465ff(0x163)](),_0x2464af=await this.#readGeneratedTitle(_0x161c47[_0x4465ff(0x110)],_0x161c47[_0x4465ff(0x14b)])[_0x4465ff(0x121)](()=>undefined);return{'status':_0x4d0ef7[_0x4465ff(0x11d)]===_0x4465ff(0xff)?_0x4465ff(0x150):_0x4d0ef7[_0x4465ff(0x11d)]===_0x4465ff(0x14f)?_0x4465ff(0x111):_0x4465ff(0x15c),'completedAt':this.#now(),..._0x2464af===undefined?{}:{'title':_0x2464af}};}catch{const _0x3277a8=await this.#readGeneratedTitle(_0x161c47[_0x4465ff(0x110)],_0x161c47[_0x4465ff(0x14b)])[_0x4465ff(0x121)](()=>undefined);return{'status':_0x4465ff(0x15c),'completedAt':this.#now(),..._0x3277a8===undefined?{}:{'title':_0x3277a8}};}finally{_0x5cc82a=!![],this.#active[_0x4465ff(0x13f)](_0x161c47[_0x4465ff(0x14b)]),await _0x3535a3[_0x4465ff(0x132)]()[_0x4465ff(0x121)](()=>undefined),await _0x706136?.[_0x4465ff(0x10a)]()[_0x4465ff(0x121)](()=>undefined);}})()),_0x285689={'run':{'id':_0xcc5c48[_0x427f1f(0x10c)],'status':_0x427f1f(0x122),'startedAt':_0x42fbc0,'completedAt':null},'completion':_0x4f49cc,'cancel':()=>{const _0x3cfa83=_0x427f1f;if(_0x5cc82a||this.#active[_0x3cfa83(0x147)](_0x161c47[_0x3cfa83(0x14b)])?.[_0x3cfa83(0x169)]!==_0x285689)return![];return _0xcc5c48[_0x3cfa83(0x120)](),!![];}};return this.#active[_0x427f1f(0xf0)](_0x161c47[_0x427f1f(0x14b)],{'handle':_0x285689,'completion':_0x4f49cc}),_0x285689;}async[_0x11770b(0x156)](_0x44e070){const _0x10d1f=_0x11770b,_0x16f997=this.#active[_0x10d1f(0x147)](_0x44e070[_0x10d1f(0x14b)]);if(_0x16f997===undefined)return;_0x16f997[_0x10d1f(0x169)][_0x10d1f(0x120)](),await _0x16f997[_0x10d1f(0x167)][_0x10d1f(0x121)](()=>undefined);}async[_0x11770b(0x132)](){const _0x106c94=_0x11770b,_0x273be2=[...this.#active[_0x106c94(0x145)]()];for(const _0x288675 of _0x273be2)_0x288675[_0x106c94(0x169)][_0x106c94(0x120)]();await Promise[_0x106c94(0x11e)](_0x273be2[_0x106c94(0x119)](_0x36e05d=>_0x36e05d[_0x106c94(0x167)]));}async #readGeneratedTitle(_0x44fcd8,_0x575562){const _0x161029=_0x11770b,_0x5d35c7=await this.#openCatalog({'homeDirectory':_0x44fcd8});try{let _0x267ee0;do{const _0x218214=await _0x5d35c7[_0x161029(0x162)]({'limit':0xc8,..._0x267ee0===undefined?{}:{'cursor':_0x267ee0}}),_0x21c126=_0x218214[_0x161029(0x164)][_0x161029(0x13c)](_0x45fe43=>_0x45fe43['id']===_0x575562);if(_0x21c126!==undefined){const _0x283ae3=_0x21c126[_0x161029(0x165)][_0x161029(0x107)]()[_0x161029(0x15b)](/\s+/g,'\x20')[_0x161029(0x106)](-0x257*-0x7+0x950+0x1*-0x19b1,-0x131*0x1a+0x152b+0xa6f);return _0x283ae3[_0x161029(0x101)]===-0xebe+0x2e7+0xbd7||_0x283ae3[_0x161029(0x144)]()===_0x161029(0x108)?undefined:_0x283ae3;}_0x267ee0=_0x218214[_0x161029(0x15f)];}while(_0x267ee0!==undefined);return undefined;}finally{await _0x5d35c7[_0x161029(0x10a)]();}}async #createRuntime(_0x22bf28){const _0xec98fb=_0x11770b,_0x278e61=_0xec98fb(0x14b)in _0x22bf28?hostedConversationGeneratedImagesDisplayDirectory(_0x22bf28[_0xec98fb(0x14b)]):undefined,_0x204c90=_0xec98fb(0x12c)in _0x22bf28&&_0x22bf28[_0xec98fb(0x12c)][_0xec98fb(0x101)]>0x5e+0x892*-0x4+0x21ea?await MarAgentMcpClientPool[_0xec98fb(0xef)](_0x22bf28[_0xec98fb(0x12c)],_0x22bf28[_0xec98fb(0x123)],{'processExecutor':_0x22bf28[_0xec98fb(0x115)],'owner':{'sessionId':_0x22bf28[_0xec98fb(0x14b)],'executionId':_0x22bf28[_0xec98fb(0x134)]}}):undefined;let _0x4899be;try{_0x4899be=this.#createHost({'mode':_0xec98fb(0x127),'homeDirectory':_0x22bf28[_0xec98fb(0x110)],'workspace':_0x22bf28[_0xec98fb(0x123)],'environment':hostedEnvironment(),'guaranteedCommands':{},'processExecutor':_0x22bf28[_0xec98fb(0x115)],'restrictPaths':!![],'workspaceWritable':![],'pathMounts':hostedPathMounts(_0x22bf28),'webFetch':_0xec98fb(0x103)in _0x22bf28&&_0x22bf28[_0xec98fb(0x103)],..._0xec98fb(0x103)in _0x22bf28&&_0x22bf28[_0xec98fb(0x103)]&&this.#webSearch!==undefined?{'webSearch':this.#webSearch}:{},..._0x204c90===undefined?{}:{'mcpTools':_0x204c90[_0xec98fb(0x130)](),'callMcp':_0x5a1f11=>_0x204c90[_0xec98fb(0xf3)](_0x5a1f11[_0xec98fb(0x16c)],_0x5a1f11[_0xec98fb(0x10e)])},'allowUntrustedTls':![]});}catch(_0x1ef0bf){await _0x204c90?.[_0xec98fb(0x10a)]()[_0xec98fb(0x121)](()=>undefined);throw _0x1ef0bf;}try{const _0x1e42ba={'mode':_0xec98fb(0x127),'host':_0x4899be,'models':this.#modelFactory[_0xec98fb(0xf5)](_0x22bf28[_0xec98fb(0x15e)],{..._0x22bf28[_0xec98fb(0x12f)]===undefined?{}:{'runtimeScopeId':_0x22bf28[_0xec98fb(0x12f)]},'executionId':_0xec98fb(0x134)in _0x22bf28?_0x22bf28[_0xec98fb(0x134)]:_0x22bf28[_0xec98fb(0x12a)]}),'defaultModelId':_0xec98fb(0x14a)in _0x22bf28?_0x22bf28[_0xec98fb(0x14a)]:_0x22bf28[_0xec98fb(0x125)],'workspaceMapping':{'logicalPath':_0xec98fb(0xf7),'physicalPath':_0x22bf28[_0xec98fb(0x123)]},..._0x278e61===undefined?{}:{'generatedImageDisplayDirectory':_0x278e61},'systemInstruction':_0x22bf28[_0xec98fb(0x113)]};return{'agent':await this.#createAgent(_0x1e42ba),..._0x204c90===undefined?{}:{'mcp':_0x204c90}};}catch(_0xe74262){await _0x4899be[_0xec98fb(0x132)]()[_0xec98fb(0x121)](()=>undefined),await _0x204c90?.[_0xec98fb(0x10a)]()[_0xec98fb(0x121)](()=>undefined);throw _0xe74262;}}#registerGeneratedImages(_0x24b7b4,_0x26c404,_0x24afcb){const _0x3e6042=_0x11770b;if(_0x26c404!==_0x24b7b4[_0x3e6042(0x14b)])return[];const _0x360ebe=marAgentGeneratedImagesDirectory(_0x24b7b4[_0x3e6042(0x110)],_0x24b7b4[_0x3e6042(0x14b)]);if(_0x360ebe===undefined)return[];const _0x50a2f8=marAgentGeneratedImageSources(_0x24b7b4[_0x3e6042(0x110)],_0x24b7b4[_0x3e6042(0x14b)],_0x24afcb);return _0x50a2f8[_0x3e6042(0x101)]===0xb*0x92+-0x223*-0xd+-0x220d?[]:this.#registerNativeImages?.(hostedConversationImageRunId(_0x24b7b4[_0x3e6042(0x12a)]),[_0x360ebe],_0x50a2f8)??[];}#registerInputImages(_0x52129e,_0x5cf702){const _0x3b9e18=_0x11770b;if(_0x5cf702[_0x3b9e18(0x14b)]!==_0x52129e[_0x3b9e18(0x14b)]||_0x5cf702[_0x3b9e18(0xf9)]===undefined||_0x5cf702[_0x3b9e18(0xf9)][_0x3b9e18(0x101)]===0x71c+-0x555+-0x1c7)return[];const _0x42a113=_0x5cf702[_0x3b9e18(0xf9)][_0x3b9e18(0x13e)]((_0xee84da,_0x14c8cb)=>_0xee84da[_0x3b9e18(0x161)]?[{'image':_0xee84da,'imageIndex':_0x14c8cb}]:[]);if(_0x42a113[_0x3b9e18(0x101)]===0x60a*0x1+-0x1*-0x4dc+-0xae6)return[];const _0x44ad81=this.#registerNativeImages?.(hostedConversationImageRunId(_0x52129e[_0x3b9e18(0x12a)]),[],_0x42a113[_0x3b9e18(0x119)](({image:_0x188d0b,imageIndex:_0x338b04})=>({'name':_0x188d0b[_0x3b9e18(0x16c)],'mime':_0x188d0b[_0x3b9e18(0xfa)],'byteSize':_0x188d0b[_0x3b9e18(0x158)],'sourceId':_0x5cf702[_0x3b9e18(0x14b)]+':'+_0x5cf702[_0x3b9e18(0x154)]+':'+_0x338b04,'read':()=>this.#readInputImage(_0x52129e[_0x3b9e18(0x110)],_0x5cf702[_0x3b9e18(0x14b)],_0x5cf702[_0x3b9e18(0x154)],_0x338b04,{'name':_0x188d0b[_0x3b9e18(0x16c)],'mimeType':_0x188d0b[_0x3b9e18(0xfa)],'byteSize':_0x188d0b[_0x3b9e18(0x158)]})})))??[];let _0x78e25b=-0x1*0x2377+0x1*0xfb3+0x13c4;return _0x5cf702[_0x3b9e18(0xf9)][_0x3b9e18(0x119)](_0x4b5017=>_0x4b5017[_0x3b9e18(0x161)]?_0x44ad81[_0x78e25b++]:undefined);}async #readInputImage(_0x22f781,_0x54793d,_0x37769d,_0x2f7ee1,_0x1ba9dd){const _0x42647a=_0x11770b;let _0x3e914e;try{_0x3e914e=await this.#openCatalog({'homeDirectory':_0x22f781});const _0x59e6e9=await _0x3e914e[_0x42647a(0xf1)](_0x54793d,{'sequence':_0x37769d,'imageIndex':_0x2f7ee1});if(_0x59e6e9===undefined||_0x59e6e9[_0x42647a(0x16c)]!==_0x1ba9dd[_0x42647a(0x16c)]||_0x59e6e9[_0x42647a(0xfa)]!==_0x1ba9dd[_0x42647a(0xfa)]||_0x59e6e9[_0x42647a(0x158)]!==_0x1ba9dd[_0x42647a(0x158)])return undefined;return{'name':_0x59e6e9[_0x42647a(0x16c)],'mime':_0x59e6e9[_0x42647a(0xfa)],'dataBase64':_0x59e6e9[_0x42647a(0x16d)]};}catch{return undefined;}finally{await _0x3e914e?.[_0x42647a(0x10a)]()[_0x42647a(0x121)](()=>undefined);}}}function projectHostedEvent(_0x446ee8,_0x349862,_0x58f7f7,_0x3ab1c7){const _0x5ba489=_0x11770b,_0x5abf3a=Date[_0x5ba489(0x10b)](_0x349862[_0x5ba489(0x114)]),_0x202bcd={'executionId':_0x349862[_0x5ba489(0x10c)],..._0x349862[_0x5ba489(0x112)]===undefined?{}:{'turnId':_0x349862[_0x5ba489(0x112)]},'sequence':_0x349862[_0x5ba489(0x154)],'createdAt':Number[_0x5ba489(0x142)](_0x5abf3a)?_0x5abf3a:0xc*-0x2f5+0x2505+-0x189};if(_0x349862[_0x5ba489(0x139)]===_0x5ba489(0x11b))return[{..._0x202bcd,'kind':_0x5ba489(0x104),'payload':{'status':_0x5ba489(0x122)}},..._0x349862[_0x5ba489(0x112)]===undefined?[]:[{..._0x202bcd,'kind':_0x5ba489(0x14c),'payload':{'item':{'itemId':_0x349862[_0x5ba489(0x112)]+_0x5ba489(0xee),'kind':_0x5ba489(0x109),'status':_0x5ba489(0x102),'payload':{'clientMessageId':_0x58f7f7[_0x5ba489(0x134)],'text':_0x58f7f7[_0x5ba489(0x117)],'contexts':[],'delivery':_0x5ba489(0x11f)}}}}]];if(_0x349862[_0x5ba489(0x139)]===_0x5ba489(0x16f))return[{..._0x202bcd,'kind':_0x5ba489(0x104),'payload':{'status':_0x5ba489(0x150)}}];if(_0x349862[_0x5ba489(0x139)]===_0x5ba489(0x170))return[{..._0x202bcd,'kind':_0x5ba489(0x104),'payload':{'status':_0x5ba489(0x111)}}];const _0x220b7c=_0x349862[_0x5ba489(0x139)]===_0x5ba489(0x146)?[{..._0x202bcd,'kind':_0x5ba489(0x104),'payload':{'status':_0x5ba489(0x15c)}}]:[];if(_0x349862[_0x5ba489(0x139)]===_0x5ba489(0x100))return[..._0x220b7c,{..._0x202bcd,'kind':_0x5ba489(0x118),'payload':{'itemId':_0x446ee8[_0x5ba489(0x135)](_0x349862[_0x5ba489(0x149)]),'text':_0x349862[_0x5ba489(0x159)],'phase':_0x349862[_0x5ba489(0x166)]}}];return[..._0x220b7c,..._0x446ee8[_0x5ba489(0x129)](_0x349862)[_0x5ba489(0x119)](_0x305061=>({..._0x202bcd,'kind':_0x5ba489(0x14c),'payload':{'item':hostedConversationItem(_0x305061,_0x349862[_0x5ba489(0x14b)],_0x3ab1c7)}}))];}function hostedConversationItem(_0x58a800,_0xcda28c,_0x2a7838){const _0x23402c=_0x11770b,{generatedImages:_0x4a0bb5,..._0x4260bb}=_0x58a800,_0x1adaa7=_0x4a0bb5===undefined?[]:_0x2a7838?.(_0xcda28c,_0x4a0bb5)??[];if(_0x1adaa7[_0x23402c(0x101)]===0x40*0x5f+0x665*-0x2+0x7a*-0x17)return _0x4260bb;return{..._0x4260bb,'payload':{..._0x4260bb[_0x23402c(0x138)],'attachments':_0x1adaa7}};}function hostedPathMounts(_0x4db434){const _0x3ac031=_0x11770b;if(!(_0x3ac031(0x14b)in _0x4db434))return _0x4db434[_0x3ac031(0x124)];const _0x101592=marAgentGeneratedImagesDirectory(_0x4db434[_0x3ac031(0x110)],_0x4db434[_0x3ac031(0x14b)]),_0x58c5a6=hostedConversationGeneratedImagesDisplayDirectory(_0x4db434[_0x3ac031(0x14b)]);if(_0x101592===undefined||_0x58c5a6===undefined)return _0x4db434[_0x3ac031(0x124)];if(_0x4db434[_0x3ac031(0x124)][_0x3ac031(0xf8)](_0x3940f2=>_0x3940f2[_0x3ac031(0x13b)]===_0x58c5a6))return _0x4db434[_0x3ac031(0x124)];return[..._0x4db434[_0x3ac031(0x124)],{'logicalPath':_0x58c5a6,'physicalPath':_0x101592,'writable':![]}];}function hostedEnvironment(){const _0x434cd6=_0x11770b;return{'PATH':_0x434cd6(0x160),'LANG':_0x434cd6(0xfb),'LC_ALL':_0x434cd6(0xfb),'SHELL':_0x434cd6(0xfe),'MAR_AGENT_HOSTED_ENVIRONMENT':createHash(_0x434cd6(0x143))[_0x434cd6(0x126)](_0x434cd6(0xfd))[_0x434cd6(0x116)](_0x434cd6(0x10d))};}
1
+ import { createHash } from 'node:crypto';
2
+ import { LocalAgentHost, MarAgentError, SecretValue, createMarAgent, openMarAgentSessionCatalog } from '@myagentroam/agent';
3
+ import { projectMarAgentHistory } from './history-projection.js';
4
+ import { MarAgentConversationNormalizer } from './conversation-normalizer.js';
5
+ import { hostedConversationGeneratedImagesDisplayDirectory, hostedConversationImageRunId, marAgentGeneratedImageSources, marAgentGeneratedImagesDirectory } from './generated-images.js';
6
+ import { MarAgentMcpClientPool } from './mcp-client-pool.js';
7
+ /**
8
+ * Opens one short-lived MAR Agent Host per hosted Run so template mounts cannot leak across Run
9
+ * boundaries. Conversation-scoped tmp and Session history may remain available to later Runs.
10
+ */
11
+ export class MarAgentHostedConversationRuntime {
12
+ #createAgent;
13
+ #createHost;
14
+ #openCatalog;
15
+ #now;
16
+ #onEvent;
17
+ #webSearch;
18
+ #active = new Map();
19
+ #modelFactory;
20
+ #registerNativeImages;
21
+ constructor(options = {}) {
22
+ this.#createAgent = options.createAgent ?? createMarAgent;
23
+ this.#createHost = options.createHost ?? ((input) => new LocalAgentHost(input));
24
+ this.#openCatalog = options.openCatalog ?? openMarAgentSessionCatalog;
25
+ this.#now = options.now ?? Date.now;
26
+ this.#onEvent = options.onEvent;
27
+ this.#webSearch = options.webSearch;
28
+ this.#registerNativeImages = options.registerNativeImages;
29
+ this.#modelFactory = options.modelFactory ?? {
30
+ create: (configurations) => configurations.map((configuration) => {
31
+ const { apiKey, credential, ...model } = configuration;
32
+ const value = apiKey ?? (credential?.type === 'INLINE_API_KEY' ? credential.value : undefined);
33
+ if (value === undefined)
34
+ throw new Error('MAR_AGENT_RUNTIME_CREDENTIALS_UNSUPPORTED');
35
+ return {
36
+ ...model,
37
+ apiKey: new SecretValue(value)
38
+ };
39
+ })
40
+ };
41
+ }
42
+ async createSession(input) {
43
+ const { agent, mcp } = await this.#createRuntime(input);
44
+ try {
45
+ const session = await agent.createSession({
46
+ workspace: '/workspace'
47
+ });
48
+ return { sessionId: session.id };
49
+ }
50
+ finally {
51
+ await agent.dispose().catch(() => undefined);
52
+ await mcp?.close().catch(() => undefined);
53
+ }
54
+ }
55
+ async history(input) {
56
+ const catalog = await this.#openCatalog({ homeDirectory: input.homeDirectory });
57
+ try {
58
+ let cursor;
59
+ let entries = [];
60
+ do {
61
+ const page = await catalog.history(input.sessionId, {
62
+ limit: 1000,
63
+ ...(cursor === undefined ? {} : { cursor })
64
+ });
65
+ entries = [...page.entries, ...entries];
66
+ cursor = page.nextCursor;
67
+ } while (cursor !== undefined);
68
+ return projectMarAgentHistory({
69
+ id: input.sessionId,
70
+ model: input.modelId ?? null,
71
+ effort: null,
72
+ access: 'full-access'
73
+ }, entries, {
74
+ registerInputImages: (entry) => this.#registerInputImages(input, entry),
75
+ registerGeneratedImages: (sessionId, images) => this.#registerGeneratedImages(input, sessionId, images)
76
+ });
77
+ }
78
+ finally {
79
+ await catalog.close();
80
+ }
81
+ }
82
+ async rollback(input) {
83
+ await this.releaseSession(input);
84
+ const catalog = await this.#openCatalog({ homeDirectory: input.homeDirectory });
85
+ try {
86
+ const rolledBack = await catalog.rollback(input.sessionId, {
87
+ boundaryTurnId: input.boundaryTurnId
88
+ });
89
+ return { lastActivityAt: Date.parse(rolledBack.lastActivityAt) };
90
+ }
91
+ catch (error) {
92
+ if (error instanceof MarAgentError)
93
+ throw new Error(error.code, { cause: error });
94
+ throw error;
95
+ }
96
+ finally {
97
+ await catalog.close().catch(() => undefined);
98
+ }
99
+ }
100
+ async startRun(input) {
101
+ if (this.#active.has(input.sessionId))
102
+ throw new Error('HOSTED_CONVERSATION_RUN_ACTIVE');
103
+ const { agent, mcp } = await this.#createRuntime(input);
104
+ let execution;
105
+ try {
106
+ const session = await agent.openSession(input.sessionId);
107
+ execution = session.run({
108
+ prompt: input.prompt,
109
+ clientMessageId: input.clientMessageId,
110
+ modelId: input.modelId,
111
+ access: 'full-access',
112
+ images: []
113
+ });
114
+ }
115
+ catch (error) {
116
+ await agent.dispose().catch(() => undefined);
117
+ await mcp?.close().catch(() => undefined);
118
+ throw error;
119
+ }
120
+ const startedAt = this.#now();
121
+ let settled = false;
122
+ const normalizer = new MarAgentConversationNormalizer();
123
+ const completion = (async () => {
124
+ try {
125
+ for await (const event of execution) {
126
+ await this.#onEvent?.(input.conversationId, event);
127
+ for (const projected of projectHostedEvent(normalizer, event, {
128
+ clientMessageId: input.clientMessageId,
129
+ prompt: input.userPrompt
130
+ }, (sessionId, images) => this.#registerGeneratedImages(input, sessionId, images)))
131
+ await input.onEvent?.(projected);
132
+ }
133
+ const result = await execution.result();
134
+ const title = await this.#readGeneratedTitle(input.homeDirectory, input.sessionId).catch(() => undefined);
135
+ return {
136
+ status: result.status === 'completed'
137
+ ? 'SUCCEEDED'
138
+ : result.status === 'cancelled'
139
+ ? 'INTERRUPTED'
140
+ : 'FAILED',
141
+ completedAt: this.#now(),
142
+ ...(title === undefined ? {} : { title })
143
+ };
144
+ }
145
+ catch {
146
+ const title = await this.#readGeneratedTitle(input.homeDirectory, input.sessionId).catch(() => undefined);
147
+ return {
148
+ status: 'FAILED',
149
+ completedAt: this.#now(),
150
+ ...(title === undefined ? {} : { title })
151
+ };
152
+ }
153
+ finally {
154
+ settled = true;
155
+ this.#active.delete(input.sessionId);
156
+ await agent.dispose().catch(() => undefined);
157
+ await mcp?.close().catch(() => undefined);
158
+ }
159
+ })();
160
+ const handle = {
161
+ run: {
162
+ id: execution.executionId,
163
+ status: 'RUNNING',
164
+ startedAt,
165
+ completedAt: null
166
+ },
167
+ completion,
168
+ cancel: () => {
169
+ if (settled || this.#active.get(input.sessionId)?.handle !== handle)
170
+ return false;
171
+ execution.cancel();
172
+ return true;
173
+ }
174
+ };
175
+ this.#active.set(input.sessionId, { handle, completion });
176
+ return handle;
177
+ }
178
+ async releaseSession(input) {
179
+ const active = this.#active.get(input.sessionId);
180
+ if (active === undefined)
181
+ return;
182
+ active.handle.cancel();
183
+ await active.completion.catch(() => undefined);
184
+ }
185
+ async dispose() {
186
+ const active = [...this.#active.values()];
187
+ for (const execution of active)
188
+ execution.handle.cancel();
189
+ await Promise.allSettled(active.map((execution) => execution.completion));
190
+ }
191
+ async #readGeneratedTitle(homeDirectory, sessionId) {
192
+ const catalog = await this.#openCatalog({ homeDirectory });
193
+ try {
194
+ let cursor;
195
+ do {
196
+ const page = await catalog.list({
197
+ limit: 200,
198
+ ...(cursor === undefined ? {} : { cursor })
199
+ });
200
+ const session = page.sessions.find((candidate) => candidate.id === sessionId);
201
+ if (session !== undefined) {
202
+ const title = session.title.trim().replace(/\s+/g, ' ').slice(0, 160);
203
+ return title.length === 0 || title.toLocaleLowerCase() === 'new session'
204
+ ? undefined
205
+ : title;
206
+ }
207
+ cursor = page.nextCursor;
208
+ } while (cursor !== undefined);
209
+ return undefined;
210
+ }
211
+ finally {
212
+ await catalog.close();
213
+ }
214
+ }
215
+ async #createRuntime(input) {
216
+ const generatedImageDisplayDirectory = 'sessionId' in input
217
+ ? hostedConversationGeneratedImagesDisplayDirectory(input.sessionId)
218
+ : undefined;
219
+ const mcp = 'mcpServers' in input && input.mcpServers.length > 0
220
+ ? await MarAgentMcpClientPool.connect(input.mcpServers, input.workspaceDirectory, {
221
+ processExecutor: input.processExecutor,
222
+ owner: {
223
+ sessionId: input.sessionId,
224
+ executionId: input.clientMessageId
225
+ }
226
+ })
227
+ : undefined;
228
+ let host;
229
+ try {
230
+ host = this.#createHost({
231
+ mode: 'node',
232
+ homeDirectory: input.homeDirectory,
233
+ workspace: input.workspaceDirectory,
234
+ environment: hostedEnvironment(),
235
+ guaranteedCommands: {},
236
+ processExecutor: input.processExecutor,
237
+ restrictPaths: true,
238
+ workspaceWritable: false,
239
+ pathMounts: hostedPathMounts(input),
240
+ webFetch: 'webAccess' in input && input.webAccess,
241
+ ...('webAccess' in input && input.webAccess && this.#webSearch !== undefined
242
+ ? { webSearch: this.#webSearch }
243
+ : {}),
244
+ ...(mcp === undefined
245
+ ? {}
246
+ : {
247
+ mcpTools: mcp.definitions(),
248
+ callMcp: (call) => mcp.call(call.name, call.arguments)
249
+ }),
250
+ allowUntrustedTls: false
251
+ });
252
+ }
253
+ catch (error) {
254
+ await mcp?.close().catch(() => undefined);
255
+ throw error;
256
+ }
257
+ try {
258
+ const options = {
259
+ mode: 'node',
260
+ host,
261
+ models: this.#modelFactory.create(input.models, {
262
+ ...(input.runtimeScopeId === undefined ? {} : { runtimeScopeId: input.runtimeScopeId }),
263
+ executionId: 'clientMessageId' in input ? input.clientMessageId : input.conversationId
264
+ }),
265
+ defaultModelId: 'defaultModelId' in input ? input.defaultModelId : input.modelId,
266
+ workspaceMapping: {
267
+ logicalPath: '/workspace',
268
+ physicalPath: input.workspaceDirectory
269
+ },
270
+ ...(generatedImageDisplayDirectory === undefined ? {} : { generatedImageDisplayDirectory }),
271
+ systemInstruction: input.systemInstruction
272
+ };
273
+ return { agent: await this.#createAgent(options), ...(mcp === undefined ? {} : { mcp }) };
274
+ }
275
+ catch (error) {
276
+ await host.dispose().catch(() => undefined);
277
+ await mcp?.close().catch(() => undefined);
278
+ throw error;
279
+ }
280
+ }
281
+ #registerGeneratedImages(input, eventSessionId, artifacts) {
282
+ if (eventSessionId !== input.sessionId)
283
+ return [];
284
+ const root = marAgentGeneratedImagesDirectory(input.homeDirectory, input.sessionId);
285
+ if (root === undefined)
286
+ return [];
287
+ const images = marAgentGeneratedImageSources(input.homeDirectory, input.sessionId, artifacts);
288
+ return images.length === 0
289
+ ? []
290
+ : (this.#registerNativeImages?.(hostedConversationImageRunId(input.conversationId), [root], images) ?? []);
291
+ }
292
+ #registerInputImages(input, entry) {
293
+ if (entry.sessionId !== input.sessionId ||
294
+ entry.images === undefined ||
295
+ entry.images.length === 0)
296
+ return [];
297
+ const readableImages = entry.images.flatMap((image, imageIndex) => image.readable
298
+ ? [
299
+ {
300
+ image,
301
+ imageIndex
302
+ }
303
+ ]
304
+ : []);
305
+ if (readableImages.length === 0)
306
+ return [];
307
+ const registeredImages = this.#registerNativeImages?.(hostedConversationImageRunId(input.conversationId), [], readableImages.map(({ image, imageIndex }) => ({
308
+ name: image.name,
309
+ mime: image.mimeType,
310
+ byteSize: image.byteSize,
311
+ sourceId: `${entry.sessionId}:${entry.sequence}:${imageIndex}`,
312
+ read: () => this.#readInputImage(input.homeDirectory, entry.sessionId, entry.sequence, imageIndex, {
313
+ name: image.name,
314
+ mimeType: image.mimeType,
315
+ byteSize: image.byteSize
316
+ })
317
+ }))) ?? [];
318
+ let registeredIndex = 0;
319
+ return entry.images.map((image) => image.readable ? registeredImages[registeredIndex++] : undefined);
320
+ }
321
+ async #readInputImage(homeDirectory, sessionId, sequence, imageIndex, expected) {
322
+ let catalog;
323
+ try {
324
+ catalog = await this.#openCatalog({ homeDirectory });
325
+ const image = await catalog.readImage(sessionId, { sequence, imageIndex });
326
+ if (image === undefined ||
327
+ image.name !== expected.name ||
328
+ image.mimeType !== expected.mimeType ||
329
+ image.byteSize !== expected.byteSize)
330
+ return undefined;
331
+ return {
332
+ name: image.name,
333
+ mime: image.mimeType,
334
+ dataBase64: image.dataBase64
335
+ };
336
+ }
337
+ catch {
338
+ return undefined;
339
+ }
340
+ finally {
341
+ await catalog?.close().catch(() => undefined);
342
+ }
343
+ }
344
+ }
345
+ function projectHostedEvent(normalizer, event, userMessage, registerGeneratedImages) {
346
+ const createdAt = Date.parse(event.timestamp);
347
+ const base = {
348
+ executionId: event.executionId,
349
+ ...(event.turnId === undefined ? {} : { turnId: event.turnId }),
350
+ sequence: event.sequence,
351
+ createdAt: Number.isFinite(createdAt) ? createdAt : 0
352
+ };
353
+ if (event.type === 'execution.started')
354
+ return [
355
+ { ...base, kind: 'RUN', payload: { status: 'RUNNING' } },
356
+ ...(event.turnId === undefined
357
+ ? []
358
+ : [
359
+ {
360
+ ...base,
361
+ kind: 'ITEM',
362
+ payload: {
363
+ item: {
364
+ itemId: `${event.turnId}:user`,
365
+ kind: 'user_message',
366
+ status: 'COMPLETED',
367
+ payload: {
368
+ clientMessageId: userMessage.clientMessageId,
369
+ text: userMessage.prompt,
370
+ contexts: [],
371
+ delivery: 'ACCEPTED'
372
+ }
373
+ }
374
+ }
375
+ }
376
+ ])
377
+ ];
378
+ if (event.type === 'execution.completed')
379
+ return [{ ...base, kind: 'RUN', payload: { status: 'SUCCEEDED' } }];
380
+ if (event.type === 'execution.cancelled')
381
+ return [{ ...base, kind: 'RUN', payload: { status: 'INTERRUPTED' } }];
382
+ const runEvent = event.type === 'execution.failed'
383
+ ? [{ ...base, kind: 'RUN', payload: { status: 'FAILED' } }]
384
+ : [];
385
+ if (event.type === 'message.delta')
386
+ return [
387
+ ...runEvent,
388
+ {
389
+ ...base,
390
+ kind: 'DELTA',
391
+ payload: {
392
+ itemId: normalizer.messageItemId(event.itemId),
393
+ text: event.delta,
394
+ phase: event.phase
395
+ }
396
+ }
397
+ ];
398
+ return [
399
+ ...runEvent,
400
+ ...normalizer.normalize(event).map((item) => ({
401
+ ...base,
402
+ kind: 'ITEM',
403
+ payload: {
404
+ item: hostedConversationItem(item, event.sessionId, registerGeneratedImages)
405
+ }
406
+ }))
407
+ ];
408
+ }
409
+ function hostedConversationItem(item, sessionId, registerGeneratedImages) {
410
+ const { generatedImages, ...publicItem } = item;
411
+ const attachments = generatedImages === undefined
412
+ ? []
413
+ : (registerGeneratedImages?.(sessionId, generatedImages) ?? []);
414
+ if (attachments.length === 0)
415
+ return publicItem;
416
+ return { ...publicItem, payload: { ...publicItem.payload, attachments } };
417
+ }
418
+ function hostedPathMounts(input) {
419
+ if (!('sessionId' in input))
420
+ return input.pathMounts;
421
+ const generatedImages = marAgentGeneratedImagesDirectory(input.homeDirectory, input.sessionId);
422
+ const logicalPath = hostedConversationGeneratedImagesDisplayDirectory(input.sessionId);
423
+ if (generatedImages === undefined || logicalPath === undefined)
424
+ return input.pathMounts;
425
+ if (input.pathMounts.some((mount) => mount.logicalPath === logicalPath))
426
+ return input.pathMounts;
427
+ return [
428
+ ...input.pathMounts,
429
+ {
430
+ logicalPath,
431
+ physicalPath: generatedImages,
432
+ writable: false
433
+ }
434
+ ];
435
+ }
436
+ function hostedEnvironment() {
437
+ return {
438
+ PATH: '/usr/bin:/bin',
439
+ LANG: 'C.UTF-8',
440
+ LC_ALL: 'C.UTF-8',
441
+ SHELL: '/bin/bash',
442
+ MAR_AGENT_HOSTED_ENVIRONMENT: createHash('sha256')
443
+ .update('myagentroam-hosted-environment-v1')
444
+ .digest('hex')
445
+ };
446
+ }