@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/runner-usage.js
CHANGED
|
@@ -1,2 +1,190 @@
|
|
|
1
|
-
|
|
2
|
-
const _0x563799=_0x379f;(function(_0x49fef2,_0x14c3d0){const _0x54f947=_0x379f,_0x3b42b1=_0x49fef2();while(!![]){try{const _0x37d6e1=parseInt(_0x54f947(0x1c6))/(-0x53*-0x22+0x1d*0x6b+-0x1724)+parseInt(_0x54f947(0x1c8))/(-0x54*0x13+-0x23bf*-0x1+-0x1d81)+-parseInt(_0x54f947(0x1a2))/(-0x216+-0x17*0xe9+0x1708)+parseInt(_0x54f947(0x1d7))/(0x13e9+0x9*-0x2e7+0x63a)*(parseInt(_0x54f947(0x199))/(0xfd1*-0x1+-0x1bb9*0x1+-0x15*-0x213))+parseInt(_0x54f947(0x1ce))/(-0x16cd+-0x1bc0+0x3293)+parseInt(_0x54f947(0x1a3))/(-0x247*-0x11+-0xe31*-0x1+-0x34e1)+-parseInt(_0x54f947(0x1b9))/(0x53*0x3b+-0x2564+-0x1*-0x124b)*(parseInt(_0x54f947(0x18e))/(0x13dd+0x1498+-0xc7*0x34));if(_0x37d6e1===_0x14c3d0)break;else _0x3b42b1['push'](_0x3b42b1['shift']());}catch(_0x26a0cc){_0x3b42b1['push'](_0x3b42b1['shift']());}}}(_0x1a14,-0x1d*-0x8b12+0x3df8*0x1a+-0xb53f6));import{readFile}from'node:fs/promises';import{homedir}from'node:os';import{join}from'node:path';const CODEX_USAGE_URL=_0x563799(0x1c9),CLAUDE_USAGE_URL=_0x563799(0x19a),CREDENTIALS_MAX_BYTES=(-0x963*0x1+-0x7*-0x1f0+-0x32d)*(0x1293+-0x40c*0x5+0x45*0x15),RESPONSE_MAX_BYTES=(-0x2*-0x416+0x12c7+-0x19f3)*(0x1401+-0x1e7*-0x1+-0x11e8),CODEX_CACHE_MS=0x1b897*-0x1+-0xb*-0xbb0+-0x1*-0x22267,CLAUDE_CACHE_MS=(0x3*0x1df+0xb*-0x31f+0x1cbd)*(-0x1d78*0x2+0x1b12d+-0x6a9*0x15);export const USAGE_OAUTH_REQUIRED=_0x563799(0x1a8);export class RunnerUsageReader{[_0x563799(0x1da)];[_0x563799(0x1ca)];[_0x563799(0x1c0)];[_0x563799(0x1bc)]=new Map();constructor(_0x41de37=fetch,_0x2ceccd=homedir(),_0x3be3cb=Date[_0x563799(0x1c0)]){const _0x574e50=_0x563799;this[_0x574e50(0x1da)]=_0x41de37,this[_0x574e50(0x1ca)]=_0x2ceccd,this[_0x574e50(0x1c0)]=_0x3be3cb;}async[_0x563799(0x1d5)](_0x41f0f7){const _0x1f0624=_0x563799;return await this[_0x1f0624(0x1a7)](_0x41f0f7)===undefined?unavailable(_0x41f0f7,USAGE_OAUTH_REQUIRED):{'runner':_0x41f0f7,'available':!![],'reasonCode':null};}async[_0x563799(0x1c4)](_0x28a423){const _0x58734f=_0x563799,_0x16fd03=await this[_0x58734f(0x1d5)](_0x28a423);if(!_0x16fd03[_0x58734f(0x1cc)])throw new Error(_0x16fd03[_0x58734f(0x1c2)]??_0x58734f(0x191));const _0x51a520=this[_0x58734f(0x1bc)][_0x58734f(0x198)](_0x28a423),_0x12279b=this[_0x58734f(0x1c0)]();if(_0x51a520!==undefined&&_0x12279b-_0x51a520[_0x58734f(0x192)]<cacheDuration(_0x28a423))return{..._0x51a520,'cached':!![]};const _0x3953eb=await this[_0x58734f(0x1a7)](_0x28a423);if(_0x3953eb===undefined)throw new Error(USAGE_OAUTH_REQUIRED);const _0x24ef8f=_0x28a423===_0x58734f(0x1d2)?await this[_0x58734f(0x18d)](_0x3953eb,_0x12279b):await this[_0x58734f(0x18b)](_0x3953eb,_0x12279b);return this[_0x58734f(0x1bc)][_0x58734f(0x196)](_0x28a423,_0x24ef8f),_0x24ef8f;}async[_0x563799(0x1a7)](_0x40d746){const _0x566cdc=_0x563799,_0x3a9031=_0x40d746===_0x566cdc(0x1d2)?join(this[_0x566cdc(0x1ca)],_0x566cdc(0x194),_0x566cdc(0x195)):join(this[_0x566cdc(0x1ca)],_0x566cdc(0x1a5),_0x566cdc(0x1be)),_0x2e4e56=await readJson(_0x3a9031);return _0x40d746===_0x566cdc(0x1d2)?codexCredentials(_0x2e4e56):claudeCredentials(_0x2e4e56);}async[_0x563799(0x18d)](_0x58c2ef,_0x26b4f3){const _0x31a99c=_0x563799,_0x4f108e={'Authorization':_0x31a99c(0x1c1)+_0x58c2ef[_0x31a99c(0x190)]};if(_0x58c2ef[_0x31a99c(0x1b4)]!==undefined)_0x4f108e[_0x31a99c(0x1a4)]=_0x58c2ef[_0x31a99c(0x1b4)];const _0x16f0bc=await requestJson(this[_0x31a99c(0x1da)],CODEX_USAGE_URL,_0x4f108e),_0x34d22b=[codexUsageWindow(_0x16f0bc,_0x31a99c(0x1d8)),codexUsageWindow(_0x16f0bc,_0x31a99c(0x1b1))][_0x31a99c(0x19f)](_0x1c23ec=>_0x1c23ec!==undefined);if(_0x34d22b[_0x31a99c(0x1cd)]===-0x1792*-0x1+0x1*0xa60+-0xb*0x316)throw new Error(_0x31a99c(0x1b7));return{'runner':_0x31a99c(0x1d2),'windows':_0x34d22b,'fetchedAt':_0x26b4f3,'cached':![]};}async[_0x563799(0x18b)](_0x2c6016,_0x12c94f){const _0x523ba5=_0x563799,_0x10bbf8=await requestJson(this[_0x523ba5(0x1da)],CLAUDE_USAGE_URL,{'Authorization':_0x523ba5(0x1c1)+_0x2c6016[_0x523ba5(0x190)],'anthropic-beta':_0x523ba5(0x1d6),'Content-Type':_0x523ba5(0x1ba)}),_0x3a5440=[usageWindow(_0x10bbf8,_0x523ba5(0x1a9),_0x523ba5(0x1aa)),usageWindow(_0x10bbf8,_0x523ba5(0x1af),_0x523ba5(0x1d0)),usageWindow(_0x10bbf8,_0x523ba5(0x1b8),_0x523ba5(0x1ab))][_0x523ba5(0x19f)](_0x459779=>_0x459779!==undefined);if(_0x3a5440[_0x523ba5(0x1cd)]===-0x2606+-0x2*0x12c7+0xacc*0x7)throw new Error(_0x523ba5(0x1b7));return{'runner':_0x523ba5(0x19e),'windows':_0x3a5440,'fetchedAt':_0x12c94f,'cached':![]};}}function unavailable(_0x27399d,_0x342b92){return{'runner':_0x27399d,'available':![],'reasonCode':_0x342b92};}function cacheDuration(_0x2db8d4){const _0x52e3b2=_0x563799;return _0x2db8d4===_0x52e3b2(0x1d2)?CODEX_CACHE_MS:CLAUDE_CACHE_MS;}async function readJson(_0x173f6f){const _0x201a7b=_0x563799;try{const _0x21b468=await readFile(_0x173f6f,_0x201a7b(0x1b6));if(_0x21b468[_0x201a7b(0x1cd)]>CREDENTIALS_MAX_BYTES)return undefined;return JSON[_0x201a7b(0x19c)](_0x21b468);}catch{return undefined;}}function codexCredentials(_0x4da139){const _0x582bbc=_0x563799,_0x39798a=record(_0x4da139),_0x1535aa=record(_0x39798a?.[_0x582bbc(0x1ae)])??_0x39798a,_0x9db65=string(_0x1535aa?.[_0x582bbc(0x1ac)])??string(_0x1535aa?.[_0x582bbc(0x190)]);if(_0x9db65===undefined)return undefined;const _0x5aa77c=string(_0x1535aa?.[_0x582bbc(0x193)])??string(_0x1535aa?.[_0x582bbc(0x1b4)])??string(_0x39798a?.[_0x582bbc(0x193)]);return{'accessToken':_0x9db65,..._0x5aa77c===undefined?{}:{'accountId':_0x5aa77c}};}function claudeCredentials(_0x1f5a87){const _0x565aad=_0x563799,_0x1c41aa=record(record(_0x1f5a87)?.[_0x565aad(0x1db)]),_0x132c73=string(_0x1c41aa?.[_0x565aad(0x190)]);return _0x132c73===undefined?undefined:{'accessToken':_0x132c73};}async function requestJson(_0x473a0f,_0x42dadc,_0x185d05){const _0x7625f7=_0x563799,_0x635889=new AbortController(),_0x458d2a=setTimeout(()=>_0x635889[_0x7625f7(0x1d1)](),0xaaf+0x106*0x9+0x1*-0x5d);try{const _0x2b8a0d=await _0x473a0f(_0x42dadc,{'method':_0x7625f7(0x1c5),'headers':_0x185d05,'redirect':_0x7625f7(0x1cb),'signal':_0x635889[_0x7625f7(0x19d)]});if(_0x2b8a0d[_0x7625f7(0x1d5)]===-0x1def+0x9+-0xf*-0x219||_0x2b8a0d[_0x7625f7(0x1d5)]===-0x18+0x2af*0x4+0x1*-0x911)throw new Error(_0x7625f7(0x19b));if(_0x2b8a0d[_0x7625f7(0x1d5)]===0x1a2*-0x1+0x3d5+-0x86)throw new Error(_0x7625f7(0x1c7));if(!_0x2b8a0d['ok'])throw new Error(_0x7625f7(0x1d9));const _0x2386a9=await _0x2b8a0d[_0x7625f7(0x1a0)]();if(_0x2386a9[_0x7625f7(0x1cd)]>RESPONSE_MAX_BYTES)throw new Error(_0x7625f7(0x1b7));return JSON[_0x7625f7(0x19c)](_0x2386a9);}catch(_0x28282d){if(_0x28282d instanceof Error&&_0x28282d[_0x7625f7(0x1ad)]===_0x7625f7(0x1a6))throw new Error(_0x7625f7(0x1d3));throw _0x28282d;}finally{clearTimeout(_0x458d2a);}}function _0x1a14(){const _0x3300f5=['DxnLzf9WzxjJzw50','ywnJB3vUDeLK','ywjZ','DxrMoa','vvnbr0vFuKvtue9ou0vFsu5wquXjra','C2v2zw5Fzgf5x3nVBM5LDa','nZy4ntzPt1b5vMO','yxbWBgLJyxrPB24VANnVBG','CMf0zv9SAw1PDa','y2fJAgu','BNvTyMvY','lMnYzwrLBNrPywXZlMPZB24','CMvZzxrZx2f0','BM93','qMvHCMvYia','CMvHC29Uq29Kzq','DxnLzf9WzxjJzw50ywDL','CMvHza','r0vu','mta0mZq0ow1pEvnLvG','vvnbr0vFuKfurv9msu1jveve','mtCZmZK4mLDgBxD0sa','Ahr0Chm6lY9JAgf0z3b0lMnVBs9IywnRzw5KlwfWAs93AgfTl3vZywDL','Ag9TzvbHDgG','zxjYB3i','yxzHAwXHyMXL','BgvUz3rO','mZe0odGWmgrItgjkwG','zMXVB3i','nY1KyxKGBgLTAxq','ywjVCNq','y29KzxG','vvnbr0vFuKvrvuvtvf9usu1ft1vu','C3rYAw5N','C3rHDhvZ','B2f1DgGTmJaYns0Wnc0Yma','mJC2mZmWnfvWtK9fzq','ChjPBwfYEv93Aw5KB3C','vvnbr0vFuKvrvuvtvf9gquLmruq','zMv0y2HLCG','y2XHDwrLqwLpyxv0Aa','CMvHzenSyxvKzq','AxngAw5PDgu','CMvHzenVzgv4','mJqZoxbVrMPLqG','AxnbCNjHEq','ywnJzxnZvg9Rzw4','vvnbr0vFvu5bvKfjtefcteu','zMv0y2HLzef0','ywnJB3vUDf9Pza','lMnVzgv4','yxv0Ac5QC29U','C2v0','CMvZzxrFyxq','z2v0','mtbrwMzZu1u','Ahr0Chm6lY9HCgKUyw50AhjVCgLJlMnVBs9HCgKVB2f1DgGVDxnHz2u','vvnbr0vFqvvusevoveLdqvrjt05FrKfjteve','CgfYC2u','C2LNBMfS','y2XHDwrLlwnVzgu','zMLSDgvY','Dgv4Da','B2jQzwn0','mtKYmda5ouvwA25bAa','ota0mtKWs01Yu2Di','q2HHDeDqvc1by2nVDw50luLK','lMnSyxvKzq','qwjVCNrfCNjVCG','y3jLzgvUDgLHBhm','t0zgsunjquXFt0fvveHFuKvrvuLsruq','zML2zv9OB3vY','ns1OB3vYigXPBwL0','nY1KyxKGu29UBMv0igXPBwL0','ywnJzxnZx3rVA2vU','BMfTzq','Dg9Rzw5Z','C2v2zw5Fzgf5','BgLTAxrFD2LUzg93x3nLy29Uzhm','C2vJB25Kyxj5x3DPBMrVDW','DxrPBgL6yxrPB24'];_0x1a14=function(){return _0x3300f5;};return _0x1a14();}function usageWindow(_0x140f62,_0x3d255a,_0x3867fa){const _0xab403e=_0x563799,_0x3d2494=record(record(_0x140f62)?.[_0xab403e(0x1bb)])?.[_0x3d255a]??record(_0x140f62)?.[_0x3d255a],_0x5f5146=record(_0x3d2494),_0x3e3671=number(_0x5f5146?.[_0xab403e(0x1b2)])??number(_0x5f5146?.[_0xab403e(0x1c3)])??number(_0x5f5146?.[_0xab403e(0x1b3)]);if(_0x3e3671===undefined||_0x3e3671<-0xf8+-0x2b*-0xc9+-0x20cb||_0x3e3671>0x70f*-0x5+-0x9*0x3b4+-0x4503*-0x1)return undefined;const _0x306542=timestamp(_0x5f5146?.[_0xab403e(0x1bf)])??timestamp(_0x5f5146?.[_0xab403e(0x197)]);return{'id':_0x3d255a,'label':_0x3867fa,'usedPercentage':_0x3e3671,'resetsAt':_0x306542};}function codexUsageWindow(_0x33227c,_0x435149){const _0xcc0666=_0x563799,_0x5505f9=record(record(_0x33227c)?.[_0xcc0666(0x1bb)])?.[_0x435149],_0x754b77=number(record(_0x5505f9)?.[_0xcc0666(0x1b0)]),_0x431629=_0x754b77!==undefined&&approximately(_0x754b77,(0x1a8a+-0xaab+-0xfda)*(0x1*0x1716+0x1*-0x201d+0x943)*(-0x976+-0x1253*-0x1+-0x8a1))?_0xcc0666(0x1aa):_0x754b77!==undefined&&approximately(_0x754b77,(-0x1*-0x14b0+-0x13a*-0x3+-0x1857)*(-0x3*0xaf1+-0xfba+0x30a5)*(-0x3*0x2af+0x18c3+-0x107a)*(-0x38f*0x4+-0x1cf1*-0x1+0x5*-0x2e5))?_0xcc0666(0x1d0):undefined;return _0x431629===undefined?undefined:usageWindow(_0x33227c,_0x435149,_0x431629);}function approximately(_0x23b57f,_0x7c3e32){const _0x539b57=_0x563799;return Math[_0x539b57(0x1b5)](_0x23b57f-_0x7c3e32)/_0x7c3e32<=-0x4*0x925+-0x1fa1+0x4435+0.1;}function record(_0x5e8be9){const _0x4a20d7=_0x563799;return _0x5e8be9!==null&&typeof _0x5e8be9===_0x4a20d7(0x1a1)&&!Array[_0x4a20d7(0x18f)](_0x5e8be9)?_0x5e8be9:undefined;}function string(_0x4d7e4e){const _0x3d7dae=_0x563799;return typeof _0x4d7e4e===_0x3d7dae(0x1d4)&&_0x4d7e4e[_0x3d7dae(0x1cd)]>-0x24a9+0x12ae+-0x1*-0x11fb&&_0x4d7e4e[_0x3d7dae(0x1cd)]<=0x1*-0x1e5+0x8fde+-0x3fd9?_0x4d7e4e:undefined;}function number(_0x1c4906){const _0xe14eef=_0x563799;return typeof _0x1c4906===_0xe14eef(0x1bd)&&Number[_0xe14eef(0x18c)](_0x1c4906)?_0x1c4906:undefined;}function _0x379f(_0x2db247,_0x345d3e){_0x2db247=_0x2db247-(-0x1d8a+-0x222+0x2137);const _0x44eee4=_0x1a14();let _0x5a941f=_0x44eee4[_0x2db247];if(_0x379f['ZQLdFG']===undefined){var _0x1bbaed=function(_0x58e596){const _0x2de7aa='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x540198='',_0x1e2521='';for(let _0x199d7d=-0x8f5+0x13b4+-0x3*0x395,_0x49d436,_0x702759,_0x5d73d7=0xd90+-0x1*-0x3bb+-0x114b;_0x702759=_0x58e596['charAt'](_0x5d73d7++);~_0x702759&&(_0x49d436=_0x199d7d%(0x1293+-0x40c*0x5+0x21*0xd)?_0x49d436*(-0x2*-0x416+0x12c7+-0x1ab3)+_0x702759:_0x702759,_0x199d7d++%(0x1401+-0x1e7*-0x1+-0x15e4))?_0x540198+=String['fromCharCode'](0x24b8*-0x1+-0x1*-0xab7+-0x2*-0xd80&_0x49d436>>(-(0x3*0x1df+0xb*-0x31f+0x1cba)*_0x199d7d&-0x4e9*0x1+0x2419+-0x1f2a*0x1)):-0x1792*-0x1+0x1*0xa60+-0xb*0x316){_0x702759=_0x2de7aa['indexOf'](_0x702759);}for(let _0x5834d2=-0x2606+-0x2*0x12c7+0xacc*0x7,_0x363504=_0x540198['length'];_0x5834d2<_0x363504;_0x5834d2++){_0x1e2521+='%'+('00'+_0x540198['charCodeAt'](_0x5834d2)['toString'](0xaaf+0x106*0x9+0x1*-0x13d5))['slice'](-(-0x1def+0x9+-0x2c*-0xae));}return decodeURIComponent(_0x1e2521);};_0x379f['iitJmZ']=_0x1bbaed,_0x379f['GhXTZI']={},_0x379f['ZQLdFG']=!![];}const _0xd64ebb=_0x44eee4[-0x18+0x2af*0x4+0x1*-0xaa4];_0x379f['sPxKtL']!==_0xd64ebb&&(_0x379f['GhXTZI']={},_0x379f['sPxKtL']=_0xd64ebb);const _0x2e81a2=_0x379f['GhXTZI'][_0x2db247];return _0x2e81a2===undefined?(_0x5a941f=_0x379f['iitJmZ'](_0x5a941f),_0x379f['GhXTZI'][_0x2db247]=_0x5a941f):_0x5a941f=_0x2e81a2,_0x5a941f;}function timestamp(_0x1848db){const _0x60e786=_0x563799;if(typeof _0x1848db===_0x60e786(0x1bd)&&Number[_0x60e786(0x18c)](_0x1848db)&&_0x1848db>=0xc96+0x1616+0xe*-0x27a)return Math[_0x60e786(0x1cf)](_0x1848db<0x46887539b+0x260f6a221+-0x2*0x23ab908de?_0x1848db*(-0x279*-0x9+0x1*-0x1b41+0x8e8):_0x1848db);if(typeof _0x1848db!==_0x60e786(0x1d4))return null;const _0x5039f4=Date[_0x60e786(0x19c)](_0x1848db);return Number[_0x60e786(0x18c)](_0x5039f4)&&_0x5039f4>=-0x19bf+-0x57*-0x35+-0x3*-0x294?_0x5039f4:null;}
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
const CODEX_USAGE_URL = 'https://chatgpt.com/backend-api/wham/usage';
|
|
5
|
+
const CLAUDE_USAGE_URL = 'https://api.anthropic.com/api/oauth/usage';
|
|
6
|
+
const CREDENTIALS_MAX_BYTES = 256 * 1024;
|
|
7
|
+
const RESPONSE_MAX_BYTES = 256 * 1024;
|
|
8
|
+
const CODEX_CACHE_MS = 60_000;
|
|
9
|
+
const CLAUDE_CACHE_MS = 5 * 60_000;
|
|
10
|
+
export const USAGE_OAUTH_REQUIRED = 'OFFICIAL_OAUTH_REQUIRED';
|
|
11
|
+
export class RunnerUsageReader {
|
|
12
|
+
fetcher;
|
|
13
|
+
homePath;
|
|
14
|
+
now;
|
|
15
|
+
cache = new Map();
|
|
16
|
+
constructor(fetcher = fetch, homePath = homedir(), now = Date.now) {
|
|
17
|
+
this.fetcher = fetcher;
|
|
18
|
+
this.homePath = homePath;
|
|
19
|
+
this.now = now;
|
|
20
|
+
}
|
|
21
|
+
async status(runner) {
|
|
22
|
+
return (await this.credentials(runner)) === undefined
|
|
23
|
+
? unavailable(runner, USAGE_OAUTH_REQUIRED)
|
|
24
|
+
: { runner, available: true, reasonCode: null };
|
|
25
|
+
}
|
|
26
|
+
async read(runner) {
|
|
27
|
+
const status = await this.status(runner);
|
|
28
|
+
if (!status.available)
|
|
29
|
+
throw new Error(status.reasonCode ?? 'USAGE_UNAVAILABLE');
|
|
30
|
+
const cached = this.cache.get(runner);
|
|
31
|
+
const now = this.now();
|
|
32
|
+
if (cached !== undefined && now - cached.fetchedAt < cacheDuration(runner)) {
|
|
33
|
+
return { ...cached, cached: true };
|
|
34
|
+
}
|
|
35
|
+
const credentials = await this.credentials(runner);
|
|
36
|
+
if (credentials === undefined)
|
|
37
|
+
throw new Error(USAGE_OAUTH_REQUIRED);
|
|
38
|
+
const usage = runner === 'codex'
|
|
39
|
+
? await this.readCodex(credentials, now)
|
|
40
|
+
: await this.readClaude(credentials, now);
|
|
41
|
+
this.cache.set(runner, usage);
|
|
42
|
+
return usage;
|
|
43
|
+
}
|
|
44
|
+
async credentials(runner) {
|
|
45
|
+
const path = runner === 'codex'
|
|
46
|
+
? join(this.homePath, '.codex', 'auth.json')
|
|
47
|
+
: join(this.homePath, '.claude', '.credentials.json');
|
|
48
|
+
const value = await readJson(path);
|
|
49
|
+
return runner === 'codex' ? codexCredentials(value) : claudeCredentials(value);
|
|
50
|
+
}
|
|
51
|
+
async readCodex(credentials, fetchedAt) {
|
|
52
|
+
const headers = {
|
|
53
|
+
Authorization: `Bearer ${credentials.accessToken}`
|
|
54
|
+
};
|
|
55
|
+
if (credentials.accountId !== undefined)
|
|
56
|
+
headers['ChatGPT-Account-Id'] = credentials.accountId;
|
|
57
|
+
const value = await requestJson(this.fetcher, CODEX_USAGE_URL, headers);
|
|
58
|
+
const windows = [
|
|
59
|
+
codexUsageWindow(value, 'primary_window'),
|
|
60
|
+
codexUsageWindow(value, 'secondary_window')
|
|
61
|
+
].filter((window) => window !== undefined);
|
|
62
|
+
if (windows.length === 0)
|
|
63
|
+
throw new Error('USAGE_RESPONSE_INVALID');
|
|
64
|
+
return { runner: 'codex', windows, fetchedAt, cached: false };
|
|
65
|
+
}
|
|
66
|
+
async readClaude(credentials, fetchedAt) {
|
|
67
|
+
const value = await requestJson(this.fetcher, CLAUDE_USAGE_URL, {
|
|
68
|
+
Authorization: `Bearer ${credentials.accessToken}`,
|
|
69
|
+
'anthropic-beta': 'oauth-2025-04-20',
|
|
70
|
+
'Content-Type': 'application/json'
|
|
71
|
+
});
|
|
72
|
+
const windows = [
|
|
73
|
+
usageWindow(value, 'five_hour', '5-hour limit'),
|
|
74
|
+
usageWindow(value, 'seven_day', '7-day limit'),
|
|
75
|
+
usageWindow(value, 'seven_day_sonnet', '7-day Sonnet limit')
|
|
76
|
+
].filter((window) => window !== undefined);
|
|
77
|
+
if (windows.length === 0)
|
|
78
|
+
throw new Error('USAGE_RESPONSE_INVALID');
|
|
79
|
+
return { runner: 'claude-code', windows, fetchedAt, cached: false };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function unavailable(runner, reasonCode) {
|
|
83
|
+
return { runner, available: false, reasonCode };
|
|
84
|
+
}
|
|
85
|
+
function cacheDuration(runner) {
|
|
86
|
+
return runner === 'codex' ? CODEX_CACHE_MS : CLAUDE_CACHE_MS;
|
|
87
|
+
}
|
|
88
|
+
async function readJson(path) {
|
|
89
|
+
try {
|
|
90
|
+
const text = await readFile(path, 'utf8');
|
|
91
|
+
if (text.length > CREDENTIALS_MAX_BYTES)
|
|
92
|
+
return undefined;
|
|
93
|
+
return JSON.parse(text);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function codexCredentials(value) {
|
|
100
|
+
const root = record(value);
|
|
101
|
+
const tokens = record(root?.tokens) ?? root;
|
|
102
|
+
const accessToken = string(tokens?.access_token) ?? string(tokens?.accessToken);
|
|
103
|
+
if (accessToken === undefined)
|
|
104
|
+
return undefined;
|
|
105
|
+
const accountId = string(tokens?.account_id) ?? string(tokens?.accountId) ?? string(root?.account_id);
|
|
106
|
+
return { accessToken, ...(accountId === undefined ? {} : { accountId }) };
|
|
107
|
+
}
|
|
108
|
+
function claudeCredentials(value) {
|
|
109
|
+
const credentials = record(record(value)?.claudeAiOauth);
|
|
110
|
+
const accessToken = string(credentials?.accessToken);
|
|
111
|
+
return accessToken === undefined ? undefined : { accessToken };
|
|
112
|
+
}
|
|
113
|
+
async function requestJson(fetcher, url, headers) {
|
|
114
|
+
const controller = new AbortController();
|
|
115
|
+
const timer = setTimeout(() => controller.abort(), 5_000);
|
|
116
|
+
try {
|
|
117
|
+
const response = await fetcher(url, {
|
|
118
|
+
method: 'GET',
|
|
119
|
+
headers,
|
|
120
|
+
redirect: 'error',
|
|
121
|
+
signal: controller.signal
|
|
122
|
+
});
|
|
123
|
+
if (response.status === 401 || response.status === 403)
|
|
124
|
+
throw new Error('USAGE_AUTHENTICATION_FAILED');
|
|
125
|
+
if (response.status === 429)
|
|
126
|
+
throw new Error('USAGE_RATE_LIMITED');
|
|
127
|
+
if (!response.ok)
|
|
128
|
+
throw new Error('USAGE_REQUEST_FAILED');
|
|
129
|
+
const text = await response.text();
|
|
130
|
+
if (text.length > RESPONSE_MAX_BYTES)
|
|
131
|
+
throw new Error('USAGE_RESPONSE_INVALID');
|
|
132
|
+
return JSON.parse(text);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
if (error instanceof Error && error.name === 'AbortError')
|
|
136
|
+
throw new Error('USAGE_REQUEST_TIMEOUT');
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
clearTimeout(timer);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function usageWindow(value, key, label) {
|
|
144
|
+
const window = record(record(value)?.rate_limit)?.[key] ?? record(value)?.[key];
|
|
145
|
+
const source = record(window);
|
|
146
|
+
const usedPercentage = number(source?.utilization) ?? number(source?.used_percentage) ?? number(source?.used_percent);
|
|
147
|
+
if (usedPercentage === undefined || usedPercentage < 0 || usedPercentage > 100)
|
|
148
|
+
return undefined;
|
|
149
|
+
const resetsAt = timestamp(source?.resets_at) ?? timestamp(source?.reset_at);
|
|
150
|
+
return { id: key, label, usedPercentage, resetsAt };
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Codex backend window names are roles, not durations: depending on a plan,
|
|
154
|
+
* `primary_window` may itself be the weekly quota. Community clients classify
|
|
155
|
+
* them using the response's `limit_window_seconds`, never their position.
|
|
156
|
+
*/
|
|
157
|
+
function codexUsageWindow(value, key) {
|
|
158
|
+
const window = record(record(value)?.rate_limit)?.[key];
|
|
159
|
+
const duration = number(record(window)?.limit_window_seconds);
|
|
160
|
+
const label = duration !== undefined && approximately(duration, 5 * 60 * 60)
|
|
161
|
+
? '5-hour limit'
|
|
162
|
+
: duration !== undefined && approximately(duration, 7 * 24 * 60 * 60)
|
|
163
|
+
? '7-day limit'
|
|
164
|
+
: undefined;
|
|
165
|
+
return label === undefined ? undefined : usageWindow(value, key, label);
|
|
166
|
+
}
|
|
167
|
+
function approximately(value, expected) {
|
|
168
|
+
return Math.abs(value - expected) / expected <= 0.1;
|
|
169
|
+
}
|
|
170
|
+
function record(value) {
|
|
171
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
172
|
+
? value
|
|
173
|
+
: undefined;
|
|
174
|
+
}
|
|
175
|
+
function string(value) {
|
|
176
|
+
return typeof value === 'string' && value.length > 0 && value.length <= 20_000
|
|
177
|
+
? value
|
|
178
|
+
: undefined;
|
|
179
|
+
}
|
|
180
|
+
function number(value) {
|
|
181
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
182
|
+
}
|
|
183
|
+
function timestamp(value) {
|
|
184
|
+
if (typeof value === 'number' && Number.isFinite(value) && value >= 0)
|
|
185
|
+
return Math.floor(value < 10_000_000_000 ? value * 1_000 : value);
|
|
186
|
+
if (typeof value !== 'string')
|
|
187
|
+
return null;
|
|
188
|
+
const parsed = Date.parse(value);
|
|
189
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;
|
|
190
|
+
}
|
|
@@ -1,2 +1,73 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
const COMMANDS = [
|
|
5
|
+
{ id: 'npx', candidates: ['npx'], versionArguments: ['--version'] },
|
|
6
|
+
{ id: 'git', candidates: ['git'], versionArguments: ['--version'] },
|
|
7
|
+
{ id: 'python', candidates: ['python3', 'python'], versionArguments: ['--version'] },
|
|
8
|
+
{ id: 'pip', candidates: ['pip3', 'pip'], versionArguments: ['--version'] }
|
|
9
|
+
];
|
|
10
|
+
export async function detectRuntimeCommands() {
|
|
11
|
+
return Promise.all(COMMANDS.map(detectCommand));
|
|
12
|
+
}
|
|
13
|
+
async function detectCommand(descriptor) {
|
|
14
|
+
for (const command of descriptor.candidates) {
|
|
15
|
+
try {
|
|
16
|
+
const [{ stdout, stderr }, path] = await Promise.all([
|
|
17
|
+
executeVersion(command, descriptor.versionArguments),
|
|
18
|
+
resolveCommandPath(command)
|
|
19
|
+
]);
|
|
20
|
+
const version = normalizeVersion(descriptor.id, `${stdout}${stderr}`.trim().split(/\r?\n/u)[0]?.trim() ?? '');
|
|
21
|
+
return {
|
|
22
|
+
id: descriptor.id,
|
|
23
|
+
command,
|
|
24
|
+
available: true,
|
|
25
|
+
...(version === undefined || version === '' ? {} : { version }),
|
|
26
|
+
...(path === undefined ? {} : { path })
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Try the platform-compatible fallback command name.
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
id: descriptor.id,
|
|
35
|
+
command: descriptor.candidates[0],
|
|
36
|
+
available: false
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function normalizeVersion(id, value) {
|
|
40
|
+
const normalized = value.trim();
|
|
41
|
+
if (normalized === '')
|
|
42
|
+
return undefined;
|
|
43
|
+
const patterns = {
|
|
44
|
+
git: /^git version\s+(\S+)/iu,
|
|
45
|
+
python: /^python\s+(\S+)/iu,
|
|
46
|
+
pip: /^pip\s+(\S+)/iu
|
|
47
|
+
};
|
|
48
|
+
const match = patterns[id]?.exec(normalized);
|
|
49
|
+
return (match?.[1] ?? normalized).slice(0, 512);
|
|
50
|
+
}
|
|
51
|
+
async function executeVersion(command, args) {
|
|
52
|
+
const executable = process.platform === 'win32' ? process.env['ComSpec'] || 'cmd.exe' : command;
|
|
53
|
+
const commandArgs = process.platform === 'win32' ? ['/d', '/s', '/c', [command, ...args].join(' ')] : [...args];
|
|
54
|
+
return execFileAsync(executable, commandArgs, {
|
|
55
|
+
timeout: 5_000,
|
|
56
|
+
maxBuffer: 64 * 1024,
|
|
57
|
+
windowsHide: true
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async function resolveCommandPath(command) {
|
|
61
|
+
try {
|
|
62
|
+
const resolver = process.platform === 'win32' ? 'where.exe' : 'which';
|
|
63
|
+
const { stdout } = await execFileAsync(resolver, [command], {
|
|
64
|
+
timeout: 2_000,
|
|
65
|
+
maxBuffer: 64 * 1024,
|
|
66
|
+
windowsHide: true
|
|
67
|
+
});
|
|
68
|
+
return stdout.trim().split(/\r?\n/u)[0]?.trim().slice(0, 2048) || undefined;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
}
|
package/dist/runtime-model.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export{};
|
|
1
|
+
export {};
|