@myagentroam/agent 0.9.62 → 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.
Files changed (119) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +4 -0
  3. package/dist/cli/codex-auth-file.js +268 -3
  4. package/dist/cli/main.js +427 -2
  5. package/dist/error.js +66 -2
  6. package/dist/host/contracts.js +20 -2
  7. package/dist/host/local-agent-host.js +146 -2
  8. package/dist/host/local-process-executor.js +39 -2
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.js +12 -2
  11. package/dist/model/anthropic-messages.js +474 -2
  12. package/dist/model/anthropic-thinking.js +33 -2
  13. package/dist/model/catalog-file.js +88 -2
  14. package/dist/model/configuration.js +137 -2
  15. package/dist/model/contracts.d.ts +2 -0
  16. package/dist/model/contracts.js +1 -2
  17. package/dist/model/http.js +529 -2
  18. package/dist/model/openai-responses.d.ts +2 -0
  19. package/dist/model/openai-responses.js +1602 -2
  20. package/dist/model/runtime-credential.js +35 -2
  21. package/dist/model/sse.js +199 -2
  22. package/dist/prompts/compact.js +25 -2
  23. package/dist/prompts/core.js +37 -2
  24. package/dist/prompts/execution-budget.js +10 -2
  25. package/dist/prompts/index.d.ts +3 -2
  26. package/dist/prompts/index.js +47 -2
  27. package/dist/prompts/modes.js +25 -2
  28. package/dist/prompts/output.js +1 -2
  29. package/dist/prompts/resources.d.ts +1 -1
  30. package/dist/prompts/resources.js +31 -2
  31. package/dist/prompts/subagent.d.ts +6 -0
  32. package/dist/prompts/subagent.js +29 -2
  33. package/dist/prompts/title.js +9 -2
  34. package/dist/prompts/workflow.js +32 -2
  35. package/dist/runtime/async-queue.js +62 -2
  36. package/dist/runtime/builtin-skills.js +19 -2
  37. package/dist/runtime/byted-ark-imagegen-skill.js +18 -2
  38. package/dist/runtime/codex-imagegen-skill.js +35 -2
  39. package/dist/runtime/compact.js +225 -2
  40. package/dist/runtime/context-gc-runtime.d.ts +35 -0
  41. package/dist/runtime/context-gc-runtime.js +163 -0
  42. package/dist/runtime/context-gc-tokens.d.ts +24 -0
  43. package/dist/runtime/context-gc-tokens.js +83 -0
  44. package/dist/runtime/context-gc.d.ts +66 -0
  45. package/dist/runtime/context-gc.js +909 -0
  46. package/dist/runtime/context-projection.d.ts +23 -0
  47. package/dist/runtime/context-projection.js +203 -0
  48. package/dist/runtime/environment-context.js +41 -2
  49. package/dist/runtime/execution-policy.js +13 -2
  50. package/dist/runtime/instructions.js +298 -2
  51. package/dist/runtime/normalize.js +40 -2
  52. package/dist/runtime/plan-output.js +95 -2
  53. package/dist/runtime/rollout-budget.d.ts +2 -0
  54. package/dist/runtime/rollout-budget.js +92 -2
  55. package/dist/runtime/token-budget.d.ts +2 -0
  56. package/dist/runtime/token-budget.js +44 -2
  57. package/dist/sdk/agent.js +1804 -2
  58. package/dist/sdk/types.d.ts +15 -5
  59. package/dist/sdk/types.js +1 -2
  60. package/dist/session/catalog.d.ts +5 -4
  61. package/dist/session/catalog.js +133 -2
  62. package/dist/session/context-gc-checkpoint.d.ts +148 -0
  63. package/dist/session/context-gc-checkpoint.js +665 -0
  64. package/dist/session/context-gc-replacements.d.ts +52 -0
  65. package/dist/session/context-gc-replacements.js +226 -0
  66. package/dist/session/context-gc-subagent.d.ts +43 -0
  67. package/dist/session/context-gc-subagent.js +267 -0
  68. package/dist/session/jsonl-store.d.ts +42 -4
  69. package/dist/session/jsonl-store.js +1657 -2
  70. package/dist/subagent/scheduler.d.ts +35 -2
  71. package/dist/subagent/scheduler.js +249 -2
  72. package/dist/subagent/session-controller.d.ts +94 -0
  73. package/dist/subagent/session-controller.js +675 -0
  74. package/dist/tools/agent-cancel.js +28 -2
  75. package/dist/tools/{task.d.ts → agent-message.d.ts} +2 -2
  76. package/dist/tools/agent-message.js +51 -0
  77. package/dist/tools/agent-start.js +84 -2
  78. package/dist/tools/agent-wait.js +53 -2
  79. package/dist/tools/apply-patch.js +478 -2
  80. package/dist/tools/code-mode.js +370 -2
  81. package/dist/tools/codex-image-gen.js +312 -2
  82. package/dist/tools/exec.js +455 -2
  83. package/dist/tools/execution-limits.d.ts +1 -0
  84. package/dist/tools/execution-limits.js +44 -2
  85. package/dist/tools/local-registry.js +233 -2
  86. package/dist/tools/local-workspace-tools.js +28 -2
  87. package/dist/tools/question.js +124 -2
  88. package/dist/tools/read-context.d.ts +16 -0
  89. package/dist/tools/read-context.js +85 -0
  90. package/dist/tools/read.d.ts +13 -0
  91. package/dist/tools/read.js +294 -2
  92. package/dist/tools/registry.js +76 -2
  93. package/dist/tools/runtime-context.d.ts +9 -2
  94. package/dist/tools/runtime-context.js +1 -2
  95. package/dist/tools/runtime.js +21 -2
  96. package/dist/tools/scheduler.js +41 -2
  97. package/dist/tools/shared/path-resolver.js +133 -2
  98. package/dist/tools/skill.js +37 -2
  99. package/dist/tools/todo-read.js +10 -2
  100. package/dist/tools/todo-write.js +65 -2
  101. package/dist/tools/todo.js +67 -2
  102. package/dist/tools/view-image.js +81 -2
  103. package/dist/tools/web-fetch.js +11 -2
  104. package/dist/tools/web-search.js +14 -2
  105. package/package.json +9 -7
  106. package/README.md +0 -3
  107. package/dist/runtime/prompt.d.ts +0 -9
  108. package/dist/runtime/prompt.js +0 -2
  109. package/dist/tools/shared/secret-redaction.d.ts +0 -4
  110. package/dist/tools/shared/secret-redaction.js +0 -2
  111. package/dist/tools/task-cancel.d.ts +0 -7
  112. package/dist/tools/task-cancel.js +0 -2
  113. package/dist/tools/task-output.d.ts +0 -7
  114. package/dist/tools/task-output.js +0 -2
  115. package/dist/tools/task-tools.d.ts +0 -36
  116. package/dist/tools/task-tools.js +0 -2
  117. package/dist/tools/task.js +0 -2
  118. package/dist/tools/todo-tools.d.ts +0 -25
  119. package/dist/tools/todo-tools.js +0 -2
@@ -1,2 +1,233 @@
1
- /* mar-release-protected */
2
- const _0x468070=_0x57cd;(function(_0x6f8b05,_0x1f4674){const _0x5daf80=_0x57cd,_0x177c17=_0x6f8b05();while(!![]){try{const _0x37c77a=parseInt(_0x5daf80(0x1f4))/(-0x1d39+0x4*-0x6ad+-0x2*-0x1bf7)+parseInt(_0x5daf80(0x242))/(-0x7bb*0x1+0xf*0xe3+-0x590)+parseInt(_0x5daf80(0x21a))/(0x2265+-0x26fc+0x49a)+-parseInt(_0x5daf80(0x1e3))/(-0x1*0x1dc3+-0xe04+0x3*0xe99)+parseInt(_0x5daf80(0x1fb))/(-0x38c*0x5+-0x1508+0x26c9)*(parseInt(_0x5daf80(0x1d8))/(-0x3*-0x42d+-0x20*-0x8b+-0x1de1))+-parseInt(_0x5daf80(0x20a))/(-0xeae*0x1+-0xe8b+0x1d40)+-parseInt(_0x5daf80(0x221))/(-0x7db*0x3+0xf36+-0x863*-0x1);if(_0x37c77a===_0x1f4674)break;else _0x177c17['push'](_0x177c17['shift']());}catch(_0x5b3388){_0x177c17['push'](_0x177c17['shift']());}}}(_0x34ec,-0xaa85a+-0x8*0x19fe4+0x21383d));import{MarAgentError}from'../error.js';import{ApplyPatchTool}from'./apply-patch.js';import{ExecTool}from'./exec.js';function _0x57cd(_0x43ab89,_0x663065){_0x43ab89=_0x43ab89-(0x10f*-0x1+-0x1c8b*0x1+0x1f6e);const _0x4af55b=_0x34ec();let _0x18f394=_0x4af55b[_0x43ab89];if(_0x57cd['rlaaPt']===undefined){var _0x318396=function(_0x36576e){const _0x45d95e='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4211fc='',_0x4a5591='';for(let _0x11cc13=-0x7f+-0x717+-0x1*-0x796,_0x4f3a0e,_0x15ee20,_0x519d36=-0x67*-0x15+0x12b1+-0x1b24;_0x15ee20=_0x36576e['charAt'](_0x519d36++);~_0x15ee20&&(_0x4f3a0e=_0x11cc13%(0x1f28+0x176e+-0x16*0x27b)?_0x4f3a0e*(0x1*-0x25+-0x102b+0x1090)+_0x15ee20:_0x15ee20,_0x11cc13++%(-0x202e+-0x1946+0x3978))?_0x4211fc+=String['fromCharCode'](0x2*-0x644+-0x53*0x59+0x2a62&_0x4f3a0e>>(-(-0x12ce+-0x2050+0x3320*0x1)*_0x11cc13&0x5f*-0x18+-0xab3+0x4b*0x43)):0x6*0x26a+-0x1b30+0x21e*0x6){_0x15ee20=_0x45d95e['indexOf'](_0x15ee20);}for(let _0x12e761=-0x2*-0x656+0x218d+0x2e39*-0x1,_0x2ec326=_0x4211fc['length'];_0x12e761<_0x2ec326;_0x12e761++){_0x4a5591+='%'+('00'+_0x4211fc['charCodeAt'](_0x12e761)['toString'](0x12cb+0x24c9+-0x3784))['slice'](-(0x19ef+-0x1344+-0xb*0x9b));}return decodeURIComponent(_0x4a5591);};_0x57cd['fechIY']=_0x318396,_0x57cd['UftzGx']={},_0x57cd['rlaaPt']=!![];}const _0x1bb881=_0x4af55b[-0x3*-0x837+0x19f4+-0x3299];_0x57cd['EixtMP']!==_0x1bb881&&(_0x57cd['UftzGx']={},_0x57cd['EixtMP']=_0x1bb881);const _0x34a2b3=_0x57cd['UftzGx'][_0x43ab89];return _0x34a2b3===undefined?(_0x18f394=_0x57cd['fechIY'](_0x18f394),_0x57cd['UftzGx'][_0x43ab89]=_0x18f394):_0x18f394=_0x34a2b3,_0x18f394;}import{CodeModeTool}from'./code-mode.js';import{TOOL_EXECUTION_LIMITS}from'./execution-limits.js';import{ReadTool}from'./read.js';import{WorkspacePathResolver}from'./shared/path-resolver.js';import{ViewImageTool}from'./view-image.js';import{request as _0x5a5b73}from'node:http';import{request as _0x52f4aa}from'node:https';export class LocalToolRegistry{#exec;#code;#handlers;constructor(_0x434a59,_0x2e3e66=process.env,_0x46ebdf,_0x2d6e44={}){const _0x15d357=_0x57cd,_0x7e2fcf=new WorkspacePathResolver(_0x434a59,{..._0x2d6e44[_0x15d357(0x1ef)]===undefined?{}:{'restrictPaths':_0x2d6e44[_0x15d357(0x1ef)]},..._0x2d6e44[_0x15d357(0x1ed)]===undefined?{}:{'rootWritable':_0x2d6e44[_0x15d357(0x1ed)]},..._0x2d6e44[_0x15d357(0x1d4)]===undefined?{}:{'mounts':_0x2d6e44[_0x15d357(0x1d4)]}}),_0x5cc168=new ReadTool(_0x7e2fcf),_0x5e16c6=new ViewImageTool(_0x7e2fcf),_0x48ad00=new ApplyPatchTool(_0x7e2fcf);this.#exec=new ExecTool(_0x7e2fcf,undefined,undefined,_0x2e3e66,_0x46ebdf,_0x2d6e44[_0x15d357(0x1f3)]),this.#code=new CodeModeTool(_0x7e2fcf,_0x2e3e66,_0x2d6e44[_0x15d357(0x1f3)]),this.#handlers=new Map([[_0x15d357(0x1da),(_0xc9b1ac,_0x386877)=>this.#code[_0x15d357(0x236)](_0xc9b1ac,_0x386877)],[_0x15d357(0x211),async(_0x301e21,_0x3e9819)=>{const _0x206c3c=_0x15d357,_0xf84450=await _0x5cc168[_0x206c3c(0x236)](_0x301e21,_0x3e9819[_0x206c3c(0x1fc)]),_0x826bfa=formatBatchReadOutput(_0xf84450[_0x206c3c(0x1ea)]);return{'content':_0x826bfa[_0x206c3c(0x1dc)],'data':_0xf84450,'truncated':_0xf84450[_0x206c3c(0x1ff)]||_0x826bfa[_0x206c3c(0x1ff)]};}],[_0x15d357(0x207),async(_0x3ecf4a,_0x5af317)=>_0x5e16c6[_0x15d357(0x236)](_0x3ecf4a,_0x5af317[_0x15d357(0x1fc)])],[_0x15d357(0x200),async _0xd8432d=>{const _0x11aceb=_0x15d357,_0x5a2ff3=typeof _0xd8432d===_0x11aceb(0x231)?_0xd8432d:_0xd8432d?.[_0x11aceb(0x219)];if(typeof _0x5a2ff3!==_0x11aceb(0x231))throw new MarAgentError(_0x11aceb(0x23f),_0x11aceb(0x20c));const _0x48f12c=await _0x48ad00[_0x11aceb(0x236)](_0x5a2ff3);return{'content':JSON[_0x11aceb(0x1f6)](_0x48f12c),'data':_0x48f12c};}],[_0x15d357(0x232),async(_0x881577,_0x338ef7)=>{const _0x13f70e=_0x15d357,_0x5725b6=await this.#exec[_0x13f70e(0x236)](_0x881577,_0x338ef7[_0x13f70e(0x1fc)],{'sessionId':_0x338ef7[_0x13f70e(0x1dd)],'executionId':_0x338ef7[_0x13f70e(0x216)]});return{'content':JSON[_0x13f70e(0x1f6)](_0x5725b6),'data':_0x5725b6,'truncated':_0x5725b6[_0x13f70e(0x1ff)]};}],..._0x2d6e44[_0x15d357(0x21c)]?[[_0x15d357(0x238),async(_0x347614,_0x342546)=>{const _0x448a63=_0x15d357,_0x495d8a=_0x347614;if(typeof _0x495d8a?.[_0x448a63(0x20e)]!==_0x448a63(0x231)||_0x495d8a[_0x448a63(0x20e)][_0x448a63(0x239)]()[_0x448a63(0x1f9)]===-0x1c3f+0x5*0x443+-0x30*-0x25)throw new MarAgentError(_0x448a63(0x23f),_0x448a63(0x226));try{return await _0x2d6e44[_0x448a63(0x21c)]({'query':_0x495d8a[_0x448a63(0x20e)][_0x448a63(0x239)](),'maxResults':typeof _0x495d8a[_0x448a63(0x1e6)]===_0x448a63(0x225)?Math[_0x448a63(0x21f)](0xb1b*-0x1+-0x206f+0x2b94,Math[_0x448a63(0x1f1)](0x21f8+-0xd49+0x2*-0xa57,Math[_0x448a63(0x1f5)](_0x495d8a[_0x448a63(0x1e6)]))):-0x72d+-0xef3+0x1628},_0x342546[_0x448a63(0x1fc)]);}catch(_0x1e5dfe){if(_0x1e5dfe instanceof MarAgentError)throw _0x1e5dfe;throw new MarAgentError(_0x448a63(0x245),_0x448a63(0x1e8),{'cause':_0x1e5dfe});}}]]:[],..._0x2d6e44[_0x15d357(0x203)]===![]?[]:[[_0x15d357(0x1e4),async(_0x23198b,_0x5c27ee)=>{const _0x3a66da=_0x15d357,_0x46fdf1=_0x23198b;if(typeof _0x46fdf1?.[_0x3a66da(0x240)]!==_0x3a66da(0x231))throw new MarAgentError(_0x3a66da(0x23f),_0x3a66da(0x220));let _0x4d5245;try{_0x4d5245=new URL(_0x46fdf1[_0x3a66da(0x240)]);}catch{throw new MarAgentError(_0x3a66da(0x23f),_0x3a66da(0x1e7));}if(_0x4d5245[_0x3a66da(0x22f)]!==_0x3a66da(0x20d)&&_0x4d5245[_0x3a66da(0x22f)]!==_0x3a66da(0x244))throw new MarAgentError(_0x3a66da(0x23f),_0x3a66da(0x237));return fetchWebUrl(_0x4d5245,_0x5c27ee[_0x3a66da(0x1fc)],_0x2d6e44[_0x3a66da(0x217)]===!![]);}]]]);}[_0x468070(0x236)](_0xd50435,_0x2ab7e4){const _0x84cb70=_0x468070,_0x9dbff5=this.#handlers[_0x84cb70(0x23e)](_0xd50435[_0x84cb70(0x1ec)]);if(!_0x9dbff5)throw new MarAgentError(_0x84cb70(0x1eb),_0x84cb70(0x1ee));return _0x9dbff5(_0xd50435[_0x84cb70(0x1fd)],_0x2ab7e4);}[_0x468070(0x1df)](_0x4da5b2){const _0x14b5b7=_0x468070;return this.#exec[_0x14b5b7(0x1df)](_0x4da5b2);}async[_0x468070(0x1f2)](_0x2352c3){const _0x55fa6c=_0x468070;await Promise[_0x55fa6c(0x246)]([this.#exec[_0x55fa6c(0x235)](_0x2352c3),this.#code[_0x55fa6c(0x22c)](_0x2352c3)]);}async[_0x468070(0x22c)](){const _0x3d8346=_0x468070;await Promise[_0x3d8346(0x246)]([this.#exec[_0x3d8346(0x22c)](),this.#code[_0x3d8346(0x22c)]()]);}}async function fetchWebUrl(_0x4d618a,_0x51f762,_0x11ad8,_0x209f7a=-0x1140+-0x2321+0xb*0x4c3){const _0x49f0c2=_0x468070;if(_0x209f7a>0x2154+-0xa26+-0x1729)throw new MarAgentError(_0x49f0c2(0x21e),_0x49f0c2(0x1db));return new Promise((_0x347f46,_0x4106a2)=>{const _0x5cd234=_0x49f0c2,_0x38cf4f=(_0x4d618a[_0x5cd234(0x22f)]===_0x5cd234(0x244)?_0x52f4aa:_0x5a5b73)(_0x4d618a,{'signal':_0x51f762,'headers':{'accept':_0x5cd234(0x218),'accept-encoding':_0x5cd234(0x1d9),'user-agent':_0x5cd234(0x205)},..._0x4d618a[_0x5cd234(0x22f)]===_0x5cd234(0x244)?{'rejectUnauthorized':!_0x11ad8}:{}},_0x46a614=>{const _0x41b7a8=_0x5cd234,_0x5c08bc=_0x46a614[_0x41b7a8(0x20f)]??0xf3d*-0x1+-0x1bab+0x2ae8;if(_0x5c08bc>=0x5c2+0x61*0x3e+-0x705*0x4&&_0x5c08bc<0x10af+0x62*0x1c+0x3b1*-0x7&&_0x46a614[_0x41b7a8(0x212)][_0x41b7a8(0x233)]){_0x46a614[_0x41b7a8(0x22e)](),void fetchWebUrl(new URL(_0x46a614[_0x41b7a8(0x212)][_0x41b7a8(0x233)],_0x4d618a),_0x51f762,_0x11ad8,_0x209f7a+(0x162e+0xb9d*-0x1+0xa90*-0x1))[_0x41b7a8(0x222)](_0x347f46,_0x4106a2);return;}if(_0x5c08bc<-0x2656+-0x2*0x647+0x33ac||_0x5c08bc>=-0x1ef1+0xd7*0x12+-0x13*-0xe5){_0x46a614[_0x41b7a8(0x22e)](),_0x4106a2(new MarAgentError(_0x41b7a8(0x21e),_0x41b7a8(0x214)+_0x5c08bc+'.'));return;}const _0x168508=String(_0x46a614[_0x41b7a8(0x212)][_0x41b7a8(0x210)]??_0x41b7a8(0x22b))[_0x41b7a8(0x243)]();if(!/^(text\/|application\/(json|xml|xhtml\+xml))/u[_0x41b7a8(0x202)](_0x168508)){_0x46a614[_0x41b7a8(0x22e)](),_0x4106a2(new MarAgentError(_0x41b7a8(0x1e5),_0x41b7a8(0x1d5)));return;}const _0x27263f=[];let _0xd3553f=-0x6f8*0x3+-0x16*0x26+-0x34*-0x77,_0x5dafaa=![];_0x46a614['on'](_0x41b7a8(0x213),_0x3b0431=>{const _0x502ec3=_0x41b7a8;if(_0xd3553f>=0x6*0x871a+-0x44225*-0x1+-0x7d57f*-0x1){_0x5dafaa=!![];return;}const _0x50f214=0x15b6ef+-0x126c8d+0xbf7de-_0xd3553f;_0x27263f[_0x502ec3(0x1d7)](_0x3b0431[_0x502ec3(0x23d)](-0x68e*-0x5+-0x7f7+-0x18cf,_0x50f214)),_0xd3553f+=Math[_0x502ec3(0x21f)](_0x3b0431[_0x502ec3(0x1f9)],_0x50f214);if(_0x3b0431[_0x502ec3(0x1f9)]>_0x50f214)_0x5dafaa=!![];}),_0x46a614['on'](_0x41b7a8(0x1f7),()=>_0x347f46({'content':Buffer[_0x41b7a8(0x23a)](_0x27263f)[_0x41b7a8(0x1fe)](_0x41b7a8(0x234)),'data':{'url':_0x4d618a[_0x41b7a8(0x23b)],'status':_0x5c08bc},'truncated':_0x5dafaa})),_0x46a614['on'](_0x41b7a8(0x224),_0x4106a2);});_0x38cf4f['on'](_0x5cd234(0x224),_0x4106a2),_0x38cf4f[_0x5cd234(0x1f7)]();});}function _0x34ec(){const _0x1c7a26=['D2vIrMv0y2G','jNf1B3q7','txLbz2vUDfjVyw0Vmc45','C3rHCNrmAw5L','DMLLD19PBwfNzq','phjLywrFBwv0ywrHDge+','pc9YzwfKx3jLC3vSDd4','nty4nJqYouLctgjKtW','phjLywrFzxjYB3iGAw5KzxG9iG','ugf0y2GGAxmGCMvXDwLYzwqU','Ahr0CdO','CxvLCNK','C3rHDhvZq29Kzq','y29UDgvUDc10ExbL','CMvHza','AgvHzgvYCW','zgf0yq','sfruuca','jMX0oW','zxHLy3v0Aw9Uswq','ywXSB3DvBNrYDxn0zwruBhm','Dgv4Dc9ODg1SlgfWCgXPy2f0Aw9Ul2PZB24SDgv4Dc9WBgfPBJTXptaUosWQlYO7Ct0WlJe','Cgf0y2G','mtuXodyWou13yMvvBG','BwvZC2fNzq','D2vIu2vHCMnO','zw9M','tufsx0fhru5ux1DfqL9grvrdsf9gquLmruq','BwLU','vvjmigLZihjLCxvPCMvKlG','otK3odKZnMvWCKHvzq','DgHLBG','Cgf0Aa','zxjYB3i','BNvTyMvY','u2vHCMnOihf1zxj5igLZihjLCxvPCMvKlG','iIbJB2rLpsi','iIbWyxrOpsi','BMv4De9MzNnLDa','zMLSDgvY','Dgv4Dc9WBgfPBG','zgLZCg9Zzq','pc9YzwfKx2vYCM9YpG','CMvZDw1L','ChjVDg9JB2W','AM9PBG','C3rYAw5N','zxHLyW','Bg9JyxrPB24','DxrMoa','zgLZCg9ZzvnLC3nPB24','zxHLy3v0zq','t25SEsbivfrqigfUzcbivfrquYbvuKXZigfYzsbZDxbWB3j0zwqU','D2vIx3nLyxjJAa','DhjPBq','y29Uy2f0','AhjLzG','y29Kzq','C3vIyxjYyxK','z2v0','tufsx0fhru5ux1rpt0XFsu5qvvrFsu5wquXjra','DxjS','zw5JB2rPBMC','mtuXode1ohrUvKfyBa','Dg9mB3DLCKnHC2u','Ahr0Chm6','tufsx0fhru5ux1DfqL9trufsq0HFrKfjteve','ywXS','Cgf0Ae1VDw50CW','uMvZCg9UC2uGAxmGBM90ihjLywrHyMXLihrLEhqU','phjLywrFCMvZDwX0igLUzgv4psi','ChvZAa','mtuYnte0r1HbvKDz','AwrLBNrPDhK','y29Kzv9TB2rL','vg9Vig1HBNKGCMvKAxjLy3rZlG','y29UDgvUDa','C2vZC2LVBKLK','yNL0zuXLBMD0Aa','BgLZDfnLC3nPB25szxnVDxjJzxm','jMfTCdS','iIbJB2rLpsjnqvjFquDftLrFve9ptf9pvvrqvvrFteLnsvqIpKjHDgnOig91Dhb1DcbIDwrNzxqGzxHOyxvZDgvKoYbYzwfKihrOAxmGCMfUz2uGC2vWyxjHDgvSEs48l3jLywrFzxjYB3i+','pc9YzwfKx21LDgfKyxrHpG','otKXnNjKwujLAG','D2vIx2zLDgnO','tufsx0fhru5ux1DfqL9grvrdsf9vtLnvufbpuLrfrf9dt05uru5u','Bwf4uMvZDwX0CW','vvjmigLZigLUDMfSAwqU','v2vIihnLyxjJAcbMywLSzwqU','zw5KtgLUzq','CMvZDwX0CW','tufsx0fhru5ux1rpt0XFtK9ux0fwquLmqujmrq','BMfTzq','D29YA3nWywnLv3jPDgfIBgu','vg9VBcbPCYb1BMf2ywLSywjSzs4','CMvZDhjPy3rqyxrOCW','CMvHze1HEejHDgnOqNL0zxm','Bwf4','zgLZCg9ZzvnLC3nPB25szxnVDxjJzxm','ChjVy2vZC0v4zwn1Dg9Y','mte0nde4nwvbq0zWsa','Dhj1BMm','C3rYAw5NAwz5','zw5K','BMv3BgLUzq','BgvUz3rO','zw50CMLLCW','ntveyKPIr3a','C2LNBMfS','yxjNDw1LBNrZ','Dg9tDhjPBMC','Dhj1BMnHDgvK','yxbWBhLFCgf0y2G','CMvWBgfJzufSBa','DgvZDa'];_0x34ec=function(){return _0x1c7a26;};return _0x34ec();}function escapeAttribute(_0x56bf27){const _0x19bb38=_0x468070;return _0x56bf27[_0x19bb38(0x201)]('&',_0x19bb38(0x1e0))[_0x19bb38(0x201)]('\x22',_0x19bb38(0x204))[_0x19bb38(0x201)]('<',_0x19bb38(0x215));}function formatBatchReadResult(_0x357ec5,_0x5e1388){const _0x27a5e4=_0x468070,_0x2ce535=escapeAttribute(_0x357ec5[_0x27a5e4(0x223)]);if(_0x27a5e4(0x224)in _0x357ec5)return _0x27a5e4(0x20b)+_0x5e1388+_0x27a5e4(0x228)+_0x2ce535+_0x27a5e4(0x227)+escapeAttribute(_0x357ec5[_0x27a5e4(0x224)][_0x27a5e4(0x23c)])+'\x22>'+_0x357ec5[_0x27a5e4(0x224)][_0x27a5e4(0x21b)]+_0x27a5e4(0x22d);const _0x29525b={'path':_0x357ec5[_0x27a5e4(0x223)],'encoding':_0x357ec5[_0x27a5e4(0x241)],'newline':_0x357ec5[_0x27a5e4(0x1f8)],'startLine':_0x357ec5[_0x27a5e4(0x206)],..._0x357ec5[_0x27a5e4(0x1e9)]===undefined?{}:{'endLine':_0x357ec5[_0x27a5e4(0x1e9)]},'eof':_0x357ec5[_0x27a5e4(0x21d)],'truncated':_0x357ec5[_0x27a5e4(0x1ff)],..._0x357ec5[_0x27a5e4(0x229)]===undefined?{}:{'nextOffset':_0x357ec5[_0x27a5e4(0x229)]}};return[_0x27a5e4(0x1d6)+_0x5e1388+_0x27a5e4(0x228)+_0x2ce535+'\x22>',_0x357ec5[_0x27a5e4(0x1dc)],_0x27a5e4(0x208)+JSON[_0x27a5e4(0x1f6)](_0x29525b)+_0x27a5e4(0x1e2),_0x27a5e4(0x209)][_0x27a5e4(0x22a)](Boolean)[_0x27a5e4(0x230)]('\x0a');}function formatBatchReadOutput(_0x521923){const _0x2cb7d2=_0x468070,_0x5d3f46=[];let _0x39578a=0x17a3+0x1e0a+-0x7ab*0x7,_0x34ede8=![];for(const [_0x41fe1b,_0x585272]of _0x521923[_0x2cb7d2(0x1fa)]()){let _0x1e5553=formatBatchReadResult(_0x585272,_0x41fe1b);const _0x219eda=_0x5d3f46[_0x2cb7d2(0x1f9)]===0xc+-0x1810+0x1804?-0x699+-0x1702+0x1d9b:0x25df+-0xb3e+-0x6a8*0x4;_0x39578a+_0x219eda+Buffer[_0x2cb7d2(0x1de)](_0x1e5553)>TOOL_EXECUTION_LIMITS[_0x2cb7d2(0x1f0)]&&(_0x34ede8=!![],_0x1e5553=_0x2cb7d2(0x20b)+_0x41fe1b+_0x2cb7d2(0x228)+escapeAttribute(_0x585272[_0x2cb7d2(0x223)])+_0x2cb7d2(0x1e1));const _0x558dfa=Buffer[_0x2cb7d2(0x1de)](_0x1e5553);if(_0x39578a+_0x219eda+_0x558dfa>TOOL_EXECUTION_LIMITS[_0x2cb7d2(0x1f0)])break;_0x5d3f46[_0x2cb7d2(0x1d7)](_0x1e5553),_0x39578a+=_0x219eda+_0x558dfa;}return{'content':_0x5d3f46[_0x2cb7d2(0x230)]('\x0a'),'truncated':_0x34ede8};}
1
+ import { MarAgentError } from '../error.js';
2
+ import { ApplyPatchTool } from './apply-patch.js';
3
+ import { ExecTool } from './exec.js';
4
+ import { CodeModeTool } from './code-mode.js';
5
+ import { TOOL_EXECUTION_LIMITS } from './execution-limits.js';
6
+ import { ReadTool } from './read.js';
7
+ import { WorkspacePathResolver } from './shared/path-resolver.js';
8
+ import { ViewImageTool } from './view-image.js';
9
+ import { request as httpRequest } from 'node:http';
10
+ import { request as httpsRequest } from 'node:https';
11
+ export class LocalToolRegistry {
12
+ #exec;
13
+ #code;
14
+ #handlers;
15
+ constructor(workspace, environment = process.env, shell, web = {}) {
16
+ const paths = new WorkspacePathResolver(workspace, {
17
+ ...(web.restrictPaths === undefined ? {} : { restrictPaths: web.restrictPaths }),
18
+ ...(web.workspaceWritable === undefined ? {} : { rootWritable: web.workspaceWritable }),
19
+ ...(web.pathMounts === undefined ? {} : { mounts: web.pathMounts })
20
+ });
21
+ const read = new ReadTool(paths);
22
+ const viewImage = new ViewImageTool(paths);
23
+ const patch = new ApplyPatchTool(paths);
24
+ this.#exec = new ExecTool(paths, undefined, undefined, environment, shell, web.processExecutor);
25
+ this.#code = new CodeModeTool(paths, environment, web.processExecutor);
26
+ this.#handlers = new Map([
27
+ ['code_mode', (arguments_, context) => this.#code.execute(arguments_, context)],
28
+ [
29
+ 'read',
30
+ async (arguments_, context) => {
31
+ const result = await read.execute(arguments_, context.signal);
32
+ const formatted = formatBatchReadOutput(result.results);
33
+ return {
34
+ content: formatted.content,
35
+ data: result,
36
+ truncated: result.truncated || formatted.truncated
37
+ };
38
+ }
39
+ ],
40
+ [
41
+ 'view_image',
42
+ async (arguments_, context) => viewImage.execute(arguments_, context.signal)
43
+ ],
44
+ [
45
+ 'apply_patch',
46
+ async (arguments_) => {
47
+ const value = typeof arguments_ === 'string'
48
+ ? arguments_
49
+ : arguments_?.patch;
50
+ if (typeof value !== 'string')
51
+ throw new MarAgentError('MAR_AGENT_TOOL_INPUT_INVALID', 'Patch is required.');
52
+ const result = await patch.execute(value);
53
+ return { content: JSON.stringify(result), data: result };
54
+ }
55
+ ],
56
+ [
57
+ 'exec',
58
+ async (arguments_, context) => {
59
+ const result = await this.#exec.execute(arguments_, context.signal, {
60
+ sessionId: context.sessionId,
61
+ executionId: context.executionId
62
+ });
63
+ return { content: JSON.stringify(result), data: result, truncated: result.truncated };
64
+ }
65
+ ],
66
+ ...(web.webSearch
67
+ ? [
68
+ [
69
+ 'web_search',
70
+ async (arguments_, context) => {
71
+ const value = arguments_;
72
+ if (typeof value?.query !== 'string' || value.query.trim().length === 0)
73
+ throw new MarAgentError('MAR_AGENT_TOOL_INPUT_INVALID', 'Search query is required.');
74
+ try {
75
+ return await web.webSearch({
76
+ query: value.query.trim(),
77
+ maxResults: typeof value.maxResults === 'number'
78
+ ? Math.min(10, Math.max(1, Math.trunc(value.maxResults)))
79
+ : 8
80
+ }, context.signal);
81
+ }
82
+ catch (error) {
83
+ if (error instanceof MarAgentError)
84
+ throw error;
85
+ throw new MarAgentError('MAR_AGENT_WEB_SEARCH_FAILED', 'Web search failed.', {
86
+ cause: error
87
+ });
88
+ }
89
+ }
90
+ ]
91
+ ]
92
+ : []),
93
+ ...(web.webFetch === false
94
+ ? []
95
+ : [
96
+ [
97
+ 'web_fetch',
98
+ async (arguments_, context) => {
99
+ const value = arguments_;
100
+ if (typeof value?.url !== 'string')
101
+ throw new MarAgentError('MAR_AGENT_TOOL_INPUT_INVALID', 'URL is required.');
102
+ let url;
103
+ try {
104
+ url = new URL(value.url);
105
+ }
106
+ catch {
107
+ throw new MarAgentError('MAR_AGENT_TOOL_INPUT_INVALID', 'URL is invalid.');
108
+ }
109
+ if (url.protocol !== 'http:' && url.protocol !== 'https:')
110
+ throw new MarAgentError('MAR_AGENT_TOOL_INPUT_INVALID', 'Only HTTP and HTTPS URLs are supported.');
111
+ return fetchWebUrl(url, context.signal, web.allowUntrustedTls === true);
112
+ }
113
+ ]
114
+ ])
115
+ ]);
116
+ }
117
+ execute(call, context) {
118
+ const handler = this.#handlers.get(call.name);
119
+ if (!handler)
120
+ throw new MarAgentError('MAR_AGENT_TOOL_NOT_AVAILABLE', 'Tool is unavailable.');
121
+ return handler(call.arguments, context);
122
+ }
123
+ listSessionResources(sessionId) {
124
+ return this.#exec.listSessionResources(sessionId);
125
+ }
126
+ async disposeSessionResources(sessionId) {
127
+ await Promise.all([this.#exec.disposeSession(sessionId), this.#code.dispose(sessionId)]);
128
+ }
129
+ async dispose() {
130
+ await Promise.all([this.#exec.dispose(), this.#code.dispose()]);
131
+ }
132
+ }
133
+ async function fetchWebUrl(url, signal, allowUntrustedTls, redirects = 0) {
134
+ if (redirects > 5)
135
+ throw new MarAgentError('MAR_AGENT_WEB_FETCH_FAILED', 'Too many redirects.');
136
+ return new Promise((resolve, reject) => {
137
+ const request = (url.protocol === 'https:' ? httpsRequest : httpRequest)(url, {
138
+ signal,
139
+ headers: {
140
+ accept: 'text/html,application/json,text/plain;q=0.9,*/*;q=0.1',
141
+ 'accept-encoding': 'identity',
142
+ 'user-agent': 'MyAgentRoam/0.9'
143
+ },
144
+ ...(url.protocol === 'https:' ? { rejectUnauthorized: !allowUntrustedTls } : {})
145
+ }, (response) => {
146
+ const status = response.statusCode ?? 0;
147
+ if (status >= 300 && status < 400 && response.headers.location) {
148
+ response.resume();
149
+ void fetchWebUrl(new URL(response.headers.location, url), signal, allowUntrustedTls, redirects + 1).then(resolve, reject);
150
+ return;
151
+ }
152
+ if (status < 200 || status >= 300) {
153
+ response.resume();
154
+ reject(new MarAgentError('MAR_AGENT_WEB_FETCH_FAILED', `HTTP ${status}.`));
155
+ return;
156
+ }
157
+ const contentType = String(response.headers['content-type'] ?? 'text/plain').toLowerCase();
158
+ if (!/^(text\/|application\/(json|xml|xhtml\+xml))/u.test(contentType)) {
159
+ response.resume();
160
+ reject(new MarAgentError('MAR_AGENT_WEB_FETCH_UNSUPPORTED_CONTENT', 'Response is not readable text.'));
161
+ return;
162
+ }
163
+ const chunks = [];
164
+ let bytes = 0;
165
+ let truncated = false;
166
+ response.on('data', (chunk) => {
167
+ if (bytes >= 1_000_000) {
168
+ truncated = true;
169
+ return;
170
+ }
171
+ const remaining = 1_000_000 - bytes;
172
+ chunks.push(chunk.subarray(0, remaining));
173
+ bytes += Math.min(chunk.length, remaining);
174
+ if (chunk.length > remaining)
175
+ truncated = true;
176
+ });
177
+ response.on('end', () => resolve({
178
+ content: Buffer.concat(chunks).toString('utf8'),
179
+ data: { url: url.href, status },
180
+ truncated
181
+ }));
182
+ response.on('error', reject);
183
+ });
184
+ request.on('error', reject);
185
+ request.end();
186
+ });
187
+ }
188
+ function escapeAttribute(value) {
189
+ return value.replaceAll('&', '&amp;').replaceAll('"', '&quot;').replaceAll('<', '&lt;');
190
+ }
191
+ function formatBatchReadResult(result, index) {
192
+ const path = escapeAttribute(result.path);
193
+ if ('error' in result)
194
+ return `<read_error index="${index}" path="${path}" code="${escapeAttribute(result.error.code)}">${result.error.message}</read_error>`;
195
+ const metadata = {
196
+ path: result.path,
197
+ encoding: result.encoding,
198
+ newline: result.newline,
199
+ startLine: result.startLine,
200
+ ...(result.endLine === undefined ? {} : { endLine: result.endLine }),
201
+ eof: result.eof,
202
+ truncated: result.truncated,
203
+ ...(result.nextOffset === undefined ? {} : { nextOffset: result.nextOffset })
204
+ };
205
+ return [
206
+ `<read_result index="${index}" path="${path}">`,
207
+ result.content,
208
+ `<read_metadata>${JSON.stringify(metadata)}</read_metadata>`,
209
+ '</read_result>'
210
+ ]
211
+ .filter(Boolean)
212
+ .join('\n');
213
+ }
214
+ function formatBatchReadOutput(results) {
215
+ const blocks = [];
216
+ let bytes = 0;
217
+ let truncated = false;
218
+ for (const [index, result] of results.entries()) {
219
+ let block = formatBatchReadResult(result, index);
220
+ const separatorBytes = blocks.length === 0 ? 0 : 1;
221
+ if (bytes + separatorBytes + Buffer.byteLength(block) >
222
+ TOOL_EXECUTION_LIMITS.readMaxBatchBytes) {
223
+ truncated = true;
224
+ block = `<read_error index="${index}" path="${escapeAttribute(result.path)}" code="MAR_AGENT_TOOL_OUTPUT_LIMIT">Batch output budget exhausted; read this range separately.</read_error>`;
225
+ }
226
+ const blockBytes = Buffer.byteLength(block);
227
+ if (bytes + separatorBytes + blockBytes > TOOL_EXECUTION_LIMITS.readMaxBatchBytes)
228
+ break;
229
+ blocks.push(block);
230
+ bytes += separatorBytes + blockBytes;
231
+ }
232
+ return { content: blocks.join('\n'), truncated };
233
+ }
@@ -1,2 +1,28 @@
1
- /* mar-release-protected */
2
- const _0x17c43c=_0x2725;(function(_0x4d9895,_0x4a6b21){const _0x2aa256=_0x2725,_0x4a8edc=_0x4d9895();while(!![]){try{const _0x1e572c=-parseInt(_0x2aa256(0xeb))/(-0x2403+0x173d*0x1+-0x1*-0xcc7)+parseInt(_0x2aa256(0xec))/(0xcbc+-0x2af*0x9+0xb6d)*(-parseInt(_0x2aa256(0xed))/(-0x3ab*0x1+0x8*-0x1a6+0x10de))+-parseInt(_0x2aa256(0xf0))/(0x25bd+-0x182+-0x2437)*(-parseInt(_0x2aa256(0xe6))/(-0x1461+0x224a+-0x2*0x6f2))+-parseInt(_0x2aa256(0xe5))/(0x24b*-0x11+0x259f+-0x1*-0x162)+-parseInt(_0x2aa256(0xe4))/(0x2*-0xb2e+0x1*-0x56+0x16b9)+-parseInt(_0x2aa256(0xef))/(0x20a1+-0x1397+-0xd02)+parseInt(_0x2aa256(0xe8))/(0x2539+0x1388+0x42*-0xdc);if(_0x1e572c===_0x4a6b21)break;else _0x4a8edc['push'](_0x4a8edc['shift']());}catch(_0x4c316d){_0x4a8edc['push'](_0x4a8edc['shift']());}}}(_0xda0e,-0x5983*0x7+-0x5d1+0x57dca));function _0x2725(_0x2aa17c,_0x4a7804){_0x2aa17c=_0x2aa17c-(0x22be+0x1f9d+0x1*-0x4177);const _0x433bb0=_0xda0e();let _0x21def8=_0x433bb0[_0x2aa17c];if(_0x2725['Fkygwz']===undefined){var _0x5a2fcc=function(_0x158e89){const _0x5574d5='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x586e44='',_0x48a73e='';for(let _0x1ddadd=-0x25bd+-0xcb6*0x1+0xf*0x35d,_0x3f3b9d,_0x12357e,_0x136d56=-0x2ab*0x2+0x1387+0x1*-0xe31;_0x12357e=_0x158e89['charAt'](_0x136d56++);~_0x12357e&&(_0x3f3b9d=_0x1ddadd%(-0x1024*-0x2+-0xa02+-0x1642)?_0x3f3b9d*(0x881+-0x1ed3+0x1692)+_0x12357e:_0x12357e,_0x1ddadd++%(-0x819*-0x3+0x15f7+-0x2e3e))?_0x586e44+=String['fromCharCode'](-0xa8c+-0x423*0x3+-0x7*-0x36c&_0x3f3b9d>>(-(0x3*0x7ab+-0x10b4+-0x64b)*_0x1ddadd&-0x1*0x101+0x4f9*0x3+-0x1fc*0x7)):-0x1*-0x10cd+-0x695+-0xa38){_0x12357e=_0x5574d5['indexOf'](_0x12357e);}for(let _0x4278fb=-0xda3+-0x1b98+0x293b*0x1,_0x11a3dc=_0x586e44['length'];_0x4278fb<_0x11a3dc;_0x4278fb++){_0x48a73e+='%'+('00'+_0x586e44['charCodeAt'](_0x4278fb)['toString'](-0x1732+-0x114b+0x288d))['slice'](-(0x206f*-0x1+0x15dd+0xa94*0x1));}return decodeURIComponent(_0x48a73e);};_0x2725['XdTVZw']=_0x5a2fcc,_0x2725['EfOpCW']={},_0x2725['Fkygwz']=!![];}const _0x3bca46=_0x433bb0[0x23f9*0x1+-0x2567+0x16e];_0x2725['ZTDjxm']!==_0x3bca46&&(_0x2725['EfOpCW']={},_0x2725['ZTDjxm']=_0x3bca46);const _0x4c0ceb=_0x2725['EfOpCW'][_0x2aa17c];return _0x4c0ceb===undefined?(_0x21def8=_0x2725['XdTVZw'](_0x21def8),_0x2725['EfOpCW'][_0x2aa17c]=_0x21def8):_0x21def8=_0x4c0ceb,_0x21def8;}import{ApplyPatchTool}from'./apply-patch.js';import{ExecTool}from'./exec.js';function _0xda0e(){const _0x4ac6fd=['ntvZCwHTA04','zxHLy3v0zq','otm2mdi1mML4t2nZwa','zgLZCg9Zzq','yxbWBhLqyxrJAa','otC0ntzTsMHwDva','mtaWmJiYB1zgD2r6','mJfkthvzvuW','zxHLyW','mte3nZm3nLLyyKroAG','mZeZntjNthznEgi','CMvHza','mtqYnZCYzu9nwM9g','mtG3ndC0mLDRB3vZEG'];_0xda0e=function(){return _0x4ac6fd;};return _0xda0e();}import{ReadTool}from'./read.js';import{WorkspacePathResolver}from'./shared/path-resolver.js';export class LocalWorkspaceTools{#read;#applyPatch;#exec;constructor(_0x12ea08,_0x51f03a=-0xf*0x2047c+0x11a104*0x1+0x1be480){const _0x30553b=new WorkspacePathResolver(_0x12ea08);this.#read=new ReadTool(_0x30553b),this.#applyPatch=new ApplyPatchTool(_0x30553b),this.#exec=new ExecTool(_0x30553b,_0x51f03a);}[_0x17c43c(0xf1)](_0x571683){const _0x1f401b=_0x17c43c;return this.#read[_0x1f401b(0xe7)](_0x571683);}[_0x17c43c(0xea)](_0x23794e){const _0x5bbf29=_0x17c43c;return this.#applyPatch[_0x5bbf29(0xe7)](_0x23794e);}[_0x17c43c(0xee)](_0x3dfd11){const _0x4afeab=_0x17c43c;return this.#exec[_0x4afeab(0xe7)](_0x3dfd11);}[_0x17c43c(0xe9)](){const _0x1576d0=_0x17c43c;return this.#exec[_0x1576d0(0xe9)]();}}
1
+ import { ApplyPatchTool } from './apply-patch.js';
2
+ import { ExecTool } from './exec.js';
3
+ import { ReadTool } from './read.js';
4
+ import { WorkspacePathResolver } from './shared/path-resolver.js';
5
+ /** @deprecated Use the individual tool modules or LocalAgentHost. */
6
+ export class LocalWorkspaceTools {
7
+ #read;
8
+ #applyPatch;
9
+ #exec;
10
+ constructor(root, maxOutputBytes = 1_000_000) {
11
+ const paths = new WorkspacePathResolver(root);
12
+ this.#read = new ReadTool(paths);
13
+ this.#applyPatch = new ApplyPatchTool(paths);
14
+ this.#exec = new ExecTool(paths, maxOutputBytes);
15
+ }
16
+ read(input) {
17
+ return this.#read.execute(input);
18
+ }
19
+ applyPatch(patch) {
20
+ return this.#applyPatch.execute(patch);
21
+ }
22
+ exec(input) {
23
+ return this.#exec.execute(input);
24
+ }
25
+ dispose() {
26
+ return this.#exec.dispose();
27
+ }
28
+ }
@@ -1,2 +1,124 @@
1
- /* mar-release-protected */
2
- const _0x56c141=_0x4fa9;function _0x37ea(){const _0x14da2b=['nef6rvD4AW','uhjVDMLKzsaYltmGBxv0DwfSBhKGzxHJBhvZAxzLignOB2LJzxmGD2L0AcbJB25Zzxf1zw5JzxmUifb1Dcb0AguGCMvJB21Tzw5KzwqGB3b0Aw9UigzPCNn0igfUzcbPzgvUDgLMEsbPDcbPBIbPDhmGBgfIzwWGB3iGzgvZy3jPChrPB24U','mtuZmZy0ogD1uhzHBG','DhjPBq','A2v5CW','CxvLC3rPB24','zw1PDa','ndGXmJbVCfPSqw8','C3rYAw5NAwz5','Ag9ZDa','CxvLC3rPB25nyxHuzxH0q2HHCMfJDgvYCW','uxvLC3rPB24GAw5WDxqGAxmGAw52ywXPzc4','ugf1C2uGzM9Yig9Uzsb0BYb0AhjLzsb0AwDODgX5ihjLBgf0zwqGDxnLCI1VD25LzcbKzwnPC2LVBNmGDgHHDcbTyxrLCMLHBgX5ignOyw5Nzsb0AguGCMvZDwX0igfUzcbJyw5UB3qGyMuGCMvZB2X2zwqGDgHYB3vNAcbYzwXLDMfUDcbZywzLigrPC2nVDMvYEs4GuhjLzMvYigfZA2LUzYbVDMvYigD1zxnZAw5NigLUifbSyw4GBw9KztSGzg8GBM90igf2B2LKignSyxjPzMLJyxrPB24GyNKGAw52zw50Aw5NignVBMzPz3vYyxrPB24SigjYyw5JAgvZlcbHyNn0CMfJDgLVBNmSig9Yihn1ChbVCNqGzM9Yig11BhrPCgXLig91DgnVBwvZlIbqCM92AwrLidiTmYbTDxr1ywXSEsbLEgnSDxnPDMuGB3b0Aw9UCYb3AxrOignVBNnLCxvLBMnLCYWGChv0ihrOzsbYzwnVBw1LBMrLzcbVChrPB24GzMLYC3qGyw5KigLKzw50Awz5igL0igLUigL0CYbSywjLBcbVCIbKzxnJCMLWDgLVBIWGyw5KihvZzsbHBM90AgvYihf1zxn0Aw9UihjVDw5KigLMigTLEsbHBwjPz3vPDhKGCMvTywLUCY4GvgHPCYbPCYbUB3qGysbWzxjTAxnZAw9Ul2fWChjVDMfSihrVB2WGyw5KihnOB3vSzcbUB3qGAw50zxjYDxb0ihjVDxrPBMuGAw4TC2nVCguGD29YAY4','tufsx0fhru5ux1rpt0XFsu5qvvrFsu5wquXjra','CxvLC3rPB25Z','nJKZndq4oefMsxrQtG','DxnLCL9PBNb1Dc5YzxnVBhzLza','nZveBgfHsNG','DMfSDwvZ','CxvLC3rPB25nyxHpChrPB25dAgfYywn0zxjZ','mta2mKz0Du5NEG','mZyYmdr1y055BxG','zgvZy3jPChrPB24','tufsx0fhru5ux1vtrvjFsu5qvvrFsu5wquXjra','B2jQzwn0','mtfMwMfcvuK','Aw5JBhvKzxm','uxvLC3rPB24Gyw5ZD2vYCYbHCMuGAw5JB21WBgv0zs4','mJu2mdu1yNvZDMHL','BgvUz3rO','AxnbCNjHEq','C29YDa','nduWmZa1mxj5yK93qq','C2LNBMfS','BwfW','ohDyBNDWCq','C3rYAw5N','uxvLC3rPB24Gyw5ZD2vYCYbHCMuGAw52ywXPzc4','uxvLC3rPB24Gsg9ZDcbJyxbHyMLSAxr5igLZihvUyxzHAwXHyMXLlG','C2vYAwfS','BgfIzwW','AgvHzgvY','C2L6zq','C29Tzq','DxnLCL9PBNb1Dc5Yzxf1zxn0zwq','yxjYyxK','nJKWmJz1EwPLDwG','B3b0Aw9UCW','CMvXDwvZDfvZzxjjBNb1Da'];_0x37ea=function(){return _0x14da2b;};return _0x37ea();}(function(_0xb0fc52,_0x45032c){const _0x1964e4=_0x4fa9,_0x5aba39=_0xb0fc52();while(!![]){try{const _0x29c47a=-parseInt(_0x1964e4(0x111))/(-0x212*0x3+0x248+0x3ef)+parseInt(_0x1964e4(0xf8))/(-0x1b85+0x1ae4+-0x1*-0xa3)*(-parseInt(_0x1964e4(0xf4))/(0x90f+-0x24*-0x1a+-0xcb4*0x1))+parseInt(_0x1964e4(0x114))/(0x3d9+-0xe2c+-0xa57*-0x1)*(-parseInt(_0x1964e4(0xff))/(-0x1*-0xedb+-0x1f3e+-0xf*-0x118))+parseInt(_0x1964e4(0x116))/(-0xdef+0x16cc+-0x8d7)+parseInt(_0x1964e4(0x103))/(-0xa9f+-0x5d*0x2b+0x1a45*0x1)*(parseInt(_0x1964e4(0x106))/(-0xd*-0x257+0x2122+-0x3f85))+parseInt(_0x1964e4(0xf7))/(0x1df+0x104c+-0x1222)*(-parseInt(_0x1964e4(0x11b))/(-0xa10+-0xe2+0xafc))+-parseInt(_0x1964e4(0xfc))/(-0x60*-0x2c+0x2*0x515+-0x2f*0x91)*(-parseInt(_0x1964e4(0xf2))/(-0x25be*0x1+0x3b*0xa+-0x3*-0xbd4));if(_0x29c47a===_0x45032c)break;else _0x5aba39['push'](_0x5aba39['shift']());}catch(_0x4d6bd3){_0x5aba39['push'](_0x5aba39['shift']());}}}(_0x37ea,-0x62c3a+0x6e9b6+0xd0*0x567));import{randomUUID}from'node:crypto';import{MarAgentError}from'../error.js';import{TOOL_EXECUTION_LIMITS}from'./execution-limits.js';export const questionToolDefinition={'name':_0x56c141(0x119),'parallelSafety':_0x56c141(0x10a),'description':_0x56c141(0xef),'inputSchema':{'type':_0x56c141(0xfb),'properties':{'questions':{'type':_0x56c141(0x110),'minItems':0x1,'maxItems':0x3,'items':{'type':_0x56c141(0xfb),'properties':{'id':{'type':_0x56c141(0x107)},'header':{'type':_0x56c141(0x107)},'question':{'type':_0x56c141(0x107),'maxLength':TOOL_EXECUTION_LIMITS[_0x56c141(0xed)]},'options':{'type':_0x56c141(0x110),'minItems':0x2,'maxItems':0x3,'description':_0x56c141(0x115),'items':{'type':_0x56c141(0xfb),'properties':{'label':{'type':_0x56c141(0x107),'maxLength':0x50},'description':{'type':_0x56c141(0x107),'maxLength':TOOL_EXECUTION_LIMITS[_0x56c141(0xf6)]}},'required':[_0x56c141(0x10b),_0x56c141(0xf9)],'additionalProperties':![]}}},'required':['id',_0x56c141(0x10c),_0x56c141(0x119),_0x56c141(0x112)],'additionalProperties':![]}}},'required':[_0x56c141(0xf1)],'additionalProperties':![]}};function _0x4fa9(_0x1a3495,_0x46c019){_0x1a3495=_0x1a3495-(0x19b*0xe+0x240d+-0x399a);const _0x455d58=_0x37ea();let _0x2ab55f=_0x455d58[_0x1a3495];if(_0x4fa9['fEktep']===undefined){var _0x5014c0=function(_0x4dfe86){const _0x4ebd29='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x23661c='',_0x3ccfdb='';for(let _0x50c943=0x62*0x5e+-0x5f*0x8+-0x2104*0x1,_0x2b449e,_0x29c2ba,_0x1044ab=0x56*-0x16+-0x35*0xb1+0x2c09;_0x29c2ba=_0x4dfe86['charAt'](_0x1044ab++);~_0x29c2ba&&(_0x2b449e=_0x50c943%(-0x2c6*-0xe+0x35d+0xe0f*-0x3)?_0x2b449e*(0x32*-0x4c+0x39b*0x1+0xb7d)+_0x29c2ba:_0x29c2ba,_0x50c943++%(0x56*-0x43+0xf0c+0x77a))?_0x23661c+=String['fromCharCode'](-0x1ce0+-0x1a3d+-0x2f4*-0x13&_0x2b449e>>(-(0xe*0x239+0xb*-0x4b+0x3b*-0x79)*_0x50c943&0xd*0x1f3+0xe52+-0x27a3)):-0x1126+0x341+-0x1*-0xde5){_0x29c2ba=_0x4ebd29['indexOf'](_0x29c2ba);}for(let _0x3a95f7=-0x182a+-0x12a2+0x42*0xa6,_0x3d031a=_0x23661c['length'];_0x3a95f7<_0x3d031a;_0x3a95f7++){_0x3ccfdb+='%'+('00'+_0x23661c['charCodeAt'](_0x3a95f7)['toString'](-0x571+-0xc22*-0x1+-0x6a1))['slice'](-(0xf43+0x678+-0x15b9));}return decodeURIComponent(_0x3ccfdb);};_0x4fa9['QgCZuU']=_0x5014c0,_0x4fa9['IJbfcZ']={},_0x4fa9['fEktep']=!![];}const _0x10d2a6=_0x455d58[-0x8b+0x25b+0x1d0*-0x1];_0x4fa9['pdeSGO']!==_0x10d2a6&&(_0x4fa9['IJbfcZ']={},_0x4fa9['pdeSGO']=_0x10d2a6);const _0x5f471b=_0x4fa9['IJbfcZ'][_0x1a3495];return _0x5f471b===undefined?(_0x2ab55f=_0x4fa9['QgCZuU'](_0x2ab55f),_0x4fa9['IJbfcZ'][_0x1a3495]=_0x2ab55f):_0x2ab55f=_0x5f471b,_0x2ab55f;}export async function executeQuestion(_0xc88c62,_0x567a34){const _0x10a53d=_0x56c141,_0x5bb162=parseQuestionInput(_0xc88c62);if(!_0x567a34[_0x10a53d(0x11d)][_0x10a53d(0x113)])throw new MarAgentError(_0x10a53d(0xf0),_0x10a53d(0x109));const _0x1a3495=randomUUID();await _0x567a34[_0x10a53d(0x11a)]({'type':_0x10a53d(0x10f),'requestId':_0x1a3495,'questions':_0x5bb162[_0x10a53d(0xf1)]});const _0x46c019=await _0x567a34[_0x10a53d(0x11d)][_0x10a53d(0x113)]({'requestId':_0x1a3495,'questions':_0x5bb162[_0x10a53d(0xf1)]},_0x567a34[_0x10a53d(0x104)]);await _0x567a34[_0x10a53d(0x11a)]({'type':_0x10a53d(0xf3),'requestId':_0x1a3495});if(!_0x46c019||typeof _0x46c019!==_0x10a53d(0xfb)||Array[_0x10a53d(0x101)](_0x46c019))throw new MarAgentError(_0x10a53d(0xfa),_0x10a53d(0x108));const _0x455d58=_0x5bb162[_0x10a53d(0xf1)][_0x10a53d(0x105)](_0x5014c0=>_0x5014c0['id'])[_0x10a53d(0x102)](),_0x2ab55f=Object[_0x10a53d(0x118)](_0x46c019)[_0x10a53d(0x102)]();if(_0x455d58[_0x10a53d(0x100)]!==_0x2ab55f[_0x10a53d(0x100)]||_0x455d58[_0x10a53d(0x10e)]((_0x10d2a6,_0x5f471b)=>_0x10d2a6!==_0x2ab55f[_0x5f471b]))throw new MarAgentError(_0x10a53d(0xfa),_0x10a53d(0xfe));if(Object[_0x10a53d(0xf5)](_0x46c019)[_0x10a53d(0x10e)](_0x4dfe86=>typeof _0x4dfe86!==_0x10a53d(0x107)||!_0x4dfe86[_0x10a53d(0x117)]()))throw new MarAgentError(_0x10a53d(0xfa),_0x10a53d(0x108));return{'content':JSON[_0x10a53d(0x11c)](_0x46c019),'data':_0x46c019};}function parseQuestionInput(_0x4ebd29){const _0x4c7476=_0x56c141;if(!_0x4ebd29||typeof _0x4ebd29!==_0x4c7476(0xfb)||Array[_0x4c7476(0x101)](_0x4ebd29))return invalidQuestion();const _0x23661c=_0x4ebd29;if(Object[_0x4c7476(0x118)](_0x23661c)[_0x4c7476(0x10e)](_0x50c943=>_0x50c943!==_0x4c7476(0xf1))||!Array[_0x4c7476(0x101)](_0x23661c[_0x4c7476(0xf1)]))return invalidQuestion();if(_0x23661c[_0x4c7476(0xf1)][_0x4c7476(0x100)]<-0x1042*-0x1+-0x1b0f+0xace||_0x23661c[_0x4c7476(0xf1)][_0x4c7476(0x100)]>-0xb*-0x1e9+0x177b+0x1*-0x2c7b)return invalidQuestion();const _0x3ccfdb=_0x23661c[_0x4c7476(0xf1)][_0x4c7476(0x105)](_0x2b449e=>{const _0x102c0a=_0x4c7476;if(!_0x2b449e||typeof _0x2b449e!==_0x102c0a(0xfb)||Array[_0x102c0a(0x101)](_0x2b449e))return invalidQuestion();const _0x29c2ba=_0x2b449e;if(Object[_0x102c0a(0x118)](_0x29c2ba)[_0x102c0a(0x10e)](_0x3a95f7=>!['id',_0x102c0a(0x10c),_0x102c0a(0x119),_0x102c0a(0x112)][_0x102c0a(0xfd)](_0x3a95f7))||typeof _0x29c2ba['id']!==_0x102c0a(0x107)||_0x29c2ba['id'][_0x102c0a(0x117)]()[_0x102c0a(0x100)]===0x26a7+0x4b4*-0x6+-0xa6f||_0x29c2ba['id'][_0x102c0a(0x100)]>0x47*0xd+-0x63e*-0x1+-0x959||typeof _0x29c2ba[_0x102c0a(0x10c)]!==_0x102c0a(0x107)||_0x29c2ba[_0x102c0a(0x10c)][_0x102c0a(0x117)]()[_0x102c0a(0x100)]===-0x282*-0x6+0x187a+-0x2786||_0x29c2ba[_0x102c0a(0x10c)][_0x102c0a(0x100)]>-0x1a3d+-0x10e*0x9+-0x1*-0x240b||typeof _0x29c2ba[_0x102c0a(0x119)]!==_0x102c0a(0x107)||_0x29c2ba[_0x102c0a(0x119)][_0x102c0a(0x117)]()[_0x102c0a(0x100)]===0xe*0x21b+0x1*0x10bb+0x3*-0xf67||_0x29c2ba[_0x102c0a(0x119)][_0x102c0a(0x100)]>TOOL_EXECUTION_LIMITS[_0x102c0a(0xed)]||!Array[_0x102c0a(0x101)](_0x29c2ba[_0x102c0a(0x112)])||_0x29c2ba[_0x102c0a(0x112)][_0x102c0a(0x100)]<0x1351+0xed8+-0x2227||_0x29c2ba[_0x102c0a(0x112)][_0x102c0a(0x100)]>0x341+-0x6*0x372+0x116e)return invalidQuestion();const _0x1044ab=_0x29c2ba[_0x102c0a(0x112)][_0x102c0a(0x105)](_0x3d031a=>{const _0x3c175=_0x102c0a;if(!_0x3d031a||typeof _0x3d031a!==_0x3c175(0xfb)||Array[_0x3c175(0x101)](_0x3d031a))return invalidQuestion();const _0x154bb2=_0x3d031a;if(Object[_0x3c175(0x118)](_0x154bb2)[_0x3c175(0x10e)](_0x2cb61d=>![_0x3c175(0x10b),_0x3c175(0xf9)][_0x3c175(0xfd)](_0x2cb61d))||typeof _0x154bb2[_0x3c175(0x10b)]!==_0x3c175(0x107)||_0x154bb2[_0x3c175(0x10b)][_0x3c175(0x117)]()[_0x3c175(0x100)]===-0x12a2+0x2*-0x8c3+0x2428||_0x154bb2[_0x3c175(0x10b)][_0x3c175(0x100)]>-0xc22*-0x1+-0x52b+0x1*-0x6a7||typeof _0x154bb2[_0x3c175(0xf9)]!==_0x3c175(0x107)||_0x154bb2[_0x3c175(0xf9)][_0x3c175(0x117)]()[_0x3c175(0x100)]===-0xef8+-0x112a+-0x1011*-0x2||_0x154bb2[_0x3c175(0xf9)][_0x3c175(0x100)]>TOOL_EXECUTION_LIMITS[_0x3c175(0xf6)])return invalidQuestion();return{'label':_0x154bb2[_0x3c175(0x10b)],'description':_0x154bb2[_0x3c175(0xf9)]};});return{'id':_0x29c2ba['id'],'header':_0x29c2ba[_0x102c0a(0x10c)],'question':_0x29c2ba[_0x102c0a(0x119)],'options':_0x1044ab};});if(new Set(_0x3ccfdb[_0x4c7476(0x105)](_0x2faefd=>_0x2faefd['id']))[_0x4c7476(0x10d)]!==_0x3ccfdb[_0x4c7476(0x100)])return invalidQuestion();return{'questions':_0x3ccfdb};}function invalidQuestion(){const _0x258f6e=_0x56c141;throw new MarAgentError(_0x258f6e(0xf0),_0x258f6e(0xee));}
1
+ import { randomUUID } from 'node:crypto';
2
+ import { MarAgentError } from '../error.js';
3
+ import { TOOL_EXECUTION_LIMITS } from './execution-limits.js';
4
+ export const questionToolDefinition = {
5
+ name: 'question',
6
+ parallelSafety: 'serial',
7
+ description: 'Pause for one to three tightly related user-owned decisions that materially change the result and cannot be resolved through relevant safe discovery. Prefer asking over guessing in Plan mode; do not avoid clarification by inventing configuration, branches, abstractions, or support for multiple outcomes. Provide 2-3 mutually exclusive options with consequences, put the recommended option first and identify it in its label or description, and use another question round if key ambiguity remains. This is not a permission/approval tool and should not interrupt routine in-scope work.',
8
+ inputSchema: {
9
+ type: 'object',
10
+ properties: {
11
+ questions: {
12
+ type: 'array',
13
+ minItems: 1,
14
+ maxItems: 3,
15
+ items: {
16
+ type: 'object',
17
+ properties: {
18
+ id: { type: 'string' },
19
+ header: { type: 'string' },
20
+ question: {
21
+ type: 'string',
22
+ maxLength: TOOL_EXECUTION_LIMITS.questionMaxTextCharacters
23
+ },
24
+ options: {
25
+ type: 'array',
26
+ minItems: 2,
27
+ maxItems: 3,
28
+ description: 'Provide 2-3 mutually exclusive choices with consequences. Put the recommended option first and identify it in its label or description.',
29
+ items: {
30
+ type: 'object',
31
+ properties: {
32
+ label: { type: 'string', maxLength: 80 },
33
+ description: {
34
+ type: 'string',
35
+ maxLength: TOOL_EXECUTION_LIMITS.questionMaxOptionCharacters
36
+ }
37
+ },
38
+ required: ['label', 'description'],
39
+ additionalProperties: false
40
+ }
41
+ }
42
+ },
43
+ required: ['id', 'header', 'question', 'options'],
44
+ additionalProperties: false
45
+ }
46
+ }
47
+ },
48
+ required: ['questions'],
49
+ additionalProperties: false
50
+ }
51
+ };
52
+ export async function executeQuestion(arguments_, context) {
53
+ const value = parseQuestionInput(arguments_);
54
+ if (!context.host.requestUserInput)
55
+ throw new MarAgentError('MAR_AGENT_TOOL_INPUT_INVALID', 'Question Host capability is unavailable.');
56
+ const requestId = randomUUID();
57
+ await context.emit({ type: 'user_input.requested', requestId, questions: value.questions });
58
+ const answers = await context.host.requestUserInput({ requestId, questions: value.questions }, context.signal);
59
+ await context.emit({ type: 'user_input.resolved', requestId });
60
+ if (!answers || typeof answers !== 'object' || Array.isArray(answers))
61
+ throw new MarAgentError('MAR_AGENT_USER_INPUT_INVALID', 'Question answers are invalid.');
62
+ const expectedIds = value.questions.map((question) => question.id).sort();
63
+ const answerIds = Object.keys(answers).sort();
64
+ if (expectedIds.length !== answerIds.length ||
65
+ expectedIds.some((id, index) => id !== answerIds[index]))
66
+ throw new MarAgentError('MAR_AGENT_USER_INPUT_INVALID', 'Question answers are incomplete.');
67
+ if (Object.values(answers).some((answer) => typeof answer !== 'string' || !answer.trim()))
68
+ throw new MarAgentError('MAR_AGENT_USER_INPUT_INVALID', 'Question answers are invalid.');
69
+ return { content: JSON.stringify(answers), data: answers };
70
+ }
71
+ function parseQuestionInput(value) {
72
+ if (!value || typeof value !== 'object' || Array.isArray(value))
73
+ return invalidQuestion();
74
+ const input = value;
75
+ if (Object.keys(input).some((key) => key !== 'questions') || !Array.isArray(input.questions))
76
+ return invalidQuestion();
77
+ if (input.questions.length < 1 || input.questions.length > 3)
78
+ return invalidQuestion();
79
+ const questions = input.questions.map((question) => {
80
+ if (!question || typeof question !== 'object' || Array.isArray(question))
81
+ return invalidQuestion();
82
+ const record = question;
83
+ if (Object.keys(record).some((key) => !['id', 'header', 'question', 'options'].includes(key)) ||
84
+ typeof record.id !== 'string' ||
85
+ record.id.trim().length === 0 ||
86
+ record.id.length > 128 ||
87
+ typeof record.header !== 'string' ||
88
+ record.header.trim().length === 0 ||
89
+ record.header.length > 80 ||
90
+ typeof record.question !== 'string' ||
91
+ record.question.trim().length === 0 ||
92
+ record.question.length > TOOL_EXECUTION_LIMITS.questionMaxTextCharacters ||
93
+ !Array.isArray(record.options) ||
94
+ record.options.length < 2 ||
95
+ record.options.length > 3)
96
+ return invalidQuestion();
97
+ const options = record.options.map((option) => {
98
+ if (!option || typeof option !== 'object' || Array.isArray(option))
99
+ return invalidQuestion();
100
+ const item = option;
101
+ if (Object.keys(item).some((key) => !['label', 'description'].includes(key)) ||
102
+ typeof item.label !== 'string' ||
103
+ item.label.trim().length === 0 ||
104
+ item.label.length > 80 ||
105
+ typeof item.description !== 'string' ||
106
+ item.description.trim().length === 0 ||
107
+ item.description.length > TOOL_EXECUTION_LIMITS.questionMaxOptionCharacters)
108
+ return invalidQuestion();
109
+ return { label: item.label, description: item.description };
110
+ });
111
+ return {
112
+ id: record.id,
113
+ header: record.header,
114
+ question: record.question,
115
+ options
116
+ };
117
+ });
118
+ if (new Set(questions.map((question) => question.id)).size !== questions.length)
119
+ return invalidQuestion();
120
+ return { questions };
121
+ }
122
+ function invalidQuestion() {
123
+ throw new MarAgentError('MAR_AGENT_TOOL_INPUT_INVALID', 'Question input is invalid.');
124
+ }
@@ -0,0 +1,16 @@
1
+ export interface ParsedReadContextItem {
2
+ readonly index: number;
3
+ readonly path: string;
4
+ readonly content: string;
5
+ readonly metadata: Record<string, unknown>;
6
+ readonly contentStart: number;
7
+ readonly contentEnd: number;
8
+ }
9
+ export interface ParsedReadContextOutput {
10
+ readonly items: readonly ParsedReadContextItem[];
11
+ }
12
+ export declare function parseReadContextOutput(value: string): ParsedReadContextOutput | undefined;
13
+ export declare function replaceReadContextItems(value: string, replacements: readonly {
14
+ readonly index: number;
15
+ readonly replacement: string;
16
+ }[]): string;
@@ -0,0 +1,85 @@
1
+ export function parseReadContextOutput(value) {
2
+ if (!value.startsWith('<read_') || value.length === 0)
3
+ return undefined;
4
+ const items = [];
5
+ let offset = 0;
6
+ while (offset < value.length) {
7
+ if (value.startsWith('<read_result ', offset)) {
8
+ const header = /^<read_result index="(\d+)" path="([^"]*)">\n/u.exec(value.slice(offset));
9
+ if (!header)
10
+ return undefined;
11
+ const contentStart = offset + header[0].length;
12
+ const metadataMarker = '\n<read_metadata>';
13
+ const metadataStart = value.indexOf(metadataMarker, contentStart);
14
+ if (metadataStart < 0)
15
+ return undefined;
16
+ const metadataEndMarker = '</read_metadata>\n</read_result>';
17
+ const metadataEnd = value.indexOf(metadataEndMarker, metadataStart + metadataMarker.length);
18
+ if (metadataEnd < 0)
19
+ return undefined;
20
+ const metadataText = value.slice(metadataStart + metadataMarker.length, metadataEnd);
21
+ let metadata;
22
+ try {
23
+ metadata = JSON.parse(metadataText);
24
+ }
25
+ catch {
26
+ return undefined;
27
+ }
28
+ const index = Number(header[1]);
29
+ const path = unescapeAttribute(header[2]);
30
+ if (!Number.isSafeInteger(index) ||
31
+ index < 0 ||
32
+ !isRecord(metadata) ||
33
+ metadata.path !== path)
34
+ return undefined;
35
+ const blockEnd = metadataEnd + metadataEndMarker.length;
36
+ items.push({
37
+ index,
38
+ path,
39
+ content: value.slice(contentStart, metadataStart),
40
+ metadata,
41
+ contentStart,
42
+ contentEnd: metadataStart
43
+ });
44
+ offset = blockEnd;
45
+ }
46
+ else if (value.startsWith('<read_error ', offset)) {
47
+ const error = /^<read_error index="\d+" path="[^"]*" code="[^"]*">[^\n]*<\/read_error>/u.exec(value.slice(offset));
48
+ if (!error)
49
+ return undefined;
50
+ offset += error[0].length;
51
+ }
52
+ else
53
+ return undefined;
54
+ if (offset === value.length)
55
+ break;
56
+ if (value[offset] !== '\n')
57
+ return undefined;
58
+ offset++;
59
+ }
60
+ if (new Set(items.map((item) => item.index)).size !== items.length)
61
+ return undefined;
62
+ return { items };
63
+ }
64
+ export function replaceReadContextItems(value, replacements) {
65
+ const parsed = parseReadContextOutput(value);
66
+ if (!parsed)
67
+ return value;
68
+ const byIndex = new Map(replacements.map((replacement) => [replacement.index, replacement]));
69
+ const selected = parsed.items
70
+ .flatMap((item) => {
71
+ const replacement = byIndex.get(item.index);
72
+ return replacement ? [{ item, replacement: replacement.replacement }] : [];
73
+ })
74
+ .sort((left, right) => right.item.contentStart - left.item.contentStart);
75
+ let result = value;
76
+ for (const { item, replacement } of selected)
77
+ result = `${result.slice(0, item.contentStart)}${replacement}${result.slice(item.contentEnd)}`;
78
+ return result;
79
+ }
80
+ function unescapeAttribute(value) {
81
+ return value.replaceAll('&lt;', '<').replaceAll('&quot;', '"').replaceAll('&amp;', '&');
82
+ }
83
+ function isRecord(value) {
84
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
85
+ }
@@ -30,6 +30,19 @@ export interface BatchReadResult {
30
30
  results: Array<ReadResult | ReadErrorResult>;
31
31
  truncated: boolean;
32
32
  }
33
+ export interface ReadEventData {
34
+ mode: 'batch';
35
+ results: Array<{
36
+ path: string;
37
+ startLine?: number;
38
+ endLine?: number;
39
+ error?: {
40
+ code: string;
41
+ message: string;
42
+ };
43
+ }>;
44
+ truncated: boolean;
45
+ }
33
46
  export declare class ReadTool {
34
47
  #private;
35
48
  private readonly paths;