@myagentroam/node 0.9.62 → 0.9.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +4 -0
- package/dist/capabilities.js +110 -2
- package/dist/claude-agent-sdk.js +330 -2
- package/dist/claude-channel.js +44 -2
- package/dist/codex-app-server.js +510 -2
- package/dist/config.js +106 -2
- package/dist/connector/node-connector-options.js +1 -2
- package/dist/connector/node-operation-router.js +22 -2
- package/dist/connector.js +1736 -2
- package/dist/control-outbound-scheduler.js +153 -2
- package/dist/database.js +639 -2
- package/dist/fake-runner.js +129 -2
- package/dist/git-askpass.js +12 -0
- package/dist/git-execution-helper.js +266 -0
- package/dist/health.js +3 -2
- package/dist/main.js +57 -2
- package/dist/mcp-installation-model.js +1 -2
- package/dist/migrations/v004.js +55 -3
- package/dist/migrations/v005.js +13 -3
- package/dist/migrations/v006.js +90 -3
- package/dist/migrations/v007.js +22 -3
- package/dist/migrations/v008.js +18 -3
- package/dist/migrations/v009.js +70 -4
- package/dist/migrations/v010.js +43 -3
- package/dist/migrations/v011.js +20 -3
- package/dist/migrations/v012.js +8 -0
- package/dist/native-jsonl-reader.js +186 -2
- package/dist/native-session-history.js +1143 -2
- package/dist/opencode-runtime.js +80 -2
- package/dist/opencode-server.js +259 -2
- package/dist/operational.js +122 -2
- package/dist/process-tree.js +18 -2
- package/dist/ripgrep-binary.js +31 -2
- package/dist/rotating-log.js +67 -2
- package/dist/runner/abstract-runner.js +260 -2
- package/dist/runner/claude/managed-run-controller.js +355 -2
- package/dist/runner/claude/tool-normalizer.js +120 -2
- package/dist/runner/claude-code-runner.js +303 -2
- package/dist/runner/codex/composer-image-markers.js +8 -2
- package/dist/runner/codex/conversation-parser.js +913 -2
- package/dist/runner/codex/managed-run-controller.js +494 -2
- package/dist/runner/codex/tool-normalizer.js +214 -2
- package/dist/runner/codex-runner.js +585 -2
- package/dist/runner/fake-test-runner.js +47 -2
- package/dist/runner/mar-agent/conversation-normalizer.js +644 -2
- package/dist/runner/mar-agent/executor-stdio-client-transport.js +139 -2
- package/dist/runner/mar-agent/generated-images.js +41 -2
- package/dist/runner/mar-agent/history-projection.js +106 -2
- package/dist/runner/mar-agent/hosted-conversation-runtime.js +446 -2
- package/dist/runner/mar-agent/managed-run-controller.js +785 -2
- package/dist/runner/mar-agent/mcp-client-pool.js +233 -2
- package/dist/runner/mar-agent/runtime-model-factory.js +326 -2
- package/dist/runner/mar-agent-runner.js +458 -2
- package/dist/runner/opencode/conversation-parser.js +221 -2
- package/dist/runner/opencode/managed-run-controller.js +588 -2
- package/dist/runner/opencode/tool-normalizer.js +80 -2
- package/dist/runner/opencode-runner.js +426 -2
- package/dist/runner/runner-registry.js +87 -2
- package/dist/runner-command-engine.js +71 -2
- package/dist/runner-profiles.js +323 -2
- package/dist/runner-usage.js +190 -2
- package/dist/runtime-command-detector.js +73 -2
- package/dist/runtime-model.js +1 -2
- package/dist/runtime-state.js +1509 -2
- package/dist/service/attachment-domain-state.js +7 -2
- package/dist/service/bubblewrap-sandbox-executor.js +543 -2
- package/dist/service/continuous-run-coordinator.js +425 -2
- package/dist/service/conversation-history-service.js +552 -2
- package/dist/service/conversation-hosting-capability-service.js +61 -2
- package/dist/service/conversation-hosting-enablement-service.js +91 -2
- package/dist/service/conversation-hosting-maintenance-service.js +174 -2
- package/dist/service/conversation-segment-service.js +162 -2
- package/dist/service/conversation-template-node-service.js +992 -2
- package/dist/service/external-session-resume-service.js +152 -2
- package/dist/service/fake-managed-run-service.js +60 -2
- package/dist/service/git-execution-service.js +418 -0
- package/dist/service/git-operation-service.js +57 -0
- package/dist/service/hosted-conversation-node-service.js +1982 -2
- package/dist/service/hosted-conversation-store.js +1405 -2
- package/dist/service/managed-runner-session-service.js +35 -2
- package/dist/service/mar-agent-model-transport-test-service.js +88 -2
- package/dist/service/mcp-installation-verifier.js +87 -2
- package/dist/service/mcp-node-operation-service.js +90 -2
- package/dist/service/mission-mcp-server.js +124 -2
- package/dist/service/mission-mcp-stdio.js +40 -2
- package/dist/service/mission-runtime.js +142 -2
- package/dist/service/native-session-projection-service.js +274 -2
- package/dist/service/native-session-watch-service.js +683 -2
- package/dist/service/node-connection-lifecycle-service.js +88 -2
- package/dist/service/node-control-channel.js +85 -2
- package/dist/service/node-control-message-service.js +109 -2
- package/dist/service/node-request-service.js +62 -2
- package/dist/service/node-run-event-bridge.js +88 -2
- package/dist/service/node-terminal-channel.js +202 -2
- package/dist/service/node-upgrade-coordinator.js +137 -2
- package/dist/service/node-workspace-coordinator.js +97 -2
- package/dist/service/recent-run-projection-service.js +99 -2
- package/dist/service/run-attachment-service.js +321 -2
- package/dist/service/run-domain-state.js +4 -2
- package/dist/service/run-event-service.js +246 -2
- package/dist/service/run-ownership-policy.js +22 -2
- package/dist/service/run-workbench-service.js +120 -2
- package/dist/service/runner-channel-message-service.js +20 -2
- package/dist/service/runner-interaction-service.js +243 -2
- package/dist/service/runner-service.js +69 -2
- package/dist/service/runtime-credential-control-service.js +95 -2
- package/dist/service/session-catalog-service.js +404 -2
- package/dist/service/session-command-service.js +125 -2
- package/dist/service/session-context-service.js +128 -2
- package/dist/service/session-domain-state.js +9 -2
- package/dist/service/session-identity-service.js +86 -2
- package/dist/service/session-lifecycle-service.js +248 -2
- package/dist/service/session-message-service.js +270 -2
- package/dist/service/session-presentation-service.js +43 -2
- package/dist/service/session-query-service.js +82 -2
- package/dist/service/session-watch-slot-coordinator.js +21 -2
- package/dist/service/skill-directory-service.js +238 -2
- package/dist/service/skill-install-service.js +434 -2
- package/dist/service/skill-node-operation-service.js +206 -2
- package/dist/service/terminal-relay-state.js +3 -2
- package/dist/service/terminal-service.js +90 -2
- package/dist/service/web-search-error.js +40 -2
- package/dist/service/workbench-event-service.js +21 -2
- package/dist/service/workbench-manifest-service.js +69 -2
- package/dist/service/workspace-change-service.js +290 -2
- package/dist/service/workspace-content-search-service.js +457 -2
- package/dist/service/workspace-domain-state.js +41 -2
- package/dist/service/workspace-file-service.js +150 -2
- package/dist/service/workspace-git-exclude-service.js +119 -2
- package/dist/service/workspace-queue-workbench-service.js +176 -2
- package/dist/service/workspace-service.js +92 -2
- package/dist/service/workspace-session-service.js +154 -2
- package/dist/service/workspace-upload-service.js +262 -2
- package/dist/service/workspace-watch-controller.js +68 -2
- package/dist/service/workspace-watch-service.js +170 -2
- package/dist/service/workspace-watch-snapshot-service.js +218 -2
- package/dist/service/workspace-workbench-service.js +239 -2
- package/dist/service.js +91 -2
- package/dist/storage.js +32 -2
- package/dist/supervisor.js +136 -2
- package/dist/terminal.js +496 -2
- package/dist/util/git-credential-client.js +32 -0
- package/dist/util/node-operation-data.js +9 -2
- package/dist/util/node-operation-parsers.js +382 -2
- package/dist/util/personal-instructions.js +34 -2
- package/dist/util/runner-error.js +70 -2
- package/dist/util/runner-native-session-parsers.js +510 -2
- package/dist/util/safe-error.js +8 -2
- package/dist/util/secret-environment.js +25 -2
- package/dist/workspace.js +1793 -2
- package/package.json +11 -8
- package/vendor/ripgrep/darwin-arm64/rg +0 -0
- package/vendor/ripgrep/darwin-x64/rg +0 -0
- package/vendor/ripgrep/manifest.json +12 -0
- package/README.md +0 -42
- package/dist/event-buffer.js +0 -2
- package/dist/migrations/v001.js +0 -107
- package/dist/migrations/v002.js +0 -2
- package/dist/migrations/v003.js +0 -2
- package/dist/service/mcp-package-installer.js +0 -2
package/dist/rotating-log.js
CHANGED
|
@@ -1,2 +1,67 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { appendFileSync, mkdirSync, readdirSync, renameSync, statSync, unlinkSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
const DAY_MS = 24 * 60 * 60 * 1_000;
|
|
4
|
+
let sink;
|
|
5
|
+
export function configureNodeLog(dataDirectory) {
|
|
6
|
+
sink = new RotatingNodeLog(resolve(dataDirectory, 'logs'));
|
|
7
|
+
}
|
|
8
|
+
export function writeNodeLog(content) {
|
|
9
|
+
sink?.write(content);
|
|
10
|
+
}
|
|
11
|
+
export class RotatingNodeLog {
|
|
12
|
+
maxBytes;
|
|
13
|
+
retentionMs;
|
|
14
|
+
now;
|
|
15
|
+
activePath;
|
|
16
|
+
bytes = 0;
|
|
17
|
+
day = '';
|
|
18
|
+
rotation = 0;
|
|
19
|
+
lastCleanup = 0;
|
|
20
|
+
constructor(directory, maxBytes = 100 * 1024 * 1024, retentionMs = 7 * DAY_MS, now = Date.now) {
|
|
21
|
+
this.maxBytes = maxBytes;
|
|
22
|
+
this.retentionMs = retentionMs;
|
|
23
|
+
this.now = now;
|
|
24
|
+
mkdirSync(directory, { recursive: true });
|
|
25
|
+
this.activePath = resolve(directory, 'node.log');
|
|
26
|
+
try {
|
|
27
|
+
const stat = statSync(this.activePath);
|
|
28
|
+
this.bytes = stat.size;
|
|
29
|
+
this.day = new Date(stat.mtimeMs).toISOString().slice(0, 10);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
this.day = this.currentDay();
|
|
33
|
+
}
|
|
34
|
+
this.cleanup();
|
|
35
|
+
}
|
|
36
|
+
write(content) {
|
|
37
|
+
const length = Buffer.byteLength(content);
|
|
38
|
+
const day = this.currentDay();
|
|
39
|
+
if (this.bytes > 0 && (this.bytes + length > this.maxBytes || day !== this.day))
|
|
40
|
+
this.rotate();
|
|
41
|
+
appendFileSync(this.activePath, content, { encoding: 'utf8', mode: 0o600 });
|
|
42
|
+
this.bytes += length;
|
|
43
|
+
this.day = day;
|
|
44
|
+
if (this.now() - this.lastCleanup >= DAY_MS)
|
|
45
|
+
this.cleanup();
|
|
46
|
+
}
|
|
47
|
+
currentDay() {
|
|
48
|
+
return new Date(this.now()).toISOString().slice(0, 10);
|
|
49
|
+
}
|
|
50
|
+
rotate() {
|
|
51
|
+
const suffix = `${this.day}-${this.now()}-${String(this.rotation++).padStart(3, '0')}`;
|
|
52
|
+
renameSync(this.activePath, resolve(this.activePath, '..', `node-${suffix}.log`));
|
|
53
|
+
this.bytes = 0;
|
|
54
|
+
}
|
|
55
|
+
cleanup() {
|
|
56
|
+
const directory = resolve(this.activePath, '..');
|
|
57
|
+
const cutoff = this.now() - this.retentionMs;
|
|
58
|
+
for (const entry of readdirSync(directory)) {
|
|
59
|
+
if (!entry.startsWith('node-') || !entry.endsWith('.log'))
|
|
60
|
+
continue;
|
|
61
|
+
const path = resolve(directory, entry);
|
|
62
|
+
if (statSync(path).mtimeMs < cutoff)
|
|
63
|
+
unlinkSync(path);
|
|
64
|
+
}
|
|
65
|
+
this.lastCleanup = this.now();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -1,2 +1,260 @@
|
|
|
1
|
-
|
|
2
|
-
const _0x3c12cd=_0x9bb4;function _0x9bb4(_0x340e34,_0x453dc3){_0x340e34=_0x340e34-(0xaf5+-0x23b+0x713*-0x1);const _0x477dd5=_0x2183();let _0x31eec1=_0x477dd5[_0x340e34];if(_0x9bb4['PbhRgu']===undefined){var _0x1fc72c=function(_0x386953){const _0x182fe0='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1180af='',_0x4a9661='';for(let _0x50ca43=0x19fb+0xbed+-0x25e8,_0x42570a,_0x4439b7,_0x46161c=0x183f*0x1+-0x2*-0x108d+-0x3959;_0x4439b7=_0x386953['charAt'](_0x46161c++);~_0x4439b7&&(_0x42570a=_0x50ca43%(0x4d1+0xdb8+0x1285*-0x1)?_0x42570a*(-0xe6a+0x1*0x21e9+-0x1*0x133f)+_0x4439b7:_0x4439b7,_0x50ca43++%(-0x8*-0xca+0xed0+0x1c*-0xc1))?_0x1180af+=String['fromCharCode'](0x61e*0x1+-0x4*-0x67a+-0x1f07&_0x42570a>>(-(0x57c+-0x2275+0x9a9*0x3)*_0x50ca43&0x40d*0x1+0xc80+-0x1087)):0x1c3c+0x2b*-0x97+0x5*-0x93){_0x4439b7=_0x182fe0['indexOf'](_0x4439b7);}for(let _0x3300e0=-0x1fa5+0x21f2+-0x24d,_0x57c96f=_0x1180af['length'];_0x3300e0<_0x57c96f;_0x3300e0++){_0x4a9661+='%'+('00'+_0x1180af['charCodeAt'](_0x3300e0)['toString'](-0x19a6+-0xc0e+0x25c4))['slice'](-(-0x216a+0x216a+0x2));}return decodeURIComponent(_0x4a9661);};_0x9bb4['RheDdR']=_0x1fc72c,_0x9bb4['vdEpJx']={},_0x9bb4['PbhRgu']=!![];}const _0x5833fc=_0x477dd5[0x45f*0x3+-0xa9a+-0x283];_0x9bb4['eZSLjP']!==_0x5833fc&&(_0x9bb4['vdEpJx']={},_0x9bb4['eZSLjP']=_0x5833fc);const _0xe9c3e6=_0x9bb4['vdEpJx'][_0x340e34];return _0xe9c3e6===undefined?(_0x31eec1=_0x9bb4['RheDdR'](_0x31eec1),_0x9bb4['vdEpJx'][_0x340e34]=_0x31eec1):_0x31eec1=_0xe9c3e6,_0x31eec1;}(function(_0x59bbf5,_0x396b0d){const _0x135222=_0x9bb4,_0x2f18bd=_0x59bbf5();while(!![]){try{const _0x7100aa=parseInt(_0x135222(0x1c0))/(-0x1*0x2597+0xe9b*-0x1+0x3433)+parseInt(_0x135222(0x1bf))/(-0x14c*0x1+-0x1*0x823+0x1*0x971)*(-parseInt(_0x135222(0x1ce))/(-0x1614+0x1a33*-0x1+0x1*0x304a))+-parseInt(_0x135222(0x1ba))/(0x714*-0x2+0x2*0xa3d+0x1*-0x64e)*(-parseInt(_0x135222(0x1fb))/(-0x1*0x1409+0x17b*0xa+0x540))+-parseInt(_0x135222(0x208))/(-0x13da+0x12a4+0x4f*0x4)*(-parseInt(_0x135222(0x1f8))/(0x1c9a+-0x18cd+-0x2e*0x15))+parseInt(_0x135222(0x1af))/(-0x17*0x83+0x35*-0x65+0x2*0x105b)+parseInt(_0x135222(0x1ab))/(-0x1114*0x1+0xc3f+0x4de)*(-parseInt(_0x135222(0x1ef))/(-0x842+-0xff*0x19+0x2133))+-parseInt(_0x135222(0x1d4))/(-0x35b+-0x186e+0x1bd4);if(_0x7100aa===_0x396b0d)break;else _0x2f18bd['push'](_0x2f18bd['shift']());}catch(_0x28b3ba){_0x2f18bd['push'](_0x2f18bd['shift']());}}}(_0x2183,-0x12897*-0xf+-0x86203*-0x1+-0x10e435));import{mcpRuntimeDescriptorSchema}from'@myagentroam/protocol';function _0x2183(){const _0x96ff78=['nZjyC1bHquG','DhjHBNnWB3j0','Bw9KzwXZ','BMf0AxzLqwXPyxnLC0zVCG','C2fMzvbHCNnL','BMf0AxzLsw1Hz2vsB290CW','ywnJzxnZt3b0Aw9UCW','DxnLC1j1BM5LCLrPDgXLrM9YuMvUyw1L','Bw9KzwW','BwfUywDLzfj1BKzVCK5HDgL2zvr1CM4','C2vYDMvYtMfTzq','yxjNDw1LBNrZ','zMLUza','y29TBwfUza','x19TyxjnAxnZAw9U','ChjLC2vUDfnLC3nPB24','C3vWCg9YDhndB25MAwD1CMf0Aw9U','yxjNCW','nZC4ntLsAgjpuK0','BwnWq29UzMLNDxjHDgLVBG','C29Tzq','AxnbCNjHEq','ntuZodryuKfJtee','CMvHze1HBMfNzwrsDw5UzxjuAxrSzq','C3rHCNrnyw5Hz2vKuNvU','rvHfq1vusu9o','zM9YA05HDgL2zq','zgf0yq','yMLUzenVBNrYB2W','zxH0zxjUywXtzxnZAw9Uswq','zxHLy3v0zunVBw1HBMq','y2HHBM5LBfrVA2vU','ChvZAa','mZmYohfLwu1kyq','zxHLy3v0zq','C2vYDMLJzvrPzxi','BwfUywDLzefSAwfZswq','zw5KCg9PBNq','nZCWmdzJuMThB3m','otC3nZm0DhHMr1Pm','uKvkrunuruq','ywr2zxj0AxnLza','CMvHzenVBNzLCNnHDgLVBKHPC3rVCNK','zxHLy3v0zuDSB2jHBenVBw1HBMq','ChjLCgfYzu1LC3nHz2vjBNb1Da','DxjS','C3vWCg9YDgvKrwzMB3j0CW','ywnJzxnZ','C3vJy2vZCW','zxzLCNK','BMfTzq','CMvQzwn0','CNvUDgLTzq','ntDxsxbAENq','uLvotKvsx0nptLrst0XFtK9ux0jpvu5eoG','CMvZCg9UzfvZzxjjBNb1Da','C3rHCNq','ywnJzxb0C1rYDw5JyxrLze5HDgL2zuHPC3rVCNK','ChjVzMLSzuzVCLzHBgLKyxrPB24','otaWmdaYnfDbsxrtsq','zM9Yz2v0tMf0AxzLqwXPyxm','uLvotKvsx0nptu1btKrFvu5bvKfjtefcteu','u1resu8','CMvTB3zLtMf0AxzL','y2fUy2vS','B2jQzwn0','C2vZC2LVBI5WCMvZzw50yxrPB24','D29YA3nWywnLswq','zgvSAxzLCKnOyw5UzwW','zgvJAwrLqxbWCM92ywW','CNvUBMvYvgL0Bgu','C2f2zu5HDgL2zvnLC3nPB25nzxrHzgf0yq','C2vZC2LVBI5YzxDPBMq','zwzMB3j0','zw5HyMXLza','y2fWywjPBgL0Eq','ywnJzxb0C1j1BG','CM9SBgjHy2ToyxrPDMu','uLvotKvsx0nbuefcsuXjvfLFvu5tvvbqt1juruq','y29UzMLNDxjHDgLVBG','z2XVyMfSlwnVBw1HBMq','C2vJCMv0tMfTzq','DgL0Bgu','C2vZC2LVBI5YB2XSyMfJAW','AgvHzgvYCW','CNvUBMvY','mZKWtgrlqMP3','zMLSDgvY','CMvMCMvZAfbYB2zPBgu','ChjVAMvJDgvKuNvUBMvYvgL0Bgu','C3rYAw5N','CMvUyw1LtMf0AxzL','CMvHzev4DgvYBMfSqwn0AxzPDhK','sfruua','zw52AxjVBM1LBNq','ntG5mZCYDeTPEwXp','uLvotKvsx0nptLrst0XFquXsrufewv9ct1vordO','Aw50zxjJzxb0C1j1BNm','mJG0nxHmzw9duG','y29UDhjVBa','BMf0AxzL','y2fUy2vStwfUywDLzfj1BG','ChjVzMLSzq','y29TBwfUzenVBNrYB2W','CMvTzw1Izxjnyw5Hz2vKtMf0AxzL','uLvotKvsx0nptu1btKrFq09ovfjptf9btfjfqurzx0jpvu5eoG','yMLUzenVBw1HBMrdB250CM9S','CgLUBMvK','zw50CMLLCW','Aw5JBhvKzxm','CMvHze9MzMLJAwfSq29UDMvYC2f0Aw9U'];_0x2183=function(){return _0x96ff78;};return _0x2183();}export class AbstractRunner{[_0x3c12cd(0x1fc)];[_0x3c12cd(0x200)];[_0x3c12cd(0x1c2)]=!![];[_0x3c12cd(0x1fa)]=![];async[_0x3c12cd(0x1f1)](_0xcfdaeb,_0x4d47f1,_0x58174a={}){const _0x15b2b0=_0x3c12cd;return void[_0x4d47f1,_0x58174a],this[_0x15b2b0(0x1ff)](_0xcfdaeb);}[_0x3c12cd(0x1a9)](_0x4ed9eb,_0x5ebbe0,_0x4db3b3){const _0x31896d=_0x3c12cd;void[_0x5ebbe0,_0x4db3b3];const _0x2790d5=this[_0x31896d(0x1d3)](),_0x17a0e4=_0x2790d5[_0x31896d(0x20a)][_0x31896d(0x214)](_0x359171=>_0x359171['id']===_0x4ed9eb[_0x31896d(0x210)]);return _0x4ed9eb[_0x31896d(0x1ee)]===this[_0x31896d(0x1cb)]&&_0x17a0e4!==undefined&&_0x17a0e4[_0x31896d(0x1c7)][_0x31896d(0x206)](_0x4ed9eb[_0x31896d(0x1e2)])&&_0x2790d5[_0x31896d(0x20e)][_0x31896d(0x1ad)](_0x406eeb=>_0x406eeb['id']===_0x4ed9eb[_0x31896d(0x1c8)]);}[_0x3c12cd(0x1a8)](_0x131db8,_0x130dce,_0x56a2e6){const _0xe98fb2=_0x3c12cd;void[_0x131db8,_0x130dce,_0x56a2e6];throw new RunnerCapabilityError(this[_0xe98fb2(0x1cb)],_0xe98fb2(0x1db));}[_0x3c12cd(0x1c5)](_0x5c484e,_0x1e17fa){return void _0x1e17fa,_0x5c484e;}[_0x3c12cd(0x1ac)](_0x59137c,_0x151138){return resolvedMcpServers(_0x59137c,_0x151138);}[_0x3c12cd(0x1b8)](_0x48df0a){return void _0x48df0a,undefined;}[_0x3c12cd(0x1dd)](_0x301b42,_0x5e95b0,_0x2e4a2e,_0x376405,_0x41c460,_0x2fe8fa){const _0x261d5f=_0x3c12cd;return void[_0x301b42,_0x5e95b0,_0x2e4a2e,_0x376405,_0x41c460,_0x2fe8fa],_0x261d5f(0x1c1);}[_0x3c12cd(0x1c4)](_0x1d8b0a,_0x130e69){const _0x241b7a=_0x3c12cd;void[_0x1d8b0a,_0x130e69];throw new RunnerCapabilityError(this[_0x241b7a(0x1cb)],_0x241b7a(0x1e9));}[_0x3c12cd(0x1bc)](){return undefined;}[_0x3c12cd(0x20f)](){return![];}async[_0x3c12cd(0x1f4)](_0x43b0b5,_0x470dce,_0x372753){const _0x3568ce=_0x3c12cd;if(_0x43b0b5[_0x3568ce(0x1b6)]===null)return;_0x372753[_0x3568ce(0x1e0)]({'runner':_0x43b0b5[_0x3568ce(0x1ee)],'externalSessionId':_0x43b0b5[_0x3568ce(0x1b6)],'workspaceId':_0x43b0b5[_0x3568ce(0x1dc)],..._0x470dce[_0x3568ce(0x1eb)]===undefined?{}:{'customTitle':_0x470dce[_0x3568ce(0x1eb)]},..._0x470dce[_0x3568ce(0x204)]===undefined?{}:{'pinned':_0x470dce[_0x3568ce(0x204)]}});}async[_0x3c12cd(0x1d8)](_0x4f4ed5,_0x497663){return void[_0x4f4ed5,_0x497663],![];}async[_0x3c12cd(0x1b3)](_0x5e2fcc,_0x40fe89,_0x1e75be){const _0x3dc3f7=_0x3c12cd;void[_0x5e2fcc,_0x40fe89,_0x1e75be];throw new RunnerCapabilityError(this[_0x3dc3f7(0x1cb)],_0x3dc3f7(0x1e1));}async[_0x3c12cd(0x1e6)](_0x3f8987,_0x36625e){const _0x104969=_0x3c12cd;void[_0x3f8987,_0x36625e];throw new RunnerCapabilityError(this[_0x104969(0x1cb)],_0x104969(0x1ec));}[_0x3c12cd(0x1f2)](_0x5a1f76,_0x2c0cc7,_0xab603b){const _0x54060a=_0x3c12cd;return void _0xab603b,_0x2c0cc7[_0x54060a(0x1eb)]??_0x5a1f76?.[_0x54060a(0x1df)]??null;}[_0x3c12cd(0x1bd)](_0x364ef2){return void _0x364ef2,undefined;}[_0x3c12cd(0x20b)](_0x518efb){return void _0x518efb,[];}[_0x3c12cd(0x1d5)](_0x34a234){void _0x34a234;}[_0x3c12cd(0x201)](_0x3ef190,_0x497655){void[_0x3ef190,_0x497655];}async[_0x3c12cd(0x1b0)](_0x58d293,_0x22773f){return void[_0x58d293,_0x22773f],undefined;}async[_0x3c12cd(0x207)](_0x675c7b,_0x5225dd,_0x10bbaa){return void[_0x675c7b,_0x5225dd,_0x10bbaa],undefined;}async[_0x3c12cd(0x1c3)](_0x152a2f){const _0x2a7af2=_0x3c12cd,_0x3606ec=await _0x152a2f[_0x2a7af2(0x1fd)]();return _0x3606ec===undefined?undefined:{..._0x3606ec,'source':_0x2a7af2(0x1fd)};}async[_0x3c12cd(0x1f5)](_0x423882){return void _0x423882,undefined;}[_0x3c12cd(0x1d2)](){return!![];}[_0x3c12cd(0x20d)](_0x495c61){return void _0x495c61,[];}[_0x3c12cd(0x211)](_0x3b712c){return void _0x3b712c,undefined;}[_0x3c12cd(0x1b5)](_0x91117d){const _0x37e425=_0x3c12cd;if(this[_0x37e425(0x1fc)]!==undefined)throw new Error(_0x37e425(0x1f9)+this[_0x37e425(0x1cb)]);this[_0x37e425(0x1fc)]=_0x91117d;}[_0x3c12cd(0x1e5)](_0x591e0c){const _0x17f520=_0x3c12cd;return this[_0x17f520(0x1fa)]||_0x591e0c===this[_0x17f520(0x1cb)];}[_0x3c12cd(0x1b1)](_0x712f5d){const _0x5e35ae=_0x3c12cd;if(this[_0x5e35ae(0x1fc)]===undefined)throw new Error(_0x5e35ae(0x1cf)+this[_0x5e35ae(0x1cb)]);this[_0x5e35ae(0x1fc)][_0x5e35ae(0x1d1)](_0x712f5d);}[_0x3c12cd(0x1fe)](_0x2e748d,_0x28d345){const _0x305433=_0x3c12cd;return this[_0x305433(0x1fc)]?.[_0x305433(0x1d9)](_0x2e748d,_0x28d345)===!![];}[_0x3c12cd(0x1de)](_0x10629b){const _0x1b59fa=_0x3c12cd;return this[_0x1b59fa(0x1fc)]?.[_0x1b59fa(0x1de)]?.(_0x10629b)===!![];}[_0x3c12cd(0x1d0)](_0x20f945,_0x82282c,_0x2817fb){const _0x364310=_0x3c12cd;return this[_0x364310(0x1fc)]?.[_0x364310(0x1d0)]?.(_0x20f945,_0x82282c,_0x2817fb)===!![];}[_0x3c12cd(0x203)](_0xe7a370){const _0x20ccae=_0x3c12cd;if(this[_0x20ccae(0x200)]!==undefined)throw new Error(_0x20ccae(0x202)+this[_0x20ccae(0x1cb)]);this[_0x20ccae(0x200)]=_0xe7a370;}[_0x3c12cd(0x1b7)](_0x6e8546,_0x587856,_0x2f8407,_0x2e828a){const _0x29debf=_0x3c12cd;if(this[_0x29debf(0x200)]===undefined)return Promise[_0x29debf(0x1cc)](new Error(_0x29debf(0x1d6)));return this[_0x29debf(0x200)][_0x29debf(0x1bb)](_0x6e8546,_0x587856,_0x2f8407,_0x2e828a);}}function resolvedMcpServers(_0x14abf1,_0x3fb20e){const _0x24d48a=_0x3c12cd;if(!Array[_0x24d48a(0x1ae)](_0x14abf1))return[];const _0x22bf54=[];for(const _0x5c587e of _0x14abf1){if(_0x5c587e===null||typeof _0x5c587e!==_0x24d48a(0x1da)||Array[_0x24d48a(0x1ae)](_0x5c587e))continue;const _0x52c211=_0x5c587e;if(typeof _0x52c211[_0x24d48a(0x212)]!==_0x24d48a(0x1f3)||_0x52c211[_0x24d48a(0x1e3)]!==!![])continue;if(_0x52c211[_0x24d48a(0x1a7)]===!![]&&typeof _0x52c211[_0x24d48a(0x215)]===_0x24d48a(0x1f3)&&Array[_0x24d48a(0x1ae)](_0x52c211[_0x24d48a(0x1aa)])&&_0x52c211[_0x24d48a(0x1aa)][_0x24d48a(0x1ca)](_0x453dc3=>typeof _0x453dc3===_0x24d48a(0x1f3))&&typeof _0x52c211[_0x24d48a(0x1be)]===_0x24d48a(0x1f3)&&typeof _0x52c211[_0x24d48a(0x1ea)]===_0x24d48a(0x1f3)&&_0x3fb20e[_0x52c211[_0x24d48a(0x1ea)]]!==undefined){_0x22bf54[_0x24d48a(0x1b9)]({'name':_0x52c211[_0x24d48a(0x212)],'lifecycle':_0x24d48a(0x1b2),'transport':_0x24d48a(0x1d7),'command':_0x52c211[_0x24d48a(0x215)],'args':_0x52c211[_0x24d48a(0x1aa)],'environment':{'MAR_MISSION_MCP_ENDPOINT':_0x52c211[_0x24d48a(0x1be)],'MAR_MISSION_MCP_TOKEN':_0x3fb20e[_0x52c211[_0x24d48a(0x1ea)]]}});continue;}const _0x476cf=mcpRuntimeDescriptorSchema[_0x24d48a(0x20c)](_0x52c211[_0x24d48a(0x1cd)]);if(!_0x476cf[_0x24d48a(0x1c9)])continue;const _0xce6a1f=isRecord(_0x52c211[_0x24d48a(0x1e8)])?_0x52c211[_0x24d48a(0x1e8)]:{},_0x340e34=_0x477dd5=>{const _0x1e0b9b=_0x24d48a;if(!isRecord(_0x477dd5))return{};const _0x31eec1={};for(const [_0x1fc72c,_0x5833fc]of Object[_0x1e0b9b(0x205)](_0x477dd5)){if(!isRecord(_0x5833fc)||typeof _0x5833fc[_0x1e0b9b(0x1ea)]!==_0x1e0b9b(0x1f3))return undefined;const _0xe9c3e6=_0x3fb20e[_0x5833fc[_0x1e0b9b(0x1ea)]];if(_0xe9c3e6===undefined)return undefined;_0x31eec1[_0x1fc72c]=_0xe9c3e6;}return _0x31eec1;};if(_0x476cf[_0x24d48a(0x1b4)][_0x24d48a(0x209)]===_0x24d48a(0x1d7)){const _0x386953=_0x340e34(_0x476cf[_0x24d48a(0x1b4)][_0x24d48a(0x1f7)]),_0x182fe0=_0x340e34(_0xce6a1f[_0x24d48a(0x1f7)]);if(_0x386953===undefined||_0x182fe0===undefined)continue;_0x22bf54[_0x24d48a(0x1b9)]({'name':_0x52c211[_0x24d48a(0x212)],'transport':_0x24d48a(0x1d7),'command':_0x476cf[_0x24d48a(0x1b4)][_0x24d48a(0x215)],'args':[..._0x476cf[_0x24d48a(0x1b4)][_0x24d48a(0x1aa)],...Array[_0x24d48a(0x1ae)](_0xce6a1f[_0x24d48a(0x213)])?_0xce6a1f[_0x24d48a(0x213)][_0x24d48a(0x1f0)](_0x1180af=>typeof _0x1180af===_0x24d48a(0x1f3)):[]],'environment':{..._0x386953,..._0x182fe0}});}else{const _0x4a9661=_0x340e34(_0x476cf[_0x24d48a(0x1b4)][_0x24d48a(0x1ed)]),_0x50ca43=_0x340e34(_0xce6a1f[_0x24d48a(0x1ed)]);if(_0x4a9661===undefined||_0x50ca43===undefined)continue;_0x22bf54[_0x24d48a(0x1b9)]({'name':_0x52c211[_0x24d48a(0x212)],'transport':_0x24d48a(0x1f6),'url':_0x476cf[_0x24d48a(0x1b4)][_0x24d48a(0x1c6)],'headers':{..._0x4a9661,..._0x50ca43}});}}return _0x22bf54;}function isRecord(_0x42570a){const _0x439b56=_0x3c12cd;return _0x42570a!==null&&typeof _0x42570a===_0x439b56(0x1da)&&!Array[_0x439b56(0x1ae)](_0x42570a);}export class RunnerCapabilityError extends Error{[_0x3c12cd(0x1ee)];[_0x3c12cd(0x1e4)];constructor(_0x4439b7,_0x46161c){const _0x30bbd1=_0x3c12cd;super(_0x30bbd1(0x1e7)),this[_0x30bbd1(0x1ee)]=_0x4439b7,this[_0x30bbd1(0x1e4)]=_0x46161c;}}
|
|
1
|
+
import { mcpRuntimeDescriptorSchema } from '@myagentroam/protocol';
|
|
2
|
+
/**
|
|
3
|
+
* Stable lifecycle boundary for every Node Runner implementation.
|
|
4
|
+
*
|
|
5
|
+
* Vendor clients and payload decoders stay behind subclasses. Domain services
|
|
6
|
+
* depend on this boundary (or a capability interface implemented by it), never
|
|
7
|
+
* on an SDK/App Server client directly.
|
|
8
|
+
*/
|
|
9
|
+
export class AbstractRunner {
|
|
10
|
+
control;
|
|
11
|
+
commandControl;
|
|
12
|
+
/** Test-only runners are registered explicitly but never advertised. */
|
|
13
|
+
advertised = true;
|
|
14
|
+
interceptsRuns = false;
|
|
15
|
+
async refreshProfile(capabilities, workspace, environment = {}) {
|
|
16
|
+
void [workspace, environment];
|
|
17
|
+
return this.profile(capabilities);
|
|
18
|
+
}
|
|
19
|
+
supportsConfiguration(configuration, workspace, environment) {
|
|
20
|
+
void [workspace, environment];
|
|
21
|
+
const profile = this.profileForValidation();
|
|
22
|
+
const model = profile.models.find((candidate) => candidate.id === configuration.model);
|
|
23
|
+
return (configuration.runner === this.name &&
|
|
24
|
+
model !== undefined &&
|
|
25
|
+
model.supportedEfforts.includes(configuration.effort) &&
|
|
26
|
+
profile.accessOptions.some((candidate) => candidate.id === configuration.access));
|
|
27
|
+
}
|
|
28
|
+
presentSession(session, capabilities, context) {
|
|
29
|
+
void [session, capabilities, context];
|
|
30
|
+
throw new RunnerCapabilityError(this.name, 'session.presentation');
|
|
31
|
+
}
|
|
32
|
+
prepareMessageInput(input, collaborationMode) {
|
|
33
|
+
void collaborationMode;
|
|
34
|
+
return input;
|
|
35
|
+
}
|
|
36
|
+
mcpConfiguration(rawInstallations, secretEnvironment) {
|
|
37
|
+
return resolvedMcpServers(rawInstallations, secretEnvironment);
|
|
38
|
+
}
|
|
39
|
+
channelToken(sessionId) {
|
|
40
|
+
void sessionId;
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
deliverChannel(sessionId, messageId, senderId, token, content, notify) {
|
|
44
|
+
void [sessionId, messageId, senderId, token, content, notify];
|
|
45
|
+
return 'REJECTED';
|
|
46
|
+
}
|
|
47
|
+
executeGlobalCommand(commandId, input) {
|
|
48
|
+
void [commandId, input];
|
|
49
|
+
throw new RunnerCapabilityError(this.name, 'global-command');
|
|
50
|
+
}
|
|
51
|
+
serviceTier() {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
usesRunnerTitleForRename() {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
async renameNative(session, input, database) {
|
|
58
|
+
if (session.externalSessionId === null)
|
|
59
|
+
return;
|
|
60
|
+
database.saveNativeSessionMetadata({
|
|
61
|
+
runner: session.runner,
|
|
62
|
+
externalSessionId: session.externalSessionId,
|
|
63
|
+
workspaceId: session.workspaceId,
|
|
64
|
+
...(input.title === undefined ? {} : { customTitle: input.title }),
|
|
65
|
+
...(input.pinned === undefined ? {} : { pinned: input.pinned })
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async removeNative(session, nativeSessionId) {
|
|
69
|
+
void [session, nativeSessionId];
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
async forkNative(session, boundary, title) {
|
|
73
|
+
void [session, boundary, title];
|
|
74
|
+
throw new RunnerCapabilityError(this.name, 'session.rewind');
|
|
75
|
+
}
|
|
76
|
+
async rollbackNative(session, boundary) {
|
|
77
|
+
void [session, boundary];
|
|
78
|
+
throw new RunnerCapabilityError(this.name, 'session.rollback');
|
|
79
|
+
}
|
|
80
|
+
async clearNative(session) {
|
|
81
|
+
void session;
|
|
82
|
+
throw new RunnerCapabilityError(this.name, 'session.clear');
|
|
83
|
+
}
|
|
84
|
+
projectedRunnerTitle(metadata, input, database) {
|
|
85
|
+
void database;
|
|
86
|
+
return input.title ?? metadata?.runnerTitle ?? null;
|
|
87
|
+
}
|
|
88
|
+
managedAliasId(nativeSessionId) {
|
|
89
|
+
void nativeSessionId;
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
nativeAliasesFor(managedSessionId) {
|
|
93
|
+
void managedSessionId;
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
forgetNativeAlias(nativeSessionId) {
|
|
97
|
+
void nativeSessionId;
|
|
98
|
+
}
|
|
99
|
+
rememberManagedNative(session, nativeSessionId) {
|
|
100
|
+
void [session, nativeSessionId];
|
|
101
|
+
}
|
|
102
|
+
async readManagedRunnerTitle(session, nativeSessionId) {
|
|
103
|
+
void [session, nativeSessionId];
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
async readOfficialConversation(session, input, managedTurn) {
|
|
107
|
+
void [session, input, managedTurn];
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
async readConversationHistory(readers) {
|
|
111
|
+
const page = await readers.native();
|
|
112
|
+
return page === undefined ? undefined : { ...page, source: 'native' };
|
|
113
|
+
}
|
|
114
|
+
async readExternalActivity(session) {
|
|
115
|
+
void session;
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
acceptsTruncatedNativeHistory() {
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
nativeImageRoots(session) {
|
|
122
|
+
void session;
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
managedRunForNativeTurn(nativeTurnId) {
|
|
126
|
+
void nativeTurnId;
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
bindControl(control) {
|
|
130
|
+
if (this.control !== undefined)
|
|
131
|
+
throw new Error(`RUNNER_CONTROL_ALREADY_BOUND:${this.name}`);
|
|
132
|
+
this.control = control;
|
|
133
|
+
}
|
|
134
|
+
acceptsRun(runner) {
|
|
135
|
+
return this.interceptsRuns || runner === this.name;
|
|
136
|
+
}
|
|
137
|
+
startManagedRun(envelope) {
|
|
138
|
+
if (this.control === undefined)
|
|
139
|
+
throw new Error(`RUNNER_CONTROL_NOT_BOUND:${this.name}`);
|
|
140
|
+
this.control.start(envelope);
|
|
141
|
+
}
|
|
142
|
+
cancelManagedRun(runId, intent) {
|
|
143
|
+
return this.control?.cancel(runId, intent) === true;
|
|
144
|
+
}
|
|
145
|
+
decideApproval(input) {
|
|
146
|
+
return this.control?.decideApproval?.(input) === true;
|
|
147
|
+
}
|
|
148
|
+
respondUserInput(runId, requestId, answers) {
|
|
149
|
+
return this.control?.respondUserInput?.(runId, requestId, answers) === true;
|
|
150
|
+
}
|
|
151
|
+
bindCommandControl(control) {
|
|
152
|
+
if (this.commandControl !== undefined)
|
|
153
|
+
throw new Error(`RUNNER_COMMAND_CONTROL_ALREADY_BOUND:${this.name}`);
|
|
154
|
+
this.commandControl = control;
|
|
155
|
+
}
|
|
156
|
+
executeCommand(session, command, input, context) {
|
|
157
|
+
if (this.commandControl === undefined)
|
|
158
|
+
return Promise.reject(new Error('RUNNER_COMMAND_UNAVAILABLE'));
|
|
159
|
+
return this.commandControl.execute(session, command, input, context);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function resolvedMcpServers(raw, secrets) {
|
|
163
|
+
if (!Array.isArray(raw))
|
|
164
|
+
return [];
|
|
165
|
+
const result = [];
|
|
166
|
+
for (const value of raw) {
|
|
167
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
168
|
+
continue;
|
|
169
|
+
const record = value;
|
|
170
|
+
if (typeof record['serverName'] !== 'string' || record['enabled'] !== true)
|
|
171
|
+
continue;
|
|
172
|
+
if (record['__marMission'] === true &&
|
|
173
|
+
typeof record['command'] === 'string' &&
|
|
174
|
+
Array.isArray(record['args']) &&
|
|
175
|
+
record['args'].every((value) => typeof value === 'string') &&
|
|
176
|
+
typeof record['endpoint'] === 'string' &&
|
|
177
|
+
typeof record['secretName'] === 'string' &&
|
|
178
|
+
secrets[record['secretName']] !== undefined) {
|
|
179
|
+
result.push({
|
|
180
|
+
name: record['serverName'],
|
|
181
|
+
lifecycle: 'EXECUTION',
|
|
182
|
+
transport: 'STDIO',
|
|
183
|
+
command: record['command'],
|
|
184
|
+
args: record['args'],
|
|
185
|
+
environment: {
|
|
186
|
+
MAR_MISSION_MCP_ENDPOINT: record['endpoint'],
|
|
187
|
+
MAR_MISSION_MCP_TOKEN: secrets[record['secretName']]
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
const runtime = mcpRuntimeDescriptorSchema.safeParse(record['runtime']);
|
|
193
|
+
if (!runtime.success)
|
|
194
|
+
continue;
|
|
195
|
+
const configuration = isRecord(record['configuration']) ? record['configuration'] : {};
|
|
196
|
+
const resolveReferences = (candidate) => {
|
|
197
|
+
if (!isRecord(candidate))
|
|
198
|
+
return {};
|
|
199
|
+
const result = {};
|
|
200
|
+
for (const [name, reference] of Object.entries(candidate)) {
|
|
201
|
+
if (!isRecord(reference) || typeof reference['secretName'] !== 'string')
|
|
202
|
+
return undefined;
|
|
203
|
+
const secret = secrets[reference['secretName']];
|
|
204
|
+
if (secret === undefined)
|
|
205
|
+
return undefined;
|
|
206
|
+
result[name] = secret;
|
|
207
|
+
}
|
|
208
|
+
return result;
|
|
209
|
+
};
|
|
210
|
+
if (runtime.data.transport === 'STDIO') {
|
|
211
|
+
const runtimeEnvironment = resolveReferences(runtime.data.environment);
|
|
212
|
+
const configuredEnvironment = resolveReferences(configuration['environment']);
|
|
213
|
+
if (runtimeEnvironment === undefined || configuredEnvironment === undefined)
|
|
214
|
+
continue;
|
|
215
|
+
result.push({
|
|
216
|
+
name: record['serverName'],
|
|
217
|
+
transport: 'STDIO',
|
|
218
|
+
command: runtime.data.command,
|
|
219
|
+
args: [
|
|
220
|
+
...runtime.data.args,
|
|
221
|
+
...(Array.isArray(configuration['arguments'])
|
|
222
|
+
? configuration['arguments'].filter((item) => typeof item === 'string')
|
|
223
|
+
: [])
|
|
224
|
+
],
|
|
225
|
+
environment: {
|
|
226
|
+
...runtimeEnvironment,
|
|
227
|
+
...configuredEnvironment
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
const runtimeHeaders = resolveReferences(runtime.data.headers);
|
|
233
|
+
const configuredHeaders = resolveReferences(configuration['headers']);
|
|
234
|
+
if (runtimeHeaders === undefined || configuredHeaders === undefined)
|
|
235
|
+
continue;
|
|
236
|
+
result.push({
|
|
237
|
+
name: record['serverName'],
|
|
238
|
+
transport: 'HTTP',
|
|
239
|
+
url: runtime.data.url,
|
|
240
|
+
headers: {
|
|
241
|
+
...runtimeHeaders,
|
|
242
|
+
...configuredHeaders
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return result;
|
|
248
|
+
}
|
|
249
|
+
function isRecord(value) {
|
|
250
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
251
|
+
}
|
|
252
|
+
export class RunnerCapabilityError extends Error {
|
|
253
|
+
runner;
|
|
254
|
+
capability;
|
|
255
|
+
constructor(runner, capability) {
|
|
256
|
+
super('RUNNER_CAPABILITY_UNSUPPORTED');
|
|
257
|
+
this.runner = runner;
|
|
258
|
+
this.capability = capability;
|
|
259
|
+
}
|
|
260
|
+
}
|