@myagentroam/node 0.9.62 → 0.9.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +4 -0
  3. package/dist/capabilities.js +110 -2
  4. package/dist/claude-agent-sdk.js +330 -2
  5. package/dist/claude-channel.js +44 -2
  6. package/dist/codex-app-server.js +510 -2
  7. package/dist/config.js +106 -2
  8. package/dist/connector/node-connector-options.js +1 -2
  9. package/dist/connector/node-operation-router.js +22 -2
  10. package/dist/connector.js +1736 -2
  11. package/dist/control-outbound-scheduler.js +153 -2
  12. package/dist/database.js +639 -2
  13. package/dist/fake-runner.js +129 -2
  14. package/dist/git-askpass.js +12 -0
  15. package/dist/git-execution-helper.js +266 -0
  16. package/dist/health.js +3 -2
  17. package/dist/main.js +57 -2
  18. package/dist/mcp-installation-model.js +1 -2
  19. package/dist/migrations/v004.js +55 -3
  20. package/dist/migrations/v005.js +13 -3
  21. package/dist/migrations/v006.js +90 -3
  22. package/dist/migrations/v007.js +22 -3
  23. package/dist/migrations/v008.js +18 -3
  24. package/dist/migrations/v009.js +70 -4
  25. package/dist/migrations/v010.js +43 -3
  26. package/dist/migrations/v011.js +20 -3
  27. package/dist/migrations/v012.js +8 -0
  28. package/dist/native-jsonl-reader.js +186 -2
  29. package/dist/native-session-history.js +1143 -2
  30. package/dist/opencode-runtime.js +80 -2
  31. package/dist/opencode-server.js +259 -2
  32. package/dist/operational.js +122 -2
  33. package/dist/process-tree.js +18 -2
  34. package/dist/ripgrep-binary.js +31 -2
  35. package/dist/rotating-log.js +67 -2
  36. package/dist/runner/abstract-runner.js +260 -2
  37. package/dist/runner/claude/managed-run-controller.js +355 -2
  38. package/dist/runner/claude/tool-normalizer.js +120 -2
  39. package/dist/runner/claude-code-runner.js +303 -2
  40. package/dist/runner/codex/composer-image-markers.js +8 -2
  41. package/dist/runner/codex/conversation-parser.js +913 -2
  42. package/dist/runner/codex/managed-run-controller.js +494 -2
  43. package/dist/runner/codex/tool-normalizer.js +214 -2
  44. package/dist/runner/codex-runner.js +585 -2
  45. package/dist/runner/fake-test-runner.js +47 -2
  46. package/dist/runner/mar-agent/conversation-normalizer.js +644 -2
  47. package/dist/runner/mar-agent/executor-stdio-client-transport.js +139 -2
  48. package/dist/runner/mar-agent/generated-images.js +41 -2
  49. package/dist/runner/mar-agent/history-projection.js +106 -2
  50. package/dist/runner/mar-agent/hosted-conversation-runtime.js +446 -2
  51. package/dist/runner/mar-agent/managed-run-controller.js +785 -2
  52. package/dist/runner/mar-agent/mcp-client-pool.js +233 -2
  53. package/dist/runner/mar-agent/runtime-model-factory.js +326 -2
  54. package/dist/runner/mar-agent-runner.js +458 -2
  55. package/dist/runner/opencode/conversation-parser.js +221 -2
  56. package/dist/runner/opencode/managed-run-controller.js +588 -2
  57. package/dist/runner/opencode/tool-normalizer.js +80 -2
  58. package/dist/runner/opencode-runner.js +426 -2
  59. package/dist/runner/runner-registry.js +87 -2
  60. package/dist/runner-command-engine.js +71 -2
  61. package/dist/runner-profiles.js +323 -2
  62. package/dist/runner-usage.js +190 -2
  63. package/dist/runtime-command-detector.js +73 -2
  64. package/dist/runtime-model.js +1 -2
  65. package/dist/runtime-state.js +1509 -2
  66. package/dist/service/attachment-domain-state.js +7 -2
  67. package/dist/service/bubblewrap-sandbox-executor.js +543 -2
  68. package/dist/service/continuous-run-coordinator.js +425 -2
  69. package/dist/service/conversation-history-service.js +552 -2
  70. package/dist/service/conversation-hosting-capability-service.js +61 -2
  71. package/dist/service/conversation-hosting-enablement-service.js +91 -2
  72. package/dist/service/conversation-hosting-maintenance-service.js +174 -2
  73. package/dist/service/conversation-segment-service.js +162 -2
  74. package/dist/service/conversation-template-node-service.js +992 -2
  75. package/dist/service/external-session-resume-service.js +152 -2
  76. package/dist/service/fake-managed-run-service.js +60 -2
  77. package/dist/service/git-execution-service.js +418 -0
  78. package/dist/service/git-operation-service.js +57 -0
  79. package/dist/service/hosted-conversation-node-service.js +1982 -2
  80. package/dist/service/hosted-conversation-store.js +1405 -2
  81. package/dist/service/managed-runner-session-service.js +35 -2
  82. package/dist/service/mar-agent-model-transport-test-service.js +88 -2
  83. package/dist/service/mcp-installation-verifier.js +87 -2
  84. package/dist/service/mcp-node-operation-service.js +90 -2
  85. package/dist/service/mission-mcp-server.js +124 -2
  86. package/dist/service/mission-mcp-stdio.js +40 -2
  87. package/dist/service/mission-runtime.js +142 -2
  88. package/dist/service/native-session-projection-service.js +274 -2
  89. package/dist/service/native-session-watch-service.js +683 -2
  90. package/dist/service/node-connection-lifecycle-service.js +88 -2
  91. package/dist/service/node-control-channel.js +85 -2
  92. package/dist/service/node-control-message-service.js +109 -2
  93. package/dist/service/node-request-service.js +62 -2
  94. package/dist/service/node-run-event-bridge.js +88 -2
  95. package/dist/service/node-terminal-channel.js +202 -2
  96. package/dist/service/node-upgrade-coordinator.js +137 -2
  97. package/dist/service/node-workspace-coordinator.js +97 -2
  98. package/dist/service/recent-run-projection-service.js +99 -2
  99. package/dist/service/run-attachment-service.js +321 -2
  100. package/dist/service/run-domain-state.js +4 -2
  101. package/dist/service/run-event-service.js +246 -2
  102. package/dist/service/run-ownership-policy.js +22 -2
  103. package/dist/service/run-workbench-service.js +120 -2
  104. package/dist/service/runner-channel-message-service.js +20 -2
  105. package/dist/service/runner-interaction-service.js +243 -2
  106. package/dist/service/runner-service.js +69 -2
  107. package/dist/service/runtime-credential-control-service.js +95 -2
  108. package/dist/service/session-catalog-service.js +404 -2
  109. package/dist/service/session-command-service.js +125 -2
  110. package/dist/service/session-context-service.js +128 -2
  111. package/dist/service/session-domain-state.js +9 -2
  112. package/dist/service/session-identity-service.js +86 -2
  113. package/dist/service/session-lifecycle-service.js +248 -2
  114. package/dist/service/session-message-service.js +270 -2
  115. package/dist/service/session-presentation-service.js +43 -2
  116. package/dist/service/session-query-service.js +82 -2
  117. package/dist/service/session-watch-slot-coordinator.js +21 -2
  118. package/dist/service/skill-directory-service.js +238 -2
  119. package/dist/service/skill-install-service.js +434 -2
  120. package/dist/service/skill-node-operation-service.js +206 -2
  121. package/dist/service/terminal-relay-state.js +3 -2
  122. package/dist/service/terminal-service.js +90 -2
  123. package/dist/service/web-search-error.js +40 -2
  124. package/dist/service/workbench-event-service.js +21 -2
  125. package/dist/service/workbench-manifest-service.js +69 -2
  126. package/dist/service/workspace-change-service.js +290 -2
  127. package/dist/service/workspace-content-search-service.js +457 -2
  128. package/dist/service/workspace-domain-state.js +41 -2
  129. package/dist/service/workspace-file-service.js +150 -2
  130. package/dist/service/workspace-git-exclude-service.js +119 -2
  131. package/dist/service/workspace-queue-workbench-service.js +176 -2
  132. package/dist/service/workspace-service.js +92 -2
  133. package/dist/service/workspace-session-service.js +154 -2
  134. package/dist/service/workspace-upload-service.js +262 -2
  135. package/dist/service/workspace-watch-controller.js +68 -2
  136. package/dist/service/workspace-watch-service.js +170 -2
  137. package/dist/service/workspace-watch-snapshot-service.js +218 -2
  138. package/dist/service/workspace-workbench-service.js +239 -2
  139. package/dist/service.js +91 -2
  140. package/dist/storage.js +32 -2
  141. package/dist/supervisor.js +136 -2
  142. package/dist/terminal.js +496 -2
  143. package/dist/util/git-credential-client.js +32 -0
  144. package/dist/util/node-operation-data.js +9 -2
  145. package/dist/util/node-operation-parsers.js +382 -2
  146. package/dist/util/personal-instructions.js +34 -2
  147. package/dist/util/runner-error.js +70 -2
  148. package/dist/util/runner-native-session-parsers.js +510 -2
  149. package/dist/util/safe-error.js +8 -2
  150. package/dist/util/secret-environment.js +25 -2
  151. package/dist/workspace.js +1793 -2
  152. package/package.json +11 -8
  153. package/vendor/ripgrep/darwin-arm64/rg +0 -0
  154. package/vendor/ripgrep/darwin-x64/rg +0 -0
  155. package/vendor/ripgrep/manifest.json +12 -0
  156. package/README.md +0 -42
  157. package/dist/event-buffer.js +0 -2
  158. package/dist/migrations/v001.js +0 -107
  159. package/dist/migrations/v002.js +0 -2
  160. package/dist/migrations/v003.js +0 -2
  161. package/dist/service/mcp-package-installer.js +0 -2
@@ -1,2 +1,87 @@
1
- /* mar-release-protected */
2
- const _0x30ce11=_0x30fe;function _0x1ff5(){const _0x32c58e=['ywr2zxj0AxnLza','zMLSDgvY','CNvUBMvY','CMvXDwLYzq','CMvNAxn0zxi','uLvotKvsx05pvf9sruDju1rfuKveoG','ChjVzMLSzxm','DMfSDwvZ','zMXHDe1HCa','CM91BMq','B3b0Aw9UywW','mJK0mZHNtwDYEfy','CNvUBMvYCW','ndfHruDdCwO','ywnJzxb0C1j1BG','BM93','z2v0','m0zwAuTtAG','C3rHCNrnyw5Hz2vKuNvU','mteWnte3nunQrMPOsq','ywXSu2v0DgXLza','ChjVzhvJDa','zgvJAwrLqxbWCM92ywW','CMvMCMvZAfbYB2zPBgvZ','uLvotKvsx0fmuKvbrfLFuKvhsvnurvjfrdO','C2v0','mte1mtKZmez3zwnWDW','Aw50zxjJzxb0C1j1BNm','CMvMCMvZAfbYB2zPBgu','mti4ntmYnKnOq0zuuq','nZyYt1zWChvQ','ndr5ywfOz3G','CNvUBMvYlNbYB2zPBguUCMvMCMvZAc5JB21WBgv0zwq','C3rYAw5N','otiYmZLgvM5csMG','AgfZ','Cgf5Bg9Hza','ChjVzMLSzq','mti3mJq5odbJre1lDeG','BwfW','y2fUy2vStwfUywDLzfj1BG','mZjjy3bJCfy','C3rVCa','mJqWndG0oejjtKzsqG','CMvZCg9UzfvZzxjjBNb1Da','ywXS','zMLUza','BMfTzq'];_0x1ff5=function(){return _0x32c58e;};return _0x1ff5();}function _0x30fe(_0x3a0c7b,_0x116ced){_0x3a0c7b=_0x3a0c7b-(0x2291+-0x1*-0xc47+0x7*-0x689);const _0xe89f36=_0x1ff5();let _0x3f5e41=_0xe89f36[_0x3a0c7b];if(_0x30fe['bvVcJR']===undefined){var _0x4a8155=function(_0x1d0913){const _0x251991='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x10d25a='',_0x3943dd='';for(let _0x56c785=-0x7*0x301+-0x2134+0x363b,_0x1813f3,_0x31ccd3,_0x41b38d=-0x1*0x687+0x1*-0x1e93+-0x6*-0x62f;_0x31ccd3=_0x1d0913['charAt'](_0x41b38d++);~_0x31ccd3&&(_0x1813f3=_0x56c785%(0x1a35*0x1+-0x1*-0x1a1+-0xde9*0x2)?_0x1813f3*(0x44b*0x5+-0x8*-0x3e+-0x1727)+_0x31ccd3:_0x31ccd3,_0x56c785++%(-0x2678+0x23ae+-0x1*-0x2ce))?_0x10d25a+=String['fromCharCode'](-0x12a2*0x1+0x1345*-0x2+0x3a2b&_0x1813f3>>(-(-0x1d15+-0x3*0x3a+0x1*0x1dc5)*_0x56c785&0x22b0+0x7*0x1b1+0x1*-0x2e81)):0x7*-0x3e7+0x51b+-0x1636*-0x1){_0x31ccd3=_0x251991['indexOf'](_0x31ccd3);}for(let _0xe2a4c3=0x1*-0x1c5+-0x1*0x2593+0x2758,_0x3feafd=_0x10d25a['length'];_0xe2a4c3<_0x3feafd;_0xe2a4c3++){_0x3943dd+='%'+('00'+_0x10d25a['charCodeAt'](_0xe2a4c3)['toString'](-0x1e07+0x120b+0xc0c))['slice'](-(-0x148*-0x19+0x115*0x7+-0x2799));}return decodeURIComponent(_0x3943dd);};_0x30fe['oDKGFH']=_0x4a8155,_0x30fe['DIrIpc']={},_0x30fe['bvVcJR']=!![];}const _0x57934a=_0xe89f36[0x7*0x51+0x1*0xc67+-0x74f*0x2];_0x30fe['MuxnOI']!==_0x57934a&&(_0x30fe['DIrIpc']={},_0x30fe['MuxnOI']=_0x57934a);const _0x1c63a2=_0x30fe['DIrIpc'][_0x3a0c7b];return _0x1c63a2===undefined?(_0x3f5e41=_0x30fe['oDKGFH'](_0x3f5e41),_0x30fe['DIrIpc'][_0x3a0c7b]=_0x3f5e41):_0x3f5e41=_0x1c63a2,_0x3f5e41;}(function(_0x56f2fd,_0x548d01){const _0x31ac05=_0x30fe,_0x35befe=_0x56f2fd();while(!![]){try{const _0x4d1e73=parseInt(_0x31ac05(0x119))/(0x104f*0x1+0x5*-0x153+0x25*-0x43)*(-parseInt(_0x31ac05(0x147))/(-0x1*0x1e0e+0x24e2+0x1*-0x6d2))+parseInt(_0x31ac05(0x11d))/(0x15*-0x12e+-0x1c*0x2+0x1901)*(parseInt(_0x31ac05(0x137))/(-0xe*-0xeb+-0x22ef+0x1619))+parseInt(_0x31ac05(0x11f))/(-0x9d1+0x2*0x21e+0x59a)+parseInt(_0x31ac05(0x12a))/(-0x7*0x14+-0x784*-0x4+0xebf*-0x2)*(parseInt(_0x31ac05(0x12e))/(0x2a7+0x1389+-0x1629))+-parseInt(_0x31ac05(0x135))/(-0x1b0f*0x1+-0x1ad0+0x35e7*0x1)*(-parseInt(_0x31ac05(0x129))/(0x1d7b+-0x1*0x214a+0x3d8))+-parseInt(_0x31ac05(0x126))/(-0x1*-0x259a+-0x12a1+-0x12ef)*(parseInt(_0x31ac05(0x12b))/(-0x1c*-0x161+-0x3*-0x92e+-0x3*0x1609))+-parseInt(_0x31ac05(0x132))/(0x8d*-0x3a+-0x20bb+0x40b9);if(_0x4d1e73===_0x548d01)break;else _0x35befe['push'](_0x35befe['shift']());}catch(_0x46db83){_0x35befe['push'](_0x35befe['shift']());}}}(_0x1ff5,-0x412f6+-0x18*-0xddd2+-0x257ce));import{nodeLog}from'../operational.js';export class RunnerRegistry{[_0x30ce11(0x148)]=new Map();constructor(_0x4b9fd1=[]){const _0x1dfa57=_0x30ce11;for(const _0x27ff7f of _0x4b9fd1)this[_0x1dfa57(0x140)](_0x27ff7f);}[_0x30ce11(0x140)](_0x572963){const _0x58b53a=_0x30ce11;if(this[_0x58b53a(0x148)][_0x58b53a(0x12f)](_0x572963[_0x58b53a(0x13b)]))throw new Error(_0x58b53a(0x124)+_0x572963[_0x58b53a(0x13b)]);return this[_0x58b53a(0x148)][_0x58b53a(0x125)](_0x572963[_0x58b53a(0x13b)],_0x572963),_0x572963;}[_0x30ce11(0x146)](_0x3af012){const _0x16fd38=_0x30ce11;return this[_0x16fd38(0x148)][_0x16fd38(0x11c)](_0x3af012);}[_0x30ce11(0x13f)](_0x45ed58){const _0x906d9c=_0x30ce11,_0x1c4b80=this[_0x906d9c(0x146)](_0x45ed58);if(_0x1c4b80===undefined)throw new Error(_0x906d9c(0x141)+_0x45ed58);return _0x1c4b80;}[_0x30ce11(0x13c)](){const _0x2f174e=_0x30ce11;return[...this[_0x2f174e(0x148)][_0x2f174e(0x143)]()][_0x2f174e(0x13d)](_0x4fac64=>_0x4fac64[_0x2f174e(0x13c)]);}[_0x30ce11(0x121)](_0x31ace7){const _0x194ab2=_0x30ce11;if(typeof _0x31ace7!==_0x194ab2(0x12d))return undefined;const _0x4a6243=this[_0x194ab2(0x148)][_0x194ab2(0x11c)](_0x31ace7);return _0x4a6243?.[_0x194ab2(0x13c)]===!![]?_0x4a6243:undefined;}[_0x30ce11(0x142)](_0x599e2c){const _0x1090e2=_0x30ce11;return this[_0x1090e2(0x13c)]()[_0x1090e2(0x144)](_0x428b31=>{const _0x46ad28=_0x1090e2,_0x2db0e4=_0x428b31[_0x46ad28(0x131)](_0x599e2c);return _0x2db0e4===undefined?[]:[_0x2db0e4];});}async[_0x30ce11(0x123)](_0x32a046,_0x662239,_0x49e2e9={}){const _0x3f80de=_0x30ce11,_0x320d5b=await Promise[_0x3f80de(0x139)](this[_0x3f80de(0x13c)]()[_0x3f80de(0x133)](async _0x4c8081=>{const _0x4750ca=_0x3f80de,_0x56770e=performance[_0x4750ca(0x11b)]();try{return await _0x4c8081[_0x4750ca(0x128)](_0x32a046,_0x662239,_0x49e2e9);}finally{const _0x480966=Math[_0x4750ca(0x145)](performance[_0x4750ca(0x11b)]()-_0x56770e);if(_0x480966>=-0xf52+-0x22c6+0x327c)nodeLog(_0x4750ca(0x12c),{'runner':_0x4c8081[_0x4750ca(0x13b)],'workspaceId':_0x662239?.['id'],'durationMs':_0x480966});}}));return _0x320d5b[_0x3f80de(0x144)](_0x1f704b=>_0x1f704b===undefined?[]:[_0x1f704b]);}[_0x30ce11(0x11e)](_0x24cb2f){const _0x3ff66e=_0x30ce11,_0xbc924=_0x24cb2f[_0x3ff66e(0x130)][_0x3ff66e(0x13e)],_0x5b3c1d=[...this[_0x3ff66e(0x148)][_0x3ff66e(0x143)]()],_0x2bd1a8=_0x5b3c1d[_0x3ff66e(0x13a)](_0x1f45c1=>_0x1f45c1[_0x3ff66e(0x127)]&&_0x1f45c1[_0x3ff66e(0x11a)](_0xbc924))??_0x5b3c1d[_0x3ff66e(0x13a)](_0x410333=>_0x410333[_0x3ff66e(0x11a)](_0xbc924));if(_0x2bd1a8===undefined)return![];return _0x2bd1a8[_0x3ff66e(0x11e)](_0x24cb2f),!![];}[_0x30ce11(0x134)](_0x2bb629,_0x18f204){const _0x28e8bb=_0x30ce11;for(const _0xa68fd of this[_0x28e8bb(0x148)][_0x28e8bb(0x143)]())if(_0xa68fd[_0x28e8bb(0x134)](_0x2bb629,_0x18f204))return!![];return![];}[_0x30ce11(0x122)](_0x42c5d9){const _0x53c147=_0x30ce11;let _0x21c30=![];for(const _0x589b5c of this[_0x53c147(0x148)][_0x53c147(0x143)]())_0x21c30=_0x589b5c[_0x53c147(0x122)](_0x42c5d9)||_0x21c30;return _0x21c30;}[_0x30ce11(0x138)](_0x497919,_0x1577a7,_0xc31f0f){const _0x24dd8c=_0x30ce11;for(const _0x2edc42 of this[_0x24dd8c(0x148)][_0x24dd8c(0x143)]())if(_0x2edc42[_0x24dd8c(0x138)](_0x497919,_0x1577a7,_0xc31f0f))return!![];return![];}async[_0x30ce11(0x136)](){const _0x3d2fa0=_0x30ce11;await Promise[_0x3d2fa0(0x120)]([...this[_0x3d2fa0(0x148)][_0x3d2fa0(0x143)]()][_0x3d2fa0(0x133)](_0x20b6dd=>_0x20b6dd[_0x3d2fa0(0x136)]()));}}
1
+ import { nodeLog } from '../operational.js';
2
+ export class RunnerRegistry {
3
+ runners = new Map();
4
+ constructor(runners = []) {
5
+ for (const runner of runners)
6
+ this.register(runner);
7
+ }
8
+ register(runner) {
9
+ if (this.runners.has(runner.name))
10
+ throw new Error(`RUNNER_ALREADY_REGISTERED:${runner.name}`);
11
+ this.runners.set(runner.name, runner);
12
+ return runner;
13
+ }
14
+ optional(name) {
15
+ return this.runners.get(name);
16
+ }
17
+ require(name) {
18
+ const runner = this.optional(name);
19
+ if (runner === undefined)
20
+ throw new Error(`RUNNER_NOT_REGISTERED:${name}`);
21
+ return runner;
22
+ }
23
+ advertised() {
24
+ return [...this.runners.values()].filter((runner) => runner.advertised);
25
+ }
26
+ product(name) {
27
+ if (typeof name !== 'string')
28
+ return undefined;
29
+ const runner = this.runners.get(name);
30
+ return runner?.advertised === true ? runner : undefined;
31
+ }
32
+ profiles(capabilities) {
33
+ return this.advertised().flatMap((runner) => {
34
+ const profile = runner.profile(capabilities);
35
+ return profile === undefined ? [] : [profile];
36
+ });
37
+ }
38
+ async refreshProfiles(capabilities, workspace, environment = {}) {
39
+ const profiles = await Promise.all(this.advertised().map(async (runner) => {
40
+ const startedAt = performance.now();
41
+ try {
42
+ return await runner.refreshProfile(capabilities, workspace, environment);
43
+ }
44
+ finally {
45
+ const durationMs = Math.round(performance.now() - startedAt);
46
+ if (durationMs >= 100)
47
+ nodeLog('runner.profile.refresh.completed', {
48
+ runner: runner.name,
49
+ workspaceId: workspace?.id,
50
+ durationMs
51
+ });
52
+ }
53
+ }));
54
+ return profiles.flatMap((profile) => (profile === undefined ? [] : [profile]));
55
+ }
56
+ startManagedRun(envelope) {
57
+ const runnerName = envelope.payload.runner;
58
+ const values = [...this.runners.values()];
59
+ const runner = values.find((candidate) => candidate.interceptsRuns && candidate.acceptsRun(runnerName)) ??
60
+ values.find((candidate) => candidate.acceptsRun(runnerName));
61
+ if (runner === undefined)
62
+ return false;
63
+ runner.startManagedRun(envelope);
64
+ return true;
65
+ }
66
+ cancelManagedRun(runId, intent) {
67
+ for (const runner of this.runners.values())
68
+ if (runner.cancelManagedRun(runId, intent))
69
+ return true;
70
+ return false;
71
+ }
72
+ decideApproval(input) {
73
+ let handled = false;
74
+ for (const runner of this.runners.values())
75
+ handled = runner.decideApproval(input) || handled;
76
+ return handled;
77
+ }
78
+ respondUserInput(runId, requestId, answers) {
79
+ for (const runner of this.runners.values())
80
+ if (runner.respondUserInput(runId, requestId, answers))
81
+ return true;
82
+ return false;
83
+ }
84
+ async stop() {
85
+ await Promise.allSettled([...this.runners.values()].map((runner) => runner.stop()));
86
+ }
87
+ }
@@ -1,2 +1,71 @@
1
- /* mar-release-protected */
2
- function _0x6d8b(_0x32bc82,_0x16b61d){_0x32bc82=_0x32bc82-(0x1378+-0x2246+0x7d1*0x2);const _0x178935=_0x112b();let _0x266d76=_0x178935[_0x32bc82];if(_0x6d8b['tALfYb']===undefined){var _0x162a76=function(_0x246691){const _0x357320='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4f0ad0='',_0xb7ff21='';for(let _0xd35f49=0xf93+-0x1d23*-0x1+0x1*-0x2cb6,_0x2a5a2e,_0x176ddf,_0x539599=0x22b3+0x3b*0x1b+0x12*-0x246;_0x176ddf=_0x246691['charAt'](_0x539599++);~_0x176ddf&&(_0x2a5a2e=_0xd35f49%(0x242*0x1+0x29*0x9d+-0x1b63)?_0x2a5a2e*(-0x1*0x26e7+0xbe8+-0x5d*-0x4b)+_0x176ddf:_0x176ddf,_0xd35f49++%(-0x16a*-0x11+0x26*-0x43+0x6a*-0x22))?_0x4f0ad0+=String['fromCharCode'](0x3*-0xb8f+-0x1c5*0xf+0x3e37&_0x2a5a2e>>(-(-0x13eb*0x1+-0x3*0x1cf+0x195a)*_0xd35f49&0x1d*0xfb+-0x1*0x1135+-0xb34)):0x1d0d+0x1247*-0x1+-0xac6){_0x176ddf=_0x357320['indexOf'](_0x176ddf);}for(let _0x306f6d=-0x23c4+0x1*-0xd9d+-0x1*-0x3161,_0x319195=_0x4f0ad0['length'];_0x306f6d<_0x319195;_0x306f6d++){_0xb7ff21+='%'+('00'+_0x4f0ad0['charCodeAt'](_0x306f6d)['toString'](-0xe+-0x2419+0x1*0x2437))['slice'](-(-0x417+-0xff9+0xe*0x16f));}return decodeURIComponent(_0xb7ff21);};_0x6d8b['DMxAkn']=_0x162a76,_0x6d8b['SVcTOr']={},_0x6d8b['tALfYb']=!![];}const _0x422ced=_0x178935[0x1*-0x104f+0xa8f*-0x1+0x1ade];_0x6d8b['grsnxh']!==_0x422ced&&(_0x6d8b['SVcTOr']={},_0x6d8b['grsnxh']=_0x422ced);const _0x319c9f=_0x6d8b['SVcTOr'][_0x32bc82];return _0x319c9f===undefined?(_0x266d76=_0x6d8b['DMxAkn'](_0x266d76),_0x6d8b['SVcTOr'][_0x32bc82]=_0x266d76):_0x266d76=_0x319c9f,_0x266d76;}const _0xb10930=_0x6d8b;(function(_0x57b909,_0x5c4eb4){const _0x19ec06=_0x6d8b,_0x39d337=_0x57b909();while(!![]){try{const _0x3fd59a=-parseInt(_0x19ec06(0xf7))/(0xc30+-0x271+-0x9be*0x1)+-parseInt(_0x19ec06(0xea))/(-0x1*0x23ad+0x1360+0x1*0x104f)+-parseInt(_0x19ec06(0xf9))/(-0x2*0xb87+0x138f+0x382)*(parseInt(_0x19ec06(0xd4))/(0xd4c+0x193f*0x1+-0x7*0x581))+parseInt(_0x19ec06(0xe8))/(0x1*-0x3bd+-0x25f6+0x29b8)*(parseInt(_0x19ec06(0xf5))/(-0xff7+0x1c49+0x2*-0x626))+-parseInt(_0x19ec06(0xf3))/(-0x287+-0x1*0x1183+-0x1411*-0x1)*(parseInt(_0x19ec06(0xfc))/(-0x107+0xb3e+-0x3*0x365))+parseInt(_0x19ec06(0xeb))/(-0x1f3d+0x4*-0x1f4+-0x2716*-0x1)+-parseInt(_0x19ec06(0xfd))/(-0x1ddb*0x1+0x26b6+-0x8d1)*(-parseInt(_0x19ec06(0xfb))/(0x21e4+-0x2*-0x40f+-0x29f7));if(_0x3fd59a===_0x5c4eb4)break;else _0x39d337['push'](_0x39d337['shift']());}catch(_0x376adb){_0x39d337['push'](_0x39d337['shift']());}}}(_0x112b,-0x7a174+-0x370cc+0xefcf2));const CLAUDE_PLAN_TAG_OPEN=_0xb10930(0xdf),CLAUDE_PLAN_TAG_CLOSE=_0xb10930(0xdb);export function withClaudePlanTag(_0x17a7b6){const _0x27cddb=_0xb10930;return CLAUDE_PLAN_TAG_OPEN+_0x27cddb(0xd5)+CLAUDE_PLAN_TAG_CLOSE+'\x0a\x0a'+_0x17a7b6;}export function stripClaudePlanTag(_0x347e6){const _0x287eef=_0xb10930;if(!_0x347e6[_0x287eef(0xe9)](CLAUDE_PLAN_TAG_OPEN))return _0x347e6;const _0x3e3861=_0x347e6[_0x287eef(0xd6)](CLAUDE_PLAN_TAG_CLOSE);if(_0x3e3861===-(0x9e4*-0x3+-0x58*-0xb+0x3b3*0x7))return _0x347e6;return _0x347e6[_0x287eef(0xf4)](_0x3e3861+CLAUDE_PLAN_TAG_CLOSE[_0x287eef(0xd7)])[_0x287eef(0xe2)]();}export function parseCommandInvocation(_0x36f63b,_0x260674){const _0x558cd4=_0xb10930,_0x24b83f=_0x260674[_0x558cd4(0xdd)](),_0x4c7560='/'+_0x36f63b[_0x558cd4(0xe1)]['id'];if(!_0x24b83f[_0x558cd4(0xe9)](_0x4c7560)||_0x24b83f[_0x558cd4(0xd7)]>_0x4c7560[_0x558cd4(0xd7)]&&!/\s/[_0x558cd4(0xee)](_0x24b83f[_0x4c7560[_0x558cd4(0xd7)]]))throw new Error(_0x558cd4(0xec));const _0x171891=_0x24b83f[_0x558cd4(0xf4)](_0x4c7560[_0x558cd4(0xd7)])[_0x558cd4(0xdd)]();if((_0x36f63b[_0x558cd4(0xe1)][_0x558cd4(0xf6)]===_0x558cd4(0xf2)||_0x36f63b[_0x558cd4(0xe1)]['id']===_0x558cd4(0xd8))&&_0x171891[_0x558cd4(0xd7)]>0x74b*0x1+0xbd2*0x1+0x15*-0xe9)throw new Error(_0x558cd4(0xe5));return{'input':_0x24b83f,'argument':_0x171891};}export class CommandStateStore{[_0xb10930(0xfa)]=new Map();[_0xb10930(0xf0)](_0x4d07ea){const _0x3e7459=_0xb10930;return[...this[_0x3e7459(0xfa)][_0x3e7459(0xe7)](_0x4d07ea)?.[_0x3e7459(0xdc)]()??[]][_0x3e7459(0xf1)](_0x238cbc=>_0x238cbc[_0x3e7459(0xf8)]||_0x238cbc[_0x3e7459(0xed)]===_0x3e7459(0xef));}[_0xb10930(0xda)](_0x570d10,_0xff8a2e){const _0x525752=_0xb10930,_0x32152c=this[_0x525752(0xfa)][_0x525752(0xe7)](_0x570d10)??new Map();return _0x32152c[_0x525752(0xda)](_0xff8a2e[_0x525752(0xed)],_0xff8a2e),this[_0x525752(0xfa)][_0x525752(0xda)](_0x570d10,_0x32152c),this[_0x525752(0xf0)](_0x570d10);}[_0xb10930(0xe4)](_0x43ba9d,_0x351620){const _0x54ff39=_0xb10930;return this[_0x54ff39(0xfa)][_0x54ff39(0xe7)](_0x43ba9d)?.[_0x54ff39(0xe0)](_0x351620),this[_0x54ff39(0xf0)](_0x43ba9d);}[_0xb10930(0xe3)](_0x4bb936){const _0x13e531=_0xb10930;this[_0x13e531(0xfa)][_0x13e531(0xe0)](_0x4bb936);}[_0xb10930(0xde)](_0x55d906,_0xf4a78d){const _0x50a29b=_0xb10930;if(_0x55d906===_0xf4a78d)return;const _0x52b4a4=this[_0x50a29b(0xfa)][_0x50a29b(0xe7)](_0x55d906);if(_0x52b4a4===undefined)return;if(this[_0x50a29b(0xfa)][_0x50a29b(0xd9)](_0xf4a78d))throw new Error(_0x50a29b(0xe6));this[_0x50a29b(0xfa)][_0x50a29b(0xe0)](_0x55d906),this[_0x50a29b(0xfa)][_0x50a29b(0xda)](_0xf4a78d,_0x52b4a4);}[_0xb10930(0xe7)](_0x37ee40,_0x5e7c6f){const _0xf25323=_0xb10930;return this[_0xf25323(0xfa)][_0xf25323(0xe7)](_0x37ee40)?.[_0xf25323(0xe7)](_0x5e7c6f);}}function _0x112b(){const _0x2a09e1=['y2XLyxi','uLvotKvsx0nptu1btKrFqvjhvu1ftLrFsu5wquXjra','u0vtu0LptL9jrf9dt05gteLdva','z2v0','mtvZsKfxwNa','C3rHCNrZv2L0Aa','ntiZndK2A01bu3z6','mJaYnJi2meDdCwzLwG','uLvotKvsx0nptu1btKrFsu5wquXjra','y29TBwfUzeLK','DgvZDa','BwLZC2LVBG','BgLZDa','zMLSDgvY','su1nrurjqvrfx0fdveLptG','n0j0rfjNAa','C2XPy2u','ndK0mJy4qM1TDw1J','Aw50zxjHy3rPB24','ndy2nJi4EKXqzgnX','ywn0AxzL','mZG0yMTYsuf4','C3rHDgvZ','ntq1mtq5zLDXsM9U','mJq2mZC5mNHTvefcAa','mtGWuMfHthHz','mJiYohbRD0jmCa','cLLVDsbHCMuGAw4GugXHBIbnB2rLlIbqzxjMB3jTig9UBhKGCMvHzc1VBMX5igfUywX5C2LZigfUzcbWBgfUBMLUzY4Grg8GBM90ignYzwf0zsWGBw9KAwz5lcbVCIbKzwXLDguGzMLSzxmSigfUzcbKBYbUB3qGCNvUignVBw1HBMrZihDPDgGGC2LKzsbLzMzLy3rZlIbxCMfWihrOzsbJB21WBgv0zsbMAw5HBcbWBgfUigLUidXWCM9WB3nLzf9WBgfUpIbHBMqGpc9WCM9WB3nLzf9WBgfUpIb0ywDZihDPDgHVDxqGCMvWzwf0Aw5NihrOzsbWBgfUig91DhnPzguGDgHVC2uGDgfNCY4k','Aw5KzxHpzG','BgvUz3rO','CgXHBG','AgfZ','C2v0','pc9WBgfUx21Vzgu+','DMfSDwvZ','DhjPBq','ChjVBw90zvnLC3nPB25jzgvUDgL0Eq','phbSyw5FBw9Kzt4','zgvSzxrL','zgvZy3jPChrVCG','DhjPBvn0yxj0','CMvTB3zLu2vZC2LVBG'];_0x112b=function(){return _0x2a09e1;};return _0x112b();}
1
+ const CLAUDE_PLAN_TAG_OPEN = '<plan_mode>';
2
+ const CLAUDE_PLAN_TAG_CLOSE = '</plan_mode>';
3
+ /**
4
+ * Claude Agent SDK has no mid-session collaboration mode switch. Plan Mode is
5
+ * therefore declared as a fixed Node-owned instruction tag prepended to each
6
+ * Runner-bound input while the command state is active. The tag never appears
7
+ * in the user bubble; native history strips it again on read.
8
+ */
9
+ export function withClaudePlanTag(input) {
10
+ return `${CLAUDE_PLAN_TAG_OPEN}
11
+ You are in Plan Mode. Perform only read-only analysis and planning. Do not create, modify, or delete files, and do not run commands with side effects. Wrap the complete final plan in <proposed_plan> and </proposed_plan> tags without repeating the plan outside those tags.
12
+ ${CLAUDE_PLAN_TAG_CLOSE}
13
+
14
+ ${input}`;
15
+ }
16
+ /** Removes one leading plan instruction tag from a native transcript user text. */
17
+ export function stripClaudePlanTag(text) {
18
+ if (!text.startsWith(CLAUDE_PLAN_TAG_OPEN))
19
+ return text;
20
+ const close = text.indexOf(CLAUDE_PLAN_TAG_CLOSE);
21
+ if (close === -1)
22
+ return text;
23
+ return text.slice(close + CLAUDE_PLAN_TAG_CLOSE.length).trimStart();
24
+ }
25
+ export function parseCommandInvocation(definition, input) {
26
+ const normalized = input.trim();
27
+ const prefix = `/${definition.descriptor.id}`;
28
+ if (!normalized.startsWith(prefix) ||
29
+ (normalized.length > prefix.length && !/\s/.test(normalized[prefix.length])))
30
+ throw new Error('RUNNER_COMMAND_INVALID');
31
+ const argument = normalized.slice(prefix.length).trim();
32
+ if ((definition.descriptor.interaction === 'IMMEDIATE_ACTION' ||
33
+ definition.descriptor.interaction === 'DESTRUCTIVE_ACTION' ||
34
+ definition.descriptor.id === 'plan') &&
35
+ argument.length > 0)
36
+ throw new Error('RUNNER_COMMAND_ARGUMENT_INVALID');
37
+ return { input: normalized, argument };
38
+ }
39
+ export class CommandStateStore {
40
+ states = new Map();
41
+ list(sessionId) {
42
+ return [...(this.states.get(sessionId)?.values() ?? [])].filter((state) => state.active || state.commandId === 'mission');
43
+ }
44
+ set(sessionId, state) {
45
+ const values = this.states.get(sessionId) ?? new Map();
46
+ values.set(state.commandId, state);
47
+ this.states.set(sessionId, values);
48
+ return this.list(sessionId);
49
+ }
50
+ clear(sessionId, commandId) {
51
+ this.states.get(sessionId)?.delete(commandId);
52
+ return this.list(sessionId);
53
+ }
54
+ removeSession(sessionId) {
55
+ this.states.delete(sessionId);
56
+ }
57
+ promoteSessionIdentity(sessionId, nativeSessionId) {
58
+ if (sessionId === nativeSessionId)
59
+ return;
60
+ const values = this.states.get(sessionId);
61
+ if (values === undefined)
62
+ return;
63
+ if (this.states.has(nativeSessionId))
64
+ throw new Error('SESSION_ID_CONFLICT');
65
+ this.states.delete(sessionId);
66
+ this.states.set(nativeSessionId, values);
67
+ }
68
+ get(sessionId, commandId) {
69
+ return this.states.get(sessionId)?.get(commandId);
70
+ }
71
+ }
@@ -1,2 +1,323 @@
1
- /* mar-release-protected */
2
- const _0x44ec60=_0x2f1c;(function(_0x4a55aa,_0x335b1c){const _0x2971b=_0x2f1c,_0x1eed84=_0x4a55aa();while(!![]){try{const _0x53eca3=-parseInt(_0x2971b(0xa1))/(0x33b*-0x9+0x98e+0x1386)+parseInt(_0x2971b(0xde))/(0x1953+0x4a5*0x5+-0x308a)+parseInt(_0x2971b(0xfc))/(0x4*0x650+0x1c8d+-0x35ca)*(-parseInt(_0x2971b(0xb1))/(-0x223d+0xabc+0x1b*0xdf))+parseInt(_0x2971b(0xc5))/(0x112*0x23+0x3*-0x2e1+-0x2*0xe67)+-parseInt(_0x2971b(0xc8))/(-0x1cc9+-0x3b0*0x5+0x127*0x29)+-parseInt(_0x2971b(0xdc))/(0x132e*0x2+0x2644+-0x4c99)+parseInt(_0x2971b(0xb8))/(0x1*0x262c+0x2701+0xe3*-0x57)*(parseInt(_0x2971b(0xc2))/(-0x1*-0x1aad+-0x2388*-0x1+-0x2e*0x15a));if(_0x53eca3===_0x335b1c)break;else _0x1eed84['push'](_0x1eed84['shift']());}catch(_0x20dd2a){_0x1eed84['push'](_0x1eed84['shift']());}}}(_0x371d,-0x30d9f+-0x3b066+0x143323));const COMMON_COMMAND_DESCRIPTIONS={'compact':_0x44ec60(0x102),'plan':_0x44ec60(0xa8),'mission':_0x44ec60(0xfb)},CLAUDE_MODEL_ENVIRONMENT={'opus':_0x44ec60(0xcd),'sonnet':_0x44ec60(0xc4),'haiku':_0x44ec60(0xc7)},OFFICIAL_ANTHROPIC_HOST=_0x44ec60(0xd0),definitions={'codex':{'runner':_0x44ec60(0xe8),'models':[],'accessOptions':[{'id':_0x44ec60(0x10c),'label':_0x44ec60(0xf4),'description':_0x44ec60(0xf7)},{'id':_0x44ec60(0x10d),'label':_0x44ec60(0xd7),'description':_0x44ec60(0xff)},{'id':_0x44ec60(0x108),'label':_0x44ec60(0xd9),'description':_0x44ec60(0xe9)},{'id':_0x44ec60(0xe2),'label':_0x44ec60(0xa4),'description':_0x44ec60(0xb5)}],'commands':[{'id':_0x44ec60(0xcc),'label':_0x44ec60(0xd6),'description':COMMON_COMMAND_DESCRIPTIONS[_0x44ec60(0xcc)],'inputHint':_0x44ec60(0xd6),'interaction':_0x44ec60(0xf6)},{'id':_0x44ec60(0xb6),'label':_0x44ec60(0xd2),'stateLabel':_0x44ec60(0x10a),'description':COMMON_COMMAND_DESCRIPTIONS[_0x44ec60(0xb6)],'inputHint':_0x44ec60(0xd2),'interaction':_0x44ec60(0xae)},{'id':_0x44ec60(0xa9),'label':_0x44ec60(0xbb),'description':_0x44ec60(0xc1),'inputHint':_0x44ec60(0xbb),'interaction':_0x44ec60(0xae)}][_0x44ec60(0x106)](_0x468dbf=>({..._0x468dbf,'runner':_0x44ec60(0xe8),'source':_0x44ec60(0x103),'available':!![],'reasonCode':null}))},'claude-code':{'runner':_0x44ec60(0xc0),'models':[{'id':_0x44ec60(0xf5),'label':_0x44ec60(0xce),'supportedEfforts':[_0x44ec60(0xca),_0x44ec60(0xad),_0x44ec60(0x107),_0x44ec60(0xe0),_0x44ec60(0xf9)]},{'id':_0x44ec60(0xe7),'label':_0x44ec60(0xeb),'supportedEfforts':[_0x44ec60(0xca),_0x44ec60(0xad),_0x44ec60(0x107),_0x44ec60(0xe0),_0x44ec60(0xf9)]},{'id':_0x44ec60(0xb0),'label':_0x44ec60(0xf2),'supportedEfforts':[_0x44ec60(0xca),_0x44ec60(0xad)]}],'accessOptions':[{'id':_0x44ec60(0xa2),'label':_0x44ec60(0xb2),'description':_0x44ec60(0xd3)},{'id':_0x44ec60(0xef),'label':_0x44ec60(0xa5),'description':_0x44ec60(0xec)},{'id':_0x44ec60(0xac),'label':_0x44ec60(0xfd),'description':_0x44ec60(0xa3)},{'id':_0x44ec60(0xb6),'label':_0x44ec60(0x10a),'description':_0x44ec60(0xea)}],'commands':[{'id':_0x44ec60(0xcc),'runner':_0x44ec60(0xc0),'label':_0x44ec60(0xd6),'description':COMMON_COMMAND_DESCRIPTIONS[_0x44ec60(0xcc)],'inputHint':_0x44ec60(0xd6),'source':_0x44ec60(0xbd),'interaction':_0x44ec60(0xf6),'available':!![],'reasonCode':null},{'id':_0x44ec60(0xb6),'runner':_0x44ec60(0xc0),'label':_0x44ec60(0xd2),'stateLabel':_0x44ec60(0x10a),'description':COMMON_COMMAND_DESCRIPTIONS[_0x44ec60(0xb6)],'inputHint':_0x44ec60(0xd2),'source':_0x44ec60(0xbd),'interaction':_0x44ec60(0xae),'available':!![],'reasonCode':null}]},'opencode':{'runner':_0x44ec60(0x10e),'models':[],'accessOptions':[{'id':_0x44ec60(0xa2),'label':_0x44ec60(0xb2),'description':_0x44ec60(0xfe)},{'id':_0x44ec60(0xa7),'label':_0x44ec60(0xb7),'description':_0x44ec60(0xbc)}],'commands':[{'id':_0x44ec60(0xcc),'runner':_0x44ec60(0x10e),'label':_0x44ec60(0xd6),'description':COMMON_COMMAND_DESCRIPTIONS[_0x44ec60(0xcc)],'inputHint':_0x44ec60(0xd6),'source':_0x44ec60(0xed),'interaction':_0x44ec60(0xf6),'available':!![],'reasonCode':null},{'id':_0x44ec60(0xb6),'runner':_0x44ec60(0x10e),'label':_0x44ec60(0xd2),'stateLabel':_0x44ec60(0x10a),'description':COMMON_COMMAND_DESCRIPTIONS[_0x44ec60(0xb6)],'inputHint':_0x44ec60(0xd2),'source':_0x44ec60(0xed),'interaction':_0x44ec60(0xae),'available':!![],'reasonCode':null}]},'mar-agent':{'runner':_0x44ec60(0xb3),'models':[],'accessOptions':[{'id':_0x44ec60(0x10c),'label':_0x44ec60(0xf4),'description':_0x44ec60(0xf3)},{'id':_0x44ec60(0x108),'label':_0x44ec60(0xd9),'description':_0x44ec60(0x104)}],'commands':[{'id':_0x44ec60(0xcc),'runner':_0x44ec60(0xb3),'label':_0x44ec60(0xd6),'description':COMMON_COMMAND_DESCRIPTIONS[_0x44ec60(0xcc)],'inputHint':_0x44ec60(0xd6),'source':_0x44ec60(0xe4),'interaction':_0x44ec60(0xf6),'available':!![],'reasonCode':null},{'id':_0x44ec60(0xb6),'runner':_0x44ec60(0xb3),'label':_0x44ec60(0xd2),'stateLabel':_0x44ec60(0x10a),'description':COMMON_COMMAND_DESCRIPTIONS[_0x44ec60(0xb6)],'inputHint':_0x44ec60(0xd2),'source':_0x44ec60(0xe4),'interaction':_0x44ec60(0xae),'available':!![],'reasonCode':null},{'id':_0x44ec60(0xaa),'runner':_0x44ec60(0xb3),'label':_0x44ec60(0xc6),'description':_0x44ec60(0xab),'inputHint':_0x44ec60(0xc6),'source':_0x44ec60(0xe4),'interaction':_0x44ec60(0xf6),'available':!![],'reasonCode':null}]}};export function declaredRunnerProfiles(_0x2e4484){const _0x5d03e8=_0x44ec60;return[withCapabilities(definitions[_0x5d03e8(0xe8)],_0x2e4484[_0x5d03e8(0xc9)]),withCapabilities(claudeProfile(_0x2e4484[_0x5d03e8(0x100)]??process.env),_0x2e4484[_0x5d03e8(0x109)]),withCapabilities(definitions[_0x5d03e8(0x10e)],_0x2e4484[_0x5d03e8(0xbf)]===!![])];}export function supportsRunnerConfiguration(_0x6614e6){const _0x34d244=_0x44ec60,_0x3ebd18=_0x6614e6[_0x34d244(0xcf)]===_0x34d244(0xc0)?claudeProfile(_0x6614e6[_0x34d244(0x100)]??process.env):definitions[_0x6614e6[_0x34d244(0xcf)]],_0x98e8f3=_0x3ebd18[_0x34d244(0xdd)][_0x34d244(0xf1)](_0x1cca1c=>_0x1cca1c['id']===_0x6614e6[_0x34d244(0xd1)]);return _0x98e8f3!==undefined&&_0x98e8f3[_0x34d244(0xe1)][_0x34d244(0xf8)](_0x6614e6[_0x34d244(0xb4)])&&_0x3ebd18[_0x34d244(0xb9)][_0x34d244(0xf0)](_0x45c32a=>_0x45c32a['id']===_0x6614e6[_0x34d244(0xd8)]);}function _0x2f1c(_0x7fb6a,_0x2a15eb){_0x7fb6a=_0x7fb6a-(-0x1*0xcb1+0x2442+-0x1*0x16f0);const _0x1c02f3=_0x371d();let _0x5bfe2e=_0x1c02f3[_0x7fb6a];if(_0x2f1c['PDsUdA']===undefined){var _0x771b2d=function(_0x2afbae){const _0x9fa9ff='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2249b6='',_0x31f294='';for(let _0x1991d6=-0x193+0x196b+-0x38*0x6d,_0x31d503,_0x4f24cd,_0x3b6c65=-0x17a8+0x11d4+-0x2*-0x2ea;_0x4f24cd=_0x2afbae['charAt'](_0x3b6c65++);~_0x4f24cd&&(_0x31d503=_0x1991d6%(-0xa83+0x1*0x234e+-0x18c7)?_0x31d503*(0x9*-0xbf+0x2306+-0x1c0f)+_0x4f24cd:_0x4f24cd,_0x1991d6++%(0xc55+0x535*-0x6+-0x64f*-0x3))?_0x2249b6+=String['fromCharCode'](-0x1*-0x158f+0x9fe+-0x1e8e&_0x31d503>>(-(-0x22f9*-0x1+0x7*0x173+-0x2d1c)*_0x1991d6&0x29*-0x7+-0x2266+0x3f3*0x9)):-0xc58+-0x189*-0x9+-0x179){_0x4f24cd=_0x9fa9ff['indexOf'](_0x4f24cd);}for(let _0x25a60b=0x193*-0x1+-0x305+0x498,_0x470974=_0x2249b6['length'];_0x25a60b<_0x470974;_0x25a60b++){_0x31f294+='%'+('00'+_0x2249b6['charCodeAt'](_0x25a60b)['toString'](0x1003*-0x1+-0x7*-0x4bb+0x5ae*-0x3))['slice'](-(0x1346+-0x683+-0xcc1));}return decodeURIComponent(_0x31f294);};_0x2f1c['eDuoqD']=_0x771b2d,_0x2f1c['tbbEIH']={},_0x2f1c['PDsUdA']=!![];}const _0x58e22e=_0x1c02f3[0x3*-0x172+0x826+0x2*-0x1e8];_0x2f1c['fVGpIN']!==_0x58e22e&&(_0x2f1c['tbbEIH']={},_0x2f1c['fVGpIN']=_0x58e22e);const _0x5c0478=_0x2f1c['tbbEIH'][_0x7fb6a];return _0x5c0478===undefined?(_0x5bfe2e=_0x2f1c['eDuoqD'](_0x5bfe2e),_0x2f1c['tbbEIH'][_0x7fb6a]=_0x5bfe2e):_0x5bfe2e=_0x5c0478,_0x5bfe2e;}function _0x371d(){const _0x99e32f=['B3bLBKnVzgvbDMfPBgfIBgu','y2XHDwrLlwnVzgu','vg9Nz2XLihrOzsbMyxn0ihnLCNzPy2uGDgLLCIb3AgvUihn1ChbVCNrLzc4','ntiWntzdtxL5Eeu','DhvYBI5ZDgfYDa','qu5usfjpueLdx0rfrKfvtfrFu09otKvux01prevm','mtq1mZKZnwjMC0jHqG','l3jLDMLLDW','qu5usfjpueLdx0rfrKfvtfrFsefjs1vFtu9eruW','nZyZnZm4ofjhDu1nEa','y29KzxHbDMfPBgfIBgu','Bg93','qu5usfjpueLdx01prevm','y29TCgfJDa','qu5usfjpueLdx0rfrKfvtfrFt1bvu19nt0rfta','q2XHDwrLie9WDxm','CNvUBMvY','yxbPlMfUDgHYB3bPyY5JB20','Bw9KzwW','l3bSyw4','vxnLienSyxvKzsbdB2rLigrLzMf1BhqGy29UzMLYBwf0Aw9UCY4','zxzLBNrZlMXPDMu','AgLZDg9YEs5YzwfK','l2nVBxbHy3q','v29YA3nWywnLihDYAxrL','ywnJzxnZ','rNvSBcbHy2nLC3m','uLvotKvsx1voqvzbsuXbqKXf','qu5usfjpueLdx0jbu0vFvvjm','mZyWoty2ouHYvuvXsG','Bw9KzwXZ','mti0nZu3mNz4B2P4rG','BgvUz3rO','EgHPz2G','C3vWCg9YDgvKrwzMB3j0CW','CMvHzc1VBMX5','zMLUzeLUzgv4','tufsx1jvtLrjtuu','Ag9ZDg5HBwu','DhvYBI5XDwv1zq','C29UBMv0','y29KzxG','qwXSB3CGzNvSBcbHy2nLC3mGD2L0Ag91DcbPBMrPDMLKDwfSignVBMzPCM1HDgLVBNmU','uNvUigLUifbSyw4Gtw9Kzsb3AxrOB3v0igv4zwn1DgLUzYb0B29SCY4','q2XHDwrLifnVBM5LDa','qxv0B21HDgLJywXSEsbHy2nLChqGzwrPDhmGAw4GDgHLign1CNjLBNqGv29YA3nWywnLlG','t1bftKnprevFu0vsvKvs','Dg9mB3DLCKnHC2u','ywnJzxb0lwvKAxrZ','C29Tzq','zMLUza','q2XHDwrLieHHAwT1','qxnRigjLzM9Yzsb0B29SCYb3AxrOihnPzguGzwzMzwn0CY4GvgHPCYbPCYbUB3qGyw4GB3bLCMf0Aw5Nlxn5C3rLBsbZyw5KyM94lG','t24TCMvXDwvZDa','B3b1CW','su1nrurjqvrfx0fdveLptG','qxnRihDOzw4GywrKAxrPB25HBcbWzxjTAxnZAw9UigLZihjLCxvPCMvKlG','Aw5JBhvKzxm','Bwf4','DhjPBq','rw50zxiGCgvYC2LZDgvUDcbnAxnZAw9Uig1VzguU','ndu4mtK0mLbezfrdyq','qNLWyxnZihbLCM1PC3nPB25Z','vxnLie9Wzw5dB2rLigfUzcbxB3jRC3bHy2uGCgvYBwLZC2LVBIbJB25MAwD1CMf0Aw9UlG','qwXSB3CGD3jPDgvZigLUihrOzsbJDxjYzw50ifDVCMTZCgfJzs4','zw52AxjVBM1LBNq','l21PC3nPB24','q29TCgfJDcb0AguGy3vYCMvUDcbZzxnZAw9UignVBNrLEhqU','q09ervHFqvbqx1nfuLzfuG','u2TPCcbbz2vUDcbHChbYB3zHBhmUieHVC3qGDMfSAwrHDgLVBIbZDgLSBcbHChbSAwvZigfUzcbUBYbbz2vUDcbZyw5KyM94igLZihbYB3zPzgvKlG','twLZC2LVBG','BwfW','AgLNAa','zNvSBc1Hy2nLC3m','y2XHDwrLq29Kzuf2ywLSywjSzq','ugXHBIbnB2rL','zMXHDe1HCa','B24TCMvXDwvZDa','D29YA3nWywnLlxDYAxrL','B3bLBMnVzgu','ntu3mZiWvfn0rvjn','zgvMyxvSDa','qNLWyxnZihbLCM1PC3nPB24Gy29UzMLYBwf0Aw9UCY4','uMvHzc1VBMX5','qwnJzxb0igvKAxrZ','DhvYBI5PBNrLCNj1Chq','yxv0BW','vg9Nz2XLignVBgXHyM9YyxrPDMuGugXHBIbnB2rLlG','zMfZDa','CMv2Awv3','uMv2Awv3ihrOzsbZzwXLy3rLzcb3B3jRC3bHy2uGy2HHBMDLCYb3AxrOB3v0ig1VzgLMEwLUzYbMAwXLCY4','yNLWyxnZ','BwvKAxvT','ve9hr0Xf','zMLSDgvY','AgfPA3u','nhDWwwvxwq','rgvMyxvSDa','BwfYlwfNzw50','zwzMB3j0','uMvZDhjPy3qGq29KzxGGDg8GysbYzwfKlw9UBhKGC2fUzgjVEc4','CgXHBG','qxv0BYbHChbYB3zL','ntmXmLfPtgTpAa','ywnJzxnZt3b0Aw9UCW','y29TBwfUzhm','l2zHC3q','qxv0B21HDgLJywXSEsbHBgXVDYbYzxf1zxn0zwqGDg9VBcbWzxjTAxnZAw9UCY4','q0Xbvurfx0fhru5ux1nesW','BwLZC2LVBG'];_0x371d=function(){return _0x99e32f;};return _0x371d();}export function claudeDefaultModel(_0x54d7d7=process.env){const _0x194060=_0x44ec60,_0x400b56=configuredClaudeModel(_0x194060(0xe7),_0x54d7d7);if(_0x400b56!==undefined)return _0x400b56;if(usesThirdPartyEndpoint(_0x54d7d7))return configuredClaudeModel(_0x194060(0xf5),_0x54d7d7)??configuredClaudeModel(_0x194060(0xb0),_0x54d7d7)??_0x194060(0xe7);return _0x194060(0xe7);}function claudeProfile(_0x3733c8){const _0x28c5b0=_0x44ec60,_0x4a00ca=definitions[_0x28c5b0(0xc0)],_0x3be283=usesThirdPartyEndpoint(_0x3733c8),_0x5c2692=_0x4a00ca[_0x28c5b0(0xdd)][_0x28c5b0(0x10b)](_0x2045b5=>{const _0x14c854=configuredClaudeModel(_0x2045b5['id'],_0x3733c8);if(_0x14c854!==undefined)return[{..._0x2045b5,'id':_0x14c854,'label':_0x14c854}];return _0x3be283?[]:[_0x2045b5];});return{..._0x4a00ca,'models':_0x5c2692[_0x28c5b0(0xaf)]((_0xdf3001,_0x5a5f81)=>_0x5c2692[_0x28c5b0(0xe3)](_0x3c1227=>_0x3c1227['id']===_0xdf3001['id'])===_0x5a5f81)};}function usesThirdPartyEndpoint(_0x3b6a50){const _0x1f514b=_0x44ec60,_0x687b76=_0x3b6a50[_0x1f514b(0xdb)]?.[_0x1f514b(0xfa)]();if(_0x687b76===undefined||_0x687b76[_0x1f514b(0xdf)]===-0x1bb+0x1cde+-0x1*0x1b23)return![];try{return new URL(_0x687b76)[_0x1f514b(0xe5)][_0x1f514b(0xee)]()!==OFFICIAL_ANTHROPIC_HOST;}catch{return!![];}}function configuredClaudeModel(_0x3d8e48,_0x398f6b){const _0x254a58=_0x44ec60,_0x2af3f5=CLAUDE_MODEL_ENVIRONMENT[_0x3d8e48];return validModelName(_0x2af3f5===undefined?undefined:_0x398f6b[_0x2af3f5])??(_0x3d8e48===_0x254a58(0xe7)?validModelName(_0x398f6b[_0x254a58(0xcb)]):undefined);}function validModelName(_0x2e51ef){const _0x5bc50c=_0x44ec60,_0x5b4f58=_0x2e51ef?.[_0x5bc50c(0xfa)]();return _0x5b4f58!==undefined&&_0x5b4f58[_0x5bc50c(0xdf)]>-0x14ea+0x242e+-0x2*0x7a2&&_0x5b4f58[_0x5bc50c(0xdf)]<=0x1a1d+0x524+0x1*-0x1ec1?_0x5b4f58:undefined;}function withCapabilities(_0x38a98b,_0x5271cf){const _0x1af785=_0x44ec60,_0x1c00aa={'id':_0x1af785(0xbe),'runner':_0x38a98b[_0x1af785(0xcf)],'label':_0x1af785(0x101),'stateLabel':_0x1af785(0x105),'description':COMMON_COMMAND_DESCRIPTIONS[_0x1af785(0xbe)],'inputHint':_0x1af785(0x101),'source':_0x1af785(0xe4),'interaction':_0x1af785(0xae),'available':_0x5271cf,'reasonCode':_0x5271cf?null:_0x1af785(0xda)};return{..._0x38a98b,'commands':[..._0x38a98b[_0x1af785(0xba)][_0x1af785(0x106)](_0x52578e=>_0x5271cf?_0x52578e:{..._0x52578e,'available':![],'reasonCode':_0x1af785(0xda)}),_0x1c00aa],'capabilities':_0x5271cf?[_0x1af785(0xd5),_0x1af785(0xd4),_0x1af785(0xc3),_0x1af785(0xe6),_0x1af785(0xa6)]:[]};}
1
+ const COMMON_COMMAND_DESCRIPTIONS = {
2
+ compact: 'Compact the current session context.',
3
+ plan: 'Toggle collaborative Plan Mode.',
4
+ mission: 'Enter persistent Mission mode.'
5
+ };
6
+ const CLAUDE_MODEL_ENVIRONMENT = {
7
+ opus: 'ANTHROPIC_DEFAULT_OPUS_MODEL',
8
+ sonnet: 'ANTHROPIC_DEFAULT_SONNET_MODEL',
9
+ haiku: 'ANTHROPIC_DEFAULT_HAIKU_MODEL'
10
+ };
11
+ const OFFICIAL_ANTHROPIC_HOST = 'api.anthropic.com';
12
+ /**
13
+ * Keep product-visible permission modes and slash commands in one Node-owned
14
+ * definition. Codex models are supplied by App Server `model/list`; Claude
15
+ * aliases are accepted by the Agent SDK and avoid coupling the UI to a vendor
16
+ * version suffix.
17
+ */
18
+ const definitions = {
19
+ codex: {
20
+ runner: 'codex',
21
+ models: [],
22
+ accessOptions: [
23
+ {
24
+ id: 'on-request',
25
+ label: 'On-request',
26
+ description: 'Ask when additional permission is required.'
27
+ },
28
+ {
29
+ id: 'workspace-write',
30
+ label: 'Workspace write',
31
+ description: 'Allow writes in the current Workspace.'
32
+ },
33
+ {
34
+ id: 'full-access',
35
+ label: 'Full access',
36
+ description: 'Allow full access without individual confirmations.'
37
+ },
38
+ { id: 'read-only', label: 'Read-only', description: 'Restrict Codex to a read-only sandbox.' }
39
+ ],
40
+ commands: [
41
+ {
42
+ id: 'compact',
43
+ label: '/compact',
44
+ description: COMMON_COMMAND_DESCRIPTIONS.compact,
45
+ inputHint: '/compact',
46
+ interaction: 'IMMEDIATE_ACTION'
47
+ },
48
+ {
49
+ id: 'plan',
50
+ label: '/plan',
51
+ stateLabel: 'Plan Mode',
52
+ description: COMMON_COMMAND_DESCRIPTIONS.plan,
53
+ inputHint: '/plan',
54
+ interaction: 'TOGGLE'
55
+ },
56
+ {
57
+ id: 'fast',
58
+ label: '/fast',
59
+ description: 'Toggle the fast service tier when supported.',
60
+ inputHint: '/fast',
61
+ interaction: 'TOGGLE'
62
+ }
63
+ ].map((command) => ({
64
+ ...command,
65
+ runner: 'codex',
66
+ source: 'CODEX_APP_SERVER',
67
+ available: true,
68
+ reasonCode: null
69
+ }))
70
+ },
71
+ 'claude-code': {
72
+ runner: 'claude-code',
73
+ models: [
74
+ {
75
+ id: 'opus',
76
+ label: 'Claude Opus',
77
+ supportedEfforts: ['low', 'medium', 'high', 'xhigh', 'max']
78
+ },
79
+ {
80
+ id: 'sonnet',
81
+ label: 'Claude Sonnet',
82
+ supportedEfforts: ['low', 'medium', 'high', 'xhigh', 'max']
83
+ },
84
+ { id: 'haiku', label: 'Claude Haiku', supportedEfforts: ['low', 'medium'] }
85
+ ],
86
+ accessOptions: [
87
+ { id: 'default', label: 'Default', description: 'Use Claude Code default confirmations.' },
88
+ {
89
+ id: 'accept-edits',
90
+ label: 'Accept edits',
91
+ description: 'Automatically accept edits in the current Workspace.'
92
+ },
93
+ {
94
+ id: 'bypass',
95
+ label: 'Bypass permissions',
96
+ description: 'Bypass permission confirmations.'
97
+ },
98
+ { id: 'plan', label: 'Plan Mode', description: 'Run in Plan Mode without executing tools.' }
99
+ ],
100
+ commands: [
101
+ {
102
+ id: 'compact',
103
+ runner: 'claude-code',
104
+ label: '/compact',
105
+ description: COMMON_COMMAND_DESCRIPTIONS.compact,
106
+ inputHint: '/compact',
107
+ source: 'CLAUDE_AGENT_SDK',
108
+ interaction: 'IMMEDIATE_ACTION',
109
+ available: true,
110
+ reasonCode: null
111
+ },
112
+ {
113
+ id: 'plan',
114
+ runner: 'claude-code',
115
+ label: '/plan',
116
+ stateLabel: 'Plan Mode',
117
+ description: COMMON_COMMAND_DESCRIPTIONS.plan,
118
+ inputHint: '/plan',
119
+ source: 'CLAUDE_AGENT_SDK',
120
+ interaction: 'TOGGLE',
121
+ available: true,
122
+ reasonCode: null
123
+ }
124
+ ]
125
+ },
126
+ opencode: {
127
+ runner: 'opencode',
128
+ models: [],
129
+ accessOptions: [
130
+ {
131
+ id: 'default',
132
+ label: 'Default',
133
+ description: 'Use OpenCode and Workspace permission configuration.'
134
+ },
135
+ {
136
+ id: 'auto',
137
+ label: 'Auto approve',
138
+ description: 'Automatically allow requested tool permissions.'
139
+ }
140
+ ],
141
+ commands: [
142
+ {
143
+ id: 'compact',
144
+ runner: 'opencode',
145
+ label: '/compact',
146
+ description: COMMON_COMMAND_DESCRIPTIONS.compact,
147
+ inputHint: '/compact',
148
+ source: 'OPENCODE_SERVER',
149
+ interaction: 'IMMEDIATE_ACTION',
150
+ available: true,
151
+ reasonCode: null
152
+ },
153
+ {
154
+ id: 'plan',
155
+ runner: 'opencode',
156
+ label: '/plan',
157
+ stateLabel: 'Plan Mode',
158
+ description: COMMON_COMMAND_DESCRIPTIONS.plan,
159
+ inputHint: '/plan',
160
+ source: 'OPENCODE_SERVER',
161
+ interaction: 'TOGGLE',
162
+ available: true,
163
+ reasonCode: null
164
+ }
165
+ ]
166
+ },
167
+ 'mar-agent': {
168
+ runner: 'mar-agent',
169
+ models: [],
170
+ accessOptions: [
171
+ {
172
+ id: 'on-request',
173
+ label: 'On-request',
174
+ description: 'Ask before tools with side effects. This is not an operating-system sandbox.'
175
+ },
176
+ {
177
+ id: 'full-access',
178
+ label: 'Full access',
179
+ description: 'Skip Agent approvals. Host validation still applies and no Agent sandbox is provided.'
180
+ }
181
+ ],
182
+ commands: [
183
+ {
184
+ id: 'compact',
185
+ runner: 'mar-agent',
186
+ label: '/compact',
187
+ description: COMMON_COMMAND_DESCRIPTIONS.compact,
188
+ inputHint: '/compact',
189
+ source: 'MAR_RUNTIME',
190
+ interaction: 'IMMEDIATE_ACTION',
191
+ available: true,
192
+ reasonCode: null
193
+ },
194
+ {
195
+ id: 'plan',
196
+ runner: 'mar-agent',
197
+ label: '/plan',
198
+ stateLabel: 'Plan Mode',
199
+ description: COMMON_COMMAND_DESCRIPTIONS.plan,
200
+ inputHint: '/plan',
201
+ source: 'MAR_RUNTIME',
202
+ interaction: 'TOGGLE',
203
+ available: true,
204
+ reasonCode: null
205
+ },
206
+ {
207
+ id: 'review',
208
+ runner: 'mar-agent',
209
+ label: '/review',
210
+ description: 'Review the selected workspace changes without modifying files.',
211
+ inputHint: '/review',
212
+ source: 'MAR_RUNTIME',
213
+ interaction: 'IMMEDIATE_ACTION',
214
+ available: true,
215
+ reasonCode: null
216
+ },
217
+ {
218
+ id: 'clear',
219
+ runner: 'mar-agent',
220
+ label: '/clear',
221
+ description: 'Permanently clear this session history while keeping the session.',
222
+ inputHint: '/clear',
223
+ source: 'MAR_RUNTIME',
224
+ interaction: 'DESTRUCTIVE_ACTION',
225
+ available: true,
226
+ reasonCode: null
227
+ }
228
+ ]
229
+ }
230
+ };
231
+ export function declaredRunnerProfiles(input) {
232
+ return [
233
+ withCapabilities(definitions.codex, input.codexAvailable),
234
+ withCapabilities(claudeProfile(input.environment ?? process.env), input.claudeCodeAvailable),
235
+ withCapabilities(definitions.opencode, input.openCodeAvailable === true)
236
+ ];
237
+ }
238
+ export function supportsRunnerConfiguration(input) {
239
+ const profile = input.runner === 'claude-code'
240
+ ? claudeProfile(input.environment ?? process.env)
241
+ : definitions[input.runner];
242
+ const model = profile.models.find((candidate) => candidate.id === input.model);
243
+ return (model !== undefined &&
244
+ model.supportedEfforts.includes(input.effort) &&
245
+ profile.accessOptions.some((candidate) => candidate.id === input.access));
246
+ }
247
+ export function claudeDefaultModel(environment = process.env) {
248
+ const sonnet = configuredClaudeModel('sonnet', environment);
249
+ if (sonnet !== undefined)
250
+ return sonnet;
251
+ if (usesThirdPartyEndpoint(environment)) {
252
+ return (configuredClaudeModel('opus', environment) ??
253
+ configuredClaudeModel('haiku', environment) ??
254
+ 'sonnet');
255
+ }
256
+ return 'sonnet';
257
+ }
258
+ function claudeProfile(environment) {
259
+ const profile = definitions['claude-code'];
260
+ const thirdParty = usesThirdPartyEndpoint(environment);
261
+ const models = profile.models.flatMap((model) => {
262
+ const configured = configuredClaudeModel(model.id, environment);
263
+ if (configured !== undefined)
264
+ return [{ ...model, id: configured, label: configured }];
265
+ return thirdParty ? [] : [model];
266
+ });
267
+ return {
268
+ ...profile,
269
+ models: models.filter((model, index) => models.findIndex((candidate) => candidate.id === model.id) === index)
270
+ };
271
+ }
272
+ /**
273
+ * A custom `ANTHROPIC_BASE_URL` points Claude Code at a third-party gateway
274
+ * where the built-in `opus`/`sonnet`/`haiku` aliases usually do not resolve;
275
+ * only environment-declared model names are meaningful there. Unparsable
276
+ * non-empty values are treated as custom endpoints.
277
+ */
278
+ function usesThirdPartyEndpoint(environment) {
279
+ const raw = environment['ANTHROPIC_BASE_URL']?.trim();
280
+ if (raw === undefined || raw.length === 0)
281
+ return false;
282
+ try {
283
+ return new URL(raw).hostname.toLowerCase() !== OFFICIAL_ANTHROPIC_HOST;
284
+ }
285
+ catch {
286
+ return true;
287
+ }
288
+ }
289
+ function configuredClaudeModel(alias, environment) {
290
+ const environmentName = CLAUDE_MODEL_ENVIRONMENT[alias];
291
+ return (validModelName(environmentName === undefined ? undefined : environment[environmentName]) ??
292
+ (alias === 'sonnet' ? validModelName(environment['ANTHROPIC_MODEL']) : undefined));
293
+ }
294
+ function validModelName(value) {
295
+ const normalized = value?.trim();
296
+ return normalized !== undefined && normalized.length > 0 && normalized.length <= 128
297
+ ? normalized
298
+ : undefined;
299
+ }
300
+ function withCapabilities(profile, available) {
301
+ const mission = {
302
+ id: 'mission',
303
+ runner: profile.runner,
304
+ label: '/mission',
305
+ stateLabel: 'Mission',
306
+ description: COMMON_COMMAND_DESCRIPTIONS.mission,
307
+ inputHint: '/mission',
308
+ source: 'MAR_RUNTIME',
309
+ interaction: 'TOGGLE',
310
+ available,
311
+ reasonCode: available ? null : 'RUNNER_UNAVAILABLE'
312
+ };
313
+ return {
314
+ ...profile,
315
+ commands: [
316
+ ...profile.commands.map((command) => available ? command : { ...command, available: false, reasonCode: 'RUNNER_UNAVAILABLE' }),
317
+ mission
318
+ ],
319
+ capabilities: available
320
+ ? ['history.read', 'events.live', 'turn.start', 'turn.queue', 'turn.interrupt']
321
+ : []
322
+ };
323
+ }