@myagentroam/agent 0.9.61 → 0.9.64
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/cli/codex-auth-file.js +268 -3
- package/dist/cli/main.js +427 -2
- package/dist/error.js +66 -2
- package/dist/host/contracts.js +20 -2
- package/dist/host/local-agent-host.js +146 -2
- package/dist/host/local-process-executor.js +39 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +12 -2
- package/dist/model/anthropic-messages.js +474 -2
- package/dist/model/anthropic-thinking.js +33 -2
- package/dist/model/catalog-file.js +88 -2
- package/dist/model/configuration.js +137 -2
- package/dist/model/contracts.d.ts +2 -0
- package/dist/model/contracts.js +1 -2
- package/dist/model/http.js +529 -2
- package/dist/model/openai-responses.d.ts +2 -0
- package/dist/model/openai-responses.js +1602 -2
- package/dist/model/runtime-credential.js +35 -2
- package/dist/model/sse.js +199 -2
- package/dist/prompts/compact.js +25 -2
- package/dist/prompts/core.js +37 -2
- package/dist/prompts/execution-budget.js +10 -2
- package/dist/prompts/index.d.ts +3 -2
- package/dist/prompts/index.js +47 -2
- package/dist/prompts/modes.js +25 -2
- package/dist/prompts/output.js +1 -2
- package/dist/prompts/resources.d.ts +1 -1
- package/dist/prompts/resources.js +31 -2
- package/dist/prompts/subagent.d.ts +6 -0
- package/dist/prompts/subagent.js +29 -2
- package/dist/prompts/title.js +9 -2
- package/dist/prompts/workflow.js +32 -2
- package/dist/runtime/async-queue.js +62 -2
- package/dist/runtime/builtin-skills.js +19 -2
- package/dist/runtime/byted-ark-imagegen-skill.js +18 -2
- package/dist/runtime/codex-imagegen-skill.js +35 -2
- package/dist/runtime/compact.js +225 -2
- package/dist/runtime/context-gc-runtime.d.ts +35 -0
- package/dist/runtime/context-gc-runtime.js +163 -0
- package/dist/runtime/context-gc-tokens.d.ts +24 -0
- package/dist/runtime/context-gc-tokens.js +83 -0
- package/dist/runtime/context-gc.d.ts +66 -0
- package/dist/runtime/context-gc.js +909 -0
- package/dist/runtime/context-projection.d.ts +23 -0
- package/dist/runtime/context-projection.js +203 -0
- package/dist/runtime/environment-context.js +41 -2
- package/dist/runtime/execution-policy.js +13 -2
- package/dist/runtime/instructions.js +298 -2
- package/dist/runtime/normalize.js +40 -2
- package/dist/runtime/plan-output.js +95 -2
- package/dist/runtime/rollout-budget.d.ts +2 -0
- package/dist/runtime/rollout-budget.js +92 -2
- package/dist/runtime/token-budget.d.ts +2 -0
- package/dist/runtime/token-budget.js +44 -2
- package/dist/sdk/agent.js +1804 -2
- package/dist/sdk/types.d.ts +15 -5
- package/dist/sdk/types.js +1 -2
- package/dist/session/catalog.d.ts +5 -4
- package/dist/session/catalog.js +133 -2
- package/dist/session/context-gc-checkpoint.d.ts +148 -0
- package/dist/session/context-gc-checkpoint.js +665 -0
- package/dist/session/context-gc-replacements.d.ts +52 -0
- package/dist/session/context-gc-replacements.js +226 -0
- package/dist/session/context-gc-subagent.d.ts +43 -0
- package/dist/session/context-gc-subagent.js +267 -0
- package/dist/session/jsonl-store.d.ts +42 -4
- package/dist/session/jsonl-store.js +1657 -2
- package/dist/subagent/scheduler.d.ts +35 -2
- package/dist/subagent/scheduler.js +249 -2
- package/dist/subagent/session-controller.d.ts +94 -0
- package/dist/subagent/session-controller.js +675 -0
- package/dist/tools/agent-cancel.js +28 -2
- package/dist/tools/{task.d.ts → agent-message.d.ts} +2 -2
- package/dist/tools/agent-message.js +51 -0
- package/dist/tools/agent-start.js +84 -2
- package/dist/tools/agent-wait.js +53 -2
- package/dist/tools/apply-patch.js +478 -2
- package/dist/tools/code-mode.js +370 -2
- package/dist/tools/codex-image-gen.js +312 -2
- package/dist/tools/exec.js +455 -2
- package/dist/tools/execution-limits.d.ts +1 -0
- package/dist/tools/execution-limits.js +44 -2
- package/dist/tools/local-registry.js +233 -2
- package/dist/tools/local-workspace-tools.js +28 -2
- package/dist/tools/question.js +124 -2
- package/dist/tools/read-context.d.ts +16 -0
- package/dist/tools/read-context.js +85 -0
- package/dist/tools/read.d.ts +13 -0
- package/dist/tools/read.js +294 -2
- package/dist/tools/registry.js +76 -2
- package/dist/tools/runtime-context.d.ts +9 -2
- package/dist/tools/runtime-context.js +1 -2
- package/dist/tools/runtime.js +21 -2
- package/dist/tools/scheduler.js +41 -2
- package/dist/tools/shared/path-resolver.js +133 -2
- package/dist/tools/skill.js +37 -2
- package/dist/tools/todo-read.js +10 -2
- package/dist/tools/todo-write.js +65 -2
- package/dist/tools/todo.js +67 -2
- package/dist/tools/view-image.js +81 -2
- package/dist/tools/web-fetch.js +11 -2
- package/dist/tools/web-search.js +14 -2
- package/package.json +17 -15
- package/README.md +0 -3
- package/dist/runtime/prompt.d.ts +0 -9
- package/dist/runtime/prompt.js +0 -2
- package/dist/tools/shared/secret-redaction.d.ts +0 -4
- package/dist/tools/shared/secret-redaction.js +0 -2
- package/dist/tools/task-cancel.d.ts +0 -7
- package/dist/tools/task-cancel.js +0 -2
- package/dist/tools/task-output.d.ts +0 -7
- package/dist/tools/task-output.js +0 -2
- package/dist/tools/task-tools.d.ts +0 -36
- package/dist/tools/task-tools.js +0 -2
- package/dist/tools/task.js +0 -2
- package/dist/tools/todo-tools.d.ts +0 -25
- package/dist/tools/todo-tools.js +0 -2
package/dist/cli/main.js
CHANGED
|
@@ -1,3 +1,428 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const _0x12fdd3=_0x1c1d;function _0x10e7(){const _0x4d7e3c=['CMvZDw1L','zMLUza','q09ervHFqvvusf9gsuXf','ls1YzxnWB25ZzxmTDhjHBNnWB3j0igLZigLUDMfSAwqU','qvbquK9wquW','ls1LBMfIBgvK','ihjLCxvPCMvZigeGDMfSDwuU','mJq2otKYnhfozxfUAq','oti0meLcww1ODG','ignHBM5VDcbIzsbJB21IAw5Lzc4','CMvTB3zL','Bw9Kzq','C2XPy2u','ChjVDg9JB2W','ls1HCgKTA2v5lxn0zgLUihjLCxvPCMvZihbPCgvKihn0zgLUlG','zgvMyxvSDfjLyxnVBMLUz0vMzM9YDa','ls1YzxnWB25ZzxmTzw5JB2rPBMC','veLnru9vva','q1jfrevoveLbta','pYbBEs9oxsa','y29TCgfJDa','nZi1mJq0EKvkv2Pz','ls1YzxnWB25ZzxmTy29UDgLUDwf0Aw9U','q09otKvdveLptG','BwvZC2fNzq','yxbWCM92zwq','DgL0Bgvhzw5LCMf0Aw9U','Bw9KzwXjza','cwnYzwrLBNrPywW9','sw50zxjHy3rPDMuGAw5WDxqGAxmGDw5HDMfPBgfIBguU','sfruua','zMXHDe1HCa','iIbPCYbUB3qGC3vWCg9YDgvKigj5ig1VzgvSici','ls1PBwfNzq','y2XVC2u','Dgv4Da','D2vIC29JA2v0','C3rKzxjY','qvvusa','ls1TB2rLBa','ls1TyxGTB3v0Chv0','CMvZDwX0','DxnLCG','tM9UlwLUDgvYywn0AxzLigrLBgv0Aw9UihjLCxvPCMvZic0TEwvZlG','C29Tzq','zgvSzxrL','vw5RBM93BIbTB2rLBcbJB21Tyw5KlG','otmZnuzMqxjIAq','C2fMzvbHCNnL','AxnuvfK','DgLTzw91Da','C3rHDhvZ','B2zM','ls1Uyw1L','y2fUy2vS','y2f0y2G','u2vZC2LVBIbjrdOG','zwrPDa','qvjhvu1ftLq','ls1KAxnHyMXLza','ls1YzxnWB25ZzxmTzw5JB2rPBMCGAxmGAw52ywXPzc4','tw9KzwWGAwqGAxmGCMvXDwLYzwqU','ignHBM5VDcbIzsbYzxbLyxrLzc4','tufsx0fhru5ux01prevmx0fvveHFrKfjteve','ChjVBxb0','Bwf4t3v0Chv0vg9Rzw5Z','ls15zxm','mZC0mtuWn0j4wuDXrq','Ahr0Cde','C3rHBMrHCMq','ls1JB250zxH0','y3DK','ChjVDMLKzxjZ','ls1YzxnWB25ZzxmTDhjHBNnWB3j0','igLZigLUDMfSAwqU','mJyZnNDeuuz4yq','B3bLBLnLC3nPB24','C2v0rw5JB2rPBMC','uMvWBhKGt0SU','A2v5CW','v0vcu09ds0vu','yMfZzvvYBa','DgvZDa','qu5usfjpueLdx01fu1nbr0vt','mti4mZu0otzZvxfjqxC','C3vJy2vZCW','CMvHC29UAw5NrwzMB3j0CW','BgL0zq','Dg9vChbLCKnHC2u','zgf0yq','yxjNDG','Dgv4Dc5JB21WBgv0zwq','C3rYzwfTlwPZB24','zgvSzxrLu2vZC2LVBG','ls13zwiTC2vHCMnO','tw9KzwWGAwqGywXYzwfKEsbLEgLZDhmU','B24TCMvXDwvZDa','C3bSAxq','qvbjigTLEsbZDgrPBIb3yxmGzw1WDhKU','BM9YBwfS','AxntywzLsw50zwDLCG','D3jPDgu','y3jLzgvUDgLHBfnVDxjJzq','y29Kzu1Vzgu','vevyva','y3jLyxrLu2vZC2LVBG','ls1OzwXW','ls1QC29U','q0XjignVBw1HBMqGzMfPBgvKlG','ls1JB2rLlw1Vzgu','y29Kzq','ANnVBG','ls1UBY1YzxnWB25ZzxmTy29UDgLUDwf0Aw9U','ls1UBY13zwiTC2vHCMnO','igfUzca','CMvZCg9UC2vZrw5JB2rPBMC','sw52zxn0AwDHDguGDgHLign1CNjLBNqGB2jQzwn0AxzLlcbYzxnVBhzLigrPC2nVDMvYywjSzsb1BMnLCNrHAw50EsWGyw5KihbYB2r1y2uGyw4GzxHLy3v0ywjSzsbPBxbSzw1LBNrHDgLVBIbHBMqGDMvYAwzPy2f0Aw9UihbSyw4GD2L0Ag91DcbJBgfPBwLUzYb0AguGD29YAYbPCYbJB21WBgv0zs4','zxHLyW','u1rbtKrbuKq','Ahr0CdeUmq','ls1HCgKTA2v5lxn0zgLUignHBM5VDcbIzsbJB21IAw5Lzcb3AxrOigfUigv4DgvYBMfSignYzwrLBNrPywWU','ls11CMW','Ahr0Cdi','zw5HyMXLza','vw5RBM93BIbZzxnZAw9UCYbJB21Tyw5KlG','zgvSDge','tM9UlwLUDgvYywn0AxzLihjLBw92ywWGCMvXDwLYzxmGls15zxmU','y29TCgXLDgvK','ls1WCM90B2nVBa','ls1MB3jTyxq','igLZihjLCxvPCMvKlG','qwnJzxnZig11C3qGyMuGB24TCMvXDwvZDcbVCIbMDwXSlwfJy2vZCY4','DgL0Bgu','CMvZDw1LihjLCxvPCMvZigeGC2vZC2LVBIbPzc4','BgLZDa','ls1YzwfZB25PBMCTzwzMB3j0','ls1YzwfZB25PBMCTzwzMB3j0CW','mte2ouf5suH6yq','ls1YzxnWB25ZzxmTDhjHBNnWB3j0ihjLCxvPCMvZie9qru5bsv9srvnqt05trvmU','ls1OB21L','zMLSDgvY','Ag9ZDgvKv2vIu2vHCMnO','BwfYywDLBNqGlsbnqviGy29KAw5NigfNzw50cGPvC2fNztOkicbTyxjHz2vUDcbBls1TB2rLBcbjrf0GwY0TCMvHC29UAw5NlwvMzM9YDcbfrKzpuLrDifSTlwfJy2vZCYbVBI1Yzxf1zxn0Fgz1BgWTywnJzxnZxsbBls1JB2rLEc1HDxrOlwzPBguGuefusf0kicbTyxjHz2vUDcbYDw4GphbYB21WDd4GwY0TCMvHC29UAw5NlwvMzM9YDcbfrKzpuLrDifSTlwzVCM1HDcb0zxH0FgPZB258C3rYzwfTlwPZB25DifSTlwnVzgv4lwf1DgGTzMLSzsbqqvrixqOGig1HCMfNzw50ihjLC3vTzsbBC2vZC2LVBKLKxsbBls1YzwfZB25PBMCTzwzMB3j0ievgrK9svf0GwY0Ty29KzxGTyxv0Ac1MAwXLifbbveHDcIaGBwfYywDLBNqGC2vZC2LVBNmGBgLZDhXKzwXLDguGphnLC3nPB25jzd4kicbTyxjHz2vUDcbTB2rLBhmGBgLZDhXHzgr8zwrPDhXYzw1VDMv8DgvZDcbBAwrDifSTlwrLzMf1BhqTCMvHC29UAw5NlwvMzM9YDcbfrKzpuLrDifSTlwnVzguTBw9KzxWTlw5VlwnVzguTBw9Kzv0GwY0TCMvZCg9UC2vZlwvUy29KAw5Nihn0yw5KyxjKFgXPDgvDifSTlwnVzgv4lwf1DgGTzMLSzsbqqvrixqO','BwvZC2fNzs5KzwX0yq','AM9PBG','C3rYAw5NAwz5','ls1Hy2nLC3m','tufsx0fhru5ux01prevmx05pvf9gt1vora','tw9KzwWGD2fZig5VDcbMB3vUzc4','revosuve','ywrK','CMv2zwfS','ls1UBY1PBwfNzq','ms4X','Aw5KzxHpzG','su1br0u','y29KzxGTyxv0Ac1MAwXL','uMvHC29UAw5NigvMzM9YDcaI','Aw5JBhvKzxm','t1bftKfjx1jfu1bptLnfuW','Aw5WDxrdyxbHyMLSAxrPzxm','q09orKLh','BgLZDfnLC3nPB25Z','BgvUz3rO','tufsx0fhru5ux1vtrvjFsu5qvvrFvu5bvKfjtefcteu','zgvUAwvK','ls1JB2rLEc1HDxrOlwzPBgu','q29KzxGGyxv0AcbMAwXLigLZihjLCxvPCMvKigzVCIb0AguGC2vSzwn0zwqGBw9KzwWU','ls1UBY1JB2rLlw1Vzgu','vvnfuL9jtLbvvf9vtKfwquLmqujmrq','CMvZCg9UC2vZvhjHBNnWB3j0','zgLZCg9Zzq','ls1KzwzHDwX0lxjLyxnVBMLUzY1LzMzVCNq','DhjPBq','tufsx0fhru5ux0nmsv9gquLmruq','ls1JCMvKzw50AwfSigLZigLUDMfSAwqU','CxvLC3rPB25Z','C3bSAwnL','BMfTzq','yxbPlwTLEq','C3rHCNq','CNvU','yxbPs2v5','tufsx0fhru5ux0nmsv9buKDvtuvovf9jtLzbteLe','C2vZC2LVBNm','DxrMoa','mtuYodyXmuDpuxnXuW','BwfW','Dg9mB3DLCKnHC2u','BgfZDefJDgL2Axr5qxq','zxjYB3jdB2rL','CxvLC3rPB24','ywXS','qxbWCM92zsa','DhLWzq','ls1WCM90B2nVBcbPCYbPBNzHBgLKlG','y29UDgv4DfDPBMrVD1rVA2vUCW','ls1JCMvKzw50AwfS','ls1HCgKTA2v5lxn0zgLU','u0Lhsu5u','C3rYAw5N','CMvZCg9UC2vZuhjLDMLVDxnszxnWB25ZzuLK','zgvMyxvSDe1VzgvSswq','zNvSBc1Hy2nLC3m','u2vZC2LVBIbPzcbPCYbYzxf1AxjLzc4','Bw9KzwXZ','zxHPDenVzgu','CgXHBG'];_0x10e7=function(){return _0x4d7e3c;};return _0x10e7();}(function(_0x292f55,_0x4d53fc){const _0x12380d=_0x1c1d,_0x1e840f=_0x292f55();while(!![]){try{const _0x3b4bec=parseInt(_0x12380d(0x1e0))/(0x34*0x55+-0xbf+-0x1*0x1084)+-parseInt(_0x12380d(0x20b))/(0x1287+0x13b8+0x3*-0xcbf)+-parseInt(_0x12380d(0x239))/(0x1ab4+-0x21*0x92+-0x7df)+parseInt(_0x12380d(0x241))/(-0x348+-0x4*0x153+0x898)*(-parseInt(_0x12380d(0x225))/(-0x2d6+-0x1dbb*0x1+0x2096))+-parseInt(_0x12380d(0x1fe))/(-0x2297+-0x103d*-0x1+0x1260)*(-parseInt(_0x12380d(0x1af))/(0x5f*-0x4f+0x2*0xaf6+0x4c*0x19))+parseInt(_0x12380d(0x24a))/(0x1*-0x186f+0x3d*-0x5f+0x2*0x178d)+parseInt(_0x12380d(0x1fd))/(0xa4d+-0x5bc*-0x6+-0x2cac);if(_0x3b4bec===_0x4d53fc)break;else _0x1e840f['push'](_0x1e840f['shift']());}catch(_0x2fbbf3){_0x1e840f['push'](_0x1e840f['shift']());}}}(_0x10e7,-0x13646a+-0x9acdf*-0x2+0x1*0xc9f74));import{homedir}from'node:os';import{resolve}from'node:path';import{createInterface}from'node:readline/promises';import{stdin,stdout}from'node:process';import{CodexAuthFileCredentialProvider}from'./codex-auth-file.js';import{describeMarAgentError,MarAgentError}from'../error.js';import{LocalAgentHost}from'../host/local-agent-host.js';import{readModelCatalog,writeModelCatalog}from'../model/catalog-file.js';import{marAgentReasoningEffortSchema,resolveModelDefaultReasoningEffort,SecretValue}from'../model/configuration.js';import{AnthropicMessagesAdapter}from'../model/anthropic-messages.js';import{OpenAiResponsesAdapter}from'../model/openai-responses.js';import{DEFAULT_COMPACTION_FOCUS}from'../runtime/compact.js';import{createMarAgent}from'../sdk/agent.js';const HELP=_0x12fdd3(0x1b4);function takeOption(_0x384212,_0x5c5c84){const _0x2892c9=_0x12fdd3,_0x3889a4=_0x384212[_0x2892c9(0x1c0)](_0x5c5c84);if(_0x3889a4<-0x1*-0x1989+-0x1*0xdd9+0xb0*-0x11)return undefined;if(_0x384212[_0x2892c9(0x1c0)](_0x5c5c84,_0x3889a4+(0x3*0xcc9+0xf25*-0x2+-0x810))>=-0x7b5*0x2+-0xd*0xdc+0x52*0x53)throw new MarAgentError(_0x2892c9(0x1dd),_0x5c5c84+_0x2892c9(0x234));const _0xbb1505=_0x384212[_0x3889a4+(-0x13c2+-0x11b6+0x2579)];if(!_0xbb1505)throw new MarAgentError(_0x2892c9(0x1dd),_0x5c5c84+_0x2892c9(0x1fc));return _0x384212[_0x2892c9(0x1d7)](_0x3889a4,0x5*-0x77e+0x5b3+0x3*0xa97),_0xbb1505;}function _0x1c1d(_0x49405d,_0x5babe1){_0x49405d=_0x49405d-(-0x1a7f+-0xe04+0x2a29*0x1);const _0x4c52b1=_0x10e7();let _0x3f5fc9=_0x4c52b1[_0x49405d];if(_0x1c1d['fGSVat']===undefined){var _0xab0c47=function(_0x3df189){const _0x2d7aeb='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2c0d90='',_0x5b5c0a='';for(let _0x33c0a7=-0x2*-0xa86+-0x3*-0x8e9+-0x9*0x54f,_0x597a4d,_0x401ceb,_0x4213e0=0x315*0x7+-0x931*0x1+0x5*-0x27a;_0x401ceb=_0x3df189['charAt'](_0x4213e0++);~_0x401ceb&&(_0x597a4d=_0x33c0a7%(0xf04+0x1c69+-0x2b69)?_0x597a4d*(-0x2f*-0x49+0x14*-0xfe+0x6b1)+_0x401ceb:_0x401ceb,_0x33c0a7++%(-0x11b6+-0x7fc+0x19b6))?_0x2c0d90+=String['fromCharCode'](-0x5b3*-0x1+0x1d*0xb6+-0x2*0xca9&_0x597a4d>>(-(0xa9e*-0x1+-0x997*-0x2+-0x16d*0x6)*_0x33c0a7&0xd9a+0x10*-0x13a+0x60c)):0x1883+0x1c16*0x1+-0x3499){_0x401ceb=_0x2d7aeb['indexOf'](_0x401ceb);}for(let _0x23c6da=-0x1024+-0x15be+0x25e2,_0x1cd2e5=_0x2c0d90['length'];_0x23c6da<_0x1cd2e5;_0x23c6da++){_0x5b5c0a+='%'+('00'+_0x2c0d90['charCodeAt'](_0x23c6da)['toString'](-0x20ed*0x1+0x19f0+0x70d))['slice'](-(0x1e7a+-0x1a83*-0x1+-0x1*0x38fb));}return decodeURIComponent(_0x5b5c0a);};_0x1c1d['LDPmHB']=_0xab0c47,_0x1c1d['dAKJfE']={},_0x1c1d['fGSVat']=!![];}const _0x2c17be=_0x4c52b1[0x58+0x336+0x1c7*-0x2];_0x1c1d['jEhwCV']!==_0x2c17be&&(_0x1c1d['dAKJfE']={},_0x1c1d['jEhwCV']=_0x2c17be);const _0x4a4a65=_0x1c1d['dAKJfE'][_0x49405d];return _0x4a4a65===undefined?(_0x3f5fc9=_0x1c1d['LDPmHB'](_0x3f5fc9),_0x1c1d['dAKJfE'][_0x49405d]=_0x3f5fc9):_0x3f5fc9=_0x4a4a65,_0x3f5fc9;}async function loadCatalog(_0x7034b4){return readModelCatalog(_0x7034b4);}function takeFlag(_0x1bf8e6,_0x3d09a4){const _0x272422=_0x12fdd3,_0x56075b=_0x1bf8e6[_0x272422(0x1c0)](_0x3d09a4);if(_0x56075b<0x2169+0x1*-0x565+0x146*-0x16)return![];return _0x1bf8e6[_0x272422(0x1d7)](_0x56075b,-0x1e74+-0x217d*-0x1+-0x308),!![];}function booleanFlag(_0x448202,_0x14db2e,_0x21cb9,_0x19cdd9){const _0x2f7380=_0x12fdd3,_0x39f49e=takeFlag(_0x448202,_0x14db2e),_0x1aead2=takeFlag(_0x448202,_0x21cb9);if(_0x39f49e&&_0x1aead2)throw new MarAgentError(_0x2f7380(0x1dd),_0x14db2e+_0x2f7380(0x268)+_0x21cb9+_0x2f7380(0x1ff));return _0x39f49e?!![]:_0x1aead2?![]:_0x19cdd9;}async function readApiKey(){const _0x524350=_0x12fdd3;if(stdin[_0x524350(0x227)])throw new MarAgentError(_0x524350(0x1dd),_0x524350(0x204));stdin[_0x524350(0x243)](_0x524350(0x1df));let _0x2dc0a1='';for await(const _0x3aae13 of stdin)_0x2dc0a1+=_0x3aae13;if(!_0x2dc0a1[_0x524350(0x1d3)]())throw new MarAgentError(_0x524350(0x1dd),_0x524350(0x258));return _0x2dc0a1[_0x524350(0x1d3)]();}async function modelsCommand(_0x236ae8,_0x241838,_0x18c382){const _0x26713e=_0x12fdd3,_0x2dd2dd=_0x241838[0x23e0+0x102b*0x1+-0x340a],_0x1b8bb4=await loadCatalog(_0x236ae8);if(_0x2dd2dd===_0x26713e(0x1ac)){for(const _0x31b1bb of _0x1b8bb4[_0x26713e(0x1f3)])stdout[_0x26713e(0x25b)](_0x31b1bb['id']+'\x09'+_0x31b1bb[_0x26713e(0x1d8)]+'\x09'+_0x31b1bb[_0x26713e(0x203)]+'\x09'+_0x31b1bb[_0x26713e(0x211)]+_0x26713e(0x212)+(_0x31b1bb[_0x26713e(0x1dc)]===undefined?_0x26713e(0x1c2):_0x26713e(0x1d9))+'\x0a');return;}const _0x20a41e=_0x241838[0xc88+0x24c8+-0x314e];if(!_0x20a41e)throw new MarAgentError(_0x26713e(0x1dd),_0x26713e(0x233));const _0x58f009=_0x1b8bb4[_0x26713e(0x1f3)][_0x26713e(0x1f7)](_0xa35caf=>_0xa35caf['id']===_0x20a41e);if(_0x2dd2dd===_0x26713e(0x200)){if(!_0x58f009)throw new MarAgentError(_0x26713e(0x1b9),_0x26713e(0x1ba));if(!takeFlag(_0x241838,_0x26713e(0x238))&&!stdin[_0x26713e(0x227)])throw new MarAgentError(_0x26713e(0x1dd),_0x26713e(0x274));await writeModelCatalog(_0x236ae8,{'version':0x1,'models':_0x1b8bb4[_0x26713e(0x1f3)][_0x26713e(0x1b2)](_0x7723f1=>_0x7723f1['id']!==_0x20a41e),..._0x1b8bb4[_0x26713e(0x1f0)]&&_0x1b8bb4[_0x26713e(0x1f0)]!==_0x20a41e?{'defaultModelId':_0x1b8bb4[_0x26713e(0x1f0)]}:{}});return;}if(_0x2dd2dd===_0x26713e(0x248)){if(!_0x58f009)throw new MarAgentError(_0x26713e(0x1b9),_0x26713e(0x1ba));assertExternalCredentialAvailable(_0x58f009,_0x18c382);const _0xcfb7f4=runtimeModels([_0x58f009],_0x18c382),_0x5cf53d=_0x58f009[_0x26713e(0x203)]===_0x26713e(0x1c5)?new OpenAiResponsesAdapter(_0xcfb7f4[_0x26713e(0x1f3)][-0x3e6+-0x1205+0x1f*0xb5]):new AnthropicMessagesAdapter(_0xcfb7f4[_0x26713e(0x1f3)][-0x2461+0xb3*-0x25+0x3e40]);try{let _0x52ee8e='';for await(const _0x3d250b of _0x5cf53d[_0x26713e(0x1da)]({'system':_0x26713e(0x244),'messages':[{'role':_0x26713e(0x220),'content':_0x26713e(0x244)}],'tools':[]},AbortSignal[_0x26713e(0x228)](-0x1*-0xa1db+0x2*-0x60d6+0x9501)))if(_0x3d250b[_0x26713e(0x1e8)]===_0x26713e(0x251))_0x52ee8e=_0x3d250b[_0x26713e(0x219)];stdout[_0x26713e(0x25b)](JSON[_0x26713e(0x1b7)]({'success':!![],'modelId':_0x20a41e,'response':_0x52ee8e[_0x26713e(0x202)](0x3f*-0x1d+-0x2419*-0x1+-0xe7b*0x2,-0x1*0x2f2+0x15cc+0x2*-0x945)})+'\x0a');return;}finally{await Promise[_0x26713e(0x1e6)](_0xcfb7f4[_0x26713e(0x23e)][_0x26713e(0x1e1)](_0x4270d5=>_0x4270d5[_0x26713e(0x218)]()));}}if(_0x2dd2dd!==_0x26713e(0x1bc)&&_0x2dd2dd!==_0x26713e(0x22f))throw new MarAgentError(_0x26713e(0x1dd),_0x26713e(0x224));if(_0x2dd2dd===_0x26713e(0x1bc)&&_0x58f009)throw new MarAgentError(_0x26713e(0x1dd),_0x26713e(0x255));if(_0x2dd2dd===_0x26713e(0x22f)&&!_0x58f009)throw new MarAgentError(_0x26713e(0x1b9),_0x26713e(0x1ba));const _0x3065ec=(_0x444eb0,_0x1f1bff)=>takeOption(_0x241838,_0x444eb0)??_0x1f1bff,_0x35f38b=(_0xde37b9,_0x2bff8b)=>{const _0x17881c=_0x26713e,_0x2beca0=takeOption(_0x241838,_0xde37b9),_0x24986d=_0x2beca0===undefined?_0x2bff8b:Number(_0x2beca0);if(!Number[_0x17881c(0x25a)](_0x24986d)||_0x24986d<=-0x1*-0x223d+0xd75+-0x4a*0xa5)throw new MarAgentError(_0x17881c(0x1dd),_0xde37b9+_0x17881c(0x240));return _0x24986d;},_0x555e19=_0x3065ec(_0x26713e(0x1a6),_0x58f009?.[_0x26713e(0x203)]??_0x26713e(0x249));if(_0x555e19!==_0x26713e(0x1c5)&&_0x555e19!==_0x26713e(0x249))throw new MarAgentError(_0x26713e(0x1dd),_0x26713e(0x1e9));const _0x4e2c5e=(_0x1864e9,_0x3ddebf)=>{const _0x49477f=_0x26713e;if(!_0x1864e9)throw new MarAgentError(_0x49477f(0x1dd),_0x3ddebf+_0x49477f(0x1a8));return _0x1864e9;},_0x198398=_0x3065ec(_0x26713e(0x1eb),_0x58f009?.[_0x26713e(0x25c)]===_0x26713e(0x1f8)?_0x26713e(0x1c2):_0x26713e(0x1d9))??_0x26713e(0x1d9);if(_0x198398!==_0x26713e(0x1d9)&&_0x198398!==_0x26713e(0x1c2))throw new MarAgentError(_0x26713e(0x1dd),_0x26713e(0x1d5));const _0x1a8820=takeFlag(_0x241838,_0x26713e(0x1ec));if(_0x198398===_0x26713e(0x1c2)&&_0x1a8820)throw new MarAgentError(_0x26713e(0x1dd),_0x26713e(0x26e));const _0x59450a=parseResponsesTransport(_0x3065ec(_0x26713e(0x23f)),_0x555e19,_0x58f009?.[_0x26713e(0x1d0)]),_0x1c3c15=_0x3065ec(_0x26713e(0x206));if(_0x1c3c15!==undefined&&(_0x555e19!==_0x26713e(0x1c5)||![_0x26713e(0x23b),_0x26713e(0x24d)][_0x26713e(0x1c4)](_0x1c3c15)))throw new MarAgentError(_0x26713e(0x1dd),_0x26713e(0x232));const _0x515c10=_0x555e19===_0x26713e(0x1c5)?_0x1c3c15?.[_0x26713e(0x24e)]()??_0x58f009?.[_0x26713e(0x269)]??_0x26713e(0x26c):undefined,_0x3a54ea=_0x3065ec(_0x26713e(0x1ae)),_0x2ed423=_0x3a54ea===undefined?_0x58f009?.[_0x26713e(0x24c)]??[]:_0x3a54ea[_0x26713e(0x257)](',')[_0x26713e(0x1b2)](Boolean)[_0x26713e(0x1e1)](_0x4d348c=>parseReasoningEffort(_0x4d348c,_0x26713e(0x1ae))),_0x51f260=_0x3065ec(_0x26713e(0x1d2)),_0x380ecb={'id':_0x20a41e,'name':_0x4e2c5e(_0x3065ec(_0x26713e(0x22b),_0x58f009?.[_0x26713e(0x1d8)]),_0x26713e(0x22b)),'protocol':_0x555e19,'baseUrl':_0x4e2c5e(_0x3065ec(_0x26713e(0x26f),_0x58f009?.[_0x26713e(0x247)]),_0x26713e(0x26f)),..._0x198398===_0x26713e(0x1c2)?{'credentialSource':_0x26713e(0x1f8)}:{'apiKey':new SecretValue(_0x1a8820?await readApiKey():_0x4e2c5e(_0x58f009?.[_0x26713e(0x1dc)]?.[_0x26713e(0x1bd)](),_0x26713e(0x1ec)))},'modelId':_0x4e2c5e(_0x3065ec(_0x26713e(0x21d),_0x58f009?.[_0x26713e(0x211)]),_0x26713e(0x21d)),'contextWindowTokens':_0x35f38b(_0x26713e(0x23c),_0x58f009?.[_0x26713e(0x1ea)]??0x216a1+-0x42887+0x51f26),'maxOutputTokens':_0x35f38b(_0x26713e(0x21e),_0x58f009?.[_0x26713e(0x237)]??-0x24*-0x8a+-0x9cd*0x5+0x5d99),'inputCapabilities':booleanFlag(_0x241838,_0x26713e(0x217),_0x26713e(0x1be),_0x58f009?.[_0x26713e(0x1c6)][_0x26713e(0x1c4)](_0x26713e(0x1c1))??![])?[_0x26713e(0x25e),_0x26713e(0x1c1)]:[_0x26713e(0x25e)],'outputCapabilities':[_0x26713e(0x25e)],'reasoningEfforts':_0x2ed423,'defaultReasoningEffort':_0x51f260===undefined?resolveModelDefaultReasoningEffort({'reasoningEfforts':_0x2ed423,'defaultReasoningEffort':_0x58f009?.[_0x26713e(0x205)]}):parseReasoningEffort(_0x51f260,_0x26713e(0x1d2)),'titleGeneration':_0x58f009?.[_0x26713e(0x210)]??![],'codeMode':booleanFlag(_0x241838,_0x26713e(0x263),_0x26713e(0x1ce),_0x58f009?.[_0x26713e(0x25d)]??![]),'hostedWebSearch':booleanFlag(_0x241838,_0x26713e(0x254),_0x26713e(0x267),_0x58f009?.[_0x26713e(0x1b3)]??![]),..._0x59450a===undefined?{}:{'responsesTransport':_0x59450a},..._0x515c10===undefined?{}:{'responsesEncoding':_0x515c10},'responsesPreviousResponseId':booleanFlag(_0x241838,_0x26713e(0x20c),_0x26713e(0x266),_0x58f009?.[_0x26713e(0x1ef)]??![]),'enabled':booleanFlag(_0x241838,_0x26713e(0x1fb),_0x26713e(0x231),_0x58f009?.[_0x26713e(0x271)]??!![])};await writeModelCatalog(_0x236ae8,{'version':0x1,'defaultModelId':_0x1b8bb4[_0x26713e(0x1f0)]??_0x20a41e,'models':_0x58f009?_0x1b8bb4[_0x26713e(0x1f3)][_0x26713e(0x1e1)](_0x3ba835=>_0x3ba835['id']===_0x20a41e?_0x380ecb:_0x3ba835):[..._0x1b8bb4[_0x26713e(0x1f3)],_0x380ecb]});}function parseReasoningEffort(_0x415f33,_0x4c1ec0){const _0x14d1c9=_0x12fdd3,_0xbdb4ad=marAgentReasoningEffortSchema[_0x14d1c9(0x226)](_0x415f33[_0x14d1c9(0x1d3)]());if(!_0xbdb4ad[_0x14d1c9(0x24b)])throw new MarAgentError(_0x14d1c9(0x1dd),_0x4c1ec0+_0x14d1c9(0x240));return _0xbdb4ad[_0x14d1c9(0x24f)];}function parseResponsesTransport(_0x21af76,_0x2228b6,_0x1f114a){const _0x196c60=_0x12fdd3;if(_0x2228b6!==_0x196c60(0x1c5)){if(_0x21af76!==undefined)throw new MarAgentError(_0x196c60(0x1dd),_0x196c60(0x1b0));return undefined;}const _0x25ec94=_0x21af76?.[_0x196c60(0x1e2)]();if(_0x25ec94===undefined)return _0x1f114a;if(_0x25ec94===_0x196c60(0x21a))return{'transport':_0x196c60(0x246)};if(_0x25ec94===_0x196c60(0x270))return{'transport':_0x196c60(0x214),'httpVersion':'2'};if(_0x25ec94===_0x196c60(0x23a)||_0x25ec94===_0x196c60(0x26d))return{'transport':_0x196c60(0x214),'httpVersion':_0x196c60(0x1bf)};throw new MarAgentError(_0x196c60(0x1dd),_0x196c60(0x1f9));}async function main(){const _0x284bd3=_0x12fdd3,_0x2242ba=process[_0x284bd3(0x250)][_0x284bd3(0x202)](-0x891*0x1+0xcbd*-0x1+0x1550),_0x35c90b=resolve(takeOption(_0x2242ba,_0x284bd3(0x1b1))??homedir()),_0x3d43c1=takeOption(_0x2242ba,_0x284bd3(0x1cc));if(_0x2242ba[_0x284bd3(0x1c4)](_0x284bd3(0x260))||_0x2242ba[_0x284bd3(0x1c4)]('-h')){stdout[_0x284bd3(0x25b)](HELP);return;}const _0x56a716=_0x2242ba[0x207e+-0x1*-0x1605+0x5*-0xae7];if(_0x56a716===_0x284bd3(0x1f3)){await modelsCommand(_0x35c90b,_0x2242ba,_0x3d43c1);return;}const _0x1f5c7c=process[_0x284bd3(0x23d)](),_0x391c8d=await loadCatalog(_0x35c90b),_0xa73162=takeOption(_0x2242ba,_0x284bd3(0x21d))??_0x391c8d[_0x284bd3(0x1f0)],_0x1ed16c=takeOption(_0x2242ba,_0x284bd3(0x1ad)),_0x517602=_0x1ed16c===undefined?undefined:parseReasoningEffort(_0x1ed16c,_0x284bd3(0x1ad)),_0x17df4e=takeOption(_0x2242ba,_0x284bd3(0x1b8))??_0x284bd3(0x256),_0x286198=takeOption(_0x2242ba,_0x284bd3(0x1a7))??_0x284bd3(0x219);if(_0x17df4e!==_0x284bd3(0x256)&&_0x17df4e!==_0x284bd3(0x1f1))throw new MarAgentError(_0x284bd3(0x1dd),_0x284bd3(0x1a9));const _0x2eb373=_0x391c8d[_0x284bd3(0x1f3)][_0x284bd3(0x1f7)](_0x1a0dd7=>_0x1a0dd7['id']===_0xa73162&&_0x1a0dd7[_0x284bd3(0x271)]);if(_0x2eb373!==undefined)assertExternalCredentialAvailable(_0x2eb373,_0x3d43c1);if(_0x517602&&_0x2eb373&&!_0x2eb373[_0x284bd3(0x24c)][_0x284bd3(0x1c4)](_0x517602))throw new MarAgentError(_0x284bd3(0x1dd),_0x284bd3(0x1c3)+_0x517602+_0x284bd3(0x216)+_0x2eb373['id']+'\x22.');const _0x10afba=_0x56a716!==_0x284bd3(0x1db);let _0x33262b=_0x56a716===_0x284bd3(0x1db)?_0x2242ba[_0x284bd3(0x202)](-0xa3*0x25+0x9e5*0x2+0x8a*0x7)[_0x284bd3(0x1b6)]('\x20'):'';const _0x22e831=createInterface({'input':stdin,'output':stdout}),_0x51fea4=new LocalAgentHost({'homeDirectory':_0x35c90b,'workspace':_0x1f5c7c,'approve':async _0x401a5d=>{const _0x31f8e2=_0x284bd3;if(!stdin[_0x31f8e2(0x227)])return _0x31f8e2(0x1cb);const _0x240b2e=await _0x22e831[_0x31f8e2(0x1e5)](_0x31f8e2(0x1e7)+_0x401a5d[_0x31f8e2(0x1d8)]+_0x31f8e2(0x209));return/^y(es)?$/i[_0x31f8e2(0x248)](_0x240b2e[_0x31f8e2(0x1d3)]())?_0x31f8e2(0x20f):_0x31f8e2(0x1cb);},'question':async _0x337946=>{const _0x4cbcde=_0x284bd3;if(!stdin[_0x4cbcde(0x227)])throw new MarAgentError(_0x4cbcde(0x1ca),_0x4cbcde(0x213));const _0x534c2b={};for(const _0x567e54 of _0x337946[_0x4cbcde(0x1d6)]){const _0x2aa7af=_0x567e54,_0x6ca105=typeof _0x2aa7af['id']===_0x4cbcde(0x1ee)?_0x2aa7af['id']:String(Object[_0x4cbcde(0x245)](_0x534c2b)[_0x4cbcde(0x1c9)]);_0x534c2b[_0x6ca105]=await _0x22e831[_0x4cbcde(0x1e5)]((typeof _0x2aa7af[_0x4cbcde(0x1e5)]===_0x4cbcde(0x1ee)?_0x2aa7af[_0x4cbcde(0x1e5)]:JSON[_0x4cbcde(0x1b7)](_0x567e54))+'\x20');}return _0x534c2b;}}),_0x47bc54=runtimeModels(_0x391c8d[_0x284bd3(0x1f3)],_0x3d43c1),_0x44c25d=await createMarAgent({'mode':_0x284bd3(0x259),'host':_0x51fea4,'models':_0x47bc54[_0x284bd3(0x1f3)],..._0xa73162===undefined?{}:{'defaultModelId':_0xa73162}});try{if(_0x56a716===_0x284bd3(0x1de)&&_0x2242ba[-0x39*0x38+0x12a9+-0x630]===_0x284bd3(0x1ac)){stdout[_0x284bd3(0x25b)](JSON[_0x284bd3(0x1b7)](await _0x44c25d[_0x284bd3(0x1c8)](),null,takeFlag(_0x2242ba,_0x284bd3(0x261))?-0x1b4b+-0xd1*0x14+0x2b9f*0x1:0x8c3*0x1+-0x1*-0x1303+-0x1bc4)+'\x0a');return;}if(_0x56a716===_0x284bd3(0x1de)&&_0x2242ba[-0xd2d+-0x9*0x39e+0x2dbc]===_0x284bd3(0x223)&&_0x2242ba[-0x1b56+-0x49*-0x1+0x1b0f]){if(!takeFlag(_0x2242ba,_0x284bd3(0x238))&&!stdin[_0x284bd3(0x227)])throw new MarAgentError(_0x284bd3(0x1dd),_0x284bd3(0x221));await _0x44c25d[_0x284bd3(0x253)](_0x2242ba[0x1bc8+-0x257*-0x2+-0x2074]);return;}if(_0x56a716===_0x284bd3(0x1de))throw new MarAgentError(_0x284bd3(0x1dd),_0x284bd3(0x272));let _0xacf903=_0x56a716===_0x284bd3(0x1f6)?_0x2242ba[-0x1f3b+-0x4a+0x1f86]:undefined;if(_0x56a716===_0x284bd3(0x1f6)&&!_0xacf903){if(!stdin[_0x284bd3(0x227)])throw new MarAgentError(_0x284bd3(0x1dd),_0x284bd3(0x1ab));const _0x13553a=await _0x44c25d[_0x284bd3(0x1c8)]();for(const _0x69145 of _0x13553a[_0x284bd3(0x1de)]??[])stdout[_0x284bd3(0x25b)](_0x69145['id']+'\x09'+_0x69145[_0x284bd3(0x1aa)]+'\x09'+_0x69145[_0x284bd3(0x1e3)]+'\x0a');_0xacf903=(await _0x22e831[_0x284bd3(0x1e5)](_0x284bd3(0x22e)))[_0x284bd3(0x1d3)]();if(!_0xacf903)throw new MarAgentError(_0x284bd3(0x1dd),_0x284bd3(0x1f2));}const _0xf14f25=_0xacf903?await _0x44c25d[_0x284bd3(0x242)](_0xacf903):await _0x44c25d[_0x284bd3(0x25f)]({'workspace':_0x1f5c7c});let _0x536fda,_0x4d803e=0x626+0x16dd+-0x1d03;const _0x2972de=()=>{const _0x4dae51=_0x284bd3;_0x4d803e++;if(_0x536fda)_0x536fda[_0x4dae51(0x22c)]();else _0x22e831[_0x4dae51(0x218)]();process[_0x4dae51(0x1f4)]=-0x35*0x5e+0x1820+-0x428;if(_0x4d803e>0x64d*-0x2+-0x82f+0x14ca)_0x536fda?.[_0x4dae51(0x22c)]();};process['on'](_0x284bd3(0x1ed),_0x2972de);try{do{if(_0x10afba)_0x33262b=await _0x22e831[_0x284bd3(0x1e5)]('>\x20');if(!_0x33262b[_0x284bd3(0x1d3)]())break;const _0x408b92=parseExecutionInvocation(_0x33262b),_0x515487={'prompt':_0x408b92[_0x284bd3(0x236)],'access':_0x17df4e,..._0xa73162===undefined?{}:{'modelId':_0xa73162},..._0x517602===undefined?{}:{'reasoningEffort':_0x517602}},_0x18e397=_0x408b92[_0x284bd3(0x201)]===_0x284bd3(0x1f5)?_0xf14f25[_0x284bd3(0x1f5)](_0x515487):_0x408b92[_0x284bd3(0x201)]===_0x284bd3(0x20a)?_0xf14f25[_0x284bd3(0x20a)](_0x515487):_0xf14f25[_0x284bd3(0x1db)](_0x515487);_0x536fda=_0x18e397;for await(const _0x2607c2 of _0x18e397){if(_0x286198===_0x284bd3(0x252))stdout[_0x284bd3(0x25b)](JSON[_0x284bd3(0x1b7)](_0x2607c2)+'\x0a');else{if(_0x2607c2[_0x284bd3(0x1e8)]===_0x284bd3(0x1b5))stdout[_0x284bd3(0x25b)](_0x2607c2[_0x284bd3(0x273)]);}}const _0x5a6674=await _0x18e397[_0x284bd3(0x21f)]();_0x536fda=undefined;if(_0x286198===_0x284bd3(0x265))stdout[_0x284bd3(0x25b)](JSON[_0x284bd3(0x1b7)](_0x5a6674)+'\x0a');else{if(_0x286198===_0x284bd3(0x219))stdout[_0x284bd3(0x25b)]('\x0a');}if(_0x5a6674[_0x284bd3(0x229)]!==_0x284bd3(0x275))process[_0x284bd3(0x1f4)]=cliExitCode(_0x5a6674[_0x284bd3(0x1e4)]);}while(_0x10afba);}finally{process[_0x284bd3(0x22a)](_0x284bd3(0x1ed),_0x2972de);}}finally{_0x22e831[_0x284bd3(0x218)](),await _0x44c25d[_0x284bd3(0x1d1)]();}}function runtimeModels(_0x2c3a7a,_0x19d2a4){const _0x1a2970=_0x12fdd3,_0x465728=_0x19d2a4!==undefined&&_0x2c3a7a[_0x1a2970(0x222)](_0x4bf9a1=>_0x4bf9a1[_0x1a2970(0x25c)]===_0x1a2970(0x1f8))?new CodexAuthFileCredentialProvider(_0x19d2a4):undefined;return{'models':_0x2c3a7a[_0x1a2970(0x215)](_0x3f766b=>{const _0x310311=_0x1a2970,{credentialSource:_0x1c8e19,..._0x19bfed}=_0x3f766b;if(_0x1c8e19===undefined)return[_0x19bfed];return _0x465728===undefined?[]:[{..._0x19bfed,'responsesEncoding':_0x19bfed[_0x310311(0x269)]??_0x310311(0x26c),'credentialProvider':_0x465728}];}),'providers':_0x465728===undefined?[]:[_0x465728]};}function assertExternalCredentialAvailable(_0x13e85a,_0x449ba9){const _0x5a2b10=_0x12fdd3;if(_0x13e85a[_0x5a2b10(0x25c)]===_0x5a2b10(0x1f8)&&_0x449ba9===undefined)throw new MarAgentError(_0x5a2b10(0x235),_0x5a2b10(0x1cd));}function cliExitCode(_0xec33ba){const _0x23582f=_0x12fdd3;if(_0xec33ba===undefined)return-0x1237*-0x1+0x845+-0x1a7b;if(_0xec33ba[_0x23582f(0x1c4)](_0x23582f(0x1fa))||_0xec33ba[_0x23582f(0x1c4)](_0x23582f(0x1cf))||_0xec33ba[_0x23582f(0x1c4)](_0x23582f(0x1bb)))return-0x16*-0x84+-0x9ff*-0x2+-0x1f53;if(_0xec33ba[_0x23582f(0x1c4)](_0x23582f(0x21c))||_0xec33ba[_0x23582f(0x1c4)](_0x23582f(0x208))||_0xec33ba[_0x23582f(0x1c4)](_0x23582f(0x20d))||_0xec33ba[_0x23582f(0x1c4)](_0x23582f(0x207)))return-0x16fb*0x1+0x483+0x127c;if(_0xec33ba[_0x23582f(0x1c4)](_0x23582f(0x230))||_0xec33ba[_0x23582f(0x1c4)](_0x23582f(0x1c7)))return 0x1f12+0x20e+0x36*-0x9d;return-0x1f25+-0x9*0x22d+-0x5a3*-0x9;}function parseExecutionInvocation(_0x2b3e51){const _0x52a5d1=_0x12fdd3,_0x4434cb=/^\/(plan|compact)(?:\s+([\s\S]*))?$/u[_0x52a5d1(0x26b)](_0x2b3e51[_0x52a5d1(0x1d3)]());if(!_0x4434cb)return{'mode':_0x52a5d1(0x1db),'prompt':_0x2b3e51};const _0x54c478=_0x4434cb[0x20b9+0x1bb2+0x1a2*-0x25],_0x1dac2b=_0x4434cb[-0x18e+-0x1190*-0x1+-0x1000]?.[_0x52a5d1(0x1d3)]();return{'mode':_0x54c478,'prompt':_0x1dac2b||(_0x54c478===_0x52a5d1(0x1f5)?_0x52a5d1(0x26a):DEFAULT_COMPACTION_FOCUS)};}main()[_0x12fdd3(0x22d)](_0x472d1d=>{const _0xca8f6=_0x12fdd3,_0x3e4c90=describeMarAgentError(_0x472d1d,_0xca8f6(0x1d4),_0xca8f6(0x262));process[_0xca8f6(0x21b)][_0xca8f6(0x25b)](_0x3e4c90[_0xca8f6(0x20e)]+'\x0a'),process[_0xca8f6(0x1f4)]=cliExitCode(_0x3e4c90[_0xca8f6(0x264)]);});
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
import { createInterface } from 'node:readline/promises';
|
|
5
|
+
import { stdin, stdout } from 'node:process';
|
|
6
|
+
import { CodexAuthFileCredentialProvider } from './codex-auth-file.js';
|
|
7
|
+
import { describeMarAgentError, MarAgentError } from '../error.js';
|
|
8
|
+
import { LocalAgentHost } from '../host/local-agent-host.js';
|
|
9
|
+
import { readModelCatalog, writeModelCatalog } from '../model/catalog-file.js';
|
|
10
|
+
import { marAgentReasoningEffortSchema, resolveModelDefaultReasoningEffort, SecretValue } from '../model/configuration.js';
|
|
11
|
+
import { AnthropicMessagesAdapter } from '../model/anthropic-messages.js';
|
|
12
|
+
import { OpenAiResponsesAdapter } from '../model/openai-responses.js';
|
|
13
|
+
import { DEFAULT_COMPACTION_FOCUS } from '../runtime/compact.js';
|
|
14
|
+
import { createMarAgent } from '../sdk/agent.js';
|
|
15
|
+
const HELP = `maragent - MAR coding agent
|
|
16
|
+
|
|
17
|
+
Usage:
|
|
18
|
+
maragent [--model ID] [--reasoning-effort EFFORT] [--access on-request|full-access] [--codex-auth-file PATH]
|
|
19
|
+
maragent run <prompt> [--reasoning-effort EFFORT] [--format text|json|stream-json] [--codex-auth-file PATH]
|
|
20
|
+
maragent resume [sessionId] [--reasoning-effort EFFORT] [--codex-auth-file PATH]
|
|
21
|
+
maragent sessions list|delete <sessionId>
|
|
22
|
+
maragent models list|add|edit|remove|test [id] [--default-reasoning-effort EFFORT] [--code-mode|--no-code-mode] [--responses-encoding standard|lite] [--codex-auth-file PATH]
|
|
23
|
+
`;
|
|
24
|
+
function takeOption(arguments_, name) {
|
|
25
|
+
const index = arguments_.indexOf(name);
|
|
26
|
+
if (index < 0)
|
|
27
|
+
return undefined;
|
|
28
|
+
if (arguments_.indexOf(name, index + 1) >= 0)
|
|
29
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', `${name} cannot be repeated.`);
|
|
30
|
+
const value = arguments_[index + 1];
|
|
31
|
+
if (!value)
|
|
32
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', `${name} requires a value.`);
|
|
33
|
+
arguments_.splice(index, 2);
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
async function loadCatalog(home) {
|
|
37
|
+
return readModelCatalog(home);
|
|
38
|
+
}
|
|
39
|
+
function takeFlag(arguments_, name) {
|
|
40
|
+
const index = arguments_.indexOf(name);
|
|
41
|
+
if (index < 0)
|
|
42
|
+
return false;
|
|
43
|
+
arguments_.splice(index, 1);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
function booleanFlag(arguments_, enabled, disabled, fallback) {
|
|
47
|
+
const on = takeFlag(arguments_, enabled);
|
|
48
|
+
const off = takeFlag(arguments_, disabled);
|
|
49
|
+
if (on && off)
|
|
50
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', `${enabled} and ${disabled} cannot be combined.`);
|
|
51
|
+
return on ? true : off ? false : fallback;
|
|
52
|
+
}
|
|
53
|
+
async function readApiKey() {
|
|
54
|
+
if (stdin.isTTY)
|
|
55
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', '--api-key-stdin requires piped stdin.');
|
|
56
|
+
stdin.setEncoding('utf8');
|
|
57
|
+
let value = '';
|
|
58
|
+
for await (const chunk of stdin)
|
|
59
|
+
value += chunk;
|
|
60
|
+
if (!value.trim())
|
|
61
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', 'API key stdin was empty.');
|
|
62
|
+
return value.trim();
|
|
63
|
+
}
|
|
64
|
+
async function modelsCommand(home, arguments_, codexAuthFile) {
|
|
65
|
+
const action = arguments_[1];
|
|
66
|
+
const catalog = await loadCatalog(home);
|
|
67
|
+
if (action === 'list') {
|
|
68
|
+
for (const model of catalog.models)
|
|
69
|
+
stdout.write(`${model.id}\t${model.name}\t${model.protocol}\t${model.modelId}\tcredential=${model.apiKey === undefined ? 'codex-auth-file' : 'api-key'}\n`);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const id = arguments_[2];
|
|
73
|
+
if (!id)
|
|
74
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', 'Model id is required.');
|
|
75
|
+
const existing = catalog.models.find((model) => model.id === id);
|
|
76
|
+
if (action === 'remove') {
|
|
77
|
+
if (!existing)
|
|
78
|
+
throw new MarAgentError('MAR_AGENT_MODEL_NOT_FOUND', 'Model was not found.');
|
|
79
|
+
if (!takeFlag(arguments_, '--yes') && !stdin.isTTY)
|
|
80
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', 'Non-interactive removal requires --yes.');
|
|
81
|
+
await writeModelCatalog(home, {
|
|
82
|
+
version: 1,
|
|
83
|
+
models: catalog.models.filter((model) => model.id !== id),
|
|
84
|
+
...(catalog.defaultModelId && catalog.defaultModelId !== id
|
|
85
|
+
? { defaultModelId: catalog.defaultModelId }
|
|
86
|
+
: {})
|
|
87
|
+
});
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (action === 'test') {
|
|
91
|
+
if (!existing)
|
|
92
|
+
throw new MarAgentError('MAR_AGENT_MODEL_NOT_FOUND', 'Model was not found.');
|
|
93
|
+
assertExternalCredentialAvailable(existing, codexAuthFile);
|
|
94
|
+
const runtime = runtimeModels([existing], codexAuthFile);
|
|
95
|
+
const adapter = existing.protocol === 'OPENAI_RESPONSES'
|
|
96
|
+
? new OpenAiResponsesAdapter(runtime.models[0])
|
|
97
|
+
: new AnthropicMessagesAdapter(runtime.models[0]);
|
|
98
|
+
try {
|
|
99
|
+
let response = '';
|
|
100
|
+
for await (const event of adapter.start({ system: 'Reply OK.', messages: [{ role: 'user', content: 'Reply OK.' }], tools: [] }, AbortSignal.timeout(30_000)))
|
|
101
|
+
if (event.type === 'text.completed')
|
|
102
|
+
response = event.text;
|
|
103
|
+
stdout.write(`${JSON.stringify({ success: true, modelId: id, response: response.slice(0, 80) })}\n`);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
await Promise.all(runtime.providers.map((provider) => provider.close()));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (action !== 'add' && action !== 'edit')
|
|
111
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', 'Unknown model command.');
|
|
112
|
+
if (action === 'add' && existing)
|
|
113
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', 'Model id already exists.');
|
|
114
|
+
if (action === 'edit' && !existing)
|
|
115
|
+
throw new MarAgentError('MAR_AGENT_MODEL_NOT_FOUND', 'Model was not found.');
|
|
116
|
+
const option = (name, fallback) => takeOption(arguments_, name) ?? fallback;
|
|
117
|
+
const integer = (name, fallback) => {
|
|
118
|
+
const raw = takeOption(arguments_, name);
|
|
119
|
+
const value = raw === undefined ? fallback : Number(raw);
|
|
120
|
+
if (!Number.isSafeInteger(value) || value <= 0)
|
|
121
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', `${name} is invalid.`);
|
|
122
|
+
return value;
|
|
123
|
+
};
|
|
124
|
+
const protocol = option('--protocol', existing?.protocol ?? 'ANTHROPIC_MESSAGES');
|
|
125
|
+
if (protocol !== 'OPENAI_RESPONSES' && protocol !== 'ANTHROPIC_MESSAGES')
|
|
126
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', '--protocol is invalid.');
|
|
127
|
+
const required = (value, name) => {
|
|
128
|
+
if (!value)
|
|
129
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', `${name} is required.`);
|
|
130
|
+
return value;
|
|
131
|
+
};
|
|
132
|
+
const credential = option('--credential', existing?.credentialSource === 'CODEX_AUTH_FILE' ? 'codex-auth-file' : 'api-key') ?? 'api-key';
|
|
133
|
+
if (credential !== 'api-key' && credential !== 'codex-auth-file')
|
|
134
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', '--credential is invalid.');
|
|
135
|
+
const readsApiKey = takeFlag(arguments_, '--api-key-stdin');
|
|
136
|
+
if (credential === 'codex-auth-file' && readsApiKey)
|
|
137
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', '--api-key-stdin cannot be combined with an external credential.');
|
|
138
|
+
const responsesTransport = parseResponsesTransport(option('--responses-transport'), protocol, existing?.responsesTransport);
|
|
139
|
+
const encodingOption = option('--responses-encoding');
|
|
140
|
+
if (encodingOption !== undefined &&
|
|
141
|
+
(protocol !== 'OPENAI_RESPONSES' || !['standard', 'lite'].includes(encodingOption)))
|
|
142
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', '--responses-encoding is invalid.');
|
|
143
|
+
const responsesEncoding = protocol === 'OPENAI_RESPONSES'
|
|
144
|
+
? (encodingOption?.toUpperCase() ??
|
|
145
|
+
existing?.responsesEncoding ??
|
|
146
|
+
'STANDARD')
|
|
147
|
+
: undefined;
|
|
148
|
+
const reasoningEffortsOption = option('--reasoning-efforts');
|
|
149
|
+
const reasoningEfforts = reasoningEffortsOption === undefined
|
|
150
|
+
? (existing?.reasoningEfforts ?? [])
|
|
151
|
+
: reasoningEffortsOption
|
|
152
|
+
.split(',')
|
|
153
|
+
.filter(Boolean)
|
|
154
|
+
.map((effort) => parseReasoningEffort(effort, '--reasoning-efforts'));
|
|
155
|
+
const defaultReasoningEffortOption = option('--default-reasoning-effort');
|
|
156
|
+
const model = {
|
|
157
|
+
id,
|
|
158
|
+
name: required(option('--name', existing?.name), '--name'),
|
|
159
|
+
protocol,
|
|
160
|
+
baseUrl: required(option('--url', existing?.baseUrl), '--url'),
|
|
161
|
+
...(credential === 'codex-auth-file'
|
|
162
|
+
? { credentialSource: 'CODEX_AUTH_FILE' }
|
|
163
|
+
: {
|
|
164
|
+
apiKey: new SecretValue(readsApiKey
|
|
165
|
+
? await readApiKey()
|
|
166
|
+
: required(existing?.apiKey?.reveal(), '--api-key-stdin'))
|
|
167
|
+
}),
|
|
168
|
+
modelId: required(option('--model', existing?.modelId), '--model'),
|
|
169
|
+
contextWindowTokens: integer('--context', existing?.contextWindowTokens ?? 200_000),
|
|
170
|
+
maxOutputTokens: integer('--max-output', existing?.maxOutputTokens ?? 16_384),
|
|
171
|
+
inputCapabilities: booleanFlag(arguments_, '--image', '--no-image', existing?.inputCapabilities.includes('IMAGE') ?? false)
|
|
172
|
+
? ['TEXT', 'IMAGE']
|
|
173
|
+
: ['TEXT'],
|
|
174
|
+
outputCapabilities: ['TEXT'],
|
|
175
|
+
reasoningEfforts,
|
|
176
|
+
defaultReasoningEffort: defaultReasoningEffortOption === undefined
|
|
177
|
+
? resolveModelDefaultReasoningEffort({
|
|
178
|
+
reasoningEfforts,
|
|
179
|
+
defaultReasoningEffort: existing?.defaultReasoningEffort
|
|
180
|
+
})
|
|
181
|
+
: parseReasoningEffort(defaultReasoningEffortOption, '--default-reasoning-effort'),
|
|
182
|
+
titleGeneration: existing?.titleGeneration ?? false,
|
|
183
|
+
codeMode: booleanFlag(arguments_, '--code-mode', '--no-code-mode', existing?.codeMode ?? false),
|
|
184
|
+
hostedWebSearch: booleanFlag(arguments_, '--web-search', '--no-web-search', existing?.hostedWebSearch ?? false),
|
|
185
|
+
...(responsesTransport === undefined ? {} : { responsesTransport }),
|
|
186
|
+
...(responsesEncoding === undefined ? {} : { responsesEncoding }),
|
|
187
|
+
responsesPreviousResponseId: booleanFlag(arguments_, '--responses-continuation', '--no-responses-continuation', existing?.responsesPreviousResponseId ?? false),
|
|
188
|
+
enabled: booleanFlag(arguments_, '--enabled', '--disabled', existing?.enabled ?? true)
|
|
189
|
+
};
|
|
190
|
+
await writeModelCatalog(home, {
|
|
191
|
+
version: 1,
|
|
192
|
+
defaultModelId: catalog.defaultModelId ?? id,
|
|
193
|
+
models: existing
|
|
194
|
+
? catalog.models.map((candidate) => (candidate.id === id ? model : candidate))
|
|
195
|
+
: [...catalog.models, model]
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
function parseReasoningEffort(value, optionName) {
|
|
199
|
+
const parsed = marAgentReasoningEffortSchema.safeParse(value.trim());
|
|
200
|
+
if (!parsed.success)
|
|
201
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', `${optionName} is invalid.`);
|
|
202
|
+
return parsed.data;
|
|
203
|
+
}
|
|
204
|
+
function parseResponsesTransport(value, protocol, existing) {
|
|
205
|
+
if (protocol !== 'OPENAI_RESPONSES') {
|
|
206
|
+
if (value !== undefined)
|
|
207
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', '--responses-transport requires OPENAI_RESPONSES.');
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
const selected = value?.toLowerCase();
|
|
211
|
+
if (selected === undefined)
|
|
212
|
+
return existing;
|
|
213
|
+
if (selected === 'websocket')
|
|
214
|
+
return { transport: 'WEBSOCKET' };
|
|
215
|
+
if (selected === 'http2')
|
|
216
|
+
return { transport: 'HTTP', httpVersion: '2' };
|
|
217
|
+
if (selected === 'http1' || selected === 'http1.1')
|
|
218
|
+
return { transport: 'HTTP', httpVersion: '1.1' };
|
|
219
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', '--responses-transport is invalid.');
|
|
220
|
+
}
|
|
221
|
+
async function main() {
|
|
222
|
+
const arguments_ = process.argv.slice(2);
|
|
223
|
+
const home = resolve(takeOption(arguments_, '--home') ?? homedir());
|
|
224
|
+
const codexAuthFile = takeOption(arguments_, '--codex-auth-file');
|
|
225
|
+
if (arguments_.includes('--help') || arguments_.includes('-h')) {
|
|
226
|
+
stdout.write(HELP);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const command = arguments_[0];
|
|
230
|
+
if (command === 'models') {
|
|
231
|
+
await modelsCommand(home, arguments_, codexAuthFile);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const workspace = process.cwd();
|
|
235
|
+
const catalog = await loadCatalog(home);
|
|
236
|
+
const modelId = takeOption(arguments_, '--model') ?? catalog.defaultModelId;
|
|
237
|
+
const reasoningEffortOption = takeOption(arguments_, '--reasoning-effort');
|
|
238
|
+
const reasoningEffort = reasoningEffortOption === undefined
|
|
239
|
+
? undefined
|
|
240
|
+
: parseReasoningEffort(reasoningEffortOption, '--reasoning-effort');
|
|
241
|
+
const access = (takeOption(arguments_, '--access') ?? 'on-request');
|
|
242
|
+
const format = takeOption(arguments_, '--format') ?? 'text';
|
|
243
|
+
if (access !== 'on-request' && access !== 'full-access')
|
|
244
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', 'Access must be on-request or full-access.');
|
|
245
|
+
const selectedModel = catalog.models.find((model) => model.id === modelId && model.enabled);
|
|
246
|
+
if (selectedModel !== undefined)
|
|
247
|
+
assertExternalCredentialAvailable(selectedModel, codexAuthFile);
|
|
248
|
+
if (reasoningEffort && selectedModel && !selectedModel.reasoningEfforts.includes(reasoningEffort))
|
|
249
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', `Reasoning effort "${reasoningEffort}" is not supported by model "${selectedModel.id}".`);
|
|
250
|
+
const interactive = command !== 'run';
|
|
251
|
+
let prompt = command === 'run' ? arguments_.slice(1).join(' ') : '';
|
|
252
|
+
const terminal = createInterface({ input: stdin, output: stdout });
|
|
253
|
+
const host = new LocalAgentHost({
|
|
254
|
+
homeDirectory: home,
|
|
255
|
+
workspace,
|
|
256
|
+
approve: async (call) => {
|
|
257
|
+
if (!stdin.isTTY)
|
|
258
|
+
return 'denied';
|
|
259
|
+
const answer = await terminal.question(`Approve ${call.name}? [y/N] `);
|
|
260
|
+
return /^y(es)?$/i.test(answer.trim()) ? 'approved' : 'denied';
|
|
261
|
+
},
|
|
262
|
+
question: async (request) => {
|
|
263
|
+
if (!stdin.isTTY)
|
|
264
|
+
throw new MarAgentError('MAR_AGENT_USER_INPUT_UNAVAILABLE', 'Interactive input is unavailable.');
|
|
265
|
+
const answers = {};
|
|
266
|
+
for (const question of request.questions) {
|
|
267
|
+
const value = question;
|
|
268
|
+
const id = typeof value.id === 'string' ? value.id : String(Object.keys(answers).length);
|
|
269
|
+
answers[id] = await terminal.question(`${typeof value.question === 'string' ? value.question : JSON.stringify(question)} `);
|
|
270
|
+
}
|
|
271
|
+
return answers;
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
const runtime = runtimeModels(catalog.models, codexAuthFile);
|
|
275
|
+
const agent = await createMarAgent({
|
|
276
|
+
mode: 'normal',
|
|
277
|
+
host,
|
|
278
|
+
models: runtime.models,
|
|
279
|
+
...(modelId === undefined ? {} : { defaultModelId: modelId })
|
|
280
|
+
});
|
|
281
|
+
try {
|
|
282
|
+
if (command === 'sessions' && arguments_[1] === 'list') {
|
|
283
|
+
stdout.write(`${JSON.stringify(await agent.listSessions(), null, takeFlag(arguments_, '--json') ? 0 : 2)}\n`);
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
if (command === 'sessions' && arguments_[1] === 'delete' && arguments_[2]) {
|
|
287
|
+
if (!takeFlag(arguments_, '--yes') && !stdin.isTTY)
|
|
288
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', 'Non-interactive deletion requires --yes.');
|
|
289
|
+
await agent.deleteSession(arguments_[2]);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
if (command === 'sessions')
|
|
293
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', 'Unknown sessions command.');
|
|
294
|
+
let resumeId = command === 'resume' ? arguments_[1] : undefined;
|
|
295
|
+
if (command === 'resume' && !resumeId) {
|
|
296
|
+
if (!stdin.isTTY)
|
|
297
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', 'resume requires a session id.');
|
|
298
|
+
const listed = (await agent.listSessions());
|
|
299
|
+
for (const item of listed.sessions ?? [])
|
|
300
|
+
stdout.write(`${item.id}\t${item.title}\t${item.lastActivityAt}\n`);
|
|
301
|
+
resumeId = (await terminal.question('Session ID: ')).trim();
|
|
302
|
+
if (!resumeId)
|
|
303
|
+
throw new MarAgentError('MAR_AGENT_CLI_ARGUMENT_INVALID', 'Session id is required.');
|
|
304
|
+
}
|
|
305
|
+
const session = resumeId
|
|
306
|
+
? await agent.openSession(resumeId)
|
|
307
|
+
: await agent.createSession({
|
|
308
|
+
workspace
|
|
309
|
+
});
|
|
310
|
+
let activeHandle;
|
|
311
|
+
let interrupts = 0;
|
|
312
|
+
const interrupt = () => {
|
|
313
|
+
interrupts++;
|
|
314
|
+
if (activeHandle)
|
|
315
|
+
activeHandle.cancel();
|
|
316
|
+
else
|
|
317
|
+
terminal.close();
|
|
318
|
+
process.exitCode = 130;
|
|
319
|
+
if (interrupts > 1)
|
|
320
|
+
activeHandle?.cancel();
|
|
321
|
+
};
|
|
322
|
+
process.on('SIGINT', interrupt);
|
|
323
|
+
try {
|
|
324
|
+
do {
|
|
325
|
+
if (interactive)
|
|
326
|
+
prompt = await terminal.question('> ');
|
|
327
|
+
if (!prompt.trim())
|
|
328
|
+
break;
|
|
329
|
+
const invocation = parseExecutionInvocation(prompt);
|
|
330
|
+
const runInput = {
|
|
331
|
+
prompt: invocation.prompt,
|
|
332
|
+
access,
|
|
333
|
+
...(modelId === undefined ? {} : { modelId }),
|
|
334
|
+
...(reasoningEffort === undefined ? {} : { reasoningEffort })
|
|
335
|
+
};
|
|
336
|
+
const handle = invocation.mode === 'plan'
|
|
337
|
+
? session.plan(runInput)
|
|
338
|
+
: invocation.mode === 'compact'
|
|
339
|
+
? session.compact(runInput)
|
|
340
|
+
: session.run(runInput);
|
|
341
|
+
activeHandle = handle;
|
|
342
|
+
for await (const event of handle) {
|
|
343
|
+
if (format === 'stream-json')
|
|
344
|
+
stdout.write(`${JSON.stringify(event)}\n`);
|
|
345
|
+
else if (event.type === 'message.delta')
|
|
346
|
+
stdout.write(event.delta);
|
|
347
|
+
}
|
|
348
|
+
const result = await handle.result();
|
|
349
|
+
activeHandle = undefined;
|
|
350
|
+
if (format === 'json')
|
|
351
|
+
stdout.write(`${JSON.stringify(result)}\n`);
|
|
352
|
+
else if (format === 'text')
|
|
353
|
+
stdout.write('\n');
|
|
354
|
+
if (result.status !== 'completed')
|
|
355
|
+
process.exitCode = cliExitCode(result.errorCode);
|
|
356
|
+
} while (interactive);
|
|
357
|
+
}
|
|
358
|
+
finally {
|
|
359
|
+
process.off('SIGINT', interrupt);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
finally {
|
|
363
|
+
terminal.close();
|
|
364
|
+
await agent.dispose();
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
function runtimeModels(models, codexAuthFile) {
|
|
368
|
+
const provider = codexAuthFile !== undefined &&
|
|
369
|
+
models.some((model) => model.credentialSource === 'CODEX_AUTH_FILE')
|
|
370
|
+
? new CodexAuthFileCredentialProvider(codexAuthFile)
|
|
371
|
+
: undefined;
|
|
372
|
+
return {
|
|
373
|
+
models: models.flatMap((model) => {
|
|
374
|
+
const { credentialSource, ...configuration } = model;
|
|
375
|
+
if (credentialSource === undefined)
|
|
376
|
+
return [configuration];
|
|
377
|
+
return provider === undefined
|
|
378
|
+
? []
|
|
379
|
+
: [
|
|
380
|
+
{
|
|
381
|
+
...configuration,
|
|
382
|
+
responsesEncoding: configuration.responsesEncoding ?? 'STANDARD',
|
|
383
|
+
credentialProvider: provider
|
|
384
|
+
}
|
|
385
|
+
];
|
|
386
|
+
}),
|
|
387
|
+
providers: provider === undefined ? [] : [provider]
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
function assertExternalCredentialAvailable(model, codexAuthFile) {
|
|
391
|
+
if (model.credentialSource === 'CODEX_AUTH_FILE' && codexAuthFile === undefined)
|
|
392
|
+
throw new MarAgentError('MAR_AGENT_MODEL_AUTH_FAILED', 'Codex auth file is required for the selected model.');
|
|
393
|
+
}
|
|
394
|
+
function cliExitCode(code) {
|
|
395
|
+
if (code === undefined)
|
|
396
|
+
return 1;
|
|
397
|
+
if (code.includes('APPROVAL') ||
|
|
398
|
+
code.includes('USER_INPUT_UNAVAILABLE') ||
|
|
399
|
+
code.includes('DENIED'))
|
|
400
|
+
return 3;
|
|
401
|
+
if (code.includes('AUTH') ||
|
|
402
|
+
code.includes('CREDENTIAL') ||
|
|
403
|
+
code.includes('CONNECTION') ||
|
|
404
|
+
code.includes('TIMEOUT'))
|
|
405
|
+
return 4;
|
|
406
|
+
if (code.includes('ARGUMENT') || code.includes('CONFIG'))
|
|
407
|
+
return 2;
|
|
408
|
+
return 1;
|
|
409
|
+
}
|
|
410
|
+
function parseExecutionInvocation(input) {
|
|
411
|
+
const match = /^\/(plan|compact)(?:\s+([\s\S]*))?$/u.exec(input.trim());
|
|
412
|
+
if (!match)
|
|
413
|
+
return { mode: 'run', prompt: input };
|
|
414
|
+
const mode = match[1];
|
|
415
|
+
const argument = match[2]?.trim();
|
|
416
|
+
return {
|
|
417
|
+
mode,
|
|
418
|
+
prompt: argument ||
|
|
419
|
+
(mode === 'plan'
|
|
420
|
+
? 'Investigate the current objective, resolve discoverable uncertainty, and produce an executable implementation and verification plan without claiming the work is complete.'
|
|
421
|
+
: DEFAULT_COMPACTION_FOCUS)
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
main().catch((error) => {
|
|
425
|
+
const diagnostic = describeMarAgentError(error, 'MAR_AGENT_CLI_FAILED', 'CLI command failed.');
|
|
426
|
+
process.stderr.write(`${diagnostic.message}\n`);
|
|
427
|
+
process.exitCode = cliExitCode(diagnostic.code);
|
|
428
|
+
});
|
package/dist/error.js
CHANGED
|
@@ -1,2 +1,66 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export class MarAgentError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
details;
|
|
4
|
+
retryable;
|
|
5
|
+
constructor(code, message, options = {}) {
|
|
6
|
+
super(`${code}: ${message}`, { cause: options.cause });
|
|
7
|
+
this.name = 'MarAgentError';
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.details = options.details;
|
|
10
|
+
this.retryable = options.retryable ?? false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
const MAX_ERROR_MESSAGE_CHARACTERS = 1_000;
|
|
14
|
+
export function describeMarAgentError(error, fallbackCode, fallbackMessage = 'MAR Agent operation failed.') {
|
|
15
|
+
const code = diagnosticCode(error) ?? fallbackCode;
|
|
16
|
+
const messages = [];
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
let current = error;
|
|
19
|
+
while (current !== undefined && current !== null && !seen.has(current) && messages.length < 4) {
|
|
20
|
+
seen.add(current);
|
|
21
|
+
const currentCode = diagnosticCode(current);
|
|
22
|
+
const message = diagnosticMessage(current, currentCode);
|
|
23
|
+
if (message && !messages.includes(message))
|
|
24
|
+
messages.push(message);
|
|
25
|
+
current = diagnosticCause(current);
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
code,
|
|
29
|
+
message: truncateErrorMessage(messages.join(' Caused by: ') || fallbackMessage)
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function diagnosticCode(value) {
|
|
33
|
+
if (value instanceof MarAgentError)
|
|
34
|
+
return value.code;
|
|
35
|
+
if (value === null || typeof value !== 'object' || !('code' in value))
|
|
36
|
+
return undefined;
|
|
37
|
+
const code = value.code;
|
|
38
|
+
return typeof code === 'string' && code.trim().length > 0 ? code.trim().slice(0, 80) : undefined;
|
|
39
|
+
}
|
|
40
|
+
function diagnosticMessage(value, code) {
|
|
41
|
+
const message = value instanceof Error
|
|
42
|
+
? value.message
|
|
43
|
+
: value !== null &&
|
|
44
|
+
typeof value === 'object' &&
|
|
45
|
+
'message' in value &&
|
|
46
|
+
typeof value.message === 'string'
|
|
47
|
+
? value.message
|
|
48
|
+
: typeof value === 'string'
|
|
49
|
+
? value
|
|
50
|
+
: undefined;
|
|
51
|
+
const normalized = message?.trim();
|
|
52
|
+
if (!normalized)
|
|
53
|
+
return undefined;
|
|
54
|
+
const withoutDuplicatedCode = code !== undefined && normalized.startsWith(`${code}: `)
|
|
55
|
+
? normalized.slice(code.length + 2)
|
|
56
|
+
: normalized;
|
|
57
|
+
return code === undefined ? withoutDuplicatedCode : `${code}: ${withoutDuplicatedCode}`;
|
|
58
|
+
}
|
|
59
|
+
function diagnosticCause(value) {
|
|
60
|
+
if (value === null || typeof value !== 'object' || !('cause' in value))
|
|
61
|
+
return undefined;
|
|
62
|
+
return value.cause;
|
|
63
|
+
}
|
|
64
|
+
function truncateErrorMessage(value) {
|
|
65
|
+
return [...value].slice(0, MAX_ERROR_MESSAGE_CHARACTERS).join('');
|
|
66
|
+
}
|
package/dist/host/contracts.js
CHANGED
|
@@ -1,2 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { MarAgentError } from '../error.js';
|
|
2
|
+
export const MAR_AGENT_HOST_API_VERSION = '1.0';
|
|
3
|
+
const requiredCapabilities = [
|
|
4
|
+
'workspace.read',
|
|
5
|
+
'workspace.patch',
|
|
6
|
+
'process.manage',
|
|
7
|
+
'approval.request',
|
|
8
|
+
'user-input.request',
|
|
9
|
+
'event.publish',
|
|
10
|
+
'session.store'
|
|
11
|
+
];
|
|
12
|
+
export function negotiateHost(description) {
|
|
13
|
+
const match = /^(\d+)\.(\d+)$/.exec(description.apiVersion);
|
|
14
|
+
const missing = requiredCapabilities.filter((capability) => !description.capabilities.includes(capability));
|
|
15
|
+
if (match === null || Number(match[1]) !== 1 || Number(match[2]) < 0 || missing.length > 0)
|
|
16
|
+
throw new MarAgentError('MAR_AGENT_HOST_INCOMPATIBLE', 'Host API is incompatible.', {
|
|
17
|
+
details: { expected: MAR_AGENT_HOST_API_VERSION, actual: description.apiVersion, missing }
|
|
18
|
+
});
|
|
19
|
+
return description;
|
|
20
|
+
}
|