@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,458 @@
|
|
|
1
|
-
|
|
2
|
-
const _0x40c726=_0x3627;(function(_0xb5c86b,_0x518c1a){const _0x392170=_0x3627,_0x1b1bc5=_0xb5c86b();while(!![]){try{const _0x49c7c9=-parseInt(_0x392170(0x121))/(0x2f*0x2a+0x1*-0x18da+-0x21*-0x85)*(-parseInt(_0x392170(0x14f))/(-0x1*0x1deb+-0x4*-0x409+0xdc9))+parseInt(_0x392170(0x16a))/(-0x15af+0x277*0x1+-0x9*-0x223)+parseInt(_0x392170(0xf3))/(0xc1f+-0x781+-0x3e*0x13)+-parseInt(_0x392170(0x137))/(0xc89*0x3+0x2097+-0x5*0xe09)*(parseInt(_0x392170(0x170))/(-0x1*0x1997+-0x8d+0x1a2a))+-parseInt(_0x392170(0x178))/(0x16a3+-0x548+-0x1154)*(-parseInt(_0x392170(0x102))/(0x212f+0xff4*0x1+0x1*-0x311b))+parseInt(_0x392170(0x147))/(0x17c3+0xf72+-0x272c)*(-parseInt(_0x392170(0x174))/(0x5*-0x48b+-0x1*0x637+0x48*0x67))+-parseInt(_0x392170(0x122))/(0x2*-0x1043+-0xe20+0x2eb1);if(_0x49c7c9===_0x518c1a)break;else _0x1b1bc5['push'](_0x1b1bc5['shift']());}catch(_0x1009de){_0x1b1bc5['push'](_0x1b1bc5['shift']());}}}(_0xe4a0,-0x140691+-0xcaa49+0x2b8b9f));import{marAgentNodeModelSummarySchema,resolveMarAgentDefaultReasoningEffort}from'@myagentroam/protocol';import{MarAgentError,openMarAgentSessionCatalog}from'@myagentroam/agent';import{homedir}from'node:os';function _0xe4a0(){const _0x291f04=['surmrq','C2vZC2LVBI5YB2XSyMfJAW','DxnLCI1PBNb1Da','BgLTAxq','l21PC3nPB24','twLZC2LVBG','CMvNAxn0zxjjBNb1DeLTywDLCW','DhvYBI5PBNrLCNj1Chq','uLvotKvsx1jfu1vnrv9gquLmruq','C3vWCg9YDhndB25MAwD1CMf0Aw9U','ChjVAMvJDgLVBKzVCG','mZeXmty5mMroy09VBq','CNvUlMnHBMnLBa','uKvtvu1bqKXf','DxnLCG','BwLZC2LVBG','qxnRigjLzM9Yzsb0B29SCYb3AxrOihnPzguGzwzMzwn0CY4GvgHPCYbPCYbUB3qGyw4GB3bLCMf0Aw5Nlxn5C3rLBsbZyw5KyM94lG','BMfTzq','Cgf0Aa','y2XVC2u','tufsx1jvtLrjtuu','C2vZC2LVBNm','CMvHze1HBMfNzwrsDw5UzxjuAxrSzq','A2LUza','BgvUz3rO','zNvSBc1Hy2nLC3m','ohjMDeHkra','BwfW','BwnW','ywnJzxnZt3b0Aw9UCW','zwzMB3j0','rw50zxiGCgvYC2LZDgvUDcbnAxnZAw9Uig1VzguU','BwfYqwDLBNq','CMvZB2X2zq','zMLSDgvY','yNL0zvnPEMu','ywrK','zM9YA05HDgL2zq','DhvYBKLK','y3vYC29Y','yxbWCM92ywWUCMvZCg9Uza','y3DK','BwLTzvr5Cgu','zxzLBNq','zMXHDe1HCa','y29UzMLNDxjLtw9KzwXZ','D29YA3nWywnL','zMLUza','CMvTzw1Izxjnyw5Hz2vKtMf0AxzL','su1nrurjqvrfx0fdveLptG','C3vJy2vZCW','BMf0AxzLq29UDhjVBa','C2fMzvbHCNnL','u2TPCcbbz2vUDcbHChbYB3zHBhmUieHVC3qGDMfSAwrHDgLVBIbYzw1HAw5ZigfJDgL2zsbHBMqGBM8GqwDLBNqGC2fUzgjVEcbPCYbWCM92AwrLzc4','tufoquDfra','vu5bvKfjtefcteu','y29UDgv4DfvZywDL','ntG1mdDeALHnEem','mtuXodC2mZrLzxztv3e','C2vZC2LVBI5WAw4','t24TCMvXDwvZDa','C2vZC2LVBI5YzxDPBMq','Ag9TzurPCMvJDg9YEq','y3jLyxrL','ve9hr0Xf','ChjVzMLSzq','zgvMyxvSDenVBMzPz3vYyxrPB24','CMvZDw1LrxH0zxjUywW','ChvZAa','tuLtu0LorW','zw5HyMXLza','q29TCgfJDcb0AguGy3vYCMvUDcbZzxnZAw9UignVBNrLEhqU','zgLZy292zxjtzxnZAw9UCW','y2f0y2G','u0vtu0LptL9st0XmqKfds19vtKfwquLmqujmrq','AxnbCNjHEq','y29TBwfUzfn0yxrLCW','BwfUywDLzefJDgL2zq','BMf0AxzLsw1Hz2vsB290CW','odu1mtq1uMH1q0Dh','uLvotKvsx1voqvzbsuXbqKXf','Aw5JBhvKzxm','y3jLyxrLuhjVAMvJDgLVBG','DxnLCI1PBNb1Dc5YzxnWB25K','CMvHzenVBNrLEhrvC2fNzq','DgL0Bgu','vg9Nz2XLignVBgXHyM9YyxrPDMuGugXHBIbnB2rLlG','C2v0u2vZC2LVBLjLC291CMnLuMvSzwfZzxi','u0vtu0LptL9srvDjtKrFvu5bvKfjtefcteu','zM9YAW','C3vWCg9YDgvKrwzMB3j0CW','CMvHC29UAw5NrwzMB3j0CW','rNvSBcbHy2nLC3m','BgLZDa','BgfZDefJDgL2Axr5qxq','mtaWmJy5otLtueTREui','CMvHze9MzMLJAwfSq29UDMvYC2f0Aw9U','C2vZC2LVBI5Yzw5HBwu','zw50CMLLCW','B24TCMvXDwvZDa','ywnJzxnZ','CM9SBgjHy2S','CMvTB3zLtMf0AxzL','mZHwuMLms1C','C29Tzq','zxH0zxjUywXtzxnZAw9Uswq','zgvMyxvSDfjLyxnVBMLUz0vMzM9YDa','Aw1Hz2vZ','C3vIywDLBNq','y3vYCMvUDfjLC3vTzwq','B2zMAwnPywW','zgLZy292zxj5u2nVCgu','CMvNAxn0zxjhzw5LCMf0zwrjBwfNzxm','C2vZC2LVBI5Yzw1VDMu','CgfYC2u','zgvMyxvSDevMzM9YDa','Bw9KzwXZ','ChjVzMLSzuzVCLzHBgLKyxrPB24','Aw5WDxruB2TLBNm','CMvHzenVBNzLCNnHDgLVBKHPC3rVCNK','zgvSzxrL','yxzHAwXHyMXL','ChjLC2vUDfnLC3nPB24','tufoquDfrf9bq1rjvKu','zMXHDa','y29Kzq','C2vXDwvUy2u','DhvYBI5XDwv1zq','CMvHzeLTywDL','Bw9KzwXjza','mJCYnZe4mfjSBxznyG','C2L6zq','CNvUBMvY','zgf0yujHC2u2na','C3rVCa','C2vZC2LVBKLK','mZbZCgv6AKe','DhvYBI5ZDgfYDa','quXmx1DpuKTtuefdrvm','tufsx01btKfhruq','mtbdAKzqvKe','zw5ZDxjLq29UzMLNDxjHDgLVBG','BwfYlwfNzw50','AgLZDg9YEs5YzwfK','odGZodG5m3vmv0vZwG','y29TCgfJDa','zgvSzxrLza','C2v0r2vUzxjHDgvKsw1Hz2vszwDPC3rYyxi','yxbWCM92ywW','Bw9KzwW','zxzLBNrZlMXPDMu','C2XPy2u','y29UDMvYC2f0Aw9U','AgLZDg9YEq','y29UDgv4DfDPBMrVD1rVA2vUCW','BMv4Den1CNnVCG','CM9SBgjHy2ToyxrPDMu','CgXHBG','Dg9szxzLCNnLza','tKfusvzf','CMvHzgfIBgu','D29YA3nWywnLCW','ChjVBw90zq'];_0xe4a0=function(){return _0x291f04;};return _0xe4a0();}import{resolve}from'node:path';function _0x3627(_0x45376e,_0x30bef8){_0x45376e=_0x45376e-(0xf5e+0x17f*0x3+0x3ca*-0x5);const _0x91a27c=_0xe4a0();let _0x1e6fd8=_0x91a27c[_0x45376e];if(_0x3627['TaeyvH']===undefined){var _0x1f233c=function(_0x18b8db){const _0x46ebe9='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1a0d23='',_0x4c5d2b='';for(let _0x26718d=0x3d7*0x5+0xe8b+-0x4d2*0x7,_0x3c9d07,_0x144379,_0x2608b8=-0x2099+0x28d*-0x1+0x16*0x199;_0x144379=_0x18b8db['charAt'](_0x2608b8++);~_0x144379&&(_0x3c9d07=_0x26718d%(0x166a+0x2*0xd3d+-0x30e0)?_0x3c9d07*(-0x24ce*0x1+-0xb49+-0x63*-0x7d)+_0x144379:_0x144379,_0x26718d++%(0x1314+-0x55*0x20+-0x870))?_0x1a0d23+=String['fromCharCode'](0xd99+0xcbf+-0x3f*0x67&_0x3c9d07>>(-(0x1dc7*-0x1+-0x9e*0x25+0x349f)*_0x26718d&-0x1626+0xabd*0x2+0xb2)):-0x270a+0x8a8*-0x2+0x385a){_0x144379=_0x46ebe9['indexOf'](_0x144379);}for(let _0x32c6b4=-0x65*-0xf+0x1354+-0x193f,_0x3c6933=_0x1a0d23['length'];_0x32c6b4<_0x3c6933;_0x32c6b4++){_0x4c5d2b+='%'+('00'+_0x1a0d23['charCodeAt'](_0x32c6b4)['toString'](0x2*0xfa7+0x22a3+-0x41e1*0x1))['slice'](-(0x1*0x93b+-0x9b9+0x80));}return decodeURIComponent(_0x4c5d2b);};_0x3627['CGfHQT']=_0x1f233c,_0x3627['eAmsIn']={},_0x3627['TaeyvH']=!![];}const _0x5e63c9=_0x91a27c[0x1421+-0x420*0x3+-0x7c1*0x1];_0x3627['jCZHhI']!==_0x5e63c9&&(_0x3627['eAmsIn']={},_0x3627['jCZHhI']=_0x5e63c9);const _0x523fe1=_0x3627['eAmsIn'][_0x45376e];return _0x523fe1===undefined?(_0x1e6fd8=_0x3627['CGfHQT'](_0x1e6fd8),_0x3627['eAmsIn'][_0x45376e]=_0x1e6fd8):_0x1e6fd8=_0x523fe1,_0x1e6fd8;}import{AbstractRunner}from'./abstract-runner.js';import{marAgentGeneratedImageSources,marAgentGeneratedImagesDirectory}from'./mar-agent/generated-images.js';import{projectMarAgentHistory}from'./mar-agent/history-projection.js';export class MarAgentRunner extends AbstractRunner{[_0x40c726(0x126)];[_0x40c726(0xf9)]=_0x40c726(0x176);[_0x40c726(0x157)]=_0x40c726(0x172);#models=[];#releaseSessionResources;#generatedImageRegistrar;constructor(_0x36cba5=homedir()){const _0x12e201=_0x40c726;super(),this[_0x12e201(0x126)]=_0x36cba5;}[_0x40c726(0x115)](_0x1698b9){const _0x3ee552=_0x40c726;this.#models=Array[_0x3ee552(0x133)](_0x1698b9)?_0x1698b9[_0x3ee552(0x10a)](isModelSummary):[];}[_0x40c726(0x13f)](_0x2fa223){this.#releaseSessionResources=_0x2fa223;}[_0x40c726(0x17b)](_0x1fa461){this.#generatedImageRegistrar=_0x1fa461;}[_0x40c726(0x158)](_0x55e510,_0x59f72a,_0x3b6e6f){const _0x2f270=_0x40c726;if(_0x55e510[_0x2f270(0x16c)]!==this[_0x2f270(0xf9)]||_0x55e510[_0x2f270(0x151)]===null||_0x55e510[_0x2f270(0x151)]!==_0x59f72a)return[];const _0x4247ed=marAgentGeneratedImageSources(this[_0x2f270(0x126)],_0x59f72a,_0x3b6e6f);return _0x4247ed[_0x2f270(0x100)]===-0xef*-0x1f+-0x63+-0x1c8e?[]:this.#generatedImageRegistrar?.(_0x55e510,_0x4247ed)??[];}[_0x40c726(0xee)](_0x803470,_0x4c866d){const _0x44f135=_0x40c726;if(_0x803470[_0x44f135(0x16c)]!==this[_0x44f135(0xf9)]||_0x803470[_0x44f135(0x151)]===null||_0x803470[_0x44f135(0x151)]!==_0x4c866d[_0x44f135(0x16f)]||_0x4c866d[_0x44f135(0x153)]===undefined||_0x4c866d[_0x44f135(0x153)][_0x44f135(0x100)]===0x77d*-0x1+0x9c*0x3b+-0x1*0x1c77)return[];const _0x2e4626=_0x4c866d[_0x44f135(0x153)][_0x44f135(0x114)]((_0x45fb5f,_0x339d2f)=>_0x45fb5f[_0x44f135(0x188)]?[{'image':_0x45fb5f,'imageIndex':_0x339d2f}]:[]);if(_0x2e4626[_0x44f135(0x100)]===0x21b4+0xa95+-0x2c49)return[];const _0x3af3e1=this.#generatedImageRegistrar?.(_0x803470,_0x2e4626[_0x44f135(0x103)](({image:_0x22b45b,imageIndex:_0x1e5023})=>({'name':_0x22b45b[_0x44f135(0xf9)],'mime':_0x22b45b[_0x44f135(0x112)],'byteSize':_0x22b45b[_0x44f135(0x10b)],'sourceId':_0x4c866d[_0x44f135(0x16f)]+':'+_0x4c866d[_0x44f135(0x166)]+':'+_0x1e5023,'read':()=>this.#readInputImage(_0x4c866d[_0x44f135(0x16f)],_0x4c866d[_0x44f135(0x166)],_0x1e5023,{'name':_0x22b45b[_0x44f135(0xf9)],'mimeType':_0x22b45b[_0x44f135(0x112)],'byteSize':_0x22b45b[_0x44f135(0x10b)]})})))??[];let _0x23d278=0x228d+-0x59*0x6b+-0x3*-0xe2;return _0x4c866d[_0x44f135(0x153)][_0x44f135(0x103)](_0x484128=>_0x484128[_0x44f135(0x188)]?_0x3af3e1[_0x23d278++]:undefined);}[_0x40c726(0x129)](_0x209593){const _0x4cdd4a=_0x40c726;if(!this[_0x4cdd4a(0x161)](_0x209593))return undefined;return this[_0x4cdd4a(0x15d)]();}[_0x40c726(0x161)](_0x2f6c80){const _0x409d9e=_0x40c726;return _0x2f6c80[_0x409d9e(0x108)]?.[_0x409d9e(0x161)]===!![];}[_0x40c726(0x15d)](){const _0x342566=_0x40c726,_0x53f2ea=this.#models[_0x342566(0x10a)](_0x3d3156=>_0x3d3156[_0x342566(0x12e)]);return{'runner':_0x342566(0x176),'models':_0x53f2ea[_0x342566(0x103)]((_0x528c5d,_0xb1a8bf)=>({'id':_0x528c5d['id'],'label':_0x528c5d[_0x342566(0xf9)],'supportedEfforts':[..._0x528c5d[_0x342566(0x143)]],'defaultEffort':resolveMarAgentDefaultReasoningEffort(_0x528c5d[_0x342566(0x152)],_0x528c5d[_0x342566(0x143)]),..._0xb1a8bf===-0x1e6a+0xaf3+0xb*0x1c5?{'isDefault':!![]}:{}})),'accessOptions':[{'id':_0x342566(0x101),'label':_0x342566(0x144),'description':_0x342566(0x11d)},{'id':_0x342566(0x14b),'label':_0x342566(0x124),'description':_0x342566(0xf8)}],'commands':[...[_0x342566(0x179),_0x342566(0x185)][_0x342566(0x103)](_0x45376e=>({'id':_0x45376e,'runner':_0x342566(0x176),'label':'/'+_0x45376e,'description':_0x45376e===_0x342566(0x179)?_0x342566(0x12f):_0x342566(0x13e),'inputHint':'/'+_0x45376e,'source':_0x342566(0xfc),'interaction':_0x45376e===_0x342566(0x185)?_0x342566(0x128):_0x342566(0x119),'available':!![],'reasonCode':null})),{'id':_0x342566(0xf7),'runner':_0x342566(0x176),'label':_0x342566(0xec),'stateLabel':_0x342566(0xed),'description':_0x342566(0x107),'inputHint':_0x342566(0xec),'source':_0x342566(0xfc),'interaction':_0x342566(0x128),'available':!![],'reasonCode':null}],'capabilities':[_0x342566(0x171),_0x342566(0x180),_0x342566(0x17c),_0x342566(0xea),_0x342566(0x185),_0x342566(0x179),_0x342566(0x104),_0x342566(0x154)]};}[_0x40c726(0xf1)](_0x30bef8){const _0x43b40c=_0x40c726;if(_0x30bef8[_0x43b40c(0x16c)]!==this[_0x43b40c(0xf9)])return![];const _0x91a27c=this[_0x43b40c(0x15d)](),_0x1e6fd8=_0x91a27c[_0x43b40c(0x15c)][_0x43b40c(0x117)](_0x1f233c=>_0x1f233c['id']===_0x30bef8[_0x43b40c(0x17d)]);return _0x1e6fd8!==undefined&&(_0x1e6fd8[_0x43b40c(0x142)][_0x43b40c(0x100)]===-0x1f*0x89+-0x153d+0x25d4?_0x30bef8[_0x43b40c(0x106)]===_0x1e6fd8[_0x43b40c(0x15b)]:_0x1e6fd8[_0x43b40c(0x142)][_0x43b40c(0x139)](_0x30bef8[_0x43b40c(0x106)]))&&_0x91a27c[_0x43b40c(0x105)][_0x43b40c(0x150)](_0x5e63c9=>_0x5e63c9['id']===_0x30bef8[_0x43b40c(0x14c)]);}[_0x40c726(0x12a)](){const _0x181792=_0x40c726,_0x523fe1=this[_0x181792(0x15d)](),_0x18b8db=_0x523fe1[_0x181792(0x15c)][-0x63d*-0x3+0x2695+-0x394c];return{'runner':_0x181792(0x176),'model':_0x18b8db?.['id']??'','effort':_0x18b8db?.[_0x181792(0x15b)]??'','access':_0x181792(0x101)};}[_0x40c726(0x162)](_0x46ebe9,_0x1a0d23,_0x4c5d2b){const _0x571469=_0x40c726;if(!this[_0x571469(0x161)](_0x1a0d23))return{'activity':_0x571469(0x11f),'control':{'level':_0x571469(0x11f),'capabilities':[]},'runtime':{'level':_0x571469(0x11f),'capabilities':[],'reasonCode':_0x571469(0x138)},'commandStates':_0x4c5d2b[_0x571469(0x134)]};const _0x26718d=_0x46ebe9[_0x571469(0x11b)]===_0x571469(0x173),_0x3c9d07=_0x4c5d2b[_0x571469(0x135)]?_0x571469(0x163):_0x571469(0x18b),_0x144379=[_0x571469(0x177),_0x571469(0x17e),_0x571469(0x171),_0x571469(0x167),_0x571469(0xef),_0x571469(0xf4),_0x571469(0x110),_0x571469(0x13b),_0x571469(0x149),_0x571469(0x159),_0x571469(0x123),..._0x46ebe9[_0x571469(0x151)]===null?[]:[_0x571469(0x125),_0x571469(0xe9)]];return{'activity':_0x3c9d07,'control':{'level':_0x26718d?_0x571469(0x11e):_0x571469(0xf5),'capabilities':[_0x571469(0x177),_0x571469(0x17e),_0x571469(0x171),_0x571469(0xef)]},'runtime':{'level':_0x26718d?_0x571469(0x11e):_0x571469(0xf5),'capabilities':_0x144379,'reasonCode':null},'commandStates':_0x4c5d2b[_0x571469(0x134)]};}[_0x40c726(0x12b)](_0x2608b8,_0x32c6b4){const _0x415ba3=_0x40c726;if(_0x2608b8[_0x415ba3(0x16c)]!==this[_0x415ba3(0xf9)]||_0x2608b8[_0x415ba3(0x151)]===null||!_0x32c6b4[_0x415ba3(0x161)])return Promise[_0x415ba3(0x109)]({'failureCode':_0x415ba3(0x138)});const _0x3c6933=_0x32c6b4[_0x415ba3(0x155)](_0x2608b8['id']);if(_0x3c6933)return Promise[_0x415ba3(0x109)]({'session':_0x32c6b4[_0x415ba3(0x175)](_0x3c6933),'activity':_0x415ba3(0x18b)});const _0x1ca002=_0x32c6b4[_0x415ba3(0xf2)](_0x2608b8),_0x1d4a9e=_0x1ca002?_0x32c6b4[_0x415ba3(0x18a)](_0x1ca002['id']):_0x32c6b4[_0x415ba3(0x127)](_0x2608b8);if(!_0x1d4a9e)return Promise[_0x415ba3(0x109)]({'failureCode':_0x415ba3(0xf0)});return _0x32c6b4[_0x415ba3(0x118)](_0x2608b8[_0x415ba3(0x151)],_0x1d4a9e['id']),Promise[_0x415ba3(0x109)]({'session':_0x32c6b4[_0x415ba3(0x175)](_0x1d4a9e),'activity':_0x415ba3(0x18b)});}async[_0x40c726(0x130)](_0x19a266,_0x337f80){const _0x59b32f=_0x40c726;let _0x5d92c6;try{_0x5d92c6=await openMarAgentSessionCatalog({'homeDirectory':this[_0x59b32f(0x126)]});const _0x51544e=await _0x5d92c6[_0x59b32f(0x145)]({'limit':0xc8}),_0x3bdaee=_0x337f80?[_0x337f80]:_0x19a266[_0x59b32f(0x189)];return _0x51544e[_0x59b32f(0xfd)][_0x59b32f(0x114)](_0x4a8eb1=>{const _0x3bcd10=_0x59b32f,_0x5789f1=_0x3bdaee[_0x3bcd10(0x117)](_0x547061=>resolve(_0x547061[_0x3bcd10(0xfa)])===resolve(_0x4a8eb1[_0x3bcd10(0x116)]));if(!_0x5789f1)return[];return[_0x19a266[_0x3bcd10(0x13a)]({'workspace':_0x5789f1,'runner':this[_0x3bcd10(0xf9)],'externalSessionId':_0x4a8eb1['id'],'cwd':_0x4a8eb1[_0x3bcd10(0x116)],'title':_0x4a8eb1[_0x3bcd10(0x13d)],'titleOrigin':_0x3bcd10(0x187),'lastActivityAt':Date[_0x3bcd10(0x15a)](_0x4a8eb1[_0x3bcd10(0x146)])})];});}catch{return[];}finally{await _0x5d92c6?.[_0x59b32f(0xfb)]()[_0x59b32f(0x131)](()=>undefined);}}async[_0x40c726(0x10d)](_0x31687d,_0x11a759,_0x1424c2){const _0x1d9ff3=_0x40c726;if(_0x31687d[_0x1d9ff3(0x151)]===null)throw new Error(_0x1d9ff3(0x140));const _0x2f8f03=await openMarAgentSessionCatalog({'homeDirectory':this[_0x1d9ff3(0x126)]});try{return(await _0x2f8f03[_0x1d9ff3(0x141)](_0x31687d[_0x1d9ff3(0x151)],{'boundaryTurnId':_0x11a759,'title':_0x1424c2}))['id'];}catch(_0x34e84d){if(_0x34e84d instanceof MarAgentError)throw new Error(_0x34e84d[_0x1d9ff3(0x165)],{'cause':_0x34e84d});throw _0x34e84d;}finally{await _0x2f8f03[_0x1d9ff3(0xfb)]()[_0x1d9ff3(0x131)](()=>undefined);}}async[_0x40c726(0x184)](_0x3feebb,_0x4800d3){const _0xfd87c5=_0x40c726;if(_0x3feebb[_0xfd87c5(0x151)]===null)throw new Error(_0xfd87c5(0x132));await this.#releaseSessionResources?.(_0x3feebb[_0xfd87c5(0x151)]);const _0xe35953=await openMarAgentSessionCatalog({'homeDirectory':this[_0xfd87c5(0x126)]});try{const _0x2af9c4=await _0xe35953[_0xfd87c5(0x14d)](_0x3feebb[_0xfd87c5(0x151)],{'boundaryTurnId':_0x4800d3});return Date[_0xfd87c5(0x15a)](_0x2af9c4[_0xfd87c5(0x146)]);}catch(_0x377fbf){if(_0x377fbf instanceof MarAgentError)throw new Error(_0x377fbf[_0xfd87c5(0x165)],{'cause':_0x377fbf});throw _0x377fbf;}finally{await _0xe35953[_0xfd87c5(0xfb)]()[_0xfd87c5(0x131)](()=>undefined);}}async[_0x40c726(0x14e)](_0x2ae46d,_0xd770b){const _0x16f2db=_0x40c726;if(_0x2ae46d[_0x16f2db(0x16c)]!==this[_0x16f2db(0xf9)]||_0x2ae46d[_0x16f2db(0x151)]!==_0xd770b)return![];await this.#releaseSessionResources?.(_0xd770b);const _0x2900fd=await openMarAgentSessionCatalog({'homeDirectory':this[_0x16f2db(0x126)]});try{return(await _0x2900fd[_0x16f2db(0x160)](_0xd770b))[_0x16f2db(0x17a)]?!![]:_0x16f2db(0x12d);}finally{await _0x2900fd[_0x16f2db(0xfb)]()[_0x16f2db(0x131)](()=>undefined);}}async[_0x40c726(0xfe)](_0x37d030,_0x1cefd6){const _0x4c6f05=_0x40c726;if(_0x37d030[_0x4c6f05(0x16c)]!==this[_0x4c6f05(0xf9)]||_0x37d030[_0x4c6f05(0x151)]!==_0x1cefd6)return undefined;const _0x2c750a=await openMarAgentSessionCatalog({'homeDirectory':this[_0x4c6f05(0x126)]});try{let _0x2d085f;do{const _0x29e514=await _0x2c750a[_0x4c6f05(0x145)]({'limit':0xc8,..._0x2d085f?{'cursor':_0x2d085f}:{}}),_0x236192=_0x29e514[_0x4c6f05(0xfd)][_0x4c6f05(0x117)](_0x5cb101=>_0x5cb101['id']===_0x1cefd6)?.[_0x4c6f05(0x13d)];if(_0x236192!==undefined)return _0x236192;_0x2d085f=_0x29e514[_0x4c6f05(0x183)];}while(_0x2d085f!==undefined);return undefined;}finally{await _0x2c750a[_0x4c6f05(0xfb)]()[_0x4c6f05(0x131)](()=>undefined);}}async[_0x40c726(0x148)](_0xcf664f,_0xbdb7d1){const _0x15f7a1=_0x40c726;if(_0xcf664f[_0x15f7a1(0x151)]===null)return undefined;const _0x5ba75b=await openMarAgentSessionCatalog({'homeDirectory':this[_0x15f7a1(0x126)]});try{const _0x29c684=_0xbdb7d1[_0x15f7a1(0xeb)]??0xabd*0x2+-0x865+-0xd0b;let _0x5c56e0=_0xbdb7d1[_0x15f7a1(0x10f)],_0xb8a695;const _0x46c47b=[],_0x229926=new Set();do{const _0x18df2e=await _0x5ba75b[_0x15f7a1(0x181)](_0xcf664f[_0x15f7a1(0x151)],{..._0x5c56e0===undefined?{}:{'cursor':_0x5c56e0},'limit':0x3e8});_0x46c47b[_0x15f7a1(0x12c)](_0x18df2e[_0x15f7a1(0x14a)]);for(const _0x655875 of _0x18df2e[_0x15f7a1(0x14a)]){const _0x56856d=_0x655875[_0x15f7a1(0xff)]===_0x15f7a1(0xf6)?_0x655875[_0x15f7a1(0x10e)]:_0x655875[_0x15f7a1(0x113)][_0x15f7a1(0x10e)];if(_0x56856d!==undefined)_0x229926[_0x15f7a1(0x10c)](_0x56856d);}_0xb8a695=_0x18df2e[_0x15f7a1(0x183)],_0x5c56e0=_0xb8a695;}while(_0x229926[_0x15f7a1(0x16b)]<=_0x29c684&&_0xb8a695!==undefined);const _0xa97df2=_0x46c47b[_0x15f7a1(0x186)]()[_0x15f7a1(0x164)](),_0x22a66c=projectMarAgentHistory(_0xcf664f,_0xa97df2,{'registerInputImages':_0x49989b=>this[_0x15f7a1(0xee)](_0xcf664f,_0x49989b),'registerGeneratedImages':(_0x38838,_0x13e470)=>this[_0x15f7a1(0x158)](_0xcf664f,_0x38838,_0x13e470)});if(_0x22a66c[_0x15f7a1(0x100)]>_0x29c684){const _0x29c959=_0x22a66c[_0x15f7a1(0x17f)](-_0x29c684),_0x16259b=firstSequenceForTurn(_0xa97df2,_0x29c959[0x8a8*-0x2+-0x23ec+0x4*0xd4f]['id']);return{'turns':_0x29c959,'nextCursor':_0x16259b===undefined?_0xb8a695??null:String(_0x16259b)};}return{'turns':_0x22a66c,'nextCursor':_0xb8a695??null};}catch{return undefined;}finally{await _0x5ba75b[_0x15f7a1(0xfb)]()[_0x15f7a1(0x131)](()=>undefined);}}async[_0x40c726(0x15f)](_0x954623){const _0x493c79=_0x40c726,_0x3b33d7=await _0x954623[_0x493c79(0x156)]();return _0x3b33d7===undefined?undefined:{..._0x3b33d7,'source':_0x493c79(0x156)};}[_0x40c726(0x136)](_0x5b3611){const _0x1fa4ed=_0x40c726,_0xa98079=_0x5b3611[_0x1fa4ed(0x151)]===null?undefined:marAgentGeneratedImagesDirectory(this[_0x1fa4ed(0x126)],_0x5b3611[_0x1fa4ed(0x151)]);return[resolve(_0x5b3611[_0x1fa4ed(0x111)]),..._0xa98079===undefined?[]:[_0xa98079]];}async[_0x40c726(0x13c)](_0x135f65){const _0x91adf3=_0x40c726;if(_0x135f65[_0x91adf3(0x151)]===null||_0x135f65[_0x91adf3(0x17d)]===null)return undefined;const _0x59ec87=this.#models[_0x91adf3(0x117)](_0x3595bd=>_0x3595bd['id']===_0x135f65[_0x91adf3(0x17d)]);if(_0x59ec87===undefined)return undefined;let _0x5015ea;try{_0x5015ea=await openMarAgentSessionCatalog({'homeDirectory':this[_0x91adf3(0x126)]});const _0x5de870=await _0x5015ea[_0x91adf3(0x120)](_0x135f65[_0x91adf3(0x151)]);return _0x5de870===undefined?undefined:{'model':_0x59ec87[_0x91adf3(0x169)],'usedTokens':_0x5de870[_0x91adf3(0x15e)],'maxTokens':_0x59ec87[_0x91adf3(0x182)]};}catch{return undefined;}finally{await _0x5015ea?.[_0x91adf3(0xfb)]()[_0x91adf3(0x131)](()=>undefined);}}[_0x40c726(0x16e)](){}async #readInputImage(_0x24d1e0,_0x230ef9,_0x4325cf,_0x1ae754){const _0x2c8a70=_0x40c726;let _0x555395;try{_0x555395=await openMarAgentSessionCatalog({'homeDirectory':this[_0x2c8a70(0x126)]});const _0x27e419=await _0x555395[_0x2c8a70(0x168)](_0x24d1e0,{'sequence':_0x230ef9,'imageIndex':_0x4325cf});if(_0x27e419===undefined||_0x27e419[_0x2c8a70(0xf9)]!==_0x1ae754[_0x2c8a70(0xf9)]||_0x27e419[_0x2c8a70(0x112)]!==_0x1ae754[_0x2c8a70(0x112)]||_0x27e419[_0x2c8a70(0x10b)]!==_0x1ae754[_0x2c8a70(0x10b)])return undefined;return{'name':_0x27e419[_0x2c8a70(0xf9)],'mime':_0x27e419[_0x2c8a70(0x112)],'dataBase64':_0x27e419[_0x2c8a70(0x16d)]};}catch{return undefined;}finally{await _0x555395?.[_0x2c8a70(0xfb)]()[_0x2c8a70(0x131)](()=>undefined);}}}function firstSequenceForTurn(_0x1c4b7f,_0x43a5bf){const _0x1e9d4a=_0x40c726;return _0x1c4b7f[_0x1e9d4a(0x117)](_0x546270=>_0x546270[_0x1e9d4a(0xff)]===_0x1e9d4a(0xf6)?_0x546270[_0x1e9d4a(0x10e)]===_0x43a5bf:_0x546270[_0x1e9d4a(0x113)][_0x1e9d4a(0x10e)]===_0x43a5bf)?.[_0x1e9d4a(0x166)];}function isModelSummary(_0x39e712){const _0x309732=_0x40c726;return marAgentNodeModelSummarySchema[_0x309732(0x11c)](_0x39e712)[_0x309732(0x11a)];}
|
|
1
|
+
import { marAgentNodeModelSummarySchema, resolveMarAgentDefaultReasoningEffort } from '@myagentroam/protocol';
|
|
2
|
+
import { MarAgentError, openMarAgentSessionCatalog } from '@myagentroam/agent';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
import { AbstractRunner } from './abstract-runner.js';
|
|
6
|
+
import { marAgentGeneratedImageSources, marAgentGeneratedImagesDirectory } from './mar-agent/generated-images.js';
|
|
7
|
+
import { projectMarAgentHistory } from './mar-agent/history-projection.js';
|
|
8
|
+
export class MarAgentRunner extends AbstractRunner {
|
|
9
|
+
homeDirectory;
|
|
10
|
+
name = 'mar-agent';
|
|
11
|
+
discoveryScope = 'ALL_WORKSPACES';
|
|
12
|
+
#models = [];
|
|
13
|
+
#releaseSessionResources;
|
|
14
|
+
#generatedImageRegistrar;
|
|
15
|
+
constructor(homeDirectory = homedir()) {
|
|
16
|
+
super();
|
|
17
|
+
this.homeDirectory = homeDirectory;
|
|
18
|
+
}
|
|
19
|
+
configureModels(value) {
|
|
20
|
+
this.#models = Array.isArray(value) ? value.filter(isModelSummary) : [];
|
|
21
|
+
}
|
|
22
|
+
setSessionResourceReleaser(release) {
|
|
23
|
+
this.#releaseSessionResources = release;
|
|
24
|
+
}
|
|
25
|
+
setGeneratedImageRegistrar(register) {
|
|
26
|
+
this.#generatedImageRegistrar = register;
|
|
27
|
+
}
|
|
28
|
+
registerGeneratedImages(session, nativeSessionId, artifacts) {
|
|
29
|
+
if (session.runner !== this.name ||
|
|
30
|
+
session.externalSessionId === null ||
|
|
31
|
+
session.externalSessionId !== nativeSessionId)
|
|
32
|
+
return [];
|
|
33
|
+
const images = marAgentGeneratedImageSources(this.homeDirectory, nativeSessionId, artifacts);
|
|
34
|
+
return images.length === 0 ? [] : (this.#generatedImageRegistrar?.(session, images) ?? []);
|
|
35
|
+
}
|
|
36
|
+
registerInputImages(session, entry) {
|
|
37
|
+
if (session.runner !== this.name ||
|
|
38
|
+
session.externalSessionId === null ||
|
|
39
|
+
session.externalSessionId !== entry.sessionId ||
|
|
40
|
+
entry.images === undefined ||
|
|
41
|
+
entry.images.length === 0)
|
|
42
|
+
return [];
|
|
43
|
+
const readableImages = entry.images.flatMap((image, imageIndex) => image.readable
|
|
44
|
+
? [
|
|
45
|
+
{
|
|
46
|
+
image,
|
|
47
|
+
imageIndex
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
: []);
|
|
51
|
+
if (readableImages.length === 0)
|
|
52
|
+
return [];
|
|
53
|
+
const registeredImages = this.#generatedImageRegistrar?.(session, readableImages.map(({ image, imageIndex }) => ({
|
|
54
|
+
name: image.name,
|
|
55
|
+
mime: image.mimeType,
|
|
56
|
+
byteSize: image.byteSize,
|
|
57
|
+
sourceId: `${entry.sessionId}:${entry.sequence}:${imageIndex}`,
|
|
58
|
+
read: () => this.#readInputImage(entry.sessionId, entry.sequence, imageIndex, {
|
|
59
|
+
name: image.name,
|
|
60
|
+
mimeType: image.mimeType,
|
|
61
|
+
byteSize: image.byteSize
|
|
62
|
+
})
|
|
63
|
+
}))) ?? [];
|
|
64
|
+
let registeredIndex = 0;
|
|
65
|
+
return entry.images.map((image) => image.readable ? registeredImages[registeredIndex++] : undefined);
|
|
66
|
+
}
|
|
67
|
+
profile(capabilities) {
|
|
68
|
+
if (!this.available(capabilities))
|
|
69
|
+
return undefined;
|
|
70
|
+
return this.profileForValidation();
|
|
71
|
+
}
|
|
72
|
+
available(capabilities) {
|
|
73
|
+
return capabilities.marAgent?.available === true;
|
|
74
|
+
}
|
|
75
|
+
profileForValidation() {
|
|
76
|
+
const models = this.#models.filter((model) => model.enabled);
|
|
77
|
+
return {
|
|
78
|
+
runner: 'mar-agent',
|
|
79
|
+
models: models.map((model, index) => ({
|
|
80
|
+
id: model.id,
|
|
81
|
+
label: model.name,
|
|
82
|
+
supportedEfforts: [...model.reasoningEfforts],
|
|
83
|
+
defaultEffort: resolveMarAgentDefaultReasoningEffort(model.defaultReasoningEffort, model.reasoningEfforts),
|
|
84
|
+
...(index === 0 ? { isDefault: true } : {})
|
|
85
|
+
})),
|
|
86
|
+
accessOptions: [
|
|
87
|
+
{
|
|
88
|
+
id: 'full-access',
|
|
89
|
+
label: 'Full access',
|
|
90
|
+
description: 'Skip Agent approvals. Host validation remains active and no Agent sandbox is provided.'
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
id: 'on-request',
|
|
94
|
+
label: 'On-request',
|
|
95
|
+
description: 'Ask before tools with side effects. This is not an operating-system sandbox.'
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
commands: [
|
|
99
|
+
{
|
|
100
|
+
id: 'compact',
|
|
101
|
+
runner: 'mar-agent',
|
|
102
|
+
label: '/compact',
|
|
103
|
+
description: 'Compact the current session context.',
|
|
104
|
+
inputHint: '/compact',
|
|
105
|
+
source: 'MAR_RUNTIME',
|
|
106
|
+
interaction: 'IMMEDIATE_ACTION',
|
|
107
|
+
available: true,
|
|
108
|
+
reasonCode: null
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
id: 'plan',
|
|
112
|
+
runner: 'mar-agent',
|
|
113
|
+
label: '/plan',
|
|
114
|
+
description: 'Toggle collaborative Plan Mode.',
|
|
115
|
+
inputHint: '/plan',
|
|
116
|
+
source: 'MAR_RUNTIME',
|
|
117
|
+
interaction: 'TOGGLE',
|
|
118
|
+
available: true,
|
|
119
|
+
reasonCode: null
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: 'clear',
|
|
123
|
+
runner: 'mar-agent',
|
|
124
|
+
label: '/clear',
|
|
125
|
+
description: 'Permanently clear this session history while keeping the session.',
|
|
126
|
+
inputHint: '/clear',
|
|
127
|
+
source: 'MAR_RUNTIME',
|
|
128
|
+
interaction: 'DESTRUCTIVE_ACTION',
|
|
129
|
+
available: true,
|
|
130
|
+
reasonCode: null
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
id: 'mission',
|
|
134
|
+
runner: 'mar-agent',
|
|
135
|
+
label: '/mission',
|
|
136
|
+
stateLabel: 'Mission',
|
|
137
|
+
description: 'Enter persistent Mission mode.',
|
|
138
|
+
inputHint: '/mission',
|
|
139
|
+
source: 'MAR_RUNTIME',
|
|
140
|
+
interaction: 'TOGGLE',
|
|
141
|
+
available: true,
|
|
142
|
+
reasonCode: null
|
|
143
|
+
}
|
|
144
|
+
],
|
|
145
|
+
capabilities: [
|
|
146
|
+
'turn.start',
|
|
147
|
+
'conversation',
|
|
148
|
+
'approval',
|
|
149
|
+
'user-input',
|
|
150
|
+
'plan',
|
|
151
|
+
'compact',
|
|
152
|
+
'mcp',
|
|
153
|
+
'subagent'
|
|
154
|
+
]
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
supportsConfiguration(configuration) {
|
|
158
|
+
if (configuration.runner !== this.name)
|
|
159
|
+
return false;
|
|
160
|
+
const profile = this.profileForValidation();
|
|
161
|
+
const model = profile.models.find((candidate) => candidate.id === configuration.model);
|
|
162
|
+
return (model !== undefined &&
|
|
163
|
+
(model.supportedEfforts.length === 0
|
|
164
|
+
? configuration.effort === model.defaultEffort
|
|
165
|
+
: model.supportedEfforts.includes(configuration.effort)) &&
|
|
166
|
+
profile.accessOptions.some((candidate) => candidate.id === configuration.access));
|
|
167
|
+
}
|
|
168
|
+
defaultConfiguration() {
|
|
169
|
+
const profile = this.profileForValidation();
|
|
170
|
+
const model = profile.models[0];
|
|
171
|
+
return {
|
|
172
|
+
runner: 'mar-agent',
|
|
173
|
+
model: model?.id ?? '',
|
|
174
|
+
effort: model?.defaultEffort ?? '',
|
|
175
|
+
access: 'full-access'
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
presentSession(session, capabilities, context) {
|
|
179
|
+
if (!this.available(capabilities))
|
|
180
|
+
return {
|
|
181
|
+
activity: 'UNAVAILABLE',
|
|
182
|
+
control: { level: 'UNAVAILABLE', capabilities: [] },
|
|
183
|
+
runtime: { level: 'UNAVAILABLE', capabilities: [], reasonCode: 'RUNNER_UNAVAILABLE' },
|
|
184
|
+
commandStates: context.commandStates
|
|
185
|
+
};
|
|
186
|
+
const managed = session.nativeControl === 'MAR_MANAGED';
|
|
187
|
+
const activity = context.managedActive ? 'MANAGED_ACTIVE' : 'IDLE';
|
|
188
|
+
const runtimeCapabilities = [
|
|
189
|
+
'history.read',
|
|
190
|
+
'events.live',
|
|
191
|
+
'turn.start',
|
|
192
|
+
'turn.queue',
|
|
193
|
+
'turn.interrupt',
|
|
194
|
+
'run.cancel',
|
|
195
|
+
'approval.respond',
|
|
196
|
+
'user-input.respond',
|
|
197
|
+
'session.rename',
|
|
198
|
+
'session.remove',
|
|
199
|
+
'session.pin',
|
|
200
|
+
...(session.externalSessionId === null ? [] : ['session.rewind', 'session.rollback'])
|
|
201
|
+
];
|
|
202
|
+
return {
|
|
203
|
+
activity,
|
|
204
|
+
control: {
|
|
205
|
+
level: managed ? 'MANAGED' : 'RESUMABLE',
|
|
206
|
+
capabilities: ['history.read', 'events.live', 'turn.start', 'turn.interrupt']
|
|
207
|
+
},
|
|
208
|
+
runtime: {
|
|
209
|
+
level: managed ? 'MANAGED' : 'RESUMABLE',
|
|
210
|
+
capabilities: runtimeCapabilities,
|
|
211
|
+
reasonCode: null
|
|
212
|
+
},
|
|
213
|
+
commandStates: context.commandStates
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
resumeExternal(external, context) {
|
|
217
|
+
if (external.runner !== this.name || external.externalSessionId === null || !context.available)
|
|
218
|
+
return Promise.resolve({ failureCode: 'RUNNER_UNAVAILABLE' });
|
|
219
|
+
const current = context.currentResumed(external.id);
|
|
220
|
+
if (current)
|
|
221
|
+
return Promise.resolve({ session: context.ensureConfiguration(current), activity: 'IDLE' });
|
|
222
|
+
const projection = context.projectionFor(external);
|
|
223
|
+
const session = projection ? context.promote(projection.id) : context.create(external);
|
|
224
|
+
if (!session)
|
|
225
|
+
return Promise.resolve({ failureCode: 'RUNNER_RESUME_FAILED' });
|
|
226
|
+
context.rememberManagedNative(external.externalSessionId, session.id);
|
|
227
|
+
return Promise.resolve({ session: context.ensureConfiguration(session), activity: 'IDLE' });
|
|
228
|
+
}
|
|
229
|
+
async discoverSessions(context, workspace) {
|
|
230
|
+
let catalog;
|
|
231
|
+
try {
|
|
232
|
+
catalog = await openMarAgentSessionCatalog({ homeDirectory: this.homeDirectory });
|
|
233
|
+
const listed = await catalog.list({ limit: 200 });
|
|
234
|
+
const workspaces = workspace ? [workspace] : context.workspaces;
|
|
235
|
+
return listed.sessions.flatMap((session) => {
|
|
236
|
+
const target = workspaces.find((candidate) => resolve(candidate.path) === resolve(session.workspace));
|
|
237
|
+
if (!target)
|
|
238
|
+
return [];
|
|
239
|
+
return [
|
|
240
|
+
context.createProjection({
|
|
241
|
+
workspace: target,
|
|
242
|
+
runner: this.name,
|
|
243
|
+
externalSessionId: session.id,
|
|
244
|
+
cwd: session.workspace,
|
|
245
|
+
title: session.title,
|
|
246
|
+
titleOrigin: 'NATIVE',
|
|
247
|
+
lastActivityAt: Date.parse(session.lastActivityAt)
|
|
248
|
+
})
|
|
249
|
+
];
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return [];
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
await catalog?.close().catch(() => undefined);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async forkNative(session, boundary, title) {
|
|
260
|
+
if (session.externalSessionId === null)
|
|
261
|
+
throw new Error('SESSION_REWIND_UNAVAILABLE');
|
|
262
|
+
const catalog = await openMarAgentSessionCatalog({ homeDirectory: this.homeDirectory });
|
|
263
|
+
try {
|
|
264
|
+
return (await catalog.fork(session.externalSessionId, { boundaryTurnId: boundary, title }))
|
|
265
|
+
.id;
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
if (error instanceof MarAgentError)
|
|
269
|
+
throw new Error(error.code, { cause: error });
|
|
270
|
+
throw error;
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
await catalog.close().catch(() => undefined);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
async rollbackNative(session, boundary) {
|
|
277
|
+
if (session.externalSessionId === null)
|
|
278
|
+
throw new Error('SESSION_ROLLBACK_UNAVAILABLE');
|
|
279
|
+
await this.#releaseSessionResources?.(session.externalSessionId);
|
|
280
|
+
const catalog = await openMarAgentSessionCatalog({ homeDirectory: this.homeDirectory });
|
|
281
|
+
try {
|
|
282
|
+
const rolledBack = await catalog.rollback(session.externalSessionId, {
|
|
283
|
+
boundaryTurnId: boundary
|
|
284
|
+
});
|
|
285
|
+
return Date.parse(rolledBack.lastActivityAt);
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
if (error instanceof MarAgentError)
|
|
289
|
+
throw new Error(error.code, { cause: error });
|
|
290
|
+
throw error;
|
|
291
|
+
}
|
|
292
|
+
finally {
|
|
293
|
+
await catalog.close().catch(() => undefined);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
async clearNative(session) {
|
|
297
|
+
if (session.externalSessionId === null)
|
|
298
|
+
throw new Error('SESSION_CLEAR_UNAVAILABLE');
|
|
299
|
+
await this.#releaseSessionResources?.(session.externalSessionId);
|
|
300
|
+
const catalog = await openMarAgentSessionCatalog({ homeDirectory: this.homeDirectory });
|
|
301
|
+
try {
|
|
302
|
+
return Date.parse((await catalog.clear(session.externalSessionId)).lastActivityAt);
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
if (error instanceof MarAgentError)
|
|
306
|
+
throw new Error(error.code, { cause: error });
|
|
307
|
+
throw error;
|
|
308
|
+
}
|
|
309
|
+
finally {
|
|
310
|
+
await catalog.close().catch(() => undefined);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
async removeNative(session, nativeSessionId) {
|
|
314
|
+
if (session.runner !== this.name || session.externalSessionId !== nativeSessionId)
|
|
315
|
+
return false;
|
|
316
|
+
await this.#releaseSessionResources?.(nativeSessionId);
|
|
317
|
+
const catalog = await openMarAgentSessionCatalog({ homeDirectory: this.homeDirectory });
|
|
318
|
+
try {
|
|
319
|
+
return (await catalog.delete(nativeSessionId)).deleted ? true : 'MISSING';
|
|
320
|
+
}
|
|
321
|
+
finally {
|
|
322
|
+
await catalog.close().catch(() => undefined);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
async readManagedRunnerTitle(session, nativeSessionId) {
|
|
326
|
+
if (session.runner !== this.name || session.externalSessionId !== nativeSessionId)
|
|
327
|
+
return undefined;
|
|
328
|
+
const catalog = await openMarAgentSessionCatalog({ homeDirectory: this.homeDirectory });
|
|
329
|
+
try {
|
|
330
|
+
let cursor;
|
|
331
|
+
do {
|
|
332
|
+
const page = await catalog.list({ limit: 200, ...(cursor ? { cursor } : {}) });
|
|
333
|
+
const title = page.sessions.find((candidate) => candidate.id === nativeSessionId)?.title;
|
|
334
|
+
if (title !== undefined)
|
|
335
|
+
return title;
|
|
336
|
+
cursor = page.nextCursor;
|
|
337
|
+
} while (cursor !== undefined);
|
|
338
|
+
return undefined;
|
|
339
|
+
}
|
|
340
|
+
finally {
|
|
341
|
+
await catalog.close().catch(() => undefined);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
async readOfficialConversation(session, input) {
|
|
345
|
+
if (session.externalSessionId === null)
|
|
346
|
+
return undefined;
|
|
347
|
+
const catalog = await openMarAgentSessionCatalog({ homeDirectory: this.homeDirectory });
|
|
348
|
+
try {
|
|
349
|
+
const limit = input.limit ?? 10;
|
|
350
|
+
let cursor = input.cursor;
|
|
351
|
+
let nextCursor;
|
|
352
|
+
const entryPages = [];
|
|
353
|
+
const turnIds = new Set();
|
|
354
|
+
do {
|
|
355
|
+
const page = await catalog.history(session.externalSessionId, {
|
|
356
|
+
...(cursor === undefined ? {} : { cursor }),
|
|
357
|
+
limit: 1000
|
|
358
|
+
});
|
|
359
|
+
entryPages.push(page.entries);
|
|
360
|
+
for (const entry of page.entries) {
|
|
361
|
+
const turnId = entry.kind === 'user' ? entry.turnId : entry.event.turnId;
|
|
362
|
+
if (turnId !== undefined)
|
|
363
|
+
turnIds.add(turnId);
|
|
364
|
+
}
|
|
365
|
+
nextCursor = page.nextCursor;
|
|
366
|
+
cursor = nextCursor;
|
|
367
|
+
} while (turnIds.size <= limit && nextCursor !== undefined);
|
|
368
|
+
const entries = entryPages.toReversed().flat();
|
|
369
|
+
const turns = projectMarAgentHistory(session, entries, {
|
|
370
|
+
registerInputImages: (entry) => this.registerInputImages(session, entry),
|
|
371
|
+
registerGeneratedImages: (nativeSessionId, images) => this.registerGeneratedImages(session, nativeSessionId, images)
|
|
372
|
+
});
|
|
373
|
+
if (turns.length > limit) {
|
|
374
|
+
const selected = turns.slice(-limit);
|
|
375
|
+
const firstSequence = firstSequenceForTurn(entries, selected[0].id);
|
|
376
|
+
return {
|
|
377
|
+
turns: selected,
|
|
378
|
+
nextCursor: firstSequence === undefined ? (nextCursor ?? null) : String(firstSequence)
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
return {
|
|
382
|
+
turns,
|
|
383
|
+
nextCursor: nextCursor ?? null
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
catch {
|
|
387
|
+
return undefined;
|
|
388
|
+
}
|
|
389
|
+
finally {
|
|
390
|
+
await catalog.close().catch(() => undefined);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
async readConversationHistory(readers) {
|
|
394
|
+
const page = await readers.official();
|
|
395
|
+
return page === undefined ? undefined : { ...page, source: 'official' };
|
|
396
|
+
}
|
|
397
|
+
nativeImageRoots(session) {
|
|
398
|
+
const generatedImages = session.externalSessionId === null
|
|
399
|
+
? undefined
|
|
400
|
+
: marAgentGeneratedImagesDirectory(this.homeDirectory, session.externalSessionId);
|
|
401
|
+
return [resolve(session.cwd), ...(generatedImages === undefined ? [] : [generatedImages])];
|
|
402
|
+
}
|
|
403
|
+
async readContextUsage(session) {
|
|
404
|
+
if (session.externalSessionId === null || session.model === null)
|
|
405
|
+
return undefined;
|
|
406
|
+
const model = this.#models.find((candidate) => candidate.id === session.model);
|
|
407
|
+
if (model === undefined)
|
|
408
|
+
return undefined;
|
|
409
|
+
let catalog;
|
|
410
|
+
try {
|
|
411
|
+
catalog = await openMarAgentSessionCatalog({ homeDirectory: this.homeDirectory });
|
|
412
|
+
const usage = await catalog.contextUsage(session.externalSessionId);
|
|
413
|
+
return usage === undefined
|
|
414
|
+
? undefined
|
|
415
|
+
: {
|
|
416
|
+
model: model.modelId,
|
|
417
|
+
usedTokens: usage.inputTokens,
|
|
418
|
+
maxTokens: model.contextWindowTokens
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
catch {
|
|
422
|
+
return undefined;
|
|
423
|
+
}
|
|
424
|
+
finally {
|
|
425
|
+
await catalog?.close().catch(() => undefined);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
stop() { }
|
|
429
|
+
async #readInputImage(sessionId, sequence, imageIndex, expected) {
|
|
430
|
+
let catalog;
|
|
431
|
+
try {
|
|
432
|
+
catalog = await openMarAgentSessionCatalog({ homeDirectory: this.homeDirectory });
|
|
433
|
+
const image = await catalog.readImage(sessionId, { sequence, imageIndex });
|
|
434
|
+
if (image === undefined ||
|
|
435
|
+
image.name !== expected.name ||
|
|
436
|
+
image.mimeType !== expected.mimeType ||
|
|
437
|
+
image.byteSize !== expected.byteSize)
|
|
438
|
+
return undefined;
|
|
439
|
+
return {
|
|
440
|
+
name: image.name,
|
|
441
|
+
mime: image.mimeType,
|
|
442
|
+
dataBase64: image.dataBase64
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
catch {
|
|
446
|
+
return undefined;
|
|
447
|
+
}
|
|
448
|
+
finally {
|
|
449
|
+
await catalog?.close().catch(() => undefined);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
function firstSequenceForTurn(entries, turnId) {
|
|
454
|
+
return entries.find((entry) => entry.kind === 'user' ? entry.turnId === turnId : entry.event.turnId === turnId)?.sequence;
|
|
455
|
+
}
|
|
456
|
+
function isModelSummary(value) {
|
|
457
|
+
return marAgentNodeModelSummarySchema.safeParse(value).success;
|
|
458
|
+
}
|