@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.
- package/LICENSE +202 -0
- package/NOTICE +4 -0
- package/dist/capabilities.js +110 -2
- package/dist/claude-agent-sdk.js +330 -2
- package/dist/claude-channel.js +44 -2
- package/dist/codex-app-server.js +510 -2
- package/dist/config.js +106 -2
- package/dist/connector/node-connector-options.js +1 -2
- package/dist/connector/node-operation-router.js +22 -2
- package/dist/connector.js +1736 -2
- package/dist/control-outbound-scheduler.js +153 -2
- package/dist/database.js +639 -2
- package/dist/fake-runner.js +129 -2
- package/dist/git-askpass.js +12 -0
- package/dist/git-execution-helper.js +266 -0
- package/dist/health.js +3 -2
- package/dist/main.js +57 -2
- package/dist/mcp-installation-model.js +1 -2
- package/dist/migrations/v004.js +55 -3
- package/dist/migrations/v005.js +13 -3
- package/dist/migrations/v006.js +90 -3
- package/dist/migrations/v007.js +22 -3
- package/dist/migrations/v008.js +18 -3
- package/dist/migrations/v009.js +70 -4
- package/dist/migrations/v010.js +43 -3
- package/dist/migrations/v011.js +20 -3
- package/dist/migrations/v012.js +8 -0
- package/dist/native-jsonl-reader.js +186 -2
- package/dist/native-session-history.js +1143 -2
- package/dist/opencode-runtime.js +80 -2
- package/dist/opencode-server.js +259 -2
- package/dist/operational.js +122 -2
- package/dist/process-tree.js +18 -2
- package/dist/ripgrep-binary.js +31 -2
- package/dist/rotating-log.js +67 -2
- package/dist/runner/abstract-runner.js +260 -2
- package/dist/runner/claude/managed-run-controller.js +355 -2
- package/dist/runner/claude/tool-normalizer.js +120 -2
- package/dist/runner/claude-code-runner.js +303 -2
- package/dist/runner/codex/composer-image-markers.js +8 -2
- package/dist/runner/codex/conversation-parser.js +913 -2
- package/dist/runner/codex/managed-run-controller.js +494 -2
- package/dist/runner/codex/tool-normalizer.js +214 -2
- package/dist/runner/codex-runner.js +585 -2
- package/dist/runner/fake-test-runner.js +47 -2
- package/dist/runner/mar-agent/conversation-normalizer.js +644 -2
- package/dist/runner/mar-agent/executor-stdio-client-transport.js +139 -2
- package/dist/runner/mar-agent/generated-images.js +41 -2
- package/dist/runner/mar-agent/history-projection.js +106 -2
- package/dist/runner/mar-agent/hosted-conversation-runtime.js +446 -2
- package/dist/runner/mar-agent/managed-run-controller.js +785 -2
- package/dist/runner/mar-agent/mcp-client-pool.js +233 -2
- package/dist/runner/mar-agent/runtime-model-factory.js +326 -2
- package/dist/runner/mar-agent-runner.js +458 -2
- package/dist/runner/opencode/conversation-parser.js +221 -2
- package/dist/runner/opencode/managed-run-controller.js +588 -2
- package/dist/runner/opencode/tool-normalizer.js +80 -2
- package/dist/runner/opencode-runner.js +426 -2
- package/dist/runner/runner-registry.js +87 -2
- package/dist/runner-command-engine.js +71 -2
- package/dist/runner-profiles.js +323 -2
- package/dist/runner-usage.js +190 -2
- package/dist/runtime-command-detector.js +73 -2
- package/dist/runtime-model.js +1 -2
- package/dist/runtime-state.js +1509 -2
- package/dist/service/attachment-domain-state.js +7 -2
- package/dist/service/bubblewrap-sandbox-executor.js +543 -2
- package/dist/service/continuous-run-coordinator.js +425 -2
- package/dist/service/conversation-history-service.js +552 -2
- package/dist/service/conversation-hosting-capability-service.js +61 -2
- package/dist/service/conversation-hosting-enablement-service.js +91 -2
- package/dist/service/conversation-hosting-maintenance-service.js +174 -2
- package/dist/service/conversation-segment-service.js +162 -2
- package/dist/service/conversation-template-node-service.js +992 -2
- package/dist/service/external-session-resume-service.js +152 -2
- package/dist/service/fake-managed-run-service.js +60 -2
- package/dist/service/git-execution-service.js +418 -0
- package/dist/service/git-operation-service.js +57 -0
- package/dist/service/hosted-conversation-node-service.js +1982 -2
- package/dist/service/hosted-conversation-store.js +1405 -2
- package/dist/service/managed-runner-session-service.js +35 -2
- package/dist/service/mar-agent-model-transport-test-service.js +88 -2
- package/dist/service/mcp-installation-verifier.js +87 -2
- package/dist/service/mcp-node-operation-service.js +90 -2
- package/dist/service/mission-mcp-server.js +124 -2
- package/dist/service/mission-mcp-stdio.js +40 -2
- package/dist/service/mission-runtime.js +142 -2
- package/dist/service/native-session-projection-service.js +274 -2
- package/dist/service/native-session-watch-service.js +683 -2
- package/dist/service/node-connection-lifecycle-service.js +88 -2
- package/dist/service/node-control-channel.js +85 -2
- package/dist/service/node-control-message-service.js +109 -2
- package/dist/service/node-request-service.js +62 -2
- package/dist/service/node-run-event-bridge.js +88 -2
- package/dist/service/node-terminal-channel.js +202 -2
- package/dist/service/node-upgrade-coordinator.js +137 -2
- package/dist/service/node-workspace-coordinator.js +97 -2
- package/dist/service/recent-run-projection-service.js +99 -2
- package/dist/service/run-attachment-service.js +321 -2
- package/dist/service/run-domain-state.js +4 -2
- package/dist/service/run-event-service.js +246 -2
- package/dist/service/run-ownership-policy.js +22 -2
- package/dist/service/run-workbench-service.js +120 -2
- package/dist/service/runner-channel-message-service.js +20 -2
- package/dist/service/runner-interaction-service.js +243 -2
- package/dist/service/runner-service.js +69 -2
- package/dist/service/runtime-credential-control-service.js +95 -2
- package/dist/service/session-catalog-service.js +404 -2
- package/dist/service/session-command-service.js +125 -2
- package/dist/service/session-context-service.js +128 -2
- package/dist/service/session-domain-state.js +9 -2
- package/dist/service/session-identity-service.js +86 -2
- package/dist/service/session-lifecycle-service.js +248 -2
- package/dist/service/session-message-service.js +270 -2
- package/dist/service/session-presentation-service.js +43 -2
- package/dist/service/session-query-service.js +82 -2
- package/dist/service/session-watch-slot-coordinator.js +21 -2
- package/dist/service/skill-directory-service.js +238 -2
- package/dist/service/skill-install-service.js +434 -2
- package/dist/service/skill-node-operation-service.js +206 -2
- package/dist/service/terminal-relay-state.js +3 -2
- package/dist/service/terminal-service.js +90 -2
- package/dist/service/web-search-error.js +40 -2
- package/dist/service/workbench-event-service.js +21 -2
- package/dist/service/workbench-manifest-service.js +69 -2
- package/dist/service/workspace-change-service.js +290 -2
- package/dist/service/workspace-content-search-service.js +457 -2
- package/dist/service/workspace-domain-state.js +41 -2
- package/dist/service/workspace-file-service.js +150 -2
- package/dist/service/workspace-git-exclude-service.js +119 -2
- package/dist/service/workspace-queue-workbench-service.js +176 -2
- package/dist/service/workspace-service.js +92 -2
- package/dist/service/workspace-session-service.js +154 -2
- package/dist/service/workspace-upload-service.js +262 -2
- package/dist/service/workspace-watch-controller.js +68 -2
- package/dist/service/workspace-watch-service.js +170 -2
- package/dist/service/workspace-watch-snapshot-service.js +218 -2
- package/dist/service/workspace-workbench-service.js +239 -2
- package/dist/service.js +91 -2
- package/dist/storage.js +32 -2
- package/dist/supervisor.js +136 -2
- package/dist/terminal.js +496 -2
- package/dist/util/git-credential-client.js +32 -0
- package/dist/util/node-operation-data.js +9 -2
- package/dist/util/node-operation-parsers.js +382 -2
- package/dist/util/personal-instructions.js +34 -2
- package/dist/util/runner-error.js +70 -2
- package/dist/util/runner-native-session-parsers.js +510 -2
- package/dist/util/safe-error.js +8 -2
- package/dist/util/secret-environment.js +25 -2
- package/dist/workspace.js +1793 -2
- package/package.json +11 -8
- package/vendor/ripgrep/darwin-arm64/rg +0 -0
- package/vendor/ripgrep/darwin-x64/rg +0 -0
- package/vendor/ripgrep/manifest.json +12 -0
- package/README.md +0 -42
- package/dist/event-buffer.js +0 -2
- package/dist/migrations/v001.js +0 -107
- package/dist/migrations/v002.js +0 -2
- package/dist/migrations/v003.js +0 -2
- package/dist/service/mcp-package-installer.js +0 -2
|
@@ -1,2 +1,446 @@
|
|
|
1
|
-
|
|
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
|
+
}
|