@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,129 @@
1
- /* mar-release-protected */
2
- function _0x549e(_0x591250,_0x1d5552){_0x591250=_0x591250-(0x587*0x4+0x3*0xb63+-0x36aa);const _0x29c4f6=_0x516b();let _0x5c0220=_0x29c4f6[_0x591250];if(_0x549e['ijBTjq']===undefined){var _0x4bc248=function(_0x43e7d2){const _0x1159f7='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x39bdc8='',_0x315a2a='';for(let _0x2bc710=-0xf91*0x2+-0x1af3*0x1+0x3a15*0x1,_0x4912ec,_0x29144b,_0x2dc880=0x86*-0x13+-0x1cf5+0x26e7;_0x29144b=_0x43e7d2['charAt'](_0x2dc880++);~_0x29144b&&(_0x4912ec=_0x2bc710%(0x12d9+-0x47*0x5b+0x668)?_0x4912ec*(0xeed+-0x1e65+0xfb8)+_0x29144b:_0x29144b,_0x2bc710++%(-0xa*-0x224+0x1d7*0x2+-0xc89*0x2))?_0x39bdc8+=String['fromCharCode'](-0x38b*0xa+0xb8e+-0x18df*-0x1&_0x4912ec>>(-(0x496*0x1+-0x7d*0x4a+-0xfc7*-0x2)*_0x2bc710&-0x1*0x1d26+0x65*-0x10+0x237c)):-0xa6f+-0xfeb+0x1a5a){_0x29144b=_0x1159f7['indexOf'](_0x29144b);}for(let _0x3d284b=-0x3f7+-0x1f7d+0x2374*0x1,_0x359c36=_0x39bdc8['length'];_0x3d284b<_0x359c36;_0x3d284b++){_0x315a2a+='%'+('00'+_0x39bdc8['charCodeAt'](_0x3d284b)['toString'](0x21cb+0x1*0x313+-0x24ce*0x1))['slice'](-(0x2*-0x125f+0x1391+0x35*0x53));}return decodeURIComponent(_0x315a2a);};_0x549e['WAQzxi']=_0x4bc248,_0x549e['PHqPlB']={},_0x549e['ijBTjq']=!![];}const _0x4004b9=_0x29c4f6[0x17ae+0x1a70+-0x321e];_0x549e['wJXlEA']!==_0x4004b9&&(_0x549e['PHqPlB']={},_0x549e['wJXlEA']=_0x4004b9);const _0x1cc4cd=_0x549e['PHqPlB'][_0x591250];return _0x1cc4cd===undefined?(_0x5c0220=_0x549e['WAQzxi'](_0x5c0220),_0x549e['PHqPlB'][_0x591250]=_0x5c0220):_0x5c0220=_0x1cc4cd,_0x5c0220;}const _0x6b56ed=_0x549e;function _0x516b(){const _0x2a37f2=['ntaZotq5weDAy2jo','D2fPDezVCKrLy2LZAw9U','CNvUlNn0yxj0zwq','ndu5nZe4nJvWvLbQzuW','C3rVCfDHAxrPBMDgB3jbChbYB3zHBa','Cgf5Bg9Hza','DMfSDwvZ','q0foq0vmteve','yxbWCM92ywWUCMvQzwn0zwq','yxbWCM92ywWUzxHWAxjLza','z2v0','mZy5mZC5mKrXr2D1DW','odqZntiWuKTJv0Tq','BM93','Bg9UzY1YDw5UAw5N','DhLWzq','uKvkrunuruq','mtKZmdi1n1jTDwDxCa','y2fUy2vS','zgLZy29UBMvJDa','mJfusKLdvgu','BMfTzq','u1vdq0vfreve','C3rHCNq','Aw50zxjYDxb0','mZi1nZiXmgPgqxHoDW','Aw50zxjYDxb0zwq','CNvUlMzHAwXLza','zgvJAwrL','yxbWCM92ywWUyxbWCM92zwq','Dgv4Da','CNvUlNj1BM5PBMC','DgLTzw91De1Z','C3rVChbLza','Aw5WDxq','CNvUlNn1y2nLzwrLza','C2v0','zgvSzxrL','C3vJy2vZCW','nNLirgTvqq','zxzLBNq','su5urvjsvvburuq','y2fUy2vSBgvK','zMfPBhvYzq','lwfWChjVDMfSlq','D2fPDgvYCW','rKfjteve','ywn0AxzL','zgvJAxnPB25Z','uLvotKLorW','AgfZ','CNvUlNn0B3bWzwq','y29Kzq','Dg9VBa','mJG1mdK0nhDzueLWta','yxbWCM92ywW','CMvZB2X2zq','u1rbuLrjtKC','rKflrv9gquLmvvjf'];_0x516b=function(){return _0x2a37f2;};return _0x516b();}(function(_0x311f56,_0x50c649){const _0x51c9b2=_0x549e,_0xf8e2df=_0x311f56();while(!![]){try{const _0xb32b30=-parseInt(_0x51c9b2(0x19d))/(0x499*-0x8+-0x1*0xb75+0x303e)+-parseInt(_0x51c9b2(0x1a9))/(0x2202+-0x1158+-0x215*0x8)+-parseInt(_0x51c9b2(0x1ae))/(-0x64+0x1ff8+-0x1f91)+-parseInt(_0x51c9b2(0x1d3))/(-0x17c9+0x25e5+-0xe18)+parseInt(_0x51c9b2(0x1b6))/(-0x4*0x644+0x20ad+-0x798)*(-parseInt(_0x51c9b2(0x1c4))/(-0x1*-0x643+0x1*-0x143+0x7*-0xb6))+parseInt(_0x51c9b2(0x1b1))/(0x152f*0x1+-0x1b4+-0x33e*0x6)*(-parseInt(_0x51c9b2(0x1a8))/(-0x1*-0x12b2+0x1436+-0x26e0))+parseInt(_0x51c9b2(0x1a0))/(0xcbf+0x14*0xb8+-0x2*0xd8b);if(_0xb32b30===_0x50c649)break;else _0xf8e2df['push'](_0xf8e2df['shift']());}catch(_0xed9ce){_0xf8e2df['push'](_0xf8e2df['shift']());}}}(_0x516b,-0xfcf37*0x1+0xf1*-0x4e4+0x2075de));export class FakeRunner{[_0x6b56ed(0x1aa)];[_0x6b56ed(0x1cc)]=new Map();constructor(_0x1a7698=Date[_0x6b56ed(0x1aa)]){const _0x2cabb0=_0x6b56ed;this[_0x2cabb0(0x1aa)]=_0x1a7698;}async[_0x6b56ed(0x1b4)](_0x24f434,_0xc6fe13,_0x49d063){const _0x2a7829=_0x6b56ed;if(this[_0x2a7829(0x1cc)][_0x2a7829(0x1cf)](_0x24f434))return;const _0x342dd8={'callbacks':_0x49d063,'interrupted':![],'cancelled':![],'decisions':new Map(),'waiters':new Map()};this[_0x2a7829(0x1cc)][_0x2a7829(0x1c1)](_0x24f434,_0x342dd8),_0x49d063[_0x2a7829(0x1c5)](_0x2a7829(0x19f),{},_0x2a7829(0x19b)),_0x49d063[_0x2a7829(0x1c5)](_0x2a7829(0x1bc),{},_0x2a7829(0x1ce));try{for(const _0x3d5275 of _0xc6fe13){const _0x1f8f6a=this[_0x2a7829(0x1be)](_0x342dd8);if(_0x1f8f6a!==undefined){_0x49d063[_0x2a7829(0x1c5)](_0x2a7829(0x1d0),{},_0x1f8f6a);return;}if(_0x3d5275[_0x2a7829(0x1ac)]===_0x2a7829(0x1bb))_0x49d063[_0x2a7829(0x1c5)](_0x2a7829(0x1bb),{'text':_0x3d5275[_0x2a7829(0x1bb)]});if(_0x3d5275[_0x2a7829(0x1ac)]===_0x2a7829(0x1d2))_0x49d063[_0x2a7829(0x1c5)](_0x2a7829(0x1d2),{'name':_0x3d5275[_0x2a7829(0x1b2)],'input':_0x3d5275[_0x2a7829(0x1bf)]??null});if(_0x3d5275[_0x2a7829(0x1ac)]===_0x2a7829(0x1c3)){_0x49d063[_0x2a7829(0x1c5)](_0x2a7829(0x1c0),_0x3d5275[_0x2a7829(0x1a2)]??{},_0x2a7829(0x1b3));return;}if(_0x3d5275[_0x2a7829(0x1ac)]===_0x2a7829(0x1c8)){_0x49d063[_0x2a7829(0x1c5)](_0x2a7829(0x1b8),{'code':_0x3d5275[_0x2a7829(0x1d1)]??_0x2a7829(0x19c)},_0x2a7829(0x1cb));return;}if(_0x3d5275[_0x2a7829(0x1ac)]===_0x2a7829(0x1b0)){_0x49d063[_0x2a7829(0x1b0)]();continue;}if(_0x3d5275[_0x2a7829(0x1ac)]===_0x2a7829(0x1ab)){await new Promise(_0x52eff0=>{const _0x53840e=setInterval(()=>{const _0x36fc79=_0x549e;this[_0x36fc79(0x1be)](_0x342dd8)!==undefined&&(clearInterval(_0x53840e),_0x52eff0());},-0x1f7f+0x6b*0x12+0x17fe);}),_0x49d063[_0x2a7829(0x1c5)](_0x2a7829(0x1d0),{},this[_0x2a7829(0x1be)](_0x342dd8)??_0x2a7829(0x1a4));return;}if(_0x3d5275[_0x2a7829(0x1ac)]===_0x2a7829(0x1d4)){const _0x5a2590=_0x3d5275['id']??_0x24f434+_0x2a7829(0x1c9)+this[_0x2a7829(0x1aa)](),_0x152316=this[_0x2a7829(0x1aa)]()+(_0x3d5275[_0x2a7829(0x1bd)]??-0x134e*0x9+0xc4e0+-0x1f5a*-0x3);_0x49d063[_0x2a7829(0x1d4)](_0x5a2590,_0x3d5275[_0x2a7829(0x1a2)]??{},_0x152316);const _0x472526=await this[_0x2a7829(0x19e)](_0x342dd8,_0x5a2590,_0x3d5275[_0x2a7829(0x1bd)]??-0x3caa+0x9718+-0x55a*-0x5),_0x3dca94=this[_0x2a7829(0x1be)](_0x342dd8);if(_0x3dca94!==undefined){_0x49d063[_0x2a7829(0x1c5)](_0x2a7829(0x1d0),{},_0x3dca94);return;}if(_0x472526===_0x2a7829(0x1ad)){_0x49d063[_0x2a7829(0x1c5)](_0x2a7829(0x1a5),{'approvalId':_0x5a2590},_0x2a7829(0x1cb));return;}if(_0x472526===undefined){_0x49d063[_0x2a7829(0x1c5)](_0x2a7829(0x1a6),{'approvalId':_0x5a2590},_0x2a7829(0x1cb));return;}_0x49d063[_0x2a7829(0x1c5)](_0x2a7829(0x1ba),{'approvalId':_0x5a2590});}}}finally{this[_0x2a7829(0x1cc)][_0x2a7829(0x1c2)](_0x24f434);}}[_0x6b56ed(0x1b9)](_0x46b3c0,_0x15d7fc,_0x2c8f77){const _0x2586b4=_0x6b56ed,_0x5abb65=this[_0x2586b4(0x1cc)][_0x2586b4(0x1a7)](_0x46b3c0);if(_0x5abb65===undefined||_0x5abb65[_0x2586b4(0x1cd)][_0x2586b4(0x1cf)](_0x15d7fc))return![];return _0x5abb65[_0x2586b4(0x1cd)][_0x2586b4(0x1c1)](_0x15d7fc,_0x2c8f77),_0x5abb65[_0x2586b4(0x1ca)][_0x2586b4(0x1a7)](_0x15d7fc)?.(_0x2c8f77),!![];}[_0x6b56ed(0x1b5)](_0x170f4a){const _0x38aa2a=_0x6b56ed,_0x3548bb=this[_0x38aa2a(0x1cc)][_0x38aa2a(0x1a7)](_0x170f4a);if(_0x3548bb===undefined)return![];return _0x3548bb[_0x38aa2a(0x1b7)]=!![],this[_0x38aa2a(0x1a1)](_0x3548bb),!![];}[_0x6b56ed(0x1af)](_0x396ae3){const _0x30fd04=_0x6b56ed,_0x32e27c=this[_0x30fd04(0x1cc)][_0x30fd04(0x1a7)](_0x396ae3);if(_0x32e27c===undefined)return![];return _0x32e27c[_0x30fd04(0x1c7)]=!![],this[_0x30fd04(0x1a1)](_0x32e27c),!![];}[_0x6b56ed(0x1be)](_0x5eb659){const _0x4d702b=_0x6b56ed;return _0x5eb659[_0x4d702b(0x1c7)]?_0x4d702b(0x1a4):_0x5eb659[_0x4d702b(0x1b7)]?_0x4d702b(0x1c6):undefined;}[_0x6b56ed(0x19e)](_0x537d2d,_0x156360,_0x3a05d8){const _0xacf13f=_0x6b56ed,_0x8843e2=_0x537d2d[_0xacf13f(0x1cd)][_0xacf13f(0x1a7)](_0x156360);if(_0x8843e2!==undefined)return Promise[_0xacf13f(0x1d5)](_0x8843e2);return new Promise(_0xc1cbf4=>{const _0x581067=_0xacf13f,_0x27fba2=setTimeout(()=>{const _0x2c31d5=_0x549e;_0x537d2d[_0x2c31d5(0x1ca)][_0x2c31d5(0x1c2)](_0x156360),_0xc1cbf4(undefined);},_0x3a05d8);_0x537d2d[_0x581067(0x1ca)][_0x581067(0x1c1)](_0x156360,_0x4db5f1=>{const _0xd20080=_0x581067;clearTimeout(_0x27fba2),_0x537d2d[_0xd20080(0x1ca)][_0xd20080(0x1c2)](_0x156360),_0xc1cbf4(_0x4db5f1);});});}[_0x6b56ed(0x1a1)](_0x2f0b8b){const _0x186864=_0x6b56ed;for(const _0x4e164d of[..._0x2f0b8b[_0x186864(0x1ca)][_0x186864(0x1a3)]()])_0x4e164d(undefined);}}
1
+ /** Test-only deterministic runner; it is never part of node capabilities. */
2
+ export class FakeRunner {
3
+ now;
4
+ active = new Map();
5
+ constructor(now = Date.now) {
6
+ this.now = now;
7
+ }
8
+ async start(runId, script, callbacks) {
9
+ if (this.active.has(runId))
10
+ return;
11
+ const active = {
12
+ callbacks,
13
+ interrupted: false,
14
+ cancelled: false,
15
+ decisions: new Map(),
16
+ waiters: new Map()
17
+ };
18
+ this.active.set(runId, active);
19
+ callbacks.event('run.started', {}, 'STARTING');
20
+ callbacks.event('run.running', {}, 'RUNNING');
21
+ try {
22
+ for (const step of script) {
23
+ const stopped = this.stopped(active);
24
+ if (stopped !== undefined) {
25
+ callbacks.event('run.stopped', {}, stopped);
26
+ return;
27
+ }
28
+ if (step.type === 'text')
29
+ callbacks.event('text', { text: step.text });
30
+ if (step.type === 'tool')
31
+ callbacks.event('tool', { name: step.name, input: step.input ?? null });
32
+ if (step.type === 'success') {
33
+ callbacks.event('run.succeeded', step.payload ?? {}, 'SUCCEEDED');
34
+ return;
35
+ }
36
+ if (step.type === 'failure') {
37
+ callbacks.event('run.failed', { code: step.code ?? 'FAKE_FAILURE' }, 'FAILED');
38
+ return;
39
+ }
40
+ if (step.type === 'disconnect') {
41
+ callbacks.disconnect();
42
+ continue;
43
+ }
44
+ if (step.type === 'long-running') {
45
+ await new Promise((resolve) => {
46
+ const timer = setInterval(() => {
47
+ if (this.stopped(active) !== undefined) {
48
+ clearInterval(timer);
49
+ resolve();
50
+ }
51
+ }, 5);
52
+ });
53
+ callbacks.event('run.stopped', {}, this.stopped(active) ?? 'CANCELLED');
54
+ return;
55
+ }
56
+ if (step.type === 'approval') {
57
+ const id = step.id ?? `${runId}-approval-${this.now()}`;
58
+ const expiresAt = this.now() + (step.timeoutMs ?? 30_000);
59
+ callbacks.approval(id, step.payload ?? {}, expiresAt);
60
+ const decision = await this.waitForDecision(active, id, step.timeoutMs ?? 30_000);
61
+ const stoppedAfterApproval = this.stopped(active);
62
+ if (stoppedAfterApproval !== undefined) {
63
+ callbacks.event('run.stopped', {}, stoppedAfterApproval);
64
+ return;
65
+ }
66
+ if (decision === 'REJECTED') {
67
+ callbacks.event('approval.rejected', { approvalId: id }, 'FAILED');
68
+ return;
69
+ }
70
+ if (decision === undefined) {
71
+ callbacks.event('approval.expired', { approvalId: id }, 'FAILED');
72
+ return;
73
+ }
74
+ callbacks.event('approval.approved', { approvalId: id });
75
+ }
76
+ }
77
+ }
78
+ finally {
79
+ this.active.delete(runId);
80
+ }
81
+ }
82
+ decide(runId, approvalId, decision) {
83
+ const active = this.active.get(runId);
84
+ if (active === undefined || active.decisions.has(approvalId))
85
+ return false;
86
+ active.decisions.set(approvalId, decision);
87
+ active.waiters.get(approvalId)?.(decision);
88
+ return true;
89
+ }
90
+ interrupt(runId) {
91
+ const active = this.active.get(runId);
92
+ if (active === undefined)
93
+ return false;
94
+ active.interrupted = true;
95
+ this.stopWaitingForApproval(active);
96
+ return true;
97
+ }
98
+ cancel(runId) {
99
+ const active = this.active.get(runId);
100
+ if (active === undefined)
101
+ return false;
102
+ active.cancelled = true;
103
+ this.stopWaitingForApproval(active);
104
+ return true;
105
+ }
106
+ stopped(active) {
107
+ return active.cancelled ? 'CANCELLED' : active.interrupted ? 'INTERRUPTED' : undefined;
108
+ }
109
+ waitForDecision(active, approvalId, timeoutMs) {
110
+ const prior = active.decisions.get(approvalId);
111
+ if (prior !== undefined)
112
+ return Promise.resolve(prior);
113
+ return new Promise((resolve) => {
114
+ const timer = setTimeout(() => {
115
+ active.waiters.delete(approvalId);
116
+ resolve(undefined);
117
+ }, timeoutMs);
118
+ active.waiters.set(approvalId, (decision) => {
119
+ clearTimeout(timer);
120
+ active.waiters.delete(approvalId);
121
+ resolve(decision);
122
+ });
123
+ });
124
+ }
125
+ stopWaitingForApproval(active) {
126
+ for (const resolve of [...active.waiters.values()])
127
+ resolve(undefined);
128
+ }
129
+ }
@@ -0,0 +1,12 @@
1
+ import { gitCredentialRequest } from './util/git-credential-client.js';
2
+ // SSH_ASKPASS points to node itself; NODE_OPTIONS imports this before its prompt argument.
3
+ try {
4
+ const result = await gitCredentialRequest('/passphrase', { id: process.env.MAR_GIT_KEY_ID });
5
+ // Keep the preload pending until stdout drains; otherwise Node tries to load the SSH prompt as its main module.
6
+ await new Promise((resolve) => process.stdout.write(`${typeof result.passphrase === 'string' ? result.passphrase : ''}\n`, () => resolve()));
7
+ process.exit(0);
8
+ }
9
+ catch {
10
+ await new Promise((resolve) => process.stderr.write('Git SSH key could not be unlocked.\n', () => resolve()));
11
+ process.exit(1);
12
+ }
@@ -0,0 +1,266 @@
1
+ import { spawn, execFileSync } from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { resolve } from 'node:path';
4
+ import { gitCredentialRequest, originalGitEnvironment } from './util/git-credential-client.js';
5
+ async function run(command, args, options = {}) {
6
+ return new Promise((resolve, reject) => {
7
+ const child = spawn(command, args, {
8
+ env: options.environment ?? process.env,
9
+ windowsHide: true,
10
+ stdio: [options.input === undefined ? 'inherit' : 'pipe', 'inherit', 'inherit']
11
+ });
12
+ if (options.input !== undefined)
13
+ child.stdin.end(options.input);
14
+ child.once('error', () => reject(new Error('GIT_TRANSPORT_UNAVAILABLE')));
15
+ child.once('exit', (code) => resolve(code ?? 1));
16
+ });
17
+ }
18
+ async function credential(operation) {
19
+ if (!['get', 'store', 'erase'].includes(operation ?? ''))
20
+ return 1;
21
+ let input = '';
22
+ for await (const chunk of process.stdin) {
23
+ input += String(chunk);
24
+ if (Buffer.byteLength(input) > 64 * 1024)
25
+ throw new Error('GIT_CREDENTIAL_REQUEST_INVALID');
26
+ }
27
+ const values = {};
28
+ for (const line of input.split('\n')) {
29
+ if (line === '')
30
+ break;
31
+ const equals = line.indexOf('=');
32
+ if (equals > 0)
33
+ values[line.slice(0, equals)] = line.slice(equals + 1);
34
+ }
35
+ const matched = await gitCredentialRequest('/credential', {
36
+ protocol: values.protocol,
37
+ host: values.host,
38
+ path: values.path ?? ''
39
+ });
40
+ if (matched.matched === true) {
41
+ if (operation === 'get') {
42
+ if (typeof matched.username !== 'string' ||
43
+ typeof matched.password !== 'string' ||
44
+ /[\r\n\0]/u.test(matched.username + matched.password))
45
+ throw new Error('GIT_CREDENTIAL_REQUEST_INVALID');
46
+ process.stdout.write(`username=${matched.username}\npassword=${matched.password}\n\n`);
47
+ }
48
+ // Matched credentials are never written to another helper or replaced after rejection.
49
+ return 0;
50
+ }
51
+ return run(gitExecutable(), ['credential', operation === 'get' ? 'fill' : operation === 'store' ? 'approve' : 'reject'], {
52
+ environment: await originalGitEnvironment(),
53
+ input
54
+ });
55
+ }
56
+ async function invoke(args) {
57
+ const remote = await currentRemote(args);
58
+ const matched = remote === undefined ? { matched: false } : await gitCredentialRequest('/identity', { remote });
59
+ const identity = matched.matched === true &&
60
+ typeof matched.name === 'string' &&
61
+ typeof matched.email === 'string' &&
62
+ !/[\r\n\0]/u.test(matched.name + matched.email)
63
+ ? { name: matched.name, email: matched.email }
64
+ : undefined;
65
+ const environment = identity === undefined
66
+ ? process.env
67
+ : {
68
+ ...process.env,
69
+ GIT_AUTHOR_NAME: identity.name,
70
+ GIT_COMMITTER_NAME: identity.name,
71
+ GIT_AUTHOR_EMAIL: identity.email,
72
+ GIT_COMMITTER_EMAIL: identity.email
73
+ };
74
+ return run(gitExecutable(), identity === undefined
75
+ ? args
76
+ : ['-c', `user.name=${identity.name}`, '-c', `user.email=${identity.email}`, ...args], { environment });
77
+ }
78
+ async function currentRemote(args) {
79
+ const cwd = gitWorkingDirectory(args);
80
+ const branch = await gitOutput(['branch', '--show-current'], cwd);
81
+ const configured = branch === undefined || branch === ''
82
+ ? undefined
83
+ : await gitOutput(['config', '--get', `branch.${branch}.remote`], cwd);
84
+ for (const name of new Set([configured, 'origin'])) {
85
+ if (name === undefined || name === '')
86
+ continue;
87
+ const remote = await gitOutput(['remote', 'get-url', name], cwd);
88
+ if (remote !== undefined && remote !== '')
89
+ return remote;
90
+ }
91
+ return undefined;
92
+ }
93
+ async function gitOutput(args, cwd) {
94
+ try {
95
+ const child = await new Promise((resolve, reject) => {
96
+ const child = spawn(gitExecutable(), args, {
97
+ cwd,
98
+ env: process.env,
99
+ windowsHide: true,
100
+ stdio: ['ignore', 'pipe', 'ignore']
101
+ });
102
+ let output = '';
103
+ child.stdout.on('data', (chunk) => {
104
+ output += String(chunk);
105
+ });
106
+ child.once('error', reject);
107
+ child.once('exit', (code) => (code === 0 ? resolve({ output }) : resolve({ output: '' })));
108
+ });
109
+ return child.output.trim();
110
+ }
111
+ catch {
112
+ return undefined;
113
+ }
114
+ }
115
+ function gitWorkingDirectory(args) {
116
+ let cwd = process.cwd();
117
+ for (let index = 0; index < args.length; index++) {
118
+ if (args[index] === '-C') {
119
+ const directory = args[++index];
120
+ if (directory === undefined)
121
+ return cwd;
122
+ cwd = resolve(cwd, directory);
123
+ }
124
+ else if (args[index]?.startsWith('-C') && args[index].length > 2)
125
+ cwd = resolve(cwd, args[index].slice(2));
126
+ }
127
+ return cwd;
128
+ }
129
+ async function ssh(args) {
130
+ const forwarded = [];
131
+ let port = 22;
132
+ let index = 0;
133
+ while (args[index]?.startsWith('-')) {
134
+ const option = args[index++];
135
+ if (option === '-p') {
136
+ const value = args[index++] ?? '';
137
+ if (!/^\d+$/u.test(value) || Number(value) < 1 || Number(value) > 65535)
138
+ throw new Error('GIT_SSH_ARGUMENT_INVALID');
139
+ port = Number(value);
140
+ forwarded.push(option, value);
141
+ }
142
+ else if (option === '-o' && args[index] === 'SendEnv=GIT_PROTOCOL') {
143
+ forwarded.push(option, args[index++]);
144
+ }
145
+ else if (['-4', '-6', '-v'].includes(option))
146
+ forwarded.push(option);
147
+ else
148
+ throw new Error('GIT_SSH_ARGUMENT_INVALID');
149
+ }
150
+ const destination = args[index++];
151
+ const command = args[index++];
152
+ if (destination === undefined || command === undefined || index !== args.length)
153
+ throw new Error('GIT_SSH_ARGUMENT_INVALID');
154
+ const host = destination.slice(destination.lastIndexOf('@') + 1);
155
+ const repository = /^(?:git-upload-pack|git-receive-pack|git-upload-archive) '(.*)'$/su.exec(command)?.[1];
156
+ if (repository === undefined)
157
+ throw new Error('GIT_SSH_ARGUMENT_INVALID');
158
+ const path = repository.replaceAll("'\\''", "'").replaceAll("'\\!'", '!');
159
+ const match = await gitCredentialRequest('/ssh', { host, port, path });
160
+ if (match.matched !== true) {
161
+ const environment = await originalGitEnvironment();
162
+ let originalCommand = environment.GIT_SSH_COMMAND;
163
+ if (originalCommand === undefined) {
164
+ try {
165
+ originalCommand = execFileSync(gitExecutable(), ['config', '--get', 'core.sshCommand'], {
166
+ env: environment,
167
+ encoding: 'utf8',
168
+ windowsHide: true,
169
+ stdio: ['ignore', 'pipe', 'ignore']
170
+ }).replace(/\r?\n$/u, '');
171
+ }
172
+ catch (error) {
173
+ if (error.status !== 1)
174
+ throw new Error('GIT_TRANSPORT_UNAVAILABLE');
175
+ }
176
+ }
177
+ if (originalCommand !== undefined) {
178
+ return run(gitShell(), ['-c', `${originalCommand} "$@"`, 'mar-git-ssh', ...args], {
179
+ environment
180
+ });
181
+ }
182
+ return run(environment.GIT_SSH ?? 'ssh', args, { environment });
183
+ }
184
+ if (typeof match.username !== 'string' ||
185
+ typeof match.keyFile !== 'string' ||
186
+ typeof match.configFile !== 'string' ||
187
+ typeof match.knownHostsFile !== 'string' ||
188
+ typeof match.askpassImport !== 'string' ||
189
+ typeof match.id !== 'string')
190
+ throw new Error('GIT_CREDENTIAL_REQUEST_INVALID');
191
+ return run('ssh', [
192
+ '-F',
193
+ match.configFile,
194
+ '-o',
195
+ 'IdentitiesOnly=yes',
196
+ '-o',
197
+ 'IdentityAgent=none',
198
+ '-o',
199
+ 'StrictHostKeyChecking=yes',
200
+ '-o',
201
+ `UserKnownHostsFile=${sshConfigValue(match.knownHostsFile)}`,
202
+ '-o',
203
+ 'PasswordAuthentication=no',
204
+ '-o',
205
+ 'KbdInteractiveAuthentication=no',
206
+ '-o',
207
+ 'PreferredAuthentications=publickey',
208
+ '-o',
209
+ 'BatchMode=no',
210
+ '-i',
211
+ match.keyFile,
212
+ ...forwarded,
213
+ '-l',
214
+ match.username,
215
+ host,
216
+ command
217
+ ], {
218
+ environment: {
219
+ ...process.env,
220
+ SSH_ASKPASS: process.execPath,
221
+ SSH_ASKPASS_REQUIRE: 'force',
222
+ DISPLAY: process.env.DISPLAY || 'mar:0',
223
+ NODE_OPTIONS: match.askpassImport,
224
+ MAR_GIT_KEY_ID: match.id
225
+ }
226
+ });
227
+ }
228
+ function sshConfigValue(value) {
229
+ if (/[\r\n\0"]/u.test(value))
230
+ throw new Error('GIT_SSH_ARGUMENT_INVALID');
231
+ return `"${value.replaceAll('\\', '/')}"`;
232
+ }
233
+ function gitShell() {
234
+ if (process.platform !== 'win32')
235
+ return '/bin/sh';
236
+ const execPath = execFileSync(gitExecutable(), ['--exec-path'], {
237
+ encoding: 'utf8',
238
+ windowsHide: true
239
+ }).trim();
240
+ const shell = resolve(execPath, '../../../usr/bin/sh.exe');
241
+ if (!existsSync(shell))
242
+ throw new Error('GIT_TRANSPORT_UNAVAILABLE');
243
+ return shell;
244
+ }
245
+ function gitExecutable() {
246
+ return process.env.MAR_GIT_BINARY ?? 'git';
247
+ }
248
+ try {
249
+ const args = process.argv.slice(2);
250
+ const mode = args.shift();
251
+ process.exitCode =
252
+ mode === 'credential'
253
+ ? await credential(args[0])
254
+ : mode === 'ssh'
255
+ ? await ssh(args)
256
+ : mode === 'invoke'
257
+ ? await invoke(args)
258
+ : 1;
259
+ }
260
+ catch {
261
+ // Never serialize caught errors: child-process errors may contain credential output.
262
+ if (process.argv[2] === 'credential')
263
+ process.stdout.write('quit=true\n\n');
264
+ process.stderr.write('Personal Git authentication failed. Check your credentials and the Node SSH host trust.\n');
265
+ process.exitCode = 1;
266
+ }
package/dist/health.js CHANGED
@@ -1,2 +1,3 @@
1
- /* mar-release-protected */
2
- (function(_0xc4468e,_0x3ca825){var _0x2d879c=_0x5516,_0x467b1a=_0xc4468e();while(!![]){try{var _0x3cc7c6=parseInt(_0x2d879c(0x1a8))/(0x1cd*0x2+-0xd8*-0xe+-0x523*0x3)+-parseInt(_0x2d879c(0x1a2))/(0x258a+-0x1b1*-0x1+0xd13*-0x3)+-parseInt(_0x2d879c(0x1a7))/(0x11da*0x2+0xb25*0x2+-0x39fb)+parseInt(_0x2d879c(0x1aa))/(-0x403*-0x5+0x2091+0x1*-0x349c)*(parseInt(_0x2d879c(0x1a3))/(0x16*-0x17e+0x2136+0x1f*-0x3))+parseInt(_0x2d879c(0x1a9))/(-0x21+-0x175*0xf+-0x1602*-0x1)+-parseInt(_0x2d879c(0x1ab))/(0x1*0xbe9+0x1*-0x251f+0x5b*0x47)*(-parseInt(_0x2d879c(0x1a5))/(-0x4d7*0x2+0x20fc+-0x1746))+parseInt(_0x2d879c(0x1a6))/(0x13*0x202+-0x14b2+-0x116b)*(parseInt(_0x2d879c(0x1ac))/(-0x9*0x421+0x212e+0x7*0x93));if(_0x3cc7c6===_0x3ca825)break;else _0x467b1a['push'](_0x467b1a['shift']());}catch(_0x170a7f){_0x467b1a['push'](_0x467b1a['shift']());}}}(_0x4df0,-0x1c214+0x3f8f+0x734fb));export function getNodeHealth(){var _0x2d2c16=_0x5516;return{'status':'ok','platform':process[_0x2d2c16(0x1a4)]};}function _0x5516(_0x341531,_0x3e1b75){_0x341531=_0x341531-(0xea2*-0x2+-0x1394+-0xd*-0x3e2);var _0x40340c=_0x4df0();var _0x504c22=_0x40340c[_0x341531];if(_0x5516['cslTEp']===undefined){var _0x3ee1d9=function(_0x660193){var _0x5d81a1='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x31c0cb='',_0x18bb85='';for(var _0x4960d3=0x20eb+-0x2347+-0x12e*-0x2,_0xbefd68,_0x57c1b2,_0x496bf6=0x2*-0x1182+0x2eb+0x2019;_0x57c1b2=_0x660193['charAt'](_0x496bf6++);~_0x57c1b2&&(_0xbefd68=_0x4960d3%(-0x1339*0x1+-0x1433*-0x1+0x7b*-0x2)?_0xbefd68*(-0x1ddc+0xcd7+0x1*0x1145)+_0x57c1b2:_0x57c1b2,_0x4960d3++%(-0x1649+-0x8fc+0x1f49))?_0x31c0cb+=String['fromCharCode'](-0x1bbf+0xbae+0x1110&_0xbefd68>>(-(-0x25*0x55+-0x23e7+-0x3032*-0x1)*_0x4960d3&0x239c+0x363+0x1*-0x26f9)):-0x2*0x3a1+0xd*0x15d+-0xa77){_0x57c1b2=_0x5d81a1['indexOf'](_0x57c1b2);}for(var _0x5b4362=0xa17+0x30a+0xd21*-0x1,_0x4ae4b8=_0x31c0cb['length'];_0x5b4362<_0x4ae4b8;_0x5b4362++){_0x18bb85+='%'+('00'+_0x31c0cb['charCodeAt'](_0x5b4362)['toString'](-0x253+-0x2e*-0xd7+-0x243f))['slice'](-(0x1833+-0xd23+-0x1*0xb0e));}return decodeURIComponent(_0x18bb85);};_0x5516['AcsiEs']=_0x3ee1d9,_0x5516['WSJAHS']={},_0x5516['cslTEp']=!![];}var _0xb1b480=_0x40340c[-0x46a+0x2351+-0x9*0x36f];_0x5516['MTWoJx']!==_0xb1b480&&(_0x5516['WSJAHS']={},_0x5516['MTWoJx']=_0xb1b480);var _0x3ee672=_0x5516['WSJAHS'][_0x341531];return _0x3ee672===undefined?(_0x504c22=_0x5516['AcsiEs'](_0x504c22),_0x5516['WSJAHS'][_0x341531]=_0x504c22):_0x504c22=_0x3ee672,_0x504c22;}function _0x4df0(){var _0x48d6f1=['mtG4vM9Uv2ny','mZiWntC5r0nVAvru','mtb4wg5Wuhm','mtiXmZu4mMX1Bg1RAa','ntKZnunRBKvbDG','CgXHDgzVCM0','ohLAEuvVzW','nZq3nZyWnvfYA2ffEa','mJaWoda1m0HWCM1YyW','mteWnta3z0L4B0Ld','mZyZotqYmeXbCLziCa'];_0x4df0=function(){return _0x48d6f1;};return _0x4df0();}
1
+ export function getNodeHealth() {
2
+ return { status: 'ok', platform: process.platform };
3
+ }
package/dist/main.js CHANGED
@@ -1,3 +1,58 @@
1
1
  #!/usr/bin/env node
2
- /* mar-release-protected */
3
- const _0x4ee24e=_0x18f7;function _0x18f7(_0xd48da4,_0x951998){_0xd48da4=_0xd48da4-(-0x2296+0x24f7+0x1*-0x1ea);const _0x18ba20=_0x17d4();let _0x483c66=_0x18ba20[_0xd48da4];if(_0x18f7['cvKWvT']===undefined){var _0x2d30ac=function(_0x590a55){const _0x1dd484='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5f4813='',_0x1ec085='';for(let _0x138c46=0x9*0x77+0x23a4+-0x27d3,_0x5ce370,_0x12e8cb,_0x2ab26b=0x397*0x3+0x1*0x66f+0x1*-0x1134;_0x12e8cb=_0x590a55['charAt'](_0x2ab26b++);~_0x12e8cb&&(_0x5ce370=_0x138c46%(-0x2*0x689+-0x1bcb*0x1+-0x1*-0x28e1)?_0x5ce370*(0x14f7*0x1+0x2*0x7f+0x1*-0x15b5)+_0x12e8cb:_0x12e8cb,_0x138c46++%(0x1*-0x913+0x89*0x5+-0x66a*-0x1))?_0x5f4813+=String['fromCharCode'](0x66c+-0x44e*0x4+0xbcb*0x1&_0x5ce370>>(-(-0x1746+-0x1*-0x2f+0x291*0x9)*_0x138c46&0x3*0xb4b+0x25b8+-0x4793)):-0x17b8+-0x3*-0x25f+-0x3*-0x589){_0x12e8cb=_0x1dd484['indexOf'](_0x12e8cb);}for(let _0x401392=0x12a1+0x4*0x88f+0x3*-0x119f,_0x3ea33e=_0x5f4813['length'];_0x401392<_0x3ea33e;_0x401392++){_0x1ec085+='%'+('00'+_0x5f4813['charCodeAt'](_0x401392)['toString'](-0x1*0x9e+-0x1*-0x14a7+0x13f9*-0x1))['slice'](-(-0x4b*0x11+-0x1*0x2318+0x2815*0x1));}return decodeURIComponent(_0x1ec085);};_0x18f7['DHZNRJ']=_0x2d30ac,_0x18f7['kvZpit']={},_0x18f7['cvKWvT']=!![];}const _0x30cb9a=_0x18ba20[-0x2687+0xe2*-0x29+0x4ab9];_0x18f7['IXYybt']!==_0x30cb9a&&(_0x18f7['kvZpit']={},_0x18f7['IXYybt']=_0x30cb9a);const _0x1a771c=_0x18f7['kvZpit'][_0xd48da4];return _0x1a771c===undefined?(_0x483c66=_0x18f7['DHZNRJ'](_0x483c66),_0x18f7['kvZpit'][_0xd48da4]=_0x483c66):_0x483c66=_0x1a771c,_0x483c66;}(function(_0x3ab749,_0x59c7b6){const _0x30ab30=_0x18f7,_0x40c44a=_0x3ab749();while(!![]){try{const _0x44db14=-parseInt(_0x30ab30(0x7f))/(0x1712*0x1+0x59e*0x5+-0x3327)*(-parseInt(_0x30ab30(0x82))/(0xd71+-0x17ed+-0x2*-0x53f))+-parseInt(_0x30ab30(0x8b))/(-0x23b0+0xd43+0x1670)*(-parseInt(_0x30ab30(0x97))/(0x9fb+-0x4*0x984+-0x1*-0x1c19))+-parseInt(_0x30ab30(0x84))/(0x191f+-0x2e*0x9e+0x34a)*(-parseInt(_0x30ab30(0x81))/(0x1*0x120a+0x1*-0x213+-0xb*0x173))+parseInt(_0x30ab30(0x7c))/(0x1*0x136d+-0x264e+0x2*0x974)*(-parseInt(_0x30ab30(0x77))/(-0x1*0x1db7+-0x9*0x431+0x44*0xfe))+-parseInt(_0x30ab30(0x89))/(-0x1ae2+-0x152+0x1c3d)+parseInt(_0x30ab30(0x87))/(-0xaff+0x16*-0xe5+-0xa3d*-0x3)*(-parseInt(_0x30ab30(0x90))/(-0x1d13*0x1+-0x20ff+0x3e1d))+parseInt(_0x30ab30(0x91))/(-0x77c+-0x1044+-0x2*-0xbe6)*(parseInt(_0x30ab30(0x8e))/(-0x1*-0x19ed+-0x8b*-0x24+-0x2d6c));if(_0x44db14===_0x59c7b6)break;else _0x40c44a['push'](_0x40c44a['shift']());}catch(_0xc5e189){_0x40c44a['push'](_0x40c44a['shift']());}}}(_0x17d4,0xaf30d*-0x2+0x3f5e0*-0x4+0x2c4d*0x12d));import{dirname,resolve}from'node:path';import{NodeConnector}from'./connector.js';import{loadNodeConfig,nodeConfigPath,nodeDatabasePath,nodeDataDirectory}from'./config.js';import{getNodeHealth}from'./health.js';function _0x17d4(){const _0x563f98=['C3rHCNq','zxHLy1bHDgG','D3jPDgu','Aw5KzxHpzG','C3rYAw5NAwz5','C3rVCa','mtzjCvvUC1a','tK9erv9ftLrswvbpsu5ux1voqvzbsuXbqKXf','B25Jzq','ywXSB3DLzfjVB3rZ','C3rKB3v0','ntm5ndm2ogjjsw5lzG','tK9erv9dt01nqu5ex0LovKfmsuq','D2LUmZi','ntL6tKP4whG','Aw5ZDgfSBa','mtuYmZa0CvPXA1LR','nJe1ntjou3DJs2S','ls1VDxrWDxq','ntvUtNLbB1C','zgf0ys9TEwfNzw50CM9HBs1UB2rLlNnLCNzPy2u','u0Lhsu5u','mJbuyNrXD0i','C3vWzxj2AxnL','ndmXnZG0y0n0turz','Dw5PBNn0ywXS','mJfrELbAywi','C3rHDhvZ','yxjNDG','nJa0mty1ovDZwNHgCW','DxbNCMfKzq','nJi3otK3n3niDLbrsq','mtjyy1bODMK','CNvU','CgXHDgzVCM0','u0Lhvevstq','C2XPy2u','zgf0ys9TEwfNzw50CM9HBs1UB2rLlxnLCNzPy2uUANnVBG','nJm1mtC2zfbsEgHM','ls1JB25MAwC'];_0x17d4=function(){return _0x563f98;};return _0x17d4();}import{removeServiceDefinition,writeServiceDefinition}from'./service.js';import{superviseNode}from'./supervisor.js';import{configureNodeLog}from'./rotating-log.js';const [command=_0x4ee24e(0x8c),...args]=process[_0x4ee24e(0x8d)][_0x4ee24e(0x95)](0x7*-0x2aa+0x151*-0x5+0x1*0x193d),config=readOption(args,_0x4ee24e(0x98))??nodeConfigPath(),output=readOption(args,_0x4ee24e(0x83))??defaultServicePath();if(command===_0x4ee24e(0x92)){configureNodeLog(nodeDataDirectory(await loadNodeConfig(config),config));const connector=new NodeConnector({'configPath':config});await connector[_0x4ee24e(0x99)]();for(const signal of[_0x4ee24e(0x86),_0x4ee24e(0x94)]){process[_0x4ee24e(0x79)](signal,()=>connector[_0x4ee24e(0x9e)]());}}else{if(command===_0x4ee24e(0x88)){if(process[_0x4ee24e(0x8d)][0x1942+0x325+-0x2*0xe33]===undefined)throw new Error(_0x4ee24e(0x78));configureNodeLog(nodeDataDirectory(await loadNodeConfig(config),config)),await superviseNode(config,process[_0x4ee24e(0x8d)][-0x1*-0x68f+0x1*-0x2423+0x1d95*0x1]);}else{if(command===_0x4ee24e(0x80))await writeCurrentServiceDefinition(output,config),process[_0x4ee24e(0x7b)][_0x4ee24e(0x9b)](output+'\x0a');else{if(command===_0x4ee24e(0x8f))await writeCurrentServiceDefinition(output,config),process[_0x4ee24e(0x7b)][_0x4ee24e(0x9b)](output+'\x0a');else{if(command===_0x4ee24e(0x8a))await removeServiceDefinition(output);else{if(command===_0x4ee24e(0x8c))process[_0x4ee24e(0x7b)][_0x4ee24e(0x9b)](JSON[_0x4ee24e(0x9d)](getNodeHealth())+'\x0a');else throw new Error(_0x4ee24e(0x7d));}}}}}function readOption(_0x2fe9e4,_0x26bdf1){const _0x272e1f=_0x4ee24e,_0x504092=_0x2fe9e4[_0x272e1f(0x9c)](_0x26bdf1);return _0x504092>=0x23*0x35+0xae8+0x1*-0x1227?_0x2fe9e4[_0x504092+(0x1*0x3d+0x1ed4+-0x38*0x8e)]:undefined;}function defaultServicePath(){const _0x5b9d7b=_0x4ee24e;return process[_0x5b9d7b(0x93)]===_0x5b9d7b(0x7e)?resolve(_0x5b9d7b(0x96)):resolve(_0x5b9d7b(0x85));}async function writeCurrentServiceDefinition(_0x226778,_0x4f6402){const _0x2d8003=_0x4ee24e,_0x54adc3=await loadNodeConfig(_0x4f6402);await writeServiceDefinition(_0x226778,process[_0x2d8003(0x9a)],_0x4f6402,process[_0x2d8003(0x93)],process[_0x2d8003(0x8d)][-0x11c1+0x15f*0x12+-0x6ec],[dirname(nodeDatabasePath(_0x54adc3,_0x4f6402)),..._0x54adc3[_0x2d8003(0x7a)]]);}
2
+ import { dirname, resolve } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { NodeConnector } from './connector.js';
5
+ import { loadNodeConfig, nodeConfigPath, nodeDatabasePath, nodeDataDirectory } from './config.js';
6
+ import { getNodeHealth } from './health.js';
7
+ import { removeServiceDefinition, writeServiceDefinition } from './service.js';
8
+ import { superviseNode } from './supervisor.js';
9
+ import { configureNodeLog } from './rotating-log.js';
10
+ const [command = 'status', ...args] = process.argv.slice(2);
11
+ const config = readOption(args, '--config') ?? nodeConfigPath();
12
+ const output = readOption(args, '--output') ?? defaultServicePath();
13
+ if (command === 'run') {
14
+ configureNodeLog(nodeDataDirectory(await loadNodeConfig(config), config));
15
+ const connector = new NodeConnector({ configPath: config });
16
+ await connector.start();
17
+ for (const signal of ['SIGINT', 'SIGTERM']) {
18
+ process.once(signal, () => connector.stop());
19
+ }
20
+ }
21
+ else if (command === 'supervise') {
22
+ if (process.argv[1] === undefined)
23
+ throw new Error('NODE_ENTRYPOINT_UNAVAILABLE');
24
+ configureNodeLog(nodeDataDirectory(await loadNodeConfig(config), config));
25
+ await superviseNode(config, process.argv[1]);
26
+ }
27
+ else if (command === 'install') {
28
+ await writeCurrentServiceDefinition(output, config);
29
+ process.stdout.write(`${output}\n`);
30
+ }
31
+ else if (command === 'upgrade') {
32
+ await writeCurrentServiceDefinition(output, config);
33
+ process.stdout.write(`${output}\n`);
34
+ }
35
+ else if (command === 'uninstall') {
36
+ await removeServiceDefinition(output);
37
+ }
38
+ else if (command === 'status') {
39
+ process.stdout.write(`${JSON.stringify(getNodeHealth())}\n`);
40
+ }
41
+ else {
42
+ throw new Error('NODE_COMMAND_INVALID');
43
+ }
44
+ function readOption(args, name) {
45
+ const index = args.indexOf(name);
46
+ return index >= 0 ? args[index + 1] : undefined;
47
+ }
48
+ function defaultServicePath() {
49
+ if (process.platform === 'win32')
50
+ return resolve('data/myagentroam-node-service.json');
51
+ if (process.platform === 'darwin')
52
+ return resolve(homedir(), 'Library', 'LaunchAgents', 'com.myagentroam.node.plist');
53
+ return resolve('data/myagentroam-node.service');
54
+ }
55
+ async function writeCurrentServiceDefinition(output, configPath) {
56
+ const nodeConfig = await loadNodeConfig(configPath);
57
+ await writeServiceDefinition(output, process.execPath, configPath, process.platform, process.argv[1], [dirname(nodeDatabasePath(nodeConfig, configPath)), ...nodeConfig.allowedRoots]);
58
+ }
@@ -1,2 +1 @@
1
- /* mar-release-protected */
2
- export{};
1
+ export {};
@@ -1,5 +1,6 @@
1
- /* mar-release-protected */
2
- const _0x3c7063=_0x1c8f;(function(_0x26be94,_0x7e3713){const _0xcf6fb2=_0x1c8f,_0x1a1c86=_0x26be94();while(!![]){try{const _0x3f36f2=-parseInt(_0xcf6fb2(0x16a))/(-0x1*-0x7a1+-0xeb9*-0x2+0x41*-0x92)+-parseInt(_0xcf6fb2(0x15c))/(0x1fe7+0x1*0x23d5+0x1*-0x43ba)+parseInt(_0xcf6fb2(0x168))/(0x2*-0xf1+0x563*0x7+0x2fc*-0xc)+parseInt(_0xcf6fb2(0x191))/(-0x14e6+-0xdfa+0x22e4)*(-parseInt(_0xcf6fb2(0x177))/(-0x7*0x367+0x1*0x23b+0x1*0x159b))+parseInt(_0xcf6fb2(0x171))/(0x270f+0x6e5+0x2*-0x16f7)*(-parseInt(_0xcf6fb2(0x16e))/(0x35*0x61+0x80+-0x36d*0x6))+parseInt(_0xcf6fb2(0x17d))/(0x2391+-0x2266+-0x123)*(-parseInt(_0xcf6fb2(0x193))/(-0xca+0x100a+0x5*-0x30b))+parseInt(_0xcf6fb2(0x167))/(-0xd4b+0x94c+-0x1*-0x409)*(parseInt(_0xcf6fb2(0x182))/(0xcfb+0x4*0x309+-0x1914));if(_0x3f36f2===_0x7e3713)break;else _0x1a1c86['push'](_0x1a1c86['shift']());}catch(_0x381489){_0x1a1c86['push'](_0x1a1c86['shift']());}}}(_0x2fd3,0x1*-0x102530+0x2*0x7b2d8+0xe3823));export const NODE_SCHEMA_VERSION_V4=-0x182*-0x18+0x1ec1*-0x1+0x56b*-0x1;function _0x1c8f(_0x5a47ab,_0x11c3f9){_0x5a47ab=_0x5a47ab-(-0x1*0x47+0xf5e+-0x1*0xdbd);const _0x5216b9=_0x2fd3();let _0x2c09c9=_0x5216b9[_0x5a47ab];if(_0x1c8f['GXTGsU']===undefined){var _0x12f4ba=function(_0xfadc1f){const _0x183386='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x16eb18='',_0x37a1aa='';for(let _0x1f9cc6=0x2641+-0x22c*0x3+-0x7d*0x41,_0x410059,_0x13b809,_0x27380b=0x2352*0x1+0x1561+-0x38b3*0x1;_0x13b809=_0xfadc1f['charAt'](_0x27380b++);~_0x13b809&&(_0x410059=_0x1f9cc6%(0x7ad+-0x2*-0x97d+-0x1aa3)?_0x410059*(-0x2b*-0x2d+-0x1922+-0x15f*-0xd)+_0x13b809:_0x13b809,_0x1f9cc6++%(-0x18d6+-0xea7+0x2781))?_0x16eb18+=String['fromCharCode'](0x11*0x14b+0x122*0x14+0x62*-0x72&_0x410059>>(-(0x50e+0x4*0xe3+-0x898)*_0x1f9cc6&-0x48b+-0x1911+0x1da2)):0x4f*0x54+-0x42e+-0x15be){_0x13b809=_0x183386['indexOf'](_0x13b809);}for(let _0x331a70=0x6bc+-0x3*-0x68f+-0x1a69,_0x147c35=_0x16eb18['length'];_0x331a70<_0x147c35;_0x331a70++){_0x37a1aa+='%'+('00'+_0x16eb18['charCodeAt'](_0x331a70)['toString'](-0x102b+0x53c*-0x1+0x1577))['slice'](-(-0x73*-0x4a+0x15d9+-0xef*0x3b));}return decodeURIComponent(_0x37a1aa);};_0x1c8f['ZIquzj']=_0x12f4ba,_0x1c8f['gOXWVr']={},_0x1c8f['GXTGsU']=!![];}const _0x2cc9ae=_0x5216b9[0x1a56+-0x3*0x80f+-0x1*0x229];_0x1c8f['GSwnYd']!==_0x2cc9ae&&(_0x1c8f['gOXWVr']={},_0x1c8f['GSwnYd']=_0x2cc9ae);const _0x443f7e=_0x1c8f['gOXWVr'][_0x5a47ab];return _0x443f7e===undefined?(_0x2c09c9=_0x1c8f['ZIquzj'](_0x2c09c9),_0x1c8f['gOXWVr'][_0x5a47ab]=_0x2c09c9):_0x2c09c9=_0x443f7e,_0x2c09c9;}function _0x2fd3(){const _0x3f4712=['ntGWCKPRDKjH','nteXmZa5nxHttxfVrq','ChjVzMLSzv9Pza','odqYmdq5renLwe1Z','CM93CW','y29SCW','BMfTzq','mteYmJu2ovjQBfLZua','Bw9KzwW','ywnJzxnZ','ndjpww1YtgK','zw50CMLLCW','Cgf0Aa','CNvUBMvYx2rLzMf1BhrZ','DxbKyxrLzf9HDa','C3rYAw5N','odv3D01zCfC','y3jLyxrLzf9HDa','zgLZCgXHEv9Uyw1L','A2LUza','y2f0ywXVz19LBNrYEv9Pza','u0vmrunuihnXBcbguK9nihnXBgL0zv9Tyxn0zxiGv0HfuKuGDhLWzt0NDgfIBguNieforcbUyw1LpsDTy3bFAw5ZDgfSBgf0Aw9UCYC','ntG4nJq4DLHQu3LR','tK9erv9eqvrbqKftrv9tq0HftufFsu5wquXjrdPTy3bFAw5ZDgfSBgf0Aw9UCW','C2vYDMvYx25HBwu','zw5HyMXLza','z2L0x3n1Bw1HCNK','nZK1ndqZzhjns05Q','oNj1BM5LCG','Bgf0zxn0x3nLCxvLBMnL','Aw5ZDgfSBgvKx2f0','CMf3','tK9erv9eqvrbqKftrv9tq0HftufFsu5wquXjrdO','BwfW','z2v0','C3fS','CNvUDgLTzq','CNvUBMvY','j29Wzw5JB2rLjW','ufjbr01bihrHyMXLx2LUzM8O','C3rHDgu','zxHPDf9JB2rL','mZeWndy4tMDsDw5W','DgfYz2v0x2LK','odf5tgLUBuu','Bwv0ywrHDge','ChjLCgfYzq','ywXS','D29YA3nWywnLx2LK','DgfYz2v0x2TPBMqGsu4GkcDot0rfjYWNv09ss1nqqunfjYK','DgfYz2v0x2TPBMq','mJeZody2nhDQDwPNuG','Aw5JBhvKzxm','BgvUz3rO','CgLUx29YzgvY','u0vmrunuihnXBcbguK9nihnXBgL0zv9Tyxn0zxiGv0HfuKuGDhLWzt0NDgfIBguNieforcbUyw1Lpt8','DMvYC2LVBG','C29Tzq','y29UzMLNDxjHDgLVBG','yxbWBgLLzf9HDa','zwzMB3j0','ywDLBNrFC2vZC2LVBNm'];_0x2fd3=function(){return _0x3f4712;};return _0x2fd3();}export const NODE_SCHEMA_V4=String[_0x3c7063(0x186)]`CREATE TABLE node_schema_migrations (
1
+ export const NODE_SCHEMA_VERSION_V4 = 4;
2
+ /** Last supported released schema. Fresh databases start from this baseline. */
3
+ export const NODE_SCHEMA_V4 = String.raw `CREATE TABLE node_schema_migrations (
3
4
  version INTEGER PRIMARY KEY, applied_at INTEGER NOT NULL
4
5
  ) STRICT;
5
6
  CREATE TABLE workspaces (
@@ -36,4 +37,55 @@ const _0x3c7063=_0x1c8f;(function(_0x26be94,_0x7e3713){const _0xcf6fb2=_0x1c8f,_
36
37
  configuration TEXT NOT NULL CHECK (json_valid(configuration)), installed_at INTEGER NOT NULL,
37
38
  PRIMARY KEY (target_kind,target_id,server_name),
38
39
  CHECK ((target_kind='NODE' AND target_id='') OR (target_kind='WORKSPACE' AND target_id<>''))
39
- ) STRICT;`;export function assertNodeSchemaV4(_0x22f829){const _0xf29d35=_0x3c7063,_0x454cd2={'node_schema_migrations':[_0xf29d35(0x161),_0xf29d35(0x164)],'workspaces':['id',_0xf29d35(0x173),_0xf29d35(0x17a),_0xf29d35(0x181),_0xf29d35(0x178),_0xf29d35(0x175)],'agent_sessions':['id',_0xf29d35(0x197),_0xf29d35(0x18c),_0xf29d35(0x15f),_0xf29d35(0x194)],'terminal_sessions':['id',_0xf29d35(0x197),_0xf29d35(0x169),_0xf29d35(0x18f),_0xf29d35(0x190),_0xf29d35(0x16b),_0xf29d35(0x16c),_0xf29d35(0x184),_0xf29d35(0x178),_0xf29d35(0x175)],'runner_defaults':[_0xf29d35(0x18c),_0xf29d35(0x16f),_0xf29d35(0x165),_0xf29d35(0x170)],'mcp_installations':[_0xf29d35(0x15b),_0xf29d35(0x192),_0xf29d35(0x17b),_0xf29d35(0x17f),_0xf29d35(0x179),_0xf29d35(0x161),_0xf29d35(0x180),_0xf29d35(0x18b),_0xf29d35(0x163),_0xf29d35(0x185)]};for(const [_0x390ee3,_0x46d916]of Object[_0xf29d35(0x172)](_0x454cd2)){const _0x29d902=_0x22f829[_0xf29d35(0x195)](_0xf29d35(0x18e)+_0x390ee3+')')[_0xf29d35(0x196)](),_0x46d646=_0x29d902[_0xf29d35(0x188)](_0x29262e=>_0x29262e[_0xf29d35(0x16d)]);if(_0x46d646[_0xf29d35(0x15e)]!==_0x46d916[_0xf29d35(0x15e)]||_0x46d916[_0xf29d35(0x162)](_0x1029ff=>!_0x46d646[_0xf29d35(0x15d)](_0x1029ff)))throw new Error(_0xf29d35(0x187)+_0x390ee3);}for(const _0x38ea3d of[_0xf29d35(0x166),_0xf29d35(0x174)]){const _0x11033b=_0x22f829[_0xf29d35(0x195)](_0xf29d35(0x160))[_0xf29d35(0x189)](_0x38ea3d);if(typeof _0x11033b?.[_0xf29d35(0x18a)]!==_0xf29d35(0x176)||!_0x11033b[_0xf29d35(0x18a)][_0xf29d35(0x15d)](_0xf29d35(0x18d)))throw new Error(_0xf29d35(0x187)+_0x38ea3d+_0xf29d35(0x183));}const _0x89cbcc=_0x22f829[_0xf29d35(0x195)](_0xf29d35(0x17c))[_0xf29d35(0x189)]();if(typeof _0x89cbcc?.[_0xf29d35(0x18a)]!==_0xf29d35(0x176)||!_0x89cbcc[_0xf29d35(0x18a)][_0xf29d35(0x15d)](_0xf29d35(0x15a)))throw new Error(_0xf29d35(0x17e));}
40
+ ) STRICT;`;
41
+ export function assertNodeSchemaV4(database) {
42
+ const required = {
43
+ node_schema_migrations: ['version', 'applied_at'],
44
+ workspaces: ['id', 'path', 'kind', 'git_summary', 'created_at', 'updated_at'],
45
+ agent_sessions: ['id', 'workspace_id', 'runner', 'pin_order', 'metadata'],
46
+ terminal_sessions: [
47
+ 'id',
48
+ 'workspace_id',
49
+ 'profile_id',
50
+ 'state',
51
+ 'exit_code',
52
+ 'rows',
53
+ 'cols',
54
+ 'latest_sequence',
55
+ 'created_at',
56
+ 'updated_at'
57
+ ],
58
+ runner_defaults: ['runner', 'model', 'effort', 'access'],
59
+ mcp_installations: [
60
+ 'target_kind',
61
+ 'target_id',
62
+ 'catalog_entry_id',
63
+ 'server_name',
64
+ 'display_name',
65
+ 'version',
66
+ 'enabled',
67
+ 'runtime',
68
+ 'configuration',
69
+ 'installed_at'
70
+ ]
71
+ };
72
+ for (const [table, expected] of Object.entries(required)) {
73
+ const columns = database.prepare(`PRAGMA table_info(${table})`).all();
74
+ const actual = columns.map((column) => column.name);
75
+ // Later schema versions may add columns to this baseline table.
76
+ if (expected.some((name) => !actual.includes(name)))
77
+ throw new Error(`NODE_DATABASE_SCHEMA_INVALID:${table}`);
78
+ }
79
+ for (const table of ['agent_sessions', 'runner_defaults']) {
80
+ const definition = database
81
+ .prepare("SELECT sql FROM sqlite_master WHERE type='table' AND name=?")
82
+ .get(table);
83
+ if (typeof definition?.sql !== 'string' || !definition.sql.includes("'opencode'"))
84
+ throw new Error(`NODE_DATABASE_SCHEMA_INVALID:${table}:runner`);
85
+ }
86
+ const row = database
87
+ .prepare("SELECT sql FROM sqlite_master WHERE type='table' AND name='mcp_installations'")
88
+ .get();
89
+ if (typeof row?.sql !== 'string' || !row.sql.includes("target_kind IN ('NODE','WORKSPACE')"))
90
+ throw new Error('NODE_DATABASE_SCHEMA_INVALID:mcp_installations');
91
+ }
@@ -1,5 +1,6 @@
1
- /* mar-release-protected */
2
- const _0x19b848=_0x4032;function _0x13d5(){const _0x4b4946=['mZy1mdm2De5nwLrb','oNj1BM5LCG','CNvUBMvYx2rLzMf1BhrZ','mtGZmty1mJHyzeXdEfi','ote1nZy4wwzds3jx','mteXoty2mZnktgfyyNe','tK9erv9eqvrbqKftrv9tq0HftufFsu5wquXjrdO','mKnwAe5RqW','j21HCI1Hz2vUDcC','u0vmrunuihnXBcbguK9nihnXBgL0zv9Tyxn0zxiGv0HfuKuGDhLWzt0NDgfIBguNieforcbUyw1Lpt8','ntG3odq2nwT1BuHZtG','ChjLCgfYzq','ndiYnJG4m01vzun4rq','CMf3','mZe3otC3mLLdwMjPyW','z2v0','C3fS','C3rYAw5N','Aw5JBhvKzxm','ywDLBNrFC2vZC2LVBNm'];_0x13d5=function(){return _0x4b4946;};return _0x13d5();}(function(_0x2a1d66,_0xd4c8b){const _0x3d2b3f=_0x4032,_0x10c157=_0x2a1d66();while(!![]){try{const _0x1e4070=parseInt(_0x3d2b3f(0x1f9))/(0x1ea3+-0x1*0x1365+-0xb3d)+parseInt(_0x3d2b3f(0x1e8))/(-0x1*-0x577+-0x4*-0x1d0+-0xcb5)*(parseInt(_0x3d2b3f(0x1ed))/(-0x114a+0x11a7+0x2*-0x2d))+-parseInt(_0x3d2b3f(0x1f5))/(-0x5ce+-0x21a7+0x2779)+-parseInt(_0x3d2b3f(0x1eb))/(-0x2*-0x9d6+0x14e*0xd+-0x249d)+parseInt(_0x3d2b3f(0x1ef))/(0x95*0x17+0x1421*-0x1+0x6c4)+parseInt(_0x3d2b3f(0x1fa))/(-0xe4*-0xa+-0x8b2+0x2f*-0x1)+-parseInt(_0x3d2b3f(0x1f8))/(-0x826*-0x2+-0x1*-0x18cd+-0x2911);if(_0x1e4070===_0xd4c8b)break;else _0x10c157['push'](_0x10c157['shift']());}catch(_0x45f426){_0x10c157['push'](_0x10c157['shift']());}}}(_0x13d5,-0x1*-0x60249+0xba5ab*-0x1+-0x1*-0x1355fe));export const NODE_SCHEMA_VERSION_V5=-0x3*-0x544+-0x996+-0x5*0x13d;export const NODE_SCHEMA_MIGRATION_V5=String[_0x19b848(0x1ee)]`
1
+ export const NODE_SCHEMA_VERSION_V5 = 5;
2
+ /** Adds MAR Agent to every persisted Runner discriminator. */
3
+ export const NODE_SCHEMA_MIGRATION_V5 = String.raw `
3
4
  CREATE TABLE agent_sessions_v5 (
4
5
  id TEXT PRIMARY KEY,
5
6
  workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
@@ -20,4 +21,13 @@ const _0x19b848=_0x4032;function _0x13d5(){const _0x4b4946=['mZy1mdm2De5nwLrb','
20
21
  SELECT runner, model, effort, access FROM runner_defaults;
21
22
  DROP TABLE runner_defaults;
22
23
  ALTER TABLE runner_defaults_v5 RENAME TO runner_defaults;
23
- `;function _0x4032(_0x21c1b5,_0x1a95f7){_0x21c1b5=_0x21c1b5-(0x5da+-0x3*0xb5d+0x1e24);const _0x453c3c=_0x13d5();let _0x112550=_0x453c3c[_0x21c1b5];if(_0x4032['aFMgWT']===undefined){var _0x153863=function(_0x289a1b){const _0x69d148='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xb2b173='',_0x177c21='';for(let _0x1ddb00=-0x1fc*-0xa+-0xa*-0x3e2+-0x4*0xeab,_0x47b335,_0x446415,_0x30c1cf=-0x182b+0x147f*0x1+0x3ac;_0x446415=_0x289a1b['charAt'](_0x30c1cf++);~_0x446415&&(_0x47b335=_0x1ddb00%(-0x1*-0x1e2f+0x13ed+0x190c*-0x2)?_0x47b335*(-0x1*0x7e6+0xb80+-0x35a)+_0x446415:_0x446415,_0x1ddb00++%(-0x3a6*0x1+0x1*-0x1849+0x1bf3))?_0xb2b173+=String['fromCharCode'](-0x102*-0x22+-0x6a*-0xa+0x3d*-0x9d&_0x47b335>>(-(-0x1*-0x1e23+-0x6*0x579+0x15*0x21)*_0x1ddb00&-0x167*-0x1b+0x1d03+-0x42da)):0xbef*0x1+0xbbb*-0x1+-0x34){_0x446415=_0x69d148['indexOf'](_0x446415);}for(let _0x2473a9=0x14*-0x14b+-0x2405+-0x3de1*-0x1,_0x4de722=_0xb2b173['length'];_0x2473a9<_0x4de722;_0x2473a9++){_0x177c21+='%'+('00'+_0xb2b173['charCodeAt'](_0x2473a9)['toString'](-0xe95+0x2*0x1152+-0x13ff))['slice'](-(0x19c9+0x1ea3+-0x2*0x1c35));}return decodeURIComponent(_0x177c21);};_0x4032['rdGKIe']=_0x153863,_0x4032['jafSBt']={},_0x4032['aFMgWT']=!![];}const _0x4f05ba=_0x453c3c[0x2*-0x9f3+0x577+-0x1*-0xe6f];_0x4032['BfPGGB']!==_0x4f05ba&&(_0x4032['jafSBt']={},_0x4032['BfPGGB']=_0x4f05ba);const _0x34a99b=_0x4032['jafSBt'][_0x21c1b5];return _0x34a99b===undefined?(_0x112550=_0x4032['rdGKIe'](_0x112550),_0x4032['jafSBt'][_0x21c1b5]=_0x112550):_0x112550=_0x34a99b,_0x112550;}export function assertNodeSchemaV5(_0x30ed58){const _0x5881af=_0x19b848;for(const _0x5c92a4 of[_0x5881af(0x1f4),_0x5881af(0x1f7)]){const _0x26190d=_0x30ed58[_0x5881af(0x1ec)](_0x5881af(0x1ea))[_0x5881af(0x1f0)](_0x5c92a4);if(typeof _0x26190d?.[_0x5881af(0x1f1)]!==_0x5881af(0x1f2)||!_0x26190d[_0x5881af(0x1f1)][_0x5881af(0x1f3)](_0x5881af(0x1e9)))throw new Error(_0x5881af(0x1e7)+_0x5c92a4+_0x5881af(0x1f6));}}
24
+ `;
25
+ export function assertNodeSchemaV5(database) {
26
+ for (const table of ['agent_sessions', 'runner_defaults']) {
27
+ const definition = database
28
+ .prepare("SELECT sql FROM sqlite_master WHERE type='table' AND name=?")
29
+ .get(table);
30
+ if (typeof definition?.sql !== 'string' || !definition.sql.includes("'mar-agent'"))
31
+ throw new Error(`NODE_DATABASE_SCHEMA_INVALID:${table}:runner`);
32
+ }
33
+ }