@myagentroam/node 0.9.62 → 0.9.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +4 -0
- package/dist/capabilities.js +110 -2
- package/dist/claude-agent-sdk.js +330 -2
- package/dist/claude-channel.js +44 -2
- package/dist/codex-app-server.js +510 -2
- package/dist/config.js +106 -2
- package/dist/connector/node-connector-options.js +1 -2
- package/dist/connector/node-operation-router.js +22 -2
- package/dist/connector.js +1736 -2
- package/dist/control-outbound-scheduler.js +153 -2
- package/dist/database.js +639 -2
- package/dist/fake-runner.js +129 -2
- package/dist/git-askpass.js +12 -0
- package/dist/git-execution-helper.js +266 -0
- package/dist/health.js +3 -2
- package/dist/main.js +57 -2
- package/dist/mcp-installation-model.js +1 -2
- package/dist/migrations/v004.js +55 -3
- package/dist/migrations/v005.js +13 -3
- package/dist/migrations/v006.js +90 -3
- package/dist/migrations/v007.js +22 -3
- package/dist/migrations/v008.js +18 -3
- package/dist/migrations/v009.js +70 -4
- package/dist/migrations/v010.js +43 -3
- package/dist/migrations/v011.js +20 -3
- package/dist/migrations/v012.js +8 -0
- package/dist/native-jsonl-reader.js +186 -2
- package/dist/native-session-history.js +1143 -2
- package/dist/opencode-runtime.js +80 -2
- package/dist/opencode-server.js +259 -2
- package/dist/operational.js +122 -2
- package/dist/process-tree.js +18 -2
- package/dist/ripgrep-binary.js +31 -2
- package/dist/rotating-log.js +67 -2
- package/dist/runner/abstract-runner.js +260 -2
- package/dist/runner/claude/managed-run-controller.js +355 -2
- package/dist/runner/claude/tool-normalizer.js +120 -2
- package/dist/runner/claude-code-runner.js +303 -2
- package/dist/runner/codex/composer-image-markers.js +8 -2
- package/dist/runner/codex/conversation-parser.js +913 -2
- package/dist/runner/codex/managed-run-controller.js +494 -2
- package/dist/runner/codex/tool-normalizer.js +214 -2
- package/dist/runner/codex-runner.js +585 -2
- package/dist/runner/fake-test-runner.js +47 -2
- package/dist/runner/mar-agent/conversation-normalizer.js +644 -2
- package/dist/runner/mar-agent/executor-stdio-client-transport.js +139 -2
- package/dist/runner/mar-agent/generated-images.js +41 -2
- package/dist/runner/mar-agent/history-projection.js +106 -2
- package/dist/runner/mar-agent/hosted-conversation-runtime.js +446 -2
- package/dist/runner/mar-agent/managed-run-controller.js +785 -2
- package/dist/runner/mar-agent/mcp-client-pool.js +233 -2
- package/dist/runner/mar-agent/runtime-model-factory.js +326 -2
- package/dist/runner/mar-agent-runner.js +458 -2
- package/dist/runner/opencode/conversation-parser.js +221 -2
- package/dist/runner/opencode/managed-run-controller.js +588 -2
- package/dist/runner/opencode/tool-normalizer.js +80 -2
- package/dist/runner/opencode-runner.js +426 -2
- package/dist/runner/runner-registry.js +87 -2
- package/dist/runner-command-engine.js +71 -2
- package/dist/runner-profiles.js +323 -2
- package/dist/runner-usage.js +190 -2
- package/dist/runtime-command-detector.js +73 -2
- package/dist/runtime-model.js +1 -2
- package/dist/runtime-state.js +1509 -2
- package/dist/service/attachment-domain-state.js +7 -2
- package/dist/service/bubblewrap-sandbox-executor.js +543 -2
- package/dist/service/continuous-run-coordinator.js +425 -2
- package/dist/service/conversation-history-service.js +552 -2
- package/dist/service/conversation-hosting-capability-service.js +61 -2
- package/dist/service/conversation-hosting-enablement-service.js +91 -2
- package/dist/service/conversation-hosting-maintenance-service.js +174 -2
- package/dist/service/conversation-segment-service.js +162 -2
- package/dist/service/conversation-template-node-service.js +992 -2
- package/dist/service/external-session-resume-service.js +152 -2
- package/dist/service/fake-managed-run-service.js +60 -2
- package/dist/service/git-execution-service.js +418 -0
- package/dist/service/git-operation-service.js +57 -0
- package/dist/service/hosted-conversation-node-service.js +1982 -2
- package/dist/service/hosted-conversation-store.js +1405 -2
- package/dist/service/managed-runner-session-service.js +35 -2
- package/dist/service/mar-agent-model-transport-test-service.js +88 -2
- package/dist/service/mcp-installation-verifier.js +87 -2
- package/dist/service/mcp-node-operation-service.js +90 -2
- package/dist/service/mission-mcp-server.js +124 -2
- package/dist/service/mission-mcp-stdio.js +40 -2
- package/dist/service/mission-runtime.js +142 -2
- package/dist/service/native-session-projection-service.js +274 -2
- package/dist/service/native-session-watch-service.js +683 -2
- package/dist/service/node-connection-lifecycle-service.js +88 -2
- package/dist/service/node-control-channel.js +85 -2
- package/dist/service/node-control-message-service.js +109 -2
- package/dist/service/node-request-service.js +62 -2
- package/dist/service/node-run-event-bridge.js +88 -2
- package/dist/service/node-terminal-channel.js +202 -2
- package/dist/service/node-upgrade-coordinator.js +137 -2
- package/dist/service/node-workspace-coordinator.js +97 -2
- package/dist/service/recent-run-projection-service.js +99 -2
- package/dist/service/run-attachment-service.js +321 -2
- package/dist/service/run-domain-state.js +4 -2
- package/dist/service/run-event-service.js +246 -2
- package/dist/service/run-ownership-policy.js +22 -2
- package/dist/service/run-workbench-service.js +120 -2
- package/dist/service/runner-channel-message-service.js +20 -2
- package/dist/service/runner-interaction-service.js +243 -2
- package/dist/service/runner-service.js +69 -2
- package/dist/service/runtime-credential-control-service.js +95 -2
- package/dist/service/session-catalog-service.js +404 -2
- package/dist/service/session-command-service.js +125 -2
- package/dist/service/session-context-service.js +128 -2
- package/dist/service/session-domain-state.js +9 -2
- package/dist/service/session-identity-service.js +86 -2
- package/dist/service/session-lifecycle-service.js +248 -2
- package/dist/service/session-message-service.js +270 -2
- package/dist/service/session-presentation-service.js +43 -2
- package/dist/service/session-query-service.js +82 -2
- package/dist/service/session-watch-slot-coordinator.js +21 -2
- package/dist/service/skill-directory-service.js +238 -2
- package/dist/service/skill-install-service.js +434 -2
- package/dist/service/skill-node-operation-service.js +206 -2
- package/dist/service/terminal-relay-state.js +3 -2
- package/dist/service/terminal-service.js +90 -2
- package/dist/service/web-search-error.js +40 -2
- package/dist/service/workbench-event-service.js +21 -2
- package/dist/service/workbench-manifest-service.js +69 -2
- package/dist/service/workspace-change-service.js +290 -2
- package/dist/service/workspace-content-search-service.js +457 -2
- package/dist/service/workspace-domain-state.js +41 -2
- package/dist/service/workspace-file-service.js +150 -2
- package/dist/service/workspace-git-exclude-service.js +119 -2
- package/dist/service/workspace-queue-workbench-service.js +176 -2
- package/dist/service/workspace-service.js +92 -2
- package/dist/service/workspace-session-service.js +154 -2
- package/dist/service/workspace-upload-service.js +262 -2
- package/dist/service/workspace-watch-controller.js +68 -2
- package/dist/service/workspace-watch-service.js +170 -2
- package/dist/service/workspace-watch-snapshot-service.js +218 -2
- package/dist/service/workspace-workbench-service.js +239 -2
- package/dist/service.js +91 -2
- package/dist/storage.js +32 -2
- package/dist/supervisor.js +136 -2
- package/dist/terminal.js +496 -2
- package/dist/util/git-credential-client.js +32 -0
- package/dist/util/node-operation-data.js +9 -2
- package/dist/util/node-operation-parsers.js +382 -2
- package/dist/util/personal-instructions.js +34 -2
- package/dist/util/runner-error.js +70 -2
- package/dist/util/runner-native-session-parsers.js +510 -2
- package/dist/util/safe-error.js +8 -2
- package/dist/util/secret-environment.js +25 -2
- package/dist/workspace.js +1793 -2
- package/package.json +11 -8
- package/vendor/ripgrep/darwin-arm64/rg +0 -0
- package/vendor/ripgrep/darwin-x64/rg +0 -0
- package/vendor/ripgrep/manifest.json +12 -0
- package/README.md +0 -42
- package/dist/event-buffer.js +0 -2
- package/dist/migrations/v001.js +0 -107
- package/dist/migrations/v002.js +0 -2
- package/dist/migrations/v003.js +0 -2
- package/dist/service/mcp-package-installer.js +0 -2
|
@@ -1,2 +1,321 @@
|
|
|
1
|
-
|
|
2
|
-
const _0x56f099=_0x4740;(function(_0x563e2a,_0x24a896){const _0x30b364=_0x4740,_0x25217d=_0x563e2a();while(!![]){try{const _0x107396=parseInt(_0x30b364(0x1e1))/(-0x1cb*-0x11+0x1*0x623+-0x249d)+parseInt(_0x30b364(0x1d0))/(-0x1d97+-0x1150*0x1+-0x3*-0xfa3)*(-parseInt(_0x30b364(0x1e7))/(0x14bd*0x1+0x1613*0x1+-0x2acd*0x1))+parseInt(_0x30b364(0x1d1))/(0x238c+0x1a46+-0x1b*0x24a)*(parseInt(_0x30b364(0x1d6))/(0x9ac*-0x2+-0x112d+0x248a))+-parseInt(_0x30b364(0x206))/(0xeb2+0x80b+0x5*-0x48b)*(-parseInt(_0x30b364(0x1ea))/(0x739*-0x2+-0x1dff*-0x1+-0xf86))+parseInt(_0x30b364(0x1f7))/(-0x21d1+-0x1b0f+0x3ce8)+-parseInt(_0x30b364(0x1cc))/(0x2173+-0x290*0xe+0x276)+parseInt(_0x30b364(0x1f2))/(0xf2*-0x16+-0x3f*0x37+0x225f);if(_0x107396===_0x24a896)break;else _0x25217d['push'](_0x25217d['shift']());}catch(_0x4b9786){_0x25217d['push'](_0x25217d['shift']());}}}(_0x3200,0x7*0xc21a+0x449*0x83+-0x9948*0x6));function _0x4740(_0x3d04a9,_0x29fdde){_0x3d04a9=_0x3d04a9-(0xe*-0x16+-0xb62*0x2+-0xd*-0x1fb);const _0x554eac=_0x3200();let _0x127407=_0x554eac[_0x3d04a9];if(_0x4740['YhjFOY']===undefined){var _0x4f7f62=function(_0x146726){const _0x11ef58='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x506122='',_0x1d12e7='';for(let _0x4af65=0x1d96+-0x2b*0x25+-0x175f,_0x44c101,_0x3706ec,_0x2c803d=0x1d30+0x1*-0x20b9+0xb5*0x5;_0x3706ec=_0x146726['charAt'](_0x2c803d++);~_0x3706ec&&(_0x44c101=_0x4af65%(0x256c+0x565+-0x2acd*0x1)?_0x44c101*(-0xc81*0x3+0x14d+0x2476)+_0x3706ec:_0x3706ec,_0x4af65++%(0x444+0xe9a*0x1+0xfe*-0x13))?_0x506122+=String['fromCharCode'](0x1815+0xe9c+-0x5*0x78a&_0x44c101>>(-(-0xaba+-0x211c+-0xaf6*-0x4)*_0x4af65&-0x513+-0x529+0xa42)):0x569*0x1+0x1348+0x15*-0x12d){_0x3706ec=_0x11ef58['indexOf'](_0x3706ec);}for(let _0x3fec6b=0x10*-0x25b+-0x6ef*0x1+0x2c9f,_0xfb3298=_0x506122['length'];_0x3fec6b<_0xfb3298;_0x3fec6b++){_0x1d12e7+='%'+('00'+_0x506122['charCodeAt'](_0x3fec6b)['toString'](-0x59d*0x5+-0x1ee8+0x11*0x379))['slice'](-(-0xd8+-0x11*0x5b+0x6e5));}return decodeURIComponent(_0x1d12e7);};_0x4740['BEWCnh']=_0x4f7f62,_0x4740['yGhedf']={},_0x4740['YhjFOY']=!![];}const _0x3854b1=_0x554eac[0x2d*-0x15+-0xb37+0xee8];_0x4740['rrUINT']!==_0x3854b1&&(_0x4740['yGhedf']={},_0x4740['rrUINT']=_0x3854b1);const _0x3af4c9=_0x4740['yGhedf'][_0x3d04a9];return _0x3af4c9===undefined?(_0x127407=_0x4740['BEWCnh'](_0x127407),_0x4740['yGhedf'][_0x3d04a9]=_0x127407):_0x127407=_0x3af4c9,_0x127407;}import{tmpdir}from'node:os';function _0x3200(){const _0xd83de4=['C291CMnLswq','zMLUzeLUzgv4','zgLZCg9Zzq','y2f0y2G','BMf0AxzLsw1Hz2vsB290CW','mJK3ntuWEgfZzujI','BM93','ANbN','BMf0AxzLlwHPC3rVCNK6','DMfSDwvZ','mJuZotq2nfLfweHeAG','CMvNAxn0zxjoyxrPDMu','Dw5Yzwy','BxLHz2vUDhjVyw0Tyxr0ywnOBwvUDc0','BMf0AxzLsgLZDg9YEuLTywDLCW','CNvUsw1Hz2vZ','BMfTzq','yMfZzty0','yxbWzw5K','BMf0AxzLsgLZDg9YEuLTywDLvgLTzxjZ','Bg9JywXqyxrO','CgvYC2LZDezPBgvZ','y2fJAgvKqxr0ywnOBwvUDej5ugf0Aa','zgf0yujHC2u2na','zgvSzxrL','mtGZodq2uuPfEwHc','Bw92zq','tuvtu0fhrv9bvfrbq0Hnru5ux0rjuKvdve9swv9jtLzbteLe','CMvWBgfJzq','CMvNAxn0zxjoyxrPDMvjBwfNzxm','Aw1Hz2vZ','AxngAwXL','ywXS','A2v5CW','BwLTzq','zNjVBq','ANbLzW','C3rYAw5N','AxneAxjLy3rVCNK','CM9VDa','C3rHDgu','CMv1C2vdywnOzwrsDw5jBwfNzxm','zMLSzq','y2XLyw51Ca','C2L6zq','yNL0zvnPEMu','y2fJAgu','CMvHzgvY','CNvUrgLYzwn0B3jPzxm','BwfW','mZq2odiZmun4AeHQrq','yNL0zuXLBMD0Aa','lM1HCI90zw1WlwzPBgvZlW','AxntEw1IB2XPy0XPBMS','mJzTy3v4r2i','neH2Agz3wa','ChvZAa','DgvTCc1MAwXLCW','C3rHCNrZv2L0Aa','Bg9JywXjBwfNzq','mZeYodGWrhHlB0jQ','CMvHze5HDgL2zq','Aw1Hz2uV','Bwf0zxjPywXPEMvdB2rLEa','A2LUza','C2XPy2u','z2v0','zxHWAxjL','y2XLyxi','zxHWAxjLC0f0','CMvHza','mZK3mZy0r2rQswTq','Dg9tDhjPBMC','zMLUza','Bg9JywXqyxrOCW','DgLTzxi','lM1HCG','nduZmdnOtM1Jr2K','BgvUz3rO','Cgf0Aa','n1flv1fkqq','C2v0','CNvUrMLSzurPCMvJDg9YAwvZ'];_0x3200=function(){return _0xd83de4;};return _0x3200();}import{basename,dirname,isAbsolute,join,relative,resolve}from'node:path';import{lstat,mkdir,mkdtemp,readFile,realpath,rm,writeFile}from'node:fs/promises';import{AttachmentDomainState}from'./attachment-domain-state.js';const MAX_ATTACHMENT_BYTES=(-0xcff+0x18e5+-0xbe1*0x1)*(0x232b*-0x1+0x8b1*0x1+-0x2*-0xf3d)*(-0x197e+0xcdb+0x10a3*0x1),IMAGE_CACHE_TTL_MS=(-0x21e6+0x1d*-0xa3+0x3499)*(0x7d5*0x12+0x19*0x11d9+-0x160cb),NATIVE_IMAGE_INDEX_TTL_MS=(-0x63a+0xb27+-0x4b1)*(-0x1050d*0x1+-0x13b9e+0x32b0b);export class RunAttachmentService{[_0x56f099(0x1f1)];[_0x56f099(0x215)]=new AttachmentDomainState();constructor(_0x4c6d07){const _0x1ae8bf=_0x56f099;this[_0x1ae8bf(0x1f1)]=_0x4c6d07;}async[_0x56f099(0x1d9)](_0x4833d3,_0x440b37){const _0x256d89=_0x56f099;if(_0x440b37[_0x256d89(0x1e8)]===-0x129b+0x3*-0xb99+0x3566*0x1)return[];const _0x49ec05=await mkdtemp(join(tmpdir(),_0x256d89(0x1fa)));this[_0x256d89(0x215)][_0x256d89(0x1ca)][_0x256d89(0x1eb)](_0x4833d3,_0x49ec05);try{const _0x525fa3=await Promise[_0x256d89(0x20d)](_0x440b37[_0x256d89(0x1cb)](async(_0x947a30,_0x491d76)=>{const _0x1aa0a=_0x256d89,_0x22e73a=_0x947a30[_0x1aa0a(0x20f)][_0x1aa0a(0x1db)](_0x1aa0a(0x1d8)[_0x1aa0a(0x1e8)])[_0x1aa0a(0x209)](_0x1aa0a(0x211),_0x1aa0a(0x1f4)),_0x4420e1=join(_0x49ec05,_0x491d76+(-0xf9c*0x2+0x5a1+0x18*0x111)+'.'+_0x22e73a);return await writeFile(_0x4420e1,Buffer[_0x1aa0a(0x210)](_0x947a30[_0x1aa0a(0x204)],_0x1aa0a(0x1fe)),{'mode':0x180}),{'type':_0x1aa0a(0x1d5),'path':_0x4420e1};})),_0x5c5b00=this[_0x256d89(0x215)][_0x256d89(0x1fc)][_0x256d89(0x1dc)](_0x4833d3);if(_0x5c5b00!==undefined)_0x5c5b00[_0x256d89(0x1e4)]=_0x525fa3[_0x256d89(0x1cb)](_0x221120=>_0x221120[_0x256d89(0x1e9)]);return _0x525fa3;}catch(_0x24e27b){this[_0x256d89(0x218)](_0x4833d3);throw _0x24e27b;}}async[_0x56f099(0x202)](_0x236259,_0x15e37c,_0x3e669f){const _0x290c3f=_0x56f099;if(_0x3e669f[_0x290c3f(0x1e8)]===0x26ce+-0x2632+-0x9c)return[];const _0x51a858=resolve(_0x236259,_0x290c3f(0x1e6));await mkdir(_0x51a858,{'recursive':!![],'mode':0x1c0});const _0x530e97=await lstat(_0x51a858);if(!_0x530e97[_0x290c3f(0x213)]()||_0x530e97[_0x290c3f(0x1cf)]())throw new Error(_0x290c3f(0x208));const _0x3c50e3=join(_0x51a858,_0x290c3f(0x1d3));await mkdir(_0x3c50e3,{'recursive':!![],'mode':0x1c0});const _0x2acdd3=await lstat(_0x3c50e3);if(!_0x2acdd3[_0x290c3f(0x213)]()||_0x2acdd3[_0x290c3f(0x1cf)]())throw new Error(_0x290c3f(0x208));const _0x41fe17=join(_0x3c50e3,_0x15e37c);await mkdir(_0x41fe17,{'mode':0x1c0}),this[_0x290c3f(0x215)][_0x290c3f(0x1ec)][_0x290c3f(0x1eb)](_0x15e37c,_0x41fe17);try{return await Promise[_0x290c3f(0x20d)](_0x3e669f[_0x290c3f(0x1cb)](_0x360429=>writeFile(join(_0x41fe17,_0x360429[_0x290c3f(0x1fd)]),Buffer[_0x290c3f(0x210)](_0x360429[_0x290c3f(0x204)],_0x290c3f(0x1fe)),{'flag':'wx','mode':0x180}))),_0x3e669f[_0x290c3f(0x1cb)](_0x3f21fb=>_0x290c3f(0x1ce)+_0x15e37c+'/'+_0x3f21fb[_0x290c3f(0x1fd)]);}catch(_0x7eb8e7){this[_0x290c3f(0x215)][_0x290c3f(0x1ec)][_0x290c3f(0x205)](_0x15e37c),await rm(_0x41fe17,{'recursive':!![],'force':!![]});throw _0x7eb8e7;}}[_0x56f099(0x218)](_0x44c6b1){const _0x590930=_0x56f099,_0x6d795=this[_0x590930(0x215)][_0x590930(0x1ca)][_0x590930(0x1dc)](_0x44c6b1);_0x6d795!==undefined&&(this[_0x590930(0x215)][_0x590930(0x1ca)][_0x590930(0x205)](_0x44c6b1),void rm(_0x6d795,{'recursive':!![],'force':!![]})[_0x590930(0x1f0)](()=>undefined));const _0x1fe95a=this[_0x590930(0x215)][_0x590930(0x1ec)][_0x590930(0x1dc)](_0x44c6b1);_0x1fe95a!==undefined&&(this[_0x590930(0x215)][_0x590930(0x1ec)][_0x590930(0x205)](_0x44c6b1),void rm(_0x1fe95a,{'recursive':!![],'force':!![]})[_0x590930(0x1f0)](()=>undefined));}[_0x56f099(0x1c8)](_0x3c9ff4,_0x526aba){const _0x3bb72c=_0x56f099;if(_0x526aba[_0x3bb72c(0x1e8)]===0x1e21+0x1*-0x1d21+-0x100)return;this[_0x3bb72c(0x1de)](_0x3c9ff4),this[_0x3bb72c(0x215)][_0x3bb72c(0x1fc)][_0x3bb72c(0x1eb)](_0x3c9ff4,{'images':_0x526aba,'localPaths':_0x526aba[_0x3bb72c(0x1cb)](()=>undefined),'expiresAt':undefined,'timer':undefined});}[_0x56f099(0x207)](_0xe7f345,_0x4bd229){const _0x4dd812=_0x56f099,_0x3a3052=this[_0x4dd812(0x215)][_0x4dd812(0x1fc)][_0x4dd812(0x1dc)](_0xe7f345);_0x3a3052!==undefined&&(this[_0x4dd812(0x215)][_0x4dd812(0x1fc)][_0x4dd812(0x205)](_0xe7f345),this[_0x4dd812(0x215)][_0x4dd812(0x1fc)][_0x4dd812(0x1eb)](_0x4bd229,_0x3a3052));const _0x554c7c=this[_0x4dd812(0x215)][_0x4dd812(0x1ca)][_0x4dd812(0x1dc)](_0xe7f345);_0x554c7c!==undefined&&(this[_0x4dd812(0x215)][_0x4dd812(0x1ca)][_0x4dd812(0x205)](_0xe7f345),this[_0x4dd812(0x215)][_0x4dd812(0x1ca)][_0x4dd812(0x1eb)](_0x4bd229,_0x554c7c));const _0x22c92a=this[_0x4dd812(0x215)][_0x4dd812(0x1ec)][_0x4dd812(0x1dc)](_0xe7f345);_0x22c92a!==undefined&&(this[_0x4dd812(0x215)][_0x4dd812(0x1ec)][_0x4dd812(0x205)](_0xe7f345),this[_0x4dd812(0x215)][_0x4dd812(0x1ec)][_0x4dd812(0x1eb)](_0x4bd229,_0x22c92a));}[_0x56f099(0x1ff)](_0x643ed2,_0xbe0fd8){const _0x35cd48=_0x56f099;if(_0xbe0fd8[_0x35cd48(0x1e8)]===-0x11*0x5b+-0x1232+0x183d)return[];const _0x5860f5=this[_0x35cd48(0x215)][_0x35cd48(0x1fc)][_0x35cd48(0x1dc)](_0x643ed2),_0x1d6856=_0x5860f5?.[_0x35cd48(0x20b)]??[],_0x513b4d=_0x1d6856[_0x35cd48(0x1e8)],_0x21316a=[..._0x1d6856,..._0xbe0fd8];if(_0x5860f5===undefined)this[_0x35cd48(0x215)][_0x35cd48(0x1fc)][_0x35cd48(0x1eb)](_0x643ed2,{'images':_0x21316a,'localPaths':_0xbe0fd8[_0x35cd48(0x1cb)](()=>undefined),'expiresAt':undefined,'timer':undefined});else _0x5860f5[_0x35cd48(0x20b)]=_0x21316a,_0x5860f5[_0x35cd48(0x1e4)]=[..._0x5860f5[_0x35cd48(0x1e4)],..._0xbe0fd8[_0x35cd48(0x1cb)](()=>undefined)];return _0xbe0fd8[_0x35cd48(0x1cb)]((_0x2546c7,_0x1c4364)=>({'name':_0x2546c7[_0x35cd48(0x1fd)],'mime':_0x2546c7[_0x35cd48(0x20f)],'byteSize':Buffer[_0x35cd48(0x1cd)](_0x2546c7[_0x35cd48(0x204)],_0x35cd48(0x1fe)),'runId':_0x643ed2,'imageIndex':_0x513b4d+_0x1c4364}));}[_0x56f099(0x1e0)](_0x134c3c,_0x256002){const _0x12387c=_0x56f099,_0x508839=this[_0x12387c(0x215)][_0x12387c(0x1fc)][_0x12387c(0x1dc)](_0x134c3c);if(_0x508839===undefined)return undefined;if(_0x508839[_0x12387c(0x1df)]!==undefined&&_0x508839[_0x12387c(0x1df)]<=Date[_0x12387c(0x1f3)]())return this[_0x12387c(0x1de)](_0x134c3c),undefined;return _0x508839[_0x12387c(0x20b)][_0x256002];}[_0x56f099(0x1f8)](_0x4673e9,_0x3cdb81){const _0x3b9621=_0x56f099;return this[_0x3b9621(0x20a)](_0x3b9621(0x1f5)+_0x4673e9['id'],this[_0x3b9621(0x1f1)](_0x4673e9),_0x3cdb81);}[_0x56f099(0x20a)](_0x1ef92d,_0x176a3c,_0x4453d3,_0x9ddc94={}){const _0x24b521=_0x56f099,_0x25f57c=_0x176a3c[_0x24b521(0x1cb)](_0x5de70c=>resolve(_0x5de70c)),_0xbf014b=this[_0x24b521(0x215)][_0x24b521(0x1fb)][_0x24b521(0x1dc)](_0x1ef92d)??[],_0xd26c0e=[];for(const _0x435945 of _0x4453d3){const _0x2901e2=_0x9ddc94[_0x24b521(0x216)]===![]||_0x435945[_0x24b521(0x201)]===undefined?undefined:this[_0x24b521(0x203)](_0x435945[_0x24b521(0x201)]);if(_0x2901e2!==undefined){_0xd26c0e[_0x24b521(0x1d2)](_0x2901e2);continue;}if(_0x435945[_0x24b521(0x1e0)]!==undefined){if(typeof _0x435945[_0x24b521(0x1ed)]!==_0x24b521(0x212)||_0x435945[_0x24b521(0x1ed)][_0x24b521(0x1e8)]===-0x9*0x13f+0x1edd+-0x1*0x13a6||!_0x435945[_0x24b521(0x20f)][_0x24b521(0x1d4)](_0x24b521(0x1d8))){_0xd26c0e[_0x24b521(0x1d2)]({'name':_0x435945[_0x24b521(0x1fd)],'mime':_0x435945[_0x24b521(0x20f)]});continue;}let _0x563258=_0xbf014b[_0x24b521(0x1ee)](_0x43f1c6=>_0x43f1c6[_0x24b521(0x1da)]===_0x24b521(0x1c9)&&_0x43f1c6[_0x24b521(0x1ed)]===_0x435945[_0x24b521(0x1ed)]);const _0x2fef7c={'kind':_0x24b521(0x1c9),'name':_0x435945[_0x24b521(0x1fd)],'mime':_0x435945[_0x24b521(0x20f)],..._0x435945[_0x24b521(0x1c7)]===undefined?{}:{'byteSize':_0x435945[_0x24b521(0x1c7)]},'sourceId':_0x435945[_0x24b521(0x1ed)],'read':_0x435945[_0x24b521(0x1e0)]};if(_0x563258<0x3*0xa46+-0x92*0x2a+-0x6de)_0x563258=_0xbf014b[_0x24b521(0x1e8)],_0xbf014b[_0x24b521(0x1d2)](_0x2fef7c);else _0xbf014b[_0x563258]=_0x2fef7c;_0xd26c0e[_0x24b521(0x1d2)]({'name':_0x435945[_0x24b521(0x1fd)],'mime':_0x435945[_0x24b521(0x20f)],..._0x435945[_0x24b521(0x1c7)]===undefined?{}:{'byteSize':_0x435945[_0x24b521(0x1c7)]},'runId':_0x1ef92d,'imageIndex':_0x563258});continue;}if(_0x435945[_0x24b521(0x201)]!==undefined&&isComposerTemporaryImagePath(_0x435945[_0x24b521(0x201)]))continue;if(_0x25f57c[_0x24b521(0x1e8)]===0x1ac9+0x4*-0x3d0+-0xb89)continue;if(_0x435945[_0x24b521(0x201)]===undefined||!_0x435945[_0x24b521(0x20f)][_0x24b521(0x1d4)](_0x24b521(0x1d8))){_0xd26c0e[_0x24b521(0x1d2)]({'name':_0x435945[_0x24b521(0x1fd)],'mime':_0x435945[_0x24b521(0x20f)]});continue;}const _0x4293d8=resolve(_0x435945[_0x24b521(0x201)]),_0xbea6c1=_0x25f57c[_0x24b521(0x1e3)](_0x163a0f=>{const _0x146d7b=_0x24b521,_0x1c466b=relative(_0x163a0f,_0x4293d8);return _0x1c466b[_0x146d7b(0x1e8)]>-0x3*-0x46f+-0x1a36+0xce9&&!_0x1c466b[_0x146d7b(0x1d4)]('..')&&!isAbsolute(_0x1c466b);});if(_0xbea6c1===undefined){_0xd26c0e[_0x24b521(0x1d2)]({'name':_0x435945[_0x24b521(0x1fd)],'mime':_0x435945[_0x24b521(0x20f)]});continue;}let _0xb25306=_0xbf014b[_0x24b521(0x1ee)](_0x3d1e4a=>_0x3d1e4a[_0x24b521(0x1da)]===_0x24b521(0x217)&&_0x3d1e4a[_0x24b521(0x1e9)]===_0x4293d8);_0xb25306<0xb24*-0x3+0xa81+0x16eb&&(_0xb25306=_0xbf014b[_0x24b521(0x1e8)],_0xbf014b[_0x24b521(0x1d2)]({'kind':_0x24b521(0x217),'name':_0x435945[_0x24b521(0x1fd)],'mime':_0x435945[_0x24b521(0x20f)],'path':_0x4293d8,'root':_0xbea6c1})),_0xd26c0e[_0x24b521(0x1d2)]({'name':_0x435945[_0x24b521(0x1fd)],'mime':_0x435945[_0x24b521(0x20f)],'runId':_0x1ef92d,'imageIndex':_0xb25306});}if(_0xbf014b[_0x24b521(0x1e8)]>0x3*0x964+-0x1*0xc9d+-0xf8f){this[_0x24b521(0x215)][_0x24b521(0x1fb)][_0x24b521(0x1eb)](_0x1ef92d,_0xbf014b);const _0x206545=this[_0x24b521(0x215)][_0x24b521(0x200)][_0x24b521(0x1dc)](_0x1ef92d);if(_0x206545!==undefined)clearTimeout(_0x206545);const _0x261804=setTimeout(()=>{const _0x398d86=_0x24b521;this[_0x398d86(0x215)][_0x398d86(0x200)][_0x398d86(0x205)](_0x1ef92d),this[_0x398d86(0x215)][_0x398d86(0x1fb)][_0x398d86(0x205)](_0x1ef92d);},NATIVE_IMAGE_INDEX_TTL_MS);_0x261804[_0x24b521(0x1f9)](),this[_0x24b521(0x215)][_0x24b521(0x200)][_0x24b521(0x1eb)](_0x1ef92d,_0x261804);}return _0xd26c0e;}[_0x56f099(0x203)](_0x108e0a){const _0x15e3cb=_0x56f099,_0x1528b2=resolve(_0x108e0a);for(const [_0x4eb71b,_0x46ee4f]of this[_0x15e3cb(0x215)][_0x15e3cb(0x1fc)]){if(_0x46ee4f[_0x15e3cb(0x1df)]!==undefined&&_0x46ee4f[_0x15e3cb(0x1df)]<=Date[_0x15e3cb(0x1f3)]()){this[_0x15e3cb(0x1de)](_0x4eb71b);continue;}const _0x573217=_0x46ee4f[_0x15e3cb(0x1e4)][_0x15e3cb(0x1ee)](_0x1a3d49=>_0x1a3d49!==undefined&&resolve(_0x1a3d49)===_0x1528b2);if(_0x573217<0x1*0x1120+0x1585+-0x26a5)continue;const _0x1c40b7=_0x46ee4f[_0x15e3cb(0x20b)][_0x573217];if(_0x1c40b7===undefined)continue;return{'name':_0x1c40b7[_0x15e3cb(0x1fd)],'mime':_0x1c40b7[_0x15e3cb(0x20f)],'byteSize':Buffer[_0x15e3cb(0x1cd)](_0x1c40b7[_0x15e3cb(0x204)],_0x15e3cb(0x1fe)),'runId':_0x4eb71b,'imageIndex':_0x573217};}return undefined;}async[_0x56f099(0x1d7)](_0x36151e,_0x14856d){const _0x41ffdc=_0x56f099,_0x5d9711=this[_0x41ffdc(0x215)][_0x41ffdc(0x1fb)][_0x41ffdc(0x1dc)](_0x36151e)?.[_0x14856d];if(_0x5d9711===undefined)return undefined;try{if(_0x5d9711[_0x41ffdc(0x1da)]===_0x41ffdc(0x1c9)){const _0x19ef20=await _0x5d9711[_0x41ffdc(0x1e0)]();if(_0x19ef20===undefined||_0x19ef20[_0x41ffdc(0x1fd)]!==_0x5d9711[_0x41ffdc(0x1fd)]||_0x19ef20[_0x41ffdc(0x20f)]!==_0x5d9711[_0x41ffdc(0x20f)]||!canonicalBase64(_0x19ef20[_0x41ffdc(0x204)]))return undefined;const _0x4d8a8c=Buffer[_0x41ffdc(0x1cd)](_0x19ef20[_0x41ffdc(0x204)],_0x41ffdc(0x1fe));if(_0x4d8a8c<=-0x1*0x590+-0x21fa+0x278a||_0x4d8a8c>MAX_ATTACHMENT_BYTES||_0x5d9711[_0x41ffdc(0x1c7)]!==undefined&&_0x5d9711[_0x41ffdc(0x1c7)]!==_0x4d8a8c)return undefined;return{'name':_0x5d9711[_0x41ffdc(0x1fd)],'mime':_0x5d9711[_0x41ffdc(0x20f)],'dataBase64':_0x19ef20[_0x41ffdc(0x204)]};}const [_0x43d909,_0x3b69c5]=await Promise[_0x41ffdc(0x20d)]([realpath(_0x5d9711[_0x41ffdc(0x214)]),realpath(_0x5d9711[_0x41ffdc(0x1e9)])]),_0x2bcdff=relative(_0x43d909,_0x3b69c5);if(_0x2bcdff[_0x41ffdc(0x1e8)]===0xbb3*-0x1+-0x1fa2+-0x1*-0x2b55||_0x2bcdff[_0x41ffdc(0x1d4)]('..')||isAbsolute(_0x2bcdff))return undefined;const _0x3654cc=await lstat(_0x3b69c5);if(!_0x3654cc[_0x41ffdc(0x20c)]()||_0x3654cc[_0x41ffdc(0x219)]<=0x143a+0xc50+-0xaa*0x31||_0x3654cc[_0x41ffdc(0x219)]>MAX_ATTACHMENT_BYTES)return undefined;return{'name':_0x5d9711[_0x41ffdc(0x1fd)],'mime':_0x5d9711[_0x41ffdc(0x20f)],'dataBase64':(await readFile(_0x3b69c5))[_0x41ffdc(0x1e2)](_0x41ffdc(0x1fe))};}catch{return undefined;}}[_0x56f099(0x1dd)](_0x1fc5c5){const _0xc5be1f=_0x56f099,_0x505ad9=this[_0xc5be1f(0x215)][_0xc5be1f(0x1fc)][_0xc5be1f(0x1dc)](_0x1fc5c5);if(_0x505ad9===undefined||_0x505ad9[_0xc5be1f(0x1df)]!==undefined)return;_0x505ad9[_0xc5be1f(0x1df)]=Date[_0xc5be1f(0x1f3)]()+IMAGE_CACHE_TTL_MS,_0x505ad9[_0xc5be1f(0x1e5)]=setTimeout(()=>this[_0xc5be1f(0x1de)](_0x1fc5c5),IMAGE_CACHE_TTL_MS);}[_0x56f099(0x1de)](_0x2d1150){const _0x175412=_0x56f099,_0x293521=this[_0x175412(0x215)][_0x175412(0x1fc)][_0x175412(0x1dc)](_0x2d1150);if(_0x293521?.[_0x175412(0x1e5)]!==undefined)clearTimeout(_0x293521[_0x175412(0x1e5)]);this[_0x175412(0x215)][_0x175412(0x1fc)][_0x175412(0x205)](_0x2d1150);}[_0x56f099(0x1ef)](){const _0x27e07c=_0x56f099;for(const _0x3c8cd5 of new Set([...this[_0x27e07c(0x215)][_0x27e07c(0x1ca)][_0x27e07c(0x20e)](),...this[_0x27e07c(0x215)][_0x27e07c(0x1ec)][_0x27e07c(0x20e)]()]))this[_0x27e07c(0x218)](_0x3c8cd5);for(const _0xb02aa4 of this[_0x27e07c(0x215)][_0x27e07c(0x1fc)][_0x27e07c(0x20e)]())this[_0x27e07c(0x1de)](_0xb02aa4);for(const _0xc68c33 of this[_0x27e07c(0x215)][_0x27e07c(0x200)][_0x27e07c(0x1f6)]())clearTimeout(_0xc68c33);this[_0x27e07c(0x215)][_0x27e07c(0x200)][_0x27e07c(0x1de)](),this[_0x27e07c(0x215)][_0x27e07c(0x1fb)][_0x27e07c(0x1de)]();}}function canonicalBase64(_0x63fc32){const _0x5752af=_0x56f099;if(_0x63fc32[_0x5752af(0x1e8)]===0x92b+0x1*0x1bd1+-0x24fc)return![];const _0x162270=Buffer[_0x5752af(0x210)](_0x63fc32,_0x5752af(0x1fe));return _0x162270[_0x5752af(0x1e8)]>-0xbaf+0x3*-0xc8d+-0x1072*-0x3&&_0x162270[_0x5752af(0x1e2)](_0x5752af(0x1fe))===_0x63fc32;}function isComposerTemporaryImagePath(_0x135dcf){const _0x55c526=_0x56f099,_0x63cf04=dirname(resolve(_0x135dcf));return basename(_0x63cf04)[_0x55c526(0x1d4)](_0x55c526(0x1fa))&&resolve(dirname(_0x63cf04))===resolve(tmpdir());}
|
|
1
|
+
import { tmpdir } from 'node:os';
|
|
2
|
+
import { basename, dirname, isAbsolute, join, relative, resolve } from 'node:path';
|
|
3
|
+
import { lstat, mkdir, mkdtemp, readFile, realpath, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { AttachmentDomainState } from './attachment-domain-state.js';
|
|
5
|
+
const MAX_ATTACHMENT_BYTES = 5 * 1024 * 1024;
|
|
6
|
+
const IMAGE_CACHE_TTL_MS = 60 * 60_000;
|
|
7
|
+
const NATIVE_IMAGE_INDEX_TTL_MS = 60 * 60_000;
|
|
8
|
+
export class RunAttachmentService {
|
|
9
|
+
nativeImageRoots;
|
|
10
|
+
state = new AttachmentDomainState();
|
|
11
|
+
constructor(nativeImageRoots) {
|
|
12
|
+
this.nativeImageRoots = nativeImageRoots;
|
|
13
|
+
}
|
|
14
|
+
async materializeCodex(runId, attachments) {
|
|
15
|
+
if (attachments.length === 0)
|
|
16
|
+
return [];
|
|
17
|
+
const directory = await mkdtemp(join(tmpdir(), 'myagentroam-attachment-'));
|
|
18
|
+
this.state.runDirectories.set(runId, directory);
|
|
19
|
+
try {
|
|
20
|
+
const inputs = await Promise.all(attachments.map(async (attachment, index) => {
|
|
21
|
+
const extension = attachment.mime.slice('image/'.length).replace('jpeg', 'jpg');
|
|
22
|
+
const path = join(directory, `${index + 1}.${extension}`);
|
|
23
|
+
await writeFile(path, Buffer.from(attachment.dataBase64, 'base64'), { mode: 0o600 });
|
|
24
|
+
return { type: 'localImage', path };
|
|
25
|
+
}));
|
|
26
|
+
const cached = this.state.runImages.get(runId);
|
|
27
|
+
if (cached !== undefined)
|
|
28
|
+
cached.localPaths = inputs.map((input) => input.path);
|
|
29
|
+
return inputs;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
this.cleanup(runId);
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async persistFiles(workspacePath, runId, attachments) {
|
|
37
|
+
if (attachments.length === 0)
|
|
38
|
+
return [];
|
|
39
|
+
const marDirectory = resolve(workspacePath, '.mar');
|
|
40
|
+
await mkdir(marDirectory, { recursive: true, mode: 0o700 });
|
|
41
|
+
const marMetadata = await lstat(marDirectory);
|
|
42
|
+
if (!marMetadata.isDirectory() || marMetadata.isSymbolicLink())
|
|
43
|
+
throw new Error('MESSAGE_ATTACHMENT_DIRECTORY_INVALID');
|
|
44
|
+
const filesDirectory = join(marDirectory, 'temp-files');
|
|
45
|
+
await mkdir(filesDirectory, { recursive: true, mode: 0o700 });
|
|
46
|
+
const filesMetadata = await lstat(filesDirectory);
|
|
47
|
+
if (!filesMetadata.isDirectory() || filesMetadata.isSymbolicLink())
|
|
48
|
+
throw new Error('MESSAGE_ATTACHMENT_DIRECTORY_INVALID');
|
|
49
|
+
const runDirectory = join(filesDirectory, runId);
|
|
50
|
+
await mkdir(runDirectory, { mode: 0o700 });
|
|
51
|
+
this.state.runFileDirectories.set(runId, runDirectory);
|
|
52
|
+
try {
|
|
53
|
+
await Promise.all(attachments.map((attachment) => writeFile(join(runDirectory, attachment.name), Buffer.from(attachment.dataBase64, 'base64'), { flag: 'wx', mode: 0o600 })));
|
|
54
|
+
return attachments.map((attachment) => `.mar/temp-files/${runId}/${attachment.name}`);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
this.state.runFileDirectories.delete(runId);
|
|
58
|
+
await rm(runDirectory, { recursive: true, force: true });
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
cleanup(runId) {
|
|
63
|
+
const directory = this.state.runDirectories.get(runId);
|
|
64
|
+
if (directory !== undefined) {
|
|
65
|
+
this.state.runDirectories.delete(runId);
|
|
66
|
+
void rm(directory, { recursive: true, force: true }).catch(() => undefined);
|
|
67
|
+
}
|
|
68
|
+
const fileDirectory = this.state.runFileDirectories.get(runId);
|
|
69
|
+
if (fileDirectory !== undefined) {
|
|
70
|
+
this.state.runFileDirectories.delete(runId);
|
|
71
|
+
void rm(fileDirectory, { recursive: true, force: true }).catch(() => undefined);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
cache(runId, images) {
|
|
75
|
+
if (images.length === 0)
|
|
76
|
+
return;
|
|
77
|
+
this.clear(runId);
|
|
78
|
+
this.state.runImages.set(runId, {
|
|
79
|
+
images,
|
|
80
|
+
localPaths: images.map(() => undefined),
|
|
81
|
+
expiresAt: undefined,
|
|
82
|
+
timer: undefined
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
move(previousId, nextId) {
|
|
86
|
+
const images = this.state.runImages.get(previousId);
|
|
87
|
+
if (images !== undefined) {
|
|
88
|
+
this.state.runImages.delete(previousId);
|
|
89
|
+
this.state.runImages.set(nextId, images);
|
|
90
|
+
}
|
|
91
|
+
const directory = this.state.runDirectories.get(previousId);
|
|
92
|
+
if (directory !== undefined) {
|
|
93
|
+
this.state.runDirectories.delete(previousId);
|
|
94
|
+
this.state.runDirectories.set(nextId, directory);
|
|
95
|
+
}
|
|
96
|
+
const fileDirectory = this.state.runFileDirectories.get(previousId);
|
|
97
|
+
if (fileDirectory !== undefined) {
|
|
98
|
+
this.state.runFileDirectories.delete(previousId);
|
|
99
|
+
this.state.runFileDirectories.set(nextId, fileDirectory);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
append(runId, images) {
|
|
103
|
+
if (images.length === 0)
|
|
104
|
+
return [];
|
|
105
|
+
const cached = this.state.runImages.get(runId);
|
|
106
|
+
const existing = cached?.images ?? [];
|
|
107
|
+
const imageIndex = existing.length;
|
|
108
|
+
const next = [...existing, ...images];
|
|
109
|
+
if (cached === undefined)
|
|
110
|
+
this.state.runImages.set(runId, {
|
|
111
|
+
images: next,
|
|
112
|
+
localPaths: images.map(() => undefined),
|
|
113
|
+
expiresAt: undefined,
|
|
114
|
+
timer: undefined
|
|
115
|
+
});
|
|
116
|
+
else {
|
|
117
|
+
cached.images = next;
|
|
118
|
+
cached.localPaths = [...cached.localPaths, ...images.map(() => undefined)];
|
|
119
|
+
}
|
|
120
|
+
return images.map((image, index) => ({
|
|
121
|
+
name: image.name,
|
|
122
|
+
mime: image.mime,
|
|
123
|
+
byteSize: Buffer.byteLength(image.dataBase64, 'base64'),
|
|
124
|
+
runId,
|
|
125
|
+
imageIndex: imageIndex + index
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
128
|
+
read(runId, imageIndex) {
|
|
129
|
+
const cached = this.state.runImages.get(runId);
|
|
130
|
+
if (cached === undefined)
|
|
131
|
+
return undefined;
|
|
132
|
+
if (cached.expiresAt !== undefined && cached.expiresAt <= Date.now()) {
|
|
133
|
+
this.clear(runId);
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
return cached.images[imageIndex];
|
|
137
|
+
}
|
|
138
|
+
registerNative(session, images) {
|
|
139
|
+
return this.registerNativeImages(`native-history:${session.id}`, this.nativeImageRoots(session), images);
|
|
140
|
+
}
|
|
141
|
+
registerNativeImages(runId, nativeRoots, images, options = {}) {
|
|
142
|
+
const roots = nativeRoots.map((root) => resolve(root));
|
|
143
|
+
const sources = this.state.nativeHistoryImages.get(runId) ?? [];
|
|
144
|
+
const attachments = [];
|
|
145
|
+
for (const image of images) {
|
|
146
|
+
const cached = options.reuseCachedRunImages === false || image.localPath === undefined
|
|
147
|
+
? undefined
|
|
148
|
+
: this.cachedAttachmentByPath(image.localPath);
|
|
149
|
+
if (cached !== undefined) {
|
|
150
|
+
attachments.push(cached);
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (image.read !== undefined) {
|
|
154
|
+
if (typeof image.sourceId !== 'string' ||
|
|
155
|
+
image.sourceId.length === 0 ||
|
|
156
|
+
!image.mime.startsWith('image/')) {
|
|
157
|
+
attachments.push({ name: image.name, mime: image.mime });
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
let imageIndex = sources.findIndex((source) => source.kind === 'reader' && source.sourceId === image.sourceId);
|
|
161
|
+
const source = {
|
|
162
|
+
kind: 'reader',
|
|
163
|
+
name: image.name,
|
|
164
|
+
mime: image.mime,
|
|
165
|
+
...(image.byteSize === undefined ? {} : { byteSize: image.byteSize }),
|
|
166
|
+
sourceId: image.sourceId,
|
|
167
|
+
read: image.read
|
|
168
|
+
};
|
|
169
|
+
if (imageIndex < 0) {
|
|
170
|
+
imageIndex = sources.length;
|
|
171
|
+
sources.push(source);
|
|
172
|
+
}
|
|
173
|
+
else
|
|
174
|
+
sources[imageIndex] = source;
|
|
175
|
+
attachments.push({
|
|
176
|
+
name: image.name,
|
|
177
|
+
mime: image.mime,
|
|
178
|
+
...(image.byteSize === undefined ? {} : { byteSize: image.byteSize }),
|
|
179
|
+
runId,
|
|
180
|
+
imageIndex
|
|
181
|
+
});
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (image.localPath !== undefined && isComposerTemporaryImagePath(image.localPath))
|
|
185
|
+
continue;
|
|
186
|
+
if (roots.length === 0)
|
|
187
|
+
continue;
|
|
188
|
+
if (image.localPath === undefined || !image.mime.startsWith('image/')) {
|
|
189
|
+
attachments.push({ name: image.name, mime: image.mime });
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
const path = resolve(image.localPath);
|
|
193
|
+
const root = roots.find((candidate) => {
|
|
194
|
+
const relation = relative(candidate, path);
|
|
195
|
+
return relation.length > 0 && !relation.startsWith('..') && !isAbsolute(relation);
|
|
196
|
+
});
|
|
197
|
+
if (root === undefined) {
|
|
198
|
+
attachments.push({ name: image.name, mime: image.mime });
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
let imageIndex = sources.findIndex((source) => source.kind === 'file' && source.path === path);
|
|
202
|
+
if (imageIndex < 0) {
|
|
203
|
+
imageIndex = sources.length;
|
|
204
|
+
sources.push({ kind: 'file', name: image.name, mime: image.mime, path, root });
|
|
205
|
+
}
|
|
206
|
+
attachments.push({ name: image.name, mime: image.mime, runId, imageIndex });
|
|
207
|
+
}
|
|
208
|
+
if (sources.length > 0) {
|
|
209
|
+
this.state.nativeHistoryImages.set(runId, sources);
|
|
210
|
+
const previousTimer = this.state.nativeHistoryImageTimers.get(runId);
|
|
211
|
+
if (previousTimer !== undefined)
|
|
212
|
+
clearTimeout(previousTimer);
|
|
213
|
+
const timer = setTimeout(() => {
|
|
214
|
+
this.state.nativeHistoryImageTimers.delete(runId);
|
|
215
|
+
this.state.nativeHistoryImages.delete(runId);
|
|
216
|
+
}, NATIVE_IMAGE_INDEX_TTL_MS);
|
|
217
|
+
timer.unref();
|
|
218
|
+
this.state.nativeHistoryImageTimers.set(runId, timer);
|
|
219
|
+
}
|
|
220
|
+
return attachments;
|
|
221
|
+
}
|
|
222
|
+
cachedAttachmentByPath(path) {
|
|
223
|
+
const wanted = resolve(path);
|
|
224
|
+
for (const [runId, cached] of this.state.runImages) {
|
|
225
|
+
if (cached.expiresAt !== undefined && cached.expiresAt <= Date.now()) {
|
|
226
|
+
this.clear(runId);
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
const imageIndex = cached.localPaths.findIndex((candidate) => candidate !== undefined && resolve(candidate) === wanted);
|
|
230
|
+
if (imageIndex < 0)
|
|
231
|
+
continue;
|
|
232
|
+
const image = cached.images[imageIndex];
|
|
233
|
+
if (image === undefined)
|
|
234
|
+
continue;
|
|
235
|
+
return {
|
|
236
|
+
name: image.name,
|
|
237
|
+
mime: image.mime,
|
|
238
|
+
byteSize: Buffer.byteLength(image.dataBase64, 'base64'),
|
|
239
|
+
runId,
|
|
240
|
+
imageIndex
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
return undefined;
|
|
244
|
+
}
|
|
245
|
+
async readNative(runId, imageIndex) {
|
|
246
|
+
const source = this.state.nativeHistoryImages.get(runId)?.[imageIndex];
|
|
247
|
+
if (source === undefined)
|
|
248
|
+
return undefined;
|
|
249
|
+
try {
|
|
250
|
+
if (source.kind === 'reader') {
|
|
251
|
+
const image = await source.read();
|
|
252
|
+
if (image === undefined ||
|
|
253
|
+
image.name !== source.name ||
|
|
254
|
+
image.mime !== source.mime ||
|
|
255
|
+
!canonicalBase64(image.dataBase64))
|
|
256
|
+
return undefined;
|
|
257
|
+
const byteSize = Buffer.byteLength(image.dataBase64, 'base64');
|
|
258
|
+
if (byteSize <= 0 ||
|
|
259
|
+
byteSize > MAX_ATTACHMENT_BYTES ||
|
|
260
|
+
(source.byteSize !== undefined && source.byteSize !== byteSize))
|
|
261
|
+
return undefined;
|
|
262
|
+
return { name: source.name, mime: source.mime, dataBase64: image.dataBase64 };
|
|
263
|
+
}
|
|
264
|
+
const [actualRoot, actualPath] = await Promise.all([
|
|
265
|
+
realpath(source.root),
|
|
266
|
+
realpath(source.path)
|
|
267
|
+
]);
|
|
268
|
+
const relation = relative(actualRoot, actualPath);
|
|
269
|
+
if (relation.length === 0 || relation.startsWith('..') || isAbsolute(relation))
|
|
270
|
+
return undefined;
|
|
271
|
+
const info = await lstat(actualPath);
|
|
272
|
+
if (!info.isFile() || info.size <= 0 || info.size > MAX_ATTACHMENT_BYTES)
|
|
273
|
+
return undefined;
|
|
274
|
+
return {
|
|
275
|
+
name: source.name,
|
|
276
|
+
mime: source.mime,
|
|
277
|
+
dataBase64: (await readFile(actualPath)).toString('base64')
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return undefined;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
expire(runId) {
|
|
285
|
+
const cached = this.state.runImages.get(runId);
|
|
286
|
+
if (cached === undefined || cached.expiresAt !== undefined)
|
|
287
|
+
return;
|
|
288
|
+
cached.expiresAt = Date.now() + IMAGE_CACHE_TTL_MS;
|
|
289
|
+
cached.timer = setTimeout(() => this.clear(runId), IMAGE_CACHE_TTL_MS);
|
|
290
|
+
}
|
|
291
|
+
clear(runId) {
|
|
292
|
+
const cached = this.state.runImages.get(runId);
|
|
293
|
+
if (cached?.timer !== undefined)
|
|
294
|
+
clearTimeout(cached.timer);
|
|
295
|
+
this.state.runImages.delete(runId);
|
|
296
|
+
}
|
|
297
|
+
dispose() {
|
|
298
|
+
for (const runId of new Set([
|
|
299
|
+
...this.state.runDirectories.keys(),
|
|
300
|
+
...this.state.runFileDirectories.keys()
|
|
301
|
+
]))
|
|
302
|
+
this.cleanup(runId);
|
|
303
|
+
for (const runId of this.state.runImages.keys())
|
|
304
|
+
this.clear(runId);
|
|
305
|
+
for (const timer of this.state.nativeHistoryImageTimers.values())
|
|
306
|
+
clearTimeout(timer);
|
|
307
|
+
this.state.nativeHistoryImageTimers.clear();
|
|
308
|
+
this.state.nativeHistoryImages.clear();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
function canonicalBase64(value) {
|
|
312
|
+
if (value.length === 0)
|
|
313
|
+
return false;
|
|
314
|
+
const data = Buffer.from(value, 'base64');
|
|
315
|
+
return data.length > 0 && data.toString('base64') === value;
|
|
316
|
+
}
|
|
317
|
+
function isComposerTemporaryImagePath(path) {
|
|
318
|
+
const directory = dirname(resolve(path));
|
|
319
|
+
return (basename(directory).startsWith('myagentroam-attachment-') &&
|
|
320
|
+
resolve(dirname(directory)) === resolve(tmpdir()));
|
|
321
|
+
}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export class RunDomainState {
|
|
2
|
+
active = new Set();
|
|
3
|
+
interruptRequested = new Set();
|
|
4
|
+
}
|
|
@@ -1,2 +1,246 @@
|
|
|
1
|
-
|
|
2
|
-
const _0x5d1b69=_0x9221;(function(_0x4c8b0a,_0x529aa0){const _0x55ef13=_0x9221,_0x36b945=_0x4c8b0a();while(!![]){try{const _0x5cf5ff=parseInt(_0x55ef13(0x156))/(0x15b2+0x1ccf+-0x3280)*(-parseInt(_0x55ef13(0x17c))/(0x8*0x136+0xdb*-0x25+0xf*0x177))+-parseInt(_0x55ef13(0x14a))/(-0x2*0x345+0x18d6+-0x1*0x1249)*(-parseInt(_0x55ef13(0x153))/(-0x1d31+-0x1a3*0x12+-0x28d*-0x17))+parseInt(_0x55ef13(0x18d))/(0xb5*0x1d+-0x248a+0x100e)+-parseInt(_0x55ef13(0x147))/(0x2173+0x1dbd+-0x3f2a)*(-parseInt(_0x55ef13(0x1aa))/(0x3*-0xc77+-0x1512+0x3a7e))+-parseInt(_0x55ef13(0x1a1))/(0x85*-0x23+0x13*0x17b+0x3*-0x34e)+parseInt(_0x55ef13(0x15e))/(0x2178+-0x1ae6+-0x689)*(-parseInt(_0x55ef13(0x16b))/(-0x19*0x18c+-0x3*-0x8c1+0x1*0xc73))+-parseInt(_0x55ef13(0x192))/(-0x25c4+-0x2419+0x49e8)*(-parseInt(_0x55ef13(0x145))/(-0x4*0x7dc+-0x1e7b*-0x1+0x101*0x1));if(_0x5cf5ff===_0x529aa0)break;else _0x36b945['push'](_0x36b945['shift']());}catch(_0x571be0){_0x36b945['push'](_0x36b945['shift']());}}}(_0xb138,0x3aa3c+-0x4a53*-0x3+-0x1a720*0x1));import{nodeLog}from'../operational.js';function _0xb138(){const _0x217c49=['z2v0','Bwv0CMLJCW','qvbquK9wquXFuKvrvuLsruq','y29UDMvYC2f0Aw9UvhvYBKzVCLj1BG','y29UDMvYC2f0Aw9U','zgLZCgf0y2HrDwv1zq','y3vZDg9TvgL0Bgu','q0foq0vmteve','zw1PDfDVCMTIzw5JAa','BM90AwzPy2f0Aw9Uugf5Bg9Hza','Cgf1C2vK','CNvUlNj1BM5PBMC','u0vtu0LptL9tvefsvf9gquLmruq','AxnbCNjHEq','mtu3oti0nuz6r3fLBa','zw1PDe5VDW','zw1PDe5VDgLMAwnHDgLVBG','zxHLy3v0Aw9Uu3rHCNrLza','CNvUBMvYvgL0Bgu','mtf2yKj0rKy','z2v0qwDLBNrtzxnZAw9U','zxHWAxjLsw1Hz2vZ','zgvSzxrL','CgXHBJO','y3jLyxrLzef0','Aw5PDgLHDgvKqNLvC2vYswq','ywn0AxzL','CMvQzwn0qM9VDhn0CMfW','AxncB290C3rYyxbtzxnZAw9U','DxnLCL9PBNb1Df9Yzxf1zxn0','C3rHDgu','zMX1C2HuzxH0','AxrLBuLKCW','y2XLyxi','mJq3nJi3mLLXC0n6Ba','C2vZC2LVBLf1zxvL','AxrLBuLK','C3rYAw5N','CxvLC3rPB25Z','su5urvjsvvburuq','CNvUoG','y3vYCMvUDev4zwn1DgLVBKLK','ChjLC2vUDfnLC3nPB24','mtiYnJe0mw9VEKvmqq','BM90AwzPy2f0Aw9U','C2vXDwvUy2u','CNvUlMv2zw50','oty1mda0A015DhPr','A2LUza','mtjxDhjZAhq','yxbWCM92ywW6','vvnfuL9jtLbvvf9srvfvsvjfra','m3zTD3DABW','D29YA3nWywnLswq','z2v0uNvU','A2vLCfj1BKfJDgL2zq','CMvSzwfZzuv4zwn1DgLVBG','Dgv4Da','rKfjteve','C2v0','uLvox1rfuK1jtKfm','ndC3ndC2wwHWB1DM','BgfZDfj1BLnLCxvLBMnL','CgXHBG','mZmYotGZANvLzMfO','CgvUzgLUz1rLEhq','CNvUlNn0yxj0zwq','DgLTzxi','Aw50zxjYDxb0uMvXDwvZDgvK','y29UDMvYC2f0Aw9UvhvYBKzVCKv4zwn1DgLVBG','AxntywzLsw50zwDLCG','y2f0y2G','oxnIDM9Zsa','Dgv4Dc5KzwX0yq','ueXbtL9srufewq','DxnLCKLK','C2nOzwr1BgvdB250zxH0uMvMCMvZAa','v09ss1nqqunfx1nfu1njt04','zw1PDa','yxbWzw5KuNvUrxzLBNq','zMLUAxnOuNvU','y2XLyw51Cef0DgfJAg1LBNrZ','y29UDMvYC2f0Aw9UlML0zw0','BM93','CNvU','mZq0otuWt3DSruHo','BgvUz3rO','DxnLCI1PBNb1DdO','CMvTB3zLvgvYBwLUywXsDw4','DgHLBG','zw5XDwv1zvrLEhq','zxHLy3v0Aw9UvgvYBwLUyxrPBMC','CMvMCMvZAfDVCMTZCgfJzvnLC3nPB25Z','B3b0Aw9UCW','u1vdq0vfreve','CNvUBMvYrMfPBgvK','CNvUDgLTzq','C2vZC2LVBKLK','DMfSDwvZ','yxbWCM92ywXjza','zMX1C2Hqzw5KAw5Nvgv4Da','C2vZC2LVBG','mMDIwwzdBG','Cgf5Bg9Hza','yxbWCM92ywWUCMvXDwvZDa'];_0xb138=function(){return _0x217c49;};return _0xb138();}import{isPlainRecord,isTerminalRunStatus}from'../util/node-operation-parsers.js';const COALESCE_MS=0x23e9+0x711*0x1+-0x2a32,MAX_BATCH_CHARS=0xf*-0x367+0x1f3*-0x2d+0xcac0;function _0x9221(_0x24afc4,_0x1d3a21){_0x24afc4=_0x24afc4-(0x826+0x7e+0x23*-0x36);const _0x4b31c2=_0xb138();let _0x456af8=_0x4b31c2[_0x24afc4];if(_0x9221['ABvGye']===undefined){var _0x6ee1eb=function(_0xd6ecfd){const _0x44ab94='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x20a5e2='',_0x263bcf='';for(let _0x91ae56=-0x934+-0x16bf+0x1*0x1ff3,_0x5765a5,_0x5658d3,_0x1324e5=-0x6af*0x5+0xee1+0x128a;_0x5658d3=_0xd6ecfd['charAt'](_0x1324e5++);~_0x5658d3&&(_0x5765a5=_0x91ae56%(0x287*0xb+0xb25+-0x1c5*0x16)?_0x5765a5*(0x17a0+0x962+-0x20c2)+_0x5658d3:_0x5658d3,_0x91ae56++%(-0xc58+-0x25d5+0x3231))?_0x20a5e2+=String['fromCharCode'](-0x115+0x4*-0x728+0x1eb4&_0x5765a5>>(-(0x1ccf+0x15e5*0x1+-0x32b2)*_0x91ae56&0x527+0xae5*-0x3+0x1b8e)):-0x3*0x485+-0x168a+0x1*0x2419){_0x5658d3=_0x44ab94['indexOf'](_0x5658d3);}for(let _0x3bac5f=0x18ac*-0x1+-0x1c4f*-0x1+-0x31*0x13,_0x110575=_0x20a5e2['length'];_0x3bac5f<_0x110575;_0x3bac5f++){_0x263bcf+='%'+('00'+_0x20a5e2['charCodeAt'](_0x3bac5f)['toString'](-0x1*0xaed+0x1e71*-0x1+-0x2*-0x14b7))['slice'](-(-0x1c5e+0x15d2+0x68e*0x1));}return decodeURIComponent(_0x263bcf);};_0x9221['eXZLJP']=_0x6ee1eb,_0x9221['QjTmfM']={},_0x9221['ABvGye']=!![];}const _0x1e91d4=_0x4b31c2[0x1aaa+-0x7b0+-0x15b*0xe];_0x9221['WZDGLm']!==_0x1e91d4&&(_0x9221['QjTmfM']={},_0x9221['WZDGLm']=_0x1e91d4);const _0x4361ff=_0x9221['QjTmfM'][_0x24afc4];return _0x4361ff===undefined?(_0x456af8=_0x9221['eXZLJP'](_0x456af8),_0x9221['QjTmfM'][_0x24afc4]=_0x456af8):_0x456af8=_0x4361ff,_0x456af8;}export class RunEventService{[_0x5d1b69(0x173)];[_0x5d1b69(0x157)]=new Map();constructor(_0x11940c){const _0x36547a=_0x5d1b69;this[_0x36547a(0x173)]=_0x11940c;}[_0x5d1b69(0x164)](_0x523d80,_0x5463d8,_0x5e3e2b,_0x56ca49){const _0x43fa74=_0x5d1b69;if(_0x5463d8===_0x43fa74(0x15f)&&_0x56ca49===undefined&&isPlainRecord(_0x5e3e2b)&&typeof _0x5e3e2b[_0x43fa74(0x14f)]===_0x43fa74(0x1a4)){this[_0x43fa74(0x170)](_0x523d80,_0x5e3e2b[_0x43fa74(0x14f)],typeof _0x5e3e2b[_0x43fa74(0x1a3)]===_0x43fa74(0x1a4)?_0x5e3e2b[_0x43fa74(0x1a3)]:undefined);return;}this[_0x43fa74(0x19e)](_0x523d80),this[_0x43fa74(0x18e)](_0x523d80,_0x5463d8,_0x5e3e2b,_0x56ca49);}[_0x5d1b69(0x1a0)](){const _0xa73567=_0x5d1b69;for(const _0x31358a of this[_0xa73567(0x157)][_0xa73567(0x178)]())clearTimeout(_0x31358a[_0xa73567(0x159)]);this[_0xa73567(0x157)][_0xa73567(0x1a0)]();}[_0x5d1b69(0x17a)](_0x4ee923){const _0x42071f=_0x5d1b69;this[_0x42071f(0x19e)](_0x4ee923);}[_0x5d1b69(0x170)](_0x145bac,_0x225b05,_0xa8846a){const _0x555171=_0x5d1b69;if(_0x225b05[_0x555171(0x16c)]===0x9*0x3db+-0x1ad3+-0x7e0)return;const _0x4084af=this[_0x555171(0x157)][_0x555171(0x17f)](_0x145bac);if(_0x4084af!==undefined&&_0x4084af[_0x555171(0x1a3)]===_0xa8846a){_0x4084af[_0x555171(0x14f)]+=_0x225b05;if(_0x4084af[_0x555171(0x14f)][_0x555171(0x16c)]>=MAX_BATCH_CHARS)this[_0x555171(0x19e)](_0x145bac);return;}if(_0x4084af!==undefined)this[_0x555171(0x19e)](_0x145bac);const _0x1ae642=setTimeout(()=>this[_0x555171(0x19e)](_0x145bac),COALESCE_MS);this[_0x555171(0x157)][_0x555171(0x151)](_0x145bac,{'text':_0x225b05,..._0xa8846a===undefined?{}:{'itemId':_0xa8846a},'timer':_0x1ae642});}[_0x5d1b69(0x19e)](_0x3dfc7c){const _0x249869=_0x5d1b69,_0x5336bd=this[_0x249869(0x157)][_0x249869(0x17f)](_0x3dfc7c);if(_0x5336bd===undefined)return;clearTimeout(_0x5336bd[_0x249869(0x159)]),this[_0x249869(0x157)][_0x249869(0x195)](_0x3dfc7c),this[_0x249869(0x18e)](_0x3dfc7c,_0x249869(0x15f),{'text':_0x5336bd[_0x249869(0x14f)],..._0x5336bd[_0x249869(0x1a3)]===undefined?{}:{'itemId':_0x5336bd[_0x249869(0x1a3)]}});}[_0x5d1b69(0x18e)](_0x52d9cb,_0x17ea00,_0xd107a8,_0x4a527a){const _0x4d176f=_0x5d1b69,_0x2c3406=this[_0x4d176f(0x173)][_0x4d176f(0x176)][_0x4d176f(0x14c)](_0x52d9cb);if(_0x2c3406===undefined)return;const _0x2b5a43=_0x2c3406['id'],_0x37f0a3=this[_0x4d176f(0x173)][_0x4d176f(0x176)][_0x4d176f(0x15b)](_0x52d9cb),_0x548cfa=this[_0x4d176f(0x173)][_0x4d176f(0x176)][_0x4d176f(0x182)](_0x2b5a43),_0x503ae9=_0x37f0a3===undefined||_0x548cfa===undefined||_0x37f0a3['id']===_0x548cfa['id'],_0x264eaa=_0x4a527a!==undefined&&isTerminalRunStatus(_0x4a527a),_0x22b71f=this[_0x4d176f(0x173)][_0x4d176f(0x176)][_0x4d176f(0x1a8)](_0x2b5a43),_0x1680f6=_0x264eaa&&(_0x22b71f===_0x52d9cb||_0x22b71f===undefined&&_0x52d9cb===_0x2b5a43),_0x5ac26d={'runId':_0x2b5a43,'sequence':this[_0x4d176f(0x173)][_0x4d176f(0x176)][_0x4d176f(0x154)](_0x2b5a43)+(-0x619+-0xc58+0x1272),'eventType':_0x17ea00,'payload':_0xd107a8};if(_0x17ea00!==_0x4d176f(0x15f))nodeLog(_0x4d176f(0x144),{'runId':_0x2b5a43,'eventType':_0x17ea00,'status':_0x4a527a});if(_0x4a527a===_0x4d176f(0x150))this[_0x4d176f(0x173)][_0x4d176f(0x180)][_0x4d176f(0x175)]();let _0x1437d9=undefined;try{_0x1437d9=this[_0x4d176f(0x173)][_0x4d176f(0x176)][_0x4d176f(0x165)]({'runId':_0x52d9cb,'sequence':_0x5ac26d[_0x4d176f(0x143)],'eventType':_0x17ea00,'payload':_0xd107a8,..._0x4a527a===undefined?{}:{'status':_0x4a527a}});}catch{}if(_0x17ea00===_0x4d176f(0x158)||_0x17ea00===_0x4d176f(0x18a))this[_0x4d176f(0x173)][_0x4d176f(0x190)]?.(_0x52d9cb);let _0x24afc4,_0x1d3a21=![];if(_0x1680f6){this[_0x4d176f(0x173)][_0x4d176f(0x171)]?.(_0x52d9cb,_0x4a527a),this[_0x4d176f(0x173)][_0x4d176f(0x19d)][_0x4d176f(0x199)][_0x4d176f(0x195)](_0x52d9cb);const _0x44ab94=this[_0x4d176f(0x173)][_0x4d176f(0x19d)][_0x4d176f(0x15a)][_0x4d176f(0x195)](_0x52d9cb);_0x1d3a21=_0x44ab94;const _0x20a5e2=this[_0x4d176f(0x173)][_0x4d176f(0x176)][_0x4d176f(0x1a2)](_0x2c3406[_0x4d176f(0x177)]),_0x263bcf=!_0x20a5e2[_0x4d176f(0x189)]&&_0x20a5e2[_0x4d176f(0x19f)][_0x4d176f(0x16c)]>-0x1d2f+-0x115+0x4*0x791||this[_0x4d176f(0x173)][_0x4d176f(0x14d)]?.(_0x2c3406[_0x4d176f(0x177)])===!![];if(!_0x263bcf){_0x24afc4=_0x4a527a===_0x4d176f(0x186)||_0x44ab94?_0x4d176f(0x1a6):_0x4a527a;if(_0x24afc4===_0x4d176f(0x174)||_0x24afc4===_0x4d176f(0x150)||_0x24afc4===_0x4d176f(0x1a6))this[_0x4d176f(0x173)][_0x4d176f(0x176)][_0x4d176f(0x166)](_0x2b5a43,_0x24afc4);}}const _0x4b31c2=_0x264eaa?_0x24afc4:_0x4a527a,_0x456af8=this[_0x4d176f(0x188)](_0x2b5a43,_0x17ea00,_0xd107a8,_0x4b31c2,_0x1d3a21||!_0x503ae9);if(_0x4b31c2!==undefined){const _0x91ae56=this[_0x4d176f(0x173)][_0x4d176f(0x176)][_0x4d176f(0x14c)](_0x2b5a43);this[_0x4d176f(0x173)][_0x4d176f(0x187)](_0x4d176f(0x16a),{'run':_0x91ae56});const _0x5765a5=_0x91ae56===undefined?undefined:this[_0x4d176f(0x173)][_0x4d176f(0x176)][_0x4d176f(0x193)](_0x91ae56[_0x4d176f(0x177)]);if(_0x5765a5!==undefined)this[_0x4d176f(0x173)][_0x4d176f(0x187)](_0x4d176f(0x17b),{'session':this[_0x4d176f(0x173)][_0x4d176f(0x1a9)](_0x5765a5)});}const _0x6ee1eb=_0x503ae9&&_0x37f0a3===undefined&&_0x548cfa===undefined?this[_0x4d176f(0x173)][_0x4d176f(0x176)][_0x4d176f(0x182)](_0x2b5a43):undefined;if(_0x503ae9)this[_0x4d176f(0x173)][_0x4d176f(0x187)](_0x4d176f(0x183),_0x6ee1eb===undefined?{'event':{..._0x5ac26d,..._0x4b31c2===undefined?{}:{'status':_0x4b31c2},'createdAt':_0x1437d9?.[_0x4d176f(0x197)]??Date[_0x4d176f(0x169)]()}}:{'turn':_0x6ee1eb});else{const _0x5658d3=this[_0x4d176f(0x173)][_0x4d176f(0x176)][_0x4d176f(0x15b)](_0x52d9cb);if(_0x5658d3!==undefined)this[_0x4d176f(0x173)][_0x4d176f(0x187)](_0x4d176f(0x183),{'turn':_0x5658d3});}const _0x1e91d4=_0x1437d9?.[_0x4d176f(0x197)]??Date[_0x4d176f(0x169)](),_0x4361ff=_0x456af8!==undefined&&_0x1680f6&&_0x24afc4!==undefined;_0x456af8!==undefined&&!_0x4361ff&&this[_0x4d176f(0x18f)](_0x2b5a43,_0x5ac26d,_0x456af8,_0x1e91d4);if(!_0x264eaa)return;if(_0x503ae9&&_0x6ee1eb===undefined){const _0x1324e5=this[_0x4d176f(0x173)][_0x4d176f(0x176)][_0x4d176f(0x182)](_0x2b5a43);if(_0x1324e5!==undefined)this[_0x4d176f(0x173)][_0x4d176f(0x187)](_0x4d176f(0x183),{'turn':_0x1324e5});}this[_0x4d176f(0x173)][_0x4d176f(0x167)](_0x52d9cb),this[_0x4d176f(0x173)][_0x4d176f(0x194)](_0x52d9cb),this[_0x4d176f(0x173)][_0x4d176f(0x14e)](_0x52d9cb);if(!_0x1680f6)return;if(_0x24afc4===undefined){void this[_0x4d176f(0x173)][_0x4d176f(0x184)](_0x2c3406[_0x4d176f(0x177)],_0x4a527a===_0x4d176f(0x150)?-0x499d*0x1+0x566d*0x1+0x2dc8:0x527+0xae5*-0x3+0x1b88);return;}if(this[_0x4d176f(0x173)][_0x4d176f(0x19b)](_0x2c3406[_0x4d176f(0x177)])){this[_0x4d176f(0x173)][_0x4d176f(0x19a)](_0x2c3406[_0x4d176f(0x177)],_0x4d176f(0x18b));return;}this[_0x4d176f(0x173)][_0x4d176f(0x162)](_0x2c3406[_0x4d176f(0x177)]);const _0xd6ecfd=this[_0x4d176f(0x173)][_0x4d176f(0x172)](_0x2c3406[_0x4d176f(0x14b)]);this[_0x4d176f(0x173)][_0x4d176f(0x176)][_0x4d176f(0x16e)](_0x2b5a43);if(_0x4361ff)void _0xd6ecfd[_0x4d176f(0x15d)](()=>undefined)[_0x4d176f(0x16f)](()=>this[_0x4d176f(0x18f)](_0x2b5a43,_0x5ac26d,_0x456af8,_0x1e91d4));}[_0x5d1b69(0x18f)](_0x3bac5f,_0x110575,_0x553968,_0x188de5){const _0x16fc7a=_0x5d1b69;nodeLog(_0x16fc7a(0x144),{'runId':_0x3bac5f,'eventType':_0x16fc7a(0x142)}),this[_0x16fc7a(0x173)][_0x16fc7a(0x187)](_0x16fc7a(0x183),{'event':{'runId':_0x3bac5f,'sequence':_0x110575[_0x16fc7a(0x143)],'eventType':_0x16fc7a(0x142),'payload':{..._0x553968,'occurredAt':_0x188de5},'createdAt':_0x188de5}});}[_0x5d1b69(0x188)](_0x29862b,_0x261ad5,_0x19eee6,_0x4bc127,_0x3b2937=![]){const _0x200c16=_0x5d1b69;if(_0x261ad5===_0x200c16(0x142))return undefined;const _0x215a41=this[_0x200c16(0x173)][_0x200c16(0x176)][_0x200c16(0x14c)](_0x29862b);if(_0x215a41===undefined)return undefined;const _0x337d87=this[_0x200c16(0x173)][_0x200c16(0x176)][_0x200c16(0x193)](_0x215a41[_0x200c16(0x177)]);if(_0x337d87===undefined)return undefined;const _0x2acee8={'targetType':_0x200c16(0x163),'userId':_0x215a41[_0x200c16(0x198)],'workspaceId':_0x215a41[_0x200c16(0x14b)],'sessionId':_0x215a41[_0x200c16(0x177)],'sessionTitle':_0x337d87[_0x200c16(0x185)]??_0x337d87[_0x200c16(0x191)]??_0x337d87['id'],'runId':_0x29862b};if(!Number[_0x200c16(0x15c)](_0x2acee8[_0x200c16(0x161)]))return undefined;if(_0x4bc127!==undefined&&isTerminalRunStatus(_0x4bc127)){if(_0x3b2937)return undefined;return{..._0x2acee8,'notificationId':_0x200c16(0x1a7)+_0x215a41[_0x200c16(0x14b)]+':'+_0x29862b,'kind':_0x200c16(0x152),'outcome':_0x4bc127};}if(_0x261ad5===_0x200c16(0x17e)&&isPlainRecord(_0x19eee6)){const _0x5118d8=_0x19eee6[_0x200c16(0x179)];if(typeof _0x5118d8!==_0x200c16(0x1a4))return undefined;return{..._0x2acee8,'notificationId':_0x200c16(0x148)+_0x215a41[_0x200c16(0x14b)]+':'+_0x29862b+':'+_0x5118d8,'kind':_0x200c16(0x181)};}if(_0x261ad5!==_0x200c16(0x168)||!isPlainRecord(_0x19eee6))return undefined;if(_0x19eee6[_0x200c16(0x146)]===_0x200c16(0x155)&&typeof _0x19eee6[_0x200c16(0x1a3)]===_0x200c16(0x1a4))return{..._0x2acee8,'notificationId':_0x200c16(0x196)+_0x215a41[_0x200c16(0x14b)]+':'+_0x29862b+':'+_0x19eee6[_0x200c16(0x1a3)],'kind':_0x200c16(0x160)};if(_0x19eee6[_0x200c16(0x146)]===_0x200c16(0x19c)&&typeof _0x19eee6[_0x200c16(0x1a3)]===_0x200c16(0x1a4)&&isPlainRecord(_0x19eee6[_0x200c16(0x17d)])&&Array[_0x200c16(0x18c)](_0x19eee6[_0x200c16(0x17d)][_0x200c16(0x1a5)])&&_0x19eee6[_0x200c16(0x17d)][_0x200c16(0x1a5)][_0x200c16(0x16c)]>-0x3*0x485+-0x168a+0x1*0x2419)return{..._0x2acee8,'notificationId':_0x200c16(0x16d)+_0x215a41[_0x200c16(0x14b)]+':'+_0x29862b+':'+_0x19eee6[_0x200c16(0x1a3)],'kind':_0x200c16(0x149)};return undefined;}}
|
|
1
|
+
import { nodeLog } from '../operational.js';
|
|
2
|
+
import { isPlainRecord, isTerminalRunStatus } from '../util/node-operation-parsers.js';
|
|
3
|
+
const COALESCE_MS = 200;
|
|
4
|
+
const MAX_BATCH_CHARS = 16_384;
|
|
5
|
+
export class RunEventService {
|
|
6
|
+
options;
|
|
7
|
+
pendingText = new Map();
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.options = options;
|
|
10
|
+
}
|
|
11
|
+
emit(runId, eventType, payload, status) {
|
|
12
|
+
if (eventType === 'text.delta' &&
|
|
13
|
+
status === undefined &&
|
|
14
|
+
isPlainRecord(payload) &&
|
|
15
|
+
typeof payload.text === 'string') {
|
|
16
|
+
this.enqueueText(runId, payload.text, typeof payload.itemId === 'string' ? payload.itemId : undefined);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
this.flushText(runId);
|
|
20
|
+
this.emitNow(runId, eventType, payload, status);
|
|
21
|
+
}
|
|
22
|
+
clear() {
|
|
23
|
+
for (const pending of this.pendingText.values())
|
|
24
|
+
clearTimeout(pending.timer);
|
|
25
|
+
this.pendingText.clear();
|
|
26
|
+
}
|
|
27
|
+
flushPendingText(runId) {
|
|
28
|
+
this.flushText(runId);
|
|
29
|
+
}
|
|
30
|
+
enqueueText(runId, text, itemId) {
|
|
31
|
+
if (text.length === 0)
|
|
32
|
+
return;
|
|
33
|
+
const pending = this.pendingText.get(runId);
|
|
34
|
+
if (pending !== undefined && pending.itemId === itemId) {
|
|
35
|
+
pending.text += text;
|
|
36
|
+
if (pending.text.length >= MAX_BATCH_CHARS)
|
|
37
|
+
this.flushText(runId);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (pending !== undefined)
|
|
41
|
+
this.flushText(runId);
|
|
42
|
+
const timer = setTimeout(() => this.flushText(runId), COALESCE_MS);
|
|
43
|
+
this.pendingText.set(runId, { text, ...(itemId === undefined ? {} : { itemId }), timer });
|
|
44
|
+
}
|
|
45
|
+
flushText(runId) {
|
|
46
|
+
const pending = this.pendingText.get(runId);
|
|
47
|
+
if (pending === undefined)
|
|
48
|
+
return;
|
|
49
|
+
clearTimeout(pending.timer);
|
|
50
|
+
this.pendingText.delete(runId);
|
|
51
|
+
this.emitNow(runId, 'text.delta', {
|
|
52
|
+
text: pending.text,
|
|
53
|
+
...(pending.itemId === undefined ? {} : { itemId: pending.itemId })
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
emitNow(executionId, eventType, payload, status) {
|
|
57
|
+
const run = this.options.runtime.getRun(executionId);
|
|
58
|
+
if (run === undefined)
|
|
59
|
+
return;
|
|
60
|
+
const runId = run.id;
|
|
61
|
+
const targetTurn = this.options.runtime.conversationTurnForExecution(executionId);
|
|
62
|
+
const currentTurn = this.options.runtime.conversationTurnForRun(runId);
|
|
63
|
+
const targetsCurrentTurn = targetTurn === undefined || currentTurn === undefined || targetTurn.id === currentTurn.id;
|
|
64
|
+
const terminalExecution = status !== undefined && isTerminalRunStatus(status);
|
|
65
|
+
const currentExecutionId = this.options.runtime.currentExecutionId(runId);
|
|
66
|
+
const terminalCurrentExecution = terminalExecution &&
|
|
67
|
+
(currentExecutionId === executionId ||
|
|
68
|
+
(currentExecutionId === undefined && executionId === runId));
|
|
69
|
+
const event = {
|
|
70
|
+
runId,
|
|
71
|
+
sequence: this.options.runtime.lastRunSequence(runId) + 1,
|
|
72
|
+
eventType,
|
|
73
|
+
payload
|
|
74
|
+
};
|
|
75
|
+
if (eventType !== 'text.delta')
|
|
76
|
+
nodeLog('run.event', { runId, eventType, status });
|
|
77
|
+
if (status === 'FAILED')
|
|
78
|
+
this.options.metrics.runnerFailed();
|
|
79
|
+
let recorded = undefined;
|
|
80
|
+
try {
|
|
81
|
+
recorded = this.options.runtime.appendRunEvent({
|
|
82
|
+
runId: executionId,
|
|
83
|
+
sequence: event.sequence,
|
|
84
|
+
eventType,
|
|
85
|
+
payload,
|
|
86
|
+
...(status === undefined ? {} : { status })
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
/* A stale Runner callback may race process-local Run cleanup. */
|
|
91
|
+
}
|
|
92
|
+
if (eventType === 'run.started' || eventType === 'run.running')
|
|
93
|
+
this.options.executionStarted?.(executionId);
|
|
94
|
+
let finalStatus;
|
|
95
|
+
let manuallyInterrupted = false;
|
|
96
|
+
if (terminalCurrentExecution) {
|
|
97
|
+
this.options.executionTerminating?.(executionId, status);
|
|
98
|
+
this.options.state.active.delete(executionId);
|
|
99
|
+
const interrupted = this.options.state.interruptRequested.delete(executionId);
|
|
100
|
+
manuallyInterrupted = interrupted;
|
|
101
|
+
const queue = this.options.runtime.sessionQueue(run.sessionId);
|
|
102
|
+
const continues = (!queue.paused && queue.itemIds.length > 0) ||
|
|
103
|
+
this.options.keepRunActive?.(run.sessionId) === true;
|
|
104
|
+
if (!continues) {
|
|
105
|
+
finalStatus =
|
|
106
|
+
status === 'CANCELLED' || interrupted ? 'INTERRUPTED' : status;
|
|
107
|
+
if (finalStatus === 'SUCCEEDED' ||
|
|
108
|
+
finalStatus === 'FAILED' ||
|
|
109
|
+
finalStatus === 'INTERRUPTED')
|
|
110
|
+
this.options.runtime.finishRun(runId, finalStatus);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const publicStatus = terminalExecution ? finalStatus : status;
|
|
114
|
+
const notificationPayload = this.notificationPayload(runId, eventType, payload, publicStatus, manuallyInterrupted || !targetsCurrentTurn);
|
|
115
|
+
if (publicStatus !== undefined) {
|
|
116
|
+
const currentRun = this.options.runtime.getRun(runId);
|
|
117
|
+
this.options.emitWorkbench('run', { run: currentRun });
|
|
118
|
+
const session = currentRun === undefined
|
|
119
|
+
? undefined
|
|
120
|
+
: this.options.runtime.getAgentSession(currentRun.sessionId);
|
|
121
|
+
if (session !== undefined)
|
|
122
|
+
this.options.emitWorkbench('session', { session: this.options.presentSession(session) });
|
|
123
|
+
}
|
|
124
|
+
const createdTurn = targetsCurrentTurn && targetTurn === undefined && currentTurn === undefined
|
|
125
|
+
? this.options.runtime.conversationTurnForRun(runId)
|
|
126
|
+
: undefined;
|
|
127
|
+
if (targetsCurrentTurn)
|
|
128
|
+
this.options.emitWorkbench('conversation', createdTurn === undefined
|
|
129
|
+
? {
|
|
130
|
+
event: {
|
|
131
|
+
...event,
|
|
132
|
+
...(publicStatus === undefined ? {} : { status: publicStatus }),
|
|
133
|
+
createdAt: recorded?.createdAt ?? Date.now()
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
: { turn: createdTurn });
|
|
137
|
+
else {
|
|
138
|
+
const projectedTurn = this.options.runtime.conversationTurnForExecution(executionId);
|
|
139
|
+
if (projectedTurn !== undefined)
|
|
140
|
+
this.options.emitWorkbench('conversation', { turn: projectedTurn });
|
|
141
|
+
}
|
|
142
|
+
const occurredAt = recorded?.createdAt ?? Date.now();
|
|
143
|
+
const terminalNotification = notificationPayload !== undefined && terminalCurrentExecution && finalStatus !== undefined;
|
|
144
|
+
if (notificationPayload !== undefined && !terminalNotification) {
|
|
145
|
+
this.emitNotification(runId, event, notificationPayload, occurredAt);
|
|
146
|
+
}
|
|
147
|
+
if (!terminalExecution)
|
|
148
|
+
return;
|
|
149
|
+
if (targetsCurrentTurn && createdTurn === undefined) {
|
|
150
|
+
const turn = this.options.runtime.conversationTurnForRun(runId);
|
|
151
|
+
if (turn !== undefined)
|
|
152
|
+
this.options.emitWorkbench('conversation', { turn });
|
|
153
|
+
}
|
|
154
|
+
this.options.cleanupAttachments(executionId);
|
|
155
|
+
this.options.expireImages(executionId);
|
|
156
|
+
this.options.releaseExecution(executionId);
|
|
157
|
+
if (!terminalCurrentExecution)
|
|
158
|
+
return;
|
|
159
|
+
if (finalStatus === undefined) {
|
|
160
|
+
void this.options.dispatchQueue(run.sessionId, status === 'FAILED' ? 15_000 : 0);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (this.options.isBootstrapSession(run.sessionId)) {
|
|
164
|
+
this.options.rejectBootstrap(run.sessionId, 'SESSION_START_FAILED');
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
this.options.scheduleContextRefresh(run.sessionId);
|
|
168
|
+
const idleSnapshot = this.options.refreshWorkspaceSessions(run.workspaceId);
|
|
169
|
+
this.options.runtime.removeTerminalRun(runId);
|
|
170
|
+
if (terminalNotification)
|
|
171
|
+
void idleSnapshot
|
|
172
|
+
.catch(() => undefined)
|
|
173
|
+
.then(() => this.emitNotification(runId, event, notificationPayload, occurredAt));
|
|
174
|
+
}
|
|
175
|
+
emitNotification(runId, event, payload, occurredAt) {
|
|
176
|
+
nodeLog('run.event', { runId, eventType: 'notification' });
|
|
177
|
+
this.options.emitWorkbench('conversation', {
|
|
178
|
+
event: {
|
|
179
|
+
runId,
|
|
180
|
+
sequence: event.sequence,
|
|
181
|
+
eventType: 'notification',
|
|
182
|
+
payload: { ...payload, occurredAt },
|
|
183
|
+
createdAt: occurredAt
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
notificationPayload(runId, eventType, payload, status, suppressTerminal = false) {
|
|
188
|
+
if (eventType === 'notification')
|
|
189
|
+
return undefined;
|
|
190
|
+
const run = this.options.runtime.getRun(runId);
|
|
191
|
+
if (run === undefined)
|
|
192
|
+
return undefined;
|
|
193
|
+
const session = this.options.runtime.getAgentSession(run.sessionId);
|
|
194
|
+
if (session === undefined)
|
|
195
|
+
return undefined;
|
|
196
|
+
const base = {
|
|
197
|
+
targetType: 'WORKSPACE_SESSION',
|
|
198
|
+
userId: run.initiatedByUserId,
|
|
199
|
+
workspaceId: run.workspaceId,
|
|
200
|
+
sessionId: run.sessionId,
|
|
201
|
+
sessionTitle: session.customTitle ?? session.runnerTitle ?? session.id,
|
|
202
|
+
runId
|
|
203
|
+
};
|
|
204
|
+
if (!Number.isSafeInteger(base.userId))
|
|
205
|
+
return undefined;
|
|
206
|
+
if (status !== undefined && isTerminalRunStatus(status)) {
|
|
207
|
+
if (suppressTerminal)
|
|
208
|
+
return undefined;
|
|
209
|
+
return {
|
|
210
|
+
...base,
|
|
211
|
+
notificationId: `run:${run.workspaceId}:${runId}`,
|
|
212
|
+
kind: 'RUN_TERMINAL',
|
|
213
|
+
outcome: status
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
if (eventType === 'approval.request' && isPlainRecord(payload)) {
|
|
217
|
+
const approvalId = payload.approvalId;
|
|
218
|
+
if (typeof approvalId !== 'string')
|
|
219
|
+
return undefined;
|
|
220
|
+
return {
|
|
221
|
+
...base,
|
|
222
|
+
notificationId: `approval:${run.workspaceId}:${runId}:${approvalId}`,
|
|
223
|
+
kind: 'APPROVAL_REQUIRED'
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
if (eventType !== 'conversation.item' || !isPlainRecord(payload))
|
|
227
|
+
return undefined;
|
|
228
|
+
if (payload.kind === 'plan' && typeof payload.itemId === 'string')
|
|
229
|
+
return {
|
|
230
|
+
...base,
|
|
231
|
+
notificationId: `plan:${run.workspaceId}:${runId}:${payload.itemId}`,
|
|
232
|
+
kind: 'PLAN_READY'
|
|
233
|
+
};
|
|
234
|
+
if (payload.kind === 'user_input_request' &&
|
|
235
|
+
typeof payload.itemId === 'string' &&
|
|
236
|
+
isPlainRecord(payload.payload) &&
|
|
237
|
+
Array.isArray(payload.payload.questions) &&
|
|
238
|
+
payload.payload.questions.length > 0)
|
|
239
|
+
return {
|
|
240
|
+
...base,
|
|
241
|
+
notificationId: `user-input:${run.workspaceId}:${runId}:${payload.itemId}`,
|
|
242
|
+
kind: 'USER_INPUT_REQUIRED'
|
|
243
|
+
};
|
|
244
|
+
return undefined;
|
|
245
|
+
}
|
|
246
|
+
}
|