@myagentroam/agent 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/cli/codex-auth-file.js +268 -3
- package/dist/cli/main.js +431 -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 +9 -7
- 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
|
@@ -1,2 +1,312 @@
|
|
|
1
|
-
|
|
2
|
-
const _0x1949c0=_0x225c;(function(_0x1a232c,_0x36a759){const _0x253f40=_0x225c,_0x2f4426=_0x1a232c();while(!![]){try{const _0x20f49d=-parseInt(_0x253f40(0x1b8))/(0x1e91*0x1+-0x8*-0x347+0x278*-0x17)*(-parseInt(_0x253f40(0x182))/(0xa78+0x15be+-0x2034))+-parseInt(_0x253f40(0x18e))/(0x1fed+0x89c+-0x2886)+-parseInt(_0x253f40(0x166))/(0xe*-0x21b+-0x1861+0x35df*0x1)+-parseInt(_0x253f40(0x15a))/(-0x1ad6+0x7b2+0x663*0x3)*(parseInt(_0x253f40(0x165))/(0x1852+0x55*-0x59+0x541*0x1))+parseInt(_0x253f40(0x15b))/(0x1959+-0x82e+-0x2*0x892)*(parseInt(_0x253f40(0x1ad))/(-0x1093+-0x61*0x36+0xc5b*0x3))+parseInt(_0x253f40(0x134))/(0xef5+-0xacf*-0x1+0x3ad*-0x7)+-parseInt(_0x253f40(0x19e))/(0x207d+-0x158e+-0xae5)*(-parseInt(_0x253f40(0x139))/(-0x1*0x1d35+0x16a7+0x233*0x3));if(_0x20f49d===_0x36a759)break;else _0x2f4426['push'](_0x2f4426['shift']());}catch(_0x1bdbe8){_0x2f4426['push'](_0x2f4426['shift']());}}}(_0x3b32,-0x3*-0x70bf1+0x19963*0x10+-0x1ffac6));import{createHash,randomUUID}from'node:crypto';import{mkdir,rename,rm,writeFile}from'node:fs/promises';import{basename,isAbsolute,join,posix}from'node:path';import{MarAgentError}from'../error.js';import{fetchModelResponse}from'../model/http.js';import{acquireModelCredential,appendModelCredentialHeaders}from'../model/runtime-credential.js';import{TOOL_EXECUTION_LIMITS}from'./execution-limits.js';const RESPONSE_MAX_BYTES=Math[_0x1949c0(0x1c3)](TOOL_EXECUTION_LIMITS[_0x1949c0(0x14f)]*(-0x2215+-0x5e6+0x27ff*0x1)/(0xca3*-0x1+0x2518+0x7*-0x37e))+(0x10a5*0x1+0x179b+-0x1840),RESERVED_HEADERS=new Set([_0x1949c0(0x13d),_0x1949c0(0x1b0),_0x1949c0(0x19a),_0x1949c0(0x18b),_0x1949c0(0x13e),_0x1949c0(0x1a8),_0x1949c0(0x17a),_0x1949c0(0x13f),_0x1949c0(0x16b)]),PNG_SIGNATURE=Buffer[_0x1949c0(0x173)]([-0x1406+0x1*0x1241+-0x24e*-0x1,-0x18bc+-0x25c2+0x1f67*0x2,0x1e6d+0x1690+-0x34af*0x1,0x20ec+0xa6+0x9*-0x3b3,0x611*-0x1+-0x267c+-0x6*-0x76f,-0x335*0x1+0x7*-0x341+0x1a06,-0x2*-0xa61+-0xc22+0x2*-0x443,-0x19fd+-0x1db0+-0x1*-0x37b7]),MAX_EDIT_IMAGES=0x65*0x63+-0x23*-0x71+-0xd*0x431,SUPPORTED_EDIT_MIME_TYPES=new Set([_0x1949c0(0x1bd),_0x1949c0(0x144),_0x1949c0(0x156)]),IMAGE_GENERATION_ATTEMPTS=-0x8ed+0x3*0x155+-0x1a5*-0x3,IMAGE_GENERATION_RESPONSE_TIMEOUT_MS=(-0x12d7+0x39d+-0x515*-0x3)*(-0x12fe+-0x37*0xad+0x1*0x3865)*(0x153d*0x1+-0x2214+-0x1*-0x10bf);export const codexImageGenToolDefinition={'name':_0x1949c0(0x1c0),'description':_0x1949c0(0x14a),'inputSchema':{'type':_0x1949c0(0x13b),'properties':{'prompt':{'type':_0x1949c0(0x1a3),'minLength':0x1,'maxLength':0x8000},'referenced_image_paths':{'type':_0x1949c0(0x140),'maxItems':MAX_EDIT_IMAGES,'items':{'type':_0x1949c0(0x1a3),'description':_0x1949c0(0x1a1)}},'num_last_images_to_include':{'type':_0x1949c0(0x14b),'minimum':0x1,'maximum':MAX_EDIT_IMAGES,'description':_0x1949c0(0x146)}},'required':[_0x1949c0(0x16f)],'additionalProperties':![]}};function _0x225c(_0x18b137,_0x3418b6){_0x18b137=_0x18b137-(-0xd*0xb1+0x18*-0xe9+0x29*0xc8);const _0xc4b12a=_0x3b32();let _0xfe6ce0=_0xc4b12a[_0x18b137];if(_0x225c['MTVuum']===undefined){var _0x4f9910=function(_0x252e8c){const _0x21e854='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x444624='',_0x18007c='';for(let _0x3c5b05=0x94d+-0xa46+0xf9,_0x34c6a9,_0x499c06,_0x617eb7=-0x7*0x38c+0x2*0xd7e+-0x45*0x8;_0x499c06=_0x252e8c['charAt'](_0x617eb7++);~_0x499c06&&(_0x34c6a9=_0x3c5b05%(0x1e8f*0x1+0xa89*0x1+-0x2914)?_0x34c6a9*(-0xafd*0x1+0xb*-0x1d2+-0x1f43*-0x1)+_0x499c06:_0x499c06,_0x3c5b05++%(-0x18bc+-0x25c2+0x7f*0x7e))?_0x444624+=String['fromCharCode'](0x1e6d+0x1690+-0x19ff*0x2&_0x34c6a9>>(-(0x20ec+0xa6+0x30*-0xb3)*_0x3c5b05&0x611*-0x1+-0x267c+-0x1*-0x2c93)):-0x335*0x1+0x7*-0x341+0x19fc){_0x499c06=_0x21e854['indexOf'](_0x499c06);}for(let _0x590ed5=-0x2*-0xa61+-0xc22+0x2e*-0x30,_0x53ff2a=_0x444624['length'];_0x590ed5<_0x53ff2a;_0x590ed5++){_0x18007c+='%'+('00'+_0x444624['charCodeAt'](_0x590ed5)['toString'](-0x19fd+-0x1db0+-0x1*-0x37bd))['slice'](-(0x65*0x63+-0x23*-0x71+-0x4*0xda0));}return decodeURIComponent(_0x18007c);};_0x225c['cHPUfu']=_0x4f9910,_0x225c['ACwzqy']={},_0x225c['MTVuum']=!![];}const _0xc87bc3=_0xc4b12a[-0x8ed+0x3*0x155+-0x277*-0x2];_0x225c['zspUVb']!==_0xc87bc3&&(_0x225c['ACwzqy']={},_0x225c['zspUVb']=_0xc87bc3);const _0x1881ec=_0x225c['ACwzqy'][_0x18b137];return _0x1881ec===undefined?(_0xfe6ce0=_0x225c['cHPUfu'](_0xfe6ce0),_0x225c['ACwzqy'][_0x18b137]=_0xfe6ce0):_0xfe6ce0=_0x1881ec,_0xfe6ce0;}export const bytedArkImageGenToolDefinition={...codexImageGenToolDefinition,'name':_0x1949c0(0x17e),'description':_0x1949c0(0x17b)};export async function executeCodexImageGen(_0x1e969a,_0x27e7d1){const _0x4da5c7=_0x1949c0,_0x3cd9ff=_0x27e7d1[_0x4da5c7(0x1b1)][_0x4da5c7(0x177)];if(_0x3cd9ff===undefined||_0x3cd9ff[_0x4da5c7(0x147)]===undefined)throw new MarAgentError(_0x4da5c7(0x188),_0x4da5c7(0x1b4));const _0x1c84e0=parseInput(_0x1e969a),_0x323366=await selectedEditImages(_0x1c84e0,_0x27e7d1),_0x17658d=_0x3cd9ff[_0x4da5c7(0x198)]===_0x4da5c7(0x13c);if(!_0x17658d&&_0x3cd9ff[_0x4da5c7(0x198)]!==_0x4da5c7(0x161))throw new MarAgentError(_0x4da5c7(0x188),_0x4da5c7(0x162));const _0x466ceb=_0x323366[_0x4da5c7(0x184)]===0x14ab+-0x26*-0x1b+0x1*-0x18ad?_0x3cd9ff[_0x4da5c7(0x176)]:_0x3cd9ff[_0x4da5c7(0x19c)],_0x34fe6f=JSON[_0x4da5c7(0x1a4)](_0x17658d?{'model':_0x3cd9ff[_0x4da5c7(0x183)],'prompt':_0x1c84e0[_0x4da5c7(0x16f)],..._0x323366[_0x4da5c7(0x184)]===-0x1df2*0x1+-0x2*-0x9c5+-0x18*-0x6f?{}:{'image':_0x323366[_0x4da5c7(0x184)]===0x1001+0x1*-0x31a+-0xce6?_0x4da5c7(0x148)+_0x323366[-0x15cb+-0x1*-0x2513+-0xf48][_0x4da5c7(0x153)]+_0x4da5c7(0x199)+_0x323366[-0x14f7+-0x116*0x1+0x160d][_0x4da5c7(0x179)][_0x4da5c7(0x13a)](_0x4da5c7(0x170)):_0x323366[_0x4da5c7(0x172)](_0x3380b2=>_0x4da5c7(0x148)+_0x3380b2[_0x4da5c7(0x153)]+_0x4da5c7(0x199)+_0x3380b2[_0x4da5c7(0x179)][_0x4da5c7(0x13a)](_0x4da5c7(0x170)))},'size':'2K','output_format':_0x4da5c7(0x16a),'response_format':_0x4da5c7(0x163),'watermark':![],'stream':![],'sequential_image_generation':_0x4da5c7(0x1b5)}:{..._0x323366[_0x4da5c7(0x184)]===-0x74*0x43+-0x1316+0x18b9*0x2?{}:{'images':_0x323366[_0x4da5c7(0x172)](_0x182e1b=>({'image_url':_0x4da5c7(0x148)+_0x182e1b[_0x4da5c7(0x153)]+_0x4da5c7(0x199)+_0x182e1b[_0x4da5c7(0x179)][_0x4da5c7(0x13a)](_0x4da5c7(0x170))}))},'prompt':_0x1c84e0[_0x4da5c7(0x16f)],'background':_0x4da5c7(0x141),'model':_0x3cd9ff[_0x4da5c7(0x183)],'n':0x1,'quality':_0x4da5c7(0x141),'size':_0x4da5c7(0x141)}),_0x30cf00=randomUUID();let _0x432459=_0x4da5c7(0x15f);for(let _0x40a6b7=0x12*0xd8+0xe39+-0x1d69;_0x40a6b7<-0x18a3+0x74d+0x1158;_0x40a6b7++){let _0x3b40e9;const _0x4ba64c=await fetchModelResponse(_0x466ceb,async()=>{const _0x1603a5=_0x4da5c7,_0x3be2a0=await acquireModelCredential({'credentialProvider':_0x3cd9ff[_0x1603a5(0x147)]},_0x432459,_0x1603a5(0x14d));_0x3b40e9=_0x3be2a0[_0x1603a5(0x18a)];const _0x1760e2=appendModelCredentialHeaders(new Headers({'authorization':_0x1603a5(0x142)+_0x3be2a0[_0x1603a5(0x18d)][_0x1603a5(0x149)](),'accept':_0x1603a5(0x1b9),'content-type':_0x1603a5(0x1b9),..._0x17658d?{}:{'x-codex-image-turn-id':_0x30cf00}}),_0x3be2a0,RESERVED_HEADERS);return{'request':{'method':_0x1603a5(0x190),'headers':_0x1760e2,'body':_0x34fe6f,'redirect':_0x1603a5(0x187)},'httpVersion':_0x3cd9ff[_0x1603a5(0x19f)],..._0x3be2a0[_0x1603a5(0x1a7)]===undefined?{}:{'socks5Url':_0x3be2a0[_0x1603a5(0x1a7)][_0x1603a5(0x149)]()}};},_0x27e7d1[_0x4da5c7(0x195)],IMAGE_GENERATION_ATTEMPTS,IMAGE_GENERATION_RESPONSE_TIMEOUT_MS);if(!_0x17658d&&_0x4ba64c[_0x4da5c7(0x1af)]===0x2613+0x13*0x10f+-0x45b*0xd&&_0x40a6b7===-0x41b*-0x4+0xb*-0x2bd+0x15*0xa7){await _0x4ba64c[_0x4da5c7(0x16c)]?.[_0x4da5c7(0x1ba)]()[_0x4da5c7(0x17d)](()=>undefined);if(_0x3b40e9!==undefined)await _0x3cd9ff[_0x4da5c7(0x147)][_0x4da5c7(0x14e)](_0x3b40e9);_0x432459=_0x4da5c7(0x14c);continue;}const _0x4ac10b=await readJsonResponse(_0x4ba64c);if(!_0x4ba64c['ok'])throw imageGenerationResponseError(_0x4ba64c[_0x4da5c7(0x1af)],_0x4ac10b);const _0x2f4b50=imageBase64(_0x4ac10b),_0x52aa81=decodePng(_0x2f4b50),_0x542db8=generatedFileName(_0x27e7d1[_0x4da5c7(0x193)]),_0x472d6a=join(_0x27e7d1[_0x4da5c7(0x18c)],_0x4da5c7(0x16e)),_0x3a5e25=join(_0x472d6a,_0x542db8),_0x283f0e=_0x27e7d1[_0x4da5c7(0x1b7)]===undefined?_0x3a5e25:posix[_0x4da5c7(0x175)](_0x27e7d1[_0x4da5c7(0x1b7)],_0x542db8);await mkdir(_0x472d6a,{'recursive':!![]});const _0x2b438e=join(_0x472d6a,'.'+_0x542db8+'.'+randomUUID()+_0x4da5c7(0x137));try{await writeFile(_0x2b438e,_0x52aa81,{'flag':'wx','mode':0x180}),await rename(_0x2b438e,_0x3a5e25);}finally{await rm(_0x2b438e,{'force':!![]});}const _0x5b5d5d=createHash(_0x4da5c7(0x181))[_0x4da5c7(0x191)](_0x52aa81)[_0x4da5c7(0x197)](_0x4da5c7(0x1bc));return{'content':_0x4da5c7(0x1b2)+_0x283f0e+'.\x0a','artifacts':[{'kind':_0x4da5c7(0x1a9),'name':_0x542db8,'mimeType':_0x4da5c7(0x1bd),'byteSize':_0x52aa81[_0x4da5c7(0x145)],'sha256':_0x5b5d5d,'fileName':_0x542db8}]};}throw new MarAgentError(_0x4da5c7(0x196),_0x4da5c7(0x16d));}function parseInput(_0x36104c){const _0x2ee8b3=_0x1949c0;if(_0x36104c===null||typeof _0x36104c!==_0x2ee8b3(0x13b)||Array[_0x2ee8b3(0x174)](_0x36104c))return invalidInput();const _0x4b29b6=_0x36104c,_0x4f2d8c=_0x4b29b6[_0x2ee8b3(0x185)]===null?undefined:_0x4b29b6[_0x2ee8b3(0x185)],_0x4ba90d=_0x4b29b6[_0x2ee8b3(0x151)]===null?undefined:_0x4b29b6[_0x2ee8b3(0x151)];if(Object[_0x2ee8b3(0x1be)](_0x4b29b6)[_0x2ee8b3(0x178)](_0x2f72a4=>_0x2f72a4!==_0x2ee8b3(0x16f)&&_0x2f72a4!==_0x2ee8b3(0x185)&&_0x2f72a4!==_0x2ee8b3(0x151))||typeof _0x4b29b6[_0x2ee8b3(0x16f)]!==_0x2ee8b3(0x1a3)||_0x4b29b6[_0x2ee8b3(0x16f)][_0x2ee8b3(0x15e)]()[_0x2ee8b3(0x184)]===-0x201f+-0x71b*0x2+-0x2e55*-0x1||_0x4b29b6[_0x2ee8b3(0x16f)][_0x2ee8b3(0x184)]>-0xbbcf*-0x1+0x1a03*0x2+-0xc6d*0x9||_0x4f2d8c!==undefined&&(!Array[_0x2ee8b3(0x174)](_0x4f2d8c)||_0x4f2d8c[_0x2ee8b3(0x184)]>MAX_EDIT_IMAGES||_0x4f2d8c[_0x2ee8b3(0x178)](_0x38d2bd=>typeof _0x38d2bd!==_0x2ee8b3(0x1a3)||_0x38d2bd[_0x2ee8b3(0x184)]===0x215b*0x1+-0x741+0x1a1a*-0x1||_0x38d2bd[_0x2ee8b3(0x184)]>0xae4*-0x1+0x1*-0x18c5+0x1*0x33a9||!isAbsolute(_0x38d2bd)))||_0x4ba90d!==undefined&&(!Number[_0x2ee8b3(0x189)](_0x4ba90d)||_0x4ba90d<0x1df0+-0x922+0x163*-0xf||_0x4ba90d>MAX_EDIT_IMAGES))return invalidInput();const _0x19440e=_0x4f2d8c;if(_0x19440e?.[_0x2ee8b3(0x184)]&&_0x4ba90d!==undefined)return invalidInput();return{'prompt':_0x4b29b6[_0x2ee8b3(0x16f)],..._0x19440e?.[_0x2ee8b3(0x184)]?{'referencedImagePaths':[..._0x19440e]}:{},..._0x4ba90d===undefined?{}:{'numLastImagesToInclude':_0x4ba90d}};}async function selectedEditImages(_0x519e1d,_0xaa5322){const _0xb0da0e=_0x1949c0;if(_0x519e1d[_0xb0da0e(0x157)]!==undefined){const _0x429104=[];for(const _0x113f45 of _0x519e1d[_0xb0da0e(0x157)])_0x429104[_0xb0da0e(0x155)](validateEditImage(await _0xaa5322[_0xb0da0e(0x1bf)](_0x113f45)));return _0x429104;}if(_0x519e1d[_0xb0da0e(0x160)]===undefined)return[];const _0x4b228e=_0xaa5322[_0xb0da0e(0x1a6)][_0xb0da0e(0x164)](-_0x519e1d[_0xb0da0e(0x160)]);if(_0x4b228e[_0xb0da0e(0x184)]!==_0x519e1d[_0xb0da0e(0x160)])throw new MarAgentError(_0xb0da0e(0x180),_0xb0da0e(0x168)+_0x519e1d[_0xb0da0e(0x160)]+_0xb0da0e(0x18f)+_0x4b228e[_0xb0da0e(0x184)]+_0xb0da0e(0x169));return _0x4b228e[_0xb0da0e(0x172)](validateEditImage);}function validateEditImage(_0x3d54ee){const _0x23c479=_0x1949c0;if(!SUPPORTED_EDIT_MIME_TYPES[_0x23c479(0x1c1)](_0x3d54ee[_0x23c479(0x153)])||!Buffer[_0x23c479(0x167)](_0x3d54ee[_0x23c479(0x179)])||_0x3d54ee[_0x23c479(0x179)][_0x23c479(0x145)]===0x907+0xd6*-0x1e+0x100d||_0x3d54ee[_0x23c479(0x179)][_0x23c479(0x145)]>TOOL_EXECUTION_LIMITS[_0x23c479(0x14f)])throw new MarAgentError(_0x23c479(0x180),_0x23c479(0x17f));return{'mimeType':_0x3d54ee[_0x23c479(0x153)],'data':Buffer[_0x23c479(0x173)](_0x3d54ee[_0x23c479(0x179)])};}async function readJsonResponse(_0x39fdb9){const _0x4cd428=_0x1949c0,_0x4ccfd4=Number(_0x39fdb9[_0x4cd428(0x150)][_0x4cd428(0x1ae)](_0x4cd428(0x18b)));if(Number[_0x4cd428(0x171)](_0x4ccfd4)&&_0x4ccfd4>RESPONSE_MAX_BYTES){await _0x39fdb9[_0x4cd428(0x16c)]?.[_0x4cd428(0x1ba)]()[_0x4cd428(0x17d)](()=>undefined);throw new MarAgentError(_0x4cd428(0x138),_0x4cd428(0x1bb));}if(_0x39fdb9[_0x4cd428(0x16c)]===null)return{};const _0x4396e7=_0x39fdb9[_0x4cd428(0x16c)][_0x4cd428(0x1a0)](),_0x3067f1=[];let _0x5e67bc=-0x1bce+0x22d1+-0x703;try{for(;;){const _0x4db648=await _0x4396e7[_0x4cd428(0x1a2)]();if(_0x4db648[_0x4cd428(0x1ac)])break;_0x5e67bc+=_0x4db648[_0x4cd428(0x192)][_0x4cd428(0x145)];if(_0x5e67bc>RESPONSE_MAX_BYTES)throw new MarAgentError(_0x4cd428(0x138),_0x4cd428(0x1bb));_0x3067f1[_0x4cd428(0x155)](_0x4db648[_0x4cd428(0x192)]);}}catch(_0x3625c3){await _0x4396e7[_0x4cd428(0x1ba)]()[_0x4cd428(0x17d)](()=>undefined);throw _0x3625c3;}finally{_0x4396e7[_0x4cd428(0x135)]();}try{return JSON[_0x4cd428(0x154)](Buffer[_0x4cd428(0x19d)](_0x3067f1,_0x5e67bc)[_0x4cd428(0x13a)](_0x4cd428(0x15c)));}catch(_0x2e03b0){throw new MarAgentError(_0x4cd428(0x1c2),_0x4cd428(0x1b3),{'cause':_0x2e03b0});}}function imageBase64(_0x5e772b){const _0x241d6f=_0x1949c0,_0x42568f=_0x5e772b!==null&&typeof _0x5e772b===_0x241d6f(0x13b)&&!Array[_0x241d6f(0x174)](_0x5e772b)&&Array[_0x241d6f(0x174)](_0x5e772b[_0x241d6f(0x179)])?_0x5e772b[_0x241d6f(0x179)]:undefined,_0x415352=_0x42568f?.[_0x241d6f(0x184)]===-0x5ab*-0x3+-0x1393*0x1+0x293*0x1&&_0x42568f[0x1ce+0x2*0x1+-0x8*0x3a]!==null&&typeof _0x42568f[0x16a3+0xf*-0x1d1+0x49c]===_0x241d6f(0x13b)&&!Array[_0x241d6f(0x174)](_0x42568f[-0x8a1+0xa1*-0x13+0x1494])?_0x42568f[-0x37a*-0x1+0x2473+-0xd4f*0x3][_0x241d6f(0x163)]:undefined;if(typeof _0x415352!==_0x241d6f(0x1a3)||_0x415352[_0x241d6f(0x184)]===-0x5f6+0x143*0x8+0x2e*-0x17||_0x415352[_0x241d6f(0x184)]>RESPONSE_MAX_BYTES)throw new MarAgentError(_0x241d6f(0x1c2),_0x241d6f(0x1b3));return _0x415352;}function decodePng(_0x2317c2){const _0x10ae0d=_0x1949c0;if(_0x2317c2[_0x10ae0d(0x184)]%(0x26d+0x1*-0x265d+0x23f4)!==0x1a6d+-0x18ad+0x38*-0x8||!/^[A-Za-z0-9+/]+={0,2}$/u[_0x10ae0d(0x194)](_0x2317c2))throw new MarAgentError(_0x10ae0d(0x1c2),_0x10ae0d(0x1b3));const _0x50507b=Buffer[_0x10ae0d(0x173)](_0x2317c2,_0x10ae0d(0x170));if(_0x50507b[_0x10ae0d(0x145)]===0x40d+-0x1*-0x1304+-0x1711||_0x50507b[_0x10ae0d(0x145)]>TOOL_EXECUTION_LIMITS[_0x10ae0d(0x14f)]||_0x50507b[_0x10ae0d(0x13a)](_0x10ae0d(0x170))!==_0x2317c2||!_0x50507b[_0x10ae0d(0x1aa)](-0x1736+0x12ab+0x48b,PNG_SIGNATURE[_0x10ae0d(0x184)])[_0x10ae0d(0x158)](PNG_SIGNATURE))throw new MarAgentError(_0x10ae0d(0x1c2),_0x10ae0d(0x1ab));return _0x50507b;}function _0x3b32(){const _0x12a18c=['ignVBNzLCNnHDgLVBIbPBwfNzxmSigj1DcbVBMX5ia','ue9tva','DxbKyxrL','DMfSDwu','y2fSBeLK','DgvZDa','C2LNBMfS','tufsx0fhru5ux0LnquDfx0DftKvsqvrjt05FrKfjteve','zgLNzxn0','ChjVDMLKzxi','o2jHC2u2ncW','y29UBMvJDgLVBG','CMvWBgfJzq','zwrPDevUzhbVAw50','y29Uy2f0','mti1merUCeHhyG','Ahr0CfzLCNnPB24','z2v0uMvHzgvY','qwjZB2X1DguGBg9JywWGCgf0AcbVzIbHBIbPBwfNzsb0BYbLzgL0lG','CMvHza','C3rYAw5N','C3rYAw5NAwz5','C3rHCNrZv2L0Aa','CMvJzw50sw1Hz2vZ','C29JA3m1vxjS','Ag9ZDa','Aw1Hz2u','C3vIyxjYyxK','sw1Hz2uGCMvZCg9UC2uGAxmGBM90igeGC3vWCg9YDgvKifborY4','zg9Uzq','mtqWmezXr3r5rq','z2v0','C3rHDhvZ','yxv0Ag9YAxPHDgLVBG','y29UzMLNDxjHDgLVBG','r2vUzxjHDgvKigLTywDLihnHDMvKihrVia','sw1Hz2uGCMvZCg9UC2uGAxmGAw52ywXPzc4','sw1Hz2uGz2vUzxjHDgLVBIbYzxf1AxjLCYbHBIbPBMrLCgvUzgvUDcbJCMvKzw50AwfSihbYB3zPzgvYlG','zgLZywjSzwq','sw1Hz2uGz2vUzxjHDgLVBIbPBNb1DcbPCYbPBNzHBgLKlG','zgLZCgXHEurPCMvJDg9YEq','mJu2odC3A1j0zLzK','yxbWBgLJyxrPB24VANnVBG','y2fUy2vS','sw1Hz2uGCMvZCg9UC2uGzxHJzwvKzwqGDgHLihnPEMuGBgLTAxqU','Agv4','Aw1Hz2uVCg5N','A2v5CW','CMvHzeLTywDL','y29KzxHFAw1Hz2vFz2vU','AgfZ','tufsx0fhru5ux0LnquDfx0DftKvsqvrjt05FuKvtue9ou0vFsu5wquXjra','y2vPBa','Aw1Hz2vF','oteWmtG4ovHit29OyW','CMvSzwfZzuXVy2S','lNbUzW','lNrTCa','tufsx0fhru5ux1rpt0XFt1vuufvux0XjtuLu','ndaZotK3CwnOsLjj','Dg9tDhjPBMC','B2jQzwn0','qLLururFqvjl','ywnJzxb0','y29UDgvUDc10ExbL','DhjHBNnMzxiTzw5JB2rPBMC','yxjYyxK','yxv0BW','qMvHCMvYia','BwvZC2fNzq','Aw1Hz2uVANbLzW','yNL0zuXLBMD0Aa','tNvTyMvYig9Mig1VC3qGCMvJzw50igLUlw1LBw9YEsbJB252zxjZyxrPB24GAw1Hz2vZihrVigvKAxqU','y3jLzgvUDgLHBfbYB3zPzgvY','zgf0ytO','CMv2zwfS','t25SEsb3AgvUihrOzsb1C2vYihjLCxvLC3rZig9Yigv4CgXPy2L0BhKGyxv0Ag9YAxPLCYbPBwfNzsbNzw5LCMf0Aw9Uig9YigvKAxrPBMCSihvZzsb0AguGy29UzMLNDxjLzcbdB2rLEcbjBwfNzxmGqvbjlIbgAxjZDcbSB2fKigfUzcbMB2XSB3CGC2TPBgWOE25HBwu6iMnVzgv4lwLTywDLz2vUiN0PoYbYzwXVywqGAwyGAxrZigD1AwrHBMnLigLZig5VigXVBMDLCIbPBIbJB250zxH0lIbeBYbUB3qGz2vUzxjHDguGDw5ZB2XPy2L0zwqGDMLZDwfSCY4Gt21PDcbIB3rOihnLBgvJDg9YCYbMB3iGysbUzxCGAw1Hz2uGD2L0Ag91DcbYzwzLCMvUy2vZlIbgB3iGAw1Hz2uGAw5WDxrZlcbPBNnWzwn0ihvUC2vLBIbSB2nHBcbPBwfNzxmGD2L0Acb2Awv3x2LTywDLihDOzw4GyxzHAwXHyMXLoYburvHulw9UBhKGBw9KzwXZig11C3qGBM90ignSywLTihzPC3vHBcbPBNnWzwn0Aw9UlIbvC2uGCMvMzxjLBMnLzf9PBwfNzv9WyxrOCYb3AgvUigv2zxj5igLTywDLigHHCYbHBIbHyNnVBhv0zsbWyxrOoYbVDgHLCNDPC2uGDxnLig51Bv9Syxn0x2LTywDLC190B19PBMnSDwrLigzVCIb0AguGC21HBgXLC3qGC3vMzMLJAwvUDcbUDw1IzxiGB2yGy3vYCMvUDgX5igf2ywLSywjSzsbJB252zxjZyxrPB24GAw1Hz2vZlIbozxzLCIbWCM92AwrLigjVDgGGC2vSzwn0B3jZlIbjBMnSDwrLigf0ig1VC3qGzML2zsbPBwfNzxm7igLMihjLCxvPCMvKigLUChv0CYbHCMuGBwLZC2LUzYWGyxnRigzVCIb0AgvTihjHDgHLCIb0AgfUihnPBgvUDgX5ig9TAxr0Aw5NihrOzw0UifjLy2vUDcbPBwfNzxmGyxjLigLUlw1LBw9YEsbPBIb0AguGy3vYCMvUDcbfEgvJDxrPB24Sig5VDcbHihbLCM1HBMvUDcbOAxn0B3j5igXPyNjHCNKUie9UzsbqtKCGAxmGC2f2zwqGAw4GDgHLign1CNjLBNqGu2vZC2LVBIbHBMqGAxrZihbHDgGGAxmGCMv0DxjUzwqSig5VDcbPBNnWzwn0zwqGCgL4zwXZlIbvC2uGDMLLD19PBwfNzsb3AgvUigf2ywLSywjSzsb0BYbJAgvJAYb0AguGCMvZDwX0oYbVDgHLCNDPC2uGCMvWB3j0ihrOyxqGDMLZDwfSigfJy2vWDgfUy2uGD2fZig5VDcbWzxjMB3jTzwqUiez1BgWGD29YA2zSB3CGz3vPzgfUy2uGAxmGAw4GDgHLignVzgv4lwLTywDLz2vUihnRAwXSlG','Aw50zwDLCG','vu5bvvrit1jjwKve','sw1Hz2uGz2vUzxjHDgLVBIbYzxf1AxjLCYbHignYzwrLBNrPywWU','Aw52ywXPzgf0zq','DMLLD0LTywDLtwf4qNL0zxm','AgvHzgvYCW','BNvTx2XHC3rFAw1Hz2vZx3rVx2LUy2X1zgu','tKzlqW','BwLTzvr5Cgu','CgfYC2u','ChvZAa','Aw1Hz2uVD2vICa','CMvMzxjLBMnLzeLTywDLugf0Ahm','zxf1ywXZ','y29Kzq','oteYnJu5nun4vu9IEq','mJeYodD0rur5rLy','DxrMoa','BM9YBwfSAxPL','DhjPBq','uKvrvuvtva','BNvTtgfZDeLTywDLC1rVsw5JBhvKzq','q09ervG','vw5ZDxbWB3j0zwqGAw1Hz2uGChjVDMLKzxiU','yJy0x2PZB24','C2XPy2u','nKTVvfjAvG','nZi0mJq2mgX4wuDOyW','AxncDwzMzxi','uMvXDwvZDgvKihrOzsbSyxn0ia','ihDLCMuGyxzHAwXHyMXLlG','Cg5N','Ec1JB2rLEc1PBwfNzs10DxjUlwLK','yM9KEq','sw1Hz2uGz2vUzxjHDgLVBIbMywLSzwqU','z2vUzxjHDgvKx2LTywDLCW','ChjVBxb0','yMfZzty0','AxngAw5PDgu','BwfW','zNjVBq','AxnbCNjHEq','AM9PBG','z2vUzxjHDgvfBMrWB2LUDa','Aw1Hz2vhzw5LCMf0Aw9U','C29Tzq','zgf0yq','ChjVEhKTyxv0Ag9YAxPHDgLVBG','r2vUzxjHDguGB3iGzwrPDcbVBMuGue5hihvZAw5NihrOzsbJB25MAwD1CMvKiefYAYbjBwfNzxmGqvbjlcbVBMX5ihDOzw4GzxHWBgLJAxrSEsbYzxf1zxn0zwqUiezPCNn0igXVywqGC2TPBgWOE25HBwu6iMj5DgvKx2fYAY1PBwfNzwDLBIj9ks4Gt21PDcbIB3rOihnLBgvJDg9YCYbMB3iGDgv4Dc10BY1PBwfNztSGDxnLigfIC29SDxrLihjLzMvYzw5JzwrFAw1Hz2vFCgf0AhmGB3iGBNvTx2XHC3rFAw1Hz2vZx3rVx2LUy2X1zguGzM9YigLTywDLlxrVlwLTywDLlcbUzxzLCIbIB3rOlIbvCcb0BYbMAxzLihjLzMvYzw5JzxmSigv4ywn0BhKGB25Lig91Dhb1DdSGBM8Gz3jVDxaGz2vUzxjHDgLVBI4GuMv0DxjUCYbHig1HBMfNzwqGAw1Hz2uGCgf0AcWGBM90igLUC3bLy3rLzcbWAxHLBhmU','sw1Hz2uGz2vUzxjHDgLVBIbMywLSzwqGD2L0Acbivfrqia','y2f0y2G','yNL0zwrFyxjRx2LTywDLx2DLBG','uMvMzxjLBMnLzcbPBwfNzsbPCYbPBNzHBgLKig9YihvUC3vWCg9YDgvKlG','tufsx0fhru5ux1rpt0XFsu5qvvrFsu5wquXjra','C2HHmJu2','mMT0uNPHEa','Aw1Hz2vnB2rLBeLK','BgvUz3rO','CMvMzxjLBMnLzf9PBwfNzv9WyxrOCW','zxjYB3i','BwfUDwfS','tufsx0fhru5ux01prevmx0nptKzjr19jtLzbteLe','AxnjBNrLz2vY','CMv2AxnPB24','y29UDgvUDc1Szw5NDgG','C2vZC2LVBKrPCMvJDg9YEq','yMvHCMvY','ntm2nJu1ovnLsw5JvG'];_0x3b32=function(){return _0x12a18c;};return _0x3b32();}function generatedFileName(_0x3695fb){const _0x2a0f72=_0x1949c0,_0x489912=_0x3695fb[_0x2a0f72(0x15d)](_0x2a0f72(0x152))[_0x2a0f72(0x19b)](/[^a-zA-Z0-9._-]+/gu,'_')[_0x2a0f72(0x19b)](/^[_\-.]+|[_\-.]+$/gu,'')[_0x2a0f72(0x164)](0x17e9*-0x1+-0x1e*-0x1f+0xb3*0x1d,-0xf7*0x3+0x5*-0x14b+0x2*0x4de),_0x39dd15=_0x489912[_0x2a0f72(0x184)]>-0x18cd*-0x1+-0x2ef*0x7+0x1a*-0x2a?_0x489912:createHash(_0x2a0f72(0x181))[_0x2a0f72(0x191)](_0x3695fb)[_0x2a0f72(0x197)](_0x2a0f72(0x1bc)),_0x4fbfba=(_0x39dd15[_0x2a0f72(0x1a5)](_0x2a0f72(0x133))?_0x39dd15:_0x2a0f72(0x133)+_0x39dd15)+_0x2a0f72(0x136);return basename(_0x4fbfba);}function imageGenerationResponseError(_0x2e5d1,_0x245282){const _0x2f593a=_0x1949c0,_0x1998da=_0x245282!==null&&typeof _0x245282===_0x2f593a(0x13b)&&!Array[_0x2f593a(0x174)](_0x245282)?_0x245282[_0x2f593a(0x186)]:undefined,_0x4fb4de=_0x1998da!==null&&typeof _0x1998da===_0x2f593a(0x13b)&&!Array[_0x2f593a(0x174)](_0x1998da)?_0x1998da:undefined,_0x1220a1=_0x2f593a(0x17c)+_0x2e5d1+'.',_0x19becc=typeof _0x4fb4de?.[_0x2f593a(0x159)]===_0x2f593a(0x1a3)?_0x4fb4de[_0x2f593a(0x159)][_0x2f593a(0x15e)]():'',_0x5399c3=/^[a-zA-Z0-9._-]{1,80}$/u[_0x2f593a(0x194)](_0x19becc)?_0x19becc:_0x2f593a(0x196),_0x44206f=typeof _0x4fb4de?.[_0x2f593a(0x143)]===_0x2f593a(0x1a3)?_0x4fb4de[_0x2f593a(0x143)][_0x2f593a(0x15e)]():'',_0x18129e=_0x44206f[_0x2f593a(0x184)]>0x20c5+0x1549+0x16*-0x275&&_0x44206f[_0x2f593a(0x184)]<=-0xb3*0x27+-0xd*-0x2a4+0x10d*-0x3&&!/\b(?:authorization|bearer|api[_ -]?key|access[_ -]?token|refresh[_ -]?token|password|secret|proxy-authorization|chatgpt-account-id)\b|socks5:\/\//iu[_0x2f593a(0x194)](_0x44206f)?_0x44206f:_0x1220a1;return new MarAgentError(_0x5399c3,_0x18129e,{'details':{'status':_0x2e5d1}});}function invalidInput(){const _0x517b92=_0x1949c0;throw new MarAgentError(_0x517b92(0x180),_0x517b92(0x1b6));}
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdir, rename, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { basename, isAbsolute, join, posix } from 'node:path';
|
|
4
|
+
import { MarAgentError } from '../error.js';
|
|
5
|
+
import { fetchModelResponse } from '../model/http.js';
|
|
6
|
+
import { acquireModelCredential, appendModelCredentialHeaders } from '../model/runtime-credential.js';
|
|
7
|
+
import { TOOL_EXECUTION_LIMITS } from './execution-limits.js';
|
|
8
|
+
const RESPONSE_MAX_BYTES = Math.ceil((TOOL_EXECUTION_LIMITS.viewImageMaxBytes * 4) / 3) + 4096;
|
|
9
|
+
const RESERVED_HEADERS = new Set([
|
|
10
|
+
'accept',
|
|
11
|
+
'authorization',
|
|
12
|
+
'connection',
|
|
13
|
+
'content-length',
|
|
14
|
+
'content-type',
|
|
15
|
+
'host',
|
|
16
|
+
'proxy-authorization',
|
|
17
|
+
'transfer-encoding',
|
|
18
|
+
'x-codex-image-turn-id'
|
|
19
|
+
]);
|
|
20
|
+
const PNG_SIGNATURE = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
|
|
21
|
+
const MAX_EDIT_IMAGES = 5;
|
|
22
|
+
const SUPPORTED_EDIT_MIME_TYPES = new Set(['image/png', 'image/jpeg', 'image/webp']);
|
|
23
|
+
const IMAGE_GENERATION_ATTEMPTS = 1;
|
|
24
|
+
const IMAGE_GENERATION_RESPONSE_TIMEOUT_MS = 5 * 60 * 1000;
|
|
25
|
+
export const codexImageGenToolDefinition = {
|
|
26
|
+
name: 'codex_image_gen',
|
|
27
|
+
description: 'Only when the user requests or explicitly authorizes image generation or editing, use the configured Codex Images API. First load and follow skill({name:"codex-imagegen"}); reload if its guidance is no longer in context. Do not generate unsolicited visuals. Omit both selectors for a new image without references. For image inputs, inspect unseen local images with view_image when available; TEXT-only models must not claim visual inspection. Use referenced_image_paths when every image has an absolute path; otherwise use num_last_images_to_include for the smallest sufficient number of currently available conversation images. Never provide both selectors. Include at most five images; if required inputs are missing, ask for them rather than silently omitting them. Recent images are in-memory in the current Execution, not a permanent history library. One PNG is saved in the current Session and its path is returned, not inspected pixels. Use view_image when available to check the result; otherwise report that visual acceptance was not performed. Full workflow guidance is in the codex-imagegen skill.',
|
|
28
|
+
inputSchema: {
|
|
29
|
+
type: 'object',
|
|
30
|
+
properties: {
|
|
31
|
+
prompt: { type: 'string', minLength: 1, maxLength: 32_768 },
|
|
32
|
+
referenced_image_paths: {
|
|
33
|
+
type: 'array',
|
|
34
|
+
maxItems: MAX_EDIT_IMAGES,
|
|
35
|
+
items: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
description: 'Absolute local path of an image to edit.'
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
num_last_images_to_include: {
|
|
41
|
+
type: 'integer',
|
|
42
|
+
minimum: 1,
|
|
43
|
+
maximum: MAX_EDIT_IMAGES,
|
|
44
|
+
description: 'Number of most recent in-memory conversation images to edit.'
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
required: ['prompt'],
|
|
48
|
+
additionalProperties: false
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
export const bytedArkImageGenToolDefinition = {
|
|
52
|
+
...codexImageGenToolDefinition,
|
|
53
|
+
name: 'byted_ark_image_gen',
|
|
54
|
+
description: 'Generate or edit one PNG using the configured Ark Images API, only when explicitly requested. First load skill({name:"byted_ark-imagegen"}). Omit both selectors for text-to-image; use absolute referenced_image_paths or num_last_images_to_include for image-to-image, never both. Up to five references, exactly one output; no group generation. Returns a managed image path, not inspected pixels.'
|
|
55
|
+
};
|
|
56
|
+
export async function executeCodexImageGen(arguments_, input) {
|
|
57
|
+
const capability = input.configuration.imageGeneration;
|
|
58
|
+
if (capability === undefined || capability.credentialProvider === undefined)
|
|
59
|
+
throw new MarAgentError('MAR_AGENT_MODEL_CONFIG_INVALID', 'Image generation requires an independent credential provider.');
|
|
60
|
+
const request = parseInput(arguments_);
|
|
61
|
+
const images = await selectedEditImages(request, input);
|
|
62
|
+
const ark = capability.provider === 'BYTED_ARK';
|
|
63
|
+
if (!ark && capability.provider !== 'CODEX')
|
|
64
|
+
throw new MarAgentError('MAR_AGENT_MODEL_CONFIG_INVALID', 'Unsupported image provider.');
|
|
65
|
+
const endpoint = images.length === 0 ? capability.generateEndpoint : capability.editEndpoint;
|
|
66
|
+
const body = JSON.stringify(ark
|
|
67
|
+
? {
|
|
68
|
+
model: capability.imageModelId,
|
|
69
|
+
prompt: request.prompt,
|
|
70
|
+
...(images.length === 0
|
|
71
|
+
? {}
|
|
72
|
+
: {
|
|
73
|
+
image: images.length === 1
|
|
74
|
+
? `data:${images[0].mimeType};base64,${images[0].data.toString('base64')}`
|
|
75
|
+
: images.map((image) => `data:${image.mimeType};base64,${image.data.toString('base64')}`)
|
|
76
|
+
}),
|
|
77
|
+
size: '2K',
|
|
78
|
+
output_format: 'png',
|
|
79
|
+
response_format: 'b64_json',
|
|
80
|
+
watermark: false,
|
|
81
|
+
stream: false,
|
|
82
|
+
sequential_image_generation: 'disabled'
|
|
83
|
+
}
|
|
84
|
+
: {
|
|
85
|
+
...(images.length === 0
|
|
86
|
+
? {}
|
|
87
|
+
: {
|
|
88
|
+
images: images.map((image) => ({
|
|
89
|
+
image_url: `data:${image.mimeType};base64,${image.data.toString('base64')}`
|
|
90
|
+
}))
|
|
91
|
+
}),
|
|
92
|
+
prompt: request.prompt,
|
|
93
|
+
background: 'auto',
|
|
94
|
+
model: capability.imageModelId,
|
|
95
|
+
n: 1,
|
|
96
|
+
quality: 'auto',
|
|
97
|
+
size: 'auto'
|
|
98
|
+
});
|
|
99
|
+
const turnId = randomUUID();
|
|
100
|
+
let reason = 'REQUEST';
|
|
101
|
+
for (let authenticationAttempt = 0; authenticationAttempt < 2; authenticationAttempt++) {
|
|
102
|
+
let credentialRevision;
|
|
103
|
+
const response = await fetchModelResponse(endpoint, async () => {
|
|
104
|
+
const credential = await acquireModelCredential({ credentialProvider: capability.credentialProvider }, reason, 'Image generation requires a credential.');
|
|
105
|
+
credentialRevision = credential.revision;
|
|
106
|
+
const headers = appendModelCredentialHeaders(new Headers({
|
|
107
|
+
authorization: `Bearer ${credential.bearer.reveal()}`,
|
|
108
|
+
accept: 'application/json',
|
|
109
|
+
'content-type': 'application/json',
|
|
110
|
+
...(ark ? {} : { 'x-codex-image-turn-id': turnId })
|
|
111
|
+
}), credential, RESERVED_HEADERS);
|
|
112
|
+
return {
|
|
113
|
+
request: {
|
|
114
|
+
method: 'POST',
|
|
115
|
+
headers,
|
|
116
|
+
body,
|
|
117
|
+
redirect: 'manual'
|
|
118
|
+
},
|
|
119
|
+
httpVersion: capability.httpVersion,
|
|
120
|
+
...(credential.socks5Url === undefined
|
|
121
|
+
? {}
|
|
122
|
+
: { socks5Url: credential.socks5Url.reveal() })
|
|
123
|
+
};
|
|
124
|
+
}, input.signal, IMAGE_GENERATION_ATTEMPTS, IMAGE_GENERATION_RESPONSE_TIMEOUT_MS);
|
|
125
|
+
if (!ark && response.status === 401 && authenticationAttempt === 0) {
|
|
126
|
+
await response.body?.cancel().catch(() => undefined);
|
|
127
|
+
if (credentialRevision !== undefined)
|
|
128
|
+
await capability.credentialProvider.invalidate(credentialRevision);
|
|
129
|
+
reason = 'UNAUTHORIZED';
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const payload = await readJsonResponse(response);
|
|
133
|
+
if (!response.ok)
|
|
134
|
+
throw imageGenerationResponseError(response.status, payload);
|
|
135
|
+
const encoded = imageBase64(payload);
|
|
136
|
+
const data = decodePng(encoded);
|
|
137
|
+
const fileName = generatedFileName(input.callId);
|
|
138
|
+
const directory = join(input.sessionDirectory, 'generated_images');
|
|
139
|
+
const path = join(directory, fileName);
|
|
140
|
+
const displayPath = input.displayDirectory === undefined ? path : posix.join(input.displayDirectory, fileName);
|
|
141
|
+
await mkdir(directory, { recursive: true });
|
|
142
|
+
const temporary = join(directory, `.${fileName}.${randomUUID()}.tmp`);
|
|
143
|
+
try {
|
|
144
|
+
await writeFile(temporary, data, { flag: 'wx', mode: 0o600 });
|
|
145
|
+
await rename(temporary, path);
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
await rm(temporary, { force: true });
|
|
149
|
+
}
|
|
150
|
+
const sha256 = createHash('sha256').update(data).digest('hex');
|
|
151
|
+
return {
|
|
152
|
+
content: `Generated image saved to ${displayPath}.\n`,
|
|
153
|
+
artifacts: [
|
|
154
|
+
{
|
|
155
|
+
kind: 'image',
|
|
156
|
+
name: fileName,
|
|
157
|
+
mimeType: 'image/png',
|
|
158
|
+
byteSize: data.byteLength,
|
|
159
|
+
sha256,
|
|
160
|
+
fileName
|
|
161
|
+
}
|
|
162
|
+
]
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
throw new MarAgentError('MAR_AGENT_IMAGE_GENERATION_FAILED', 'Image generation failed.');
|
|
166
|
+
}
|
|
167
|
+
function parseInput(value) {
|
|
168
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
169
|
+
return invalidInput();
|
|
170
|
+
const input = value;
|
|
171
|
+
const referencedImagePaths = input.referenced_image_paths === null ? undefined : input.referenced_image_paths;
|
|
172
|
+
const numLastImagesToInclude = input.num_last_images_to_include === null ? undefined : input.num_last_images_to_include;
|
|
173
|
+
if (Object.keys(input).some((key) => key !== 'prompt' && key !== 'referenced_image_paths' && key !== 'num_last_images_to_include') ||
|
|
174
|
+
typeof input.prompt !== 'string' ||
|
|
175
|
+
input.prompt.trim().length === 0 ||
|
|
176
|
+
input.prompt.length > 32_768 ||
|
|
177
|
+
(referencedImagePaths !== undefined &&
|
|
178
|
+
(!Array.isArray(referencedImagePaths) ||
|
|
179
|
+
referencedImagePaths.length > MAX_EDIT_IMAGES ||
|
|
180
|
+
referencedImagePaths.some((path) => typeof path !== 'string' || path.length === 0 || path.length > 4096 || !isAbsolute(path)))) ||
|
|
181
|
+
(numLastImagesToInclude !== undefined &&
|
|
182
|
+
(!Number.isInteger(numLastImagesToInclude) ||
|
|
183
|
+
numLastImagesToInclude < 1 ||
|
|
184
|
+
numLastImagesToInclude > MAX_EDIT_IMAGES)))
|
|
185
|
+
return invalidInput();
|
|
186
|
+
const paths = referencedImagePaths;
|
|
187
|
+
if (paths?.length && numLastImagesToInclude !== undefined)
|
|
188
|
+
return invalidInput();
|
|
189
|
+
return {
|
|
190
|
+
prompt: input.prompt,
|
|
191
|
+
...(paths?.length ? { referencedImagePaths: [...paths] } : {}),
|
|
192
|
+
...(numLastImagesToInclude === undefined
|
|
193
|
+
? {}
|
|
194
|
+
: { numLastImagesToInclude: numLastImagesToInclude })
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
async function selectedEditImages(request, input) {
|
|
198
|
+
if (request.referencedImagePaths !== undefined) {
|
|
199
|
+
const images = [];
|
|
200
|
+
for (const path of request.referencedImagePaths)
|
|
201
|
+
images.push(validateEditImage(await input.readImage(path)));
|
|
202
|
+
return images;
|
|
203
|
+
}
|
|
204
|
+
if (request.numLastImagesToInclude === undefined)
|
|
205
|
+
return [];
|
|
206
|
+
const images = input.recentImages.slice(-request.numLastImagesToInclude);
|
|
207
|
+
if (images.length !== request.numLastImagesToInclude)
|
|
208
|
+
throw new MarAgentError('MAR_AGENT_TOOL_INPUT_INVALID', `Requested the last ${request.numLastImagesToInclude} conversation images, but only ${images.length} were available.`);
|
|
209
|
+
return images.map(validateEditImage);
|
|
210
|
+
}
|
|
211
|
+
function validateEditImage(image) {
|
|
212
|
+
if (!SUPPORTED_EDIT_MIME_TYPES.has(image.mimeType) ||
|
|
213
|
+
!Buffer.isBuffer(image.data) ||
|
|
214
|
+
image.data.byteLength === 0 ||
|
|
215
|
+
image.data.byteLength > TOOL_EXECUTION_LIMITS.viewImageMaxBytes)
|
|
216
|
+
throw new MarAgentError('MAR_AGENT_TOOL_INPUT_INVALID', 'Referenced image is invalid or unsupported.');
|
|
217
|
+
return { mimeType: image.mimeType, data: Buffer.from(image.data) };
|
|
218
|
+
}
|
|
219
|
+
async function readJsonResponse(response) {
|
|
220
|
+
const contentLength = Number(response.headers.get('content-length'));
|
|
221
|
+
if (Number.isFinite(contentLength) && contentLength > RESPONSE_MAX_BYTES) {
|
|
222
|
+
await response.body?.cancel().catch(() => undefined);
|
|
223
|
+
throw new MarAgentError('MAR_AGENT_TOOL_OUTPUT_LIMIT', 'Image response exceeded the size limit.');
|
|
224
|
+
}
|
|
225
|
+
if (response.body === null)
|
|
226
|
+
return {};
|
|
227
|
+
const reader = response.body.getReader();
|
|
228
|
+
const chunks = [];
|
|
229
|
+
let bytes = 0;
|
|
230
|
+
try {
|
|
231
|
+
for (;;) {
|
|
232
|
+
const chunk = await reader.read();
|
|
233
|
+
if (chunk.done)
|
|
234
|
+
break;
|
|
235
|
+
bytes += chunk.value.byteLength;
|
|
236
|
+
if (bytes > RESPONSE_MAX_BYTES)
|
|
237
|
+
throw new MarAgentError('MAR_AGENT_TOOL_OUTPUT_LIMIT', 'Image response exceeded the size limit.');
|
|
238
|
+
chunks.push(chunk.value);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
await reader.cancel().catch(() => undefined);
|
|
243
|
+
throw error;
|
|
244
|
+
}
|
|
245
|
+
finally {
|
|
246
|
+
reader.releaseLock();
|
|
247
|
+
}
|
|
248
|
+
try {
|
|
249
|
+
return JSON.parse(Buffer.concat(chunks, bytes).toString('utf8'));
|
|
250
|
+
}
|
|
251
|
+
catch (cause) {
|
|
252
|
+
throw new MarAgentError('MAR_AGENT_IMAGE_GENERATION_RESPONSE_INVALID', 'Image response is invalid.', { cause });
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function imageBase64(value) {
|
|
256
|
+
const data = value !== null &&
|
|
257
|
+
typeof value === 'object' &&
|
|
258
|
+
!Array.isArray(value) &&
|
|
259
|
+
Array.isArray(value.data)
|
|
260
|
+
? value.data
|
|
261
|
+
: undefined;
|
|
262
|
+
const first = data?.length === 1 && data[0] !== null && typeof data[0] === 'object' && !Array.isArray(data[0])
|
|
263
|
+
? data[0].b64_json
|
|
264
|
+
: undefined;
|
|
265
|
+
if (typeof first !== 'string' || first.length === 0 || first.length > RESPONSE_MAX_BYTES)
|
|
266
|
+
throw new MarAgentError('MAR_AGENT_IMAGE_GENERATION_RESPONSE_INVALID', 'Image response is invalid.');
|
|
267
|
+
return first;
|
|
268
|
+
}
|
|
269
|
+
function decodePng(encoded) {
|
|
270
|
+
if (encoded.length % 4 !== 0 || !/^[A-Za-z0-9+/]+={0,2}$/u.test(encoded))
|
|
271
|
+
throw new MarAgentError('MAR_AGENT_IMAGE_GENERATION_RESPONSE_INVALID', 'Image response is invalid.');
|
|
272
|
+
const data = Buffer.from(encoded, 'base64');
|
|
273
|
+
if (data.byteLength === 0 ||
|
|
274
|
+
data.byteLength > TOOL_EXECUTION_LIMITS.viewImageMaxBytes ||
|
|
275
|
+
data.toString('base64') !== encoded ||
|
|
276
|
+
!data.subarray(0, PNG_SIGNATURE.length).equals(PNG_SIGNATURE))
|
|
277
|
+
throw new MarAgentError('MAR_AGENT_IMAGE_GENERATION_RESPONSE_INVALID', 'Image response is not a supported PNG.');
|
|
278
|
+
return data;
|
|
279
|
+
}
|
|
280
|
+
function generatedFileName(callId) {
|
|
281
|
+
const normalized = callId
|
|
282
|
+
.normalize('NFKC')
|
|
283
|
+
.replace(/[^a-zA-Z0-9._-]+/gu, '_')
|
|
284
|
+
.replace(/^[_\-.]+|[_\-.]+$/gu, '')
|
|
285
|
+
.slice(0, 96);
|
|
286
|
+
const stem = normalized.length > 0 ? normalized : createHash('sha256').update(callId).digest('hex');
|
|
287
|
+
const fileName = `${stem.startsWith('image_') ? stem : `image_${stem}`}.png`;
|
|
288
|
+
return basename(fileName);
|
|
289
|
+
}
|
|
290
|
+
function imageGenerationResponseError(status, value) {
|
|
291
|
+
const error = value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
292
|
+
? value.error
|
|
293
|
+
: undefined;
|
|
294
|
+
const record = error !== null && typeof error === 'object' && !Array.isArray(error)
|
|
295
|
+
? error
|
|
296
|
+
: undefined;
|
|
297
|
+
const fallbackMessage = `Image generation failed with HTTP ${status}.`;
|
|
298
|
+
const rawCode = typeof record?.code === 'string' ? record.code.trim() : '';
|
|
299
|
+
const code = /^[a-zA-Z0-9._-]{1,80}$/u.test(rawCode)
|
|
300
|
+
? rawCode
|
|
301
|
+
: 'MAR_AGENT_IMAGE_GENERATION_FAILED';
|
|
302
|
+
const rawMessage = typeof record?.message === 'string' ? record.message.trim() : '';
|
|
303
|
+
const message = rawMessage.length > 0 &&
|
|
304
|
+
rawMessage.length <= 1_000 &&
|
|
305
|
+
!/\b(?:authorization|bearer|api[_ -]?key|access[_ -]?token|refresh[_ -]?token|password|secret|proxy-authorization|chatgpt-account-id)\b|socks5:\/\//iu.test(rawMessage)
|
|
306
|
+
? rawMessage
|
|
307
|
+
: fallbackMessage;
|
|
308
|
+
return new MarAgentError(code, message, { details: { status } });
|
|
309
|
+
}
|
|
310
|
+
function invalidInput() {
|
|
311
|
+
throw new MarAgentError('MAR_AGENT_TOOL_INPUT_INVALID', 'Image generation input is invalid.');
|
|
312
|
+
}
|